summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/collision/ColStore.cpp176
-rw-r--r--src/collision/ColStore.h17
-rw-r--r--src/control/Garages.h2
-rw-r--r--src/control/PathFind.cpp24
-rw-r--r--src/control/Script.cpp21
-rw-r--r--src/control/Script.h22
-rw-r--r--src/control/Script4.cpp2
-rw-r--r--src/control/Script7.cpp3
-rw-r--r--src/control/Script8.cpp31
-rw-r--r--src/control/Script9.cpp2
-rw-r--r--src/control/TrafficLights.cpp26
-rw-r--r--src/core/Game.cpp18
-rw-r--r--src/core/Streaming.cpp40
-rw-r--r--src/core/Streaming.h12
-rw-r--r--src/leeds/base/sList.h35
-rw-r--r--src/modelinfo/BaseModelInfo.h2
-rw-r--r--src/render/SpecialFX.cpp4
17 files changed, 380 insertions, 57 deletions
diff --git a/src/collision/ColStore.cpp b/src/collision/ColStore.cpp
index f1e695fe..90a29bc2 100644
--- a/src/collision/ColStore.cpp
+++ b/src/collision/ColStore.cpp
@@ -1,5 +1,7 @@
#include "common.h"
+#include "main.h"
+#include "smallHeap.h"
#include "templates.h"
#include "General.h"
#include "ModelInfo.h"
@@ -8,6 +10,9 @@
#include "Script.h"
#include "Timer.h"
#include "Camera.h"
+#include "World.h"
+#include "Zones.h"
+#include "Garages.h"
#include "Frontend.h"
#include "Physical.h"
#include "ColStore.h"
@@ -15,16 +20,55 @@
#include "Pools.h"
CPool<ColDef,ColDef> *CColStore::ms_pColPool;
+bool CColStore::m_onlyBB;
#ifndef MASTER
bool bDispColInMem;
#endif
+// LCS: file done except unused:
+// CColStore::LoadCol(int,char const*)
+// CColStore::LoadAllBoundingBoxes(void)
+// CColStore::Write(base::cRelocatableChunkWriter &)
+
+const CVector&
+LevelPos(eLevelName level)
+{
+ static CVector pos[4] = {
+ CVector(1060.0f, -800.0f, 0.0f),
+ CVector(1060.0f, -800.0f, 0.0f),
+ CVector(350.0f, -624.0f, 0.0f),
+ CVector(-670.0f, -511.0f, 0.0f)
+ };
+ return pos[level];
+};
+
+static eLevelName
+PosLevel(const CVector &pos)
+{
+ static eLevelName lastPlayerLevel = LEVEL_INDUSTRIAL;
+ static eLevelName lastOtherLevel = LEVEL_INDUSTRIAL;
+
+ if(Abs(FindPlayerCoors().x - pos.x) < 5.0f &&
+ Abs(FindPlayerCoors().y - pos.y) < 5.0f &&
+ Abs(FindPlayerCoors().z - pos.z) < 5.0f){
+ if(CGame::currLevel != LEVEL_GENERIC)
+ lastPlayerLevel = CGame::currLevel;
+ return lastPlayerLevel;
+ }else{
+ eLevelName lvl = CTheZones::GetLevelFromPosition(&pos);
+ if(lvl != LEVEL_GENERIC)
+ lastOtherLevel = lvl;
+ return lastOtherLevel;
+ }
+}
+
void
CColStore::Initialise(void)
{
- if(ms_pColPool == nil)
+ if(ms_pColPool == nil){
ms_pColPool = new CPool<ColDef,ColDef>(COLSTORESIZE, "CollisionFiles");
- AddColSlot("generic"); // slot 0. not streamed
+ AddColSlot("generic"); // slot 0. not streamed
+ }
#ifndef MASTER
VarConsole.Add("Display collision in memory", &bDispColInMem, true);
#endif
@@ -38,7 +82,9 @@ CColStore::Shutdown(void)
RemoveColSlot(i);
if(ms_pColPool)
delete ms_pColPool;
+#ifdef FIX_BUGS
ms_pColPool = nil;
+#endif
}
int
@@ -119,11 +165,34 @@ CColStore::LoadCol(int32 slot, uint8 *buffer, int32 bufsize)
return success;
}
+struct ColChunkEntry
+{
+ int32 modelId; // -1 marks end
+ CColModel *colModel;
+};
+
+void
+CColStore::LoadColCHK(int32 slot, void *data, void *chunk)
+{
+ ColDef *def = GetSlot(slot);
+ def->chunk = chunk;
+ CStreaming::RegisterPointer(&def->chunk, 1, true);
+ for(ColChunkEntry *entry = (ColChunkEntry*)data; entry->modelId != -1; entry++){
+ CBaseModelInfo *mi = CModelInfo::GetModelInfo(entry->modelId);
+ mi->SetColModel(entry->colModel, true); // we own this? can that work?
+ CStreaming::RegisterPointer(&mi->m_colModel, 1, true);
+ }
+ def->isLoaded = true;
+}
+
+CColModel nullCollision;
+
void
CColStore::RemoveCol(int32 slot)
{
int id;
- GetSlot(slot)->isLoaded = false;
+ ColDef *def = GetSlot(slot);
+ def->isLoaded = false;
for(id = 0; id < MODELINFOSIZE; id++){
CBaseModelInfo *mi = CModelInfo::GetModelInfo(id);
if(mi){
@@ -132,6 +201,23 @@ CColStore::RemoveCol(int32 slot)
col->RemoveCollisionVolumes();
}
}
+ if(gUseChunkFiles){
+ for(id = 0; id < MODELINFOSIZE; id++){
+ CBaseModelInfo *mi = CModelInfo::GetModelInfo(id);
+ if(mi){
+ CColModel *col = mi->GetColModel();
+ if(col && col->level == slot){
+ mi->SetColModel(&nullCollision);
+ CStreaming::UnregisterPointer(&mi->m_colModel, 1);
+ }
+ }
+ }
+ if(def->chunk){
+ CStreaming::UnregisterPointer(&def->chunk, 1);
+ cSmallHeap::msInstance.Free(def->chunk);
+ def->chunk = nil;
+ }
+ }
}
void
@@ -156,29 +242,49 @@ CColStore::RemoveAllCollision(void)
}
static bool bLoadAtSecondPosition;
-static CVector2D secondPosition;
+static CVector secondPosition;
void
-CColStore::AddCollisionNeededAtPosn(const CVector2D &pos)
+CColStore::AddCollisionNeededAtPosn(const CVector &pos)
{
bLoadAtSecondPosition = true;
secondPosition = pos;
}
void
-CColStore::LoadCollision(const CVector2D &pos)
+CColStore::LoadCollision(const CVector &pos, eLevelName level)
{
int i;
if(CStreaming::ms_disableStreaming)
return;
+ if(level == LEVEL_GENERIC)
+ level = PosLevel(pos);
+
+ eLevelName allowedLevel = (eLevelName)CTheScripts::AllowedCollision[0];
+ if(allowedLevel == LEVEL_GENERIC)
+ allowedLevel = (eLevelName)CTheScripts::AllowedCollision[1];
+
+ bool requestedSomething = false;
+
for(i = 1; i < COLSTORESIZE; i++){
- if(GetSlot(i) == nil)
+ if(GetSlot(i) == nil || !DoScriptsWantThisIn(i))
continue;
bool wantThisOne = false;
+ if(strcmp(GetColName(i), "indust") == 0){
+ if(allowedLevel != LEVEL_GENERIC && level != LEVEL_INDUSTRIAL)
+ wantThisOne = allowedLevel == LEVEL_INDUSTRIAL;
+ else
+ wantThisOne = level == LEVEL_INDUSTRIAL;
+ }else if(GetBoundingBox(i).IsPointInside(LevelPos(level)))
+ wantThisOne = true;
+ else if(allowedLevel != LEVEL_GENERIC && GetBoundingBox(i).IsPointInside(LevelPos(allowedLevel)))
+ wantThisOne = true;
+
+/* // LCS: removed
if(GetBoundingBox(i).IsPointInside(pos) ||
bLoadAtSecondPosition && GetBoundingBox(i).IsPointInside(secondPosition, -119.0f) ||
strcmp(GetColName(i), "yacht") == 0){
@@ -203,28 +309,38 @@ CColStore::LoadCollision(const CVector2D &pos)
}
}
}
+*/
- if(wantThisOne)
+ if(wantThisOne){
CStreaming::RequestCol(i, STREAMFLAGS_PRIORITY);
- else
+ requestedSomething = true;
+ }else
CStreaming::RemoveCol(i);
}
+ if(requestedSomething){
+ CTimer::Suspend();
+ // BUG? request was done with priority but now loading non-priority?
+ CStreaming::LoadAllRequestedModels(false);
+ CGarages::SetupAnyGaragesForThisIsland();
+ CTimer::Resume();
+ }
bLoadAtSecondPosition = false;
}
void
-CColStore::RequestCollision(const CVector2D &pos)
+CColStore::RequestCollision(const CVector &pos)
{
int i;
for(i = 1; i < COLSTORESIZE; i++)
- if(GetSlot(i) && GetBoundingBox(i).IsPointInside(pos, -115.0f))
+ if(GetSlot(i) && DoScriptsWantThisIn(i) && GetBoundingBox(i).IsPointInside(LevelPos(PosLevel(pos)), -115.0f))
CStreaming::RequestCol(i, STREAMFLAGS_PRIORITY);
}
void
-CColStore::EnsureCollisionIsInMemory(const CVector2D &pos)
+CColStore::EnsureCollisionIsInMemory(const CVector &pos)
{
+/* // LCS: removed
int i;
if(CStreaming::ms_disableStreaming)
@@ -240,16 +356,48 @@ CColStore::EnsureCollisionIsInMemory(const CVector2D &pos)
CStreaming::LoadAllRequestedModels(false);
CTimer::Resume();
}
+*/
}
bool
-CColStore::HasCollisionLoaded(const CVector2D &pos)
+CColStore::DoScriptsWantThisIn(int32 slot)
+{
+ if(slot == 0)
+ return false;
+ ColDef *coldef = GetSlot(slot);
+ if(coldef == nil)
+ return false;
+ if(strcmp(coldef->name, "fortstaunton") == 0)
+ return !CTheScripts::IsFortStauntonDestroyed();
+ if(strcmp(coldef->name, "fortdestroyed") == 0)
+ return CTheScripts::IsFortStauntonDestroyed();
+ return true;
+}
+
+bool
+CColStore::HasCollisionLoaded(eLevelName level)
{
int i;
+ const CVector &pos = LevelPos(level);
for(i = 1; i < COLSTORESIZE; i++)
- if(GetSlot(i) && GetBoundingBox(i).IsPointInside(pos, -115.0f) &&
+ if(GetSlot(i) && DoScriptsWantThisIn(i) &&
+ (!CGeneral::faststricmp(GetColName(i), "indust") && level == LEVEL_INDUSTRIAL ||
+ GetBoundingBox(i).IsPointInside(pos)) &&
!GetSlot(i)->isLoaded)
return false;
return true;
}
+
+bool
+CColStore::HasCollisionLoaded(const CVector &pos)
+{
+ return HasCollisionLoaded(PosLevel(pos));
+}
+
+void
+CColStore::Load(bool onlyBB, CPool<ColDef> *pool)
+{
+ ms_pColPool = pool;
+ m_onlyBB = onlyBB;
+}
diff --git a/src/collision/ColStore.h b/src/collision/ColStore.h
index e0da92ca..d09bbf8f 100644
--- a/src/collision/ColStore.h
+++ b/src/collision/ColStore.h
@@ -9,11 +9,13 @@ struct ColDef { // made up name
char name[20];
int16 minIndex;
int16 maxIndex;
+ void *chunk;
};
class CColStore
{
static CPool<ColDef,ColDef> *ms_pColPool;
+ static bool m_onlyBB;
public:
static void Initialise(void);
@@ -25,15 +27,18 @@ public:
static CRect &GetBoundingBox(int32 slot);
static void IncludeModelIndex(int32 slot, int32 modelIndex);
static bool LoadCol(int32 storeID, uint8 *buffer, int32 bufsize);
+ static void LoadColCHK(int32 slot, void *data, void *chunk);
static void RemoveCol(int32 slot);
- static void AddCollisionNeededAtPosn(const CVector2D &pos);
+ static void AddCollisionNeededAtPosn(const CVector &pos);
static void LoadAllCollision(void);
static void RemoveAllCollision(void);
- static void LoadCollision(const CVector2D &pos);
- 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 void LoadCollision(const CVector &pos, eLevelName level = LEVEL_GENERIC);
+ static void RequestCollision(const CVector &pos);
+ static void EnsureCollisionIsInMemory(const CVector &pos);
+ static bool DoScriptsWantThisIn(int32 slot);
+ static bool HasCollisionLoaded(eLevelName level);
+ static bool HasCollisionLoaded(const CVector &pos);
+ static void Load(bool, CPool<ColDef> *pool);
static ColDef *GetSlot(int slot) {
assert(slot >= 0);
diff --git a/src/control/Garages.h b/src/control/Garages.h
index 3d12d4a2..47de898f 100644
--- a/src/control/Garages.h
+++ b/src/control/Garages.h
@@ -293,4 +293,6 @@ public:
}
static bool IsThisGarageTypeSafehouse(uint8 type) { return FindSafeHouseIndexForGarageType(type) >= 0; }
+ static void SetupAnyGaragesForThisIsland(void) {} // TODO(LCS)
+
};
diff --git a/src/control/PathFind.cpp b/src/control/PathFind.cpp
index cbc29db4..bc9af2e9 100644
--- a/src/control/PathFind.cpp
+++ b/src/control/PathFind.cpp
@@ -338,17 +338,17 @@ CPathFind::StoreNodeInfoCar(int16 id, int16 node, int8 type, int8 next, int16 x,
InfoForTileCars[i].x = x/16.0f;
InfoForTileCars[i].y = y/16.0f;
InfoForTileCars[i].z = z/16.0f;
- InfoForTilePeds[i].width = 8.0f*Min(width, 15.0f);
+ InfoForTileCars[i].width = 8.0f*Min(width, 15.0f);
InfoForTileCars[i].numLeftLanes = numLeft;
InfoForTileCars[i].numRightLanes = numRight;
- InfoForTilePeds[i].crossing = false;
- InfoForTilePeds[i].speedLimit = 0;
- InfoForTilePeds[i].roadBlock = false;
- InfoForTilePeds[i].disabled = false;
- InfoForTilePeds[i].waterPath = false;
- InfoForTilePeds[i].onlySmallBoats = false;
- InfoForTilePeds[i].betweenLevels = false;
- InfoForTilePeds[i].spawnRate = Min(spawnRate, 15);
+ InfoForTileCars[i].crossing = false;
+ InfoForTileCars[i].speedLimit = 0;
+ InfoForTileCars[i].roadBlock = false;
+ InfoForTileCars[i].disabled = false;
+ InfoForTileCars[i].waterPath = false;
+ InfoForTileCars[i].onlySmallBoats = false;
+ InfoForTileCars[i].betweenLevels = false;
+ InfoForTileCars[i].spawnRate = Min(spawnRate, 15);
if(node == 11)
InfoForTileCars[id*12].SwapConnectionsToBeRightWayRound();
@@ -1763,18 +1763,18 @@ CPathFind::TestCoorsCloseness(CVector target, uint8 type, CVector start)
float dist;
if(type == PATH_CAR)
- DoPathSearch(type, start, -1, target, pNodeList, &DummyResult, 32, nil, &dist, 999999.88f, -1);
+ DoPathSearch(type, start, -1, target, pNodeList, &DummyResult, 32, nil, &dist, 170.0f, -1);
else
DoPathSearch(type, start, -1, target, nil, &DummyResult2, 0, nil, &dist, 50.0f, -1);
#ifdef FIX_BUGS
// dist has GenerationDistMultiplier as a factor, so our reference dist should have it too
if(type == PATH_CAR)
- return dist < 150.0f*TheCamera.GenerationDistMultiplier;
+ return dist < 180.0f*TheCamera.GenerationDistMultiplier;
else
return dist < 100.0f*TheCamera.GenerationDistMultiplier;
#else
if(type == PATH_CAR)
- return dist < 150.0f;
+ return dist < 180.0f;
else
return dist < 100.0f;
#endif
diff --git a/src/control/Script.cpp b/src/control/Script.cpp
index ca94527f..7712a335 100644
--- a/src/control/Script.cpp
+++ b/src/control/Script.cpp
@@ -11,6 +11,7 @@
#include "CivilianPed.h"
#include "Clock.h"
#include "CopPed.h"
+#include "Coronas.h"
#include "Debug.h"
#include "DMAudio.h"
#include "EmergencyPed.h"
@@ -98,7 +99,7 @@ uint16 CTheScripts::NumberOfExclusiveMissionScripts;
bool CTheScripts::bPlayerHasMetDebbieHarry;
bool CTheScripts::bPlayerIsInTheStatium;
int CTheScripts::AllowedCollision[MAX_ALLOWED_COLLISIONS];
-bool CTheScripts::FSDestroyedFlag;
+int CTheScripts::FSDestroyedFlag;
short* CTheScripts::SavedVarIndices;
int CTheScripts::NumSaveVars;
int gScriptsFile = -1;
@@ -107,6 +108,9 @@ bool CTheScripts::InTheScripts;
CRunningScript* pCurrent;
uint16 CTheScripts::NumTrueGlobals;
uint16 CTheScripts::MostGlobals;
+CVector gVectorSetInLua;
+int CTheScripts::NextScriptCoronaID;
+base::cSList<script_corona> CTheScripts::mCoronas;
#ifdef MISSION_REPLAY
@@ -2620,6 +2624,14 @@ bool CTheScripts::Init(bool loaddata)
memset(&UsedObjectArray[i].name, 0, sizeof(UsedObjectArray[i].name));
UsedObjectArray[i].index = 0;
}
+#if defined FIX_BUGS || (!defined GTA_PS2 && !defined GTA_PSP)
+ for (base::cSList<script_corona>::tSItem* i = CTheScripts::mCoronas.first; i;) {
+ base::cSList<script_corona>::tSItem* next = i->next;
+ delete i;
+ i = next;
+ }
+ CTheScripts::mCoronas.first = nil;
+#endif
NumberOfUsedObjects = 0;
if (ScriptSpace)
Shutdown();
@@ -2773,8 +2785,6 @@ void CTheScripts::Process()
UseTextCommands = 0;
}
- // TODO: mCoronas
-
#ifdef MISSION_REPLAY
static uint32 TimeToWaitTill;
switch (AllowMissionReplay) {
@@ -2834,6 +2844,11 @@ void CTheScripts::Process()
if (script && !script->m_bIsActive)
script = nil;
}
+ InTheScripts = false;
+ for (base::cSList<script_corona>::tSItem* i = CTheScripts::mCoronas.first; i; i = i->next) {
+ CCoronas::RegisterCorona((uint32)(uintptr)i, i->item.r, i->item.g, i->item.b, 255, CVector(i->item.x, i->item.y, i->item.z),
+ -i->item.size, 450.0f, i->item.type, i->item.flareType, 1, 0, 0, 0.0f);
+ }
DbgFlag = false;
#ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT
PrintToLog("Script processing done, ScriptsUpdated: %d, CommandsExecuted: %d\n", ScriptsUpdated, CommandsExecuted);
diff --git a/src/control/Script.h b/src/control/Script.h
index 780440dd..fa8a64cd 100644
--- a/src/control/Script.h
+++ b/src/control/Script.h
@@ -4,6 +4,7 @@
#include "Ped.h"
#include "PedType.h"
#include "Text.h"
+#include "sList.h"
#include "Sprite2d.h"
class CEntity;
@@ -273,6 +274,20 @@ struct tBuildingSwap
int32 m_nOldModel;
};
+struct script_corona
+{
+ int id;
+ float x;
+ float y;
+ float z;
+ float size;
+ uint8 r;
+ uint8 g;
+ uint8 b;
+ int type;
+ int flareType;
+};
+
enum {
VAR_LOCAL = 1,
@@ -343,12 +358,14 @@ public:
static int AllowedCollision[MAX_ALLOWED_COLLISIONS];
static short* SavedVarIndices;
static int NumSaveVars;
- static bool FSDestroyedFlag;
+ static int FSDestroyedFlag;
static int NextProcessId;
static bool InTheScripts;
static CRunningScript* pCurrent;
static uint16 NumTrueGlobals;
static uint16 MostGlobals;
+ static base::cSList<script_corona> mCoronas;
+ static int NextScriptCoronaID;
static bool Init(bool loaddata = false);
static void Process();
@@ -468,6 +485,8 @@ public:
static void SetObjectiveForAllPedsInCollective(int, eObjective);
#endif
+ static bool IsFortStauntonDestroyed() { return FSDestroyedFlag && *(int32*)&ScriptSpace[FSDestroyedFlag] == 1; }
+
};
extern int ScriptParams[32];
@@ -665,4 +684,5 @@ extern int scriptToLoad;
#endif
extern int gScriptsFile;
+extern CVector gVectorSetInLua;
diff --git a/src/control/Script4.cpp b/src/control/Script4.cpp
index 20e041da..c3eb2e89 100644
--- a/src/control/Script4.cpp
+++ b/src/control/Script4.cpp
@@ -477,7 +477,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command)
float fx = pObject->GetForward().x;
float fy = pObject->GetForward().y;
float heading = LimitAngleOnCircle(
- RADTODEG(CGeneral::GetATanOfXY(pObject->GetForward().x, pObject->GetForward().y)));
+ RADTODEG(Atan2(-pObject->GetForward().x, pObject->GetForward().y)));
float headingTarget = GET_FLOAT_PARAM(1);
#ifdef FIX_BUGS
float rotateBy = GET_FLOAT_PARAM(2) * CTimer::GetTimeStepFix();
diff --git a/src/control/Script7.cpp b/src/control/Script7.cpp
index 601a979d..c50f0dea 100644
--- a/src/control/Script7.cpp
+++ b/src/control/Script7.cpp
@@ -423,9 +423,10 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command)
case COMMAND_REQUEST_COLLISION:
{
CollectParameters(&m_nIp, 2);
- CVector2D pos;
+ CVector pos;
pos.x = GET_FLOAT_PARAM(0);
pos.y = GET_FLOAT_PARAM(1);
+ pos.z = 0.0f;
CColStore::RequestCollision(pos);
return 0;
}
diff --git a/src/control/Script8.cpp b/src/control/Script8.cpp
index 55a56b2f..53e39b68 100644
--- a/src/control/Script8.cpp
+++ b/src/control/Script8.cpp
@@ -601,19 +601,36 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
case COMMAND_CREATE_SCRIPT_CORONA:
{
CollectParameters(&m_nIp, 9);
- static bool bShowed = false;
- if (!bShowed) {
- debug("CREATE_SCRIPT_CORONA not implemented");
- bShowed = true;
- }
- SET_INTEGER_PARAM(0, -1);
+ base::cSList<script_corona>::tSItem* pCorona = new base::cSList<script_corona>::tSItem();
+ pCorona->item.x = GET_FLOAT_PARAM(0);
+ pCorona->item.y = GET_FLOAT_PARAM(1);
+ pCorona->item.z = GET_FLOAT_PARAM(2);
+ pCorona->item.id = CTheScripts::NextScriptCoronaID++;
+ if (pCorona->item.z <= MAP_Z_LOW_LIMIT)
+ pCorona->item.z = CWorld::FindGroundZForCoord(pCorona->item.x, pCorona->item.y);
+ pCorona->item.size = GET_FLOAT_PARAM(3);
+ pCorona->item.r = GET_INTEGER_PARAM(6);
+ pCorona->item.g = GET_INTEGER_PARAM(7);
+ pCorona->item.b = GET_INTEGER_PARAM(8);
+ pCorona->item.type = GET_INTEGER_PARAM(4);
+ pCorona->item.flareType = GET_INTEGER_PARAM(5);
+ SET_INTEGER_PARAM(0, pCorona->item.id);
+ CTheScripts::mCoronas.Insert(pCorona);
StoreParameters(&m_nIp, 1);
return 0;
}
case COMMAND_REMOVE_SCRIPT_CORONA:
+ {
CollectParameters(&m_nIp, 1);
- // TODO
+ for (base::cSList<script_corona>::tSItem* i = CTheScripts::mCoronas.first; i; i = i->next) {
+ if (i->item.id == GET_INTEGER_PARAM(0)) {
+ CTheScripts::mCoronas.Remove(i);
+ delete i;
+ break;
+ }
+ }
return 0;
+ }
case COMMAND_IS_BOAT_IN_WATER:
{
CollectParameters(&m_nIp, 1);
diff --git a/src/control/Script9.cpp b/src/control/Script9.cpp
index c936e68f..183f73e7 100644
--- a/src/control/Script9.cpp
+++ b/src/control/Script9.cpp
@@ -651,7 +651,7 @@ int8 CRunningScript::ProcessCommands1500To1599(int32 command)
return 0;
}
case COMMAND_GET_VECTOR_FROM_MULTIPLAYER:
- // SET_VECTOR_PARAM(0, gVectorSetInLua);
+ SET_VECTOR_PARAM(0, gVectorSetInLua);
StoreParameters(&m_nIp, 3);
return 0;
case COMMAND_PRINT_HELP_ALWAYS:
diff --git a/src/control/TrafficLights.cpp b/src/control/TrafficLights.cpp
index df0761ab..d8f211d0 100644
--- a/src/control/TrafficLights.cpp
+++ b/src/control/TrafficLights.cpp
@@ -114,6 +114,32 @@ CTrafficLights::DisplayActualLight(CEntity *ent)
CBrightLights::RegisterOne(pos1, ent->GetUp(), ent->GetRight(), CVector(0.0f, 0.0f, 0.0f), id + BRIGHTLIGHT_TRAFFIC_GREEN);
CBrightLights::RegisterOne(pos2, ent->GetUp(), -ent->GetRight(), CVector(0.0f, 0.0f, 0.0f), id + BRIGHTLIGHT_TRAFFIC_GREEN);
+
+ // TODO(LCS): check coordinates
+ static const float top = -0.127f;
+ static const float bot = -0.539f;
+ static const float mid = bot + (top - bot) / 3.0f;
+ static const float left = 1.256f;
+ static const float right = 0.706f;
+ phase = CTrafficLights::LightForPeds();
+ if (phase == PED_LIGHTS_DONT_WALK) {
+ CVector p0(2.7f, right, top);
+ CVector p1(2.7f, left, top);
+ CVector p2(2.7f, right, mid);
+ CVector p3(2.7f, left, mid);
+ CShinyTexts::RegisterOne(ent->GetMatrix() * p0, ent->GetMatrix() * p1, ent->GetMatrix() * p2, ent->GetMatrix() * p3,
+ 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f,
+ SHINYTEXT_WALK, 255, 0, 0, 60.0f);
+ }
+ else if (phase == PED_LIGHTS_WALK || CTimer::GetTimeInMilliseconds() & 0x100) {
+ CVector p0(2.7f, right, mid);
+ CVector p1(2.7f, left, mid);
+ CVector p2(2.7f, right, bot);
+ CVector p3(2.7f, left, bot);
+ CShinyTexts::RegisterOne(ent->GetMatrix() * p0, ent->GetMatrix() * p1, ent->GetMatrix() * p2, ent->GetMatrix() * p3,
+ 1.0f, 0.5f, 0.0f, 0.5f, 1.0f, 1.0f, 0.0f, 1.0f,
+ SHINYTEXT_WALK, 255, 255, 255, 60.0f);
+ }
}
else if (MI_TRAFFICLIGHTS_VERTICAL == m) {
CBaseModelInfo* mi = CModelInfo::GetModelInfo(ent->GetModelIndex());
diff --git a/src/core/Game.cpp b/src/core/Game.cpp
index 3f34617f..b18ab4e1 100644
--- a/src/core/Game.cpp
+++ b/src/core/Game.cpp
@@ -856,9 +856,9 @@ void CGame::Process(void)
gameProcessPirateCheck = 2;
}
#endif
- uint32 startTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond();
+ //uint32 startTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond();
CStreaming::Update();
- uint32 processTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond() - startTime;
+ //uint32 processTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond() - startTime;
CWindModifiers::Number = 0;
if (!CTimer::GetIsPaused())
{
@@ -897,13 +897,13 @@ void CGame::Process(void)
CEventList::Update();
CParticle::Update();
gFireManager.Update();
- if (processTime >= 2) {
- CPopulation::Update(false);
- } else {
- uint32 startTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond();
+ //if (processTime >= 2) {
+ // CPopulation::Update(false);
+ //} else {
+ // uint32 startTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond();
CPopulation::Update(true);
- processTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond() - startTime;
- }
+ // processTime = CTimer::GetCurrentTimeInCycles() / CTimer::GetCyclesPerMillisecond() - startTime;
+ //}
CWeapon::UpdateWeapons();
if (!CCutsceneMgr::IsRunning())
CTheCarGenerators::Process();
@@ -941,7 +941,7 @@ void CGame::Process(void)
if (!CReplay::IsPlayingBack())
{
PUSH_MEMID(MEMID_CARS);
- if (processTime < 2)
+ //if (processTime < 2)
CCarCtrl::GenerateRandomCars();
CRoadBlocks::GenerateRoadBlocks();
CCarCtrl::RemoveDistantCars();
diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp
index 19339fb6..8cdc3a66 100644
--- a/src/core/Streaming.cpp
+++ b/src/core/Streaming.cpp
@@ -3150,6 +3150,46 @@ CStreaming::LoadSceneCollision(const CVector &pos)
CStreaming::LoadAllRequestedModels(false);
}
+//--LCS: TODO PSP and PS2
+// some things commented out that might be Rsl3D dependent
+void CStreaming::RegisterPointer(void *ptr, int, bool) {}
+RpAtomic *CStreaming::RegisterAtomic(RpAtomic *atomic, void *)
+{
+ return atomic;
+}
+void CStreaming::RegisterClump(RpClump *clump)
+{
+ RpClumpForAllAtomics(clump, RegisterAtomic, nil);
+}
+RpAtomic *CStreaming::RegisterInstance(RpAtomic *atomic, void *)
+{
+// RegisterPointer(&atomic->geometry, 2, true);
+ return atomic;
+}
+void CStreaming::RegisterInstance(RpClump *clump)
+{
+ RpClumpForAllAtomics(clump, RegisterInstance, nil);
+}
+
+void CStreaming::UnregisterPointer(void *ptr, int) {}
+RpAtomic *CStreaming::UnregisterAtomic(RpAtomic *atomic, void *)
+{
+ return atomic;
+}
+void CStreaming::UnregisterClump(RpClump *clump)
+{
+ RpClumpForAllAtomics(clump, UnregisterAtomic, nil);
+}
+RpAtomic *CStreaming::UnregisterInstance(RpAtomic *atomic, void *)
+{
+// UnregisterPointer(&atomic->geometry, 2);
+ return atomic;
+}
+void CStreaming::UnregisterInstance(RpClump *clump)
+{
+ RpClumpForAllAtomics(clump, UnregisterInstance, nil);
+}
+
void
CStreaming::MemoryCardSave(uint8 *buf, uint32 *size)
{
diff --git a/src/core/Streaming.h b/src/core/Streaming.h
index 66262721..4b9502e9 100644
--- a/src/core/Streaming.h
+++ b/src/core/Streaming.h
@@ -20,6 +20,7 @@ enum StreamFlags
STREAMFLAGS_40 = 0x40, // TODO(LCS): what's this
STREAMFLAGS_AMBIENT_SCRIPT_OWNED = 0x80,
+ // TODO(LCS): STREAMFLAGS_AMBIENT_SCRIPT_OWNED in STREAMFLAGS_CANT_REMOVE? check CColStore
STREAMFLAGS_CANT_REMOVE = STREAMFLAGS_DONT_REMOVE|STREAMFLAGS_SCRIPTOWNED,
STREAMFLAGS_KEEP_IN_MEMORY = STREAMFLAGS_DONT_REMOVE|STREAMFLAGS_SCRIPTOWNED|STREAMFLAGS_DEPENDENCY,
};
@@ -209,6 +210,17 @@ public:
static void LoadScene(const CVector &pos);
static void LoadSceneCollision(const CVector &pos);
+ static void RegisterPointer(void *ptr, int, bool);
+ static RpAtomic *RegisterAtomic(RpAtomic *atomic, void *);
+ static void RegisterClump(RpClump *clump);
+ static RpAtomic *RegisterInstance(RpAtomic *atomic, void *);
+ static void RegisterInstance(RpClump *clump);
+ static void UnregisterPointer(void *ptr, int);
+ static RpAtomic *UnregisterAtomic(RpAtomic *atomic, void *);
+ static void UnregisterClump(RpClump *clump);
+ static RpAtomic *UnregisterInstance(RpAtomic *atomic, void *);
+ static void UnregisterInstance(RpClump *clump);
+
static void MemoryCardSave(uint8 *buffer, uint32 *length);
static void MemoryCardLoad(uint8 *buffer, uint32 length);
diff --git a/src/leeds/base/sList.h b/src/leeds/base/sList.h
new file mode 100644
index 00000000..378d8e31
--- /dev/null
+++ b/src/leeds/base/sList.h
@@ -0,0 +1,35 @@
+#pragma once
+
+namespace base
+{
+
+template<typename T>
+class cSList
+{
+public:
+ struct tSItem
+ {
+ tSItem* next;
+ T item;
+ };
+ // extra field on PS2
+ tSItem* first;
+
+ cSList() { first = nil; }
+ void Insert(tSItem* item) { tSItem* n = first; first = item; item->next = n; }
+ void Remove(tSItem* item) {
+ if (first == item) {
+ first = item->next;
+ return;
+ }
+ tSItem* i = first;
+ while (i && i->next != item)
+ i = i->next;
+ assert(i);
+ i->next = item->next;
+
+ }
+
+};
+
+} \ No newline at end of file
diff --git a/src/modelinfo/BaseModelInfo.h b/src/modelinfo/BaseModelInfo.h
index a93040b1..3f691602 100644
--- a/src/modelinfo/BaseModelInfo.h
+++ b/src/modelinfo/BaseModelInfo.h
@@ -29,7 +29,9 @@ protected:
uint8 m_type;
uint8 m_num2dEffects;
bool m_bOwnsColModel;
+public: // need this in colstore
CColModel *m_colModel;
+protected:
int16 m_2dEffectsID;
int16 m_objectId;
uint16 m_refCount;
diff --git a/src/render/SpecialFX.cpp b/src/render/SpecialFX.cpp
index 35b0b2fc..3387cb2e 100644
--- a/src/render/SpecialFX.cpp
+++ b/src/render/SpecialFX.cpp
@@ -877,7 +877,7 @@ C3dMarkers::PlaceMarker(uint32 identifier, uint16 type, CVector &pos, float size
pMarker->m_Matrix.GetPosition() = pos;
if (pMarker->m_bFindZOnNextPlacement) {
- if ((playerPos - pos).MagnitudeSqr() < sq(100.f) && CColStore::HasCollisionLoaded(CVector2D(pos))) {
+ if ((playerPos - pos).MagnitudeSqr() < sq(100.f) && CColStore::HasCollisionLoaded(pos)) {
float z = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z + 1.0f, nil);
if (z != 0.0f)
pMarker->m_Matrix.GetPosition().z = z - 0.05f * size;
@@ -893,7 +893,7 @@ C3dMarkers::PlaceMarker(uint32 identifier, uint16 type, CVector &pos, float size
pMarker->AddMarker(identifier, type, size, r, g, b, a, pulsePeriod, pulseFraction, rotateRate);
if (type == MARKERTYPE_CYLINDER || type == MARKERTYPE_0 || type == MARKERTYPE_2) {
- if ((playerPos - pos).MagnitudeSqr() < sq(100.f) && CColStore::HasCollisionLoaded(CVector2D(pos))) {
+ if ((playerPos - pos).MagnitudeSqr() < sq(100.f) && CColStore::HasCollisionLoaded(pos)) {
float z = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z + 1.0f, nil);
if (z != 0.0f)
pos.z = z - 0.05f * size;