summaryrefslogtreecommitdiffstats
path: root/src/collision
diff options
context:
space:
mode:
Diffstat (limited to 'src/collision')
-rw-r--r--src/collision/ColModel.cpp11
-rw-r--r--src/collision/ColModel.h2
-rw-r--r--src/collision/ColStore.cpp176
-rw-r--r--src/collision/ColStore.h17
-rw-r--r--src/collision/Collision.cpp20
-rw-r--r--src/collision/TempColModels.cpp86
-rw-r--r--src/collision/TempColModels.h15
7 files changed, 272 insertions, 55 deletions
diff --git a/src/collision/ColModel.cpp b/src/collision/ColModel.cpp
index 49847dbd..2de7f736 100644
--- a/src/collision/ColModel.cpp
+++ b/src/collision/ColModel.cpp
@@ -7,6 +7,8 @@
CColModel::CColModel(void)
{
+ boundingSphere.Set(0.0001f, CVector(0.0f, 0.0f, 0.0f));
+ boundingBox.Set(CVector(0.0f, 0.0f, 0.0f), CVector(0.0f, 0.0f, 0.0f));
numSpheres = 0;
spheres = nil;
numLines = 0;
@@ -18,7 +20,7 @@ CColModel::CColModel(void)
triangles = nil;
trianglePlanes = nil;
level = LEVEL_GENERIC; // generic col slot
- ownsCollisionVolumes = true;
+// ownsCollisionVolumes = true;
}
CColModel::~CColModel(void)
@@ -204,3 +206,10 @@ CColModel::operator=(const CColModel &other)
}
return *this;
}
+
+bool
+CColModel::Write(base::cRelocatableChunkWriter &writer, bool allocSpace)
+{
+ assert(0 && "TODO(LCS)");
+ return 1;
+}
diff --git a/src/collision/ColModel.h b/src/collision/ColModel.h
index cd5ae651..c58a4d9b 100644
--- a/src/collision/ColModel.h
+++ b/src/collision/ColModel.h
@@ -36,4 +36,6 @@ struct CColModel
void *operator new(size_t);
void operator delete(void *p, size_t);
CColModel& operator=(const CColModel& other);
+
+ bool Write(base::cRelocatableChunkWriter &writer, bool allocSpace);
}; \ No newline at end of file
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/collision/Collision.cpp b/src/collision/Collision.cpp
index 703804d9..bead5183 100644
--- a/src/collision/Collision.cpp
+++ b/src/collision/Collision.cpp
@@ -24,8 +24,6 @@
#include "Camera.h"
#include "ColStore.h"
-//--MIAMI: file done
-
#ifdef VU_COLLISION
#include "VuCollision.h"
@@ -93,7 +91,7 @@ CCollision::Update(void)
{
}
-//--MIAMI: unused
+// unused
eLevelName
GetCollisionInSectorList(CPtrList &list)
{
@@ -110,7 +108,7 @@ GetCollisionInSectorList(CPtrList &list)
return LEVEL_GENERIC;
}
-//--MIAMI: unused
+// unused
// Get a level this sector is in based on collision models
eLevelName
GetCollisionInSector(CSector &sect)
@@ -880,7 +878,7 @@ CCollision::ProcessLineSphere(const CColLine &line, const CColSphere &sphere, CC
return true;
}
-//--MIAMI: unused
+// unused
bool
CCollision::ProcessVerticalLineTriangle(const CColLine &line,
const CompressedVector *verts, const CColTriangle &tri, const CColTrianglePlane &plane,
@@ -2101,12 +2099,12 @@ CCollision::DistToLine(const CVector *l0, const CVector *l1, const CVector *poin
float dot = DotProduct(*point - *l0, *l1 - *l0);
// Between 0 and len we're above the line.
// if not, calculate distance to endpoint
- if(dot <= 0.0f)
- return (*point - *l0).Magnitude();
- if(dot >= lensq)
- return (*point - *l1).Magnitude();
+ if(dot <= 0.0f) return (*point - *l0).Magnitude();
+ if(dot >= lensq) return (*point - *l1).Magnitude();
// distance to line
- return Sqrt((*point - *l0).MagnitudeSqr() - dot*dot/lensq);
+ float distSqr = (*point - *l0).MagnitudeSqr() - dot * dot / lensq;
+ if(distSqr <= 0.f) return 0.f;
+ return Sqrt(distSqr);
}
// same as above but also return the point on the line
@@ -2573,4 +2571,4 @@ CCollision::DrawColModel_Coloured(const CMatrix &mat, const CColModel &colModel,
RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)FALSE);
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void*)TRUE);
-} \ No newline at end of file
+}
diff --git a/src/collision/TempColModels.cpp b/src/collision/TempColModels.cpp
index 55058bde..148b86fe 100644
--- a/src/collision/TempColModels.cpp
+++ b/src/collision/TempColModels.cpp
@@ -1,10 +1,12 @@
#include "common.h"
+#include "main.h"
#include "TempColModels.h"
+#include "Game.h"
+
+// LCS: haven't yet checked the numbers but they probably haven't changed
-CColModel CTempColModels::ms_colModelPed1;
CColModel CTempColModels::ms_colModelPed2;
-CColModel CTempColModels::ms_colModelBBox;
CColModel CTempColModels::ms_colModelBumper1;
CColModel CTempColModels::ms_colModelWheel1;
CColModel CTempColModels::ms_colModelPanel1;
@@ -15,7 +17,9 @@ CColModel CTempColModels::ms_colModelPedGroundHit;
CColModel CTempColModels::ms_colModelBoot1;
CColModel CTempColModels::ms_colModelDoor1;
CColModel CTempColModels::ms_colModelBonnet1;
-CColModel CTempColModels::ms_colModelWeapon;
+CColModel CTempColModels::ms_colModelFerryDocked;
+
+CTempColModels *gpTempColModels;
CColSphere s_aPedSpheres[3];
@@ -33,6 +37,7 @@ CColSphere s_aBootSpheres[4];
CColSphere s_aWheelSpheres[2];
CColSphere s_aBodyPartSpheres1[2];
CColSphere s_aBodyPartSpheres2[2];
+CColBox S_aFerryDockedBoxes[1];
void
CTempColModels::Initialise(void)
@@ -43,11 +48,26 @@ CTempColModels::Initialise(void)
colmodel.level = LEVEL_GENERIC;\
colmodel.ownsCollisionVolumes = false;
- int i;
+ if(gMakeResources){
+ if(gpTempColModels == nil){
+ gpTempColModels = new CTempColModels;
+ gpTempColModels->Initialise();
+ return;
+ }
+
+ ms_colModelBBox.boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f));
+ ms_colModelBBox.boundingBox.Set(CVector(-2.0f, -2.0f, -2.0f), CVector(2.0f, 2.0f, 2.0f));
+ ms_colModelBBox.level = LEVEL_GENERIC;
- ms_colModelBBox.boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f));
- ms_colModelBBox.boundingBox.Set(CVector(-2.0f, -2.0f, -2.0f), CVector(2.0f, 2.0f, 2.0f));
- ms_colModelBBox.level = LEVEL_GENERIC;
+ ms_colModelPed1.boundingSphere.Set(1.25f, CVector(0.0f, 0.0f, 0.0f));
+ ms_colModelPed1.boundingBox.Set(CVector(-0.35f, -0.35f, -1.0f), CVector(0.35f, 0.35f, 0.9f));
+ SET_COLMODEL_SPHERES(ms_colModelPed1, s_aPedSpheres);
+
+ ms_colModelWeapon.boundingSphere.Set(0.25f, CVector(0.0f, 0.0f, 0.0f));
+ ms_colModelWeapon.boundingBox.Set(CVector(-0.25f, -0.25f, -0.25f), CVector(0.25f, 0.25f, 0.25f));
+ }
+
+ int i;
for (i = 0; i < ARRAY_SIZE(ms_colModelCutObj); i++) {
ms_colModelCutObj[i].boundingSphere.Set(2.0f, CVector(0.0f, 0.0f, 0.0f));
@@ -73,10 +93,6 @@ CTempColModels::Initialise(void)
s_aPedSpheres[i].piece = 0;
}
- ms_colModelPed1.boundingSphere.Set(1.25f, CVector(0.0f, 0.0f, 0.0f));
- ms_colModelPed1.boundingBox.Set(CVector(-0.35f, -0.35f, -1.0f), CVector(0.35f, 0.35f, 0.9f));
- SET_COLMODEL_SPHERES(ms_colModelPed1, s_aPedSpheres);
-
// Ped 2 Spheres
s_aPed2Spheres[0].radius = 0.3f;
@@ -293,13 +309,47 @@ CTempColModels::Initialise(void)
SET_COLMODEL_SPHERES(ms_colModelBodyPart2, s_aBodyPartSpheres2);
- ms_colModelWeapon.boundingSphere.radius = 0.25f;
- ms_colModelWeapon.boundingBox.min.x = -0.25f;
- ms_colModelWeapon.boundingBox.min.y = -0.25f;
- ms_colModelWeapon.boundingBox.min.z = -0.25f;
- ms_colModelWeapon.boundingBox.max.x = 0.25f;
- ms_colModelWeapon.boundingBox.max.y = 0.25f;
- ms_colModelWeapon.boundingBox.max.z = 0.25f;
+ // Ferry Docked
+
+ S_aFerryDockedBoxes[0].Set(CVector(-6.3f, -22.78f, -2.0f), CVector(6.3f, 22.78f, 2.8f), SURFACE_THICK_METAL_PLATE, SURFACE_DEFAULT);
+
+ ms_colModelFerryDocked.boundingSphere.Set(35.0f, CVector(0.0f, -0.0f, 0.0f));
+ ms_colModelFerryDocked.boundingBox.Set(S_aFerryDockedBoxes[0].min, S_aFerryDockedBoxes[0].max);
+ ms_colModelFerryDocked.spheres = nil;
+ ms_colModelFerryDocked.numSpheres = 0;
+ ms_colModelFerryDocked.boxes = S_aFerryDockedBoxes;
+ ms_colModelFerryDocked.numBoxes = ARRAY_SIZE(S_aFerryDockedBoxes);
+ ms_colModelFerryDocked.level = LEVEL_GENERIC;
+
#undef SET_COLMODEL_SPHERES
}
+
+void
+CTempColModels::Write(base::cRelocatableChunkWriter &writer)
+{
+ writer.AllocateRaw(this, sizeof(*this), 0x10, false, true);
+
+ ms_colModelBBox.Write(writer, false);
+ writer.AddPatch(&ms_colModelBBox);
+
+ ms_colModelPed1.Write(writer, false);
+ writer.AddPatch(&ms_colModelPed1);
+
+ ms_colModelWeapon.Write(writer, false);
+ writer.AddPatch(&ms_colModelWeapon);
+
+ for(int i = 0; i < ARRAY_SIZE(ms_colModelCutObj); i++)
+ ms_colModelCutObj[i].Write(writer, true);
+ ms_colModelPed2.Write(writer, true);
+ ms_colModelPedGroundHit.Write(writer, true);
+ ms_colModelDoor1.Write(writer, true);
+ ms_colModelBumper1.Write(writer, true);
+ ms_colModelPanel1.Write(writer, true);
+ ms_colModelBonnet1.Write(writer, true);
+ ms_colModelBoot1.Write(writer, true);
+ ms_colModelWheel1.Write(writer, true);
+ ms_colModelBodyPart1.Write(writer, true);
+ ms_colModelBodyPart2.Write(writer, true);
+ ms_colModelFerryDocked.Write(writer, true);
+}
diff --git a/src/collision/TempColModels.h b/src/collision/TempColModels.h
index 457315b6..0f1f06c3 100644
--- a/src/collision/TempColModels.h
+++ b/src/collision/TempColModels.h
@@ -1,13 +1,15 @@
#pragma once
-#include "Collision.h"
+#include "ColModel.h"
class CTempColModels
{
public:
- static CColModel ms_colModelPed1;
+ CColModel ms_colModelPed1;
+ CColModel ms_colModelBBox;
+ CColModel ms_colModelWeapon;
+
static CColModel ms_colModelPed2;
- static CColModel ms_colModelBBox;
static CColModel ms_colModelBumper1;
static CColModel ms_colModelWheel1;
static CColModel ms_colModelPanel1;
@@ -18,7 +20,10 @@ public:
static CColModel ms_colModelBoot1;
static CColModel ms_colModelDoor1;
static CColModel ms_colModelBonnet1;
- static CColModel ms_colModelWeapon;
+ static CColModel ms_colModelFerryDocked;
- static void Initialise(void);
+ void Initialise(void);
+ void Write(base::cRelocatableChunkWriter &writer);
};
+
+extern CTempColModels *gpTempColModels;