From 7339ebce60eaab4dd229e4fb95e333e57300cbfe Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Mon, 16 Nov 2020 12:21:50 +0300 Subject: [PATCH 01/68] lcs car ctrl 1 --- src/control/CarCtrl.cpp | 228 ++++++++++++++++++++++------------------ src/control/CarCtrl.h | 3 + 2 files changed, 131 insertions(+), 100 deletions(-) diff --git a/src/control/CarCtrl.cpp b/src/control/CarCtrl.cpp index 781c8799..93e9aa44 100644 --- a/src/control/CarCtrl.cpp +++ b/src/control/CarCtrl.cpp @@ -11,6 +11,7 @@ #include "Cranes.h" #include "Curves.h" #include "CutsceneMgr.h" +#include "Frontend.h" #include "Gangs.h" #include "Game.h" #include "Garages.h" @@ -76,10 +77,11 @@ #define DISTANCE_BETWEEN_CAR_AND_DEAD_PED (6.0f) #define PROBABILITY_OF_PASSENGER_IN_VEHICLE (0.125f) -#define ONSCREEN_DESPAWN_RANGE (120.0f) -#define MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN (100.0f) -#define REQUEST_ONSCREEN_DISTANCE ((ONSCREEN_DESPAWN_RANGE + MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN) / 2) -#define OFFSCREEN_DESPAWN_RANGE (40.0f) +#define ONSCREEN_DESPAWN_RANGE (190.0f) +#define MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN (130.0f) +#define REQUEST_ONSCREEN_DISTANCE (140.0f) +#define OFFSCREEN_DESPAWN_RANGE (60.0f) +#define MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN (40.0f) #define EXTENDED_RANGE_DESPAWN_MULTIPLIER (1.5f) //--MIAMI: file done @@ -95,7 +97,7 @@ int32 CCarCtrl::NumRandomCars; int32 CCarCtrl::NumParkedCars; int32 CCarCtrl::NumPermanentCars; int8 CCarCtrl::CountDownToCarsAtStart; -int32 CCarCtrl::MaxNumberOfCarsInUse = 12; +int32 CCarCtrl::MaxNumberOfCarsInUse = 30; uint32 CCarCtrl::LastTimeLawEnforcerCreated; uint32 CCarCtrl::LastTimeFireTruckCreated; uint32 CCarCtrl::LastTimeAmbulanceCreated; @@ -161,14 +163,19 @@ CCarCtrl::GenerateOneRandomCar() carClass = COPS; carModel = ChoosePoliceCarModel(); }else{ - carModel = ChooseModel(&zone, &carClass); - if (carModel == -1 || (carClass == COPS && pWanted->m_nWantedLevel >= 1)) - /* All cop spawns with wanted level are handled by condition above. */ - /* In particular it means that cop cars never spawn if player has wanted level of 1. */ - return; + for (int i = 0; i < 5; i++) { + carModel = ChooseModel(&zone, &carClass); + if (carModel == -1) + return; + if (!(carClass == COPS && pWanted->m_nWantedLevel >= 1)) + /* All cop spawns with wanted level are handled by condition above. */ + /* In particular it means that cop cars never spawn if player has wanted level of 1. */ + break; + } } float frontX, frontY; float preferredDistance, angleLimit; + float requestMultiplier; bool invertAngleLimitTest; CVector spawnPosition; int32 curNodeId, nextNodeId; @@ -188,11 +195,14 @@ CCarCtrl::GenerateOneRandomCar() angleLimit = -1.0f; bTopDownCamera = true; invertAngleLimitTest = true; - preferredDistance = OFFSCREEN_DESPAWN_RANGE + 15.0f; + preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN + 15.0f; /* BUG: testForCollision not initialized in original game. */ testForCollision = false; }else if (!pPlayerVehicle){ /* Player is not in vehicle. */ + requestMultiplier = 13.0f / 20.0f; + if (FrontEndMenuManager.m_PrefsUseWideScreen) // TODO(LCS): static + requestMultiplier *= 4.0f / 3.0f; testForCollision = true; frontX = TheCamera.CamFrontXNorm; frontY = TheCamera.CamFrontYNorm; @@ -202,95 +212,105 @@ CCarCtrl::GenerateOneRandomCar() /* Forward to his current direction (camera direction). */ angleLimit = 0.707f; /* 45 degrees */ invertAngleLimitTest = true; - preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; + preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier; break; case 1: /* Spawn a vehicle close to player to his side. */ /* Kinda not within camera angle. */ angleLimit = 0.707f; /* 45 degrees */ invertAngleLimitTest = false; - preferredDistance = OFFSCREEN_DESPAWN_RANGE; + preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN; break; } - }else if (fPlayerVehicleSpeed > 0.4f){ /* 72 km/h */ + } + else { + requestMultiplier = 13.0f / 20.0f; + if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_1STPERSON && !FrontEndMenuManager.m_PrefsUseWideScreen) + requestMultiplier *= 0.9f; + if (FrontEndMenuManager.m_PrefsUseWideScreen) // TODO(LCS): static + requestMultiplier *= 4.0f / 3.0f; + if (fPlayerVehicleSpeed > 0.4f) { /* 72 km/h */ /* Player is moving fast in vehicle */ /* Prefer spawning vehicles very far away from him. */ - frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed; - frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed; - testForCollision = false; - switch (CTimer::GetFrameCounter() & 3) { - case 0: - case 1: - /* Spawn a vehicle in a very narrow gap in front of a player */ - angleLimit = 0.85f; /* approx 30 degrees */ - invertAngleLimitTest = true; - preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; - break; - case 2: - /* Spawn a vehicle relatively far away from player. */ - /* Forward to his current direction (camera direction). */ - angleLimit = 0.707f; /* 45 degrees */ - invertAngleLimitTest = true; - preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; - break; - case 3: - /* Spawn a vehicle close to player to his side. */ - /* Kinda not within camera angle. */ - angleLimit = 0.707f; /* 45 degrees */ - invertAngleLimitTest = false; - preferredDistance = OFFSCREEN_DESPAWN_RANGE; - break; + frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed; + frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed; + testForCollision = false; + switch (CTimer::GetFrameCounter() & 3) { + case 0: + case 1: + /* Spawn a vehicle in a very narrow gap in front of a player */ + angleLimit = 0.85f; /* approx 30 degrees */ + invertAngleLimitTest = true; + preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier; + break; + case 2: + /* Spawn a vehicle relatively far away from player. */ + /* Forward to his current direction (camera direction). */ + angleLimit = 0.707f; /* 45 degrees */ + invertAngleLimitTest = true; + preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier; + break; + case 3: + /* Spawn a vehicle close to player to his side. */ + /* Kinda not within camera angle. */ + angleLimit = 0.707f; /* 45 degrees */ + invertAngleLimitTest = false; + preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN; + break; + } } - }else if (fPlayerVehicleSpeed > 0.1f){ /* 18 km/h */ - /* Player is moving moderately fast in vehicle */ - /* Spawn more vehicles to player's side. */ - frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed; - frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed; - testForCollision = false; - switch (CTimer::GetFrameCounter() & 3) { - case 0: - /* Spawn a vehicle in a very narrow gap in front of a player */ - angleLimit = 0.85f; /* approx 30 degrees */ - invertAngleLimitTest = true; - preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; - break; - case 1: - /* Spawn a vehicle relatively far away from player. */ - /* Forward to his current direction (camera direction). */ - angleLimit = 0.707f; /* 45 degrees */ - invertAngleLimitTest = true; - preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; - break; - case 2: - case 3: - /* Spawn a vehicle close to player to his side. */ - /* Kinda not within camera angle. */ - angleLimit = 0.707f; /* 45 degrees */ - invertAngleLimitTest = false; - preferredDistance = OFFSCREEN_DESPAWN_RANGE; - break; + else if (fPlayerVehicleSpeed > 0.1f) { /* 18 km/h */ + /* Player is moving moderately fast in vehicle */ + /* Spawn more vehicles to player's side. */ + frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed; + frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed; + testForCollision = false; + switch (CTimer::GetFrameCounter() & 3) { + case 0: + /* Spawn a vehicle in a very narrow gap in front of a player */ + angleLimit = 0.85f; /* approx 30 degrees */ + invertAngleLimitTest = true; + preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier; + break; + case 1: + /* Spawn a vehicle relatively far away from player. */ + /* Forward to his current direction (camera direction). */ + angleLimit = 0.707f; /* 45 degrees */ + invertAngleLimitTest = true; + preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier; + break; + case 2: + case 3: + /* Spawn a vehicle close to player to his side. */ + /* Kinda not within camera angle. */ + angleLimit = 0.707f; /* 45 degrees */ + invertAngleLimitTest = false; + preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN; + break; + } } - }else{ - /* Player is in vehicle but moving very slow. */ - /* Then use camera direction instead of vehicle direction. */ - testForCollision = true; - frontX = TheCamera.CamFrontXNorm; - frontY = TheCamera.CamFrontYNorm; - switch (CTimer::GetFrameCounter() & 1) { - case 0: - /* Spawn a vehicle relatively far away from player. */ - /* Forward to his current direction (camera direction). */ - angleLimit = 0.707f; /* 45 degrees */ - invertAngleLimitTest = true; - preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; - break; - case 1: - /* Spawn a vehicle close to player to his side. */ - /* Kinda not within camera angle. */ - angleLimit = 0.707f; /* 45 degrees */ - invertAngleLimitTest = false; - preferredDistance = OFFSCREEN_DESPAWN_RANGE; - break; + else { + /* Player is in vehicle but moving very slow. */ + /* Then use camera direction instead of vehicle direction. */ + testForCollision = true; + frontX = TheCamera.CamFrontXNorm; + frontY = TheCamera.CamFrontYNorm; + switch (CTimer::GetFrameCounter() & 1) { + case 0: + /* Spawn a vehicle relatively far away from player. */ + /* Forward to his current direction (camera direction). */ + angleLimit = 0.707f; /* 45 degrees */ + invertAngleLimitTest = true; + preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier; + break; + case 1: + /* Spawn a vehicle close to player to his side. */ + /* Kinda not within camera angle. */ + angleLimit = 0.707f; /* 45 degrees */ + invertAngleLimitTest = false; + preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN; + break; + } } } if (!ThePaths.GenerateCarCreationCoors(vecTargetPos.x, vecTargetPos.y, frontX, frontY, @@ -300,6 +320,8 @@ CCarCtrl::GenerateOneRandomCar() CPathNode* pCurNode = &ThePaths.m_pathNodes[curNodeId]; CPathNode* pNextNode = &ThePaths.m_pathNodes[nextNodeId]; bool bBoatGenerated = false; + if (!OkToCreateVehicleAtThisPosition(spawnPosition)) + return; if ((CGeneral::GetRandomNumber() & 0xF) > Min(pCurNode->spawnRate, pNextNode->spawnRate)) return; if (pCurNode->bWaterPath) { @@ -604,12 +626,12 @@ CCarCtrl::GenerateOneRandomCar() return; } }else{ - if ((vecTargetPos - pVehicle->GetPosition()).Magnitude2D() > TheCamera.GenerationDistMultiplier * (pVehicle->bExtendedRange ? EXTENDED_RANGE_DESPAWN_MULTIPLIER : 1.0f) * ONSCREEN_DESPAWN_RANGE || - (vecTargetPos - pVehicle->GetPosition()).Magnitude2D() < TheCamera.GenerationDistMultiplier * MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN) { + if ((vecTargetPos - pVehicle->GetPosition()).Magnitude2D() > TheCamera.GenerationDistMultiplier * requestMultiplier * (pVehicle->bExtendedRange ? EXTENDED_RANGE_DESPAWN_MULTIPLIER : 1.0f) * ONSCREEN_DESPAWN_RANGE || + (vecTargetPos - pVehicle->GetPosition()).Magnitude2D() < TheCamera.GenerationDistMultiplier * requestMultiplier * MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN) { delete pVehicle; return; } - if ((TheCamera.GetPosition() - pVehicle->GetPosition()).Magnitude2D() < 82.5f * TheCamera.GenerationDistMultiplier || bTopDownCamera) { + if ((TheCamera.GetPosition() - pVehicle->GetPosition()).Magnitude2D() < 105.0f * requestMultiplier * TheCamera.GenerationDistMultiplier || bTopDownCamera) { delete pVehicle; return; } @@ -659,13 +681,13 @@ CCarCtrl::GenerateOneRandomCar() int nMadDrivers; switch (pVehicle->GetVehicleAppearance()) { case VEHICLE_APPEARANCE_BIKE: - nMadDrivers = 30; + nMadDrivers = 20; break; case VEHICLE_APPEARANCE_BOAT: nMadDrivers = 40; break; default: - nMadDrivers = 6; + nMadDrivers = 3; break; } if ((CGeneral::GetRandomNumber() & 0x7F) < nMadDrivers || bMadDriversCheat) { @@ -949,6 +971,7 @@ CCarCtrl::RemoveCarsIfThePoolGetsFull(void) } } if (pClosestVehicle) { + debug(":::::::::::\'Nearest removed\' cause pools was full -> NumRandomCars %d\n", NumRandomCars); CWorld::Remove(pClosestVehicle); delete pClosestVehicle; } @@ -971,7 +994,10 @@ CCarCtrl::PossiblyRemoveVehicle(CVehicle* pVehicle) return; } float distanceToPlayer = (pVehicle->GetPosition() - vecPlayerPos).Magnitude2D(); - float threshold = OFFSCREEN_DESPAWN_RANGE; + float despawnMultiplier = 1.0f; + if (FindPlayerVehicle() && TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_1STPERSON && !FrontEndMenuManager.m_PrefsUseWideScreen) + despawnMultiplier = 0.75f; + float threshold = OFFSCREEN_DESPAWN_RANGE * despawnMultiplier; if (pVehicle->GetIsOnScreen() || TheCamera.Cams[TheCamera.ActiveCam].LookingLeft || TheCamera.Cams[TheCamera.ActiveCam].LookingRight || @@ -984,7 +1010,7 @@ CCarCtrl::PossiblyRemoveVehicle(CVehicle* pVehicle) pVehicle->bIsCarParkVehicle || CTimer::GetTimeInMilliseconds() < pVehicle->m_nSetPieceExtendedRangeTime ){ - threshold = ONSCREEN_DESPAWN_RANGE * TheCamera.GenerationDistMultiplier; + threshold = ONSCREEN_DESPAWN_RANGE * despawnMultiplier * TheCamera.GenerationDistMultiplier; } if (TheCamera.GetForward().z < -0.9f) threshold = 70.0f; @@ -1767,7 +1793,7 @@ bool CCarCtrl::PickNextNodeAccordingStrategy(CVehicle* pVehicle) void CCarCtrl::PickNextNodeRandomly(CVehicle* pVehicle) { if (pVehicle->m_nRouteSeed) - CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed); + CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed++); int32 prevNode = pVehicle->AutoPilot.m_nCurrentRouteNode; int32 curNode = pVehicle->AutoPilot.m_nNextRouteNode; uint8 totalLinks = ThePaths.m_pathNodes[curNode].numLinks; @@ -1853,13 +1879,15 @@ void CCarCtrl::PickNextNodeRandomly(CVehicle* pVehicle) pNextPathNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nNextRouteNode]; if ((!pNextPathNode->bDisabled || pPrevPathNode->bDisabled) && (!pNextPathNode->bBetweenLevels || pPrevPathNode->bBetweenLevels || !pVehicle->AutoPilot.m_bStayInCurrentLevel)) - /* Nice way to exit loop but this will fail because this is used for indexing! */ - nextLink = 1000; + break; } } - if (nextLink < 999) + if (nextLink >= totalLinks) { /* If everything else failed, turn vehicle around */ + nextLink = 0; + debug("Couldn\'t find ANYTHING. Just go back from where we came.\n"); pVehicle->AutoPilot.m_nNextRouteNode = prevNode; + } } pNextPathNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nNextRouteNode]; pNextLink = &ThePaths.m_carPathLinks[ThePaths.m_carPathConnections[nextLink + pCurPathNode->firstLink]]; @@ -1983,7 +2011,7 @@ void CCarCtrl::PickNextNodeToChaseCar(CVehicle* pVehicle, float targetX, float t #endif { if (pVehicle->m_nRouteSeed) - CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed); + CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed++); int prevNode = pVehicle->AutoPilot.m_nCurrentRouteNode; int curNode = pVehicle->AutoPilot.m_nNextRouteNode; CPathNode* pPrevNode = &ThePaths.m_pathNodes[prevNode]; diff --git a/src/control/CarCtrl.h b/src/control/CarCtrl.h index 5efbe275..61ebb35c 100644 --- a/src/control/CarCtrl.h +++ b/src/control/CarCtrl.h @@ -130,6 +130,9 @@ public: static void SteerAIBoatWithPhysicsAttackingPlayer(CVehicle*, float*, float*, float*, bool*); static void SteerAICarBlockingPlayerForwardAndBack(CVehicle*, float*, float*, float*, bool*); + static bool OkToCreateVehicleAtThisPosition(const CVector&) { return true; } + static float GetATanOfXY(float x, float y) { float t = CGeneral::GetATanOfXY(x, y); if (t < 0.0f) t += TWOPI; return t; } // TODO(LCS): replace where required + static float GetPositionAlongCurrentCurve(CVehicle* pVehicle) { uint32 timeInCurve = CTimer::GetTimeInMilliseconds() - pVehicle->AutoPilot.m_nTimeEnteredCurve; From b9b9dabd7540faa4ce78159908c3c80b3253468e Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Mon, 16 Nov 2020 22:20:56 +0300 Subject: [PATCH 02/68] lcs car ctrl 2 --- src/control/CarAI.cpp | 13 +++++ src/control/CarCtrl.cpp | 113 ++++++++++++++++++++++++---------------- src/control/CarCtrl.h | 12 ++--- src/core/IniFile.cpp | 4 +- 4 files changed, 87 insertions(+), 55 deletions(-) diff --git a/src/control/CarAI.cpp b/src/control/CarAI.cpp index a3fcbf9a..c8e80c32 100644 --- a/src/control/CarAI.cpp +++ b/src/control/CarAI.cpp @@ -4,6 +4,7 @@ #include "Accident.h" #include "AutoPilot.h" +#include "Bridge.h" #include "CarCtrl.h" #include "General.h" #include "HandlingMgr.h" @@ -74,6 +75,18 @@ void CCarAI::UpdateCarAI(CVehicle* pVehicle) case STATUS_PLAYER_DISABLED: break; case STATUS_SIMPLE: + { + if (pVehicle->m_pCurGroundEntity && CBridge::ThisIsABridgeObjectMovingUp(pVehicle->m_pCurGroundEntity->GetModelIndex())) + pVehicle->SetStatus(STATUS_PHYSICS); + CColPoint colPoint; + CEntity* pEntity; + if (pVehicle->m_randomSeed & 0x3F == CTimer::GetFrameCounter() & 0x3F && + !CWorld::ProcessVerticalLine(pVehicle->GetPosition(), -2.0f, colPoint, pEntity, true, false, false, false, true, false, nil)) { + debug("FLOATING CAR TURNED INTO PHYSICS CAR!\n"); + pVehicle->SetStatus(STATUS_PHYSICS); + } + } + // fallthough case STATUS_PHYSICS: switch (pVehicle->AutoPilot.m_nCarMission) { case MISSION_RAMPLAYER_FARAWAY: diff --git a/src/control/CarCtrl.cpp b/src/control/CarCtrl.cpp index 2af218c4..a6ddf24f 100644 --- a/src/control/CarCtrl.cpp +++ b/src/control/CarCtrl.cpp @@ -746,12 +746,6 @@ CCarCtrl::GenerateOneRandomCar() } } -bool -CCarCtrl::BoatWithTallMast(int32 mi) -{ - return mi == MI_RIO || mi == MI_TROPIC || mi == MI_MARQUIS; -} - int32 CCarCtrl::ChooseBoatModel(int32 rating) { @@ -1603,7 +1597,7 @@ void CCarCtrl::WeaveForOtherCar(CEntity* pOtherEntity, CVehicle* pVehicle, float if (pVehicle->AutoPilot.m_nCarMission == MISSION_RAMCAR_CLOSE && pOtherEntity == pVehicle->AutoPilot.m_pTargetCar) return; CVector2D vecDiff = pOtherCar->GetPosition() - pVehicle->GetPosition(); - float angleBetweenVehicles = CGeneral::GetATanOfXY(vecDiff.x, vecDiff.y); + float angleBetweenVehicles = GetATanOfXY(vecDiff.x, vecDiff.y); float distance = vecDiff.Magnitude(); if (distance < 1.0f) return; @@ -1613,7 +1607,7 @@ void CCarCtrl::WeaveForOtherCar(CEntity* pOtherEntity, CVehicle* pVehicle, float return; CVector2D forward = pVehicle->GetForward(); forward.Normalise(); - float forwardAngle = CGeneral::GetATanOfXY(forward.x, forward.y); + float forwardAngle = GetATanOfXY(forward.x, forward.y); float angleDiff = angleBetweenVehicles - forwardAngle; float lenProjection = ABS(pOtherCar->GetColModel()->boundingBox.max.y * sin(angleDiff)); float widthProjection = ABS(pOtherCar->GetColModel()->boundingBox.max.x * cos(angleDiff)); @@ -1622,16 +1616,12 @@ void CCarCtrl::WeaveForOtherCar(CEntity* pOtherEntity, CVehicle* pVehicle, float diffToLeftAngle = ABS(diffToLeftAngle); float angleToWeave = lengthToEvade / 2; if (diffToLeftAngle < angleToWeave){ - *pAngleToWeaveLeft = angleBetweenVehicles - angleToWeave; - while (*pAngleToWeaveLeft < -PI) - *pAngleToWeaveLeft += TWOPI; + *pAngleToWeaveLeft = LimitRadianAngle(angleBetweenVehicles - angleToWeave); } float diffToRightAngle = LimitRadianAngle(angleBetweenVehicles - *pAngleToWeaveRight); diffToRightAngle = ABS(diffToRightAngle); if (diffToRightAngle < angleToWeave){ - *pAngleToWeaveRight = angleBetweenVehicles + angleToWeave; - while (*pAngleToWeaveRight > PI) - *pAngleToWeaveRight -= TWOPI; + *pAngleToWeaveRight = LimitRadianAngle(angleBetweenVehicles + angleToWeave); } } @@ -1663,23 +1653,19 @@ void CCarCtrl::WeaveForPed(CEntity* pOtherEntity, CVehicle* pVehicle, float* pAn return; CPed* pPed = (CPed*)pOtherEntity; CVector2D vecDiff = pPed->GetPosition() - pVehicle->GetPosition(); - float angleBetweenVehicleAndPed = CGeneral::GetATanOfXY(vecDiff.x, vecDiff.y); + float angleBetweenVehicleAndPed = GetATanOfXY(vecDiff.x, vecDiff.y); float distance = vecDiff.Magnitude(); float lengthToEvade = (WIDTH_COEF_TO_WEAVE_SAFELY * 2 * pVehicle->GetColModel()->boundingBox.max.x + PED_WIDTH_TO_WEAVE) / distance; float diffToLeftAngle = LimitRadianAngle(angleBetweenVehicleAndPed - *pAngleToWeaveLeft); diffToLeftAngle = ABS(diffToLeftAngle); float angleToWeave = lengthToEvade / 2; if (diffToLeftAngle < angleToWeave) { - *pAngleToWeaveLeft = angleBetweenVehicleAndPed - angleToWeave; - while (*pAngleToWeaveLeft < -PI) - *pAngleToWeaveLeft += TWOPI; + *pAngleToWeaveLeft = LimitRadianAngle(angleBetweenVehicleAndPed - angleToWeave); } float diffToRightAngle = LimitRadianAngle(angleBetweenVehicleAndPed - *pAngleToWeaveRight); diffToRightAngle = ABS(diffToRightAngle); if (diffToRightAngle < angleToWeave) { - *pAngleToWeaveRight = angleBetweenVehicleAndPed + angleToWeave; - while (*pAngleToWeaveRight > PI) - *pAngleToWeaveRight -= TWOPI; + *pAngleToWeaveRight = LimitRadianAngle(angleBetweenVehicleAndPed + angleToWeave); } } @@ -1735,23 +1721,19 @@ void CCarCtrl::WeaveForObject(CEntity* pOtherEntity, CVehicle* pVehicle, float* rightCoef * pObject->GetRight() + forwardCoef * pObject->GetForward() - pVehicle->GetPosition(); - float angleBetweenVehicleAndObject = CGeneral::GetATanOfXY(vecDiff.x, vecDiff.y); + float angleBetweenVehicleAndObject = GetATanOfXY(vecDiff.x, vecDiff.y); float distance = vecDiff.Magnitude(); float lengthToEvade = (WIDTH_COEF_TO_WEAVE_SAFELY * 2 * pVehicle->GetColModel()->boundingBox.max.x + OBJECT_WIDTH_TO_WEAVE) / distance; float diffToLeftAngle = LimitRadianAngle(angleBetweenVehicleAndObject - *pAngleToWeaveLeft); diffToLeftAngle = ABS(diffToLeftAngle); float angleToWeave = lengthToEvade / 2; if (diffToLeftAngle < angleToWeave) { - *pAngleToWeaveLeft = angleBetweenVehicleAndObject - angleToWeave; - while (*pAngleToWeaveLeft < -PI) - *pAngleToWeaveLeft += TWOPI; + *pAngleToWeaveLeft = LimitRadianAngle(angleBetweenVehicleAndObject - angleToWeave); } float diffToRightAngle = LimitRadianAngle(angleBetweenVehicleAndObject - *pAngleToWeaveRight); diffToRightAngle = ABS(diffToRightAngle); if (diffToRightAngle < angleToWeave) { - *pAngleToWeaveRight = angleBetweenVehicleAndObject + angleToWeave; - while (*pAngleToWeaveRight > PI) - *pAngleToWeaveRight -= TWOPI; + *pAngleToWeaveRight = LimitRadianAngle(angleBetweenVehicleAndObject + angleToWeave); } } @@ -2031,7 +2013,7 @@ void CCarCtrl::PickNextNodeToChaseCar(CVehicle* pVehicle, float targetX, float t int nextLink; if (numNodes != 1 && numNodes != 2 || pTargetNode[0] == pCurNode){ if (numNodes != 2 || pTargetNode[1] == pCurNode) { - float currentAngle = CGeneral::GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); + float currentAngle = GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); nextLink = 0; float lowestAngleChange = 10.0f; int numLinks = pCurNode->numLinks; @@ -2041,7 +2023,7 @@ void CCarCtrl::PickNextNodeToChaseCar(CVehicle* pVehicle, float targetX, float t if (conNode == prevNode && i > 1) continue; CPathNode* pTestNode = &ThePaths.m_pathNodes[conNode]; - float angle = CGeneral::GetATanOfXY(pTestNode->GetX() - pCurNode->GetX(), pTestNode->GetY() - pCurNode->GetY()); + float angle = GetATanOfXY(pTestNode->GetX() - pCurNode->GetX(), pTestNode->GetY() - pCurNode->GetY()); angle = LimitRadianAngle(angle - currentAngle); angle = ABS(angle); if (angle < lowestAngleChange) { @@ -2459,6 +2441,16 @@ void CCarCtrl::SteerAICarWithPhysics_OnlyMission(CVehicle* pVehicle, float* pSwe *pHandbrake = true; return; case MISSION_CRUISE: + if (CTrafficLights::ShouldCarStopForBridge(pVehicle)) { + *pAccel = 0.0f; + *pBrake = 1.0f; + *pHandbrake = true; +#ifdef FIX_BUGS + *pSwerve = 0.0f; +#endif + break; + } + // fallthough case MISSION_RAMPLAYER_FARAWAY: case MISSION_BLOCKPLAYER_FARAWAY: case MISSION_GOTOCOORDS: @@ -2529,11 +2521,19 @@ void CCarCtrl::SteerAICarWithPhysics_OnlyMission(CVehicle* pVehicle, float* pSwe *pHandbrake = false; return; case MISSION_RAMCAR_CLOSE: + if (!pVehicle->AutoPilot.m_pTargetCar) { + debug("NO TARGET VEHICLE FOR MISSION_RAMCAR_CLOSE\n"); + return; + } SteerAICarWithPhysicsHeadingForTarget(pVehicle, pVehicle->AutoPilot.m_pTargetCar, pVehicle->AutoPilot.m_pTargetCar->GetPosition().x, pVehicle->AutoPilot.m_pTargetCar->GetPosition().y, pSwerve, pAccel, pBrake, pHandbrake); return; case MISSION_BLOCKCAR_CLOSE: + if (!pVehicle->AutoPilot.m_pTargetCar) { + debug("NO TARGET VEHICLE FOR MISSION_BLOCKCAR_CLOSE\n"); + return; + } SteerAICarWithPhysicsTryingToBlockTarget(pVehicle, pVehicle->AutoPilot.m_pTargetCar->GetPosition().x, pVehicle->AutoPilot.m_pTargetCar->GetPosition().y, @@ -2542,6 +2542,9 @@ void CCarCtrl::SteerAICarWithPhysics_OnlyMission(CVehicle* pVehicle, float* pSwe pSwerve, pAccel, pBrake, pHandbrake); return; case MISSION_BLOCKCAR_HANDBRAKESTOP: + if (!pVehicle->AutoPilot.m_pTargetCar) { + return; + } SteerAICarWithPhysicsTryingToBlockTarget_Stop(pVehicle, pVehicle->AutoPilot.m_pTargetCar->GetPosition().x, pVehicle->AutoPilot.m_pTargetCar->GetPosition().y, @@ -2619,8 +2622,8 @@ void CCarCtrl::SteerAIBoatWithPhysicsHeadingForTarget(CVehicle* pVehicle, float { CVector2D forward = pVehicle->GetForward(); forward.Normalise(); - float angleToTarget = CGeneral::GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); - float angleForward = CGeneral::GetATanOfXY(forward.x, forward.y); + float angleToTarget = GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); + float angleForward = GetATanOfXY(forward.x, forward.y); float steerAngle = LimitRadianAngle(angleToTarget - angleForward); steerAngle = clamp(steerAngle, -DEFAULT_MAX_STEER_ANGLE, DEFAULT_MAX_STEER_ANGLE); #ifdef FIX_BUGS @@ -2651,8 +2654,8 @@ void CCarCtrl::SteerAIBoatWithPhysicsAttackingPlayer(CVehicle* pVehicle, float* CVector2D forward = pVehicle->GetForward(); forward.Normalise(); CVector2D vecToProjection = FindPlayerCoors() + FindPlayerSpeed() * projection * GAME_SPEED_TO_CARAI_SPEED; - float angleToTarget = CGeneral::GetATanOfXY(vecToProjection.x - pVehicle->GetPosition().x, vecToProjection.y - pVehicle->GetPosition().y); - float angleForward = CGeneral::GetATanOfXY(forward.x, forward.y); + float angleToTarget = GetATanOfXY(vecToProjection.x - pVehicle->GetPosition().x, vecToProjection.y - pVehicle->GetPosition().y); + float angleForward = GetATanOfXY(forward.x, forward.y); float steerAngle = LimitRadianAngle(angleToTarget - angleForward); #ifdef FIX_BUGS float speedTarget = pVehicle->AutoPilot.GetCruiseSpeed(); @@ -2740,7 +2743,7 @@ void CCarCtrl::SteerAIHeliTowardsTargetCoors(CAutomobile* pHeli) if (distanceToTarget < 8.0f && pHeli->m_fHeliOrientation < 0.0f) ZTurnSpeedTarget = 0.0f; else { - float fAngleTarget = CGeneral::GetATanOfXY(vecToTarget.x, vecToTarget.y) + PI; + float fAngleTarget = GetATanOfXY(vecToTarget.x, vecToTarget.y) + PI; if (pHeli->m_fHeliOrientation >= 0.0f) fAngleTarget = pHeli->m_fHeliOrientation; fAngleTarget -= pHeli->m_fOrientation; @@ -2783,7 +2786,7 @@ void CCarCtrl::SteerAIPlaneTowardsTargetCoors(CAutomobile* pPlane) CVector2D vecToTarget = pPlane->AutoPilot.m_vecDestinationCoors - pPlane->GetPosition(); float fForwardZ = (pPlane->AutoPilot.m_vecDestinationCoors.z - pPlane->GetPosition().z) / vecToTarget.Magnitude(); fForwardZ = clamp(fForwardZ, -0.3f, 0.3f); - float angle = CGeneral::GetATanOfXY(vecToTarget.x, vecToTarget.y); + float angle = GetATanOfXY(vecToTarget.x, vecToTarget.y); while (angle > TWOPI) angle -= TWOPI; float difference = LimitRadianAngle(angle - pPlane->m_fOrientation); @@ -2880,8 +2883,8 @@ void CCarCtrl::SteerAICarWithPhysicsFollowPath(CVehicle* pVehicle, float* pSwerv projectedPosition.y = positionOnCurrentLinkIncludingLane.y; } CVector2D distanceToProjectedPosition = projectedPosition - pVehicle->GetPosition(); - float angleCurrentLink = CGeneral::GetATanOfXY(distanceToProjectedPosition.x, distanceToProjectedPosition.y); - float angleForward = CGeneral::GetATanOfXY(forward.x, forward.y); + float angleCurrentLink = GetATanOfXY(distanceToProjectedPosition.x, distanceToProjectedPosition.y); + float angleForward = GetATanOfXY(forward.x, forward.y); if (pVehicle->AutoPilot.m_nDrivingStyle == DRIVINGSTYLE_AVOID_CARS) angleCurrentLink = FindAngleToWeaveThroughTraffic(pVehicle, nil, angleCurrentLink, angleForward); float steerAngle = LimitRadianAngle(angleCurrentLink - angleForward); @@ -2920,11 +2923,11 @@ void CCarCtrl::SteerAICarWithPhysicsFollowPath(CVehicle* pVehicle, float* pSwerv pCurrentLink->GetY() - ((pVehicle->AutoPilot.m_nCurrentLane + pCurrentLink->OneWayLaneOffset()) * LANE_WIDTH) * currentPathLinkForward.x); trajectory -= pVehicle->GetPosition(); float speedAngleMultiplier = FindSpeedMultiplier( - CGeneral::GetATanOfXY(trajectory.x, trajectory.y) - angleForward, + GetATanOfXY(trajectory.x, trajectory.y) - angleForward, MIN_ANGLE_FOR_SPEED_LIMITING, MAX_ANGLE_FOR_SPEED_LIMITING, MIN_LOWERING_SPEED_COEFFICIENT); float tmpWideMultiplier = FindSpeedMultiplier( - CGeneral::GetATanOfXY(currentPathLinkForward.x, currentPathLinkForward.y) - - CGeneral::GetATanOfXY(nextPathLinkForwardX, nextPathLinkForwardY), + GetATanOfXY(currentPathLinkForward.x, currentPathLinkForward.y) - + GetATanOfXY(nextPathLinkForwardX, nextPathLinkForwardY), MIN_ANGLE_FOR_SPEED_LIMITING_BETWEEN_NODES, MAX_ANGLE_FOR_SPEED_LIMITING, MIN_LOWERING_SPEED_COEFFICIENT); float speedNodesMultiplier; if (scalarDistanceToNextNode > DISTANCE_TO_NEXT_NODE_TO_CONSIDER_SLOWING_DOWN || pVehicle->AutoPilot.m_nCruiseSpeed < 12) @@ -2958,8 +2961,8 @@ void CCarCtrl::SteerAICarWithPhysicsHeadingForTarget(CVehicle* pVehicle, CPhysic *pHandbrake = false; CVector2D forward = pVehicle->GetForward(); forward.Normalise(); - float angleToTarget = CGeneral::GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); - float angleForward = CGeneral::GetATanOfXY(forward.x, forward.y); + float angleToTarget = GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); + float angleForward = GetATanOfXY(forward.x, forward.y); if (pVehicle->AutoPilot.m_nDrivingStyle == DRIVINGSTYLE_AVOID_CARS) angleToTarget = FindAngleToWeaveThroughTraffic(pVehicle, pTarget, angleToTarget, angleForward); float steerAngle = LimitRadianAngle(angleToTarget - angleForward); @@ -3165,7 +3168,7 @@ bool CCarCtrl::JoinCarWithRoadSystemGotoCoors(CVehicle* pVehicle, CVector vecTar void CCarCtrl::FindLinksToGoWithTheseNodes(CVehicle* pVehicle) { if (pVehicle->m_nRouteSeed) - CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed); + CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed++); int nextLink; CPathNode* pCurNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nCurrentRouteNode]; for (nextLink = 0; nextLink < 12; nextLink++) @@ -3207,10 +3210,12 @@ void CCarCtrl::GenerateEmergencyServicesCar(void) return; if (CGame::IsInInterior()) return; + if (TheCamera.m_WideScreenOn) // TODO(LCS): verify + return; if (NumFiretrucksOnDuty + NumAmbulancesOnDuty + NumParkedCars + NumMissionCars + NumLawEnforcerCars + NumRandomCars > MaxNumberOfCarsInUse) return; - if (NumAmbulancesOnDuty == 0){ + if (NumAmbulancesOnDuty == 0 /* TODO(LCS): && gbEmergencyVehiclesEnabled */){ if (gAccidentManager.CountActiveAccidents() < 2){ if (CStreaming::HasModelLoaded(MI_AMBULAN)) CStreaming::SetModelIsDeletable(MI_MEDIC); @@ -3229,7 +3234,7 @@ void CCarCtrl::GenerateEmergencyServicesCar(void) } } } - if (NumFiretrucksOnDuty == 0){ + if (NumFiretrucksOnDuty == 0 /* TODO(LCS): && gbEmergencyVehiclesEnabled */){ if (gFireManager.GetTotalActiveFires() < 3){ if (CStreaming::HasModelLoaded(MI_FIRETRUCK)) CStreaming::SetModelIsDeletable(MI_FIREMAN); @@ -3386,6 +3391,17 @@ bool CCarCtrl::MapCouldMoveInThisArea(float x, float y) #endif } +bool +CCarCtrl::BoatWithTallMast(int32 mi) +{ + return mi == MI_RIO || mi == MI_TROPIC || mi == MI_MARQUIS; +} + +bool CCarCtrl::OkToCreateVehicleAtThisPosition(const CVector& pos) +{ + return true; +} + float CCarCtrl::FindSpeedMultiplierWithSpeedFromNodes(int8 type) { switch (type) @@ -3395,3 +3411,8 @@ float CCarCtrl::FindSpeedMultiplierWithSpeedFromNodes(int8 type) } return 1.0f; } + +void CCarCtrl::RenderDebugInfo(CVehicle*) +{ + //TODO(LCS) +} diff --git a/src/control/CarCtrl.h b/src/control/CarCtrl.h index 61ebb35c..fcb7929b 100644 --- a/src/control/CarCtrl.h +++ b/src/control/CarCtrl.h @@ -1,6 +1,7 @@ #pragma once #include "PathFind.h" #include "Boat.h" +#include "General.h" #include "Vehicle.h" #define GAME_SPEED_TO_METERS_PER_SECOND 50.0f @@ -130,8 +131,9 @@ public: static void SteerAIBoatWithPhysicsAttackingPlayer(CVehicle*, float*, float*, float*, bool*); static void SteerAICarBlockingPlayerForwardAndBack(CVehicle*, float*, float*, float*, bool*); - static bool OkToCreateVehicleAtThisPosition(const CVector&) { return true; } - static float GetATanOfXY(float x, float y) { float t = CGeneral::GetATanOfXY(x, y); if (t < 0.0f) t += TWOPI; return t; } // TODO(LCS): replace where required + static bool OkToCreateVehicleAtThisPosition(const CVector&); + static void RenderDebugInfo(CVehicle*); + static float GetATanOfXY(float x, float y) { float t = CGeneral::GetATanOfXY(x, y); if (t < 0.0f) t += TWOPI; return t; } static float GetPositionAlongCurrentCurve(CVehicle* pVehicle) { @@ -141,11 +143,7 @@ public: static float LimitRadianAngle(float angle) { - while (angle < -PI) - angle += TWOPI; - while (angle > PI) - angle -= TWOPI; - return angle; + return CGeneral::LimitRadianAngle(angle); } static bool bMadDriversCheat; diff --git a/src/core/IniFile.cpp b/src/core/IniFile.cpp index f7e2bfdd..870e9a71 100644 --- a/src/core/IniFile.cpp +++ b/src/core/IniFile.cpp @@ -10,7 +10,7 @@ // --MIAMI: file done float CIniFile::PedNumberMultiplier = 0.6f; -float CIniFile::CarNumberMultiplier = 0.6f; +float CIniFile::CarNumberMultiplier = 0.8f; void CIniFile::LoadIniFile() { @@ -27,5 +27,5 @@ void CIniFile::LoadIniFile() } CPopulation::MaxNumberOfPedsInUse = 25.0f * PedNumberMultiplier; CPopulation::MaxNumberOfPedsInUseInterior = 40.0f * PedNumberMultiplier; - CCarCtrl::MaxNumberOfCarsInUse = 12.0f * CarNumberMultiplier; + CCarCtrl::MaxNumberOfCarsInUse = 30.0f * CarNumberMultiplier; } \ No newline at end of file From 29b76fc4f59fe6cba7f3cf553475ea5c634fa9a1 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Fri, 1 Jan 2021 22:57:17 +0300 Subject: [PATCH 03/68] small thing --- src/control/Script.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index c022cfe8..b03d8403 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -1673,6 +1673,23 @@ void CMissionCleanup::Init() } } +static void SleepThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) +{ + printf("*** SLEEPING PED %i %i\n", pCleanup->id, pPed->GetModelIndex()); + if (!pPed->GetIsStatic()) + pPed->RemoveFromMovingList(); + pPed->bIsStaticWaitingForCollision = true; +} + +static void WakeThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) +{ + printf("*** WAKING UP PED %i %i\n", pCleanup->id, pPed->GetModelIndex()); + pPed->bIsStaticWaitingForCollision = false; + if (!pPed->bIsStatic) + pPed->AddToMovingList(); + +} + cleanup_entity_struct* CMissionCleanup::FindFree() { for (int i = 0; i < MAX_CLEANUP; i++){ From bec8f6b86c10217c45fd0073c64dfdec2dae98da Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sun, 3 Jan 2021 22:29:16 +0300 Subject: [PATCH 04/68] reorder --- src/control/Script.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index b03d8403..d71f532d 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -1673,6 +1673,16 @@ void CMissionCleanup::Init() } } +cleanup_entity_struct* CMissionCleanup::FindFree() +{ + for (int i = 0; i < MAX_CLEANUP; i++){ + if (m_sEntities[i].type == CLEANUP_UNUSED) + return &m_sEntities[i]; + } + script_assert(0); + return nil; +} + static void SleepThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) { printf("*** SLEEPING PED %i %i\n", pCleanup->id, pPed->GetModelIndex()); @@ -1690,16 +1700,6 @@ static void WakeThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) } -cleanup_entity_struct* CMissionCleanup::FindFree() -{ - for (int i = 0; i < MAX_CLEANUP; i++){ - if (m_sEntities[i].type == CLEANUP_UNUSED) - return &m_sEntities[i]; - } - script_assert(0); - return nil; -} - void CMissionCleanup::AddEntityToList(int32 id, uint8 type) { cleanup_entity_struct* pNew = FindFree(); From 69d30f22046dfddc79e1e169ed7d90bf3b920335 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Thu, 7 Jan 2021 15:21:35 +0300 Subject: [PATCH 05/68] some lcs stuff --- src/collision/ColStore.h | 1 + src/control/Script.cpp | 176 +++++++++++++++++++++++++++++++++------ src/control/Script.h | 5 +- src/core/Pad.h | 2 + src/core/Streaming.h | 1 + 5 files changed, 157 insertions(+), 28 deletions(-) diff --git a/src/collision/ColStore.h b/src/collision/ColStore.h index 8e2a3a70..e0da92ca 100644 --- a/src/collision/ColStore.h +++ b/src/collision/ColStore.h @@ -33,6 +33,7 @@ public: static void RequestCollision(const CVector2D &pos); static void EnsureCollisionIsInMemory(const CVector2D &pos); static bool HasCollisionLoaded(const CVector2D &pos); + static bool HasCollisionLoaded(eLevelName level) { return true; }; // TODO static ColDef *GetSlot(int slot) { assert(slot >= 0); diff --git a/src/control/Script.cpp b/src/control/Script.cpp index d71f532d..4e34c4b2 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -1659,11 +1659,13 @@ const uint32 CRunningScript::nSaveStructSize = sizeof(CRunningScript); #endif +// done(LCS) CMissionCleanup::CMissionCleanup() { Init(); } +// done(LCS) void CMissionCleanup::Init() { m_nCount = 0; @@ -1673,6 +1675,7 @@ void CMissionCleanup::Init() } } +// done(LCS) cleanup_entity_struct* CMissionCleanup::FindFree() { for (int i = 0; i < MAX_CLEANUP; i++){ @@ -1683,7 +1686,8 @@ cleanup_entity_struct* CMissionCleanup::FindFree() return nil; } -static void SleepThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) +// done(LCS) +void SleepThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) { printf("*** SLEEPING PED %i %i\n", pCleanup->id, pPed->GetModelIndex()); if (!pPed->GetIsStatic()) @@ -1691,7 +1695,8 @@ static void SleepThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) pPed->bIsStaticWaitingForCollision = true; } -static void WakeThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) +// done(LCS) +void WakeThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) { printf("*** WAKING UP PED %i %i\n", pCleanup->id, pPed->GetModelIndex()); pPed->bIsStaticWaitingForCollision = false; @@ -1700,6 +1705,42 @@ static void WakeThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) } +// done(LCS) +void SleepThisVehicle(cleanup_entity_struct* pCleanup, CVehicle* pVehicle) +{ + printf("*** SLEEPING VEHICLE %i %i\n", pCleanup->id, pVehicle->GetModelIndex()); + if (!pVehicle->GetIsStatic()) + pVehicle->RemoveFromMovingList(); + pVehicle->bIsStaticWaitingForCollision = true; +} + +// done(LCS) +void WakeThisVehicle(cleanup_entity_struct* pCleanup, CVehicle* pVehicle) +{ + printf("*** WAKING UP VEHICLE %i %i\n", pCleanup->id, pVehicle->GetModelIndex()); + pVehicle->bIsStaticWaitingForCollision = false; + if (!pVehicle->bIsStatic) + pVehicle->AddToMovingList(); +} + +// done(LCS) +void SleepThisObject(cleanup_entity_struct* pCleanup, CObject* pObject) +{ + if (!pObject->GetIsStatic()) + pObject->RemoveFromMovingList(); + pObject->bIsStaticWaitingForCollision = true; +} + +// done(LCS) +void WakeThisObject(cleanup_entity_struct* pCleanup, CObject* pObject) +{ + pObject->bIsStaticWaitingForCollision = false; + if (!pObject->bIsStatic) + pObject->AddToMovingList(); + +} + +// done(LCS) void CMissionCleanup::AddEntityToList(int32 id, uint8 type) { cleanup_entity_struct* pNew = FindFree(); @@ -1710,6 +1751,7 @@ void CMissionCleanup::AddEntityToList(int32 id, uint8 type) m_nCount++; } +// done(LCS) static void PossiblyWakeThisEntity(CPhysical* pEntity, bool ifColLoaded = false) { if (!pEntity->bIsStaticWaitingForCollision) @@ -1721,6 +1763,7 @@ static void PossiblyWakeThisEntity(CPhysical* pEntity, bool ifColLoaded = false) } } +// done(LCS) void CMissionCleanup::RemoveEntityFromList(int32 id, uint8 type) { for (int i = 0; i < MAX_CLEANUP; i++){ @@ -1757,37 +1800,102 @@ void CMissionCleanup::RemoveEntityFromList(int32 id, uint8 type) } } +// done(LCS) void CMissionCleanup::CheckIfCollisionHasLoadedForMissionObjects() { for (int i = 0; i < MAX_CLEANUP; i++) { switch (m_sEntities[i].type) { case CLEANUP_CAR: { - CVehicle* v = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id); - if (v) - PossiblyWakeThisEntity(v, true); - break; + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id); + if (pVehicle) { + eLevelName level = CTheZones::GetLevelFromPosition(&pVehicle->GetPosition()); + if (level == LEVEL_GENERIC) + level = CGame::currLevel; + if (!CColStore::HasCollisionLoaded(level)) { + if (!pVehicle->bIsStaticWaitingForCollision) { + if (!pVehicle->IsHeli() && !pVehicle->IsPlane() && pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI && + pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT && pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE) { + SleepThisVehicle(&m_sEntities[i], pVehicle); + } + } + } + else { + if (pVehicle->bIsStaticWaitingForCollision) + WakeThisVehicle(&m_sEntities[i], pVehicle); + } + } } + break; + case CLEANUP_OBJECT: + CObject* pObject = CPools::GetObjectPool()->GetAt(m_sEntities[i].id); + if (pObject) { + eLevelName level = CTheZones::GetLevelFromPosition(&pObject->GetPosition()); + if (level == LEVEL_GENERIC) + level = CGame::currLevel; + if (!CColStore::HasCollisionLoaded(level)) { + if (!pObject->bIsStaticWaitingForCollision) { + SleepThisObject(&m_sEntities[i], pObject); + } + } + else { + if (pObject->bIsStaticWaitingForCollision) + WakeThisObject(&m_sEntities[i], pObject); + } + } + } + } + for (int i = 0; i < MAX_CLEANUP; i++) { + switch (m_sEntities[i].type) { case CLEANUP_CHAR: { - CPed* p = CPools::GetPedPool()->GetAt(m_sEntities[i].id); - if (p) - PossiblyWakeThisEntity(p, true); - break; + CPed* pPed = CPools::GetPedPool()->GetAt(m_sEntities[i].id); + if (pPed) { + eLevelName level = CTheZones::GetLevelFromPosition(&pPed->GetPosition()); + if (level == LEVEL_GENERIC) + level = CGame::currLevel; + if (!pPed->bIsStaticWaitingForCollision) { + if (pPed->bInVehicle) { + if (pPed->m_pMyVehicle->GetIsStatic()) { + SleepThisPed(&m_sEntities[i], pPed); + continue; + } + } + if (!CColStore::HasCollisionLoaded(level)) { + if (pPed->bInVehicle && pPed->m_pMyVehicle->GetIsStatic() || + pPed->m_attachedTo && pPed->m_attachedTo->GetIsStatic()) + SleepThisPed(&m_sEntities[i], pPed); + } + } + else { + if (!pPed->bInVehicle) { + if (CColStore::HasCollisionLoaded(level)) { + if (!(pPed->bInVehicle && pPed->m_pMyVehicle->GetIsStatic() || + pPed->m_attachedTo && pPed->m_attachedTo->GetIsStatic())) + WakeThisPed(&m_sEntities[i], pPed); + } + } + else { + if (!pPed->m_pMyVehicle->GetIsStatic()) { + WakeThisPed(&m_sEntities[i], pPed); + continue; + } + if (CColStore::HasCollisionLoaded(level)) { + if (!(pPed->bInVehicle && pPed->m_pMyVehicle->GetIsStatic() || + pPed->m_attachedTo && pPed->m_attachedTo->GetIsStatic())) + WakeThisPed(&m_sEntities[i], pPed); + } + } + } + + } } - case CLEANUP_OBJECT: - { - CObject* o = CPools::GetObjectPool()->GetAt(m_sEntities[i].id); - if (o) - PossiblyWakeThisEntity(o, true); - break; - } - default: - break; + break; } } } +// TODO(LCS) CPhysical* CMissionCleanup::DoesThisEntityWaitForCollision(int i) { if (m_sEntities[i].type == CLEANUP_CAR) { @@ -1803,6 +1911,7 @@ CPhysical* CMissionCleanup::DoesThisEntityWaitForCollision(int i) return nil; } +// done(LCS) except TODO void CMissionCleanup::Process() { CPopulation::m_AllRandomPedsThisType = -1; @@ -1810,6 +1919,8 @@ void CMissionCleanup::Process() CCarCtrl::CarDensityMultiplier = 1.0f; CPed::nThreatReactionRangeMultiplier = 1; CPed::nEnterCarRangeMultiplier = 1; + for (int i = 0; i < MAX_ALLOWED_COLLISIONS; i++) + CTheScripts::AllowedCollision[i] = 0; FindPlayerPed()->m_pWanted->m_fCrimeSensitivity = 1.0f; CRoadBlocks::ClearScriptRoadBlocks(); CRouteNode::Initialise(); @@ -1817,20 +1928,19 @@ void CMissionCleanup::Process() TheCamera.Restore(); TheCamera.SetWideScreenOff(); CSpecialFX::bLiftCam = false; - CSpecialFX::bVideoCam = false; - CTimeCycle::StopExtraColour(0); + // TODO(LCS): CHud::m_ClockEventWarningMinutes = 0; + // TODO(LCS): CHud::m_ClockEventFlashTimer = 0; + CTimeCycle::StopExtraColour(0); // TODO: thiscall for (int i = 0; i < MISSION_AUDIO_SLOTS; i++) DMAudio.ClearMissionAudio(i); CWeather::ReleaseWeather(); for (int i = 0; i < NUM_OF_SPECIAL_CHARS; i++) CStreaming::SetMissionDoesntRequireSpecialChar(i); - for (int i = 0; i < NUM_OF_CUTSCENE_OBJECTS; i++) - CStreaming::SetMissionDoesntRequireModel(MI_CUTOBJ01 + i); CStreaming::ms_disableStreaming = false; - CHud::m_ItemToFlash = -1; - CHud::SetHelpMessage(nil, false); + if (CHud::m_ItemToFlash != ITEM_ARMOUR && CHud::m_ItemToFlash != ITEM_HEALTH) + CHud::m_ItemToFlash = -1; + CHud::SetHelpMessage(nil, false); // nil, false, false, true TODO(LCS) CUserDisplay::OnscnTimer.m_bDisabled = false; - CTheScripts::RemoveScriptTextureDictionary(); CWorld::Players[0].m_pPed->m_pWanted->m_bIgnoredByCops = false; CWorld::Players[0].m_pPed->m_pWanted->m_bIgnoredByEveryone = false; CWorld::Players[0].MakePlayerSafe(false); @@ -1838,10 +1948,11 @@ void CMissionCleanup::Process() CWorld::Players[0].m_pPed->m_nDrunkCountdown = 0; CPad::GetPad(0)->SetDrunkInputDelay(0); CWorld::Players[0].m_bDriveByAllowed = true; + CPad::GetPad(0)->unk_B4 = 1.0f; + CPad::GetPad(0)->unk_B8 = 0.5f; DMAudio.ShutUpPlayerTalking(0); CVehicle::bDisableRemoteDetonation = false; CVehicle::bDisableRemoteDetonationOnContact = false; - CGameLogic::ClearShortCut(); CTheScripts::RiotIntensity = 0; CTheScripts::StoreVehicleIndex = -1; CTheScripts::StoreVehicleWasRandom = true; @@ -1879,12 +1990,17 @@ void CMissionCleanup::Process() m_sEntities[i].type = CLEANUP_UNUSED; m_nCount--; } + for (int i = 1; i < NUMSTREAMINFO; i++) { + if (CStreaming::IsScriptOwnedModel(i)) + CStreaming::SetMissionDoesntRequireModel(i); + } } /* NB: CUpsideDownCarCheck is not used by actual script at all * It has a weird usage: AreAnyCarsUpsideDown would fail any mission * just like death or arrest. */ + // done(LCS) except TODO void CUpsideDownCarCheck::Init() { for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){ @@ -1893,6 +2009,7 @@ void CUpsideDownCarCheck::Init() } } +// done(LCS) bool CUpsideDownCarCheck::IsCarUpsideDown(int32 id) { CVehicle* v = CPools::GetVehiclePool()->GetAt(id); @@ -1901,6 +2018,7 @@ bool CUpsideDownCarCheck::IsCarUpsideDown(int32 id) v->GetTurnSpeed().Magnitude() < 0.02f; } +// done(LCS) void CUpsideDownCarCheck::UpdateTimers() { uint32 timeStep = CTimer::GetTimeStepInMilliseconds(); @@ -1918,6 +2036,7 @@ void CUpsideDownCarCheck::UpdateTimers() } } +// done(LCS) bool CUpsideDownCarCheck::AreAnyCarsUpsideDown() { for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){ @@ -1927,6 +2046,7 @@ bool CUpsideDownCarCheck::AreAnyCarsUpsideDown() return false; } +// done(LCS) void CUpsideDownCarCheck::AddCarToCheck(int32 id) { uint16 index = 0; @@ -1938,6 +2058,7 @@ void CUpsideDownCarCheck::AddCarToCheck(int32 id) m_sCars[index].m_nUpsideDownTimer = 0; } +// done(LCS) void CUpsideDownCarCheck::RemoveCarFromCheck(int32 id) { for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){ @@ -1948,6 +2069,7 @@ void CUpsideDownCarCheck::RemoveCarFromCheck(int32 id) } } +// done(LCS) bool CUpsideDownCarCheck::HasCarBeenUpsideDownForAWhile(int32 id) { for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){ diff --git a/src/control/Script.h b/src/control/Script.h index 66c9914e..2690b4ff 100644 --- a/src/control/Script.h +++ b/src/control/Script.h @@ -267,7 +267,8 @@ enum { MAX_NUM_MISSION_SCRIPTS = 120, MAX_NUM_BUILDING_SWAPS = 25, MAX_NUM_INVISIBILITY_SETTINGS = 20, - MAX_NUM_STORED_LINES = 1024 + MAX_NUM_STORED_LINES = 1024, + MAX_ALLOWED_COLLISIONS = 2 }; class CTheScripts @@ -317,6 +318,8 @@ class CTheScripts #define CARDS_IN_STACK (CARDS_IN_DECK * MAX_DECKS) static int16 CardStack[CARDS_IN_STACK]; static int16 CardStackPosition; + + static int AllowedCollision[MAX_ALLOWED_COLLISIONS]; #endif public: static bool bPlayerIsInTheStatium; diff --git a/src/core/Pad.h b/src/core/Pad.h index 9f9f81b6..3a4f54b3 100644 --- a/src/core/Pad.h +++ b/src/core/Pad.h @@ -164,6 +164,8 @@ public: int32 LastTimeTouched; int32 AverageWeapon; int32 AverageEntries; + float unk_B4; + float unk_B8; #ifdef DETECT_PAD_INPUT_SWITCH static bool IsAffectedByController; diff --git a/src/core/Streaming.h b/src/core/Streaming.h index a67384f6..6e354021 100644 --- a/src/core/Streaming.h +++ b/src/core/Streaming.h @@ -123,6 +123,7 @@ public: static bool HasColLoaded(int32 id) { return HasModelLoaded(id+STREAM_OFFSET_COL); } static bool HasAnimLoaded(int32 id) { return HasModelLoaded(id+STREAM_OFFSET_ANIM); } static bool CanRemoveModel(int32 id) { return (ms_aInfoForModel[id].m_flags & STREAMFLAGS_CANT_REMOVE) == 0; } + static bool IsScriptOwnedModel(int32 id) { return (ms_aInfoForModel[id].m_flags & STREAMFLAGS_SCRIPTOWNED) == 0; } static bool CanRemoveTxd(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_TXD); } static bool CanRemoveCol(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_COL); } static bool CanRemoveAnim(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_ANIM); } From 236b3b1c2b6d6480acbe50f6f3c5f16c8208a95e Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Fri, 8 Jan 2021 12:41:39 +0300 Subject: [PATCH 06/68] more stuff --- src/control/CarAI.cpp | 2 +- src/control/Script.cpp | 191 ++++++++++++++++++++++------------------- src/control/Script.h | 11 ++- src/core/Streaming.h | 2 +- 4 files changed, 112 insertions(+), 94 deletions(-) diff --git a/src/control/CarAI.cpp b/src/control/CarAI.cpp index ed7f432e..06438e0a 100644 --- a/src/control/CarAI.cpp +++ b/src/control/CarAI.cpp @@ -80,7 +80,7 @@ void CCarAI::UpdateCarAI(CVehicle* pVehicle) pVehicle->SetStatus(STATUS_PHYSICS); CColPoint colPoint; CEntity* pEntity; - if (pVehicle->m_randomSeed & 0x3F == CTimer::GetFrameCounter() & 0x3F && + if ((pVehicle->m_randomSeed & 0x3F) == (CTimer::GetFrameCounter() & 0x3F) && !CWorld::ProcessVerticalLine(pVehicle->GetPosition(), -2.0f, colPoint, pEntity, true, false, false, false, true, false, nil)) { debug("FLOATING CAR TURNED INTO PHYSICS CAR!\n"); pVehicle->SetStatus(STATUS_PHYSICS); diff --git a/src/control/Script.cpp b/src/control/Script.cpp index a453c077..9cfc2c55 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -100,6 +100,7 @@ bool CTheScripts::bPlayerIsInTheStatium; int16 CTheScripts::CardStack[CARDS_IN_DECK * MAX_DECKS]; int16 CTheScripts::CardStackPosition; #endif +int CTheScripts::AllowedCollision[MAX_ALLOWED_COLLISIONS]; #ifdef MISSION_REPLAY @@ -1705,41 +1706,6 @@ void WakeThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) } -// done(LCS) -void SleepThisVehicle(cleanup_entity_struct* pCleanup, CVehicle* pVehicle) -{ - printf("*** SLEEPING VEHICLE %i %i\n", pCleanup->id, pVehicle->GetModelIndex()); - if (!pVehicle->GetIsStatic()) - pVehicle->RemoveFromMovingList(); - pVehicle->bIsStaticWaitingForCollision = true; -} - -// done(LCS) -void WakeThisVehicle(cleanup_entity_struct* pCleanup, CVehicle* pVehicle) -{ - printf("*** WAKING UP VEHICLE %i %i\n", pCleanup->id, pVehicle->GetModelIndex()); - pVehicle->bIsStaticWaitingForCollision = false; - if (!pVehicle->bIsStatic) - pVehicle->AddToMovingList(); -} - -// done(LCS) -void SleepThisObject(cleanup_entity_struct* pCleanup, CObject* pObject) -{ - if (!pObject->GetIsStatic()) - pObject->RemoveFromMovingList(); - pObject->bIsStaticWaitingForCollision = true; -} - -// done(LCS) -void WakeThisObject(cleanup_entity_struct* pCleanup, CObject* pObject) -{ - pObject->bIsStaticWaitingForCollision = false; - if (!pObject->bIsStatic) - pObject->AddToMovingList(); - -} - // done(LCS) void CMissionCleanup::AddEntityToList(int32 id, uint8 type) { @@ -1751,6 +1717,7 @@ void CMissionCleanup::AddEntityToList(int32 id, uint8 type) m_nCount++; } +// done(LCS) void CMissionCleanup::RemoveEntityFromList(int32 id, uint8 type) { for (int i = 0; i < MAX_CLEANUP; i++){ @@ -1818,13 +1785,20 @@ void CMissionCleanup::CheckIfCollisionHasLoadedForMissionObjects() if (!pVehicle->bIsStaticWaitingForCollision) { if (!pVehicle->IsHeli() && !pVehicle->IsPlane() && pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI && pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT && pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_PLANE) { - SleepThisVehicle(&m_sEntities[i], pVehicle); + printf("*** SLEEPING VEHICLE %i %i\n", m_sEntities[i].id, pVehicle->GetModelIndex()); + if (!pVehicle->GetIsStatic()) + pVehicle->RemoveFromMovingList(); + pVehicle->bIsStaticWaitingForCollision = true; } } } else { - if (pVehicle->bIsStaticWaitingForCollision) - WakeThisVehicle(&m_sEntities[i], pVehicle); + if (pVehicle->bIsStaticWaitingForCollision) { + printf("*** WAKING UP VEHICLE %i %i\n", m_sEntities[i].id, pVehicle->GetModelIndex()); + pVehicle->bIsStaticWaitingForCollision = false; + if (!pVehicle->bIsStatic) + pVehicle->AddToMovingList(); + } } } } @@ -1837,12 +1811,17 @@ void CMissionCleanup::CheckIfCollisionHasLoadedForMissionObjects() level = CGame::currLevel; if (!CColStore::HasCollisionLoaded(level)) { if (!pObject->bIsStaticWaitingForCollision) { - SleepThisObject(&m_sEntities[i], pObject); + if (!pObject->GetIsStatic()) + pObject->RemoveFromMovingList(); + pObject->bIsStaticWaitingForCollision = true; } } else { - if (pObject->bIsStaticWaitingForCollision) - WakeThisObject(&m_sEntities[i], pObject); + if (pObject->bIsStaticWaitingForCollision) { + pObject->bIsStaticWaitingForCollision = false; + if (!pObject->bIsStatic) + pObject->AddToMovingList(); + } } } } @@ -1897,6 +1876,7 @@ void CMissionCleanup::CheckIfCollisionHasLoadedForMissionObjects() } } +// done(LCS) except TODO void CMissionCleanup::Process() { CPopulation::m_AllRandomPedsThisType = -1; @@ -2001,6 +1981,7 @@ bool CUpsideDownCarCheck::IsCarUpsideDown(int32 id) return IsCarUpsideDown(pVehicle); } +// done(LCS) bool CUpsideDownCarCheck::IsCarUpsideDown(CVehicle* pVehicle) { assert(pVehicle); @@ -2009,6 +1990,7 @@ bool CUpsideDownCarCheck::IsCarUpsideDown(CVehicle* pVehicle) pVehicle->GetTurnSpeed().Magnitude() < UPSIDEDOWN_TURN_SPEED_THRESHOLD; } +// done(LCS) void CUpsideDownCarCheck::UpdateTimers() { uint32 timeStep = CTimer::GetTimeStepInMilliseconds(); @@ -2071,6 +2053,7 @@ bool CUpsideDownCarCheck::HasCarBeenUpsideDownForAWhile(int32 id) return false; } +// done(LCS) void stuck_car_data::Reset() { m_nVehicleIndex = -1; @@ -2081,6 +2064,7 @@ void stuck_car_data::Reset() m_bStuck = false; } +// done(LCS) void CStuckCarCheck::Init() { for (int i = 0; i < MAX_STUCK_CAR_CHECKS; i++) { @@ -2088,6 +2072,7 @@ void CStuckCarCheck::Init() } } +// done(LCS) void CStuckCarCheck::Process() { uint32 timer = CTimer::GetTimeInMilliseconds(); @@ -2108,6 +2093,7 @@ void CStuckCarCheck::Process() } } +// done(LCS) void CStuckCarCheck::AddCarToCheck(int32 id, float radius, uint32 time) { CVehicle* pv = CPools::GetVehiclePool()->GetAt(id); @@ -2128,6 +2114,7 @@ void CStuckCarCheck::AddCarToCheck(int32 id, float radius, uint32 time) m_sCars[index].m_bStuck = false; } +// done(LCS) void CStuckCarCheck::RemoveCarFromCheck(int32 id) { for (int i = 0; i < MAX_STUCK_CAR_CHECKS; i++){ @@ -2137,6 +2124,7 @@ void CStuckCarCheck::RemoveCarFromCheck(int32 id) } } +// done(LCS) bool CStuckCarCheck::HasCarBeenStuckForAWhile(int32 id) { for (int i = 0; i < MAX_STUCK_CAR_CHECKS; i++){ @@ -2146,36 +2134,45 @@ bool CStuckCarCheck::HasCarBeenStuckForAWhile(int32 id) return false; } -void CRunningScript::CollectParameters(uint32* pIp, int16 total) +void CRunningScript::CollectParameters(uint32* pIp, int16 total, int* pParameters) { - for (int16 i = 0; i < total; i++){ + while (total--){ uint16 varIndex; switch (CTheScripts::Read1ByteFromScript(pIp)) { + case ARGUMENT_END: + return; + case ARGUMENT_INT_ZERO: + *pParameters = 0; + break; + case ARGUMENT_FLOAT_ZERO: + *pParameters = 0; + break; + case ARGUMENT_FLOAT_1BYTE: + *pParameters = (uint32)(uint8)CTheScripts::Read1ByteFromScript(pIp) << 24; + break; + case ARGUMENT_FLOAT_2BYTES: + *pParameters = (uint32)(uint8)CTheScripts::Read2BytesFromScript(pIp) << 16; + break; + case ARGUMENT_FLOAT_3BYTES: + *pParameters = (uint32)(uint8)CTheScripts::Read1ByteFromScript(pIp) << 8; + *pParameters |= (uint32)(uint16)CTheScripts::Read2BytesFromScript(pIp) << 16; + break; case ARGUMENT_INT32: case ARGUMENT_FLOAT: - ScriptParams[i] = CTheScripts::Read4BytesFromScript(pIp); - break; - case ARGUMENT_GLOBALVAR: - varIndex = CTheScripts::Read2BytesFromScript(pIp); - script_assert(varIndex >= 8 && varIndex < CTheScripts::GetSizeOfVariableSpace()); - ScriptParams[i] = *((int32*)&CTheScripts::ScriptSpace[varIndex]); - break; - case ARGUMENT_LOCALVAR: - varIndex = CTheScripts::Read2BytesFromScript(pIp); - script_assert(varIndex >= 0 && varIndex < ARRAY_SIZE(m_anLocalVariables)); - ScriptParams[i] = m_anLocalVariables[varIndex]; + *pParameters = CTheScripts::Read4BytesFromScript(pIp); break; case ARGUMENT_INT8: - ScriptParams[i] = CTheScripts::Read1ByteFromScript(pIp); + *pParameters = CTheScripts::Read1ByteFromScript(pIp); break; case ARGUMENT_INT16: - ScriptParams[i] = CTheScripts::Read2BytesFromScript(pIp); + *pParameters = CTheScripts::Read2BytesFromScript(pIp); break; default: - script_assert(0); + *pParameters = *GetPointerToScriptVariable(pIp, 0); break; } + pParameters++; } } @@ -2185,11 +2182,24 @@ int CRunningScript::CollectParameterForDebug(char* buf, bool& var) uint16 varIndex; char tmpstr[24]; var = false; + int tmp; switch (CTheScripts::Read1ByteFromScript(&m_nIp)) { - case ARGUMENT_INT32: - case ARGUMENT_FLOAT: - return CTheScripts::Read4BytesFromScript(&m_nIp); + case ARGUMENT_END: + return 0; // TODO(LCS) + case ARGUMENT_INT_ZERO: + return 0; + case ARGUMENT_FLOAT_ZERO: + return 0; + case ARGUMENT_FLOAT_1BYTE: + return (uint32)(uint8)CTheScripts::Read1ByteFromScript(&m_nIp) << 24; + case ARGUMENT_FLOAT_2BYTES: + return (uint32)(uint8)CTheScripts::Read2BytesFromScript(&m_nIp) << 16; + case ARGUMENT_FLOAT_3BYTES: + tmp = (uint32)(uint8)CTheScripts::Read1ByteFromScript(&m_nIp) << 8; + tmp |= (uint32)(uint16)CTheScripts::Read2BytesFromScript(&m_nIp) << 16; + return tmp; + /* case ARGUMENT_GLOBALVAR: varIndex = CTheScripts::Read2BytesFromScript(&m_nIp); script_assert(varIndex >= 8 && varIndex < CTheScripts::GetSizeOfVariableSpace()); @@ -2204,13 +2214,19 @@ int CRunningScript::CollectParameterForDebug(char* buf, bool& var) sprintf(tmpstr, " %d@", varIndex); strcat(buf, tmpstr); return m_anLocalVariables[varIndex]; + */ + case ARGUMENT_INT32: + case ARGUMENT_FLOAT: + return CTheScripts::Read4BytesFromScript(&m_nIp); + break; case ARGUMENT_INT8: return CTheScripts::Read1ByteFromScript(&m_nIp); + break; case ARGUMENT_INT16: return CTheScripts::Read2BytesFromScript(&m_nIp); + break; default: - PrintToLog("%s - script assertion failed in CollectParameterForDebug", buf); - script_assert(0); + // TODO(LCS): GetPointerToScriptVariableForDebug(); break; } return 0; @@ -2221,6 +2237,7 @@ void CRunningScript::GetStoredParameterForDebug(char* buf) uint16 varIndex; char tmpstr[24]; switch (CTheScripts::Read1ByteFromScript(&m_nIp)) { + /* case ARGUMENT_GLOBALVAR: varIndex = CTheScripts::Read2BytesFromScript(&m_nIp); sprintf(tmpstr, " $%d", varIndex / 4); @@ -2231,6 +2248,7 @@ void CRunningScript::GetStoredParameterForDebug(char* buf) sprintf(tmpstr, " %d@", varIndex); strcat(buf, tmpstr); break; + */ default: PrintToLog("%s - script_assertion failed in GetStoredParameterForDebug", buf); script_assert(0); @@ -2241,14 +2259,25 @@ void CRunningScript::GetStoredParameterForDebug(char* buf) int32 CRunningScript::CollectNextParameterWithoutIncreasingPC(uint32 ip) { uint32* pIp = &ip; + int tmp; switch (CTheScripts::Read1ByteFromScript(pIp)) { + case ARGUMENT_END: + return 0; // TODO(LCS) + case ARGUMENT_INT_ZERO: + return 0; + case ARGUMENT_FLOAT_ZERO: + return 0; + case ARGUMENT_FLOAT_1BYTE: + return (uint32)(uint8)CTheScripts::Read1ByteFromScript(&m_nIp) << 24; + case ARGUMENT_FLOAT_2BYTES: + return (uint32)(uint8)CTheScripts::Read2BytesFromScript(&m_nIp) << 16; + case ARGUMENT_FLOAT_3BYTES: + tmp = (uint32)(uint8)CTheScripts::Read1ByteFromScript(&m_nIp) << 8; + tmp |= (uint32)(uint16)CTheScripts::Read2BytesFromScript(&m_nIp) << 16; + return tmp; case ARGUMENT_INT32: return CTheScripts::Read4BytesFromScript(pIp); - case ARGUMENT_GLOBALVAR: - return *((int32*)&CTheScripts::ScriptSpace[(uint16)CTheScripts::Read2BytesFromScript(pIp)]); - case ARGUMENT_LOCALVAR: - return m_anLocalVariables[CTheScripts::Read2BytesFromScript(pIp)]; case ARGUMENT_INT8: return CTheScripts::Read1ByteFromScript(pIp); case ARGUMENT_INT16: @@ -2256,7 +2285,7 @@ int32 CRunningScript::CollectNextParameterWithoutIncreasingPC(uint32 ip) case ARGUMENT_FLOAT: return CTheScripts::Read4BytesFromScript(pIp); default: - script_assert(0); + return *GetPointerToScriptVariable(pIp, 0); } return -1; } @@ -2264,33 +2293,17 @@ int32 CRunningScript::CollectNextParameterWithoutIncreasingPC(uint32 ip) void CRunningScript::StoreParameters(uint32* pIp, int16 number) { for (int16 i = 0; i < number; i++){ - switch (CTheScripts::Read1ByteFromScript(pIp)) { - case ARGUMENT_GLOBALVAR: - *(int32*)&CTheScripts::ScriptSpace[(uint16)CTheScripts::Read2BytesFromScript(pIp)] = ScriptParams[i]; - break; - case ARGUMENT_LOCALVAR: - m_anLocalVariables[CTheScripts::Read2BytesFromScript(pIp)] = ScriptParams[i]; - break; - default: - script_assert(0); - } + *GetPointerToScriptVariable(pIp, 0) = ScriptParams[i]; } } +int32* GetPointerToScriptVariable(CRunningScript* pScript, uint32* pIp) +{ +} + int32 *CRunningScript::GetPointerToScriptVariable(uint32* pIp, int16 type) { - switch (CTheScripts::Read1ByteFromScript(pIp)) - { - case ARGUMENT_GLOBALVAR: - script_assert(type == VAR_GLOBAL); - return (int32*)&CTheScripts::ScriptSpace[(uint16)CTheScripts::Read2BytesFromScript(pIp)]; - case ARGUMENT_LOCALVAR: - script_assert(type == VAR_LOCAL); - return &m_anLocalVariables[CTheScripts::Read2BytesFromScript(pIp)]; - default: - script_assert(0); - } - return nil; + return ::GetPointerToScriptVariable(this, pIp); } void CRunningScript::Init() diff --git a/src/control/Script.h b/src/control/Script.h index f35d0261..e4196220 100644 --- a/src/control/Script.h +++ b/src/control/Script.h @@ -216,9 +216,12 @@ public: enum { ARGUMENT_END = 0, + ARGUMENT_INT_ZERO, + ARGUMENT_FLOAT_ZERO, + ARGUMENT_FLOAT_1BYTE, + ARGUMENT_FLOAT_2BYTES, + ARGUMENT_FLOAT_3BYTES, ARGUMENT_INT32, - ARGUMENT_GLOBALVAR, - ARGUMENT_LOCALVAR, ARGUMENT_INT8, ARGUMENT_INT16, ARGUMENT_FLOAT @@ -451,6 +454,8 @@ enum { NUM_TIMERS = 2 }; +extern int ScriptParams[32]; + class CRunningScript { enum { @@ -512,7 +517,7 @@ public: static const uint32 nSaveStructSize; - void CollectParameters(uint32*, int16); + void CollectParameters(uint32*, int16, int* pParams = (int*)&ScriptParams); int32 CollectNextParameterWithoutIncreasingPC(uint32); int32* GetPointerToScriptVariable(uint32*, int16); void StoreParameters(uint32*, int16); diff --git a/src/core/Streaming.h b/src/core/Streaming.h index 6e354021..f294a7c5 100644 --- a/src/core/Streaming.h +++ b/src/core/Streaming.h @@ -123,7 +123,7 @@ public: static bool HasColLoaded(int32 id) { return HasModelLoaded(id+STREAM_OFFSET_COL); } static bool HasAnimLoaded(int32 id) { return HasModelLoaded(id+STREAM_OFFSET_ANIM); } static bool CanRemoveModel(int32 id) { return (ms_aInfoForModel[id].m_flags & STREAMFLAGS_CANT_REMOVE) == 0; } - static bool IsScriptOwnedModel(int32 id) { return (ms_aInfoForModel[id].m_flags & STREAMFLAGS_SCRIPTOWNED) == 0; } + static bool IsScriptOwnedModel(int32 id) { return (ms_aInfoForModel[id].m_flags & STREAMFLAGS_SCRIPTOWNED); } static bool CanRemoveTxd(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_TXD); } static bool CanRemoveCol(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_COL); } static bool CanRemoveAnim(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_ANIM); } From a9559f03b020b16aa64dee1554b22e960c9dcc14 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sat, 9 Jan 2021 00:20:09 +0300 Subject: [PATCH 07/68] lcs script mode --- src/control/Script.cpp | 288 +++++++++++++++++++++++++---------- src/control/Script.h | 65 +++++--- src/control/Script2.cpp | 10 +- src/control/Script4.cpp | 4 +- src/control/Script5.cpp | 2 +- src/control/Script7.cpp | 2 +- src/control/ScriptCommands.h | 5 + src/core/config.h | 2 +- 8 files changed, 268 insertions(+), 110 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index ce6d6ee2..414e3f67 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -49,18 +49,20 @@ #include "Timecycle.h" #include "TxdStore.h" #include "Bike.h" +#include "memoryManager.h" #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT #include #endif //--MIAMI: file done -uint8 CTheScripts::ScriptSpace[SIZE_SCRIPT_SPACE]; +uint8* CTheScripts::ScriptSpace; CRunningScript CTheScripts::ScriptsArray[MAX_NUM_SCRIPTS]; intro_text_line CTheScripts::IntroTextLines[MAX_NUM_INTRO_TEXT_LINES]; intro_script_rectangle CTheScripts::IntroRectangles[MAX_NUM_INTRO_RECTANGLES]; CSprite2d CTheScripts::ScriptSprites[MAX_NUM_SCRIPT_SRPITES]; script_sphere_struct CTheScripts::ScriptSphereArray[MAX_NUM_SCRIPT_SPHERES]; +tCollectiveData CTheScripts::CollectiveArray[MAX_NUM_COLLECTIVES]; tUsedObject CTheScripts::UsedObjectArray[MAX_NUM_USED_OBJECTS]; int32 CTheScripts::MultiScriptArray[MAX_NUM_MISSION_SCRIPTS]; tBuildingSwap CTheScripts::BuildingSwapArray[MAX_NUM_BUILDING_SWAPS]; @@ -101,6 +103,13 @@ int16 CTheScripts::CardStack[CARDS_IN_DECK * MAX_DECKS]; int16 CTheScripts::CardStackPosition; #endif int CTheScripts::AllowedCollision[MAX_ALLOWED_COLLISIONS]; +bool CTheScripts::FSDestroyedFlag; +short* CTheScripts::SavedVarIndices; +int CTheScripts::NumSaveVars; +int gScriptsFile = -1; +int CTheScripts::NextProcessId = 1; +bool CTheScripts::InTheScripts; +CRunningScript* pCurrent; #ifdef MISSION_REPLAY @@ -226,7 +235,7 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_GOSUB, INPUT_ARGUMENTS(ARGTYPE_LABEL,), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_RETURN, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_LINE, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_CREATE_PLAYER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_CREATE_PLAYER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""), REGISTER_COMMAND(COMMAND_GET_PLAYER_COORDINATES, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), false, -1, ""), REGISTER_COMMAND(COMMAND_SET_PLAYER_COORDINATES, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_IS_PLAYER_IN_AREA_2D, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_BOOL,), OUTPUT_ARGUMENTS(), true, -1, ""), @@ -357,6 +366,11 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_WHILE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_WHILENOT, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_ENDWHILE, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_214, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_215, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_216, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_217, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_218, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_ANDOR, INPUT_ARGUMENTS(ARGTYPE_ANDOR,), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_LAUNCH_MISSION, INPUT_ARGUMENTS(ARGTYPE_LABEL,), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_MISSION_HAS_FINISHED, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), @@ -2134,10 +2148,10 @@ bool CStuckCarCheck::HasCarBeenStuckForAWhile(int32 id) return false; } +// done(LCS) void CRunningScript::CollectParameters(uint32* pIp, int16 total, int* pParameters) { while (total--){ - uint16 varIndex; switch (CTheScripts::Read1ByteFromScript(pIp)) { case ARGUMENT_END: @@ -2152,7 +2166,7 @@ void CRunningScript::CollectParameters(uint32* pIp, int16 total, int* pParameter *pParameters = (uint32)(uint8)CTheScripts::Read1ByteFromScript(pIp) << 24; break; case ARGUMENT_FLOAT_2BYTES: - *pParameters = (uint32)(uint8)CTheScripts::Read2BytesFromScript(pIp) << 16; + *pParameters = (uint32)(uint16)CTheScripts::Read2BytesFromScript(pIp) << 16; break; case ARGUMENT_FLOAT_3BYTES: *pParameters = (uint32)(uint8)CTheScripts::Read1ByteFromScript(pIp) << 8; @@ -2169,6 +2183,7 @@ void CRunningScript::CollectParameters(uint32* pIp, int16 total, int* pParameter *pParameters = CTheScripts::Read2BytesFromScript(pIp); break; default: + *pIp -= 1; *pParameters = *GetPointerToScriptVariable(pIp, 0); break; } @@ -2177,10 +2192,54 @@ void CRunningScript::CollectParameters(uint32* pIp, int16 total, int* pParameter } #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT +// done(LCS) +int32* GetPointerToScriptVariableForDebug(CRunningScript* pScript, uint32* pIp, char* buf) +{ + char tmpstr[24]; + uint8 type = CTheScripts::Read1ByteFromScript(pIp); + if (type >= ARGUMENT_GLOBAL_ARRAY) { + uint8 index_in_block = CTheScripts::Read1ByteFromScript(pIp); + uint8 index_id = CTheScripts::Read1ByteFromScript(pIp); + uint8 size = CTheScripts::Read1ByteFromScript(pIp); + script_assert(size > 0); + script_assert(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id] < size); + uint8 index = Min(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id], size - 1); + sprintf(tmpstr, " $%d[%d@]", ((int)(type - ARGUMENT_GLOBAL_ARRAY) << 8) + index_in_block, index_id); + strcat(buf, tmpstr); + return (int32*)&CTheScripts::ScriptSpace[4 * (((int)(type - ARGUMENT_GLOBAL_ARRAY) << 8) + index + index_in_block)]; + } + else if (type >= ARGUMENT_GLOBAL) { + uint8 index_in_block = CTheScripts::Read1ByteFromScript(pIp); + sprintf(tmpstr, " $%d", ((int)(type - ARGUMENT_GLOBAL) << 8) + index_in_block); + strcat(buf, tmpstr); + return (int32*)&CTheScripts::ScriptSpace[4 * (((int)(type - ARGUMENT_GLOBAL) << 8) + index_in_block)]; + } + else if (type >= ARGUMENT_LOCAL_ARRAY) { + uint8 index_id = CTheScripts::Read1ByteFromScript(pIp); + uint8 size = CTheScripts::Read1ByteFromScript(pIp); + script_assert(size > 0); + script_assert(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id] < size); + uint8 index = Min(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id], size - 1); + sprintf(tmpstr, " %d@[%d@]", (type - ARGUMENT_LOCAL_ARRAY), index_id); + strcat(buf, tmpstr); + return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL_ARRAY) + index]; + } + else if (type >= ARGUMENT_LOCAL) { + sprintf(tmpstr, " %d@", (type - ARGUMENT_LOCAL)); + strcat(buf, tmpstr); + return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL)]; + } + else { + assert(type >= ARGUMENT_TIMER); + sprintf(tmpstr, " TIMER%d@", (type - ARGUMENT_LOCAL_ARRAY)); + strcat(buf, tmpstr); + return &pScript->m_anLocalVariables[NUM_LOCAL_VARS + 8 + (type - ARGUMENT_TIMER)]; // why 8? + } +} + +// done(LCS) int CRunningScript::CollectParameterForDebug(char* buf, bool& var) { - uint16 varIndex; - char tmpstr[24]; var = false; int tmp; switch (CTheScripts::Read1ByteFromScript(&m_nIp)) @@ -2194,27 +2253,11 @@ int CRunningScript::CollectParameterForDebug(char* buf, bool& var) case ARGUMENT_FLOAT_1BYTE: return (uint32)(uint8)CTheScripts::Read1ByteFromScript(&m_nIp) << 24; case ARGUMENT_FLOAT_2BYTES: - return (uint32)(uint8)CTheScripts::Read2BytesFromScript(&m_nIp) << 16; + return (uint32)(uint16)CTheScripts::Read2BytesFromScript(&m_nIp) << 16; case ARGUMENT_FLOAT_3BYTES: tmp = (uint32)(uint8)CTheScripts::Read1ByteFromScript(&m_nIp) << 8; tmp |= (uint32)(uint16)CTheScripts::Read2BytesFromScript(&m_nIp) << 16; return tmp; - /* - case ARGUMENT_GLOBALVAR: - varIndex = CTheScripts::Read2BytesFromScript(&m_nIp); - script_assert(varIndex >= 8 && varIndex < CTheScripts::GetSizeOfVariableSpace()); - var = true; - sprintf(tmpstr, " $%d", varIndex / 4); - strcat(buf, tmpstr); - return *((int32*)&CTheScripts::ScriptSpace[varIndex]); - case ARGUMENT_LOCALVAR: - varIndex = CTheScripts::Read2BytesFromScript(&m_nIp); - script_assert(varIndex >= 0 && varIndex < ARRAY_SIZE(m_anLocalVariables)); - var = true; - sprintf(tmpstr, " %d@", varIndex); - strcat(buf, tmpstr); - return m_anLocalVariables[varIndex]; - */ case ARGUMENT_INT32: case ARGUMENT_FLOAT: return CTheScripts::Read4BytesFromScript(&m_nIp); @@ -2226,36 +2269,22 @@ int CRunningScript::CollectParameterForDebug(char* buf, bool& var) return CTheScripts::Read2BytesFromScript(&m_nIp); break; default: - // TODO(LCS): GetPointerToScriptVariableForDebug(); + var = true; + --m_nIp; + GetPointerToScriptVariableForDebug(this, &m_nIp, buf); break; } return 0; } +// done(LCS) void CRunningScript::GetStoredParameterForDebug(char* buf) { - uint16 varIndex; - char tmpstr[24]; - switch (CTheScripts::Read1ByteFromScript(&m_nIp)) { - /* - case ARGUMENT_GLOBALVAR: - varIndex = CTheScripts::Read2BytesFromScript(&m_nIp); - sprintf(tmpstr, " $%d", varIndex / 4); - strcat(buf, tmpstr); - break; - case ARGUMENT_LOCALVAR: - varIndex = CTheScripts::Read2BytesFromScript(&m_nIp); - sprintf(tmpstr, " %d@", varIndex); - strcat(buf, tmpstr); - break; - */ - default: - PrintToLog("%s - script_assertion failed in GetStoredParameterForDebug", buf); - script_assert(0); - } + GetPointerToScriptVariableForDebug(this, &m_nIp, buf); } #endif +// done(LCS) int32 CRunningScript::CollectNextParameterWithoutIncreasingPC(uint32 ip) { uint32* pIp = &ip; @@ -2271,7 +2300,7 @@ int32 CRunningScript::CollectNextParameterWithoutIncreasingPC(uint32 ip) case ARGUMENT_FLOAT_1BYTE: return (uint32)(uint8)CTheScripts::Read1ByteFromScript(&m_nIp) << 24; case ARGUMENT_FLOAT_2BYTES: - return (uint32)(uint8)CTheScripts::Read2BytesFromScript(&m_nIp) << 16; + return (uint32)(uint16)CTheScripts::Read2BytesFromScript(&m_nIp) << 16; case ARGUMENT_FLOAT_3BYTES: tmp = (uint32)(uint8)CTheScripts::Read1ByteFromScript(&m_nIp) << 8; tmp |= (uint32)(uint16)CTheScripts::Read2BytesFromScript(&m_nIp) << 16; @@ -2285,11 +2314,13 @@ int32 CRunningScript::CollectNextParameterWithoutIncreasingPC(uint32 ip) case ARGUMENT_FLOAT: return CTheScripts::Read4BytesFromScript(pIp); default: + pIp--; return *GetPointerToScriptVariable(pIp, 0); } return -1; } +// done(LCS) void CRunningScript::StoreParameters(uint32* pIp, int16 number) { for (int16 i = 0; i < number; i++){ @@ -2297,18 +2328,60 @@ void CRunningScript::StoreParameters(uint32* pIp, int16 number) } } +// done(LCS) int32* GetPointerToScriptVariable(CRunningScript* pScript, uint32* pIp) { + uint8 type = CTheScripts::Read1ByteFromScript(pIp); + if (type >= ARGUMENT_GLOBAL_ARRAY) { + uint8 index_in_block = CTheScripts::Read1ByteFromScript(pIp); + uint8 index_id = CTheScripts::Read1ByteFromScript(pIp); + uint8 size = CTheScripts::Read1ByteFromScript(pIp); + script_assert(size > 0); + script_assert(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id] < size); + uint8 index = Min(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id], size - 1); + return (int32*)&CTheScripts::ScriptSpace[((int)(type - ARGUMENT_GLOBAL_ARRAY) << 8) + index + index_in_block]; + } + else if (type >= ARGUMENT_GLOBAL) { + uint8 index_in_block = CTheScripts::Read1ByteFromScript(pIp); + return (int32*)&CTheScripts::ScriptSpace[((int)(type - ARGUMENT_GLOBAL) << 8) + index_in_block]; + } + else if (type >= ARGUMENT_LOCAL_ARRAY) { + uint8 index_id = CTheScripts::Read1ByteFromScript(pIp); + uint8 size = CTheScripts::Read1ByteFromScript(pIp); + script_assert(size > 0); + script_assert(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id] < size); + uint8 index = Min(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id], size - 1); + return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL_ARRAY) + index]; + } + else if (type >= ARGUMENT_LOCAL) { + return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL)]; + } + else { + assert(type >= ARGUMENT_TIMER); + return &pScript->m_anLocalVariables[NUM_LOCAL_VARS + 8 + (type - ARGUMENT_TIMER)]; + } } +// done(LCS) int32 *CRunningScript::GetPointerToScriptVariable(uint32* pIp, int16 type) { return ::GetPointerToScriptVariable(this, pIp); } +// done(LCS) +int CTheScripts::GetSaveVarIndex(int var) +{ + for (int i = 0; i < NumSaveVars; i++) { + if (SavedVarIndices[i] == var) + return i; + } + return -1; +} + +// done(LCS) void CRunningScript::Init() { - strcpy(m_abScriptName, "noname"); + sprintf(m_abScriptName, "id%02i", m_nId); next = prev = nil; SetIP(0); for (int i = 0; i < MAX_STACK_DEPTH; i++) @@ -2319,13 +2392,29 @@ void CRunningScript::Init() m_bCondResult = false; m_bIsMissionScript = false; m_bSkipWakeTime = false; - for (int i = 0; i < NUM_LOCAL_VARS + NUM_TIMERS; i++) + for (int i = 0; i < NUM_LOCAL_VARS + 8 + NUM_TIMERS; i++) m_anLocalVariables[i] = 0; m_nAndOrState = 0; m_bNotFlag = false; m_bDeatharrestEnabled = true; m_bDeatharrestExecuted = false; m_bMissionFlag = false; + m_nLocalsPointer = 0; +} + +// done(LCS) +void CTheScripts::Shutdown() +{ + if (gScriptsFile != -1) { + CFileMgr::CloseFile(gScriptsFile); + gScriptsFile = -1; + } + if (ScriptSpace) { + base::cMainMemoryManager::Instance()->Free(ScriptSpace); + ScriptSpace = nil; + FSDestroyedFlag = false; + OnAMissionFlag = 0; + } } #ifdef USE_DEBUG_SCRIPT_LOADER @@ -2355,10 +2444,11 @@ int open_script() } #endif -void CTheScripts::Init() +// done(LCS) +bool CTheScripts::Init(bool loaddata) { - for (int i = 0; i < SIZE_SCRIPT_SPACE; i++) - ScriptSpace[i] = 0; + bool retval = false; + printf("CTheScripts::Init\n"); pActiveScripts = pIdleScripts = nil; for (int i = 0; i < MAX_NUM_SCRIPTS; i++){ ScriptsArray[i].Init(); @@ -2367,25 +2457,39 @@ void CTheScripts::Init() MissionCleanUp.Init(); UpsideDownCars.Init(); StuckCars.Init(); - CFileMgr::SetDir("data"); -#ifdef USE_DEBUG_SCRIPT_LOADER - int mainf = open_script(); -#else - int mainf = CFileMgr::OpenFile("main.scm", "rb"); -#endif - CFileMgr::Read(mainf, (char*)ScriptSpace, SIZE_MAIN_SCRIPT); - CFileMgr::CloseFile(mainf); - CFileMgr::SetDir(""); StoreVehicleIndex = -1; StoreVehicleWasRandom = true; OnAMissionFlag = 0; LastMissionPassedTime = (uint32)-1; + for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { + CollectiveArray[i].colIndex = -1; + CollectiveArray[i].pedIndex = 0; + } + NextFreeCollectiveIndex = 0; LastRandomPedId = -1; for (int i = 0; i < MAX_NUM_USED_OBJECTS; i++){ memset(&UsedObjectArray[i].name, 0, sizeof(UsedObjectArray[i].name)); UsedObjectArray[i].index = 0; } NumberOfUsedObjects = 0; + if (ScriptSpace) + Shutdown(); + CFileMgr::SetDir("DATA"); +#ifdef USE_DEBUG_SCRIPT_LOADER + int mainf = open_script(); +#else + int mainf = CFileMgr::OpenFile("main.scm", "rb"); +#endif + CFileMgr::Read(mainf, (char*)&MainScriptSize, sizeof(MainScriptSize)); + int nLargestMissionSize = 0; + CFileMgr::Read(mainf, (char*)&nLargestMissionSize, sizeof(nLargestMissionSize)); + // some cSmallHeap shit - TODO + ScriptSpace = (uint8*)base::cMainMemoryManager::Instance()->Allocate(MainScriptSize + nLargestMissionSize); + memset(ScriptSpace, 0, MainScriptSize + nLargestMissionSize); + CFileMgr::Read(mainf, (char*)ScriptSpace, MainScriptSize); + gScriptsFile = mainf; + CFileMgr::CloseFile(mainf); + CFileMgr::SetDir(""); ReadObjectNamesFromScript(); UpdateObjectIndices(); bAlreadyRunningAMissionScript = false; @@ -2395,11 +2499,10 @@ void CTheScripts::Init() NumberOfExclusiveMissionScripts = 0; NumberOfMissionScripts = 0; LargestMissionScriptSize = 0; - MainScriptSize = 0; ReadMultiScriptFileOffsetsFromScript(); FailCurrentMission = 0; DbgFlag = false; - NumScriptDebugLines = 0; + //NumScriptDebugLines = 0; RiotIntensity = 0; bPlayerHasMetDebbieHarry = false; bPlayerIsInTheStatium = false; @@ -2423,7 +2526,7 @@ void CTheScripts::Init() IntroRectangles[i].m_sColor = CRGBA(255, 255, 255, 255); } NumberOfIntroRectanglesThisFrame = 0; - RemoveScriptTextureDictionary(); + RemoveScriptTextureDictionary(); // TODO(LCS) - probably not needed for (int i = 0; i < MAX_NUM_BUILDING_SWAPS; i++){ BuildingSwapArray[i].m_pBuilding = nil; BuildingSwapArray[i].m_nNewModel = -1; @@ -2431,6 +2534,12 @@ void CTheScripts::Init() } for (int i = 0; i < MAX_NUM_INVISIBILITY_SETTINGS; i++) InvisibilitySettingArray[i] = nil; + if (loaddata) { + printf("loaddata = true\n"); + retval = GenericLoad(); + } + for (int i = 0; i < MAX_ALLOWED_COLLISIONS; i++) + AllowedCollision[i] = 0; #if defined USE_ADVANCED_SCRIPT_DEBUG_OUTPUT && SCRIPT_LOG_FILE_LEVEL == 2 CFileMgr::SetDirMyDocuments(); @@ -2441,8 +2550,10 @@ void CTheScripts::Init() PrintToLog(init_msg); CFileMgr::SetDir(""); #endif + return retval; } +// LCS - to remove? void CTheScripts::RemoveScriptTextureDictionary() { for (int i = 0; i < ARRAY_SIZE(CTheScripts::ScriptSprites); i++) @@ -2452,6 +2563,7 @@ void CTheScripts::RemoveScriptTextureDictionary() CTxdStore::RemoveTxd(slot); } +// done(LCS) void CRunningScript::RemoveScriptFromList(CRunningScript** ppScript) { if (prev) @@ -2462,6 +2574,7 @@ void CRunningScript::RemoveScriptFromList(CRunningScript** ppScript) next->prev = prev; } +// done(LCS) void CRunningScript::AddScriptToList(CRunningScript** ppScript) { next = *ppScript; @@ -2471,11 +2584,13 @@ void CRunningScript::AddScriptToList(CRunningScript** ppScript) *ppScript = this; } +// done(LCS) CRunningScript* CTheScripts::StartNewScript(uint32 ip) { CRunningScript* pNew = pIdleScripts; script_assert(pNew); pNew->RemoveScriptFromList(&pIdleScripts); + pNew->m_nId = NextProcessId++; pNew->Init(); pNew->SetIP(ip); pNew->AddScriptToList(&pActiveScripts); @@ -2487,6 +2602,8 @@ void CTheScripts::Process() { if (CReplay::IsPlayingBack()) return; + if (!ScriptSpace) + return; CommandsExecuted = 0; ScriptsUpdated = 0; float timeStep = CTimer::GetTimeStepInMilliseconds(); @@ -2509,6 +2626,8 @@ void CTheScripts::Process() UseTextCommands = 0; } + // TODO: mCoronas + #ifdef MISSION_REPLAY static uint32 TimeToWaitTill; switch (AllowMissionReplay) { @@ -2558,6 +2677,7 @@ void CTheScripts::Process() #endif CRunningScript* script = pActiveScripts; + InTheScripts = true; while (script != nil){ CRunningScript* next = script->GetNext(); ++ScriptsUpdated; @@ -2577,21 +2697,25 @@ void CTheScripts::Process() #endif } +// done(LCS) CRunningScript* CTheScripts::StartTestScript() { return StartNewScript(0); } +// done(LCS) bool CTheScripts::IsPlayerOnAMission() { return OnAMissionFlag && *(int32*)&ScriptSpace[OnAMissionFlag] == 1; } +// done(LCS) void CRunningScript::Process() { #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT PrintToLog("\n\nProcessing script %s (id %d)\n\n", m_abScriptName, this - CTheScripts::ScriptsArray); #endif + pCurrent = this; if (m_bIsMissionScript) DoDeatharrestCheck(); if (m_bMissionFlag && CTheScripts::FailCurrentMission == 1 && m_nStackPointer == 1) @@ -2660,32 +2784,36 @@ int8 CRunningScript::ProcessOneCommand() retval = ProcessCommands0To99(command); else if (command < 200) retval = ProcessCommands100To199(command); - else if (command < 300) + else if (command < 305) retval = ProcessCommands200To299(command); - else if (command < 400) + else if (command < 405) retval = ProcessCommands300To399(command); - else if (command < 500) + else if (command < 505) retval = ProcessCommands400To499(command); - else if (command < 600) + else if (command < 605) retval = ProcessCommands500To599(command); - else if (command < 700) + else if (command < 705) retval = ProcessCommands600To699(command); - else if (command < 800) + else if (command < 805) retval = ProcessCommands700To799(command); - else if (command < 900) + else if (command < 905) retval = ProcessCommands800To899(command); - else if (command < 1000) + else if (command < 1005) retval = ProcessCommands900To999(command); - else if (command < 1100) + else if (command < 1105) retval = ProcessCommands1000To1099(command); - else if (command < 1200) + else if (command < 1205) retval = ProcessCommands1100To1199(command); - else if (command < 1300) + else if (command < 1305) retval = ProcessCommands1200To1299(command); - else if (command < 1400) + else if (command < 1405) retval = ProcessCommands1300To1399(command); - else if (command < 1500) + else if (command < 1497) retval = ProcessCommands1400To1499(command); + //else if (command < 1600) // TODO + // retval = ProcessCommands1500To1599(command); + //else if (command < 1700) + // retval = ProcessCommands1600To1699(command); #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT if (command < ARRAY_SIZE(commands)) { if (commands[command].cond || commands[command].output[0] != ARGTYPE_NONE) { @@ -3242,12 +3370,12 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) case ARGUMENT_INT32: pNew->m_anLocalVariables[i] = CTheScripts::Read4BytesFromScript(&m_nIp); break; - case ARGUMENT_GLOBALVAR: - pNew->m_anLocalVariables[i] = *(int32*)&CTheScripts::ScriptSpace[(uint16)CTheScripts::Read2BytesFromScript(&m_nIp)]; - break; - case ARGUMENT_LOCALVAR: - pNew->m_anLocalVariables[i] = m_anLocalVariables[CTheScripts::Read2BytesFromScript(&m_nIp)]; - break; + //case ARGUMENT_GLOBALVAR: + // pNew->m_anLocalVariables[i] = *(int32*)&CTheScripts::ScriptSpace[(uint16)CTheScripts::Read2BytesFromScript(&m_nIp)]; + // break; + //case ARGUMENT_LOCALVAR: + // pNew->m_anLocalVariables[i] = m_anLocalVariables[CTheScripts::Read2BytesFromScript(&m_nIp)]; + // break; case ARGUMENT_INT8: pNew->m_anLocalVariables[i] = CTheScripts::Read1ByteFromScript(&m_nIp); break; diff --git a/src/control/Script.h b/src/control/Script.h index e4196220..0a7f64bf 100644 --- a/src/control/Script.h +++ b/src/control/Script.h @@ -47,7 +47,7 @@ void FlushLog(); #define KEY_LENGTH_IN_SCRIPT (8) -//#define GTA_SCRIPT_COLLECTIVE +#define GTA_SCRIPT_COLLECTIVE struct intro_script_rectangle { @@ -214,6 +214,13 @@ public: bool HasCarBeenStuckForAWhile(int32); }; +enum { + MAX_STACK_DEPTH = 16, + NUM_LOCAL_VARS = 96, + NUM_TIMERS = 2, + NUM_GLOBAL_SLOTS = 26 +}; + enum { ARGUMENT_END = 0, ARGUMENT_INT_ZERO, @@ -224,9 +231,17 @@ enum { ARGUMENT_INT32, ARGUMENT_INT8, ARGUMENT_INT16, - ARGUMENT_FLOAT + ARGUMENT_FLOAT, + ARGUMENT_TIMER, + ARGUMENT_LOCAL = ARGUMENT_TIMER + NUM_TIMERS, + ARGUMENT_LOCAL_ARRAY = ARGUMENT_LOCAL + NUM_LOCAL_VARS, + ARGUMENT_GLOBAL = ARGUMENT_LOCAL_ARRAY + NUM_LOCAL_VARS, + ARGUMENT_GLOBAL_ARRAY = ARGUMENT_GLOBAL + NUM_GLOBAL_SLOTS, + MAX_ARGUMENT = ARGUMENT_GLOBAL_ARRAY + NUM_GLOBAL_SLOTS }; +static_assert(MAX_ARGUMENT <= 256, "MAX_ARGUMENT must be less or equal to 256"); + struct tCollectiveData { int32 colIndex; @@ -272,10 +287,11 @@ enum { MAX_NUM_INTRO_RECTANGLES = 16, MAX_NUM_SCRIPT_SRPITES = 16, MAX_NUM_SCRIPT_SPHERES = 16, - MAX_NUM_USED_OBJECTS = 220, - MAX_NUM_MISSION_SCRIPTS = 120, - MAX_NUM_BUILDING_SWAPS = 25, - MAX_NUM_INVISIBILITY_SETTINGS = 20, + MAX_NUM_COLLECTIVES = 32, + MAX_NUM_USED_OBJECTS = 305, + MAX_NUM_MISSION_SCRIPTS = 150, + MAX_NUM_BUILDING_SWAPS = 80, + MAX_NUM_INVISIBILITY_SETTINGS = 52, MAX_NUM_STORED_LINES = 1024, MAX_ALLOWED_COLLISIONS = 2 }; @@ -283,12 +299,13 @@ enum { class CTheScripts { public: - static uint8 ScriptSpace[SIZE_SCRIPT_SPACE]; + static uint8* ScriptSpace; static CRunningScript ScriptsArray[MAX_NUM_SCRIPTS]; static intro_text_line IntroTextLines[MAX_NUM_INTRO_TEXT_LINES]; static intro_script_rectangle IntroRectangles[MAX_NUM_INTRO_RECTANGLES]; static CSprite2d ScriptSprites[MAX_NUM_SCRIPT_SRPITES]; static script_sphere_struct ScriptSphereArray[MAX_NUM_SCRIPT_SPHERES]; + static tCollectiveData CollectiveArray[MAX_NUM_COLLECTIVES]; static tUsedObject UsedObjectArray[MAX_NUM_USED_OBJECTS]; static int32 MultiScriptArray[MAX_NUM_MISSION_SCRIPTS]; static tBuildingSwap BuildingSwapArray[MAX_NUM_BUILDING_SWAPS]; @@ -328,14 +345,21 @@ public: #define CARDS_IN_STACK (CARDS_IN_DECK * MAX_DECKS) static int16 CardStack[CARDS_IN_STACK]; static int16 CardStackPosition; - - static int AllowedCollision[MAX_ALLOWED_COLLISIONS]; #endif + static bool bPlayerIsInTheStatium; static uint8 RiotIntensity; static bool bPlayerHasMetDebbieHarry; - static void Init(); + static int AllowedCollision[MAX_ALLOWED_COLLISIONS]; + static short* SavedVarIndices; + static int NumSaveVars; + static bool FSDestroyedFlag; + static int NextProcessId; + static bool InTheScripts; + static CRunningScript* pCurrent; + + static bool Init(bool loaddata = false); static void Process(); static CRunningScript* StartTestScript(); @@ -426,6 +450,9 @@ public: static void SwitchToMission(int32 mission); #endif + static int GetSaveVarIndex(int); + static void Shutdown(void); + #ifdef GTA_SCRIPT_COLLECTIVE static void AdvanceCollectiveIndex() { @@ -447,13 +474,6 @@ public: }; - -enum { - MAX_STACK_DEPTH = 6, - NUM_LOCAL_VARS = 16, - NUM_TIMERS = 2 -}; - extern int ScriptParams[32]; class CRunningScript @@ -481,11 +501,13 @@ class CRunningScript public: CRunningScript* next; CRunningScript* prev; + int m_nId; char m_abScriptName[8]; uint32 m_nIp; uint32 m_anStack[MAX_STACK_DEPTH]; uint16 m_nStackPointer; - int32 m_anLocalVariables[NUM_LOCAL_VARS + NUM_TIMERS]; + int32 m_anLocalVariables[NUM_LOCAL_VARS + 8 + NUM_TIMERS]; // TODO(LCS): figure out why 106 + int32 m_nLocalsPointer; bool m_bIsActive; bool m_bCondResult; bool m_bIsMissionScript; @@ -505,8 +527,8 @@ public: void Load(uint8*& buf); void UpdateTimers(float timeStep) { - m_anLocalVariables[NUM_LOCAL_VARS] += timeStep; - m_anLocalVariables[NUM_LOCAL_VARS + 1] += timeStep; + for (int i = 0; i < NUM_TIMERS; i++) + m_anLocalVariables[NUM_LOCAL_VARS + 8 + i] += timeStep; } void Init(); @@ -608,3 +630,6 @@ void RetryMission(int, int); #ifdef USE_DEBUG_SCRIPT_LOADER extern int scriptToLoad; #endif + +extern int gScriptsFile; + diff --git a/src/control/Script2.cpp b/src/control/Script2.cpp index a94bf907..10f122ca 100644 --- a/src/control/Script2.cpp +++ b/src/control/Script2.cpp @@ -168,7 +168,7 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) */ case COMMAND_DISPLAY_ONSCREEN_TIMER: { - script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); + //script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); m_nIp++; uint16 offset = CTheScripts::Read2BytesFromScript(&m_nIp); CollectParameters(&m_nIp, 1); @@ -177,14 +177,14 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) } case COMMAND_CLEAR_ONSCREEN_TIMER: { - script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); + //script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); m_nIp++; CUserDisplay::OnscnTimer.ClearClock((uint16)CTheScripts::Read2BytesFromScript(&m_nIp)); return 0; } case COMMAND_DISPLAY_ONSCREEN_COUNTER: { - script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); + //script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); m_nIp++; int16 counter = CTheScripts::Read2BytesFromScript(&m_nIp); CollectParameters(&m_nIp, 1); @@ -193,7 +193,7 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) } case COMMAND_CLEAR_ONSCREEN_COUNTER: { - script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); + //script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); m_nIp++; CUserDisplay::OnscnTimer.ClearCounter((uint16)CTheScripts::Read2BytesFromScript(&m_nIp)); return 0; @@ -590,7 +590,7 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) //case COMMAND_MOVE_CAMERA_ALONG_SPLINE: //case COMMAND_GET_CAMERA_POSITION_ALONG_SPLINE: case COMMAND_DECLARE_MISSION_FLAG: - CTheScripts::OnAMissionFlag = (uint16)CTheScripts::Read2BytesFromScript(&++m_nIp); + CTheScripts::OnAMissionFlag = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - (int32*)CTheScripts::ScriptSpace; return 0; case COMMAND_DECLARE_MISSION_FLAG_FOR_CONTACT: return 0; diff --git a/src/control/Script4.cpp b/src/control/Script4.cpp index a8658532..64928e7a 100644 --- a/src/control/Script4.cpp +++ b/src/control/Script4.cpp @@ -1781,7 +1781,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) */ case COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_STRING: { - script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); + //script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp); CollectParameters(&m_nIp, 1); wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); // ??? @@ -1792,7 +1792,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) } case COMMAND_DISPLAY_ONSCREEN_COUNTER_WITH_STRING: { - script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); + //script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp); CollectParameters(&m_nIp, 1); wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); // ??? diff --git a/src/control/Script5.cpp b/src/control/Script5.cpp index 822a70a8..ef680672 100644 --- a/src/control/Script5.cpp +++ b/src/control/Script5.cpp @@ -2556,7 +2556,7 @@ void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective ob } else { pPed->bScriptObjectiveCompleted = false; - pPed->SetObjective(objective, p1, p2); + //pPed->SetObjective(objective, p1, p2); TODO! } } } diff --git a/src/control/Script7.cpp b/src/control/Script7.cpp index 1eaa6cd0..12bb18d7 100644 --- a/src/control/Script7.cpp +++ b/src/control/Script7.cpp @@ -540,7 +540,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command) case COMMAND_DISPLAY_NTH_ONSCREEN_COUNTER_WITH_STRING: { char onscreen_str[12]; - script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); + //script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp); CollectParameters(&m_nIp, 2); wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); // ??? diff --git a/src/control/ScriptCommands.h b/src/control/ScriptCommands.h index 9863e852..8cf73abd 100644 --- a/src/control/ScriptCommands.h +++ b/src/control/ScriptCommands.h @@ -215,6 +215,11 @@ enum { COMMAND_WHILE, COMMAND_WHILENOT, COMMAND_ENDWHILE, + COMMAND_214, + COMMAND_215, + COMMAND_216, + COMMAND_217, + COMMAND_218, COMMAND_ANDOR, COMMAND_LAUNCH_MISSION, COMMAND_MISSION_HAS_FINISHED, diff --git a/src/core/config.h b/src/core/config.h index 7dfb5bba..a06977f8 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -332,7 +332,7 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually #endif //#define SIMPLIER_MISSIONS // apply simplifications from mobile #define USE_ADVANCED_SCRIPT_DEBUG_OUTPUT -#define SCRIPT_LOG_FILE_LEVEL 0 // 0 == no log, 1 == overwrite every frame, 2 == full log +#define SCRIPT_LOG_FILE_LEVEL 2 // 0 == no log, 1 == overwrite every frame, 2 == full log #ifndef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT #define USE_BASIC_SCRIPT_DEBUG_OUTPUT From 3ac74c86a19aa1e797c3e9b3f67a529791c2ce8d Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sat, 9 Jan 2021 00:33:16 +0300 Subject: [PATCH 08/68] fix --- src/core/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/config.h b/src/core/config.h index d90be214..4aaeb3c1 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -334,7 +334,7 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually #endif //#define SIMPLIER_MISSIONS // apply simplifications from mobile #define USE_ADVANCED_SCRIPT_DEBUG_OUTPUT -#define SCRIPT_LOG_FILE_LEVEL 2 // 0 == no log, 1 == overwrite every frame, 2 == full log +#define SCRIPT_LOG_FILE_LEVEL 0 // 0 == no log, 1 == overwrite every frame, 2 == full log #ifndef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT #define USE_BASIC_SCRIPT_DEBUG_OUTPUT From 7a3ee349da51543f5e273df1a7d932a25602ea2a Mon Sep 17 00:00:00 2001 From: Fire-Head Date: Sat, 9 Jan 2021 01:01:41 +0300 Subject: [PATCH 09/68] sync with re3 -radardisc shadow fix -fix for the dimension where moon is round -correct radar based on the early gta 3 screenshot -proper scaling based on ps2 gta 3 -ini and debugmenu options --- src/core/FrontEndControls.cpp | 2 +- src/core/Frontend.cpp | 1 + src/core/Frontend_PS2.cpp | 2 +- src/core/Radar.h | 20 ++++++++++++++++ src/core/common.h | 45 +++++++++++++++++++++++++++++------ src/core/config.h | 5 ++++ src/core/re3.cpp | 30 +++++++++++++++++++++++ src/render/Draw.cpp | 22 ++++++++++------- src/render/Draw.h | 13 ++++++++++ src/render/Hud.cpp | 25 +++++++++++++------ src/render/Sprite.cpp | 4 ++++ 11 files changed, 145 insertions(+), 24 deletions(-) diff --git a/src/core/FrontEndControls.cpp b/src/core/FrontEndControls.cpp index 68992e16..18f6b3b2 100644 --- a/src/core/FrontEndControls.cpp +++ b/src/core/FrontEndControls.cpp @@ -7,7 +7,7 @@ #include "FrontEndControls.h" #define X SCREEN_SCALE_X -#define Y(x) SCREEN_SCALE_Y(float(x)*(float(DEFAULT_SCREEN_HEIGHT)/float(DEFAULT_SCREEN_HEIGHT_PAL))) +#define Y(x) SCREEN_SCALE_Y(float(x)*(float(DEFAULT_SCREEN_HEIGHT)/float(SCREEN_HEIGHT_PAL))) void CPlaceableShText::Draw(float x, float y) diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 11488aec..d14f15d4 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -3,6 +3,7 @@ #include #endif +#define FORCE_PC_SCALING #define WITHWINDOWS #include "common.h" #ifndef PS2_MENU diff --git a/src/core/Frontend_PS2.cpp b/src/core/Frontend_PS2.cpp index 1ccb658b..c0fcc652 100644 --- a/src/core/Frontend_PS2.cpp +++ b/src/core/Frontend_PS2.cpp @@ -43,7 +43,7 @@ void DoRWStuffEndOfFrame(void); #define X SCREEN_SCALE_X #define Y SCREEN_SCALE_Y -#define YF(x) Y(float(x)*(float(DEFAULT_SCREEN_HEIGHT)/float(DEFAULT_SCREEN_HEIGHT_PAL))) +#define YF(x) Y(float(x)*(float(DEFAULT_SCREEN_HEIGHT)/float(SCREEN_HEIGHT_PAL))) //#define X(x) ((x)/640.0f*SCRW) //#define Y(y) ((y)/448.0f*SCRH) diff --git a/src/core/Radar.h b/src/core/Radar.h index 8f2e7069..0829dda6 100644 --- a/src/core/Radar.h +++ b/src/core/Radar.h @@ -156,8 +156,28 @@ struct sRadarTraceSave // Values for screen space #define RADAR_LEFT (40.0f) #define RADAR_BOTTOM (40.0f) + +#ifdef FIX_RADAR +/* + The values are from an early screenshot taken before R* broke radar + #define RADAR_WIDTH (82.0f) + #define RADAR_HEIGHT (82.0f) +*/ +#define RADAR_WIDTH ((CDraw::ms_bFixRadar) ? (82.0f) : (94.0f)) +#define RADAR_HEIGHT ((CDraw::ms_bFixRadar) ? (82.0f) : (76.0f)) +#else +/* + broken since forever, someone tried to fix size for 640x512(PAL) + http://aap.rockstarvision.com/pics/gta3/ps2screens/gta3_interface.jpg + but failed: + http://aap.rockstarvision.com/pics/gta3/artwork/gta3_artwork_16.jpg + most likely the guy used something like this: + int y = 82 * (640.0/512.0)/(640.0/480.0); + int x = y * (640.0/512.0); +*/ #define RADAR_WIDTH (94.0f) #define RADAR_HEIGHT (76.0f) +#endif class CRadar { diff --git a/src/core/common.h b/src/core/common.h index 3fb2e963..2391f5fb 100644 --- a/src/core/common.h +++ b/src/core/common.h @@ -123,17 +123,43 @@ inline uint32 ldb(uint32 p, uint32 s, uint32 w) #include "skeleton.h" #include "Draw.h" -#define DEFAULT_SCREEN_WIDTH (640) -#define DEFAULT_SCREEN_HEIGHT (448) -#define DEFAULT_SCREEN_HEIGHT_PAL (512) -#define DEFAULT_SCREEN_HEIGHT_NTSC (448) +#if defined(PROPER_SCALING) + #ifdef FORCE_PC_SCALING + #define DEFAULT_SCREEN_WIDTH (640) + #define DEFAULT_SCREEN_HEIGHT (448) + #else + #define DEFAULT_SCREEN_WIDTH (640) + #define DEFAULT_SCREEN_HEIGHT (480) + #endif +#elif defined(GTA_PS2) + #define DEFAULT_SCREEN_WIDTH (640) + #define DEFAULT_SCREEN_HEIGHT (480) +#else //elif defined(GTA_PC) + #define DEFAULT_SCREEN_WIDTH (640) + #define DEFAULT_SCREEN_HEIGHT (448) +#endif + #define DEFAULT_ASPECT_RATIO (4.0f/3.0f) #define DEFAULT_VIEWWINDOW (0.7f) // game uses maximumWidth/Height, but this probably won't work // with RW windowed mode -#define SCREEN_WIDTH ((float)RsGlobal.width) +#ifdef GTA_PS2 + #ifdef GTA_PAL + #define SCREEN_WIDTH ((float)640) + #define SCREEN_HEIGHT ((float)512) + #else + #define SCREEN_WIDTH ((float)640) + #define SCREEN_HEIGHT ((float)448) + #endif +#else +#define SCREEN_WIDTH ((float)RsGlobal.width) #define SCREEN_HEIGHT ((float)RsGlobal.height) +#endif + +#define SCREEN_HEIGHT_PAL ((float)512) +#define SCREEN_HEIGHT_NTSC ((float)448) + #define SCREEN_ASPECT_RATIO (CDraw::GetAspectRatio()) #define SCREEN_VIEWWINDOW (Tan(DEGTORAD(CDraw::GetScaledFOV() * 0.5f))) @@ -151,8 +177,13 @@ inline uint32 ldb(uint32 p, uint32 s, uint32 w) #ifdef ASPECT_RATIO_SCALE #define SCREEN_SCALE_AR(a) ((a) * DEFAULT_ASPECT_RATIO / SCREEN_ASPECT_RATIO) -extern float ScaleAndCenterX(float x); -#define SCALE_AND_CENTER_X(x) ScaleAndCenterX(x) +#define SCALE_AND_CENTER_X(x) ((SCREEN_WIDTH == DEFAULT_SCREEN_WIDTH) ? (x) : (SCREEN_WIDTH - SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH)) / 2 + SCREEN_SCALE_X((x))) +#ifdef PROPER_SCALING + #ifndef FORCE_PC_SCALING + #undef SCREEN_SCALE_Y + #define SCREEN_SCALE_Y(a) CDraw::ScaleY(SCREEN_STRETCH_Y(a)) + #endif +#endif #else #define SCREEN_SCALE_AR(a) (a) #define SCALE_AND_CENTER_X(x) SCREEN_STRETCH_X(x) diff --git a/src/core/config.h b/src/core/config.h index 874ff39a..38ee9712 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -252,6 +252,7 @@ enum Config { // Rendering/display #define ASPECT_RATIO_SCALE // Not just makes everything scale with aspect ratio, also adds support for all aspect ratios +#define PROPER_SCALING // use original DEFAULT_SCREEN_WIDTH/DEFAULT_SCREEN_HEIGHT from PS2 instead of PC(R* changed HEIGHT here to make radar look better, but broke other hud elements aspect ratio). #define DEFAULT_NATIVE_RESOLUTION // Set default video mode to your native resolution (fixes Windows 10 launch) #define USE_TXD_CDIMAGE // generate and load textures from txd.img #define PS2_ALPHA_TEST // emulate ps2 alpha test @@ -266,6 +267,8 @@ enum Config { #define NEW_RENDERER // leeds-like world rendering, needs librw #endif +#define FIX_SPRITES // fix sprites aspect ratio(moon, coronas, particle etc) + #ifndef EXTENDED_COLOURFILTER #undef SCREEN_DROPLETS // we need the backbuffer for this effect #endif @@ -296,6 +299,8 @@ enum Config { // Hud, frontend and radar #define PC_MENU +#define FIX_RADAR // use radar size from early version before R* broke it + #ifndef PC_MENU # define PS2_MENU //# define PS2_MENU_USEALLPAGEICONS diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 0e5ed2af..80e8cb6b 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -220,6 +220,16 @@ void LoadINISettings() CustomPipes::GlossMult = CheckAndReadIniFloat("CustomPipesValues", "GlossMult", CustomPipes::GlossMult); #endif gBackfaceCulling = CheckAndReadIniInt("Rendering", "BackfaceCulling", gBackfaceCulling); + +#ifdef PROPER_SCALING + CDraw::ms_bProperScaling = CheckAndReadIniInt("Draw", "ProperScaling", CDraw::ms_bProperScaling); +#endif +#ifdef FIX_RADAR + CDraw::ms_bFixRadar = CheckAndReadIniInt("Draw", "FixRadar", CDraw::ms_bFixRadar); +#endif +#ifdef FIX_SPRITES + CDraw::ms_bFixSprites = CheckAndReadIniInt("Draw", "FixSprites", CDraw::ms_bFixSprites); +#endif } void SaveINISettings() @@ -259,6 +269,16 @@ void SaveINISettings() #endif CheckAndSaveIniInt("Rendering", "BackfaceCulling", gBackfaceCulling, changed); +#ifdef PROPER_SCALING + CheckAndSaveIniInt("Draw", "ProperScaling", CDraw::ms_bProperScaling, changed); +#endif +#ifdef FIX_RADAR + CheckAndSaveIniInt("Draw", "FixRadar", CDraw::ms_bFixRadar, changed); +#endif +#ifdef FIX_SPRITES + CheckAndSaveIniInt("Draw", "FixSprites", CDraw::ms_bFixSprites, changed); +#endif + if (changed) cfg.write_file("reVC.ini"); } @@ -673,6 +693,16 @@ extern bool gbRenderWorld2; DebugMenuAddVarBool8("Render", "Don't render Vehicles", &gbDontRenderVehicles, nil); DebugMenuAddVarBool8("Render", "Don't render Objects", &gbDontRenderObjects, nil); DebugMenuAddVarBool8("Render", "Don't Render Water", &gbDontRenderWater, nil); + +#ifdef PROPER_SCALING + DebugMenuAddVarBool8("Draw", "Proper Scaling", &CDraw::ms_bProperScaling, nil); +#endif +#ifdef FIX_RADAR + DebugMenuAddVarBool8("Draw", "Fix Radar", &CDraw::ms_bFixRadar, nil); +#endif +#ifdef FIX_SPRITES + DebugMenuAddVarBool8("Draw", "Fix Sprites", &CDraw::ms_bFixSprites, nil); +#endif #ifndef FINAL DebugMenuAddVarBool8("Debug", "Print Memory Usage", &gbPrintMemoryUsage, nil); diff --git a/src/render/Draw.cpp b/src/render/Draw.cpp index 912399c9..507653f6 100644 --- a/src/render/Draw.cpp +++ b/src/render/Draw.cpp @@ -20,6 +20,16 @@ uint8 CDraw::FadeRed; uint8 CDraw::FadeGreen; uint8 CDraw::FadeBlue; +#ifdef PROPER_SCALING +bool CDraw::ms_bProperScaling = true; +#endif +#ifdef FIX_RADAR +bool CDraw::ms_bFixRadar = true; +#endif +#ifdef FIX_SPRITES +bool CDraw::ms_bFixSprites = true; +#endif + float CDraw::CalculateAspectRatio(void) { @@ -75,13 +85,9 @@ CDraw::SetFOV(float fov) ms_fFOV = fov; } -#ifdef ASPECT_RATIO_SCALE -float -ScaleAndCenterX(float x) +#ifdef PROPER_SCALING +float CDraw::ScaleY(float y) { - if (SCREEN_WIDTH == DEFAULT_SCREEN_WIDTH) - return x; - else - return (SCREEN_WIDTH - SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH)) / 2 + SCREEN_SCALE_X(x); + return ms_bProperScaling ? y : y * ((float)DEFAULT_SCREEN_HEIGHT/SCREEN_HEIGHT_NTSC); } -#endif \ No newline at end of file +#endif \ No newline at end of file diff --git a/src/render/Draw.h b/src/render/Draw.h index 2976dc34..1a63c980 100644 --- a/src/render/Draw.h +++ b/src/render/Draw.h @@ -30,6 +30,16 @@ public: static uint8 FadeRed; static uint8 FadeGreen; static uint8 FadeBlue; + +#ifdef PROPER_SCALING + static bool ms_bProperScaling; +#endif +#ifdef FIX_RADAR + static bool ms_bFixRadar; +#endif +#ifdef FIX_SPRITES + static bool ms_bFixSprites; +#endif static void SetNearClipZ(float nearclip) { ms_fNearClipZ = nearclip; } static float GetNearClipZ(void) { return ms_fNearClipZ; } @@ -50,4 +60,7 @@ public: #endif static float GetAspectRatio(void) { return ms_fAspectRatio; } static void SetAspectRatio(float ratio) { ms_fAspectRatio = ratio; } +#ifdef PROPER_SCALING + static float ScaleY(float y); +#endif }; diff --git a/src/render/Hud.cpp b/src/render/Hud.cpp index 3432f32c..b3cc5deb 100644 --- a/src/render/Hud.cpp +++ b/src/render/Hud.cpp @@ -28,6 +28,16 @@ // --MIAMI: file done +#if defined(FIX_BUGS) + #define SCREEN_SCALE_X_FIX(a) SCREEN_SCALE_X(a) + #define SCREEN_SCALE_Y_FIX(a) SCREEN_SCALE_Y(a) + #define SCALE_AND_CENTER_X_FIX(a) SCALE_AND_CENTER_X(a) +#else + #define SCREEN_SCALE_X_FIX(a) (a) + #define SCREEN_SCALE_Y_FIX(a) (a) + #define SCALE_AND_CENTER_X_FIX(a) (a) +#endif + // Game has colors inlined in code. // For easier modification we collect them here: CRGBA MONEY_COLOR(0, 207, 133, 255); @@ -1052,16 +1062,17 @@ void CHud::Draw() CRadar::DrawMap(); if (FrontEndMenuManager.m_PrefsRadarMode != 1) { CRect rect(0.0f, 0.0f, SCREEN_SCALE_X(RADAR_WIDTH), SCREEN_SCALE_Y(RADAR_HEIGHT)); -#ifdef FIX_BUGS - rect.Translate(SCREEN_SCALE_X(RADAR_LEFT), SCREEN_SCALE_FROM_BOTTOM(RADAR_BOTTOM + RADAR_HEIGHT)); -#else - rect.Translate(RADAR_LEFT, SCREEN_SCALE_FROM_BOTTOM(RADAR_BOTTOM + RADAR_HEIGHT)); -#endif + + rect.Translate(SCREEN_SCALE_X_FIX(RADAR_LEFT), SCREEN_SCALE_FROM_BOTTOM(RADAR_BOTTOM + RADAR_HEIGHT)); +#ifdef FIX_BUGS + rect.Grow(SCREEN_SCALE_X(6.0f), SCREEN_SCALE_X(6.0f), SCREEN_SCALE_Y(6.0f), SCREEN_SCALE_Y(6.0f)); +#else rect.Grow(6.0f); - rect.Translate(0.0f, 2.0f); +#endif + rect.Translate(SCREEN_SCALE_X_FIX(0.0f), SCREEN_SCALE_Y_FIX(2.0f)); Sprites[HUD_RADARDISC].Draw(rect, CRGBA(0, 0, 0, 255)); - rect.Translate(0.0f, -2.0f); + rect.Translate(SCREEN_SCALE_X_FIX(0.0f), SCREEN_SCALE_Y_FIX(-2.0f)); Sprites[HUD_RADARDISC].Draw(rect, RADARDISC_COLOR); } CRadar::DrawBlips(); diff --git a/src/render/Sprite.cpp b/src/render/Sprite.cpp index 401eebd0..ba6ab291 100644 --- a/src/render/Sprite.cpp +++ b/src/render/Sprite.cpp @@ -33,7 +33,11 @@ CSprite::CalcScreenCoors(const RwV3d &in, RwV3d *out, float *outw, float *outh, // this is used to scale correctly if you zoom in with sniper rifle float fovScale = fov / CDraw::GetFOV(); +#ifdef FIX_SPRITES + *outw = CDraw::ms_bFixSprites ? (fovScale * recip * SCREEN_HEIGHT) : (fovScale * SCREEN_SCALE_AR(recip) * SCREEN_WIDTH); +#else *outw = fovScale * SCREEN_SCALE_AR(recip) * SCREEN_WIDTH; +#endif *outh = fovScale * recip * SCREEN_HEIGHT; return true; From b7f9bfda4a88393b78f0f2e09489865413f69167 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Sat, 9 Jan 2021 02:41:27 +0300 Subject: [PATCH 10/68] fail --- src/control/Script.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 23527e55..8cac88d6 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -3108,7 +3108,7 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) CollectParameters(&m_nIp, 1); script_assert(ScriptParams[0] >= 0); CRunningScript* pNew = CTheScripts::StartNewScript(ScriptParams[0]); - m_bIsActive = true; + pNew->m_bIsActive = true; int8 type = CTheScripts::Read1ByteFromScript(&m_nIp); float tmp; for (int i = 0; type != ARGUMENT_END; type = CTheScripts::Read1ByteFromScript(&m_nIp), i++) { From 8e7cce0634a88f2794e203f97c7375b64fee4f9f Mon Sep 17 00:00:00 2001 From: Fire-Head Date: Sat, 9 Jan 2021 03:37:59 +0300 Subject: [PATCH 11/68] useless fix --- src/render/ParticleType.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render/ParticleType.h b/src/render/ParticleType.h index 0af9a1e1..9578083d 100644 --- a/src/render/ParticleType.h +++ b/src/render/ParticleType.h @@ -88,5 +88,5 @@ enum tParticleType MAX_PARTICLES, PARTICLE_FIRST = PARTICLE_SPARK, - PARTICLE_LAST = PARTICLE_RAINDROP_2D + PARTICLE_LAST = PARTICLE_HEATHAZE_IN_DIST }; \ No newline at end of file From 225b8953fd031de426d2d2c7f40ea6440c0ffd15 Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 9 Jan 2021 11:43:58 +0100 Subject: [PATCH 12/68] streaming fixes --- src/core/Streaming.cpp | 25 +++++++++++-------------- src/core/Streaming.h | 7 +++++++ src/entities/Entity.cpp | 12 +++++++++--- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp index 3a6fdc2a..4fff2367 100644 --- a/src/core/Streaming.cpp +++ b/src/core/Streaming.cpp @@ -1151,12 +1151,9 @@ CStreaming::RemoveModel(int32 id) void CStreaming::RemoveUnusedBuildings(eLevelName level) { - if(level != LEVEL_INDUSTRIAL) - RemoveBuildings(LEVEL_INDUSTRIAL); - if(level != LEVEL_COMMERCIAL) - RemoveBuildings(LEVEL_COMMERCIAL); - if(level != LEVEL_SUBURBAN) - RemoveBuildings(LEVEL_SUBURBAN); + for(int i = LEVEL_INDUSTRIAL; i < NUM_LEVELS; i++) + if(level != i) + RemoveBuildings((eLevelName)i); } void @@ -1279,12 +1276,9 @@ CStreaming::RemoveUnusedBigBuildings(eLevelName level) { ISLAND_LOADING_IS(LOW) { - if(level != LEVEL_INDUSTRIAL) - RemoveBigBuildings(LEVEL_INDUSTRIAL); - if(level != LEVEL_COMMERCIAL) - RemoveBigBuildings(LEVEL_COMMERCIAL); - if(level != LEVEL_SUBURBAN) - RemoveBigBuildings(LEVEL_SUBURBAN); + for(int i = LEVEL_INDUSTRIAL; i < NUM_LEVELS; i++) + if(level != i) + RemoveBuildings((eLevelName)i); } RemoveIslandsNotUsed(level); } @@ -1324,8 +1318,11 @@ CStreaming::RemoveIslandsNotUsed(eLevelName level) } #ifdef NO_ISLAND_LOADING if(FrontEndMenuManager.m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_HIGH) { - DeleteIsland(pIslandLODmainlandEntity); - DeleteIsland(pIslandLODbeachEntity); + DeleteIsland(pIslandLODindustEntity); + DeleteIsland(pIslandLODcomIndEntity); + DeleteIsland(pIslandLODcomSubEntity); + DeleteIsland(pIslandLODsubIndEntity); + DeleteIsland(pIslandLODsubComEntity); } else #endif switch(level){ diff --git a/src/core/Streaming.h b/src/core/Streaming.h index a67384f6..0f34aca5 100644 --- a/src/core/Streaming.h +++ b/src/core/Streaming.h @@ -213,3 +213,10 @@ public: static void PrintStreamingBufferState(); }; + +// LCS(TODO): put them into CStreaming::mspInst +extern int32 islandLODindust; +extern int32 islandLODcomInd; +extern int32 islandLODcomSub; +extern int32 islandLODsubInd; +extern int32 islandLODsubCom; diff --git a/src/entities/Entity.cpp b/src/entities/Entity.cpp index 862d2562..921da7df 100644 --- a/src/entities/Entity.cpp +++ b/src/entities/Entity.cpp @@ -4,6 +4,7 @@ #include "RwHelper.h" #include "ModelIndices.h" #include "Timer.h" +#include "Streaming.h" #include "Entity.h" #include "Object.h" #include "World.h" @@ -623,10 +624,15 @@ CEntity::SetupBigBuilding(void) m_level = CTheZones::GetLevelFromPosition(&GetPosition()); if(mi->m_lodDistances[0] <= 2000.0f) bStreamBIGBuilding = true; - if(mi->m_lodDistances[0] > 2500.0f || mi->m_ignoreDrawDist) + if(m_modelIndex == islandLODindust || + m_modelIndex == islandLODcomInd || + m_modelIndex == islandLODcomSub || + m_modelIndex == islandLODsubInd || + m_modelIndex == islandLODsubCom || + mi->m_lodDistances[0] > 5000.0f || mi->m_ignoreDrawDist) m_level = LEVEL_GENERIC; - else if(m_level == LEVEL_GENERIC) - printf("%s isn't in a level\n", mi->GetModelName()); +// else if(m_level == LEVEL_GENERIC) +// printf("%s isn't in a level\n", mi->GetModelName()); } float WindTabel[] = { From 7f5deb0f97d2ff07a92dd84f4ef08303bbe32461 Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 9 Jan 2021 12:10:10 +0100 Subject: [PATCH 13/68] cam sector fix --- src/core/Cam.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/core/Cam.cpp b/src/core/Cam.cpp index d4188299..731537ef 100644 --- a/src/core/Cam.cpp +++ b/src/core/Cam.cpp @@ -3947,11 +3947,11 @@ CCam::Process_Debug(const CVector&, float, float, float) } // stay inside sectors - while(CWorld::GetSectorX(Source.x) > 75.0f) + while(CWorld::GetSectorX(Source.x) > NUMSECTORS_X-5.0f) Source.x -= 1.0f; while(CWorld::GetSectorX(Source.x) < 5.0f) Source.x += 1.0f; - while(CWorld::GetSectorY(Source.y) > 75.0f) + while(CWorld::GetSectorY(Source.y) > NUMSECTORS_X-5.0f) Source.y -= 1.0f; while(CWorld::GetSectorY(Source.y) < 5.0f) Source.y += 1.0f; @@ -4018,11 +4018,11 @@ CCam::Process_Debug(const CVector&, float, float, float) } // stay inside sectors - while(CWorld::GetSectorX(Source.x) > 75.0f) + while(CWorld::GetSectorX(Source.x) > NUMSECTORS_X-5.0f) Source.x -= 1.0f; while(CWorld::GetSectorX(Source.x) < 5.0f) Source.x += 1.0f; - while(CWorld::GetSectorY(Source.y) > 75.0f) + while(CWorld::GetSectorY(Source.y) > NUMSECTORS_X-5.0f) Source.y -= 1.0f; while(CWorld::GetSectorY(Source.y) < 5.0f) Source.y += 1.0f; @@ -4099,11 +4099,11 @@ CCam::Process_Editor(const CVector&, float, float, float) } // stay inside sectors - while(CWorld::GetSectorX(Source.x) > 75.0f) + while(CWorld::GetSectorX(Source.x) > NUMSECTORS_X-5.0f) Source.x -= 1.0f; while(CWorld::GetSectorX(Source.x) < 5.0f) Source.x += 1.0f; - while(CWorld::GetSectorY(Source.y) > 75.0f) + while(CWorld::GetSectorY(Source.y) > NUMSECTORS_X-5.0f) Source.y -= 1.0f; while(CWorld::GetSectorY(Source.y) < 5.0f) Source.y += 1.0f; From e473d234fd39495c92c2705ce3b129542992c8d4 Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 9 Jan 2021 12:11:20 +0100 Subject: [PATCH 14/68] cam sector fix --- src/core/Cam.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/core/Cam.cpp b/src/core/Cam.cpp index d4188299..731537ef 100644 --- a/src/core/Cam.cpp +++ b/src/core/Cam.cpp @@ -3947,11 +3947,11 @@ CCam::Process_Debug(const CVector&, float, float, float) } // stay inside sectors - while(CWorld::GetSectorX(Source.x) > 75.0f) + while(CWorld::GetSectorX(Source.x) > NUMSECTORS_X-5.0f) Source.x -= 1.0f; while(CWorld::GetSectorX(Source.x) < 5.0f) Source.x += 1.0f; - while(CWorld::GetSectorY(Source.y) > 75.0f) + while(CWorld::GetSectorY(Source.y) > NUMSECTORS_X-5.0f) Source.y -= 1.0f; while(CWorld::GetSectorY(Source.y) < 5.0f) Source.y += 1.0f; @@ -4018,11 +4018,11 @@ CCam::Process_Debug(const CVector&, float, float, float) } // stay inside sectors - while(CWorld::GetSectorX(Source.x) > 75.0f) + while(CWorld::GetSectorX(Source.x) > NUMSECTORS_X-5.0f) Source.x -= 1.0f; while(CWorld::GetSectorX(Source.x) < 5.0f) Source.x += 1.0f; - while(CWorld::GetSectorY(Source.y) > 75.0f) + while(CWorld::GetSectorY(Source.y) > NUMSECTORS_X-5.0f) Source.y -= 1.0f; while(CWorld::GetSectorY(Source.y) < 5.0f) Source.y += 1.0f; @@ -4099,11 +4099,11 @@ CCam::Process_Editor(const CVector&, float, float, float) } // stay inside sectors - while(CWorld::GetSectorX(Source.x) > 75.0f) + while(CWorld::GetSectorX(Source.x) > NUMSECTORS_X-5.0f) Source.x -= 1.0f; while(CWorld::GetSectorX(Source.x) < 5.0f) Source.x += 1.0f; - while(CWorld::GetSectorY(Source.y) > 75.0f) + while(CWorld::GetSectorY(Source.y) > NUMSECTORS_X-5.0f) Source.y -= 1.0f; while(CWorld::GetSectorY(Source.y) < 5.0f) Source.y += 1.0f; From 9a145ab15f3be0a6d2eb1f37edaff698a69823b4 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sat, 9 Jan 2021 13:24:09 +0200 Subject: [PATCH 15/68] Possibly fix linux build --- src/leeds/base/memoryManager.cpp | 4 ++-- src/leeds/base/memoryManager.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/leeds/base/memoryManager.cpp b/src/leeds/base/memoryManager.cpp index 20604299..57e7d954 100644 --- a/src/leeds/base/memoryManager.cpp +++ b/src/leeds/base/memoryManager.cpp @@ -64,12 +64,12 @@ void* operator new[](size_t size) return base::cMainMemoryManager::Instance()->Allocate(size); } -void operator delete(void* buf) +void operator delete(void* buf) noexcept { base::cMainMemoryManager::Instance()->Free(buf); } -void operator delete[](void* buf) +void operator delete[](void* buf) noexcept { base::cMainMemoryManager::Instance()->Free(buf); } \ No newline at end of file diff --git a/src/leeds/base/memoryManager.h b/src/leeds/base/memoryManager.h index a4b1beac..91124cd1 100644 --- a/src/leeds/base/memoryManager.h +++ b/src/leeds/base/memoryManager.h @@ -35,5 +35,5 @@ namespace base void* operator new(size_t size); void* operator new[](size_t size); -void operator delete(void* buf); -void operator delete[](void* buf); \ No newline at end of file +void operator delete(void* buf) noexcept; +void operator delete[](void* buf) noexcept; \ No newline at end of file From da10ce7b055cefa8da1fcd6022141e681b379573 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sat, 9 Jan 2021 13:33:45 +0200 Subject: [PATCH 16/68] More linux fix --- src/core/KeyGen.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/core/KeyGen.cpp b/src/core/KeyGen.cpp index c54e390c..c95ab4b1 100644 --- a/src/core/KeyGen.cpp +++ b/src/core/KeyGen.cpp @@ -1,10 +1,6 @@ #include "common.h" #include "KeyGen.h" -#if defined _WIN32 && !defined __MINGW32__ -#include "ctype.h" -#else -#include -#endif +#include uint32 CKeyGen::keyTable[256] = { From e5b76288021a0c93e94596f246c758b422189683 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sat, 9 Jan 2021 13:43:09 +0200 Subject: [PATCH 17/68] Remove fake firetruck ID --- src/modelinfo/ModelIndices.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/modelinfo/ModelIndices.h b/src/modelinfo/ModelIndices.h index 7c920cbf..792904fc 100644 --- a/src/modelinfo/ModelIndices.h +++ b/src/modelinfo/ModelIndices.h @@ -280,7 +280,7 @@ enum MI_PEREN, MI_SENTINEL, MI_PATRIOT, - MI_FIRETRUK, + MI_FIRETRUCK, MI_TRASH, MI_STRETCH, MI_MANANA, @@ -371,7 +371,6 @@ enum MI_BAGGAGE, MI_FBIRANCH, MI_VICECHEE, - MI_FIRETRUCK, MI_RIO, MI_SQUALO, MI_JETMAX, From 852c3badbb590251a5465e788ae873f29faa9d1c Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sat, 9 Jan 2021 14:21:46 +0200 Subject: [PATCH 18/68] Change window name --- src/skel/skeleton.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/skel/skeleton.cpp b/src/skel/skeleton.cpp index 6f6b3744..20ac38ab 100644 --- a/src/skel/skeleton.cpp +++ b/src/skel/skeleton.cpp @@ -399,7 +399,7 @@ RsInitialize(void) */ RwBool result; - RsGlobal.appName = RWSTRING("GTA: Vice City"); + RsGlobal.appName = RWSTRING("GTA: Liberty City Stories"); RsGlobal.maximumWidth = DEFAULT_SCREEN_WIDTH; RsGlobal.maximumHeight = DEFAULT_SCREEN_HEIGHT; RsGlobal.width = DEFAULT_SCREEN_WIDTH; From 97c95b763961460244c8a0c4c1e6231277112038 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sat, 9 Jan 2021 17:35:27 +0300 Subject: [PATCH 19/68] more script --- src/control/Garages.cpp | 6 +- src/control/Script.cpp | 435 ++++++++++++----- src/control/Script.h | 40 +- src/control/Script3.cpp | 4 +- src/control/Script5.cpp | 6 +- src/control/Script6.cpp | 30 +- src/control/Script8.cpp | 890 +++++++++++++++++++++++++++-------- src/control/ScriptCommands.h | 251 ++++++++-- src/core/config.h | 4 +- 9 files changed, 1259 insertions(+), 407 deletions(-) diff --git a/src/control/Garages.cpp b/src/control/Garages.cpp index 89377db5..f083ecb5 100644 --- a/src/control/Garages.cpp +++ b/src/control/Garages.cpp @@ -1494,9 +1494,9 @@ void CGarage::BuildRotatedDoorMatrix(CEntity * pDoor, float fPosition) void CGarage::UpdateCrusherAngle() { RefreshDoorPointers(false); - m_pDoor2->GetMatrix().SetRotateXOnly(TWOPI - m_fDoorPos); - m_pDoor2->GetMatrix().UpdateRW(); - m_pDoor2->UpdateRwFrame(); + //m_pDoor2->GetMatrix().SetRotateXOnly(TWOPI - m_fDoorPos); TODO + //m_pDoor2->GetMatrix().UpdateRW(); + //m_pDoor2->UpdateRwFrame(); } void CGarage::UpdateCrusherShake(float X, float Y) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 414e3f67..5ed4ebf5 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -98,10 +98,6 @@ uint32 CTheScripts::LastMissionPassedTime; uint16 CTheScripts::NumberOfExclusiveMissionScripts; bool CTheScripts::bPlayerHasMetDebbieHarry; bool CTheScripts::bPlayerIsInTheStatium; -#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) -int16 CTheScripts::CardStack[CARDS_IN_DECK * MAX_DECKS]; -int16 CTheScripts::CardStackPosition; -#endif int CTheScripts::AllowedCollision[MAX_ALLOWED_COLLISIONS]; bool CTheScripts::FSDestroyedFlag; short* CTheScripts::SavedVarIndices; @@ -110,6 +106,8 @@ int gScriptsFile = -1; int CTheScripts::NextProcessId = 1; bool CTheScripts::InTheScripts; CRunningScript* pCurrent; +uint16 CTheScripts::NumTrueGlobals; +uint16 CTheScripts::MostGlobals; #ifdef MISSION_REPLAY @@ -1593,39 +1591,222 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_REGISTER_FIRE_LEVEL, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_IS_AUSTRALIAN_GAME, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), REGISTER_COMMAND(COMMAND_DISARM_CAR_BOMB, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), -#if (defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT) REGISTER_COMMAND(COMMAND_IS_JAPANESE_GAME, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), -#elif (!defined GTA_PS2) - REGISTER_COMMAND(COMMAND_SET_ONSCREEN_COUNTER_FLASH_WHEN_FIRST_DISPLAYED, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), -#endif -#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) - REGISTER_COMMAND(COMMAND_SHUFFLE_CARD_DECKS, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_FETCH_NEXT_CARD, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_OBJECT_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_DEBUG_CAMERA_ON, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_TO_OBJECT_ROTATION_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_OBJECT_ROTATION_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_OBJECT_STATIC, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_GET_ANGLE_BETWEEN_2D_VECTORS, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_DO_2D_RECTANGLES_COLLIDE, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), true, -1, ""), - REGISTER_COMMAND(COMMAND_GET_OBJECT_ROTATION_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_ADD_VELOCITY_RELATIVE_TO_OBJECT_VELOCITY, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_GET_OBJECT_SPEED, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ), false, -1, ""), -#endif -#if (defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT) - REGISTER_COMMAND(COMMAND_MARK_CUTSCENE_START, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_MARK_CUTSCENE_END, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_CUTSCENE_SCROLL, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), -#elif (defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) - REGISTER_COMMAND(COMMAND_IS_MISSION_SKIP, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_IN_AMMUNATION, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_DO_SAVE_GAME, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_IS_RETRY, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT, ), false, -1, ""), - REGISTER_COMMAND(COMMAND_DUMMY, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_MARK_CUTSCENE_START, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_MARK_CUTSCENE_END, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_CUTSCENE_SCROLL, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), -#endif + REGISTER_COMMAND(COMMAND_1442, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1443, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1444, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1445, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1446, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1447, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1448, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1449, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1450, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1451, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1452, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1453, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_CALL, INPUT_ARGUMENTS(ARGTYPE_FUNCTION, ), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_NOTCALL, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1456, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1457, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1458, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1459, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1460, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1461, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1462, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1463, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1464, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1465, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1466, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1467, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1468, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1469, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1470, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1471, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1472, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1473, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1474, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1475, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1476, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1477, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1478, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1479, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1480, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1481, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1482, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1483, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1484, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1485, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1486, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1487, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1488, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1489, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1490, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1491, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1492, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1493, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1494, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1495, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1496, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1497, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1498, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1499, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1500, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1501, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1502, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1503, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1504, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1505, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1506, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1507, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1508, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1509, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1510, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1511, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1512, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1513, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1514, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1515, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1516, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1517, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1518, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1519, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1520, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1521, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1522, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1523, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1524, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1525, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1526, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1527, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1528, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1529, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1530, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1531, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1532, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1533, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1534, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1535, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1536, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1537, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1538, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1539, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1540, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1541, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1542, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1543, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1544, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1545, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1546, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1547, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1548, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1549, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1550, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1551, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1552, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1553, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1554, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1555, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1556, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1557, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1558, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1559, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1560, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), + REGISTER_COMMAND(COMMAND_1561, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1562, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1563, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1564, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1565, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1566, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1567, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1568, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1569, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), true, -1, ""), + REGISTER_COMMAND(COMMAND_1570, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1571, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1572, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1573, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1574, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1575, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1576, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1577, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1578, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1579, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1580, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1581, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1582, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1583, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1584, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1585, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1586, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1587, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1588, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1589, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1590, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1591, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1592, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1593, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1594, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1595, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1596, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1597, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1598, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1599, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1600, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1601, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1602, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1603, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1604, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1605, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1606, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1607, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1608, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1609, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1610, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1611, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1612, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1613, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1614, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1615, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1616, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1617, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1618, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1619, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1620, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1621, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1622, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1623, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1624, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1625, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1626, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1627, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1628, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1629, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1630, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1631, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1632, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1633, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1634, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1635, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1636, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1637, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1638, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1639, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1640, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1641, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1642, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1643, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1644, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1645, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1646, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1647, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1648, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1649, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1650, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1651, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1652, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1653, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1654, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1655, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_1656, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), }; #undef REGISTER_COMMAND #undef INPUT_ARGUMENTS @@ -2261,18 +2442,14 @@ int CRunningScript::CollectParameterForDebug(char* buf, bool& var) case ARGUMENT_INT32: case ARGUMENT_FLOAT: return CTheScripts::Read4BytesFromScript(&m_nIp); - break; case ARGUMENT_INT8: return CTheScripts::Read1ByteFromScript(&m_nIp); - break; case ARGUMENT_INT16: return CTheScripts::Read2BytesFromScript(&m_nIp); - break; default: var = true; --m_nIp; - GetPointerToScriptVariableForDebug(this, &m_nIp, buf); - break; + return *GetPointerToScriptVariableForDebug(this, &m_nIp, buf); } return 0; } @@ -2298,12 +2475,12 @@ int32 CRunningScript::CollectNextParameterWithoutIncreasingPC(uint32 ip) case ARGUMENT_FLOAT_ZERO: return 0; case ARGUMENT_FLOAT_1BYTE: - return (uint32)(uint8)CTheScripts::Read1ByteFromScript(&m_nIp) << 24; + return (uint32)(uint8)CTheScripts::Read1ByteFromScript(pIp) << 24; case ARGUMENT_FLOAT_2BYTES: - return (uint32)(uint16)CTheScripts::Read2BytesFromScript(&m_nIp) << 16; + return (uint32)(uint16)CTheScripts::Read2BytesFromScript(pIp) << 16; case ARGUMENT_FLOAT_3BYTES: - tmp = (uint32)(uint8)CTheScripts::Read1ByteFromScript(&m_nIp) << 8; - tmp |= (uint32)(uint16)CTheScripts::Read2BytesFromScript(&m_nIp) << 16; + tmp = (uint32)(uint8)CTheScripts::Read1ByteFromScript(pIp) << 8; + tmp |= (uint32)(uint16)CTheScripts::Read2BytesFromScript(pIp) << 16; return tmp; case ARGUMENT_INT32: return CTheScripts::Read4BytesFromScript(pIp); @@ -2314,7 +2491,7 @@ int32 CRunningScript::CollectNextParameterWithoutIncreasingPC(uint32 ip) case ARGUMENT_FLOAT: return CTheScripts::Read4BytesFromScript(pIp); default: - pIp--; + (*pIp)--; return *GetPointerToScriptVariable(pIp, 0); } return -1; @@ -2339,11 +2516,11 @@ int32* GetPointerToScriptVariable(CRunningScript* pScript, uint32* pIp) script_assert(size > 0); script_assert(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id] < size); uint8 index = Min(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id], size - 1); - return (int32*)&CTheScripts::ScriptSpace[((int)(type - ARGUMENT_GLOBAL_ARRAY) << 8) + index + index_in_block]; + return (int32*)&CTheScripts::ScriptSpace[4 * (((int)(type - ARGUMENT_GLOBAL_ARRAY) << 8) + index + index_in_block)]; } else if (type >= ARGUMENT_GLOBAL) { uint8 index_in_block = CTheScripts::Read1ByteFromScript(pIp); - return (int32*)&CTheScripts::ScriptSpace[((int)(type - ARGUMENT_GLOBAL) << 8) + index_in_block]; + return (int32*)&CTheScripts::ScriptSpace[4 * (((int)(type - ARGUMENT_GLOBAL) << 8) + index_in_block)]; } else if (type >= ARGUMENT_LOCAL_ARRAY) { uint8 index_id = CTheScripts::Read1ByteFromScript(pIp); @@ -2488,7 +2665,6 @@ bool CTheScripts::Init(bool loaddata) memset(ScriptSpace, 0, MainScriptSize + nLargestMissionSize); CFileMgr::Read(mainf, (char*)ScriptSpace, MainScriptSize); gScriptsFile = mainf; - CFileMgr::CloseFile(mainf); CFileMgr::SetDir(""); ReadObjectNamesFromScript(); UpdateObjectIndices(); @@ -2598,6 +2774,7 @@ CRunningScript* CTheScripts::StartNewScript(uint32 ip) return pNew; } +// done(LCS) void CTheScripts::Process() { if (CReplay::IsPlayingBack()) @@ -2738,6 +2915,7 @@ void CRunningScript::Process() CMessages::BriefMessages[0].m_nStartTime = 0; } +// done(LCS) int8 CRunningScript::ProcessOneCommand() { int8 retval = -1; @@ -2748,32 +2926,57 @@ int8 CRunningScript::ProcessOneCommand() #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT char commandInfo[1024]; uint32 ip = m_nIp; + uint8 nInputParams; + uint8 nOutputParameters; + uint8 nLocalsOffset; if (command < ARRAY_SIZE(commands)) { script_assert(commands[command].id == command); - sprintf(commandInfo, m_nIp >= SIZE_MAIN_SCRIPT ? "M<%5d> " : "<%6d> ", m_nIp >= SIZE_MAIN_SCRIPT ? m_nIp - SIZE_MAIN_SCRIPT : m_nIp); + sprintf(commandInfo, m_nIp >= CTheScripts::MainScriptSize ? "M<%5d> " : "<%6d> ", m_nIp >= CTheScripts::MainScriptSize ? m_nIp - CTheScripts::MainScriptSize : m_nIp); if (m_bNotFlag) strcat(commandInfo, "NOT "); if (commands[command].position == -1) strcat(commandInfo, commands[command].name + sizeof("COMMAND_") - 1); - for (int i = 0; commands[command].input[i] != ARGTYPE_NONE; i++) { + if (commands[command].input[0] == ARGTYPE_FUNCTION) { char tmp[32]; bool var = false; - int value; - switch (commands[command].input[i]) { - case ARGTYPE_INT: - case ARGTYPE_PED_HANDLE: - case ARGTYPE_VEHICLE_HANDLE: - case ARGTYPE_OBJECT_HANDLE: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%d)" : " %d", value); break; - case ARGTYPE_FLOAT: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%.3f)" : " %.3f", *(float*)&value); break; - case ARGTYPE_STRING: sprintf(tmp, " '%s'", (const char*)&CTheScripts::ScriptSpace[m_nIp]); m_nIp += KEY_LENGTH_IN_SCRIPT; break; - case ARGTYPE_LABEL: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%s(%d))" : " %s(%d)", value >= 0 ? "G" : "L", abs(value)); break; - case ARGTYPE_BOOL: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%s)" : " %s", value ? "TRUE" : "FALSE"); break; - case ARGTYPE_ANDOR: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, " %d %ss", (value + 1) % 10, value / 10 == 0 ? "AND" : "OR"); break; - default: script_assert(0); - } + nInputParams = CTheScripts::Read1ByteFromScript(&m_nIp); + nOutputParameters = CTheScripts::Read1ByteFromScript(&m_nIp); + nLocalsOffset = CTheScripts::Read1ByteFromScript(&m_nIp); + int value = CollectParameterForDebug(commandInfo, var); + sprintf(tmp, var ? " (%s(%d))" : " %s(%d)", value >= 0 ? "G" : "L", abs(value)); strcat(commandInfo, tmp); - if (commands[command].position == i) - strcat(commandInfo, commands[command].name_override); + strcat(commandInfo, "{"); + for (int i = 0; i < nInputParams; i++) { + if (i != 0) + strcat(commandInfo, ", "); + value = CollectParameterForDebug(commandInfo, var); + sprintf(tmp, var ? "(%d)" : "%d", value); + strcat(commandInfo, tmp); + + } + strcat(commandInfo, "}"); + } + else { + for (int i = 0; commands[command].input[i] != ARGTYPE_NONE; i++) { + char tmp[32]; + bool var = false; + int value; + switch (commands[command].input[i]) { + case ARGTYPE_INT: + case ARGTYPE_PED_HANDLE: + case ARGTYPE_VEHICLE_HANDLE: + case ARGTYPE_OBJECT_HANDLE: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%d)" : " %d", value); break; + case ARGTYPE_FLOAT: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%.3f)" : " %.3f", *(float*)&value); break; + case ARGTYPE_STRING: sprintf(tmp, " '%s'", (const char*)&CTheScripts::ScriptSpace[m_nIp]); m_nIp += KEY_LENGTH_IN_SCRIPT; break; + case ARGTYPE_LABEL: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%s(%d))" : " %s(%d)", value >= 0 ? "G" : "L", abs(value)); break; + case ARGTYPE_BOOL: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, var ? " (%s)" : " %s", value ? "TRUE" : "FALSE"); break; + case ARGTYPE_ANDOR: value = CollectParameterForDebug(commandInfo, var); sprintf(tmp, " %d %ss", (value + 1) % 10, value / 10 == 0 ? "AND" : "OR"); break; + default: script_assert(0); + } + strcat(commandInfo, tmp); + if (commands[command].position == i) + strcat(commandInfo, commands[command].name_override); + } } uint32 t = m_nIp; m_nIp = ip; @@ -2810,10 +3013,10 @@ int8 CRunningScript::ProcessOneCommand() retval = ProcessCommands1300To1399(command); else if (command < 1497) retval = ProcessCommands1400To1499(command); - //else if (command < 1600) // TODO - // retval = ProcessCommands1500To1599(command); - //else if (command < 1700) - // retval = ProcessCommands1600To1699(command); + else if (command < 1600) + retval = ProcessCommands1500To1599(command); + else if (command < 1700) + retval = ProcessCommands1600To1699(command); #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT if (command < ARRAY_SIZE(commands)) { if (commands[command].cond || commands[command].output[0] != ARGTYPE_NONE) { @@ -2823,15 +3026,17 @@ int8 CRunningScript::ProcessOneCommand() uint32 t = m_nIp; m_nIp = ip; ip = t; - for (int i = 0; commands[command].output[i] != ARGTYPE_NONE; i++) { - char tmp[32]; - switch (commands[command].output[i]) { - case ARGTYPE_INT: - case ARGTYPE_PED_HANDLE: - case ARGTYPE_VEHICLE_HANDLE: - case ARGTYPE_OBJECT_HANDLE: GetStoredParameterForDebug(commandInfo); sprintf(tmp, " (%d)", ScriptParams[i]); strcat(commandInfo, tmp); break; - case ARGTYPE_FLOAT: GetStoredParameterForDebug(commandInfo); sprintf(tmp, " (%8.3f)", *(float*)&ScriptParams[i]); strcat(commandInfo, tmp); break; - default: script_assert(0 && "Script only returns INTs and FLOATs"); + if (commands[command].input[0] != ARGTYPE_FUNCTION) { + for (int i = 0; commands[command].output[i] != ARGTYPE_NONE; i++) { + char tmp[32]; + switch (commands[command].output[i]) { + case ARGTYPE_INT: + case ARGTYPE_PED_HANDLE: + case ARGTYPE_VEHICLE_HANDLE: + case ARGTYPE_OBJECT_HANDLE: GetStoredParameterForDebug(commandInfo); sprintf(tmp, " (%d)", ScriptParams[i]); strcat(commandInfo, tmp); break; + case ARGTYPE_FLOAT: GetStoredParameterForDebug(commandInfo); sprintf(tmp, " (%8.3f)", *(float*)&ScriptParams[i]); strcat(commandInfo, tmp); break; + default: script_assert(0 && "Script only returns INTs and FLOATs"); + } } } m_nIp = ip; @@ -2869,7 +3074,7 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) return 1; case COMMAND_GOTO: CollectParameters(&m_nIp, 1); - SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : SIZE_MAIN_SCRIPT - ScriptParams[0]); + SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::MainScriptSize - ScriptParams[0]); /* Known issue: GOTO to 0. It might have been "better" to use > instead of >= */ /* simply because it never makes sense to jump to start of the script */ /* but jumping to start of a custom mission is an issue for simple mission-like scripts */ @@ -3324,17 +3529,15 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) //case COMMAND_IS_FLOAT_VAR_NOT_EQUAL_TO_FLOAT_VAR: //case COMMAND_IS_FLOAT_LVAR_NOT_EQUAL_TO_FLOAT_LVAR: //case COMMAND_IS_FLOAT_VAR_NOT_EQUAL_TO_FLOAT_LVAR: - /* case COMMAND_GOTO_IF_TRUE: CollectParameters(&m_nIp, 1); if (m_bCondResult) - SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : SIZE_MAIN_SCRIPT - ScriptParams[0]); + SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::MainScriptSize - ScriptParams[0]); return 0; - */ case COMMAND_GOTO_IF_FALSE: CollectParameters(&m_nIp, 1); if (!m_bCondResult) - SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : SIZE_MAIN_SCRIPT - ScriptParams[0]); + SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::MainScriptSize - ScriptParams[0]); /* Check COMMAND_GOTO note. */ return 0; case COMMAND_TERMINATE_THIS_SCRIPT: @@ -3362,45 +3565,17 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) CollectParameters(&m_nIp, 1); script_assert(ScriptParams[0] >= 0); CRunningScript* pNew = CTheScripts::StartNewScript(ScriptParams[0]); - m_bIsActive = true; - int8 type = CTheScripts::Read1ByteFromScript(&m_nIp); - float tmp; - for (int i = 0; type != ARGUMENT_END; type = CTheScripts::Read1ByteFromScript(&m_nIp), i++) { - switch (type) { - case ARGUMENT_INT32: - pNew->m_anLocalVariables[i] = CTheScripts::Read4BytesFromScript(&m_nIp); - break; - //case ARGUMENT_GLOBALVAR: - // pNew->m_anLocalVariables[i] = *(int32*)&CTheScripts::ScriptSpace[(uint16)CTheScripts::Read2BytesFromScript(&m_nIp)]; - // break; - //case ARGUMENT_LOCALVAR: - // pNew->m_anLocalVariables[i] = m_anLocalVariables[CTheScripts::Read2BytesFromScript(&m_nIp)]; - // break; - case ARGUMENT_INT8: - pNew->m_anLocalVariables[i] = CTheScripts::Read1ByteFromScript(&m_nIp); - break; - case ARGUMENT_INT16: - pNew->m_anLocalVariables[i] = CTheScripts::Read2BytesFromScript(&m_nIp); - break; - case ARGUMENT_FLOAT: - tmp = CTheScripts::ReadFloatFromScript(&m_nIp); - pNew->m_anLocalVariables[i] = *(int32*)&tmp; - break; - default: - break; - } - } + CollectParameters(&m_nIp, NUM_LOCAL_VARS, pNew->m_anLocalVariables); return 0; } case COMMAND_GOSUB: CollectParameters(&m_nIp, 1); script_assert(m_nStackPointer < MAX_STACK_DEPTH); m_anStack[m_nStackPointer++] = m_nIp; - SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : SIZE_MAIN_SCRIPT - ScriptParams[0]); + SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::MainScriptSize - ScriptParams[0]); return 0; case COMMAND_RETURN: - script_assert(m_nStackPointer > 0); /* No more SSU */ - SetIP(m_anStack[--m_nStackPointer]); + ReturnFromGosubOrFunction(); return 0; case COMMAND_LINE: CollectParameters(&m_nIp, 6); @@ -3434,7 +3609,7 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) { CVector pos; CollectParameters(&m_nIp, 1); - if (CWorld::Players[ScriptParams[0]].m_pPed->bInVehicle) + if (CWorld::Players[ScriptParams[0]].m_pPed->bInVehicle && CWorld::Players[ScriptParams[0]].m_pPed->m_pMyVehicle) pos = CWorld::Players[ScriptParams[0]].m_pPed->m_pMyVehicle->GetPosition(); else pos = CWorld::Players[ScriptParams[0]].m_pPed->GetPosition(); @@ -3450,7 +3625,7 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CPlayerPed* ped = CWorld::Players[index].m_pPed; - if (ped->bInVehicle) { + if (ped->bInVehicle && ped->m_pMyVehicle) { pos.z += ped->m_pMyVehicle->GetDistanceFromCentreOfMassToBaseOfModel(); ped->m_pMyVehicle->Teleport(pos); // removed dumb stuff that was present here CTheScripts::ClearSpaceForMissionEntity(pos, ped->m_pMyVehicle); @@ -4441,14 +4616,14 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_DEBUG_OFF: CTheScripts::DbgFlag = false; return 0; - /* case COMMAND_RETURN_TRUE: UpdateCompareFlag(true); + ReturnFromGosubOrFunction(); return 0; case COMMAND_RETURN_FALSE: UpdateCompareFlag(false); + ReturnFromGosubOrFunction(); return 0; - */ //case COMMAND_VAR_INT: default: script_assert(0); @@ -5022,6 +5197,24 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) return -1; } +void CRunningScript::ReturnFromGosubOrFunction() +{ + uint32 val = m_nIp = m_anStack[--m_nStackPointer]; + if (!(m_nIp & BIT(STACKVALUE_IS_FUNCTION_CALL_BIT))) + return; + if (m_nIp & BIT(STACKVALUE_INVERT_RETURN_BIT)) + m_bCondResult = !m_bCondResult; + m_nIp = m_nIp & STACKVALUE_IP_MASK; + uint8 nInputParameters = CTheScripts::Read1ByteFromScript(&m_nIp); + uint8 nOutputParameters = CTheScripts::Read1ByteFromScript(&m_nIp); + uint8 nLocalsOffset = CTheScripts::Read1ByteFromScript(&m_nIp); + for (int i = 0; i < nOutputParameters; i++) + ScriptParams[i] = m_anLocalVariables[m_nLocalsPointer + nInputParameters]; + m_nIp += val >> STACKVALUE_IP_PARAMS_OFFSET; + m_nLocalsPointer -= nLocalsOffset; + StoreParameters(&m_nIp, nOutputParameters); +} + #ifdef MISSION_REPLAY bool CRunningScript::CanAllowMissionReplay() @@ -5102,9 +5295,9 @@ CTheScripts::SwitchToMission(int32 mission) int handle = CFileMgr::OpenFile("data\\main.scm", "rb"); #endif CFileMgr::Seek(handle, offset, 0); - CFileMgr::Read(handle, (const char*)&CTheScripts::ScriptSpace[SIZE_MAIN_SCRIPT], SIZE_MISSION_SCRIPT); + CFileMgr::Read(handle, (const char*)&CTheScripts::ScriptSpace[CTheScripts::MainScriptSize], CTheScripts::MainScriptSize); CFileMgr::CloseFile(handle); - CRunningScript* pMissionScript = CTheScripts::StartNewScript(SIZE_MAIN_SCRIPT); + CRunningScript* pMissionScript = CTheScripts::StartNewScript(CTheScripts::MainScriptSize); CTimer::Resume(); pMissionScript->m_bIsMissionScript = true; pMissionScript->m_bMissionFlag = true; diff --git a/src/control/Script.h b/src/control/Script.h index 0a7f64bf..ae1838d7 100644 --- a/src/control/Script.h +++ b/src/control/Script.h @@ -271,16 +271,6 @@ enum { VAR_GLOBAL = 2, }; -enum { -#ifdef PS2 - SIZE_MAIN_SCRIPT = 205512, -#else - SIZE_MAIN_SCRIPT = 225512, -#endif - SIZE_MISSION_SCRIPT = 35000, - SIZE_SCRIPT_SPACE = SIZE_MAIN_SCRIPT + SIZE_MISSION_SCRIPT -}; - enum { MAX_NUM_SCRIPTS = 128, MAX_NUM_INTRO_TEXT_LINES = 48, @@ -337,15 +327,6 @@ public: static uint16 ScriptsUpdated; static uint32 LastMissionPassedTime; static uint16 NumberOfExclusiveMissionScripts; -#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) -#define CARDS_IN_SUIT (13) -#define NUM_SUITS (4) -#define MAX_DECKS (6) -#define CARDS_IN_DECK (CARDS_IN_SUIT * NUM_SUITS) -#define CARDS_IN_STACK (CARDS_IN_DECK * MAX_DECKS) - static int16 CardStack[CARDS_IN_STACK]; - static int16 CardStackPosition; -#endif static bool bPlayerIsInTheStatium; static uint8 RiotIntensity; @@ -358,6 +339,8 @@ public: static int NextProcessId; static bool InTheScripts; static CRunningScript* pCurrent; + static uint16 NumTrueGlobals; + static uint16 MostGlobals; static bool Init(bool loaddata = false); static void Process(); @@ -476,6 +459,8 @@ public: extern int ScriptParams[32]; +VALIDATE_SIZE(uStackReturnValue, 4); + class CRunningScript { enum { @@ -498,6 +483,15 @@ class CRunningScript ORS_8 }; + enum { + STACKVALUE_IP_BITS = 22, + STACKVALUE_INVERT_RETURN_BIT = STACKVALUE_IP_BITS, + STACKVALUE_IS_FUNCTION_CALL_BIT, + STACKVALUE_IP_PARAMS_OFFSET, + + STACKVALUE_IP_MASK = ((1 << STACKVALUE_IP_BITS) - 1) + }; + public: CRunningScript* next; CRunningScript* prev; @@ -564,6 +558,8 @@ public: int8 ProcessCommands1200To1299(int32); int8 ProcessCommands1300To1399(int32); int8 ProcessCommands1400To1499(int32); + int8 ProcessCommands1500To1599(int32); + int8 ProcessCommands1600To1699(int32); void LocatePlayerCommand(int32, uint32*); void LocatePlayerCharCommand(int32, uint32*); @@ -601,11 +597,11 @@ public: float LimitAngleOnCircle(float angle) { return angle < 0.0f ? angle + 360.0f : angle; } bool ThisIsAValidRandomPed(uint32 pedtype, int civ, int gang, int criminal); - - bool CheckDamagedWeaponType(int32 actual, int32 type); - + bool CheckDamagedWeaponType(int32 actual, int32 type); static bool ThisIsAValidRandomCop(int32 mi, bool cop, bool swat, bool fbi, bool army, bool miami); + void ReturnFromGosubOrFunction(); + }; #ifdef USE_DEBUG_SCRIPT_LOADER diff --git a/src/control/Script3.cpp b/src/control/Script3.cpp index 7476d8de..26e1187d 100644 --- a/src/control/Script3.cpp +++ b/src/control/Script3.cpp @@ -1639,7 +1639,6 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) UpdateCompareFlag(TheCamera.IsSphereVisible(pObject->GetBoundCentre(), pObject->GetBoundRadius())); return 0; } - /* case COMMAND_GOSUB_FILE: { CollectParameters(&m_nIp, 2); @@ -1649,7 +1648,6 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) // ScriptParams[1] == filename return 0; } - */ case COMMAND_GET_GROUND_Z_FOR_3D_COORD: { CollectParameters(&m_nIp, 3); @@ -2126,7 +2124,6 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CollectParameters(&m_nIp, 2); CGarages::ChangeGarageType(ScriptParams[0], ScriptParams[1], 0); return 0; - /* case COMMAND_ACTIVATE_CRUSHER_CRANE: { CollectParameters(&m_nIp, 10); @@ -2148,6 +2145,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) *(float*)&ScriptParams[0], *(float*)&ScriptParams[1]); return 0; } + /* case COMMAND_PRINT_WITH_2_NUMBERS: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); diff --git a/src/control/Script5.cpp b/src/control/Script5.cpp index c594b9c8..b49e1c79 100644 --- a/src/control/Script5.cpp +++ b/src/control/Script5.cpp @@ -2740,6 +2740,9 @@ void CTheScripts::ReadObjectNamesFromScript() { int32 varSpace = GetSizeOfVariableSpace(); uint32 ip = varSpace + 8; + NumSaveVars = Read4BytesFromScript(&ip); + SavedVarIndices = (short*)&ScriptParams[ip]; + ip += 2 * NumSaveVars; NumberOfUsedObjects = Read2BytesFromScript(&ip); ip += 2; for (uint16 i = 0; i < NumberOfUsedObjects; i++) { @@ -2784,7 +2787,8 @@ void CTheScripts::ReadMultiScriptFileOffsetsFromScript() uint32 ip = varSpace + 3; int32 objectSize = Read4BytesFromScript(&ip); ip = objectSize + 8; - MainScriptSize = Read4BytesFromScript(&ip); + NumTrueGlobals = Read2BytesFromScript(&ip); + MostGlobals = Read2BytesFromScript(&ip); LargestMissionScriptSize = Read4BytesFromScript(&ip); NumberOfMissionScripts = Read2BytesFromScript(&ip); NumberOfExclusiveMissionScripts = Read2BytesFromScript(&ip); diff --git a/src/control/Script6.cpp b/src/control/Script6.cpp index 76780941..8915a089 100644 --- a/src/control/Script6.cpp +++ b/src/control/Script6.cpp @@ -374,32 +374,30 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) { CollectParameters(&m_nIp, 1); - if (CTheScripts::NumberOfExclusiveMissionScripts > 0 && ScriptParams[0] <= UINT16_MAX - 2) - return 0; + if (CTheScripts::NumberOfExclusiveMissionScripts > 0) { + if (ScriptParams[0] < UINT16_MAX - 1) + return 0; + ScriptParams[0] = UINT16_MAX - ScriptParams[0]; + } #ifdef MISSION_REPLAY missionRetryScriptIndex = ScriptParams[0]; if (missionRetryScriptIndex == 19) CStats::LastMissionPassedName[0] = '\0'; #endif CTimer::Suspend(); - int offset = CTheScripts::MultiScriptArray[ScriptParams[0]]; -#ifdef USE_DEBUG_SCRIPT_LOADER - CFileMgr::ChangeDir("\\data\\"); - int handle = CFileMgr::OpenFile(scriptfile, "rb"); - CFileMgr::ChangeDir("\\"); -#else - CFileMgr::ChangeDir("\\"); - int handle = CFileMgr::OpenFile("data\\main.scm", "rb"); -#endif - CFileMgr::Seek(handle, offset, 0); - CFileMgr::Read(handle, (const char*)&CTheScripts::ScriptSpace[SIZE_MAIN_SCRIPT], SIZE_MISSION_SCRIPT); - CFileMgr::CloseFile(handle); - CRunningScript* pMissionScript = CTheScripts::StartNewScript(SIZE_MAIN_SCRIPT); + int offset = CTheScripts::MultiScriptArray[ScriptParams[0]] + 8; + int size = CTheScripts::MultiScriptArray[ScriptParams[0] + 1] - CTheScripts::MultiScriptArray[ScriptParams[0]]; + if (size <= 0) + size = CTheScripts::LargestMissionScriptSize; + CFileMgr::Seek(gScriptsFile, offset, 0); + CFileMgr::Read(gScriptsFile, (const char*)&CTheScripts::ScriptSpace[CTheScripts::MainScriptSize], size); // TODO + CRunningScript* pMissionScript = CTheScripts::StartNewScript(CTheScripts::MainScriptSize); CTimer::Resume(); pMissionScript->m_bIsMissionScript = true; pMissionScript->m_bMissionFlag = true; CTheScripts::bAlreadyRunningAMissionScript = true; - CGameLogic::ClearShortCut(); + memset(&CTheScripts::ScriptSpace[CTheScripts::NumTrueGlobals * 4 + 8], 0, CTheScripts::MostGlobals * 4); + pMissionScript->Process(); return 0; } case COMMAND_SET_OBJECT_DRAW_LAST: diff --git a/src/control/Script8.cpp b/src/control/Script8.cpp index 74552b23..63102d24 100644 --- a/src/control/Script8.cpp +++ b/src/control/Script8.cpp @@ -384,7 +384,6 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) } return 0; } -#if (defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT) case COMMAND_IS_JAPANESE_GAME: #ifdef MORE_LANGUAGES UpdateCompareFlag(FrontEndMenuManager.m_PrefsLanguage == LANGUAGE_JAPANESE); @@ -394,218 +393,697 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) UpdateCompareFlag(false); #endif return 0; -#elif (!defined GTA_PS2) - case COMMAND_SET_ONSCREEN_COUNTER_FLASH_WHEN_FIRST_DISPLAYED: - script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); - uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp); + case COMMAND_1442: + script_assert(false); + return 0; + case COMMAND_1443: + script_assert(false); + return 0; + case COMMAND_1444: + script_assert(false); + return 0; + case COMMAND_1445: + script_assert(false); + return 0; + case COMMAND_1446: + script_assert(false); + return 0; + case COMMAND_1447: + script_assert(false); + return 0; + case COMMAND_1448: + script_assert(false); + return 0; + case COMMAND_1449: + script_assert(false); + return 0; + case COMMAND_1450: + script_assert(false); + return 0; + case COMMAND_1451: + script_assert(false); + return 0; + case COMMAND_1452: + script_assert(false); + return 0; + case COMMAND_1453: + script_assert(false); + return 0; + case COMMAND_CALL: + case COMMAND_NOTCALL: + { + m_anStack[m_nStackPointer++] = m_nIp | BIT(STACKVALUE_IS_FUNCTION_CALL_BIT) | ((command == COMMAND_NOTCALL) ? BIT(STACKVALUE_INVERT_RETURN_BIT) : 0); + uint8 nInputParams = CTheScripts::Read1ByteFromScript(&m_nIp); + uint8 nOutputParameters = CTheScripts::Read1ByteFromScript(&m_nIp); + uint8 nLocalsOffset = CTheScripts::Read1ByteFromScript(&m_nIp); + uint32 nIPBeforeParameters = m_nIp; CollectParameters(&m_nIp, 1); - //CUserDisplay::OnscnTimer.SetCounterFlashWhenFirstDisplayed(var, ScriptParams[0]); - break; -#endif -#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) - case COMMAND_SHUFFLE_CARD_DECKS: - { - CollectParameters(&m_nIp, 1); - script_assert(ScriptParams[0] >= 0 && ScriptParams[0] <= 6); - for (int i = 0; i < CARDS_IN_STACK; i++) - CTheScripts::CardStack[i] = 0; - int16 seq[CARDS_IN_STACK]; - for (int i = 0; i < MAX_DECKS * CARDS_IN_DECK; i++) - seq[i] = i; - int cards_left = CARDS_IN_DECK * ScriptParams[0]; - for (int k = 1; k < CARDS_IN_DECK + 1; k++) { - for (int deck = 0; deck < ScriptParams[0]; deck++) { - int index = CGeneral::GetRandomNumberInRange(0, cards_left); - CTheScripts::CardStack[seq[index]] = k; - for (int l = index; l < cards_left; l++) { - if (l + 1 < CARDS_IN_STACK) - seq[l] = seq[l + 1]; - else - seq[l] = 0; - } - --cards_left; - } - } - CTheScripts::CardStackPosition = 0; - return 0; - } - case COMMAND_FETCH_NEXT_CARD: - { - if (CTheScripts::CardStack[CTheScripts::CardStackPosition] == 0) - CTheScripts::CardStackPosition = 0; - ScriptParams[0] = CTheScripts::CardStack[CTheScripts::CardStackPosition++]; - if (CTheScripts::CardStackPosition == CARDS_IN_DECK * MAX_DECKS) - CTheScripts::CardStackPosition = 0; - StoreParameters(&m_nIp, 1); - return 0; - } - case COMMAND_GET_OBJECT_VELOCITY: - { - CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - *(CVector*)&ScriptParams[0] = GAME_SPEED_TO_METERS_PER_SECOND * pObject->GetMoveSpeed(); - StoreParameters(&m_nIp, 3); - return 0; - } - case COMMAND_IS_DEBUG_CAMERA_ON: - UpdateCompareFlag(TheCamera.WorldViewerBeingUsed); - return 0; - case COMMAND_ADD_TO_OBJECT_ROTATION_VELOCITY: - { - CollectParameters(&m_nIp, 4); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - CVector newSpeed = pObject->GetTurnSpeed() + *(CVector*)&ScriptParams[1] / GAME_SPEED_TO_METERS_PER_SECOND; - if (pObject->bIsStatic) { - pObject->SetIsStatic(false); - pObject->AddToMovingList(); - } - pObject->SetTurnSpeed(newSpeed.x, newSpeed.y, newSpeed.z); - return 0; - } - case COMMAND_SET_OBJECT_ROTATION_VELOCITY: - { - CollectParameters(&m_nIp, 4); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - CVector newSpeed = *(CVector*)&ScriptParams[1] / GAME_SPEED_TO_METERS_PER_SECOND; - if (pObject->bIsStatic) { - pObject->SetIsStatic(false); - pObject->AddToMovingList(); - } - pObject->SetTurnSpeed(newSpeed.x, newSpeed.y, newSpeed.z); - return 0; - } - case COMMAND_IS_OBJECT_STATIC: - { - CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - UpdateCompareFlag(pObject->GetIsStatic()); - return 0; - } - case COMMAND_GET_ANGLE_BETWEEN_2D_VECTORS: - { - CollectParameters(&m_nIp, 4); - CVector2D v1 = *(CVector2D*)&ScriptParams[0]; - CVector2D v2 = *(CVector2D*)&ScriptParams[2]; - float c = DotProduct2D(v1, v2) / (v1.Magnitude() * v2.Magnitude()); -#ifdef FIX_BUGS // command is a SA leftover where it was fixed to this - *(float*)&ScriptParams[0] = RADTODEG(Acos(c)); -#else - *(float*)&ScriptParams[0] = Acos(c); -#endif - return 0; - } - case COMMAND_DO_2D_RECTANGLES_COLLIDE: - { - CollectParameters(&m_nIp, 8); - float infX1 = *(float*)&ScriptParams[0] - *(float*)&ScriptParams[2] * 0.5; // NB: not float - float supX1 = *(float*)&ScriptParams[0] + *(float*)&ScriptParams[2] * 0.5; - float infX2 = *(float*)&ScriptParams[4] - *(float*)&ScriptParams[6] * 0.5; - float supX2 = *(float*)&ScriptParams[4] + *(float*)&ScriptParams[6] * 0.5; - float infY1 = *(float*)&ScriptParams[1] - *(float*)&ScriptParams[3] * 0.5; - float supY1 = *(float*)&ScriptParams[1] + *(float*)&ScriptParams[3] * 0.5; - float infY2 = *(float*)&ScriptParams[5] - *(float*)&ScriptParams[7] * 0.5; - float supY2 = *(float*)&ScriptParams[5] + *(float*)&ScriptParams[7] * 0.5; - bool collide = true; - if (infY2 > supY1) - collide = false; - if (infY1 > supY2) - collide = false; - if (infX2 > supX1) - collide = false; - if (infX1 > supX2) - collide = false; - UpdateCompareFlag(collide); - return 0; - } - case COMMAND_GET_OBJECT_ROTATION_VELOCITY: - { - CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - *(CVector*)&ScriptParams[0] = pObject->GetTurnSpeed() * GAME_SPEED_TO_METERS_PER_SECOND; - StoreParameters(&m_nIp, 3); - return 0; - } - case COMMAND_ADD_VELOCITY_RELATIVE_TO_OBJECT_VELOCITY: - { - CollectParameters(&m_nIp, 4); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - CVector vecAddition = *(CVector*)&ScriptParams[1] * CTimer::GetTimeStep() / GAME_SPEED_TO_METERS_PER_SECOND; - if (!pObject->bIsStatic) { - CVector vecCurrSpeed = pObject->GetSpeed(); - vecCurrSpeed.Normalise(); - if (vecCurrSpeed.z != 1.0) { // NB: not float! - CVector vx = CrossProduct(vecCurrSpeed, CVector(0.0f, 0.0f, 1.0f)); - vx.Normalise(); - CVector vz = CrossProduct(vx, vecCurrSpeed); - vz.Normalise(); - CVector vecNewSpeed = pObject->GetSpeed() + vecAddition.x * vx + vecAddition.y * vecCurrSpeed + vecAddition.z * vecCurrSpeed; - if (pObject->bIsStatic) { - pObject->SetIsStatic(false); - pObject->AddToMovingList(); - } - pObject->SetMoveSpeed(vecNewSpeed); - } - } - return 0; - } - case COMMAND_GET_OBJECT_SPEED: - { - CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); - *(float*)&ScriptParams[0] = pObject->GetMoveSpeed().Magnitude() * GAME_SPEED_TO_METERS_PER_SECOND; - StoreParameters(&m_nIp, 1); - return 0; - } -#endif -#if (defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) - case COMMAND_IS_MISSION_SKIP: -#ifdef MISSION_REPLAY - ScriptParams[0] = MissionSkipLevel; -#else - ScriptParams[0] = 0; -#endif - StoreParameters(&m_nIp, 1); - return 0; - case COMMAND_SET_IN_AMMUNATION: - CollectParameters(&m_nIp, 1); -#ifdef MISSION_REPLAY - IsInAmmunation = ScriptParams[0]; -#endif - return 0; - case COMMAND_DO_SAVE_GAME: - CollectParameters(&m_nIp, 1); -#ifdef MISSION_REPLAY - SaveGameForPause(ScriptParams[0]); -#endif - return 0; - case COMMAND_IS_RETRY: -#ifdef MISSION_REPLAY - if (strcmp(m_abScriptName, "porno4") != 0) - ScriptParams[0] = AllowMissionReplay; -#ifdef FIX_BUGS + if (nInputParams) + CollectParameters(&m_nIp, nInputParams, &m_anLocalVariables[m_nLocalsPointer + nLocalsOffset]); + m_nLocalsPointer += nLocalsOffset; + m_anStack[m_nStackPointer - 1] |= (m_nIp - nIPBeforeParameters) << STACKVALUE_IP_PARAMS_OFFSET; + if (ScriptParams[0] < 0) + m_nIp = CTheScripts::MainScriptSize - ScriptParams[0]; else - ScriptParams[0] = gbTryingPorn4Again; -#else - else if (gbTryingPorn4Again) - ScriptParams[0] = 1; -#endif -#else - ScriptParams[0] = 0; -#endif - StoreParameters(&m_nIp, 1); + m_nIp = ScriptParams[0]; return 0; - case COMMAND_DUMMY: + } + case COMMAND_1456: + script_assert(false); return 0; -#endif -#if (defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) - // it is unknown what these commands do but they don't take parameters - case COMMAND_MARK_CUTSCENE_START: + case COMMAND_1457: + script_assert(false); return 0; - case COMMAND_MARK_CUTSCENE_END: + case COMMAND_1458: + script_assert(false); return 0; - case COMMAND_CUTSCENE_SCROLL: + case COMMAND_1459: + script_assert(false); + return 0; + case COMMAND_1460: + script_assert(false); + return 0; + case COMMAND_1461: + script_assert(false); + return 0; + case COMMAND_1462: + script_assert(false); + return 0; + case COMMAND_1463: + script_assert(false); + return 0; + case COMMAND_1464: + script_assert(false); + return 0; + case COMMAND_1465: + script_assert(false); + return 0; + case COMMAND_1466: + script_assert(false); + return 0; + case COMMAND_1467: + script_assert(false); + return 0; + case COMMAND_1468: + script_assert(false); + return 0; + case COMMAND_1469: + script_assert(false); + return 0; + case COMMAND_1470: + script_assert(false); + return 0; + case COMMAND_1471: + script_assert(false); + return 0; + case COMMAND_1472: + script_assert(false); + return 0; + case COMMAND_1473: + script_assert(false); + return 0; + case COMMAND_1474: + script_assert(false); + return 0; + case COMMAND_1475: + script_assert(false); + return 0; + case COMMAND_1476: + script_assert(false); + return 0; + case COMMAND_1477: + script_assert(false); + return 0; + case COMMAND_1478: + script_assert(false); + return 0; + case COMMAND_1479: + script_assert(false); + return 0; + case COMMAND_1480: + script_assert(false); + return 0; + case COMMAND_1481: + script_assert(false); + return 0; + case COMMAND_1482: + script_assert(false); + return 0; + case COMMAND_1483: + script_assert(false); + return 0; + case COMMAND_1484: + script_assert(false); + return 0; + case COMMAND_1485: + script_assert(false); + return 0; + case COMMAND_1486: + script_assert(false); + return 0; + case COMMAND_1487: + script_assert(false); + return 0; + case COMMAND_1488: + script_assert(false); + return 0; + case COMMAND_1489: + script_assert(false); + return 0; + case COMMAND_1490: + script_assert(false); + return 0; + case COMMAND_1491: + script_assert(false); + return 0; + case COMMAND_1492: + script_assert(false); + return 0; + case COMMAND_1493: + script_assert(false); + return 0; + case COMMAND_1494: + script_assert(false); + return 0; + case COMMAND_1495: + script_assert(false); + return 0; + case COMMAND_1496: + script_assert(false); + return 0; + case COMMAND_1497: + script_assert(false); + return 0; + case COMMAND_1498: + script_assert(false); + return 0; + case COMMAND_1499: + script_assert(false); + return 0; + default: + script_assert(0); + } + return -1; +} + +int8 CRunningScript::ProcessCommands1500To1599(int32 command) +{ + switch (command) { + case COMMAND_1500: + script_assert(false); + return 0; + case COMMAND_1501: + script_assert(false); + return 0; + case COMMAND_1502: + script_assert(false); + return 0; + case COMMAND_1503: + script_assert(false); + return 0; + case COMMAND_1504: + script_assert(false); + return 0; + case COMMAND_1505: + script_assert(false); + return 0; + case COMMAND_1506: + script_assert(false); + return 0; + case COMMAND_1507: + script_assert(false); + return 0; + case COMMAND_1508: + script_assert(false); + return 0; + case COMMAND_1509: + script_assert(false); + return 0; + case COMMAND_1510: + script_assert(false); + return 0; + case COMMAND_1511: + script_assert(false); + return 0; + case COMMAND_1512: + script_assert(false); + return 0; + case COMMAND_1513: + script_assert(false); + return 0; + case COMMAND_1514: + script_assert(false); + return 0; + case COMMAND_1515: + script_assert(false); + return 0; + case COMMAND_1516: + script_assert(false); + return 0; + case COMMAND_1517: + script_assert(false); + return 0; + case COMMAND_1518: + script_assert(false); + return 0; + case COMMAND_1519: + CollectParameters(&m_nIp, 1); + // TODO (SET_NUMBER_USJ_FOUND?) + return 0; + case COMMAND_1520: + CollectParameters(&m_nIp, 1); + // TODO (SET_TOTAL_HIDDEN_PACKAGES?) + return 0; + case COMMAND_1521: + script_assert(false); + return 0; + case COMMAND_1522: + script_assert(false); + return 0; + case COMMAND_1523: + script_assert(false); + return 0; + case COMMAND_1524: + script_assert(false); + return 0; + case COMMAND_1525: + script_assert(false); + return 0; + case COMMAND_1526: + script_assert(false); + return 0; + case COMMAND_1527: + script_assert(false); + return 0; + case COMMAND_1528: + script_assert(false); + return 0; + case COMMAND_1529: + script_assert(false); + return 0; + case COMMAND_1530: + script_assert(false); + return 0; + case COMMAND_1531: + script_assert(false); + return 0; + case COMMAND_1532: + script_assert(false); + return 0; + case COMMAND_1533: + script_assert(false); + return 0; + case COMMAND_1534: + script_assert(false); + return 0; + case COMMAND_1535: + script_assert(false); + return 0; + case COMMAND_1536: + script_assert(false); + return 0; + case COMMAND_1537: + script_assert(false); + return 0; + case COMMAND_1538: + script_assert(false); + return 0; + case COMMAND_1539: + script_assert(false); + return 0; + case COMMAND_1540: + script_assert(false); + return 0; + case COMMAND_1541: + script_assert(false); + return 0; + case COMMAND_1542: + script_assert(false); + return 0; + case COMMAND_1543: + script_assert(false); + return 0; + case COMMAND_1544: + script_assert(false); + return 0; + case COMMAND_1545: + script_assert(false); + return 0; + case COMMAND_1546: + script_assert(false); + return 0; + case COMMAND_1547: + script_assert(false); + return 0; + case COMMAND_1548: + script_assert(false); + return 0; + case COMMAND_1549: + CollectParameters(&m_nIp, 1); + // TODO (SET_ONFOOT_CAMERA_MODE?) + return 0; + case COMMAND_1550: + script_assert(false); + return 0; + case COMMAND_1551: + script_assert(false); + return 0; + case COMMAND_1552: + script_assert(false); + return 0; + case COMMAND_1553: + script_assert(false); + return 0; + case COMMAND_1554: + script_assert(false); + return 0; + case COMMAND_1555: + CollectParameters(&m_nIp, 1); + // TODO (FREEZE_ONFOOT_CAMERA_MODE?) + return 0; + case COMMAND_1556: + script_assert(false); + return 0; + case COMMAND_1557: + script_assert(false); + return 0; + case COMMAND_1558: + script_assert(false); + return 0; + case COMMAND_1559: + script_assert(false); + return 0; + case COMMAND_1560: + // TODO (IS_E3_BUILD?) + UpdateCompareFlag(false); + return 0; + case COMMAND_1561: + script_assert(false); + return 0; + case COMMAND_1562: + script_assert(false); + return 0; + case COMMAND_1563: + script_assert(false); + return 0; + case COMMAND_1564: + script_assert(false); + return 0; + case COMMAND_1565: + script_assert(false); + return 0; + case COMMAND_1566: + script_assert(false); + return 0; + case COMMAND_1567: + script_assert(false); + return 0; + case COMMAND_1568: + script_assert(false); + return 0; + case COMMAND_1569: + // TODO (IS_MULTIPLAYER_ACTIVE?) + UpdateCompareFlag(false); + return 0; + case COMMAND_1570: + script_assert(false); + return 0; + case COMMAND_1571: + script_assert(false); + return 0; + case COMMAND_1572: + script_assert(false); + return 0; + case COMMAND_1573: + script_assert(false); + return 0; + case COMMAND_1574: + script_assert(false); + return 0; + case COMMAND_1575: + script_assert(false); + return 0; + case COMMAND_1576: + script_assert(false); + return 0; + case COMMAND_1577: + script_assert(false); + return 0; + case COMMAND_1578: + script_assert(false); + return 0; + case COMMAND_1579: + script_assert(false); + return 0; + case COMMAND_1580: + script_assert(false); + return 0; + case COMMAND_1581: + script_assert(false); + return 0; + case COMMAND_1582: + script_assert(false); + return 0; + case COMMAND_1583: + script_assert(false); + return 0; + case COMMAND_1584: + script_assert(false); + return 0; + case COMMAND_1585: + script_assert(false); + return 0; + case COMMAND_1586: + script_assert(false); + return 0; + case COMMAND_1587: + script_assert(false); + return 0; + case COMMAND_1588: + script_assert(false); + return 0; + case COMMAND_1589: + CollectParameters(&m_nIp, 2); + // TODO (SWAP_BUILDING?) + return 0; + case COMMAND_1590: + script_assert(false); + return 0; + case COMMAND_1591: + script_assert(false); + return 0; + case COMMAND_1592: + script_assert(false); + return 0; + case COMMAND_1593: + script_assert(false); + return 0; + case COMMAND_1594: + script_assert(false); + return 0; + case COMMAND_1595: + script_assert(false); + return 0; + case COMMAND_1596: + script_assert(false); + return 0; + case COMMAND_1597: + script_assert(false); + return 0; + case COMMAND_1598: + script_assert(false); + return 0; + case COMMAND_1599: + script_assert(false); + return 0; + default: + script_assert(0); + } + return -1; +} + +int8 CRunningScript::ProcessCommands1600To1699(int32 command) +{ + switch (command) { + case COMMAND_1600: + script_assert(false); + return 0; + case COMMAND_1601: + script_assert(false); + return 0; + case COMMAND_1602: + script_assert(false); + return 0; + case COMMAND_1603: + script_assert(false); + return 0; + case COMMAND_1604: + script_assert(false); + return 0; + case COMMAND_1605: + script_assert(false); + return 0; + case COMMAND_1606: + script_assert(false); + return 0; + case COMMAND_1607: + script_assert(false); + return 0; + case COMMAND_1608: + script_assert(false); + return 0; + case COMMAND_1609: + script_assert(false); + return 0; + case COMMAND_1610: + script_assert(false); + return 0; + case COMMAND_1611: + script_assert(false); + return 0; + case COMMAND_1612: + script_assert(false); + return 0; + case COMMAND_1613: + script_assert(false); + return 0; + case COMMAND_1614: + script_assert(false); + return 0; + case COMMAND_1615: + script_assert(false); + return 0; + case COMMAND_1616: + script_assert(false); + return 0; + case COMMAND_1617: + script_assert(false); + return 0; + case COMMAND_1618: + script_assert(false); + return 0; + case COMMAND_1619: + script_assert(false); + return 0; + case COMMAND_1620: + script_assert(false); + return 0; + case COMMAND_1621: + script_assert(false); + return 0; + case COMMAND_1622: + script_assert(false); + return 0; + case COMMAND_1623: + script_assert(false); + return 0; + case COMMAND_1624: + script_assert(false); + return 0; + case COMMAND_1625: + script_assert(false); + return 0; + case COMMAND_1626: + script_assert(false); + return 0; + case COMMAND_1627: + script_assert(false); + return 0; + case COMMAND_1628: + script_assert(false); + return 0; + case COMMAND_1629: + script_assert(false); + return 0; + case COMMAND_1630: + script_assert(false); + return 0; + case COMMAND_1631: + script_assert(false); + return 0; + case COMMAND_1632: + script_assert(false); + return 0; + case COMMAND_1633: + script_assert(false); + return 0; + case COMMAND_1634: + script_assert(false); + return 0; + case COMMAND_1635: + { + char tmp[12]; // TODO + CTheScripts::ReadTextLabelFromScript(&m_nIp, tmp); + m_nIp += KEY_LENGTH_IN_SCRIPT; + // TODO (CHANGE_STORED_PLAYER_OUTFIT?) + return 0; + } + case COMMAND_1636: + script_assert(false); + return 0; + case COMMAND_1637: + script_assert(false); + return 0; + case COMMAND_1638: + script_assert(false); + return 0; + case COMMAND_1639: + script_assert(false); + return 0; + case COMMAND_1640: + CollectParameters(&m_nIp, 2); + // TODO (LOCK_GARAGE?) + return 0; + case COMMAND_1641: + script_assert(false); + return 0; + case COMMAND_1642: + script_assert(false); + return 0; + case COMMAND_1643: + script_assert(false); + return 0; + case COMMAND_1644: + script_assert(false); + return 0; + case COMMAND_1645: + script_assert(false); + return 0; + case COMMAND_1646: + CollectParameters(&m_nIp, 1); + // TODO (DISABLE_PAUSE_MENU?) + return 0; + case COMMAND_1647: + script_assert(false); + return 0; + case COMMAND_1648: + CollectParameters(&m_nIp, 3); + // TODO (SET_CLOCK_EVENT_WARNING); + return 0; + case COMMAND_1649: + script_assert(false); + return 0; + case COMMAND_1650: + script_assert(false); + return 0; + case COMMAND_1651: + script_assert(false); + return 0; + case COMMAND_1652: + script_assert(false); + return 0; + case COMMAND_1653: + script_assert(false); + return 0; + case COMMAND_1654: + script_assert(false); + return 0; + case COMMAND_1655: + script_assert(false); + return 0; + case COMMAND_1656: + script_assert(false); return 0; -#endif default: script_assert(0); } diff --git a/src/control/ScriptCommands.h b/src/control/ScriptCommands.h index 8cf73abd..105fa82f 100644 --- a/src/control/ScriptCommands.h +++ b/src/control/ScriptCommands.h @@ -1442,39 +1442,222 @@ enum { COMMAND_REGISTER_FIRE_LEVEL, COMMAND_IS_AUSTRALIAN_GAME, COMMAND_DISARM_CAR_BOMB, -#if (defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT) COMMAND_IS_JAPANESE_GAME, -#elif (!defined GTA_PS2) - COMMAND_SET_ONSCREEN_COUNTER_FLASH_WHEN_FIRST_DISPLAYED, -#endif -#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) - COMMAND_SHUFFLE_CARD_DECKS, - COMMAND_FETCH_NEXT_CARD, - COMMAND_GET_OBJECT_VELOCITY, - COMMAND_IS_DEBUG_CAMERA_ON, - COMMAND_ADD_TO_OBJECT_ROTATION_VELOCITY, - COMMAND_SET_OBJECT_ROTATION_VELOCITY, - COMMAND_IS_OBJECT_STATIC, - COMMAND_GET_ANGLE_BETWEEN_2D_VECTORS, - COMMAND_DO_2D_RECTANGLES_COLLIDE, - COMMAND_GET_OBJECT_ROTATION_VELOCITY, - COMMAND_ADD_VELOCITY_RELATIVE_TO_OBJECT_VELOCITY, - COMMAND_GET_OBJECT_SPEED, -#endif -#if (defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT) - COMMAND_MARK_CUTSCENE_START, - COMMAND_MARK_CUTSCENE_END, - COMMAND_CUTSCENE_SCROLL, -#elif (defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) - COMMAND_IS_MISSION_SKIP, - COMMAND_SET_IN_AMMUNATION, - COMMAND_DO_SAVE_GAME, - COMMAND_IS_RETRY, - COMMAND_DUMMY, - COMMAND_MARK_CUTSCENE_START, - COMMAND_MARK_CUTSCENE_END, - COMMAND_CUTSCENE_SCROLL, -#endif + COMMAND_1442, + COMMAND_1443, + COMMAND_1444, + COMMAND_1445, + COMMAND_1446, + COMMAND_1447, + COMMAND_1448, + COMMAND_1449, + COMMAND_1450, + COMMAND_1451, + COMMAND_1452, + COMMAND_1453, + COMMAND_CALL, + COMMAND_NOTCALL, + COMMAND_1456, + COMMAND_1457, + COMMAND_1458, + COMMAND_1459, + COMMAND_1460, + COMMAND_1461, + COMMAND_1462, + COMMAND_1463, + COMMAND_1464, + COMMAND_1465, + COMMAND_1466, + COMMAND_1467, + COMMAND_1468, + COMMAND_1469, + COMMAND_1470, + COMMAND_1471, + COMMAND_1472, + COMMAND_1473, + COMMAND_1474, + COMMAND_1475, + COMMAND_1476, + COMMAND_1477, + COMMAND_1478, + COMMAND_1479, + COMMAND_1480, + COMMAND_1481, + COMMAND_1482, + COMMAND_1483, + COMMAND_1484, + COMMAND_1485, + COMMAND_1486, + COMMAND_1487, + COMMAND_1488, + COMMAND_1489, + COMMAND_1490, + COMMAND_1491, + COMMAND_1492, + COMMAND_1493, + COMMAND_1494, + COMMAND_1495, + COMMAND_1496, + COMMAND_1497, + COMMAND_1498, + COMMAND_1499, + COMMAND_1500, + COMMAND_1501, + COMMAND_1502, + COMMAND_1503, + COMMAND_1504, + COMMAND_1505, + COMMAND_1506, + COMMAND_1507, + COMMAND_1508, + COMMAND_1509, + COMMAND_1510, + COMMAND_1511, + COMMAND_1512, + COMMAND_1513, + COMMAND_1514, + COMMAND_1515, + COMMAND_1516, + COMMAND_1517, + COMMAND_1518, + COMMAND_1519, + COMMAND_1520, + COMMAND_1521, + COMMAND_1522, + COMMAND_1523, + COMMAND_1524, + COMMAND_1525, + COMMAND_1526, + COMMAND_1527, + COMMAND_1528, + COMMAND_1529, + COMMAND_1530, + COMMAND_1531, + COMMAND_1532, + COMMAND_1533, + COMMAND_1534, + COMMAND_1535, + COMMAND_1536, + COMMAND_1537, + COMMAND_1538, + COMMAND_1539, + COMMAND_1540, + COMMAND_1541, + COMMAND_1542, + COMMAND_1543, + COMMAND_1544, + COMMAND_1545, + COMMAND_1546, + COMMAND_1547, + COMMAND_1548, + COMMAND_1549, + COMMAND_1550, + COMMAND_1551, + COMMAND_1552, + COMMAND_1553, + COMMAND_1554, + COMMAND_1555, + COMMAND_1556, + COMMAND_1557, + COMMAND_1558, + COMMAND_1559, + COMMAND_1560, + COMMAND_1561, + COMMAND_1562, + COMMAND_1563, + COMMAND_1564, + COMMAND_1565, + COMMAND_1566, + COMMAND_1567, + COMMAND_1568, + COMMAND_1569, + COMMAND_1570, + COMMAND_1571, + COMMAND_1572, + COMMAND_1573, + COMMAND_1574, + COMMAND_1575, + COMMAND_1576, + COMMAND_1577, + COMMAND_1578, + COMMAND_1579, + COMMAND_1580, + COMMAND_1581, + COMMAND_1582, + COMMAND_1583, + COMMAND_1584, + COMMAND_1585, + COMMAND_1586, + COMMAND_1587, + COMMAND_1588, + COMMAND_1589, + COMMAND_1590, + COMMAND_1591, + COMMAND_1592, + COMMAND_1593, + COMMAND_1594, + COMMAND_1595, + COMMAND_1596, + COMMAND_1597, + COMMAND_1598, + COMMAND_1599, + COMMAND_1600, + COMMAND_1601, + COMMAND_1602, + COMMAND_1603, + COMMAND_1604, + COMMAND_1605, + COMMAND_1606, + COMMAND_1607, + COMMAND_1608, + COMMAND_1609, + COMMAND_1610, + COMMAND_1611, + COMMAND_1612, + COMMAND_1613, + COMMAND_1614, + COMMAND_1615, + COMMAND_1616, + COMMAND_1617, + COMMAND_1618, + COMMAND_1619, + COMMAND_1620, + COMMAND_1621, + COMMAND_1622, + COMMAND_1623, + COMMAND_1624, + COMMAND_1625, + COMMAND_1626, + COMMAND_1627, + COMMAND_1628, + COMMAND_1629, + COMMAND_1630, + COMMAND_1631, + COMMAND_1632, + COMMAND_1633, + COMMAND_1634, + COMMAND_1635, + COMMAND_1636, + COMMAND_1637, + COMMAND_1638, + COMMAND_1639, + COMMAND_1640, + COMMAND_1641, + COMMAND_1642, + COMMAND_1643, + COMMAND_1644, + COMMAND_1645, + COMMAND_1646, + COMMAND_1647, + COMMAND_1648, + COMMAND_1649, + COMMAND_1650, + COMMAND_1651, + COMMAND_1652, + COMMAND_1653, + COMMAND_1654, + COMMAND_1655, + COMMAND_1656, #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT LAST_SCRIPT_COMMAND #endif @@ -1493,7 +1676,9 @@ enum eScriptArgument ARGTYPE_PED_HANDLE, ARGTYPE_VEHICLE_HANDLE, ARGTYPE_OBJECT_HANDLE, - ARGTYPE_ANDOR + ARGTYPE_ANDOR, + ARGTYPE_LIST, + ARGTYPE_FUNCTION }; struct tScriptCommandData diff --git a/src/core/config.h b/src/core/config.h index 4aaeb3c1..facbaacd 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -97,7 +97,7 @@ enum Config { NUMPACMANPICKUPS = 256, NUMEVENTS = 64, - NUM_CARGENS = 185, + NUM_CARGENS = 500, NUM_PATH_NODES_IN_AUTOPILOT = 8, @@ -334,7 +334,7 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually #endif //#define SIMPLIER_MISSIONS // apply simplifications from mobile #define USE_ADVANCED_SCRIPT_DEBUG_OUTPUT -#define SCRIPT_LOG_FILE_LEVEL 0 // 0 == no log, 1 == overwrite every frame, 2 == full log +#define SCRIPT_LOG_FILE_LEVEL 2 // 0 == no log, 1 == overwrite every frame, 2 == full log #ifndef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT #define USE_BASIC_SCRIPT_DEBUG_OUTPUT From c1e68b2c619e256b795fe30fcbf870ae8d027406 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sat, 9 Jan 2021 17:43:21 +0300 Subject: [PATCH 20/68] fix --- src/control/Script.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 5ed4ebf5..5fbf5779 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -2712,7 +2712,7 @@ bool CTheScripts::Init(bool loaddata) InvisibilitySettingArray[i] = nil; if (loaddata) { printf("loaddata = true\n"); - retval = GenericLoad(); + //retval = GenericLoad(); // TODO } for (int i = 0; i < MAX_ALLOWED_COLLISIONS; i++) AllowedCollision[i] = 0; From 1f79fb608a6bfe43395eaf221c97ae326423254e Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sat, 9 Jan 2021 17:47:55 +0300 Subject: [PATCH 21/68] fix --- src/core/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/config.h b/src/core/config.h index facbaacd..b93ccc82 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -334,7 +334,7 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually #endif //#define SIMPLIER_MISSIONS // apply simplifications from mobile #define USE_ADVANCED_SCRIPT_DEBUG_OUTPUT -#define SCRIPT_LOG_FILE_LEVEL 2 // 0 == no log, 1 == overwrite every frame, 2 == full log +#define SCRIPT_LOG_FILE_LEVEL 0 // 0 == no log, 1 == overwrite every frame, 2 == full log #ifndef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT #define USE_BASIC_SCRIPT_DEBUG_OUTPUT From 322d93ab0cbbcf8f568d113b4460f943b90b587d Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sat, 9 Jan 2021 16:55:45 +0200 Subject: [PATCH 22/68] Fix font --- src/render/Font.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/render/Font.cpp b/src/render/Font.cpp index 3517031d..04b1e074 100644 --- a/src/render/Font.cpp +++ b/src/render/Font.cpp @@ -432,7 +432,7 @@ CFont::PrintChar(float x, float y, wchar c) bDontPrint = c == '\0'; float w = GetCharacterWidth(c) / 32.0f; - if (Details.bFontHalfTexture && c == 208) + if (RenderState.bFontHalfTexture && c == 208) c = '\0'; float xoff = c % 16; float yoff = c / 16; @@ -444,7 +444,7 @@ CFont::PrintChar(float x, float y, wchar c) } #endif - if(Details.style == FONT_BANK || Details.style == FONT_STANDARD){ + if(RenderState.style == FONT_BANK || RenderState.style == FONT_STANDARD){ if (bDontPrint) return; if (RenderState.slant == 0.0f) { #ifdef FIX_BUGS From f6f0cb708ec5dee32e14c7ecf04441757de01325 Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 9 Jan 2021 16:13:38 +0100 Subject: [PATCH 23/68] boat fix --- src/vehicles/Boat.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vehicles/Boat.cpp b/src/vehicles/Boat.cpp index 695d380f..c8eb05f3 100644 --- a/src/vehicles/Boat.cpp +++ b/src/vehicles/Boat.cpp @@ -32,15 +32,15 @@ #define INVALID_ORIENTATION (-9999.99f) -float fShapeLength = 0.4f; -float fShapeTime = 0.05f; -float fRangeMult = 0.6f; -float fTimeMult; - float CBoat::MAX_WAKE_LENGTH = 50.0f; float CBoat::MIN_WAKE_INTERVAL = 2.0f; float CBoat::WAKE_LIFETIME = 150.0f; +float fShapeLength = 0.4f; +float fShapeTime = 0.05f; +float fRangeMult = 0.6f; +float fTimeMult = 1.0/CBoat::WAKE_LIFETIME; + CBoat *CBoat::apFrameWakeGeneratingBoats[4]; const uint32 CBoat::nSaveStructSize = From 434bc01f0b9f2b483fd996954bc37a26f28136bb Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 9 Jan 2021 16:17:47 +0100 Subject: [PATCH 24/68] fix fix --- src/vehicles/Boat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vehicles/Boat.cpp b/src/vehicles/Boat.cpp index c8eb05f3..8dec0f89 100644 --- a/src/vehicles/Boat.cpp +++ b/src/vehicles/Boat.cpp @@ -39,7 +39,7 @@ float CBoat::WAKE_LIFETIME = 150.0f; float fShapeLength = 0.4f; float fShapeTime = 0.05f; float fRangeMult = 0.6f; -float fTimeMult = 1.0/CBoat::WAKE_LIFETIME; +float fTimeMult = 1.2f/CBoat::WAKE_LIFETIME; CBoat *CBoat::apFrameWakeGeneratingBoats[4]; From e906a807f197d962fc4a2154b1bddf8a99241984 Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 9 Jan 2021 18:22:09 +0100 Subject: [PATCH 25/68] moved new renderer --- src/control/SceneEdit.cpp | 4 +- src/extras/custompipes.h | 8 + src/extras/custompipes_d3d9.cpp | 168 +++++++++++++++- src/extras/custompipes_gl.cpp | 171 ++++++++++++++++- src/render/Renderer.cpp | 328 +------------------------------- 5 files changed, 354 insertions(+), 325 deletions(-) diff --git a/src/control/SceneEdit.cpp b/src/control/SceneEdit.cpp index 20f09cb4..c793e027 100644 --- a/src/control/SceneEdit.cpp +++ b/src/control/SceneEdit.cpp @@ -331,7 +331,7 @@ void CSceneEdit::Draw(void) #ifdef FIX_BUGS CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(COMMAND_NAME_X_RIGHT - SHADOW_OFFSET), SCREEN_SCALE_Y(COMMAND_NAME_Y + SHADOW_OFFSET + i * COMMAND_NAME_HEIGHT), wstr); #else - CFont::PrintString(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH-COMMAND_NAME_X_RIGHT) + SHADOW_OFFSET, SCREEN_SCALE_FROM_BOTTOM(DEFAULT_SCREEN_HEIGHT-COMMAND_NAME_Y) + SHADOW_OFFSET + i * COMMAND_NAME_HEIGHT), wstr); + CFont::PrintString(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH-COMMAND_NAME_X_RIGHT) + SHADOW_OFFSET, SCREEN_SCALE_FROM_BOTTOM(DEFAULT_SCREEN_HEIGHT-COMMAND_NAME_Y) + SHADOW_OFFSET + i * COMMAND_NAME_HEIGHT, wstr); #endif if (nCommandDrawn == m_nCurrentCommand) CFont::SetColor(CRGBA(156, 91, 40, 255)); @@ -340,7 +340,7 @@ void CSceneEdit::Draw(void) #ifdef FIX_BUGS CFont::PrintString(SCREEN_SCALE_FROM_RIGHT(COMMAND_NAME_X_RIGHT), SCREEN_SCALE_Y(COMMAND_NAME_Y + i * COMMAND_NAME_HEIGHT), wstr); #else - CFont::PrintString(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH-COMMAND_NAME_X_RIGHT), SCREEN_SCALE_FROM_BOTTOM(DEFAULT_SCREEN_HEIGHT-COMMAND_NAME_Y) + i * COMMAND_NAME_HEIGHT), wstr); + CFont::PrintString(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH-COMMAND_NAME_X_RIGHT), SCREEN_SCALE_FROM_BOTTOM(DEFAULT_SCREEN_HEIGHT-COMMAND_NAME_Y) + i * COMMAND_NAME_HEIGHT, wstr); #endif } } diff --git a/src/extras/custompipes.h b/src/extras/custompipes.h index ca3f0fb4..183b85da 100644 --- a/src/extras/custompipes.h +++ b/src/extras/custompipes.h @@ -134,4 +134,12 @@ void AttachRimPipe(rw::Clump *clump); } #endif + +namespace WorldRender{ +extern int numBlendInsts[3]; +void AtomicFirstPass(RpAtomic *atomic, int pass); +void AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha); +void RenderBlendPass(int pass); +} + #endif diff --git a/src/extras/custompipes_d3d9.cpp b/src/extras/custompipes_d3d9.cpp index a195a4cc..d0984ffe 100644 --- a/src/extras/custompipes_d3d9.cpp +++ b/src/extras/custompipes_d3d9.cpp @@ -2,8 +2,6 @@ #include "common.h" #ifdef RW_D3D9 -#ifdef EXTENDED_PIPELINES - #include "main.h" #include "RwHelper.h" #include "Lights.h" @@ -16,6 +14,8 @@ #include "World.h" #include "custompipes.h" +#ifdef EXTENDED_PIPELINES + #ifndef LIBRW #error "Need librw for EXTENDED_PIPELINES" #endif @@ -554,4 +554,168 @@ DestroyRimLightPipes(void) } #endif + +#ifdef NEW_RENDERER +#ifndef LIBRW +#error "Need librw for NEW_PIPELINES" +#endif + +namespace WorldRender +{ + +struct BuildingInst +{ + rw::RawMatrix combinedMat; + rw::d3d9::InstanceDataHeader *instHeader; + uint8 fadeAlpha; + bool lighting; +}; +BuildingInst blendInsts[3][2000]; +int numBlendInsts[3]; + +static RwRGBAReal black; + +static void +SetMatrix(BuildingInst *building, rw::Matrix *worldMat) +{ + using namespace rw; + RawMatrix world, worldview; + Camera *cam = engine->currentCamera; + convMatrix(&world, worldMat); + RawMatrix::mult(&worldview, &world, &cam->devView); + RawMatrix::mult(&building->combinedMat, &worldview, &cam->devProj); +} + +static bool +IsTextureTransparent(RwTexture *tex) +{ + if(tex == nil || tex->raster == nil) + return false; + return PLUGINOFFSET(rw::d3d::D3dRaster, tex->raster, rw::d3d::nativeRasterOffset)->hasAlpha; +} + +// Render all opaque meshes and put atomics that needs blending +// into the deferred list. +void +AtomicFirstPass(RpAtomic *atomic, int pass) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; + + atomic->getPipeline()->instance(atomic); + building->instHeader = (d3d9::InstanceDataHeader*)atomic->geometry->instData; + assert(building->instHeader != nil); + assert(building->instHeader->platform == PLATFORM_D3D9); + building->fadeAlpha = 255; + building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); + + bool setupDone = false; + bool defer = false; + SetMatrix(building, atomic->getFrame()->getLTM()); + + InstanceData *inst = building->instHeader->inst; + for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){ + Material *m = inst->material; + + if(inst->vertexAlpha || m->color.alpha != 255 || + IsTextureTransparent(m->texture)){ + defer = true; + continue; + } + + // alright we're rendering this atomic + if(!setupDone){ + setStreamSource(0, building->instHeader->vertexStream[0].vertexBuffer, 0, building->instHeader->vertexStream[0].stride); + setIndices(building->instHeader->indexBuffer); + setVertexDeclaration(building->instHeader->vertexDeclaration); + setVertexShader(default_amb_VS); + d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&building->combinedMat, 4); + if(building->lighting) + setAmbient(pAmbient->color); + else + setAmbient(black); + setupDone = true; + } + + setMaterial(m->color, m->surfaceProps); + + if(m->texture){ + d3d::setTexture(0, m->texture); + setPixelShader(default_tex_PS); + }else + setPixelShader(default_PS); + + drawInst(building->instHeader, inst); + } + if(defer) + numBlendInsts[pass]++; +} + +void +AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; + + atomic->getPipeline()->instance(atomic); + building->instHeader = (d3d9::InstanceDataHeader*)atomic->geometry->instData; + assert(building->instHeader != nil); + assert(building->instHeader->platform == PLATFORM_D3D9); + building->fadeAlpha = fadeAlpha; + building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); + SetMatrix(building, atomic->getFrame()->getLTM()); + numBlendInsts[pass]++; +} + +void +RenderBlendPass(int pass) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + setVertexShader(default_amb_VS); + + int i; + for(i = 0; i < numBlendInsts[pass]; i++){ + BuildingInst *building = &blendInsts[pass][i]; + + setStreamSource(0, building->instHeader->vertexStream[0].vertexBuffer, 0, building->instHeader->vertexStream[0].stride); + setIndices(building->instHeader->indexBuffer); + setVertexDeclaration(building->instHeader->vertexDeclaration); + d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&building->combinedMat, 4); + if(building->lighting) + setAmbient(pAmbient->color); + else + setAmbient(black); + + InstanceData *inst = building->instHeader->inst; + for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ + Material *m = inst->material; + if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255) + continue; // already done this one + + rw::RGBA color = m->color; + color.alpha = (color.alpha * building->fadeAlpha)/255; + setMaterial(color, m->surfaceProps); + + if(m->texture){ + d3d::setTexture(0, m->texture); + setPixelShader(default_tex_PS); + }else + setPixelShader(default_PS); + + drawInst(building->instHeader, inst); + } + } +} +} +#endif + #endif diff --git a/src/extras/custompipes_gl.cpp b/src/extras/custompipes_gl.cpp index 5f372530..67be4afd 100644 --- a/src/extras/custompipes_gl.cpp +++ b/src/extras/custompipes_gl.cpp @@ -1,8 +1,6 @@ #include "common.h" #ifdef RW_OPENGL -#ifdef EXTENDED_PIPELINES - #include "main.h" #include "RwHelper.h" #include "Lights.h" @@ -15,6 +13,8 @@ #include "World.h" #include "custompipes.h" +#ifdef EXTENDED_PIPELINES + #ifndef LIBRW #error "Need librw for EXTENDED_PIPELINES" #endif @@ -615,4 +615,171 @@ CustomPipeRegisterGL(void) } #endif + +#ifdef NEW_RENDERER +#ifndef LIBRW +#error "Need librw for NEW_PIPELINES" +#endif + +namespace WorldRender +{ + +struct BuildingInst +{ + rw::Matrix matrix; + rw::gl3::InstanceDataHeader *instHeader; + uint8 fadeAlpha; + bool lighting; +}; +BuildingInst blendInsts[3][2000]; +int numBlendInsts[3]; + +static RwRGBAReal black; + +static bool +IsTextureTransparent(RwTexture *tex) +{ + if(tex == nil || tex->raster == nil) + return false; + return PLUGINOFFSET(rw::gl3::Gl3Raster, tex->raster, rw::gl3::nativeRasterOffset)->hasAlpha; +} + +// Render all opaque meshes and put atomics that needs blending +// into the deferred list. +void +AtomicFirstPass(RpAtomic *atomic, int pass) +{ + using namespace rw; + using namespace rw::gl3; + + BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; + + atomic->getPipeline()->instance(atomic); + building->instHeader = (gl3::InstanceDataHeader*)atomic->geometry->instData; + assert(building->instHeader != nil); + assert(building->instHeader->platform == PLATFORM_GL3); + building->fadeAlpha = 255; + building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); + + WorldLights lights; + lights.numAmbients = 1; + lights.numDirectionals = 0; + lights.numLocals = 0; + if(building->lighting) + lights.ambient = pAmbient->color; + else + lights.ambient = black; + + bool setupDone = false; + bool defer = false; + building->matrix = *atomic->getFrame()->getLTM(); + + InstanceData *inst = building->instHeader->inst; + for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){ + Material *m = inst->material; + + if(inst->vertexAlpha || m->color.alpha != 255 || + IsTextureTransparent(m->texture)){ + defer = true; + continue; + } + + // alright we're rendering this atomic + if(!setupDone){ + defaultShader->use(); + setWorldMatrix(&building->matrix); +#ifdef RW_GL_USE_VAOS + glBindVertexArray(building->instHeader->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, building->instHeader->ibo); + glBindBuffer(GL_ARRAY_BUFFER, building->instHeader->vbo); + setAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); +#endif + setLights(&lights); + setupDone = true; + } + + setMaterial(m->color, m->surfaceProps); + + setTexture(0, m->texture); + + drawInst(building->instHeader, inst); + } +#ifndef RW_GL_USE_VAOS + disableAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); +#endif + if(defer) + numBlendInsts[pass]++; +} + +void +AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha) +{ + using namespace rw; + using namespace rw::gl3; + + BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; + + atomic->getPipeline()->instance(atomic); + building->instHeader = (gl3::InstanceDataHeader*)atomic->geometry->instData; + assert(building->instHeader != nil); + assert(building->instHeader->platform == PLATFORM_GL3); + building->fadeAlpha = fadeAlpha; + building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); + building->matrix = *atomic->getFrame()->getLTM(); + numBlendInsts[pass]++; +} + +void +RenderBlendPass(int pass) +{ + using namespace rw; + using namespace rw::gl3; + + defaultShader->use(); + WorldLights lights; + lights.numAmbients = 1; + lights.numDirectionals = 0; + lights.numLocals = 0; + + int i; + for(i = 0; i < numBlendInsts[pass]; i++){ + BuildingInst *building = &blendInsts[pass][i]; + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(building->instHeader->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, building->instHeader->ibo); + glBindBuffer(GL_ARRAY_BUFFER, building->instHeader->vbo); + setAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); +#endif + setWorldMatrix(&building->matrix); + if(building->lighting) + lights.ambient = pAmbient->color; + else + lights.ambient = black; + setLights(&lights); + + InstanceData *inst = building->instHeader->inst; + for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ + Material *m = inst->material; + if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255) + continue; // already done this one + + rw::RGBA color = m->color; + color.alpha = (color.alpha * building->fadeAlpha)/255; + setMaterial(color, m->surfaceProps); + + setTexture(0, m->texture); + + drawInst(building->instHeader, inst); + } +#ifndef RW_GL_USE_VAOS + disableAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); +#endif + } +} +} +#endif + #endif diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 660b05fe..91a34592 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -347,8 +347,6 @@ enum { PASS_BLEND // normal blend }; -static RwRGBAReal black; - static void SetStencilState(int state) { @@ -377,314 +375,6 @@ SetStencilState(int state) } } -#ifdef RW_D3D9 -struct BuildingInst -{ - rw::RawMatrix combinedMat; - rw::d3d9::InstanceDataHeader *instHeader; - uint8 fadeAlpha; - bool lighting; -}; -static BuildingInst blendInsts[3][2000]; -static int numBlendInsts[3]; - -static void -SetMatrix(BuildingInst *building, rw::Matrix *worldMat) -{ - using namespace rw; - RawMatrix world, worldview; - Camera *cam = engine->currentCamera; - convMatrix(&world, worldMat); - RawMatrix::mult(&worldview, &world, &cam->devView); - RawMatrix::mult(&building->combinedMat, &worldview, &cam->devProj); -} - -static bool -IsTextureTransparent(RwTexture *tex) -{ - if(tex == nil || tex->raster == nil) - return false; - return PLUGINOFFSET(rw::d3d::D3dRaster, tex->raster, rw::d3d::nativeRasterOffset)->hasAlpha; -} - -// Render all opaque meshes and put atomics that needs blending -// into the deferred list. -static void -AtomicFirstPass(RpAtomic *atomic, int pass) -{ - using namespace rw; - using namespace rw::d3d; - using namespace rw::d3d9; - - BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; - - atomic->getPipeline()->instance(atomic); - building->instHeader = (d3d9::InstanceDataHeader*)atomic->geometry->instData; - assert(building->instHeader != nil); - assert(building->instHeader->platform == PLATFORM_D3D9); - building->fadeAlpha = 255; - building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); - - bool setupDone = false; - bool defer = false; - SetMatrix(building, atomic->getFrame()->getLTM()); - - InstanceData *inst = building->instHeader->inst; - for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){ - Material *m = inst->material; - - if(inst->vertexAlpha || m->color.alpha != 255 || - IsTextureTransparent(m->texture)){ - defer = true; - continue; - } - - // alright we're rendering this atomic - if(!setupDone){ - setStreamSource(0, building->instHeader->vertexStream[0].vertexBuffer, 0, building->instHeader->vertexStream[0].stride); - setIndices(building->instHeader->indexBuffer); - setVertexDeclaration(building->instHeader->vertexDeclaration); - setVertexShader(default_amb_VS); - d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&building->combinedMat, 4); - if(building->lighting) - setAmbient(pAmbient->color); - else - setAmbient(black); - setupDone = true; - } - - setMaterial(m->color, m->surfaceProps); - - if(m->texture){ - d3d::setTexture(0, m->texture); - setPixelShader(default_tex_PS); - }else - setPixelShader(default_PS); - - drawInst(building->instHeader, inst); - } - if(defer) - numBlendInsts[pass]++; -} - -static void -AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha) -{ - using namespace rw; - using namespace rw::d3d; - using namespace rw::d3d9; - - BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; - - atomic->getPipeline()->instance(atomic); - building->instHeader = (d3d9::InstanceDataHeader*)atomic->geometry->instData; - assert(building->instHeader != nil); - assert(building->instHeader->platform == PLATFORM_D3D9); - building->fadeAlpha = fadeAlpha; - building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); - SetMatrix(building, atomic->getFrame()->getLTM()); - numBlendInsts[pass]++; -} - -static void -RenderBlendPass(int pass) -{ - using namespace rw; - using namespace rw::d3d; - using namespace rw::d3d9; - - setVertexShader(default_amb_VS); - - int i; - for(i = 0; i < numBlendInsts[pass]; i++){ - BuildingInst *building = &blendInsts[pass][i]; - - setStreamSource(0, building->instHeader->vertexStream[0].vertexBuffer, 0, building->instHeader->vertexStream[0].stride); - setIndices(building->instHeader->indexBuffer); - setVertexDeclaration(building->instHeader->vertexDeclaration); - d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&building->combinedMat, 4); - if(building->lighting) - setAmbient(pAmbient->color); - else - setAmbient(black); - - InstanceData *inst = building->instHeader->inst; - for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ - Material *m = inst->material; - if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255) - continue; // already done this one - - rw::RGBA color = m->color; - color.alpha = (color.alpha * building->fadeAlpha)/255; - setMaterial(color, m->surfaceProps); - - if(m->texture){ - d3d::setTexture(0, m->texture); - setPixelShader(default_tex_PS); - }else - setPixelShader(default_PS); - - drawInst(building->instHeader, inst); - } - } -} -#endif -#ifdef RW_GL3 -struct BuildingInst -{ - rw::Matrix matrix; - rw::gl3::InstanceDataHeader *instHeader; - uint8 fadeAlpha; - bool lighting; -}; -static BuildingInst blendInsts[3][2000]; -static int numBlendInsts[3]; - -static bool -IsTextureTransparent(RwTexture *tex) -{ - if(tex == nil || tex->raster == nil) - return false; - return PLUGINOFFSET(rw::gl3::Gl3Raster, tex->raster, rw::gl3::nativeRasterOffset)->hasAlpha; -} - -// Render all opaque meshes and put atomics that needs blending -// into the deferred list. -static void -AtomicFirstPass(RpAtomic *atomic, int pass) -{ - using namespace rw; - using namespace rw::gl3; - - BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; - - atomic->getPipeline()->instance(atomic); - building->instHeader = (gl3::InstanceDataHeader*)atomic->geometry->instData; - assert(building->instHeader != nil); - assert(building->instHeader->platform == PLATFORM_GL3); - building->fadeAlpha = 255; - building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); - - WorldLights lights; - lights.numAmbients = 1; - lights.numDirectionals = 0; - lights.numLocals = 0; - if(building->lighting) - lights.ambient = pAmbient->color; - else - lights.ambient = black; - - bool setupDone = false; - bool defer = false; - building->matrix = *atomic->getFrame()->getLTM(); - - InstanceData *inst = building->instHeader->inst; - for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){ - Material *m = inst->material; - - if(inst->vertexAlpha || m->color.alpha != 255 || - IsTextureTransparent(m->texture)){ - defer = true; - continue; - } - - // alright we're rendering this atomic - if(!setupDone){ - defaultShader->use(); - setWorldMatrix(&building->matrix); -#ifdef RW_GL_USE_VAOS - glBindVertexArray(building->instHeader->vao); -#else - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, building->instHeader->ibo); - glBindBuffer(GL_ARRAY_BUFFER, building->instHeader->vbo); - setAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); -#endif - setLights(&lights); - setupDone = true; - } - - setMaterial(m->color, m->surfaceProps); - - setTexture(0, m->texture); - - drawInst(building->instHeader, inst); - } -#ifndef RW_GL_USE_VAOS - disableAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); -#endif - if(defer) - numBlendInsts[pass]++; -} - -static void -AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha) -{ - using namespace rw; - using namespace rw::gl3; - - BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; - - atomic->getPipeline()->instance(atomic); - building->instHeader = (gl3::InstanceDataHeader*)atomic->geometry->instData; - assert(building->instHeader != nil); - assert(building->instHeader->platform == PLATFORM_GL3); - building->fadeAlpha = fadeAlpha; - building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); - building->matrix = *atomic->getFrame()->getLTM(); - numBlendInsts[pass]++; -} - -static void -RenderBlendPass(int pass) -{ - using namespace rw; - using namespace rw::gl3; - - defaultShader->use(); - WorldLights lights; - lights.numAmbients = 1; - lights.numDirectionals = 0; - lights.numLocals = 0; - - int i; - for(i = 0; i < numBlendInsts[pass]; i++){ - BuildingInst *building = &blendInsts[pass][i]; - -#ifdef RW_GL_USE_VAOS - glBindVertexArray(building->instHeader->vao); -#else - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, building->instHeader->ibo); - glBindBuffer(GL_ARRAY_BUFFER, building->instHeader->vbo); - setAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); -#endif - setWorldMatrix(&building->matrix); - if(building->lighting) - lights.ambient = pAmbient->color; - else - lights.ambient = black; - setLights(&lights); - - InstanceData *inst = building->instHeader->inst; - for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ - Material *m = inst->material; - if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255) - continue; // already done this one - - rw::RGBA color = m->color; - color.alpha = (color.alpha * building->fadeAlpha)/255; - setMaterial(color, m->surfaceProps); - - setTexture(0, m->texture); - - drawInst(building->instHeader, inst); - } -#ifndef RW_GL_USE_VAOS - disableAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); -#endif - } -} -#endif - void CRenderer::RenderOneBuilding(CEntity *ent, float camdist) { @@ -715,16 +405,16 @@ CRenderer::RenderOneBuilding(CEntity *ent, float camdist) alpha = mi->m_alpha * fadefactor; if(alpha == 255) - AtomicFirstPass(atomic, pass); + WorldRender::AtomicFirstPass(atomic, pass); else{ // not quite sure what this is about, do we have to do that? RpGeometry *geo = RpAtomicGetGeometry(lodatm); if(geo != RpAtomicGetGeometry(atomic)) RpAtomicSetGeometry(atomic, geo, rpATOMICSAMEBOUNDINGSPHERE); - AtomicFullyTransparent(atomic, pass, alpha); + WorldRender::AtomicFullyTransparent(atomic, pass, alpha); } }else - AtomicFirstPass(atomic, pass); + WorldRender::AtomicFirstPass(atomic, pass); ent->bImBeingRendered = false; // TODO: this seems wrong, but do we even need it? } @@ -779,16 +469,16 @@ CRenderer::RenderWorld(int pass) RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, FALSE); - RenderBlendPass(PASS_NOZ); + WorldRender::RenderBlendPass(PASS_NOZ); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); break; case 2: // Transparent RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE); - RenderBlendPass(PASS_ADD); + WorldRender::RenderBlendPass(PASS_ADD); RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); - RenderBlendPass(PASS_BLEND); + WorldRender::RenderBlendPass(PASS_BLEND); break; } } @@ -872,9 +562,9 @@ CRenderer::ClearForFrame(void) ms_nNoOfInVisibleEntities = 0; gSortedVehiclesAndPeds.Clear(); - numBlendInsts[PASS_NOZ] = 0; - numBlendInsts[PASS_ADD] = 0; - numBlendInsts[PASS_BLEND] = 0; + WorldRender::numBlendInsts[PASS_NOZ] = 0; + WorldRender::numBlendInsts[PASS_ADD] = 0; + WorldRender::numBlendInsts[PASS_BLEND] = 0; } #endif From 203dff9165d473d030d8945ef80f1c12350662cf Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sat, 9 Jan 2021 20:33:21 +0300 Subject: [PATCH 26/68] script --- src/animation/CutsceneMgr.cpp | 2 ++ src/control/Script.cpp | 6 ++--- src/control/Script3.cpp | 6 ++--- src/control/Script4.cpp | 15 ++++++------ src/control/Script6.cpp | 4 ---- src/control/Script7.cpp | 21 +++++++++++++++-- src/control/Script8.cpp | 44 ++++++++++++++++++++++++----------- src/core/Game.cpp | 2 +- src/text/Text.cpp | 2 +- src/vehicles/Bike.cpp | 2 +- 10 files changed, 68 insertions(+), 36 deletions(-) diff --git a/src/animation/CutsceneMgr.cpp b/src/animation/CutsceneMgr.cpp index eeec2728..88c73661 100644 --- a/src/animation/CutsceneMgr.cpp +++ b/src/animation/CutsceneMgr.cpp @@ -431,6 +431,7 @@ CCutsceneMgr::DeleteCutsceneData(void) } ms_numCutsceneObjs = 0; + /* TODO!!! tmp hack for (int i = MI_SPECIAL01; i < MI_SPECIAL21; i++) { CBaseModelInfo *minfo = CModelInfo::GetModelInfo(i); CColModel *colModel = minfo->GetColModel(); @@ -439,6 +440,7 @@ CCutsceneMgr::DeleteCutsceneData(void) minfo->SetColModel(&CTempColModels::ms_colModelPed1); } } + */ if (ms_animLoaded) CAnimManager::RemoveLastAnimFile(); diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 5fbf5779..df851daa 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -2385,7 +2385,7 @@ int32* GetPointerToScriptVariableForDebug(CRunningScript* pScript, uint32* pIp, script_assert(size > 0); script_assert(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id] < size); uint8 index = Min(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id], size - 1); - sprintf(tmpstr, " $%d[%d@]", ((int)(type - ARGUMENT_GLOBAL_ARRAY) << 8) + index_in_block, index_id); + sprintf(tmpstr, " $%d[%d@ (%d)]", ((int)(type - ARGUMENT_GLOBAL_ARRAY) << 8) + index_in_block, index_id, pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id]); strcat(buf, tmpstr); return (int32*)&CTheScripts::ScriptSpace[4 * (((int)(type - ARGUMENT_GLOBAL_ARRAY) << 8) + index + index_in_block)]; } @@ -2401,7 +2401,7 @@ int32* GetPointerToScriptVariableForDebug(CRunningScript* pScript, uint32* pIp, script_assert(size > 0); script_assert(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id] < size); uint8 index = Min(pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id], size - 1); - sprintf(tmpstr, " %d@[%d@]", (type - ARGUMENT_LOCAL_ARRAY), index_id); + sprintf(tmpstr, " %d@[%d@ (%d)]", (type - ARGUMENT_LOCAL_ARRAY), index_id, pScript->m_anLocalVariables[pScript->m_nLocalsPointer + index_id]); strcat(buf, tmpstr); return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL_ARRAY) + index]; } @@ -2412,7 +2412,7 @@ int32* GetPointerToScriptVariableForDebug(CRunningScript* pScript, uint32* pIp, } else { assert(type >= ARGUMENT_TIMER); - sprintf(tmpstr, " TIMER%d@", (type - ARGUMENT_LOCAL_ARRAY)); + sprintf(tmpstr, " TIMER%d@", (type - ARGUMENT_TIMER)); strcat(buf, tmpstr); return &pScript->m_anLocalVariables[NUM_LOCAL_VARS + 8 + (type - ARGUMENT_TIMER)]; // why 8? } diff --git a/src/control/Script3.cpp b/src/control/Script3.cpp index 26e1187d..0134df00 100644 --- a/src/control/Script3.cpp +++ b/src/control/Script3.cpp @@ -1787,10 +1787,9 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) pBoat->AutoPilot.m_nCruiseSpeed = *(float*)&ScriptParams[1]; return 0; } - /* case COMMAND_GET_RANDOM_CHAR_IN_AREA: { - CollectParameters(&m_nIp, 4); + CollectParameters(&m_nIp, 7); int ped_handle = -1; CVector pos = FindPlayerCoors(); float x1 = *(float*)&ScriptParams[0]; @@ -1814,7 +1813,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) continue; // if (pPed->GetModelIndex() == MI_SCUM_WOM || pPed->GetModelIndex() == MI_SCUM_MAN) // continue; - if (!ThisIsAValidRandomPed(pPed->m_nPedType)) + if (!ThisIsAValidRandomPed(pPed->m_nPedType, ScriptParams[5], ScriptParams[6], ScriptParams[7])) // TODO continue; if (pPed->bIsLeader || pPed->m_leader) continue; @@ -1836,7 +1835,6 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) StoreParameters(&m_nIp, 1); return 0; } - */ case COMMAND_GET_RANDOM_CHAR_IN_ZONE: { char zone[KEY_LENGTH_IN_SCRIPT]; diff --git a/src/control/Script4.cpp b/src/control/Script4.cpp index 64928e7a..a8cc9b9c 100644 --- a/src/control/Script4.cpp +++ b/src/control/Script4.cpp @@ -954,7 +954,10 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) pPed->WarpPedIntoCar(pVehicle); return 0; } - //case COMMAND_SWITCH_CAR_RADIO: + case COMMAND_SWITCH_CAR_RADIO: + CollectParameters(&m_nIp, 1); + DMAudio.ChangeMusicMode(ScriptParams[0]); + return 0; //case COMMAND_SET_AUDIO_STREAM: case COMMAND_PRINT_WITH_2_NUMBERS_BIG: { @@ -1418,7 +1421,6 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) pVehicle->m_bSirenOrAlarm = ScriptParams[1] != 0; return 0; } - /* case COMMAND_SWITCH_PED_ROADS_ON_ANGLED: { CollectParameters(&m_nIp, 7); @@ -1441,7 +1443,6 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) ThePaths.SwitchRoadsInAngledArea(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1], *(float*)&ScriptParams[2], *(float*)&ScriptParams[3], *(float*)&ScriptParams[4], *(float*)&ScriptParams[5], *(float*)&ScriptParams[6], 1, 0); return 0; - */ case COMMAND_SET_CAR_WATERTIGHT: { CollectParameters(&m_nIp, 2); @@ -1967,12 +1968,10 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) CWorld::Add(car); return 0; } - /* case COMMAND_IS_COLLISION_IN_MEMORY: CollectParameters(&m_nIp, 1); UpdateCompareFlag(CCollision::ms_collisionInMemory == ScriptParams[0]); return 0; - */ case COMMAND_SET_WANTED_MULTIPLIER: CollectParameters(&m_nIp, 1); FindPlayerPed()->m_pWanted->m_fCrimeSensitivity = *(float*)&ScriptParams[0]; @@ -2042,7 +2041,8 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_HAS_MISSION_AUDIO_LOADED: { CollectParameters(&m_nIp, 1); - UpdateCompareFlag(DMAudio.GetMissionAudioLoadingStatus(ScriptParams[0] - 1) == 1); + //UpdateCompareFlag(DMAudio.GetMissionAudioLoadingStatus(ScriptParams[0] - 1) == 1); + UpdateCompareFlag(true); // TODO return 0; } case COMMAND_PLAY_MISSION_AUDIO: @@ -2052,7 +2052,8 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) case COMMAND_HAS_MISSION_AUDIO_FINISHED: { CollectParameters(&m_nIp, 1); - UpdateCompareFlag(DMAudio.IsMissionAudioSampleFinished(ScriptParams[0] - 1)); + //UpdateCompareFlag(DMAudio.IsMissionAudioSampleFinished(ScriptParams[0] - 1)); // TODO + UpdateCompareFlag(true); return 0; } case COMMAND_GET_CLOSEST_CAR_NODE_WITH_HEADING: diff --git a/src/control/Script6.cpp b/src/control/Script6.cpp index 8915a089..02427eed 100644 --- a/src/control/Script6.cpp +++ b/src/control/Script6.cpp @@ -83,7 +83,6 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) { switch (command) { //case COMMAND_FLASH_RADAR_BLIP: - /* case COMMAND_IS_CHAR_IN_CONTROL: { CollectParameters(&m_nIp, 1); @@ -91,7 +90,6 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) UpdateCompareFlag(pPed->IsPedInControl()); return 0; } - */ case COMMAND_SET_GENERATE_CARS_AROUND_CAMERA: CollectParameters(&m_nIp, 1); CCarCtrl::bCarsGeneratedAroundCamera = (ScriptParams[0] != 0); @@ -525,7 +523,6 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) StoreParameters(&m_nIp, 1); return 0; } - /* case COMMAND_MARK_ROADS_BETWEEN_LEVELS: { CollectParameters(&m_nIp, 6); @@ -574,7 +571,6 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) ThePaths.PedMarkRoadsBetweenLevelsInArea(infX, supX, infY, supY, infZ, supZ); return 0; } - */ case COMMAND_SET_CAR_AVOID_LEVEL_TRANSITIONS: { CollectParameters(&m_nIp, 2); diff --git a/src/control/Script7.cpp b/src/control/Script7.cpp index 344ea2c7..220a7c4d 100644 --- a/src/control/Script7.cpp +++ b/src/control/Script7.cpp @@ -816,7 +816,12 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) //case COMMAND_HAS_CHAR_BEEN_DAMAGED_BY_CAR: //case COMMAND_HAS_CAR_BEEN_DAMAGED_BY_CHAR: //case COMMAND_HAS_CAR_BEEN_DAMAGED_BY_CAR: - //case COMMAND_GET_RADIO_CHANNEL: + case COMMAND_GET_RADIO_CHANNEL: + { + // TODO + ScriptParams[0] = -1; + StoreParameters(&m_nIp, 1); + } //case COMMAND_DISPLAY_TEXT_WITH_3_NUMBERS: //case COMMAND_IS_CAR_DROWNING_IN_WATER: case COMMAND_IS_CHAR_DROWNING_IN_WATER: @@ -1327,7 +1332,19 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) CollectParameters(&m_nIp, 1); UpdateCompareFlag(CPools::GetPedPool()->GetAt(ScriptParams[0]) != 0); return 0; - //case COMMAND_DOES_VEHICLE_EXIST: + case COMMAND_DOES_VEHICLE_EXIST: + { + // TODO + CollectParameters(&m_nIp, 1); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + bool bExist = false; + if (pVehicle) { + int index = CPools::GetVehiclePool()->GetJustIndex_NoFreeAssert(pVehicle); + bExist = (index >= 0 && index <= NUMVEHICLES); // TODO: FIX_BUGS + } + UpdateCompareFlag(bExist); + return 0; + } //case COMMAND_ADD_SHORT_RANGE_BLIP_FOR_CONTACT_POINT: case COMMAND_ADD_SHORT_RANGE_SPRITE_BLIP_FOR_CONTACT_POINT: { diff --git a/src/control/Script8.cpp b/src/control/Script8.cpp index 63102d24..f41ef8a4 100644 --- a/src/control/Script8.cpp +++ b/src/control/Script8.cpp @@ -421,7 +421,10 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) script_assert(false); return 0; case COMMAND_1451: - script_assert(false); + CollectParameters(&m_nIp, 1); + // TODO (GET_PAD_BUTTON_STATE) + ScriptParams[0] = 0; + StoreParameters(&m_nIp, 1); return 0; case COMMAND_1452: script_assert(false); @@ -518,7 +521,8 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) script_assert(false); return 0; case COMMAND_1479: - script_assert(false); + CollectParameters(&m_nIp, 2); + // TODO (SET_CHAR_ONLY_ENTER_BACK_DOOR) return 0; case COMMAND_1480: script_assert(false); @@ -644,7 +648,8 @@ int8 CRunningScript::ProcessCommands1500To1599(int32 command) script_assert(false); return 0; case COMMAND_1518: - script_assert(false); + // TODO (?) + UpdateCompareFlag(true); return 0; case COMMAND_1519: CollectParameters(&m_nIp, 1); @@ -768,7 +773,8 @@ int8 CRunningScript::ProcessCommands1500To1599(int32 command) script_assert(false); return 0; case COMMAND_1558: - script_assert(false); + UpdateCompareFlag(false); + // TODO return 0; case COMMAND_1559: script_assert(false); @@ -778,7 +784,8 @@ int8 CRunningScript::ProcessCommands1500To1599(int32 command) UpdateCompareFlag(false); return 0; case COMMAND_1561: - script_assert(false); + // TODO (check, SET_FS_DESTROYED_FLAG) + CTheScripts::FSDestroyedFlag = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - (int32*)CTheScripts::ScriptSpace; return 0; case COMMAND_1562: script_assert(false); @@ -796,7 +803,8 @@ int8 CRunningScript::ProcessCommands1500To1599(int32 command) script_assert(false); return 0; case COMMAND_1567: - script_assert(false); + CollectParameters(&m_nIp, 1); + // TODO (BUILD_WORLD_GEOMETRY) return 0; case COMMAND_1568: script_assert(false); @@ -927,7 +935,8 @@ int8 CRunningScript::ProcessCommands1600To1699(int32 command) script_assert(false); return 0; case COMMAND_1607: - script_assert(false); + CollectParameters(&m_nIp, 1); + // TODO (SET_TOTAL_CARS_FOR_EXPORT) return 0; case COMMAND_1608: script_assert(false); @@ -951,10 +960,11 @@ int8 CRunningScript::ProcessCommands1600To1699(int32 command) script_assert(false); return 0; case COMMAND_1615: - script_assert(false); + // TODO (GET_DEVELOPER_FLAG?) + UpdateCompareFlag(false); return 0; case COMMAND_1616: - script_assert(false); + // TODO (SET_DEVELOPER_FLAG) return 0; case COMMAND_1617: script_assert(false); @@ -969,8 +979,12 @@ int8 CRunningScript::ProcessCommands1600To1699(int32 command) script_assert(false); return 0; case COMMAND_1621: - script_assert(false); + { + wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); + CollectParameters(&m_nIp, 2); + // TODO (SET_SUBTITLE_TEXT) return 0; + } case COMMAND_1622: script_assert(false); return 0; @@ -1035,7 +1049,8 @@ int8 CRunningScript::ProcessCommands1600To1699(int32 command) // TODO (LOCK_GARAGE?) return 0; case COMMAND_1641: - script_assert(false); + // TODO + UpdateCompareFlag(true); return 0; case COMMAND_1642: script_assert(false); @@ -1054,14 +1069,17 @@ int8 CRunningScript::ProcessCommands1600To1699(int32 command) // TODO (DISABLE_PAUSE_MENU?) return 0; case COMMAND_1647: - script_assert(false); + CollectParameters(&m_nIp, 1); + // TODO (IS_CHANNEL_PLAYING?) + UpdateCompareFlag(false); return 0; case COMMAND_1648: CollectParameters(&m_nIp, 3); // TODO (SET_CLOCK_EVENT_WARNING); return 0; case COMMAND_1649: - script_assert(false); + CollectParameters(&m_nIp, 3); + // TODO (SET_EXTRA_COLOUR_DIRECTION) return 0; case COMMAND_1650: script_assert(false); diff --git a/src/core/Game.cpp b/src/core/Game.cpp index 636eed42..c5154bd4 100644 --- a/src/core/Game.cpp +++ b/src/core/Game.cpp @@ -901,7 +901,7 @@ void CGame::Process(void) if (!CReplay::IsPlayingBack()) CCranes::UpdateCranes(); CClouds::Update(); - CMovingThings::Update(); + //CMovingThings::Update(); // TODO CWaterCannons::Update(); CUserDisplay::Process(); CReplay::Update(); diff --git a/src/text/Text.cpp b/src/text/Text.cpp index a11acd26..fd1659dc 100644 --- a/src/text/Text.cpp +++ b/src/text/Text.cpp @@ -247,7 +247,7 @@ CText::LoadMissionText(char *MissionTableName) CFileMgr::SetDir("TEXT"); switch (FrontEndMenuManager.m_PrefsLanguage) { case CMenuManager::LANGUAGE_AMERICAN: - sprintf(filename, "AMERICAN.GXT"); + sprintf(filename, "ENGLISH.GXT"); break; case CMenuManager::LANGUAGE_FRENCH: sprintf(filename, "FRENCH.GXT"); diff --git a/src/vehicles/Bike.cpp b/src/vehicles/Bike.cpp index 19e95a6e..531128be 100644 --- a/src/vehicles/Bike.cpp +++ b/src/vehicles/Bike.cpp @@ -83,7 +83,7 @@ CBike::CBike(int32 id, uint8 CreatedBy) case MI_SANCHEZ: m_bikeAnimType = ASSOCGRP_BIKE_DIRT; break; - default: assert(0 && "invalid bike model ID"); + default: m_bikeAnimType = ASSOCGRP_BIKE_STANDARD; //assert(0 && "invalid bike model ID"); // TODO } m_vehType = VEHICLE_TYPE_BIKE; From 03c5fdef4391b403955120aeb74e687c0a2c9578 Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 9 Jan 2021 19:20:32 +0100 Subject: [PATCH 27/68] moved new renderer; implemented leeds building rendering --- src/core/main.cpp | 2 +- src/extras/custompipes.h | 7 + src/extras/custompipes_d3d9.cpp | 187 +++++++++++- src/extras/custompipes_gl.cpp | 187 +++++++++++- src/extras/shaders/leedsBuilding.vert | 4 +- src/extras/shaders/leedsBuilding_VS.cso | Bin 628 -> 676 bytes src/extras/shaders/leedsBuilding_VS.hlsl | 5 +- src/extras/shaders/leedsBuilding_VS.inc | 68 +++-- src/extras/shaders/leedsBuilding_vs_gl.inc | 4 +- src/render/Renderer.cpp | 328 +-------------------- 10 files changed, 435 insertions(+), 357 deletions(-) diff --git a/src/core/main.cpp b/src/core/main.cpp index d9579fee..ea6f25ec 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -124,7 +124,7 @@ bool gbPrintMemoryUsage; #endif #ifdef NEW_RENDERER -bool gbNewRenderer; +bool gbNewRenderer = true; #endif #ifdef FIX_BUGS // need to clear stencil for mblur fx. no idea why it works in the original game diff --git a/src/extras/custompipes.h b/src/extras/custompipes.h index ca3f0fb4..f9181fe9 100644 --- a/src/extras/custompipes.h +++ b/src/extras/custompipes.h @@ -133,5 +133,12 @@ void AttachRimPipe(rw::Clump *clump); } +namespace WorldRender{ +extern int numBlendInsts[3]; +void AtomicFirstPass(RpAtomic *atomic, int pass); +void AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha); +void RenderBlendPass(int pass); +} + #endif #endif diff --git a/src/extras/custompipes_d3d9.cpp b/src/extras/custompipes_d3d9.cpp index 57f364a3..d2d50bca 100644 --- a/src/extras/custompipes_d3d9.cpp +++ b/src/extras/custompipes_d3d9.cpp @@ -201,7 +201,6 @@ worldRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) using namespace rw::d3d; using namespace rw::d3d9; - int vsBits; setStreamSource(0, header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); setIndices(header->indexBuffer); setVertexDeclaration(header->vertexDeclaration); @@ -547,5 +546,191 @@ DestroyRimLightPipes(void) } +#ifdef NEW_RENDERER + +namespace WorldRender +{ + +struct BuildingInst +{ + rw::RawMatrix combinedMat; + rw::d3d9::InstanceDataHeader *instHeader; + uint8 fadeAlpha; + bool lighting; +}; +BuildingInst blendInsts[3][2000]; +int numBlendInsts[3]; + +static RwRGBAReal black; + +static void +SetMatrix(BuildingInst *building, rw::Matrix *worldMat) +{ + using namespace rw; + RawMatrix world, worldview; + Camera *cam = engine->currentCamera; + convMatrix(&world, worldMat); + RawMatrix::mult(&worldview, &world, &cam->devView); + RawMatrix::mult(&building->combinedMat, &worldview, &cam->devProj); +} + +static bool +IsTextureTransparent(RwTexture *tex) +{ + if(tex == nil || tex->raster == nil) + return false; + return PLUGINOFFSET(rw::d3d::D3dRaster, tex->raster, rw::d3d::nativeRasterOffset)->hasAlpha; +} + +// Render all opaque meshes and put atomics that needs blending +// into the deferred list. +void +AtomicFirstPass(RpAtomic *atomic, int pass) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; + + atomic->getPipeline()->instance(atomic); + building->instHeader = (d3d9::InstanceDataHeader*)atomic->geometry->instData; + assert(building->instHeader != nil); + assert(building->instHeader->platform == PLATFORM_D3D9); + building->fadeAlpha = 255; + building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); + + bool setupDone = false; + bool defer = false; + SetMatrix(building, atomic->getFrame()->getLTM()); + + float colorscale[4]; + + InstanceData *inst = building->instHeader->inst; + for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){ + Material *m = inst->material; + + if(inst->vertexAlpha || m->color.alpha != 255 || + IsTextureTransparent(m->texture)){ + defer = true; + continue; + } + + // alright we're rendering this atomic + if(!setupDone){ + setStreamSource(0, building->instHeader->vertexStream[0].vertexBuffer, 0, building->instHeader->vertexStream[0].stride); + setIndices(building->instHeader->indexBuffer); + setVertexDeclaration(building->instHeader->vertexDeclaration); + setVertexShader(CustomPipes::leedsBuilding_VS); + setPixelShader(CustomPipes::scale_PS); + d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&building->combinedMat, 4); + + RGBAf amb, emiss; + amb.red = CTimeCycle::GetAmbientRed(); + amb.green = CTimeCycle::GetAmbientGreen(); + amb.blue = CTimeCycle::GetAmbientBlue(); + amb.alpha = 1.0f; + emiss = pAmbient->color; + + d3ddevice->SetVertexShaderConstantF(CustomPipes::VSLOC_ambient, (float*)&amb, 1); + d3ddevice->SetVertexShaderConstantF(CustomPipes::VSLOC_emissive, (float*)&emiss, 1); + + colorscale[3] = 1.0f; + + setupDone = true; + } + + float cs = 1.0f; + if(m->texture) + cs = 255/128.0f; + colorscale[0] = colorscale[1] = colorscale[2] = cs; + d3ddevice->SetPixelShaderConstantF(CustomPipes::PSLOC_colorscale, colorscale, 1); + + if(m->texture) + d3d::setTexture(0, m->texture); + else + d3d::setTexture(0, gpWhiteTexture); // actually we don't even render this + + setMaterial(m->color, m->surfaceProps, 0.5f); + + drawInst(building->instHeader, inst); + } + if(defer) + numBlendInsts[pass]++; +} + +void +AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; + + atomic->getPipeline()->instance(atomic); + building->instHeader = (d3d9::InstanceDataHeader*)atomic->geometry->instData; + assert(building->instHeader != nil); + assert(building->instHeader->platform == PLATFORM_D3D9); + building->fadeAlpha = fadeAlpha; + building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); + SetMatrix(building, atomic->getFrame()->getLTM()); + numBlendInsts[pass]++; +} + +void +RenderBlendPass(int pass) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + setVertexShader(CustomPipes::leedsBuilding_VS); + setPixelShader(CustomPipes::scale_PS); + + float colorscale[4]; + colorscale[3] = 1.0f; + + int i; + for(i = 0; i < numBlendInsts[pass]; i++){ + BuildingInst *building = &blendInsts[pass][i]; + + setStreamSource(0, building->instHeader->vertexStream[0].vertexBuffer, 0, building->instHeader->vertexStream[0].stride); + setIndices(building->instHeader->indexBuffer); + setVertexDeclaration(building->instHeader->vertexDeclaration); + d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&building->combinedMat, 4); + if(building->lighting) + setAmbient(pAmbient->color); + else + setAmbient(black); + + InstanceData *inst = building->instHeader->inst; + for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ + Material *m = inst->material; + if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255) + continue; // already done this one + + float cs = 1.0f; + if(m->texture) + cs = 255/128.0f; + colorscale[0] = colorscale[1] = colorscale[2] = cs; + d3ddevice->SetPixelShaderConstantF(CustomPipes::PSLOC_colorscale, colorscale, 1); + + if(m->texture) + d3d::setTexture(0, m->texture); + else + d3d::setTexture(0, gpWhiteTexture); // actually we don't even render this + + rw::RGBA color = m->color; + color.alpha = (color.alpha * building->fadeAlpha)/255; + setMaterial(m->color, m->surfaceProps, 0.5f); + + drawInst(building->instHeader, inst); + } + } +} +} +#endif + #endif #endif diff --git a/src/extras/custompipes_gl.cpp b/src/extras/custompipes_gl.cpp index a222f5e9..193a4ac6 100644 --- a/src/extras/custompipes_gl.cpp +++ b/src/extras/custompipes_gl.cpp @@ -245,7 +245,7 @@ worldRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) setTexture(0, m->texture); - setMaterial(m->color, m->surfaceProps); + setMaterial(m->color, m->surfaceProps, 0.5f); rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); @@ -616,5 +616,190 @@ CustomPipeRegisterGL(void) } +#ifdef NEW_RENDERER + +namespace WorldRender +{ + +struct BuildingInst +{ + rw::Matrix matrix; + rw::gl3::InstanceDataHeader *instHeader; + uint8 fadeAlpha; + bool lighting; +}; +BuildingInst blendInsts[3][2000]; +int numBlendInsts[3]; + +static RwRGBAReal black; + +static bool +IsTextureTransparent(RwTexture *tex) +{ + if(tex == nil || tex->raster == nil) + return false; + return PLUGINOFFSET(rw::gl3::Gl3Raster, tex->raster, rw::gl3::nativeRasterOffset)->hasAlpha; +} + +// Render all opaque meshes and put atomics that needs blending +// into the deferred list. +void +AtomicFirstPass(RpAtomic *atomic, int pass) +{ + using namespace rw; + using namespace rw::gl3; + + BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; + + atomic->getPipeline()->instance(atomic); + building->instHeader = (gl3::InstanceDataHeader*)atomic->geometry->instData; + assert(building->instHeader != nil); + assert(building->instHeader->platform == PLATFORM_GL3); + building->fadeAlpha = 255; + building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); + + bool setupDone = false; + bool defer = false; + building->matrix = *atomic->getFrame()->getLTM(); + + float colorscale[4]; + + InstanceData *inst = building->instHeader->inst; + for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){ + Material *m = inst->material; + + if(inst->vertexAlpha || m->color.alpha != 255 || + IsTextureTransparent(m->texture)){ + defer = true; + continue; + } + + // alright we're rendering this atomic + if(!setupDone){ + CustomPipes::leedsWorldShader->use(); +// defaultShader->use(); + setWorldMatrix(&building->matrix); +#ifdef RW_GL_USE_VAOS + glBindVertexArray(building->instHeader->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, building->instHeader->ibo); + glBindBuffer(GL_ARRAY_BUFFER, building->instHeader->vbo); + setAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); +#endif + + RGBAf amb, emiss; + amb.red = CTimeCycle::GetAmbientRed(); + amb.green = CTimeCycle::GetAmbientGreen(); + amb.blue = CTimeCycle::GetAmbientBlue(); + amb.alpha = 1.0f; + emiss = pAmbient->color; + + glUniform4fv(U(CustomPipes::u_amb), 1, (float*)&amb); + glUniform4fv(U(CustomPipes::u_emiss), 1, (float*)&emiss); + + colorscale[3] = 1.0f; + + setupDone = true; + } + + setMaterial(m->color, m->surfaceProps, 0.5f); + + float cs = 1.0f; + if(m->texture) + cs = 255/128.0f; + colorscale[0] = colorscale[1] = colorscale[2] = cs; + glUniform4fv(U(CustomPipes::u_colorscale), 1, colorscale); + + setTexture(0, m->texture); + + drawInst(building->instHeader, inst); + } +#ifndef RW_GL_USE_VAOS + disableAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); +#endif + if(defer) + numBlendInsts[pass]++; +} + +void +AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha) +{ + using namespace rw; + using namespace rw::gl3; + + BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; + + atomic->getPipeline()->instance(atomic); + building->instHeader = (gl3::InstanceDataHeader*)atomic->geometry->instData; + assert(building->instHeader != nil); + assert(building->instHeader->platform == PLATFORM_GL3); + building->fadeAlpha = fadeAlpha; + building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); + building->matrix = *atomic->getFrame()->getLTM(); + numBlendInsts[pass]++; +} + +void +RenderBlendPass(int pass) +{ + using namespace rw; + using namespace rw::gl3; + + CustomPipes::leedsWorldShader->use(); + + RGBAf amb, emiss; + amb.red = CTimeCycle::GetAmbientRed(); + amb.green = CTimeCycle::GetAmbientGreen(); + amb.blue = CTimeCycle::GetAmbientBlue(); + amb.alpha = 1.0f; + emiss = pAmbient->color; + + glUniform4fv(U(CustomPipes::u_amb), 1, (float*)&amb); + glUniform4fv(U(CustomPipes::u_emiss), 1, (float*)&emiss); + + float colorscale[4]; + colorscale[3] = 1.0f; + + int i; + for(i = 0; i < numBlendInsts[pass]; i++){ + BuildingInst *building = &blendInsts[pass][i]; + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(building->instHeader->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, building->instHeader->ibo); + glBindBuffer(GL_ARRAY_BUFFER, building->instHeader->vbo); + setAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); +#endif + setWorldMatrix(&building->matrix); + + InstanceData *inst = building->instHeader->inst; + for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ + Material *m = inst->material; + if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255) + continue; // already done this one + + rw::RGBA color = m->color; + color.alpha = (color.alpha * building->fadeAlpha)/255; + setMaterial(color, m->surfaceProps, 0.5f); + + float cs = 1.0f; + if(m->texture) + cs = 255/128.0f; + colorscale[0] = colorscale[1] = colorscale[2] = cs; + glUniform4fv(U(CustomPipes::u_colorscale), 1, colorscale); + + setTexture(0, m->texture); + + drawInst(building->instHeader, inst); + } +#ifndef RW_GL_USE_VAOS + disableAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); +#endif + } +} +} +#endif + #endif #endif diff --git a/src/extras/shaders/leedsBuilding.vert b/src/extras/shaders/leedsBuilding.vert index 67dd7938..766cd081 100644 --- a/src/extras/shaders/leedsBuilding.vert +++ b/src/extras/shaders/leedsBuilding.vert @@ -1,6 +1,8 @@ uniform vec4 u_amb; uniform vec4 u_emiss; +#define surfEmissive (u_surfProps.w) + VSIN(ATTRIB_POS) vec3 in_pos; VSOUT vec4 v_color; @@ -18,7 +20,7 @@ main(void) v_color = in_color; v_color.rgb *= u_amb.rgb; - v_color.rgb += u_emiss.rgb; + v_color.rgb += u_emiss.rgb*surfEmissive; v_color = clamp(v_color, 0.0, 1.0); v_color.a *= u_matColor.a; diff --git a/src/extras/shaders/leedsBuilding_VS.cso b/src/extras/shaders/leedsBuilding_VS.cso index 1ec92fb1fc880a4948f4e557195093bbb6886d14..b4b94afa32db587a60e0c5f1490d78aa602687a2 100644 GIT binary patch delta 227 zcmeyuvV^ssf$87>fB(H0oI@O)WEdD2J~A*cfW+7s7#Ki&21W*kR}2gcQ$WHDS`3T~ zs~F~h)G#nGtO1KLFt9K%G3d69(0UDYNPZqE;FfcPPus1L;JZa!% c_`iS!fB&5roI@O)WEdD2E;BGNfW%lC7#Ki&21W*kGYkw24Ip6#Ee1x0 zRSX>currentCamera; - convMatrix(&world, worldMat); - RawMatrix::mult(&worldview, &world, &cam->devView); - RawMatrix::mult(&building->combinedMat, &worldview, &cam->devProj); -} - -static bool -IsTextureTransparent(RwTexture *tex) -{ - if(tex == nil || tex->raster == nil) - return false; - return PLUGINOFFSET(rw::d3d::D3dRaster, tex->raster, rw::d3d::nativeRasterOffset)->hasAlpha; -} - -// Render all opaque meshes and put atomics that needs blending -// into the deferred list. -static void -AtomicFirstPass(RpAtomic *atomic, int pass) -{ - using namespace rw; - using namespace rw::d3d; - using namespace rw::d3d9; - - BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; - - atomic->getPipeline()->instance(atomic); - building->instHeader = (d3d9::InstanceDataHeader*)atomic->geometry->instData; - assert(building->instHeader != nil); - assert(building->instHeader->platform == PLATFORM_D3D9); - building->fadeAlpha = 255; - building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); - - bool setupDone = false; - bool defer = false; - SetMatrix(building, atomic->getFrame()->getLTM()); - - InstanceData *inst = building->instHeader->inst; - for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){ - Material *m = inst->material; - - if(inst->vertexAlpha || m->color.alpha != 255 || - IsTextureTransparent(m->texture)){ - defer = true; - continue; - } - - // alright we're rendering this atomic - if(!setupDone){ - setStreamSource(0, building->instHeader->vertexStream[0].vertexBuffer, 0, building->instHeader->vertexStream[0].stride); - setIndices(building->instHeader->indexBuffer); - setVertexDeclaration(building->instHeader->vertexDeclaration); - setVertexShader(default_amb_VS); - d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&building->combinedMat, 4); - if(building->lighting) - setAmbient(pAmbient->color); - else - setAmbient(black); - setupDone = true; - } - - setMaterial(m->color, m->surfaceProps); - - if(m->texture){ - d3d::setTexture(0, m->texture); - setPixelShader(default_tex_PS); - }else - setPixelShader(default_PS); - - drawInst(building->instHeader, inst); - } - if(defer) - numBlendInsts[pass]++; -} - -static void -AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha) -{ - using namespace rw; - using namespace rw::d3d; - using namespace rw::d3d9; - - BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; - - atomic->getPipeline()->instance(atomic); - building->instHeader = (d3d9::InstanceDataHeader*)atomic->geometry->instData; - assert(building->instHeader != nil); - assert(building->instHeader->platform == PLATFORM_D3D9); - building->fadeAlpha = fadeAlpha; - building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); - SetMatrix(building, atomic->getFrame()->getLTM()); - numBlendInsts[pass]++; -} - -static void -RenderBlendPass(int pass) -{ - using namespace rw; - using namespace rw::d3d; - using namespace rw::d3d9; - - setVertexShader(default_amb_VS); - - int i; - for(i = 0; i < numBlendInsts[pass]; i++){ - BuildingInst *building = &blendInsts[pass][i]; - - setStreamSource(0, building->instHeader->vertexStream[0].vertexBuffer, 0, building->instHeader->vertexStream[0].stride); - setIndices(building->instHeader->indexBuffer); - setVertexDeclaration(building->instHeader->vertexDeclaration); - d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&building->combinedMat, 4); - if(building->lighting) - setAmbient(pAmbient->color); - else - setAmbient(black); - - InstanceData *inst = building->instHeader->inst; - for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ - Material *m = inst->material; - if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255) - continue; // already done this one - - rw::RGBA color = m->color; - color.alpha = (color.alpha * building->fadeAlpha)/255; - setMaterial(color, m->surfaceProps); - - if(m->texture){ - d3d::setTexture(0, m->texture); - setPixelShader(default_tex_PS); - }else - setPixelShader(default_PS); - - drawInst(building->instHeader, inst); - } - } -} -#endif -#ifdef RW_GL3 -struct BuildingInst -{ - rw::Matrix matrix; - rw::gl3::InstanceDataHeader *instHeader; - uint8 fadeAlpha; - bool lighting; -}; -static BuildingInst blendInsts[3][2000]; -static int numBlendInsts[3]; - -static bool -IsTextureTransparent(RwTexture *tex) -{ - if(tex == nil || tex->raster == nil) - return false; - return PLUGINOFFSET(rw::gl3::Gl3Raster, tex->raster, rw::gl3::nativeRasterOffset)->hasAlpha; -} - -// Render all opaque meshes and put atomics that needs blending -// into the deferred list. -static void -AtomicFirstPass(RpAtomic *atomic, int pass) -{ - using namespace rw; - using namespace rw::gl3; - - BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; - - atomic->getPipeline()->instance(atomic); - building->instHeader = (gl3::InstanceDataHeader*)atomic->geometry->instData; - assert(building->instHeader != nil); - assert(building->instHeader->platform == PLATFORM_GL3); - building->fadeAlpha = 255; - building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); - - WorldLights lights; - lights.numAmbients = 1; - lights.numDirectionals = 0; - lights.numLocals = 0; - if(building->lighting) - lights.ambient = pAmbient->color; - else - lights.ambient = black; - - bool setupDone = false; - bool defer = false; - building->matrix = *atomic->getFrame()->getLTM(); - - InstanceData *inst = building->instHeader->inst; - for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){ - Material *m = inst->material; - - if(inst->vertexAlpha || m->color.alpha != 255 || - IsTextureTransparent(m->texture)){ - defer = true; - continue; - } - - // alright we're rendering this atomic - if(!setupDone){ - defaultShader->use(); - setWorldMatrix(&building->matrix); -#ifdef RW_GL_USE_VAOS - glBindVertexArray(building->instHeader->vao); -#else - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, building->instHeader->ibo); - glBindBuffer(GL_ARRAY_BUFFER, building->instHeader->vbo); - setAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); -#endif - setLights(&lights); - setupDone = true; - } - - setMaterial(m->color, m->surfaceProps); - - setTexture(0, m->texture); - - drawInst(building->instHeader, inst); - } -#ifndef RW_GL_USE_VAOS - disableAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); -#endif - if(defer) - numBlendInsts[pass]++; -} - -static void -AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha) -{ - using namespace rw; - using namespace rw::gl3; - - BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]]; - - atomic->getPipeline()->instance(atomic); - building->instHeader = (gl3::InstanceDataHeader*)atomic->geometry->instData; - assert(building->instHeader != nil); - assert(building->instHeader->platform == PLATFORM_GL3); - building->fadeAlpha = fadeAlpha; - building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT); - building->matrix = *atomic->getFrame()->getLTM(); - numBlendInsts[pass]++; -} - -static void -RenderBlendPass(int pass) -{ - using namespace rw; - using namespace rw::gl3; - - defaultShader->use(); - WorldLights lights; - lights.numAmbients = 1; - lights.numDirectionals = 0; - lights.numLocals = 0; - - int i; - for(i = 0; i < numBlendInsts[pass]; i++){ - BuildingInst *building = &blendInsts[pass][i]; - -#ifdef RW_GL_USE_VAOS - glBindVertexArray(building->instHeader->vao); -#else - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, building->instHeader->ibo); - glBindBuffer(GL_ARRAY_BUFFER, building->instHeader->vbo); - setAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); -#endif - setWorldMatrix(&building->matrix); - if(building->lighting) - lights.ambient = pAmbient->color; - else - lights.ambient = black; - setLights(&lights); - - InstanceData *inst = building->instHeader->inst; - for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ - Material *m = inst->material; - if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255) - continue; // already done this one - - rw::RGBA color = m->color; - color.alpha = (color.alpha * building->fadeAlpha)/255; - setMaterial(color, m->surfaceProps); - - setTexture(0, m->texture); - - drawInst(building->instHeader, inst); - } -#ifndef RW_GL_USE_VAOS - disableAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs); -#endif - } -} -#endif - void CRenderer::RenderOneBuilding(CEntity *ent, float camdist) { @@ -715,16 +405,16 @@ CRenderer::RenderOneBuilding(CEntity *ent, float camdist) alpha = mi->m_alpha * fadefactor; if(alpha == 255) - AtomicFirstPass(atomic, pass); + WorldRender::AtomicFirstPass(atomic, pass); else{ // not quite sure what this is about, do we have to do that? RpGeometry *geo = RpAtomicGetGeometry(lodatm); if(geo != RpAtomicGetGeometry(atomic)) RpAtomicSetGeometry(atomic, geo, rpATOMICSAMEBOUNDINGSPHERE); - AtomicFullyTransparent(atomic, pass, alpha); + WorldRender::AtomicFullyTransparent(atomic, pass, alpha); } }else - AtomicFirstPass(atomic, pass); + WorldRender::AtomicFirstPass(atomic, pass); ent->bImBeingRendered = false; // TODO: this seems wrong, but do we even need it? } @@ -779,16 +469,16 @@ CRenderer::RenderWorld(int pass) RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, FALSE); - RenderBlendPass(PASS_NOZ); + WorldRender::RenderBlendPass(PASS_NOZ); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); break; case 2: // Transparent RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDONE); - RenderBlendPass(PASS_ADD); + WorldRender::RenderBlendPass(PASS_ADD); RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void*)rwBLENDINVSRCALPHA); - RenderBlendPass(PASS_BLEND); + WorldRender::RenderBlendPass(PASS_BLEND); break; } } @@ -872,9 +562,9 @@ CRenderer::ClearForFrame(void) ms_nNoOfInVisibleEntities = 0; gSortedVehiclesAndPeds.Clear(); - numBlendInsts[PASS_NOZ] = 0; - numBlendInsts[PASS_ADD] = 0; - numBlendInsts[PASS_BLEND] = 0; + WorldRender::numBlendInsts[PASS_NOZ] = 0; + WorldRender::numBlendInsts[PASS_ADD] = 0; + WorldRender::numBlendInsts[PASS_BLEND] = 0; } #endif From 2639fba582691433e8910ec117c2545b04a9d057 Mon Sep 17 00:00:00 2001 From: majestic Date: Sat, 9 Jan 2021 10:26:07 -0800 Subject: [PATCH 28/68] just original marker color --- src/control/Script.h | 6 +++--- src/core/Radar.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/control/Script.h b/src/control/Script.h index ae1838d7..3220a2b3 100644 --- a/src/control/Script.h +++ b/src/control/Script.h @@ -30,9 +30,9 @@ void FlushLog(); #define UPSIDEDOWN_TURN_SPEED_THRESHOLD (0.02f) #define UPSIDEDOWN_TIMER_THRESHOLD (1000) -#define SPHERE_MARKER_R (252) -#define SPHERE_MARKER_G (138) -#define SPHERE_MARKER_B (242) +#define SPHERE_MARKER_R (255) +#define SPHERE_MARKER_G (255) +#define SPHERE_MARKER_B (128) #define SPHERE_MARKER_A (228) #define SPHERE_MARKER_PULSE_PERIOD 2048 #define SPHERE_MARKER_PULSE_FRACTION 0.1f diff --git a/src/core/Radar.h b/src/core/Radar.h index 8f2e7069..74d16abb 100644 --- a/src/core/Radar.h +++ b/src/core/Radar.h @@ -16,9 +16,9 @@ #define OBJECTBLIP_MARKER_COLOR_B 242 #define OBJECTBLIP_MARKER_COLOR_A 255 -#define COORDBLIP_MARKER_COLOR_R 252 -#define COORDBLIP_MARKER_COLOR_G 138 -#define COORDBLIP_MARKER_COLOR_B 242 +#define COORDBLIP_MARKER_COLOR_R 255 +#define COORDBLIP_MARKER_COLOR_G 255 +#define COORDBLIP_MARKER_COLOR_B 128 #define COORDBLIP_MARKER_COLOR_A 228 #define NUM_MAP_LEGENDS 75 From d3aa8a118cfaed768519c1db3214453e6d3ceb52 Mon Sep 17 00:00:00 2001 From: aap Date: Sat, 9 Jan 2021 19:45:19 +0100 Subject: [PATCH 29/68] fix rendering; update librw --- src/extras/custompipes_d3d9.cpp | 6 +----- src/extras/shaders/leedsBuilding_VS.cso | Bin 676 -> 652 bytes src/extras/shaders/leedsBuilding_VS.hlsl | 3 --- src/extras/shaders/leedsBuilding_VS.inc | 10 ++++------ vendor/librw | 2 +- 5 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/extras/custompipes_d3d9.cpp b/src/extras/custompipes_d3d9.cpp index d2d50bca..993a64ce 100644 --- a/src/extras/custompipes_d3d9.cpp +++ b/src/extras/custompipes_d3d9.cpp @@ -699,10 +699,6 @@ RenderBlendPass(int pass) setIndices(building->instHeader->indexBuffer); setVertexDeclaration(building->instHeader->vertexDeclaration); d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&building->combinedMat, 4); - if(building->lighting) - setAmbient(pAmbient->color); - else - setAmbient(black); InstanceData *inst = building->instHeader->inst; for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ @@ -723,7 +719,7 @@ RenderBlendPass(int pass) rw::RGBA color = m->color; color.alpha = (color.alpha * building->fadeAlpha)/255; - setMaterial(m->color, m->surfaceProps, 0.5f); + setMaterial(color, m->surfaceProps, 0.5f); drawInst(building->instHeader, inst); } diff --git a/src/extras/shaders/leedsBuilding_VS.cso b/src/extras/shaders/leedsBuilding_VS.cso index b4b94afa32db587a60e0c5f1490d78aa602687a2..6720364dad9258f0d294cf6c11bb44625ecbcd7d 100644 GIT binary patch delta 48 zcmZ3&+QYgbg^`tufuVtEaw(&_C= Date: Sat, 9 Jan 2021 22:24:18 +0300 Subject: [PATCH 30/68] can finish first mission --- src/control/Script.cpp | 11 +++++++---- src/control/Script3.cpp | 4 ++-- src/control/Script8.cpp | 23 ++++++++++++++++++----- src/core/Radar.cpp | 6 ++++++ src/core/Radar.h | 5 +++++ 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index df851daa..543221c6 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -2179,7 +2179,7 @@ bool CUpsideDownCarCheck::IsCarUpsideDown(int32 id) // done(LCS) bool CUpsideDownCarCheck::IsCarUpsideDown(CVehicle* pVehicle) { - assert(pVehicle); + script_assert(pVehicle); return pVehicle->GetUp().z <= UPSIDEDOWN_UP_THRESHOLD && pVehicle->GetMoveSpeed().Magnitude() < UPSIDEDOWN_MOVE_SPEED_THRESHOLD && pVehicle->GetTurnSpeed().Magnitude() < UPSIDEDOWN_TURN_SPEED_THRESHOLD; @@ -2411,7 +2411,7 @@ int32* GetPointerToScriptVariableForDebug(CRunningScript* pScript, uint32* pIp, return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL)]; } else { - assert(type >= ARGUMENT_TIMER); + script_assert(type >= ARGUMENT_TIMER); sprintf(tmpstr, " TIMER%d@", (type - ARGUMENT_TIMER)); strcat(buf, tmpstr); return &pScript->m_anLocalVariables[NUM_LOCAL_VARS + 8 + (type - ARGUMENT_TIMER)]; // why 8? @@ -2534,7 +2534,7 @@ int32* GetPointerToScriptVariable(CRunningScript* pScript, uint32* pIp) return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL)]; } else { - assert(type >= ARGUMENT_TIMER); + script_assert(type >= ARGUMENT_TIMER); return &pScript->m_anLocalVariables[NUM_LOCAL_VARS + 8 + (type - ARGUMENT_TIMER)]; } } @@ -4998,7 +4998,10 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) return 0; } //case COMMAND_ADD_AMMO_TO_CAR: - //case COMMAND_IS_PLAYER_STILL_ALIVE: + case COMMAND_IS_PLAYER_STILL_ALIVE: + CollectParameters(&m_nIp, 1); + UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_WBState != WBSTATE_WASTED); + return 0; case COMMAND_IS_PLAYER_DEAD: CollectParameters(&m_nIp, 1); UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_WBState == WBSTATE_WASTED); diff --git a/src/control/Script3.cpp b/src/control/Script3.cpp index 0134df00..c2c7d044 100644 --- a/src/control/Script3.cpp +++ b/src/control/Script3.cpp @@ -836,7 +836,6 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_RESTORE_CLOCK: CClock::RestoreClock(); return 0; - /* case COMMAND_RESTART_CRITICAL_MISSION: { CollectParameters(&m_nIp, 4); @@ -849,7 +848,6 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) CWorld::Players[CWorld::PlayerInFocus].PlayerFailedCriticalMission(); return 0; } - */ case COMMAND_IS_PLAYER_PLAYING: { CollectParameters(&m_nIp, 1); @@ -1357,12 +1355,14 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) UpdateCompareFlag(CTheScripts::IsPedStopped(pPed)); return 0; } + */ case COMMAND_MESSAGE_WAIT: CollectParameters(&m_nIp, 2); m_nWakeTime = CTimer::GetTimeInMilliseconds() + ScriptParams[0]; if (ScriptParams[1] != 0) m_bSkipWakeTime = true; return 1; + /* case COMMAND_ADD_PARTICLE_EFFECT: { CollectParameters(&m_nIp, 5); diff --git a/src/control/Script8.cpp b/src/control/Script8.cpp index f41ef8a4..cf5f1327 100644 --- a/src/control/Script8.cpp +++ b/src/control/Script8.cpp @@ -714,7 +714,7 @@ int8 CRunningScript::ProcessCommands1500To1599(int32 command) script_assert(false); return 0; case COMMAND_1539: - script_assert(false); + //TODO (REGISTER_OUTFIT_CHANGE) return 0; case COMMAND_1540: script_assert(false); @@ -741,7 +741,9 @@ int8 CRunningScript::ProcessCommands1500To1599(int32 command) script_assert(false); return 0; case COMMAND_1548: - script_assert(false); + // TODO (GET_ONFOOT_CAMERA_MODE) + ScriptParams[0] = 0; + StoreParameters(&m_nIp, 1); return 0; case COMMAND_1549: CollectParameters(&m_nIp, 1); @@ -847,8 +849,11 @@ int8 CRunningScript::ProcessCommands1500To1599(int32 command) script_assert(false); return 0; case COMMAND_1581: - script_assert(false); + { + // TODO (SET_HELP_MESSAGE?) + wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); return 0; + } case COMMAND_1582: script_assert(false); return 0; @@ -1062,8 +1067,15 @@ int8 CRunningScript::ProcessCommands1600To1699(int32 command) script_assert(false); return 0; case COMMAND_1645: - script_assert(false); + { + CollectParameters(&m_nIp, 1); + // TODO (GET_STORED_WEAPON?) + CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + script_assert(pPed); + ScriptParams[0] = pPed->m_storedWeapon; + StoreParameters(&m_nIp, 1); return 0; + } case COMMAND_1646: CollectParameters(&m_nIp, 1); // TODO (DISABLE_PAUSE_MENU?) @@ -1100,7 +1112,8 @@ int8 CRunningScript::ProcessCommands1600To1699(int32 command) script_assert(false); return 0; case COMMAND_1656: - script_assert(false); + CollectParameters(&m_nIp, 2); + // TODO (?) return 0; default: script_assert(0); diff --git a/src/core/Radar.cpp b/src/core/Radar.cpp index 8fe900ae..d9802acc 100644 --- a/src/core/Radar.cpp +++ b/src/core/Radar.cpp @@ -104,6 +104,11 @@ CSprite2d *CRadar::RadarSprites[RADAR_SPRITE_COUNT] = { &RadioVCPRSprite, &RadioEspantosoSprite, &RadioEmotionSprite, + &RadioWaveSprite, // tmp hack + &RadioWaveSprite, + &RadioWaveSprite, + &RadioWaveSprite, + &RadioWaveSprite, &RadioWaveSprite }; @@ -1689,6 +1694,7 @@ CRadar::DrawLegend(int32 x, int32 y, int32 sprite) text = TheText.Get("LG_34"); break; default: + text = TheText.Get("LG_34"); // tmp hack break; } CFont::PrintString(SCREEN_SCALE_X(20.f) + x, SCREEN_SCALE_Y(3.0f) + y, text); diff --git a/src/core/Radar.h b/src/core/Radar.h index 8f2e7069..d051745a 100644 --- a/src/core/Radar.h +++ b/src/core/Radar.h @@ -92,6 +92,11 @@ enum eRadarSprite RADAR_SPRITE_RADIO_ESPANTOSO, RADAR_SPRITE_RADIO_EMOTION, RADAR_SPRITE_RADIO_WAVE, + RADAR_SPRITE_40, // tmp + RADAR_SPRITE_41, + RADAR_SPRITE_42, + RADAR_SPRITE_43, + RADAR_SPRITE_44, RADAR_SPRITE_COUNT }; From c2265e29d2f2b487add06b1e03ddc8bcce58f643 Mon Sep 17 00:00:00 2001 From: Seemann Date: Sat, 9 Jan 2021 23:59:47 -0500 Subject: [PATCH 31/68] Update command definitions --- src/control/Script.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 8cac88d6..1bbed8b1 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -225,7 +225,7 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_GOSUB, INPUT_ARGUMENTS(ARGTYPE_LABEL,), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_RETURN, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_LINE, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_CREATE_PLAYER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_CREATE_PLAYER, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""), REGISTER_COMMAND(COMMAND_GET_PLAYER_COORDINATES, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), false, -1, ""), REGISTER_COMMAND(COMMAND_SET_PLAYER_COORDINATES, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_IS_PLAYER_IN_AREA_2D, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_BOOL,), OUTPUT_ARGUMENTS(), true, -1, ""), @@ -290,10 +290,10 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_CSET_VAR_FLOAT_TO_LVAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), REGISTER_COMMAND(COMMAND_CSET_LVAR_INT_TO_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), REGISTER_COMMAND(COMMAND_CSET_LVAR_FLOAT_TO_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), - REGISTER_COMMAND(COMMAND_ABS_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), - REGISTER_COMMAND(COMMAND_ABS_LVAR_INT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), - REGISTER_COMMAND(COMMAND_ABS_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), - REGISTER_COMMAND(COMMAND_ABS_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), + REGISTER_COMMAND(COMMAND_ABS_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), + REGISTER_COMMAND(COMMAND_ABS_LVAR_INT, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), + REGISTER_COMMAND(COMMAND_ABS_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), + REGISTER_COMMAND(COMMAND_ABS_LVAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), REGISTER_COMMAND(COMMAND_GENERATE_RANDOM_FLOAT, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT,), false, -1, ""), REGISTER_COMMAND(COMMAND_GENERATE_RANDOM_INT, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""), REGISTER_COMMAND(COMMAND_CREATE_CHAR, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(ARGTYPE_PED_HANDLE,), false, -1, ""), @@ -922,8 +922,8 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_PRINT_WITH_6_NUMBERS_NOW, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_PRINT_WITH_6_NUMBERS_SOON, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_SET_CHAR_OBJ_FOLLOW_CHAR_IN_FORMATION, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_PLAYER_MADE_PROGRESS, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_PROGRESS_TOTAL, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_PLAYER_MADE_PROGRESS, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_SET_PROGRESS_TOTAL, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_REGISTER_JUMP_DISTANCE, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_REGISTER_JUMP_HEIGHT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_REGISTER_JUMP_FLIPS, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), From ad7855f99599c1128f03e14044cf1ea17f0bac76 Mon Sep 17 00:00:00 2001 From: Seemann Date: Sat, 9 Jan 2021 23:59:47 -0500 Subject: [PATCH 32/68] Update command definitions --- src/control/Script.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 543221c6..4102946b 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -298,10 +298,10 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_CSET_VAR_FLOAT_TO_LVAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), REGISTER_COMMAND(COMMAND_CSET_LVAR_INT_TO_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), REGISTER_COMMAND(COMMAND_CSET_LVAR_FLOAT_TO_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), - REGISTER_COMMAND(COMMAND_ABS_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), - REGISTER_COMMAND(COMMAND_ABS_LVAR_INT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), - REGISTER_COMMAND(COMMAND_ABS_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), - REGISTER_COMMAND(COMMAND_ABS_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), + REGISTER_COMMAND(COMMAND_ABS_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), + REGISTER_COMMAND(COMMAND_ABS_LVAR_INT, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), + REGISTER_COMMAND(COMMAND_ABS_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), + REGISTER_COMMAND(COMMAND_ABS_LVAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), REGISTER_COMMAND(COMMAND_GENERATE_RANDOM_FLOAT, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_FLOAT,), false, -1, ""), REGISTER_COMMAND(COMMAND_GENERATE_RANDOM_INT, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(ARGTYPE_INT,), false, -1, ""), REGISTER_COMMAND(COMMAND_CREATE_CHAR, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_FLOAT, ARGTYPE_FLOAT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(ARGTYPE_PED_HANDLE,), false, -1, ""), @@ -935,8 +935,8 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_PRINT_WITH_6_NUMBERS_NOW, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_PRINT_WITH_6_NUMBERS_SOON, INPUT_ARGUMENTS(ARGTYPE_STRING, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_SET_CHAR_OBJ_FOLLOW_CHAR_IN_FORMATION, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_PLAYER_MADE_PROGRESS, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), - REGISTER_COMMAND(COMMAND_SET_PROGRESS_TOTAL, INPUT_ARGUMENTS(), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_PLAYER_MADE_PROGRESS, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), + REGISTER_COMMAND(COMMAND_SET_PROGRESS_TOTAL, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_REGISTER_JUMP_DISTANCE, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_REGISTER_JUMP_HEIGHT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, -1, ""), REGISTER_COMMAND(COMMAND_REGISTER_JUMP_FLIPS, INPUT_ARGUMENTS(ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, -1, ""), From 0ee87d7b46c4e340554f25d38d01bc1accb8c826 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 10 Jan 2021 11:59:51 +0100 Subject: [PATCH 33/68] env map rendering --- src/core/main.cpp | 5 +- src/core/re3.cpp | 16 +- src/extras/custompipes.cpp | 5 +- src/extras/custompipes.h | 3 + src/extras/custompipes_d3d9.cpp | 139 ++++++++++++- src/extras/custompipes_gl.cpp | 141 ++++++++++++- src/extras/shaders/Makefile | 18 +- src/extras/shaders/leedsVehicle.vert | 27 +++ src/extras/shaders/leedsVehicle_VS.cso | Bin 0 -> 1204 bytes src/extras/shaders/leedsVehicle_VS.hlsl | 45 +++++ src/extras/shaders/leedsVehicle_VS.inc | 103 ++++++++++ src/extras/shaders/leedsVehicle_add.frag | 32 +++ src/extras/shaders/leedsVehicle_add_PS.cso | Bin 0 -> 496 bytes src/extras/shaders/leedsVehicle_add_PS.hlsl | 34 ++++ src/extras/shaders/leedsVehicle_add_PS.inc | 44 +++++ src/extras/shaders/leedsVehicle_add_gl.inc | 34 ++++ src/extras/shaders/leedsVehicle_blend.frag | 32 +++ src/extras/shaders/leedsVehicle_blend_PS.cso | Bin 0 -> 572 bytes src/extras/shaders/leedsVehicle_blend_PS.hlsl | 33 ++++ src/extras/shaders/leedsVehicle_blend_PS.inc | 50 +++++ src/extras/shaders/leedsVehicle_blend_gl.inc | 34 ++++ src/extras/shaders/leedsVehicle_vs_gl.inc | 29 +++ src/render/Renderer.cpp | 185 ++++++++++++++++++ src/render/Renderer.h | 2 + 24 files changed, 991 insertions(+), 20 deletions(-) create mode 100644 src/extras/shaders/leedsVehicle.vert create mode 100644 src/extras/shaders/leedsVehicle_VS.cso create mode 100644 src/extras/shaders/leedsVehicle_VS.hlsl create mode 100644 src/extras/shaders/leedsVehicle_VS.inc create mode 100644 src/extras/shaders/leedsVehicle_add.frag create mode 100644 src/extras/shaders/leedsVehicle_add_PS.cso create mode 100644 src/extras/shaders/leedsVehicle_add_PS.hlsl create mode 100644 src/extras/shaders/leedsVehicle_add_PS.inc create mode 100644 src/extras/shaders/leedsVehicle_add_gl.inc create mode 100644 src/extras/shaders/leedsVehicle_blend.frag create mode 100644 src/extras/shaders/leedsVehicle_blend_PS.cso create mode 100644 src/extras/shaders/leedsVehicle_blend_PS.hlsl create mode 100644 src/extras/shaders/leedsVehicle_blend_PS.inc create mode 100644 src/extras/shaders/leedsVehicle_blend_gl.inc create mode 100644 src/extras/shaders/leedsVehicle_vs_gl.inc diff --git a/src/core/main.cpp b/src/core/main.cpp index ea6f25ec..03a7fcc2 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -1159,6 +1159,8 @@ if(gbRenderWorld1) if(gbRenderRoads) CRenderer::RenderRoads(); + CRenderer::GenerateEnvironmentMap(); // should be after static shadows, but that's weird + CRenderer::RenderPeds(); // not sure where to put these since LCS has no underwater entities @@ -1172,7 +1174,7 @@ if(gbRenderWater) if(gbRenderEverythingBarRoads) CRenderer::RenderEverythingBarRoads(); - // get env map here? + // seam fixer // moved this: // CRenderer::RenderFadingInEntities(); } @@ -1195,7 +1197,6 @@ void RenderEffects_new(void) { CShadows::RenderStaticShadows(); - // CRenderer::GenerateEnvironmentMap CShadows::RenderStoredShadows(); CSkidmarks::Render(); CRubbish::Render(); diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 3a5488d1..65bb61b4 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -578,22 +578,19 @@ DebugMenuPopulate(void) DebugMenuAddCmd("Spawn", "Spawn Stinger", [](){ SpawnCar(MI_STINGER); }); DebugMenuAddCmd("Spawn", "Spawn Infernus", [](){ SpawnCar(MI_INFERNUS); }); DebugMenuAddCmd("Spawn", "Spawn Cheetah", [](){ SpawnCar(MI_CHEETAH); }); - DebugMenuAddCmd("Spawn", "Spawn Phoenix", [](){ SpawnCar(MI_PHEONIX); }); + DebugMenuAddCmd("Spawn", "Spawn Esprit", [](){ SpawnCar(MI_ESPRIT); }); DebugMenuAddCmd("Spawn", "Spawn Banshee", [](){ SpawnCar(MI_BANSHEE); }); DebugMenuAddCmd("Spawn", "Spawn Esperanto", [](){ SpawnCar(MI_ESPERANT); }); DebugMenuAddCmd("Spawn", "Spawn Stallion", [](){ SpawnCar(MI_STALLION); }); - DebugMenuAddCmd("Spawn", "Spawn Admiral", [](){ SpawnCar(MI_ADMIRAL); }); - DebugMenuAddCmd("Spawn", "Spawn Washington", [](){ SpawnCar(MI_WASHING); }); + DebugMenuAddCmd("Spawn", "Spawn Mafia", [](){ SpawnCar(MI_MAFIA); }); + DebugMenuAddCmd("Spawn", "Spawn Kuruma", [](){ SpawnCar(MI_KURUMA); }); DebugMenuAddCmd("Spawn", "Spawn Taxi", [](){ SpawnCar(MI_TAXI); }); DebugMenuAddCmd("Spawn", "Spawn Police", [](){ SpawnCar(MI_POLICE); }); DebugMenuAddCmd("Spawn", "Spawn Enforcer", [](){ SpawnCar(MI_ENFORCER); }); - DebugMenuAddCmd("Spawn", "Spawn Cuban", [](){ SpawnCar(MI_CUBAN); }); - DebugMenuAddCmd("Spawn", "Spawn Voodoo", [](){ SpawnCar(MI_VOODOO); }); + DebugMenuAddCmd("Spawn", "Spawn Diablo", [](){ SpawnCar(MI_DIABLOS); }); + DebugMenuAddCmd("Spawn", "Spawn Yardie", [](){ SpawnCar(MI_YARDIE); }); DebugMenuAddCmd("Spawn", "Spawn BF injection", [](){ SpawnCar(MI_BFINJECT); }); DebugMenuAddCmd("Spawn", "Spawn Maverick", [](){ SpawnCar(MI_MAVERICK); }); - DebugMenuAddCmd("Spawn", "Spawn VCN Maverick", [](){ SpawnCar(MI_VCNMAV); }); - DebugMenuAddCmd("Spawn", "Spawn Sparrow", [](){ SpawnCar(MI_SPARROW); }); - DebugMenuAddCmd("Spawn", "Spawn Sea Sparrow", [](){ SpawnCar(MI_SEASPAR); }); DebugMenuAddCmd("Spawn", "Spawn Hunter", [](){ SpawnCar(MI_HUNTER); }); DebugMenuAddCmd("Spawn", "Spawn Rhino", [](){ SpawnCar(MI_RHINO); }); DebugMenuAddCmd("Spawn", "Spawn Firetruck", [](){ SpawnCar(MI_FIRETRUCK); }); @@ -601,8 +598,6 @@ DebugMenuPopulate(void) DebugMenuAddCmd("Spawn", "Spawn PCJ 600", [](){ SpawnCar(MI_PCJ600); }); DebugMenuAddCmd("Spawn", "Spawn Faggio", [](){ SpawnCar(MI_FAGGIO); }); DebugMenuAddCmd("Spawn", "Spawn Freeway", [](){ SpawnCar(MI_FREEWAY); }); - DebugMenuAddCmd("Spawn", "Spawn Squalo", [](){ SpawnCar(MI_SQUALO); }); - DebugMenuAddCmd("Spawn", "Spawn Skimmer", [](){ SpawnCar(MI_SKIMMER); }); DebugMenuAddVarBool8("Render", "Draw hud", &CHud::m_Wants_To_Draw_Hud, nil); DebugMenuAddVarBool8("Render", "Backface Culling", &gBackfaceCulling, nil); @@ -651,6 +646,7 @@ extern bool gbRenderWorld2; e = DebugMenuAddVar("Render", "Vehicle Pipeline", &CustomPipes::VehiclePipeSwitch, nil, 1, CustomPipes::VEHICLEPIPE_MATFX, CustomPipes::VEHICLEPIPE_NEO, vehpipenames); DebugMenuEntrySetWrap(e, true); + DebugMenuAddVarBool8("Render", "Chrome cheat", &CustomPipes::bChromeCheat, nil); DebugMenuAddVar("Render", "Neo Vehicle Shininess", &CustomPipes::VehicleShininess, nil, 0.1f, 0, 1.0f); DebugMenuAddVar("Render", "Neo Vehicle Specularity", &CustomPipes::VehicleSpecularity, nil, 0.1f, 0, 1.0f); DebugMenuAddVarBool8("Render", "Neo Ped Rim light enable", &CustomPipes::RimlightEnable, nil); diff --git a/src/extras/custompipes.cpp b/src/extras/custompipes.cpp index 2cecf1c0..f7f8bbe5 100644 --- a/src/extras/custompipes.cpp +++ b/src/extras/custompipes.cpp @@ -46,13 +46,14 @@ CustomMatCopy(void *dst, void *src, int32, int32) rw::TexDictionary *neoTxd; +bool bChromeCheat; bool bRenderingEnvMap; int32 EnvMapSize = 128; rw::Camera *EnvMapCam; rw::Texture *EnvMapTex; rw::Texture *EnvMaskTex; -static rw::RWDEVICE::Im2DVertex EnvScreenQuad[4]; -static int16 QuadIndices[6] = { 0, 1, 2, 0, 2, 3 }; +rw::RWDEVICE::Im2DVertex EnvScreenQuad[4]; +int16 QuadIndices[6] = { 0, 1, 2, 0, 2, 3 }; static rw::Camera* CreateEnvMapCam(rw::World *world) diff --git a/src/extras/custompipes.h b/src/extras/custompipes.h index f9181fe9..aed34520 100644 --- a/src/extras/custompipes.h +++ b/src/extras/custompipes.h @@ -75,11 +75,14 @@ void CustomPipeInit(void); void CustomPipeShutdown(void); void SetTxdFindCallback(void); +extern bool bChromeCheat; extern bool bRenderingEnvMap; extern int32 EnvMapSize; extern rw::Camera *EnvMapCam; extern rw::Texture *EnvMapTex; extern rw::Texture *EnvMaskTex; +extern rw::RWDEVICE::Im2DVertex EnvScreenQuad[4]; +extern int16 QuadIndices[6]; void EnvMapRender(void); enum { diff --git a/src/extras/custompipes_d3d9.cpp b/src/extras/custompipes_d3d9.cpp index 993a64ce..2483bb30 100644 --- a/src/extras/custompipes_d3d9.cpp +++ b/src/extras/custompipes_d3d9.cpp @@ -4,6 +4,8 @@ #ifdef RW_D3D9 #ifdef EXTENDED_PIPELINES +#include "rpmatfx.h" + #include "main.h" #include "RwHelper.h" #include "Lights.h" @@ -42,13 +44,112 @@ enum { VSLOC_emissive = rw::d3d::VSLOC_afterLights, VSLOC_ambient, - PSLOC_colorscale = 1 + PSLOC_colorscale = 1, + + // Leed vehicle + VSLOC_texMat = rw::d3d::VSLOC_afterLights, + + PSLOC_shininess = 1, + }; /* - * Neo Vehicle pipe + * Leeds & Neo Vehicle pipe */ +static void *leedsVehicle_VS; +static void *leedsVehicle_blend_PS; +static void *leedsVehicle_add_PS; + +static rw::RawMatrix normal2texcoord_flipU = { + { -0.5f, 0.0f, 0.0f }, 0.0f, + { 0.0f, -0.5f, 0.0f }, 0.0f, + { 0.0f, 0.0f, 1.0f }, 0.0f, + { 0.5f, 0.5f, 0.0f }, 1.0f +}; + +void +uploadEnvMatrix(rw::Frame *frame) +{ + using namespace rw; + Matrix invMat; + if(frame == nil) + frame = engine->currentCamera->getFrame(); + + RawMatrix envMtx, invMtx; + Matrix tmp = *frame->getLTM(); + // Now the weird part: we remove the camera pitch + tmp.at.z = 0.0f; + tmp.at = normalize(tmp.at); + tmp.right.x = -tmp.at.y; + tmp.right.y = tmp.at.x; + tmp.right.z = 0.0f;; + tmp.up.set(0.0f, 0.0f, 1.0f); + tmp.pos.set(0.0f, 0.0f, 0.0f); + tmp.flags = Matrix::TYPEORTHONORMAL; + + Matrix::invert(&invMat, &tmp); + convMatrix(&invMtx, &invMat); + RawMatrix::mult(&envMtx, &invMtx, &normal2texcoord_flipU); + d3d::d3ddevice->SetVertexShaderConstantF(VSLOC_texMat, (float*)&envMtx, 4); +} + +void +leedsVehicleRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + int vsBits; + setStreamSource(0, header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); + setIndices(header->indexBuffer); + setVertexDeclaration(header->vertexDeclaration); + + vsBits = lightingCB_Shader(atomic); + uploadMatrices(atomic->getFrame()->getLTM()); + + setVertexShader(leedsVehicle_VS); + if(bChromeCheat) + setPixelShader(leedsVehicle_blend_PS); + else + setPixelShader(leedsVehicle_add_PS); + + d3d::setTexture(1, EnvMapTex); + uploadEnvMatrix(nil); + + SetRenderState(SRCBLEND, BLENDONE); + + InstanceData *inst = header->inst; + for(rw::uint32 i = 0; i < header->numMeshes; i++){ + Material *m = inst->material; + + SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); + + float coef = 0.0f; + if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP) + coef = RpMatFXMaterialGetEnvMapCoefficient(m); + coef *= 0.5f; + if(bChromeCheat && coef > 0.0f) + coef = 1.0f; + d3ddevice->SetPixelShaderConstantF(PSLOC_shininess, (float*)&coef, 1); + + setMaterial(m->color, m->surfaceProps); + + if(m->texture) + d3d::setTexture(0, m->texture); + else + d3d::setTexture(0, gpWhiteTexture); + + drawInst(header, inst); + inst++; + } + + d3d::setTexture(1, nil); + + SetRenderState(SRCBLEND, BLENDSRCALPHA); +} + static void *neoVehicle_VS; static void *neoVehicle_PS; @@ -90,7 +191,8 @@ vehicleRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) // TODO: make this less of a kludge if(VehiclePipeSwitch == VEHICLEPIPE_MATFX){ - matFXGlobals.pipelines[rw::platform]->render(atomic); + leedsVehicleRenderCB(atomic, header); + // matFXGlobals.pipelines[rw::platform]->render(atomic); return; } @@ -164,6 +266,18 @@ CreateVehiclePipe(void) neoVehicle_PS = rw::d3d::createPixelShader(neoVehicle_PS_cso); assert(neoVehicle_PS); +#include "shaders/leedsVehicle_VS.inc" + leedsVehicle_VS = rw::d3d::createVertexShader(leedsVehicle_VS_cso); + assert(leedsVehicle_VS); + +#include "shaders/leedsVehicle_blend_PS.inc" + leedsVehicle_blend_PS = rw::d3d::createPixelShader(leedsVehicle_blend_PS_cso); + assert(leedsVehicle_blend_PS); + +#include "shaders/leedsVehicle_add_PS.inc" + leedsVehicle_add_PS = rw::d3d::createPixelShader(leedsVehicle_add_PS_cso); + assert(leedsVehicle_add_PS); + rw::d3d9::ObjPipeline *pipe = rw::d3d9::ObjPipeline::create(); pipe->instanceCB = rw::d3d9::defaultInstanceCB; @@ -181,6 +295,15 @@ DestroyVehiclePipe(void) rw::d3d::destroyPixelShader(neoVehicle_PS); neoVehicle_PS = nil; + rw::d3d::destroyVertexShader(leedsVehicle_VS); + leedsVehicle_VS = nil; + + rw::d3d::destroyPixelShader(leedsVehicle_blend_PS); + leedsVehicle_blend_PS = nil; + + rw::d3d::destroyPixelShader(leedsVehicle_add_PS); + leedsVehicle_add_PS = nil; + ((rw::d3d9::ObjPipeline*)vehiclePipe)->destroy(); vehiclePipe = nil; } @@ -688,6 +811,16 @@ RenderBlendPass(int pass) setVertexShader(CustomPipes::leedsBuilding_VS); setPixelShader(CustomPipes::scale_PS); + RGBAf amb, emiss; + amb.red = CTimeCycle::GetAmbientRed(); + amb.green = CTimeCycle::GetAmbientGreen(); + amb.blue = CTimeCycle::GetAmbientBlue(); + amb.alpha = 1.0f; + emiss = pAmbient->color; + + d3ddevice->SetVertexShaderConstantF(CustomPipes::VSLOC_ambient, (float*)&amb, 1); + d3ddevice->SetVertexShaderConstantF(CustomPipes::VSLOC_emissive, (float*)&emiss, 1); + float colorscale[4]; colorscale[3] = 1.0f; diff --git a/src/extras/custompipes_gl.cpp b/src/extras/custompipes_gl.cpp index 193a4ac6..e9350802 100644 --- a/src/extras/custompipes_gl.cpp +++ b/src/extras/custompipes_gl.cpp @@ -3,6 +3,8 @@ #ifdef RW_OPENGL #ifdef EXTENDED_PIPELINES +#include "rpmatfx.h" + #include "main.h" #include "RwHelper.h" #include "Lights.h" @@ -37,14 +39,126 @@ static int32 u_amb; static int32 u_emiss; static int32 u_colorscale; +static int32 u_texMatrix; +static int32 u_fxparams; + #define U(i) currentShader->uniformLocations[i] /* - * Neo Vehicle pipe + * Leeds & Neo Vehicle pipe */ +rw::gl3::Shader *leedsVehicleShader_add; +rw::gl3::Shader *leedsVehicleShader_blend; + rw::gl3::Shader *neoVehicleShader; +static rw::RawMatrix normal2texcoord_flipU = { + { -0.5f, 0.0f, 0.0f }, 0.0f, + { 0.0f, -0.5f, 0.0f }, 0.0f, + { 0.0f, 0.0f, 1.0f }, 0.0f, + { 0.5f, 0.5f, 0.0f }, 1.0f +}; + +static void +uploadEnvMatrix(rw::Frame *frame) +{ + using namespace rw; + using namespace rw::gl3; + + Matrix invMat; + if(frame == nil) + frame = engine->currentCamera->getFrame(); + + // cache the matrix across multiple meshes + static RawMatrix envMtx; +// can't do it, frame matrix may change +// if(frame != lastEnvFrame){ +// lastEnvFrame = frame; + { + + Matrix tmp = *frame->getLTM(); + // Now the weird part: we remove the camera pitch + tmp.at.z = 0.0f; + tmp.at = normalize(tmp.at); + tmp.right.x = -tmp.at.y; + tmp.right.y = tmp.at.x; + tmp.right.z = 0.0f;; + tmp.up.set(0.0f, 0.0f, 1.0f); + tmp.pos.set(0.0f, 0.0f, 0.0f); + tmp.flags = Matrix::TYPEORTHONORMAL; + + RawMatrix invMtx; + Matrix::invert(&invMat, &tmp); + convMatrix(&invMtx, &invMat); + RawMatrix::mult(&envMtx, &invMtx, &normal2texcoord_flipU); + } + glUniformMatrix4fv(U(u_texMatrix), 1, GL_FALSE, (float*)&envMtx); +} + +static void +leedsVehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::gl3; + + Material *m; + + setWorldMatrix(atomic->getFrame()->getLTM()); + lightingCB(atomic); + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(header->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); + glBindBuffer(GL_ARRAY_BUFFER, header->vbo); + setAttribPointers(header->attribDesc, header->numAttribs); +#endif + + InstanceData *inst = header->inst; + rw::int32 n = header->numMeshes; + + if(bChromeCheat) + leedsVehicleShader_blend->use(); + else + leedsVehicleShader_add->use(); + + setTexture(1, EnvMapTex); + uploadEnvMatrix(nil); + + SetRenderState(SRCBLEND, BLENDONE); + + while(n--){ + m = inst->material; + + rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); + + float coef = 0.0f; + if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP) + coef = RpMatFXMaterialGetEnvMapCoefficient(m); + coef *= 0.5f; + if(bChromeCheat && coef > 0.0f) + coef = 1.0f; + glUniform1f(U(u_fxparams), coef); + + setMaterial(m->color, m->surfaceProps); + + setTexture(0, m->texture); + + drawInst(header, inst); + inst++; + } + + setTexture(1, nil); + + SetRenderState(SRCBLEND, BLENDSRCALPHA); + +#ifndef RW_GL_USE_VAOS + disableAttribPointers(header->attribDesc, header->numAttribs); +#endif +} + + static void uploadSpecLights(void) { @@ -85,7 +199,8 @@ vehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) // TODO: make this less of a kludge if(VehiclePipeSwitch == VEHICLEPIPE_MATFX){ - matFXGlobals.pipelines[rw::platform]->render(atomic); + leedsVehicleRenderCB(atomic, header); +// matFXGlobals.pipelines[rw::platform]->render(atomic); return; } @@ -172,6 +287,19 @@ CreateVehiclePipe(void) assert(neoVehicleShader); } + { +#include "shaders/leedsVehicle_add_gl.inc" +#include "shaders/leedsVehicle_blend_gl.inc" +#include "shaders/leedsVehicle_vs_gl.inc" + const char *vs[] = { shaderDecl, header_vert_src, leedsVehicle_vert_src, nil }; + const char *fs_add[] = { shaderDecl, header_frag_src, leedsVehicle_add_frag_src, nil }; + const char *fs_blend[] = { shaderDecl, header_frag_src, leedsVehicle_blend_frag_src, nil }; + leedsVehicleShader_add = Shader::create(vs, fs_add); + assert(leedsVehicleShader_add); + leedsVehicleShader_blend = Shader::create(vs, fs_blend); + assert(leedsVehicleShader_blend); + } + rw::gl3::ObjPipeline *pipe = rw::gl3::ObjPipeline::create(); pipe->instanceCB = rw::gl3::defaultInstanceCB; @@ -186,6 +314,12 @@ DestroyVehiclePipe(void) neoVehicleShader->destroy(); neoVehicleShader = nil; + leedsVehicleShader_add->destroy(); + leedsVehicleShader_add = nil; + + leedsVehicleShader_blend->destroy(); + leedsVehicleShader_blend = nil; + ((rw::gl3::ObjPipeline*)vehiclePipe)->destroy(); vehiclePipe = nil; } @@ -611,6 +745,9 @@ CustomPipeRegisterGL(void) u_amb = rw::gl3::registerUniform("u_amb"); u_emiss = rw::gl3::registerUniform("u_emiss"); u_colorscale = rw::gl3::registerUniform("u_colorscale"); + + u_texMatrix = rw::gl3::registerUniform("u_texMatrix"); + u_fxparams = rw::gl3::registerUniform("u_fxparams"); } diff --git a/src/extras/shaders/Makefile b/src/extras/shaders/Makefile index 355d71af..7fa0f125 100644 --- a/src/extras/shaders/Makefile +++ b/src/extras/shaders/Makefile @@ -4,7 +4,8 @@ all: im2d_gl.inc simple_fs_gl.inc default_UV2_gl.inc \ neoWorldVC_fs_gl.inc neoGloss_vs_gl.inc neoGloss_fs_gl.inc \ neoVehicle_vs_gl.inc neoVehicle_fs_gl.inc \ im2d_UV2_gl.inc screenDroplet_fs_gl.inc \ - leedsBuilding_vs_gl.inc scale_fs_gl.inc + leedsBuilding_vs_gl.inc scale_fs_gl.inc \ + leedsVehicle_vs_gl.inc leedsVehicle_add_gl.inc leedsVehicle_blend_gl.inc im2d_gl.inc: im2d.vert (echo 'const char *im2d_vert_src =';\ @@ -87,3 +88,18 @@ scale_fs_gl.inc: scale.frag (echo 'const char *scale_frag_src =';\ sed 's/..*/"&\\n"/' scale.frag;\ echo ';') >scale_fs_gl.inc + +leedsVehicle_vs_gl.inc: leedsVehicle.vert + (echo 'const char *leedsVehicle_vert_src =';\ + sed 's/..*/"&\\n"/' leedsVehicle.vert;\ + echo ';') >leedsVehicle_vs_gl.inc + +leedsVehicle_add_gl.inc: leedsVehicle_add.frag + (echo 'const char *leedsVehicle_add_frag_src =';\ + sed 's/..*/"&\\n"/' leedsVehicle_add.frag;\ + echo ';') >leedsVehicle_add_gl.inc + +leedsVehicle_blend_gl.inc: leedsVehicle_blend.frag + (echo 'const char *leedsVehicle_blend_frag_src =';\ + sed 's/..*/"&\\n"/' leedsVehicle_blend.frag;\ + echo ';') >leedsVehicle_blend_gl.inc diff --git a/src/extras/shaders/leedsVehicle.vert b/src/extras/shaders/leedsVehicle.vert new file mode 100644 index 00000000..b93c7ea0 --- /dev/null +++ b/src/extras/shaders/leedsVehicle.vert @@ -0,0 +1,27 @@ +uniform mat4 u_texMatrix; + +VSIN(ATTRIB_POS) vec3 in_pos; + +VSOUT vec4 v_color; +VSOUT vec2 v_tex0; +VSOUT vec2 v_tex1; +VSOUT float v_fog; + +void +main(void) +{ + vec4 Vertex = u_world * vec4(in_pos, 1.0); + gl_Position = u_proj * u_view * Vertex; + vec3 Normal = mat3(u_world) * in_normal; + + v_tex0 = in_tex0; + v_tex1 = (u_texMatrix * vec4(Normal, 1.0)).xy; + + v_color = in_color; + v_color.rgb += u_ambLight.rgb*surfAmbient; + v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse; + v_color = clamp(v_color, 0.0, 1.0); + v_color *= u_matColor; + + v_fog = DoFog(gl_Position.w); +} diff --git a/src/extras/shaders/leedsVehicle_VS.cso b/src/extras/shaders/leedsVehicle_VS.cso new file mode 100644 index 0000000000000000000000000000000000000000..57db3798aa1d793f5cc695510cc96d436519aad8 GIT binary patch literal 1204 zcmZQz`uG3e|6T^?5Jx8&1_p*dj0_AQF)juM1`wZtk%8eWBLl+|kT3&310#bS!xsh! zU}0onU}9ikU}0cl5CG|8U|>)HiwQ6=GB`2lK*empVtfpY3|4TxE?_Z11_=f?h6zx0 z3&3JL42%p$aCOVUVjK+23`z`Jpz4k=GJu@Lz{tSFa0M#%1gwsifsw%suJ;{SOp}3y zVHwGOrC&+GOeQEjWE{P?H3^^c!iy4yhbMlL@nO~4!oLQ2YpU04rS(KU#X07&SWMBwk zWMD{v(z#HYl>y{W9tM!_D;OCVauZ9O^K%&T@{4j4b3hJUy?QmsjUWsS28O)ST$juu zu=k2V_Jd-GkpTojzGGl0E-gw6D9SG=W++Lm0GUx%9B&kFz~GyiT$Ep&pH`xv5u~Z$ z;S=nm5S)>il3JwToS$2enUh+iV5w(hsb^_wq-ShsXb3Vpkb!}fg@Jzo#AF8t28ITE z5L+H(DFZ_T0|WmA5Sy8Sp@9*~W@TV#V1lx_7#JFu8Tco#GB7YRFz`1pFoaHEWO%ZG z1(c+~{3jr@ConKPX@H3_F@VHYp@=bq#r}iEz){Y?e*mNhVlI0FBSYu}PPn=34IB(l zKuHa(9%3$g0~c5fVlK!GMh3kYDuDdYumR+5kQtXjat@T37`FCzm7*j^Tf zRSVR?>4$-diGibmnc@EgkhzQu{0$(rAal7G7??qPMsWD90=tuef&T)C&%^Kp%x7d^ z2E|K*7Ciiz8#KY;4T@7(yf8OtgT+=gfcyb*2lE3ETZiGv0uY~pfw6&s;eP`kL+Ckt&dCs7#bKD z*f+q~j10_hHUk6y1gQ7~1`hrOFg7Cx{{km)(C{}fGCbM9$ngZsXJp`SU|@K%fq~=6 z0#>j*M*{=H{{}_|1}L8$B;UZmuxbND9>o6-7Gq&xU}0nc@t;g!WOxD+TL@Ca#K6(O t$N*CFe*!|ystr&z3qWE_4D29xG%$hHJptLr#K6Jdz{K#R;s1XI1^|nCT{r*$ literal 0 HcmV?d00001 diff --git a/src/extras/shaders/leedsVehicle_add_PS.hlsl b/src/extras/shaders/leedsVehicle_add_PS.hlsl new file mode 100644 index 00000000..943926cf --- /dev/null +++ b/src/extras/shaders/leedsVehicle_add_PS.hlsl @@ -0,0 +1,34 @@ +struct VS_out { + float4 Position : POSITION; + float3 TexCoord0 : TEXCOORD0; + float2 TexCoord1 : TEXCOORD1; + float4 Color : COLOR0; +}; + +sampler2D diffTex : register(s0); +sampler2D envTex : register(s1); + +float4 fogColor : register(c0); + +float4 fxparams : register(c1); + +#define shininess (fxparams.x) + +float4 main(VS_out input) : COLOR +{ + float4 pass1 = input.Color*tex2D(diffTex, input.TexCoord0.xy); + float4 pass2 = tex2D(envTex, input.TexCoord1.xy); + pass2.a *= shininess; + + pass1.rgb = lerp(fogColor.rgb, pass1.rgb, input.TexCoord0.z); + pass2.rgb = lerp(float3(0.0, 0.0, 0.0), pass2.rgb, input.TexCoord0.z); + + // We simulate drawing this in two passes. + // First pass with standard blending, second with addition + // We premultiply alpha so render state should be one. + float4 color; + color.rgb = pass1.rgb*pass1.a + pass2.rgb*pass2.a; + color.a = pass1.a; + + return color; +} diff --git a/src/extras/shaders/leedsVehicle_add_PS.inc b/src/extras/shaders/leedsVehicle_add_PS.inc new file mode 100644 index 00000000..dc8378f4 --- /dev/null +++ b/src/extras/shaders/leedsVehicle_add_PS.inc @@ -0,0 +1,44 @@ +static unsigned char leedsVehicle_add_PS_cso[] = { + 0x00, 0x02, 0xff, 0xff, 0xfe, 0xff, 0x40, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, + 0x04, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xc1, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x02, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x84, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, + 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x06, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x64, 0x69, 0x66, 0x66, 0x54, 0x65, 0x78, 0x00, 0x04, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x6e, 0x76, 0x54, 0x65, 0x78, 0x00, 0xab, 0x04, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0xab, 0xab, 0xab, + 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x78, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x00, 0x70, 0x73, 0x5f, 0x32, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, + 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, + 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, + 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0xab, 0xab, 0xab, + 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x07, 0xb0, + 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x03, 0xb0, + 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, + 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, 0xa0, + 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x01, 0x08, 0x0f, 0xa0, + 0x42, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0xb0, + 0x01, 0x08, 0xe4, 0xa0, 0x42, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0f, 0x80, + 0x00, 0x00, 0xe4, 0xb0, 0x00, 0x08, 0xe4, 0xa0, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x08, 0x80, 0x00, 0x00, 0xff, 0x80, 0x01, 0x00, 0x00, 0xa0, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xaa, 0xb0, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x90, 0x01, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xe4, 0xa1, 0x05, 0x00, 0x00, 0x03, 0x02, 0x00, 0x08, 0x80, + 0x01, 0x00, 0xff, 0x80, 0x00, 0x00, 0xff, 0x90, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x07, 0x80, 0x00, 0x00, 0xaa, 0xb0, 0x01, 0x00, 0xe4, 0x80, + 0x00, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x07, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0xff, 0x80, 0x00, 0x00, 0xe4, 0x80, + 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0x80, + 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/leedsVehicle_add_gl.inc b/src/extras/shaders/leedsVehicle_add_gl.inc new file mode 100644 index 00000000..a9835b13 --- /dev/null +++ b/src/extras/shaders/leedsVehicle_add_gl.inc @@ -0,0 +1,34 @@ +const char *leedsVehicle_add_frag_src = +"uniform sampler2D tex0;\n" +"uniform sampler2D tex1;\n" + +"uniform float u_fxparams;\n" + +"#define shininess (u_fxparams)\n" + +"FSIN vec4 v_color;\n" +"FSIN vec2 v_tex0;\n" +"FSIN vec2 v_tex1;\n" +"FSIN float v_fog;\n" + +"void\n" +"main(void)\n" +"{\n" +" vec4 pass1 = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n" +" vec4 pass2 = texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y));\n" +" pass2.a *= shininess;\n" + +" pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_fog);\n" +" pass2.rgb = mix(vec3(0.0, 0.0, 0.0), pass2.rgb, v_fog);\n" + +" // We simulate drawing this in two passes.\n" +" // We premultiply alpha so render state should be one.\n" +" vec4 color;\n" +" color.rgb = pass1.rgb*pass1.a + pass2.rgb*pass2.a;\n" +" color.a = pass1.a;\n" + +" DoAlphaTest(color.a);\n" + +" FRAGCOLOR(color);\n" +"}\n" +; diff --git a/src/extras/shaders/leedsVehicle_blend.frag b/src/extras/shaders/leedsVehicle_blend.frag new file mode 100644 index 00000000..a3fab072 --- /dev/null +++ b/src/extras/shaders/leedsVehicle_blend.frag @@ -0,0 +1,32 @@ +uniform sampler2D tex0; +uniform sampler2D tex1; + +uniform float u_fxparams; + +#define shininess (u_fxparams) + +FSIN vec4 v_color; +FSIN vec2 v_tex0; +FSIN vec2 v_tex1; +FSIN float v_fog; + +void +main(void) +{ + vec4 pass1 = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); + vec4 pass2 = texture(tex1, vec2(v_tex1.x, 1.0-v_tex1.y)); + pass2.a *= shininess; + + pass1.rgb = mix(u_fogColor.rgb, pass1.rgb, v_fog); + pass2.rgb = mix(vec3(0.0, 0.0, 0.0), pass2.rgb, v_fog); + + // We simulate drawing this in two passes. + // We premultiply alpha so render state should be one. + vec4 color; + color.rgb = pass1.rgb*pass1.a*(1.0-pass2.a) + pass2.rgb*pass2.a; + color.a = pass1.a*(1.0-pass2.a) + pass2.a; + + DoAlphaTest(color.a); + + FRAGCOLOR(color); +} diff --git a/src/extras/shaders/leedsVehicle_blend_PS.cso b/src/extras/shaders/leedsVehicle_blend_PS.cso new file mode 100644 index 0000000000000000000000000000000000000000..8d1048039f42ac74424500173845a4f12cf6bde3 GIT binary patch literal 572 zcmZQz`v3pme+LHV5Jx8&1_p)`3=9k)F%|{}1`wZtk%8eL0|P@20|Nsy0|Nsi0~13D zNDTu6Lkn1pk%5tcjiCoBHV32~s%`~TYzJ5jq7EjOl9`qkl3KyQ!ob4-l3|3ZP0cF< z39m*MPs>kt&d>FTgMh0d$n}LCU0#tkg0|);C7@LuUe}NM?$oLx=7@llk z;CKS&GcxcuFfu&Zz{v4r0Sf~I3j+f?NPYqX!xIp_kQJSD+J`)2+10%!#21W*k1&j;~OiT=nU^d7+MyMPU14APd v0|VF{%nT4aL3)@N{x=9QFt9K)us49%j1aeh^fNJV@Ha3sJZbp Date: Sun, 10 Jan 2021 13:05:34 +0100 Subject: [PATCH 34/68] dont render untextured world --- src/extras/custompipes_d3d9.cpp | 17 ++++++++--------- src/extras/custompipes_gl.cpp | 7 ++++++- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/extras/custompipes_d3d9.cpp b/src/extras/custompipes_d3d9.cpp index 2483bb30..c4505b75 100644 --- a/src/extras/custompipes_d3d9.cpp +++ b/src/extras/custompipes_d3d9.cpp @@ -733,6 +733,9 @@ AtomicFirstPass(RpAtomic *atomic, int pass) for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){ Material *m = inst->material; + if(m->texture == nil) + continue; + if(inst->vertexAlpha || m->color.alpha != 255 || IsTextureTransparent(m->texture)){ defer = true; @@ -769,10 +772,7 @@ AtomicFirstPass(RpAtomic *atomic, int pass) colorscale[0] = colorscale[1] = colorscale[2] = cs; d3ddevice->SetPixelShaderConstantF(CustomPipes::PSLOC_colorscale, colorscale, 1); - if(m->texture) - d3d::setTexture(0, m->texture); - else - d3d::setTexture(0, gpWhiteTexture); // actually we don't even render this + d3d::setTexture(0, m->texture); setMaterial(m->color, m->surfaceProps, 0.5f); @@ -836,19 +836,18 @@ RenderBlendPass(int pass) InstanceData *inst = building->instHeader->inst; for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ Material *m = inst->material; + if(m->texture == nil) + continue; if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255) continue; // already done this one float cs = 1.0f; - if(m->texture) + if(m->texture) // always true cs = 255/128.0f; colorscale[0] = colorscale[1] = colorscale[2] = cs; d3ddevice->SetPixelShaderConstantF(CustomPipes::PSLOC_colorscale, colorscale, 1); - if(m->texture) - d3d::setTexture(0, m->texture); - else - d3d::setTexture(0, gpWhiteTexture); // actually we don't even render this + d3d::setTexture(0, m->texture); rw::RGBA color = m->color; color.alpha = (color.alpha * building->fadeAlpha)/255; diff --git a/src/extras/custompipes_gl.cpp b/src/extras/custompipes_gl.cpp index e9350802..54e212d6 100644 --- a/src/extras/custompipes_gl.cpp +++ b/src/extras/custompipes_gl.cpp @@ -805,6 +805,9 @@ AtomicFirstPass(RpAtomic *atomic, int pass) for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){ Material *m = inst->material; + if(m->texture == nil) + continue; + if(inst->vertexAlpha || m->color.alpha != 255 || IsTextureTransparent(m->texture)){ defer = true; @@ -913,6 +916,8 @@ RenderBlendPass(int pass) InstanceData *inst = building->instHeader->inst; for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){ Material *m = inst->material; + if(m->texture == nil) + continue; if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255) continue; // already done this one @@ -921,7 +926,7 @@ RenderBlendPass(int pass) setMaterial(color, m->surfaceProps, 0.5f); float cs = 1.0f; - if(m->texture) + if(m->texture) // always true cs = 255/128.0f; colorscale[0] = colorscale[1] = colorscale[2] = cs; glUniform4fv(U(CustomPipes::u_colorscale), 1, colorscale); From c631e6c61c326ad17d4ee6483a8268720ea8a0f3 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 10 Jan 2021 14:32:37 +0100 Subject: [PATCH 35/68] env map tweaks --- src/core/re3.cpp | 2 ++ src/extras/custompipes.cpp | 2 +- src/render/Renderer.cpp | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 65bb61b4..53a4396d 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -647,6 +647,8 @@ extern bool gbRenderWorld2; 1, CustomPipes::VEHICLEPIPE_MATFX, CustomPipes::VEHICLEPIPE_NEO, vehpipenames); DebugMenuEntrySetWrap(e, true); DebugMenuAddVarBool8("Render", "Chrome cheat", &CustomPipes::bChromeCheat, nil); +extern bool gbRenderDebugEnvMap; + DebugMenuAddVarBool8("Render", "Show Env map", &gbRenderDebugEnvMap, nil); DebugMenuAddVar("Render", "Neo Vehicle Shininess", &CustomPipes::VehicleShininess, nil, 0.1f, 0, 1.0f); DebugMenuAddVar("Render", "Neo Vehicle Specularity", &CustomPipes::VehicleSpecularity, nil, 0.1f, 0, 1.0f); DebugMenuAddVarBool8("Render", "Neo Ped Rim light enable", &CustomPipes::RimlightEnable, nil); diff --git a/src/extras/custompipes.cpp b/src/extras/custompipes.cpp index f7f8bbe5..379e7c8a 100644 --- a/src/extras/custompipes.cpp +++ b/src/extras/custompipes.cpp @@ -48,7 +48,7 @@ rw::TexDictionary *neoTxd; bool bChromeCheat; bool bRenderingEnvMap; -int32 EnvMapSize = 128; +int32 EnvMapSize = 256; rw::Camera *EnvMapCam; rw::Texture *EnvMapTex; rw::Texture *EnvMaskTex; diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 3065027b..9ed556e4 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -1809,6 +1809,7 @@ CRenderer::GenerateEnvironmentMap(void) RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE); RwRenderStateSet(rwRENDERSTATETEXTURERASTER, CPostFX::pBackBuffer); + RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR); RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE); RwIm2DRenderIndexedPrimitive(rwPRIMTYPETRILIST, Screen2EnvQuad, 4, EnvQuadIndices, 6); RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE); From c3b6e9da43c1e61a076056feb74aefbecbad39c6 Mon Sep 17 00:00:00 2001 From: shfil Date: Sun, 10 Jan 2021 17:14:33 +0100 Subject: [PATCH 36/68] Fix linux build --- src/vehicles/Cranes.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vehicles/Cranes.cpp b/src/vehicles/Cranes.cpp index ffcb80d0..ce254100 100644 --- a/src/vehicles/Cranes.cpp +++ b/src/vehicles/Cranes.cpp @@ -466,7 +466,7 @@ bool CCranes::DoesMilitaryCraneHaveThisOneAlready(uint32 mi) case MI_FIRETRUCK: return (CarsCollectedMilitaryCrane & 1); case MI_AMBULAN: return (CarsCollectedMilitaryCrane & 2); case MI_ENFORCER: return (CarsCollectedMilitaryCrane & 4); - case MI_FBIRANCH: return (CarsCollectedMilitaryCrane & 8); + case (uint32)MI_FBIRANCH: return (CarsCollectedMilitaryCrane & 8); case MI_RHINO: return (CarsCollectedMilitaryCrane & 0x10); case MI_BARRACKS: return (CarsCollectedMilitaryCrane & 0x20); case MI_POLICE: return (CarsCollectedMilitaryCrane & 0x40); @@ -481,7 +481,7 @@ void CCranes::RegisterCarForMilitaryCrane(uint32 mi) case MI_FIRETRUCK: CarsCollectedMilitaryCrane |= 1; break; case MI_AMBULAN: CarsCollectedMilitaryCrane |= 2; break; case MI_ENFORCER: CarsCollectedMilitaryCrane |= 4; break; - case MI_FBIRANCH: CarsCollectedMilitaryCrane |= 8; break; + case (uint32)MI_FBIRANCH: CarsCollectedMilitaryCrane |= 8; break; case MI_RHINO: CarsCollectedMilitaryCrane |= 0x10; break; case MI_BARRACKS: CarsCollectedMilitaryCrane |= 0x20; break; case MI_POLICE: CarsCollectedMilitaryCrane |= 0x40; break; From ebca91e0d0e84c19198e7e9968050d8a3b1c3960 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 10 Jan 2021 18:43:35 +0100 Subject: [PATCH 37/68] update librw --- src/core/main.cpp | 2 +- vendor/librw | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/main.cpp b/src/core/main.cpp index d9579fee..d0663c30 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -1172,7 +1172,7 @@ if(gbRenderWater) if(gbRenderEverythingBarRoads) CRenderer::RenderEverythingBarRoads(); - // get env map here? + // seam fixer // moved this: // CRenderer::RenderFadingInEntities(); } diff --git a/vendor/librw b/vendor/librw index ed9cb45e..61b288a9 160000 --- a/vendor/librw +++ b/vendor/librw @@ -1 +1 @@ -Subproject commit ed9cb45ee9a2749a0a89231bf16f09a5c53bfc92 +Subproject commit 61b288a9fe72ae4073c0ac5fd2a5815ed510c8c8 From 93ea98520bb652095c9f09ed5032842963e2a86c Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 10 Jan 2021 19:45:58 +0100 Subject: [PATCH 38/68] mobile building rendering --- src/core/Frontend.cpp | 23 ++++-- src/core/re3.cpp | 9 ++- src/extras/custompipes.cpp | 1 + src/extras/custompipes.h | 5 ++ src/extras/custompipes_d3d9.cpp | 29 ++++++-- src/extras/custompipes_gl.cpp | 29 ++++++-- src/extras/postfx.h | 8 +- src/extras/shaders/Makefile | 7 +- src/extras/shaders/leedsBuilding_VS.hlsl | 1 - src/extras/shaders/leedsBuilding_mobile.vert | 52 +++++++++++++ .../shaders/leedsBuilding_mobile_VS.cso | Bin 0 -> 808 bytes .../shaders/leedsBuilding_mobile_VS.hlsl | 64 ++++++++++++++++ .../shaders/leedsBuilding_mobile_VS.inc | 70 ++++++++++++++++++ .../shaders/leedsBuilding_mobile_vs_gl.inc | 54 ++++++++++++++ 14 files changed, 327 insertions(+), 25 deletions(-) create mode 100644 src/extras/shaders/leedsBuilding_mobile.vert create mode 100644 src/extras/shaders/leedsBuilding_mobile_VS.cso create mode 100644 src/extras/shaders/leedsBuilding_mobile_VS.hlsl create mode 100644 src/extras/shaders/leedsBuilding_mobile_VS.inc create mode 100644 src/extras/shaders/leedsBuilding_mobile_vs_gl.inc diff --git a/src/core/Frontend.cpp b/src/core/Frontend.cpp index 11488aec..e0428fcf 100644 --- a/src/core/Frontend.cpp +++ b/src/core/Frontend.cpp @@ -58,6 +58,19 @@ const CRGBA RADIO_SELECTOR_COLOR = SLIDEROFF_COLOR; const CRGBA INACTIVE_RADIO_COLOR(100, 100, 255, 100); const CRGBA SCROLLBAR_COLOR = LABEL_COLOR; +#if 0 +// Mobile +#define DEFAULT_BRIGHTNESS 0x150 +#define MIN_BRIGHTNESS 180 +#define MAX_BRIGHTNESS 700 +#else +// PS2 +// 8 bars (32 step) +#define DEFAULT_BRIGHTNESS 0x120 +#define MIN_BRIGHTNESS 0x80 +#define MAX_BRIGHTNESS 0x180 +#endif + #define MAP_MIN_SIZE 162.f #define MAP_SIZE_TO_ALLOW_X_MOVE 297.f @@ -465,7 +478,7 @@ CMenuManager::CMenuManager() m_PrefsMusicVolume = 49; m_PrefsRadioStation = 0; m_PrefsStereoMono = 1; - m_PrefsBrightness = 256; + m_PrefsBrightness = DEFAULT_BRIGHTNESS; m_PrefsLOD = CRenderer::ms_lodDistScale; m_KeyPressedCode = -1; m_bFrontEnd_ReloadObrTxtGxt = false; @@ -674,8 +687,8 @@ CMenuManager::CheckSliderMovement(int value) { switch (aScreens[m_nCurrScreen].m_aEntries[m_nCurrOption].m_Action) { case MENUACTION_BRIGHTNESS: - m_PrefsBrightness += value * 24.19f; - m_PrefsBrightness = clamp(m_PrefsBrightness, 0, 384); + m_PrefsBrightness += value * 32.0f; + m_PrefsBrightness = clamp(m_PrefsBrightness, MIN_BRIGHTNESS, MAX_BRIGHTNESS); break; case MENUACTION_DRAWDIST: if(value > 0) @@ -1464,7 +1477,7 @@ CMenuManager::DrawStandardMenus(bool activeScreen) int lastActiveBarX; switch (aScreens[m_nCurrScreen].m_aEntries[i].m_Action) { case MENUACTION_BRIGHTNESS: - ProcessSlider(m_PrefsBrightness / 384.0f, 70.0f, HOVEROPTION_INCREASE_BRIGHTNESS, HOVEROPTION_DECREASE_BRIGHTNESS, SCREEN_WIDTH, true); + ProcessSlider((float)(m_PrefsBrightness - MIN_BRIGHTNESS) / (MAX_BRIGHTNESS - MIN_BRIGHTNESS), 70.0f, HOVEROPTION_INCREASE_BRIGHTNESS, HOVEROPTION_DECREASE_BRIGHTNESS, SCREEN_WIDTH, true); break; case MENUACTION_DRAWDIST: ProcessSlider((m_PrefsLOD - 0.925f) / 0.875f, 99.0f, HOVEROPTION_INCREASE_DRAWDIST, HOVEROPTION_DECREASE_DRAWDIST, SCREEN_WIDTH, true); @@ -4736,7 +4749,7 @@ CMenuManager::ProcessUserInput(uint8 goDown, uint8 goUp, uint8 optionSelected, u DMAudio.PlayFrontEndTrack(m_PrefsRadioStation, 1); SaveSettings(); } else if (m_nCurrScreen == MENUPAGE_DISPLAY_SETTINGS) { - m_PrefsBrightness = 256; + m_PrefsBrightness = DEFAULT_BRIGHTNESS; m_PrefsLOD = 1.2f; #ifdef LEGACY_MENU_OPTIONS m_PrefsVsync = true; diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 53a4396d..58d8cc6b 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -600,6 +600,7 @@ DebugMenuPopulate(void) DebugMenuAddCmd("Spawn", "Spawn Freeway", [](){ SpawnCar(MI_FREEWAY); }); DebugMenuAddVarBool8("Render", "Draw hud", &CHud::m_Wants_To_Draw_Hud, nil); + DebugMenuAddVar("Render", "Brightness", &FrontEndMenuManager.m_PrefsBrightness, nil, 16, 0, 700, nil); DebugMenuAddVarBool8("Render", "Backface Culling", &gBackfaceCulling, nil); DebugMenuAddVarBool8("Render", "PS2 Alpha test Emu", &gPS2alphaTest, nil); DebugMenuAddVarBool8("Render", "Frame limiter", &FrontEndMenuManager.m_PrefsFrameLimiter, nil); @@ -630,8 +631,8 @@ extern bool gbRenderWorld2; #endif #ifdef EXTENDED_COLOURFILTER - static const char *filternames[] = { "None", "Simple", "Normal", "Mobile" }; - e = DebugMenuAddVar("Render", "Colourfilter", &CPostFX::EffectSwitch, nil, 1, CPostFX::POSTFX_OFF, CPostFX::POSTFX_MOBILE, filternames); + static const char *filternames[] = { "None", "PS2" }; + e = DebugMenuAddVar("Render", "Colourfilter", &CPostFX::EffectSwitch, nil, 1, CPostFX::POSTFX_OFF, CPostFX::POSTFX_NORMAL, filternames); DebugMenuEntrySetWrap(e, true); DebugMenuAddVar("Render", "Intensity", &CPostFX::Intensity, nil, 0.05f, 0, 10.0f); DebugMenuAddVarBool8("Render", "Blur", &CPostFX::BlurOn, nil); @@ -642,6 +643,10 @@ extern bool gbRenderWorld2; DebugMenuAddVarBool8("Render", "Occlusion debug", &bDispayOccDebugStuff, nil); #endif #ifdef EXTENDED_PIPELINES + static const char *worldpipenames[] = { "PS2", "Mobile" }; + e = DebugMenuAddVar("Render", "World Rendering", &CustomPipes::WorldPipeSwitch, nil, + 1, CustomPipes::WORLDPIPE_PS2, CustomPipes::WORLDPIPE_MOBILE, worldpipenames); + DebugMenuEntrySetWrap(e, true); static const char *vehpipenames[] = { "MatFX", "Neo" }; e = DebugMenuAddVar("Render", "Vehicle Pipeline", &CustomPipes::VehiclePipeSwitch, nil, 1, CustomPipes::VEHICLEPIPE_MATFX, CustomPipes::VEHICLEPIPE_NEO, vehpipenames); diff --git a/src/extras/custompipes.cpp b/src/extras/custompipes.cpp index 379e7c8a..1d147ed6 100644 --- a/src/extras/custompipes.cpp +++ b/src/extras/custompipes.cpp @@ -370,6 +370,7 @@ AttachVehiclePipe(rw::Clump *clump) * Neo World pipe */ +int32 WorldPipeSwitch = 0; bool LightmapEnable; float LightmapMult = 1.0f; InterpolatedFloat WorldLightmapBlend(1.0f); diff --git a/src/extras/custompipes.h b/src/extras/custompipes.h index aed34520..a80546ef 100644 --- a/src/extras/custompipes.h +++ b/src/extras/custompipes.h @@ -102,6 +102,11 @@ void DestroyVehiclePipe(void); void AttachVehiclePipe(rw::Atomic *atomic); void AttachVehiclePipe(rw::Clump *clump); +enum { + WORLDPIPE_PS2, + WORLDPIPE_MOBILE +}; +extern int32 WorldPipeSwitch; extern bool LightmapEnable; extern float LightmapMult; extern InterpolatedFloat WorldLightmapBlend; diff --git a/src/extras/custompipes_d3d9.cpp b/src/extras/custompipes_d3d9.cpp index c4505b75..2ea2ede0 100644 --- a/src/extras/custompipes_d3d9.cpp +++ b/src/extras/custompipes_d3d9.cpp @@ -315,6 +315,7 @@ DestroyVehiclePipe(void) */ static void *leedsBuilding_VS; +static void *leedsBuilding_mobile_VS; static void *scale_PS; static void @@ -328,7 +329,10 @@ worldRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) setIndices(header->indexBuffer); setVertexDeclaration(header->vertexDeclaration); - setVertexShader(leedsBuilding_VS); + if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_MOBILE) + setVertexShader(CustomPipes::leedsBuilding_mobile_VS); + else + setVertexShader(CustomPipes::leedsBuilding_VS); setPixelShader(scale_PS); uploadMatrices(atomic->getFrame()->getLTM()); @@ -351,7 +355,7 @@ worldRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) Material *m = inst->material; float cs = 1.0f; - if(m->texture) + if(WorldPipeSwitch == WORLDPIPE_PS2 && m->texture) cs = 255/128.0f; colorscale[0] = colorscale[1] = colorscale[2] = cs; d3ddevice->SetPixelShaderConstantF(PSLOC_colorscale, colorscale, 1); @@ -361,7 +365,7 @@ worldRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) else d3d::setTexture(0, gpWhiteTexture); // actually we don't even render this - setMaterial(m->color, m->surfaceProps, 0.5f); + setMaterial(m->color, m->surfaceProps, WorldPipeSwitch == WORLDPIPE_PS2 ? 0.5f : 1.0f); SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); @@ -381,6 +385,9 @@ CreateWorldPipe(void) #include "shaders/leedsBuilding_VS.inc" leedsBuilding_VS = rw::d3d::createVertexShader(leedsBuilding_VS_cso); assert(leedsBuilding_VS); +#include "shaders/leedsBuilding_mobile_VS.inc" + leedsBuilding_mobile_VS = rw::d3d::createVertexShader(leedsBuilding_mobile_VS_cso); + assert(leedsBuilding_mobile_VS); #include "shaders/scale_PS.inc" scale_PS = rw::d3d::createPixelShader(scale_PS_cso); assert(scale_PS); @@ -397,6 +404,8 @@ DestroyWorldPipe(void) { rw::d3d::destroyVertexShader(leedsBuilding_VS); leedsBuilding_VS = nil; + rw::d3d::destroyVertexShader(leedsBuilding_mobile_VS); + leedsBuilding_mobile_VS = nil; rw::d3d::destroyPixelShader(scale_PS); scale_PS = nil; @@ -747,7 +756,10 @@ AtomicFirstPass(RpAtomic *atomic, int pass) setStreamSource(0, building->instHeader->vertexStream[0].vertexBuffer, 0, building->instHeader->vertexStream[0].stride); setIndices(building->instHeader->indexBuffer); setVertexDeclaration(building->instHeader->vertexDeclaration); - setVertexShader(CustomPipes::leedsBuilding_VS); + if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_MOBILE) + setVertexShader(CustomPipes::leedsBuilding_mobile_VS); + else + setVertexShader(CustomPipes::leedsBuilding_VS); setPixelShader(CustomPipes::scale_PS); d3ddevice->SetVertexShaderConstantF(VSLOC_combined, (float*)&building->combinedMat, 4); @@ -767,7 +779,7 @@ AtomicFirstPass(RpAtomic *atomic, int pass) } float cs = 1.0f; - if(m->texture) + if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_PS2 && m->texture) cs = 255/128.0f; colorscale[0] = colorscale[1] = colorscale[2] = cs; d3ddevice->SetPixelShaderConstantF(CustomPipes::PSLOC_colorscale, colorscale, 1); @@ -808,7 +820,10 @@ RenderBlendPass(int pass) using namespace rw::d3d; using namespace rw::d3d9; - setVertexShader(CustomPipes::leedsBuilding_VS); + if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_MOBILE) + setVertexShader(CustomPipes::leedsBuilding_mobile_VS); + else + setVertexShader(CustomPipes::leedsBuilding_VS); setPixelShader(CustomPipes::scale_PS); RGBAf amb, emiss; @@ -842,7 +857,7 @@ RenderBlendPass(int pass) continue; // already done this one float cs = 1.0f; - if(m->texture) // always true + if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_PS2 && m->texture) cs = 255/128.0f; colorscale[0] = colorscale[1] = colorscale[2] = cs; d3ddevice->SetPixelShaderConstantF(CustomPipes::PSLOC_colorscale, colorscale, 1); diff --git a/src/extras/custompipes_gl.cpp b/src/extras/custompipes_gl.cpp index 54e212d6..19e37ac1 100644 --- a/src/extras/custompipes_gl.cpp +++ b/src/extras/custompipes_gl.cpp @@ -331,6 +331,7 @@ DestroyVehiclePipe(void) */ rw::gl3::Shader *leedsWorldShader; +rw::gl3::Shader *leedsWorldShader_mobile; static void worldRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) @@ -353,7 +354,10 @@ worldRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) InstanceData *inst = header->inst; rw::int32 n = header->numMeshes; - leedsWorldShader->use(); + if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_MOBILE) + CustomPipes::leedsWorldShader_mobile->use(); + else + CustomPipes::leedsWorldShader->use(); RGBAf amb, emiss; amb.red = CTimeCycle::GetAmbientRed(); @@ -372,7 +376,7 @@ worldRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) m = inst->material; float cs = 1.0f; - if(m->texture) + if(WorldPipeSwitch == WORLDPIPE_PS2 && m->texture) cs = 255/128.0f; colorscale[0] = colorscale[1] = colorscale[2] = cs; glUniform4fv(U(u_colorscale), 1, colorscale); @@ -405,10 +409,14 @@ CreateWorldPipe(void) { #include "shaders/scale_fs_gl.inc" #include "shaders/leedsBuilding_vs_gl.inc" +#include "shaders/leedsBuilding_mobile_vs_gl.inc" const char *vs[] = { shaderDecl, header_vert_src, leedsBuilding_vert_src, nil }; + const char *vs_mobile[] = { shaderDecl, header_vert_src, leedsBuilding_mobile_vert_src, nil }; const char *fs[] = { shaderDecl, header_frag_src, scale_frag_src, nil }; leedsWorldShader = Shader::create(vs, fs); assert(leedsWorldShader); + leedsWorldShader_mobile = Shader::create(vs_mobile, fs); + assert(leedsWorldShader_mobile); } @@ -424,6 +432,8 @@ DestroyWorldPipe(void) { leedsWorldShader->destroy(); leedsWorldShader = nil; + leedsWorldShader_mobile->destroy(); + leedsWorldShader_mobile = nil; ((rw::gl3::ObjPipeline*)worldPipe)->destroy(); worldPipe = nil; @@ -816,8 +826,10 @@ AtomicFirstPass(RpAtomic *atomic, int pass) // alright we're rendering this atomic if(!setupDone){ - CustomPipes::leedsWorldShader->use(); -// defaultShader->use(); + if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_MOBILE) + CustomPipes::leedsWorldShader_mobile->use(); + else + CustomPipes::leedsWorldShader->use(); setWorldMatrix(&building->matrix); #ifdef RW_GL_USE_VAOS glBindVertexArray(building->instHeader->vao); @@ -845,7 +857,7 @@ AtomicFirstPass(RpAtomic *atomic, int pass) setMaterial(m->color, m->surfaceProps, 0.5f); float cs = 1.0f; - if(m->texture) + if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_PS2 && m->texture) cs = 255/128.0f; colorscale[0] = colorscale[1] = colorscale[2] = cs; glUniform4fv(U(CustomPipes::u_colorscale), 1, colorscale); @@ -885,7 +897,10 @@ RenderBlendPass(int pass) using namespace rw; using namespace rw::gl3; - CustomPipes::leedsWorldShader->use(); + if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_MOBILE) + CustomPipes::leedsWorldShader_mobile->use(); + else + CustomPipes::leedsWorldShader->use(); RGBAf amb, emiss; amb.red = CTimeCycle::GetAmbientRed(); @@ -926,7 +941,7 @@ RenderBlendPass(int pass) setMaterial(color, m->surfaceProps, 0.5f); float cs = 1.0f; - if(m->texture) // always true + if(CustomPipes::WorldPipeSwitch == CustomPipes::WORLDPIPE_PS2 && m->texture) cs = 255/128.0f; colorscale[0] = colorscale[1] = colorscale[2] = cs; glUniform4fv(U(CustomPipes::u_colorscale), 1, colorscale); diff --git a/src/extras/postfx.h b/src/extras/postfx.h index db702bf3..9538f8e1 100644 --- a/src/extras/postfx.h +++ b/src/extras/postfx.h @@ -7,9 +7,13 @@ class CPostFX public: enum { POSTFX_OFF, - POSTFX_SIMPLE, +// POSTFX_SIMPLE, POSTFX_NORMAL, - POSTFX_MOBILE +// POSTFX_MOBILE + + // not so sensible for the moment + POSTFX_SIMPLE = -1, + POSTFX_MOBILE = -2 }; static RwRaster *pFrontBuffer; static RwRaster *pBackBuffer; diff --git a/src/extras/shaders/Makefile b/src/extras/shaders/Makefile index 7fa0f125..87777e74 100644 --- a/src/extras/shaders/Makefile +++ b/src/extras/shaders/Makefile @@ -4,7 +4,7 @@ all: im2d_gl.inc simple_fs_gl.inc default_UV2_gl.inc \ neoWorldVC_fs_gl.inc neoGloss_vs_gl.inc neoGloss_fs_gl.inc \ neoVehicle_vs_gl.inc neoVehicle_fs_gl.inc \ im2d_UV2_gl.inc screenDroplet_fs_gl.inc \ - leedsBuilding_vs_gl.inc scale_fs_gl.inc \ + leedsBuilding_vs_gl.inc leedsBuilding_mobile_vs_gl.inc scale_fs_gl.inc \ leedsVehicle_vs_gl.inc leedsVehicle_add_gl.inc leedsVehicle_blend_gl.inc im2d_gl.inc: im2d.vert @@ -84,6 +84,11 @@ leedsBuilding_vs_gl.inc: leedsBuilding.vert sed 's/..*/"&\\n"/' leedsBuilding.vert;\ echo ';') >leedsBuilding_vs_gl.inc +leedsBuilding_mobile_vs_gl.inc: leedsBuilding_mobile.vert + (echo 'const char *leedsBuilding_mobile_vert_src =';\ + sed 's/..*/"&\\n"/' leedsBuilding_mobile.vert;\ + echo ';') >leedsBuilding_mobile_vs_gl.inc + scale_fs_gl.inc: scale.frag (echo 'const char *scale_frag_src =';\ sed 's/..*/"&\\n"/' scale.frag;\ diff --git a/src/extras/shaders/leedsBuilding_VS.hlsl b/src/extras/shaders/leedsBuilding_VS.hlsl index 3c40bef1..1ed939cc 100644 --- a/src/extras/shaders/leedsBuilding_VS.hlsl +++ b/src/extras/shaders/leedsBuilding_VS.hlsl @@ -2,7 +2,6 @@ #define surfEmissive (surfProps.w) - float4 emissive : register(c41); float4 ambient : register(c42); diff --git a/src/extras/shaders/leedsBuilding_mobile.vert b/src/extras/shaders/leedsBuilding_mobile.vert new file mode 100644 index 00000000..f06628ee --- /dev/null +++ b/src/extras/shaders/leedsBuilding_mobile.vert @@ -0,0 +1,52 @@ +uniform vec4 u_amb; +uniform vec4 u_emiss; + +#define surfEmissive (u_surfProps.w) + +#define vertContrast (1.5) +#define vertBrightness (0.25) +#define ambientContrast (1.2) +#define ambientBrightness (0.1) +#define emissiveContrast (1.25) +#define emissiveBrightness (0.05) + + +VSIN(ATTRIB_POS) vec3 in_pos; + +VSOUT vec4 v_color; +VSOUT vec2 v_tex0; +VSOUT float v_fog; + +void +main(void) +{ + vec4 Vertex = u_world * vec4(in_pos, 1.0); + gl_Position = u_proj * u_view * Vertex; + vec3 Normal = mat3(u_world) * in_normal; + + v_tex0 = in_tex0; + + vec4 vertCol = in_color; + vec4 amb = u_amb; + vec4 emiss = u_emiss; + + vertCol.xyz = ((vertCol.xyz - 0.5) * max(vertContrast, 0.0)) + 0.5; + vertCol.xyz += vertBrightness; + vertCol.xyz = max(vertCol.xyz, vec3(0.0,0.0,0.0)); + + amb.xyz = ((amb.xyz - 0.5) * max(ambientContrast, 0.0)) + 0.5; + amb.xyz += ambientBrightness; + amb.xyz = max(amb.xyz, vec3(0.0,0.0,0.0)); + + emiss.xyz = ((emiss.xyz - 0.5) * max(emissiveContrast, 0.0)) + 0.5; + emiss.xyz += emissiveBrightness; + emiss.xyz = max(emiss.xyz, vec3(0.0,0.0,0.0)); + v_color.xyz = emiss.xyz + (vertCol.xyz * amb.xyz); + v_color.w = vertCol.w; + + + v_color = clamp(v_color, 0.0, 1.0); + v_color.a *= u_matColor.a; + + v_fog = DoFog(gl_Position.w); +} diff --git a/src/extras/shaders/leedsBuilding_mobile_VS.cso b/src/extras/shaders/leedsBuilding_mobile_VS.cso new file mode 100644 index 0000000000000000000000000000000000000000..c3ac2b9b2e83b44ae5067ff09c30a09d86d72843 GIT binary patch literal 808 zcmZQz`uG3eemBZCoKEHO7JGc~V- zfsuikfsug)WHs2-x=ltA)%$(FB1xr06OFc_d zBRyk7Lqmo@1_o9Z2L1&M3=I1j7!KGoFgVzQ903w%W#C^hYvxS*Su-W=85kDWpFP84 z4-#hst8W0S1E~dJc?Je1NU-rw0I^va7#bKEAZ#uMh6W}E{s~MB49pA+>+i4~Wmi0MfH+0V~6QupXEgNDs2R z7#V(o+zZmr#K6GOz{K!>0>q8{PG35-zpFff4ig5qETNDah(evrKj7#LQeh%qxfS-`;XA1ns)8z^i*_V6);E(C=Y w0|Wm7kQoqr7(woC;Dd)NBPdxn@G-#L%<=#fXCOC2^fEtSWOy>+|9=Js0QBgWzyJUM literal 0 HcmV?d00001 diff --git a/src/extras/shaders/leedsBuilding_mobile_VS.hlsl b/src/extras/shaders/leedsBuilding_mobile_VS.hlsl new file mode 100644 index 00000000..23accf64 --- /dev/null +++ b/src/extras/shaders/leedsBuilding_mobile_VS.hlsl @@ -0,0 +1,64 @@ +#include "standardConstants.h" + +#define surfEmissive (surfProps.w) + +#define vertContrast (1.5) +#define vertBrightness (0.25) +#define ambientContrast (1.2) +#define ambientBrightness (0.1) +#define emissiveContrast (1.25) +#define emissiveBrightness (0.05) + +float4 emissive : register(c41); +float4 ambient : register(c42); + +struct VS_in +{ + float4 Position : POSITION; + float3 Normal : NORMAL; + float2 TexCoord : TEXCOORD0; + float4 Prelight : COLOR0; +}; + +struct VS_out { + float4 Position : POSITION; + float3 TexCoord0 : TEXCOORD0; // also fog + float4 Color : COLOR0; +}; + + +VS_out main(in VS_in input) +{ + VS_out output; + + output.Position = mul(combinedMat, input.Position); + float3 Vertex = mul(worldMat, input.Position).xyz; + float3 Normal = mul(normalMat, input.Normal); + + output.TexCoord0.xy = input.TexCoord; + + float4 vertCol = input.Prelight; + float4 amb = ambient; + float4 emiss = emissive; + + vertCol.xyz = ((vertCol.xyz - 0.5) * max(vertContrast, 0.0)) + 0.5; + vertCol.xyz += vertBrightness; + vertCol.xyz = max(vertCol.xyz, float3(0.0,0.0,0.0)); + + amb.xyz = ((amb.xyz - 0.5) * max(ambientContrast, 0.0)) + 0.5; + amb.xyz += ambientBrightness; + amb.xyz = max(amb.xyz, float3(0.0,0.0,0.0)); + + emiss.xyz = ((emiss.xyz - 0.5) * max(emissiveContrast, 0.0)) + 0.5; + emiss.xyz += emissiveBrightness; + emiss.xyz = max(emiss.xyz, float3(0.0,0.0,0.0)); + output.Color.xyz = emiss.xyz + (vertCol.xyz * amb.xyz); + output.Color.w = vertCol.w; + + output.Color = clamp(output.Color, 0.0, 1.0); + output.Color.a *= matCol.a; + + output.TexCoord0.z = clamp((output.Position.w - fogEnd)*fogRange, fogDisable, 1.0); + + return output; +} diff --git a/src/extras/shaders/leedsBuilding_mobile_VS.inc b/src/extras/shaders/leedsBuilding_mobile_VS.inc new file mode 100644 index 00000000..1433ca3f --- /dev/null +++ b/src/extras/shaders/leedsBuilding_mobile_VS.inc @@ -0,0 +1,70 @@ +static unsigned char leedsBuilding_mobile_VS_cso[] = { + 0x00, 0x02, 0xfe, 0xff, 0xfe, 0xff, 0x42, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xff, + 0x05, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2a, 0x00, + 0x01, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x98, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, + 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x29, 0x00, 0x01, 0x00, 0xa6, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, + 0x01, 0x00, 0x3a, 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc5, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x32, 0x00, + 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x6d, 0x62, 0x69, + 0x65, 0x6e, 0x74, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6d, 0x62, + 0x69, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x74, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x76, 0x65, 0x00, 0x66, 0x6f, 0x67, + 0x44, 0x61, 0x74, 0x61, 0x00, 0x6d, 0x61, 0x74, 0x43, 0x6f, 0x6c, 0x00, + 0x76, 0x73, 0x5f, 0x32, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, + 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, + 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, + 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x51, 0x00, 0x00, 0x05, + 0x04, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x00, 0xbf, 0x00, 0x00, 0xc0, 0x3f, + 0x00, 0x00, 0x40, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x05, + 0x05, 0x00, 0x0f, 0xa0, 0x9a, 0x99, 0x99, 0x3f, 0x9a, 0x99, 0x19, 0x3f, + 0x00, 0x00, 0xa0, 0x3f, 0xcd, 0xcc, 0x0c, 0x3f, 0x51, 0x00, 0x00, 0x05, + 0x06, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x05, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x0a, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x02, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x90, 0x04, 0x00, 0x00, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0x55, 0xa0, 0x04, 0x00, 0xaa, 0xa0, 0x0b, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xff, 0xa0, + 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x01, 0x80, 0x04, 0x00, 0x00, 0xa0, + 0x02, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0e, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x2a, 0x00, 0x90, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x0e, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x55, 0xa0, + 0x0b, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0e, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0xff, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x02, 0x00, 0x07, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x29, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x07, 0x80, 0x02, 0x00, 0xe4, 0x80, 0x05, 0x00, 0xaa, 0xa0, + 0x05, 0x00, 0xff, 0xa0, 0x0b, 0x00, 0x00, 0x03, 0x02, 0x00, 0x07, 0x80, + 0x02, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xff, 0xa0, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0xf9, 0x80, + 0x02, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x08, 0x80, + 0x02, 0x00, 0xff, 0x90, 0x0b, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0xff, 0xa0, 0x0a, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x06, 0x00, 0x00, 0xa0, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x08, 0xd0, 0x00, 0x00, 0xff, 0x80, + 0x0c, 0x00, 0xff, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x07, 0xd0, + 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, + 0x00, 0x00, 0x55, 0x90, 0x01, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, + 0x02, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x03, 0x00, 0xe4, 0xa0, + 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0x80, 0x0e, 0x00, 0x55, 0xa1, + 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0xe4, 0x80, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x0e, 0x00, 0xaa, 0xa0, 0x0b, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x0e, 0x00, 0xff, 0xa0, 0x0a, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x04, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x06, 0x00, 0x00, 0xa0, + 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xe0, 0x01, 0x00, 0xe4, 0x90, + 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/leedsBuilding_mobile_vs_gl.inc b/src/extras/shaders/leedsBuilding_mobile_vs_gl.inc new file mode 100644 index 00000000..56bb8a80 --- /dev/null +++ b/src/extras/shaders/leedsBuilding_mobile_vs_gl.inc @@ -0,0 +1,54 @@ +const char *leedsBuilding_mobile_vert_src = +"uniform vec4 u_amb;\n" +"uniform vec4 u_emiss;\n" + +"#define surfEmissive (u_surfProps.w)\n" + +"#define vertContrast (1.5)\n" +"#define vertBrightness (0.25)\n" +"#define ambientContrast (1.2)\n" +"#define ambientBrightness (0.1)\n" +"#define emissiveContrast (1.25)\n" +"#define emissiveBrightness (0.05)\n" + + +"VSIN(ATTRIB_POS) vec3 in_pos;\n" + +"VSOUT vec4 v_color;\n" +"VSOUT vec2 v_tex0;\n" +"VSOUT float v_fog;\n" + +"void\n" +"main(void)\n" +"{\n" +" vec4 Vertex = u_world * vec4(in_pos, 1.0);\n" +" gl_Position = u_proj * u_view * Vertex;\n" +" vec3 Normal = mat3(u_world) * in_normal;\n" + +" v_tex0 = in_tex0;\n" + +" vec4 vertCol = in_color;\n" +" vec4 amb = u_amb;\n" +" vec4 emiss = u_emiss;\n" + +" vertCol.xyz = ((vertCol.xyz - 0.5) * max(vertContrast, 0.0)) + 0.5;\n" +" vertCol.xyz += vertBrightness;\n" +" vertCol.xyz = max(vertCol.xyz, vec3(0.0,0.0,0.0));\n" +" \n" +" amb.xyz = ((amb.xyz - 0.5) * max(ambientContrast, 0.0)) + 0.5;\n" +" amb.xyz += ambientBrightness;\n" +" amb.xyz = max(amb.xyz, vec3(0.0,0.0,0.0));\n" +" \n" +" emiss.xyz = ((emiss.xyz - 0.5) * max(emissiveContrast, 0.0)) + 0.5;\n" +" emiss.xyz += emissiveBrightness;\n" +" emiss.xyz = max(emiss.xyz, vec3(0.0,0.0,0.0));\n" +" v_color.xyz = emiss.xyz + (vertCol.xyz * amb.xyz);\n" +" v_color.w = vertCol.w;\n" + + +" v_color = clamp(v_color, 0.0, 1.0);\n" +" v_color.a *= u_matColor.a;\n" + +" v_fog = DoFog(gl_Position.w);\n" +"}\n" +; From ca64363899928da4cb0011d631fcc627a7fd8bb5 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 10 Jan 2021 19:58:58 +0100 Subject: [PATCH 39/68] debugmenu vehicle spawn list --- src/core/re3.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 58d8cc6b..fcf43409 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -420,17 +420,15 @@ SwitchToMission(void) #endif static const char *carnames[] = { - "landstal", "idaho", "stinger", "linerun", "peren", "sentinel", "rio", "firetruk", "trash", "stretch", "manana", - "infernus", "voodoo", "pony", "mule", "cheetah", "ambulan", "fbicar", "moonbeam", "esperant", "taxi", "washing", - "bobcat", "mrwhoop", "bfinject", "hunter", "police", "enforcer", "securica", "banshee", "predator", "bus", - "rhino", "barracks", "cuban", "chopper", "angel", "coach", "cabbie", "stallion", "rumpo", "rcbandit", "romero", - "packer", "sentxs", "admiral", "squalo", "seaspar", "pizzaboy", "gangbur", "airtrain", "deaddodo", "speeder", - "reefer", "tropic", "flatbed", "yankee", "caddy", "zebra", "topfun", "skimmer", "pcj600", "faggio", "freeway", - "rcbaron", "rcraider", "glendale", "oceanic", "sanchez", "sparrow", "patriot", "lovefist", "coastg", "dinghy", - "hermes", "sabre", "sabretur", "pheonix", "walton", "regina", "comet", "deluxo", "burrito", "spand", "marquis", - "baggage", "kaufman", "maverick", "vcnmav", "rancher", "fbiranch", "virgo", "greenwoo", "jetmax", "hotring", - "sandking", "blistac", "polmav", "boxville", "benson", "mesa", "rcgoblin", "hotrina", "hotrinb", - "bloodra", "bloodrb", "vicechee" + "spider", "landstal", "idaho", "stinger", "linerun", "peren", "sentinel", "patriot", "firetruk", "trash", "stretch", + "manana", "infernus", "blista", "pony", "mule", "cheetah", "ambulan", "fbicar", "moonbeam", "esperant", "taxi", + "kuruma", "bobcat", "mrwhoop", "bfinject", "hearse", "police", "enforcer", "securica", "banshee", "bus", "rhino", + "barracks", "dodo", "coach", "cabbie", "stallion", "rumpo", "rcbandit", "bellyup", "mrwongs", "mafia", "yardie", + "yakuza", "diablos", "columb", "hoods", "panlant", "flatbed", "yankee", "borgnine", "toyz", "campvan", "ballot", + "shelby", "pontiac", "esprit", "ammotruk", "hotrod", "Sindacco_Car", "Forelli_Car", "ferry", "ghost", "speeder", + "reefer", "predator", "train", "escape", "chopper", "airtrain", "deaddodo", "angel", "pizzaboy", "noodleboy", + "pcj600", "faggio", "freeway", "angel2", "sanchez2", "sanchez", "rcgoblin", "rcraider", "hunter", "maverick", + "polmav", "vcnmav" }; static CTweakVar** TweakVarsList; @@ -563,7 +561,7 @@ DebugMenuPopulate(void) DebugMenuAddCmd("Cheats", "Pickup chicks", PickUpChicksCheat); static int spawnCarId = MI_LANDSTAL; - e = DebugMenuAddVar("Spawn", "Spawn Car ID", &spawnCarId, nil, 1, MI_LANDSTAL, MI_VICECHEE, carnames); + e = DebugMenuAddVar("Spawn", "Spawn Car ID", &spawnCarId, nil, 1, MI_SPIDER, MI_VCNMAV, carnames); DebugMenuEntrySetWrap(e, true); DebugMenuAddCmd("Spawn", "Spawn Car", [](){ if(spawnCarId == MI_CHOPPER || From adc712705522a6719d13851740f150712a1a8376 Mon Sep 17 00:00:00 2001 From: Fire-Head Date: Sun, 10 Jan 2021 22:24:21 +0300 Subject: [PATCH 40/68] fix pickup coronas --- src/control/Pickups.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/control/Pickups.cpp b/src/control/Pickups.cpp index 3470e475..5186a8d2 100644 --- a/src/control/Pickups.cpp +++ b/src/control/Pickups.cpp @@ -1186,7 +1186,9 @@ CPickups::DoPickUpEffects(CEntity *entity) CCoronas::REFLECTION_OFF, CCoronas::LOSCHECK_OFF, CCoronas::STREAK_OFF, - 0.0f); + 0.0f, + false, + -0.5f); } } @@ -1253,7 +1255,7 @@ CPickups::DoCollectableEffects(CEntity *entity) int32 color = (MAXDIST - dist) * (0.5f * s + 0.5f) / MAXDIST * 255.0f; CShadows::StoreStaticShadow((uintptr)entity, SHADOWTYPE_ADDITIVE, gpShadowExplosionTex, &pos, 2.0f, 0.0f, 0.0f, -2.0f, 0, color, color, color, 4.0f, 1.0f, 40.0f, false, 0.0f); - CCoronas::RegisterCorona((uintptr)entity, color, color, color, 255, pos, 0.6f, 40.0f, CCoronas::TYPE_RING, CCoronas::FLARE_NONE, CCoronas::REFLECTION_OFF, CCoronas::LOSCHECK_OFF, CCoronas::STREAK_OFF, 0.0f); + CCoronas::RegisterCorona((uintptr)entity, color, color, color, 255, pos, 0.6f, 40.0f, CCoronas::TYPE_HEX, CCoronas::FLARE_NONE, CCoronas::REFLECTION_OFF, CCoronas::LOSCHECK_OFF, CCoronas::STREAK_OFF, 0.0f); } entity->GetMatrix().SetRotateZOnly((float)(CTimer::GetTimeInMilliseconds() & 0xFFF) * DEGTORAD(360.0f / 0x1000)); From 75d1715442e2e21a6f7841e49b4b4b2bd8c4c0b4 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Sun, 10 Jan 2021 22:58:06 +0300 Subject: [PATCH 41/68] script file 1 done (hopefully) --- src/control/Script.cpp | 621 +++++++++++++++++++--------------------- src/control/Script.h | 8 + src/control/Script4.cpp | 2 + 3 files changed, 302 insertions(+), 329 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 4102946b..0a77d0bc 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -54,7 +54,7 @@ #include #endif -//--MIAMI: file done +//--LCS: file done except TODOs and command table uint8* CTheScripts::ScriptSpace; CRunningScript CTheScripts::ScriptsArray[MAX_NUM_SCRIPTS]; @@ -1855,13 +1855,11 @@ const uint32 CRunningScript::nSaveStructSize = sizeof(CRunningScript); #endif -// done(LCS) CMissionCleanup::CMissionCleanup() { Init(); } -// done(LCS) void CMissionCleanup::Init() { m_nCount = 0; @@ -1871,7 +1869,6 @@ void CMissionCleanup::Init() } } -// done(LCS) cleanup_entity_struct* CMissionCleanup::FindFree() { for (int i = 0; i < MAX_CLEANUP; i++){ @@ -1882,7 +1879,6 @@ cleanup_entity_struct* CMissionCleanup::FindFree() return nil; } -// done(LCS) void SleepThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) { printf("*** SLEEPING PED %i %i\n", pCleanup->id, pPed->GetModelIndex()); @@ -1891,7 +1887,6 @@ void SleepThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) pPed->bIsStaticWaitingForCollision = true; } -// done(LCS) void WakeThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) { printf("*** WAKING UP PED %i %i\n", pCleanup->id, pPed->GetModelIndex()); @@ -1901,7 +1896,6 @@ void WakeThisPed(cleanup_entity_struct* pCleanup, CPed* pPed) } -// done(LCS) void CMissionCleanup::AddEntityToList(int32 id, uint8 type) { cleanup_entity_struct* pNew = FindFree(); @@ -1912,7 +1906,6 @@ void CMissionCleanup::AddEntityToList(int32 id, uint8 type) m_nCount++; } -// done(LCS) void CMissionCleanup::RemoveEntityFromList(int32 id, uint8 type) { for (int i = 0; i < MAX_CLEANUP; i++){ @@ -1964,7 +1957,6 @@ void CMissionCleanup::RemoveEntityFromList(int32 id, uint8 type) } } -// done(LCS) void CMissionCleanup::CheckIfCollisionHasLoadedForMissionObjects() { for (int i = 0; i < MAX_CLEANUP; i++) { @@ -2071,7 +2063,6 @@ void CMissionCleanup::CheckIfCollisionHasLoadedForMissionObjects() } } -// done(LCS) except TODO void CMissionCleanup::Process() { CPopulation::m_AllRandomPedsThisType = -1; @@ -2160,7 +2151,6 @@ void CMissionCleanup::Process() * It has a weird usage: AreAnyCarsUpsideDown would fail any mission * just like death or arrest. */ - // done(LCS) except TODO void CUpsideDownCarCheck::Init() { for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){ @@ -2169,14 +2159,12 @@ void CUpsideDownCarCheck::Init() } } -// done(LCS) bool CUpsideDownCarCheck::IsCarUpsideDown(int32 id) { CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(id); return IsCarUpsideDown(pVehicle); } -// done(LCS) bool CUpsideDownCarCheck::IsCarUpsideDown(CVehicle* pVehicle) { script_assert(pVehicle); @@ -2185,7 +2173,6 @@ bool CUpsideDownCarCheck::IsCarUpsideDown(CVehicle* pVehicle) pVehicle->GetTurnSpeed().Magnitude() < UPSIDEDOWN_TURN_SPEED_THRESHOLD; } -// done(LCS) void CUpsideDownCarCheck::UpdateTimers() { uint32 timeStep = CTimer::GetTimeStepInMilliseconds(); @@ -2203,7 +2190,6 @@ void CUpsideDownCarCheck::UpdateTimers() } } -// done(LCS) bool CUpsideDownCarCheck::AreAnyCarsUpsideDown() { for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){ @@ -2213,7 +2199,6 @@ bool CUpsideDownCarCheck::AreAnyCarsUpsideDown() return false; } -// done(LCS) void CUpsideDownCarCheck::AddCarToCheck(int32 id) { uint16 index = 0; @@ -2227,7 +2212,6 @@ void CUpsideDownCarCheck::AddCarToCheck(int32 id) m_sCars[index].m_nUpsideDownTimer = 0; } -// done(LCS) void CUpsideDownCarCheck::RemoveCarFromCheck(int32 id) { for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){ @@ -2238,7 +2222,6 @@ void CUpsideDownCarCheck::RemoveCarFromCheck(int32 id) } } -// done(LCS) bool CUpsideDownCarCheck::HasCarBeenUpsideDownForAWhile(int32 id) { for (int i = 0; i < MAX_UPSIDEDOWN_CAR_CHECKS; i++){ @@ -2248,7 +2231,6 @@ bool CUpsideDownCarCheck::HasCarBeenUpsideDownForAWhile(int32 id) return false; } -// done(LCS) void stuck_car_data::Reset() { m_nVehicleIndex = -1; @@ -2259,7 +2241,6 @@ void stuck_car_data::Reset() m_bStuck = false; } -// done(LCS) void CStuckCarCheck::Init() { for (int i = 0; i < MAX_STUCK_CAR_CHECKS; i++) { @@ -2267,7 +2248,6 @@ void CStuckCarCheck::Init() } } -// done(LCS) void CStuckCarCheck::Process() { uint32 timer = CTimer::GetTimeInMilliseconds(); @@ -2288,7 +2268,6 @@ void CStuckCarCheck::Process() } } -// done(LCS) void CStuckCarCheck::AddCarToCheck(int32 id, float radius, uint32 time) { CVehicle* pv = CPools::GetVehiclePool()->GetAt(id); @@ -2309,7 +2288,6 @@ void CStuckCarCheck::AddCarToCheck(int32 id, float radius, uint32 time) m_sCars[index].m_bStuck = false; } -// done(LCS) void CStuckCarCheck::RemoveCarFromCheck(int32 id) { for (int i = 0; i < MAX_STUCK_CAR_CHECKS; i++){ @@ -2319,7 +2297,6 @@ void CStuckCarCheck::RemoveCarFromCheck(int32 id) } } -// done(LCS) bool CStuckCarCheck::HasCarBeenStuckForAWhile(int32 id) { for (int i = 0; i < MAX_STUCK_CAR_CHECKS; i++){ @@ -2329,7 +2306,6 @@ bool CStuckCarCheck::HasCarBeenStuckForAWhile(int32 id) return false; } -// done(LCS) void CRunningScript::CollectParameters(uint32* pIp, int16 total, int* pParameters) { while (total--){ @@ -2373,7 +2349,6 @@ void CRunningScript::CollectParameters(uint32* pIp, int16 total, int* pParameter } #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT -// done(LCS) int32* GetPointerToScriptVariableForDebug(CRunningScript* pScript, uint32* pIp, char* buf) { char tmpstr[24]; @@ -2410,15 +2385,15 @@ int32* GetPointerToScriptVariableForDebug(CRunningScript* pScript, uint32* pIp, strcat(buf, tmpstr); return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL)]; } - else { - script_assert(type >= ARGUMENT_TIMER); + else if (type >= ARGUMENT_TIMER) { sprintf(tmpstr, " TIMER%d@", (type - ARGUMENT_TIMER)); strcat(buf, tmpstr); return &pScript->m_anLocalVariables[NUM_LOCAL_VARS + 8 + (type - ARGUMENT_TIMER)]; // why 8? } + script_assert(false && "wrong type for variable"); + return nil; } -// done(LCS) int CRunningScript::CollectParameterForDebug(char* buf, bool& var) { var = false; @@ -2454,14 +2429,12 @@ int CRunningScript::CollectParameterForDebug(char* buf, bool& var) return 0; } -// done(LCS) void CRunningScript::GetStoredParameterForDebug(char* buf) { GetPointerToScriptVariableForDebug(this, &m_nIp, buf); } #endif -// done(LCS) int32 CRunningScript::CollectNextParameterWithoutIncreasingPC(uint32 ip) { uint32* pIp = &ip; @@ -2497,7 +2470,6 @@ int32 CRunningScript::CollectNextParameterWithoutIncreasingPC(uint32 ip) return -1; } -// done(LCS) void CRunningScript::StoreParameters(uint32* pIp, int16 number) { for (int16 i = 0; i < number; i++){ @@ -2505,7 +2477,6 @@ void CRunningScript::StoreParameters(uint32* pIp, int16 number) } } -// done(LCS) int32* GetPointerToScriptVariable(CRunningScript* pScript, uint32* pIp) { uint8 type = CTheScripts::Read1ByteFromScript(pIp); @@ -2533,19 +2504,18 @@ int32* GetPointerToScriptVariable(CRunningScript* pScript, uint32* pIp) else if (type >= ARGUMENT_LOCAL) { return &pScript->m_anLocalVariables[pScript->m_nLocalsPointer + (type - ARGUMENT_LOCAL)]; } - else { - script_assert(type >= ARGUMENT_TIMER); + else if (type >= ARGUMENT_TIMER) { return &pScript->m_anLocalVariables[NUM_LOCAL_VARS + 8 + (type - ARGUMENT_TIMER)]; } + script_assert(false && "wrong type for variable"); + return nil; } -// done(LCS) int32 *CRunningScript::GetPointerToScriptVariable(uint32* pIp, int16 type) { return ::GetPointerToScriptVariable(this, pIp); } -// done(LCS) int CTheScripts::GetSaveVarIndex(int var) { for (int i = 0; i < NumSaveVars; i++) { @@ -2555,7 +2525,6 @@ int CTheScripts::GetSaveVarIndex(int var) return -1; } -// done(LCS) void CRunningScript::Init() { sprintf(m_abScriptName, "id%02i", m_nId); @@ -2579,7 +2548,6 @@ void CRunningScript::Init() m_nLocalsPointer = 0; } -// done(LCS) void CTheScripts::Shutdown() { if (gScriptsFile != -1) { @@ -2621,7 +2589,6 @@ int open_script() } #endif -// done(LCS) bool CTheScripts::Init(bool loaddata) { bool retval = false; @@ -2702,7 +2669,7 @@ bool CTheScripts::Init(bool loaddata) IntroRectangles[i].m_sColor = CRGBA(255, 255, 255, 255); } NumberOfIntroRectanglesThisFrame = 0; - RemoveScriptTextureDictionary(); // TODO(LCS) - probably not needed + //RemoveScriptTextureDictionary(); // TODO(LCS) - probably not needed for (int i = 0; i < MAX_NUM_BUILDING_SWAPS; i++){ BuildingSwapArray[i].m_pBuilding = nil; BuildingSwapArray[i].m_nNewModel = -1; @@ -2729,7 +2696,7 @@ bool CTheScripts::Init(bool loaddata) return retval; } -// LCS - to remove? +/* void CTheScripts::RemoveScriptTextureDictionary() { for (int i = 0; i < ARRAY_SIZE(CTheScripts::ScriptSprites); i++) @@ -2738,8 +2705,8 @@ void CTheScripts::RemoveScriptTextureDictionary() if (slot != -1) CTxdStore::RemoveTxd(slot); } +*/ -// done(LCS) void CRunningScript::RemoveScriptFromList(CRunningScript** ppScript) { if (prev) @@ -2750,7 +2717,6 @@ void CRunningScript::RemoveScriptFromList(CRunningScript** ppScript) next->prev = prev; } -// done(LCS) void CRunningScript::AddScriptToList(CRunningScript** ppScript) { next = *ppScript; @@ -2760,7 +2726,6 @@ void CRunningScript::AddScriptToList(CRunningScript** ppScript) *ppScript = this; } -// done(LCS) CRunningScript* CTheScripts::StartNewScript(uint32 ip) { CRunningScript* pNew = pIdleScripts; @@ -2774,7 +2739,6 @@ CRunningScript* CTheScripts::StartNewScript(uint32 ip) return pNew; } -// done(LCS) void CTheScripts::Process() { if (CReplay::IsPlayingBack()) @@ -2874,19 +2838,16 @@ void CTheScripts::Process() #endif } -// done(LCS) CRunningScript* CTheScripts::StartTestScript() { return StartNewScript(0); } -// done(LCS) bool CTheScripts::IsPlayerOnAMission() { return OnAMissionFlag && *(int32*)&ScriptSpace[OnAMissionFlag] == 1; } -// done(LCS) void CRunningScript::Process() { #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT @@ -2915,7 +2876,6 @@ void CRunningScript::Process() CMessages::BriefMessages[0].m_nStartTime = 0; } -// done(LCS) int8 CRunningScript::ProcessOneCommand() { int8 retval = -1; @@ -3065,16 +3025,18 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) float *fScriptVar1; int *nScriptVar1; switch (command) { + /* case COMMAND_NOP: return 0; + */ case COMMAND_WAIT: CollectParameters(&m_nIp, 1); - m_nWakeTime = CTimer::GetTimeInMilliseconds() + ScriptParams[0]; + m_nWakeTime = CTimer::GetTimeInMilliseconds() + GET_INTEGER_PARAM(0); m_bSkipWakeTime = false; return 1; case COMMAND_GOTO: CollectParameters(&m_nIp, 1); - SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::MainScriptSize - ScriptParams[0]); + SetIP(GET_INTEGER_PARAM(0) >= 0 ? GET_INTEGER_PARAM(0) : CTheScripts::MainScriptSize - GET_INTEGER_PARAM(0)); /* Known issue: GOTO to 0. It might have been "better" to use > instead of >= */ /* simply because it never makes sense to jump to start of the script */ /* but jumping to start of a custom mission is an issue for simple mission-like scripts */ @@ -3083,174 +3045,174 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) return 0; case COMMAND_SHAKE_CAM: CollectParameters(&m_nIp, 1); - CamShakeNoPos(&TheCamera, ScriptParams[0] / 1000.0f); + CamShakeNoPos(&TheCamera, GET_INTEGER_PARAM(0) / 1000.0f); return 0; case COMMAND_SET_VAR_INT: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *ptr = ScriptParams[0]; + *ptr = GET_INTEGER_PARAM(0); return 0; } case COMMAND_SET_VAR_FLOAT: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *(float*)ptr = *(float*)&ScriptParams[0]; + *(float*)ptr = GET_FLOAT_PARAM(0); return 0; } case COMMAND_SET_LVAR_INT: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *ptr = ScriptParams[0]; + *ptr = GET_INTEGER_PARAM(0); return 0; } case COMMAND_SET_LVAR_FLOAT: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *(float*)ptr = *(float*)&ScriptParams[0]; + *(float*)ptr = GET_FLOAT_PARAM(0); return 0; } case COMMAND_ADD_VAL_TO_INT_VAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *ptr += ScriptParams[0]; + *ptr += GET_INTEGER_PARAM(0); return 0; } case COMMAND_ADD_VAL_TO_FLOAT_VAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *(float*)ptr += *(float*)&ScriptParams[0]; + *(float*)ptr += GET_FLOAT_PARAM(0); return 0; } case COMMAND_ADD_VAL_TO_INT_LVAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *ptr += ScriptParams[0]; + *ptr += GET_INTEGER_PARAM(0); return 0; } case COMMAND_ADD_VAL_TO_FLOAT_LVAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *(float*)ptr += *(float*)&ScriptParams[0]; + *(float*)ptr += GET_FLOAT_PARAM(0); return 0; } case COMMAND_SUB_VAL_FROM_INT_VAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *ptr -= ScriptParams[0]; + *ptr -= GET_INTEGER_PARAM(0); return 0; } case COMMAND_SUB_VAL_FROM_FLOAT_VAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *(float*)ptr -= *(float*)&ScriptParams[0]; + *(float*)ptr -= GET_FLOAT_PARAM(0); return 0; } case COMMAND_SUB_VAL_FROM_INT_LVAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *ptr -= ScriptParams[0]; + *ptr -= GET_INTEGER_PARAM(0); return 0; } case COMMAND_SUB_VAL_FROM_FLOAT_LVAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *(float*)ptr -= *(float*)&ScriptParams[0]; + *(float*)ptr -= GET_FLOAT_PARAM(0); return 0; } case COMMAND_MULT_INT_VAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *ptr *= ScriptParams[0]; + *ptr *= GET_INTEGER_PARAM(0); return 0; } case COMMAND_MULT_FLOAT_VAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *(float*)ptr *= *(float*)&ScriptParams[0]; + *(float*)ptr *= GET_FLOAT_PARAM(0); return 0; } case COMMAND_MULT_INT_LVAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *ptr *= ScriptParams[0]; + *ptr *= GET_INTEGER_PARAM(0); return 0; } case COMMAND_MULT_FLOAT_LVAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *(float*)ptr *= *(float*)&ScriptParams[0]; + *(float*)ptr *= GET_FLOAT_PARAM(0); return 0; } case COMMAND_DIV_INT_VAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *ptr /= ScriptParams[0]; + *ptr /= GET_INTEGER_PARAM(0); return 0; } case COMMAND_DIV_FLOAT_VAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *(float*)ptr /= *(float*)&ScriptParams[0]; + *(float*)ptr /= GET_FLOAT_PARAM(0); return 0; } case COMMAND_DIV_INT_LVAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *ptr /= ScriptParams[0]; + *ptr /= GET_INTEGER_PARAM(0); return 0; } case COMMAND_DIV_FLOAT_LVAR_BY_VAL: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *(float*)ptr /= *(float*)&ScriptParams[0]; + *(float*)ptr /= GET_FLOAT_PARAM(0); return 0; } case COMMAND_IS_INT_VAR_GREATER_THAN_NUMBER: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr > ScriptParams[0]); + UpdateCompareFlag(*ptr > GET_INTEGER_PARAM(0)); return 0; } case COMMAND_IS_INT_LVAR_GREATER_THAN_NUMBER: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr > ScriptParams[0]); + UpdateCompareFlag(*ptr > GET_INTEGER_PARAM(0)); return 0; } case COMMAND_IS_NUMBER_GREATER_THAN_INT_VAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); - UpdateCompareFlag(ScriptParams[0] > *ptr); + UpdateCompareFlag(GET_INTEGER_PARAM(0) > *ptr); return 0; } case COMMAND_IS_NUMBER_GREATER_THAN_INT_LVAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); - UpdateCompareFlag(ScriptParams[0] > *ptr); + UpdateCompareFlag(GET_INTEGER_PARAM(0) > *ptr); return 0; } case COMMAND_IS_INT_VAR_GREATER_THAN_INT_VAR: @@ -3285,28 +3247,28 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*(float*)ptr > *(float*)&ScriptParams[0]); + UpdateCompareFlag(*(float*)ptr > GET_FLOAT_PARAM(0)); return 0; } case COMMAND_IS_FLOAT_LVAR_GREATER_THAN_NUMBER: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*(float*)ptr > *(float*)&ScriptParams[0]); + UpdateCompareFlag(*(float*)ptr > GET_FLOAT_PARAM(0)); return 0; } case COMMAND_IS_NUMBER_GREATER_THAN_FLOAT_VAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); - UpdateCompareFlag(*(float*)&ScriptParams[0] > *(float*)ptr); + UpdateCompareFlag(GET_FLOAT_PARAM(0) > *(float*)ptr); return 0; } case COMMAND_IS_NUMBER_GREATER_THAN_FLOAT_LVAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); - UpdateCompareFlag(*(float*)&ScriptParams[0] > *(float*)ptr); + UpdateCompareFlag(GET_FLOAT_PARAM(0) > *(float*)ptr); return 0; } case COMMAND_IS_FLOAT_VAR_GREATER_THAN_FLOAT_VAR: @@ -3341,28 +3303,28 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr >= ScriptParams[0]); + UpdateCompareFlag(*ptr >= GET_INTEGER_PARAM(0)); return 0; } case COMMAND_IS_INT_LVAR_GREATER_OR_EQUAL_TO_NUMBER: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr >= ScriptParams[0]); + UpdateCompareFlag(*ptr >= GET_INTEGER_PARAM(0)); return 0; } case COMMAND_IS_NUMBER_GREATER_OR_EQUAL_TO_INT_VAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); - UpdateCompareFlag(ScriptParams[0] >= *ptr); + UpdateCompareFlag(GET_INTEGER_PARAM(0) >= *ptr); return 0; } case COMMAND_IS_NUMBER_GREATER_OR_EQUAL_TO_INT_LVAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); - UpdateCompareFlag(ScriptParams[0] >= *ptr); + UpdateCompareFlag(GET_INTEGER_PARAM(0) >= *ptr); return 0; } case COMMAND_IS_INT_VAR_GREATER_OR_EQUAL_TO_INT_VAR: @@ -3397,28 +3359,28 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*(float*)ptr >= *(float*)&ScriptParams[0]); + UpdateCompareFlag(*(float*)ptr >= GET_FLOAT_PARAM(0)); return 0; } case COMMAND_IS_FLOAT_LVAR_GREATER_OR_EQUAL_TO_NUMBER: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*(float*)ptr >= *(float*)&ScriptParams[0]); + UpdateCompareFlag(*(float*)ptr >= GET_FLOAT_PARAM(0)); return 0; } case COMMAND_IS_NUMBER_GREATER_OR_EQUAL_TO_FLOAT_VAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); - UpdateCompareFlag(*(float*)&ScriptParams[0] >= *(float*)ptr); + UpdateCompareFlag(GET_FLOAT_PARAM(0) >= *(float*)ptr); return 0; } case COMMAND_IS_NUMBER_GREATER_OR_EQUAL_TO_FLOAT_LVAR: { CollectParameters(&m_nIp, 1); int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); - UpdateCompareFlag(*(float*)&ScriptParams[0] >= *(float*)ptr); + UpdateCompareFlag(GET_FLOAT_PARAM(0) >= *(float*)ptr); return 0; } case COMMAND_IS_FLOAT_VAR_GREATER_OR_EQUAL_TO_FLOAT_VAR: @@ -3453,14 +3415,14 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr == ScriptParams[0]); + UpdateCompareFlag(*ptr == GET_INTEGER_PARAM(0)); return 0; } case COMMAND_IS_INT_LVAR_EQUAL_TO_NUMBER: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*ptr == ScriptParams[0]); + UpdateCompareFlag(*ptr == GET_INTEGER_PARAM(0)); return 0; } case COMMAND_IS_INT_VAR_EQUAL_TO_INT_VAR: @@ -3493,14 +3455,14 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*(float*)ptr == *(float*)&ScriptParams[0]); + UpdateCompareFlag(*(float*)ptr == GET_FLOAT_PARAM(0)); return 0; } case COMMAND_IS_FLOAT_LVAR_EQUAL_TO_NUMBER: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - UpdateCompareFlag(*(float*)ptr == *(float*)&ScriptParams[0]); + UpdateCompareFlag(*(float*)ptr == GET_FLOAT_PARAM(0)); return 0; } case COMMAND_IS_FLOAT_VAR_EQUAL_TO_FLOAT_VAR: @@ -3532,12 +3494,12 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) case COMMAND_GOTO_IF_TRUE: CollectParameters(&m_nIp, 1); if (m_bCondResult) - SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::MainScriptSize - ScriptParams[0]); + SetIP(GET_INTEGER_PARAM(0) >= 0 ? GET_INTEGER_PARAM(0) : CTheScripts::MainScriptSize - GET_INTEGER_PARAM(0)); return 0; case COMMAND_GOTO_IF_FALSE: CollectParameters(&m_nIp, 1); if (!m_bCondResult) - SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::MainScriptSize - ScriptParams[0]); + SetIP(GET_INTEGER_PARAM(0) >= 0 ? GET_INTEGER_PARAM(0) : CTheScripts::MainScriptSize - GET_INTEGER_PARAM(0)); /* Check COMMAND_GOTO note. */ return 0; case COMMAND_TERMINATE_THIS_SCRIPT: @@ -3563,8 +3525,8 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) case COMMAND_START_NEW_SCRIPT: { CollectParameters(&m_nIp, 1); - script_assert(ScriptParams[0] >= 0); - CRunningScript* pNew = CTheScripts::StartNewScript(ScriptParams[0]); + script_assert(GET_INTEGER_PARAM(0) >= 0); + CRunningScript* pNew = CTheScripts::StartNewScript(GET_INTEGER_PARAM(0)); CollectParameters(&m_nIp, NUM_LOCAL_VARS, pNew->m_anLocalVariables); return 0; } @@ -3572,7 +3534,7 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) CollectParameters(&m_nIp, 1); script_assert(m_nStackPointer < MAX_STACK_DEPTH); m_anStack[m_nStackPointer++] = m_nIp; - SetIP(ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::MainScriptSize - ScriptParams[0]); + SetIP(GET_INTEGER_PARAM(0) >= 0 ? GET_INTEGER_PARAM(0) : CTheScripts::MainScriptSize - GET_INTEGER_PARAM(0)); return 0; case COMMAND_RETURN: ReturnFromGosubOrFunction(); @@ -3584,7 +3546,7 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) case COMMAND_CREATE_PLAYER: { CollectParameters(&m_nIp, 4); - int32 index = ScriptParams[0]; + int32 index = GET_INTEGER_PARAM(0); script_assert(index < NUMPLAYERS); printf("&&&&&&&&&&&&&Creating player: %d\n", index); if (!CStreaming::HasModelLoaded(MI_PLAYER)) { @@ -3594,14 +3556,14 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) CPlayerPed::SetupPlayerPed(index); CWorld::Players[index].m_pPed->CharCreatedBy = MISSION_CHAR; CPlayerPed::DeactivatePlayerPed(index); - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += CWorld::Players[index].m_pPed->GetDistanceFromCentreOfMassToBaseOfModel(); CWorld::Players[index].m_pPed->SetPosition(pos); CTheScripts::ClearSpaceForMissionEntity(pos, CWorld::Players[index].m_pPed); CPlayerPed::ReactivatePlayerPed(index); - ScriptParams[0] = index; + SET_INTEGER_PARAM(0, index); StoreParameters(&m_nIp, 1); return 0; } @@ -3609,19 +3571,19 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) { CVector pos; CollectParameters(&m_nIp, 1); - if (CWorld::Players[ScriptParams[0]].m_pPed->bInVehicle && CWorld::Players[ScriptParams[0]].m_pPed->m_pMyVehicle) - pos = CWorld::Players[ScriptParams[0]].m_pPed->m_pMyVehicle->GetPosition(); + if (CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->bInVehicle && CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->m_pMyVehicle) + pos = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->m_pMyVehicle->GetPosition(); else - pos = CWorld::Players[ScriptParams[0]].m_pPed->GetPosition(); - *(CVector*)&ScriptParams[0] = pos; + pos = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->GetPosition(); + SET_VECTOR_PARAM(0, pos); StoreParameters(&m_nIp, 3); return 0; } case COMMAND_SET_PLAYER_COORDINATES: { CollectParameters(&m_nIp, 4); - CVector pos = *(CVector*)&ScriptParams[1]; - int index = ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(1); + int index = GET_INTEGER_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CPlayerPed* ped = CWorld::Players[index].m_pPed; @@ -3673,39 +3635,43 @@ int8 CRunningScript::ProcessCommands0To99(int32 command) case COMMAND_IS_PLAYER_IN_AREA_2D: { CollectParameters(&m_nIp, 6); - CPlayerPed* ped = CWorld::Players[ScriptParams[0]].m_pPed; - float x1 = *(float*)&ScriptParams[1]; - float y1 = *(float*)&ScriptParams[2]; - float x2 = *(float*)&ScriptParams[3]; - float y2 = *(float*)&ScriptParams[4]; + CPlayerPed* ped = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + float x1 = GET_FLOAT_PARAM(1); + float y1 = GET_FLOAT_PARAM(2); + float x2 = GET_FLOAT_PARAM(3); + float y2 = GET_FLOAT_PARAM(4); if (!ped->bInVehicle) UpdateCompareFlag(ped->IsWithinArea(x1, y1, x2, y2)); else UpdateCompareFlag(ped->m_pMyVehicle->IsWithinArea(x1, y1, x2, y2)); - if (ScriptParams[5]) + if (GET_INTEGER_PARAM(5)) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, MAP_Z_LOW_LIMIT); + /* if (CTheScripts::DbgFlag) CTheScripts::DrawDebugSquare(x1, y1, x2, y2); + */ return 0; } case COMMAND_IS_PLAYER_IN_AREA_3D: { CollectParameters(&m_nIp, 8); - CPlayerPed* ped = CWorld::Players[ScriptParams[0]].m_pPed; - float x1 = *(float*)&ScriptParams[1]; - float y1 = *(float*)&ScriptParams[2]; - float z1 = *(float*)&ScriptParams[3]; - float x2 = *(float*)&ScriptParams[4]; - float y2 = *(float*)&ScriptParams[5]; - float z2 = *(float*)&ScriptParams[6]; + CPlayerPed* ped = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + float x1 = GET_FLOAT_PARAM(1); + float y1 = GET_FLOAT_PARAM(2); + float z1 = GET_FLOAT_PARAM(3); + float x2 = GET_FLOAT_PARAM(4); + float y2 = GET_FLOAT_PARAM(5); + float z2 = GET_FLOAT_PARAM(6); if (ped->bInVehicle) UpdateCompareFlag(ped->m_pMyVehicle->IsWithinArea(x1, y1, z1, x2, y2, z2)); else UpdateCompareFlag(ped->IsWithinArea(x1, y1, z1, x2, y2, z2)); - if (ScriptParams[7]) + if (GET_INTEGER_PARAM(7)) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, (z1 + z2) / 2); + /* if (CTheScripts::DbgFlag) CTheScripts::DrawDebugCube(x1, y1, z1, x2, y2, z2); + */ return 0; } case COMMAND_ADD_INT_VAR_TO_INT_VAR: @@ -3852,33 +3818,25 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *(float*)ptr += CTimer::GetTimeStep() * *(float*)&ScriptParams[0]; + *(float*)ptr += CTimer::GetTimeStep() * GET_FLOAT_PARAM(0); return 0; } case COMMAND_ADD_TIMED_VAL_TO_FLOAT_LVAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *(float*)ptr += CTimer::GetTimeStep() * *(float*)&ScriptParams[0]; + *(float*)ptr += CTimer::GetTimeStep() * GET_FLOAT_PARAM(0); return 0; } case COMMAND_ADD_TIMED_FLOAT_VAR_TO_FLOAT_VAR: fScriptVar1 = (float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); *fScriptVar1 += CTimer::GetTimeStep() * *(float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); return 0; -#ifdef FIX_BUGS case COMMAND_ADD_TIMED_FLOAT_VAR_TO_FLOAT_LVAR: -#else - case COMMAND_ADD_TIMED_FLOAT_LVAR_TO_FLOAT_VAR: -#endif fScriptVar1 = (float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); *fScriptVar1 += CTimer::GetTimeStep() * *(float*)GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); return 0; -#ifdef FIX_BUGS case COMMAND_ADD_TIMED_FLOAT_LVAR_TO_FLOAT_VAR: -#else - case COMMAND_ADD_TIMED_FLOAT_VAR_TO_FLOAT_LVAR: -#endif fScriptVar1 = (float*)GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); *fScriptVar1 += CTimer::GetTimeStep() * *(float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); return 0; @@ -3890,33 +3848,25 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); CollectParameters(&m_nIp, 1); - *(float*)ptr -= CTimer::GetTimeStep() * *(float*)&ScriptParams[0]; + *(float*)ptr -= CTimer::GetTimeStep() * GET_FLOAT_PARAM(0); return 0; } case COMMAND_SUB_TIMED_VAL_FROM_FLOAT_LVAR: { int32* ptr = GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); CollectParameters(&m_nIp, 1); - *(float*)ptr -= CTimer::GetTimeStep() * *(float*)&ScriptParams[0]; + *(float*)ptr -= CTimer::GetTimeStep() * GET_FLOAT_PARAM(0); return 0; } case COMMAND_SUB_TIMED_FLOAT_VAR_FROM_FLOAT_VAR: fScriptVar1 = (float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); *fScriptVar1 -= CTimer::GetTimeStep() * *(float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); return 0; -#ifdef FIX_BUGS // in SA it was fixed by reversing their order in enum case COMMAND_SUB_TIMED_FLOAT_VAR_FROM_FLOAT_LVAR: -#else - case COMMAND_SUB_TIMED_FLOAT_LVAR_FROM_FLOAT_VAR: -#endif fScriptVar1 = (float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); *fScriptVar1 -= CTimer::GetTimeStep() * *(float*)GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); return 0; -#ifdef FIX_BUGS case COMMAND_SUB_TIMED_FLOAT_LVAR_FROM_FLOAT_VAR: -#else - case COMMAND_SUB_TIMED_FLOAT_VAR_FROM_FLOAT_LVAR: -#endif fScriptVar1 = (float*)GetPointerToScriptVariable(&m_nIp, VAR_LOCAL); *fScriptVar1 -= CTimer::GetTimeStep() * *(float*)GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL); return 0; @@ -4065,46 +4015,46 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_CREATE_CHAR: { CollectParameters(&m_nIp, 5); - switch (ScriptParams[1]) { + switch (GET_INTEGER_PARAM(1)) { case MI_COP: - if (ScriptParams[0] == PEDTYPE_COP) - ScriptParams[1] = COP_STREET; + if (GET_INTEGER_PARAM(0) == PEDTYPE_COP) + SET_INTEGER_PARAM(1, COP_STREET); break; case MI_SWAT: - if (ScriptParams[0] == PEDTYPE_COP) - ScriptParams[1] = COP_SWAT; + if (GET_INTEGER_PARAM(0) == PEDTYPE_COP) + SET_INTEGER_PARAM(1, COP_SWAT); break; case MI_FBI: - if (ScriptParams[0] == PEDTYPE_COP) - ScriptParams[1] = COP_FBI; + if (GET_INTEGER_PARAM(0) == PEDTYPE_COP) + SET_INTEGER_PARAM(1, COP_FBI); break; case MI_ARMY: - if (ScriptParams[0] == PEDTYPE_COP) - ScriptParams[1] = COP_ARMY; + if (GET_INTEGER_PARAM(0) == PEDTYPE_COP) + SET_INTEGER_PARAM(1, COP_ARMY); break; case MI_MEDIC: - if (ScriptParams[0] == PEDTYPE_EMERGENCY) - ScriptParams[1] = PEDTYPE_EMERGENCY; + if (GET_INTEGER_PARAM(0) == PEDTYPE_EMERGENCY) + SET_INTEGER_PARAM(1, PEDTYPE_EMERGENCY); break; case MI_FIREMAN: - if (ScriptParams[0] == PEDTYPE_FIREMAN) - ScriptParams[1] = PEDTYPE_FIREMAN; + if (GET_INTEGER_PARAM(0) == PEDTYPE_FIREMAN) + SET_INTEGER_PARAM(1, PEDTYPE_FIREMAN); break; default: break; } CPed* ped; - if (ScriptParams[0] == PEDTYPE_COP) - ped = new CCopPed((eCopType)ScriptParams[1]); - else if (ScriptParams[0] == PEDTYPE_EMERGENCY || ScriptParams[0] == PEDTYPE_FIREMAN) - ped = new CEmergencyPed(ScriptParams[1]); + if (GET_INTEGER_PARAM(0) == PEDTYPE_COP) + ped = new CCopPed((eCopType)GET_INTEGER_PARAM(1)); + else if (GET_INTEGER_PARAM(0) == PEDTYPE_EMERGENCY || GET_INTEGER_PARAM(0) == PEDTYPE_FIREMAN) + ped = new CEmergencyPed(GET_INTEGER_PARAM(1)); else - ped = new CCivilianPed((ePedType)ScriptParams[0], ScriptParams[1]); + ped = new CCivilianPed((ePedType)GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); ped->CharCreatedBy = MISSION_CHAR; ped->bRespondsToThreats = false; ped->bAllowMedicsToReviveMe = false; ped->bIsPlayerFriend = false; - CVector pos = *(CVector*)&ScriptParams[2]; + CVector pos = GET_VECTOR_PARAM(2); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += 1.0f; @@ -4116,29 +4066,29 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) CWorld::Add(ped); ped->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pos); CPopulation::ms_nTotalMissionPeds++; - ScriptParams[0] = CPools::GetPedPool()->GetIndex(ped); + SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex(ped)); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); + CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); return 0; } case COMMAND_DELETE_CHAR: { CollectParameters(&m_nIp, 1); - CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); CTheScripts::RemoveThisPed(ped); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR); + CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); return 0; } case COMMAND_CHAR_WANDER_DIR: { CollectParameters(&m_nIp, 2); - CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(ped); ped->ClearAll(); - int8 path = ScriptParams[1]; - if (ScriptParams[1] < 0 || ScriptParams[1] > 7) + int8 path = GET_INTEGER_PARAM(1); + if (GET_INTEGER_PARAM(1) < 0 || GET_INTEGER_PARAM(1) > 7) // Max number GetRandomNumberInRange returns is max-1 #ifdef FIX_BUGS path = CGeneral::GetRandomNumberInRange(0, 8); @@ -4153,19 +4103,19 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_CHAR_FOLLOW_PATH: { CollectParameters(&m_nIp, 6); - CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(ped); if (ped->GetPedState() == PED_ATTACK || ped->GetPedState() == PED_FIGHT || !ped->IsPedInControl()) return 0; - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - float radius = *(float*)&ScriptParams[4]; + float radius = GET_FLOAT_PARAM(4); eMoveState state; - switch (ScriptParams[5]) { + switch (GET_INTEGER_PARAM(5)) { case 0: state = PEDMOVE_WALK; break; case 1: state = PEDMOVE_RUN; break; - default: assert(0); + default: state = PEDMOVE_WALK; break; } ped->ClearAll(); ped->m_pathNodeTimer = 0; @@ -4175,7 +4125,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_CHAR_SET_IDLE: { CollectParameters(&m_nIp, 1); - CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(ped); ped->bScriptObjectiveCompleted = false; ped->SetObjective(OBJECTIVE_WAIT_ON_FOOT); @@ -4184,7 +4134,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_GET_CHAR_COORDINATES: { CollectParameters(&m_nIp, 1); - CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(ped); CVehicle* vehicle; CVector pos; @@ -4197,21 +4147,21 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) pos = vehicle->GetPosition(); else pos = ped->GetPosition(); - *(CVector*)&ScriptParams[0] = pos; + SET_VECTOR_PARAM(0, pos); StoreParameters(&m_nIp, 3); return 0; } case COMMAND_SET_CHAR_COORDINATES: { CollectParameters(&m_nIp, 4); - CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(ped); CVehicle* vehicle; if (ped->bInVehicle) vehicle = ped->m_pMyVehicle; else vehicle = nil; - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); // removed dumb stuff again @@ -4234,72 +4184,74 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) } return 0; } - /* case COMMAND_IS_CHAR_STILL_ALIVE: { CollectParameters(&m_nIp, 1); - CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); - UpdateCompareFlag(ped && ped->GetPedState() != PED_DEAD && ped->GetPedState() != PED_DIE); + CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + UpdateCompareFlag(ped && !ped->DyingOrDead()); return 0; } - */ case COMMAND_IS_CHAR_IN_AREA_2D: { CollectParameters(&m_nIp, 6); - CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(ped); CVehicle* vehicle; if (ped->bInVehicle) vehicle = ped->m_pMyVehicle; else vehicle = nil; - float x1 = *(float*)&ScriptParams[1]; - float y1 = *(float*)&ScriptParams[2]; - float x2 = *(float*)&ScriptParams[3]; - float y2 = *(float*)&ScriptParams[4]; + float x1 = GET_FLOAT_PARAM(1); + float y1 = GET_FLOAT_PARAM(2); + float x2 = GET_FLOAT_PARAM(3); + float y2 = GET_FLOAT_PARAM(4); if (vehicle) UpdateCompareFlag(ped->m_pMyVehicle->IsWithinArea(x1, y1, x2, y2)); else UpdateCompareFlag(ped->IsWithinArea(x1, y1, x2, y2)); - if (ScriptParams[5]) + if (GET_INTEGER_PARAM(5)) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, MAP_Z_LOW_LIMIT); + /* if (CTheScripts::DbgFlag) CTheScripts::DrawDebugSquare(x1, y1, x2, y2); + */ return 0; } case COMMAND_IS_CHAR_IN_AREA_3D: { CollectParameters(&m_nIp, 8); - CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(ped); CVehicle* vehicle; if (ped->bInVehicle) vehicle = ped->m_pMyVehicle; else vehicle = nil; - float x1 = *(float*)&ScriptParams[1]; - float y1 = *(float*)&ScriptParams[2]; - float z1 = *(float*)&ScriptParams[3]; - float x2 = *(float*)&ScriptParams[4]; - float y2 = *(float*)&ScriptParams[5]; - float z2 = *(float*)&ScriptParams[6]; + float x1 = GET_FLOAT_PARAM(1); + float y1 = GET_FLOAT_PARAM(2); + float z1 = GET_FLOAT_PARAM(3); + float x2 = GET_FLOAT_PARAM(4); + float y2 = GET_FLOAT_PARAM(5); + float z2 = GET_FLOAT_PARAM(6); if (vehicle) UpdateCompareFlag(ped->m_pMyVehicle->IsWithinArea(x1, y1, z1, x2, y2, z2)); else UpdateCompareFlag(ped->IsWithinArea(x1, y1, z1, x2, y2, z2)); - if (ScriptParams[7]) + if (GET_INTEGER_PARAM(7)) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, (z1 + z2) / 2); + /* if (CTheScripts::DbgFlag) CTheScripts::DrawDebugCube(x1, y1, z1, x2, y2, z2); + */ return 0; } case COMMAND_CREATE_CAR: { CollectParameters(&m_nIp, 4); int32 handle; - if (CModelInfo::IsBoatModel(ScriptParams[0])) { - CBoat* boat = new CBoat(ScriptParams[0], MISSION_VEHICLE); - CVector pos = *(CVector*)&ScriptParams[1]; + if (CModelInfo::IsBoatModel(GET_INTEGER_PARAM(0))) { + CBoat* boat = new CBoat(GET_INTEGER_PARAM(0), MISSION_VEHICLE); + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += boat->GetDistanceFromCentreOfMassToBaseOfModel(); @@ -4318,13 +4270,13 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) else { CVehicle* car; - if (!CModelInfo::IsBikeModel(ScriptParams[0])) - car = new CAutomobile(ScriptParams[0], MISSION_VEHICLE); + if (!CModelInfo::IsBikeModel(GET_INTEGER_PARAM(0))) + car = new CAutomobile(GET_INTEGER_PARAM(0), MISSION_VEHICLE); else { - car = new CBike(ScriptParams[0], MISSION_VEHICLE); + car = new CBike(GET_INTEGER_PARAM(0), MISSION_VEHICLE); ((CBike*)(car))->bIsStanding = true; } - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += car->GetDistanceFromCentreOfMassToBaseOfModel(); @@ -4339,14 +4291,14 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) car->AutoPilot.m_nCruiseSpeed = car->AutoPilot.m_fMaxTrafficSpeed = 9.0f; car->AutoPilot.m_nCurrentLane = car->AutoPilot.m_nNextLane = 0; car->bEngineOn = false; - car->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pos); + car->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pos); // TODO: gpTheZones car->bHasBeenOwnedByPlayer = true; if (m_bIsMissionScript) car->bIsStaticWaitingForCollision = true; CWorld::Add(car); handle = CPools::GetVehiclePool()->GetIndex(car); } - ScriptParams[0] = handle; + SET_INTEGER_PARAM(0, handle); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) CTheScripts::MissionCleanUp.AddEntityToList(handle, CLEANUP_CAR); @@ -4355,25 +4307,26 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_DELETE_CAR: { CollectParameters(&m_nIp, 1); - CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); if (car) { CWorld::Remove(car); CWorld::RemoveReferencesToDeletedObject(car); delete car; } if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR); + CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CAR); return 0; } case COMMAND_CAR_GOTO_COORDINATES: { CollectParameters(&m_nIp, 4); - CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(car); - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += car->GetDistanceFromCentreOfMassToBaseOfModel(); + uint8 nOldMission = car->AutoPilot.m_nCarMission; if (CCarCtrl::JoinCarWithRoadSystemGotoCoors(car, pos, false)) car->AutoPilot.m_nCarMission = MISSION_GOTOCOORDS_STRAIGHT; else @@ -4381,13 +4334,14 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) car->SetStatus(STATUS_PHYSICS); car->bEngineOn = true; car->AutoPilot.m_nCruiseSpeed = Max(1, car->AutoPilot.m_nCruiseSpeed); - car->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds(); + if (nOldMission != car->AutoPilot.m_nCarMission) + car->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds(); return 0; } case COMMAND_CAR_WANDER_RANDOMLY: { CollectParameters(&m_nIp, 1); - CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(car); CCarCtrl::JoinCarWithRoadSystem(car); car->AutoPilot.m_nCarMission = MISSION_CRUISE; @@ -4399,7 +4353,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_CAR_SET_IDLE: { CollectParameters(&m_nIp, 1); - CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(car); car->AutoPilot.m_nCarMission = MISSION_NONE; return 0; @@ -4407,18 +4361,18 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) case COMMAND_GET_CAR_COORDINATES: { CollectParameters(&m_nIp, 1); - CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(car); - *(CVector*)&ScriptParams[0] = car->GetPosition(); + SET_VECTOR_PARAM(0, car->GetPosition()); StoreParameters(&m_nIp, 3); return 0; } case COMMAND_SET_CAR_COORDINATES: { CollectParameters(&m_nIp, 4); - CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(car); - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += car->GetDistanceFromCentreOfMassToBaseOfModel(); @@ -4464,80 +4418,84 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) } return 0; } - /* case COMMAND_IS_CAR_STILL_ALIVE: { CollectParameters(&m_nIp, 1); - CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); UpdateCompareFlag(car && car->GetStatus() != STATUS_WRECKED && (car->IsBoat() || !car->bIsInWater)); return 0; } - */ case COMMAND_SET_CAR_CRUISE_SPEED: { CollectParameters(&m_nIp, 2); - CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(car); #if defined MISSION_REPLAY && defined SIMPLIER_MISSIONS - car->AutoPilot.m_nCruiseSpeed = *(float*)&ScriptParams[1]; + car->AutoPilot.m_nCruiseSpeed = GET_FLOAT_PARAM(1); if (missionRetryScriptIndex == 40 && car->GetModelIndex() == MI_CHEETAH) // Turismo car->AutoPilot.m_nCruiseSpeed = 8 * car->AutoPilot.m_nCruiseSpeed / 10; car->AutoPilot.m_nCruiseSpeed = Min(car->AutoPilot.m_nCruiseSpeed, 60.0f * car->pHandling->Transmission.fMaxCruiseVelocity); #else - car->AutoPilot.m_nCruiseSpeed = Min(*(float*)&ScriptParams[1], 60.0f * car->pHandling->Transmission.fMaxCruiseVelocity); + car->AutoPilot.m_nCruiseSpeed = Min(GET_FLOAT_PARAM(1), 60.0f * car->pHandling->Transmission.fMaxCruiseVelocity); #endif return 0; } case COMMAND_SET_CAR_DRIVING_STYLE: { CollectParameters(&m_nIp, 2); - CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(car); - car->AutoPilot.m_nDrivingStyle = (uint8)ScriptParams[1]; + car->AutoPilot.m_nDrivingStyle = (uint8)GET_INTEGER_PARAM(1); return 0; } case COMMAND_SET_CAR_MISSION: { CollectParameters(&m_nIp, 2); - CVehicle* car = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* car = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(car); - car->AutoPilot.m_nCarMission = (uint8)ScriptParams[1]; - car->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds(); + if ((uint8)GET_INTEGER_PARAM(1) != car->AutoPilot.m_nCarMission) { + car->AutoPilot.m_nCarMission = (uint8)GET_INTEGER_PARAM(1); + car->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds(); + } car->bEngineOn = true; return 0; } case COMMAND_IS_CAR_IN_AREA_2D: { CollectParameters(&m_nIp, 6); - CVehicle* vehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* vehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(vehicle); - float x1 = *(float*)&ScriptParams[1]; - float y1 = *(float*)&ScriptParams[2]; - float x2 = *(float*)&ScriptParams[3]; - float y2 = *(float*)&ScriptParams[4]; + float x1 = GET_FLOAT_PARAM(1); + float y1 = GET_FLOAT_PARAM(2); + float x2 = GET_FLOAT_PARAM(3); + float y2 = GET_FLOAT_PARAM(4); UpdateCompareFlag(vehicle->IsWithinArea(x1, y1, x2, y2)); - if (ScriptParams[5]) + if (GET_INTEGER_PARAM(5)) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, MAP_Z_LOW_LIMIT); + /* if (CTheScripts::DbgFlag) CTheScripts::DrawDebugSquare(x1, y1, x2, y2); + */ return 0; } case COMMAND_IS_CAR_IN_AREA_3D: { CollectParameters(&m_nIp, 8); - CVehicle* vehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* vehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(vehicle); - float x1 = *(float*)&ScriptParams[1]; - float y1 = *(float*)&ScriptParams[2]; - float z1 = *(float*)&ScriptParams[3]; - float x2 = *(float*)&ScriptParams[4]; - float y2 = *(float*)&ScriptParams[5]; - float z2 = *(float*)&ScriptParams[6]; + float x1 = GET_FLOAT_PARAM(1); + float y1 = GET_FLOAT_PARAM(2); + float z1 = GET_FLOAT_PARAM(3); + float x2 = GET_FLOAT_PARAM(4); + float y2 = GET_FLOAT_PARAM(5); + float z2 = GET_FLOAT_PARAM(6); UpdateCompareFlag(vehicle->IsWithinArea(x1, y1, z1, x2, y2, z2)); - if (ScriptParams[7]) + if (GET_INTEGER_PARAM(7)) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, (z1 + z2) / 2); + /* if (CTheScripts::DbgFlag) CTheScripts::DrawDebugCube(x1, y1, z1, x2, y2, z2); + */ return 0; } case COMMAND_SPECIAL_0: @@ -4558,64 +4516,64 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) AllowMissionReplay = 1; #endif CollectParameters(&m_nIp, 2); - CMessages::AddBigMessage(key, ScriptParams[0], ScriptParams[1] - 1); + CMessages::AddBigMessage(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1) - 1); return 0; } case COMMAND_PRINT: { wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 2); - CMessages::AddMessage(key, ScriptParams[0], ScriptParams[1]); + CMessages::AddMessage(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); return 0; } case COMMAND_PRINT_NOW: { wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 2); - CMessages::AddMessageJumpQ(key, ScriptParams[0], ScriptParams[1]); + CMessages::AddMessageJumpQ(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); return 0; } - /* case COMMAND_PRINT_SOON: { wchar* key = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 2); - CMessages::AddMessageSoon(key, ScriptParams[0], ScriptParams[1]); + CMessages::AddMessageSoon(key, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); return 0; } - */ case COMMAND_CLEAR_PRINTS: CMessages::ClearMessages(); return 0; case COMMAND_GET_TIME_OF_DAY: - ScriptParams[0] = CClock::GetHours(); - ScriptParams[1] = CClock::GetMinutes(); + SET_INTEGER_PARAM(0, CClock::GetHours()); + SET_INTEGER_PARAM(1, CClock::GetMinutes()); StoreParameters(&m_nIp, 2); return 0; case COMMAND_SET_TIME_OF_DAY: CollectParameters(&m_nIp, 2); - CClock::SetGameClock(ScriptParams[0], ScriptParams[1]); + CClock::SetGameClock(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); return 0; case COMMAND_GET_MINUTES_TO_TIME_OF_DAY: CollectParameters(&m_nIp, 2); - ScriptParams[0] = CClock::GetGameClockMinutesUntil(ScriptParams[0], ScriptParams[1]); + SET_INTEGER_PARAM(0, CClock::GetGameClockMinutesUntil(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1))); StoreParameters(&m_nIp, 1); return 0; case COMMAND_IS_POINT_ON_SCREEN: { CollectParameters(&m_nIp, 4); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= -100) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - UpdateCompareFlag(TheCamera.IsSphereVisible(pos, *(float*)&ScriptParams[3])); + UpdateCompareFlag(TheCamera.IsSphereVisible(pos, GET_FLOAT_PARAM(3))); return 0; } + /* case COMMAND_DEBUG_ON: CTheScripts::DbgFlag = true; return 0; case COMMAND_DEBUG_OFF: CTheScripts::DbgFlag = false; return 0; + */ case COMMAND_RETURN_TRUE: UpdateCompareFlag(true); ReturnFromGosubOrFunction(); @@ -4650,10 +4608,15 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_WHILE: case COMMAND_WHILENOT: case COMMAND_ENDWHILE: + case COMMAND_214: + case COMMAND_215: + case COMMAND_216: + case COMMAND_217: + case COMMAND_218: */ case COMMAND_ANDOR: CollectParameters(&m_nIp, 1); - m_nAndOrState = ScriptParams[0]; + m_nAndOrState = GET_INTEGER_PARAM(0); if (m_nAndOrState == ANDOR_NONE){ m_bCondResult = false; // pointless }else if (m_nAndOrState >= ANDS_1 && m_nAndOrState <= ANDS_8){ @@ -4669,7 +4632,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_LAUNCH_MISSION: { CollectParameters(&m_nIp, 1); - CRunningScript* pNew = CTheScripts::StartNewScript(ScriptParams[0]); + CRunningScript* pNew = CTheScripts::StartNewScript(GET_INTEGER_PARAM(0)); pNew->m_bIsMissionScript = true; return 0; } @@ -4683,7 +4646,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_STORE_CAR_CHAR_IS_IN: { CollectParameters(&m_nIp, 1); - CPed* ped = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* ped = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(ped); CVehicle* pCurrent = nil; if (ped->bInVehicle) { @@ -4728,14 +4691,14 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) break; } } - ScriptParams[0] = CTheScripts::StoreVehicleIndex; + SET_INTEGER_PARAM(0, CTheScripts::StoreVehicleIndex); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_STORE_CAR_PLAYER_IS_IN: { CollectParameters(&m_nIp, 1); - CPed* ped = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* ped = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(ped); if (!ped->bInVehicle) return 0; // No value written to output variable @@ -4779,15 +4742,15 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) break; } } - ScriptParams[0] = CTheScripts::StoreVehicleIndex; + SET_INTEGER_PARAM(0, CTheScripts::StoreVehicleIndex); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_IS_CHAR_IN_CAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - CVehicle* pCheckedVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CVehicle* pCheckedVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); CVehicle* pActualVehicle = pPed->bInVehicle ? pPed->m_pMyVehicle : nil; UpdateCompareFlag(pActualVehicle && pActualVehicle == pCheckedVehicle); return 0; @@ -4795,51 +4758,51 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_IS_PLAYER_IN_CAR: { CollectParameters(&m_nIp, 2); - CVehicle* pCheckedVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CVehicle* pCheckedVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle == pCheckedVehicle); return 0; } case COMMAND_IS_CHAR_IN_MODEL: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); CVehicle* pActualVehicle = pPed->bInVehicle ? pPed->m_pMyVehicle : nil; - UpdateCompareFlag(pActualVehicle && pActualVehicle->GetModelIndex() == ScriptParams[1]); + UpdateCompareFlag(pActualVehicle && pActualVehicle->GetModelIndex() == GET_INTEGER_PARAM(1)); return 0; } case COMMAND_IS_PLAYER_IN_MODEL: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetModelIndex() == ScriptParams[1]); + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->GetModelIndex() == GET_INTEGER_PARAM(1)); return 0; } case COMMAND_IS_CHAR_IN_ANY_CAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle); return 0; } case COMMAND_IS_PLAYER_IN_ANY_CAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle); return 0; } case COMMAND_IS_BUTTON_PRESSED: { CollectParameters(&m_nIp, 2); - UpdateCompareFlag(GetPadState(ScriptParams[0], ScriptParams[1]) != 0); + UpdateCompareFlag(GetPadState(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)) != 0); return 0; } /* case COMMAND_GET_PAD_STATE: { CollectParameters(&m_nIp, 1); - ScriptParams[0] = GetPadState(ScriptParams[0], ScriptParams[1]); + SET_INTEGER_PARAM(0, GetPadState(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1))); StoreParameters(&m_nIp, 1); return 0; } @@ -4899,10 +4862,10 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_CREATE_OBJECT: { CollectParameters(&m_nIp, 4); - int mi = ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::UsedObjectArray[-ScriptParams[0]].index; + int mi = GET_INTEGER_PARAM(0) >= 0 ? GET_INTEGER_PARAM(0) : CTheScripts::UsedObjectArray[-GET_INTEGER_PARAM(0)].index; CObject* pObj = new CObject(mi, false); pObj->ObjectCreatedBy = MISSION_OBJECT; - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += pObj->GetDistanceFromCentreOfMassToBaseOfModel(); @@ -4915,68 +4878,68 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) pObj->SetupBigBuilding(); CTheScripts::ClearSpaceForMissionEntity(pos, pObj); CWorld::Add(pObj); - ScriptParams[0] = CPools::GetObjectPool()->GetIndex(pObj); + SET_INTEGER_PARAM(0, CPools::GetObjectPool()->GetIndex(pObj)); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_OBJECT); + CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_OBJECT); return 0; } case COMMAND_DELETE_OBJECT: { CollectParameters(&m_nIp, 1); - CObject* pObj = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CObject* pObj = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); if (pObj){ CWorld::Remove(pObj); CWorld::RemoveReferencesToDeletedObject(pObj); delete pObj; } if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT); + CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_OBJECT); return 0; } case COMMAND_ADD_SCORE: CollectParameters(&m_nIp, 2); - CWorld::Players[ScriptParams[0]].m_nMoney += ScriptParams[1]; - if (CWorld::Players[ScriptParams[0]].m_nMoney < 0) - CWorld::Players[ScriptParams[0]].m_nMoney = 0; + CWorld::Players[GET_INTEGER_PARAM(0)].m_nMoney += GET_INTEGER_PARAM(1); + if (CWorld::Players[GET_INTEGER_PARAM(0)].m_nMoney < 0) + CWorld::Players[GET_INTEGER_PARAM(0)].m_nMoney = 0; return 0; case COMMAND_IS_SCORE_GREATER: CollectParameters(&m_nIp, 2); - UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_nMoney > ScriptParams[1]); + UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_nMoney > GET_INTEGER_PARAM(1)); return 0; case COMMAND_STORE_SCORE: CollectParameters(&m_nIp, 1); - ScriptParams[0] = CWorld::Players[ScriptParams[0]].m_nMoney; + SET_INTEGER_PARAM(0, CWorld::Players[GET_INTEGER_PARAM(0)].m_nMoney); StoreParameters(&m_nIp, 1); return 0; case COMMAND_GIVE_REMOTE_CONTROLLED_CAR_TO_PLAYER: { CollectParameters(&m_nIp, 5); - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CRemote::GivePlayerRemoteControlledCar(pos.x, pos.y, pos.z, DEGTORAD(*(float*)&ScriptParams[4]), MI_RCBANDIT); + CRemote::GivePlayerRemoteControlledCar(pos.x, pos.y, pos.z, DEGTORAD(GET_FLOAT_PARAM(4)), MI_RCBANDIT); return 0; } case COMMAND_ALTER_WANTED_LEVEL: CollectParameters(&m_nIp, 2); - CWorld::Players[ScriptParams[0]].m_pPed->SetWantedLevel(ScriptParams[1]); + CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->SetWantedLevel(GET_INTEGER_PARAM(1)); return 0; case COMMAND_ALTER_WANTED_LEVEL_NO_DROP: CollectParameters(&m_nIp, 2); - CWorld::Players[ScriptParams[0]].m_pPed->SetWantedLevelNoDrop(ScriptParams[1]); + CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->SetWantedLevelNoDrop(GET_INTEGER_PARAM(1)); return 0; case COMMAND_IS_WANTED_LEVEL_GREATER: CollectParameters(&m_nIp, 2); - UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_pPed->m_pWanted->m_nWantedLevel > ScriptParams[1]); + UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->m_pWanted->m_nWantedLevel > GET_INTEGER_PARAM(1)); return 0; case COMMAND_CLEAR_WANTED_LEVEL: CollectParameters(&m_nIp, 1); - CWorld::Players[ScriptParams[0]].m_pPed->SetWantedLevel(0); + CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->SetWantedLevel(0); return 0; case COMMAND_SET_DEATHARREST_STATE: CollectParameters(&m_nIp, 1); - m_bDeatharrestEnabled = (ScriptParams[0] == 1); + m_bDeatharrestEnabled = (GET_INTEGER_PARAM(0) == 1); return 0; case COMMAND_HAS_DEATHARREST_BEEN_EXECUTED: UpdateCompareFlag(m_bDeatharrestExecuted); @@ -4985,54 +4948,54 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_ADD_AMMO_TO_PLAYER: { CollectParameters(&m_nIp, 3); - CWorld::Players[ScriptParams[0]].m_pPed->GrantAmmo((eWeaponType)ScriptParams[1], ScriptParams[2]); + CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->GrantAmmo((eWeaponType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); return 0; } */ case COMMAND_ADD_AMMO_TO_CHAR: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - pPed->GrantAmmo((eWeaponType)ScriptParams[1], ScriptParams[2]); + pPed->GrantAmmo((eWeaponType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); return 0; } //case COMMAND_ADD_AMMO_TO_CAR: case COMMAND_IS_PLAYER_STILL_ALIVE: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_WBState != WBSTATE_WASTED); + UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_WBState != WBSTATE_WASTED); return 0; case COMMAND_IS_PLAYER_DEAD: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_WBState == WBSTATE_WASTED); + UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_WBState == WBSTATE_WASTED); return 0; case COMMAND_IS_CHAR_DEAD: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - UpdateCompareFlag(!pPed || pPed->DyingOrDead()); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + UpdateCompareFlag(!pPed || pPed->DyingOrDead() || pPed->m_objective == OBJECTIVE_LEAVE_CAR_AND_DIE); return 0; } case COMMAND_IS_CAR_DEAD: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); UpdateCompareFlag(!pVehicle || pVehicle->GetStatus() == STATUS_WRECKED || pVehicle->bIsDrowning); return 0; } case COMMAND_SET_CHAR_THREAT_SEARCH: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - pPed->m_fearFlags |= ScriptParams[1]; + pPed->m_fearFlags |= GET_INTEGER_PARAM(1); return 0; } //case COMMAND_SET_CHAR_THREAT_REACTION: case COMMAND_SET_CHAR_OBJ_NO_OBJ: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); pPed->bScriptObjectiveCompleted = false; pPed->ClearObjective(); @@ -5045,7 +5008,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_IS_PLAYER_IN_ZONE: { CollectParameters(&m_nIp, 1); - CPlayerInfo* pPlayer = &CWorld::Players[ScriptParams[0]]; + CPlayerInfo* pPlayer = &CWorld::Players[GET_INTEGER_PARAM(0)]; char label[12]; CTheScripts::ReadTextLabelFromScript(&m_nIp, label); int zoneToCheck = CTheZones::FindZoneByLabelAndReturnIndex(label, ZONE_DEFAULT); @@ -5058,15 +5021,15 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) } case COMMAND_IS_PLAYER_PRESSING_HORN: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_pPed->GetPedState() == PED_DRIVING && - CPad::GetPad(ScriptParams[0])->GetHorn()); + UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed->GetPedState() == PED_DRIVING && + CPad::GetPad(GET_INTEGER_PARAM(0))->GetHorn()); return 0; case COMMAND_HAS_CHAR_SPOTTED_PLAYER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - UpdateCompareFlag(pPed->OurPedCanSeeThisOne(CWorld::Players[ScriptParams[1]].m_pPed)); + UpdateCompareFlag(pPed->OurPedCanSeeThisOne(CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed)); return 0; } //case COMMAND_ORDER_CHAR_TO_BACKDOOR: @@ -5074,7 +5037,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_IS_CHAR_OBJECTIVE_PASSED: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); UpdateCompareFlag(pPed->bScriptObjectiveCompleted); return 0; @@ -5086,43 +5049,43 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) case COMMAND_CREATE_CHAR_INSIDE_CAR: { CollectParameters(&m_nIp, 3); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - switch (ScriptParams[2]) { + switch (GET_INTEGER_PARAM(2)) { case MI_COP: - if (ScriptParams[1] == PEDTYPE_COP) - ScriptParams[2] = COP_STREET; + if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) + SET_INTEGER_PARAM(2, COP_STREET); break; case MI_SWAT: - if (ScriptParams[1] == PEDTYPE_COP) - ScriptParams[2] = COP_SWAT; + if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) + SET_INTEGER_PARAM(2, COP_SWAT); break; case MI_FBI: - if (ScriptParams[1] == PEDTYPE_COP) - ScriptParams[2] = COP_FBI; + if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) + SET_INTEGER_PARAM(2, COP_FBI); break; case MI_ARMY: - if (ScriptParams[1] == PEDTYPE_COP) - ScriptParams[2] = COP_ARMY; + if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) + SET_INTEGER_PARAM(2, COP_ARMY); break; case MI_MEDIC: - if (ScriptParams[1] == PEDTYPE_EMERGENCY) - ScriptParams[2] = PEDTYPE_EMERGENCY; + if (GET_INTEGER_PARAM(1) == PEDTYPE_EMERGENCY) + SET_INTEGER_PARAM(2, PEDTYPE_EMERGENCY); break; case MI_FIREMAN: - if (ScriptParams[1] == PEDTYPE_FIREMAN) - ScriptParams[2] = PEDTYPE_FIREMAN; + if (GET_INTEGER_PARAM(1) == PEDTYPE_FIREMAN) + SET_INTEGER_PARAM(2, PEDTYPE_FIREMAN); break; default: break; } CPed* pPed; - if (ScriptParams[1] == PEDTYPE_COP) - pPed = new CCopPed((eCopType)ScriptParams[2]); - else if (ScriptParams[1] == PEDTYPE_EMERGENCY || ScriptParams[1] == PEDTYPE_FIREMAN) - pPed = new CEmergencyPed(ScriptParams[2]); + if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) + pPed = new CCopPed((eCopType)GET_INTEGER_PARAM(2)); + else if (GET_INTEGER_PARAM(1) == PEDTYPE_EMERGENCY || GET_INTEGER_PARAM(1) == PEDTYPE_FIREMAN) + pPed = new CEmergencyPed(GET_INTEGER_PARAM(2)); else - pPed = new CCivilianPed((ePedType)ScriptParams[1], ScriptParams[2]); + pPed = new CCivilianPed((ePedType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); pPed->CharCreatedBy = MISSION_CHAR; pPed->bRespondsToThreats = false; pPed->bAllowMedicsToReviveMe = false; @@ -5132,7 +5095,6 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) pPed->SetPosition(pVehicle->GetPosition()); pPed->SetOrientation(0.0f, 0.0f, 0.0f); pPed->SetPedState(PED_DRIVING); - CPopulation::ms_nTotalMissionPeds++; script_assert(!pVehicle->pDriver); pVehicle->pDriver = pPed; pVehicle->pDriver->RegisterReference((CEntity**)&pVehicle->pDriver); @@ -5147,17 +5109,18 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) pPed->AddInCarAnims(pVehicle, true); pPed->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pPed->GetPosition()); CWorld::Add(pPed); - ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed); + CPopulation::ms_nTotalMissionPeds++; + SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex(pPed)); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); + CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); return 0; } case COMMAND_WARP_PLAYER_FROM_CAR_TO_COORD: { CollectParameters(&m_nIp, 4); - CVector pos = *(CVector*)&ScriptParams[1]; - CPlayerInfo* pPlayer = &CWorld::Players[ScriptParams[0]]; + CVector pos = GET_VECTOR_PARAM(1); + CPlayerInfo* pPlayer = &CWorld::Players[GET_INTEGER_PARAM(0)]; if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); if (pPlayer->m_pPed->bInVehicle){ diff --git a/src/control/Script.h b/src/control/Script.h index 3220a2b3..60902563 100644 --- a/src/control/Script.h +++ b/src/control/Script.h @@ -47,6 +47,14 @@ void FlushLog(); #define KEY_LENGTH_IN_SCRIPT (8) +#define GET_INTEGER_PARAM(i) (ScriptParams[i]) +#define GET_FLOAT_PARAM(i) (*(float*)&ScriptParams[i]) +#define GET_VECTOR_PARAM(i) (CVector(GET_FLOAT_PARAM(i), GET_FLOAT_PARAM(i+1), GET_FLOAT_PARAM(i+2))) + +#define SET_INTEGER_PARAM(i, x) ScriptParams[i] = x +#define SET_FLOAT_PARAM(i, x) *(float*)&ScriptParams[i] = x +#define SET_VECTOR_PARAM(i, v) { *(float*)&ScriptParams[i] = (v).x; *(float*)&ScriptParams[i+1] = (v).y; *(float*)&ScriptParams[i+2] = (v).z; } + #define GTA_SCRIPT_COLLECTIVE struct intro_script_rectangle diff --git a/src/control/Script4.cpp b/src/control/Script4.cpp index a8cc9b9c..916e36e5 100644 --- a/src/control/Script4.cpp +++ b/src/control/Script4.cpp @@ -1357,11 +1357,13 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) CTxdStore::AddRef(slot); return 0; } + /* case COMMAND_REMOVE_TEXTURE_DICTIONARY: { CTheScripts::RemoveScriptTextureDictionary(); return 0; } + */ case COMMAND_SET_OBJECT_DYNAMIC: { CollectParameters(&m_nIp, 2); From 585300cd335abe6cc13519daaab3ed30266b02a5 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Sun, 10 Jan 2021 22:37:11 +0200 Subject: [PATCH 42/68] More font fix --- src/render/Font.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/render/Font.cpp b/src/render/Font.cpp index 04b1e074..6d569591 100644 --- a/src/render/Font.cpp +++ b/src/render/Font.cpp @@ -432,7 +432,7 @@ CFont::PrintChar(float x, float y, wchar c) bDontPrint = c == '\0'; float w = GetCharacterWidth(c) / 32.0f; - if (RenderState.bFontHalfTexture && c == 208) + if (Details.bFontHalfTexture && c == 208) c = '\0'; float xoff = c % 16; float yoff = c / 16; @@ -1051,10 +1051,10 @@ CFont::GetCharacterWidth(wchar c) return Size[LanguageSet][Details.style][192]; #else - if (Details.proportional) - return Size[Details.style][c]; + if (RenderState.proportional) + return Size[RenderState.style][c]; else - return Size[Details.style][209]; + return Size[RenderState.style][209]; #endif // MORE_LANGUAGES } From b5711b21dc6843b9146a9f1d12a99473a0873f35 Mon Sep 17 00:00:00 2001 From: erorcun Date: Mon, 11 Jan 2021 01:10:24 +0300 Subject: [PATCH 43/68] Automobile: fix --- src/vehicles/Automobile.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp index 16d29b26..3a0121ec 100644 --- a/src/vehicles/Automobile.cpp +++ b/src/vehicles/Automobile.cpp @@ -288,17 +288,17 @@ CAutomobile::ProcessControl(void) // Improve grip of vehicles in certain cases bool strongGrip1 = false; bool strongGrip2 = false; - if(FindPlayerVehicle() && this != FindPlayerVehicle() && + if(FindPlayerVehicle() && this != FindPlayerVehicle() && FindPlayerPed()->m_pWanted->m_nWantedLevel > 3 && (AutoPilot.m_nCarMission == MISSION_RAMPLAYER_FARAWAY || AutoPilot.m_nCarMission == MISSION_RAMPLAYER_CLOSE || - AutoPilot.m_nCarMission == MISSION_BLOCKPLAYER_FARAWAY || AutoPilot.m_nCarMission == MISSION_BLOCKPLAYER_CLOSE)){ - if(FindPlayerSpeed().Magnitude() > 0.3f){ - strongGrip1 = true; - if(FindPlayerSpeed().Magnitude() > 0.4f && - m_vecMoveSpeed.Magnitude() < 0.3f) - strongGrip2 = true; - else if((GetPosition() - FindPlayerCoors()).Magnitude() > 50.0f) - strongGrip2 = true; - } + AutoPilot.m_nCarMission == MISSION_BLOCKPLAYER_FARAWAY || AutoPilot.m_nCarMission == MISSION_BLOCKPLAYER_CLOSE) && + FindPlayerSpeed().Magnitude() > 0.3f){ + + strongGrip1 = true; + if(FindPlayerSpeed().Magnitude() > 0.4f && + m_vecMoveSpeed.Magnitude() < 0.3f) + strongGrip2 = true; + else if((GetPosition() - FindPlayerCoors()).Magnitude() > 50.0f) + strongGrip2 = true; }else if(GetModelIndex() == MI_RCBANDIT && GetStatus() != STATUS_PLAYER_REMOTE) strongGrip1 = true; From 53a99cb9ee8514438a64960a54adb4e1b2cbd349 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Mon, 11 Jan 2021 02:35:03 +0300 Subject: [PATCH 44/68] script2 --- src/control/Script2.cpp | 826 +++++++++++++++++++++------------------- src/control/Script5.cpp | 2 +- src/core/config.h | 2 +- src/peds/Ped.h | 1 + src/peds/PedAI.cpp | 45 +++ 5 files changed, 487 insertions(+), 389 deletions(-) diff --git a/src/control/Script2.cpp b/src/control/Script2.cpp index 10f122ca..6a31b65b 100644 --- a/src/control/Script2.cpp +++ b/src/control/Script2.cpp @@ -28,46 +28,46 @@ #include "World.h" #include "Zones.h" +// LCS: file done except TODOs + int8 CRunningScript::ProcessCommands300To399(int32 command) { switch (command) { - //case COMMAND_SET_CHAR_INVINCIBLE: - //case COMMAND_SET_PLAYER_INVINCIBLE: - //case COMMAND_SET_CHAR_GRAPHIC_TYPE: - //case COMMAND_SET_PLAYER_GRAPHIC_TYPE: - /* + //case COMMAND_SET_CHAR_INVINCIBLE: + //case COMMAND_SET_PLAYER_INVINCIBLE: + //case COMMAND_SET_CHAR_GRAPHIC_TYPE: + //case COMMAND_SET_PLAYER_GRAPHIC_TYPE: case COMMAND_HAS_PLAYER_BEEN_ARRESTED: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_WBState == WBSTATE_BUSTED); + UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_WBState == WBSTATE_BUSTED); return 0; - */ - //case COMMAND_STOP_CHAR_DRIVING: - //case COMMAND_KILL_CHAR: - //case COMMAND_SET_FAVOURITE_CAR_MODEL_FOR_CHAR: - //case COMMAND_SET_CHAR_OCCUPATION: - /* - case COMMAND_CHANGE_CAR_LOCK: - { - CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - script_assert(pVehicle); - pVehicle->m_nDoorLock = (eCarLock)ScriptParams[1]; - return 0; - } - case COMMAND_SHAKE_CAM_WITH_POINT: - CollectParameters(&m_nIp, 4); - TheCamera.CamShake(ScriptParams[0] / 1000.0f, - *(float*)&ScriptParams[1], - *(float*)&ScriptParams[2], - *(float*)&ScriptParams[3]); - return 0; - */ + //case COMMAND_STOP_CHAR_DRIVING: + //case COMMAND_KILL_CHAR: + //case COMMAND_SET_FAVOURITE_CAR_MODEL_FOR_CHAR: + //case COMMAND_SET_CHAR_OCCUPATION: + /* + case COMMAND_CHANGE_CAR_LOCK: + { + CollectParameters(&m_nIp, 2); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + script_assert(pVehicle); + pVehicle->m_nDoorLock = (eCarLock)GET_INTEGER_PARAM(1); + return 0; + } + case COMMAND_SHAKE_CAM_WITH_POINT: + CollectParameters(&m_nIp, 4); + TheCamera.CamShake(GET_INTEGER_PARAM(0) / 1000.0f, + GET_FLOAT_PARAM(1), + GET_FLOAT_PARAM(2), + GET_FLOAT_PARAM(3)); + return 0; + */ case COMMAND_IS_CAR_MODEL: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - UpdateCompareFlag(pVehicle->GetModelIndex() == ScriptParams[1]); + UpdateCompareFlag(pVehicle->GetModelIndex() == GET_INTEGER_PARAM(1)); return 0; } //case COMMAND_IS_CAR_REMAP: @@ -77,15 +77,15 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_IS_CAR_DEAD_IN_AREA_2D: { CollectParameters(&m_nIp, 6); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - float x1 = *(float*)&ScriptParams[1]; - float y1 = *(float*)&ScriptParams[2]; - float x2 = *(float*)&ScriptParams[3]; - float y2 = *(float*)&ScriptParams[4]; + float x1 = GET_FLOAT_PARAM(1); + float y1 = GET_FLOAT_PARAM(2); + float x2 = GET_FLOAT_PARAM(3); + float y2 = GET_FLOAT_PARAM(4); UpdateCompareFlag(pVehicle->GetStatus() == STATUS_WRECKED && pVehicle->IsWithinArea(x1, y1, x2, y2)); - if (ScriptParams[5]) + if (GET_INTEGER_PARAM(5)) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, MAP_Z_LOW_LIMIT); if (CTheScripts::DbgFlag) CTheScripts::DrawDebugSquare(x1, y1, x2, y2); @@ -94,17 +94,17 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_IS_CAR_DEAD_IN_AREA_3D: { CollectParameters(&m_nIp, 8); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - float x1 = *(float*)&ScriptParams[1]; - float y1 = *(float*)&ScriptParams[2]; - float z1 = *(float*)&ScriptParams[3]; - float x2 = *(float*)&ScriptParams[4]; - float y2 = *(float*)&ScriptParams[5]; - float z2 = *(float*)&ScriptParams[6]; + float x1 = GET_FLOAT_PARAM(1); + float y1 = GET_FLOAT_PARAM(2); + float z1 = GET_FLOAT_PARAM(3); + float x2 = GET_FLOAT_PARAM(4); + float y2 = GET_FLOAT_PARAM(5); + float z2 = GET_FLOAT_PARAM(6); UpdateCompareFlag(pVehicle->GetStatus() == STATUS_WRECKED && pVehicle->IsWithinArea(x1, y1, z1, x2, y2, z2)); - if (ScriptParams[7]) + if (GET_INTEGER_PARAM(7)) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, (z1 + z2) / 2); if (CTheScripts::DbgFlag) CTheScripts::DrawDebugCube(x1, y1, z1, x2, y2, z2); @@ -121,38 +121,45 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) //case COMMAND_SET_CAR_FLAMEPROOF: //case COMMAND_SET_CAR_ROCKETPROOF: //case COMMAND_IS_CARBOMB_ACTIVE: - //case COMMAND_GIVE_CAR_ALARM: + case COMMAND_GIVE_CAR_ALARM: + { + CollectParameters(&m_nIp, 1); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + script_assert(pVehicle); + pVehicle->m_nAlarmState = -1; + return 0; + } //case COMMAND_PUT_CAR_ON_TRAILER: - /* case COMMAND_IS_CAR_CRUSHED: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CGarages::HasCarBeenCrushed(ScriptParams[0])); + UpdateCompareFlag(CGarages::HasCarBeenCrushed(GET_INTEGER_PARAM(0))); return 0; - */ - //case COMMAND_CREATE_GANG_CAR: + //case COMMAND_CREATE_GANG_CAR: case COMMAND_CREATE_CAR_GENERATOR: { CollectParameters(&m_nIp, 12); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z > MAP_Z_LOW_LIMIT) pos.z += 0.015f; - ScriptParams[0] = CTheCarGenerators::CreateCarGenerator( - pos.x, pos.y, pos.z, *(float*)&ScriptParams[3], - ScriptParams[4], ScriptParams[5], ScriptParams[6], ScriptParams[7], - ScriptParams[8], ScriptParams[9], ScriptParams[10], ScriptParams[11]); + SET_INTEGER_PARAM(0, CTheCarGenerators::CreateCarGenerator( + pos.x, pos.y, pos.z, GET_FLOAT_PARAM(3), + GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), + GET_INTEGER_PARAM(8), GET_INTEGER_PARAM(9), GET_INTEGER_PARAM(10), GET_INTEGER_PARAM(11))); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SWITCH_CAR_GENERATOR: { CollectParameters(&m_nIp, 2); - CCarGenerator* pCarGen = &CTheCarGenerators::CarGeneratorArray[ScriptParams[0]]; - if (ScriptParams[1] == 0){ + CCarGenerator* pCarGen = &CTheCarGenerators::CarGeneratorArray[GET_INTEGER_PARAM(0)]; + if (GET_INTEGER_PARAM(1) == 0) { pCarGen->SwitchOff(); - }else if (ScriptParams[1] <= 100){ + } + else if (GET_INTEGER_PARAM(1) <= 100) { pCarGen->SwitchOn(); - pCarGen->SetUsesRemaining(ScriptParams[1]); - }else{ + pCarGen->SetUsesRemaining(GET_INTEGER_PARAM(1)); + } + else { pCarGen->SwitchOn(); } return 0; @@ -162,40 +169,34 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 3); - CUserDisplay::Pager.AddMessage(text, ScriptParams[0], ScriptParams[1], ScriptParams[2]); + CUserDisplay::Pager.AddMessage(text, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); return 0; } */ case COMMAND_DISPLAY_ONSCREEN_TIMER: { - //script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); - m_nIp++; - uint16 offset = CTheScripts::Read2BytesFromScript(&m_nIp); + uint16 offset = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - (int32*)CTheScripts::ScriptSpace; CollectParameters(&m_nIp, 1); - CUserDisplay::OnscnTimer.AddClock(offset, nil, ScriptParams[0] != 0); + CUserDisplay::OnscnTimer.AddClock(offset, nil, GET_INTEGER_PARAM(0) != 0); return 0; } case COMMAND_CLEAR_ONSCREEN_TIMER: { - //script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); - m_nIp++; - CUserDisplay::OnscnTimer.ClearClock((uint16)CTheScripts::Read2BytesFromScript(&m_nIp)); + uint16 offset = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - (int32*)CTheScripts::ScriptSpace; + CUserDisplay::OnscnTimer.ClearClock(offset); return 0; } case COMMAND_DISPLAY_ONSCREEN_COUNTER: { - //script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); - m_nIp++; - int16 counter = CTheScripts::Read2BytesFromScript(&m_nIp); + uint16 counter = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - (int32*)CTheScripts::ScriptSpace; CollectParameters(&m_nIp, 1); - CUserDisplay::OnscnTimer.AddCounter(counter, ScriptParams[0], nil, 0); + CUserDisplay::OnscnTimer.AddCounter(counter, GET_INTEGER_PARAM(0), nil, 0); return 0; } case COMMAND_CLEAR_ONSCREEN_COUNTER: { - //script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); - m_nIp++; - CUserDisplay::OnscnTimer.ClearCounter((uint16)CTheScripts::Read2BytesFromScript(&m_nIp)); + uint16 counter = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - (int32*)CTheScripts::ScriptSpace; + CUserDisplay::OnscnTimer.ClearCounter(counter); return 0; } case COMMAND_SET_ZONE_CAR_INFO: @@ -219,7 +220,7 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) return 0; } while (zone >= 0) { - CTheZones::SetZoneCarInfo(zone, ScriptParams[0], ScriptParams[1], ScriptParams[11], gangDensities); + CTheZones::SetZoneCarInfo(zone, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(11), gangDensities); zone = CTheZones::FindNextZoneByLabelAndReturnIndex(label, ZONE_INFO); } return 0; @@ -228,7 +229,7 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_IS_CHAR_IN_ZONE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); char label[12]; CTheScripts::ReadTextLabelFromScript(&m_nIp, label); @@ -239,39 +240,70 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) UpdateCompareFlag(CTheZones::PointLiesWithinZone(&pos, CTheZones::GetNavigationZone(zone))); return 0; } - //case COMMAND_SET_CAR_DENSITY: - //case COMMAND_SET_PED_DENSITY: + case COMMAND_SET_CAR_DENSITY: + { + char label[12]; + CTheScripts::ReadTextLabelFromScript(&m_nIp, label); + int16 zone = CTheZones::FindZoneByLabelAndReturnIndex(label, ZONE_INFO); + m_nIp += 8; + CollectParameters(&m_nIp, 2); + if (zone < 0) { + debug("Couldn't find zone - %s\n", label); + return 0; + } + while (zone >= 0) { + CTheZones::SetCarDensity(zone, ScriptParams[0], ScriptParams[1]); + zone = CTheZones::FindNextZoneByLabelAndReturnIndex(label, ZONE_INFO); + } + return 0; + } + case COMMAND_SET_PED_DENSITY: + { + char label[12]; + CTheScripts::ReadTextLabelFromScript(&m_nIp, label); + int16 zone = CTheZones::FindZoneByLabelAndReturnIndex(label, ZONE_INFO); + m_nIp += KEY_LENGTH_IN_SCRIPT; + CollectParameters(&m_nIp, 2); + if (zone < 0) { + debug("Couldn't find zone - %s\n", label); + return 0; + } + while (zone >= 0) { + CTheZones::SetPedDensity(zone, ScriptParams[0], ScriptParams[1]); + zone = CTheZones::FindNextZoneByLabelAndReturnIndex(label, ZONE_INFO); + } + return 0; + } case COMMAND_POINT_CAMERA_AT_PLAYER: { CollectParameters(&m_nIp, 3); - // ScriptParams[0] is unused. - TheCamera.TakeControl(nil, ScriptParams[1], ScriptParams[2], CAMCONTROL_SCRIPT); + TheCamera.TakeControl(nil, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), CAMCONTROL_SCRIPT); return 0; } case COMMAND_POINT_CAMERA_AT_CAR: { CollectParameters(&m_nIp, 3); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); if (pVehicle) - TheCamera.TakeControl(pVehicle, ScriptParams[1], ScriptParams[2], CAMCONTROL_SCRIPT); + TheCamera.TakeControl(pVehicle, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), CAMCONTROL_SCRIPT); return 0; } case COMMAND_POINT_CAMERA_AT_CHAR: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); if (pPed) - TheCamera.TakeControl(pPed, ScriptParams[1], ScriptParams[2], CAMCONTROL_SCRIPT); + TheCamera.TakeControl(pPed, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), CAMCONTROL_SCRIPT); return 0; } case COMMAND_RESTORE_CAMERA: TheCamera.Restore(); return 0; - /* - case COMMAND_SHAKE_PAD: - CPad::GetPad(ScriptParams[0])->StartShake(ScriptParams[1], ScriptParams[2]); - return 0; - */ + /* + case COMMAND_SHAKE_PAD: + CPad::GetPad(GET_INTEGER_PARAM(0))->StartShake(GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); + return 0; + */ case COMMAND_SET_ZONE_PED_INFO: { char label[12]; @@ -284,61 +316,61 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) return 0; } while (zone >= 0) { - CTheZones::SetZonePedInfo(zone, ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], - ScriptParams[4], ScriptParams[5], ScriptParams[6], ScriptParams[7], ScriptParams[8], ScriptParams[9], ScriptParams[10], ScriptParams[11]); + CTheZones::SetZonePedInfo(zone, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), + GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(8), GET_INTEGER_PARAM(9), GET_INTEGER_PARAM(10), GET_INTEGER_PARAM(11)); zone = CTheZones::FindNextZoneByLabelAndReturnIndex(label, ZONE_INFO); } return 0; } case COMMAND_SET_TIME_SCALE: CollectParameters(&m_nIp, 1); - CTimer::SetTimeScale(*(float*)&ScriptParams[0]); + CTimer::SetTimeScale(GET_FLOAT_PARAM(0)); return 0; - /* - case COMMAND_IS_CAR_IN_AIR: - { - CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - script_assert(pVehicle && pVehicle->IsCar()); - CAutomobile* pCar = (CAutomobile*)pVehicle; - UpdateCompareFlag(pCar->GetAllWheelsOffGround()); - return 0; - } - */ + /* + case COMMAND_IS_CAR_IN_AIR: + { + CollectParameters(&m_nIp, 1); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + script_assert(pVehicle && pVehicle->IsCar()); + CAutomobile* pCar = (CAutomobile*)pVehicle; + UpdateCompareFlag(pCar->GetAllWheelsOffGround()); + return 0; + } + */ case COMMAND_SET_FIXED_CAMERA_POSITION: { CollectParameters(&m_nIp, 6); TheCamera.SetCamPositionForFixedMode( - CVector(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1], *(float*)&ScriptParams[2]), - CVector(*(float*)&ScriptParams[3], *(float*)&ScriptParams[4], *(float*)&ScriptParams[5])); + CVector(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2)), + CVector(GET_FLOAT_PARAM(3), GET_FLOAT_PARAM(4), GET_FLOAT_PARAM(5))); return 0; } case COMMAND_POINT_CAMERA_AT_POINT: { CollectParameters(&m_nIp, 4); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - TheCamera.TakeControlNoEntity(pos, ScriptParams[3], CAMCONTROL_SCRIPT); + TheCamera.TakeControlNoEntity(pos, GET_INTEGER_PARAM(3), CAMCONTROL_SCRIPT); return 0; } case COMMAND_ADD_BLIP_FOR_CAR_OLD: { CollectParameters(&m_nIp, 3); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - ScriptParams[0] = CRadar::SetEntityBlip(BLIP_CAR, ScriptParams[0], ScriptParams[1], (eBlipDisplay)ScriptParams[2]); + SET_INTEGER_PARAM(0, CRadar::SetEntityBlip(BLIP_CAR, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), (eBlipDisplay)GET_INTEGER_PARAM(2))); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_BLIP_FOR_CHAR_OLD: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - ScriptParams[0] = CRadar::SetEntityBlip(BLIP_CHAR, ScriptParams[0], ScriptParams[1], (eBlipDisplay)ScriptParams[2]); + SET_INTEGER_PARAM(0, CRadar::SetEntityBlip(BLIP_CHAR, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), (eBlipDisplay)GET_INTEGER_PARAM(2))); StoreParameters(&m_nIp, 1); return 0; } @@ -346,57 +378,61 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_ADD_BLIP_FOR_OBJECT_OLD: { CollectParameters(&m_nIp, 3); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pObject); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - ScriptParams[0] = CRadar::SetEntityBlip(BLIP_OBJECT, ScriptParams[0], ScriptParams[1], (eBlipDisplay)ScriptParams[2]); + SET_INTEGER_PARAM(0, CRadar::SetEntityBlip(BLIP_OBJECT, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), (eBlipDisplay)GET_INTEGER_PARAM(2))); StoreParameters(&m_nIp, 1); return 0; } */ case COMMAND_REMOVE_BLIP: CollectParameters(&m_nIp, 1); - CRadar::ClearBlip(ScriptParams[0]); + CRadar::ClearBlip(GET_INTEGER_PARAM(0)); return 0; case COMMAND_CHANGE_BLIP_COLOUR: CollectParameters(&m_nIp, 2); - CRadar::ChangeBlipColour(ScriptParams[0], ScriptParams[1]); + CRadar::ChangeBlipColour(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); return 0; case COMMAND_DIM_BLIP: CollectParameters(&m_nIp, 2); - CRadar::ChangeBlipBrightness(ScriptParams[0], ScriptParams[1]); + CRadar::ChangeBlipBrightness(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); return 0; case COMMAND_ADD_BLIP_FOR_COORD_OLD: { CollectParameters(&m_nIp, 5); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - ScriptParams[0] = CRadar::SetCoordBlip(BLIP_COORD, pos, ScriptParams[3], (eBlipDisplay)ScriptParams[4]); + SET_INTEGER_PARAM(0, CRadar::SetCoordBlip(BLIP_COORD, pos, GET_INTEGER_PARAM(3), (eBlipDisplay)GET_INTEGER_PARAM(4))); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_CHANGE_BLIP_SCALE: CollectParameters(&m_nIp, 2); - CRadar::ChangeBlipScale(ScriptParams[0], ScriptParams[1]); + CRadar::ChangeBlipScale(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); return 0; case COMMAND_SET_FADING_COLOUR: CollectParameters(&m_nIp, 3); - TheCamera.SetFadeColour(ScriptParams[0], ScriptParams[1], ScriptParams[2]); + TheCamera.SetFadeColour(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); return 0; case COMMAND_DO_FADE: + { + // unknown empty call on PS2, not mobile CollectParameters(&m_nIp, 2); - TheCamera.Fade(ScriptParams[0] / 1000.0f, ScriptParams[1]); + float fFadeTime = GET_INTEGER_PARAM(0); + TheCamera.Fade(fFadeTime > 2 ? fFadeTime / 1000.0f : 0.0f, GET_INTEGER_PARAM(1)); return 0; + } case COMMAND_GET_FADING_STATUS: UpdateCompareFlag(TheCamera.GetFading()); return 0; case COMMAND_ADD_HOSPITAL_RESTART: { CollectParameters(&m_nIp, 4); - CVector pos = *(CVector*)&ScriptParams[0]; - float angle = *(float*)&ScriptParams[3]; + CVector pos = GET_VECTOR_PARAM(0); + float angle = GET_FLOAT_PARAM(3); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRestart::AddHospitalRestartPoint(pos, angle); @@ -405,8 +441,8 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_ADD_POLICE_RESTART: { CollectParameters(&m_nIp, 4); - CVector pos = *(CVector*)&ScriptParams[0]; - float angle = *(float*)&ScriptParams[3]; + CVector pos = GET_VECTOR_PARAM(0); + float angle = GET_FLOAT_PARAM(3); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRestart::AddPoliceRestartPoint(pos, angle); @@ -415,8 +451,8 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_OVERRIDE_NEXT_RESTART: { CollectParameters(&m_nIp, 4); - CVector pos = *(CVector*)&ScriptParams[0]; - float angle = *(float*)&ScriptParams[3]; + CVector pos = GET_VECTOR_PARAM(0); + float angle = GET_FLOAT_PARAM(3); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRestart::OverrideNextRestart(pos, angle); @@ -426,9 +462,9 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_DRAW_SHADOW: { CollectParameters(&m_nIp, 10); - CVector pos = *(CVector*)&ScriptParams[1]; - float angle = *(float*)&ScriptParams[4]; - float length = *(float*)&ScriptParams[5]; + CVector pos = GET_VECTOR_PARAM(1); + float angle = GET_FLOAT_PARAM(4); + float length = GET_FLOAT_PARAM(5); float x, y; if (angle != 0.0f){ y = cos(angle) * length; @@ -441,40 +477,40 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) float frontY = y; float sideX = y; float sideY = x; - CShadows::StoreShadowToBeRendered(ScriptParams[0], &pos, frontX, frontY, sideX, sideY, - ScriptParams[6], ScriptParams[7], ScriptParams[8], ScriptParams[9]); + CShadows::StoreShadowToBeRendered(GET_INTEGER_PARAM(0), &pos, frontX, frontY, sideX, sideY, + GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(8), GET_INTEGER_PARAM(9)); return 0; } */ case COMMAND_GET_PLAYER_HEADING: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; float angle = pPed->bInVehicle ? pPed->m_pMyVehicle->GetForward().Heading() : pPed->GetForward().Heading(); angle = RADTODEG(angle); if (angle < 0.0f) angle += 360.0f; if (angle > 360.0f) angle -= 360.0f; - *(float*)&ScriptParams[0] = angle; + SET_FLOAT_PARAM(0, angle); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_PLAYER_HEADING: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); if (pPed->bInVehicle) return 0; - pPed->m_fRotationDest = pPed->m_fRotationCur = DEGTORAD(*(float*)&ScriptParams[1]); - pPed->SetHeading(DEGTORAD(*(float*)&ScriptParams[1])); + pPed->m_fRotationDest = pPed->m_fRotationCur = DEGTORAD(GET_FLOAT_PARAM(1)); + pPed->SetHeading(DEGTORAD(GET_FLOAT_PARAM(1))); return 0; } case COMMAND_GET_CHAR_HEADING: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); float angle = pPed->bInVehicle ? pPed->m_pMyVehicle->GetForward().Heading() : pPed->GetForward().Heading(); angle = RADTODEG(angle); @@ -482,25 +518,25 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) angle += 360.0f; if (angle > 360.0f) angle -= 360.0f; - *(float*)&ScriptParams[0] = angle; + SET_FLOAT_PARAM(0, angle); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_CHAR_HEADING: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); if (pPed->bInVehicle) return 0; - pPed->m_fRotationDest = pPed->m_fRotationCur = DEGTORAD(*(float*)&ScriptParams[1]); - pPed->SetHeading(DEGTORAD(*(float*)&ScriptParams[1])); + pPed->m_fRotationDest = pPed->m_fRotationCur = DEGTORAD(GET_FLOAT_PARAM(1)); + pPed->SetHeading(DEGTORAD(GET_FLOAT_PARAM(1))); return 0; } case COMMAND_GET_CAR_HEADING: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); float angle = pVehicle->GetForward().Heading(); angle = RADTODEG(angle); @@ -508,22 +544,22 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) angle += 360.0f; if (angle > 360.0f) angle -= 360.0f; - *(float*)&ScriptParams[0] = angle; + SET_FLOAT_PARAM(0, angle); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_CAR_HEADING: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - pVehicle->SetHeading(DEGTORAD(*(float*)&ScriptParams[1])); + pVehicle->SetHeading(DEGTORAD(GET_FLOAT_PARAM(1))); return 0; } case COMMAND_GET_OBJECT_HEADING: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pObject); float angle = pObject->GetForward().Heading(); angle = RADTODEG(angle); @@ -531,39 +567,39 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) angle += 360.0f; if (angle > 360.0f) angle -= 360.0f; - *(float*)&ScriptParams[0] = angle; + SET_FLOAT_PARAM(0, angle); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_OBJECT_HEADING: { CollectParameters(&m_nIp, 2); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pObject); CWorld::Remove(pObject); - pObject->SetHeading(DEGTORAD(*(float*)&ScriptParams[1])); + pObject->SetHeading(DEGTORAD(GET_FLOAT_PARAM(1))); pObject->GetMatrix().UpdateRW(); pObject->UpdateRwFrame(); CWorld::Add(pObject); return 0; } - /* case COMMAND_IS_PLAYER_TOUCHING_OBJECT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[1]); + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)); script_assert(pObject); CPhysical* pEntityToTest = pPed->bInVehicle ? (CPhysical*)pPed->m_pMyVehicle : pPed; UpdateCompareFlag(pEntityToTest->GetHasCollidedWith(pObject)); return 0; } + /* case COMMAND_IS_CHAR_TOUCHING_OBJECT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[1]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)); script_assert(pObject); CPhysical* pEntityToTest = pPed->bInVehicle ? (CPhysical*)pPed->m_pMyVehicle : pPed; UpdateCompareFlag(pEntityToTest->GetHasCollidedWith(pObject)); @@ -573,18 +609,16 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_SET_PLAYER_AMMO: { CollectParameters(&m_nIp, 3); - CWorld::Players[0].m_pPed->SetAmmo((eWeaponType)ScriptParams[1], ScriptParams[2]); + CWorld::Players[0].m_pPed->SetAmmo((eWeaponType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); return 0; } - /* case COMMAND_SET_CHAR_AMMO: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - pPed->SetAmmo((eWeaponType)ScriptParams[1], ScriptParams[2]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + pPed->SetAmmo((eWeaponType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); return 0; } - */ //case COMMAND_SET_CAR_AMMO: //case COMMAND_LOAD_CAMERA_SPLINE: //case COMMAND_MOVE_CAMERA_ALONG_SPLINE: @@ -594,100 +628,100 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) return 0; case COMMAND_DECLARE_MISSION_FLAG_FOR_CONTACT: return 0; - //case COMMAND_DECLARE_BASE_BRIEF_ID_FOR_CONTACT: + //case COMMAND_DECLARE_BASE_BRIEF_ID_FOR_CONTACT: case COMMAND_IS_PLAYER_HEALTH_GREATER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - UpdateCompareFlag(pPed->m_fHealth > ScriptParams[1]); + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + UpdateCompareFlag(pPed->m_fHealth > GET_INTEGER_PARAM(1)); return 0; } case COMMAND_IS_CHAR_HEALTH_GREATER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - UpdateCompareFlag(pPed->m_fHealth > ScriptParams[1]); + UpdateCompareFlag(pPed->m_fHealth > GET_INTEGER_PARAM(1)); return 0; } case COMMAND_IS_CAR_HEALTH_GREATER: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - UpdateCompareFlag(pVehicle->m_fHealth > ScriptParams[1]); + UpdateCompareFlag(pVehicle->m_fHealth > GET_INTEGER_PARAM(1)); return 0; } case COMMAND_ADD_BLIP_FOR_CAR: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int handle = CRadar::SetEntityBlip(BLIP_CAR, ScriptParams[0], 0, BLIP_DISPLAY_BOTH); + int handle = CRadar::SetEntityBlip(BLIP_CAR, GET_INTEGER_PARAM(0), 0, BLIP_DISPLAY_BOTH); CRadar::ChangeBlipScale(handle, 3); - ScriptParams[0] = handle; + SET_INTEGER_PARAM(0, handle); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_BLIP_FOR_CHAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int handle = CRadar::SetEntityBlip(BLIP_CHAR, ScriptParams[0], 1, BLIP_DISPLAY_BOTH); + int handle = CRadar::SetEntityBlip(BLIP_CHAR, GET_INTEGER_PARAM(0), 1, BLIP_DISPLAY_BOTH); CRadar::ChangeBlipScale(handle, 3); - ScriptParams[0] = handle; + SET_INTEGER_PARAM(0, handle); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_BLIP_FOR_OBJECT: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pObject); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int handle = CRadar::SetEntityBlip(BLIP_OBJECT, ScriptParams[0], 6, BLIP_DISPLAY_BOTH); + int handle = CRadar::SetEntityBlip(BLIP_OBJECT, GET_INTEGER_PARAM(0), 6, BLIP_DISPLAY_BOTH); CRadar::ChangeBlipScale(handle, 3); - ScriptParams[0] = handle; + SET_INTEGER_PARAM(0, handle); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_BLIP_FOR_CONTACT_POINT: { CollectParameters(&m_nIp, 3); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); int handle = CRadar::SetCoordBlip(BLIP_CONTACT_POINT, pos, 2, BLIP_DISPLAY_BOTH); CRadar::ChangeBlipScale(handle, 3); - ScriptParams[0] = handle; + SET_INTEGER_PARAM(0, handle); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_BLIP_FOR_COORD: { CollectParameters(&m_nIp, 3); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); int handle = CRadar::SetCoordBlip(BLIP_COORD, pos, 5, BLIP_DISPLAY_BOTH); CRadar::ChangeBlipScale(handle, 3); - ScriptParams[0] = handle; + SET_INTEGER_PARAM(0, handle); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_CHANGE_BLIP_DISPLAY: CollectParameters(&m_nIp, 2); - CRadar::ChangeBlipDisplay(ScriptParams[0], (eBlipDisplay)ScriptParams[1]); + CRadar::ChangeBlipDisplay(GET_INTEGER_PARAM(0), (eBlipDisplay)GET_INTEGER_PARAM(1)); return 0; case COMMAND_ADD_ONE_OFF_SOUND: { CollectParameters(&m_nIp, 4); - switch (ScriptParams[3]) { + switch (GET_INTEGER_PARAM(3)) { case SCRIPT_SOUND_PART_MISSION_COMPLETE: DMAudio.PlayFrontEndSound(SOUND_PART_MISSION_COMPLETE, 0); return 0; @@ -712,14 +746,20 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case SCRIPT_SOUND_IMRAN_ARM_BOMB: DMAudio.PlayFrontEndSound(SOUND_AMMUNATION_IMRAN_ARM_BOMB, 0); return 0; + case 0x46: // TODO + DMAudio.PlayFrontEndSound(0xC4, 0); + return 0; + case 0x47: // TODO + DMAudio.PlayFrontEndSound(0xCD, 0); + return 0; default: break; } - if (!DMAudio.IsAudioInitialised()) + if (!DMAudio.IsAudioInitialised()) // LCS doesn't have it. Why? return 0; cAudioScriptObject* obj = new cAudioScriptObject(); - obj->Posn = *(CVector*)&ScriptParams[0]; - obj->AudioId = ScriptParams[3]; + obj->Posn = GET_VECTOR_PARAM(0); + obj->AudioId = GET_INTEGER_PARAM(3); obj->AudioEntity = AEHANDLE_NONE; DMAudio.CreateOneShotScriptObject(obj); return 0; @@ -727,23 +767,23 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_ADD_CONTINUOUS_SOUND: { CollectParameters(&m_nIp, 4); - if (DMAudio.IsAudioInitialised()) { + if (DMAudio.IsAudioInitialised()) { // LCS doesn't have it. Why? cAudioScriptObject* obj = new cAudioScriptObject(); - obj->Posn = *(CVector*)&ScriptParams[0]; - obj->AudioId = ScriptParams[3]; + obj->Posn = GET_VECTOR_PARAM(0); + obj->AudioId = GET_INTEGER_PARAM(3); obj->AudioEntity = DMAudio.CreateLoopingScriptObject(obj); - ScriptParams[0] = CPools::GetAudioScriptObjectPool()->GetIndex(obj); + SET_INTEGER_PARAM(0, CPools::GetAudioScriptObjectPool()->GetIndex(obj)); } else - ScriptParams[0] = -1; + SET_INTEGER_PARAM(0, -1); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_REMOVE_SOUND: { CollectParameters(&m_nIp, 1); - cAudioScriptObject* obj = CPools::GetAudioScriptObjectPool()->GetAt(ScriptParams[0]); - if (!obj){ + cAudioScriptObject* obj = CPools::GetAudioScriptObjectPool()->GetAt(GET_INTEGER_PARAM(0)); + if (!obj) { debug("REMOVE_SOUND - Sound doesn't exist\n"); return 0; } @@ -754,9 +794,9 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) case COMMAND_IS_CAR_STUCK_ON_ROOF: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - UpdateCompareFlag(CTheScripts::UpsideDownCars.HasCarBeenUpsideDownForAWhile(ScriptParams[0])); + UpdateCompareFlag(CTheScripts::UpsideDownCars.HasCarBeenUpsideDownForAWhile(GET_INTEGER_PARAM(0))); return 0; } default: @@ -771,22 +811,22 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_ADD_UPSIDEDOWN_CAR_CHECK: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - CTheScripts::UpsideDownCars.AddCarToCheck(ScriptParams[0]); + CTheScripts::UpsideDownCars.AddCarToCheck(GET_INTEGER_PARAM(0)); return 0; } case COMMAND_REMOVE_UPSIDEDOWN_CAR_CHECK: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - CTheScripts::UpsideDownCars.RemoveCarFromCheck(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + CTheScripts::UpsideDownCars.RemoveCarFromCheck(GET_INTEGER_PARAM(0)); return 0; } case COMMAND_SET_CHAR_OBJ_WAIT_ON_FOOT: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_WAIT_ON_FOOT); @@ -795,7 +835,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_FLEE_ON_FOOT_TILL_SAFE: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE); @@ -804,32 +844,31 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_GUARD_SPOT: { CollectParameters(&m_nIp, 4); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_GUARD_SPOT, pos); return 0; } - /* case COMMAND_SET_CHAR_OBJ_GUARD_AREA: { CollectParameters(&m_nIp, 5); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - float infX = *(float*)&ScriptParams[1]; - float infY = *(float*)&ScriptParams[2]; - float supX = *(float*)&ScriptParams[3]; - float supY = *(float*)&ScriptParams[4]; - if (infX > supX){ - infX = *(float*)&ScriptParams[3]; - supX = *(float*)&ScriptParams[1]; + float infX = GET_FLOAT_PARAM(1); + float infY = GET_FLOAT_PARAM(2); + float supX = GET_FLOAT_PARAM(3); + float supY = GET_FLOAT_PARAM(4); + if (infX > supX) { + infX = GET_FLOAT_PARAM(3); + supX = GET_FLOAT_PARAM(1); } if (infY > supY) { - infY = *(float*)&ScriptParams[4]; - supY = *(float*)&ScriptParams[2]; + infY = GET_FLOAT_PARAM(4); + supY = GET_FLOAT_PARAM(2); } CVector pos; pos.x = (infX + supX) / 2; @@ -843,13 +882,12 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_WAIT_IN_CAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_WAIT_IN_CAR); return 0; } - */ case COMMAND_IS_PLAYER_IN_AREA_ON_FOOT_2D: case COMMAND_IS_PLAYER_IN_AREA_IN_CAR_2D: case COMMAND_IS_PLAYER_STOPPED_IN_AREA_2D: @@ -887,17 +925,17 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_GIVE_WEAPON_TO_PLAYER: { CollectParameters(&m_nIp, 3); - CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); - pPed->m_nSelectedWepSlot = pPed->GiveWeapon((eWeaponType)ScriptParams[1], ScriptParams[2]); + pPed->m_nSelectedWepSlot = pPed->GiveWeapon((eWeaponType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); return 0; } case COMMAND_GIVE_WEAPON_TO_CHAR: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - pPed->SetCurrentWeapon(pPed->GiveWeapon((eWeaponType)ScriptParams[1], ScriptParams[2])); + pPed->SetCurrentWeapon(pPed->GiveWeapon((eWeaponType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2))); if (pPed->bInVehicle && pPed->m_pMyVehicle) pPed->RemoveWeaponModel(CWeaponInfo::GetWeaponInfo(pPed->m_weapons[pPed->m_currentWeapon].m_eWeaponType)->m_nModelId); return 0; @@ -906,23 +944,35 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_PLAYER_CONTROL: { CollectParameters(&m_nIp, 2); - CPlayerInfo* pPlayer = &CWorld::Players[ScriptParams[0]]; - if (ScriptParams[1]){ + CPlayerInfo* pPlayer = &CWorld::Players[GET_INTEGER_PARAM(0)]; + if (FindPlayerPed()) { + if (FindPlayerPed()->GetPedState() != PED_JUMP) { + FindPlayerPed()->bIsLanding = false; + FindPlayerPed()->bIsInTheAir = false; + } + FindPlayerPed()->RestoreHeadingRate(); + } + if (GET_INTEGER_PARAM(1)) { pPlayer->MakePlayerSafe(false); - if (strcmp(m_abScriptName, "serg1") == 0) // Four Iron - pPlayer->m_pPed->ClearFollowPath(); - }else{ + if (FindPlayerPed()->GetStatus() != PED_DRIVING && !FindPlayerPed()->m_attachedTo) { + // FindPlayerPed()->SetIdleAndResetAnim(); // TODO! + } + } + else { pPlayer->MakePlayerSafe(true); + if (FindPlayerPed()->GetPedState() > PED_STATES_NO_AI && FindPlayerPed()->GetPedState() != PED_DRIVING && TheCamera.GetScreenFadeStatus() == FADE_2) { + // FindPlayerPed()->SetIdleAndResetAnim(); // TODO! + } } return 0; } case COMMAND_FORCE_WEATHER: CollectParameters(&m_nIp, 1); - CWeather::ForceWeather(ScriptParams[0]); + CWeather::ForceWeather(GET_INTEGER_PARAM(0)); return 0; case COMMAND_FORCE_WEATHER_NOW: CollectParameters(&m_nIp, 1); - CWeather::ForceWeatherNow(ScriptParams[0]); + CWeather::ForceWeatherNow(GET_INTEGER_PARAM(0)); return 0; case COMMAND_RELEASE_WEATHER: CWeather::ReleaseWeather(); @@ -930,9 +980,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CURRENT_PLAYER_WEAPON: { CollectParameters(&m_nIp, 2); - CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; - for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++){ - if (pPed->m_weapons[i].m_eWeaponType == ScriptParams[1]) + CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++) { + if (pPed->m_weapons[i].m_eWeaponType == GET_INTEGER_PARAM(1)) pPed->m_nSelectedWepSlot = i; } return 0; @@ -940,9 +990,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CURRENT_CHAR_WEAPON: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); for (int i = 0; i < TOTAL_WEAPON_SLOTS; i++) { - if (pPed->m_weapons[i].m_eWeaponType == ScriptParams[1]) + if (pPed->m_weapons[i].m_eWeaponType == GET_INTEGER_PARAM(1)) pPed->SetCurrentWeapon(i); } return 0; @@ -951,18 +1001,18 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_GET_OBJECT_COORDINATES: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pObject); - *(CVector*)&ScriptParams[0] = pObject->GetPosition(); + SET_VECTOR_PARAM(0, pObject->GetPosition()); StoreParameters(&m_nIp, 3); return 0; } case COMMAND_SET_OBJECT_COORDINATES: { CollectParameters(&m_nIp, 4); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pObject); - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pObject->Teleport(pos); @@ -970,13 +1020,13 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) return 0; } case COMMAND_GET_GAME_TIMER: - ScriptParams[0] = CTimer::GetTimeInMilliseconds(); + SET_INTEGER_PARAM(0, CTimer::GetTimeInMilliseconds()); StoreParameters(&m_nIp, 1); return 0; case COMMAND_TURN_CHAR_TO_FACE_COORD: { CollectParameters(&m_nIp, 4); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); CVehicle* pVehicle; CVector pos; @@ -988,11 +1038,11 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) pos = pVehicle->GetPosition(); else pos = pPed->GetPosition(); - float heading = CGeneral::GetATanOfXY(pos.x - *(float*)&ScriptParams[1], pos.y - *(float*)&ScriptParams[2]); + float heading = CGeneral::GetATanOfXY(pos.x - GET_FLOAT_PARAM(1), pos.y - GET_FLOAT_PARAM(2)); heading += HALFPI; if (heading > TWOPI) heading -= TWOPI; - if (!pVehicle){ + if (!pVehicle) { pPed->m_fRotationCur = heading; pPed->m_fRotationDest = heading; pPed->SetHeading(heading); @@ -1002,7 +1052,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_TURN_PLAYER_TO_FACE_COORD: { CollectParameters(&m_nIp, 4); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); CVehicle* pVehicle; CVector pos; @@ -1014,7 +1064,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) pos = pVehicle->GetPosition(); else pos = pPed->GetPosition(); - float heading = CGeneral::GetATanOfXY(pos.x - *(float*)&ScriptParams[1], pos.y - *(float*)&ScriptParams[2]); + float heading = CGeneral::GetATanOfXY(pos.x - GET_FLOAT_PARAM(1), pos.y - GET_FLOAT_PARAM(2)); heading += HALFPI; if (heading > TWOPI) heading -= TWOPI; @@ -1028,16 +1078,16 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_STORE_WANTED_LEVEL: { CollectParameters(&m_nIp, 1); - CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); - ScriptParams[0] = pPed->m_pWanted->m_nWantedLevel; + SET_INTEGER_PARAM(0, pPed->m_pWanted->m_nWantedLevel); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_IS_CAR_STOPPED: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); UpdateCompareFlag(CTheScripts::IsVehicleStopped(pVehicle)); return 0; @@ -1045,94 +1095,94 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_MARK_CHAR_AS_NO_LONGER_NEEDED: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); CTheScripts::CleanUpThisPed(pPed); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR); + CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); return 0; } case COMMAND_MARK_CAR_AS_NO_LONGER_NEEDED: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); CTheScripts::CleanUpThisVehicle(pVehicle); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR); + CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CAR); return 0; } case COMMAND_MARK_OBJECT_AS_NO_LONGER_NEEDED: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); CTheScripts::CleanUpThisObject(pObject); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT); + CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_OBJECT); return 0; } case COMMAND_DONT_REMOVE_CHAR: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CHAR); + CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); return 0; } case COMMAND_DONT_REMOVE_CAR: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_CAR); + CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_CAR); return 0; } case COMMAND_DONT_REMOVE_OBJECT: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pObject); - CTheScripts::MissionCleanUp.RemoveEntityFromList(ScriptParams[0], CLEANUP_OBJECT); + CTheScripts::MissionCleanUp.RemoveEntityFromList(GET_INTEGER_PARAM(0), CLEANUP_OBJECT); return 0; } case COMMAND_CREATE_CHAR_AS_PASSENGER: { CollectParameters(&m_nIp, 4); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - switch (ScriptParams[2]) { + switch (GET_INTEGER_PARAM(2)) { case MI_COP: - if (ScriptParams[1] == PEDTYPE_COP) - ScriptParams[2] = COP_STREET; + if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) + SET_INTEGER_PARAM(2, COP_STREET); break; case MI_SWAT: - if (ScriptParams[1] == PEDTYPE_COP) - ScriptParams[2] = COP_SWAT; + if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) + SET_INTEGER_PARAM(2, COP_SWAT); break; case MI_FBI: - if (ScriptParams[1] == PEDTYPE_COP) - ScriptParams[2] = COP_FBI; + if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) + SET_INTEGER_PARAM(2, COP_FBI); break; case MI_ARMY: - if (ScriptParams[1] == PEDTYPE_COP) - ScriptParams[2] = COP_ARMY; + if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) + SET_INTEGER_PARAM(2, COP_ARMY); break; case MI_MEDIC: - if (ScriptParams[1] == PEDTYPE_EMERGENCY) - ScriptParams[2] = PEDTYPE_EMERGENCY; + if (GET_INTEGER_PARAM(1) == PEDTYPE_EMERGENCY) + SET_INTEGER_PARAM(2, PEDTYPE_EMERGENCY); break; case MI_FIREMAN: - if (ScriptParams[1] == PEDTYPE_FIREMAN) - ScriptParams[2] = PEDTYPE_FIREMAN; + if (GET_INTEGER_PARAM(1) == PEDTYPE_FIREMAN) + SET_INTEGER_PARAM(2, PEDTYPE_FIREMAN); break; default: break; } CPed* pPed; - if (ScriptParams[1] == PEDTYPE_COP) - pPed = new CCopPed((eCopType)ScriptParams[2]); - else if (ScriptParams[1] == PEDTYPE_EMERGENCY || ScriptParams[1] == PEDTYPE_FIREMAN) - pPed = new CEmergencyPed(ScriptParams[2]); + if (GET_INTEGER_PARAM(1) == PEDTYPE_COP) + pPed = new CCopPed((eCopType)GET_INTEGER_PARAM(2)); + else if (GET_INTEGER_PARAM(1) == PEDTYPE_EMERGENCY || GET_INTEGER_PARAM(1) == PEDTYPE_FIREMAN) + pPed = new CEmergencyPed(GET_INTEGER_PARAM(2)); else - pPed = new CCivilianPed((ePedType)ScriptParams[1], ScriptParams[2]); + pPed = new CCivilianPed((ePedType)GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); pPed->CharCreatedBy = MISSION_CHAR; pPed->bRespondsToThreats = false; pPed->bAllowMedicsToReviveMe = false; @@ -1143,8 +1193,8 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) pPed->SetOrientation(0.0f, 0.0f, 0.0f); CPopulation::ms_nTotalMissionPeds++; CWorld::Add(pPed); - if (ScriptParams[3] >= 0) - pVehicle->AddPassenger(pPed, ScriptParams[3]); + if (GET_INTEGER_PARAM(3) >= 0) + pVehicle->AddPassenger(pPed, GET_INTEGER_PARAM(3)); else pVehicle->AddPassenger(pPed); pPed->m_pMyVehicle = pVehicle; @@ -1154,18 +1204,18 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) pPed->bUsesCollision = false; pPed->AddInCarAnims(pVehicle, false); pPed->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pPed->GetPosition()); - ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed); + SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex(pPed)); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_CHAR); + CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_CHAR); return 0; } case COMMAND_SET_CHAR_OBJ_KILL_CHAR_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, pTarget); return 0; @@ -1173,9 +1223,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_KILL_PLAYER_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CPed* pTarget = CWorld::Players[ScriptParams[1]].m_pPed; + CPed* pTarget = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, pTarget); return 0; @@ -1183,9 +1233,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_KILL_CHAR_ANY_MEANS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_KILL_CHAR_ANY_MEANS, pTarget); return 0; @@ -1193,9 +1243,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_KILL_PLAYER_ANY_MEANS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CPed* pTarget = CWorld::Players[ScriptParams[1]].m_pPed; + CPed* pTarget = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_KILL_CHAR_ANY_MEANS, pTarget); return 0; @@ -1204,9 +1254,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_FLEE_CHAR_ON_FOOT_TILL_SAFE: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, pTarget); return 0; @@ -1215,9 +1265,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_FLEE_PLAYER_ON_FOOT_TILL_SAFE: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CPed* pTarget = CWorld::Players[ScriptParams[1]].m_pPed; + CPed* pTarget = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, pTarget); return 0; @@ -1225,9 +1275,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_FLEE_CHAR_ON_FOOT_ALWAYS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_ALWAYS, pTarget); return 0; @@ -1235,9 +1285,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_FLEE_PLAYER_ON_FOOT_ALWAYS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CPed* pTarget = CWorld::Players[ScriptParams[1]].m_pPed; + CPed* pTarget = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_ALWAYS, pTarget); return 0; @@ -1245,9 +1295,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_GOTO_CHAR_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_GOTO_CHAR_ON_FOOT, pTarget); return 0; @@ -1255,9 +1305,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_GOTO_PLAYER_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CPed* pTarget = CWorld::Players[ScriptParams[1]].m_pPed; + CPed* pTarget = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_GOTO_CHAR_ON_FOOT, pTarget); return 0; @@ -1265,9 +1315,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_LEAVE_CAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_LEAVE_CAR, pVehicle); return 0; @@ -1275,9 +1325,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_ENTER_CAR_AS_PASSENGER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_ENTER_CAR_AS_PASSENGER, pVehicle); return 0; @@ -1285,9 +1335,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_ENTER_CAR_AS_DRIVER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_ENTER_CAR_AS_DRIVER, pVehicle); return 0; @@ -1297,9 +1347,9 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_DESTROY_OBJECT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_DESTROY_OBJECT, pVehicle); return 0; @@ -1307,30 +1357,29 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_DESTROY_CAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_DESTROY_CAR, pVehicle); return 0; } - /* case COMMAND_SET_CHAR_OBJ_GOTO_AREA_ON_FOOT: { CollectParameters(&m_nIp, 5); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - float infX = *(float*)&ScriptParams[1]; - float infY = *(float*)&ScriptParams[2]; - float supX = *(float*)&ScriptParams[3]; - float supY = *(float*)&ScriptParams[4]; + float infX = GET_FLOAT_PARAM(1); + float infY = GET_FLOAT_PARAM(2); + float supX = GET_FLOAT_PARAM(3); + float supY = GET_FLOAT_PARAM(4); if (infX > supX) { - infX = *(float*)&ScriptParams[3]; - supX = *(float*)&ScriptParams[1]; + infX = GET_FLOAT_PARAM(3); + supX = GET_FLOAT_PARAM(1); } if (infY > supY) { - infY = *(float*)&ScriptParams[4]; - supY = *(float*)&ScriptParams[2]; + infY = GET_FLOAT_PARAM(4); + supY = GET_FLOAT_PARAM(2); } CVector pos; pos.x = (infX + supX) / 2; @@ -1341,32 +1390,31 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) pPed->SetObjective(OBJECTIVE_GOTO_AREA_ON_FOOT, pos, radius); return 0; } - */ //case COMMAND_SET_CHAR_OBJ_GOTO_AREA_IN_CAR: //case COMMAND_SET_CHAR_OBJ_FOLLOW_CAR_ON_FOOT_WITH_OFFSET: //case COMMAND_SET_CHAR_OBJ_GUARD_ATTACK: case COMMAND_SET_CHAR_AS_LEADER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CPed* pTarget = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CPed* pTarget = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); pPed->SetObjective(OBJECTIVE_SET_LEADER, pTarget); return 0; } case COMMAND_SET_PLAYER_AS_LEADER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CPed* pTarget = CWorld::Players[ScriptParams[1]].m_pPed; + CPed* pTarget = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; pPed->SetObjective(OBJECTIVE_SET_LEADER, pTarget); return 0; } case COMMAND_LEAVE_GROUP: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); pPed->ClearLeader(); return 0; @@ -1374,60 +1422,66 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SET_CHAR_OBJ_FOLLOW_ROUTE: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); pPed->bScriptObjectiveCompleted = false; - pPed->SetObjective(OBJECTIVE_FOLLOW_ROUTE, ScriptParams[1], ScriptParams[2]); + pPed->SetObjective(OBJECTIVE_FOLLOW_ROUTE, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); return 0; } case COMMAND_ADD_ROUTE_POINT: { CollectParameters(&m_nIp, 4); - CRouteNode::AddRoutePoint(ScriptParams[0], *(CVector*)&ScriptParams[1]); + CRouteNode::AddRoutePoint(GET_INTEGER_PARAM(0), GET_VECTOR_PARAM(1)); return 0; } case COMMAND_PRINT_WITH_NUMBER_BIG: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 3); - CMessages::AddBigMessageWithNumber(text, ScriptParams[1], ScriptParams[2] - 1, ScriptParams[0], -1, -1, -1, -1, -1); + CMessages::AddBigMessageWithNumber(text, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2) - 1, GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1); return 0; } case COMMAND_PRINT_WITH_NUMBER: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 3); - CMessages::AddMessageWithNumber(text, ScriptParams[1], ScriptParams[2], ScriptParams[0], -1, -1, -1, -1, -1); + CMessages::AddMessageWithNumber(text, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1); return 0; } case COMMAND_PRINT_WITH_NUMBER_NOW: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 3); - CMessages::AddMessageJumpQWithNumber(text, ScriptParams[1], ScriptParams[2], ScriptParams[0], -1, -1, -1, -1, -1); + CMessages::AddMessageJumpQWithNumber(text, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1); + return 0; + } + case COMMAND_PRINT_WITH_NUMBER_SOON: + { + wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); + CollectParameters(&m_nIp, 3); + CMessages::AddMessageSoonWithNumber(text, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1); return 0; } - //case COMMAND_PRINT_WITH_NUMBER_SOON: case COMMAND_SWITCH_ROADS_ON: { CollectParameters(&m_nIp, 6); - float infX = *(float*)&ScriptParams[0]; - float infY = *(float*)&ScriptParams[1]; - float infZ = *(float*)&ScriptParams[2]; - float supX = *(float*)&ScriptParams[3]; - float supY = *(float*)&ScriptParams[4]; - float supZ = *(float*)&ScriptParams[5]; - if (infX > supX){ - infX = *(float*)&ScriptParams[3]; - supX = *(float*)&ScriptParams[0]; + float infX = GET_FLOAT_PARAM(0); + float infY = GET_FLOAT_PARAM(1); + float infZ = GET_FLOAT_PARAM(2); + float supX = GET_FLOAT_PARAM(3); + float supY = GET_FLOAT_PARAM(4); + float supZ = GET_FLOAT_PARAM(5); + if (infX > supX) { + infX = GET_FLOAT_PARAM(3); + supX = GET_FLOAT_PARAM(0); } - if (infY > supY){ - infY = *(float*)&ScriptParams[4]; - supY = *(float*)&ScriptParams[1]; + if (infY > supY) { + infY = GET_FLOAT_PARAM(4); + supY = GET_FLOAT_PARAM(1); } - if (infZ > supZ){ - infZ = *(float*)&ScriptParams[5]; - supZ = *(float*)&ScriptParams[2]; + if (infZ > supZ) { + infZ = GET_FLOAT_PARAM(5); + supZ = GET_FLOAT_PARAM(2); } ThePaths.SwitchRoadsOffInArea(infX, supX, infY, supY, infZ, supZ, false); return 0; @@ -1435,23 +1489,23 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_SWITCH_ROADS_OFF: { CollectParameters(&m_nIp, 6); - float infX = *(float*)&ScriptParams[0]; - float infY = *(float*)&ScriptParams[1]; - float infZ = *(float*)&ScriptParams[2]; - float supX = *(float*)&ScriptParams[3]; - float supY = *(float*)&ScriptParams[4]; - float supZ = *(float*)&ScriptParams[5]; + float infX = GET_FLOAT_PARAM(0); + float infY = GET_FLOAT_PARAM(1); + float infZ = GET_FLOAT_PARAM(2); + float supX = GET_FLOAT_PARAM(3); + float supY = GET_FLOAT_PARAM(4); + float supZ = GET_FLOAT_PARAM(5); if (infX > supX) { - infX = *(float*)&ScriptParams[3]; - supX = *(float*)&ScriptParams[0]; + infX = GET_FLOAT_PARAM(3); + supX = GET_FLOAT_PARAM(0); } if (infY > supY) { - infY = *(float*)&ScriptParams[4]; - supY = *(float*)&ScriptParams[1]; + infY = GET_FLOAT_PARAM(4); + supY = GET_FLOAT_PARAM(1); } if (infZ > supZ) { - infZ = *(float*)&ScriptParams[5]; - supZ = *(float*)&ScriptParams[2]; + infZ = GET_FLOAT_PARAM(5); + supZ = GET_FLOAT_PARAM(2); } ThePaths.SwitchRoadsOffInArea(infX, supX, infY, supY, infZ, supZ, true); return 0; @@ -1459,85 +1513,83 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_GET_NUMBER_OF_PASSENGERS: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - ScriptParams[0] = pVehicle->m_nNumPassengers; + SET_INTEGER_PARAM(0, pVehicle->m_nNumPassengers); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_GET_MAXIMUM_NUMBER_OF_PASSENGERS: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - ScriptParams[0] = pVehicle->m_nNumMaxPassengers; + SET_INTEGER_PARAM(0, pVehicle->m_nNumMaxPassengers); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_CAR_DENSITY_MULTIPLIER: { CollectParameters(&m_nIp, 1); - CCarCtrl::CarDensityMultiplier = *(float*)&ScriptParams[0]; + CCarCtrl::CarDensityMultiplier = GET_FLOAT_PARAM(0); return 0; } case COMMAND_SET_CAR_HEAVY: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - if (ScriptParams[1] != 0) { + if (GET_INTEGER_PARAM(1) != 0) { pVehicle->bIsHeavy = true; - pVehicle->m_fMass = 3.0f * pVehicle->pHandling->fMass; - pVehicle->m_fTurnMass = 5.0f * pVehicle->pHandling->fTurnMass; + pVehicle->m_fMass = 3.0f * pVehicle->pHandling->fMass; // TODO: tHandlingData::GetMass() + pVehicle->m_fTurnMass = 5.0f * pVehicle->pHandling->fTurnMass; // TODO: tHandlingData::GetTurnMass() } else { pVehicle->bIsHeavy = false; - pVehicle->m_fMass = pVehicle->pHandling->fMass; - pVehicle->m_fTurnMass = pVehicle->pHandling->fTurnMass; + pVehicle->m_fMass = pVehicle->pHandling->fMass; // TODO: tHandlingData::GetMass() + pVehicle->m_fTurnMass = pVehicle->pHandling->fTurnMass; // TODO: tHandlingData::GetTurnMass() } return 0; } case COMMAND_CLEAR_CHAR_THREAT_SEARCH: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); pPed->m_fearFlags = 0; return 0; } - /* case COMMAND_ACTIVATE_CRANE: { CollectParameters(&m_nIp, 10); - float infX = *(float*)&ScriptParams[2]; - float infY = *(float*)&ScriptParams[3]; - float supX = *(float*)&ScriptParams[4]; - float supY = *(float*)&ScriptParams[5]; + float infX = GET_FLOAT_PARAM(2); + float infY = GET_FLOAT_PARAM(3); + float supX = GET_FLOAT_PARAM(4); + float supY = GET_FLOAT_PARAM(5); if (infX > supX) { - infX = *(float*)&ScriptParams[4]; - supX = *(float*)&ScriptParams[2]; + infX = GET_FLOAT_PARAM(4); + supX = GET_FLOAT_PARAM(2); } if (infY > supY) { - infY = *(float*)&ScriptParams[5]; - supY = *(float*)&ScriptParams[3]; + infY = GET_FLOAT_PARAM(5); + supY = GET_FLOAT_PARAM(3); } CCranes::ActivateCrane(infX, supX, infY, supY, - *(float*)&ScriptParams[6], *(float*)&ScriptParams[7], *(float*)&ScriptParams[8], - DEGTORAD(*(float*)&ScriptParams[9]), false, false, - *(float*)&ScriptParams[0], *(float*)&ScriptParams[1]); + GET_FLOAT_PARAM(6), GET_FLOAT_PARAM(7), GET_FLOAT_PARAM(8), + DEGTORAD(GET_FLOAT_PARAM(9)), false, false, + GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1)); return 0; } case COMMAND_DEACTIVATE_CRANE: { CollectParameters(&m_nIp, 2); - CCranes::DeActivateCrane(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1]); + CCranes::DeActivateCrane(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1)); return 0; } - */ case COMMAND_SET_MAX_WANTED_LEVEL: { CollectParameters(&m_nIp, 1); - CWanted::SetMaximumWantedLevel(ScriptParams[0]); + CWanted::SetMaximumWantedLevel(GET_INTEGER_PARAM(0)); return 0; } //case COMMAND_SAVE_VAR_INT: @@ -1545,7 +1597,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) case COMMAND_IS_CAR_IN_AIR_PROPER: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); UpdateCompareFlag(pVehicle->m_nCollisionRecords == 0); return 0; diff --git a/src/control/Script5.cpp b/src/control/Script5.cpp index b49e1c79..eb1530c4 100644 --- a/src/control/Script5.cpp +++ b/src/control/Script5.cpp @@ -2556,7 +2556,7 @@ void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective ob } else { pPed->bScriptObjectiveCompleted = false; - //pPed->SetObjective(objective, p1, p2); TODO! + pPed->SetObjective(objective, p1, p2); } } } diff --git a/src/core/config.h b/src/core/config.h index b93ccc82..facbaacd 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -334,7 +334,7 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually #endif //#define SIMPLIER_MISSIONS // apply simplifications from mobile #define USE_ADVANCED_SCRIPT_DEBUG_OUTPUT -#define SCRIPT_LOG_FILE_LEVEL 0 // 0 == no log, 1 == overwrite every frame, 2 == full log +#define SCRIPT_LOG_FILE_LEVEL 2 // 0 == no log, 1 == overwrite every frame, 2 == full log #ifndef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT #define USE_BASIC_SCRIPT_DEBUG_OUTPUT diff --git a/src/peds/Ped.h b/src/peds/Ped.h index a126fed6..aa9f4f80 100644 --- a/src/peds/Ped.h +++ b/src/peds/Ped.h @@ -744,6 +744,7 @@ public: void SetObjective(eObjective); void SetObjective(eObjective, int16, int16); void SetObjective(eObjective, CVector); + void SetObjective(eObjective, CVector, float); void SetObjective(eObjective, float, const CVector&); void ClearChat(void); void InformMyGangOfAttack(CEntity*); diff --git a/src/peds/PedAI.cpp b/src/peds/PedAI.cpp index de82524d..244c7b84 100644 --- a/src/peds/PedAI.cpp +++ b/src/peds/PedAI.cpp @@ -370,6 +370,51 @@ CPed::SetObjective(eObjective newObj, void *entity) } } +void +CPed::SetObjective(eObjective newObj, CVector dest, float safeDist) +{ + if (DyingOrDead()) + return; + + if (m_prevObjective != OBJECTIVE_NONE && m_prevObjective == newObj) + return; + + if (m_objective == newObj) { + if (newObj == OBJECTIVE_GOTO_AREA_ANY_MEANS || newObj == OBJECTIVE_GOTO_AREA_ON_FOOT || newObj == OBJECTIVE_RUN_TO_AREA || newObj == OBJECTIVE_SPRINT_TO_AREA) { + if (m_nextRoutePointPos == dest && m_distanceToCountSeekDone == safeDist) + return; + } + else if (newObj == OBJECTIVE_GUARD_SPOT) { + if (m_vecSpotToGuard == dest && m_radiusToGuard == safeDist) + return; + } + } + + ClearPointGunAt(); + SetObjectiveTimer(0); + bObjectiveCompleted = false; + if (IsTemporaryObjective(m_objective)) { + m_prevObjective = newObj; + } + else { + if (m_objective != newObj) + SetStoredObjective(); + + m_objective = newObj; + } + + if (newObj == OBJECTIVE_GUARD_SPOT) { + m_vecSpotToGuard = dest; + m_radiusToGuard = safeDist; + } + else if (newObj == OBJECTIVE_GOTO_AREA_ANY_MEANS || newObj == OBJECTIVE_GOTO_AREA_ON_FOOT || newObj == OBJECTIVE_RUN_TO_AREA || newObj == OBJECTIVE_SPRINT_TO_AREA) { + m_pNextPathNode = nil; + m_nextRoutePointPos = dest; + m_vecSeekPos = m_nextRoutePointPos; + bUsePedNodeSeek = true; + } +} + // --MIAMI: Done // Only used in 01E1: SET_CHAR_OBJ_FOLLOW_ROUTE opcode // IDA fails very badly in here, puts a fake loop and ignores SetFollowRoute call... From cf11b3284974336d86a33c39e51ac950cf0499ba Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Mon, 11 Jan 2021 02:43:57 +0300 Subject: [PATCH 45/68] of course --- src/core/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/config.h b/src/core/config.h index facbaacd..b93ccc82 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -334,7 +334,7 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually #endif //#define SIMPLIER_MISSIONS // apply simplifications from mobile #define USE_ADVANCED_SCRIPT_DEBUG_OUTPUT -#define SCRIPT_LOG_FILE_LEVEL 2 // 0 == no log, 1 == overwrite every frame, 2 == full log +#define SCRIPT_LOG_FILE_LEVEL 0 // 0 == no log, 1 == overwrite every frame, 2 == full log #ifndef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT #define USE_BASIC_SCRIPT_DEBUG_OUTPUT From 625376f0d3df0afc6ec61359175ba64ca904cfa0 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Mon, 11 Jan 2021 17:14:56 +0300 Subject: [PATCH 46/68] 500-599 --- src/control/Script.cpp | 8 +- src/control/Script2.cpp | 50 +- src/control/Script3.cpp | 1023 ++++++++++++++++++++------------------- src/core/Streaming.h | 2 + src/peds/Ped.h | 8 +- src/render/Weather.cpp | 24 + src/render/Weather.h | 8 + 7 files changed, 586 insertions(+), 537 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 0a77d0bc..eeb4140f 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -292,12 +292,12 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_SET_LVAR_INT_TO_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " ="), REGISTER_COMMAND(COMMAND_CSET_VAR_INT_TO_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), REGISTER_COMMAND(COMMAND_CSET_VAR_FLOAT_TO_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), - REGISTER_COMMAND(COMMAND_CSET_LVAR_INT_TO_LVAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), - REGISTER_COMMAND(COMMAND_CSET_LVAR_FLOAT_TO_LVAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), + REGISTER_COMMAND(COMMAND_CSET_LVAR_INT_TO_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, 0, " =#"), + REGISTER_COMMAND(COMMAND_CSET_LVAR_FLOAT_TO_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, 0, " =#"), REGISTER_COMMAND(COMMAND_CSET_VAR_INT_TO_LVAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), REGISTER_COMMAND(COMMAND_CSET_VAR_FLOAT_TO_LVAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), - REGISTER_COMMAND(COMMAND_CSET_LVAR_INT_TO_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), - REGISTER_COMMAND(COMMAND_CSET_LVAR_FLOAT_TO_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), + REGISTER_COMMAND(COMMAND_CSET_LVAR_INT_TO_LVAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, 0, " =#"), + REGISTER_COMMAND(COMMAND_CSET_LVAR_FLOAT_TO_LVAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, 0, " =#"), REGISTER_COMMAND(COMMAND_ABS_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), REGISTER_COMMAND(COMMAND_ABS_LVAR_INT, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), REGISTER_COMMAND(COMMAND_ABS_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), diff --git a/src/control/Script2.cpp b/src/control/Script2.cpp index 6a31b65b..5cac2bfd 100644 --- a/src/control/Script2.cpp +++ b/src/control/Script2.cpp @@ -33,35 +33,35 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) { switch (command) { - //case COMMAND_SET_CHAR_INVINCIBLE: - //case COMMAND_SET_PLAYER_INVINCIBLE: - //case COMMAND_SET_CHAR_GRAPHIC_TYPE: - //case COMMAND_SET_PLAYER_GRAPHIC_TYPE: + //case COMMAND_SET_CHAR_INVINCIBLE: + //case COMMAND_SET_PLAYER_INVINCIBLE: + //case COMMAND_SET_CHAR_GRAPHIC_TYPE: + //case COMMAND_SET_PLAYER_GRAPHIC_TYPE: case COMMAND_HAS_PLAYER_BEEN_ARRESTED: CollectParameters(&m_nIp, 1); UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_WBState == WBSTATE_BUSTED); return 0; - //case COMMAND_STOP_CHAR_DRIVING: - //case COMMAND_KILL_CHAR: - //case COMMAND_SET_FAVOURITE_CAR_MODEL_FOR_CHAR: - //case COMMAND_SET_CHAR_OCCUPATION: - /* - case COMMAND_CHANGE_CAR_LOCK: - { - CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); - script_assert(pVehicle); - pVehicle->m_nDoorLock = (eCarLock)GET_INTEGER_PARAM(1); - return 0; - } - case COMMAND_SHAKE_CAM_WITH_POINT: - CollectParameters(&m_nIp, 4); - TheCamera.CamShake(GET_INTEGER_PARAM(0) / 1000.0f, - GET_FLOAT_PARAM(1), - GET_FLOAT_PARAM(2), - GET_FLOAT_PARAM(3)); - return 0; - */ + //case COMMAND_STOP_CHAR_DRIVING: + //case COMMAND_KILL_CHAR: + //case COMMAND_SET_FAVOURITE_CAR_MODEL_FOR_CHAR: + //case COMMAND_SET_CHAR_OCCUPATION: + /* + case COMMAND_CHANGE_CAR_LOCK: + { + CollectParameters(&m_nIp, 2); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + script_assert(pVehicle); + pVehicle->m_nDoorLock = (eCarLock)GET_INTEGER_PARAM(1); + return 0; + } + case COMMAND_SHAKE_CAM_WITH_POINT: + CollectParameters(&m_nIp, 4); + TheCamera.CamShake(GET_INTEGER_PARAM(0) / 1000.0f, + GET_FLOAT_PARAM(1), + GET_FLOAT_PARAM(2), + GET_FLOAT_PARAM(3)); + return 0; + */ case COMMAND_IS_CAR_MODEL: { CollectParameters(&m_nIp, 2); diff --git a/src/control/Script3.cpp b/src/control/Script3.cpp index c2c7d044..bdb2ca85 100644 --- a/src/control/Script3.cpp +++ b/src/control/Script3.cpp @@ -41,17 +41,17 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_IS_CAR_UPSIDEDOWN: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - UpdateCompareFlag(pVehicle->GetUp().z <= -0.97f); + UpdateCompareFlag(pVehicle->GetUp().z <= UPSIDEDOWN_UP_THRESHOLD); return 0; } case COMMAND_GET_PLAYER_CHAR: { CollectParameters(&m_nIp, 1); - CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); - ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed); + SET_INTEGER_PARAM(0, CPools::GetPedPool()->GetIndex(pPed)); StoreParameters(&m_nIp, 1); return 0; } @@ -61,9 +61,9 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_SET_POLICE_IGNORE_PLAYER: { CollectParameters(&m_nIp, 2); - CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); - if (ScriptParams[1]) { + if (GET_INTEGER_PARAM(1)) { pPed->m_pWanted->m_bIgnoredByCops = true; CWorld::StopAllLawEnforcersInTheirTracks(); } @@ -77,8 +77,8 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 4); - CUserDisplay::Pager.AddMessageWithNumber(text, ScriptParams[0], -1, -1, -1, -1, -1, - ScriptParams[1], ScriptParams[2], ScriptParams[3]); + CUserDisplay::Pager.AddMessageWithNumber(text, GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1, + GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3)); return 0; } */ @@ -86,21 +86,21 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 8); - CDarkel::StartFrenzy((eWeaponType)ScriptParams[0], ScriptParams[1], ScriptParams[2], - ScriptParams[3], text, ScriptParams[4], ScriptParams[5], - ScriptParams[6], ScriptParams[7] != 0, false); + CDarkel::StartFrenzy((eWeaponType)GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), + GET_INTEGER_PARAM(3), text, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), + GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7) != 0, false); return 0; } case COMMAND_READ_KILL_FRENZY_STATUS: { - ScriptParams[0] = CDarkel::ReadStatus(); + SET_INTEGER_PARAM(0, CDarkel::ReadStatus()); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SQRT: { CollectParameters(&m_nIp, 1); - *(float*)&ScriptParams[0] = Sqrt(*(float*)&ScriptParams[0]); + SET_FLOAT_PARAM(0, Sqrt(GET_FLOAT_PARAM(0))); StoreParameters(&m_nIp, 1); return 0; } @@ -122,39 +122,40 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) return 0; case COMMAND_GENERATE_RANDOM_FLOAT_IN_RANGE: CollectParameters(&m_nIp, 2); - *(float*)&ScriptParams[0] = CGeneral::GetRandomNumberInRange(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1]); + SET_FLOAT_PARAM(0, CGeneral::GetRandomNumberInRange(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1))); StoreParameters(&m_nIp, 1); return 0; case COMMAND_GENERATE_RANDOM_INT_IN_RANGE: CollectParameters(&m_nIp, 2); - ScriptParams[0] = CGeneral::GetRandomNumberInRange(ScriptParams[0], ScriptParams[1]); + SET_INTEGER_PARAM(0, CGeneral::GetRandomNumberInRange(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1))); StoreParameters(&m_nIp, 1); return 0; case COMMAND_LOCK_CAR_DOORS: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - pVehicle->m_nDoorLock = (eCarLock)ScriptParams[1]; + pVehicle->m_nDoorLock = (eCarLock)GET_INTEGER_PARAM(1); return 0; } case COMMAND_EXPLODE_CAR: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); + pVehicle->bCanBeDamaged = true; pVehicle->BlowUpCar(nil); return 0; } case COMMAND_ADD_EXPLOSION: CollectParameters(&m_nIp, 4); - CExplosion::AddExplosion(nil, nil, (eExplosionType)ScriptParams[3], *(CVector*)&ScriptParams[0], 0, true); + CExplosion::AddExplosion(nil, nil, (eExplosionType)GET_INTEGER_PARAM(3), GET_VECTOR_PARAM(0), 0, true); // last argument is 0 (default? - TODO) return 0; case COMMAND_IS_CAR_UPRIGHT: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); UpdateCompareFlag(pVehicle->GetUp().z >= 0.0f); return 0; @@ -162,8 +163,8 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_TURN_CHAR_TO_FACE_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pSourcePed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - CPed* pTargetPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CPed* pSourcePed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pTargetPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); CVehicle* pVehicle = pSourcePed->bInVehicle ? pSourcePed->m_pMyVehicle : nil; CVector2D sourcePos = pSourcePed->bInVehicle ? pVehicle->GetPosition() : pSourcePed->GetPosition(); CVector2D targetPos = pTargetPed->bInVehicle ? pTargetPed->m_pMyVehicle->GetPosition() : pTargetPed->GetPosition(); @@ -180,8 +181,8 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_TURN_CHAR_TO_FACE_PLAYER: { CollectParameters(&m_nIp, 2); - CPed* pSourcePed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - CPed* pTargetPed = CWorld::Players[ScriptParams[1]].m_pPed; + CPed* pSourcePed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pTargetPed = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; CVehicle* pVehicle = pSourcePed->bInVehicle ? pSourcePed->m_pMyVehicle : nil; CVector2D sourcePos = pSourcePed->bInVehicle ? pVehicle->GetPosition() : pSourcePed->GetPosition(); CVector2D targetPos = pTargetPed->bInVehicle ? pTargetPed->m_pMyVehicle->GetPosition() : pTargetPed->GetPosition(); @@ -198,8 +199,8 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_TURN_PLAYER_TO_FACE_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pSourcePed = CWorld::Players[ScriptParams[0]].m_pPed; - CPed* pTargetPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CPed* pSourcePed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; + CPed* pTargetPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); CVehicle* pVehicle = pSourcePed->bInVehicle ? pSourcePed->m_pMyVehicle : nil; CVector2D sourcePos = pSourcePed->bInVehicle ? pVehicle->GetPosition() : pSourcePed->GetPosition(); CVector2D targetPos = pTargetPed->bInVehicle ? pTargetPed->m_pMyVehicle->GetPosition() : pTargetPed->GetPosition(); @@ -216,11 +217,11 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_SET_CHAR_OBJ_GOTO_COORD_ON_FOOT: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); CVector target; - target.x = *(float*)&ScriptParams[1]; - target.y = *(float*)&ScriptParams[2]; + target.x = GET_FLOAT_PARAM(1); + target.y = GET_FLOAT_PARAM(2); target.z = CWorld::FindGroundZForCoord(target.x, target.y); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_GOTO_AREA_ON_FOOT, target); @@ -230,63 +231,61 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_CREATE_PICKUP: { CollectParameters(&m_nIp, 5); - int16 model = ScriptParams[0]; + int16 model = GET_INTEGER_PARAM(0); if (model < 0) model = CTheScripts::UsedObjectArray[-model].index; - CVector pos = *(CVector*)&ScriptParams[2]; + CVector pos = GET_VECTOR_PARAM(2); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - ScriptParams[0] = CPickups::GenerateNewOne(pos, model, ScriptParams[1], 0); + SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, model, GET_INTEGER_PARAM(1), 0)); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_HAS_PICKUP_BEEN_COLLECTED: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CPickups::IsPickUpPickedUp(ScriptParams[0]) != 0); + UpdateCompareFlag(CPickups::IsPickUpPickedUp(GET_INTEGER_PARAM(0)) != 0); return 0; case COMMAND_REMOVE_PICKUP: CollectParameters(&m_nIp, 1); - CPickups::RemovePickUp(ScriptParams[0]); + CPickups::RemovePickUp(GET_INTEGER_PARAM(0)); return 0; case COMMAND_SET_TAXI_LIGHTS: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); script_assert(pVehicle->m_vehType == VEHICLE_TYPE_CAR); - ((CAutomobile*)pVehicle)->SetTaxiLight(ScriptParams[1] != 0); + ((CAutomobile*)pVehicle)->SetTaxiLight(GET_INTEGER_PARAM(1) != 0); return 0; } case COMMAND_PRINT_BIG_Q: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 2); - CMessages::AddBigMessageQ(text, ScriptParams[0], ScriptParams[1] - 1); + CMessages::AddBigMessageQ(text, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1) - 1); return 0; } - /* case COMMAND_PRINT_WITH_NUMBER_BIG_Q: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 3); - CMessages::AddBigMessageWithNumberQ(text, ScriptParams[1], ScriptParams[2] - 1, - ScriptParams[0], -1, -1, -1, -1, -1); + CMessages::AddBigMessageWithNumberQ(text, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2) - 1, + GET_INTEGER_PARAM(0), -1, -1, -1, -1, -1); return 0; } - */ case COMMAND_SET_GARAGE: { CollectParameters(&m_nIp, 9); - float infX = *(float*)&ScriptParams[0]; - float infY = *(float*)&ScriptParams[1]; - float infZ = *(float*)&ScriptParams[2]; - float X2 = *(float*)&ScriptParams[3]; - float Y2 = *(float*)&ScriptParams[4]; - float supX = *(float*)&ScriptParams[5]; - float supY = *(float*)&ScriptParams[6]; - float supZ = *(float*)&ScriptParams[7]; - ScriptParams[0] = CGarages::AddOne(infX, infY, infZ, X2, Y2, supX, supY, supZ, ScriptParams[8], 0); + float infX = GET_FLOAT_PARAM(0); + float infY = GET_FLOAT_PARAM(1); + float infZ = GET_FLOAT_PARAM(2); + float X2 = GET_FLOAT_PARAM(3); + float Y2 = GET_FLOAT_PARAM(4); + float supX = GET_FLOAT_PARAM(5); + float supY = GET_FLOAT_PARAM(6); + float supZ = GET_FLOAT_PARAM(7); + SET_INTEGER_PARAM(0, CGarages::AddOne(infX, infY, infZ, X2, Y2, supX, supY, supZ, GET_INTEGER_PARAM(8), 0)); StoreParameters(&m_nIp, 1); return 0; } @@ -294,15 +293,15 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_SET_GARAGE_WITH_CAR_MODEL: { CollectParameters(&m_nIp, 10); - float infX = *(float*)&ScriptParams[0]; - float infY = *(float*)&ScriptParams[1]; - float infZ = *(float*)&ScriptParams[2]; - float X2 = *(float*)&ScriptParams[3]; - float Y2 = *(float*)&ScriptParams[4]; - float supX = *(float*)&ScriptParams[5]; - float supY = *(float*)&ScriptParams[6]; - float supZ = *(float*)&ScriptParams[7]; - ScriptParams[0] = CGarages::AddOne(infX, infY, infZ, X2, Y2, supX, supY, supZ, ScriptParams[8], ScriptParams[9]); + float infX = GET_FLOAT_PARAM(0); + float infY = GET_FLOAT_PARAM(1); + float infZ = GET_FLOAT_PARAM(2); + float X2 = GET_FLOAT_PARAM(3); + float Y2 = GET_FLOAT_PARAM(4); + float supX = GET_FLOAT_PARAM(5); + float supY = GET_FLOAT_PARAM(6); + float supZ = GET_FLOAT_PARAM(7); + SET_INTEGER_PARAM(0, CGarages::AddOne(infX, infY, infZ, X2, Y2, supX, supY, supZ, GET_INTEGER_PARAM(8), GET_INTEGER_PARAM(9))); StoreParameters(&m_nIp, 1); return 0; } @@ -311,34 +310,34 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) { CollectParameters(&m_nIp, 2); CVehicle* pTarget; - if (ScriptParams[1] >= 0) { - pTarget = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); + if (GET_INTEGER_PARAM(1) >= 0) { + pTarget = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); script_assert(pTarget); } else { pTarget = nil; } - CGarages::SetTargetCarForMissonGarage(ScriptParams[0], pTarget); + CGarages::SetTargetCarForMissonGarage(GET_INTEGER_PARAM(0), pTarget); return 0; } case COMMAND_IS_CAR_IN_MISSION_GARAGE: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CGarages::HasCarBeenDroppedOffYet(ScriptParams[0])); + UpdateCompareFlag(CGarages::HasCarBeenDroppedOffYet(GET_INTEGER_PARAM(0))); return 0; -/* case COMMAND_SET_FREE_BOMBS: CollectParameters(&m_nIp, 1); - CGarages::SetFreeBombs(ScriptParams[0] != 0); + CGarages::SetFreeBombs(GET_INTEGER_PARAM(0) != 0); return 0; + /* case COMMAND_SET_POWERPOINT: { CollectParameters(&m_nIp, 7); - float f1 = *(float*)&ScriptParams[0]; - float f2 = *(float*)&ScriptParams[1]; - float f3 = *(float*)&ScriptParams[2]; - float f4 = *(float*)&ScriptParams[3]; - float f5 = *(float*)&ScriptParams[4]; - float f6 = *(float*)&ScriptParams[5]; + float f1 = GET_FLOAT_PARAM(0); + float f2 = GET_FLOAT_PARAM(1); + float f3 = GET_FLOAT_PARAM(2); + float f4 = GET_FLOAT_PARAM(3); + float f5 = GET_FLOAT_PARAM(4); + float f6 = GET_FLOAT_PARAM(5); float temp; if (f1 > f4) { @@ -359,43 +358,43 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) f6 = temp; } - CPowerPoints::GenerateNewOne(f1, f2, f3, f4, f5, f6, *(uint8*)&ScriptParams[6]); + CPowerPoints::GenerateNewOne(f1, f2, f3, f4, f5, f6, *(uint8*)&GET_INTEGER_PARAM(6)); return 0; } case COMMAND_SET_ALL_TAXI_LIGHTS: CollectParameters(&m_nIp, 1); - CAutomobile::SetAllTaxiLights(ScriptParams[0] != 0); + CAutomobile::SetAllTaxiLights(GET_INTEGER_PARAM(0) != 0); return 0; + */ case COMMAND_IS_CAR_ARMED_WITH_ANY_BOMB: { CollectParameters(&m_nIp, 1); - CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pCar); script_assert(pCar->m_vehType == VEHICLE_TYPE_CAR); UpdateCompareFlag(pCar->m_bombType != 0); //TODO: enum return 0; } - */ case COMMAND_APPLY_BRAKES_TO_PLAYERS_CAR: CollectParameters(&m_nIp, 2); - CPad::GetPad(ScriptParams[0])->bApplyBrakes = (ScriptParams[1] != 0); + CPad::GetPad(GET_INTEGER_PARAM(0))->bApplyBrakes = (GET_INTEGER_PARAM(1) != 0); return 0; case COMMAND_SET_PLAYER_HEALTH: { CollectParameters(&m_nIp, 2); - CPlayerPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPlayerPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); - pPed->m_fHealth = Min(ScriptParams[1], CWorld::Players[ScriptParams[0]].m_nMaxHealth); + pPed->m_fHealth = Min(GET_INTEGER_PARAM(1), CWorld::Players[GET_INTEGER_PARAM(0)].m_nMaxHealth); return 0; } case COMMAND_SET_CHAR_HEALTH: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - if (ScriptParams[1]) { - pPed->m_fHealth = ScriptParams[1]; + if (GET_INTEGER_PARAM(1)) { + pPed->m_fHealth = GET_INTEGER_PARAM(1); } else if (pPed->bInVehicle) { pPed->SetDead(); @@ -403,86 +402,84 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) pPed->FlagToDestroyWhenNextProcessed(); } else { - pPed->SetDie(); + pPed->SetDie(); // last argument = 13 (default? TODO) } return 0; } case COMMAND_SET_CAR_HEALTH: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - pVehicle->m_fHealth = ScriptParams[1]; + pVehicle->m_fHealth = GET_INTEGER_PARAM(1); return 0; } case COMMAND_GET_PLAYER_HEALTH: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); - ScriptParams[0] = pPed->m_fHealth; + SET_INTEGER_PARAM(0, pPed->m_fHealth); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_GET_CHAR_HEALTH: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - ScriptParams[0] = pPed->m_fHealth; + SET_INTEGER_PARAM(0, pPed->m_fHealth); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_GET_CAR_HEALTH: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - ScriptParams[0] = pVehicle->m_fHealth; + SET_INTEGER_PARAM(0, pVehicle->m_fHealth); StoreParameters(&m_nIp, 1); return 0; } - /* case COMMAND_IS_CAR_ARMED_WITH_BOMB: { CollectParameters(&m_nIp, 2); - CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CAutomobile* pCar = (CAutomobile*)CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pCar); script_assert(pCar->m_vehType == VEHICLE_TYPE_CAR); - UpdateCompareFlag(pCar->m_bombType == ScriptParams[1]); + UpdateCompareFlag(pCar->m_bombType == GET_INTEGER_PARAM(1)); return 0; } - */ case COMMAND_CHANGE_CAR_COLOUR: { CollectParameters(&m_nIp, 3); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); - if (ScriptParams[1] >= 256 || ScriptParams[2] >= 256) + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); + if (GET_INTEGER_PARAM(1) >= 256 || GET_INTEGER_PARAM(2) >= 256) debug("CHANGE_CAR_COLOUR - Colours must be less than %d", 256); - pVehicle->m_currentColour1 = ScriptParams[1]; - pVehicle->m_currentColour2 = ScriptParams[2]; + pVehicle->m_currentColour1 = GET_INTEGER_PARAM(1); + pVehicle->m_currentColour2 = GET_INTEGER_PARAM(2); return 0; } case COMMAND_SWITCH_PED_ROADS_ON: { CollectParameters(&m_nIp, 6); - float infX = *(float*)&ScriptParams[0]; - float infY = *(float*)&ScriptParams[1]; - float infZ = *(float*)&ScriptParams[2]; - float supX = *(float*)&ScriptParams[3]; - float supY = *(float*)&ScriptParams[4]; - float supZ = *(float*)&ScriptParams[5]; + float infX = GET_FLOAT_PARAM(0); + float infY = GET_FLOAT_PARAM(1); + float infZ = GET_FLOAT_PARAM(2); + float supX = GET_FLOAT_PARAM(3); + float supY = GET_FLOAT_PARAM(4); + float supZ = GET_FLOAT_PARAM(5); if (infX > supX) { - infX = *(float*)&ScriptParams[3]; - supX = *(float*)&ScriptParams[0]; + infX = GET_FLOAT_PARAM(3); + supX = GET_FLOAT_PARAM(0); } if (infY > supY) { - infY = *(float*)&ScriptParams[4]; - supY = *(float*)&ScriptParams[1]; + infY = GET_FLOAT_PARAM(4); + supY = GET_FLOAT_PARAM(1); } if (infZ > supZ) { - infZ = *(float*)&ScriptParams[5]; - supZ = *(float*)&ScriptParams[2]; + infZ = GET_FLOAT_PARAM(5); + supZ = GET_FLOAT_PARAM(2); } ThePaths.SwitchPedRoadsOffInArea(infX, supX, infY, supY, infZ, supZ, false); return 0; @@ -490,23 +487,23 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_SWITCH_PED_ROADS_OFF: { CollectParameters(&m_nIp, 6); - float infX = *(float*)&ScriptParams[0]; - float infY = *(float*)&ScriptParams[1]; - float infZ = *(float*)&ScriptParams[2]; - float supX = *(float*)&ScriptParams[3]; - float supY = *(float*)&ScriptParams[4]; - float supZ = *(float*)&ScriptParams[5]; + float infX = GET_FLOAT_PARAM(0); + float infY = GET_FLOAT_PARAM(1); + float infZ = GET_FLOAT_PARAM(2); + float supX = GET_FLOAT_PARAM(3); + float supY = GET_FLOAT_PARAM(4); + float supZ = GET_FLOAT_PARAM(5); if (infX > supX) { - infX = *(float*)&ScriptParams[3]; - supX = *(float*)&ScriptParams[0]; + infX = GET_FLOAT_PARAM(3); + supX = GET_FLOAT_PARAM(0); } if (infY > supY) { - infY = *(float*)&ScriptParams[4]; - supY = *(float*)&ScriptParams[1]; + infY = GET_FLOAT_PARAM(4); + supY = GET_FLOAT_PARAM(1); } if (infZ > supZ) { - infZ = *(float*)&ScriptParams[5]; - supZ = *(float*)&ScriptParams[2]; + infZ = GET_FLOAT_PARAM(5); + supZ = GET_FLOAT_PARAM(2); } ThePaths.SwitchPedRoadsOffInArea(infX, supX, infY, supY, infZ, supZ, true); return 0; @@ -514,20 +511,20 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_CHAR_LOOK_AT_CHAR_ALWAYS: { CollectParameters(&m_nIp, 2); - CPed* pSourcePed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pSourcePed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pSourcePed); - CPed* pTargetPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CPed* pTargetPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); script_assert(pTargetPed); - pSourcePed->SetLookFlag(pTargetPed, true); + pSourcePed->SetLookFlag(pTargetPed, true, true); pSourcePed->SetLookTimer(60000); return 0; } case COMMAND_CHAR_LOOK_AT_PLAYER_ALWAYS: { CollectParameters(&m_nIp, 2); - CPed* pSourcePed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pSourcePed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pSourcePed); - CPed* pTargetPed = CWorld::Players[ScriptParams[1]].m_pPed; + CPed* pTargetPed = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; script_assert(pTargetPed); pSourcePed->SetLookFlag(pTargetPed, true); pSourcePed->SetLookTimer(60000); @@ -536,9 +533,9 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_PLAYER_LOOK_AT_CHAR_ALWAYS: { CollectParameters(&m_nIp, 2); - CPed* pSourcePed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pSourcePed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pSourcePed); - CPed* pTargetPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CPed* pTargetPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); script_assert(pTargetPed); pSourcePed->SetLookFlag(pTargetPed, true); pSourcePed->SetLookTimer(60000); @@ -547,7 +544,7 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_STOP_CHAR_LOOKING: { CollectParameters(&m_nIp, 1); - CPed* pSourcePed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pSourcePed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pSourcePed); pSourcePed->ClearLookFlag(); pSourcePed->bKeepTryingToLook = false; @@ -558,7 +555,7 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_STOP_PLAYER_LOOKING: { CollectParameters(&m_nIp, 1); - CPed* pSourcePed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pSourcePed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pSourcePed); pSourcePed->ClearLookFlag(); pSourcePed->bKeepTryingToLook = false; @@ -569,7 +566,7 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) /* case COMMAND_SWITCH_HELICOPTER: CollectParameters(&m_nIp, 1); - CHeli::ActivateHeli(ScriptParams[0] != 0); + CHeli::ActivateHeli(GET_INTEGER_PARAM(0) != 0); return 0; */ //case COMMAND_SET_GANG_ATTITUDE: @@ -577,33 +574,33 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) //case COMMAND_SET_GANG_PLAYER_ATTITUDE: case COMMAND_SET_GANG_PED_MODELS: CollectParameters(&m_nIp, 3); - CGangs::SetGangPedModels(ScriptParams[0], ScriptParams[1], ScriptParams[2]); + CGangs::SetGangPedModels(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); return 0; case COMMAND_SET_GANG_CAR_MODEL: CollectParameters(&m_nIp, 2); - CGangs::SetGangVehicleModel(ScriptParams[0], ScriptParams[1]); + CGangs::SetGangVehicleModel(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1)); return 0; case COMMAND_SET_GANG_WEAPONS: CollectParameters(&m_nIp, 3); - CGangs::SetGangWeapons(ScriptParams[0], (eWeaponType)ScriptParams[1], (eWeaponType)ScriptParams[2]); + CGangs::SetGangWeapons(GET_INTEGER_PARAM(0), (eWeaponType)GET_INTEGER_PARAM(1), (eWeaponType)GET_INTEGER_PARAM(2)); return 0; /* case COMMAND_SET_CHAR_OBJ_RUN_TO_AREA: { CollectParameters(&m_nIp, 5); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - float infX = *(float*)&ScriptParams[1]; - float infY = *(float*)&ScriptParams[2]; - float supX = *(float*)&ScriptParams[3]; - float supY = *(float*)&ScriptParams[4]; + float infX = GET_FLOAT_PARAM(1); + float infY = GET_FLOAT_PARAM(2); + float supX = GET_FLOAT_PARAM(3); + float supY = GET_FLOAT_PARAM(4); if (infX > supX) { - infX = *(float*)&ScriptParams[3]; - supX = *(float*)&ScriptParams[1]; + infX = GET_FLOAT_PARAM(3); + supX = GET_FLOAT_PARAM(1); } if (infY > supY) { - infY = *(float*)&ScriptParams[4]; - supY = *(float*)&ScriptParams[2]; + infY = GET_FLOAT_PARAM(4); + supY = GET_FLOAT_PARAM(2); } CVector pos; pos.x = (infX + supX) / 2; @@ -618,11 +615,11 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_SET_CHAR_OBJ_RUN_TO_COORD: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); CVector pos; - pos.x = *(float*)&ScriptParams[1]; - pos.y = *(float*)&ScriptParams[2]; + pos.x = GET_FLOAT_PARAM(1); + pos.y = GET_FLOAT_PARAM(2); pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_RUN_TO_AREA, pos); @@ -632,9 +629,9 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_IS_PLAYER_TOUCHING_OBJECT_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[1]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)); bool isTouching = false; if (pPed->bInVehicle) isTouching = false; @@ -646,9 +643,9 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_IS_CHAR_TOUCHING_OBJECT_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[1]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(1)); bool isTouching = false; if (pPed->InVehicle()) isTouching = false; @@ -665,110 +662,115 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) strncpy(name, (char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); for (int i = 0; i < KEY_LENGTH_IN_SCRIPT; i++) name[i] = tolower(name[i]); - CStreaming::RequestSpecialChar(ScriptParams[0] - 1, name, STREAMFLAGS_DEPENDENCY | STREAMFLAGS_SCRIPTOWNED); + CStreaming::RequestSpecialChar(GET_INTEGER_PARAM(0) - 1, name, STREAMFLAGS_DEPENDENCY | (m_bIsMissionScript ? STREAMFLAGS_SCRIPTOWNED : STREAMFLAGS_AMBIENT_SCRIPT_OWNED)); m_nIp += KEY_LENGTH_IN_SCRIPT; return 0; } case COMMAND_HAS_SPECIAL_CHARACTER_LOADED: { CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CStreaming::HasSpecialCharLoaded(ScriptParams[0] - 1)); + UpdateCompareFlag(CStreaming::HasSpecialCharLoaded(GET_INTEGER_PARAM(0) - 1)); return 0; } /* case COMMAND_FLASH_CAR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - pVehicle->bHasBlip = (ScriptParams[1] != 0); + pVehicle->bHasBlip = (GET_INTEGER_PARAM(1) != 0); return 0; } case COMMAND_FLASH_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - pPed->bHasBlip = (ScriptParams[1] != 0); + pPed->bHasBlip = (GET_INTEGER_PARAM(1) != 0); return 0; } case COMMAND_FLASH_OBJECT: { CollectParameters(&m_nIp, 2); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pObject); - pObject->bHasBlip = (ScriptParams[1] != 0); + pObject->bHasBlip = (GET_INTEGER_PARAM(1) != 0); return 0; } */ case COMMAND_IS_PLAYER_IN_REMOTE_MODE: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CWorld::Players[ScriptParams[0]].IsPlayerInRemoteMode()); + UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].IsPlayerInRemoteMode()); return 0; - /* case COMMAND_ARM_CAR_WITH_BOMB: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); script_assert(pVehicle->m_vehType == VEHICLE_TYPE_CAR); - ((CAutomobile*)pVehicle)->m_bombType = ScriptParams[1]; + ((CAutomobile*)pVehicle)->m_bombType = GET_INTEGER_PARAM(1); ((CAutomobile*)pVehicle)->m_pBombRigger = FindPlayerPed(); return 0; } - */ case COMMAND_SET_CHAR_PERSONALITY: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - pPed->SetPedStats((ePedStats)ScriptParams[1]); + pPed->SetPedStats((ePedStats)GET_INTEGER_PARAM(1)); return 0; } case COMMAND_SET_CUTSCENE_OFFSET: CollectParameters(&m_nIp, 3); - CCutsceneMgr::SetCutsceneOffset(*(CVector*)&ScriptParams[0]); + CCutsceneMgr::SetCutsceneOffset(GET_VECTOR_PARAM(0)); return 0; case COMMAND_SET_ANIM_GROUP_FOR_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - pPed->m_animGroup = (AssocGroupId)ScriptParams[1]; + pPed->m_animGroup = (AssocGroupId)GET_INTEGER_PARAM(1); + pPed->b1A1_20 = false; return 0; } /* case COMMAND_SET_ANIM_GROUP_FOR_PLAYER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); - pPed->m_animGroup = (AssocGroupId)ScriptParams[1]; + pPed->m_animGroup = (AssocGroupId)GET_INTEGER_PARAM(1); return 0; } */ case COMMAND_REQUEST_MODEL: { CollectParameters(&m_nIp, 1); - int model = ScriptParams[0]; + int model = GET_INTEGER_PARAM(0); if (model < 0) model = CTheScripts::UsedObjectArray[-model].index; - CStreaming::RequestModel(model, STREAMFLAGS_DEPENDENCY | STREAMFLAGS_NOFADE | STREAMFLAGS_SCRIPTOWNED); + CStreaming::RequestModel(model, STREAMFLAGS_DEPENDENCY | STREAMFLAGS_NOFADE | (m_bIsMissionScript ? STREAMFLAGS_SCRIPTOWNED : STREAMFLAGS_AMBIENT_SCRIPT_OWNED)); + if (model == MI_MINIGUN) +#ifdef FIX_BUGS + CStreaming::RequestModel(MI_MINIGUN2, STREAMFLAGS_DEPENDENCY | STREAMFLAGS_NOFADE | (m_bIsMissionScript ? STREAMFLAGS_SCRIPTOWNED : STREAMFLAGS_AMBIENT_SCRIPT_OWNED)); +#else + CStreaming::RequestModel(MI_MINIGUN2, STREAMFLAGS_DEPENDENCY | STREAMFLAGS_NOFADE | STREAMFLAGS_SCRIPTOWNED); +#endif return 0; } case COMMAND_HAS_MODEL_LOADED: { CollectParameters(&m_nIp, 1); - int model = ScriptParams[0]; + int model = GET_INTEGER_PARAM(0); if (model < 0) model = CTheScripts::UsedObjectArray[-model].index; - UpdateCompareFlag(CStreaming::HasModelLoaded(model)); + UpdateCompareFlag(CStreaming::HasModelLoaded(model)/* || cWorldStream::Instance()->pDynamic(model, 0) */); // TODO return 0; } case COMMAND_MARK_MODEL_AS_NO_LONGER_NEEDED: { CollectParameters(&m_nIp, 1); - int model = ScriptParams[0]; + int model = GET_INTEGER_PARAM(0); if (model < 0) model = CTheScripts::UsedObjectArray[-model].index; CStreaming::SetMissionDoesntRequireModel(model); @@ -777,7 +779,7 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_GRAB_PHONE: { CollectParameters(&m_nIp, 2); - ScriptParams[0] = gPhoneInfo.GrabPhone(*(float*)&ScriptParams[0], *(float*)&ScriptParams[1]); + SET_INTEGER_PARAM(0, gPhoneInfo.GrabPhone(GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1))); StoreParameters(&m_nIp, 1); return 0; } @@ -786,50 +788,57 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) { CollectParameters(&m_nIp, 1); wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - gPhoneInfo.SetPhoneMessage_Repeatedly(ScriptParams[0], text, nil, nil, nil, nil, nil); + gPhoneInfo.SetPhoneMessage_Repeatedly(GET_INTEGER_PARAM(0), text, nil, nil, nil, nil, nil); return 0; } case COMMAND_SET_PHONE_MESSAGE: { CollectParameters(&m_nIp, 1); wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); - gPhoneInfo.SetPhoneMessage_JustOnce(ScriptParams[0], text, nil, nil, nil, nil, nil); + gPhoneInfo.SetPhoneMessage_JustOnce(GET_INTEGER_PARAM(0), text, nil, nil, nil, nil, nil); return 0; } case COMMAND_HAS_PHONE_DISPLAYED_MESSAGE: { CollectParameters(&m_nIp, 1); - UpdateCompareFlag(gPhoneInfo.HasMessageBeenDisplayed(ScriptParams[0])); + UpdateCompareFlag(gPhoneInfo.HasMessageBeenDisplayed(GET_INTEGER_PARAM(0))); return 0; } */ case COMMAND_TURN_PHONE_OFF: { CollectParameters(&m_nIp, 1); - gPhoneInfo.SetPhoneMessage_JustOnce(ScriptParams[0], nil, nil, nil, nil, nil, nil); + gPhoneInfo.SetPhoneMessage_JustOnce(GET_INTEGER_PARAM(0), nil, nil, nil, nil, nil, nil); return 0; } case COMMAND_DRAW_CORONA: { + uint32 ip = m_nIp; + int32* ptr = GetPointerToScriptVariable(&ip, 0); CollectParameters(&m_nIp, 9); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CCoronas::RegisterCorona((uintptr)this + m_nIp, ScriptParams[6], ScriptParams[7], ScriptParams[8], - 255, pos, *(float*)&ScriptParams[3], 150.0f, ScriptParams[4], ScriptParams[5], 1, 0, 0, 0.0f); + CCoronas::RegisterCorona((uintptr)ptr, GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(8), + 255, pos, -GET_FLOAT_PARAM(3), 450.0f, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), 1, 0, 0, 0.0f); return 0; } + /* case COMMAND_DRAW_LIGHT: { CollectParameters(&m_nIp, 6); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); CVector unused(0.0f, 0.0f, 0.0f); - CPointLights::AddLight(0, *(CVector*)&ScriptParams[0], CVector(0.0f, 0.0f, 0.0f), 12.0f, - ScriptParams[3] / 255.0f, ScriptParams[4] / 255.0f, ScriptParams[5] / 255.0f, 0, true); + CPointLights::AddLight(0, GET_VECTOR_PARAM(0), CVector(0.0f, 0.0f, 0.0f), 12.0f, + GET_INTEGER_PARAM(3) / 255.0f, GET_INTEGER_PARAM(4) / 255.0f, GET_INTEGER_PARAM(5) / 255.0f, 0, true); return 0; } - //case COMMAND_STORE_WEATHER: - //case COMMAND_RESTORE_WEATHER: + */ + case COMMAND_STORE_WEATHER: + CWeather::StoreWeatherState(); + return 0; + case COMMAND_RESTORE_WEATHER: + CWeather::RestoreWeatherState(); case COMMAND_STORE_CLOCK: CClock::StoreClock(); return 0; @@ -839,10 +848,10 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_RESTART_CRITICAL_MISSION: { CollectParameters(&m_nIp, 4); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CRestart::OverrideNextRestart(pos, *(float*)&ScriptParams[3]); + CRestart::OverrideNextRestart(pos, GET_FLOAT_PARAM(3)); if (CWorld::Players[CWorld::PlayerInFocus].m_WBState != WBSTATE_PLAYING) printf("RESTART_CRITICAL_MISSION - Player state is not PLAYING\n"); CWorld::Players[CWorld::PlayerInFocus].PlayerFailedCriticalMission(); @@ -851,13 +860,13 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) case COMMAND_IS_PLAYER_PLAYING: { CollectParameters(&m_nIp, 1); - UpdateCompareFlag(CWorld::Players[ScriptParams[0]].m_WBState == WBSTATE_PLAYING); + UpdateCompareFlag(CWorld::Players[GET_INTEGER_PARAM(0)].m_WBState == WBSTATE_PLAYING); return 0; } #ifdef GTA_SCRIPT_COLLECTIVE case COMMAND_SET_COLL_OBJ_NO_OBJ: CollectParameters(&m_nIp, 1); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_NONE); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_NONE); return 0; #endif default: @@ -872,134 +881,134 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) #ifdef GTA_SCRIPT_COLLECTIVE case COMMAND_SET_COLL_OBJ_WAIT_ON_FOOT: CollectParameters(&m_nIp, 1); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_WAIT_ON_FOOT); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_WAIT_ON_FOOT); return 0; case COMMAND_SET_COLL_OBJ_FLEE_ON_FOOT_TILL_SAFE: CollectParameters(&m_nIp, 1); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_ON_FOOT_TILL_SAFE); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_FLEE_ON_FOOT_TILL_SAFE); return 0; case COMMAND_SET_COLL_OBJ_GUARD_SPOT: { CollectParameters(&m_nIp, 4); - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GUARD_AREA, pos); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_GUARD_AREA, pos); return 0; } case COMMAND_SET_COLL_OBJ_GUARD_AREA: { CollectParameters(&m_nIp, 5); - float infX = *(float*)&ScriptParams[1]; - float supX = *(float*)&ScriptParams[3]; + float infX = GET_FLOAT_PARAM(1); + float supX = GET_FLOAT_PARAM(3); if (infX > supX) { - infX = *(float*)&ScriptParams[3]; - supX = *(float*)&ScriptParams[1]; + infX = GET_FLOAT_PARAM(3); + supX = GET_FLOAT_PARAM(1); } - float infY = *(float*)&ScriptParams[2]; - float supY = *(float*)&ScriptParams[4]; + float infY = GET_FLOAT_PARAM(2); + float supY = GET_FLOAT_PARAM(4); if (infY > supY) { - infY = *(float*)&ScriptParams[4]; - supY = *(float*)&ScriptParams[2]; + infY = GET_FLOAT_PARAM(4); + supY = GET_FLOAT_PARAM(2); } CVector pos; pos.x = (infX + supX) / 2; pos.y = (infY + supY) / 2; pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); float radius = Max(pos.x - infX, pos.y - infY); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GUARD_AREA, pos, radius); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_GUARD_AREA, pos, radius); return 0; } case COMMAND_SET_COLL_OBJ_WAIT_IN_CAR: CollectParameters(&m_nIp, 1); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_WAIT_IN_CAR); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_WAIT_IN_CAR); return 0; case COMMAND_SET_COLL_OBJ_KILL_CHAR_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_KILL_CHAR_ON_FOOT, pPed); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_KILL_CHAR_ON_FOOT, pPed); return 0; } case COMMAND_SET_COLL_OBJ_KILL_PLAYER_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_KILL_CHAR_ON_FOOT, pPed); + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_KILL_CHAR_ON_FOOT, pPed); return 0; } case COMMAND_SET_COLL_OBJ_KILL_CHAR_ANY_MEANS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_KILL_CHAR_ANY_MEANS, pPed); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_KILL_CHAR_ANY_MEANS, pPed); return 0; } case COMMAND_SET_COLL_OBJ_KILL_PLAYER_ANY_MEANS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_KILL_CHAR_ANY_MEANS, pPed); + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_KILL_CHAR_ANY_MEANS, pPed); return 0; } case COMMAND_SET_COLL_OBJ_FLEE_CHAR_ON_FOOT_TILL_SAFE: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, pPed); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, pPed); return 0; } case COMMAND_SET_COLL_OBJ_FLEE_PLAYER_ON_FOOT_TILL_SAFE: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, pPed); + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, pPed); return 0; } case COMMAND_SET_COLL_OBJ_FLEE_CHAR_ON_FOOT_ALWAYS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_CHAR_ON_FOOT_ALWAYS, pPed); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_FLEE_CHAR_ON_FOOT_ALWAYS, pPed); return 0; } case COMMAND_SET_COLL_OBJ_FLEE_PLAYER_ON_FOOT_ALWAYS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FLEE_CHAR_ON_FOOT_ALWAYS, pPed); + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_FLEE_CHAR_ON_FOOT_ALWAYS, pPed); return 0; } case COMMAND_SET_COLL_OBJ_GOTO_CHAR_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_CHAR_ON_FOOT, pPed); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_GOTO_CHAR_ON_FOOT, pPed); return 0; } case COMMAND_SET_COLL_OBJ_GOTO_PLAYER_ON_FOOT: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[ScriptParams[1]].m_pPed; - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_CHAR_ON_FOOT, pPed); + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(1)].m_pPed; + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_GOTO_CHAR_ON_FOOT, pPed); return 0; } case COMMAND_SET_COLL_OBJ_LEAVE_CAR: CollectParameters(&m_nIp, 1); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_LEAVE_CAR); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_LEAVE_CAR); return 0; case COMMAND_SET_COLL_OBJ_ENTER_CAR_AS_PASSENGER: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_ENTER_CAR_AS_PASSENGER, pVehicle); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_ENTER_CAR_AS_PASSENGER, pVehicle); return 0; } case COMMAND_SET_COLL_OBJ_ENTER_CAR_AS_DRIVER: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_ENTER_CAR_AS_DRIVER, pVehicle); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_ENTER_CAR_AS_DRIVER, pVehicle); return 0; } /* @@ -1010,31 +1019,31 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) case COMMAND_SET_COLL_OBJ_DESTROY_CAR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[1]); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_DESTROY_CAR, pVehicle); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(1)); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_DESTROY_CAR, pVehicle); return 0; } case COMMAND_SET_COLL_OBJ_GOTO_AREA_ON_FOOT: { CollectParameters(&m_nIp, 5); - float infX = *(float*)&ScriptParams[1]; - float supX = *(float*)&ScriptParams[3]; + float infX = GET_FLOAT_PARAM(1); + float supX = GET_FLOAT_PARAM(3); if (infX > supX) { - infX = *(float*)&ScriptParams[3]; - supX = *(float*)&ScriptParams[1]; + infX = GET_FLOAT_PARAM(3); + supX = GET_FLOAT_PARAM(1); } - float infY = *(float*)&ScriptParams[2]; - float supY = *(float*)&ScriptParams[4]; + float infY = GET_FLOAT_PARAM(2); + float supY = GET_FLOAT_PARAM(4); if (infY > supY) { - infY = *(float*)&ScriptParams[4]; - supY = *(float*)&ScriptParams[2]; + infY = GET_FLOAT_PARAM(4); + supY = GET_FLOAT_PARAM(2); } CVector pos; pos.x = (infX + supX) / 2; pos.y = (infY + supY) / 2; pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); float radius = Max(pos.x - infX, pos.y - infY); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_AREA_ON_FOOT, pos, radius); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_GOTO_AREA_ON_FOOT, pos, radius); return 0; } /* @@ -1044,66 +1053,66 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) */ case COMMAND_SET_COLL_OBJ_FOLLOW_ROUTE: CollectParameters(&m_nIp, 3); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_FOLLOW_ROUTE, ScriptParams[1], ScriptParams[2]); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_FOLLOW_ROUTE, GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2)); return 0; case COMMAND_SET_COLL_OBJ_GOTO_COORD_ON_FOOT: { CollectParameters(&m_nIp, 3); - CVector pos(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2], CWorld::FindGroundZForCoord(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2])); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_AREA_ON_FOOT, pos); + CVector pos(GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2), CWorld::FindGroundZForCoord(GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2))); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_GOTO_AREA_ON_FOOT, pos); return 0; } //case COMMAND_SET_COLL_OBJ_GOTO_COORD_IN_CAR: case COMMAND_SET_COLL_OBJ_RUN_TO_AREA: { CollectParameters(&m_nIp, 5); - float infX = *(float*)&ScriptParams[1]; - float supX = *(float*)&ScriptParams[3]; + float infX = GET_FLOAT_PARAM(1); + float supX = GET_FLOAT_PARAM(3); if (infX > supX) { - infX = *(float*)&ScriptParams[3]; - supX = *(float*)&ScriptParams[1]; + infX = GET_FLOAT_PARAM(3); + supX = GET_FLOAT_PARAM(1); } - float infY = *(float*)&ScriptParams[2]; - float supY = *(float*)&ScriptParams[4]; + float infY = GET_FLOAT_PARAM(2); + float supY = GET_FLOAT_PARAM(4); if (infY > supY) { - infY = *(float*)&ScriptParams[4]; - supY = *(float*)&ScriptParams[2]; + infY = GET_FLOAT_PARAM(4); + supY = GET_FLOAT_PARAM(2); } CVector pos; pos.x = (infX + supX) / 2; pos.y = (infY + supY) / 2; pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); float radius = Max(pos.x - infX, pos.y - infY); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_RUN_TO_AREA, pos, radius); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_RUN_TO_AREA, pos, radius); return 0; } case COMMAND_SET_COLL_OBJ_RUN_TO_COORD: { CollectParameters(&m_nIp, 3); - CVector pos(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2], CWorld::FindGroundZForCoord(*(float*)&ScriptParams[1], *(float*)&ScriptParams[2])); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_RUN_TO_AREA, pos); + CVector pos(GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2), CWorld::FindGroundZForCoord(GET_FLOAT_PARAM(1), GET_FLOAT_PARAM(2))); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_RUN_TO_AREA, pos); return 0; } case COMMAND_ADD_PEDS_IN_AREA_TO_COLL: { CollectParameters(&m_nIp, 3); - float X = *(float*)&ScriptParams[0]; - float Y = *(float*)&ScriptParams[1]; + float X = GET_FLOAT_PARAM(0); + float Y = GET_FLOAT_PARAM(1); float Z = CWorld::FindGroundZForCoord(X, Y); - float radius = *(float*)&ScriptParams[2]; - ScriptParams[0] = CTheScripts::AddPedsInAreaToCollective(X, Y, Z, radius); + float radius = GET_FLOAT_PARAM(2); + SET_INTEGER_PARAM(0, CTheScripts::AddPedsInAreaToCollective(X, Y, Z, radius)); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_PEDS_IN_VEHICLE_TO_COLL: CollectParameters(&m_nIp, 1); - ScriptParams[0] = CTheScripts::AddPedsInVehicleToCollective(ScriptParams[0]); + SET_INTEGER_PARAM(0, CTheScripts::AddPedsInVehicleToCollective(GET_INTEGER_PARAM(0))); StoreParameters(&m_nIp, 1); return 0; case COMMAND_CLEAR_COLL: CollectParameters(&m_nIp, 1); for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { - if (CTheScripts::CollectiveArray[i].colIndex == ScriptParams[0]) { + if (CTheScripts::CollectiveArray[i].colIndex == GET_INTEGER_PARAM(0)) { CTheScripts::CollectiveArray[i].colIndex = -1; CTheScripts::CollectiveArray[i].pedIndex = 0; } @@ -1172,7 +1181,7 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) total++; } } - ScriptParams[0] = total; + SET_INTEGER_PARAM(0, total); StoreParameters(&m_nIp, 1); return 0; } @@ -1180,38 +1189,38 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) case COMMAND_SET_CHAR_HEED_THREATS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - pPed->bRespondsToThreats = (ScriptParams[1] != 0); + pPed->bRespondsToThreats = (GET_INTEGER_PARAM(1) != 0); return 0; } case COMMAND_SET_PLAYER_HEED_THREATS: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); - pPed->bRespondsToThreats = (ScriptParams[1] != 0); + pPed->bRespondsToThreats = (GET_INTEGER_PARAM(1) != 0); return 0; } case COMMAND_GET_CONTROLLER_MODE: #if defined(GTA_PC) && !defined(DETECT_PAD_INPUT_SWITCH) - ScriptParams[0] = 0; + SET_INTEGER_PARAM(0, 0); #else - ScriptParams[0] = CPad::IsAffectedByController ? CPad::GetPad(0)->Mode : 0; + SET_INTEGER_PARAM(0, CPad::IsAffectedByController ? CPad::GetPad(0)->Mode : 0); #endif StoreParameters(&m_nIp, 1); return 0; case COMMAND_SET_CAN_RESPRAY_CAR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); //assert(pVehicle->m_vehType == VEHICLE_TYPE_CAR); // they DO call this for bikes, we don't really want to destroy the structure... #ifdef FIX_BUGS if (pVehicle->m_vehType == VEHICLE_TYPE_CAR) #endif - ((CAutomobile*)pVehicle)->bFixedColour = (ScriptParams[1] == 0); + ((CAutomobile*)pVehicle)->bFixedColour = (GET_INTEGER_PARAM(1) == 0); return 0; } @@ -1219,7 +1228,7 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) case COMMAND_IS_TAXI: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); UpdateCompareFlag(pVehicle->IsTaxi()); return 0; @@ -1227,25 +1236,25 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) */ case COMMAND_UNLOAD_SPECIAL_CHARACTER: CollectParameters(&m_nIp, 1); - CStreaming::SetMissionDoesntRequireSpecialChar(ScriptParams[0] - 1); + CStreaming::SetMissionDoesntRequireSpecialChar(GET_INTEGER_PARAM(0) - 1); return 0; case COMMAND_RESET_NUM_OF_MODELS_KILLED_BY_PLAYER: CDarkel::ResetModelsKilledByPlayer(); return 0; case COMMAND_GET_NUM_OF_MODELS_KILLED_BY_PLAYER: CollectParameters(&m_nIp, 1); - ScriptParams[0] = CDarkel::QueryModelsKilledByPlayer(ScriptParams[0]); + SET_INTEGER_PARAM(0, CDarkel::QueryModelsKilledByPlayer(GET_INTEGER_PARAM(0))); StoreParameters(&m_nIp, 1); return 0; /* case COMMAND_ACTIVATE_GARAGE: CollectParameters(&m_nIp, 1); - CGarages::ActivateGarage(ScriptParams[0]); + CGarages::ActivateGarage(GET_INTEGER_PARAM(0)); return 0; case COMMAND_SWITCH_TAXI_TIMER: { CollectParameters(&m_nIp, 1); - if (ScriptParams[0] != 0){ + if (GET_INTEGER_PARAM(0) != 0){ CWorld::Players[CWorld::PlayerInFocus].m_nUnusedTaxiTimer = CTimer::GetTimeInMilliseconds(); CWorld::Players[CWorld::PlayerInFocus].m_bUnusedTaxiThing = true; }else{ @@ -1257,10 +1266,10 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) case COMMAND_CREATE_OBJECT_NO_OFFSET: { CollectParameters(&m_nIp, 4); - int mi = ScriptParams[0] >= 0 ? ScriptParams[0] : CTheScripts::UsedObjectArray[-ScriptParams[0]].index; + int mi = GET_INTEGER_PARAM(0) >= 0 ? GET_INTEGER_PARAM(0) : CTheScripts::UsedObjectArray[-GET_INTEGER_PARAM(0)].index; CObject* pObj = new CObject(mi, false); ; pObj->ObjectCreatedBy = MISSION_OBJECT; - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pObj->SetPosition(pos); @@ -1272,17 +1281,17 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) pObj->SetupBigBuilding(); CTheScripts::ClearSpaceForMissionEntity(pos, pObj); CWorld::Add(pObj); - ScriptParams[0] = CPools::GetObjectPool()->GetIndex(pObj); + SET_INTEGER_PARAM(0, CPools::GetObjectPool()->GetIndex(pObj)); StoreParameters(&m_nIp, 1); if (m_bIsMissionScript) - CTheScripts::MissionCleanUp.AddEntityToList(ScriptParams[0], CLEANUP_OBJECT); + CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_OBJECT); return 0; } /* case COMMAND_IS_BOAT: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); UpdateCompareFlag(pVehicle->m_vehType == VEHICLE_TYPE_BOAT); return 0; @@ -1290,19 +1299,19 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) case COMMAND_SET_CHAR_OBJ_GOTO_AREA_ANY_MEANS: { CollectParameters(&m_nIp, 5); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - float infX = *(float*)&ScriptParams[1]; - float infY = *(float*)&ScriptParams[2]; - float supX = *(float*)&ScriptParams[3]; - float supY = *(float*)&ScriptParams[4]; + float infX = GET_FLOAT_PARAM(1); + float infY = GET_FLOAT_PARAM(2); + float supX = GET_FLOAT_PARAM(3); + float supY = GET_FLOAT_PARAM(4); if (infX > supX) { - infX = *(float*)&ScriptParams[3]; - supX = *(float*)&ScriptParams[1]; + infX = GET_FLOAT_PARAM(3); + supX = GET_FLOAT_PARAM(1); } if (infY > supY) { - infY = *(float*)&ScriptParams[4]; - supY = *(float*)&ScriptParams[2]; + infY = GET_FLOAT_PARAM(4); + supY = GET_FLOAT_PARAM(2); } CVector pos; pos.x = (infX + supX) / 2; @@ -1318,31 +1327,31 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) case COMMAND_SET_COLL_OBJ_GOTO_AREA_ANY_MEANS: { CollectParameters(&m_nIp, 5); - float infX = *(float*)&ScriptParams[1]; - float supX = *(float*)&ScriptParams[3]; + float infX = GET_FLOAT_PARAM(1); + float supX = GET_FLOAT_PARAM(3); if (infX > supX) { - infX = *(float*)&ScriptParams[3]; - supX = *(float*)&ScriptParams[1]; + infX = GET_FLOAT_PARAM(3); + supX = GET_FLOAT_PARAM(1); } - float infY = *(float*)&ScriptParams[2]; - float supY = *(float*)&ScriptParams[4]; + float infY = GET_FLOAT_PARAM(2); + float supY = GET_FLOAT_PARAM(4); if (infY > supY) { - infY = *(float*)&ScriptParams[4]; - supY = *(float*)&ScriptParams[2]; + infY = GET_FLOAT_PARAM(4); + supY = GET_FLOAT_PARAM(2); } CVector pos; pos.x = (infX + supX) / 2; pos.y = (infY + supY) / 2; pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); float radius = Max(pos.x - infX, pos.y - infY); - CTheScripts::SetObjectiveForAllPedsInCollective(ScriptParams[0], OBJECTIVE_GOTO_AREA_ANY_MEANS, pos, radius); + CTheScripts::SetObjectiveForAllPedsInCollective(GET_INTEGER_PARAM(0), OBJECTIVE_GOTO_AREA_ANY_MEANS, pos, radius); return 0; } #endif case COMMAND_IS_PLAYER_STOPPED: { CollectParameters(&m_nIp, 1); - CPlayerInfo* pPlayer = &CWorld::Players[ScriptParams[0]]; + CPlayerInfo* pPlayer = &CWorld::Players[GET_INTEGER_PARAM(0)]; UpdateCompareFlag(CTheScripts::IsPlayerStopped(pPlayer)); return 0; @@ -1351,31 +1360,31 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) case COMMAND_IS_CHAR_STOPPED: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); UpdateCompareFlag(CTheScripts::IsPedStopped(pPed)); return 0; } */ case COMMAND_MESSAGE_WAIT: CollectParameters(&m_nIp, 2); - m_nWakeTime = CTimer::GetTimeInMilliseconds() + ScriptParams[0]; - if (ScriptParams[1] != 0) + m_nWakeTime = CTimer::GetTimeInMilliseconds() + GET_INTEGER_PARAM(0); + if (GET_INTEGER_PARAM(1) != 0) m_bSkipWakeTime = true; return 1; /* case COMMAND_ADD_PARTICLE_EFFECT: { CollectParameters(&m_nIp, 5); - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CParticleObject::AddObject(ScriptParams[0], pos, ScriptParams[4] != 0); + CParticleObject::AddObject(GET_INTEGER_PARAM(0), pos, GET_INTEGER_PARAM(4) != 0); return 0; } */ case COMMAND_SWITCH_WIDESCREEN: CollectParameters(&m_nIp, 1); - if (ScriptParams[0] != 0) + if (GET_INTEGER_PARAM(0) != 0) TheCamera.SetWideScreenOn(); else TheCamera.SetWideScreenOff(); @@ -1384,36 +1393,36 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) case COMMAND_ADD_SPRITE_BLIP_FOR_CAR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int id = CRadar::SetEntityBlip(BLIP_CAR, ScriptParams[0], 0, BLIP_DISPLAY_BOTH); - CRadar::SetBlipSprite(id, ScriptParams[1]); - ScriptParams[0] = id; + int id = CRadar::SetEntityBlip(BLIP_CAR, GET_INTEGER_PARAM(0), 0, BLIP_DISPLAY_BOTH); + CRadar::SetBlipSprite(id, GET_INTEGER_PARAM(1)); + SET_INTEGER_PARAM(0, id); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_SPRITE_BLIP_FOR_CHAR: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int id = CRadar::SetEntityBlip(BLIP_CHAR, ScriptParams[0], 1, BLIP_DISPLAY_BOTH); - CRadar::SetBlipSprite(id, ScriptParams[1]); - ScriptParams[0] = id; + int id = CRadar::SetEntityBlip(BLIP_CHAR, GET_INTEGER_PARAM(0), 1, BLIP_DISPLAY_BOTH); + CRadar::SetBlipSprite(id, GET_INTEGER_PARAM(1)); + SET_INTEGER_PARAM(0, id); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_SPRITE_BLIP_FOR_OBJECT: { CollectParameters(&m_nIp, 2); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pObject); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int id = CRadar::SetEntityBlip(BLIP_OBJECT, ScriptParams[0], 6, BLIP_DISPLAY_BOTH); - CRadar::SetBlipSprite(id, ScriptParams[1]); - ScriptParams[0] = id; + int id = CRadar::SetEntityBlip(BLIP_OBJECT, GET_INTEGER_PARAM(0), 6, BLIP_DISPLAY_BOTH); + CRadar::SetBlipSprite(id, GET_INTEGER_PARAM(1)); + SET_INTEGER_PARAM(0, id); StoreParameters(&m_nIp, 1); return 0; } @@ -1421,67 +1430,67 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) case COMMAND_ADD_SPRITE_BLIP_FOR_CONTACT_POINT: { CollectParameters(&m_nIp, 4); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); int id = CRadar::SetCoordBlip(BLIP_CONTACT_POINT, pos, 2, BLIP_DISPLAY_BOTH); - CRadar::SetBlipSprite(id, ScriptParams[3]); - ScriptParams[0] = id; + CRadar::SetBlipSprite(id, GET_INTEGER_PARAM(3)); + SET_INTEGER_PARAM(0, id); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_ADD_SPRITE_BLIP_FOR_COORD: { CollectParameters(&m_nIp, 4); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); int id = CRadar::SetCoordBlip(BLIP_COORD, pos, 5, BLIP_DISPLAY_BOTH); - CRadar::SetBlipSprite(id, ScriptParams[3]); - ScriptParams[0] = id; + CRadar::SetBlipSprite(id, GET_INTEGER_PARAM(3)); + SET_INTEGER_PARAM(0, id); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_CHAR_ONLY_DAMAGED_BY_PLAYER: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - pPed->bOnlyDamagedByPlayer = (ScriptParams[1] != 0); + pPed->bOnlyDamagedByPlayer = (GET_INTEGER_PARAM(1) != 0); return 0; } case COMMAND_SET_CAR_ONLY_DAMAGED_BY_PLAYER: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - pVehicle->bOnlyDamagedByPlayer = (ScriptParams[1] != 0); + pVehicle->bOnlyDamagedByPlayer = (GET_INTEGER_PARAM(1) != 0); return 0; } case COMMAND_SET_CHAR_PROOFS: { CollectParameters(&m_nIp, 6); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - pPed->bBulletProof = (ScriptParams[1] != 0); - pPed->bFireProof = (ScriptParams[2] != 0); - pPed->bExplosionProof = (ScriptParams[3] != 0); - pPed->bCollisionProof = (ScriptParams[4] != 0); - pPed->bMeleeProof = (ScriptParams[5] != 0); + pPed->bBulletProof = (GET_INTEGER_PARAM(1) != 0); + pPed->bFireProof = (GET_INTEGER_PARAM(2) != 0); + pPed->bExplosionProof = (GET_INTEGER_PARAM(3) != 0); + pPed->bCollisionProof = (GET_INTEGER_PARAM(4) != 0); + pPed->bMeleeProof = (GET_INTEGER_PARAM(5) != 0); return 0; } case COMMAND_SET_CAR_PROOFS: { CollectParameters(&m_nIp, 6); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - pVehicle->bBulletProof = (ScriptParams[1] != 0); - pVehicle->bFireProof = (ScriptParams[2] != 0); - pVehicle->bExplosionProof = (ScriptParams[3] != 0); - pVehicle->bCollisionProof = (ScriptParams[4] != 0); - pVehicle->bMeleeProof = (ScriptParams[5] != 0); + pVehicle->bBulletProof = (GET_INTEGER_PARAM(1) != 0); + pVehicle->bFireProof = (GET_INTEGER_PARAM(2) != 0); + pVehicle->bExplosionProof = (GET_INTEGER_PARAM(3) != 0); + pVehicle->bCollisionProof = (GET_INTEGER_PARAM(4) != 0); + pVehicle->bMeleeProof = (GET_INTEGER_PARAM(5) != 0); return 0; } case COMMAND_IS_PLAYER_IN_ANGLED_AREA_2D: @@ -1501,16 +1510,16 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) /* case COMMAND_DEACTIVATE_GARAGE: CollectParameters(&m_nIp, 1); - CGarages::DeActivateGarage(ScriptParams[0]); + CGarages::DeActivateGarage(GET_INTEGER_PARAM(0)); return 0; case COMMAND_GET_NUMBER_OF_CARS_COLLECTED_BY_GARAGE: CollectParameters(&m_nIp, 1); - ScriptParams[0] = CGarages::QueryCarsCollected(ScriptParams[0]); + SET_INTEGER_PARAM(0, CGarages::QueryCarsCollected(GET_INTEGER_PARAM(0))); StoreParameters(&m_nIp, 1); return 0; case COMMAND_HAS_CAR_BEEN_TAKEN_TO_GARAGE: CollectParameters(&m_nIp, 2); - UpdateCompareFlag(CGarages::HasThisCarBeenCollected(ScriptParams[0], ScriptParams[1] - 1)); + UpdateCompareFlag(CGarages::HasThisCarBeenCollected(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1) - 1)); return 0; */ default: @@ -1525,51 +1534,51 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) /* case COMMAND_SET_SWAT_REQUIRED: CollectParameters(&m_nIp, 1); - FindPlayerPed()->m_pWanted->m_bSwatRequired = (ScriptParams[0] != 0); + FindPlayerPed()->m_pWanted->m_bSwatRequired = (GET_INTEGER_PARAM(0) != 0); return 0; case COMMAND_SET_FBI_REQUIRED: CollectParameters(&m_nIp, 1); - FindPlayerPed()->m_pWanted->m_bFbiRequired = (ScriptParams[0] != 0); + FindPlayerPed()->m_pWanted->m_bFbiRequired = (GET_INTEGER_PARAM(0) != 0); return 0; case COMMAND_SET_ARMY_REQUIRED: CollectParameters(&m_nIp, 1); - FindPlayerPed()->m_pWanted->m_bArmyRequired = (ScriptParams[0] != 0); + FindPlayerPed()->m_pWanted->m_bArmyRequired = (GET_INTEGER_PARAM(0) != 0); return 0; */ case COMMAND_IS_CAR_IN_WATER: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); UpdateCompareFlag(pVehicle && pVehicle->bIsInWater); return 0; } case COMMAND_GET_CLOSEST_CHAR_NODE: { CollectParameters(&m_nIp, 3); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CPathNode* pNode = &ThePaths.m_pathNodes[ThePaths.FindNodeClosestToCoors(pos, 1, 999999.9f, true)]; - *(CVector*)&ScriptParams[0] = pNode->GetPosition(); + SET_VECTOR_PARAM(0, pNode->GetPosition()); StoreParameters(&m_nIp, 3); return 0; } case COMMAND_GET_CLOSEST_CAR_NODE: { CollectParameters(&m_nIp, 3); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - *(CVector*)&ScriptParams[0] = ThePaths.FindNodeCoorsForScript(ThePaths.FindNodeClosestToCoors(pos, 0, 999999.9f, true, true)); + SET_VECTOR_PARAM(0, ThePaths.FindNodeCoorsForScript(ThePaths.FindNodeClosestToCoors(pos, 0, 999999.9f, true, true))); StoreParameters(&m_nIp, 3); return 0; } case COMMAND_CAR_GOTO_COORDINATES_ACCURATE: { CollectParameters(&m_nIp, 4); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += pVehicle->GetDistanceFromCentreOfMassToBaseOfModel(); @@ -1586,13 +1595,13 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) /* case COMMAND_START_PACMAN_RACE: CollectParameters(&m_nIp, 1); - CPacManPickups::StartPacManRace(ScriptParams[0]); + CPacManPickups::StartPacManRace(GET_INTEGER_PARAM(0)); return 0; case COMMAND_START_PACMAN_RECORD: CPacManPickups::StartPacManRecord(); return 0; case COMMAND_GET_NUMBER_OF_POWER_PILLS_EATEN: - ScriptParams[0] = CPacManPickups::QueryPowerPillsEatenInRace(); + SET_INTEGER_PARAM(0, CPacManPickups::QueryPowerPillsEatenInRace()); StoreParameters(&m_nIp, 1); return 0; case COMMAND_CLEAR_PACMAN: @@ -1601,14 +1610,14 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_START_PACMAN_SCRAMBLE: { CollectParameters(&m_nIp, 5); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CPacManPickups::StartPacManScramble(pos, *(float*)&ScriptParams[3], ScriptParams[4]); + CPacManPickups::StartPacManScramble(pos, GET_FLOAT_PARAM(3), GET_INTEGER_PARAM(4)); return 0; } case COMMAND_GET_NUMBER_OF_POWER_PILLS_CARRIED: - ScriptParams[0] = CPacManPickups::QueryPowerPillsCarriedByPlayer(); + SET_INTEGER_PARAM(0, CPacManPickups::QueryPowerPillsCarriedByPlayer()); StoreParameters(&m_nIp, 1); return 0; case COMMAND_CLEAR_NUMBER_OF_POWER_PILLS_CARRIED: @@ -1618,7 +1627,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_CAR_ON_SCREEN: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); UpdateCompareFlag(TheCamera.IsSphereVisible(pVehicle->GetBoundCentre(), pVehicle->GetBoundRadius())); return 0; @@ -1626,7 +1635,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_CHAR_ON_SCREEN: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); UpdateCompareFlag(TheCamera.IsSphereVisible(pPed->GetBoundCentre(), pPed->GetBoundRadius())); return 0; @@ -1634,7 +1643,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_OBJECT_ON_SCREEN: { CollectParameters(&m_nIp, 1); - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pObject); UpdateCompareFlag(TheCamera.IsSphereVisible(pObject->GetBoundCentre(), pObject->GetBoundRadius())); return 0; @@ -1644,55 +1653,55 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CollectParameters(&m_nIp, 2); script_assert(m_nStackPointer < MAX_STACK_DEPTH); m_anStack[m_nStackPointer++] = m_nIp; - SetIP(ScriptParams[0]); - // ScriptParams[1] == filename + SetIP(GET_INTEGER_PARAM(0)); + // GET_INTEGER_PARAM(1) == filename return 0; } case COMMAND_GET_GROUND_Z_FOR_3D_COORD: { CollectParameters(&m_nIp, 3); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); bool success; - *(float*)&ScriptParams[0] = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z, &success); + SET_FLOAT_PARAM(0, CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z, &success)); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_START_SCRIPT_FIRE: { CollectParameters(&m_nIp, 3); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - ScriptParams[0] = gFireManager.StartScriptFire(pos, nil, 0.8f, 1); + SET_INTEGER_PARAM(0, gFireManager.StartScriptFire(pos, nil, 0.8f, 1)); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_IS_SCRIPT_FIRE_EXTINGUISHED: CollectParameters(&m_nIp, 1); - UpdateCompareFlag(gFireManager.IsScriptFireExtinguish(ScriptParams[0])); + UpdateCompareFlag(gFireManager.IsScriptFireExtinguish(GET_INTEGER_PARAM(0))); return 0; case COMMAND_REMOVE_SCRIPT_FIRE: CollectParameters(&m_nIp, 1); - gFireManager.RemoveScriptFire(ScriptParams[0]); + gFireManager.RemoveScriptFire(GET_INTEGER_PARAM(0)); return 0; /* case COMMAND_SET_COMEDY_CONTROLS: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - pVehicle->bComedyControls = (ScriptParams[1] != 0); + pVehicle->bComedyControls = (GET_INTEGER_PARAM(1) != 0); return 0; } */ case COMMAND_BOAT_GOTO_COORDS: { CollectParameters(&m_nIp, 4); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); script_assert(pVehicle->m_vehType == VEHICLE_TYPE_BOAT); CBoat* pBoat = (CBoat*)pVehicle; - CVector pos = *(CVector*)&ScriptParams[1]; + CVector pos = GET_VECTOR_PARAM(1); if (pos.z <= MAP_Z_LOW_LIMIT) CWaterLevel::GetWaterLevel(pos.x, pos.y, pos.z, &pos.z, false); pBoat->AutoPilot.m_nCarMission = MISSION_GOTOCOORDS_ASTHECROWSWIMS; @@ -1705,7 +1714,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_BOAT_STOP: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); script_assert(pVehicle->m_vehType == VEHICLE_TYPE_BOAT); CBoat* pBoat = (CBoat*)pVehicle; @@ -1718,14 +1727,14 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_PLAYER_SHOOTING_IN_AREA: { CollectParameters(&m_nIp, 6); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); - float x1 = *(float*)&ScriptParams[1]; - float y1 = *(float*)&ScriptParams[2]; - float x2 = *(float*)&ScriptParams[3]; - float y2 = *(float*)&ScriptParams[4]; + float x1 = GET_FLOAT_PARAM(1); + float y1 = GET_FLOAT_PARAM(2); + float x2 = GET_FLOAT_PARAM(3); + float y2 = GET_FLOAT_PARAM(4); UpdateCompareFlag(pPed->bIsShooting && pPed->IsWithinArea(x1, y1, x2, y2)); - if (ScriptParams[5]) + if (GET_INTEGER_PARAM(5)) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, MAP_Z_LOW_LIMIT); if (CTheScripts::DbgFlag) CTheScripts::DrawDebugSquare(x1, y1, x2, y2); @@ -1734,14 +1743,14 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_CHAR_SHOOTING_IN_AREA: { CollectParameters(&m_nIp, 6); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - float x1 = *(float*)&ScriptParams[1]; - float y1 = *(float*)&ScriptParams[2]; - float x2 = *(float*)&ScriptParams[3]; - float y2 = *(float*)&ScriptParams[4]; + float x1 = GET_FLOAT_PARAM(1); + float y1 = GET_FLOAT_PARAM(2); + float x2 = GET_FLOAT_PARAM(3); + float y2 = GET_FLOAT_PARAM(4); UpdateCompareFlag(pPed->bIsShooting && pPed->IsWithinArea(x1, y1, x2, y2)); - if (ScriptParams[5]) + if (GET_INTEGER_PARAM(5)) CTheScripts::HighlightImportantArea((uintptr)this + m_nIp, x1, y1, x2, y2, MAP_Z_LOW_LIMIT); if (CTheScripts::DbgFlag) CTheScripts::DrawDebugSquare(x1, y1, x2, y2); @@ -1750,17 +1759,17 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_CURRENT_PLAYER_WEAPON: { CollectParameters(&m_nIp, 2); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); - UpdateCompareFlag(ScriptParams[1] == pPed->GetWeapon()->m_eWeaponType); + UpdateCompareFlag(GET_INTEGER_PARAM(1) == pPed->GetWeapon()->m_eWeaponType); return 0; } case COMMAND_IS_CURRENT_CHAR_WEAPON: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - UpdateCompareFlag(ScriptParams[1] == pPed->GetWeapon()->m_eWeaponType); + UpdateCompareFlag(GET_INTEGER_PARAM(1) == pPed->GetWeapon()->m_eWeaponType); return 0; } /* @@ -1770,7 +1779,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_ADD_POWER_PILL: { CollectParameters(&m_nIp, 3); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CPacManPickups::GenerateOnePMPickUp(pos); @@ -1780,11 +1789,11 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_SET_BOAT_CRUISE_SPEED: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); script_assert(pVehicle->m_vehType == VEHICLE_TYPE_BOAT); CBoat* pBoat = (CBoat*)pVehicle; - pBoat->AutoPilot.m_nCruiseSpeed = *(float*)&ScriptParams[1]; + pBoat->AutoPilot.m_nCruiseSpeed = GET_FLOAT_PARAM(1); return 0; } case COMMAND_GET_RANDOM_CHAR_IN_AREA: @@ -1792,10 +1801,10 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CollectParameters(&m_nIp, 7); int ped_handle = -1; CVector pos = FindPlayerCoors(); - float x1 = *(float*)&ScriptParams[0]; - float y1 = *(float*)&ScriptParams[1]; - float x2 = *(float*)&ScriptParams[2]; - float y2 = *(float*)&ScriptParams[3]; + float x1 = GET_FLOAT_PARAM(0); + float y1 = GET_FLOAT_PARAM(1); + float x2 = GET_FLOAT_PARAM(2); + float y2 = GET_FLOAT_PARAM(3); int i = CPools::GetPedPool()->GetSize(); while (--i && ped_handle == -1){ CPed* pPed = CPools::GetPedPool()->GetSlot(i); @@ -1813,7 +1822,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) continue; // if (pPed->GetModelIndex() == MI_SCUM_WOM || pPed->GetModelIndex() == MI_SCUM_MAN) // continue; - if (!ThisIsAValidRandomPed(pPed->m_nPedType, ScriptParams[5], ScriptParams[6], ScriptParams[7])) // TODO + if (!ThisIsAValidRandomPed(pPed->m_nPedType, GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7))) // TODO continue; if (pPed->bIsLeader || pPed->m_leader) continue; @@ -1831,7 +1840,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) if (m_bIsMissionScript) CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR); } - ScriptParams[0] = ped_handle; + SET_INTEGER_PARAM(0, ped_handle); StoreParameters(&m_nIp, 1); return 0; } @@ -1863,7 +1872,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) continue; if (pPed->m_nWaitState != WAITSTATE_FALSE) continue; - if (!ThisIsAValidRandomPed(pPed->m_nPedType, ScriptParams[0], ScriptParams[1], ScriptParams[2])) + if (!ThisIsAValidRandomPed(pPed->m_nPedType, GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2))) continue; if (pPed->bIsLeader || pPed->m_leader) continue; @@ -1885,14 +1894,14 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) if (m_bIsMissionScript) CTheScripts::MissionCleanUp.AddEntityToList(ped_handle, CLEANUP_CHAR); } - ScriptParams[0] = ped_handle; + SET_INTEGER_PARAM(0, ped_handle); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_IS_PLAYER_IN_TAXI: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); UpdateCompareFlag(pPed->bInVehicle && pPed->m_pMyVehicle->IsTaxi()); return 0; @@ -1900,7 +1909,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_PLAYER_SHOOTING: { CollectParameters(&m_nIp, 1); - CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; + CPed* pPed = CWorld::Players[GET_INTEGER_PARAM(0)].m_pPed; script_assert(pPed); UpdateCompareFlag(pPed->bIsShooting); return 0; @@ -1908,7 +1917,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_CHAR_SHOOTING: { CollectParameters(&m_nIp, 1); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); UpdateCompareFlag(pPed->bIsShooting); return 0; @@ -1916,28 +1925,28 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_CREATE_MONEY_PICKUP: { CollectParameters(&m_nIp, 4); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - ScriptParams[0] = CPickups::GenerateNewOne(pos, MI_MONEY, PICKUP_MONEY, ScriptParams[3]); + SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_MONEY, PICKUP_MONEY, GET_INTEGER_PARAM(3))); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_SET_CHAR_ACCURACY: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - pPed->m_wepAccuracy = ScriptParams[1]; + pPed->m_wepAccuracy = GET_INTEGER_PARAM(1); return 0; } case COMMAND_GET_CAR_SPEED: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - *(float*)&ScriptParams[0] = pVehicle->GetSpeed().Magnitude() * GAME_SPEED_TO_METERS_PER_SECOND; + SET_FLOAT_PARAM(0, pVehicle->GetSpeed().Magnitude() * GAME_SPEED_TO_METERS_PER_SECOND); StoreParameters(&m_nIp, 1); return 0; } @@ -1952,8 +1961,8 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_CREATE_CUTSCENE_OBJECT: { CollectParameters(&m_nIp, 1); - CCutsceneObject* pCutObj = CCutsceneMgr::CreateCutsceneObject(ScriptParams[0]); - ScriptParams[0] = CPools::GetObjectPool()->GetIndex(pCutObj); + CCutsceneObject* pCutObj = CCutsceneMgr::CreateCutsceneObject(GET_INTEGER_PARAM(0)); + SET_INTEGER_PARAM(0, CPools::GetObjectPool()->GetIndex(pCutObj)); StoreParameters(&m_nIp, 1); return 0; } @@ -1961,7 +1970,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { CollectParameters(&m_nIp, 1); char name[KEY_LENGTH_IN_SCRIPT]; - CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]); + CObject* pObject = CPools::GetObjectPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pObject); strncpy(name, (const char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); m_nIp += KEY_LENGTH_IN_SCRIPT; @@ -1972,7 +1981,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CCutsceneMgr::ms_cutsceneLoadStatus = 1; return 0; case COMMAND_GET_CUTSCENE_TIME: - ScriptParams[0] = CCutsceneMgr::GetCutsceneTimeInMilleseconds(); + SET_INTEGER_PARAM(0, CCutsceneMgr::GetCutsceneTimeInMilleseconds()); StoreParameters(&m_nIp, 1); return 0; case COMMAND_HAS_CUTSCENE_FINISHED: @@ -1987,7 +1996,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_CREATE_COLLECTABLE1: { CollectParameters(&m_nIp, 3); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; CPickups::GenerateNewOne(pos, MI_COLLECTABLE1, PICKUP_COLLECTABLE1, 0); @@ -1995,29 +2004,29 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) } case COMMAND_SET_COLLECTABLE1_TOTAL: CollectParameters(&m_nIp, 1); - CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages = ScriptParams[0]; + CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages = GET_INTEGER_PARAM(0); return 0; /* case COMMAND_IS_PROJECTILE_IN_AREA: { CollectParameters(&m_nIp, 6); - float infX = *(float*)&ScriptParams[0]; - float infY = *(float*)&ScriptParams[1]; - float infZ = *(float*)&ScriptParams[2]; - float supX = *(float*)&ScriptParams[3]; - float supY = *(float*)&ScriptParams[4]; - float supZ = *(float*)&ScriptParams[5]; + float infX = GET_FLOAT_PARAM(0); + float infY = GET_FLOAT_PARAM(1); + float infZ = GET_FLOAT_PARAM(2); + float supX = GET_FLOAT_PARAM(3); + float supY = GET_FLOAT_PARAM(4); + float supZ = GET_FLOAT_PARAM(5); if (infX > supX) { - infX = *(float*)&ScriptParams[3]; - supX = *(float*)&ScriptParams[0]; + infX = GET_FLOAT_PARAM(3); + supX = GET_FLOAT_PARAM(0); } if (infY > supY) { - infY = *(float*)&ScriptParams[4]; - supY = *(float*)&ScriptParams[1]; + infY = GET_FLOAT_PARAM(4); + supY = GET_FLOAT_PARAM(1); } if (infZ > supZ) { - infZ = *(float*)&ScriptParams[5]; - supZ = *(float*)&ScriptParams[2]; + infZ = GET_FLOAT_PARAM(5); + supZ = GET_FLOAT_PARAM(2); } UpdateCompareFlag(CProjectileInfo::IsProjectileInRange(infX, supX, infY, supY, infZ, supZ, false)); if (CTheScripts::DbgFlag) @@ -2027,23 +2036,23 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_DESTROY_PROJECTILES_IN_AREA: { CollectParameters(&m_nIp, 6); - float infX = *(float*)&ScriptParams[0]; - float infY = *(float*)&ScriptParams[1]; - float infZ = *(float*)&ScriptParams[2]; - float supX = *(float*)&ScriptParams[3]; - float supY = *(float*)&ScriptParams[4]; - float supZ = *(float*)&ScriptParams[5]; + float infX = GET_FLOAT_PARAM(0); + float infY = GET_FLOAT_PARAM(1); + float infZ = GET_FLOAT_PARAM(2); + float supX = GET_FLOAT_PARAM(3); + float supY = GET_FLOAT_PARAM(4); + float supZ = GET_FLOAT_PARAM(5); if (infX > supX) { - infX = *(float*)&ScriptParams[3]; - supX = *(float*)&ScriptParams[0]; + infX = GET_FLOAT_PARAM(3); + supX = GET_FLOAT_PARAM(0); } if (infY > supY) { - infY = *(float*)&ScriptParams[4]; - supY = *(float*)&ScriptParams[1]; + infY = GET_FLOAT_PARAM(4); + supY = GET_FLOAT_PARAM(1); } if (infZ > supZ) { - infZ = *(float*)&ScriptParams[5]; - supZ = *(float*)&ScriptParams[2]; + infZ = GET_FLOAT_PARAM(5); + supZ = GET_FLOAT_PARAM(2); } UpdateCompareFlag(CProjectileInfo::IsProjectileInRange(infX, supX, infY, supY, infZ, supZ, true)); if (CTheScripts::DbgFlag) @@ -2053,7 +2062,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_DROP_MINE: { CollectParameters(&m_nIp, 3); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; CPickups::GenerateNewOne(pos, MI_CARMINE, PICKUP_MINE_INACTIVE, 0); @@ -2062,7 +2071,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_DROP_NAUTICAL_MINE: { CollectParameters(&m_nIp, 3); - CVector pos = *(CVector*)&ScriptParams[0]; + CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; CPickups::GenerateNewOne(pos, MI_NAUTICALMINE, PICKUP_MINE_INACTIVE, 0); @@ -2072,9 +2081,9 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_CHAR_MODEL: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - UpdateCompareFlag(ScriptParams[1] == pPed->GetModelIndex()); + UpdateCompareFlag(GET_INTEGER_PARAM(1) == pPed->GetModelIndex()); return 0; } case COMMAND_LOAD_SPECIAL_MODEL: @@ -2084,7 +2093,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) strncpy(name, (const char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); for (int i = 0; i < KEY_LENGTH_IN_SCRIPT; i++) name[i] = tolower(name[i]); - CStreaming::RequestSpecialModel(ScriptParams[0], name, STREAMFLAGS_DEPENDENCY | STREAMFLAGS_SCRIPTOWNED); + CStreaming::RequestSpecialModel(GET_INTEGER_PARAM(0), name, STREAMFLAGS_DEPENDENCY | STREAMFLAGS_SCRIPTOWNED); m_nIp += KEY_LENGTH_IN_SCRIPT; return 0; } @@ -2092,55 +2101,55 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) //case COMMAND_SET_CUTSCENE_HEAD_ANIM: case COMMAND_SIN: CollectParameters(&m_nIp, 1); - *(float*)&ScriptParams[0] = Sin(DEGTORAD(*(float*)&ScriptParams[0])); + SET_FLOAT_PARAM(0, Sin(DEGTORAD(GET_FLOAT_PARAM(0)))); StoreParameters(&m_nIp, 1); return 0; case COMMAND_COS: CollectParameters(&m_nIp, 1); - *(float*)&ScriptParams[0] = Cos(DEGTORAD(*(float*)&ScriptParams[0])); + SET_FLOAT_PARAM(0, Cos(DEGTORAD(GET_FLOAT_PARAM(0)))); StoreParameters(&m_nIp, 1); return 0; case COMMAND_GET_CAR_FORWARD_X: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); float forwardX = pVehicle->GetForward().x / pVehicle->GetForward().Magnitude2D(); - *(float*)&ScriptParams[0] = forwardX; + SET_FLOAT_PARAM(0, forwardX); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_GET_CAR_FORWARD_Y: { CollectParameters(&m_nIp, 1); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); float forwardY = pVehicle->GetForward().y / pVehicle->GetForward().Magnitude2D(); - *(float*)&ScriptParams[0] = forwardY; + SET_FLOAT_PARAM(0, forwardY); StoreParameters(&m_nIp, 1); return 0; } case COMMAND_CHANGE_GARAGE_TYPE: CollectParameters(&m_nIp, 2); - CGarages::ChangeGarageType(ScriptParams[0], ScriptParams[1], 0); + CGarages::ChangeGarageType(GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), 0); return 0; case COMMAND_ACTIVATE_CRUSHER_CRANE: { CollectParameters(&m_nIp, 10); - float infX = *(float*)&ScriptParams[2]; - float infY = *(float*)&ScriptParams[3]; - float supX = *(float*)&ScriptParams[4]; - float supY = *(float*)&ScriptParams[5]; + float infX = GET_FLOAT_PARAM(2); + float infY = GET_FLOAT_PARAM(3); + float supX = GET_FLOAT_PARAM(4); + float supY = GET_FLOAT_PARAM(5); if (infX > supX) { - infX = *(float*)&ScriptParams[4]; - supX = *(float*)&ScriptParams[2]; + infX = GET_FLOAT_PARAM(4); + supX = GET_FLOAT_PARAM(2); } if (infY > supY) { - infY = *(float*)&ScriptParams[5]; - supY = *(float*)&ScriptParams[3]; + infY = GET_FLOAT_PARAM(5); + supY = GET_FLOAT_PARAM(3); } CCranes::ActivateCrane(infX, supX, infY, supY, - *(float*)&ScriptParams[6], *(float*)&ScriptParams[7], *(float*)&ScriptParams[8], - DEGTORAD(*(float*)&ScriptParams[9]), true, false, - *(float*)&ScriptParams[0], *(float*)&ScriptParams[1]); + GET_FLOAT_PARAM(6), GET_FLOAT_PARAM(7), GET_FLOAT_PARAM(8), + DEGTORAD(GET_FLOAT_PARAM(9)), true, false, + GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1)); return 0; } /* @@ -2148,7 +2157,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 4); - CMessages::AddMessageWithNumber(text, ScriptParams[2], ScriptParams[3], ScriptParams[0], ScriptParams[1], -1, -1, -1, -1); + CMessages::AddMessageWithNumber(text, GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), -1, -1, -1, -1); return 0; } */ @@ -2156,7 +2165,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 4); - CMessages::AddMessageJumpQWithNumber(text, ScriptParams[2], ScriptParams[3], ScriptParams[0], ScriptParams[1], -1, -1, -1, -1); + CMessages::AddMessageJumpQWithNumber(text, GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), -1, -1, -1, -1); return 0; } /* @@ -2164,7 +2173,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 4); - CMessages::AddMessageSoonWithNumber(text, ScriptParams[2], ScriptParams[3], ScriptParams[0], ScriptParams[1], -1, -1, -1, -1); + CMessages::AddMessageSoonWithNumber(text, GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), -1, -1, -1, -1); return 0; } */ @@ -2172,7 +2181,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 5); - CMessages::AddMessageWithNumber(text, ScriptParams[3], ScriptParams[4], ScriptParams[0], ScriptParams[1], ScriptParams[2], -1, -1, -1); + CMessages::AddMessageWithNumber(text, GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), -1, -1, -1); return 0; } /* @@ -2180,14 +2189,14 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 5); - CMessages::AddMessageJumpQWithNumber(text, ScriptParams[3], ScriptParams[4], ScriptParams[0], ScriptParams[1], ScriptParams[2], -1, -1, -1); + CMessages::AddMessageJumpQWithNumber(text, GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), -1, -1, -1); return 0; } case COMMAND_PRINT_WITH_3_NUMBERS_SOON: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 5); - CMessages::AddMessageSoonWithNumber(text, ScriptParams[3], ScriptParams[4], ScriptParams[0], ScriptParams[1], ScriptParams[2], -1, -1, -1); + CMessages::AddMessageSoonWithNumber(text, GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), -1, -1, -1); return 0; } */ @@ -2195,7 +2204,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 6); - CMessages::AddMessageWithNumber(text, ScriptParams[4], ScriptParams[5], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], -1, -1); + CMessages::AddMessageWithNumber(text, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), -1, -1); return 0; } /* @@ -2203,35 +2212,35 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 6); - CMessages::AddMessageJumpQWithNumber(text, ScriptParams[4], ScriptParams[5], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], -1, -1); + CMessages::AddMessageJumpQWithNumber(text, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), -1, -1); return 0; } case COMMAND_PRINT_WITH_4_NUMBERS_SOON: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 6); - CMessages::AddMessageSoonWithNumber(text, ScriptParams[4], ScriptParams[5], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], -1, -1); + CMessages::AddMessageSoonWithNumber(text, GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), -1, -1); return 0; } case COMMAND_PRINT_WITH_5_NUMBERS: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 7); - CMessages::AddMessageWithNumber(text, ScriptParams[5], ScriptParams[6], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], ScriptParams[4], -1); + CMessages::AddMessageWithNumber(text, GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), -1); return 0; } case COMMAND_PRINT_WITH_5_NUMBERS_NOW: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 7); - CMessages::AddMessageJumpQWithNumber(text, ScriptParams[5], ScriptParams[6], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], ScriptParams[4], -1); + CMessages::AddMessageJumpQWithNumber(text, GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), -1); return 0; } case COMMAND_PRINT_WITH_5_NUMBERS_SOON: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 7); - CMessages::AddMessageSoonWithNumber(text, ScriptParams[5], ScriptParams[6], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], ScriptParams[4], -1); + CMessages::AddMessageSoonWithNumber(text, GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), -1); return 0; } */ @@ -2239,7 +2248,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 8); - CMessages::AddMessageWithNumber(text, ScriptParams[6], ScriptParams[7], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], ScriptParams[4], ScriptParams[5]); + CMessages::AddMessageWithNumber(text, GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5)); return 0; } /* @@ -2247,71 +2256,71 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 8); - CMessages::AddMessageJumpQWithNumber(text, ScriptParams[6], ScriptParams[7], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], ScriptParams[4], ScriptParams[5]); + CMessages::AddMessageJumpQWithNumber(text, GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5)); return 0; } case COMMAND_PRINT_WITH_6_NUMBERS_SOON: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); CollectParameters(&m_nIp, 8); - CMessages::AddMessageSoonWithNumber(text, ScriptParams[6], ScriptParams[7], ScriptParams[0], ScriptParams[1], ScriptParams[2], ScriptParams[3], ScriptParams[4], ScriptParams[5]); + CMessages::AddMessageSoonWithNumber(text, GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5)); return 0; } case COMMAND_SET_CHAR_OBJ_FOLLOW_CHAR_IN_FORMATION: { CollectParameters(&m_nIp, 3); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - CPed* pTargetPed = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CPed* pTargetPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); pPed->bScriptObjectiveCompleted = false; pPed->SetObjective(OBJECTIVE_FOLLOW_CHAR_IN_FORMATION, pTargetPed); - pPed->SetFormation((eFormation)ScriptParams[2]); + pPed->SetFormation((eFormation)GET_INTEGER_PARAM(2)); return 0; } */ case COMMAND_PLAYER_MADE_PROGRESS: CollectParameters(&m_nIp, 1); - CStats::ProgressMade += ScriptParams[0]; + CStats::ProgressMade += GET_INTEGER_PARAM(0); return 0; case COMMAND_SET_PROGRESS_TOTAL: CollectParameters(&m_nIp, 1); - CStats::TotalProgressInGame = ScriptParams[0]; + CStats::TotalProgressInGame = GET_INTEGER_PARAM(0); if (CGame::germanGame) CStats::TotalProgressInGame -= 2; return 0; case COMMAND_REGISTER_JUMP_DISTANCE: CollectParameters(&m_nIp, 1); - CStats::MaximumJumpDistance = Max(CStats::MaximumJumpDistance, *(float*)&ScriptParams[0]); + CStats::MaximumJumpDistance = Max(CStats::MaximumJumpDistance, GET_FLOAT_PARAM(0)); return 0; case COMMAND_REGISTER_JUMP_HEIGHT: CollectParameters(&m_nIp, 1); - CStats::MaximumJumpHeight = Max(CStats::MaximumJumpHeight, *(float*)&ScriptParams[0]); + CStats::MaximumJumpHeight = Max(CStats::MaximumJumpHeight, GET_FLOAT_PARAM(0)); return 0; case COMMAND_REGISTER_JUMP_FLIPS: CollectParameters(&m_nIp, 1); - CStats::MaximumJumpFlips = Max(CStats::MaximumJumpFlips, ScriptParams[0]); + CStats::MaximumJumpFlips = Max(CStats::MaximumJumpFlips, GET_INTEGER_PARAM(0)); return 0; case COMMAND_REGISTER_JUMP_SPINS: CollectParameters(&m_nIp, 1); - CStats::MaximumJumpSpins = Max(CStats::MaximumJumpSpins, ScriptParams[0]); + CStats::MaximumJumpSpins = Max(CStats::MaximumJumpSpins, GET_INTEGER_PARAM(0)); return 0; case COMMAND_REGISTER_JUMP_STUNT: CollectParameters(&m_nIp, 1); - CStats::BestStuntJump = Max(CStats::BestStuntJump, ScriptParams[0]); + CStats::BestStuntJump = Max(CStats::BestStuntJump, GET_INTEGER_PARAM(0)); return 0; case COMMAND_REGISTER_UNIQUE_JUMP_FOUND: ++CStats::NumberOfUniqueJumpsFound; return 0; case COMMAND_SET_UNIQUE_JUMPS_TOTAL: CollectParameters(&m_nIp, 1); - CStats::TotalNumberOfUniqueJumps = ScriptParams[0]; + CStats::TotalNumberOfUniqueJumps = GET_INTEGER_PARAM(0); return 0; case COMMAND_REGISTER_PASSENGER_DROPPED_OFF_TAXI: ++CStats::PassengersDroppedOffWithTaxi; return 0; case COMMAND_REGISTER_MONEY_MADE_TAXI: CollectParameters(&m_nIp, 1); - CStats::MoneyMadeWithTaxi += ScriptParams[0]; + CStats::MoneyMadeWithTaxi += GET_INTEGER_PARAM(0); return 0; case COMMAND_REGISTER_MISSION_GIVEN: ++CStats::MissionsGiven; @@ -2331,9 +2340,9 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_SET_CHAR_RUNNING: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - pPed->bIsRunning = (ScriptParams[1] != 0); + pPed->bIsRunning = (GET_INTEGER_PARAM(1) != 0); return 0; } case COMMAND_REMOVE_ALL_SCRIPT_FIRES: @@ -2343,32 +2352,32 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_FIRST_CAR_COLOUR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - UpdateCompareFlag(pVehicle->m_currentColour1 == ScriptParams[1]); + UpdateCompareFlag(pVehicle->m_currentColour1 == GET_INTEGER_PARAM(1)); return 0; } case COMMAND_IS_SECOND_CAR_COLOUR: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - UpdateCompareFlag(pVehicle->m_currentColour2 == ScriptParams[1]); + UpdateCompareFlag(pVehicle->m_currentColour2 == GET_INTEGER_PARAM(1)); return 0; } */ case COMMAND_HAS_CHAR_BEEN_DAMAGED_BY_WEAPON: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); bool result = false; if (!pPed) printf("HAS_CHAR_BEEN_DAMAGED_BY_WEAPON - Character doesn't exist\n"); else { - if (ScriptParams[1] == WEAPONTYPE_ANYMELEE || ScriptParams[1] == WEAPONTYPE_ANYWEAPON) - result = CheckDamagedWeaponType(pPed->m_lastWepDam, ScriptParams[1]); + if (GET_INTEGER_PARAM(1) == WEAPONTYPE_ANYMELEE || GET_INTEGER_PARAM(1) == WEAPONTYPE_ANYWEAPON) + result = CheckDamagedWeaponType(pPed->m_lastWepDam, GET_INTEGER_PARAM(1)); else - result = ScriptParams[1] == pPed->m_lastWepDam; + result = GET_INTEGER_PARAM(1) == pPed->m_lastWepDam; } UpdateCompareFlag(result); return 0; @@ -2376,15 +2385,15 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_HAS_CAR_BEEN_DAMAGED_BY_WEAPON: { CollectParameters(&m_nIp, 2); - CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); + CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); bool result = false; if (!pVehicle) printf("HAS_CAR_BEEN_DAMAGED_BY_WEAPON - Vehicle doesn't exist\n"); else { - if (ScriptParams[1] == WEAPONTYPE_ANYMELEE || ScriptParams[1] == WEAPONTYPE_ANYWEAPON) - result = CheckDamagedWeaponType(pVehicle->m_nLastWeaponDamage, ScriptParams[1]); + if (GET_INTEGER_PARAM(1) == WEAPONTYPE_ANYMELEE || GET_INTEGER_PARAM(1) == WEAPONTYPE_ANYWEAPON) + result = CheckDamagedWeaponType(pVehicle->m_nLastWeaponDamage, GET_INTEGER_PARAM(1)); else - result = ScriptParams[1] == pVehicle->m_nLastWeaponDamage; + result = GET_INTEGER_PARAM(1) == pVehicle->m_nLastWeaponDamage; } UpdateCompareFlag(result); return 0; @@ -2392,8 +2401,8 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_IS_CHAR_IN_CHARS_GROUP: { CollectParameters(&m_nIp, 2); - CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); - CPed* pLeader = CPools::GetPedPool()->GetAt(ScriptParams[1]); + CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); + CPed* pLeader = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); script_assert(pPed); script_assert(pLeader); UpdateCompareFlag(pPed->m_leader == pLeader); diff --git a/src/core/Streaming.h b/src/core/Streaming.h index 31786dfb..66262721 100644 --- a/src/core/Streaming.h +++ b/src/core/Streaming.h @@ -17,6 +17,8 @@ enum StreamFlags STREAMFLAGS_PRIORITY = 0x08, STREAMFLAGS_NOFADE = 0x10, STREAMFLAGS_20 = 0x20, // TODO(MIAMI): what's this + STREAMFLAGS_40 = 0x40, // TODO(LCS): what's this + STREAMFLAGS_AMBIENT_SCRIPT_OWNED = 0x80, STREAMFLAGS_CANT_REMOVE = STREAMFLAGS_DONT_REMOVE|STREAMFLAGS_SCRIPTOWNED, STREAMFLAGS_KEEP_IN_MEMORY = STREAMFLAGS_DONT_REMOVE|STREAMFLAGS_SCRIPTOWNED|STREAMFLAGS_DEPENDENCY, diff --git a/src/peds/Ped.h b/src/peds/Ped.h index aa9f4f80..573d8083 100644 --- a/src/peds/Ped.h +++ b/src/peds/Ped.h @@ -521,7 +521,13 @@ public: uint32 bCollectBusFare : 1; uint32 bBoughtIceCream : 1; uint32 bDonePositionOutOfCollision : 1; - uint32 bCanAttackPlayerWithCops : 1; + + uint32 bCanAttackPlayerWithCops : 1; // 1A1_1 on PS2 + uint32 b1A1_2 : 1; + uint32 b1A1_4 : 1; + uint32 b1A1_8 : 1; + uint32 b1A1_10 : 1; + uint32 b1A1_20 : 1; // our own flags uint32 m_ped_flagI80 : 1; // KANGAROO_CHEAT define makes use of this as cheat toggle diff --git a/src/render/Weather.cpp b/src/render/Weather.cpp index 17c45fcd..6d4920b5 100644 --- a/src/render/Weather.cpp +++ b/src/render/Weather.cpp @@ -51,6 +51,10 @@ float CWeather::WindClipped; float CWeather::TrafficLightBrightness; bool CWeather::bScriptsForceRain; +float CWeather::Stored_InterpolationValue; +int16 CWeather::Stored_OldWeatherType; +int16 CWeather::Stored_NewWeatherType; +float CWeather::Stored_Rain; tRainStreak Streaks[NUM_RAIN_STREAKS]; @@ -647,3 +651,23 @@ void CWeather::RenderRainStreaks(void) TempBufferVerticesStored = 0; TempBufferIndicesStored = 0; } + +void CWeather::StoreWeatherState() +{ + Stored_StateStored = true; + Stored_InterpolationValue = InterpolationValue; + Stored_Rain = Rain; + Stored_NewWeatherType = NewWeatherType; + Stored_OldWeatherType = OldWeatherType; +} + +void CWeather::RestoreWeatherState() +{ +#ifdef FIX_BUGS // it's not used anyway though + Stored_StateStored = false; +#endif + InterpolationValue = Stored_InterpolationValue; + Rain = Stored_Rain; + NewWeatherType = Stored_NewWeatherType; + OldWeatherType = Stored_OldWeatherType; +} diff --git a/src/render/Weather.h b/src/render/Weather.h index ef62ebb6..da88168d 100644 --- a/src/render/Weather.h +++ b/src/render/Weather.h @@ -42,6 +42,11 @@ public: static float TrafficLightBrightness; static bool bScriptsForceRain; + static bool Stored_StateStored; + static float Stored_InterpolationValue; + static int16 Stored_OldWeatherType; + static int16 Stored_NewWeatherType; + static float Stored_Rain; static void RenderRainStreaks(void); static void Update(void); @@ -55,6 +60,9 @@ public: static void AddRain(); static void AddHeatHaze(); static void AddBeastie(); + + static void StoreWeatherState(); + static void RestoreWeatherState(); }; enum { From 81b5e66dd40fd9e14cb52e71859c9383e89f7d09 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Mon, 11 Jan 2021 17:18:25 +0300 Subject: [PATCH 47/68] fixes --- src/control/Script.cpp | 8 ++++---- src/control/Script3.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 1bbed8b1..3566e0a6 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -284,12 +284,12 @@ const tScriptCommandData commands[] = { REGISTER_COMMAND(COMMAND_SET_LVAR_INT_TO_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " ="), REGISTER_COMMAND(COMMAND_CSET_VAR_INT_TO_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), REGISTER_COMMAND(COMMAND_CSET_VAR_FLOAT_TO_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), - REGISTER_COMMAND(COMMAND_CSET_LVAR_INT_TO_LVAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), - REGISTER_COMMAND(COMMAND_CSET_LVAR_FLOAT_TO_LVAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), + REGISTER_COMMAND(COMMAND_CSET_LVAR_INT_TO_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, 0, " =#"), + REGISTER_COMMAND(COMMAND_CSET_LVAR_FLOAT_TO_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, 0, " =#"), REGISTER_COMMAND(COMMAND_CSET_VAR_INT_TO_LVAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), REGISTER_COMMAND(COMMAND_CSET_VAR_FLOAT_TO_LVAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), - REGISTER_COMMAND(COMMAND_CSET_LVAR_INT_TO_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), - REGISTER_COMMAND(COMMAND_CSET_LVAR_FLOAT_TO_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " =#"), + REGISTER_COMMAND(COMMAND_CSET_LVAR_INT_TO_LVAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_INT, ARGTYPE_FLOAT, ), OUTPUT_ARGUMENTS(), false, 0, " =#"), + REGISTER_COMMAND(COMMAND_CSET_LVAR_FLOAT_TO_LVAR_INT, INPUT_ARGUMENTS(ARGTYPE_FLOAT, ARGTYPE_INT, ), OUTPUT_ARGUMENTS(), false, 0, " =#"), REGISTER_COMMAND(COMMAND_ABS_VAR_INT, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), REGISTER_COMMAND(COMMAND_ABS_LVAR_INT, INPUT_ARGUMENTS(ARGTYPE_INT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), REGISTER_COMMAND(COMMAND_ABS_VAR_FLOAT, INPUT_ARGUMENTS(ARGTYPE_FLOAT,), OUTPUT_ARGUMENTS(), false, 0, " ABS"), diff --git a/src/control/Script3.cpp b/src/control/Script3.cpp index 7476d8de..67d6fdda 100644 --- a/src/control/Script3.cpp +++ b/src/control/Script3.cpp @@ -816,7 +816,7 @@ int8 CRunningScript::ProcessCommands500To599(int32 command) if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CCoronas::RegisterCorona((uintptr)this + m_nIp, ScriptParams[6], ScriptParams[7], ScriptParams[8], - 255, pos, *(float*)&ScriptParams[3], 150.0f, ScriptParams[4], ScriptParams[5], 1, 0, 0, 0.0f); + 255, pos, *(float*)&ScriptParams[3], 450.0f, ScriptParams[4], ScriptParams[5], 1, 0, 0, 0.0f); return 0; } case COMMAND_DRAW_LIGHT: From a214d0ed4c0f0aadc6237eb0af19a24f8d73ea25 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Mon, 11 Jan 2021 17:25:51 +0300 Subject: [PATCH 48/68] fix --- src/render/Weather.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/render/Weather.cpp b/src/render/Weather.cpp index 6d4920b5..dba9ed14 100644 --- a/src/render/Weather.cpp +++ b/src/render/Weather.cpp @@ -51,6 +51,7 @@ float CWeather::WindClipped; float CWeather::TrafficLightBrightness; bool CWeather::bScriptsForceRain; +bool CWeather::Stored_StateStored; float CWeather::Stored_InterpolationValue; int16 CWeather::Stored_OldWeatherType; int16 CWeather::Stored_NewWeatherType; From 4a8a1af8858edeef949d8f2ecbd25d3c93ccd042 Mon Sep 17 00:00:00 2001 From: withmorten Date: Mon, 11 Jan 2021 18:42:54 +0100 Subject: [PATCH 49/68] fix CPed struct, GetWantedLevel --- src/core/Wanted.h | 1 + src/peds/Ped.h | 7 ++++++- src/vehicles/Automobile.cpp | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/core/Wanted.h b/src/core/Wanted.h index 057b5407..f2da23e3 100644 --- a/src/core/Wanted.h +++ b/src/core/Wanted.h @@ -41,6 +41,7 @@ public: int32 NumOfHelisRequired(); void SetWantedLevel(int32); void SetWantedLevelNoDrop(int32 level); + int32 GetWantedLevel() { return m_nWantedLevel; } void CheatWantedLevel(int32 level); void RegisterCrime(eCrimeType type, const CVector &coors, uint32 id, bool policeDoesntCare); void RegisterCrime_Immediately(eCrimeType type, const CVector &coors, uint32 id, bool policeDoesntCare); diff --git a/src/peds/Ped.h b/src/peds/Ped.h index 6c0d9987..7798483f 100644 --- a/src/peds/Ped.h +++ b/src/peds/Ped.h @@ -492,10 +492,15 @@ public: uint32 bDonePositionOutOfCollision : 1; uint32 bCanAttackPlayerWithCops : 1; +#ifdef KANGAROO_CHEAT // our own flags uint32 m_ped_flagI80 : 1; // KANGAROO_CHEAT define makes use of this as cheat toggle +#endif uint8 m_gangFlags; + uint8 m_unused15D; // these 3 can't be padding but had to actually have been members ... + uint8 m_unused15E; + uint8 m_unused15F; uint8 CharCreatedBy; eObjective m_objective; eObjective m_prevObjective; @@ -536,7 +541,7 @@ public: uint32 m_pathNodeTimer; CPathNode m_pathNodeObjPool[8]; CPathNode* m_pCurPathNode; - char m_nPathDir; + int8 m_nPathDir; CPathNode* m_pLastPathNode; CPathNode* m_pNextPathNode; CVector m_followPathDestPos; diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp index 3a0121ec..65e3f313 100644 --- a/src/vehicles/Automobile.cpp +++ b/src/vehicles/Automobile.cpp @@ -288,7 +288,7 @@ CAutomobile::ProcessControl(void) // Improve grip of vehicles in certain cases bool strongGrip1 = false; bool strongGrip2 = false; - if(FindPlayerVehicle() && this != FindPlayerVehicle() && FindPlayerPed()->m_pWanted->m_nWantedLevel > 3 && + if(FindPlayerVehicle() && this != FindPlayerVehicle() && FindPlayerPed()->m_pWanted->GetWantedLevel() > 3 && (AutoPilot.m_nCarMission == MISSION_RAMPLAYER_FARAWAY || AutoPilot.m_nCarMission == MISSION_RAMPLAYER_CLOSE || AutoPilot.m_nCarMission == MISSION_BLOCKPLAYER_FARAWAY || AutoPilot.m_nCarMission == MISSION_BLOCKPLAYER_CLOSE) && FindPlayerSpeed().Magnitude() > 0.3f){ From c7052b3d6f39264177e5af9c8ea2290d49ceaf72 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Mon, 11 Jan 2021 20:51:18 +0300 Subject: [PATCH 50/68] fuck --- src/control/CarCtrl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/CarCtrl.cpp b/src/control/CarCtrl.cpp index 1023f2a3..6f47db05 100644 --- a/src/control/CarCtrl.cpp +++ b/src/control/CarCtrl.cpp @@ -2930,7 +2930,7 @@ void CCarCtrl::SteerAICarWithPhysicsHeadingForTarget(CVehicle* pVehicle, CPhysic *pHandbrake = true; float maxAngle = FindMaxSteerAngle(pVehicle); steerAngle = Min(maxAngle, Max(-maxAngle, steerAngle)); - float speedMultiplier = FindSpeedMultiplier(angleToTarget - angleForward, + float speedMultiplier = FindSpeedMultiplier(CGeneral::GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y) - angleForward, MIN_ANGLE_FOR_SPEED_LIMITING, MAX_ANGLE_FOR_SPEED_LIMITING, MIN_LOWERING_SPEED_COEFFICIENT); float speedTarget = pVehicle->AutoPilot.m_nCruiseSpeed * speedMultiplier; float currentSpeed = pVehicle->GetMoveSpeed().Magnitude() * GAME_SPEED_TO_CARAI_SPEED; From a223157000fac3ba63699f04bc9e466f53a412e3 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Mon, 11 Jan 2021 19:53:15 +0200 Subject: [PATCH 51/68] CutsceneMgr done + use original VB audio + make interiors visible + use hashed model info names a bit --- src/animation/AnimBlendAssocGroup.cpp | 74 +- src/animation/AnimBlendAssocGroup.h | 1 + src/animation/CutsceneMgr.cpp | 677 +++---------- src/animation/CutsceneMgr.h | 128 ++- src/animation/CutsceneMgr_overlay.cpp | 1029 ++++++++++++++++++++ src/audio/AudioLogic.cpp | 30 +- src/audio/MusicManager.cpp | 8 +- src/audio/audio_enums.h | 1278 ++---------------------- src/audio/sampman.h | 1283 ++----------------------- src/audio/sampman_miles.cpp | 12 +- src/audio/sampman_oal.cpp | 2 +- src/collision/TempColModels.cpp | 2 +- src/collision/TempColModels.h | 2 +- src/control/Script3.cpp | 2 +- src/control/Script5.cpp | 24 +- src/control/Script7.cpp | 2 +- src/control/Script8.cpp | 2 +- src/core/Game.h | 2 +- src/core/Streaming.cpp | 93 +- src/core/common.h | 1 + src/core/config.h | 2 +- src/core/main.cpp | 4 + src/core/main.h | 4 + src/fakerw/fake.cpp | 2 +- src/modelinfo/BaseModelInfo.cpp | 12 + src/modelinfo/BaseModelInfo.h | 11 +- src/modelinfo/ModelInfo.cpp | 7 +- src/objects/CutsceneObject.cpp | 7 +- src/render/Hud.cpp | 2 +- src/render/Hud.h | 3 +- src/text/Messages.cpp | 9 + src/text/Messages.h | 1 + 32 files changed, 1588 insertions(+), 3128 deletions(-) create mode 100644 src/animation/CutsceneMgr_overlay.cpp diff --git a/src/animation/AnimBlendAssocGroup.cpp b/src/animation/AnimBlendAssocGroup.cpp index df47e9b5..ea6dea3e 100644 --- a/src/animation/AnimBlendAssocGroup.cpp +++ b/src/animation/AnimBlendAssocGroup.cpp @@ -14,6 +14,7 @@ #include "RpAnimBlend.h" #include "AnimBlendAssociation.h" #include "AnimBlendAssocGroup.h" +#include "KeyGen.h" //--MIAMI: file done @@ -109,27 +110,34 @@ strcmpIgnoringDigits(const char *s1, const char *s2) } } +extern const char* csPlayerNames[]; +extern const char* playerNames[]; + CBaseModelInfo* GetModelFromName(const char *name) { int i; - CBaseModelInfo *mi; - char playername[32]; - - if(strncasecmp(name, "CSplay", 6) == 0 && - strncasecmp(CModelInfo::GetModelInfo(MI_PLAYER)->GetModelName(), "ig", 2) == 0){ - strcpy(playername, CModelInfo::GetModelInfo(MI_PLAYER)->GetModelName()); - playername[0] = 'C'; - playername[1] = 'S'; - name = playername; + CBaseModelInfo* mi; + if (CKeyGen::GetUppercaseKey(name) == CKeyGen::GetUppercaseKey("cstoni_a")) { + i = 0; + while (csPlayerNames[i][0] != '\0') { + if (CModelInfo::GetModelInfo(0)->GetNameHashKey() == CKeyGen::GetUppercaseKey(playerNames[i])) { + name = csPlayerNames[i]; + break; + } + i++; + } } - for(i = 0; i < MODELINFOSIZE; i++){ + uint32 hashKey = CKeyGen::GetUppercaseKey(name); + for (i = 0; i < MODELINFOSIZE; i++) { mi = CModelInfo::GetModelInfo(i); - if(mi && mi->GetRwObject() && RwObjectGetType(mi->GetRwObject()) == rpCLUMP && - strcmpIgnoringDigits(mi->GetModelName(), name)) + if (mi && mi->GetRwObject() + && RwObjectGetType(mi->GetRwObject()) == rpCLUMP && + hashKey == mi->GetNameHashKey()) return mi; } + return nil; } @@ -183,3 +191,45 @@ CAnimBlendAssocGroup::CreateAssociations(const char *blockName, RpClump *clump, } numAssociations = numAssocs; } + +void +CAnimBlendAssocGroup::CreateAssociations(const char *blockName, const char *animNames, const char *objectNames, int numChars) +{ + if (!objectNames) { + CreateAssociations(blockName); + return; + } + + if (assocList) + DestroyAssociations(); + + animBlock = CAnimManager::GetAnimationBlock(blockName); + assocList = new CAnimBlendAssociation[animBlock->numAnims]; + + numAssociations = 0; + if (animBlock->numAnims > 0) + { + int i, j; + for (i = 0; i < animBlock->numAnims; i++) { + int animId = -1; + for (j = 0; j != animBlock->numAnims; j++) + if (strcmp(CAnimManager::GetAnimation(i + animBlock->firstIndex)->name, animNames + numChars * j) == 0) + animId = j; + + if (animId != -1) { + CBaseModelInfo* minfo = GetModelFromName(objectNames + numChars * animId); + if (minfo) + { + RpClump* clump = (RpClump*)minfo->CreateInstance(); + RpAnimBlendClumpInit(clump); + assocList[numAssociations].Init(clump, CAnimManager::GetAnimation(i + animBlock->firstIndex)); + if (IsClumpSkinned(clump)) + RpClumpForAllAtomics(clump, AtomicRemoveAnimFromSkinCB, nil); + RpClumpDestroy(clump); + assocList[numAssociations].animId = i + numAssociations; + assocList[numAssociations++].groupId = groupId; + } + } + } + } +} \ No newline at end of file diff --git a/src/animation/AnimBlendAssocGroup.h b/src/animation/AnimBlendAssocGroup.h index 86f0ca18..e264787e 100644 --- a/src/animation/AnimBlendAssocGroup.h +++ b/src/animation/AnimBlendAssocGroup.h @@ -21,4 +21,5 @@ public: CAnimBlendAssociation *CopyAnimation(const char *name); void CreateAssociations(const char *name); void CreateAssociations(const char *blockName, RpClump *clump, const char **animNames, int numAssocs); + void CreateAssociations(const char *blockName, const char *animNames, const char *objectNames, int numChars); }; diff --git a/src/animation/CutsceneMgr.cpp b/src/animation/CutsceneMgr.cpp index 88c73661..583cf9d5 100644 --- a/src/animation/CutsceneMgr.cpp +++ b/src/animation/CutsceneMgr.cpp @@ -25,153 +25,52 @@ //--MIAMI: file done -const struct { - const char *szTrackName; - int iTrackId; -} musicNameIdAssoc[] = { - { "ASS_1", STREAMED_SOUND_CUTSCENE_ASS_1 }, - { "ASS_2", STREAMED_SOUND_CUTSCENE_ASS_2 }, - { "BANK_1", STREAMED_SOUND_CUTSCENE_BANK_1 }, - { "BANK_2A", STREAMED_SOUND_CUTSCENE_BANK_2A }, - { "BANK_2B", STREAMED_SOUND_CUTSCENE_BANK_2B }, - { "BANK_3A", STREAMED_SOUND_CUTSCENE_BANK_3A }, - { "BANK_3B", STREAMED_SOUND_CUTSCENE_BANK_3B }, - { "BANK_4", STREAMED_SOUND_CUTSCENE_BANK_4 }, - { "BIKE_1", STREAMED_SOUND_CUTSCENE_BIKE_1 }, - { "BIKE_2", STREAMED_SOUND_CUTSCENE_BIKE_2 }, - { "BIKE_3", STREAMED_SOUND_CUTSCENE_BIKE_3 }, - { "BUD_1", STREAMED_SOUND_CUTSCENE_BUD_1 }, - { "BUD_2", STREAMED_SOUND_CUTSCENE_BUD_2 }, - { "BUD_3", STREAMED_SOUND_CUTSCENE_BUD_3 }, - { "CAP_1", STREAMED_SOUND_CUTSCENE_CAP_1 }, - { "CAR_1", STREAMED_SOUND_CUTSCENE_CAR_1 }, - { "CNT_1A", STREAMED_SOUND_CUTSCENE_CNT_1A }, - { "CNT_1B", STREAMED_SOUND_CUTSCENE_CNT_1B }, - { "CNT_2", STREAMED_SOUND_CUTSCENE_CNT_2 }, - { "COK_1", STREAMED_SOUND_CUTSCENE_COK_1 }, - { "COK_2A", STREAMED_SOUND_CUTSCENE_COK_2A }, - { "COK_2B", STREAMED_SOUND_CUTSCENE_COK_2B }, - { "COK_3", STREAMED_SOUND_CUTSCENE_COK_3 }, - { "COK_4A", STREAMED_SOUND_CUTSCENE_COK_4A }, - { "COK_4A2", STREAMED_SOUND_CUTSCENE_COK_4A2 }, - { "COK_4B", STREAMED_SOUND_CUTSCENE_COK_4B }, - { "COL_1", STREAMED_SOUND_CUTSCENE_COL_1 }, - { "COL_2", STREAMED_SOUND_CUTSCENE_COL_2 }, - { "COL_3A", STREAMED_SOUND_CUTSCENE_COL_3A }, - { "COL_4A", STREAMED_SOUND_CUTSCENE_COL_4A }, - { "COL_5A", STREAMED_SOUND_CUTSCENE_COL_5A }, - { "COL_5B", STREAMED_SOUND_CUTSCENE_COL_5B }, - { "CUB_1", STREAMED_SOUND_CUTSCENE_CUB_1 }, - { "CUB_2", STREAMED_SOUND_CUTSCENE_CUB_2 }, - { "CUB_3", STREAMED_SOUND_CUTSCENE_CUB_3 }, - { "CUB_4", STREAMED_SOUND_CUTSCENE_CUB_4 }, - { "DRUG_1", STREAMED_SOUND_CUTSCENE_DRUG_1 }, - { "FIN", STREAMED_SOUND_CUTSCENE_FIN }, - { "FIN_2", STREAMED_SOUND_CUTSCENE_FIN2 }, - { "FINALE", STREAMED_SOUND_CUTSCENE_FINALE }, - { "HAT_1", STREAMED_SOUND_CUTSCENE_HAT_1 }, - { "HAT_2", STREAMED_SOUND_CUTSCENE_HAT_2 }, - { "HAT_3", STREAMED_SOUND_CUTSCENE_HAT_3 }, - { "ICE_1", STREAMED_SOUND_CUTSCENE_ICE_1 }, - { "INT_A", STREAMED_SOUND_CUTSCENE_INT_A }, - { "INT_B", STREAMED_SOUND_CUTSCENE_INT_B }, - { "INT_D", STREAMED_SOUND_CUTSCENE_INT_D }, - { "INT_M", STREAMED_SOUND_CUTSCENE_INT_M }, - { "LAW_1A", STREAMED_SOUND_CUTSCENE_LAW_1A }, - { "LAW_1B", STREAMED_SOUND_CUTSCENE_LAW_1B }, - { "LAW_2A", STREAMED_SOUND_CUTSCENE_LAW_2A }, - { "LAW_2B", STREAMED_SOUND_CUTSCENE_LAW_2B }, - { "LAW_2C", STREAMED_SOUND_CUTSCENE_LAW_2C }, - { "LAW_3", STREAMED_SOUND_CUTSCENE_LAW_3 }, - { "LAW_4", STREAMED_SOUND_CUTSCENE_LAW_4 }, - { "PHIL_1", STREAMED_SOUND_CUTSCENE_PHIL_1 }, - { "PHIL_2", STREAMED_SOUND_CUTSCENE_PHIL_2 }, - { "PORN_1", STREAMED_SOUND_CUTSCENE_PORN_1 }, - { "PORN_2", STREAMED_SOUND_CUTSCENE_PORN_2 }, - { "PORN_3", STREAMED_SOUND_CUTSCENE_PORN_3 }, - { "PORN_4", STREAMED_SOUND_CUTSCENE_PORN_4 }, - { "RESC_1A", STREAMED_SOUND_CUTSCENE_RESC_1A }, - { "ROK_1", STREAMED_SOUND_CUTSCENE_ROK_1 }, - { "ROK_2", STREAMED_SOUND_CUTSCENE_ROK_2 }, - { "ROK_3A", STREAMED_SOUND_CUTSCENE_ROK_3A }, - { "STRIPA", STREAMED_SOUND_CUTSCENE_STRIPA }, - { "TAX_1", STREAMED_SOUND_CUTSCENE_TAX_1 }, - { "TEX_1", STREAMED_SOUND_CUTSCENE_TEX_1 }, - { "TEX_2", STREAMED_SOUND_CUTSCENE_TEX_2 }, - { "TEX_3", STREAMED_SOUND_CUTSCENE_TEX_3 }, - { "GSPOT", STREAMED_SOUND_CUTSCENE_GLIGHT }, - { "FIST", STREAMED_SOUND_CUTSCENE_FIST }, - { "EL_PH1", STREAMED_SOUND_CUTSCENE_ELBURRO1_PH1 }, - { "EL_PH2", STREAMED_SOUND_CUTSCENE_ELBURRO2_PH2 }, - { NULL, 0 } -}; +static bool bModelsRemovedForCutscene; +static int32 NumberOfSavedWeapons; +static eWeaponType SavedWeaponIDs[TOTAL_WEAPON_SLOTS]; +static int32 SavedWeaponAmmo[TOTAL_WEAPON_SLOTS]; -int -FindCutsceneAudioTrackId(const char *szCutsceneName) -{ - for (int i = 0; musicNameIdAssoc[i].szTrackName; i++) { - if (!CGeneral::faststricmp(musicNameIdAssoc[i].szTrackName, szCutsceneName)) - return musicNameIdAssoc[i].iTrackId; - } - return -1; -} - -bool CCutsceneMgr::ms_running; -bool CCutsceneMgr::ms_cutsceneProcessing; +char CCutsceneMgr::ms_cAppendAnimName[NUMCUTSCENEOBJECTS][NAMELENGTH]; +char CCutsceneMgr::ms_cAppendObjectName[NUMCUTSCENEOBJECTS][NAMELENGTH]; +int CCutsceneMgr::ms_numAppendObjectNames; CDirectory *CCutsceneMgr::ms_pCutsceneDir; -CCutsceneObject *CCutsceneMgr::ms_pCutsceneObjects[NUMCUTSCENEOBJECTS]; -int32 CCutsceneMgr::ms_numCutsceneObjs; bool CCutsceneMgr::ms_loaded; -bool CCutsceneMgr::ms_animLoaded; -bool CCutsceneMgr::ms_useLodMultiplier; -char CCutsceneMgr::ms_cutsceneName[CUTSCENENAMESIZE]; -CAnimBlendAssocGroup CCutsceneMgr::ms_cutsceneAssociations; -CVector CCutsceneMgr::ms_cutsceneOffset; -float CCutsceneMgr::ms_cutsceneTimer; +bool CCutsceneMgr::ms_hasFileInfo; bool CCutsceneMgr::ms_wasCutsceneSkipped; +bool CCutsceneMgr::ms_useLodMultiplier; +bool CCutsceneMgr::ms_cutsceneProcessing; +bool CCutsceneMgr::ms_running; +bool CCutsceneMgr::ms_animLoaded; uint32 CCutsceneMgr::ms_cutsceneLoadStatus; -bool CCutsceneMgr::ms_useCutsceneShadows = true; - -bool bCamLoaded; -bool bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver; // pls don't shrink the name :P -int32 NumberOfSavedWeapons; -eWeaponType SavedWeaponIDs[TOTAL_WEAPON_SLOTS]; -int32 SavedWeaponAmmo[TOTAL_WEAPON_SLOTS]; -char uncompressedAnims[8][32]; -uint32 numUncompressedAnims; - - -RpAtomic * -CalculateBoundingSphereRadiusCB(RpAtomic *atomic, void *data) -{ - float radius = RpAtomicGetBoundingSphere(atomic)->radius; - RwV3d center = RpAtomicGetBoundingSphere(atomic)->center; - - for (RwFrame *frame = RpAtomicGetFrame(atomic); RwFrameGetParent(frame); frame = RwFrameGetParent(frame)) - RwV3dTransformPoints(¢er, ¢er, 1, RwFrameGetMatrix(frame)); - - float size = RwV3dLength(¢er) + radius; - if (size > *(float *)data) - *(float *)data = size; - return atomic; -} void -CCutsceneMgr::Initialise(void) +CCutsceneMgr::Initialise(void *dir) { - ms_numCutsceneObjs = 0; - ms_loaded = false; - ms_wasCutsceneSkipped = false; + ms_cutsceneLoadStatus = CUTSCENE_NOT_LOADED; ms_running = false; - ms_useLodMultiplier = false; ms_animLoaded = false; ms_cutsceneProcessing = false; + ms_useLodMultiplier = false; + ms_wasCutsceneSkipped = false; + ms_hasFileInfo = false; + //ms_numCutsceneObjs = 0; + //ms_loaded = false; + if (gMakeResources) { + ms_pCutsceneDir = new CDirectory(CUTSCENEDIRSIZE); + ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR"); + } + else + ms_pCutsceneDir = (CDirectory*)dir; - ms_pCutsceneDir = new CDirectory(CUTSCENEDIRSIZE); - ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR"); + //numUncompressedAnims = 0; + //uncompressedAnims[0][0] = '\0'; +} - numUncompressedAnims = 0; - uncompressedAnims[0][0] = '\0'; +void CCutsceneMgr::Write(base::cRelocatableChunkWriter& writer) +{ + writer.AllocateRaw(ms_pCutsceneDir, sizeof(*ms_pCutsceneDir), 4, false, true); + writer.AllocateRaw(ms_pCutsceneDir->entries, sizeof(CDirectory::DirectoryInfo) * ms_pCutsceneDir->numEntries, 4, false, true); + writer.AddPatch(ms_pCutsceneDir); } void @@ -183,433 +82,25 @@ CCutsceneMgr::Shutdown(void) void CCutsceneMgr::LoadCutsceneData(const char *szCutsceneName) { - int file; - uint32 size; - uint32 offset; - CPlayerPed *pPlayerPed; - - ms_cutsceneProcessing = true; - ms_wasCutsceneSkipped = false; - CTimer::Suspend(); - if (!bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver) - CStreaming::RemoveCurrentZonesModels(); - - ms_pCutsceneDir->numEntries = 0; - ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR"); - - CStreaming::RemoveUnusedModelsInLoadedList(); - CGame::DrasticTidyUpMemory(true); - - strcpy(ms_cutsceneName, szCutsceneName); - - RwStream *stream; - stream = RwStreamOpen(rwSTREAMFILENAME, rwSTREAMREAD, "ANIM\\CUTS.IMG"); - assert(stream); - - // Load animations - sprintf(gString, "%s.IFP", szCutsceneName); - if (ms_pCutsceneDir->FindItem(gString, offset, size)) { - CStreaming::MakeSpaceFor(size << 11); - CStreaming::ImGonnaUseStreamingMemory(); - RwStreamSkip(stream, offset << 11); - CAnimManager::LoadAnimFile(stream, true, uncompressedAnims); - ms_cutsceneAssociations.CreateAssociations(szCutsceneName); - CStreaming::IHaveUsedStreamingMemory(); - ms_animLoaded = true; - } else { - ms_animLoaded = false; - } - RwStreamClose(stream, nil); - - // Load camera data - file = CFileMgr::OpenFile("ANIM\\CUTS.IMG", "rb"); - sprintf(gString, "%s.DAT", szCutsceneName); - if (ms_pCutsceneDir->FindItem(gString, offset, size)) { - CStreaming::ImGonnaUseStreamingMemory(); - CFileMgr::Seek(file, offset << 11, SEEK_SET); - TheCamera.LoadPathSplines(file); - CStreaming::IHaveUsedStreamingMemory(); - bCamLoaded = true; - } else { - bCamLoaded = false; - } - - CFileMgr::CloseFile(file); - - if (CGeneral::faststricmp(ms_cutsceneName, "finale")) { - DMAudio.ChangeMusicMode(MUSICMODE_CUTSCENE); - int trackId = FindCutsceneAudioTrackId(szCutsceneName); - if (trackId != -1) { - printf("Start preload audio %s\n", szCutsceneName); - DMAudio.PreloadCutSceneMusic(trackId); - printf("End preload audio %s\n", szCutsceneName); - } - } - - ms_cutsceneTimer = 0.0f; - ms_loaded = true; - ms_cutsceneOffset = CVector(0.0f, 0.0f, 0.0f); - - pPlayerPed = FindPlayerPed(); - pPlayerPed->m_pWanted->ClearQdCrimes(); - pPlayerPed->bIsVisible = false; - pPlayerPed->m_fCurrentStamina = pPlayerPed->m_fMaxStamina; - CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_CUTSCENE); - CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(true); - - CTimer::Resume(); -} - -void -CCutsceneMgr::FinishCutscene() -{ - ms_wasCutsceneSkipped = true; - if (bCamLoaded) { - CCutsceneMgr::ms_cutsceneTimer = TheCamera.GetCutSceneFinishTime() * 0.001f; - TheCamera.FinishCutscene(); - } - - FindPlayerPed()->bIsVisible = true; - CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(false); -} - -void -CCutsceneMgr::SetupCutsceneToStart(void) -{ - if (bCamLoaded) { - TheCamera.SetCamCutSceneOffSet(ms_cutsceneOffset); - TheCamera.TakeControlWithSpline(JUMP_CUT); - TheCamera.SetWideScreenOn(); - } - - ms_cutsceneOffset.z++; - - for (int i = ms_numCutsceneObjs - 1; i >= 0; i--) { - assert(RwObjectGetType(ms_pCutsceneObjects[i]->m_rwObject) == rpCLUMP); - if (CAnimBlendAssociation *pAnimBlendAssoc = RpAnimBlendClumpGetFirstAssociation((RpClump*)ms_pCutsceneObjects[i]->m_rwObject)) { - assert(pAnimBlendAssoc->hierarchy->sequences[0].HasTranslation()); - if (ms_pCutsceneObjects[i]->m_pAttachTo != nil) { - pAnimBlendAssoc->flags &= (~ASSOC_HAS_TRANSLATION); - } else { - if (pAnimBlendAssoc->hierarchy->IsCompressed()){ - KeyFrameTransCompressed *keyFrames = ((KeyFrameTransCompressed*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrameCompressed(0)); - CVector trans; - keyFrames->GetTranslation(&trans); - ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + trans); - }else{ - KeyFrameTrans *keyFrames = ((KeyFrameTrans*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrame(0)); - ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + keyFrames->translation); - } - } - pAnimBlendAssoc->SetRun(); - } else { - ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset); - } - CWorld::Add(ms_pCutsceneObjects[i]); - if (RwObjectGetType(ms_pCutsceneObjects[i]->m_rwObject) == rpCLUMP) { - ms_pCutsceneObjects[i]->UpdateRpHAnim(); - } - } - - CTimer::Update(); - CTimer::Update(); - ms_running = true; - ms_cutsceneTimer = 0.0f; -} - -void -CCutsceneMgr::SetCutsceneAnim(const char *animName, CObject *pObject) -{ - CAnimBlendAssociation *pNewAnim; - CAnimBlendClumpData *pAnimBlendClumpData; - - assert(RwObjectGetType(pObject->m_rwObject) == rpCLUMP); - debug("Give cutscene anim %s\n", animName); - RpAnimBlendClumpRemoveAllAssociations((RpClump*)pObject->m_rwObject); - - pNewAnim = ms_cutsceneAssociations.GetAnimation(animName); - if (!pNewAnim) { - debug("\n\nHaven't I told you I can't find the fucking animation %s\n\n\n", animName); - return; - } - - if (pNewAnim->hierarchy->IsCompressed()) - pNewAnim->hierarchy->keepCompressed = true; - - CStreaming::ImGonnaUseStreamingMemory(); - pNewAnim = ms_cutsceneAssociations.CopyAnimation(animName); - CStreaming::IHaveUsedStreamingMemory(); - - pNewAnim->SetCurrentTime(0.0f); - pNewAnim->flags |= ASSOC_HAS_TRANSLATION; - pNewAnim->flags &= ~ASSOC_RUNNING; - - pAnimBlendClumpData = *RPANIMBLENDCLUMPDATA(pObject->m_rwObject); - pAnimBlendClumpData->link.Prepend(&pNewAnim->link); - - if (pNewAnim->hierarchy->keepCompressed) - pAnimBlendClumpData->frames->flag |= AnimBlendFrameData::COMPRESSED; -} - -void -CCutsceneMgr::SetCutsceneAnimToLoop(const char* animName) -{ - ms_cutsceneAssociations.GetAnimation(animName)->flags |= ASSOC_REPEAT; -} - -CCutsceneHead * -CCutsceneMgr::AddCutsceneHead(CObject *pObject, int modelId) -{ - return nil; -} - -void UpdateCutsceneObjectBoundingBox(RpClump* clump, int modelId) -{ - if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ05) { - CColModel* pColModel = &CTempColModels::ms_colModelCutObj[modelId - MI_CUTOBJ01]; - float radius = 0.0f; - RpClumpForAllAtomics(clump, CalculateBoundingSphereRadiusCB, &radius); - pColModel->boundingSphere.radius = radius; - pColModel->boundingBox.min = CVector(-radius, -radius, -radius); - pColModel->boundingBox.max = CVector(radius, radius, radius); - } -} - -CCutsceneObject * -CCutsceneMgr::CreateCutsceneObject(int modelId) -{ - CBaseModelInfo *pModelInfo; - CColModel *pColModel; - CCutsceneObject *pCutsceneObject; - - CStreaming::ImGonnaUseStreamingMemory(); - debug("Created cutscene object %s\n", CModelInfo::GetModelInfo(modelId)->GetModelName()); - if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ05) { - pModelInfo = CModelInfo::GetModelInfo(modelId); - pColModel = &CTempColModels::ms_colModelCutObj[modelId - MI_CUTOBJ01]; - pModelInfo->SetColModel(pColModel); - UpdateCutsceneObjectBoundingBox((RpClump*)pModelInfo->GetRwObject(), modelId); - } else if (modelId >= MI_SPECIAL01 && modelId <= MI_SPECIAL21) { - pModelInfo = CModelInfo::GetModelInfo(modelId); - if (pModelInfo->GetColModel() == &CTempColModels::ms_colModelPed1) { - CColModel *colModel = new CColModel(); - colModel->boundingSphere.radius = 2.0f; - colModel->boundingSphere.center = CVector(0.0f, 0.0f, 0.0f); - pModelInfo->SetColModel(colModel, true); - } - pColModel = pModelInfo->GetColModel(); - float radius = 2.0f; - pColModel->boundingSphere.radius = radius; - pColModel->boundingBox.min = CVector(-radius, -radius, -radius); - pColModel->boundingBox.max = CVector(radius, radius, radius); - } - - pCutsceneObject = new CCutsceneObject(); - pCutsceneObject->SetModelIndex(modelId); - if (ms_useCutsceneShadows) - pCutsceneObject->CreateShadow(); - ms_pCutsceneObjects[ms_numCutsceneObjs++] = pCutsceneObject; - CStreaming::IHaveUsedStreamingMemory(); - return pCutsceneObject; + LoadCutsceneData_overlay(szCutsceneName); } void CCutsceneMgr::DeleteCutsceneData(void) { - if (!ms_loaded) return; - CTimer::Suspend(); - - ms_cutsceneProcessing = false; - ms_useLodMultiplier = false; - ms_useCutsceneShadows = true; - - for (--ms_numCutsceneObjs; ms_numCutsceneObjs >= 0; ms_numCutsceneObjs--) { - CWorld::Remove(ms_pCutsceneObjects[ms_numCutsceneObjs]); - ms_pCutsceneObjects[ms_numCutsceneObjs]->DeleteRwObject(); - delete ms_pCutsceneObjects[ms_numCutsceneObjs]; - ms_pCutsceneObjects[ms_numCutsceneObjs] = nil; - } - ms_numCutsceneObjs = 0; - - /* TODO!!! tmp hack - for (int i = MI_SPECIAL01; i < MI_SPECIAL21; i++) { - CBaseModelInfo *minfo = CModelInfo::GetModelInfo(i); - CColModel *colModel = minfo->GetColModel(); - if (colModel != &CTempColModels::ms_colModelPed1) { - delete colModel; - minfo->SetColModel(&CTempColModels::ms_colModelPed1); - } - } - */ - - if (ms_animLoaded) - CAnimManager::RemoveLastAnimFile(); - - ms_animLoaded = false; - numUncompressedAnims = 0; - uncompressedAnims[0][0] = '\0'; - - if (bCamLoaded) { - TheCamera.RestoreWithJumpCut(); - TheCamera.SetWideScreenOff(); - TheCamera.DeleteCutSceneCamDataMemory(); - } - ms_running = false; - ms_loaded = false; - - FindPlayerPed()->bIsVisible = true; - CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_CUTSCENE); - CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(false); - - if (CGeneral::faststricmp(ms_cutsceneName, "finale")) { - DMAudio.StopCutSceneMusic(); - DMAudio.ChangeMusicMode(MUSICMODE_GAME); - } - - CStreaming::ms_disableStreaming = false; - CWorld::bProcessCutsceneOnly = false; - - if(bCamLoaded) - CGame::DrasticTidyUpMemory(TheCamera.GetScreenFadeStatus() == FADE_2); - - CPad::GetPad(0)->Clear(false); - if (bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver) { - CStreaming::LoadInitialPeds(); - CStreaming::LoadInitialWeapons(); - CStreaming::LoadInitialVehicles(); - bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver = false; - - CPlayerPed *pPlayerPed = FindPlayerPed(); - for (int i = 0; i < NumberOfSavedWeapons; i++) { - int32 weaponModelId = CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModelId; - uint8 flags = CStreaming::ms_aInfoForModel[weaponModelId].m_flags; - CStreaming::RequestModel(weaponModelId, STREAMFLAGS_DONT_REMOVE); - CStreaming::LoadAllRequestedModels(false); - if (CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModel2Id != -1) { - CStreaming::RequestModel(CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModel2Id, 0); - CStreaming::LoadAllRequestedModels(false); - } - if (!(flags & STREAMFLAGS_DONT_REMOVE)) - CStreaming::SetModelIsDeletable(weaponModelId); - pPlayerPed->GiveWeapon(SavedWeaponIDs[i], SavedWeaponAmmo[i], true); - } - NumberOfSavedWeapons = 0; - } - - CTimer::Resume(); + DeleteCutsceneData_overlay(); + if (bModelsRemovedForCutscene) + LoadEverythingBecauseCutsceneDeletedAllOfIt(); } void -CCutsceneMgr::Update(void) +CCutsceneMgr::RemoveEverythingBecauseCutsceneDoesntFitInMemory() { - enum { - CUTSCENE_LOADING_0 = 0, - CUTSCENE_LOADING_AUDIO, - CUTSCENE_LOADING_2, - CUTSCENE_LOADING_3, - CUTSCENE_LOADING_4 - }; - - switch (ms_cutsceneLoadStatus) { - case CUTSCENE_LOADING_AUDIO: - SetupCutsceneToStart(); - if (CGeneral::faststricmp(ms_cutsceneName, "finale")) - DMAudio.PlayPreloadedCutSceneMusic(); - ms_cutsceneLoadStatus++; - break; - case CUTSCENE_LOADING_2: - case CUTSCENE_LOADING_3: - ms_cutsceneLoadStatus++; - break; - case CUTSCENE_LOADING_4: - ms_cutsceneLoadStatus = CUTSCENE_LOADING_0; - break; - default: - break; - } - - if (!ms_running) return; - - ms_cutsceneTimer += CTimer::GetTimeStepNonClippedInSeconds(); - - for (int i = 0; i < ms_numCutsceneObjs; i++) { - int modelId = ms_pCutsceneObjects[i]->GetModelIndex(); - if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ05) - UpdateCutsceneObjectBoundingBox(ms_pCutsceneObjects[i]->GetClump(), modelId); - - if (ms_pCutsceneObjects[i]->m_pAttachTo != nil && modelId >= MI_SPECIAL01 && modelId <= MI_SPECIAL21) - UpdateCutsceneObjectBoundingBox(ms_pCutsceneObjects[i]->GetClump(), modelId); - } - - if (bCamLoaded) - if (CGeneral::faststricmp(ms_cutsceneName, "finale") && TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FLYBY && ms_cutsceneLoadStatus == CUTSCENE_LOADING_0) { - if (CPad::GetPad(0)->GetCrossJustDown() - || (CGame::playingIntro && CPad::GetPad(0)->GetStartJustDown()) - || CPad::GetPad(0)->GetLeftMouseJustDown() - || CPad::GetPad(0)->GetEnterJustDown() - || CPad::GetPad(0)->GetCharJustDown(' ')) - FinishCutscene(); - } -} - -bool CCutsceneMgr::HasCutsceneFinished(void) { return !bCamLoaded || TheCamera.GetPositionAlongSpline() == 1.0f; } - -void -CCutsceneMgr::LoadAnimationUncompressed(char const* name) -{ - strcpy(uncompressedAnims[numUncompressedAnims], name); - - // Because that's how CAnimManager knows the end of array - ++numUncompressedAnims; - assert(numUncompressedAnims < ARRAY_SIZE(uncompressedAnims)); - uncompressedAnims[numUncompressedAnims][0] = '\0'; -} - -void -CCutsceneMgr::AttachObjectToParent(CObject *pObject, CEntity *pAttachTo) -{ - ((CCutsceneObject*)pObject)->m_pAttachmentObject = nil; - ((CCutsceneObject*)pObject)->m_pAttachTo = RpClumpGetFrame(pAttachTo->GetClump()); - - debug("Attach %s to %s\n", CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetModelName(), CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName()); -} - -void -CCutsceneMgr::AttachObjectToFrame(CObject *pObject, CEntity *pAttachTo, const char *frame) -{ - ((CCutsceneObject*)pObject)->m_pAttachmentObject = nil; - ((CCutsceneObject*)pObject)->m_pAttachTo = RpAnimBlendClumpFindFrame(pAttachTo->GetClump(), frame)->frame; - debug("Attach %s to component %s of %s\n", - CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetModelName(), - frame, - CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName()); - if (RwObjectGetType(pObject->m_rwObject) == rpCLUMP) { - RpClump *clump = (RpClump*)pObject->m_rwObject; - if (IsClumpSkinned(clump)) - RpAtomicGetBoundingSphere(GetFirstAtomic(clump))->radius *= 1.1f; - } -} - -void -CCutsceneMgr::AttachObjectToBone(CObject *pObject, CObject *pAttachTo, int bone) -{ - RpHAnimHierarchy *hanim = GetAnimHierarchyFromSkinClump(pAttachTo->GetClump()); - RwInt32 id = RpHAnimIDGetIndex(hanim, bone); - RwMatrix *matrixArray = RpHAnimHierarchyGetMatrixArray(hanim); - ((CCutsceneObject*)pObject)->m_pAttachmentObject = pAttachTo; - ((CCutsceneObject*)pObject)->m_pAttachTo = &matrixArray[id]; - debug("Attach %s to %s\n", - CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetModelName(), - CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName()); -} - -void -CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver() -{ - CStreaming::ms_disableStreaming = true; + //CStreaming::ms_disableStreaming = true; + CWorld::ClearExcitingStuffFromArea(FindPlayerCoors(), 120.0f, true); CColStore::RemoveAllCollision(); CWorld::bProcessCutsceneOnly = true; - ms_cutsceneProcessing = true; + /*ms_cutsceneProcessing = true; for (int i = CPools::GetPedPool()->GetSize() - 1; i >= 0; i--) { CPed *pPed = CPools::GetPedPool()->GetSlot(i); @@ -630,25 +121,21 @@ CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver() } } } - - bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver = true; + CWorld::bProcessCutsceneOnly = true; + //bIsEverythingRemovedFromTheWorldForTheBiggestFuckoffCutsceneEver = true;*/ CStreaming::RemoveCurrentZonesModels(); + while (CStreaming::RemoveLoadedVehicle()); + CRadar::RemoveRadarSections(); CStreaming::SetModelIsDeletable(MI_MALE01); CStreaming::SetModelTxdIsDeletable(MI_MALE01); - CStreaming::SetModelIsDeletable(MI_TAXI_D); - CStreaming::SetModelTxdIsDeletable(MI_TAXI_D); + CStreaming::SetModelIsDeletable(MI_COLT45); + CStreaming::SetModelTxdIsDeletable(MI_COLT45); CStreaming::SetModelIsDeletable(MI_NIGHTSTICK); CStreaming::SetModelTxdIsDeletable(MI_NIGHTSTICK); CStreaming::SetModelIsDeletable(MI_MISSILE); CStreaming::SetModelTxdIsDeletable(MI_MISSILE); - CStreaming::SetModelIsDeletable(MI_POLICE); - CStreaming::SetModelTxdIsDeletable(MI_POLICE); - while (CStreaming::RemoveLoadedVehicle()) ; - - CRadar::RemoveRadarSections(); - - for (int i = CPools::GetDummyPool()->GetSize() - 1; i >= 0; i--) { + /*for (int i = CPools::GetDummyPool()->GetSize() - 1; i >= 0; i--) { CDummy* pDummy = CPools::GetDummyPool()->GetSlot(i); if (pDummy) pDummy->DeleteRwObject(); @@ -668,7 +155,7 @@ CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver() if (!pBuilding->bImBeingRendered) pBuilding->DeleteRwObject(); } - } + }*/ CPlayerPed *pPlayerPed = FindPlayerPed(); pPlayerPed->RemoveWeaponAnims(0, -1000.0f); @@ -683,5 +170,69 @@ CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver() } pPlayerPed->ClearWeapons(); - CGame::DrasticTidyUpMemory(true); + bModelsRemovedForCutscene = true; + //CGame::DrasticTidyUpMemory(true); +} + +void +CCutsceneMgr::LoadEverythingBecauseCutsceneDeletedAllOfIt() +{ + bModelsRemovedForCutscene = false; + CStreaming::LoadInitialPeds(); + CStreaming::LoadInitialWeapons(); + //CStreaming::LoadInitialVehicles(); + + CPlayerPed *pPlayerPed = FindPlayerPed(); + for (int i = 0; i < NumberOfSavedWeapons; i++) { + int32 weaponModelId = CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModelId; + uint8 flags = CStreaming::ms_aInfoForModel[weaponModelId].m_flags; + CStreaming::RequestModel(weaponModelId, STREAMFLAGS_DONT_REMOVE); + CStreaming::LoadAllRequestedModels(false); + if (CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModel2Id != -1) { + CStreaming::RequestModel(CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModel2Id, 0); + CStreaming::LoadAllRequestedModels(false); + } + if (!(flags & STREAMFLAGS_DONT_REMOVE)) + CStreaming::SetModelIsDeletable(weaponModelId); + pPlayerPed->GiveWeapon(SavedWeaponIDs[i], SavedWeaponAmmo[i], true); + } + NumberOfSavedWeapons = 0; +} + +void +CCutsceneMgr::Update(void) +{ + if (ms_cutsceneLoadStatus != CUTSCENE_NOT_LOADED) + Update_overlay(); +} + +void +CCutsceneMgr::LoadAnimationUncompressed(char const* name) +{ + strcpy(ms_aUncompressedCutsceneAnims[ms_numUncompressedCutsceneAnims], name); + + // Because that's how CAnimManager knows the end of array + ++ms_numUncompressedCutsceneAnims; + assert(ms_numUncompressedCutsceneAnims < ARRAY_SIZE(ms_aUncompressedCutsceneAnims)); + ms_aUncompressedCutsceneAnims[ms_numUncompressedCutsceneAnims][0] = '\0'; +} + + +bool +CCutsceneMgr::IsCutsceneSkipButtonBeingPressed() +{ + return (CPad::GetPad(0)->GetCrossJustDown() + || CPad::GetPad(0)->GetLeftMouseJustDown() + || CPad::GetPad(0)->GetEnterJustDown() + || CPad::GetPad(0)->GetCharJustDown(' ')); +} + +void +CCutsceneMgr::AppendToNextCutscene(const char *object, const char *anim) +{ + strcpy(ms_cAppendObjectName[ms_numAppendObjectNames], object); + strlwr(ms_cAppendObjectName[ms_numAppendObjectNames]); + strcpy(ms_cAppendAnimName[ms_numAppendObjectNames], anim); + strlwr(ms_cAppendAnimName[ms_numAppendObjectNames]); + ms_numAppendObjectNames++; } \ No newline at end of file diff --git a/src/animation/CutsceneMgr.h b/src/animation/CutsceneMgr.h index 51ef6c04..7c749d4b 100644 --- a/src/animation/CutsceneMgr.h +++ b/src/animation/CutsceneMgr.h @@ -1,14 +1,69 @@ #pragma once #include "CutsceneObject.h" -#define CUTSCENENAMESIZE 8 class CDirectory; class CAnimBlendAssocGroup; class CCutsceneHead; +enum { + CUTSCENE_NOT_LOADED = 0, + CUTSCENE_LOADING, + CUTSCENE_LOADED, +}; + +enum { + CUTSCENE_PLAYING_0 = 0, + CUTSCENE_STARTED, + CUTSCENE_PLAYING_2, + CUTSCENE_PLAYING_3, + CUTSCENE_PLAYING_4, +}; + +enum +{ + NAMELENGTH = 32, + NUM_CUTS_PARTICLE_EFFECTS = 8, + NUM_CUTS_MAX_TEXTS = 64, + NUM_CUTS_UNCOMPRESSED_ANIMS = 8, + TEXT_KEY_SIZE = 8, + CUTSCENENAMESIZE = 8 +}; + +struct sToHideItem +{ + float x, y, z; + char name[NAMELENGTH]; +}; + +// TODO: figure out from SA +// this is unused in LCS anyway +struct sParticleEffect +{ + char name[NAMELENGTH]; + bool bPlayed; // ?? + int iTime; + int unk1; + int unk2; + char name2[NAMELENGTH]; + float x; + float y; + float z; + float unkX; + float unkY; + float unkZ; + bool unk10; + bool unk11; +}; + +struct sAttachInfo +{ + int attachToId, objectId, boneId; +}; + class CCutsceneMgr { + static bool ms_running; static CCutsceneObject *ms_pCutsceneObjects[NUMCUTSCENEOBJECTS]; @@ -24,10 +79,55 @@ class CCutsceneMgr static bool ms_wasCutsceneSkipped; static bool ms_cutsceneProcessing; static bool ms_useCutsceneShadows; + static bool ms_hasFileInfo; + static int ms_numLoadObjectNames; + + static char ms_cAppendAnimName[NUMCUTSCENEOBJECTS][NAMELENGTH]; + static char ms_cAppendObjectName[NUMCUTSCENEOBJECTS][NAMELENGTH]; + static int ms_numAppendObjectNames; public: static CDirectory *ms_pCutsceneDir; static uint32 ms_cutsceneLoadStatus; + static bool mCutsceneSkipFading; + static int mCutsceneSkipFadeTime; + + static float m_fPrevCarDensity; + static float m_fPrevPedDensity; + + static bool m_PrevExtraColourOn; + static uint32 m_PrevExtraColour; + + static uint32 ms_iNumParticleEffects; + static sParticleEffect ms_pParticleEffects[NUM_CUTS_PARTICLE_EFFECTS]; + + static sToHideItem ms_crToHideItems[NUMCUTSCENEOBJECTS]; + static uint32 ms_iNumHiddenEntities; + static CEntity *ms_pHiddenEntities[NUMCUTSCENEOBJECTS]; + + static int ms_numAttachObjectToBones; + static bool ms_bRepeatObject[NUMCUTSCENEOBJECTS]; + + static sAttachInfo ms_iAttachObjectToBone[NUMCUTSCENEOBJECTS]; + + static uint32 ms_numUncompressedCutsceneAnims; + + static char ms_aUncompressedCutsceneAnims[NUM_CUTS_UNCOMPRESSED_ANIMS][NAMELENGTH]; + + static uint32 ms_iTextDuration[NUM_CUTS_MAX_TEXTS]; + static uint32 ms_iTextStartTime[NUM_CUTS_MAX_TEXTS]; + static char ms_cTextOutput[NUM_CUTS_MAX_TEXTS][TEXT_KEY_SIZE]; + + static uint32 ms_currTextOutput; + static uint32 ms_numTextOutput; + static uint32 ms_iModelIndex[NUMCUTSCENEOBJECTS]; + + static char ms_cLoadAnimName[NUMCUTSCENEOBJECTS][NAMELENGTH]; + static char ms_cLoadObjectName[NUMCUTSCENEOBJECTS][NAMELENGTH]; + + static uint32 ms_cutscenePlayStatus; + + static void StartCutscene(); static void StartCutsceneProcessing() { ms_cutsceneProcessing = true; } static bool IsRunning(void) { return ms_running; } static bool HasLoaded(void) { return ms_loaded; } @@ -35,19 +135,19 @@ public: static bool WasCutsceneSkipped(void) { return ms_wasCutsceneSkipped; } static bool UseLodMultiplier(void) { return ms_useLodMultiplier; } static CCutsceneObject* GetCutsceneObject(int id) { return ms_pCutsceneObjects[id]; } - static int GetCutsceneTimeInMilleseconds(void) { return 1000.0f * ms_cutsceneTimer; } + static uint32 GetCutsceneTimeInMilleseconds(void); static char *GetCutsceneName(void) { return ms_cutsceneName; } static void SetCutsceneOffset(const CVector& vec) { ms_cutsceneOffset = vec; } static bool HasCutsceneFinished(void); - static void Initialise(void); + static void Initialise(void *dir = nil); static void Shutdown(void); static void LoadCutsceneData(const char *szCutsceneName); static void FinishCutscene(void); static void SetupCutsceneToStart(void); static void SetCutsceneAnim(const char *animName, CObject *pObject); static void SetCutsceneAnimToLoop(const char *animName); - static CCutsceneHead *AddCutsceneHead(CObject *pObject, int modelId); + static CCutsceneHead *SetHeadAnim(const char*, CObject *pObject); static CCutsceneObject *CreateCutsceneObject(int modelId); static void DeleteCutsceneData(void); static void LoadAnimationUncompressed(char const*); @@ -56,6 +156,24 @@ public: static void AttachObjectToParent(CObject *pObject, CEntity *pAttachTo); static void AttachObjectToFrame(CObject *pObject, CEntity *pAttachTo, const char *frame); static void AttachObjectToBone(CObject *pObject, CObject *pAttachTo, int frame); - static void RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver(); + static void RemoveEverythingBecauseCutsceneDoesntFitInMemory(); + static void LoadEverythingBecauseCutsceneDeletedAllOfIt(); static void DisableCutsceneShadows() { ms_useCutsceneShadows = false; } + + + static void LoadCutsceneData_overlay(const char* szCutsceneName); + static bool LoadCutsceneData_postload(bool b = false); + static void Update_overlay(void); + static void DeleteCutsceneData_overlay(void); + + static bool IsCutsceneSkipButtonBeingPressed(); + static void AppendToNextCutscene(const char *object, const char *anim); + + static void LoadCutsceneData_preload(); + static void LoadCutsceneData_loading(); + static void HideRequestedObjects(); + + static bool PresubBodge(); + + static void Write(base::cRelocatableChunkWriter& writer); }; diff --git a/src/animation/CutsceneMgr_overlay.cpp b/src/animation/CutsceneMgr_overlay.cpp new file mode 100644 index 00000000..4693f243 --- /dev/null +++ b/src/animation/CutsceneMgr_overlay.cpp @@ -0,0 +1,1029 @@ +#include "common.h" +#include "relocatableChunk.h" + +#include "General.h" +#include "CutsceneMgr.h" +#include "Directory.h" +#include "Camera.h" +#include "Streaming.h" +#include "FileMgr.h" +#include "main.h" +#include "AnimManager.h" +#include "AnimBlendAssociation.h" +#include "AnimBlendAssocGroup.h" +#include "AnimBlendClumpData.h" +#include "Pad.h" +#include "DMAudio.h" +#include "World.h" +#include "PlayerPed.h" +#include "Wanted.h" +#include "RpAnimBlend.h" +#include "ModelIndices.h" +#include "TempColModels.h" +#include "ColStore.h" +#include "Radar.h" +#include "Pools.h" +#include "Messages.h" +#include "Population.h" +#include "CarCtrl.h" +#include "TimeCycle.h" +#include "Rubbish.h" +#include "Text.h" +#include "Hud.h" + +const struct { + const char *szTrackName; + int iTrackId; +} musicNameIdAssoc[] = { + { "BIKER", STREAMED_SOUND_CUTSCENE_BIKER }, + { "BONEVOY", STREAMED_SOUND_CUTSCENE_BONEVOY }, + { "CAMPAIN", STREAMED_SOUND_CUTSCENE_CAMPAIN }, + { "CASHCHP", STREAMED_SOUND_CUTSCENE_CASHCHP }, + { "CONTBAN", STREAMED_SOUND_CUTSCENE_CONTBAN }, + { "CRAZY69", STREAMED_SOUND_CUTSCENE_CRAZY69 }, + { "CUTTEST", STREAMED_SOUND_CUTSCENE_CUTTEST }, + { "DEADLY", STREAMED_SOUND_CUTSCENE_DEADLY }, + { "DONPROB", STREAMED_SOUND_CUTSCENE_DONPROB }, + { "DRIVNMR", STREAMED_SOUND_CUTSCENE_DRIVNMR }, + { "ELECTON", STREAMED_SOUND_CUTSCENE_ELECTON }, + { "FINAL", STREAMED_SOUND_CUTSCENE_FINAL }, + { "FINAL_2", STREAMED_SOUND_CUTSCENE_FINAL_2 }, + { "HOMSWET", STREAMED_SOUND_CUTSCENE_HOMSWET }, + { "HOTWHEL", STREAMED_SOUND_CUTSCENE_HOTWHEL }, + { "KIDNAPP", STREAMED_SOUND_CUTSCENE_KIDNAPP }, + { "LANDGRB", STREAMED_SOUND_CUTSCENE_LANDGRB }, + { "MORGUE", STREAMED_SOUND_CUTSCENE_MORGUE }, + { "OVERDOS", STREAMED_SOUND_CUTSCENE_OVERDOS }, + { "RUFJUST", STREAMED_SOUND_CUTSCENE_RUFJUST }, + { "SAYONAR", STREAMED_SOUND_CUTSCENE_SAYONAR }, + { "SICILAN", STREAMED_SOUND_CUTSCENE_SICILAN }, + { "THEOFER", STREAMED_SOUND_CUTSCENE_THEOFER }, + { "INTRO", STREAMED_SOUND_CUTSCENE_INTRO }, + { "FINALE", STREAMED_SOUND_CUTSCENE_FINALE }, + { NULL, 0 } +}; + +int +FindCutsceneAudioTrackId(const char *szCutsceneName) +{ + debug("looking for cutscene music track\n"); + for (int i = 0; musicNameIdAssoc[i].szTrackName; i++) { + if (!CGeneral::faststricmp(musicNameIdAssoc[i].szTrackName, szCutsceneName)) { + debug("HUZZA! FOUND cutscene music track\n"); + return musicNameIdAssoc[i].iTrackId; + } + } + debug("NOT FOUND cutscene music track\n"); + return -1; +} + +const char * +GetNextLine(const char *buf, char *line, uint32 lineSize) +{ + while (*buf == '\n' || *buf == '\r') + buf++; + + if (*buf == '\0') + return nil; + + // size check never happened, eh? + while (*buf != '\n' && *buf != '\r') { + if (*buf == '\0') + break; + *(line++) = *(buf++); + } + *(line++) = '\0'; + return buf; +} + +RpAtomic* +CalculateBoundingSphereRadiusCB(RpAtomic* atomic, void* data) +{ + float radius = RpAtomicGetBoundingSphere(atomic)->radius; + RwV3d center = RpAtomicGetBoundingSphere(atomic)->center; + + for (RwFrame* frame = RpAtomicGetFrame(atomic); RwFrameGetParent(frame); frame = RwFrameGetParent(frame)) + RwV3dTransformPoints(¢er, ¢er, 1, RwFrameGetMatrix(frame)); + + float size = RwV3dLength(¢er) + radius; + if (size > *(float*)data) + *(float*)data = size; + return atomic; +} + +void UpdateCutsceneObjectBoundingBox(RpClump* clump, int modelId) +{ + if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ10) { + CColModel* pColModel = &CTempColModels::ms_colModelCutObj[modelId - MI_CUTOBJ01]; + float oldRadius = pColModel->boundingSphere.radius; + float radius = 0.0f; + RpClumpForAllAtomics(clump, CalculateBoundingSphereRadiusCB, &radius); + if (oldRadius < 20.0f) oldRadius = 20.0f; + if (oldRadius < radius) { + debug("Limiting cutscene object radius %f\n", oldRadius); + radius = oldRadius; + } + radius = oldRadius; + pColModel->boundingSphere.radius = radius; + pColModel->boundingBox.min = CVector(-radius, -radius, -radius); + pColModel->boundingBox.max = CVector(radius, radius, radius); + } +} + +bool bCamLoaded; +bool bCamFading; + +// yes, they've actually doubled this thing here, thus this one is unused +static bool bModelsRemovedForCutscene; +static int32 NumberOfSavedWeapons; +static eWeaponType SavedWeaponIDs[TOTAL_WEAPON_SLOTS]; +static int32 SavedWeaponAmmo[TOTAL_WEAPON_SLOTS]; + +enum +{ + CUTMODEL_PLAYER = 1, + CUTMODEL_SIMPLE, + CUTMODEL_REPEATED, +}; + +bool CCutsceneMgr::ms_useCutsceneShadows = true; +bool CCutsceneMgr::mCutsceneSkipFading; +int CCutsceneMgr::mCutsceneSkipFadeTime; +float CCutsceneMgr::m_fPrevCarDensity; +float CCutsceneMgr::m_fPrevPedDensity; +bool CCutsceneMgr::m_PrevExtraColourOn; +uint32 CCutsceneMgr::m_PrevExtraColour; +uint32 CCutsceneMgr::ms_iNumParticleEffects; +sParticleEffect CCutsceneMgr::ms_pParticleEffects[NUM_CUTS_PARTICLE_EFFECTS]; +sToHideItem CCutsceneMgr::ms_crToHideItems[NUMCUTSCENEOBJECTS]; +uint32 CCutsceneMgr::ms_iNumHiddenEntities; +CEntity *CCutsceneMgr::ms_pHiddenEntities[NUMCUTSCENEOBJECTS]; +int CCutsceneMgr::ms_numAttachObjectToBones; +bool CCutsceneMgr::ms_bRepeatObject[NUMCUTSCENEOBJECTS]; +sAttachInfo CCutsceneMgr::ms_iAttachObjectToBone[NUMCUTSCENEOBJECTS]; +uint32 CCutsceneMgr::ms_numUncompressedCutsceneAnims; +char CCutsceneMgr::ms_aUncompressedCutsceneAnims[NUM_CUTS_UNCOMPRESSED_ANIMS][NAMELENGTH]; +uint32 CCutsceneMgr::ms_iTextDuration[NUM_CUTS_MAX_TEXTS]; +uint32 CCutsceneMgr::ms_iTextStartTime[NUM_CUTS_MAX_TEXTS]; +char CCutsceneMgr::ms_cTextOutput[NUM_CUTS_MAX_TEXTS][TEXT_KEY_SIZE]; +uint32 CCutsceneMgr::ms_currTextOutput; +uint32 CCutsceneMgr::ms_numTextOutput; +uint32 CCutsceneMgr::ms_iModelIndex[NUMCUTSCENEOBJECTS]; +char CCutsceneMgr::ms_cLoadAnimName[NUMCUTSCENEOBJECTS][NAMELENGTH]; +char CCutsceneMgr::ms_cLoadObjectName[NUMCUTSCENEOBJECTS][NAMELENGTH]; +int CCutsceneMgr::ms_numLoadObjectNames; +CCutsceneObject *CCutsceneMgr::ms_pCutsceneObjects[NUMCUTSCENEOBJECTS]; +int32 CCutsceneMgr::ms_numCutsceneObjs; +CVector CCutsceneMgr::ms_cutsceneOffset; +float CCutsceneMgr::ms_cutsceneTimer; +uint32 CCutsceneMgr::ms_cutscenePlayStatus; +CAnimBlendAssocGroup CCutsceneMgr::ms_cutsceneAssociations; +char CCutsceneMgr::ms_cutsceneName[CUTSCENENAMESIZE]; + +CCutsceneObject * +CCutsceneMgr::CreateCutsceneObject(int modelId) +{ + CBaseModelInfo *pModelInfo; + CColModel *pColModel; + CCutsceneObject *pCutsceneObject; + + CStreaming::ImGonnaUseStreamingMemory(); + debug("Created cutscene object %s\n", CModelInfo::GetModelInfo(modelId)->GetModelName()); + if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ10) { + pModelInfo = CModelInfo::GetModelInfo(modelId); + pColModel = &CTempColModels::ms_colModelCutObj[modelId - MI_CUTOBJ01]; + pModelInfo->SetColModel(pColModel); + UpdateCutsceneObjectBoundingBox((RpClump*)pModelInfo->GetRwObject(), modelId); + } + + pCutsceneObject = new CCutsceneObject(); + pCutsceneObject->SetModelIndex(modelId); + if (ms_useCutsceneShadows) + pCutsceneObject->CreateShadow(); + ms_pCutsceneObjects[ms_numCutsceneObjs++] = pCutsceneObject; + CStreaming::IHaveUsedStreamingMemory(); + return pCutsceneObject; +} + +void +CCutsceneMgr::SetCutsceneAnim(const char *animName, CObject *pObject) +{ + CAnimBlendAssociation *pNewAnim; + CAnimBlendClumpData *pAnimBlendClumpData; + + debug("Give cutscene anim %s\n", animName); + /*assert(RwObjectGetType(pObject->m_rwObject) == rpCLUMP); + debug("Give cutscene anim %s\n", animName); + RpAnimBlendClumpRemoveAllAssociations((RpClump*)pObject->m_rwObject); + + pNewAnim = ms_cutsceneAssociations.GetAnimation(animName); + if (!pNewAnim) { + debug("\n\nHaven't I told you I can't find the fucking animation %s\n\n\n", animName); + return; + } + + if (pNewAnim->hierarchy->IsCompressed()) + pNewAnim->hierarchy->keepCompressed = true;*/ + + CStreaming::ImGonnaUseStreamingMemory(); + pNewAnim = ms_cutsceneAssociations.CopyAnimation(animName); + CStreaming::IHaveUsedStreamingMemory(); + + pNewAnim->SetCurrentTime(0.0f); + pNewAnim->flags |= ASSOC_HAS_TRANSLATION; + pNewAnim->flags &= ~ASSOC_RUNNING; + + pAnimBlendClumpData = *RPANIMBLENDCLUMPDATA(pObject->m_rwObject); + pAnimBlendClumpData->link.Prepend(&pNewAnim->link); + + //if (pNewAnim->hierarchy->keepCompressed) + // pAnimBlendClumpData->frames->flag |= AnimBlendFrameData::COMPRESSED; +} + +void +CCutsceneMgr::SetCutsceneAnimToLoop(const char* animName) +{ + ms_cutsceneAssociations.GetAnimation(animName)->flags |= ASSOC_REPEAT; +} + +CCutsceneHead* +CCutsceneMgr::SetHeadAnim(const char*, CObject* pObject) +{ + return nil; +} + +void +CCutsceneMgr::StartCutscene() +{ + ms_cutscenePlayStatus = CUTSCENE_STARTED; + if (bCamLoaded) { + TheCamera.SetWideScreenOn(); + CHud::SetHelpMessage(nil, true); + } +} + +void +CCutsceneMgr::SetupCutsceneToStart(void) +{ + if (bCamLoaded) { + TheCamera.SetCamCutSceneOffSet(ms_cutsceneOffset); + TheCamera.TakeControlWithSpline(JUMP_CUT); + TheCamera.SetWideScreenOn(); + CHud::SetHelpMessage(nil, true); + } + + ms_cutsceneOffset.z += 1.0f; + + for (int i = ms_numCutsceneObjs - 1; i >= 0; i--) { + assert(RwObjectGetType(ms_pCutsceneObjects[i]->m_rwObject) == rpCLUMP); + if (CAnimBlendAssociation *pAnimBlendAssoc = RpAnimBlendClumpGetFirstAssociation((RpClump*)ms_pCutsceneObjects[i]->m_rwObject)) { + assert(pAnimBlendAssoc->hierarchy->sequences[0].HasTranslation()); + if (ms_pCutsceneObjects[i]->m_pAttachTo != nil) { + pAnimBlendAssoc->flags &= (~ASSOC_HAS_TRANSLATION); + } else { + if (pAnimBlendAssoc->hierarchy->IsCompressed()){ + KeyFrameTransCompressed *keyFrames = ((KeyFrameTransCompressed*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrameCompressed(0)); + CVector trans; + keyFrames->GetTranslation(&trans); + ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + trans); + }else{ + KeyFrameTrans *keyFrames = ((KeyFrameTrans*)pAnimBlendAssoc->hierarchy->sequences[0].GetKeyFrame(0)); + ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset + keyFrames->translation); + } + } + pAnimBlendAssoc->SetRun(); + } else { + ms_pCutsceneObjects[i]->SetPosition(ms_cutsceneOffset); + } + CWorld::Add(ms_pCutsceneObjects[i]); + if (RwObjectGetType(ms_pCutsceneObjects[i]->m_rwObject) == rpCLUMP) { + ms_pCutsceneObjects[i]->UpdateRpHAnim(); + } + } + + CTimer::Update(); + CTimer::Update(); + ms_cutsceneTimer = 0.0f; + ms_running = true; + mCutsceneSkipFadeTime = 0; + mCutsceneSkipFading = 0; +} + +void +CCutsceneMgr::FinishCutscene() +{ + if (bCamLoaded) { + ms_cutsceneTimer = TheCamera.GetCutSceneFinishTime() * 0.001f; + TheCamera.FinishCutscene(); + } + + FindPlayerPed()->bIsVisible = true; + CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(false); +} + +uint32 +CCutsceneMgr::GetCutsceneTimeInMilleseconds(void) +{ + return 1000.0f * ms_cutsceneTimer; +} + +bool CCutsceneMgr::HasCutsceneFinished(void) +{ + return !bCamLoaded || TheCamera.GetPositionAlongSpline() == 1.0f; +} + +void +CCutsceneMgr::AttachObjectToBone(CObject *pObject, CObject *pAttachTo, int bone) +{ + RpHAnimHierarchy *hanim = GetAnimHierarchyFromSkinClump(pAttachTo->GetClump()); + RwInt32 id = RpHAnimIDGetIndex(hanim, bone); + RwMatrix *matrixArray = RpHAnimHierarchyGetMatrixArray(hanim); + ((CCutsceneObject*)pObject)->m_pAttachmentObject = pAttachTo; + ((CCutsceneObject*)pObject)->m_pAttachTo = &matrixArray[id]; + //debug("Attach %s to %s\n", + // CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetModelName(), + // CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName()); +} + +void +CCutsceneMgr::AttachObjectToFrame(CObject *pObject, CEntity *pAttachTo, const char *frame) +{ + ((CCutsceneObject*)pObject)->m_pAttachmentObject = nil; + ((CCutsceneObject*)pObject)->m_pAttachTo = RpAnimBlendClumpFindFrame(pAttachTo->GetClump(), frame)->frame; + //debug("Attach %s to component %s of %s\n", + // CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetModelName(), + // frame, + // CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName()); + if (RwObjectGetType(pObject->m_rwObject) == rpCLUMP) { + RpClump *clump = (RpClump*)pObject->m_rwObject; + if (IsClumpSkinned(clump)) + RpAtomicGetBoundingSphere(GetFirstAtomic(clump))->radius *= 1.1f; + } +} + +void +CCutsceneMgr::AttachObjectToParent(CObject *pObject, CEntity *pAttachTo) +{ + ((CCutsceneObject*)pObject)->m_pAttachmentObject = nil; + ((CCutsceneObject*)pObject)->m_pAttachTo = RpClumpGetFrame(pAttachTo->GetClump()); + + //debug("Attach %s to %s\n", CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetModelName(), CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName()); +} + +void +CCutsceneMgr::HideRequestedObjects(void) +{ + int num = ms_iNumHiddenEntities; + ms_iNumHiddenEntities = 0; + + for (int i = 0; i < num; i++) { + int id; + if (CModelInfo::GetModelInfo(ms_crToHideItems[i].name, &id)) { + CVector pos(ms_crToHideItems[i].x, ms_crToHideItems[i].y, ms_crToHideItems[i].z); + int16 foundEntities; + CEntity* pEntities[32]; + CWorld::FindObjectsOfTypeInRange(id, pos, 1.5f, true, &foundEntities, 32, pEntities, true, false, false, true, true); + for (int j = 0; i < foundEntities; j++) { + if (pEntities[j]->bIsVisible) { + ms_pHiddenEntities[ms_iNumHiddenEntities] = pEntities[j]; + ms_pHiddenEntities[ms_iNumHiddenEntities]->RegisterReference(&ms_pHiddenEntities[ms_iNumHiddenEntities]); + ms_pHiddenEntities[ms_iNumHiddenEntities]->bIsVisible = false; + ms_iNumHiddenEntities++; + } + } + } + } +} + +bool +CCutsceneMgr::PresubBodge() +{ + return true; +} + +void +CCutsceneMgr::LoadCutsceneData_loading() +{ + for (int i = 0; i < ms_numLoadObjectNames; i++) { + int mi = ms_iModelIndex[i]; + if (mi >= MI_CUTOBJ01 && mi <= MI_CUTOBJ10) { + if (CStreaming::ms_aInfoForModel[mi].m_loadState != STREAMSTATE_LOADED) + return; + } + } + + if (!LoadCutsceneData_postload()) + return; + + CCutsceneObject* cutsceneObject; + for (int i = 0; i < ms_numLoadObjectNames; i++) { + if (!ms_bRepeatObject[i]) + cutsceneObject = CreateCutsceneObject(ms_iModelIndex[i]); + if (ms_cLoadAnimName[i] != '\0') + SetCutsceneAnim(ms_cLoadAnimName[i], cutsceneObject); + } + + for (int i = 0; i < ms_numAttachObjectToBones; i++) { + int objectId = ms_iAttachObjectToBone[i].objectId; + int attachToId = ms_iAttachObjectToBone[i].attachToId; + int bone = ms_iAttachObjectToBone[i].boneId; + AttachObjectToBone(ms_pCutsceneObjects[objectId], ms_pCutsceneObjects[attachToId], bone); + } +} + +bool +CCutsceneMgr::LoadCutsceneData_postload(bool b) +{ + RwStream *stream = nil; + uint32 size; + uint32 offset; + + bool result; + + CMessages::ClearThisBigPrintNow(0); + CPopulation::PedDensityMultiplier = 0.0f; + CCarCtrl::CarDensityMultiplier = 0.0f; + CStreaming::ms_disableStreaming = false; + if (b) + { + sprintf(gString, "%s.IFP", ms_cutsceneName); + result = false; + ms_animLoaded = false; + RwStreamClose(stream, nil); // umm... + sprintf(gString, "%s.DAT", ms_cutsceneName); + bCamLoaded = false; + } else { + + stream = RwStreamOpen(rwSTREAMFILENAME, rwSTREAMREAD, "ANIM\\CUTS.IMG"); + sprintf(gString, "%s.IFP", ms_cutsceneName); + if (stream) { + if (ms_pCutsceneDir->FindItem(gString, offset, size)) + { + CStreaming::MakeSpaceFor(size << 11); + CStreaming::ImGonnaUseStreamingMemory(); + RwStreamSkip(stream, offset << 11); + CAnimManager::LoadAnimFile(stream, true, ms_aUncompressedCutsceneAnims); + ms_cutsceneAssociations.CreateAssociations(ms_cutsceneName, ms_cLoadAnimName[0], ms_cLoadObjectName[0], NAMELENGTH); + CStreaming::IHaveUsedStreamingMemory(); + ms_animLoaded = true; + } + else + { + ms_animLoaded = false; + } + RwStreamClose(stream, nil); + + int file = CFileMgr::OpenFile("ANIM\\CUTS.IMG", "rb"); + sprintf(gString, "%s.DAT", &ms_cutsceneName); + if (file) { + if (ms_pCutsceneDir->FindItem(gString, offset, size)) + { + CStreaming::ImGonnaUseStreamingMemory(); + CFileMgr::Seek(file, offset << 11, 0); + TheCamera.LoadPathSplines(file); + CStreaming::IHaveUsedStreamingMemory(); + bCamLoaded = true; + } + else + { + bCamLoaded = false; + } + result = true; + CFileMgr::CloseFile(file); + } + else + { + bCamLoaded = false; + result = true; + } + } + else + { + result = false; + ms_animLoaded = false; + RwStreamClose(stream, nil); + sprintf(gString, "%s.DAT", ms_cutsceneName); + bCamLoaded = false; + } + } + ms_cutsceneLoadStatus = CUTSCENE_LOADED; + ms_cutsceneTimer = 0.0f; + FindPlayerPed()->m_pWanted->ClearQdCrimes(); + return result; +} + +void +CCutsceneMgr::LoadCutsceneData_overlay(const char *szCutsceneName) +{ + CTimer::Suspend(); + ms_cutsceneProcessing = true; + ms_wasCutsceneSkipped = false; + if (!bModelsRemovedForCutscene) + CStreaming::RemoveCurrentZonesModels(); + + ms_pCutsceneDir->numEntries = 0; + ms_pCutsceneDir->ReadDirFile("ANIM\\CUTS.DIR"); + + CStreaming::RemoveUnusedModelsInLoadedList(); + CGame::DrasticTidyUpMemory(true); + + strcpy(ms_cutsceneName, szCutsceneName); + + LoadCutsceneData_preload(); + CTimer::Resume(); +} + +void +CCutsceneMgr::LoadCutsceneData_preload(void) +{ + uint32 size; + uint32 offset; + CPlayerPed* pPlayerPed; + if (CGeneral::faststricmp(ms_cutsceneName, "finale")) { + DMAudio.ChangeMusicMode(MUSICMODE_CUTSCENE); + int trackId = FindCutsceneAudioTrackId(ms_cutsceneName); + if (trackId != -1) { + printf("Start preload audio %s\n", ms_cutsceneName); + DMAudio.PreloadCutSceneMusic(trackId); + printf("End preload audio %s\n", ms_cutsceneName); + } + } + + for (int i = MI_CUTOBJ01; i <= MI_CUTOBJ10; i++) { + if (CModelInfo::GetModelInfo(i)->GetNumRefs() <= 0) { + if (CStreaming::ms_aInfoForModel[i].m_loadState == STREAMSTATE_LOADED) { + CStreaming::RemoveModel(i); + CModelInfo::GetModelInfo(i)->SetModelName("&*%"); + } + } + } + + m_PrevExtraColour = CTimeCycle::m_ExtraColour; + m_PrevExtraColourOn = CTimeCycle::m_bExtraColourOn != 0; + m_fPrevPedDensity = CPopulation::PedDensityMultiplier; + m_fPrevCarDensity = CCarCtrl::CarDensityMultiplier; + ms_cutsceneOffset = CVector(0.0f, 0.0f, 0.0f); + ms_numTextOutput = 0; + ms_currTextOutput = 0; + ms_numLoadObjectNames = 0; + ms_numUncompressedCutsceneAnims = 0; + ms_numAttachObjectToBones = 0; + ms_iNumHiddenEntities = 0; + bCamFading = false; + ms_iNumParticleEffects = 0; + + for (int i = 0; i < NUM_CUTS_UNCOMPRESSED_ANIMS; i++) + ms_aUncompressedCutsceneAnims[i][0] = '\0'; + + memset(ms_iModelIndex, 0, sizeof(ms_iModelIndex)); + CRubbish::SetVisibility(false); + + pPlayerPed = FindPlayerPed(); + pPlayerPed->m_pWanted->ClearQdCrimes(); + pPlayerPed->bIsVisible = false; + pPlayerPed->m_fCurrentStamina = pPlayerPed->m_fMaxStamina; + CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_CUTSCENE); + CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(true); + + sprintf(gString, "%s.CUT", ms_cutsceneName); + if (!ms_pCutsceneDir->FindItem(gString, offset, size)) { + LoadCutsceneData_postload(); + return; + } + + size <<= 11; + offset <<= 11; + + char *cutsBuf = new char[size]; + + RwStream* stream = RwStreamOpen(rwSTREAMFILENAME, rwSTREAMREAD, "ANIM\\CUTS.IMG"); + + if (stream) { + RwStreamSkip(stream, offset); + RwStreamRead(stream, cutsBuf, size); + RwStreamClose(stream, nil); + } + + enum + { + CUT_NONE = 0, + CUT_INFO, + CUT_MODEL, + CUT_TEXT, + CUT_UNCOMPRESS, + CUT_ATTACH, + CUT_REMOVE, + CUT_PARTICLE_EFFECT, + CUT_EXTRA_COLOR, + }; + + int cutSection = CUT_NONE; + bool bExtraColSet = false; + + char line[1024]; + const char *pCurLine = cutsBuf; + + while (true) + { + pCurLine = GetNextLine(pCurLine, line, sizeof(line)); + if (pCurLine) { + if (line[0] == '\0') + break; + + if (strcmp(line, "end") == 0) { + cutSection = CUT_NONE; + continue; + } + + switch (cutSection) + { + case CUT_NONE: + if (strcmp(line, "info") == 0) + cutSection = CUT_INFO; + if (strcmp(line, "model") == 0) + cutSection = CUT_MODEL; + if (strcmp(line, "text") == 0) + cutSection = CUT_TEXT; + if (strcmp(line, "uncompress") == 0) + cutSection = CUT_UNCOMPRESS; + if (strcmp(line, "attach") == 0) + cutSection = CUT_ATTACH; + if (strcmp(line, "remove") == 0) + cutSection = CUT_REMOVE; + if (strcmp(line, "peffect") == 0) + cutSection = CUT_PARTICLE_EFFECT; + if (strcmp(line, "extracol") == 0) + cutSection = CUT_EXTRA_COLOR; + break; + case CUT_INFO: + { + if (strncmp(line, "offset", 6) == 0) { + float x, y, z; + sscanf(line+7, "%f %f %f", &x, &y, &z); + FindPlayerPed(); // called for some sa check in here + ms_cutsceneOffset = CVector(x, y, z); + } + break; + } + case CUT_MODEL: + { + char objectName[NAMELENGTH]; + char animName[NAMELENGTH]; + + int num; // unused + sscanf(strtok(line, " ,"), "%d", &num); + strcpy(objectName, strtok(nil, " ,")); + char* pAnimName = strtok(0, " ,"); + strlwr(objectName); + + bool bUsedFirstTime = true; + if (pAnimName) { + do { + strcpy(animName, pAnimName); + strlwr(animName); + strcpy(ms_cLoadObjectName[ms_numLoadObjectNames], objectName); + strcpy(ms_cLoadAnimName[ms_numLoadObjectNames], animName); + if (bUsedFirstTime) { + bUsedFirstTime = false; + ms_iModelIndex[ms_numLoadObjectNames] = CUTMODEL_SIMPLE; + ms_bRepeatObject[ms_numLoadObjectNames] = false; + } else { + ms_bRepeatObject[ms_numLoadObjectNames] = true; + ms_iModelIndex[ms_numLoadObjectNames] = CUTMODEL_REPEATED; + } + ms_numLoadObjectNames++; + pAnimName = strtok(0, " ,"); + } while (pAnimName); + } + break; + } + case CUT_TEXT: + { + int iTextStartTime, iTextDuration; + char cTextOutput[8]; + sscanf(line, "%d,%d,%s", &iTextStartTime, &iTextDuration, cTextOutput); + for (size_t i = 0; i < strlen(cTextOutput); i++) + cTextOutput[i] = toupper(cTextOutput[i]); + + memcpy(ms_cTextOutput[ms_numTextOutput], cTextOutput, strlen(cTextOutput)+1); + ms_iTextStartTime[ms_numTextOutput] = iTextStartTime; + ms_iTextDuration[ms_numTextOutput] = iTextDuration; + ms_numTextOutput++; + break; + } + case CUT_UNCOMPRESS: + LoadAnimationUncompressed(strtok(line, " ,")); + break; + case CUT_ATTACH: + { + int attachToId, objectId, bone; + sscanf(line, "%d,%d,%d", &attachToId, &objectId, &bone); + ms_iAttachObjectToBone[ms_numAttachObjectToBones].attachToId = attachToId; + ms_iAttachObjectToBone[ms_numAttachObjectToBones].objectId = objectId; + ms_iAttachObjectToBone[ms_numAttachObjectToBones].boneId = bone; + ms_numAttachObjectToBones++; + break; + } + case CUT_REMOVE: + { + float x, y, z; + char name[NAMELENGTH]; + sscanf(line, "%f,%f,%f,%s", &x, &y, &z, name); + ms_crToHideItems[ms_iNumHiddenEntities].x = x; + ms_crToHideItems[ms_iNumHiddenEntities].y = y; + ms_crToHideItems[ms_iNumHiddenEntities].z = z; + strcpy(ms_crToHideItems[ms_iNumHiddenEntities].name, name); + ms_iNumHiddenEntities++; + break; + } + case CUT_PARTICLE_EFFECT: + { + char name[NAMELENGTH]; + char name2[NAMELENGTH]; + + int iTime; + int unk1; + int unk2; + float x; + float y; + float z; + float unkX; + float unkY; + float unkZ; + + memset(name, 0, NAMELENGTH); + memset(name2, 0, NAMELENGTH); + + strncpy(name, strtok(line, ","), NAMELENGTH-1); + iTime = atoi(strtok(0, ",")); + unk1 = atoi(strtok(0, ",")); + unk2 = atoi(strtok(0, ",")); + strncpy(name, strtok(line, ","), NAMELENGTH-1); + x = strtod(strtok(0, ","), nil); + y = strtod(strtok(0, ","), nil); + z = strtod(strtok(0, ","), nil); + unkX = strtod(strtok(0, ","), nil); + unkY = strtod(strtok(0, ","), nil); + unkZ = strtod(strtok(0, ","), nil); + + ms_pParticleEffects[ms_iNumParticleEffects].bPlayed = false; + ms_pParticleEffects[ms_iNumParticleEffects].iTime = iTime; + ms_pParticleEffects[ms_iNumParticleEffects].unk1 = unk1; + ms_pParticleEffects[ms_iNumParticleEffects].unk2 = unk2; + strcpy(CCutsceneMgr::ms_pParticleEffects[ms_iNumParticleEffects].name2, name2); + ms_pParticleEffects[ms_iNumParticleEffects].unk10 = false; + ms_pParticleEffects[ms_iNumParticleEffects].x = x; + ms_pParticleEffects[ms_iNumParticleEffects].y = y; + ms_pParticleEffects[ms_iNumParticleEffects].z = z; + ms_pParticleEffects[ms_iNumParticleEffects].unkX = unkX; + ms_pParticleEffects[ms_iNumParticleEffects].unkY = unkY; + ms_pParticleEffects[ms_iNumParticleEffects].unkZ = unkZ; + ms_pParticleEffects[ms_iNumParticleEffects].unk11 = false; + strcpy(CCutsceneMgr::ms_pParticleEffects[ms_iNumParticleEffects].name, name); + ms_iNumParticleEffects++; + break; + } + case CUT_EXTRA_COLOR: + if (!bExtraColSet) { + int colorId; + sscanf(line, "%d", &colorId); + if (colorId == 0) + bExtraColSet = false; + else { + CTimeCycle::StartExtraColour(colorId - 1, false); + bExtraColSet = true; + } + } + break; + default: + break; + }; + + } + else + { + delete[]cutsBuf; + + // add manually inserted objects + for (int i = 0; i < ms_numAppendObjectNames; i++) { + strcpy(ms_cLoadObjectName[ms_numLoadObjectNames], ms_cAppendObjectName[i]); + strcpy(ms_cLoadAnimName[ms_numLoadObjectNames], ms_cAppendAnimName[i]); + ms_iModelIndex[ms_numLoadObjectNames] = CUTMODEL_SIMPLE; + ms_numLoadObjectNames++; + } + ms_numAppendObjectNames = 0; + + int specialId = 0; + for (int i = 0; i < ms_numLoadObjectNames; i++) + { + if (strcasecmp(ms_cLoadObjectName[i], "csplay") == 0) { + ms_iModelIndex[i] = CUTMODEL_PLAYER; + continue; + } else if (ms_iModelIndex[i] == CUTMODEL_SIMPLE) { + int id; + if (CModelInfo::GetModelInfo(ms_cLoadObjectName[i], &id)) { + ms_iModelIndex[i] = id; + CStreaming::RequestModel(id, STREAMFLAGS_SCRIPTOWNED | STREAMFLAGS_DEPENDENCY | STREAMFLAGS_PRIORITY); + } else { + CStreaming::RequestSpecialModel(specialId + MI_CUTOBJ01, ms_cLoadObjectName[i], STREAMFLAGS_SCRIPTOWNED | STREAMFLAGS_DEPENDENCY | STREAMFLAGS_PRIORITY); + ms_iModelIndex[i] = specialId + MI_CUTOBJ01; + specialId++; + // skip if id is busy + while (CStreaming::ms_aInfoForModel[specialId + MI_CUTOBJ01].m_loadState == STREAMSTATE_LOADED) + specialId++; + } + } + else if (ms_iModelIndex[i] == CUTMODEL_REPEATED && i != 0) + ms_iModelIndex[i] = ms_iModelIndex[i - 1]; + } + + CStreaming::LoadAllRequestedModels(true); + ms_cutsceneLoadStatus = CUTSCENE_LOADING; + return; + } + } + + delete[]cutsBuf; + LoadCutsceneData_postload(true); +} + +void +CCutsceneMgr::DeleteCutsceneData_overlay(void) +{ + if (ms_cutsceneLoadStatus == CUTSCENE_NOT_LOADED) return; + CTimer::Suspend(); + CPopulation::PedDensityMultiplier = m_fPrevPedDensity; + CCarCtrl::CarDensityMultiplier = m_fPrevCarDensity; + if (m_PrevExtraColourOn) + CTimeCycle::StartExtraColour(m_PrevExtraColour, false); + else + CTimeCycle::StopExtraColour(m_PrevExtraColourOn); + + for (uint32 i = 0; i < ms_iNumHiddenEntities; i++) { + if (ms_pHiddenEntities[i]) { + ms_pHiddenEntities[i]->CleanUpOldReference(&ms_pHiddenEntities[i]); + ms_pHiddenEntities[i]->bIsVisible = true; + } + } + + ms_iNumHiddenEntities = 0; + ms_iNumParticleEffects = 0; + CMessages::ClearMessages(); + CRubbish::SetVisibility(true); + + ms_cutsceneProcessing = false; + ms_useLodMultiplier = false; + ms_useCutsceneShadows = false; + + ms_numCutsceneObjs--; + while (ms_numCutsceneObjs >= 0) { + CWorld::Remove(ms_pCutsceneObjects[ms_numCutsceneObjs]); + ms_pCutsceneObjects[ms_numCutsceneObjs]->DeleteRwObject(); + delete ms_pCutsceneObjects[ms_numCutsceneObjs]; + ms_pCutsceneObjects[ms_numCutsceneObjs] = nil; + ms_numCutsceneObjs--; + } + ms_numCutsceneObjs = 0; + + if (ms_animLoaded) + CAnimManager::RemoveLastAnimFile(); + + ms_animLoaded = false; + ms_cutsceneAssociations.DestroyAssociations(); + + ms_aUncompressedCutsceneAnims[0][0] = '\0'; + ms_numUncompressedCutsceneAnims = 0; + + if (bCamLoaded) { + TheCamera.RestoreWithJumpCut(); + TheCamera.SetWideScreenOff(); + TheCamera.DeleteCutSceneCamDataMemory(); + } + ms_cutsceneLoadStatus = CUTSCENE_NOT_LOADED; + ms_running = false; + + FindPlayerPed()->bIsVisible = true; + CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_CUTSCENE); + CWorld::Players[CWorld::PlayerInFocus].MakePlayerSafe(false); + + if (CGeneral::faststricmp(ms_cutsceneName, "finale")) { + DMAudio.StopCutSceneMusic(); + DMAudio.ChangeMusicMode(MUSICMODE_GAME); + } + + CStreaming::ms_disableStreaming = false; + CWorld::bProcessCutsceneOnly = false; + + //if(bCamLoaded) + // CGame::DrasticTidyUpMemory(TheCamera.GetScreenFadeStatus() == FADE_2); + + CPad::GetPad(0)->Clear(false); + + if (bModelsRemovedForCutscene) { + CStreaming::LoadInitialPeds(); + CStreaming::LoadInitialWeapons(); + CStreaming::LoadInitialVehicles(); + bModelsRemovedForCutscene = false; + + CPlayerPed *pPlayerPed = FindPlayerPed(); + for (int i = 0; i < NumberOfSavedWeapons; i++) { + int32 weaponModelId = CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModelId; + uint8 flags = CStreaming::ms_aInfoForModel[weaponModelId].m_flags; + CStreaming::RequestModel(weaponModelId, STREAMFLAGS_DONT_REMOVE); + CStreaming::LoadAllRequestedModels(false); + if (CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModel2Id != -1) { + CStreaming::RequestModel(CWeaponInfo::GetWeaponInfo(SavedWeaponIDs[i])->m_nModel2Id, 0); + CStreaming::LoadAllRequestedModels(false); + } + if (!(flags & STREAMFLAGS_DONT_REMOVE)) + CStreaming::SetModelIsDeletable(weaponModelId); + pPlayerPed->GiveWeapon(SavedWeaponIDs[i], SavedWeaponAmmo[i], true); + } + NumberOfSavedWeapons = 0; + } + + for (int i = 0; i < ms_numLoadObjectNames; i++) + CStreaming::SetMissionDoesntRequireModel(ms_iModelIndex[i]); + + CStreaming::SetMissionDoesntRequireModel(MI_COP); + CStreaming::StreamZoneModels(FindPlayerCoors()); + CTimer::Resume(); +} + +void +CCutsceneMgr::Update_overlay(void) +{ + if (ms_cutsceneLoadStatus == CUTSCENE_LOADING) { + debug("Loading Cutscene...\n"); + CTimer::Suspend(); + LoadCutsceneData_loading(); + CTimer::Resume(); + return; + } + + if (ms_cutsceneLoadStatus != CUTSCENE_LOADED) { + debug("Cutscene Not Loaded!\n"); + return; + } + + switch (ms_cutscenePlayStatus) { + case CUTSCENE_STARTED: + SetupCutsceneToStart(); + HideRequestedObjects(); + ms_cutscenePlayStatus++; + break; + case CUTSCENE_PLAYING_2: + case CUTSCENE_PLAYING_3: + ms_cutscenePlayStatus++; + break; + case CUTSCENE_PLAYING_4: + ms_cutscenePlayStatus = CUTSCENE_PLAYING_0; + if (CGeneral::faststricmp(ms_cutsceneName, "finale")) + DMAudio.PlayPreloadedCutSceneMusic(); + break; + default: + break; + } + + if (!ms_running) return; + + ms_cutsceneTimer += CTimer::GetTimeStepNonClippedInSeconds(); + uint32 cutsceneTimeInMS = GetCutsceneTimeInMilleseconds(); + + if (ms_currTextOutput < ms_numTextOutput && cutsceneTimeInMS > ms_iTextStartTime[ms_currTextOutput]) { + CMessages::AddMessageJumpQ(TheText.Get(ms_cTextOutput[ms_currTextOutput]), ms_iTextDuration[ms_currTextOutput], 1); + ms_currTextOutput++; + } + + for (int i = 0; i < ms_numCutsceneObjs; i++) { + int modelId = ms_pCutsceneObjects[i]->GetModelIndex(); + if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ10) + UpdateCutsceneObjectBoundingBox(ms_pCutsceneObjects[i]->GetClump(), modelId); + } + + if (!bCamLoaded) return; + + if (CGeneral::faststricmp(ms_cutsceneName, "finale") && TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FLYBY && ms_cutsceneLoadStatus == CUTSCENE_LOADED) { + if (TheCamera.GetCutSceneFinishTime() < cutsceneTimeInMS + 1000) { + if (!bCamFading) { + bCamFading = true; + TheCamera.Fade(1.0f, FADE_OUT); + } + } + if (mCutsceneSkipFading) { + mCutsceneSkipFadeTime -= CTimer::GetTimeStepInMilliseconds(); + if (mCutsceneSkipFadeTime < 0) { + CHud::m_BigMessage[1][0] = '\0'; + ms_wasCutsceneSkipped = true; + FinishCutscene(); + mCutsceneSkipFading = false; + mCutsceneSkipFadeTime = 0; + } + } + else if (IsCutsceneSkipButtonBeingPressed() && PresubBodge()){ + mCutsceneSkipFading = true; + mCutsceneSkipFadeTime = 1000; + TheCamera.Fade(1.0f, FADE_OUT); + } + } +} \ No newline at end of file diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index c692a51b..cd341eac 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -9407,7 +9407,7 @@ struct MissionAudioData { const MissionAudioData MissionAudioNameSfxAssoc[] = { - {"mobring", STREAMED_SOUND_MISSION_MOBR1}, {"pagring", STREAMED_SOUND_MISSION_PAGER}, {"carrev", STREAMED_SOUND_MISSION_CARREV}, + /*{"mobring", STREAMED_SOUND_MISSION_MOBR1}, {"pagring", STREAMED_SOUND_MISSION_PAGER}, {"carrev", STREAMED_SOUND_MISSION_CARREV}, {"bikerev", STREAMED_SOUND_MISSION_BIKEREV}, {"liftop", STREAMED_SOUND_MISSION_LIFTOP}, {"liftcl", STREAMED_SOUND_MISSION_LIFTCL}, {"liftrun", STREAMED_SOUND_MISSION_LIFTRUN}, {"liftbel", STREAMED_SOUND_MISSION_LIFTBEL}, {"inlift", STREAMED_SOUND_MISSION_INLIFT}, {"caml", STREAMED_SOUND_MISSION_CAMERAL}, {"camr", STREAMED_SOUND_MISSION_CAMERAR}, {"cheer1", STREAMED_SOUND_MISSION_CHEER1}, @@ -9780,7 +9780,7 @@ const MissionAudioData MissionAudioNameSfxAssoc[] = { {"bust_18", STREAMED_SOUND_MISSION_BUST_18}, {"bust_19", STREAMED_SOUND_MISSION_BUST_19}, {"bust_20", STREAMED_SOUND_MISSION_BUST_20}, {"bust_21", STREAMED_SOUND_MISSION_BUST_21}, {"bust_22", STREAMED_SOUND_MISSION_BUST_22}, {"bust_23", STREAMED_SOUND_MISSION_BUST_23}, {"bust_24", STREAMED_SOUND_MISSION_BUST_24}, {"bust_25", STREAMED_SOUND_MISSION_BUST_25}, {"bust_26", STREAMED_SOUND_MISSION_BUST_26}, - {"bust_27", STREAMED_SOUND_MISSION_BUST_27}, {"bust_28", STREAMED_SOUND_MISSION_BUST_28}, {nil, 0} }; + {"bust_27", STREAMED_SOUND_MISSION_BUST_27}, {"bust_28", STREAMED_SOUND_MISSION_BUST_28}, */ {nil, 0} }; int32 FindMissionAudioSfx(const char *name) @@ -9847,8 +9847,8 @@ cAudioManager::PlayLoadedMissionAudio(uint8 slot) bool cAudioManager::ShouldDuckMissionAudio(uint8 slot) const { - if (IsMissionAudioSamplePlaying(slot)) - return m_sMissionAudio.m_nSampleIndex[slot] != STREAMED_SOUND_MISSION_ROK2_01; + //if (IsMissionAudioSamplePlaying(slot)) + // return m_sMissionAudio.m_nSampleIndex[slot] != STREAMED_SOUND_MISSION_ROK2_01; return false; } @@ -9947,11 +9947,11 @@ cAudioManager::ProcessMissionAudioSlot(uint8 slot) if (m_nUserPause) SampleManager.PauseStream(1, slot + 1); if (m_sMissionAudio.m_bPredefinedProperties[slot]) { - if (m_sMissionAudio.m_nSampleIndex[slot] == STREAMED_SOUND_MISSION_CAMERAL) - SampleManager.SetStreamedVolumeAndPan(80, 0, 1, slot + 1); - else if (m_sMissionAudio.m_nSampleIndex[slot] == STREAMED_SOUND_MISSION_CAMERAR) - SampleManager.SetStreamedVolumeAndPan(80, 127, 1, slot + 1); - else + //if (m_sMissionAudio.m_nSampleIndex[slot] == STREAMED_SOUND_MISSION_CAMERAL) + // SampleManager.SetStreamedVolumeAndPan(80, 0, 1, slot + 1); + //else if (m_sMissionAudio.m_nSampleIndex[slot] == STREAMED_SOUND_MISSION_CAMERAR) + // SampleManager.SetStreamedVolumeAndPan(80, 127, 1, slot + 1); + //else SampleManager.SetStreamedVolumeAndPan(80, 63, 1, slot + 1); } else { distSquared = GetDistanceSquared(m_sMissionAudio.m_vecPos[slot]); @@ -9973,8 +9973,8 @@ cAudioManager::ProcessMissionAudioSlot(uint8 slot) } m_sMissionAudio.m_nPlayStatus[slot] = PLAY_STATUS_PLAYING; nCheckPlayingDelay[slot] = 30; - if (m_sMissionAudio.m_nSampleIndex[slot] >= STREAMED_SOUND_MISSION_MOB_01A && m_sMissionAudio.m_nSampleIndex[slot] <= STREAMED_SOUND_MISSION_MOB_99A) - m_sMissionAudio.m_bIsMobile[slot] = true; + //if (m_sMissionAudio.m_nSampleIndex[slot] >= STREAMED_SOUND_MISSION_MOB_01A && m_sMissionAudio.m_nSampleIndex[slot] <= STREAMED_SOUND_MISSION_MOB_99A) + // m_sMissionAudio.m_bIsMobile[slot] = true; break; case PLAY_STATUS_PLAYING: if (m_bTimerJustReset) { @@ -10017,12 +10017,12 @@ cAudioManager::ProcessMissionAudioSlot(uint8 slot) SampleManager.SetStreamedVolumeAndPan(emittingVol, pan, 1, slot + 1); } } - } else if (m_sMissionAudio.m_nSampleIndex[slot] == STREAMED_SOUND_MISSION_ROK2_01) { - m_sMissionAudio.m_nPlayStatus[slot] = PLAY_STATUS_STOPPED; + //} else if (m_sMissionAudio.m_nSampleIndex[slot] == STREAMED_SOUND_MISSION_ROK2_01) { + // m_sMissionAudio.m_nPlayStatus[slot] = PLAY_STATUS_STOPPED; } else { m_sMissionAudio.m_nPlayStatus[slot] = PLAY_STATUS_FINISHED; - if (m_sMissionAudio.m_nSampleIndex[slot] >= STREAMED_SOUND_MISSION_MOB_01A && m_sMissionAudio.m_nSampleIndex[slot] <= STREAMED_SOUND_MISSION_MOB_99A) - m_sMissionAudio.m_bIsMobile[slot] = false; + //if (m_sMissionAudio.m_nSampleIndex[slot] >= STREAMED_SOUND_MISSION_MOB_01A && m_sMissionAudio.m_nSampleIndex[slot] <= STREAMED_SOUND_MISSION_MOB_99A) + // m_sMissionAudio.m_bIsMobile[slot] = false; m_sMissionAudio.m_nSampleIndex[slot] = NO_SAMPLE; SampleManager.StopStreamedFile(slot + 1); m_sMissionAudio.m_nMissionAudioCounter[slot] = 0; diff --git a/src/audio/MusicManager.cpp b/src/audio/MusicManager.cpp index 098b2fc3..2a16dc14 100644 --- a/src/audio/MusicManager.cpp +++ b/src/audio/MusicManager.cpp @@ -160,8 +160,8 @@ cMusicManager::SetStartingTrackPositions(uint8 isNewGameTimer) if (i < STREAMED_SOUND_CITY_AMBIENT && isNewGameTimer) m_aTracks[i].m_nPosition = NewGameRadioTimers[i]; - else if (i < STREAMED_SOUND_ANNOUNCE_BRIDGE_CLOSED) - m_aTracks[i].m_nPosition = (pos * AudioManager.GetRandomNumber(i % 5)) % m_aTracks[i].m_nLength; + //else if (i < STREAMED_SOUND_ANNOUNCE_BRIDGE_CLOSED) + // m_aTracks[i].m_nPosition = (pos * AudioManager.GetRandomNumber(i % 5)) % m_aTracks[i].m_nLength; else m_aTracks[i].m_nPosition = 0; @@ -658,7 +658,7 @@ cMusicManager::ServiceGameMode() } if (vehicle == nil) { - m_nFrontendTrack = STREAMED_SOUND_RADIO_WAVE; // huh? + m_nFrontendTrack = STREAMED_SOUND_RADIO_LCFR; // huh? return; } if (m_bRadioSetByScript) @@ -712,7 +712,7 @@ cMusicManager::SetUpCorrectAmbienceTrack() else if (TheCamera.DistanceToWater <= 90.0f) { if (CCullZones::bAtBeachForAudio) { if (CWeather::OldWeatherType != WEATHER_HURRICANE && CWeather::NewWeatherType != WEATHER_HURRICANE || CWeather::Wind <= 1.0f) - m_nFrontendTrack = STREAMED_SOUND_BEACH_AMBIENT; + m_nFrontendTrack = STREAMED_SOUND_SAWMILL; else m_nFrontendTrack = STREAMED_SOUND_HAVANA_BEACH_AMBIENT; } diff --git a/src/audio/audio_enums.h b/src/audio/audio_enums.h index 91fcec49..b2fb627c 100644 --- a/src/audio/audio_enums.h +++ b/src/audio/audio_enums.h @@ -12,8 +12,8 @@ enum eRadioStation EMOTION, WAVE, USERTRACK, - NUM_RADIOS = 10, - POLICE_RADIO = 10, + NUM_RADIOS = 11, + POLICE_RADIO = 11, //TAXI_RADIO, RADIO_OFF, }; @@ -38,1230 +38,72 @@ enum ePlayerMood enum eStreamedSounds { - STREAMED_SOUND_RADIO_WILD, + STREAMED_SOUND_RADIO_HEAD, + STREAMED_SOUND_RADIO_DOUBLE, + STREAMED_SOUND_RADIO_KJAH, + STREAMED_SOUND_RADIO_RISE, + STREAMED_SOUND_RADIO_LIPS, + STREAMED_SOUND_RADIO_MUNDO, + STREAMED_SOUND_RADIO_MSX, STREAMED_SOUND_RADIO_FLASH, - STREAMED_SOUND_RADIO_KCHAT, - STREAMED_SOUND_RADIO_FEVER, - STREAMED_SOUND_RADIO_VROCK, - STREAMED_SOUND_RADIO_VCPR, - STREAMED_SOUND_RADIO_ESPANTOSO, - STREAMED_SOUND_RADIO_EMOTION, - STREAMED_SOUND_RADIO_WAVE, + STREAMED_SOUND_RADIO_LCJ, + STREAMED_SOUND_RADIO_LCFR, STREAMED_SOUND_RADIO_MP3_PLAYER, STREAMED_SOUND_CITY_AMBIENT, STREAMED_SOUND_WATER_AMBIENT, - STREAMED_SOUND_BEACH_AMBIENT, - STREAMED_SOUND_HAVANA_CITY_AMBIENT, - STREAMED_SOUND_HAVANA_WATER_AMBIENT, - STREAMED_SOUND_HAVANA_BEACH_AMBIENT, - STREAMED_SOUND_MALL_AMBIENT, - STREAMED_SOUND_STRIPCLUB_AMBIENT, - STREAMED_SOUND_MALIBU_AMBIENT, - STREAMED_SOUND_HOTEL_AMBIENT, - STREAMED_SOUND_DIRTRING_AMBIENT, - STREAMED_SOUND_LAW4RIOT_AMBIENT, - STREAMED_SOUND_AMBSIL_AMBIENT, + STREAMED_SOUND_SAWMILL, + STREAMED_SOUND_HAVANA_CITY_AMBIENT, // CITY + STREAMED_SOUND_HAVANA_WATER_AMBIENT, // WATER + STREAMED_SOUND_HAVANA_BEACH_AMBIENT, // WATER + STREAMED_SOUND_MALL_AMBIENT, // CITY + STREAMED_SOUND_STRIPCLUB_AMBIENT, // CITY + STREAMED_SOUND_MALIBU_AMBIENT, // CITY + STREAMED_SOUND_HOTEL_AMBIENT, // CITY + STREAMED_SOUND_DIRTRING_AMBIENT, // CITY + STREAMED_SOUND_LAW4RIOT_AMBIENT, // CITY + STREAMED_SOUND_AMBSIL_AMBIENT, // CITY STREAMED_SOUND_RADIO_POLICE, STREAMED_SOUND_RADIO_TAXI, - STREAMED_SOUND_ANNOUNCE_BRIDGE_CLOSED, - STREAMED_SOUND_ANNOUNCE_BRIDGE_OPEN, - STREAMED_SOUND_CUTSCENE_ASS_1, - STREAMED_SOUND_CUTSCENE_ASS_2, - STREAMED_SOUND_CUTSCENE_BANK_1, - STREAMED_SOUND_CUTSCENE_BANK_2A, - STREAMED_SOUND_CUTSCENE_BANK_2B, - STREAMED_SOUND_CUTSCENE_BANK_3A, - STREAMED_SOUND_CUTSCENE_BANK_3B, - STREAMED_SOUND_CUTSCENE_BANK_4, - STREAMED_SOUND_CUTSCENE_BIKE_1, - STREAMED_SOUND_CUTSCENE_BIKE_2, - STREAMED_SOUND_CUTSCENE_BIKE_3, - STREAMED_SOUND_CUTSCENE_BUD_1, - STREAMED_SOUND_CUTSCENE_BUD_2, - STREAMED_SOUND_CUTSCENE_BUD_3, - STREAMED_SOUND_CUTSCENE_CAP_1, - STREAMED_SOUND_CUTSCENE_CAR_1, - STREAMED_SOUND_CUTSCENE_CNT_1A, - STREAMED_SOUND_CUTSCENE_CNT_1B, - STREAMED_SOUND_CUTSCENE_CNT_2, - STREAMED_SOUND_CUTSCENE_COK_1, - STREAMED_SOUND_CUTSCENE_COK_2A, - STREAMED_SOUND_CUTSCENE_COK_2B, - STREAMED_SOUND_CUTSCENE_COK_3, - STREAMED_SOUND_CUTSCENE_COK_4A, - STREAMED_SOUND_CUTSCENE_COK_4A2, - STREAMED_SOUND_CUTSCENE_COK_4B, - STREAMED_SOUND_CUTSCENE_COL_1, - STREAMED_SOUND_CUTSCENE_COL_2, - STREAMED_SOUND_CUTSCENE_COL_3A, - STREAMED_SOUND_CUTSCENE_COL_4A, - STREAMED_SOUND_CUTSCENE_COL_5A, - STREAMED_SOUND_CUTSCENE_COL_5B, - STREAMED_SOUND_CUTSCENE_CUB_1, - STREAMED_SOUND_CUTSCENE_CUB_2, - STREAMED_SOUND_CUTSCENE_CUB_3, - STREAMED_SOUND_CUTSCENE_CUB_4, - STREAMED_SOUND_CUTSCENE_DRUG_1, - STREAMED_SOUND_CUTSCENE_FIN, - STREAMED_SOUND_CUTSCENE_FIN2, + STREAMED_SOUND_NEWS_A, + STREAMED_SOUND_NEWS_B, + STREAMED_SOUND_NEWS_C, + STREAMED_SOUND_NEWS_D, + STREAMED_SOUND_NEWS_E, + STREAMED_SOUND_NEWS_F, + STREAMED_SOUND_NEWS_G, + STREAMED_SOUND_NEWS_H, + STREAMED_SOUND_NEWS_I, + STREAMED_SOUND_NEWS_J, + STREAMED_SOUND_NEWS_K, + STREAMED_SOUND_NEWS_L, + STREAMED_SOUND_NEWS_M, + STREAMED_SOUND_NEWS_N, + STREAMED_SOUND_CUTSCENE_BIKER, + STREAMED_SOUND_CUTSCENE_BONEVOY, + STREAMED_SOUND_CUTSCENE_CAMPAIN, + STREAMED_SOUND_CUTSCENE_CASHCHP, + STREAMED_SOUND_CUTSCENE_CONTBAN, + STREAMED_SOUND_CUTSCENE_CRAZY69, + STREAMED_SOUND_CUTSCENE_CUTTEST, + STREAMED_SOUND_CUTSCENE_DEADLY, + STREAMED_SOUND_CUTSCENE_DONPROB, + STREAMED_SOUND_CUTSCENE_DRIVNMR, + STREAMED_SOUND_CUTSCENE_ELECTON, + STREAMED_SOUND_CUTSCENE_FINAL, + STREAMED_SOUND_CUTSCENE_FINAL_2, + STREAMED_SOUND_CUTSCENE_HOMSWET, + STREAMED_SOUND_CUTSCENE_HOTWHEL, + STREAMED_SOUND_CUTSCENE_KIDNAPP, + STREAMED_SOUND_CUTSCENE_LANDGRB, + STREAMED_SOUND_CUTSCENE_MORGUE, + STREAMED_SOUND_CUTSCENE_OVERDOS, + STREAMED_SOUND_CUTSCENE_RUFJUST, + STREAMED_SOUND_CUTSCENE_SAYONAR, + STREAMED_SOUND_CUTSCENE_SICILAN, + STREAMED_SOUND_CUTSCENE_THEOFER, + STREAMED_SOUND_CUTSCENE_INTRO, STREAMED_SOUND_CUTSCENE_FINALE, - STREAMED_SOUND_CUTSCENE_HAT_1, - STREAMED_SOUND_CUTSCENE_HAT_2, - STREAMED_SOUND_CUTSCENE_HAT_3, - STREAMED_SOUND_CUTSCENE_ICE_1, - STREAMED_SOUND_CUTSCENE_INT_A, - STREAMED_SOUND_CUTSCENE_INT_B, - STREAMED_SOUND_CUTSCENE_INT_D, - STREAMED_SOUND_CUTSCENE_INT_M, - STREAMED_SOUND_CUTSCENE_LAW_1A, - STREAMED_SOUND_CUTSCENE_LAW_1B, - STREAMED_SOUND_CUTSCENE_LAW_2A, - STREAMED_SOUND_CUTSCENE_LAW_2B, - STREAMED_SOUND_CUTSCENE_LAW_2C, - STREAMED_SOUND_CUTSCENE_LAW_3, - STREAMED_SOUND_CUTSCENE_LAW_4, - STREAMED_SOUND_CUTSCENE_PHIL_1, - STREAMED_SOUND_CUTSCENE_PHIL_2, - STREAMED_SOUND_CUTSCENE_PORN_1, - STREAMED_SOUND_CUTSCENE_PORN_2, - STREAMED_SOUND_CUTSCENE_PORN_3, - STREAMED_SOUND_CUTSCENE_PORN_4, - STREAMED_SOUND_CUTSCENE_RESC_1A, - STREAMED_SOUND_CUTSCENE_ROK_1, - STREAMED_SOUND_CUTSCENE_ROK_2, - STREAMED_SOUND_CUTSCENE_ROK_3A, - STREAMED_SOUND_CUTSCENE_STRIPA, - STREAMED_SOUND_CUTSCENE_TAX_1, - STREAMED_SOUND_CUTSCENE_TEX_1, - STREAMED_SOUND_CUTSCENE_TEX_2, - STREAMED_SOUND_CUTSCENE_TEX_3, - STREAMED_SOUND_CUTSCENE_GLIGHT, - STREAMED_SOUND_CUTSCENE_FIST, - STREAMED_SOUND_CUTSCENE_ELBURRO1_PH1, - STREAMED_SOUND_CUTSCENE_ELBURRO2_PH2, STREAMED_SOUND_MISSION_COMPLETED, - STREAMED_SOUND_MISSION_COMPLETED4, - STREAMED_SOUND_MISSION_MOBR1, - STREAMED_SOUND_MISSION_PAGER, - STREAMED_SOUND_MISSION_CARREV, - STREAMED_SOUND_MISSION_BIKEREV, - STREAMED_SOUND_MISSION_LIFTOP, - STREAMED_SOUND_MISSION_LIFTCL, - STREAMED_SOUND_MISSION_LIFTRUN, - STREAMED_SOUND_MISSION_LIFTBEL, - STREAMED_SOUND_MISSION_INLIFT, - STREAMED_SOUND_MISSION_SFX_01, - STREAMED_SOUND_MISSION_SFX_02, - STREAMED_SOUND_MISSION_CAMERAL, - STREAMED_SOUND_MISSION_CAMERAR, - STREAMED_SOUND_MISSION_CHEER1, - STREAMED_SOUND_MISSION_CHEER2, - STREAMED_SOUND_MISSION_CHEER3, - STREAMED_SOUND_MISSION_CHEER4, - STREAMED_SOUND_MISSION_OOH1, - STREAMED_SOUND_MISSION_OOH2, - STREAMED_SOUND_MISSION_RACE1, - STREAMED_SOUND_MISSION_RACE2, - STREAMED_SOUND_MISSION_RACE3, - STREAMED_SOUND_MISSION_RACE4, - STREAMED_SOUND_MISSION_RACE5, - STREAMED_SOUND_MISSION_RACE6, - STREAMED_SOUND_MISSION_RACE7, - STREAMED_SOUND_MISSION_RACE8, - STREAMED_SOUND_MISSION_RACE9, - STREAMED_SOUND_MISSION_RACE10, - STREAMED_SOUND_MISSION_RACE11, - STREAMED_SOUND_MISSION_RACE12, - STREAMED_SOUND_MISSION_RACE13, - STREAMED_SOUND_MISSION_RACE14, - STREAMED_SOUND_MISSION_RACE15, - STREAMED_SOUND_MISSION_HOT1, - STREAMED_SOUND_MISSION_HOT2, - STREAMED_SOUND_MISSION_HOT3, - STREAMED_SOUND_MISSION_HOT4, - STREAMED_SOUND_MISSION_HOT5, - STREAMED_SOUND_MISSION_HOT6, - STREAMED_SOUND_MISSION_HOT7, - STREAMED_SOUND_MISSION_HOT8, - STREAMED_SOUND_MISSION_HOT9, - STREAMED_SOUND_MISSION_HOT10, - STREAMED_SOUND_MISSION_HOT11, - STREAMED_SOUND_MISSION_HOT12, - STREAMED_SOUND_MISSION_HOT13, - STREAMED_SOUND_MISSION_HOT14, - STREAMED_SOUND_MISSION_HOT15, - STREAMED_SOUND_MISSION_LANSTP1, - STREAMED_SOUND_MISSION_LANSTP2, - STREAMED_SOUND_MISSION_LANAMU1, - STREAMED_SOUND_MISSION_LANAMU2, - STREAMED_SOUND_MISSION_AIRHORNL, - STREAMED_SOUND_MISSION_AIRHORNR, - STREAMED_SOUND_MISSION_SNIPSCRL, - STREAMED_SOUND_MISSION_SNIPSHORT, - STREAMED_SOUND_MISSION_BLOWROOF, - STREAMED_SOUND_MISSION_ASS_1, - STREAMED_SOUND_MISSION_ASS_2, - STREAMED_SOUND_MISSION_ASS_3, - STREAMED_SOUND_MISSION_ASS_4, - STREAMED_SOUND_MISSION_ASS_5, - STREAMED_SOUND_MISSION_ASS_6, - STREAMED_SOUND_MISSION_ASS_7, - STREAMED_SOUND_MISSION_ASS_8, - STREAMED_SOUND_MISSION_ASS_9, - STREAMED_SOUND_MISSION_ASS_10, - STREAMED_SOUND_MISSION_ASS_11, - STREAMED_SOUND_MISSION_ASS_12, - STREAMED_SOUND_MISSION_ASS_13, - STREAMED_SOUND_MISSION_ASS_14, - STREAMED_SOUND_MISSION_BIKE1_1, - STREAMED_SOUND_MISSION_BIKE1_2, - STREAMED_SOUND_MISSION_BIKE1_3, - STREAMED_SOUND_MISSION_BNK1_1, - STREAMED_SOUND_MISSION_BNK1_2, - STREAMED_SOUND_MISSION_BNK1_3, - STREAMED_SOUND_MISSION_BNK1_4, - STREAMED_SOUND_MISSION_BNK1_5, - STREAMED_SOUND_MISSION_BNK1_6, - STREAMED_SOUND_MISSION_BNK1_7, - STREAMED_SOUND_MISSION_BNK1_8, - STREAMED_SOUND_MISSION_BNK1_10, - STREAMED_SOUND_MISSION_BNK1_11, - STREAMED_SOUND_MISSION_BNK1_12, - STREAMED_SOUND_MISSION_BNK1_13, - STREAMED_SOUND_MISSION_BNK1_14, - STREAMED_SOUND_MISSION_BNK2_1, - STREAMED_SOUND_MISSION_BNK2_2, - STREAMED_SOUND_MISSION_BNK2_3, - STREAMED_SOUND_MISSION_BNK2_4, - STREAMED_SOUND_MISSION_BNK2_5, - STREAMED_SOUND_MISSION_BNK2_6, - STREAMED_SOUND_MISSION_BNK2_7, - STREAMED_SOUND_MISSION_BNK2_8, - STREAMED_SOUND_MISSION_BNK2_9, - STREAMED_SOUND_MISSION_BNK3_1, - STREAMED_SOUND_MISSION_BNK3_2, - STREAMED_SOUND_MISSION_BNK3_3A, - STREAMED_SOUND_MISSION_BNK3_3B, - STREAMED_SOUND_MISSION_BNK3_3C, - STREAMED_SOUND_MISSION_BNK3_4A, - STREAMED_SOUND_MISSION_BNK3_4B, - STREAMED_SOUND_MISSION_BNK3_4C, - STREAMED_SOUND_MISSION_BNK4_1, - STREAMED_SOUND_MISSION_BNK4_2, - STREAMED_SOUND_MISSION_BNK4_3A, - STREAMED_SOUND_MISSION_BNK4_3B, - STREAMED_SOUND_MISSION_BNK4_3C, - STREAMED_SOUND_MISSION_BNK4_3D, - STREAMED_SOUND_MISSION_BNK4_3E, - STREAMED_SOUND_MISSION_BNK4_3F, - STREAMED_SOUND_MISSION_BNK4_3G, - STREAMED_SOUND_MISSION_BNK4_3H, - STREAMED_SOUND_MISSION_BNK4_3I, - STREAMED_SOUND_MISSION_BNK4_3J, - STREAMED_SOUND_MISSION_BNK4_3K, - STREAMED_SOUND_MISSION_BNK4_3M, - STREAMED_SOUND_MISSION_BNK4_3O, - STREAMED_SOUND_MISSION_BNK4_3P, - STREAMED_SOUND_MISSION_BNK4_3Q, - STREAMED_SOUND_MISSION_BNK4_3R, - STREAMED_SOUND_MISSION_BNK4_3S, - STREAMED_SOUND_MISSION_BNK4_3T, - STREAMED_SOUND_MISSION_BNK4_3U, - STREAMED_SOUND_MISSION_BNK4_3V, - STREAMED_SOUND_MISSION_BNK4_4A, - STREAMED_SOUND_MISSION_BNK4_4B, - STREAMED_SOUND_MISSION_BNK4_5, - STREAMED_SOUND_MISSION_BNK4_6, - STREAMED_SOUND_MISSION_BNK4_7, - STREAMED_SOUND_MISSION_BNK4_8, - STREAMED_SOUND_MISSION_BNK4_9, - STREAMED_SOUND_MISSION_BNK4_10, - STREAMED_SOUND_MISSION_BNK4_11, - STREAMED_SOUND_MISSION_BK4_12A, - STREAMED_SOUND_MISSION_BK4_12B, - STREAMED_SOUND_MISSION_BK4_12C, - STREAMED_SOUND_MISSION_BNK4_13, - STREAMED_SOUND_MISSION_BK4_14A, - STREAMED_SOUND_MISSION_BK4_14B, - STREAMED_SOUND_MISSION_BNK4_15, - STREAMED_SOUND_MISSION_BNK4_16, - STREAMED_SOUND_MISSION_BNK4_17, - STREAMED_SOUND_MISSION_BNK4_18, - STREAMED_SOUND_MISSION_BK4_19A, - STREAMED_SOUND_MISSION_BK4_19B, - STREAMED_SOUND_MISSION_BK4_20A, - STREAMED_SOUND_MISSION_BK4_20B, - STREAMED_SOUND_MISSION_BNK4_21, - STREAMED_SOUND_MISSION_BNK422A, - STREAMED_SOUND_MISSION_BNK422B, - STREAMED_SOUND_MISSION_BK4_23A, - STREAMED_SOUND_MISSION_BK4_23B, - STREAMED_SOUND_MISSION_BK4_23C, - STREAMED_SOUND_MISSION_BK4_23D, - STREAMED_SOUND_MISSION_BK4_24A, - STREAMED_SOUND_MISSION_BK4_24B, - STREAMED_SOUND_MISSION_BNK4_25, - STREAMED_SOUND_MISSION_BNK4_26, - STREAMED_SOUND_MISSION_BNK4_27, - STREAMED_SOUND_MISSION_BNK4_28, - STREAMED_SOUND_MISSION_BNK4_29, - STREAMED_SOUND_MISSION_BNK4_30, - STREAMED_SOUND_MISSION_BK4_31A, - STREAMED_SOUND_MISSION_BK4_31B, - STREAMED_SOUND_MISSION_BNK4_32, - STREAMED_SOUND_MISSION_BK4_34A, - STREAMED_SOUND_MISSION_BK4_34B, - STREAMED_SOUND_MISSION_BK4_35A, - STREAMED_SOUND_MISSION_BK4_35B, - STREAMED_SOUND_MISSION_BNK4_36, - STREAMED_SOUND_MISSION_BNK4_37, - STREAMED_SOUND_MISSION_BNK4_38, - STREAMED_SOUND_MISSION_BNK4_39, - STREAMED_SOUND_MISSION_BK4_40A, - STREAMED_SOUND_MISSION_BK4_40B, - STREAMED_SOUND_MISSION_BNK4_41, - STREAMED_SOUND_MISSION_BNK4_42, - STREAMED_SOUND_MISSION_BNK4_43, - STREAMED_SOUND_MISSION_BNK4_44, - STREAMED_SOUND_MISSION_BNK4_45, - STREAMED_SOUND_MISSION_BNK4_46, - STREAMED_SOUND_MISSION_BNK4_47, - STREAMED_SOUND_MISSION_BNK4_48, - STREAMED_SOUND_MISSION_BNK4_49, - STREAMED_SOUND_MISSION_BNK450A, - STREAMED_SOUND_MISSION_BNK450B, - STREAMED_SOUND_MISSION_BNK4_51, - STREAMED_SOUND_MISSION_BNK4_94, - STREAMED_SOUND_MISSION_BNK4_95, - STREAMED_SOUND_MISSION_BNK4_96, - STREAMED_SOUND_MISSION_BNK4_97, - STREAMED_SOUND_MISSION_BNK4_98, - STREAMED_SOUND_MISSION_BNK4_99, - STREAMED_SOUND_MISSION_BUD1_1, - STREAMED_SOUND_MISSION_BUD1_2, - STREAMED_SOUND_MISSION_BUD1_3, - STREAMED_SOUND_MISSION_BUD1_4, - STREAMED_SOUND_MISSION_BUD1_5, - STREAMED_SOUND_MISSION_BUD1_9, - STREAMED_SOUND_MISSION_BUD1_10, - STREAMED_SOUND_MISSION_BUD2_1, - STREAMED_SOUND_MISSION_BUD2_2, - STREAMED_SOUND_MISSION_BUD2_3, - STREAMED_SOUND_MISSION_BUD2_4, - STREAMED_SOUND_MISSION_BUD2_5, - STREAMED_SOUND_MISSION_BUD2_6, - STREAMED_SOUND_MISSION_BUD2_7, - STREAMED_SOUND_MISSION_BUD3_1, - STREAMED_SOUND_MISSION_BUD3_1A, - STREAMED_SOUND_MISSION_BUD3_1B, - STREAMED_SOUND_MISSION_BUD3_1C, - STREAMED_SOUND_MISSION_BUD3_2, - STREAMED_SOUND_MISSION_BUD3_3, - STREAMED_SOUND_MISSION_BUD3_4, - STREAMED_SOUND_MISSION_BUD3_5, - STREAMED_SOUND_MISSION_BUD3_6, - STREAMED_SOUND_MISSION_BUD3_7, - STREAMED_SOUND_MISSION_BUD3_8A, - STREAMED_SOUND_MISSION_BUD3_8B, - STREAMED_SOUND_MISSION_BUD3_8C, - STREAMED_SOUND_MISSION_BUD3_9A, - STREAMED_SOUND_MISSION_BUD3_9B, - STREAMED_SOUND_MISSION_BUD3_9C, - STREAMED_SOUND_MISSION_CAP1_2, - STREAMED_SOUND_MISSION_CAP1_3, - STREAMED_SOUND_MISSION_CAP1_4, - STREAMED_SOUND_MISSION_CAP1_5, - STREAMED_SOUND_MISSION_CAP1_6, - STREAMED_SOUND_MISSION_CAP1_7, - STREAMED_SOUND_MISSION_CAP1_8, - STREAMED_SOUND_MISSION_CAP1_9, - STREAMED_SOUND_MISSION_CAP1_10, - STREAMED_SOUND_MISSION_CAP1_11, - STREAMED_SOUND_MISSION_CAP1_12, - STREAMED_SOUND_MISSION_CNT1_1, - STREAMED_SOUND_MISSION_CNT1_2, - STREAMED_SOUND_MISSION_CNT1_3, - STREAMED_SOUND_MISSION_CNT1_4, - STREAMED_SOUND_MISSION_CNT1_5, - STREAMED_SOUND_MISSION_CNT2_1, - STREAMED_SOUND_MISSION_CNT2_2, - STREAMED_SOUND_MISSION_CNT2_3, - STREAMED_SOUND_MISSION_CNT2_4, - STREAMED_SOUND_MISSION_COK1_1, - STREAMED_SOUND_MISSION_COK1_2, - STREAMED_SOUND_MISSION_COK1_3, - STREAMED_SOUND_MISSION_COK1_4, - STREAMED_SOUND_MISSION_COK1_5, - STREAMED_SOUND_MISSION_COK1_6, - STREAMED_SOUND_MISSION_COK2_1, - STREAMED_SOUND_MISSION_COK2_2, - STREAMED_SOUND_MISSION_COK2_3, - STREAMED_SOUND_MISSION_COK2_4, - STREAMED_SOUND_MISSION_COK2_5, - STREAMED_SOUND_MISSION_COK2_6, - STREAMED_SOUND_MISSION_COK2_7A, - STREAMED_SOUND_MISSION_COK2_7B, - STREAMED_SOUND_MISSION_COK2_7C, - STREAMED_SOUND_MISSION_COK2_8A, - STREAMED_SOUND_MISSION_COK2_8B, - STREAMED_SOUND_MISSION_COK2_8C, - STREAMED_SOUND_MISSION_COK2_8D, - STREAMED_SOUND_MISSION_COK2_9, - STREAMED_SOUND_MISSION_COK210A, - STREAMED_SOUND_MISSION_COK210B, - STREAMED_SOUND_MISSION_COK210C, - STREAMED_SOUND_MISSION_COK212A, - STREAMED_SOUND_MISSION_COK212B, - STREAMED_SOUND_MISSION_COK2_13, - STREAMED_SOUND_MISSION_COK2_14, - STREAMED_SOUND_MISSION_COK2_15, - STREAMED_SOUND_MISSION_COK2_16, - STREAMED_SOUND_MISSION_COK2_20, - STREAMED_SOUND_MISSION_COK2_21, - STREAMED_SOUND_MISSION_COK2_22, - STREAMED_SOUND_MISSION_COK3_1, - STREAMED_SOUND_MISSION_COK3_2, - STREAMED_SOUND_MISSION_COK3_3, - STREAMED_SOUND_MISSION_COK3_4, - STREAMED_SOUND_MISSION_COK4_1, - STREAMED_SOUND_MISSION_COK4_2, - STREAMED_SOUND_MISSION_COK4_3, - STREAMED_SOUND_MISSION_COK4_4, - STREAMED_SOUND_MISSION_COK4_5, - STREAMED_SOUND_MISSION_COK4_6, - STREAMED_SOUND_MISSION_COK4_7, - STREAMED_SOUND_MISSION_COK4_8, - STREAMED_SOUND_MISSION_COK4_9, - STREAMED_SOUND_MISSION_COK4_9A, - STREAMED_SOUND_MISSION_COK4_10, - STREAMED_SOUND_MISSION_COK4_11, - STREAMED_SOUND_MISSION_COK4_12, - STREAMED_SOUND_MISSION_COK4_13, - STREAMED_SOUND_MISSION_COK4_14, - STREAMED_SOUND_MISSION_COK4_15, - STREAMED_SOUND_MISSION_COK4_16, - STREAMED_SOUND_MISSION_COK4_17, - STREAMED_SOUND_MISSION_COK4_18, - STREAMED_SOUND_MISSION_COK4_19, - STREAMED_SOUND_MISSION_COK4_20, - STREAMED_SOUND_MISSION_COK4_21, - STREAMED_SOUND_MISSION_COK4_22, - STREAMED_SOUND_MISSION_COK4_23, - STREAMED_SOUND_MISSION_COK4_24, - STREAMED_SOUND_MISSION_COK4_25, - STREAMED_SOUND_MISSION_COK4_26, - STREAMED_SOUND_MISSION_COK4_27, - STREAMED_SOUND_MISSION_COL1_1, - STREAMED_SOUND_MISSION_COL1_2, - STREAMED_SOUND_MISSION_COL1_3, - STREAMED_SOUND_MISSION_COL1_4, - STREAMED_SOUND_MISSION_COL1_5, - STREAMED_SOUND_MISSION_COL1_6, - STREAMED_SOUND_MISSION_COL1_7, - STREAMED_SOUND_MISSION_COL1_8, - STREAMED_SOUND_MISSION_COL2_1, - STREAMED_SOUND_MISSION_COL2_2, - STREAMED_SOUND_MISSION_COL2_3, - STREAMED_SOUND_MISSION_COL2_4, - STREAMED_SOUND_MISSION_COL2_5, - STREAMED_SOUND_MISSION_COL2_6A, - STREAMED_SOUND_MISSION_COL2_7, - STREAMED_SOUND_MISSION_COL2_8, - STREAMED_SOUND_MISSION_COL2_9, - STREAMED_SOUND_MISSION_COL2_10, - STREAMED_SOUND_MISSION_COL2_11, - STREAMED_SOUND_MISSION_COL2_12, - STREAMED_SOUND_MISSION_COL2_13, - STREAMED_SOUND_MISSION_COL2_14, - STREAMED_SOUND_MISSION_COL2_15, - STREAMED_SOUND_MISSION_COL2_16, - STREAMED_SOUND_MISSION_COL3_1, - STREAMED_SOUND_MISSION_COL3_2, - STREAMED_SOUND_MISSION_COL3_2A, - STREAMED_SOUND_MISSION_COL3_2B, - STREAMED_SOUND_MISSION_COL3_3, - STREAMED_SOUND_MISSION_COL3_4, - STREAMED_SOUND_MISSION_COL3_5, - STREAMED_SOUND_MISSION_COL3_6, - STREAMED_SOUND_MISSION_COL3_7, - STREAMED_SOUND_MISSION_COL3_8, - STREAMED_SOUND_MISSION_COL3_9, - STREAMED_SOUND_MISSION_COL3_10, - STREAMED_SOUND_MISSION_COL3_11, - STREAMED_SOUND_MISSION_COL3_12, - STREAMED_SOUND_MISSION_COL3_13, - STREAMED_SOUND_MISSION_COL3_14, - STREAMED_SOUND_MISSION_COL3_15, - STREAMED_SOUND_MISSION_COL3_16, - STREAMED_SOUND_MISSION_COL3_17, - STREAMED_SOUND_MISSION_COL3_18, - STREAMED_SOUND_MISSION_COL3_19, - STREAMED_SOUND_MISSION_COL3_20, - STREAMED_SOUND_MISSION_COL3_21, - STREAMED_SOUND_MISSION_COL3_23, - STREAMED_SOUND_MISSION_COL3_24, - STREAMED_SOUND_MISSION_COL3_25, - STREAMED_SOUND_MISSION_COL4_1, - STREAMED_SOUND_MISSION_COL4_2, - STREAMED_SOUND_MISSION_COL4_3, - STREAMED_SOUND_MISSION_COL4_4, - STREAMED_SOUND_MISSION_COL4_5, - STREAMED_SOUND_MISSION_COL4_6, - STREAMED_SOUND_MISSION_COL4_7, - STREAMED_SOUND_MISSION_COL4_8, - STREAMED_SOUND_MISSION_COL4_9, - STREAMED_SOUND_MISSION_COL4_10, - STREAMED_SOUND_MISSION_COL4_11, - STREAMED_SOUND_MISSION_COL4_12, - STREAMED_SOUND_MISSION_COL4_13, - STREAMED_SOUND_MISSION_COL4_14, - STREAMED_SOUND_MISSION_COL4_15, - STREAMED_SOUND_MISSION_COL4_16, - STREAMED_SOUND_MISSION_COL4_17, - STREAMED_SOUND_MISSION_COL4_18, - STREAMED_SOUND_MISSION_COL4_19, - STREAMED_SOUND_MISSION_COL4_20, - STREAMED_SOUND_MISSION_COL4_21, - STREAMED_SOUND_MISSION_COL4_22, - STREAMED_SOUND_MISSION_COL4_23, - STREAMED_SOUND_MISSION_COL4_24, - STREAMED_SOUND_MISSION_COL4_25, - STREAMED_SOUND_MISSION_COL4_26, - STREAMED_SOUND_MISSION_COL5_1, - STREAMED_SOUND_MISSION_COL5_2, - STREAMED_SOUND_MISSION_COL5_3, - STREAMED_SOUND_MISSION_COL5_4, - STREAMED_SOUND_MISSION_COL5_5, - STREAMED_SOUND_MISSION_COL5_6, - STREAMED_SOUND_MISSION_COL5_7, - STREAMED_SOUND_MISSION_COL5_8, - STREAMED_SOUND_MISSION_COL5_9, - STREAMED_SOUND_MISSION_COL5_10, - STREAMED_SOUND_MISSION_COL5_11, - STREAMED_SOUND_MISSION_COL5_12, - STREAMED_SOUND_MISSION_COL5_13, - STREAMED_SOUND_MISSION_COL5_14, - STREAMED_SOUND_MISSION_COL5_15, - STREAMED_SOUND_MISSION_COL5_16, - STREAMED_SOUND_MISSION_COL5_17, - STREAMED_SOUND_MISSION_COL5_18, - STREAMED_SOUND_MISSION_COL5_19, - STREAMED_SOUND_MISSION_COL5_20, - STREAMED_SOUND_MISSION_COL5_21, - STREAMED_SOUND_MISSION_COL5_22, - STREAMED_SOUND_MISSION_CUB1_1, - STREAMED_SOUND_MISSION_CUB1_2, - STREAMED_SOUND_MISSION_CUB1_3, - STREAMED_SOUND_MISSION_CUB1_4, - STREAMED_SOUND_MISSION_CUB1_5, - STREAMED_SOUND_MISSION_CUB1_6, - STREAMED_SOUND_MISSION_CUB1_7, - STREAMED_SOUND_MISSION_CUB1_8, - STREAMED_SOUND_MISSION_CUB1_9, - STREAMED_SOUND_MISSION_CUB1_10, - STREAMED_SOUND_MISSION_CUB2_1, - STREAMED_SOUND_MISSION_CUB2_2, - STREAMED_SOUND_MISSION_CUB2_3A, - STREAMED_SOUND_MISSION_CUB2_3B, - STREAMED_SOUND_MISSION_CUB2_3C, - STREAMED_SOUND_MISSION_CUB2_4A, - STREAMED_SOUND_MISSION_CUB2_5, - STREAMED_SOUND_MISSION_CUB2_6, - STREAMED_SOUND_MISSION_CUB2_7, - STREAMED_SOUND_MISSION_CUB2_8, - STREAMED_SOUND_MISSION_CUB2_9, - STREAMED_SOUND_MISSION_CUB2_10, - STREAMED_SOUND_MISSION_CUB2_11, - STREAMED_SOUND_MISSION_CUB3_1, - STREAMED_SOUND_MISSION_CUB3_2, - STREAMED_SOUND_MISSION_CUB3_3, - STREAMED_SOUND_MISSION_CUB3_4, - STREAMED_SOUND_MISSION_CUB4_1, - STREAMED_SOUND_MISSION_CUB4_2, - STREAMED_SOUND_MISSION_CUB4_3, - STREAMED_SOUND_MISSION_CUB4_4, - STREAMED_SOUND_MISSION_CUB4_5, - STREAMED_SOUND_MISSION_CUB4_5A, - STREAMED_SOUND_MISSION_CUB4_6, - STREAMED_SOUND_MISSION_CUB4_7, - STREAMED_SOUND_MISSION_CUB4_8, - STREAMED_SOUND_MISSION_CUB4_9, - STREAMED_SOUND_MISSION_CUB4_10, - STREAMED_SOUND_MISSION_CUB4_11, - STREAMED_SOUND_MISSION_CUB4_12, - STREAMED_SOUND_MISSION_CUB4_13, - STREAMED_SOUND_MISSION_CUB4_14, - STREAMED_SOUND_MISSION_CUB4_15, - STREAMED_SOUND_MISSION_CUB4_16, - STREAMED_SOUND_MISSION_GOLF_1, - STREAMED_SOUND_MISSION_GOLF_2, - STREAMED_SOUND_MISSION_GOLF_3, - STREAMED_SOUND_MISSION_BAR_1, - STREAMED_SOUND_MISSION_BAR_2, - STREAMED_SOUND_MISSION_BAR_3, - STREAMED_SOUND_MISSION_BAR_4, - STREAMED_SOUND_MISSION_BAR_5, - STREAMED_SOUND_MISSION_BAR_6, - STREAMED_SOUND_MISSION_BAR_7, - STREAMED_SOUND_MISSION_BAR_8, - STREAMED_SOUND_MISSION_STRIP_1, - STREAMED_SOUND_MISSION_STRIP_2, - STREAMED_SOUND_MISSION_STRIP_3, - STREAMED_SOUND_MISSION_STRIP_4, - STREAMED_SOUND_MISSION_STRIP_5, - STREAMED_SOUND_MISSION_STRIP_6, - STREAMED_SOUND_MISSION_STRIP_7, - STREAMED_SOUND_MISSION_STRIP_8, - STREAMED_SOUND_MISSION_STRIP_9, - STREAMED_SOUND_MISSION_STAR_1, - STREAMED_SOUND_MISSION_STAR_2, - STREAMED_SOUND_MISSION_STAR_3, - STREAMED_SOUND_MISSION_STAR_4, - STREAMED_SOUND_MISSION_FIN_1A, - STREAMED_SOUND_MISSION_FIN_1B, - STREAMED_SOUND_MISSION_FIN_1C, - STREAMED_SOUND_MISSION_FIN_2B, - STREAMED_SOUND_MISSION_FIN_2C, - STREAMED_SOUND_MISSION_FIN_3, - STREAMED_SOUND_MISSION_FIN_4, - STREAMED_SOUND_MISSION_FIN_5, - STREAMED_SOUND_MISSION_FIN_6, - STREAMED_SOUND_MISSION_FIN_10, - STREAMED_SOUND_MISSION_FIN_11A, - STREAMED_SOUND_MISSION_FIN_11B, - STREAMED_SOUND_MISSION_FIN_12A, - STREAMED_SOUND_MISSION_FIN_12B, - STREAMED_SOUND_MISSION_FIN_12C, - STREAMED_SOUND_MISSION_FIN_13, - STREAMED_SOUND_MISSION_FINKILL, - STREAMED_SOUND_MISSION_LAW1_1, - STREAMED_SOUND_MISSION_LAW1_2, - STREAMED_SOUND_MISSION_LAW1_3, - STREAMED_SOUND_MISSION_LAW1_4, - STREAMED_SOUND_MISSION_LAW1_5, - STREAMED_SOUND_MISSION_LAW1_6, - STREAMED_SOUND_MISSION_LAW1_7, - STREAMED_SOUND_MISSION_LAW1_8, - STREAMED_SOUND_MISSION_LAW1_9, - STREAMED_SOUND_MISSION_LAW1_10, - STREAMED_SOUND_MISSION_LAW2_1, - STREAMED_SOUND_MISSION_LAW2_2, - STREAMED_SOUND_MISSION_LAW2_3, - STREAMED_SOUND_MISSION_LAW2_4, - STREAMED_SOUND_MISSION_LAW2_5, - STREAMED_SOUND_MISSION_LAW2_6, - STREAMED_SOUND_MISSION_LAW2_7, - STREAMED_SOUND_MISSION_LAW2_8, - STREAMED_SOUND_MISSION_LAW2_9, - STREAMED_SOUND_MISSION_LAW2_10, - STREAMED_SOUND_MISSION_LAW3_1, - STREAMED_SOUND_MISSION_LAW3_2, - STREAMED_SOUND_MISSION_LAW3_3, - STREAMED_SOUND_MISSION_LAW3_4, - STREAMED_SOUND_MISSION_LAW3_5, - STREAMED_SOUND_MISSION_LAW3_6, - STREAMED_SOUND_MISSION_LAW3_10, - STREAMED_SOUND_MISSION_LAW3_11, - STREAMED_SOUND_MISSION_LAW3_12, - STREAMED_SOUND_MISSION_LAW3_13, - STREAMED_SOUND_MISSION_LAW3_14, - STREAMED_SOUND_MISSION_LAW3_16, - STREAMED_SOUND_MISSION_LAW3_17, - STREAMED_SOUND_MISSION_LAW3_18, - STREAMED_SOUND_MISSION_LAW3_19, - STREAMED_SOUND_MISSION_LAW3_20, - STREAMED_SOUND_MISSION_LAW3_21, - STREAMED_SOUND_MISSION_LAW3_22, - STREAMED_SOUND_MISSION_LAW3_23, - STREAMED_SOUND_MISSION_LAW3_24, - STREAMED_SOUND_MISSION_LAW3_25, - STREAMED_SOUND_MISSION_LAW4_1A, - STREAMED_SOUND_MISSION_LAW4_1B, - STREAMED_SOUND_MISSION_LAW4_1C, - STREAMED_SOUND_MISSION_LAW4_1D, - STREAMED_SOUND_MISSION_LAW4_10, - STREAMED_SOUND_MISSION_LAW4_3, - STREAMED_SOUND_MISSION_LAW4_4, - STREAMED_SOUND_MISSION_LAW4_5, - STREAMED_SOUND_MISSION_LAW4_6, - STREAMED_SOUND_MISSION_LAW4_7, - STREAMED_SOUND_MISSION_LAW4_8, - STREAMED_SOUND_MISSION_LAW4_9, - STREAMED_SOUND_MISSION_PHIL1_2, - STREAMED_SOUND_MISSION_PHIL1_3, - STREAMED_SOUND_MISSION_PHIL2_1, - STREAMED_SOUND_MISSION_PHIL2_2, - STREAMED_SOUND_MISSION_PHIL2_3, - STREAMED_SOUND_MISSION_PHIL2_4, - STREAMED_SOUND_MISSION_PHIL2_5, - STREAMED_SOUND_MISSION_PHIL2_6, - STREAMED_SOUND_MISSION_PHIL2_7, - STREAMED_SOUND_MISSION_PHIL2_8, - STREAMED_SOUND_MISSION_PHIL2_9, - STREAMED_SOUND_MISSION_PHIL210, - STREAMED_SOUND_MISSION_PHIL211, - STREAMED_SOUND_MISSION_PORN1_1, - STREAMED_SOUND_MISSION_PORN1_2, - STREAMED_SOUND_MISSION_PORN1_3, - STREAMED_SOUND_MISSION_PRN1_3A, - STREAMED_SOUND_MISSION_PORN1_4, - STREAMED_SOUND_MISSION_PORN1_5, - STREAMED_SOUND_MISSION_PORN1_6, - STREAMED_SOUND_MISSION_PORN1_7, - STREAMED_SOUND_MISSION_PORN1_8, - STREAMED_SOUND_MISSION_PORN1_9, - STREAMED_SOUND_MISSION_PRN1_10, - STREAMED_SOUND_MISSION_PRN1_11, - STREAMED_SOUND_MISSION_PRN1_12, - STREAMED_SOUND_MISSION_PRN1_13, - STREAMED_SOUND_MISSION_PRN1_14, - STREAMED_SOUND_MISSION_PRN1_15, - STREAMED_SOUND_MISSION_PRN1_16, - STREAMED_SOUND_MISSION_PRN1_17, - STREAMED_SOUND_MISSION_PRN1_18, - STREAMED_SOUND_MISSION_PRN1_19, - STREAMED_SOUND_MISSION_PRN1_20, - STREAMED_SOUND_MISSION_PRN1_21, - STREAMED_SOUND_MISSION_PORN3_1, - STREAMED_SOUND_MISSION_PORN3_2, - STREAMED_SOUND_MISSION_PORN3_3, - STREAMED_SOUND_MISSION_PORN3_4, - STREAMED_SOUND_MISSION_PSYCH_1, - STREAMED_SOUND_MISSION_PSYCH_2, - STREAMED_SOUND_MISSION_ROK2_01, - STREAMED_SOUND_MISSION_ROK3_1, - STREAMED_SOUND_MISSION_ROK3_2, - STREAMED_SOUND_MISSION_ROK3_3, - STREAMED_SOUND_MISSION_ROK3_4, - STREAMED_SOUND_MISSION_ROK3_5, - STREAMED_SOUND_MISSION_ROK3_6, - STREAMED_SOUND_MISSION_ROK3_7, - STREAMED_SOUND_MISSION_ROK3_8, - STREAMED_SOUND_MISSION_ROK3_9, - STREAMED_SOUND_MISSION_ROK3_10, - STREAMED_SOUND_MISSION_ROK3_11, - STREAMED_SOUND_MISSION_ROK3_12, - STREAMED_SOUND_MISSION_ROK3_13, - STREAMED_SOUND_MISSION_ROK3_14, - STREAMED_SOUND_MISSION_ROK3_15, - STREAMED_SOUND_MISSION_ROK3_16, - STREAMED_SOUND_MISSION_ROK3_17, - STREAMED_SOUND_MISSION_ROK3_18, - STREAMED_SOUND_MISSION_ROK3_19, - STREAMED_SOUND_MISSION_ROK3_20, - STREAMED_SOUND_MISSION_ROK3_21, - STREAMED_SOUND_MISSION_ROK3_22, - STREAMED_SOUND_MISSION_ROK3_23, - STREAMED_SOUND_MISSION_ROK3_24, - STREAMED_SOUND_MISSION_ROK3_25, - STREAMED_SOUND_MISSION_ROK3_26, - STREAMED_SOUND_MISSION_ROK3_27, - STREAMED_SOUND_MISSION_ROK3_62, - STREAMED_SOUND_MISSION_ROK3_63, - STREAMED_SOUND_MISSION_ROK3_64, - STREAMED_SOUND_MISSION_ROK3_65, - STREAMED_SOUND_MISSION_ROK3_66, - STREAMED_SOUND_MISSION_ROK3_67, - STREAMED_SOUND_MISSION_ROK3_68, - STREAMED_SOUND_MISSION_ROK3_69, - STREAMED_SOUND_MISSION_ROK3_70, - STREAMED_SOUND_MISSION_ROK3_71, - STREAMED_SOUND_MISSION_ROK3_73, - STREAMED_SOUND_MISSION_RESC_1, - STREAMED_SOUND_MISSION_RESC_2, - STREAMED_SOUND_MISSION_RESC_3, - STREAMED_SOUND_MISSION_RESC_4, - STREAMED_SOUND_MISSION_RESC_5, - STREAMED_SOUND_MISSION_RESC_6, - STREAMED_SOUND_MISSION_RESC_7, - STREAMED_SOUND_MISSION_RESC_8, - STREAMED_SOUND_MISSION_RESC_9, - STREAMED_SOUND_MISSION_RESC_10, - STREAMED_SOUND_MISSION_ROK1_1A, - STREAMED_SOUND_MISSION_ROK1_1B, - STREAMED_SOUND_MISSION_ROK1_5, - STREAMED_SOUND_MISSION_ROK1_6, - STREAMED_SOUND_MISSION_ROK1_7, - STREAMED_SOUND_MISSION_ROK1_8, - STREAMED_SOUND_MISSION_ROK1_9, - STREAMED_SOUND_MISSION_TAX1_1, - STREAMED_SOUND_MISSION_TAX1_2, - STREAMED_SOUND_MISSION_TAX1_3, - STREAMED_SOUND_MISSION_TAX1_4, - STREAMED_SOUND_MISSION_TAX1_5, - STREAMED_SOUND_MISSION_TAX2_1, - STREAMED_SOUND_MISSION_TAX2_2, - STREAMED_SOUND_MISSION_TAX2_3, - STREAMED_SOUND_MISSION_TAX2_4, - STREAMED_SOUND_MISSION_TAX2_5, - STREAMED_SOUND_MISSION_TAX2_6, - STREAMED_SOUND_MISSION_TAX2_7, - STREAMED_SOUND_MISSION_TAX3_1, - STREAMED_SOUND_MISSION_TAX3_2, - STREAMED_SOUND_MISSION_TAX3_3, - STREAMED_SOUND_MISSION_TAX3_4, - STREAMED_SOUND_MISSION_TAX3_5, - STREAMED_SOUND_MISSION_TEX1_1, - STREAMED_SOUND_MISSION_TEX1_2, - STREAMED_SOUND_MISSION_TEX1_3, - STREAMED_SOUND_MISSION_TEX1_4, - STREAMED_SOUND_MISSION_TEX1_5, - STREAMED_SOUND_MISSION_TEX1_6, - STREAMED_SOUND_MISSION_TEX2_1, - STREAMED_SOUND_MISSION_TEX3_1, - STREAMED_SOUND_MISSION_TEX3_2, - STREAMED_SOUND_MISSION_TEX3_3, - STREAMED_SOUND_MISSION_TEX3_4, - STREAMED_SOUND_MISSION_TEX3_5, - STREAMED_SOUND_MISSION_TEX3_6, - STREAMED_SOUND_MISSION_TEX3_7, - STREAMED_SOUND_MISSION_TEX3_8, - STREAMED_SOUND_MISSION_HAT_1A, - STREAMED_SOUND_MISSION_INTRO1, - STREAMED_SOUND_MISSION_INTRO2, - STREAMED_SOUND_MISSION_INTRO3, - STREAMED_SOUND_MISSION_INTRO4, - STREAMED_SOUND_MISSION_MOB_01A, - STREAMED_SOUND_MISSION_MOB_01B, - STREAMED_SOUND_MISSION_MOB_01C, - STREAMED_SOUND_MISSION_MOB_02A, - STREAMED_SOUND_MISSION_MOB_02B, - STREAMED_SOUND_MISSION_MOB_02C, - STREAMED_SOUND_MISSION_MOB_03A, - STREAMED_SOUND_MISSION_MOB_03B, - STREAMED_SOUND_MISSION_MOB_03C, - STREAMED_SOUND_MISSION_MOB_03D, - STREAMED_SOUND_MISSION_MOB_03E, - STREAMED_SOUND_MISSION_SHARK_1, - STREAMED_SOUND_MISSION_SHARK_2, - STREAMED_SOUND_MISSION_SHARK_3, - STREAMED_SOUND_MISSION_SHARK_4, - STREAMED_SOUND_MISSION_SHARK_5, - STREAMED_SOUND_MISSION_MOB_04A, - STREAMED_SOUND_MISSION_MOB_04B, - STREAMED_SOUND_MISSION_MOB_04C, - STREAMED_SOUND_MISSION_MOB_04D, - STREAMED_SOUND_MISSION_MOB_05A, - STREAMED_SOUND_MISSION_MOB_05B, - STREAMED_SOUND_MISSION_MOB_05C, - STREAMED_SOUND_MISSION_MOB_05D, - STREAMED_SOUND_MISSION_MOB_06A, - STREAMED_SOUND_MISSION_MOB_06B, - STREAMED_SOUND_MISSION_MOB_06C, - STREAMED_SOUND_MISSION_MOB_07A, - STREAMED_SOUND_MISSION_MOB_07B, - STREAMED_SOUND_MISSION_MOB_08A, - STREAMED_SOUND_MISSION_MOB_08B, - STREAMED_SOUND_MISSION_MOB_08C, - STREAMED_SOUND_MISSION_MOB_08D, - STREAMED_SOUND_MISSION_MOB_08E, - STREAMED_SOUND_MISSION_MOB_08F, - STREAMED_SOUND_MISSION_MOB_08G, - STREAMED_SOUND_MISSION_MOB_09A, - STREAMED_SOUND_MISSION_MOB_09B, - STREAMED_SOUND_MISSION_MOB_09C, - STREAMED_SOUND_MISSION_MOB_09D, - STREAMED_SOUND_MISSION_MOB_09E, - STREAMED_SOUND_MISSION_MOB_09F, - STREAMED_SOUND_MISSION_MOB_10A, - STREAMED_SOUND_MISSION_MOB_10B, - STREAMED_SOUND_MISSION_MOB_10C, - STREAMED_SOUND_MISSION_MOB_10D, - STREAMED_SOUND_MISSION_MOB_10E, - STREAMED_SOUND_MISSION_MOB_11A, - STREAMED_SOUND_MISSION_MOB_11B, - STREAMED_SOUND_MISSION_MOB_11C, - STREAMED_SOUND_MISSION_MOB_11D, - STREAMED_SOUND_MISSION_MOB_11E, - STREAMED_SOUND_MISSION_MOB_11F, - STREAMED_SOUND_MISSION_MOB_14A, - STREAMED_SOUND_MISSION_MOB_14B, - STREAMED_SOUND_MISSION_MOB_14C, - STREAMED_SOUND_MISSION_MOB_14D, - STREAMED_SOUND_MISSION_MOB_14E, - STREAMED_SOUND_MISSION_MOB_14F, - STREAMED_SOUND_MISSION_MOB_14G, - STREAMED_SOUND_MISSION_MOB_14H, - STREAMED_SOUND_MISSION_MOB_16A, - STREAMED_SOUND_MISSION_MOB_16B, - STREAMED_SOUND_MISSION_MOB_16C, - STREAMED_SOUND_MISSION_MOB_16D, - STREAMED_SOUND_MISSION_MOB_16E, - STREAMED_SOUND_MISSION_MOB_16F, - STREAMED_SOUND_MISSION_MOB_16G, - STREAMED_SOUND_MISSION_MOB_17A, - STREAMED_SOUND_MISSION_MOB_17B, - STREAMED_SOUND_MISSION_MOB_17C, - STREAMED_SOUND_MISSION_MOB_17D, - STREAMED_SOUND_MISSION_MOB_17E, - STREAMED_SOUND_MISSION_MOB_17G, - STREAMED_SOUND_MISSION_MOB_17H, - STREAMED_SOUND_MISSION_MOB_17I, - STREAMED_SOUND_MISSION_MOB_17J, - STREAMED_SOUND_MISSION_MOB_17K, - STREAMED_SOUND_MISSION_MOB_17L, - STREAMED_SOUND_MISSION_MOB_18A, - STREAMED_SOUND_MISSION_MOB_18B, - STREAMED_SOUND_MISSION_MOB_18C, - STREAMED_SOUND_MISSION_MOB_18D, - STREAMED_SOUND_MISSION_MOB_18E, - STREAMED_SOUND_MISSION_MOB_18F, - STREAMED_SOUND_MISSION_MOB_18G, - STREAMED_SOUND_MISSION_MOB_20A, - STREAMED_SOUND_MISSION_MOB_20B, - STREAMED_SOUND_MISSION_MOB_20C, - STREAMED_SOUND_MISSION_MOB_20D, - STREAMED_SOUND_MISSION_MOB_20E, - STREAMED_SOUND_MISSION_MOB_24A, - STREAMED_SOUND_MISSION_MOB_24B, - STREAMED_SOUND_MISSION_MOB_24C, - STREAMED_SOUND_MISSION_MOB_24D, - STREAMED_SOUND_MISSION_MOB_24E, - STREAMED_SOUND_MISSION_MOB_24F, - STREAMED_SOUND_MISSION_MOB_24G, - STREAMED_SOUND_MISSION_MOB_24H, - STREAMED_SOUND_MISSION_MOB_25A, - STREAMED_SOUND_MISSION_MOB_25B, - STREAMED_SOUND_MISSION_MOB_25C, - STREAMED_SOUND_MISSION_MOB_25D, - STREAMED_SOUND_MISSION_MOB_26A, - STREAMED_SOUND_MISSION_MOB_26B, - STREAMED_SOUND_MISSION_MOB_26C, - STREAMED_SOUND_MISSION_MOB_26D, - STREAMED_SOUND_MISSION_MOB_26E, - STREAMED_SOUND_MISSION_MOB_29A, - STREAMED_SOUND_MISSION_MOB_29B, - STREAMED_SOUND_MISSION_MOB_29C, - STREAMED_SOUND_MISSION_MOB_29D, - STREAMED_SOUND_MISSION_MOB_29E, - STREAMED_SOUND_MISSION_MOB_29F, - STREAMED_SOUND_MISSION_MOB_29G, - STREAMED_SOUND_MISSION_MOB_30A, - STREAMED_SOUND_MISSION_MOB_30B, - STREAMED_SOUND_MISSION_MOB_30C, - STREAMED_SOUND_MISSION_MOB_30D, - STREAMED_SOUND_MISSION_MOB_30E, - STREAMED_SOUND_MISSION_MOB_30F, - STREAMED_SOUND_MISSION_MOB_33A, - STREAMED_SOUND_MISSION_MOB_33B, - STREAMED_SOUND_MISSION_MOB_33C, - STREAMED_SOUND_MISSION_MOB_33D, - STREAMED_SOUND_MISSION_MOB_34A, - STREAMED_SOUND_MISSION_MOB_34B, - STREAMED_SOUND_MISSION_MOB_34C, - STREAMED_SOUND_MISSION_MOB_34D, - STREAMED_SOUND_MISSION_MOB_35A, - STREAMED_SOUND_MISSION_MOB_35B, - STREAMED_SOUND_MISSION_MOB_35C, - STREAMED_SOUND_MISSION_MOB_35D, - STREAMED_SOUND_MISSION_MOB_36A, - STREAMED_SOUND_MISSION_MOB_36B, - STREAMED_SOUND_MISSION_MOB_36C, - STREAMED_SOUND_MISSION_MOB_40A, - STREAMED_SOUND_MISSION_MOB_40B, - STREAMED_SOUND_MISSION_MOB_40C, - STREAMED_SOUND_MISSION_MOB_40D, - STREAMED_SOUND_MISSION_MOB_40E, - STREAMED_SOUND_MISSION_MOB_40F, - STREAMED_SOUND_MISSION_MOB_40G, - STREAMED_SOUND_MISSION_MOB_40H, - STREAMED_SOUND_MISSION_MOB_40I, - STREAMED_SOUND_MISSION_MOB_41A, - STREAMED_SOUND_MISSION_MOB_41B, - STREAMED_SOUND_MISSION_MOB_41C, - STREAMED_SOUND_MISSION_MOB_41D, - STREAMED_SOUND_MISSION_MOB_41E, - STREAMED_SOUND_MISSION_MOB_41F, - STREAMED_SOUND_MISSION_MOB_41G, - STREAMED_SOUND_MISSION_MOB_41H, - STREAMED_SOUND_MISSION_MOB_42A, - STREAMED_SOUND_MISSION_MOB_42B, - STREAMED_SOUND_MISSION_MOB_42C, - STREAMED_SOUND_MISSION_MOB_42D, - STREAMED_SOUND_MISSION_MOB_42E, - STREAMED_SOUND_MISSION_MOB_43A, - STREAMED_SOUND_MISSION_MOB_43B, - STREAMED_SOUND_MISSION_MOB_43C, - STREAMED_SOUND_MISSION_MOB_43D, - STREAMED_SOUND_MISSION_MOB_43E, - STREAMED_SOUND_MISSION_MOB_43F, - STREAMED_SOUND_MISSION_MOB_43G, - STREAMED_SOUND_MISSION_MOB_43H, - STREAMED_SOUND_MISSION_MOB_45A, - STREAMED_SOUND_MISSION_MOB_45B, - STREAMED_SOUND_MISSION_MOB_45C, - STREAMED_SOUND_MISSION_MOB_45D, - STREAMED_SOUND_MISSION_MOB_45E, - STREAMED_SOUND_MISSION_MOB_45F, - STREAMED_SOUND_MISSION_MOB_45G, - STREAMED_SOUND_MISSION_MOB_45H, - STREAMED_SOUND_MISSION_MOB_45I, - STREAMED_SOUND_MISSION_MOB_45J, - STREAMED_SOUND_MISSION_MOB_45K, - STREAMED_SOUND_MISSION_MOB_45L, - STREAMED_SOUND_MISSION_MOB_45M, - STREAMED_SOUND_MISSION_MOB_45N, - STREAMED_SOUND_MISSION_MOB_46A, - STREAMED_SOUND_MISSION_MOB_46B, - STREAMED_SOUND_MISSION_MOB_46C, - STREAMED_SOUND_MISSION_MOB_46D, - STREAMED_SOUND_MISSION_MOB_46E, - STREAMED_SOUND_MISSION_MOB_46F, - STREAMED_SOUND_MISSION_MOB_46G, - STREAMED_SOUND_MISSION_MOB_46H, - STREAMED_SOUND_MISSION_MOB_47A, - STREAMED_SOUND_MISSION_MOB_52A, - STREAMED_SOUND_MISSION_MOB_52B, - STREAMED_SOUND_MISSION_MOB_52C, - STREAMED_SOUND_MISSION_MOB_52D, - STREAMED_SOUND_MISSION_MOB_52E, - STREAMED_SOUND_MISSION_MOB_52F, - STREAMED_SOUND_MISSION_MOB_52G, - STREAMED_SOUND_MISSION_MOB_52H, - STREAMED_SOUND_MISSION_MOB_54A, - STREAMED_SOUND_MISSION_MOB_54B, - STREAMED_SOUND_MISSION_MOB_54C, - STREAMED_SOUND_MISSION_MOB_54D, - STREAMED_SOUND_MISSION_MOB_54E, - STREAMED_SOUND_MISSION_MOB_55A, - STREAMED_SOUND_MISSION_MOB_55B, - STREAMED_SOUND_MISSION_MOB_55C, - STREAMED_SOUND_MISSION_MOB_55D, - STREAMED_SOUND_MISSION_MOB_55E, - STREAMED_SOUND_MISSION_MOB_55F, - STREAMED_SOUND_MISSION_MOB_56A, - STREAMED_SOUND_MISSION_MOB_56B, - STREAMED_SOUND_MISSION_MOB_56C, - STREAMED_SOUND_MISSION_MOB_56D, - STREAMED_SOUND_MISSION_MOB_56E, - STREAMED_SOUND_MISSION_MOB_56F, - STREAMED_SOUND_MISSION_MOB_57A, - STREAMED_SOUND_MISSION_MOB_57B, - STREAMED_SOUND_MISSION_MOB_57C, - STREAMED_SOUND_MISSION_MOB_57D, - STREAMED_SOUND_MISSION_MOB_57E, - STREAMED_SOUND_MISSION_MOB_58A, - STREAMED_SOUND_MISSION_MOB_58B, - STREAMED_SOUND_MISSION_MOB_58C, - STREAMED_SOUND_MISSION_MOB_58D, - STREAMED_SOUND_MISSION_MOB_58E, - STREAMED_SOUND_MISSION_MOB_58F, - STREAMED_SOUND_MISSION_MOB_58G, - STREAMED_SOUND_MISSION_MOB_61A, - STREAMED_SOUND_MISSION_MOB_61B, - STREAMED_SOUND_MISSION_MOB_62A, - STREAMED_SOUND_MISSION_MOB_62B, - STREAMED_SOUND_MISSION_MOB_62C, - STREAMED_SOUND_MISSION_MOB_62D, - STREAMED_SOUND_MISSION_MOB_63A, - STREAMED_SOUND_MISSION_MOB_63B, - STREAMED_SOUND_MISSION_MOB_63C, - STREAMED_SOUND_MISSION_MOB_63D, - STREAMED_SOUND_MISSION_MOB_63E, - STREAMED_SOUND_MISSION_MOB_63F, - STREAMED_SOUND_MISSION_MOB_63G, - STREAMED_SOUND_MISSION_MOB_63H, - STREAMED_SOUND_MISSION_MOB_63I, - STREAMED_SOUND_MISSION_MOB_63J, - STREAMED_SOUND_MISSION_MOB_66A, - STREAMED_SOUND_MISSION_MOB_66B, - STREAMED_SOUND_MISSION_MOB_68A, - STREAMED_SOUND_MISSION_MOB_68B, - STREAMED_SOUND_MISSION_MOB_68C, - STREAMED_SOUND_MISSION_MOB_68D, - STREAMED_SOUND_MISSION_MOB_70A, - STREAMED_SOUND_MISSION_MOB_70B, - STREAMED_SOUND_MISSION_MOB_71A, - STREAMED_SOUND_MISSION_MOB_71B, - STREAMED_SOUND_MISSION_MOB_71C, - STREAMED_SOUND_MISSION_MOB_71D, - STREAMED_SOUND_MISSION_MOB_71E, - STREAMED_SOUND_MISSION_MOB_71F, - STREAMED_SOUND_MISSION_MOB_71G, - STREAMED_SOUND_MISSION_MOB_71H, - STREAMED_SOUND_MISSION_MOB_71I, - STREAMED_SOUND_MISSION_MOB_71J, - STREAMED_SOUND_MISSION_MOB_71K, - STREAMED_SOUND_MISSION_MOB_71L, - STREAMED_SOUND_MISSION_MOB_71M, - STREAMED_SOUND_MISSION_MOB_71N, - STREAMED_SOUND_MISSION_MOB_72A, - STREAMED_SOUND_MISSION_MOB_72B, - STREAMED_SOUND_MISSION_MOB_72C, - STREAMED_SOUND_MISSION_MOB_72D, - STREAMED_SOUND_MISSION_MOB_72E, - STREAMED_SOUND_MISSION_MOB_72F, - STREAMED_SOUND_MISSION_MOB_72G, - STREAMED_SOUND_MISSION_MOB_73A, - STREAMED_SOUND_MISSION_MOB_73C, - STREAMED_SOUND_MISSION_MOB_73D, - STREAMED_SOUND_MISSION_MOB_73F, - STREAMED_SOUND_MISSION_MOB_73G, - STREAMED_SOUND_MISSION_MOB_73I, - STREAMED_SOUND_MISSION_MOB_95A, - STREAMED_SOUND_MISSION_MOB_96A, - STREAMED_SOUND_MISSION_MOB_98A, - STREAMED_SOUND_MISSION_MOB_99A, - STREAMED_SOUND_MISSION_JOB1_1B, - STREAMED_SOUND_MISSION_JOB1_1C, - STREAMED_SOUND_MISSION_JOB1_1D, - STREAMED_SOUND_MISSION_JOB2_1B, - STREAMED_SOUND_MISSION_JOB2_2, - STREAMED_SOUND_MISSION_JOB2_3, - STREAMED_SOUND_MISSION_JOB2_4, - STREAMED_SOUND_MISSION_JOB2_5, - STREAMED_SOUND_MISSION_JOB2_6, - STREAMED_SOUND_MISSION_JOB2_7, - STREAMED_SOUND_MISSION_JOB2_8, - STREAMED_SOUND_MISSION_JOB2_9, - STREAMED_SOUND_MISSION_JOB3_1, - STREAMED_SOUND_MISSION_JOB3_2, - STREAMED_SOUND_MISSION_JOB3_3, - STREAMED_SOUND_MISSION_JOB4_1, - STREAMED_SOUND_MISSION_JOB4_2, - STREAMED_SOUND_MISSION_JOB4_3, - STREAMED_SOUND_MISSION_JOB5_1, - STREAMED_SOUND_MISSION_JOB5_2, - STREAMED_SOUND_MISSION_JOB5_3, - STREAMED_SOUND_MISSION_BJM1_20, - STREAMED_SOUND_MISSION_BJM1_4, - STREAMED_SOUND_MISSION_BJM1_5, - STREAMED_SOUND_MISSION_MERC_39, - STREAMED_SOUND_MISSION_MONO_1, - STREAMED_SOUND_MISSION_MONO_2, - STREAMED_SOUND_MISSION_MONO_3, - STREAMED_SOUND_MISSION_MONO_4, - STREAMED_SOUND_MISSION_MONO_5, - STREAMED_SOUND_MISSION_MONO_6, - STREAMED_SOUND_MISSION_MONO_7, - STREAMED_SOUND_MISSION_MONO_8, - STREAMED_SOUND_MISSION_MONO_9, - STREAMED_SOUND_MISSION_MONO10, - STREAMED_SOUND_MISSION_MONO11, - STREAMED_SOUND_MISSION_MONO12, - STREAMED_SOUND_MISSION_MONO13, - STREAMED_SOUND_MISSION_MONO14, - STREAMED_SOUND_MISSION_MONO15, - STREAMED_SOUND_MISSION_MONO16, - STREAMED_SOUND_MISSION_FUD_01, - STREAMED_SOUND_MISSION_FUD_02, - STREAMED_SOUND_MISSION_FUD_03, - STREAMED_SOUND_MISSION_FUD_04, - STREAMED_SOUND_MISSION_FUD_05, - STREAMED_SOUND_MISSION_FUD_06, - STREAMED_SOUND_MISSION_FUD_07, - STREAMED_SOUND_MISSION_FUD_08, - STREAMED_SOUND_MISSION_FUD_09, - STREAMED_SOUND_MISSION_FUD_10, - STREAMED_SOUND_MISSION_FUD_11, - STREAMED_SOUND_MISSION_FUD_12, - STREAMED_SOUND_MISSION_FUD_13, - STREAMED_SOUND_MISSION_FUD_14, - STREAMED_SOUND_MISSION_FUD_15, - STREAMED_SOUND_MISSION_FUD_16, - STREAMED_SOUND_MISSION_FUD_17, - STREAMED_SOUND_MISSION_FUD_18, - STREAMED_SOUND_MISSION_FUD_19, - STREAMED_SOUND_MISSION_FUD_20, - STREAMED_SOUND_MISSION_BURG_01, - STREAMED_SOUND_MISSION_BURG_02, - STREAMED_SOUND_MISSION_BURG_03, - STREAMED_SOUND_MISSION_BURG_04, - STREAMED_SOUND_MISSION_BURG_05, - STREAMED_SOUND_MISSION_BURG_06, - STREAMED_SOUND_MISSION_BURG_07, - STREAMED_SOUND_MISSION_BURG_08, - STREAMED_SOUND_MISSION_BURG_09, - STREAMED_SOUND_MISSION_BURG_10, - STREAMED_SOUND_MISSION_BURG_11, - STREAMED_SOUND_MISSION_BURG_12, - STREAMED_SOUND_MISSION_CRUST01, - STREAMED_SOUND_MISSION_CRUST02, - STREAMED_SOUND_MISSION_CRUST03, - STREAMED_SOUND_MISSION_CRUST04, - STREAMED_SOUND_MISSION_CRUST05, - STREAMED_SOUND_MISSION_CRUST06, - STREAMED_SOUND_MISSION_CRUST07, - STREAMED_SOUND_MISSION_CRUST08, - STREAMED_SOUND_MISSION_CRUST09, - STREAMED_SOUND_MISSION_BAND_01, - STREAMED_SOUND_MISSION_BAND_02, - STREAMED_SOUND_MISSION_BAND_03, - STREAMED_SOUND_MISSION_BAND_04, - STREAMED_SOUND_MISSION_BAND_05, - STREAMED_SOUND_MISSION_BAND_06, - STREAMED_SOUND_MISSION_BAND_07, - STREAMED_SOUND_MISSION_BAND_08, - STREAMED_SOUND_MISSION_SHAFT01, - STREAMED_SOUND_MISSION_SHAFT02, - STREAMED_SOUND_MISSION_SHAFT03, - STREAMED_SOUND_MISSION_SHAFT04, - STREAMED_SOUND_MISSION_SHAFT05, - STREAMED_SOUND_MISSION_SHAFT06, - STREAMED_SOUND_MISSION_SHAFT07, - STREAMED_SOUND_MISSION_SHAFT08, - STREAMED_SOUND_MISSION_PISS_01, - STREAMED_SOUND_MISSION_PISS_02, - STREAMED_SOUND_MISSION_PISS_03, - STREAMED_SOUND_MISSION_PISS_04, - STREAMED_SOUND_MISSION_PISS_05, - STREAMED_SOUND_MISSION_PISS_06, - STREAMED_SOUND_MISSION_PISS_07, - STREAMED_SOUND_MISSION_PISS_08, - STREAMED_SOUND_MISSION_PISS_09, - STREAMED_SOUND_MISSION_PISS_10, - STREAMED_SOUND_MISSION_PISS_11, - STREAMED_SOUND_MISSION_PISS_12, - STREAMED_SOUND_MISSION_PISS_13, - STREAMED_SOUND_MISSION_PISS_14, - STREAMED_SOUND_MISSION_PISS_15, - STREAMED_SOUND_MISSION_PISS_16, - STREAMED_SOUND_MISSION_PISS_17, - STREAMED_SOUND_MISSION_PISS_18, - STREAMED_SOUND_MISSION_PISS_19, - STREAMED_SOUND_MISSION_GIMME01, - STREAMED_SOUND_MISSION_GIMME02, - STREAMED_SOUND_MISSION_GIMME03, - STREAMED_SOUND_MISSION_GIMME04, - STREAMED_SOUND_MISSION_GIMME05, - STREAMED_SOUND_MISSION_GIMME06, - STREAMED_SOUND_MISSION_GIMME07, - STREAMED_SOUND_MISSION_GIMME08, - STREAMED_SOUND_MISSION_GIMME09, - STREAMED_SOUND_MISSION_GIMME10, - STREAMED_SOUND_MISSION_GIMME11, - STREAMED_SOUND_MISSION_GIMME12, - STREAMED_SOUND_MISSION_GIMME13, - STREAMED_SOUND_MISSION_GIMME14, - STREAMED_SOUND_MISSION_GIMME15, - STREAMED_SOUND_MISSION_BUST_01, - STREAMED_SOUND_MISSION_BUST_02, - STREAMED_SOUND_MISSION_BUST_03, - STREAMED_SOUND_MISSION_BUST_04, - STREAMED_SOUND_MISSION_BUST_05, - STREAMED_SOUND_MISSION_BUST_06, - STREAMED_SOUND_MISSION_BUST_07, - STREAMED_SOUND_MISSION_BUST_08, - STREAMED_SOUND_MISSION_BUST_09, - STREAMED_SOUND_MISSION_BUST_10, - STREAMED_SOUND_MISSION_BUST_11, - STREAMED_SOUND_MISSION_BUST_12, - STREAMED_SOUND_MISSION_BUST_13, - STREAMED_SOUND_MISSION_BUST_14, - STREAMED_SOUND_MISSION_BUST_15, - STREAMED_SOUND_MISSION_BUST_16, - STREAMED_SOUND_MISSION_BUST_17, - STREAMED_SOUND_MISSION_BUST_18, - STREAMED_SOUND_MISSION_BUST_19, - STREAMED_SOUND_MISSION_BUST_20, - STREAMED_SOUND_MISSION_BUST_21, - STREAMED_SOUND_MISSION_BUST_22, - STREAMED_SOUND_MISSION_BUST_23, - STREAMED_SOUND_MISSION_BUST_24, - STREAMED_SOUND_MISSION_BUST_25, - STREAMED_SOUND_MISSION_BUST_26, - STREAMED_SOUND_MISSION_BUST_27, - STREAMED_SOUND_MISSION_BUST_28, TOTAL_STREAMED_SOUNDS, NO_TRACK, }; diff --git a/src/audio/sampman.h b/src/audio/sampman.h index 2db29244..7597eafb 100644 --- a/src/audio/sampman.h +++ b/src/audio/sampman.h @@ -278,109 +278,72 @@ static char StreamedNameTable[][25] = { #elif defined(PS2_AUDIO_PATHS) static char StreamedNameTable[][40] = { - "AUDIO\\MUSIC\\WILD.VB", + "AUDIO\\MUSIC\\HEAD.VB", + "AUDIO\\MUSIC\\DOUBLE.VB", + "AUDIO\\MUSIC\\KJAH.VB", + "AUDIO\\MUSIC\\RISE.VB", + "AUDIO\\MUSIC\\LIPS.VB", + "AUDIO\\MUSIC\\MUNDO.VB", + "AUDIO\\MUSIC\\MSX.VB", "AUDIO\\MUSIC\\FLASH.VB", - "AUDIO\\MUSIC\\KCHAT.VB", // 16 khz - "AUDIO\\MUSIC\\FEVER.VB", - "AUDIO\\MUSIC\\VROCK.VB", - "AUDIO\\MUSIC\\VCPR.VB", // 16 khz - "AUDIO\\MUSIC\\ESPANT.VB", - "AUDIO\\MUSIC\\EMOTION.VB", - "AUDIO\\MUSIC\\WAVE.VB", - "AUDIO\\MUSIC\\MISCOM.VB", + "AUDIO\\MUSIC\\LCJ.VB", + "AUDIO\\MUSIC\\LCFR.VB", + "AUDIO\\MUSIC\\MISCOM2.VB", "AUDIO\\MUSIC\\CITY.VB", "AUDIO\\MUSIC\\WATER.VB", - "AUDIO\\MUSIC\\BEACHAMB.VB", - "AUDIO\\MUSIC\\HCITY.VB", - "AUDIO\\MUSIC\\HWATER.VB", - "AUDIO\\MUSIC\\HBEACH.VB", - "AUDIO\\MUSIC\\MALLAMB.VB", - "AUDIO\\MUSIC\\STRIP.VB", - "AUDIO\\MUSIC\\MALIBU.VB", - "AUDIO\\MUSIC\\HOTEL.VB", - "AUDIO\\MUSIC\\DIRTRING.VB", - "AUDIO\\MUSIC\\LAW4RIOT.VB", - "AUDIO\\MUSIC\\AMBSIL.VB", - "AUDIO\\MUSIC\\POLICE.VB", // 16 khz + "AUDIO\\MUSIC\\SAWMILL.VB", + "AUDIO\\MUSIC\\CITY.VB", + "AUDIO\\MUSIC\\WATER.VB", + "AUDIO\\MUSIC\\WATER.VB", + "AUDIO\\MUSIC\\CITY.VB", + "AUDIO\\MUSIC\\CITY.VB", + "AUDIO\\MUSIC\\CITY.VB", + "AUDIO\\MUSIC\\CITY.VB", + "AUDIO\\MUSIC\\CITY.VB", + "AUDIO\\MUSIC\\CITY.VB", + "AUDIO\\MUSIC\\CITY.VB", + "AUDIO\\MUSIC\\POLICE.VB", "AUDIO\\MUSIC\\TAXI.VB", - "AUDIO\\MUSIC\\BCLOSED.VB", - "AUDIO\\MUSIC\\BOPEN.VB", - "AUDIO\\CUTSCENE\\ASS\\ASS_1.VB", - "AUDIO\\CUTSCENE\\ASS\\ASS_2.VB", - "AUDIO\\CUTSCENE\\BANK\\BANK_1.VB", - "AUDIO\\CUTSCENE\\BANK\\BANK_2A.VB", - "AUDIO\\CUTSCENE\\BANK\\BANK_2B.VB", - "AUDIO\\CUTSCENE\\BANK\\BANK_3A.VB", - "AUDIO\\CUTSCENE\\BANK\\BANK_3B.VB", - "AUDIO\\CUTSCENE\\BANK\\BANK_4.VB", - "AUDIO\\CUTSCENE\\BIKE\\BIKE_1.VB", - "AUDIO\\CUTSCENE\\BIKE\\BIKE_2.VB", - "AUDIO\\CUTSCENE\\BIKE\\BIKE_3.VB", - "AUDIO\\CUTSCENE\\BUD\\BUD_1.VB", - "AUDIO\\CUTSCENE\\BUD\\BUD_2.VB", - "AUDIO\\CUTSCENE\\BUD\\BUD_3.VB", - "AUDIO\\CUTSCENE\\CAP\\CAP_1.VB", - "AUDIO\\CUTSCENE\\CAR\\CAR_1.VB", - "AUDIO\\CUTSCENE\\CNT\\CNT_1A.VB", - "AUDIO\\CUTSCENE\\CNT\\CNT_1B.VB", - "AUDIO\\CUTSCENE\\CNT\\CNT_2.VB", - "AUDIO\\CUTSCENE\\COK\\COK_1.VB", - "AUDIO\\CUTSCENE\\COK\\COK_2A.VB", - "AUDIO\\CUTSCENE\\COK\\COK_2B.VB", - "AUDIO\\CUTSCENE\\COK\\COK_3.VB", - "AUDIO\\CUTSCENE\\COK\\COK_4A.VB", - "AUDIO\\CUTSCENE\\COK\\COK_4A2.VB", - "AUDIO\\CUTSCENE\\COK\\COK_4B.VB", - "AUDIO\\CUTSCENE\\COL\\COL_1.VB", - "AUDIO\\CUTSCENE\\COL\\COL_2.VB", - "AUDIO\\CUTSCENE\\COL\\COL_3A.VB", - "AUDIO\\CUTSCENE\\COL\\COL_4A.VB", - "AUDIO\\CUTSCENE\\COL\\COL_5A.VB", - "AUDIO\\CUTSCENE\\COL\\COL_5B.VB", - "AUDIO\\CUTSCENE\\CUB\\CUB_1.VB", - "AUDIO\\CUTSCENE\\CUB\\CUB_2.VB", - "AUDIO\\CUTSCENE\\CUB\\CUB_3.VB", - "AUDIO\\CUTSCENE\\CUB\\CUB_4.VB", - "AUDIO\\CUTSCENE\\DRUG\\DRUG_1.VB", - "AUDIO\\CUTSCENE\\FIN\\FIN.VB", - "AUDIO\\CUTSCENE\\FIN\\FIN2.VB", - "AUDIO\\CUTSCENE\\FINALE\\FINALE.VB", - "AUDIO\\CUTSCENE\\HAT\\HAT_1.VB", - "AUDIO\\CUTSCENE\\HAT\\HAT_2.VB", - "AUDIO\\CUTSCENE\\HAT\\HAT_3.VB", - "AUDIO\\CUTSCENE\\ICE\\ICE_1.VB", - "AUDIO\\CUTSCENE\\INT\\INT_A.VB", - "AUDIO\\CUTSCENE\\INT\\INT_B.VB", - "AUDIO\\CUTSCENE\\INT\\INT_D.VB", - "AUDIO\\CUTSCENE\\INT\\INT_M.VB", - "AUDIO\\CUTSCENE\\LAW\\LAW_1A.VB", - "AUDIO\\CUTSCENE\\LAW\\LAW_1B.VB", - "AUDIO\\CUTSCENE\\LAW\\LAW_2A.VB", - "AUDIO\\CUTSCENE\\LAW\\LAW_2B.VB", - "AUDIO\\CUTSCENE\\LAW\\LAW_2C.VB", - "AUDIO\\CUTSCENE\\LAW\\LAW_3.VB", - "AUDIO\\CUTSCENE\\LAW\\LAW_4.VB", - "AUDIO\\CUTSCENE\\PHIL\\PHIL_1.VB", - "AUDIO\\CUTSCENE\\PHIL\\PHIL_2.VB", - "AUDIO\\CUTSCENE\\PORN\\PORN_1.VB", - "AUDIO\\CUTSCENE\\PORN\\PORN_2.VB", - "AUDIO\\CUTSCENE\\PORN\\PORN_3.VB", - "AUDIO\\CUTSCENE\\PORN\\PORN_4.VB", - "AUDIO\\CUTSCENE\\RESC\\RESC_1A.VB", - "AUDIO\\CUTSCENE\\ROK\\ROK_1.VB", - "AUDIO\\CUTSCENE\\ROK\\ROK_2.VB", - "AUDIO\\CUTSCENE\\ROK\\ROK_3A.VB", - "AUDIO\\CUTSCENE\\STRIPA\\STRIPA.VB", - "AUDIO\\CUTSCENE\\TAX\\TAX_1.VB", - "AUDIO\\CUTSCENE\\TEX\\TEX_1.VB", - "AUDIO\\CUTSCENE\\TEX\\TEX_2.VB", - "AUDIO\\CUTSCENE\\TEX\\TEX_3.VB", - "AUDIO\\MUSIC\\GLIGHT.VB", - "AUDIO\\MUSIC\\FIST.VB", - "AUDIO\\MUSIC\\MISCOM.VB", - "AUDIO\\MUSIC\\MISCOM.VB", - "AUDIO\\MUSIC\\MISCOM.VB", - "AUDIO\\MUSIC\\MISCOM.VB", + "AUDIO\\NEWS\\NEWS_A.VB", + "AUDIO\\NEWS\\NEWS_B.VB", + "AUDIO\\NEWS\\NEWS_C.VB", + "AUDIO\\NEWS\\NEWS_D.VB", + "AUDIO\\NEWS\\NEWS_E.VB", + "AUDIO\\NEWS\\NEWS_F.VB", + "AUDIO\\NEWS\\NEWS_G.VB", + "AUDIO\\NEWS\\NEWS_H.VB", + "AUDIO\\NEWS\\NEWS_I.VB", + "AUDIO\\NEWS\\NEWS_J.VB", + "AUDIO\\NEWS\\NEWS_K.VB", + "AUDIO\\NEWS\\NEWS_L.VB", + "AUDIO\\NEWS\\NEWS_M.VB", + "AUDIO\\NEWS\\NEWS_N.VB", + "AUDIO\\CUTSCENE\\BIKER.VB", + "AUDIO\\CUTSCENE\\BONEVOY.VB", + "AUDIO\\CUTSCENE\\CAMPAIN.VB", + "AUDIO\\CUTSCENE\\CASHCHP.VB", + "AUDIO\\CUTSCENE\\CONTBAN.VB", + "AUDIO\\CUTSCENE\\CRAZY69.VB", + "AUDIO\\CUTSCENE\\CRAZY69.VB", + "AUDIO\\CUTSCENE\\DEADLY.VB", + "AUDIO\\CUTSCENE\\DONPROB.VB", + "AUDIO\\CUTSCENE\\DRIVNMR.VB", + "AUDIO\\CUTSCENE\\ELECTON.VB", + "AUDIO\\CUTSCENE\\FINAL.VB", + "AUDIO\\CUTSCENE\\FINAL_2.VB", + "AUDIO\\CUTSCENE\\HOMSWET.VB", + "AUDIO\\CUTSCENE\\HOTWHEL.VB", + "AUDIO\\CUTSCENE\\KIDNAPP.VB", + "AUDIO\\CUTSCENE\\LANDGRB.VB", + "AUDIO\\CUTSCENE\\MORGUE.VB", + "AUDIO\\CUTSCENE\\OVERDOS.VB", + "AUDIO\\CUTSCENE\\RUFJUST.VB", + "AUDIO\\CUTSCENE\\SAYONAR.VB", + "AUDIO\\CUTSCENE\\SICILAN.VB", + "AUDIO\\CUTSCENE\\THEOFER.VB", + "AUDIO\\CUTSCENE\\INTRO.VB", + "AUDIO\\MUSIC\\FINALE.VB", + "AUDIO\\MUSIC\\MISCOM2.VB" #else static char StreamedNameTable[][25] = { @@ -488,1125 +451,5 @@ static char StreamedNameTable[][25] = "AUDIO\\MISCOM.MP3", "AUDIO\\MISCOM.MP3", #endif - "AUDIO\\MOBR1.WAV", - "AUDIO\\PAGER.WAV", - "AUDIO\\CARREV.WAV", - "AUDIO\\BIKEREV.WAV", - "AUDIO\\LIFTOP.WAV", - "AUDIO\\LIFTCL.WAV", - "AUDIO\\LIFTRUN.WAV", - "AUDIO\\LIFTBEL.WAV", - "AUDIO\\INLIFT.WAV", - "AUDIO\\SFX_01.WAV", - "AUDIO\\SFX_02.WAV", - "AUDIO\\CAMERAL.WAV", - "AUDIO\\CAMERAR.WAV", - "AUDIO\\CHEER1.WAV", - "AUDIO\\CHEER2.WAV", - "AUDIO\\CHEER3.WAV", - "AUDIO\\CHEER4.WAV", - "AUDIO\\OOH1.WAV", - "AUDIO\\OOH2.WAV", - "AUDIO\\RACE1.WAV", - "AUDIO\\RACE2.WAV", - "AUDIO\\RACE3.WAV", - "AUDIO\\RACE4.WAV", - "AUDIO\\RACE5.WAV", - "AUDIO\\RACE6.WAV", - "AUDIO\\RACE7.WAV", - "AUDIO\\RACE8.WAV", - "AUDIO\\RACE9.WAV", - "AUDIO\\RACE10.WAV", - "AUDIO\\RACE11.WAV", - "AUDIO\\RACE12.WAV", - "AUDIO\\RACE13.WAV", - "AUDIO\\RACE14.WAV", - "AUDIO\\RACE15.WAV", - "AUDIO\\HOT1.WAV", - "AUDIO\\HOT2.WAV", - "AUDIO\\HOT3.WAV", - "AUDIO\\HOT4.WAV", - "AUDIO\\HOT5.WAV", - "AUDIO\\HOT6.WAV", - "AUDIO\\HOT7.WAV", - "AUDIO\\HOT8.WAV", - "AUDIO\\HOT9.WAV", - "AUDIO\\HOT10.WAV", - "AUDIO\\HOT11.WAV", - "AUDIO\\HOT12.WAV", - "AUDIO\\HOT13.WAV", - "AUDIO\\HOT14.WAV", - "AUDIO\\HOT15.WAV", - "AUDIO\\LANSTP1.WAV", - "AUDIO\\LANSTP2.WAV", - "AUDIO\\LANAMU1.WAV", - "AUDIO\\LANAMU2.WAV", - "AUDIO\\AIRHORNL.WAV", - "AUDIO\\AIRHORNR.WAV", - "AUDIO\\SNIPSCRL.WAV", - "AUDIO\\SNIPSHORT.WAV", - "AUDIO\\BLOWROOF.WAV", - "AUDIO\\ASS_1.WAV", - "AUDIO\\ASS_2.WAV", - "AUDIO\\ASS_3.WAV", - "AUDIO\\ASS_4.WAV", - "AUDIO\\ASS_5.WAV", - "AUDIO\\ASS_6.WAV", - "AUDIO\\ASS_7.WAV", - "AUDIO\\ASS_8.WAV", - "AUDIO\\ASS_9.WAV", - "AUDIO\\ASS_10.WAV", - "AUDIO\\ASS_11.WAV", - "AUDIO\\ASS_12.WAV", - "AUDIO\\ASS_13.WAV", - "AUDIO\\ASS_14.WAV", - "AUDIO\\BIKE1_1.WAV", - "AUDIO\\BIKE1_2.WAV", - "AUDIO\\BIKE1_3.WAV", - "AUDIO\\BNK1_1.WAV", - "AUDIO\\BNK1_2.WAV", - "AUDIO\\BNK1_3.WAV", - "AUDIO\\BNK1_4.WAV", - "AUDIO\\BNK1_5.WAV", - "AUDIO\\BNK1_6.WAV", - "AUDIO\\BNK1_7.WAV", - "AUDIO\\BNK1_8.WAV", - "AUDIO\\BNK1_10.WAV", - "AUDIO\\BNK1_11.WAV", - "AUDIO\\BNK1_12.WAV", - "AUDIO\\BNK1_13.WAV", - "AUDIO\\BNK1_14.WAV", - "AUDIO\\BNK2_1.WAV", - "AUDIO\\BNK2_2.WAV", - "AUDIO\\BNK2_3.WAV", - "AUDIO\\BNK2_4.WAV", - "AUDIO\\BNK2_5.WAV", - "AUDIO\\BNK2_6.WAV", - "AUDIO\\BNK2_7.WAV", - "AUDIO\\BNK2_8.WAV", - "AUDIO\\BNK2_9.WAV", - "AUDIO\\BNK3_1.WAV", - "AUDIO\\BNK3_2.WAV", - "AUDIO\\BNK3_3A.WAV", - "AUDIO\\BNK3_3B.WAV", - "AUDIO\\BNK3_3C.WAV", - "AUDIO\\BNK3_4A.WAV", - "AUDIO\\BNK3_4B.WAV", - "AUDIO\\BNK3_4C.WAV", - "AUDIO\\BNK4_1.WAV", - "AUDIO\\BNK4_2.WAV", - "AUDIO\\BNK4_3A.WAV", - "AUDIO\\BNK4_3B.WAV", - "AUDIO\\BNK4_3C.WAV", - "AUDIO\\BNK4_3D.WAV", - "AUDIO\\BNK4_3E.WAV", - "AUDIO\\BNK4_3F.WAV", - "AUDIO\\BNK4_3G.WAV", - "AUDIO\\BNK4_3H.WAV", - "AUDIO\\BNK4_3I.WAV", - "AUDIO\\BNK4_3J.WAV", - "AUDIO\\BNK4_3K.WAV", - "AUDIO\\BNK4_3M.WAV", - "AUDIO\\BNK4_3O.WAV", - "AUDIO\\BNK4_3P.WAV", - "AUDIO\\BNK4_3Q.WAV", - "AUDIO\\BNK4_3R.WAV", - "AUDIO\\BNK4_3S.WAV", - "AUDIO\\BNK4_3T.WAV", - "AUDIO\\BNK4_3U.WAV", - "AUDIO\\BNK4_3V.WAV", - "AUDIO\\BNK4_4A.WAV", - "AUDIO\\BNK4_4B.WAV", - "AUDIO\\BNK4_5.WAV", - "AUDIO\\BNK4_6.WAV", - "AUDIO\\BNK4_7.WAV", - "AUDIO\\BNK4_8.WAV", - "AUDIO\\BNK4_9.WAV", - "AUDIO\\BNK4_10.WAV", - "AUDIO\\BNK4_11.WAV", - "AUDIO\\BK4_12A.WAV", - "AUDIO\\BK4_12B.WAV", - "AUDIO\\BK4_12C.WAV", - "AUDIO\\BNK4_13.WAV", - "AUDIO\\BK4_14A.WAV", - "AUDIO\\BK4_14B.WAV", - "AUDIO\\BNK4_15.WAV", - "AUDIO\\BNK4_16.WAV", - "AUDIO\\BNK4_17.WAV", - "AUDIO\\BNK4_18.WAV", - "AUDIO\\BK4_19A.WAV", - "AUDIO\\BK4_19B.WAV", - "AUDIO\\BK4_20A.WAV", - "AUDIO\\BK4_20B.WAV", - "AUDIO\\BNK4_21.WAV", - "AUDIO\\BNK422A.WAV", - "AUDIO\\BNK422B.WAV", - "AUDIO\\BK4_23A.WAV", - "AUDIO\\BK4_23B.WAV", - "AUDIO\\BK4_23C.WAV", - "AUDIO\\BK4_23D.WAV", - "AUDIO\\BK4_24A.WAV", - "AUDIO\\BK4_24B.WAV", - "AUDIO\\BNK4_25.WAV", - "AUDIO\\BNK4_26.WAV", - "AUDIO\\BNK4_27.WAV", - "AUDIO\\BNK4_28.WAV", - "AUDIO\\BNK4_29.WAV", - "AUDIO\\BNK4_30.WAV", - "AUDIO\\BK4_31A.WAV", - "AUDIO\\BK4_31B.WAV", - "AUDIO\\BNK4_32.WAV", - "AUDIO\\BK4_34A.WAV", - "AUDIO\\BK4_34B.WAV", - "AUDIO\\BK4_35A.WAV", - "AUDIO\\BK4_35B.WAV", - "AUDIO\\BNK4_36.WAV", - "AUDIO\\BNK4_37.WAV", - "AUDIO\\BNK4_38.WAV", - "AUDIO\\BNK4_39.WAV", - "AUDIO\\BK4_40A.WAV", - "AUDIO\\BK4_40B.WAV", - "AUDIO\\BNK4_41.WAV", - "AUDIO\\BNK4_42.WAV", - "AUDIO\\BNK4_43.WAV", - "AUDIO\\BNK4_44.WAV", - "AUDIO\\BNK4_45.WAV", - "AUDIO\\BNK4_46.WAV", - "AUDIO\\BNK4_47.WAV", - "AUDIO\\BNK4_48.WAV", - "AUDIO\\BNK4_49.WAV", - "AUDIO\\BNK450A.WAV", - "AUDIO\\BNK450B.WAV", - "AUDIO\\BNK4_51.WAV", - "AUDIO\\BNK4_94.WAV", - "AUDIO\\BNK4_95.WAV", - "AUDIO\\BNK4_96.WAV", - "AUDIO\\BNK4_97.WAV", - "AUDIO\\BNK4_98.WAV", - "AUDIO\\BNK4_99.WAV", - "AUDIO\\BUD1_1.WAV", - "AUDIO\\BUD1_2.WAV", - "AUDIO\\BUD1_3.WAV", - "AUDIO\\BUD1_4.WAV", - "AUDIO\\BUD1_5.WAV", - "AUDIO\\BUD1_9.WAV", - "AUDIO\\BUD1_10.WAV", - "AUDIO\\BUD2_1.WAV", - "AUDIO\\BUD2_2.WAV", - "AUDIO\\BUD2_3.WAV", - "AUDIO\\BUD2_4.WAV", - "AUDIO\\BUD2_5.WAV", - "AUDIO\\BUD2_6.WAV", - "AUDIO\\BUD2_7.WAV", - "AUDIO\\BUD3_1.WAV", - "AUDIO\\BUD3_1A.WAV", - "AUDIO\\BUD3_1B.WAV", - "AUDIO\\BUD3_1C.WAV", - "AUDIO\\BUD3_2.WAV", - "AUDIO\\BUD3_3.WAV", - "AUDIO\\BUD3_4.WAV", - "AUDIO\\BUD3_5.WAV", - "AUDIO\\BUD3_6.WAV", - "AUDIO\\BUD3_7.WAV", - "AUDIO\\BUD3_8A.WAV", - "AUDIO\\BUD3_8B.WAV", - "AUDIO\\BUD3_8C.WAV", - "AUDIO\\BUD3_9A.WAV", - "AUDIO\\BUD3_9B.WAV", - "AUDIO\\BUD3_9C.WAV", - "AUDIO\\CAP1_2.WAV", - "AUDIO\\CAP1_3.WAV", - "AUDIO\\CAP1_4.WAV", - "AUDIO\\CAP1_5.WAV", - "AUDIO\\CAP1_6.WAV", - "AUDIO\\CAP1_7.WAV", - "AUDIO\\CAP1_8.WAV", - "AUDIO\\CAP1_9.WAV", - "AUDIO\\CAP1_10.WAV", - "AUDIO\\CAP1_11.WAV", - "AUDIO\\CAP1_12.WAV", - "AUDIO\\CNT1_1.WAV", - "AUDIO\\CNT1_2.WAV", - "AUDIO\\CNT1_3.WAV", - "AUDIO\\CNT1_4.WAV", - "AUDIO\\CNT1_5.WAV", - "AUDIO\\CNT2_1.WAV", - "AUDIO\\CNT2_2.WAV", - "AUDIO\\CNT2_3.WAV", - "AUDIO\\CNT2_4.WAV", - "AUDIO\\COK1_1.WAV", - "AUDIO\\COK1_2.WAV", - "AUDIO\\COK1_3.WAV", - "AUDIO\\COK1_4.WAV", - "AUDIO\\COK1_5.WAV", - "AUDIO\\COK1_6.WAV", - "AUDIO\\COK2_1.WAV", - "AUDIO\\COK2_2.WAV", - "AUDIO\\COK2_3.WAV", - "AUDIO\\COK2_4.WAV", - "AUDIO\\COK2_5.WAV", - "AUDIO\\COK2_6.WAV", - "AUDIO\\COK2_7A.WAV", - "AUDIO\\COK2_7B.WAV", - "AUDIO\\COK2_7C.WAV", - "AUDIO\\COK2_8A.WAV", - "AUDIO\\COK2_8B.WAV", - "AUDIO\\COK2_8C.WAV", - "AUDIO\\COK2_8D.WAV", - "AUDIO\\COK2_9.WAV", - "AUDIO\\COK210A.WAV", - "AUDIO\\COK210B.WAV", - "AUDIO\\COK210C.WAV", - "AUDIO\\COK212A.WAV", - "AUDIO\\COK212B.WAV", - "AUDIO\\COK2_13.WAV", - "AUDIO\\COK2_14.WAV", - "AUDIO\\COK2_15.WAV", - "AUDIO\\COK2_16.WAV", - "AUDIO\\COK2_20.WAV", - "AUDIO\\COK2_21.WAV", - "AUDIO\\COK2_2.WAV", // this is probably a typo of COK2_22 - "AUDIO\\COK3_1.WAV", - "AUDIO\\COK3_2.WAV", - "AUDIO\\COK3_3.WAV", - "AUDIO\\COK3_4.WAV", - "AUDIO\\COK4_1.WAV", - "AUDIO\\COK4_2.WAV", - "AUDIO\\COK4_3.WAV", - "AUDIO\\COK4_4.WAV", - "AUDIO\\COK4_5.WAV", - "AUDIO\\COK4_6.WAV", - "AUDIO\\COK4_7.WAV", - "AUDIO\\COK4_8.WAV", - "AUDIO\\COK4_9.WAV", - "AUDIO\\COK4_9A.WAV", - "AUDIO\\COK4_10.WAV", - "AUDIO\\COK4_11.WAV", - "AUDIO\\COK4_12.WAV", - "AUDIO\\COK4_13.WAV", - "AUDIO\\COK4_14.WAV", - "AUDIO\\COK4_15.WAV", - "AUDIO\\COK4_16.WAV", - "AUDIO\\COK4_17.WAV", - "AUDIO\\COK4_18.WAV", - "AUDIO\\COK4_19.WAV", - "AUDIO\\COK4_20.WAV", - "AUDIO\\COK4_21.WAV", - "AUDIO\\COK4_22.WAV", - "AUDIO\\COK4_23.WAV", - "AUDIO\\COK4_24.WAV", - "AUDIO\\COK4_25.WAV", - "AUDIO\\COK4_26.WAV", - "AUDIO\\COK4_27.WAV", - "AUDIO\\COL1_1.WAV", - "AUDIO\\COL1_2.WAV", - "AUDIO\\COL1_3.WAV", - "AUDIO\\COL1_4.WAV", - "AUDIO\\COL1_5.WAV", - "AUDIO\\COL1_6.WAV", - "AUDIO\\COL1_7.WAV", - "AUDIO\\COL1_8.WAV", - "AUDIO\\COL2_1.WAV", - "AUDIO\\COL2_2.WAV", - "AUDIO\\COL2_3.WAV", - "AUDIO\\COL2_4.WAV", - "AUDIO\\COL2_5.WAV", - "AUDIO\\COL2_6A.WAV", - "AUDIO\\COL2_7.WAV", - "AUDIO\\COL2_8.WAV", - "AUDIO\\COL2_9.WAV", - "AUDIO\\COL2_10.WAV", - "AUDIO\\COL2_11.WAV", - "AUDIO\\COL2_12.WAV", - "AUDIO\\COL2_13.WAV", - "AUDIO\\COL2_14.WAV", - "AUDIO\\COL2_15.WAV", - "AUDIO\\COL2_16.WAV", - "AUDIO\\COL3_1.WAV", - "AUDIO\\COL3_2.WAV", - "AUDIO\\COL3_2A.WAV", - "AUDIO\\COL3_2B.WAV", - "AUDIO\\COL3_3.WAV", - "AUDIO\\COL3_4.WAV", - "AUDIO\\COL3_5.WAV", - "AUDIO\\COL3_6.WAV", - "AUDIO\\COL3_7.WAV", - "AUDIO\\COL3_8.WAV", - "AUDIO\\COL3_9.WAV", - "AUDIO\\COL3_10.WAV", - "AUDIO\\COL3_11.WAV", - "AUDIO\\COL3_12.WAV", - "AUDIO\\COL3_13.WAV", - "AUDIO\\COL3_14.WAV", - "AUDIO\\COL3_15.WAV", - "AUDIO\\COL3_16.WAV", - "AUDIO\\COL3_17.WAV", - "AUDIO\\COL3_18.WAV", - "AUDIO\\COL3_19.WAV", - "AUDIO\\COL3_20.WAV", - "AUDIO\\COL3_21.WAV", - "AUDIO\\COL3_23.WAV", - "AUDIO\\COL3_24.WAV", - "AUDIO\\COL3_25.WAV", - "AUDIO\\COL4_1.WAV", - "AUDIO\\COL4_2.WAV", - "AUDIO\\COL4_3.WAV", - "AUDIO\\COL4_4.WAV", - "AUDIO\\COL4_5.WAV", - "AUDIO\\COL4_6.WAV", - "AUDIO\\COL4_7.WAV", - "AUDIO\\COL4_8.WAV", - "AUDIO\\COL4_9.WAV", - "AUDIO\\COL4_10.WAV", - "AUDIO\\COL4_11.WAV", - "AUDIO\\COL4_12.WAV", - "AUDIO\\COL4_13.WAV", - "AUDIO\\COL4_14.WAV", - "AUDIO\\COL4_15.WAV", - "AUDIO\\COL4_16.WAV", - "AUDIO\\COL4_17.WAV", - "AUDIO\\COL4_18.WAV", - "AUDIO\\COL4_19.WAV", - "AUDIO\\COL4_20.WAV", - "AUDIO\\COL4_21.WAV", - "AUDIO\\COL4_22.WAV", - "AUDIO\\COL4_23.WAV", - "AUDIO\\COL4_24.WAV", - "AUDIO\\COL4_25.WAV", - "AUDIO\\COL4_26.WAV", - "AUDIO\\COL5_1.WAV", - "AUDIO\\COL5_2.WAV", - "AUDIO\\COL5_3.WAV", - "AUDIO\\COL5_4.WAV", - "AUDIO\\COL5_5.WAV", - "AUDIO\\COL5_6.WAV", - "AUDIO\\COL5_7.WAV", - "AUDIO\\COL5_8.WAV", - "AUDIO\\COL5_9.WAV", - "AUDIO\\COL5_10.WAV", - "AUDIO\\COL5_11.WAV", - "AUDIO\\COL5_12.WAV", - "AUDIO\\COL5_13.WAV", - "AUDIO\\COL5_14.WAV", - "AUDIO\\COL5_15.WAV", - "AUDIO\\COL5_16.WAV", - "AUDIO\\COL5_17.WAV", - "AUDIO\\COL5_18.WAV", - "AUDIO\\COL5_19.WAV", - "AUDIO\\COL5_20.WAV", - "AUDIO\\COL5_21.WAV", - "AUDIO\\COL5_22.WAV", - "AUDIO\\CUB1_1.WAV", - "AUDIO\\CUB1_2.WAV", - "AUDIO\\CUB1_3.WAV", - "AUDIO\\CUB1_4.WAV", - "AUDIO\\CUB1_5.WAV", - "AUDIO\\CUB1_6.WAV", - "AUDIO\\CUB1_7.WAV", - "AUDIO\\CUB1_8.WAV", - "AUDIO\\CUB1_9.WAV", - "AUDIO\\CUB1_10.WAV", - "AUDIO\\CUB2_1.WAV", - "AUDIO\\CUB2_2.WAV", - "AUDIO\\CUB2_3A.WAV", - "AUDIO\\CUB2_3B.WAV", - "AUDIO\\CUB2_3C.WAV", - "AUDIO\\CUB2_4A.WAV", - "AUDIO\\CUB2_5.WAV", - "AUDIO\\CUB2_6.WAV", - "AUDIO\\CUB2_7.WAV", - "AUDIO\\CUB2_8.WAV", - "AUDIO\\CUB2_9.WAV", - "AUDIO\\CUB2_10.WAV", - "AUDIO\\CUB2_11.WAV", - "AUDIO\\CUB3_1.WAV", - "AUDIO\\CUB3_2.WAV", - "AUDIO\\CUB3_3.WAV", - "AUDIO\\CUB3_4.WAV", - "AUDIO\\CUB4_1.WAV", - "AUDIO\\CUB4_2.WAV", - "AUDIO\\CUB4_3.WAV", - "AUDIO\\CUB4_4.WAV", - "AUDIO\\CUB4_5.WAV", - "AUDIO\\CUB4_5A.WAV", - "AUDIO\\CUB4_6.WAV", - "AUDIO\\CUB4_7.WAV", - "AUDIO\\CUB4_8.WAV", - "AUDIO\\CUB4_9.WAV", - "AUDIO\\CUB4_10.WAV", - "AUDIO\\CUB4_11.WAV", - "AUDIO\\CUB4_12.WAV", - "AUDIO\\CUB4_13.WAV", - "AUDIO\\CUB4_14.WAV", - "AUDIO\\CUB4_15.WAV", - "AUDIO\\CUB4_16.WAV", - "AUDIO\\GOLF_1.WAV", - "AUDIO\\GOLF_2.WAV", - "AUDIO\\GOLF_3.WAV", - "AUDIO\\BAR_1.WAV", - "AUDIO\\BAR_2.WAV", - "AUDIO\\BAR_3.WAV", - "AUDIO\\BAR_4.WAV", - "AUDIO\\BAR_5.WAV", - "AUDIO\\BAR_6.WAV", - "AUDIO\\BAR_7.WAV", - "AUDIO\\BAR_8.WAV", - "AUDIO\\STRIP_1.WAV", - "AUDIO\\STRIP_2.WAV", - "AUDIO\\STRIP_3.WAV", - "AUDIO\\STRIP_4.WAV", - "AUDIO\\STRIP_5.WAV", - "AUDIO\\STRIP_6.WAV", - "AUDIO\\STRIP_7.WAV", - "AUDIO\\STRIP_8.WAV", - "AUDIO\\STRIP_9.WAV", - "AUDIO\\STAR_1.WAV", - "AUDIO\\STAR_2.WAV", - "AUDIO\\STAR_3.WAV", - "AUDIO\\STAR_4.WAV", - "AUDIO\\FIN_1A.WAV", - "AUDIO\\FIN_1B.WAV", - "AUDIO\\FIN_1C.WAV", - "AUDIO\\FIN_2B.WAV", - "AUDIO\\FIN_2C.WAV", - "AUDIO\\FIN_3.WAV", - "AUDIO\\FIN_4.WAV", - "AUDIO\\FIN_5.WAV", - "AUDIO\\FIN_6.WAV", - "AUDIO\\FIN_10.WAV", - "AUDIO\\FIN_11A.WAV", - "AUDIO\\FIN_11B.WAV", - "AUDIO\\FIN_12A.WAV", - "AUDIO\\FIN_12B.WAV", - "AUDIO\\FIN_12C.WAV", - "AUDIO\\FIN_13.WAV", - "AUDIO\\FINKILL.WAV", - "AUDIO\\LAW1_1.WAV", - "AUDIO\\LAW1_2.WAV", - "AUDIO\\LAW1_3.WAV", - "AUDIO\\LAW1_4.WAV", - "AUDIO\\LAW1_5.WAV", - "AUDIO\\LAW1_6.WAV", - "AUDIO\\LAW1_7.WAV", - "AUDIO\\LAW1_8.WAV", - "AUDIO\\LAW1_9.WAV", - "AUDIO\\LAW1_10.WAV", - "AUDIO\\LAW2_1.WAV", - "AUDIO\\LAW2_2.WAV", - "AUDIO\\LAW2_3.WAV", - "AUDIO\\LAW2_4.WAV", - "AUDIO\\LAW2_5.WAV", - "AUDIO\\LAW2_6.WAV", - "AUDIO\\LAW2_7.WAV", - "AUDIO\\LAW2_8.WAV", - "AUDIO\\LAW2_9.WAV", - "AUDIO\\LAW2_10.WAV", - "AUDIO\\LAW3_1.WAV", - "AUDIO\\LAW3_2.WAV", - "AUDIO\\LAW3_3.WAV", - "AUDIO\\LAW3_4.WAV", - "AUDIO\\LAW3_5.WAV", - "AUDIO\\LAW3_6.WAV", - "AUDIO\\LAW3_10.WAV", - "AUDIO\\LAW3_11.WAV", - "AUDIO\\LAW3_12.WAV", - "AUDIO\\LAW3_13.WAV", - "AUDIO\\LAW3_14.WAV", - "AUDIO\\LAW3_16.WAV", - "AUDIO\\LAW3_17.WAV", - "AUDIO\\LAW3_18.WAV", - "AUDIO\\LAW3_19.WAV", - "AUDIO\\LAW3_20.WAV", - "AUDIO\\LAW3_21.WAV", - "AUDIO\\LAW3_22.WAV", - "AUDIO\\LAW3_23.WAV", - "AUDIO\\LAW3_24.WAV", - "AUDIO\\LAW3_25.WAV", - "AUDIO\\LAW4_1A.WAV", - "AUDIO\\LAW4_1B.WAV", - "AUDIO\\LAW4_1C.WAV", - "AUDIO\\LAW4_1D.WAV", - "AUDIO\\LAW4_10.WAV", - "AUDIO\\LAW4_3.WAV", - "AUDIO\\LAW4_4.WAV", - "AUDIO\\LAW4_5.WAV", - "AUDIO\\LAW4_6.WAV", - "AUDIO\\LAW4_7.WAV", - "AUDIO\\LAW4_8.WAV", - "AUDIO\\LAW4_9.WAV", - "AUDIO\\PHIL1_2.WAV", - "AUDIO\\PHIL1_3.WAV", - "AUDIO\\PHIL2_1.WAV", - "AUDIO\\PHIL2_2.WAV", - "AUDIO\\PHIL2_3.WAV", - "AUDIO\\PHIL2_4.WAV", - "AUDIO\\PHIL2_5.WAV", - "AUDIO\\PHIL2_6.WAV", - "AUDIO\\PHIL2_7.WAV", - "AUDIO\\PHIL2_8.WAV", - "AUDIO\\PHIL2_9.WAV", - "AUDIO\\PHIL210.WAV", - "AUDIO\\PHIL211.WAV", - "AUDIO\\PORN1_1.WAV", - "AUDIO\\PORN1_2.WAV", - "AUDIO\\PORN1_3.WAV", - "AUDIO\\PRN1_3A.WAV", - "AUDIO\\PORN1_4.WAV", - "AUDIO\\PORN1_5.WAV", - "AUDIO\\PORN1_6.WAV", - "AUDIO\\PORN1_7.WAV", - "AUDIO\\PORN1_8.WAV", - "AUDIO\\PORN1_9.WAV", - "AUDIO\\PRN1_10.WAV", - "AUDIO\\PRN1_11.WAV", - "AUDIO\\PRN1_12.WAV", - "AUDIO\\PRN1_13.WAV", - "AUDIO\\PRN1_14.WAV", - "AUDIO\\PRN1_15.WAV", - "AUDIO\\PRN1_16.WAV", - "AUDIO\\PRN1_17.WAV", - "AUDIO\\PRN1_18.WAV", - "AUDIO\\PRN1_19.WAV", - "AUDIO\\PRN1_20.WAV", - "AUDIO\\PRN1_21.WAV", - "AUDIO\\PORN3_1.WAV", - "AUDIO\\PORN3_2.WAV", - "AUDIO\\PORN3_3.WAV", - "AUDIO\\PORN3_4.WAV", - "AUDIO\\PSYCH_1.WAV", - "AUDIO\\PSYCH_2.WAV", - "AUDIO\\ROK2_01.WAV", - "AUDIO\\ROK3_1.WAV", - "AUDIO\\ROK3_2.WAV", - "AUDIO\\ROK3_3.WAV", - "AUDIO\\ROK3_4.WAV", - "AUDIO\\ROK3_5.WAV", - "AUDIO\\ROK3_6.WAV", - "AUDIO\\ROK3_7.WAV", - "AUDIO\\ROK3_8.WAV", - "AUDIO\\ROK3_9.WAV", - "AUDIO\\ROK3_10.WAV", - "AUDIO\\ROK3_11.WAV", - "AUDIO\\ROK3_12.WAV", - "AUDIO\\ROK3_13.WAV", - "AUDIO\\ROK3_14.WAV", - "AUDIO\\ROK3_15.WAV", - "AUDIO\\ROK3_16.WAV", - "AUDIO\\ROK3_17.WAV", - "AUDIO\\ROK3_18.WAV", - "AUDIO\\ROK3_19.WAV", - "AUDIO\\ROK3_20.WAV", - "AUDIO\\ROK3_21.WAV", - "AUDIO\\ROK3_22.WAV", - "AUDIO\\ROK3_23.WAV", - "AUDIO\\ROK3_24.WAV", - "AUDIO\\ROK3_25.WAV", - "AUDIO\\ROK3_26.WAV", - "AUDIO\\ROK3_27.WAV", - "AUDIO\\ROK3_62.WAV", - "AUDIO\\ROK3_63.WAV", - "AUDIO\\ROK3_64.WAV", - "AUDIO\\ROK3_65.WAV", - "AUDIO\\ROK3_66.WAV", - "AUDIO\\ROK3_67.WAV", - "AUDIO\\ROK3_68.WAV", - "AUDIO\\ROK3_69.WAV", - "AUDIO\\ROK3_70.WAV", - "AUDIO\\ROK3_71.WAV", - "AUDIO\\ROK3_73.WAV", - "AUDIO\\RESC_1.WAV", - "AUDIO\\RESC_2.WAV", - "AUDIO\\RESC_3.WAV", - "AUDIO\\RESC_4.WAV", - "AUDIO\\RESC_5.WAV", - "AUDIO\\RESC_6.WAV", - "AUDIO\\RESC_7.WAV", - "AUDIO\\RESC_8.WAV", - "AUDIO\\RESC_9.WAV", - "AUDIO\\RESC_10.WAV", - "AUDIO\\ROK1_1A.WAV", - "AUDIO\\ROK1_1B.WAV", - "AUDIO\\ROK1_5.WAV", - "AUDIO\\ROK1_6.WAV", - "AUDIO\\ROK1_7.WAV", - "AUDIO\\ROK1_8.WAV", - "AUDIO\\ROK1_9.WAV", - "AUDIO\\TAX1_1.WAV", - "AUDIO\\TAX1_2.WAV", - "AUDIO\\TAX1_3.WAV", - "AUDIO\\TAX1_4.WAV", - "AUDIO\\TAX1_5.WAV", - "AUDIO\\TAX2_1.WAV", - "AUDIO\\TAX2_2.WAV", - "AUDIO\\TAX2_3.WAV", - "AUDIO\\TAX2_4.WAV", - "AUDIO\\TAX2_5.WAV", - "AUDIO\\TAX2_6.WAV", - "AUDIO\\TAX2_7.WAV", - "AUDIO\\TAX3_1.WAV", - "AUDIO\\TAX3_2.WAV", - "AUDIO\\TAX3_3.WAV", - "AUDIO\\TAX3_4.WAV", - "AUDIO\\TAX3_5.WAV", - "AUDIO\\TEX1_1.WAV", - "AUDIO\\TEX1_2.WAV", - "AUDIO\\TEX1_3.WAV", - "AUDIO\\TEX1_4.WAV", - "AUDIO\\TEX1_5.WAV", - "AUDIO\\TEX1_6.WAV", - "AUDIO\\TEX2_1.WAV", - "AUDIO\\TEX3_1.WAV", - "AUDIO\\TEX3_2.WAV", - "AUDIO\\TEX3_3.WAV", - "AUDIO\\TEX3_4.WAV", - "AUDIO\\TEX3_5.WAV", - "AUDIO\\TEX3_6.WAV", - "AUDIO\\TEX3_7.WAV", - "AUDIO\\TEX3_8.WAV", - "AUDIO\\HAT_1A.WAV", - "AUDIO\\INTRO1.WAV", - "AUDIO\\INTRO2.WAV", - "AUDIO\\INTRO3.WAV", - "AUDIO\\INTRO4.WAV", - "AUDIO\\MOB_01A.WAV", - "AUDIO\\MOB_01B.WAV", - "AUDIO\\MOB_01C.WAV", - "AUDIO\\MOB_02A.WAV", - "AUDIO\\MOB_02B.WAV", - "AUDIO\\MOB_02C.WAV", - "AUDIO\\MOB_03A.WAV", - "AUDIO\\MOB_03B.WAV", - "AUDIO\\MOB_03C.WAV", - "AUDIO\\MOB_03D.WAV", - "AUDIO\\MOB_03E.WAV", - "AUDIO\\SHARK_1.WAV", - "AUDIO\\SHARK_2.WAV", - "AUDIO\\SHARK_3.WAV", - "AUDIO\\SHARK_4.WAV", - "AUDIO\\SHARK_5.WAV", - "AUDIO\\MOB_04A.WAV", - "AUDIO\\MOB_04B.WAV", - "AUDIO\\MOB_04C.WAV", - "AUDIO\\MOB_04D.WAV", - "AUDIO\\MOB_05A.WAV", - "AUDIO\\MOB_05B.WAV", - "AUDIO\\MOB_05C.WAV", - "AUDIO\\MOB_05D.WAV", - "AUDIO\\MOB_06A.WAV", - "AUDIO\\MOB_06B.WAV", - "AUDIO\\MOB_06C.WAV", - "AUDIO\\MOB_07A.WAV", - "AUDIO\\MOB_07B.WAV", - "AUDIO\\MOB_08A.WAV", - "AUDIO\\MOB_08B.WAV", - "AUDIO\\MOB_08C.WAV", - "AUDIO\\MOB_08D.WAV", - "AUDIO\\MOB_08E.WAV", - "AUDIO\\MOB_08F.WAV", - "AUDIO\\MOB_08G.WAV", - "AUDIO\\MOB_09A.WAV", - "AUDIO\\MOB_09B.WAV", - "AUDIO\\MOB_09C.WAV", - "AUDIO\\MOB_09D.WAV", - "AUDIO\\MOB_09E.WAV", - "AUDIO\\MOB_09F.WAV", - "AUDIO\\MOB_10A.WAV", - "AUDIO\\MOB_10B.WAV", - "AUDIO\\MOB_10C.WAV", - "AUDIO\\MOB_10D.WAV", - "AUDIO\\MOB_10E.WAV", - "AUDIO\\MOB_11A.WAV", - "AUDIO\\MOB_11B.WAV", - "AUDIO\\MOB_11C.WAV", - "AUDIO\\MOB_11D.WAV", - "AUDIO\\MOB_11E.WAV", - "AUDIO\\MOB_11F.WAV", - "AUDIO\\MOB_14A.WAV", - "AUDIO\\MOB_14B.WAV", - "AUDIO\\MOB_14C.WAV", - "AUDIO\\MOB_14D.WAV", - "AUDIO\\MOB_14E.WAV", - "AUDIO\\MOB_14F.WAV", - "AUDIO\\MOB_14G.WAV", - "AUDIO\\MOB_14H.WAV", - "AUDIO\\MOB_16A.WAV", - "AUDIO\\MOB_16B.WAV", - "AUDIO\\MOB_16C.WAV", - "AUDIO\\MOB_16D.WAV", - "AUDIO\\MOB_16E.WAV", - "AUDIO\\MOB_16F.WAV", - "AUDIO\\MOB_16G.WAV", - "AUDIO\\MOB_17A.WAV", - "AUDIO\\MOB_17B.WAV", - "AUDIO\\MOB_17C.WAV", - "AUDIO\\MOB_17D.WAV", - "AUDIO\\MOB_17E.WAV", - "AUDIO\\MOB_17G.WAV", - "AUDIO\\MOB_17H.WAV", - "AUDIO\\MOB_17I.WAV", - "AUDIO\\MOB_17J.WAV", - "AUDIO\\MOB_17K.WAV", - "AUDIO\\MOB_17L.WAV", - "AUDIO\\MOB_18A.WAV", - "AUDIO\\MOB_18B.WAV", - "AUDIO\\MOB_18C.WAV", - "AUDIO\\MOB_18D.WAV", - "AUDIO\\MOB_18E.WAV", - "AUDIO\\MOB_18F.WAV", - "AUDIO\\MOB_18G.WAV", - "AUDIO\\MOB_20A.WAV", - "AUDIO\\MOB_20B.WAV", - "AUDIO\\MOB_20C.WAV", - "AUDIO\\MOB_20D.WAV", - "AUDIO\\MOB_20E.WAV", - "AUDIO\\MOB_24A.WAV", - "AUDIO\\MOB_24B.WAV", - "AUDIO\\MOB_24C.WAV", - "AUDIO\\MOB_24D.WAV", - "AUDIO\\MOB_24E.WAV", - "AUDIO\\MOB_24F.WAV", - "AUDIO\\MOB_24G.WAV", - "AUDIO\\MOB_24H.WAV", - "AUDIO\\MOB_25A.WAV", - "AUDIO\\MOB_25B.WAV", - "AUDIO\\MOB_25C.WAV", - "AUDIO\\MOB_25D.WAV", - "AUDIO\\MOB_26A.WAV", - "AUDIO\\MOB_26B.WAV", - "AUDIO\\MOB_26C.WAV", - "AUDIO\\MOB_26D.WAV", - "AUDIO\\MOB_26E.WAV", - "AUDIO\\MOB_29A.WAV", - "AUDIO\\MOB_29B.WAV", - "AUDIO\\MOB_29C.WAV", - "AUDIO\\MOB_29D.WAV", - "AUDIO\\MOB_29E.WAV", - "AUDIO\\MOB_29F.WAV", - "AUDIO\\MOB_29G.WAV", - "AUDIO\\MOB_30A.WAV", - "AUDIO\\MOB_30B.WAV", - "AUDIO\\MOB_30C.WAV", - "AUDIO\\MOB_30D.WAV", - "AUDIO\\MOB_30E.WAV", - "AUDIO\\MOB_30F.WAV", - "AUDIO\\MOB_33A.WAV", - "AUDIO\\MOB_33B.WAV", - "AUDIO\\MOB_33C.WAV", - "AUDIO\\MOB_33D.WAV", - "AUDIO\\MOB_34A.WAV", - "AUDIO\\MOB_34B.WAV", - "AUDIO\\MOB_34C.WAV", - "AUDIO\\MOB_34D.WAV", - "AUDIO\\MOB_35A.WAV", - "AUDIO\\MOB_35B.WAV", - "AUDIO\\MOB_35C.WAV", - "AUDIO\\MOB_35D.WAV", - "AUDIO\\MOB_36A.WAV", - "AUDIO\\MOB_36B.WAV", - "AUDIO\\MOB_36C.WAV", - "AUDIO\\MOB_40A.WAV", - "AUDIO\\MOB_40B.WAV", - "AUDIO\\MOB_40C.WAV", - "AUDIO\\MOB_40D.WAV", - "AUDIO\\MOB_40E.WAV", - "AUDIO\\MOB_40F.WAV", - "AUDIO\\MOB_40G.WAV", - "AUDIO\\MOB_40H.WAV", - "AUDIO\\MOB_40I.WAV", - "AUDIO\\MOB_41A.WAV", - "AUDIO\\MOB_41B.WAV", - "AUDIO\\MOB_41C.WAV", - "AUDIO\\MOB_41D.WAV", - "AUDIO\\MOB_41E.WAV", - "AUDIO\\MOB_41F.WAV", - "AUDIO\\MOB_41G.WAV", - "AUDIO\\MOB_41H.WAV", - "AUDIO\\MOB_42A.WAV", - "AUDIO\\MOB_42B.WAV", - "AUDIO\\MOB_42C.WAV", - "AUDIO\\MOB_42D.WAV", - "AUDIO\\MOB_42E.WAV", - "AUDIO\\MOB_43A.WAV", - "AUDIO\\MOB_43B.WAV", - "AUDIO\\MOB_43C.WAV", - "AUDIO\\MOB_43D.WAV", - "AUDIO\\MOB_43E.WAV", - "AUDIO\\MOB_43F.WAV", - "AUDIO\\MOB_43G.WAV", - "AUDIO\\MOB_43H.WAV", - "AUDIO\\MOB_45A.WAV", - "AUDIO\\MOB_45B.WAV", - "AUDIO\\MOB_45C.WAV", - "AUDIO\\MOB_45D.WAV", - "AUDIO\\MOB_45E.WAV", - "AUDIO\\MOB_45F.WAV", - "AUDIO\\MOB_45G.WAV", - "AUDIO\\MOB_45H.WAV", - "AUDIO\\MOB_45I.WAV", - "AUDIO\\MOB_45J.WAV", - "AUDIO\\MOB_45K.WAV", - "AUDIO\\MOB_45L.WAV", - "AUDIO\\MOB_45M.WAV", - "AUDIO\\MOB_45N.WAV", - "AUDIO\\MOB_46A.WAV", - "AUDIO\\MOB_46B.WAV", - "AUDIO\\MOB_46C.WAV", - "AUDIO\\MOB_46D.WAV", - "AUDIO\\MOB_46E.WAV", - "AUDIO\\MOB_46F.WAV", - "AUDIO\\MOB_46G.WAV", - "AUDIO\\MOB_46H.WAV", - "AUDIO\\MOB_47A.WAV", - "AUDIO\\MOB_52A.WAV", - "AUDIO\\MOB_52B.WAV", - "AUDIO\\MOB_52C.WAV", - "AUDIO\\MOB_52D.WAV", - "AUDIO\\MOB_52E.WAV", - "AUDIO\\MOB_52F.WAV", - "AUDIO\\MOB_52G.WAV", - "AUDIO\\MOB_52H.WAV", - "AUDIO\\MOB_54A.WAV", - "AUDIO\\MOB_54B.WAV", - "AUDIO\\MOB_54C.WAV", - "AUDIO\\MOB_54D.WAV", - "AUDIO\\MOB_54E.WAV", - "AUDIO\\MOB_55A.WAV", - "AUDIO\\MOB_55B.WAV", - "AUDIO\\MOB_55C.WAV", - "AUDIO\\MOB_55D.WAV", - "AUDIO\\MOB_55E.WAV", - "AUDIO\\MOB_55F.WAV", - "AUDIO\\MOB_56A.WAV", - "AUDIO\\MOB_56B.WAV", - "AUDIO\\MOB_56C.WAV", - "AUDIO\\MOB_56D.WAV", - "AUDIO\\MOB_56E.WAV", - "AUDIO\\MOB_56F.WAV", - "AUDIO\\MOB_57A.WAV", - "AUDIO\\MOB_57B.WAV", - "AUDIO\\MOB_57C.WAV", - "AUDIO\\MOB_57D.WAV", - "AUDIO\\MOB_57E.WAV", - "AUDIO\\MOB_58A.WAV", - "AUDIO\\MOB_58B.WAV", - "AUDIO\\MOB_58C.WAV", - "AUDIO\\MOB_58D.WAV", - "AUDIO\\MOB_58E.WAV", - "AUDIO\\MOB_58F.WAV", - "AUDIO\\MOB_58G.WAV", - "AUDIO\\MOB_61A.WAV", - "AUDIO\\MOB_61B.WAV", - "AUDIO\\MOB_62A.WAV", - "AUDIO\\MOB_62B.WAV", - "AUDIO\\MOB_62C.WAV", - "AUDIO\\MOB_62D.WAV", - "AUDIO\\MOB_63A.WAV", - "AUDIO\\MOB_63B.WAV", - "AUDIO\\MOB_63C.WAV", - "AUDIO\\MOB_63D.WAV", - "AUDIO\\MOB_63E.WAV", - "AUDIO\\MOB_63F.WAV", - "AUDIO\\MOB_63G.WAV", - "AUDIO\\MOB_63H.WAV", - "AUDIO\\MOB_63I.WAV", - "AUDIO\\MOB_63J.WAV", - "AUDIO\\MOB_66A.WAV", - "AUDIO\\MOB_66B.WAV", - "AUDIO\\MOB_68A.WAV", - "AUDIO\\MOB_68B.WAV", - "AUDIO\\MOB_68C.WAV", - "AUDIO\\MOB_68D.WAV", - "AUDIO\\MOB_70A.WAV", - "AUDIO\\MOB_70B.WAV", - "AUDIO\\MOB_71A.WAV", - "AUDIO\\MOB_71B.WAV", - "AUDIO\\MOB_71C.WAV", - "AUDIO\\MOB_71D.WAV", - "AUDIO\\MOB_71E.WAV", - "AUDIO\\MOB_71F.WAV", - "AUDIO\\MOB_71G.WAV", - "AUDIO\\MOB_71H.WAV", - "AUDIO\\MOB_71I.WAV", - "AUDIO\\MOB_71J.WAV", - "AUDIO\\MOB_71K.WAV", - "AUDIO\\MOB_71L.WAV", - "AUDIO\\MOB_71M.WAV", - "AUDIO\\MOB_71N.WAV", - "AUDIO\\MOB_72A.WAV", - "AUDIO\\MOB_72B.WAV", - "AUDIO\\MOB_72C.WAV", - "AUDIO\\MOB_72D.WAV", - "AUDIO\\MOB_72E.WAV", - "AUDIO\\MOB_72F.WAV", - "AUDIO\\MOB_72G.WAV", - "AUDIO\\MOB_73A.WAV", - "AUDIO\\MOB_73C.WAV", - "AUDIO\\MOB_73D.WAV", - "AUDIO\\MOB_73F.WAV", - "AUDIO\\MOB_73G.WAV", - "AUDIO\\MOB_73I.WAV", - "AUDIO\\MOB_95A.WAV", - "AUDIO\\MOB_96A.WAV", - "AUDIO\\MOB_98A.WAV", - "AUDIO\\MOB_99A.WAV", - "AUDIO\\JOB1_1B.WAV", - "AUDIO\\JOB1_1C.WAV", - "AUDIO\\JOB1_1D.WAV", - "AUDIO\\JOB2_1B.WAV", - "AUDIO\\JOB2_2.WAV", - "AUDIO\\JOB2_3.WAV", - "AUDIO\\JOB2_4.WAV", - "AUDIO\\JOB2_5.WAV", - "AUDIO\\JOB2_6.WAV", - "AUDIO\\JOB2_7.WAV", - "AUDIO\\JOB2_8.WAV", - "AUDIO\\JOB2_9.WAV", - "AUDIO\\JOB3_1.WAV", - "AUDIO\\JOB3_2.WAV", - "AUDIO\\JOB3_3.WAV", - "AUDIO\\JOB4_1.WAV", - "AUDIO\\JOB4_2.WAV", - "AUDIO\\JOB4_3.WAV", - "AUDIO\\JOB5_1.WAV", - "AUDIO\\JOB5_2.WAV", - "AUDIO\\JOB5_3.WAV", - "AUDIO\\BJM1_20.WAV", - "AUDIO\\BJM1_4.WAV", - "AUDIO\\BJM1_5.WAV", - "AUDIO\\MERC_39.WAV", - "AUDIO\\MONO_1.WAV", - "AUDIO\\MONO_2.WAV", - "AUDIO\\MONO_3.WAV", - "AUDIO\\MONO_4.WAV", - "AUDIO\\MONO_5.WAV", - "AUDIO\\MONO_6.WAV", - "AUDIO\\MONO_7.WAV", - "AUDIO\\MONO_8.WAV", - "AUDIO\\MONO_9.WAV", - "AUDIO\\MONO10.WAV", - "AUDIO\\MONO11.WAV", - "AUDIO\\MONO12.WAV", - "AUDIO\\MONO13.WAV", - "AUDIO\\MONO14.WAV", - "AUDIO\\MONO15.WAV", - "AUDIO\\MONO16.WAV", - "AUDIO\\FUD_01.WAV", - "AUDIO\\FUD_02.WAV", - "AUDIO\\FUD_03.WAV", - "AUDIO\\FUD_04.WAV", - "AUDIO\\FUD_05.WAV", - "AUDIO\\FUD_06.WAV", - "AUDIO\\FUD_07.WAV", - "AUDIO\\FUD_08.WAV", - "AUDIO\\FUD_09.WAV", - "AUDIO\\FUD_10.WAV", - "AUDIO\\FUD_11.WAV", - "AUDIO\\FUD_12.WAV", - "AUDIO\\FUD_13.WAV", - "AUDIO\\FUD_14.WAV", - "AUDIO\\FUD_15.WAV", - "AUDIO\\FUD_16.WAV", - "AUDIO\\FUD_17.WAV", - "AUDIO\\FUD_18.WAV", - "AUDIO\\FUD_19.WAV", - "AUDIO\\FUD_20.WAV", - "AUDIO\\BURG_01.WAV", - "AUDIO\\BURG_02.WAV", - "AUDIO\\BURG_03.WAV", - "AUDIO\\BURG_04.WAV", - "AUDIO\\BURG_05.WAV", - "AUDIO\\BURG_06.WAV", - "AUDIO\\BURG_07.WAV", - "AUDIO\\BURG_08.WAV", - "AUDIO\\BURG_09.WAV", - "AUDIO\\BURG_10.WAV", - "AUDIO\\BURG_11.WAV", - "AUDIO\\BURG_12.WAV", - "AUDIO\\CRUST01.WAV", - "AUDIO\\CRUST02.WAV", - "AUDIO\\CRUST03.WAV", - "AUDIO\\CRUST04.WAV", - "AUDIO\\CRUST05.WAV", - "AUDIO\\CRUST06.WAV", - "AUDIO\\CRUST07.WAV", - "AUDIO\\CRUST08.WAV", - "AUDIO\\CRUST09.WAV", - "AUDIO\\BAND_01.WAV", - "AUDIO\\BAND_02.WAV", - "AUDIO\\BAND_03.WAV", - "AUDIO\\BAND_04.WAV", - "AUDIO\\BAND_05.WAV", - "AUDIO\\BAND_06.WAV", - "AUDIO\\BAND_07.WAV", - "AUDIO\\BAND_08.WAV", - "AUDIO\\SHAFT01.WAV", - "AUDIO\\SHAFT02.WAV", - "AUDIO\\SHAFT03.WAV", - "AUDIO\\SHAFT04.WAV", - "AUDIO\\SHAFT05.WAV", - "AUDIO\\SHAFT06.WAV", - "AUDIO\\SHAFT07.WAV", - "AUDIO\\SHAFT08.WAV", - "AUDIO\\PISS_01.WAV", - "AUDIO\\PISS_02.WAV", - "AUDIO\\PISS_03.WAV", - "AUDIO\\PISS_04.WAV", - "AUDIO\\PISS_05.WAV", - "AUDIO\\PISS_06.WAV", - "AUDIO\\PISS_07.WAV", - "AUDIO\\PISS_08.WAV", - "AUDIO\\PISS_09.WAV", - "AUDIO\\PISS_10.WAV", - "AUDIO\\PISS_11.WAV", - "AUDIO\\PISS_12.WAV", - "AUDIO\\PISS_13.WAV", - "AUDIO\\PISS_14.WAV", - "AUDIO\\PISS_15.WAV", - "AUDIO\\PISS_16.WAV", - "AUDIO\\PISS_17.WAV", - "AUDIO\\PISS_18.WAV", - "AUDIO\\PISS_19.WAV", - "AUDIO\\GIMME01.WAV", - "AUDIO\\GIMME02.WAV", - "AUDIO\\GIMME03.WAV", - "AUDIO\\GIMME04.WAV", - "AUDIO\\GIMME05.WAV", - "AUDIO\\GIMME06.WAV", - "AUDIO\\GIMME07.WAV", - "AUDIO\\GIMME08.WAV", - "AUDIO\\GIMME09.WAV", - "AUDIO\\GIMME10.WAV", - "AUDIO\\GIMME11.WAV", - "AUDIO\\GIMME12.WAV", - "AUDIO\\GIMME13.WAV", - "AUDIO\\GIMME14.WAV", - "AUDIO\\GIMME15.WAV", - "AUDIO\\BUST_01.WAV", - "AUDIO\\BUST_02.WAV", - "AUDIO\\BUST_03.WAV", - "AUDIO\\BUST_04.WAV", - "AUDIO\\BUST_05.WAV", - "AUDIO\\BUST_06.WAV", - "AUDIO\\BUST_07.WAV", - "AUDIO\\BUST_08.WAV", - "AUDIO\\BUST_09.WAV", - "AUDIO\\BUST_10.WAV", - "AUDIO\\BUST_11.WAV", - "AUDIO\\BUST_12.WAV", - "AUDIO\\BUST_13.WAV", - "AUDIO\\BUST_14.WAV", - "AUDIO\\BUST_15.WAV", - "AUDIO\\BUST_16.WAV", - "AUDIO\\BUST_17.WAV", - "AUDIO\\BUST_18.WAV", - "AUDIO\\BUST_19.WAV", - "AUDIO\\BUST_20.WAV", - "AUDIO\\BUST_21.WAV", - "AUDIO\\BUST_22.WAV", - "AUDIO\\BUST_23.WAV", - "AUDIO\\BUST_24.WAV", - "AUDIO\\BUST_25.WAV", - "AUDIO\\BUST_26.WAV", - "AUDIO\\BUST_27.WAV", - "AUDIO\\BUST_28.WAV", + }; \ No newline at end of file diff --git a/src/audio/sampman_miles.cpp b/src/audio/sampman_miles.cpp index 2a4286eb..78de4e6b 100644 --- a/src/audio/sampman_miles.cpp +++ b/src/audio/sampman_miles.cpp @@ -1057,7 +1057,7 @@ cSampleManager::Initialise(void) m_szCDRomRootPath[0] = '\0'; strcpy(m_WavFilesPath, m_szCDRomRootPath); - + /* #ifdef AUDIO_CACHE if ( CreateCache ) #endif @@ -1084,7 +1084,7 @@ cSampleManager::Initialise(void) return false; } } - + */ // Find path of MP3s (originally in CD-Rom) // if NO_CDCHECK is NOT defined but AUDIO_CACHE is defined, we still need to find MP3s' path, but will exit after the first file #ifndef NO_CDCHECK @@ -1102,7 +1102,7 @@ cSampleManager::Initialise(void) { #endif - for (int32 i = 0; i < STREAMED_SOUND_MISSION_MOBR1; i++) + for (int32 i = 0; i < TOTAL_STREAMED_SOUNDS; i++) { strcpy(filepath, m_MP3FilesPath); strcat(filepath, StreamedNameTable[i]); @@ -1143,7 +1143,7 @@ cSampleManager::Initialise(void) #endif if ( !bFileNotFound ) { - +/* #ifdef AUDIO_CACHE if ( CreateCache ) #endif @@ -1169,7 +1169,7 @@ cSampleManager::Initialise(void) bFileNotFound = true; break; } - } + }*/ } m_bInitialised = !bFileNotFound; @@ -2046,7 +2046,7 @@ cSampleManager::PreloadStreamedFile(uint32 nFile, uint8 nStream) char filepath[MAX_PATH]; - strcpy(filepath, nFile < STREAMED_SOUND_MISSION_COMPLETED4 ? m_MP3FilesPath : (nFile < STREAMED_SOUND_MISSION_MOBR1 ? m_MiscomPath : m_WavFilesPath)); + strcpy(filepath, m_MP3FilesPath); strcat(filepath, StreamedNameTable[nFile]); mp3Stream[nStream] = AIL_open_stream(DIG, filepath, 0); diff --git a/src/audio/sampman_oal.cpp b/src/audio/sampman_oal.cpp index ce6458e6..ef070825 100644 --- a/src/audio/sampman_oal.cpp +++ b/src/audio/sampman_oal.cpp @@ -396,7 +396,7 @@ set_new_provider(int index) static bool IsThisTrackAt16KHz(uint32 track) { - return track == STREAMED_SOUND_RADIO_KCHAT || track == STREAMED_SOUND_RADIO_VCPR || track == STREAMED_SOUND_RADIO_POLICE; + return false;// track == STREAMED_SOUND_RADIO_KCHAT || track == STREAMED_SOUND_RADIO_VCPR || track == STREAMED_SOUND_RADIO_POLICE; } cSampleManager::cSampleManager(void) diff --git a/src/collision/TempColModels.cpp b/src/collision/TempColModels.cpp index f8b26450..55058bde 100644 --- a/src/collision/TempColModels.cpp +++ b/src/collision/TempColModels.cpp @@ -10,7 +10,7 @@ CColModel CTempColModels::ms_colModelWheel1; CColModel CTempColModels::ms_colModelPanel1; CColModel CTempColModels::ms_colModelBodyPart2; CColModel CTempColModels::ms_colModelBodyPart1; -CColModel CTempColModels::ms_colModelCutObj[5]; +CColModel CTempColModels::ms_colModelCutObj[10]; CColModel CTempColModels::ms_colModelPedGroundHit; CColModel CTempColModels::ms_colModelBoot1; CColModel CTempColModels::ms_colModelDoor1; diff --git a/src/collision/TempColModels.h b/src/collision/TempColModels.h index 0c936d6f..457315b6 100644 --- a/src/collision/TempColModels.h +++ b/src/collision/TempColModels.h @@ -13,7 +13,7 @@ public: static CColModel ms_colModelPanel1; static CColModel ms_colModelBodyPart2; static CColModel ms_colModelBodyPart1; - static CColModel ms_colModelCutObj[5]; + static CColModel ms_colModelCutObj[10]; static CColModel ms_colModelPedGroundHit; static CColModel ms_colModelBoot1; static CColModel ms_colModelDoor1; diff --git a/src/control/Script3.cpp b/src/control/Script3.cpp index c2c7d044..c0c5ea64 100644 --- a/src/control/Script3.cpp +++ b/src/control/Script3.cpp @@ -1969,7 +1969,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) return 0; } case COMMAND_START_CUTSCENE: - CCutsceneMgr::ms_cutsceneLoadStatus = 1; + CCutsceneMgr::StartCutscene(); return 0; case COMMAND_GET_CUTSCENE_TIME: ScriptParams[0] = CCutsceneMgr::GetCutsceneTimeInMilleseconds(); diff --git a/src/control/Script5.cpp b/src/control/Script5.cpp index eb1530c4..e562dfbf 100644 --- a/src/control/Script5.cpp +++ b/src/control/Script5.cpp @@ -2754,30 +2754,16 @@ void CTheScripts::ReadObjectNamesFromScript() void CTheScripts::UpdateObjectIndices() { - char name[USED_OBJECT_NAME_LENGTH]; char error[112]; for (int i = 1; i < NumberOfUsedObjects; i++) { - bool found = false; - for (int j = 0; j < MODELINFOSIZE && !found; j++) { - CBaseModelInfo* pModel = CModelInfo::GetModelInfo(j); - if (!pModel) - continue; - strcpy(name, pModel->GetModelName()); -#ifdef FIX_BUGS - for (int k = 0; k < USED_OBJECT_NAME_LENGTH && name[k]; k++) -#else - for (int k = 0; k < USED_OBJECT_NAME_LENGTH; k++) -#endif - name[k] = toupper(name[k]); - if (strcmp(name, UsedObjectArray[i].name) == 0) { - found = true; - UsedObjectArray[i].index = j; - } - } - if (!found) { + UsedObjectArray[i].index = -1; + CModelInfo::GetModelInfo(UsedObjectArray[i].name, &UsedObjectArray[i].index); +#ifndef FINAL + if (UsedObjectArray[i].index == -1) { sprintf(error, "CTheScripts::UpdateObjectIndices - Couldn't find %s", UsedObjectArray[i].name); debug("%s\n", error); } +#endif } } diff --git a/src/control/Script7.cpp b/src/control/Script7.cpp index 220a7c4d..b3f16106 100644 --- a/src/control/Script7.cpp +++ b/src/control/Script7.cpp @@ -1018,7 +1018,7 @@ int8 CRunningScript::ProcessCommands1300To1399(int32 command) return 0; case COMMAND_REMOVE_EVERYTHING_FOR_HUGE_CUTSCENE: { - CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver(); + //CCutsceneMgr::RemoveEverythingFromTheWorldForTheBiggestFuckoffCutsceneEver(); return 0; } case COMMAND_IS_PLAYER_TOUCHING_VEHICLE: diff --git a/src/control/Script8.cpp b/src/control/Script8.cpp index cf5f1327..bf2a1a05 100644 --- a/src/control/Script8.cpp +++ b/src/control/Script8.cpp @@ -77,7 +77,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) case COMMAND_PLAY_ANNOUNCEMENT: { CollectParameters(&m_nIp, 1); - DMAudio.PlayRadioAnnouncement(ScriptParams[0] + STREAMED_SOUND_ANNOUNCE_BRIDGE_CLOSED); + //DMAudio.PlayRadioAnnouncement(ScriptParams[0] + STREAMED_SOUND_ANNOUNCE_BRIDGE_CLOSED); return 0; } case COMMAND_SET_PLAYER_IS_IN_STADIUM: diff --git a/src/core/Game.h b/src/core/Game.h index 69d71700..dd14278a 100644 --- a/src/core/Game.h +++ b/src/core/Game.h @@ -80,4 +80,4 @@ public: static void ProcessTidyUpMemory(void); }; -inline bool IsAreaVisible(int area) { return area == CGame::currArea || area == AREA_EVERYWHERE; } +inline bool IsAreaVisible(int area) { return true; } diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp index 4fff2367..4198dd84 100644 --- a/src/core/Streaming.cpp +++ b/src/core/Streaming.cpp @@ -37,6 +37,7 @@ #include "Font.h" #include "Frontend.h" #include "VarConsole.h" +#include "KeyGen.h" //--MIAMI: file done (possibly bugs) @@ -948,53 +949,45 @@ CStreaming::RequestIslands(eLevelName level) } } -static char *IGnames[] = { - "player", - "player2", - "player3", - "player4", - "player5", - "player6", - "player7", - "player8", - "player9", - "play10", - "play11", - "igken", - "igcandy", - "igsonny", - "igbuddy", - "igjezz", - "ighlary", - "igphil", - "igmerc", - "igdick", - "igdiaz", +const char *csPlayerNames[] = +{ + "csplr", + "csplr2", + "csplr3", + "csplr4", + "csplr5", + "csplr6", + "csplr7", + "csplr8", + "csplr9", + "csplr10", + "csplr11", + "csplr12", + "csplr13", + "csplr14", + "csplr15", + "csplr16", "" }; -static char *CSnames[] = { - "csplay", - "csplay2", - "csplay3", - "csplay4", - "csplay5", - "csplay6", - "csplay7", - "csplay8", - "csplay9", - "csplay10", - "csplay11", - "csken", - "cscandy", - "cssonny", - "csbuddy", - "csjezz", - "cshlary", - "csphil", - "csmerc", - "csdick", - "csdiaz", +const char* playerNames[] = +{ + "plr", + "plr2", + "plr3", + "plr4", + "plr5", + "plr6", + "plr7", + "plr8", + "plr9", + "plr10", + "plr11", + "plr12", + "plr13", + "plr14", + "plr15", + "plr16", "" }; @@ -1008,15 +1001,17 @@ CStreaming::RequestSpecialModel(int32 modelId, const char *modelName, int32 flag int i, n; mi = CModelInfo::GetModelInfo(modelId); - if(strncasecmp("CSPlay", modelName, 6) == 0){ - char *curname = CModelInfo::GetModelInfo(MI_PLAYER)->GetModelName(); - for(int i = 0; CSnames[i][0]; i++){ - if(strcasecmp(curname, IGnames[i]) == 0){ - modelName = CSnames[i]; + if (CKeyGen::GetUppercaseKey(modelName) == CKeyGen::GetUppercaseKey("cstoni_a")) { + i = 0; + while (csPlayerNames[i][0] != '\0') { + if (CModelInfo::GetModelInfo(0)->GetNameHashKey() == CKeyGen::GetUppercaseKey(playerNames[i])) { + modelName = csPlayerNames[i]; break; } + i++; } } + if(!CGeneral::faststrcmp(mi->GetModelName(), modelName)){ // Already have the correct name, just request it RequestModel(modelId, flags); diff --git a/src/core/common.h b/src/core/common.h index ed95f6d3..9500e26f 100644 --- a/src/core/common.h +++ b/src/core/common.h @@ -93,6 +93,7 @@ typedef ptrdiff_t ssize_t; #include "config.h" #include "memoryManager.h" +#include "relocatableChunk.h" #include #include diff --git a/src/core/config.h b/src/core/config.h index b93ccc82..b6d03be6 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -366,7 +366,7 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually // Audio #define AUDIO_CACHE // cache sound lengths to speed up the cold boot -//#define PS2_AUDIO_PATHS // changes audio paths for cutscenes and radio to PS2 paths (needs vbdec on MSS builds) +#define PS2_AUDIO_PATHS // changes audio paths for cutscenes and radio to PS2 paths (needs vbdec on MSS builds) //#define AUDIO_OAL_USE_SNDFILE // use libsndfile to decode WAVs instead of our internal decoder #define AUDIO_OAL_USE_MPG123 // use mpg123 to support mp3 files diff --git a/src/core/main.cpp b/src/core/main.cpp index 03a7fcc2..57c6a1a0 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -82,6 +82,10 @@ char gString2[512]; wchar gUString[256]; wchar gUString2[256]; +// leeds +bool gMakeResources = true; +bool gUseChunkFiles = false; + float FramesPerSecond = 30.0f; bool gbPrintShite = false; diff --git a/src/core/main.h b/src/core/main.h index 37a82fb2..19dd57ba 100644 --- a/src/core/main.h +++ b/src/core/main.h @@ -24,6 +24,10 @@ extern bool gbShowTimebars; extern bool gbPrintMemoryUsage; #endif +// leeds +extern bool gMakeResources; +extern bool gUseChunkFiles; + class CSprite2d; bool DoRWStuffStartOfFrame(int16 TopRed, int16 TopGreen, int16 TopBlue, int16 BottomRed, int16 BottomGreen, int16 BottomBlue, int16 Alpha); diff --git a/src/fakerw/fake.cpp b/src/fakerw/fake.cpp index 863407b9..7f89c233 100644 --- a/src/fakerw/fake.cpp +++ b/src/fakerw/fake.cpp @@ -394,7 +394,7 @@ RwStream *RwStreamOpen(RwStreamType type, RwStreamAccessType accessType, const v return nil; } } -RwBool RwStreamClose(RwStream * stream, void *pData) { stream->close(); rwFree(stream); return true; } +RwBool RwStreamClose(RwStream * stream, void *pData) { if (!stream) return false; stream->close(); rwFree(stream); return true; } RwUInt32 RwStreamRead(RwStream * stream, void *buffer, RwUInt32 length) { return stream->read8(buffer, length); } RwStream *RwStreamWrite(RwStream * stream, const void *buffer, RwUInt32 length) { stream->write8(buffer, length); return stream; } RwStream *RwStreamSkip(RwStream * stream, RwUInt32 offset) { stream->seek(offset); return stream; } diff --git a/src/modelinfo/BaseModelInfo.cpp b/src/modelinfo/BaseModelInfo.cpp index f05be242..d92e4941 100644 --- a/src/modelinfo/BaseModelInfo.cpp +++ b/src/modelinfo/BaseModelInfo.cpp @@ -1,10 +1,12 @@ #include "common.h" #include "templates.h" +#include "main.h" #include "TxdStore.h" #include "2dEffect.h" #include "BaseModelInfo.h" #include "ModelInfo.h" +#include "KeyGen.h" //--MIAMI: file done @@ -18,6 +20,7 @@ CBaseModelInfo::CBaseModelInfo(ModelInfoType type) m_type = type; m_num2dEffects = 0; m_bOwnsColModel = false; + m_name = new char[MAX_MODEL_NAME]; } void @@ -101,3 +104,12 @@ CBaseModelInfo::Get2dEffect(int n) else return nil; } + + +void +CBaseModelInfo::SetModelName(const char *name) +{ + m_nameKey = CKeyGen::GetUppercaseKey(name); + if (!gUseChunkFiles) + strcpy(m_name, name); +} \ No newline at end of file diff --git a/src/modelinfo/BaseModelInfo.h b/src/modelinfo/BaseModelInfo.h index a4906fc9..b76736c0 100644 --- a/src/modelinfo/BaseModelInfo.h +++ b/src/modelinfo/BaseModelInfo.h @@ -23,7 +23,9 @@ class C2dEffect; class CBaseModelInfo { protected: - char m_name[MAX_MODEL_NAME]; + char *m_name; + uint32 m_nameKey; + RwObject *m_object; uint8 m_type; uint8 m_num2dEffects; bool m_bOwnsColModel; @@ -35,7 +37,11 @@ protected: public: CBaseModelInfo(ModelInfoType type); +#ifdef FIX_BUGS + virtual ~CBaseModelInfo() { delete []m_name; } +#else virtual ~CBaseModelInfo() {} +#endif virtual void Shutdown(void); virtual void DeleteRwObject(void) = 0; virtual RwObject *CreateInstance(RwMatrix *) = 0; @@ -51,7 +57,8 @@ public: bool IsSimple(void) { return m_type == MITYPE_SIMPLE || m_type == MITYPE_TIME || m_type == MITYPE_WEAPON; } bool IsClump(void) { return m_type == MITYPE_CLUMP || m_type == MITYPE_PED || m_type == MITYPE_VEHICLE; } char *GetModelName(void) { return m_name; } - void SetModelName(const char *name) { strncpy(m_name, name, MAX_MODEL_NAME); } + void SetModelName(const char *name); + uint32 GetNameHashKey() { return m_nameKey; } void SetColModel(CColModel *col, bool owns = false){ m_colModel = col; m_bOwnsColModel = owns; } CColModel *GetColModel(void) { return m_colModel; } diff --git a/src/modelinfo/ModelInfo.cpp b/src/modelinfo/ModelInfo.cpp index 0a542cf6..02df1be6 100644 --- a/src/modelinfo/ModelInfo.cpp +++ b/src/modelinfo/ModelInfo.cpp @@ -4,6 +4,7 @@ #include "TempColModels.h" #include "ModelIndices.h" #include "ModelInfo.h" +#include "KeyGen.h" // --MIAMI: file done @@ -186,10 +187,11 @@ CModelInfo::AddVehicleModel(int id) CBaseModelInfo* CModelInfo::GetModelInfo(const char *name, int *id) { + uint32 hashKey = CKeyGen::GetUppercaseKey(name); CBaseModelInfo *modelinfo; for(int i = 0; i < MODELINFOSIZE; i++){ modelinfo = CModelInfo::ms_modelInfoPtrs[i]; - if(modelinfo && !CGeneral::faststricmp(modelinfo->GetModelName(), name)){ + if(modelinfo && hashKey == modelinfo->GetNameHashKey()){ if(id) *id = i; return modelinfo; @@ -201,13 +203,14 @@ CModelInfo::GetModelInfo(const char *name, int *id) CBaseModelInfo* CModelInfo::GetModelInfo(const char *name, int minIndex, int maxIndex) { + uint32 hashKey = CKeyGen::GetUppercaseKey(name); if (minIndex > maxIndex) return 0; CBaseModelInfo *modelinfo; for(int i = minIndex; i <= maxIndex; i++){ modelinfo = CModelInfo::ms_modelInfoPtrs[i]; - if(modelinfo && !CGeneral::faststricmp(modelinfo->GetModelName(), name)) + if(modelinfo && hashKey == modelinfo->GetNameHashKey()) return modelinfo; } return nil; diff --git a/src/objects/CutsceneObject.cpp b/src/objects/CutsceneObject.cpp index 8d1be357..01fb038f 100644 --- a/src/objects/CutsceneObject.cpp +++ b/src/objects/CutsceneObject.cpp @@ -53,12 +53,15 @@ CCutsceneObject::SetModelIndex(uint32 id) void CCutsceneObject::CreateShadow(void) { + // empty in LCS + /* if ( IsPedModel(GetModelIndex()) ) { m_pShadow = new CCutsceneShadow(); if (!m_pShadow->IsInitialized()) m_pShadow->Create(m_rwObject, 6, true, 4, true); } + */ } void @@ -150,9 +153,9 @@ CCutsceneObject::PreRender(void) void CCutsceneObject::Render(void) { - RwRenderStateSet(rwRENDERSTATECULLMODE, (void *)rwCULLMODECULLNONE); + SetCullMode(rwCULLMODECULLNONE); CObject::Render(); - RwRenderStateSet(rwRENDERSTATECULLMODE, (void *)rwCULLMODECULLBACK); + SetCullMode(rwCULLMODECULLBACK); } bool diff --git a/src/render/Hud.cpp b/src/render/Hud.cpp index 1c870fd2..0b7be564 100644 --- a/src/render/Hud.cpp +++ b/src/render/Hud.cpp @@ -81,7 +81,7 @@ bool CHud::m_HideRadar; int32 CHud::m_ClockState; // These aren't really in CHud -float CHud::BigMessageInUse[6]; +float BigMessageInUse[6]; float CHud::BigMessageAlpha[6]; float CHud::BigMessageX[6]; float CHud::OddJob2OffTimer; diff --git a/src/render/Hud.h b/src/render/Hud.h index a4b9609a..354f2438 100644 --- a/src/render/Hud.h +++ b/src/render/Hud.h @@ -47,6 +47,8 @@ enum eSprites NUM_HUD_SPRITES = 69, }; +extern float BigMessageInUse[6]; + class CHud { public: @@ -82,7 +84,6 @@ public: static int32 m_ClockState; // These aren't really in CHud - static float BigMessageInUse[6]; static float BigMessageAlpha[6]; static float BigMessageX[6]; static float OddJob2OffTimer; diff --git a/src/text/Messages.cpp b/src/text/Messages.cpp index db0865ae..440746c0 100644 --- a/src/text/Messages.cpp +++ b/src/text/Messages.cpp @@ -815,3 +815,12 @@ CMessages::ClearAllMessagesDisplayedByGame() CHud::GetRidOfAllHudMessages(); CUserDisplay::Pager.ClearMessages(); } + +void +CMessages::ClearThisBigPrintNow(uint32 id) +{ + if (BIGMessages[id].m_Stack[0].m_pText) + ClearThisBigPrint(BIGMessages[id].m_Stack[0].m_pText); + CHud::m_BigMessage[id][0] = '\0'; + BigMessageInUse[id] = 0.0f; +} \ No newline at end of file diff --git a/src/text/Messages.h b/src/text/Messages.h index e8ba1bf7..602a4a08 100644 --- a/src/text/Messages.h +++ b/src/text/Messages.h @@ -61,6 +61,7 @@ public: static void ClearThisPrint(wchar *str); static void ClearThisBigPrint(wchar *str); static void ClearAllMessagesDisplayedByGame(void); + static void ClearThisBigPrintNow(uint32 id); // unused or cut //static void AddMessageSoonWithString(wchar*, uint32, uint16, wchar*); From e2095bf70bec9abf8528cffbf8c3c802f4bc0898 Mon Sep 17 00:00:00 2001 From: Fire-Head Date: Mon, 11 Jan 2021 21:10:24 +0300 Subject: [PATCH 52/68] fix explosion jet --- src/render/Particle.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/render/Particle.cpp b/src/render/Particle.cpp index 0ad4681d..51249844 100644 --- a/src/render/Particle.cpp +++ b/src/render/Particle.cpp @@ -2331,9 +2331,9 @@ void CParticle::AddJetExplosion(CVector const &vecPos, float fPower, float fSize vecStepPos, CVector ( - CGeneral::GetRandomNumberInRange(-0.2f, 0.2f), - CGeneral::GetRandomNumberInRange(-0.2f, 0.2f), - CGeneral::GetRandomNumberInRange(-0.2f, 0.0f) + CGeneral::GetRandomNumberInRange(-0.02f, 0.02f), + CGeneral::GetRandomNumberInRange(-0.02f, 0.02f), + CGeneral::GetRandomNumberInRange(-0.02f, 0.0f) ), nil, fSize, color, 0, 0, 0, 0); From 383142bcbeb39d7407bd88571c8a51823e9c6d71 Mon Sep 17 00:00:00 2001 From: aap Date: Mon, 11 Jan 2021 20:20:08 +0100 Subject: [PATCH 53/68] some useless code --- src/core/Clock.cpp | 9 +++++++++ src/core/Clock.h | 3 +++ src/core/main.cpp | 4 ++-- src/extras/custompipes_d3d9.cpp | 3 +-- src/extras/custompipes_gl.cpp | 3 +-- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/core/Clock.cpp b/src/core/Clock.cpp index b391e508..b0f0b34f 100644 --- a/src/core/Clock.cpp +++ b/src/core/Clock.cpp @@ -20,6 +20,7 @@ uint16 CClock::ms_Stored_nGameClockSeconds; uint32 CClock::ms_nMillisecondsPerGameMinute; uint32 CClock::ms_nLastClockTick; bool CClock::ms_bClockHasBeenStored; +float CClock::ms_EnvMapTimeMultiplicator; #ifndef MASTER bool gbFreezeTime; @@ -35,6 +36,7 @@ CClock::Initialise(uint32 scale) ms_nMillisecondsPerGameMinute = scale; ms_nLastClockTick = CTimer::GetTimeInMilliseconds(); ms_bClockHasBeenStored = false; + ms_EnvMapTimeMultiplicator = 1.0f; debug("CClock ready\n"); #ifndef MASTER VarConsole.Add("Time (hour of day)", &ms_nGameClockHours, 1, 0, 23, true); @@ -136,3 +138,10 @@ CClock::RestoreClock(void) ms_nGameClockMinutes = ms_Stored_nGameClockMinutes; ms_nGameClockSeconds = ms_Stored_nGameClockSeconds; } + +void +CClock::CalcEnvMapTimeMultiplicator(void) +{ + float nightness = Abs(ms_nGameClockHours/24.0f - 0.5f); + ms_EnvMapTimeMultiplicator = SQR(1.0f - nightness);; +} diff --git a/src/core/Clock.h b/src/core/Clock.h index a611cd50..808e61f4 100644 --- a/src/core/Clock.h +++ b/src/core/Clock.h @@ -12,6 +12,7 @@ public: static uint32 ms_nMillisecondsPerGameMinute; static uint32 ms_nLastClockTick; static bool ms_bClockHasBeenStored; + static float ms_EnvMapTimeMultiplicator; static void Initialise(uint32 scale); static void Update(void); @@ -21,6 +22,8 @@ public: static void StoreClock(void); static void RestoreClock(void); + static void CalcEnvMapTimeMultiplicator(void); + static uint8 GetHours(void) { return ms_nGameClockHours; } static uint8 GetMinutes(void) { return ms_nGameClockMinutes; } static int16 GetSeconds(void) { return ms_nGameClockSeconds; } diff --git a/src/core/main.cpp b/src/core/main.cpp index 03a7fcc2..8685e42d 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -1143,10 +1143,10 @@ MattRenderScene(void) /// CWorld::AdvanceCurrentScanCode(); // CMattRenderer::ResetRenderStates /// CRenderer::ClearForFrame(); // before ConstructRenderList - // CClock::CalcEnvMapTimeMultiplicator + CClock::CalcEnvMapTimeMultiplicator(); RwRenderStateSet(rwRENDERSTATECULLMODE, (void*)rwCULLMODECULLNONE); CWaterLevel::RenderWater(); // actually CMattRenderer::RenderWater - // CClock::ms_EnvMapTimeMultiplicator = 1.0f; + CClock::ms_EnvMapTimeMultiplicator = 1.0f; // cWorldStream::ClearDynamics /// CRenderer::ConstructRenderList(); // before PreRender if(gbRenderWorld0) diff --git a/src/extras/custompipes_d3d9.cpp b/src/extras/custompipes_d3d9.cpp index 2ea2ede0..5217462c 100644 --- a/src/extras/custompipes_d3d9.cpp +++ b/src/extras/custompipes_d3d9.cpp @@ -128,8 +128,7 @@ leedsVehicleRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) float coef = 0.0f; if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP) - coef = RpMatFXMaterialGetEnvMapCoefficient(m); - coef *= 0.5f; + coef = CClock::ms_EnvMapTimeMultiplicator * RpMatFXMaterialGetEnvMapCoefficient(m)*0.5f; if(bChromeCheat && coef > 0.0f) coef = 1.0f; d3ddevice->SetPixelShaderConstantF(PSLOC_shininess, (float*)&coef, 1); diff --git a/src/extras/custompipes_gl.cpp b/src/extras/custompipes_gl.cpp index 19e37ac1..10c7fac3 100644 --- a/src/extras/custompipes_gl.cpp +++ b/src/extras/custompipes_gl.cpp @@ -135,8 +135,7 @@ leedsVehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) float coef = 0.0f; if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP) - coef = RpMatFXMaterialGetEnvMapCoefficient(m); - coef *= 0.5f; + coef = CClock::ms_EnvMapTimeMultiplicator * RpMatFXMaterialGetEnvMapCoefficient(m)*0.5f; if(bChromeCheat && coef > 0.0f) coef = 1.0f; glUniform1f(U(u_fxparams), coef); From 0f0812618acd6d5c87bd218bfb6f0b099135e64e Mon Sep 17 00:00:00 2001 From: majestic Date: Mon, 11 Jan 2021 11:23:56 -0800 Subject: [PATCH 54/68] unused CFerryDoor --- src/vehicles/Door.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++ src/vehicles/Door.h | 19 +++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/src/vehicles/Door.cpp b/src/vehicles/Door.cpp index c80965aa..72a30339 100644 --- a/src/vehicles/Door.cpp +++ b/src/vehicles/Door.cpp @@ -168,3 +168,58 @@ CTrainDoor::IsClosed(void) { return m_fPosn == RetTranslationWhenClosed(); } + +bool +CFerryDoor::IsInUse(void) +{ + float translationDifference = m_fPrevPosn - m_fPosn; + m_fPrevPosn = m_fPosn; + return Abs(translationDifference) > 0.002f; +} + +float +CFerryDoor::RetTranslationWhenClosed(void) +{ + if(Abs(m_fClosedPosn) < Abs(m_fOpenPosn)) + return m_fClosedPosn; + else + return m_fOpenPosn; +} + +bool +CFerryDoor::IsClosed(void) +{ + return m_fPosn == RetTranslationWhenClosed(); +} + +float +CFerryDoor::RetTranslationWhenOpen(void) +{ + if(Abs(m_fClosedPosn) < Abs(m_fOpenPosn)) + return m_fOpenPosn; + else + return m_fClosedPosn; +} + +bool +CFerryDoor::IsFullyOpen(void) +{ + if(Abs(m_fPosn) < Abs(RetTranslationWhenOpen()) - 0.5f) + return false; + return true; +} + +void +CFerryDoor::Open(float ratio) +{ + float open; + + m_fPrevPosn = m_fPosn; + open = RetTranslationWhenOpen(); + if(ratio < 1.0f){ + m_fPosn = open*ratio; + }else{ + m_nDoorState = DOORST_OPEN; + m_fPosn = open; + } +} \ No newline at end of file diff --git a/src/vehicles/Door.h b/src/vehicles/Door.h index 567d3263..da5a3de0 100644 --- a/src/vehicles/Door.h +++ b/src/vehicles/Door.h @@ -67,3 +67,22 @@ public: float RetTranslationWhenOpen(void); void Open(float ratio); }; + + +class CFerryDoor { +private: + float m_fClosedPosn; + float m_fOpenPosn; + int8 m_nDirn; + int8 m_nAxis; + int8 m_nDoorState; + float m_fPosn; + float m_fPrevPosn; +public: + bool IsInUse(void); + float RetTranslationWhenClosed(void); + float RetTranslationWhenOpen(void); + bool IsClosed(void); + bool IsFullyOpen(void); + void Open(float ratio); +}; \ No newline at end of file From 091b40cb39b32c6368225c619c2674119f4f3cc7 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Tue, 12 Jan 2021 00:42:11 +0300 Subject: [PATCH 55/68] script3.cpp --- src/control/Script.cpp | 3 -- src/control/Script3.cpp | 67 +++++++++++++++++++++++------------------ src/core/config.h | 2 +- 3 files changed, 38 insertions(+), 34 deletions(-) diff --git a/src/control/Script.cpp b/src/control/Script.cpp index eeb4140f..038eff6d 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -4873,9 +4873,6 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) pObj->SetOrientation(0.0f, 0.0f, 0.0f); pObj->GetMatrix().UpdateRW(); pObj->UpdateRwFrame(); - CBaseModelInfo* pModelInfo = CModelInfo::GetModelInfo(mi); - if (pModelInfo->IsBuilding() && ((CSimpleModelInfo*)pModelInfo)->m_isBigBuilding) - pObj->SetupBigBuilding(); CTheScripts::ClearSpaceForMissionEntity(pos, pObj); CWorld::Add(pObj); SET_INTEGER_PARAM(0, CPools::GetObjectPool()->GetIndex(pObj)); diff --git a/src/control/Script3.cpp b/src/control/Script3.cpp index bdb2ca85..87ecb8e0 100644 --- a/src/control/Script3.cpp +++ b/src/control/Script3.cpp @@ -6,6 +6,7 @@ #include "Boat.h" #include "CarCtrl.h" #include "Clock.h" +#include "ColStore.h" #include "Coronas.h" #include "Cranes.h" #include "CutsceneMgr.h" @@ -1224,7 +1225,6 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) return 0; } - /* case COMMAND_IS_TAXI: { CollectParameters(&m_nIp, 1); @@ -1233,10 +1233,12 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) UpdateCompareFlag(pVehicle->IsTaxi()); return 0; } - */ case COMMAND_UNLOAD_SPECIAL_CHARACTER: CollectParameters(&m_nIp, 1); - CStreaming::SetMissionDoesntRequireSpecialChar(GET_INTEGER_PARAM(0) - 1); + if (m_bIsMissionScript) + CStreaming::SetMissionDoesntRequireSpecialChar(GET_INTEGER_PARAM(0) - 1); + //else + // CStreaming::SetAmbientMissionDoesntRequireSpecialChar(GET_INTEGER_PARAM(0) - 1); // TODO return 0; case COMMAND_RESET_NUM_OF_MODELS_KILLED_BY_PLAYER: CDarkel::ResetModelsKilledByPlayer(); @@ -1287,15 +1289,15 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) CTheScripts::MissionCleanUp.AddEntityToList(GET_INTEGER_PARAM(0), CLEANUP_OBJECT); return 0; } - /* case COMMAND_IS_BOAT: { CollectParameters(&m_nIp, 1); CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pVehicle); - UpdateCompareFlag(pVehicle->m_vehType == VEHICLE_TYPE_BOAT); + UpdateCompareFlag(pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_BOAT); return 0; } + /* case COMMAND_SET_CHAR_OBJ_GOTO_AREA_ANY_MEANS: { CollectParameters(&m_nIp, 5); @@ -1322,7 +1324,6 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) pPed->SetObjective(OBJECTIVE_GOTO_AREA_ANY_MEANS, pos, radius); return 0; } - */ #ifdef GTA_SCRIPT_COLLECTIVE case COMMAND_SET_COLL_OBJ_GOTO_AREA_ANY_MEANS: { @@ -1348,6 +1349,7 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) return 0; } #endif +*/ case COMMAND_IS_PLAYER_STOPPED: { CollectParameters(&m_nIp, 1); @@ -1356,7 +1358,6 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) return 0; } - /* case COMMAND_IS_CHAR_STOPPED: { CollectParameters(&m_nIp, 1); @@ -1364,7 +1365,6 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) UpdateCompareFlag(CTheScripts::IsPedStopped(pPed)); return 0; } - */ case COMMAND_MESSAGE_WAIT: CollectParameters(&m_nIp, 2); m_nWakeTime = CTimer::GetTimeInMilliseconds() + GET_INTEGER_PARAM(0); @@ -1386,8 +1386,10 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) CollectParameters(&m_nIp, 1); if (GET_INTEGER_PARAM(0) != 0) TheCamera.SetWideScreenOn(); - else + else { + // TODO: unknown field TheCamera.SetWideScreenOff(); + } return 0; /* case COMMAND_ADD_SPRITE_BLIP_FOR_CAR: @@ -1447,7 +1449,7 @@ int8 CRunningScript::ProcessCommands600To699(int32 command) if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); CRadar::GetActualBlipArrayIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - int id = CRadar::SetCoordBlip(BLIP_COORD, pos, 5, BLIP_DISPLAY_BOTH); + int id = CRadar::SetCoordBlip(BLIP_COORD, pos, 4, BLIP_DISPLAY_BOTH); CRadar::SetBlipSprite(id, GET_INTEGER_PARAM(3)); SET_INTEGER_PARAM(0, id); StoreParameters(&m_nIp, 1); @@ -1558,7 +1560,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - CPathNode* pNode = &ThePaths.m_pathNodes[ThePaths.FindNodeClosestToCoors(pos, 1, 999999.9f, true)]; + CPathNode* pNode = &ThePaths.m_pathNodes[ThePaths.FindNodeClosestToCoors(pos, 1, 800.0f, true)]; SET_VECTOR_PARAM(0, pNode->GetPosition()); StoreParameters(&m_nIp, 3); return 0; @@ -1569,7 +1571,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - SET_VECTOR_PARAM(0, ThePaths.FindNodeCoorsForScript(ThePaths.FindNodeClosestToCoors(pos, 0, 999999.9f, true, true))); + SET_VECTOR_PARAM(0, ThePaths.FindNodeCoorsForScript(ThePaths.FindNodeClosestToCoors(pos, 0, 800.0f, true, true))); StoreParameters(&m_nIp, 3); return 0; } @@ -1582,6 +1584,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); pos.z += pVehicle->GetDistanceFromCentreOfMassToBaseOfModel(); + uint8 nOldMission = pVehicle->AutoPilot.m_nCarMission; if (CCarCtrl::JoinCarWithRoadSystemGotoCoors(pVehicle, pos, false)) pVehicle->AutoPilot.m_nCarMission = MISSION_GOTO_COORDS_STRAIGHT_ACCURATE; else @@ -1589,7 +1592,8 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) pVehicle->SetStatus(STATUS_PHYSICS); pVehicle->bEngineOn = true; pVehicle->AutoPilot.m_nCruiseSpeed = Max(1, pVehicle->AutoPilot.m_nCruiseSpeed); - pVehicle->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds(); + if (nOldMission != pVehicle->AutoPilot.m_nCarMission) + pVehicle->AutoPilot.m_nAntiReverseTimer = CTimer::GetTimeInMilliseconds(); return 0; } /* @@ -1820,9 +1824,9 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) continue; if (pPed->bFadeOut) continue; -// if (pPed->GetModelIndex() == MI_SCUM_WOM || pPed->GetModelIndex() == MI_SCUM_MAN) -// continue; - if (!ThisIsAValidRandomPed(pPed->m_nPedType, GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7))) // TODO + if (pPed->m_nWaitState != WAITSTATE_FALSE) + continue; + if (!ThisIsAValidRandomPed(pPed->m_nPedType, GET_INTEGER_PARAM(5), GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7))) continue; if (pPed->bIsLeader || pPed->m_leader) continue; @@ -1929,7 +1933,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; CPickups::GetActualPickupIndex(CollectNextParameterWithoutIncreasingPC(m_nIp)); - SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_MONEY, PICKUP_MONEY, GET_INTEGER_PARAM(3))); + SET_INTEGER_PARAM(0, CPickups::GenerateNewOne(pos, MI_MONEY, PICKUP_MONEY, GET_INTEGER_PARAM(3))); // MI_MONEY -> gpModelIndices[...] StoreParameters(&m_nIp, 1); return 0; } @@ -1938,7 +1942,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CollectParameters(&m_nIp, 2); CPed* pPed = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(0)); script_assert(pPed); - pPed->m_wepAccuracy = GET_INTEGER_PARAM(1); + pPed->m_wepAccuracy = GET_INTEGER_PARAM(1) * 1.25f; return 0; } case COMMAND_GET_CAR_SPEED: @@ -1954,7 +1958,9 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) { char name[KEY_LENGTH_IN_SCRIPT]; strncpy(name, (const char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); + // unknown call FUN_29df68(name) on PS2 m_nIp += KEY_LENGTH_IN_SCRIPT; + CColStore::RemoveAllCollision(); CCutsceneMgr::LoadCutsceneData(name); return 0; } @@ -1985,9 +1991,16 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) StoreParameters(&m_nIp, 1); return 0; case COMMAND_HAS_CUTSCENE_FINISHED: - UpdateCompareFlag(CCutsceneMgr::HasCutsceneFinished()); + { + bool bFinished = CCutsceneMgr::HasCutsceneFinished(); + if (bFinished) + printf("cutscene has now finished\n"); + UpdateCompareFlag(bFinished); return 0; + } case COMMAND_CLEAR_CUTSCENE: + // unknown call on PS2 FUN_29DFA0(); + printf("clear cutscene\n"); CCutsceneMgr::DeleteCutsceneData(); return 0; case COMMAND_RESTORE_CAMERA_JUMPCUT: @@ -1999,7 +2012,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CVector pos = GET_VECTOR_PARAM(0); if (pos.z <= MAP_Z_LOW_LIMIT) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; - CPickups::GenerateNewOne(pos, MI_COLLECTABLE1, PICKUP_COLLECTABLE1, 0); + CPickups::GenerateNewOne(pos, MI_COLLECTABLE1, PICKUP_COLLECTABLE1, 0); // TODO: gpModelIndices return 0; } case COMMAND_SET_COLLECTABLE1_TOTAL: @@ -2093,7 +2106,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) strncpy(name, (const char*)&CTheScripts::ScriptSpace[m_nIp], KEY_LENGTH_IN_SCRIPT); for (int i = 0; i < KEY_LENGTH_IN_SCRIPT; i++) name[i] = tolower(name[i]); - CStreaming::RequestSpecialModel(GET_INTEGER_PARAM(0), name, STREAMFLAGS_DEPENDENCY | STREAMFLAGS_SCRIPTOWNED); + CStreaming::RequestSpecialModel(GET_INTEGER_PARAM(0), name, STREAMFLAGS_DEPENDENCY | (m_bIsMissionScript ? STREAMFLAGS_SCRIPTOWNED : STREAMFLAGS_AMBIENT_SCRIPT_OWNED)); m_nIp += KEY_LENGTH_IN_SCRIPT; return 0; } @@ -2152,7 +2165,6 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) GET_FLOAT_PARAM(0), GET_FLOAT_PARAM(1)); return 0; } - /* case COMMAND_PRINT_WITH_2_NUMBERS: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); @@ -2160,7 +2172,6 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CMessages::AddMessageWithNumber(text, GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), -1, -1, -1, -1); return 0; } - */ case COMMAND_PRINT_WITH_2_NUMBERS_NOW: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); @@ -2168,7 +2179,6 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CMessages::AddMessageJumpQWithNumber(text, GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), -1, -1, -1, -1); return 0; } - /* case COMMAND_PRINT_WITH_2_NUMBERS_SOON: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); @@ -2176,7 +2186,6 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CMessages::AddMessageSoonWithNumber(text, GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), -1, -1, -1, -1); return 0; } - */ case COMMAND_PRINT_WITH_3_NUMBERS: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); @@ -2184,7 +2193,6 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CMessages::AddMessageWithNumber(text, GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), -1, -1, -1); return 0; } - /* case COMMAND_PRINT_WITH_3_NUMBERS_NOW: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); @@ -2192,6 +2200,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CMessages::AddMessageJumpQWithNumber(text, GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), -1, -1, -1); return 0; } + /* case COMMAND_PRINT_WITH_3_NUMBERS_SOON: { wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); @@ -2266,6 +2275,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CMessages::AddMessageSoonWithNumber(text, GET_INTEGER_PARAM(6), GET_INTEGER_PARAM(7), GET_INTEGER_PARAM(0), GET_INTEGER_PARAM(1), GET_INTEGER_PARAM(2), GET_INTEGER_PARAM(3), GET_INTEGER_PARAM(4), GET_INTEGER_PARAM(5)); return 0; } + */ case COMMAND_SET_CHAR_OBJ_FOLLOW_CHAR_IN_FORMATION: { CollectParameters(&m_nIp, 3); @@ -2277,7 +2287,6 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) pPed->SetFormation((eFormation)GET_INTEGER_PARAM(2)); return 0; } - */ case COMMAND_PLAYER_MADE_PROGRESS: CollectParameters(&m_nIp, 1); CStats::ProgressMade += GET_INTEGER_PARAM(0); @@ -2285,8 +2294,6 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) case COMMAND_SET_PROGRESS_TOTAL: CollectParameters(&m_nIp, 1); CStats::TotalProgressInGame = GET_INTEGER_PARAM(0); - if (CGame::germanGame) - CStats::TotalProgressInGame -= 2; return 0; case COMMAND_REGISTER_JUMP_DISTANCE: CollectParameters(&m_nIp, 1); @@ -2405,7 +2412,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CPed* pLeader = CPools::GetPedPool()->GetAt(GET_INTEGER_PARAM(1)); script_assert(pPed); script_assert(pLeader); - UpdateCompareFlag(pPed->m_leader == pLeader); + UpdateCompareFlag(pPed->m_leader == pLeader && !pPed->bWaitForLeaderToComeCloser); return 0; } default: diff --git a/src/core/config.h b/src/core/config.h index facbaacd..ee2183bd 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -136,7 +136,7 @@ enum Config { NUM_GARAGE_STORED_CARS = 4, - NUM_CRANES = 8, + NUM_CRANES = 11, NUM_ESCALATORS = 22, NUM_WATER_CREATURES = 8, From 42e4e7c063cf1af9ed910f5e4435c07c61259e58 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Tue, 12 Jan 2021 00:43:26 +0300 Subject: [PATCH 56/68] fix --- src/control/Script3.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Script3.cpp b/src/control/Script3.cpp index 67d6fdda..aba06d03 100644 --- a/src/control/Script3.cpp +++ b/src/control/Script3.cpp @@ -2400,7 +2400,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) CPed* pLeader = CPools::GetPedPool()->GetAt(ScriptParams[1]); script_assert(pPed); script_assert(pLeader); - UpdateCompareFlag(pPed->m_leader == pLeader); + UpdateCompareFlag(pPed->m_leader == pLeader && !pPed->bWaitForLeaderToComeCloser); return 0; } default: From 132a710a0a05f64126b1015dc711bcdb5938f22e Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Mon, 11 Jan 2021 23:50:56 +0200 Subject: [PATCH 57/68] Case sensitive my ass --- src/animation/CutsceneMgr_overlay.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/animation/CutsceneMgr_overlay.cpp b/src/animation/CutsceneMgr_overlay.cpp index 4693f243..b1ca684c 100644 --- a/src/animation/CutsceneMgr_overlay.cpp +++ b/src/animation/CutsceneMgr_overlay.cpp @@ -26,10 +26,11 @@ #include "Messages.h" #include "Population.h" #include "CarCtrl.h" -#include "TimeCycle.h" +#include "Timecycle.h" #include "Rubbish.h" #include "Text.h" #include "Hud.h" +#include "crossplatform.h" const struct { const char *szTrackName; From 2ce6e59d9b69ce2abf9b34cd5e22582077810161 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Mon, 11 Jan 2021 23:55:45 +0200 Subject: [PATCH 58/68] PLAY_ANNOUNCEMENT --- src/control/Script8.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/Script8.cpp b/src/control/Script8.cpp index bf2a1a05..2f52b150 100644 --- a/src/control/Script8.cpp +++ b/src/control/Script8.cpp @@ -77,7 +77,7 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command) case COMMAND_PLAY_ANNOUNCEMENT: { CollectParameters(&m_nIp, 1); - //DMAudio.PlayRadioAnnouncement(ScriptParams[0] + STREAMED_SOUND_ANNOUNCE_BRIDGE_CLOSED); + DMAudio.PlayRadioAnnouncement(ScriptParams[0] + STREAMED_SOUND_NEWS_A); return 0; } case COMMAND_SET_PLAYER_IS_IN_STADIUM: From 3e6eea25b3067bb02d6be8398817cd85dbc8de35 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Tue, 12 Jan 2021 01:53:48 +0200 Subject: [PATCH 59/68] More fix --- src/animation/CutsceneMgr.cpp | 1 + src/animation/CutsceneMgr_overlay.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/animation/CutsceneMgr.cpp b/src/animation/CutsceneMgr.cpp index 583cf9d5..bbbd9aa3 100644 --- a/src/animation/CutsceneMgr.cpp +++ b/src/animation/CutsceneMgr.cpp @@ -22,6 +22,7 @@ #include "ColStore.h" #include "Radar.h" #include "Pools.h" +#include "crossplatform.h" //--MIAMI: file done diff --git a/src/animation/CutsceneMgr_overlay.cpp b/src/animation/CutsceneMgr_overlay.cpp index b1ca684c..5fcb752d 100644 --- a/src/animation/CutsceneMgr_overlay.cpp +++ b/src/animation/CutsceneMgr_overlay.cpp @@ -420,7 +420,7 @@ CCutsceneMgr::LoadCutsceneData_loading() for (int i = 0; i < ms_numLoadObjectNames; i++) { if (!ms_bRepeatObject[i]) cutsceneObject = CreateCutsceneObject(ms_iModelIndex[i]); - if (ms_cLoadAnimName[i] != '\0') + if (ms_cLoadAnimName[i][0] != '\0') SetCutsceneAnim(ms_cLoadAnimName[i], cutsceneObject); } @@ -475,7 +475,7 @@ CCutsceneMgr::LoadCutsceneData_postload(bool b) RwStreamClose(stream, nil); int file = CFileMgr::OpenFile("ANIM\\CUTS.IMG", "rb"); - sprintf(gString, "%s.DAT", &ms_cutsceneName); + sprintf(gString, "%s.DAT", ms_cutsceneName); if (file) { if (ms_pCutsceneDir->FindItem(gString, offset, size)) { From dcb4eedeb0ad694c57d42cc593eeb4c84dd998ba Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Tue, 12 Jan 2021 02:25:51 +0200 Subject: [PATCH 60/68] Fix collective commands --- src/control/Script5.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/control/Script5.cpp b/src/control/Script5.cpp index eb1530c4..c0909356 100644 --- a/src/control/Script5.cpp +++ b/src/control/Script5.cpp @@ -2531,7 +2531,7 @@ int CTheScripts::FindFreeSlotInCollectiveArray() void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective, int16 p1, int16 p2) { for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { - if (CollectiveArray[i].colIndex = colIndex) { + if (CollectiveArray[i].colIndex == colIndex) { CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); if (pPed == nil) { CollectiveArray[i].colIndex = -1; @@ -2548,7 +2548,7 @@ void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective ob void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective, CVector p1, float p2) { for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { - if (CollectiveArray[i].colIndex = colIndex) { + if (CollectiveArray[i].colIndex == colIndex) { CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); if (pPed == nil) { CollectiveArray[i].colIndex = -1; @@ -2565,7 +2565,7 @@ void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective ob void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective, CVector p1) { for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { - if (CollectiveArray[i].colIndex = colIndex) { + if (CollectiveArray[i].colIndex == colIndex) { CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); if (pPed == nil) { CollectiveArray[i].colIndex = -1; @@ -2582,7 +2582,7 @@ void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective ob void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective, void* p1) { for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { - if (CollectiveArray[i].colIndex = colIndex) { + if (CollectiveArray[i].colIndex == colIndex) { CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); if (pPed == nil) { CollectiveArray[i].colIndex = -1; @@ -2599,7 +2599,7 @@ void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective ob void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective) { for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { - if (CollectiveArray[i].colIndex = colIndex) { + if (CollectiveArray[i].colIndex == colIndex) { CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); if (pPed == nil) { CollectiveArray[i].colIndex = -1; From 7e888a6379247d1c0be055eb27626c9bb53590d2 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Tue, 12 Jan 2021 02:25:51 +0200 Subject: [PATCH 61/68] Fix collective commands --- src/control/Script5.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/control/Script5.cpp b/src/control/Script5.cpp index f970cf89..b03ff49d 100644 --- a/src/control/Script5.cpp +++ b/src/control/Script5.cpp @@ -2531,7 +2531,7 @@ int CTheScripts::FindFreeSlotInCollectiveArray() void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective, int16 p1, int16 p2) { for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { - if (CollectiveArray[i].colIndex = colIndex) { + if (CollectiveArray[i].colIndex == colIndex) { CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); if (pPed == nil) { CollectiveArray[i].colIndex = -1; @@ -2548,7 +2548,7 @@ void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective ob void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective, CVector p1, float p2) { for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { - if (CollectiveArray[i].colIndex = colIndex) { + if (CollectiveArray[i].colIndex == colIndex) { CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); if (pPed == nil) { CollectiveArray[i].colIndex = -1; @@ -2565,7 +2565,7 @@ void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective ob void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective, CVector p1) { for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { - if (CollectiveArray[i].colIndex = colIndex) { + if (CollectiveArray[i].colIndex == colIndex) { CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); if (pPed == nil) { CollectiveArray[i].colIndex = -1; @@ -2582,7 +2582,7 @@ void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective ob void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective, void* p1) { for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { - if (CollectiveArray[i].colIndex = colIndex) { + if (CollectiveArray[i].colIndex == colIndex) { CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); if (pPed == nil) { CollectiveArray[i].colIndex = -1; @@ -2599,7 +2599,7 @@ void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective ob void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective objective) { for (int i = 0; i < MAX_NUM_COLLECTIVES; i++) { - if (CollectiveArray[i].colIndex = colIndex) { + if (CollectiveArray[i].colIndex == colIndex) { CPed* pPed = CPools::GetPedPool()->GetAt(CollectiveArray[i].pedIndex); if (pPed == nil) { CollectiveArray[i].colIndex = -1; From 2736c3a9d1a7eed20ac3f7efe0ee89acfd495085 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Tue, 12 Jan 2021 12:16:52 +0300 Subject: [PATCH 62/68] fix --- src/control/CarCtrl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control/CarCtrl.cpp b/src/control/CarCtrl.cpp index 056c7713..f171485f 100644 --- a/src/control/CarCtrl.cpp +++ b/src/control/CarCtrl.cpp @@ -175,7 +175,7 @@ CCarCtrl::GenerateOneRandomCar() } float frontX, frontY; float preferredDistance, angleLimit; - float requestMultiplier; + float requestMultiplier = 1.0f; bool invertAngleLimitTest; CVector spawnPosition; int32 curNodeId, nextNodeId; From 75367e714adf33dd5d0e046f86917ef8994c6c54 Mon Sep 17 00:00:00 2001 From: withmorten Date: Sun, 10 Jan 2021 20:31:26 +0100 Subject: [PATCH 63/68] premake: add startrpoject; add lto option; fix copying of binary to gamedir; update premake5.exe # Conflicts: # premake5.lua --- premake5.exe | Bin 1362432 -> 1395712 bytes premake5.lua | 13 +++++++++++-- premake5Linux | Bin 2035312 -> 2035312 bytes 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/premake5.exe b/premake5.exe index 9048d51e09da5bde02e6337dcfaa603a2cebf292..a8483721467dc3d67ca25ac14a6ff811c0bb92c7 100644 GIT binary patch delta 391910 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

F#2Air4$ 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

OWaSgITvh_fzdwAFjCa70RMetD`rW{P6 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

#-o@s%?^8mK_5F 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 delta 366598 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

Fr|>3K1X+A_{opmqaCG-ORS|28)^2dE{Q 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 z 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 y0F)9YhKqp?|>( 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 diff --git a/premake5.lua b/premake5.lua index 9796b8a9..e62ad6be 100644 --- a/premake5.lua +++ b/premake5.lua @@ -34,6 +34,11 @@ newoption { description = "Build with opus" } +newoption { + trigger = "lto", + description = "Use link time optimization" +} + if(_OPTIONS["with-librw"]) then Librw = "vendor/librw" else @@ -61,6 +66,7 @@ end workspace "reVC" language "C++" configurations { "Debug", "Release" } + startproject "reVC" location "build" symbols "Full" staticruntime "off" @@ -109,7 +115,10 @@ workspace "reVC" filter "configurations:Release" defines { "NDEBUG" } - optimize "On" + optimize "Speed" + if(_OPTIONS["lto"]) then + flags { "LinkTimeOptimization" } + end filter { "platforms:win*" } system "windows" @@ -167,7 +176,7 @@ workspace "reVC" scriptspath = scriptspath or "" if (gamepath) then postbuildcommands { - '{COPY} "%{cfg.buildtarget.abspath}" "' .. gamepath .. scriptspath .. '%{cfg.buildtarget.name}"' + '{COPYFILE} "%{cfg.buildtarget.abspath}" "' .. gamepath .. scriptspath .. '%{cfg.buildtarget.name}"' } debugdir (gamepath) if (exepath) then diff --git a/premake5Linux b/premake5Linux index 2fd412dae93e9f171478c06fd50a66ba3e09f2ee..1ca751679b30a4fcc547ae41d928965520c4223f 100755 GIT binary patch delta 226351 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Ξ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 z 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 delta 225048 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 z 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%0D0v;lt8wfEy3@XtZ{1uYPM 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 Date: Tue, 12 Jan 2021 12:42:29 +0100 Subject: [PATCH 64/68] colmodel fix --- src/collision/ColModel.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/collision/ColModel.cpp b/src/collision/ColModel.cpp index d2e01f50..49847dbd 100644 --- a/src/collision/ColModel.cpp +++ b/src/collision/ColModel.cpp @@ -24,7 +24,6 @@ CColModel::CColModel(void) CColModel::~CColModel(void) { RemoveCollisionVolumes(); - RemoveTrianglePlanes(); } void* From 9b2037419f96c6627cb5f2a6f9d127ef1dcdb9df Mon Sep 17 00:00:00 2001 From: aap Date: Tue, 12 Jan 2021 13:41:22 +0100 Subject: [PATCH 65/68] mobile vehicle rendering --- src/core/Cam.cpp | 4 + src/core/re3.cpp | 16 +-- src/extras/custompipes.cpp | 4 +- src/extras/custompipes.h | 7 +- src/extras/custompipes_d3d9.cpp | 113 +++++++++++++-- src/extras/custompipes_gl.cpp | 117 ++++++++++++++-- src/extras/shaders/Makefile | 13 +- src/extras/shaders/leedsVehicle_mobile.frag | 76 ++++++++++ src/extras/shaders/leedsVehicle_mobile.vert | 42 ++++++ src/extras/shaders/leedsVehicle_mobile_PS.cso | Bin 0 -> 728 bytes .../shaders/leedsVehicle_mobile_PS.hlsl | 54 +++++++ src/extras/shaders/leedsVehicle_mobile_PS.inc | 63 +++++++++ src/extras/shaders/leedsVehicle_mobile_VS.cso | Bin 0 -> 1556 bytes .../shaders/leedsVehicle_mobile_VS.hlsl | 60 ++++++++ src/extras/shaders/leedsVehicle_mobile_VS.inc | 132 ++++++++++++++++++ .../shaders/leedsVehicle_mobile_fs_gl.inc | 78 +++++++++++ .../shaders/leedsVehicle_mobile_vs_gl.inc | 44 ++++++ src/render/Renderer.cpp | 3 +- 18 files changed, 789 insertions(+), 37 deletions(-) create mode 100644 src/extras/shaders/leedsVehicle_mobile.frag create mode 100644 src/extras/shaders/leedsVehicle_mobile.vert create mode 100644 src/extras/shaders/leedsVehicle_mobile_PS.cso create mode 100644 src/extras/shaders/leedsVehicle_mobile_PS.hlsl create mode 100644 src/extras/shaders/leedsVehicle_mobile_PS.inc create mode 100644 src/extras/shaders/leedsVehicle_mobile_VS.cso create mode 100644 src/extras/shaders/leedsVehicle_mobile_VS.hlsl create mode 100644 src/extras/shaders/leedsVehicle_mobile_VS.inc create mode 100644 src/extras/shaders/leedsVehicle_mobile_fs_gl.inc create mode 100644 src/extras/shaders/leedsVehicle_mobile_vs_gl.inc diff --git a/src/core/Cam.cpp b/src/core/Cam.cpp index 731537ef..581e219a 100644 --- a/src/core/Cam.cpp +++ b/src/core/Cam.cpp @@ -123,6 +123,7 @@ CCam::Process(void) else TargetOrientation = CGeneral::GetATanOfXY(CamTargetEntity->GetForward().x, CamTargetEntity->GetForward().y); +/* LCS: removed CVector Fwd(0.0f, 0.0f, 0.0f); Fwd.x = CamTargetEntity->GetForward().x; Fwd.y = CamTargetEntity->GetForward().y; @@ -140,6 +141,9 @@ CCam::Process(void) else TargetSpeedVar = -Min(Sqrt(SQR(FwdSpeedX) + SQR(FwdSpeedY))/1.8f, 0.5f); SpeedVar = 0.895f*SpeedVar + 0.105*TargetSpeedVar; +*/ + SpeedVar = 0.0f; + TargetSpeedVar = 0.0f; }else{ if(CamTargetEntity == FindPlayerPed()){ // Some fancy smoothing of player position and speed diff --git a/src/core/re3.cpp b/src/core/re3.cpp index 4bc3bc30..b7f8c8b2 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -665,21 +665,21 @@ extern bool gbRenderWorld2; e = DebugMenuAddVar("Render", "World Rendering", &CustomPipes::WorldPipeSwitch, nil, 1, CustomPipes::WORLDPIPE_PS2, CustomPipes::WORLDPIPE_MOBILE, worldpipenames); DebugMenuEntrySetWrap(e, true); - static const char *vehpipenames[] = { "MatFX", "Neo" }; + static const char *vehpipenames[] = { "PS2", "Mobile", "Neo" }; e = DebugMenuAddVar("Render", "Vehicle Pipeline", &CustomPipes::VehiclePipeSwitch, nil, - 1, CustomPipes::VEHICLEPIPE_MATFX, CustomPipes::VEHICLEPIPE_NEO, vehpipenames); + 1, CustomPipes::VEHICLEPIPE_PS2, CustomPipes::VEHICLEPIPE_MOBILE, vehpipenames); DebugMenuEntrySetWrap(e, true); DebugMenuAddVarBool8("Render", "Chrome cheat", &CustomPipes::bChromeCheat, nil); extern bool gbRenderDebugEnvMap; DebugMenuAddVarBool8("Render", "Show Env map", &gbRenderDebugEnvMap, nil); - DebugMenuAddVar("Render", "Neo Vehicle Shininess", &CustomPipes::VehicleShininess, nil, 0.1f, 0, 1.0f); - DebugMenuAddVar("Render", "Neo Vehicle Specularity", &CustomPipes::VehicleSpecularity, nil, 0.1f, 0, 1.0f); +// DebugMenuAddVar("Render", "Neo Vehicle Shininess", &CustomPipes::VehicleShininess, nil, 0.1f, 0, 1.0f); +// DebugMenuAddVar("Render", "Neo Vehicle Specularity", &CustomPipes::VehicleSpecularity, nil, 0.1f, 0, 1.0f); DebugMenuAddVarBool8("Render", "Neo Ped Rim light enable", &CustomPipes::RimlightEnable, nil); DebugMenuAddVar("Render", "Mult", &CustomPipes::RimlightMult, nil, 0.1f, 0, 1.0f); - DebugMenuAddVarBool8("Render", "Neo World Lightmaps enable", &CustomPipes::LightmapEnable, nil); - DebugMenuAddVar("Render", "Mult", &CustomPipes::LightmapMult, nil, 0.1f, 0, 1.0f); - DebugMenuAddVarBool8("Render", "Neo Road Gloss enable", &CustomPipes::GlossEnable, nil); - DebugMenuAddVar("Render", "Mult", &CustomPipes::GlossMult, nil, 0.1f, 0, 1.0f); +// DebugMenuAddVarBool8("Render", "Neo World Lightmaps enable", &CustomPipes::LightmapEnable, nil); +// DebugMenuAddVar("Render", "Mult", &CustomPipes::LightmapMult, nil, 0.1f, 0, 1.0f); +// DebugMenuAddVarBool8("Render", "Neo Road Gloss enable", &CustomPipes::GlossEnable, nil); +// DebugMenuAddVar("Render", "Mult", &CustomPipes::GlossMult, nil, 0.1f, 0, 1.0f); #endif DebugMenuAddVarBool8("Render", "Show Ped Paths", &gbShowPedPaths, nil); DebugMenuAddVarBool8("Render", "Show Car Paths", &gbShowCarPaths, nil); diff --git a/src/extras/custompipes.cpp b/src/extras/custompipes.cpp index 1d147ed6..a636f8b0 100644 --- a/src/extras/custompipes.cpp +++ b/src/extras/custompipes.cpp @@ -48,7 +48,7 @@ rw::TexDictionary *neoTxd; bool bChromeCheat; bool bRenderingEnvMap; -int32 EnvMapSize = 256; +int32 EnvMapSize = 512; rw::Camera *EnvMapCam; rw::Texture *EnvMapTex; rw::Texture *EnvMaskTex; @@ -342,7 +342,7 @@ ReadTweakValueTable(char *fp, InterpolatedValue &interp) * Neo Vehicle pipe */ -int32 VehiclePipeSwitch = VEHICLEPIPE_MATFX; +int32 VehiclePipeSwitch = VEHICLEPIPE_PS2; float VehicleShininess = 1.0f; float VehicleSpecularity = 1.0f; InterpolatedFloat Fresnel(0.4f); diff --git a/src/extras/custompipes.h b/src/extras/custompipes.h index a80546ef..9674a6d1 100644 --- a/src/extras/custompipes.h +++ b/src/extras/custompipes.h @@ -86,8 +86,11 @@ extern int16 QuadIndices[6]; void EnvMapRender(void); enum { - VEHICLEPIPE_MATFX, - VEHICLEPIPE_NEO + VEHICLEPIPE_PS2, + VEHICLEPIPE_MOBILE, + +// maybe later again... + VEHICLEPIPE_NEO = -1 }; extern int32 VehiclePipeSwitch; extern float VehicleShininess; diff --git a/src/extras/custompipes_d3d9.cpp b/src/extras/custompipes_d3d9.cpp index 5217462c..1dc4c0bb 100644 --- a/src/extras/custompipes_d3d9.cpp +++ b/src/extras/custompipes_d3d9.cpp @@ -40,17 +40,19 @@ enum { VSLOC_reflProps, VSLOC_specLights, - // Leeds building + // Leeds building, Leeds vehicle mobile VSLOC_emissive = rw::d3d::VSLOC_afterLights, VSLOC_ambient, + VSLOC_viewMat, // only vehicle PSLOC_colorscale = 1, - // Leed vehicle + // Leeds vehicle PS2 VSLOC_texMat = rw::d3d::VSLOC_afterLights, PSLOC_shininess = 1, - + PSLOC_skyTop, + PSLOC_skyBot }; /* @@ -58,8 +60,10 @@ enum { */ static void *leedsVehicle_VS; +static void *leedsVehicle_mobile_VS; static void *leedsVehicle_blend_PS; static void *leedsVehicle_add_PS; +static void *leedsVehicle_mobile_PS; static rw::RawMatrix normal2texcoord_flipU = { { -0.5f, 0.0f, 0.0f }, 0.0f, @@ -149,6 +153,77 @@ leedsVehicleRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) SetRenderState(SRCBLEND, BLENDSRCALPHA); } +void +leedsVehicleRenderCB_mobile(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::d3d; + using namespace rw::d3d9; + + int vsBits; + setStreamSource(0, header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); + setIndices(header->indexBuffer); + setVertexDeclaration(header->vertexDeclaration); + + vsBits = lightingCB_Shader(atomic); + uploadMatrices(atomic->getFrame()->getLTM()); + + setVertexShader(leedsVehicle_mobile_VS); + setPixelShader(leedsVehicle_mobile_PS); + + RGBAf amb, emiss; + amb.red = CTimeCycle::GetAmbientRed(); + amb.green = CTimeCycle::GetAmbientGreen(); + amb.blue = CTimeCycle::GetAmbientBlue(); + amb.alpha = 1.0f; + emiss = pAmbient->color; + + d3ddevice->SetVertexShaderConstantF(VSLOC_ambient, (float*)&amb, 1); + d3ddevice->SetVertexShaderConstantF(VSLOC_emissive, (float*)&emiss, 1); + + RGBAf skyTop, skyBot; + skyTop.red = CTimeCycle::GetSkyTopRed()/255.0f; + skyTop.green = CTimeCycle::GetSkyTopGreen()/255.0f; + skyTop.blue = CTimeCycle::GetSkyTopBlue()/255.0f; + skyBot.red = CTimeCycle::GetSkyBottomRed()/255.0f; + skyBot.green = CTimeCycle::GetSkyBottomGreen()/255.0f; + skyBot.blue = CTimeCycle::GetSkyBottomBlue()/255.0f; + + d3ddevice->SetPixelShaderConstantF(PSLOC_skyTop, (float*)&skyTop, 1); + d3ddevice->SetPixelShaderConstantF(PSLOC_skyBot, (float*)&skyBot, 1); + + d3ddevice->SetVertexShaderConstantF(VSLOC_viewMat, (float*)&rw::engine->currentCamera->devView, 4); + + d3d::setTexture(1, EnvMapTex); + + InstanceData *inst = header->inst; + for(rw::uint32 i = 0; i < header->numMeshes; i++){ + Material *m = inst->material; + + SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); + + float coef = 0.0f; + if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP){ + coef = CClock::ms_EnvMapTimeMultiplicator * RpMatFXMaterialGetEnvMapCoefficient(m)*0.5f; + if(bChromeCheat) + coef = 1.0f; + } + d3ddevice->SetPixelShaderConstantF(PSLOC_shininess, (float*)&coef, 1); + + setMaterial(m->color, m->surfaceProps); + + if(m->texture) + d3d::setTexture(0, m->texture); + else + d3d::setTexture(0, gpWhiteTexture); + + drawInst(header, inst); + inst++; + } + + d3d::setTexture(1, nil); +} + static void *neoVehicle_VS; static void *neoVehicle_PS; @@ -189,11 +264,15 @@ vehicleRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) using namespace rw::d3d9; // TODO: make this less of a kludge - if(VehiclePipeSwitch == VEHICLEPIPE_MATFX){ + if(VehiclePipeSwitch == VEHICLEPIPE_PS2){ leedsVehicleRenderCB(atomic, header); // matFXGlobals.pipelines[rw::platform]->render(atomic); return; } + if(VehiclePipeSwitch == VEHICLEPIPE_MOBILE){ + leedsVehicleRenderCB_mobile(atomic, header); + return; + } int vsBits; setStreamSource(0, header->vertexStream[0].vertexBuffer, 0, header->vertexStream[0].stride); @@ -247,15 +326,15 @@ vehicleRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) void CreateVehiclePipe(void) { - if(CFileMgr::LoadFile("neo/carTweakingTable.dat", work_buff, sizeof(work_buff), "r") <= 0) - printf("Error: couldn't open 'neo/carTweakingTable.dat'\n"); - else{ - char *fp = (char*)work_buff; - fp = ReadTweakValueTable(fp, Fresnel); - fp = ReadTweakValueTable(fp, Power); - fp = ReadTweakValueTable(fp, DiffColor); - fp = ReadTweakValueTable(fp, SpecColor); - } +// if(CFileMgr::LoadFile("neo/carTweakingTable.dat", work_buff, sizeof(work_buff), "r") <= 0) +// printf("Error: couldn't open 'neo/carTweakingTable.dat'\n"); +// else{ +// char *fp = (char*)work_buff; +// fp = ReadTweakValueTable(fp, Fresnel); +// fp = ReadTweakValueTable(fp, Power); +// fp = ReadTweakValueTable(fp, DiffColor); +// fp = ReadTweakValueTable(fp, SpecColor); +// } #include "shaders/neoVehicle_VS.inc" neoVehicle_VS = rw::d3d::createVertexShader(neoVehicle_VS_cso); @@ -269,6 +348,10 @@ CreateVehiclePipe(void) leedsVehicle_VS = rw::d3d::createVertexShader(leedsVehicle_VS_cso); assert(leedsVehicle_VS); +#include "shaders/leedsVehicle_mobile_VS.inc" + leedsVehicle_mobile_VS = rw::d3d::createVertexShader(leedsVehicle_mobile_VS_cso); + assert(leedsVehicle_mobile_VS); + #include "shaders/leedsVehicle_blend_PS.inc" leedsVehicle_blend_PS = rw::d3d::createPixelShader(leedsVehicle_blend_PS_cso); assert(leedsVehicle_blend_PS); @@ -277,6 +360,10 @@ CreateVehiclePipe(void) leedsVehicle_add_PS = rw::d3d::createPixelShader(leedsVehicle_add_PS_cso); assert(leedsVehicle_add_PS); +#include "shaders/leedsVehicle_mobile_PS.inc" + leedsVehicle_mobile_PS = rw::d3d::createPixelShader(leedsVehicle_mobile_PS_cso); + assert(leedsVehicle_mobile_PS); + rw::d3d9::ObjPipeline *pipe = rw::d3d9::ObjPipeline::create(); pipe->instanceCB = rw::d3d9::defaultInstanceCB; diff --git a/src/extras/custompipes_gl.cpp b/src/extras/custompipes_gl.cpp index 10c7fac3..35a30316 100644 --- a/src/extras/custompipes_gl.cpp +++ b/src/extras/custompipes_gl.cpp @@ -42,6 +42,9 @@ static int32 u_colorscale; static int32 u_texMatrix; static int32 u_fxparams; +static int32 u_skyTop; +static int32 u_skyBot; + #define U(i) currentShader->uniformLocations[i] /* @@ -50,6 +53,7 @@ static int32 u_fxparams; rw::gl3::Shader *leedsVehicleShader_add; rw::gl3::Shader *leedsVehicleShader_blend; +rw::gl3::Shader *leedsVehicleShader_mobile; rw::gl3::Shader *neoVehicleShader; @@ -157,6 +161,80 @@ leedsVehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) #endif } +static void +leedsVehicleRenderCB_mobile(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) +{ + using namespace rw; + using namespace rw::gl3; + + Material *m; + + setWorldMatrix(atomic->getFrame()->getLTM()); + lightingCB(atomic); + +#ifdef RW_GL_USE_VAOS + glBindVertexArray(header->vao); +#else + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo); + glBindBuffer(GL_ARRAY_BUFFER, header->vbo); + setAttribPointers(header->attribDesc, header->numAttribs); +#endif + + InstanceData *inst = header->inst; + rw::int32 n = header->numMeshes; + + leedsVehicleShader_mobile->use(); + + RGBAf amb, emiss; + amb.red = CTimeCycle::GetAmbientRed(); + amb.green = CTimeCycle::GetAmbientGreen(); + amb.blue = CTimeCycle::GetAmbientBlue(); + amb.alpha = 1.0f; + emiss = pAmbient->color; + + glUniform4fv(U(u_amb), 1, (float*)&amb); + glUniform4fv(U(u_emiss), 1, (float*)&emiss); + + RGBAf skyTop, skyBot; + skyTop.red = CTimeCycle::GetSkyTopRed()/255.0f; + skyTop.green = CTimeCycle::GetSkyTopGreen()/255.0f; + skyTop.blue = CTimeCycle::GetSkyTopBlue()/255.0f; + skyBot.red = CTimeCycle::GetSkyBottomRed()/255.0f; + skyBot.green = CTimeCycle::GetSkyBottomGreen()/255.0f; + skyBot.blue = CTimeCycle::GetSkyBottomBlue()/255.0f; + + glUniform3fv(U(u_skyTop), 1, (float*)&skyTop); + glUniform3fv(U(u_skyBot), 1, (float*)&skyBot); + + setTexture(1, EnvMapTex); + + while(n--){ + m = inst->material; + + rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); + + float coef = 0.0f; + if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP){ + coef = CClock::ms_EnvMapTimeMultiplicator * RpMatFXMaterialGetEnvMapCoefficient(m)*0.5f; + if(bChromeCheat) + coef = 1.0f; + } + glUniform1f(U(u_fxparams), coef); + + setMaterial(m->color, m->surfaceProps); + + setTexture(0, m->texture); + + drawInst(header, inst); + inst++; + } + + setTexture(1, nil); + +#ifndef RW_GL_USE_VAOS + disableAttribPointers(header->attribDesc, header->numAttribs); +#endif +} static void uploadSpecLights(void) @@ -197,11 +275,15 @@ vehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) using namespace rw::gl3; // TODO: make this less of a kludge - if(VehiclePipeSwitch == VEHICLEPIPE_MATFX){ + if(VehiclePipeSwitch == VEHICLEPIPE_PS2){ leedsVehicleRenderCB(atomic, header); // matFXGlobals.pipelines[rw::platform]->render(atomic); return; } + if(VehiclePipeSwitch == VEHICLEPIPE_MOBILE){ + leedsVehicleRenderCB_mobile(atomic, header); + return; + } Material *m; @@ -266,15 +348,15 @@ CreateVehiclePipe(void) using namespace rw; using namespace rw::gl3; - if(CFileMgr::LoadFile("neo/carTweakingTable.dat", work_buff, sizeof(work_buff), "r") <= 0) - printf("Error: couldn't open 'neo/carTweakingTable.dat'\n"); - else{ - char *fp = (char*)work_buff; - fp = ReadTweakValueTable(fp, Fresnel); - fp = ReadTweakValueTable(fp, Power); - fp = ReadTweakValueTable(fp, DiffColor); - fp = ReadTweakValueTable(fp, SpecColor); - } +// if(CFileMgr::LoadFile("neo/carTweakingTable.dat", work_buff, sizeof(work_buff), "r") <= 0) +// printf("Error: couldn't open 'neo/carTweakingTable.dat'\n"); +// else{ +// char *fp = (char*)work_buff; +// fp = ReadTweakValueTable(fp, Fresnel); +// fp = ReadTweakValueTable(fp, Power); +// fp = ReadTweakValueTable(fp, DiffColor); +// fp = ReadTweakValueTable(fp, SpecColor); +// } { @@ -299,6 +381,15 @@ CreateVehiclePipe(void) assert(leedsVehicleShader_blend); } + { +#include "shaders/leedsVehicle_mobile_fs_gl.inc" +#include "shaders/leedsVehicle_mobile_vs_gl.inc" + const char *vs[] = { shaderDecl, header_vert_src, leedsVehicle_mobile_vert_src, nil }; + const char *fs[] = { shaderDecl, header_frag_src, leedsVehicle_mobile_frag_src, nil }; + leedsVehicleShader_mobile = Shader::create(vs, fs); + assert(leedsVehicleShader_mobile); + } + rw::gl3::ObjPipeline *pipe = rw::gl3::ObjPipeline::create(); pipe->instanceCB = rw::gl3::defaultInstanceCB; @@ -319,6 +410,9 @@ DestroyVehiclePipe(void) leedsVehicleShader_blend->destroy(); leedsVehicleShader_blend = nil; + leedsVehicleShader_mobile->destroy(); + leedsVehicleShader_mobile = nil; + ((rw::gl3::ObjPipeline*)vehiclePipe)->destroy(); vehiclePipe = nil; } @@ -757,6 +851,9 @@ CustomPipeRegisterGL(void) u_texMatrix = rw::gl3::registerUniform("u_texMatrix"); u_fxparams = rw::gl3::registerUniform("u_fxparams"); + + u_skyTop = rw::gl3::registerUniform("u_skyTop"); + u_skyBot = rw::gl3::registerUniform("u_skyBot"); } diff --git a/src/extras/shaders/Makefile b/src/extras/shaders/Makefile index 87777e74..393ab660 100644 --- a/src/extras/shaders/Makefile +++ b/src/extras/shaders/Makefile @@ -5,7 +5,8 @@ all: im2d_gl.inc simple_fs_gl.inc default_UV2_gl.inc \ neoVehicle_vs_gl.inc neoVehicle_fs_gl.inc \ im2d_UV2_gl.inc screenDroplet_fs_gl.inc \ leedsBuilding_vs_gl.inc leedsBuilding_mobile_vs_gl.inc scale_fs_gl.inc \ - leedsVehicle_vs_gl.inc leedsVehicle_add_gl.inc leedsVehicle_blend_gl.inc + leedsVehicle_vs_gl.inc leedsVehicle_add_gl.inc leedsVehicle_blend_gl.inc \ + leedsVehicle_mobile_vs_gl.inc leedsVehicle_mobile_fs_gl.inc im2d_gl.inc: im2d.vert (echo 'const char *im2d_vert_src =';\ @@ -108,3 +109,13 @@ leedsVehicle_blend_gl.inc: leedsVehicle_blend.frag (echo 'const char *leedsVehicle_blend_frag_src =';\ sed 's/..*/"&\\n"/' leedsVehicle_blend.frag;\ echo ';') >leedsVehicle_blend_gl.inc + +leedsVehicle_mobile_vs_gl.inc: leedsVehicle_mobile.vert + (echo 'const char *leedsVehicle_mobile_vert_src =';\ + sed 's/..*/"&\\n"/' leedsVehicle_mobile.vert;\ + echo ';') >leedsVehicle_mobile_vs_gl.inc + +leedsVehicle_mobile_fs_gl.inc: leedsVehicle_mobile.frag + (echo 'const char *leedsVehicle_mobile_frag_src =';\ + sed 's/..*/"&\\n"/' leedsVehicle_mobile.frag;\ + echo ';') >leedsVehicle_mobile_fs_gl.inc diff --git a/src/extras/shaders/leedsVehicle_mobile.frag b/src/extras/shaders/leedsVehicle_mobile.frag new file mode 100644 index 00000000..467379dd --- /dev/null +++ b/src/extras/shaders/leedsVehicle_mobile.frag @@ -0,0 +1,76 @@ +uniform sampler2D tex0; +uniform sampler2D tex1; + +uniform float u_fxparams; +uniform vec3 u_skyTop; +uniform vec3 u_skyBot; + +#define shininess (u_fxparams) + +// matfx: +// case 1 normal envmap +// custom1 (4.0, 1.0, 1.0, coef) +// custom2 (0.25, 3.0, 1.0, 1.0) +// case 2 too strong +// custom1 (4.0, 1.0, 2.0, coef) +// custom2 (0.5, 3.0, 1.0, 1.0) +// ???: practically no fresnel +// custom1 (4.0, 1.25, 0.01, coef) +// custom2 (1.0, 2.0, 1.1, 2.0) + +#define power (4.0) + +#define preMult (1.0) +#define postMult (1.0) +#define minRefl (0.25) +#define maxRefl (3.0) +#define minOpacity (1.0) +#define maxOpacity (1.0) + +//#define preMult (1.0) +//#define postMult (2.0) +//#define minRefl (0.5) +//#define maxRefl (3.0) +//#define minOpacity (1.0) +//#define maxOpacity (1.0) + +//#define preMult (1.25) +//#define postMult (0.01) +//#define minRefl (1.0) +//#define maxRefl (2.0) +//#define minOpacity (1.1) +//#define maxOpacity (2.0) + +FSIN vec4 v_color; +FSIN vec2 v_tex0; +FSIN vec2 v_tex1; +FSIN float v_fog; +FSIN vec2 v_reflData; + +#define v_NdotV (v_reflData.x) +#define v_lightingCont (v_reflData.y) + +void +main(void) +{ + vec4 pass1 = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y)); + + vec3 envtex = texture(tex1, v_tex1).rgb; // V flipped + vec3 skyColour = mix(u_skyBot, u_skyTop, envtex.g); + vec3 envOut = mix(envtex.rrr, skyColour, envtex.b); + + float fresnel = mix(shininess, shininess * 2.0, v_NdotV); + fresnel = pow(v_NdotV * preMult, power); + fresnel = clamp(fresnel * postMult, 0.0, 1.0); + float reflectivity = v_lightingCont * mix(minRefl, maxRefl, fresnel)*shininess; + + float opacity = mix(minOpacity, maxOpacity, fresnel)*pass1.a; + vec4 color = pass1 + vec4(reflectivity * envOut, 0.0); + color.a = opacity; + + color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog); + + DoAlphaTest(color.a); + + FRAGCOLOR(color); +} diff --git a/src/extras/shaders/leedsVehicle_mobile.vert b/src/extras/shaders/leedsVehicle_mobile.vert new file mode 100644 index 00000000..e18c2f02 --- /dev/null +++ b/src/extras/shaders/leedsVehicle_mobile.vert @@ -0,0 +1,42 @@ +uniform vec4 u_amb; +uniform vec4 u_emiss; + +VSIN(ATTRIB_POS) vec3 in_pos; + +VSOUT vec4 v_color; +VSOUT vec2 v_tex0; +VSOUT vec2 v_tex1; +VSOUT float v_fog; +VSOUT vec2 v_reflData; + +#define v_NdotV (v_reflData.x) +#define v_lightingCont (v_reflData.y) + +void +main(void) +{ + vec4 Vertex = u_world * vec4(in_pos, 1.0); + gl_Position = u_proj * u_view * Vertex; + vec3 Normal = mat3(u_world) * in_normal; + + v_tex0 = in_tex0; + + vec3 ViewNormal = mat3(u_view) * Normal; + v_tex1 = (ViewNormal.xy + vec2(1.0, 1.0))*0.5; + + v_color = in_color; + vec4 combinedAmbient = mix(u_emiss, u_amb, Normal.z); +// v_color.rgb += u_ambLight.rgb*surfAmbient; + v_color.rgb += combinedAmbient.rgb*surfAmbient; + v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse; + v_lightingCont = max(0.5, (v_color.r + v_color.g + v_color.b) / 3.0); +// v_color = clamp(v_color, 0.0, 1.0); + v_color *= u_matColor; + + // for fresnel + vec3 camPos = -u_view[3].xyz * mat3(u_view); + vec3 viewVec = normalize(Vertex.xyz - camPos); + v_NdotV = 1.0 - dot(-Normal.xyz, viewVec.xyz); + + v_fog = DoFog(gl_Position.w); +} diff --git a/src/extras/shaders/leedsVehicle_mobile_PS.cso b/src/extras/shaders/leedsVehicle_mobile_PS.cso new file mode 100644 index 0000000000000000000000000000000000000000..04ffcf8e8d8ae1bec38489bf0937fad175e3a0c8 GIT binary patch literal 728 zcmZQz`v3pm|3C)k5Jx8&1_lN`Mg|6u7#jlv1BlPS$iTqP$iOg#fq{XUfq{XMfr()b z0|cxAi!m}VGO#ghfe0}i0cnS-y8sn?02YI&gNeNai!n1WGVn2cfT{!8#l*nGz{tP_ z7fZ=ZOAAS@U|?b3VE~x`avn%|YF-&gcs06sT7J57eolT7!|K(m85uz4vw(~RX<2(dX}a}dd7x^h779%85meu82A@3Ff`aRFf{Ckn99Ha z5@!XA8#pj9G}yt!Lv8J=ul z0rM|`^)oT>H!v|gX<+1lr~&C=Vh9DP1Dhknz`(-Hz}~>bunH{3#K6$N%D}+P%)rsW z#K5otgdu#124;r;U<|SgBoE@VGB7M)We8mWQNsb2XJQE5fXrtEs{ti5uwOv_nE)~a mmBZCoK-FdJW2Lm&M62l#+x;KmrAg3}gGB7dxfr{}kf!xf?z{p?* z*DD4V(`H~{SO<5r99WEnfrUW`E|!>^l$n}W!obMD%)rRN0yZ1u>E!&}q|Ch36yL-W z24)6k29PeObquMwnZ?DKWvL8lnMK7VKAGtmApJ}z`qT2$T@p(Y8FE0f#SF>$Ir&8l zt5>f^x2GV#II|=(KaU|LvnVwg%vxQ{$iPs;$iUD8rKdt^RtAvYc^E(;vVf6+Avdwa zIX{OXFTW@^F$d(()vH&7+zP@lx8{}Rx?~oC-B=8=9~4rI3?K;dB?CioX;E50QGP)& zLs@2OImnRm{GuGNx66v-jp7X$d^3}a@{9A+N)$ALG!;C2f_)T%GZIr$ixiyma|<$a zQi~KU^^7d_EKQB{j13J98CC}}FtBnn@GoFsXs~BsU;tqT1_lQQkT^dB|AN)4R@p&p zhmi6hM=>xoFfi~>0I``F7#bL%Y*q$_1|}$*i-DnmnSp--D+2>F0|S2p14HNpMusN~ zSU^b=%zv_gfq`KH1H+RBm>3fSNNg2~7&BPxKUfT$#2EMwfb>AjWe1zf3OAR%fd#A{ z*U@?Tbj124zdJIn%a4;}1GchnWFfu%8)Q0n!zIqxq+F1sR5Ku1fXt!@IxE88U8QO1E(j( z4a^Lo4IB&%EFd{h*a<5*#24F6&2@&ZUL57hrm42%yL85kNt>Ot;i zU|?)uVhC+u0;g+GItKAqH83zRfa3%t4`TB(Ff0JMlZk=p0f-L@TbOM>=fD4?CSfKhDz;VOC!2E!T;mL&m{}~tn->?sH literal 0 HcmV?d00001 diff --git a/src/extras/shaders/leedsVehicle_mobile_VS.hlsl b/src/extras/shaders/leedsVehicle_mobile_VS.hlsl new file mode 100644 index 00000000..667c0963 --- /dev/null +++ b/src/extras/shaders/leedsVehicle_mobile_VS.hlsl @@ -0,0 +1,60 @@ +#include "standardConstants.h" + +float4 emissive : register(c41); +float4 ambient : register(c42); +float4x4 viewMat : register(c43); + +struct VS_in +{ + float4 Position : POSITION; + float3 Normal : NORMAL; + float2 TexCoord : TEXCOORD0; + float4 Prelight : COLOR0; +}; + +struct VS_out { + float4 Position : POSITION; + float3 TexCoord0 : TEXCOORD0; // also fog + float2 TexCoord1 : TEXCOORD1; + float2 ReflData : TEXCOORD2; + float4 Color : COLOR0; +}; + +#define NdotV (output.ReflData.x) +#define lightingCont (output.ReflData.y) + +VS_out main(in VS_in input) +{ + VS_out output; + + output.Position = mul(combinedMat, input.Position); + float3 V = mul(worldMat, input.Position).xyz; + float3 N = mul(normalMat, input.Normal); + + output.TexCoord0.xy = input.TexCoord; + + float4 ViewNormal = mul(viewMat, float4(N, 0.0)); + output.TexCoord1 = (ViewNormal.xy + float2(1.0, 1.0))*0.5; + + output.Color = input.Prelight; + float4 combinedAmbient = lerp(emissive, ambient, N.z); +// output.Color.rgb += ambientLight.rgb * surfAmbient; + output.Color.rgb += combinedAmbient.rgb * surfAmbient; + + int i; + for(i = 0; i < numDirLights; i++) + output.Color.xyz += DoDirLight(lights[i+firstDirLight], N)*surfDiffuse; + lightingCont = max(0.5, (output.Color.r + output.Color.g + output.Color.b) / 3.0); + // PS2 clamps before material color +// output.Color = clamp(output.Color, 0.0, 1.0); + output.Color *= matCol; + + // for fresnel + float3 camPos = mul(-viewMat._m03_m13_m23, (float3x3)(viewMat)); + float3 viewVec = normalize(V.xyz - camPos); + NdotV = 1.0 - dot(-N.xyz, viewVec.xyz); + + output.TexCoord0.z = clamp((output.Position.w - fogEnd)*fogRange, fogDisable, 1.0); + + return output; +} diff --git a/src/extras/shaders/leedsVehicle_mobile_VS.inc b/src/extras/shaders/leedsVehicle_mobile_VS.inc new file mode 100644 index 00000000..aa8859b1 --- /dev/null +++ b/src/extras/shaders/leedsVehicle_mobile_VS.inc @@ -0,0 +1,132 @@ +static unsigned char leedsVehicle_mobile_VS_cso[] = { + 0x00, 0x02, 0xfe, 0xff, 0xfe, 0xff, 0x99, 0x00, 0x43, 0x54, 0x41, 0x42, + 0x1c, 0x00, 0x00, 0x00, 0x2e, 0x02, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xff, + 0x0c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x27, 0x02, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x02, 0x00, 0x2a, 0x00, + 0x01, 0x00, 0xaa, 0x00, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x24, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, + 0x02, 0x00, 0x29, 0x00, 0x01, 0x00, 0xa6, 0x00, 0x14, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x01, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, + 0x01, 0x00, 0x42, 0x00, 0x54, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x64, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x01, 0x00, 0x3a, 0x00, + 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x01, 0x00, 0x00, + 0x02, 0x00, 0x11, 0x00, 0x18, 0x00, 0x46, 0x00, 0xb8, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, + 0x01, 0x00, 0x32, 0x00, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xcf, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x03, 0x00, 0x22, 0x00, + 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x01, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0xfc, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x02, 0x00, 0x0d, 0x00, + 0x01, 0x00, 0x36, 0x00, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x16, 0x02, 0x00, 0x00, 0x02, 0x00, 0x2b, 0x00, 0x04, 0x00, 0xae, 0x00, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x00, + 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x12, 0x00, 0x30, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x61, 0x6d, 0x62, 0x69, 0x65, 0x6e, 0x74, 0x00, + 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, + 0x4d, 0x61, 0x74, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x76, 0x65, 0x00, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4c, 0x69, + 0x67, 0x68, 0x74, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6f, 0x67, 0x44, + 0x61, 0x74, 0x61, 0x00, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x00, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0xab, 0xab, 0xab, 0x01, 0x00, 0x03, 0x00, + 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0xab, 0x73, 0x01, 0x00, 0x00, + 0x7c, 0x01, 0x00, 0x00, 0x8c, 0x01, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00, + 0x95, 0x01, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x03, 0x00, 0xa0, 0x01, 0x00, 0x00, + 0x6d, 0x61, 0x74, 0x43, 0x6f, 0x6c, 0x00, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x4d, 0x61, 0x74, 0x00, 0xab, 0xab, 0xab, 0x03, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6e, 0x75, 0x6d, 0x44, 0x69, 0x72, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x00, 0xab, 0xab, 0xab, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x75, 0x72, 0x66, + 0x50, 0x72, 0x6f, 0x70, 0x73, 0x00, 0x76, 0x69, 0x65, 0x77, 0x4d, 0x61, + 0x74, 0x00, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x00, 0x76, + 0x73, 0x5f, 0x32, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, + 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, + 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, + 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0xab, 0x51, 0x00, 0x00, 0x05, + 0x0b, 0x00, 0x0f, 0xa0, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x51, 0x00, 0x00, 0x05, + 0x0f, 0x00, 0x0f, 0xa0, 0xab, 0xaa, 0xaa, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x05, 0x00, 0x00, 0x80, 0x02, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, + 0x0a, 0x00, 0x00, 0x80, 0x03, 0x00, 0x0f, 0x90, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x55, 0x90, 0x01, 0x00, 0xe4, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, + 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xaa, 0x90, + 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, + 0x03, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0xe4, 0x80, + 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0xe4, 0x80, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x55, 0x90, + 0x05, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, + 0x04, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x06, 0x00, 0xe4, 0xa0, + 0x00, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x07, 0x80, 0x07, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0xff, 0x90, + 0x00, 0x00, 0xe4, 0x80, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x07, 0x80, + 0x2e, 0x00, 0xe4, 0xa0, 0x08, 0x00, 0x00, 0x03, 0x02, 0x00, 0x01, 0x80, + 0x01, 0x00, 0xe4, 0x81, 0x2b, 0x00, 0xe4, 0xa0, 0x08, 0x00, 0x00, 0x03, + 0x02, 0x00, 0x02, 0x80, 0x01, 0x00, 0xe4, 0x81, 0x2c, 0x00, 0xe4, 0xa0, + 0x08, 0x00, 0x00, 0x03, 0x02, 0x00, 0x04, 0x80, 0x01, 0x00, 0xe4, 0x81, + 0x2d, 0x00, 0xe4, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x07, 0x80, + 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0xe4, 0x81, 0x24, 0x00, 0x00, 0x02, + 0x01, 0x00, 0x07, 0x80, 0x00, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x07, 0x80, 0x01, 0x00, 0x55, 0x90, 0x09, 0x00, 0xe4, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x07, 0x80, 0x08, 0x00, 0xe4, 0xa0, + 0x01, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x07, 0x80, 0x0a, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0xaa, 0x90, + 0x00, 0x00, 0xe4, 0x80, 0x08, 0x00, 0x00, 0x03, 0x01, 0x00, 0x01, 0x80, + 0x00, 0x00, 0xe4, 0x81, 0x01, 0x00, 0xe4, 0x80, 0x05, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x06, 0x80, 0x00, 0x00, 0x55, 0x80, 0x2c, 0x00, 0xd0, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x06, 0x80, 0x2b, 0x00, 0xd0, 0xa0, + 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, + 0x01, 0x00, 0x06, 0x80, 0x2d, 0x00, 0xd0, 0xa0, 0x00, 0x00, 0xaa, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x01, 0x00, 0x06, 0x80, + 0x01, 0x00, 0xe4, 0x80, 0x0b, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0x03, + 0x01, 0x00, 0x03, 0xe0, 0x01, 0x00, 0xe9, 0x80, 0x0b, 0x00, 0x55, 0xa0, + 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x07, 0x80, 0x29, 0x00, 0xe4, 0xa0, + 0x02, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0e, 0x80, 0x02, 0x00, 0x90, 0x81, + 0x2a, 0x00, 0x90, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x0e, 0x80, + 0x00, 0x00, 0xaa, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x29, 0x00, 0x90, 0xa0, + 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x0e, 0x80, 0x01, 0x00, 0xe4, 0x80, + 0x0d, 0x00, 0x00, 0xa0, 0x03, 0x00, 0x90, 0x90, 0x01, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x07, 0x80, 0x01, 0x00, 0xf9, 0x80, 0x01, 0x00, 0x00, 0x02, + 0x03, 0x00, 0x01, 0x80, 0x0b, 0x00, 0xaa, 0xa0, 0x26, 0x00, 0x00, 0x01, + 0x00, 0x00, 0xe4, 0xf0, 0x02, 0x00, 0x00, 0x03, 0x03, 0x00, 0x02, 0x80, + 0x03, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x02, 0x80, 0x03, 0x00, 0x55, 0x80, 0x0b, 0x00, 0xff, 0xa0, + 0x2e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0xb0, 0x03, 0x00, 0x55, 0x80, + 0x08, 0x00, 0x00, 0x04, 0x03, 0x00, 0x02, 0x80, 0x00, 0x00, 0xe4, 0x80, + 0x13, 0x20, 0xe4, 0xa1, 0x00, 0x00, 0x00, 0xb0, 0x0b, 0x00, 0x00, 0x03, + 0x03, 0x00, 0x02, 0x80, 0x03, 0x00, 0x55, 0x80, 0x0b, 0x00, 0xaa, 0xa0, + 0x05, 0x00, 0x00, 0x04, 0x03, 0x00, 0x0e, 0x80, 0x03, 0x00, 0x55, 0x80, + 0x11, 0x20, 0x90, 0xa0, 0x00, 0x00, 0x00, 0xb0, 0x04, 0x00, 0x00, 0x04, + 0x02, 0x00, 0x07, 0x80, 0x03, 0x00, 0xf9, 0x80, 0x0d, 0x00, 0xaa, 0xa0, + 0x02, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x03, 0x00, 0x01, 0x80, + 0x03, 0x00, 0x00, 0x80, 0x0b, 0x00, 0x00, 0xa0, 0x27, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x08, 0x80, 0x03, 0x00, 0xff, 0x90, + 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xd0, 0x02, 0x00, 0xe4, 0x80, + 0x0c, 0x00, 0xe4, 0xa0, 0x02, 0x00, 0x00, 0x03, 0x02, 0x00, 0x01, 0xe0, + 0x01, 0x00, 0x00, 0x81, 0x0b, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x01, 0x80, 0x02, 0x00, 0x55, 0x80, 0x02, 0x00, 0x00, 0x80, + 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x02, 0x00, 0xaa, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0xa0, 0x0b, 0x00, 0x00, 0x03, + 0x02, 0x00, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x0b, 0x00, 0x55, 0xa0, + 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0x80, + 0x0e, 0x00, 0x55, 0xa1, 0x05, 0x00, 0x00, 0x03, 0x00, 0x00, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x0e, 0x00, 0xaa, 0xa0, 0x0b, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x0e, 0x00, 0xff, 0xa0, + 0x0a, 0x00, 0x00, 0x03, 0x00, 0x00, 0x04, 0xe0, 0x00, 0x00, 0x00, 0x80, + 0x0b, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xe0, + 0x02, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00 +}; diff --git a/src/extras/shaders/leedsVehicle_mobile_fs_gl.inc b/src/extras/shaders/leedsVehicle_mobile_fs_gl.inc new file mode 100644 index 00000000..8098599c --- /dev/null +++ b/src/extras/shaders/leedsVehicle_mobile_fs_gl.inc @@ -0,0 +1,78 @@ +const char *leedsVehicle_mobile_frag_src = +"uniform sampler2D tex0;\n" +"uniform sampler2D tex1;\n" + +"uniform float u_fxparams;\n" +"uniform vec3 u_skyTop;\n" +"uniform vec3 u_skyBot;\n" + +"#define shininess (u_fxparams)\n" + +"// matfx:\n" +"// case 1 normal envmap\n" +"// custom1 (4.0, 1.0, 1.0, coef)\n" +"// custom2 (0.25, 3.0, 1.0, 1.0)\n" +"// case 2 too strong\n" +"// custom1 (4.0, 1.0, 2.0, coef)\n" +"// custom2 (0.5, 3.0, 1.0, 1.0)\n" +"// ???: practically no fresnel\n" +"// custom1 (4.0, 1.25, 0.01, coef)\n" +"// custom2 (1.0, 2.0, 1.1, 2.0)\n" + +"#define power (4.0)\n" + +"#define preMult (1.0)\n" +"#define postMult (1.0)\n" +"#define minRefl (0.25)\n" +"#define maxRefl (3.0)\n" +"#define minOpacity (1.0)\n" +"#define maxOpacity (1.0)\n" + +"//#define preMult (1.0)\n" +"//#define postMult (2.0)\n" +"//#define minRefl (0.5)\n" +"//#define maxRefl (3.0)\n" +"//#define minOpacity (1.0)\n" +"//#define maxOpacity (1.0)\n" + +"//#define preMult (1.25)\n" +"//#define postMult (0.01)\n" +"//#define minRefl (1.0)\n" +"//#define maxRefl (2.0)\n" +"//#define minOpacity (1.1)\n" +"//#define maxOpacity (2.0)\n" + +"FSIN vec4 v_color;\n" +"FSIN vec2 v_tex0;\n" +"FSIN vec2 v_tex1;\n" +"FSIN float v_fog;\n" +"FSIN vec2 v_reflData;\n" + +"#define v_NdotV (v_reflData.x)\n" +"#define v_lightingCont (v_reflData.y)\n" + +"void\n" +"main(void)\n" +"{\n" +" vec4 pass1 = v_color*texture(tex0, vec2(v_tex0.x, 1.0-v_tex0.y));\n" + +" vec3 envtex = texture(tex1, v_tex1).rgb; // V flipped\n" +" vec3 skyColour = mix(u_skyBot, u_skyTop, envtex.g);\n" +" vec3 envOut = mix(envtex.rrr, skyColour, envtex.b);\n" + +" float fresnel = mix(shininess, shininess * 2.0, v_NdotV);\n" +" fresnel = pow(v_NdotV * preMult, power);\n" +" fresnel = clamp(fresnel * postMult, 0.0, 1.0);\n" +" float reflectivity = v_lightingCont * mix(minRefl, maxRefl, fresnel)*shininess;\n" + +" float opacity = mix(minOpacity, maxOpacity, fresnel)*pass1.a;\n" +" vec4 color = pass1 + vec4(reflectivity * envOut, 0.0);\n" +" color.a = opacity;\n" + +" color.rgb = mix(u_fogColor.rgb, color.rgb, v_fog);\n" + +" DoAlphaTest(color.a);\n" + +" FRAGCOLOR(color);\n" +"}\n" +; diff --git a/src/extras/shaders/leedsVehicle_mobile_vs_gl.inc b/src/extras/shaders/leedsVehicle_mobile_vs_gl.inc new file mode 100644 index 00000000..b1f07563 --- /dev/null +++ b/src/extras/shaders/leedsVehicle_mobile_vs_gl.inc @@ -0,0 +1,44 @@ +const char *leedsVehicle_mobile_vert_src = +"uniform vec4 u_amb;\n" +"uniform vec4 u_emiss;\n" + +"VSIN(ATTRIB_POS) vec3 in_pos;\n" + +"VSOUT vec4 v_color;\n" +"VSOUT vec2 v_tex0;\n" +"VSOUT vec2 v_tex1;\n" +"VSOUT float v_fog;\n" +"VSOUT vec2 v_reflData;\n" + +"#define v_NdotV (v_reflData.x)\n" +"#define v_lightingCont (v_reflData.y)\n" + +"void\n" +"main(void)\n" +"{\n" +" vec4 Vertex = u_world * vec4(in_pos, 1.0);\n" +" gl_Position = u_proj * u_view * Vertex;\n" +" vec3 Normal = mat3(u_world) * in_normal;\n" + +" v_tex0 = in_tex0;\n" + +" vec3 ViewNormal = mat3(u_view) * Normal;\n" +" v_tex1 = (ViewNormal.xy + vec2(1.0, 1.0))*0.5;\n" + +" v_color = in_color;\n" +" vec4 combinedAmbient = mix(u_emiss, u_amb, Normal.z);\n" +"// v_color.rgb += u_ambLight.rgb*surfAmbient;\n" +" v_color.rgb += combinedAmbient.rgb*surfAmbient;\n" +" v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;\n" +" v_lightingCont = max(0.5, (v_color.r + v_color.g + v_color.b) / 3.0);\n" +"// v_color = clamp(v_color, 0.0, 1.0);\n" +" v_color *= u_matColor;\n" + +" // for fresnel\n" +" vec3 camPos = -u_view[3].xyz * mat3(u_view);\n" +" vec3 viewVec = normalize(Vertex.xyz - camPos);\n" +" v_NdotV = 1.0 - dot(-Normal.xyz, viewVec.xyz);\n" + +" v_fog = DoFog(gl_Position.w);\n" +"}\n" +; diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 9ed556e4..5c65eea5 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -1816,7 +1816,8 @@ CRenderer::GenerateEnvironmentMap(void) RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); // Draw coronas - DrawEnvMapCoronas(TheCamera.GetForward().Heading()); + if(CustomPipes::VehiclePipeSwitch != CustomPipes::VEHICLEPIPE_MOBILE) + DrawEnvMapCoronas(TheCamera.GetForward().Heading()); RwCameraEndUpdate(CustomPipes::EnvMapCam); From 55320a03f14c473b0fff89585713d2ebd8feb92a Mon Sep 17 00:00:00 2001 From: aap Date: Tue, 12 Jan 2021 14:07:24 +0100 Subject: [PATCH 66/68] little cleanup of vehicle rendering --- src/core/re3.cpp | 2 +- src/extras/custompipes.cpp | 2 +- src/extras/custompipes.h | 2 +- src/extras/custompipes_d3d9.cpp | 11 ++++++----- src/extras/custompipes_gl.cpp | 11 ++++++----- src/extras/shaders/leedsVehicle_mobile.vert | 2 -- src/extras/shaders/leedsVehicle_mobile_PS.hlsl | 1 - src/extras/shaders/leedsVehicle_mobile_VS.hlsl | 3 --- src/extras/shaders/leedsVehicle_mobile_vs_gl.inc | 2 -- vendor/librw | 2 +- 10 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/core/re3.cpp b/src/core/re3.cpp index b7f8c8b2..efb6ec3b 100644 --- a/src/core/re3.cpp +++ b/src/core/re3.cpp @@ -669,7 +669,7 @@ extern bool gbRenderWorld2; e = DebugMenuAddVar("Render", "Vehicle Pipeline", &CustomPipes::VehiclePipeSwitch, nil, 1, CustomPipes::VEHICLEPIPE_PS2, CustomPipes::VEHICLEPIPE_MOBILE, vehpipenames); DebugMenuEntrySetWrap(e, true); - DebugMenuAddVarBool8("Render", "Chrome cheat", &CustomPipes::bChromeCheat, nil); + DebugMenuAddVarBool8("Render", "Glass Cars cheat", &CustomPipes::gGlassCarsCheat, nil); extern bool gbRenderDebugEnvMap; DebugMenuAddVarBool8("Render", "Show Env map", &gbRenderDebugEnvMap, nil); // DebugMenuAddVar("Render", "Neo Vehicle Shininess", &CustomPipes::VehicleShininess, nil, 0.1f, 0, 1.0f); diff --git a/src/extras/custompipes.cpp b/src/extras/custompipes.cpp index a636f8b0..247aa4b1 100644 --- a/src/extras/custompipes.cpp +++ b/src/extras/custompipes.cpp @@ -46,7 +46,7 @@ CustomMatCopy(void *dst, void *src, int32, int32) rw::TexDictionary *neoTxd; -bool bChromeCheat; +bool gGlassCarsCheat; bool bRenderingEnvMap; int32 EnvMapSize = 512; rw::Camera *EnvMapCam; diff --git a/src/extras/custompipes.h b/src/extras/custompipes.h index 9674a6d1..e83201ff 100644 --- a/src/extras/custompipes.h +++ b/src/extras/custompipes.h @@ -75,7 +75,7 @@ void CustomPipeInit(void); void CustomPipeShutdown(void); void SetTxdFindCallback(void); -extern bool bChromeCheat; +extern bool gGlassCarsCheat; extern bool bRenderingEnvMap; extern int32 EnvMapSize; extern rw::Camera *EnvMapCam; diff --git a/src/extras/custompipes_d3d9.cpp b/src/extras/custompipes_d3d9.cpp index 1dc4c0bb..9a02f874 100644 --- a/src/extras/custompipes_d3d9.cpp +++ b/src/extras/custompipes_d3d9.cpp @@ -114,7 +114,7 @@ leedsVehicleRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) uploadMatrices(atomic->getFrame()->getLTM()); setVertexShader(leedsVehicle_VS); - if(bChromeCheat) + if(gGlassCarsCheat) setPixelShader(leedsVehicle_blend_PS); else setPixelShader(leedsVehicle_add_PS); @@ -131,10 +131,11 @@ leedsVehicleRenderCB(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *header) SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 255); float coef = 0.0f; - if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP) + if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP){ coef = CClock::ms_EnvMapTimeMultiplicator * RpMatFXMaterialGetEnvMapCoefficient(m)*0.5f; - if(bChromeCheat && coef > 0.0f) - coef = 1.0f; + if(gGlassCarsCheat) + coef = 1.0f; + } d3ddevice->SetPixelShaderConstantF(PSLOC_shininess, (float*)&coef, 1); setMaterial(m->color, m->surfaceProps); @@ -205,7 +206,7 @@ leedsVehicleRenderCB_mobile(rw::Atomic *atomic, rw::d3d9::InstanceDataHeader *he float coef = 0.0f; if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP){ coef = CClock::ms_EnvMapTimeMultiplicator * RpMatFXMaterialGetEnvMapCoefficient(m)*0.5f; - if(bChromeCheat) + if(gGlassCarsCheat) coef = 1.0f; } d3ddevice->SetPixelShaderConstantF(PSLOC_shininess, (float*)&coef, 1); diff --git a/src/extras/custompipes_gl.cpp b/src/extras/custompipes_gl.cpp index 35a30316..eeb62b8d 100644 --- a/src/extras/custompipes_gl.cpp +++ b/src/extras/custompipes_gl.cpp @@ -122,7 +122,7 @@ leedsVehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) InstanceData *inst = header->inst; rw::int32 n = header->numMeshes; - if(bChromeCheat) + if(gGlassCarsCheat) leedsVehicleShader_blend->use(); else leedsVehicleShader_add->use(); @@ -138,10 +138,11 @@ leedsVehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header) rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF); float coef = 0.0f; - if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP) + if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP){ coef = CClock::ms_EnvMapTimeMultiplicator * RpMatFXMaterialGetEnvMapCoefficient(m)*0.5f; - if(bChromeCheat && coef > 0.0f) - coef = 1.0f; + if(gGlassCarsCheat) + coef = 1.0f; + } glUniform1f(U(u_fxparams), coef); setMaterial(m->color, m->surfaceProps); @@ -216,7 +217,7 @@ leedsVehicleRenderCB_mobile(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *hea float coef = 0.0f; if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP){ coef = CClock::ms_EnvMapTimeMultiplicator * RpMatFXMaterialGetEnvMapCoefficient(m)*0.5f; - if(bChromeCheat) + if(gGlassCarsCheat) coef = 1.0f; } glUniform1f(U(u_fxparams), coef); diff --git a/src/extras/shaders/leedsVehicle_mobile.vert b/src/extras/shaders/leedsVehicle_mobile.vert index e18c2f02..b2123fa4 100644 --- a/src/extras/shaders/leedsVehicle_mobile.vert +++ b/src/extras/shaders/leedsVehicle_mobile.vert @@ -26,11 +26,9 @@ main(void) v_color = in_color; vec4 combinedAmbient = mix(u_emiss, u_amb, Normal.z); -// v_color.rgb += u_ambLight.rgb*surfAmbient; v_color.rgb += combinedAmbient.rgb*surfAmbient; v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse; v_lightingCont = max(0.5, (v_color.r + v_color.g + v_color.b) / 3.0); -// v_color = clamp(v_color, 0.0, 1.0); v_color *= u_matColor; // for fresnel diff --git a/src/extras/shaders/leedsVehicle_mobile_PS.hlsl b/src/extras/shaders/leedsVehicle_mobile_PS.hlsl index e81c66c9..da09b872 100644 --- a/src/extras/shaders/leedsVehicle_mobile_PS.hlsl +++ b/src/extras/shaders/leedsVehicle_mobile_PS.hlsl @@ -45,7 +45,6 @@ float4 main(VS_out input) : COLOR float opacity = lerp(minOpacity, maxOpacity, fresnel)*pass1.a; float4 color = pass1 + float4(reflectivity * envOut, 0.0); -//float4 color = float4(reflectivity, reflectivity, reflectivity, reflectivity); color.a = opacity; color.rgb = lerp(fogColor.rgb, color.rgb, input.TexCoord0.z); diff --git a/src/extras/shaders/leedsVehicle_mobile_VS.hlsl b/src/extras/shaders/leedsVehicle_mobile_VS.hlsl index 667c0963..3085c5e4 100644 --- a/src/extras/shaders/leedsVehicle_mobile_VS.hlsl +++ b/src/extras/shaders/leedsVehicle_mobile_VS.hlsl @@ -38,15 +38,12 @@ VS_out main(in VS_in input) output.Color = input.Prelight; float4 combinedAmbient = lerp(emissive, ambient, N.z); -// output.Color.rgb += ambientLight.rgb * surfAmbient; output.Color.rgb += combinedAmbient.rgb * surfAmbient; int i; for(i = 0; i < numDirLights; i++) output.Color.xyz += DoDirLight(lights[i+firstDirLight], N)*surfDiffuse; lightingCont = max(0.5, (output.Color.r + output.Color.g + output.Color.b) / 3.0); - // PS2 clamps before material color -// output.Color = clamp(output.Color, 0.0, 1.0); output.Color *= matCol; // for fresnel diff --git a/src/extras/shaders/leedsVehicle_mobile_vs_gl.inc b/src/extras/shaders/leedsVehicle_mobile_vs_gl.inc index b1f07563..3609e369 100644 --- a/src/extras/shaders/leedsVehicle_mobile_vs_gl.inc +++ b/src/extras/shaders/leedsVehicle_mobile_vs_gl.inc @@ -27,11 +27,9 @@ const char *leedsVehicle_mobile_vert_src = " v_color = in_color;\n" " vec4 combinedAmbient = mix(u_emiss, u_amb, Normal.z);\n" -"// v_color.rgb += u_ambLight.rgb*surfAmbient;\n" " v_color.rgb += combinedAmbient.rgb*surfAmbient;\n" " v_color.rgb += DoDynamicLight(Vertex.xyz, Normal)*surfDiffuse;\n" " v_lightingCont = max(0.5, (v_color.r + v_color.g + v_color.b) / 3.0);\n" -"// v_color = clamp(v_color, 0.0, 1.0);\n" " v_color *= u_matColor;\n" " // for fresnel\n" diff --git a/vendor/librw b/vendor/librw index 61b288a9..78d540fc 160000 --- a/vendor/librw +++ b/vendor/librw @@ -1 +1 @@ -Subproject commit 61b288a9fe72ae4073c0ac5fd2a5815ed510c8c8 +Subproject commit 78d540fce0ca090b07377cee40d73eadfb7a699d From 6cfc61ac0e08e7d2f6455ffc8d0194b0a895d323 Mon Sep 17 00:00:00 2001 From: Nikolay Korolev Date: Tue, 12 Jan 2021 20:54:52 +0300 Subject: [PATCH 67/68] big oof --- src/control/Script4.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/control/Script4.cpp b/src/control/Script4.cpp index a3ded9a5..efe35efb 100644 --- a/src/control/Script4.cpp +++ b/src/control/Script4.cpp @@ -106,7 +106,10 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) printf("Couldn't find zone - %s\n", zone); return 0; } - CTheZones::SetPedGroup(zone_id, ScriptParams[0], ScriptParams[1]); + while (zone_id >= 0) { + CTheZones::SetPedGroup(zone_id, ScriptParams[0], ScriptParams[1]); + zone_id = CTheZones::FindNextZoneByLabelAndReturnIndex(zone, ZONE_INFO); + } return 0; } case COMMAND_START_CAR_FIRE: From 0afa027ab4a08ea978963f4f83c90b1de86416c4 Mon Sep 17 00:00:00 2001 From: aap Date: Tue, 12 Jan 2021 21:28:13 +0100 Subject: [PATCH 68/68] bug of the decade --- src/core/PlayerInfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/PlayerInfo.cpp b/src/core/PlayerInfo.cpp index 77ddfdb1..7289175d 100644 --- a/src/core/PlayerInfo.cpp +++ b/src/core/PlayerInfo.cpp @@ -132,7 +132,7 @@ CPlayerInfo::Process(void) CAutomobile *car = (CAutomobile*)m_pPed->m_pMyVehicle; if (car->m_nWheelsOnGround < 3) - m_nTimeNotFullyOnGround += CTimer::GetTimeInMilliseconds(); + m_nTimeNotFullyOnGround += CTimer::GetTimeStepInMilliseconds(); else m_nTimeNotFullyOnGround = 0;