[Scummvm-git-logs] scummvm master -> 5059aea538bf9f1db5c09ca53b22313577aa389a

dreammaster dreammaster at scummvm.org
Mon Apr 10 03:44:31 CEST 2017


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
5059aea538 TITANIC: Rename CStarControlSub12 to CStarCamera


Commit: 5059aea538bf9f1db5c09ca53b22313577aa389a
    https://github.com/scummvm/scummvm/commit/5059aea538bf9f1db5c09ca53b22313577aa389a
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2017-04-09T21:44:10-04:00

Commit Message:
TITANIC: Rename CStarControlSub12 to CStarCamera

Changed paths:
  A engines/titanic/star_control/star_camera.cpp
  A engines/titanic/star_control/star_camera.h
  R engines/titanic/star_control/star_control_sub12.cpp
  R engines/titanic/star_control/star_control_sub12.h
    engines/titanic/module.mk
    engines/titanic/star_control/base_stars.cpp
    engines/titanic/star_control/base_stars.h
    engines/titanic/star_control/star_closeup.cpp
    engines/titanic/star_control/star_closeup.h
    engines/titanic/star_control/star_control.cpp
    engines/titanic/star_control/star_control_sub2.cpp
    engines/titanic/star_control/star_control_sub2.h
    engines/titanic/star_control/star_control_sub7.cpp
    engines/titanic/star_control/star_control_sub7.h
    engines/titanic/star_control/star_control_sub8.cpp
    engines/titanic/star_control/star_control_sub8.h
    engines/titanic/star_control/star_field.cpp
    engines/titanic/star_control/star_field.h
    engines/titanic/star_control/star_points1.cpp
    engines/titanic/star_control/star_points1.h
    engines/titanic/star_control/star_points2.cpp
    engines/titanic/star_control/star_points2.h
    engines/titanic/star_control/star_ref.cpp
    engines/titanic/star_control/star_ref.h
    engines/titanic/star_control/star_view.cpp
    engines/titanic/star_control/star_view.h


diff --git a/engines/titanic/module.mk b/engines/titanic/module.mk
index aa165d3..9eeaa18 100644
--- a/engines/titanic/module.mk
+++ b/engines/titanic/module.mk
@@ -440,11 +440,11 @@ MODULE_OBJS := \
 	star_control/frange.o \
 	star_control/frect.o \
 	star_control/fvector.o \
+	star_control/star_camera.o \
 	star_control/star_closeup.o \
 	star_control/star_control_sub2.o \
 	star_control/star_control_sub7.o \
 	star_control/star_control_sub8.o \
-	star_control/star_control_sub12.o \
 	star_control/star_control_sub13.o \
 	star_control/star_control_sub20.o \
 	star_control/star_control_sub21.o \
diff --git a/engines/titanic/star_control/base_stars.cpp b/engines/titanic/star_control/base_stars.cpp
index a5c6143..1da535e 100644
--- a/engines/titanic/star_control/base_stars.cpp
+++ b/engines/titanic/star_control/base_stars.cpp
@@ -21,7 +21,7 @@
  */
 
 #include "titanic/star_control/base_stars.h"
-#include "titanic/star_control/star_control_sub12.h"
+#include "titanic/star_control/star_camera.h"
 #include "titanic/star_control/star_ref.h"
 #include "titanic/titanic.h"
 
@@ -123,16 +123,16 @@ void CBaseStars::resetEntry(CBaseStarEntry &entry) {
 		entry._data[idx] = 0;
 }
 
-void CBaseStars::draw(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarCloseup *closeup) {
+void CBaseStars::draw(CSurfaceArea *surfaceArea, CStarCamera *camera, CStarCloseup *closeup) {
 	if (!_data.empty()) {
-		switch (sub12->proc27()) {
+		switch (camera->proc27()) {
 		case 0:
 			switch (surfaceArea->_bpp) {
 			case 1:
-				draw1(surfaceArea, sub12, closeup);
+				draw1(surfaceArea, camera, closeup);
 				break;
 			case 2:
-				draw2(surfaceArea, sub12, closeup);
+				draw2(surfaceArea, camera, closeup);
 				break;
 			default:
 				break;
@@ -142,10 +142,10 @@ void CBaseStars::draw(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStar
 		case 2:
 			switch (surfaceArea->_bpp) {
 			case 1:
-				draw3(surfaceArea, sub12, closeup);
+				draw3(surfaceArea, camera, closeup);
 				break;
 			case 2:
-				draw4(surfaceArea, sub12, closeup);
+				draw4(surfaceArea, camera, closeup);
 				break;
 			default:
 				break;
@@ -158,13 +158,13 @@ void CBaseStars::draw(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStar
 	}
 }
 
-void CBaseStars::draw1(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarCloseup *closeup) {
-	FPose pose = sub12->proc23();
-	sub12->proc36(&_value1, &_value2, &_value3, &_value4);
+void CBaseStars::draw1(CSurfaceArea *surfaceArea, CStarCamera *camera, CStarCloseup *closeup) {
+	FPose pose = camera->proc23();
+	camera->proc36(&_value1, &_value2, &_value3, &_value4);
 
 	const double MAX_VAL = 1.0e9 * 1.0e9;
 	FPoint centroid = surfaceArea->_centroid - FPoint(0.5, 0.5);
-	double threshold = sub12->proc25();
+	double threshold = camera->proc25();
 	double minVal = threshold - 9216.0;
 	int width1 = surfaceArea->_width - 1;
 	int height1 = surfaceArea->_height - 1;
@@ -185,7 +185,7 @@ void CBaseStars::draw1(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CSta
 
 		if (total2 < 1.0e12) {
 			closeup->draw(pose, vector, FVector(centroid._x, centroid._y, total2),
-				surfaceArea, sub12);
+				surfaceArea, camera);
 			continue;
 		}
 
@@ -243,13 +243,13 @@ void CBaseStars::draw1(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CSta
 	}
 }
 
-void CBaseStars::draw2(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarCloseup *closeup) {
-	FPose pose = sub12->proc23();
-	sub12->proc36(&_value1, &_value2, &_value3, &_value4);
+void CBaseStars::draw2(CSurfaceArea *surfaceArea, CStarCamera *camera, CStarCloseup *closeup) {
+	FPose pose = camera->proc23();
+	camera->proc36(&_value1, &_value2, &_value3, &_value4);
 
 	const double MAX_VAL = 1.0e9 * 1.0e9;
 	FPoint centroid = surfaceArea->_centroid - FPoint(0.5, 0.5);
-	double threshold = sub12->proc25();
+	double threshold = camera->proc25();
 	double minVal = threshold - 9216.0;
 	int width1 = surfaceArea->_width - 1;
 	int height1 = surfaceArea->_height - 1;
@@ -270,7 +270,7 @@ void CBaseStars::draw2(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CSta
 
 		if (total2 < 1.0e12) {
 			closeup->draw(pose, vector, FVector(centroid._x, centroid._y, total2),
-				surfaceArea, sub12);
+				surfaceArea, camera);
 			continue;
 		}
 
@@ -329,13 +329,13 @@ void CBaseStars::draw2(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CSta
 	}
 }
 
-void CBaseStars::draw3(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarCloseup *closeup) {
-	FPose pose = sub12->proc23();
-	sub12->proc36(&_value1, &_value2, &_value3, &_value4);
+void CBaseStars::draw3(CSurfaceArea *surfaceArea, CStarCamera *camera, CStarCloseup *closeup) {
+	FPose pose = camera->proc23();
+	camera->proc36(&_value1, &_value2, &_value3, &_value4);
 
 	const double MAX_VAL = 1.0e9 * 1.0e9;
 	FPoint centroid = surfaceArea->_centroid - FPoint(0.5, 0.5);
-	double threshold = sub12->proc25();
+	double threshold = camera->proc25();
 	double minVal = threshold - 9216.0;
 	int width1 = surfaceArea->_width - 1;
 	int height1 = surfaceArea->_height - 1;
@@ -359,7 +359,7 @@ void CBaseStars::draw3(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CSta
 
 		if (total2 < 1.0e12) {
 			closeup->draw(pose, vector, FVector(centroid._x, centroid._y, total2),
-				surfaceArea, sub12);
+				surfaceArea, camera);
 			continue;
 		}
 
@@ -436,13 +436,13 @@ void CBaseStars::draw3(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CSta
 	}
 }
 
-void CBaseStars::draw4(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarCloseup *closeup) {
-	FPose pose = sub12->proc23();
-	sub12->proc36(&_value1, &_value2, &_value3, &_value4);
+void CBaseStars::draw4(CSurfaceArea *surfaceArea, CStarCamera *camera, CStarCloseup *closeup) {
+	FPose pose = camera->proc23();
+	camera->proc36(&_value1, &_value2, &_value3, &_value4);
 
 	const double MAX_VAL = 1.0e9 * 1.0e9;
 	FPoint centroid = surfaceArea->_centroid - FPoint(0.5, 0.5);
-	double threshold = sub12->proc25();
+	double threshold = camera->proc25();
 	double minVal = threshold - 9216.0;
 	int width1 = surfaceArea->_width - 1;
 	int height1 = surfaceArea->_height - 1;
@@ -466,7 +466,7 @@ void CBaseStars::draw4(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CSta
 
 		if (total2 < 1.0e12) {
 			closeup->draw(pose, vector, FVector(centroid._x, centroid._y, total2),
-				surfaceArea, sub12);
+				surfaceArea, camera);
 			continue;
 		}
 
@@ -543,16 +543,16 @@ void CBaseStars::draw4(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CSta
 	}
 }
 
-int CBaseStars::baseFn1(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12,
+int CBaseStars::baseFn1(CSurfaceArea *surfaceArea, CStarCamera *camera,
 		const Common::Point &pt) {
 	CStarRef1 ref(this, pt);
-	ref.process(surfaceArea, sub12);
+	ref.process(surfaceArea, camera);
 	return ref._index;
 }
 
-int CBaseStars::baseFn2(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12) {
+int CBaseStars::baseFn2(CSurfaceArea *surfaceArea, CStarCamera *camera) {
 	CStarRef3 ref(this);
-	ref.process(surfaceArea, sub12);
+	ref.process(surfaceArea, camera);
 	return ref._index;
 }
 
diff --git a/engines/titanic/star_control/base_stars.h b/engines/titanic/star_control/base_stars.h
index 0394bfe..34bec4b 100644
--- a/engines/titanic/star_control/base_stars.h
+++ b/engines/titanic/star_control/base_stars.h
@@ -20,8 +20,8 @@
  *
  */
 
-#ifndef TITANIC_STAR_CONTROL_SUB3_H
-#define TITANIC_STAR_CONTROL_SUB3_H
+#ifndef TITANIC_BASE_STARS_H
+#define TITANIC_BASE_STARS_H
 
 #include "titanic/support/simple_file.h"
 #include "titanic/star_control/frange.h"
@@ -32,7 +32,7 @@ namespace Titanic {
 
 enum StarMode { MODE_STARFIELD = 0, MODE_PHOTO = 1 };
 
-class CStarControlSub12;
+class CStarCamera;
 
 struct CBaseStarEntry {
 	byte _red;
@@ -68,10 +68,10 @@ struct CStarPosition : public Common::Point {
  */
 class CBaseStars {
 private:
-	void draw1(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarCloseup *closeup);
-	void draw2(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarCloseup *closeup);
-	void draw3(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarCloseup *closeup);
-	void draw4(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarCloseup *closeup);
+	void draw1(CSurfaceArea *surfaceArea, CStarCamera *camera, CStarCloseup *closeup);
+	void draw2(CSurfaceArea *surfaceArea, CStarCamera *camera, CStarCloseup *closeup);
+	void draw3(CSurfaceArea *surfaceArea, CStarCamera *camera, CStarCloseup *closeup);
+	void draw4(CSurfaceArea *surfaceArea, CStarCamera *camera, CStarCloseup *closeup);
 protected:
 	FRange _minMax;
 	double _minVal;
@@ -103,14 +103,14 @@ public:
 	/**
 	 * Draw the item
 	 */
-	virtual void draw(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarCloseup *closeup);
+	virtual void draw(CSurfaceArea *surfaceArea, CStarCamera *camera, CStarCloseup *closeup);
 
 	virtual bool loadYale(int v1) { return true; }
 
 	/**
 	 * Selects a star
 	 */
-	virtual bool selectStar(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12,
+	virtual bool selectStar(CSurfaceArea *surfaceArea, CStarCamera *camera,
 		const Common::Point &pt, void *handler = nullptr) { return false; }
 
 	/**
@@ -144,18 +144,18 @@ public:
 	 */
 	const CBaseStarEntry *getDataPtr(int index) const;
 
-	int baseFn1(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12,
+	int baseFn1(CSurfaceArea *surfaceArea, CStarCamera *camera,
 		const Common::Point &pt);
 
-	int baseFn2(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12);
+	int baseFn2(CSurfaceArea *surfaceArea, CStarCamera *camera);
 };
 
 class CStarVector {
 private:
-	CStarControlSub12 *_owner;
+	CStarCamera *_owner;
 	FVector _vector;
 public:
-	CStarVector(CStarControlSub12 *owner, const FVector &v) : _owner(owner), _vector(v) {}
+	CStarVector(CStarCamera *owner, const FVector &v) : _owner(owner), _vector(v) {}
 
 	/**
 	 * Applies the saved vector
@@ -165,4 +165,4 @@ public:
 
 } // End of namespace Titanic
 
-#endif /* TITANIC_STAR_CONTROL_SUB3_H */
+#endif /* TITANIC_BASE_STARS_H */
diff --git a/engines/titanic/star_control/star_camera.cpp b/engines/titanic/star_control/star_camera.cpp
new file mode 100644
index 0000000..2ccf2e3
--- /dev/null
+++ b/engines/titanic/star_control/star_camera.cpp
@@ -0,0 +1,606 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "titanic/star_control/star_camera.h"
+#include "titanic/star_control/star_control_sub21.h"
+#include "titanic/star_control/star_control_sub22.h"
+#include "titanic/star_control/dmatrix.h"
+#include "titanic/star_control/fmatrix.h"
+#include "titanic/titanic.h"
+
+namespace Titanic {
+
+FMatrix *CStarCamera::_matrix1;
+FMatrix *CStarCamera::_matrix2;
+
+CStarCamera::CStarCamera(const CStar20Data *data) :
+		_matrixRow(-1), _handlerP(nullptr), _field108(0) {
+	setupHandler(data);
+}
+
+CStarCamera::CStarCamera(CStarControlSub13 *src) :
+		_matrixRow(-1), _handlerP(nullptr), _field108(0), _sub13(src) {
+}
+
+void CStarCamera::init() {
+	_matrix1 = nullptr;
+	_matrix2 = nullptr;
+}
+
+void CStarCamera::deinit() {
+	delete _matrix1;
+	delete _matrix2;
+	_matrix1 = nullptr;
+	_matrix2 = nullptr;
+}
+
+CStarCamera::~CStarCamera() {
+	deleteHandler();
+}
+
+void CStarCamera::proc2(const CStarControlSub13 *src) {
+	_sub13.copyFrom(src);
+}
+
+void CStarCamera::proc3(const CStar20Data *src) {
+	_handlerP->copyFrom(src);
+}
+
+void CStarCamera::setPosition(const FVector &v) {
+	if (!isLocked()) {
+		_sub13.setPosition(v);
+		set108();
+	}
+}
+
+void CStarCamera::proc5(const FVector &v) {
+	if (!isLocked())
+		_sub13.fn11(v);
+}
+
+void CStarCamera::proc6(int v) {
+	if (!isLocked())
+		_sub13.setC(v);
+}
+
+void CStarCamera::proc7(int v) {
+	if (!isLocked())
+		_sub13.set10(v);
+}
+
+void CStarCamera::proc8(int v) {
+	if (!isLocked())
+		_sub13.set14(v);
+}
+
+void CStarCamera::proc9(int v) {
+	if (!isLocked())
+		_sub13.set18(v);
+}
+
+void CStarCamera::proc10(int v) {
+	if (!isLocked())
+		_sub13.set1C(v);
+}
+
+void CStarCamera::proc11() {
+	if (!isLocked())
+		_sub13.fn12();
+}
+
+void CStarCamera::proc12(StarMode mode, double v2) {
+	if (!isLocked())
+		_sub13.fn13(mode, v2);
+}
+
+void CStarCamera::proc13(CStarControlSub13 *dest) {
+	*dest = _sub13;
+}
+
+void CStarCamera::proc14(FVector &v) {
+	FMatrix matrix = _sub13.getMatrix();
+	FVector vector = _sub13._position;
+
+	_handlerP->proc9(vector, v, matrix);
+}
+
+void CStarCamera::proc15(CErrorCode *errorCode) {
+	if (!_matrix1)
+		_matrix1 = new FMatrix();
+	if (!_matrix2)
+		_matrix2 = new FMatrix();
+
+	*_matrix1 = _sub13.getMatrix();
+	*_matrix2 = *_matrix1;
+
+	FVector v1 = _sub13._position;
+	FVector v2 = _sub13._position;
+	_handlerP->proc11(*errorCode, v2, *_matrix2);
+
+	if (v1 != v2) {
+		_sub13.setPosition(v2);
+		set108();
+	}
+
+	if (*_matrix1 != *_matrix2) {
+		_sub13.setMatrix(*_matrix2);
+	}
+}
+
+void CStarCamera::proc16() {
+	_handlerP->proc4();
+}
+
+void CStarCamera::proc17() {
+	_handlerP->proc5();
+}
+
+void CStarCamera::proc18() {
+	_handlerP->proc6();
+}
+
+void CStarCamera::proc19() {
+	_handlerP->proc7();
+}
+
+void CStarCamera::proc20(double factor) {
+	if (!isLocked())
+		_sub13.reposition(factor);
+}
+
+void CStarCamera::proc21(const FPose &pose) {
+	if (!isLocked()) {
+		_sub13.setPosition(pose);
+		set108();
+	}
+}
+
+void CStarCamera::proc22(FMatrix &m) {
+	if (!isLocked())
+		_sub13.fn15(m);
+}
+
+FPose CStarCamera::proc23() {
+	return _sub13.getSub1();
+}
+
+FPose CStarCamera::proc24() {
+	return _sub13.getSub2();
+}
+
+double CStarCamera::proc25() const {
+	return _sub13._field10;
+}
+
+double CStarCamera::proc26() const {
+	return _sub13._field14;
+}
+
+int CStarCamera::proc27() const {
+	return _sub13._field24;
+}
+
+FVector CStarCamera::proc28(int index, const FVector &src) {
+	FVector dest;
+	dest._x = ((_sub13._valArray[index] + src._x) * _sub13._centerVector._x)
+		/ (_sub13._centerVector._y * src._z);
+	dest._y = src._y * _sub13._centerVector._x / (_sub13._centerVector._z * src._z);
+	dest._z = src._z;
+	return dest;
+}
+
+FVector CStarCamera::proc29(int index, const FVector &src) {
+	return _sub13.fn16(index, src);
+}
+
+FVector CStarCamera::proc30(int index, const FVector &v) {
+	return _sub13.fn17(index, v);
+}
+
+FVector CStarCamera::proc31(int index, const FVector &v) {
+	return _sub13.fn18(index, v);
+}
+
+void CStarCamera::setViewportPosition(const FPoint &angles) {
+	debug(DEBUG_INTERMEDIATE, "setViewportPosition %f %f", angles._x, angles._y);
+
+	if (isLocked())
+		return;
+
+	if (_matrixRow == -1) {
+		FPose subX(X_AXIS, angles._y);
+		FPose subY(Y_AXIS, angles._x);
+		FPose sub(subX, subY);
+		proc22(sub);
+	} else if (_matrixRow == 0) {
+		FVector row1 = _matrix._row1;
+		FPose subX(X_AXIS, angles._y);
+		FPose subY(Y_AXIS, angles._x);
+		FPose sub(subX, subY);
+
+		FMatrix m1 = _sub13.getMatrix();
+		FVector tempV1 = _sub13._position;
+		FVector tempV2, tempV3, tempV4, tempV5, tempV6;
+		tempV2._y = m1._row1._y * 100000.0;
+		tempV2._z = m1._row1._z * 100000.0;
+		tempV3._x = m1._row1._x * 100000.0 + tempV1._x;
+		tempV4._x = tempV3._x;
+		tempV3._y = tempV2._y + tempV1._y;
+		tempV4._y = tempV3._y;
+		tempV3._z = tempV2._z + tempV1._z;
+		tempV4._z = tempV3._z;
+		tempV2._x = m1._row2._x * 100000.0;
+		tempV2._y = m1._row2._y * 100000.0;
+		tempV2._z = m1._row2._z * 100000.0;
+		tempV2._x = m1._row3._x * 100000.0;
+		tempV2._y = m1._row3._y * 100000.0;
+		tempV2._z = m1._row3._z * 100000.0;
+		tempV2._x = tempV2._x + tempV1._x;
+		tempV2._y = tempV2._y + tempV1._y;
+		tempV2._z = tempV2._z + tempV1._z;
+		tempV3._x = tempV2._x + tempV1._x;
+		tempV3._y = tempV2._y + tempV1._y;
+		tempV5._x = tempV2._x;
+		tempV5._y = tempV2._y;
+		tempV3._z = tempV2._z + tempV1._z;
+		tempV5._z = tempV2._z;
+		tempV6._x = tempV3._x;
+		tempV6._y = tempV3._y;
+		tempV6._z = tempV3._z;
+		tempV1._x = tempV1._x - row1._x;
+		tempV1._y = tempV1._y - row1._y;
+		tempV1._z = tempV1._z - row1._z;
+		tempV4._x = tempV3._x - row1._x;
+		tempV4._y = tempV4._y - row1._y;
+		tempV4._z = tempV4._z - row1._z;
+		tempV5._x = tempV2._x - row1._x;
+
+		tempV5._y = tempV5._y - row1._y;
+		tempV5._z = tempV5._z - row1._z;
+		tempV6._x = tempV3._x - row1._x;
+		tempV6._y = tempV6._y - row1._y;
+		tempV6._z = tempV6._z - row1._z;
+
+		FVector modV1 = tempV1.fn5(sub);
+		FVector modV2 = tempV4.fn5(sub);
+		FVector modV3 = tempV5.fn5(sub);
+		FVector modV4 = tempV6.fn5(sub);
+		tempV1 = modV1;
+		tempV4 = modV2;
+		tempV5 = modV3;
+		tempV4 = modV4;
+
+		tempV2._x = tempV4._x - tempV1._x;
+		tempV2._y = tempV4._y - tempV1._y;
+		tempV2._z = tempV4._z - tempV1._z;
+		tempV4._x = tempV2._x;
+		tempV4._y = tempV2._y;
+		tempV2._x = tempV5._x - tempV1._x;
+		tempV4._z = tempV2._z;
+		tempV5._x = tempV2._x;
+		tempV2._y = tempV5._y - tempV1._y;
+		tempV5._y = tempV2._y;
+		tempV2._z = tempV5._z - tempV1._z;
+		tempV5._z = tempV2._z;
+		tempV2._x = tempV6._x - tempV1._x;
+		tempV2._y = tempV6._y - tempV1._y;
+		tempV2._z = tempV6._z - tempV1._z;
+		tempV6 = tempV2;
+
+		tempV4.normalize();
+		tempV5.normalize();
+		tempV6.normalize();
+		tempV1 += row1;
+
+		m1.set(tempV4, tempV5, tempV6);
+		_sub13.setMatrix(m1);
+		_sub13.setPosition(tempV1);
+	} else if (_matrixRow == 1) {
+		FVector tempV2;
+		DMatrix m1, m2, sub;
+		DVector mrow1, mrow2, mrow3;
+		DVector tempV1, diffV, multV, multV2, tempV3, tempV4, tempV5, tempV6, tempV7;
+		DVector tempV8, tempV9, tempV10, tempV11, tempV12;
+		DVector tempV13, tempV14, tempV15, tempV16;
+
+		DMatrix subX(0, _matrix._row1);
+		DMatrix subY(Y_AXIS, angles._y);
+
+		tempV1 = _matrix._row2 - _matrix._row1;
+		diffV = tempV1;
+		m1 = diffV.fn5();
+		m1 = m1.fn4(subX);
+		subX = m1.fn1();
+		subX = subX.fn4(subY);
+
+		FMatrix m3 = _sub13.getMatrix();
+		tempV2 = _sub13._position;
+		multV._x = m3._row1._x * 1000000.0;
+		multV._y = m3._row1._y * 1000000.0;
+		multV._z = m3._row1._z * 1000000.0;
+		tempV3._x = tempV2._x;
+		tempV3._y = tempV2._y;
+		tempV3._z = tempV2._z;
+		multV2._z = m3._row2._z * 1000000.0;
+
+		tempV1._x = multV._x + tempV3._x;
+		tempV1._y = multV._y + tempV3._y;
+		tempV1._z = multV._z + tempV3._z;
+		mrow3._z = 0.0;
+		mrow3._y = 0.0;
+		mrow3._x = 0.0;
+		multV2._x = m3._row2._x * 1000000.0;
+		multV2._y = m3._row2._y * 1000000.0;
+		mrow1 = tempV1;
+		multV = multV2 + tempV3;
+		mrow2 = multV;
+
+		tempV7._z = m3._row3._z * 1000000.0 + tempV3._z;
+		tempV7._y = m3._row3._y * 1000000.0 + tempV3._y;
+		tempV7._x = m3._row3._x * 1000000.0 + tempV3._x;
+
+		mrow3 = tempV8;
+		DVector *v = tempV3.fn1(tempV9, subX);
+		tempV3 = *v;
+		v = mrow1.fn1(tempV10, subX);
+		mrow1 = *v;
+		v = mrow2.fn1(tempV11, subX);
+		mrow2 = *v;
+		v = mrow3.fn1(tempV12, subX);
+		mrow3 = *v;
+
+		v = tempV3.fn1(tempV13, m1);
+		tempV3 = *v;
+		v = mrow1.fn1(tempV14, m1);
+		mrow1 = *v;
+		v = mrow2.fn1(tempV15, m1);
+		mrow2 = *v;
+		v = mrow3.fn1(tempV16, m1);
+		mrow3 = *v;
+
+		mrow1 -= tempV3;
+		mrow2 -= tempV3;
+		mrow3 -= tempV3;
+		mrow1.normalize();
+		mrow2.normalize();
+		mrow3.normalize();
+		tempV16 = tempV3;
+
+		m3.set(mrow1, mrow2, mrow3);
+		_sub13.setMatrix(m3);
+		_sub13.setPosition(tempV16);
+	}
+}
+
+bool CStarCamera::addMatrixRow(const FVector &v) {
+	if (_matrixRow >= 2)
+		return false;
+
+	CStar20Data data;
+	_handlerP->copyTo(&data);
+	deleteHandler();
+
+	FVector &row = _matrix[++_matrixRow];
+	row = v;
+	setupHandler(&data);
+	return true;
+}
+
+bool CStarCamera::removeMatrixRow() {
+	if (_matrixRow == -1)
+		return false;
+
+	CStar20Data data;
+	_handlerP->copyTo(&data);
+	deleteHandler();
+
+	--_matrixRow;
+	setupHandler(&data);
+	return true;
+}
+
+void CStarCamera::proc36(double *v1, double *v2, double *v3, double *v4) {
+	_sub13.fn19(v1, v2, v3, v4);
+}
+
+void CStarCamera::load(SimpleFile *file, int param) {
+	_sub13.load(file, param);
+}
+
+void CStarCamera::save(SimpleFile *file, int indent) {
+	_sub13.save(file, indent);
+}
+
+bool CStarCamera::setupHandler(const CStar20Data *src) {
+	CStarControlSub20 *handler = nullptr;
+
+	switch (_matrixRow) {
+	case -1:
+		handler = new CStarControlSub21(src);
+		break;
+
+	case 0:
+	case 1:
+	case 2:
+		handler = new CStarControlSub22(src);
+		break;
+
+	default:
+		break;
+	}
+
+	if (handler) {
+		assert(!_handlerP);
+		_handlerP = handler;
+		return true;
+	}
+	else {
+		return false;
+	}
+}
+
+void CStarCamera::deleteHandler() {
+	if (_handlerP) {
+		delete _handlerP;
+		_handlerP = nullptr;
+	}
+}
+
+void CStarCamera::fn1(CStarControlSub13 *sub13, const FVector &v) {
+	if (_matrixRow == 1) {
+		FMatrix m1 = sub13->getMatrix();
+		FMatrix m2 = _sub13.getMatrix();
+		FVector v1 = sub13->_position;
+		FVector v2 = _sub13._position;
+
+		_handlerP->proc8(v2, v1, m2, m1);
+		CStarVector *sv = new CStarVector(this, v);
+		_handlerP->setVector(sv);
+	}
+}
+
+void CStarCamera::fn2(FVector v1, FVector v2, FVector v3) {
+	if (_matrixRow == -1) {
+		FVector tempV;
+		tempV._z = _sub13._field10;
+		v3._z = v1._z;
+		tempV._x = _sub13._centerVector._z * v1._y * v1._z / _sub13._centerVector._x;
+		v3._y = _sub13._centerVector._y * tempV._z * v3._x / _sub13._centerVector._x;
+		v3._x = _sub13._centerVector._y * v1._x * v1._z / _sub13._centerVector._x - _sub13._valArray[2];
+		tempV._y = _sub13._centerVector._z * tempV._z * v3._y / _sub13._centerVector._x;
+		tempV._x = tempV._x - _sub13._valArray[2];
+
+		v3.normalize();
+		tempV.normalize();
+
+		FMatrix matrix = _sub13.getMatrix();
+		const FVector &pos = _sub13._position;
+		_handlerP->proc10(v3, tempV, pos, matrix);
+
+		CStarVector *sv = new CStarVector(this, v2);
+		_handlerP->setVector(sv);
+	}
+}
+
+void CStarCamera::fn3(CStarControlSub13 *sub13, const FVector &v) {
+	if (_matrixRow != 0)
+		return;
+
+	DMatrix m1;
+	DVector tempV1 = _matrix._row1;
+	DMatrix m2(0, tempV1);
+
+	tempV1 = v - _matrix._row1;
+	m1 = tempV1.fn5();
+
+	m1 = m1.fn4(m2);
+	m2 = m1.fn1();
+
+	DVector tempV2 = _sub13._position;
+	DMatrix m4;
+	m4._row1 = sub13->_position;
+	m4._row2 = DVector(0.0, 0.0, 0.0);
+	m4._row3 = DVector(0.0, 0.0, 0.0);
+	m4._row4 = DVector(0.0, 0.0, 0.0);
+
+	FMatrix m5 = sub13->getMatrix();
+	DVector tempV3, tempV4;
+	tempV4._x = m5._row1._x * 1000000.0 + m4._row1._x;
+	tempV4._y = m5._row1._y * 1000000.0 + m4._row1._y;
+	tempV4._z = m5._row1._z * 1000000.0 + m4._row1._z;
+	tempV3._x = m5._row2._x * 1000000.0 + m4._row1._x;
+	tempV3._y = m5._row2._y * 1000000.0 + m4._row1._y;
+	tempV3._z = m5._row2._z * 1000000.0 + m4._row1._z;
+	m4._row3 = tempV4;
+	m4._row2 = tempV3;
+
+	tempV4._x = m5._row3._x * 1000000.0;
+	tempV4._y = m5._row3._y * 1000000.0;
+	tempV3._x = tempV4._x + m4._row1._x;
+	tempV3._y = tempV4._y + m4._row1._y;
+	tempV3._z = m5._row3._z * 1000000.0 + m4._row1._z;
+	m4._row4 = tempV3;
+
+	DVector *dv = tempV2.fn1(tempV3, m2);
+	tempV3 = *dv;
+	dv = m4._row1.fn1(tempV3, m2);
+	m4._row1 = *dv;
+	dv = m4._row3.fn1(tempV3, m2);
+	m4._row3 = *dv;
+	dv = m4._row2.fn1(tempV3, m2);
+	m4._row2 = *dv;
+	dv = m4._row4.fn1(tempV3, m2);
+	m4._row4 = *dv;
+
+	// Find the angle that gives the minimum distance
+	DVector tempV5;
+	double minDistance = 1.0e20;
+	int minDegree = 0;
+	for (int degree = 0; degree < 360; ++degree) {
+		tempV5 = m4._row1;
+		tempV5.fn2((double)degree);
+		double distance = tempV2.getDistance(tempV5);
+
+		if (distance < minDistance) {
+			minDistance = distance;
+			minDegree = degree;
+		}
+	}
+
+	m4._row1.fn2((double)minDegree);
+	m4._row2.fn2((double)minDegree);
+	m4._row3.fn2((double)minDegree);
+	m4._row4.fn2((double)minDegree);
+	dv = m4._row1.fn1(tempV3, m1);
+	m4._row1 = *dv;
+	dv = m4._row3.fn1(tempV3, m1);
+	m4._row3 = *dv;
+	dv = m4._row2.fn1(tempV3, m1);
+	m4._row2 = *dv;
+	dv = m4._row4.fn1(tempV3, m1);
+	m4._row4 = *dv;
+
+	m4._row3._x -= m4._row1._x;
+	m4._row3._y -= m4._row1._y;
+	m4._row3._z -= m4._row1._z;
+	m4._row2._x -= m4._row1._x;
+	m4._row2._y -= m4._row1._y;
+	m4._row2._z = m4._row2._z - m4._row1._z;
+
+	m4._row4._x = m4._row4._x - m4._row1._x;
+	m4._row4._y = m4._row4._y - m4._row1._y;
+	m4._row4._z = m4._row4._z - m4._row1._z;
+
+	m4._row3.normalize();
+	m4._row2.normalize();
+	m4._row4.normalize();
+	m5.set(m4._row3, m4._row2, m4._row4);
+
+	FVector tempV6 = m4._row1;
+	FMatrix m6 = _sub13.getMatrix();
+	_handlerP->proc8(_sub13._position, tempV6, m6, m5);
+
+	CStarVector *sv = new CStarVector(this, v);
+	_handlerP->setVector(sv);
+}
+
+} // End of namespace Titanic
diff --git a/engines/titanic/star_control/star_camera.h b/engines/titanic/star_control/star_camera.h
new file mode 100644
index 0000000..ecc185c
--- /dev/null
+++ b/engines/titanic/star_control/star_camera.h
@@ -0,0 +1,132 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef TITANIC_STAR_CAMERA_H
+#define TITANIC_STAR_CAMERA_H
+
+#include "titanic/support/simple_file.h"
+#include "titanic/star_control/fmatrix.h"
+#include "titanic/star_control/fpoint.h"
+#include "titanic/star_control/base_stars.h"
+#include "titanic/star_control/star_control_sub13.h"
+#include "titanic/star_control/star_control_sub20.h"
+#include "titanic/star_control/error_code.h"
+
+namespace Titanic {
+
+class CStarCamera {
+private:
+	static FMatrix *_matrix1;
+	static FMatrix *_matrix2;
+private:
+	int _matrixRow;
+	FMatrix _matrix;
+	CStarControlSub20 *_handlerP;
+	CStarControlSub13 _sub13;
+	int _field108;
+private:
+	/**
+	 * Set up a handler
+	 */
+	bool setupHandler(const CStar20Data *src);
+
+	/**
+	 * Deletes any previous handler
+	 */
+	void deleteHandler();
+
+	/**
+	 * Return whether the handler is locked
+	 */
+	bool isLocked() { return _handlerP->isLocked(); }
+public:
+	static void init();
+	static void deinit();
+public:
+	CStarCamera(const CStar20Data *data);
+	CStarCamera(CStarControlSub13 *src);
+	virtual ~CStarCamera();
+
+	virtual void proc2(const CStarControlSub13 *src);
+	virtual void proc3(const CStar20Data *src);
+	virtual void setPosition(const FVector &v);
+	virtual void proc5(const FVector &v);
+	virtual void proc6(int v);
+	virtual void proc7(int v);
+	virtual void proc8(int v);
+	virtual void proc9(int v);
+	virtual void proc10(int v);
+	virtual void proc11();
+	virtual void proc12(StarMode mode, double v2);
+	virtual void proc13(CStarControlSub13 *dest);
+	virtual void proc14(FVector &v);
+	virtual void proc15(CErrorCode *errorCode);
+	virtual void proc16();
+	virtual void proc17();
+	virtual void proc18();
+	virtual void proc19();
+	virtual void proc20(double factor);
+	virtual void proc21(const FPose &pose);
+	virtual void proc22(FMatrix &m);
+	virtual FPose proc23();
+	virtual FPose proc24();
+	virtual double proc25() const;
+	virtual double proc26() const;
+	virtual int proc27() const;
+	virtual FVector proc28(int index, const FVector &src);
+	virtual FVector proc29(int index, const FVector &src);
+	virtual FVector proc30(int index, const FVector &v);
+	virtual FVector proc31(int index, const FVector &v);
+
+	/**
+	 * Sets the viewport position within the starfield
+	 */
+	virtual void setViewportPosition(const FPoint &angles);
+
+	virtual int getMatrixRow() const { return _matrixRow; }
+	virtual bool addMatrixRow(const FVector &v);
+	virtual bool removeMatrixRow();
+	virtual void proc36(double *v1, double *v2, double *v3, double *v4);
+
+	/**
+	 * Load the data for the class from file
+	 */
+	virtual void load(SimpleFile *file, int param);
+
+	/**
+	 * Save the data for the class to file
+	 */
+	virtual void save(SimpleFile *file, int indent);
+
+
+	bool is108() const { return _field108; }
+	void set108() { _field108 = true; }
+	void reset108() { _field108 = false; }
+
+	void fn1(CStarControlSub13 *sub13, const FVector &v);
+	void fn2(FVector v1, FVector v2, FVector v3);
+	void fn3(CStarControlSub13 *sub13, const FVector &v);
+};
+
+} // End of namespace Titanic
+
+#endif /* TITANIC_STAR_CAMERA_H */
diff --git a/engines/titanic/star_control/star_closeup.cpp b/engines/titanic/star_control/star_closeup.cpp
index 9128c2d..c74a916 100644
--- a/engines/titanic/star_control/star_closeup.cpp
+++ b/engines/titanic/star_control/star_closeup.cpp
@@ -21,7 +21,7 @@
  */
 
 #include "titanic/star_control/star_closeup.h"
-#include "titanic/star_control/star_control_sub12.h"
+#include "titanic/star_control/star_camera.h"
 #include "titanic/titanic.h"
 
 namespace Titanic {
@@ -190,10 +190,10 @@ bool CStarCloseup::setup2(int val1, int val2) {
 }
 
 void CStarCloseup::draw(const FPose &pose, const FVector &vector, const FVector &vector2,
-		CSurfaceArea *surfaceArea, CStarControlSub12 *sub12) {
+		CSurfaceArea *surfaceArea, CStarCamera *camera) {
 	const int VALUES[] = { 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4 };
-	double val1 = sub12->proc25();
-	int val2 = sub12->proc27();
+	double val1 = camera->proc25();
+	int val2 = camera->proc27();
 	if (!_flag)
 		return;
 
@@ -318,7 +318,7 @@ void CStarCloseup::draw(const FPose &pose, const FVector &vector, const FVector
 
 				for (int ctr2 = 0; ctr2 < size2; ++ctr2) {
 					GridEntry &gridEntry = _grid[ctr2];
-					tempV = sub12->proc28(2, gridEntry);
+					tempV = camera->proc28(2, gridEntry);
 					gridEntry._position._x = tempV._x;
 					gridEntry._position._y = tempV._y + vector2._y;
 				}
@@ -340,7 +340,7 @@ void CStarCloseup::draw(const FPose &pose, const FVector &vector, const FVector
 
 				for (int ctr2 = 0; ctr2 < size2; ++ctr2) {
 					GridEntry &gridEntry = _grid[ctr2];
-					tempV = sub12->proc28(0, gridEntry);
+					tempV = camera->proc28(0, gridEntry);
 					gridEntry._position._x = tempV._x + vector2._x;
 					gridEntry._position._y = tempV._y + vector2._y;
 				}
@@ -362,7 +362,7 @@ void CStarCloseup::draw(const FPose &pose, const FVector &vector, const FVector
 
 				for (int ctr2 = 0; ctr2 < size2; ++ctr2) {
 					GridEntry &gridEntry = _grid[ctr2];
-					tempV = sub12->proc28(1, gridEntry);
+					tempV = camera->proc28(1, gridEntry);
 					gridEntry._position._x = tempV._x + vector2._x;
 					gridEntry._position._y = tempV._y + vector2._y;
 				}
@@ -432,7 +432,7 @@ void CStarCloseup::draw(const FPose &pose, const FVector &vector, const FVector
 
 		for (uint ctr = 0; ctr < entry._data2.size(); ++ctr) {
 			GridEntry &gridEntry = _grid[ctr];
-			tempV = sub12->proc28(2, gridEntry);
+			tempV = camera->proc28(2, gridEntry);
 			gridEntry._position._x = tempV._x + vector2._x;
 			gridEntry._position._y = tempV._y + vector2._y;
 		}
@@ -454,7 +454,7 @@ void CStarCloseup::draw(const FPose &pose, const FVector &vector, const FVector
 
 		for (uint ctr = 0; ctr < entry._data2.size(); ++ctr) {
 			GridEntry &gridEntry = _grid[ctr];
-			tempV = sub12->proc28(2, gridEntry);
+			tempV = camera->proc28(2, gridEntry);
 			gridEntry._position._x = tempV._x + vector2._x;
 			gridEntry._position._y = tempV._y + vector2._y;
 		}
@@ -476,7 +476,7 @@ void CStarCloseup::draw(const FPose &pose, const FVector &vector, const FVector
 
 		for (uint ctr = 0; ctr < entry._data2.size(); ++ctr) {
 			GridEntry &gridEntry = _grid[ctr];
-			tempV = sub12->proc28(2, gridEntry);
+			tempV = camera->proc28(2, gridEntry);
 			gridEntry._position._x = tempV._x + vector2._x;
 			gridEntry._position._y = tempV._y + vector2._y;
 		}
diff --git a/engines/titanic/star_control/star_closeup.h b/engines/titanic/star_control/star_closeup.h
index 3f4541f..d07b17b 100644
--- a/engines/titanic/star_control/star_closeup.h
+++ b/engines/titanic/star_control/star_closeup.h
@@ -31,7 +31,7 @@
 
 namespace Titanic {
 
-class CStarControlSub12;
+class CStarCamera;
 
 /**
  * Handles drawing a 3D rendered closeup of a star
@@ -124,7 +124,7 @@ public:
 	 * Draws the star globe
 	 */
 	virtual void draw(const FPose &pose, const FVector &vector, const FVector &vector2,
-		CSurfaceArea *surfaceArea, CStarControlSub12 *sub12);
+		CSurfaceArea *surfaceArea, CStarCamera *camera);
 
 	virtual void proc3(CErrorCode *errorCode);
 
diff --git a/engines/titanic/star_control/star_control.cpp b/engines/titanic/star_control/star_control.cpp
index fd007d3..045dc03 100644
--- a/engines/titanic/star_control/star_control.cpp
+++ b/engines/titanic/star_control/star_control.cpp
@@ -26,7 +26,7 @@
 #include "titanic/star_control/dmatrix.h"
 #include "titanic/star_control/error_code.h"
 #include "titanic/star_control/fpose.h"
-#include "titanic/star_control/star_control_sub12.h"
+#include "titanic/star_control/star_camera.h"
 #include "titanic/game_manager.h"
 #include "titanic/core/dont_save_file_item.h"
 #include "titanic/core/project_item.h"
@@ -43,12 +43,12 @@ END_MESSAGE_MAP()
 
 CStarControl::CStarControl() : _enabled(false), _petControl(nullptr),
 		_starRect(20, 10, 620, 350) {
-	CStarControlSub12::init();
+	CStarCamera::init();
 	DMatrix::init();
 }
 
 CStarControl::~CStarControl() {
-	CStarControlSub12::deinit();
+	CStarCamera::deinit();
 	DMatrix::deinit();
 }
 
diff --git a/engines/titanic/star_control/star_control_sub12.cpp b/engines/titanic/star_control/star_control_sub12.cpp
deleted file mode 100644
index 8893902..0000000
--- a/engines/titanic/star_control/star_control_sub12.cpp
+++ /dev/null
@@ -1,606 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include "titanic/star_control/star_control_sub12.h"
-#include "titanic/star_control/star_control_sub21.h"
-#include "titanic/star_control/star_control_sub22.h"
-#include "titanic/star_control/dmatrix.h"
-#include "titanic/star_control/fmatrix.h"
-#include "titanic/titanic.h"
-
-namespace Titanic {
-
-FMatrix *CStarControlSub12::_matrix1;
-FMatrix *CStarControlSub12::_matrix2;
-
-CStarControlSub12::CStarControlSub12(const CStar20Data *data) :
-		_matrixRow(-1), _handlerP(nullptr), _field108(0) {
-	setupHandler(data);
-}
-
-CStarControlSub12::CStarControlSub12(CStarControlSub13 *src) :
-		_matrixRow(-1), _handlerP(nullptr), _field108(0), _sub13(src) {
-}
-
-void CStarControlSub12::init() {
-	_matrix1 = nullptr;
-	_matrix2 = nullptr;
-}
-
-void CStarControlSub12::deinit() {
-	delete _matrix1;
-	delete _matrix2;
-	_matrix1 = nullptr;
-	_matrix2 = nullptr;
-}
-
-CStarControlSub12::~CStarControlSub12() {
-	deleteHandler();
-}
-
-void CStarControlSub12::proc2(const CStarControlSub13 *src) {
-	_sub13.copyFrom(src);
-}
-
-void CStarControlSub12::proc3(const CStar20Data *src) {
-	_handlerP->copyFrom(src);
-}
-
-void CStarControlSub12::setPosition(const FVector &v) {
-	if (!isLocked()) {
-		_sub13.setPosition(v);
-		set108();
-	}
-}
-
-void CStarControlSub12::proc5(const FVector &v) {
-	if (!isLocked())
-		_sub13.fn11(v);
-}
-
-void CStarControlSub12::proc6(int v) {
-	if (!isLocked())
-		_sub13.setC(v);
-}
-
-void CStarControlSub12::proc7(int v) {
-	if (!isLocked())
-		_sub13.set10(v);
-}
-
-void CStarControlSub12::proc8(int v) {
-	if (!isLocked())
-		_sub13.set14(v);
-}
-
-void CStarControlSub12::proc9(int v) {
-	if (!isLocked())
-		_sub13.set18(v);
-}
-
-void CStarControlSub12::proc10(int v) {
-	if (!isLocked())
-		_sub13.set1C(v);
-}
-
-void CStarControlSub12::proc11() {
-	if (!isLocked())
-		_sub13.fn12();
-}
-
-void CStarControlSub12::proc12(StarMode mode, double v2) {
-	if (!isLocked())
-		_sub13.fn13(mode, v2);
-}
-
-void CStarControlSub12::proc13(CStarControlSub13 *dest) {
-	*dest = _sub13;
-}
-
-void CStarControlSub12::proc14(FVector &v) {
-	FMatrix matrix = _sub13.getMatrix();
-	FVector vector = _sub13._position;
-
-	_handlerP->proc9(vector, v, matrix);
-}
-
-void CStarControlSub12::proc15(CErrorCode *errorCode) {
-	if (!_matrix1)
-		_matrix1 = new FMatrix();
-	if (!_matrix2)
-		_matrix2 = new FMatrix();
-
-	*_matrix1 = _sub13.getMatrix();
-	*_matrix2 = *_matrix1;
-
-	FVector v1 = _sub13._position;
-	FVector v2 = _sub13._position;
-	_handlerP->proc11(*errorCode, v2, *_matrix2);
-
-	if (v1 != v2) {
-		_sub13.setPosition(v2);
-		set108();
-	}
-
-	if (*_matrix1 != *_matrix2) {
-		_sub13.setMatrix(*_matrix2);
-	}
-}
-
-void CStarControlSub12::proc16() {
-	_handlerP->proc4();
-}
-
-void CStarControlSub12::proc17() {
-	_handlerP->proc5();
-}
-
-void CStarControlSub12::proc18() {
-	_handlerP->proc6();
-}
-
-void CStarControlSub12::proc19() {
-	_handlerP->proc7();
-}
-
-void CStarControlSub12::proc20(double factor) {
-	if (!isLocked())
-		_sub13.reposition(factor);
-}
-
-void CStarControlSub12::proc21(const FPose &pose) {
-	if (!isLocked()) {
-		_sub13.setPosition(pose);
-		set108();
-	}
-}
-
-void CStarControlSub12::proc22(FMatrix &m) {
-	if (!isLocked())
-		_sub13.fn15(m);
-}
-
-FPose CStarControlSub12::proc23() {
-	return _sub13.getSub1();
-}
-
-FPose CStarControlSub12::proc24() {
-	return _sub13.getSub2();
-}
-
-double CStarControlSub12::proc25() const {
-	return _sub13._field10;
-}
-
-double CStarControlSub12::proc26() const {
-	return _sub13._field14;
-}
-
-int CStarControlSub12::proc27() const {
-	return _sub13._field24;
-}
-
-FVector CStarControlSub12::proc28(int index, const FVector &src) {
-	FVector dest;
-	dest._x = ((_sub13._valArray[index] + src._x) * _sub13._centerVector._x)
-		/ (_sub13._centerVector._y * src._z);
-	dest._y = src._y * _sub13._centerVector._x / (_sub13._centerVector._z * src._z);
-	dest._z = src._z;
-	return dest;
-}
-
-FVector CStarControlSub12::proc29(int index, const FVector &src) {
-	return _sub13.fn16(index, src);
-}
-
-FVector CStarControlSub12::proc30(int index, const FVector &v) {
-	return _sub13.fn17(index, v);
-}
-
-FVector CStarControlSub12::proc31(int index, const FVector &v) {
-	return _sub13.fn18(index, v);
-}
-
-void CStarControlSub12::setViewportPosition(const FPoint &angles) {
-	debug(DEBUG_INTERMEDIATE, "setViewportPosition %f %f", angles._x, angles._y);
-
-	if (isLocked())
-		return;
-
-	if (_matrixRow == -1) {
-		FPose subX(X_AXIS, angles._y);
-		FPose subY(Y_AXIS, angles._x);
-		FPose sub(subX, subY);
-		proc22(sub);
-	} else if (_matrixRow == 0) {
-		FVector row1 = _matrix._row1;
-		FPose subX(X_AXIS, angles._y);
-		FPose subY(Y_AXIS, angles._x);
-		FPose sub(subX, subY);
-
-		FMatrix m1 = _sub13.getMatrix();
-		FVector tempV1 = _sub13._position;
-		FVector tempV2, tempV3, tempV4, tempV5, tempV6;
-		tempV2._y = m1._row1._y * 100000.0;
-		tempV2._z = m1._row1._z * 100000.0;
-		tempV3._x = m1._row1._x * 100000.0 + tempV1._x;
-		tempV4._x = tempV3._x;
-		tempV3._y = tempV2._y + tempV1._y;
-		tempV4._y = tempV3._y;
-		tempV3._z = tempV2._z + tempV1._z;
-		tempV4._z = tempV3._z;
-		tempV2._x = m1._row2._x * 100000.0;
-		tempV2._y = m1._row2._y * 100000.0;
-		tempV2._z = m1._row2._z * 100000.0;
-		tempV2._x = m1._row3._x * 100000.0;
-		tempV2._y = m1._row3._y * 100000.0;
-		tempV2._z = m1._row3._z * 100000.0;
-		tempV2._x = tempV2._x + tempV1._x;
-		tempV2._y = tempV2._y + tempV1._y;
-		tempV2._z = tempV2._z + tempV1._z;
-		tempV3._x = tempV2._x + tempV1._x;
-		tempV3._y = tempV2._y + tempV1._y;
-		tempV5._x = tempV2._x;
-		tempV5._y = tempV2._y;
-		tempV3._z = tempV2._z + tempV1._z;
-		tempV5._z = tempV2._z;
-		tempV6._x = tempV3._x;
-		tempV6._y = tempV3._y;
-		tempV6._z = tempV3._z;
-		tempV1._x = tempV1._x - row1._x;
-		tempV1._y = tempV1._y - row1._y;
-		tempV1._z = tempV1._z - row1._z;
-		tempV4._x = tempV3._x - row1._x;
-		tempV4._y = tempV4._y - row1._y;
-		tempV4._z = tempV4._z - row1._z;
-		tempV5._x = tempV2._x - row1._x;
-
-		tempV5._y = tempV5._y - row1._y;
-		tempV5._z = tempV5._z - row1._z;
-		tempV6._x = tempV3._x - row1._x;
-		tempV6._y = tempV6._y - row1._y;
-		tempV6._z = tempV6._z - row1._z;
-
-		FVector modV1 = tempV1.fn5(sub);
-		FVector modV2 = tempV4.fn5(sub);
-		FVector modV3 = tempV5.fn5(sub);
-		FVector modV4 = tempV6.fn5(sub);
-		tempV1 = modV1;
-		tempV4 = modV2;
-		tempV5 = modV3;
-		tempV4 = modV4;
-
-		tempV2._x = tempV4._x - tempV1._x;
-		tempV2._y = tempV4._y - tempV1._y;
-		tempV2._z = tempV4._z - tempV1._z;
-		tempV4._x = tempV2._x;
-		tempV4._y = tempV2._y;
-		tempV2._x = tempV5._x - tempV1._x;
-		tempV4._z = tempV2._z;
-		tempV5._x = tempV2._x;
-		tempV2._y = tempV5._y - tempV1._y;
-		tempV5._y = tempV2._y;
-		tempV2._z = tempV5._z - tempV1._z;
-		tempV5._z = tempV2._z;
-		tempV2._x = tempV6._x - tempV1._x;
-		tempV2._y = tempV6._y - tempV1._y;
-		tempV2._z = tempV6._z - tempV1._z;
-		tempV6 = tempV2;
-
-		tempV4.normalize();
-		tempV5.normalize();
-		tempV6.normalize();
-		tempV1 += row1;
-
-		m1.set(tempV4, tempV5, tempV6);
-		_sub13.setMatrix(m1);
-		_sub13.setPosition(tempV1);
-	} else if (_matrixRow == 1) {
-		FVector tempV2;
-		DMatrix m1, m2, sub;
-		DVector mrow1, mrow2, mrow3;
-		DVector tempV1, diffV, multV, multV2, tempV3, tempV4, tempV5, tempV6, tempV7;
-		DVector tempV8, tempV9, tempV10, tempV11, tempV12;
-		DVector tempV13, tempV14, tempV15, tempV16;
-
-		DMatrix subX(0, _matrix._row1);
-		DMatrix subY(Y_AXIS, angles._y);
-
-		tempV1 = _matrix._row2 - _matrix._row1;
-		diffV = tempV1;
-		m1 = diffV.fn5();
-		m1 = m1.fn4(subX);
-		subX = m1.fn1();
-		subX = subX.fn4(subY);
-
-		FMatrix m3 = _sub13.getMatrix();
-		tempV2 = _sub13._position;
-		multV._x = m3._row1._x * 1000000.0;
-		multV._y = m3._row1._y * 1000000.0;
-		multV._z = m3._row1._z * 1000000.0;
-		tempV3._x = tempV2._x;
-		tempV3._y = tempV2._y;
-		tempV3._z = tempV2._z;
-		multV2._z = m3._row2._z * 1000000.0;
-
-		tempV1._x = multV._x + tempV3._x;
-		tempV1._y = multV._y + tempV3._y;
-		tempV1._z = multV._z + tempV3._z;
-		mrow3._z = 0.0;
-		mrow3._y = 0.0;
-		mrow3._x = 0.0;
-		multV2._x = m3._row2._x * 1000000.0;
-		multV2._y = m3._row2._y * 1000000.0;
-		mrow1 = tempV1;
-		multV = multV2 + tempV3;
-		mrow2 = multV;
-
-		tempV7._z = m3._row3._z * 1000000.0 + tempV3._z;
-		tempV7._y = m3._row3._y * 1000000.0 + tempV3._y;
-		tempV7._x = m3._row3._x * 1000000.0 + tempV3._x;
-
-		mrow3 = tempV8;
-		DVector *v = tempV3.fn1(tempV9, subX);
-		tempV3 = *v;
-		v = mrow1.fn1(tempV10, subX);
-		mrow1 = *v;
-		v = mrow2.fn1(tempV11, subX);
-		mrow2 = *v;
-		v = mrow3.fn1(tempV12, subX);
-		mrow3 = *v;
-
-		v = tempV3.fn1(tempV13, m1);
-		tempV3 = *v;
-		v = mrow1.fn1(tempV14, m1);
-		mrow1 = *v;
-		v = mrow2.fn1(tempV15, m1);
-		mrow2 = *v;
-		v = mrow3.fn1(tempV16, m1);
-		mrow3 = *v;
-
-		mrow1 -= tempV3;
-		mrow2 -= tempV3;
-		mrow3 -= tempV3;
-		mrow1.normalize();
-		mrow2.normalize();
-		mrow3.normalize();
-		tempV16 = tempV3;
-
-		m3.set(mrow1, mrow2, mrow3);
-		_sub13.setMatrix(m3);
-		_sub13.setPosition(tempV16);
-	}
-}
-
-bool CStarControlSub12::addMatrixRow(const FVector &v) {
-	if (_matrixRow >= 2)
-		return false;
-
-	CStar20Data data;
-	_handlerP->copyTo(&data);
-	deleteHandler();
-
-	FVector &row = _matrix[++_matrixRow];
-	row = v;
-	setupHandler(&data);
-	return true;
-}
-
-bool CStarControlSub12::removeMatrixRow() {
-	if (_matrixRow == -1)
-		return false;
-
-	CStar20Data data;
-	_handlerP->copyTo(&data);
-	deleteHandler();
-
-	--_matrixRow;
-	setupHandler(&data);
-	return true;
-}
-
-void CStarControlSub12::proc36(double *v1, double *v2, double *v3, double *v4) {
-	_sub13.fn19(v1, v2, v3, v4);
-}
-
-void CStarControlSub12::load(SimpleFile *file, int param) {
-	_sub13.load(file, param);
-}
-
-void CStarControlSub12::save(SimpleFile *file, int indent) {
-	_sub13.save(file, indent);
-}
-
-bool CStarControlSub12::setupHandler(const CStar20Data *src) {
-	CStarControlSub20 *handler = nullptr;
-
-	switch (_matrixRow) {
-	case -1:
-		handler = new CStarControlSub21(src);
-		break;
-
-	case 0:
-	case 1:
-	case 2:
-		handler = new CStarControlSub22(src);
-		break;
-
-	default:
-		break;
-	}
-
-	if (handler) {
-		assert(!_handlerP);
-		_handlerP = handler;
-		return true;
-	}
-	else {
-		return false;
-	}
-}
-
-void CStarControlSub12::deleteHandler() {
-	if (_handlerP) {
-		delete _handlerP;
-		_handlerP = nullptr;
-	}
-}
-
-void CStarControlSub12::fn1(CStarControlSub13 *sub13, const FVector &v) {
-	if (_matrixRow == 1) {
-		FMatrix m1 = sub13->getMatrix();
-		FMatrix m2 = _sub13.getMatrix();
-		FVector v1 = sub13->_position;
-		FVector v2 = _sub13._position;
-
-		_handlerP->proc8(v2, v1, m2, m1);
-		CStarVector *sv = new CStarVector(this, v);
-		_handlerP->setVector(sv);
-	}
-}
-
-void CStarControlSub12::fn2(FVector v1, FVector v2, FVector v3) {
-	if (_matrixRow == -1) {
-		FVector tempV;
-		tempV._z = _sub13._field10;
-		v3._z = v1._z;
-		tempV._x = _sub13._centerVector._z * v1._y * v1._z / _sub13._centerVector._x;
-		v3._y = _sub13._centerVector._y * tempV._z * v3._x / _sub13._centerVector._x;
-		v3._x = _sub13._centerVector._y * v1._x * v1._z / _sub13._centerVector._x - _sub13._valArray[2];
-		tempV._y = _sub13._centerVector._z * tempV._z * v3._y / _sub13._centerVector._x;
-		tempV._x = tempV._x - _sub13._valArray[2];
-
-		v3.normalize();
-		tempV.normalize();
-
-		FMatrix matrix = _sub13.getMatrix();
-		const FVector &pos = _sub13._position;
-		_handlerP->proc10(v3, tempV, pos, matrix);
-
-		CStarVector *sv = new CStarVector(this, v2);
-		_handlerP->setVector(sv);
-	}
-}
-
-void CStarControlSub12::fn3(CStarControlSub13 *sub13, const FVector &v) {
-	if (_matrixRow != 0)
-		return;
-
-	DMatrix m1;
-	DVector tempV1 = _matrix._row1;
-	DMatrix m2(0, tempV1);
-
-	tempV1 = v - _matrix._row1;
-	m1 = tempV1.fn5();
-
-	m1 = m1.fn4(m2);
-	m2 = m1.fn1();
-
-	DVector tempV2 = _sub13._position;
-	DMatrix m4;
-	m4._row1 = sub13->_position;
-	m4._row2 = DVector(0.0, 0.0, 0.0);
-	m4._row3 = DVector(0.0, 0.0, 0.0);
-	m4._row4 = DVector(0.0, 0.0, 0.0);
-
-	FMatrix m5 = sub13->getMatrix();
-	DVector tempV3, tempV4;
-	tempV4._x = m5._row1._x * 1000000.0 + m4._row1._x;
-	tempV4._y = m5._row1._y * 1000000.0 + m4._row1._y;
-	tempV4._z = m5._row1._z * 1000000.0 + m4._row1._z;
-	tempV3._x = m5._row2._x * 1000000.0 + m4._row1._x;
-	tempV3._y = m5._row2._y * 1000000.0 + m4._row1._y;
-	tempV3._z = m5._row2._z * 1000000.0 + m4._row1._z;
-	m4._row3 = tempV4;
-	m4._row2 = tempV3;
-
-	tempV4._x = m5._row3._x * 1000000.0;
-	tempV4._y = m5._row3._y * 1000000.0;
-	tempV3._x = tempV4._x + m4._row1._x;
-	tempV3._y = tempV4._y + m4._row1._y;
-	tempV3._z = m5._row3._z * 1000000.0 + m4._row1._z;
-	m4._row4 = tempV3;
-
-	DVector *dv = tempV2.fn1(tempV3, m2);
-	tempV3 = *dv;
-	dv = m4._row1.fn1(tempV3, m2);
-	m4._row1 = *dv;
-	dv = m4._row3.fn1(tempV3, m2);
-	m4._row3 = *dv;
-	dv = m4._row2.fn1(tempV3, m2);
-	m4._row2 = *dv;
-	dv = m4._row4.fn1(tempV3, m2);
-	m4._row4 = *dv;
-
-	// Find the angle that gives the minimum distance
-	DVector tempV5;
-	double minDistance = 1.0e20;
-	int minDegree = 0;
-	for (int degree = 0; degree < 360; ++degree) {
-		tempV5 = m4._row1;
-		tempV5.fn2((double)degree);
-		double distance = tempV2.getDistance(tempV5);
-
-		if (distance < minDistance) {
-			minDistance = distance;
-			minDegree = degree;
-		}
-	}
-
-	m4._row1.fn2((double)minDegree);
-	m4._row2.fn2((double)minDegree);
-	m4._row3.fn2((double)minDegree);
-	m4._row4.fn2((double)minDegree);
-	dv = m4._row1.fn1(tempV3, m1);
-	m4._row1 = *dv;
-	dv = m4._row3.fn1(tempV3, m1);
-	m4._row3 = *dv;
-	dv = m4._row2.fn1(tempV3, m1);
-	m4._row2 = *dv;
-	dv = m4._row4.fn1(tempV3, m1);
-	m4._row4 = *dv;
-
-	m4._row3._x -= m4._row1._x;
-	m4._row3._y -= m4._row1._y;
-	m4._row3._z -= m4._row1._z;
-	m4._row2._x -= m4._row1._x;
-	m4._row2._y -= m4._row1._y;
-	m4._row2._z = m4._row2._z - m4._row1._z;
-
-	m4._row4._x = m4._row4._x - m4._row1._x;
-	m4._row4._y = m4._row4._y - m4._row1._y;
-	m4._row4._z = m4._row4._z - m4._row1._z;
-
-	m4._row3.normalize();
-	m4._row2.normalize();
-	m4._row4.normalize();
-	m5.set(m4._row3, m4._row2, m4._row4);
-
-	FVector tempV6 = m4._row1;
-	FMatrix m6 = _sub13.getMatrix();
-	_handlerP->proc8(_sub13._position, tempV6, m6, m5);
-
-	CStarVector *sv = new CStarVector(this, v);
-	_handlerP->setVector(sv);
-}
-
-} // End of namespace Titanic
diff --git a/engines/titanic/star_control/star_control_sub12.h b/engines/titanic/star_control/star_control_sub12.h
deleted file mode 100644
index 06edd96..0000000
--- a/engines/titanic/star_control/star_control_sub12.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef TITANIC_STAR_CONTROL_SUB12_H
-#define TITANIC_STAR_CONTROL_SUB12_H
-
-#include "titanic/support/simple_file.h"
-#include "titanic/star_control/fmatrix.h"
-#include "titanic/star_control/fpoint.h"
-#include "titanic/star_control/base_stars.h"
-#include "titanic/star_control/star_control_sub13.h"
-#include "titanic/star_control/star_control_sub20.h"
-#include "titanic/star_control/error_code.h"
-
-namespace Titanic {
-
-class CStarControlSub12 {
-private:
-	static FMatrix *_matrix1;
-	static FMatrix *_matrix2;
-private:
-	int _matrixRow;
-	FMatrix _matrix;
-	CStarControlSub20 *_handlerP;
-	CStarControlSub13 _sub13;
-	int _field108;
-private:
-	/**
-	 * Set up a handler
-	 */
-	bool setupHandler(const CStar20Data *src);
-
-	/**
-	 * Deletes any previous handler
-	 */
-	void deleteHandler();
-
-	/**
-	 * Return whether the handler is locked
-	 */
-	bool isLocked() { return _handlerP->isLocked(); }
-public:
-	static void init();
-	static void deinit();
-public:
-	CStarControlSub12(const CStar20Data *data);
-	CStarControlSub12(CStarControlSub13 *src);
-	virtual ~CStarControlSub12();
-
-	virtual void proc2(const CStarControlSub13 *src);
-	virtual void proc3(const CStar20Data *src);
-	virtual void setPosition(const FVector &v);
-	virtual void proc5(const FVector &v);
-	virtual void proc6(int v);
-	virtual void proc7(int v);
-	virtual void proc8(int v);
-	virtual void proc9(int v);
-	virtual void proc10(int v);
-	virtual void proc11();
-	virtual void proc12(StarMode mode, double v2);
-	virtual void proc13(CStarControlSub13 *dest);
-	virtual void proc14(FVector &v);
-	virtual void proc15(CErrorCode *errorCode);
-	virtual void proc16();
-	virtual void proc17();
-	virtual void proc18();
-	virtual void proc19();
-	virtual void proc20(double factor);
-	virtual void proc21(const FPose &pose);
-	virtual void proc22(FMatrix &m);
-	virtual FPose proc23();
-	virtual FPose proc24();
-	virtual double proc25() const;
-	virtual double proc26() const;
-	virtual int proc27() const;
-	virtual FVector proc28(int index, const FVector &src);
-	virtual FVector proc29(int index, const FVector &src);
-	virtual FVector proc30(int index, const FVector &v);
-	virtual FVector proc31(int index, const FVector &v);
-
-	/**
-	 * Sets the viewport position within the starfield
-	 */
-	virtual void setViewportPosition(const FPoint &angles);
-
-	virtual int getMatrixRow() const { return _matrixRow; }
-	virtual bool addMatrixRow(const FVector &v);
-	virtual bool removeMatrixRow();
-	virtual void proc36(double *v1, double *v2, double *v3, double *v4);
-
-	/**
-	 * Load the data for the class from file
-	 */
-	virtual void load(SimpleFile *file, int param);
-
-	/**
-	 * Save the data for the class to file
-	 */
-	virtual void save(SimpleFile *file, int indent);
-
-
-	bool is108() const { return _field108; }
-	void set108() { _field108 = true; }
-	void reset108() { _field108 = false; }
-
-	void fn1(CStarControlSub13 *sub13, const FVector &v);
-	void fn2(FVector v1, FVector v2, FVector v3);
-	void fn3(CStarControlSub13 *sub13, const FVector &v);
-};
-
-} // End of namespace Titanic
-
-#endif /* TITANIC_STAR_CONTROL_SUB12_H */
diff --git a/engines/titanic/star_control/star_control_sub2.cpp b/engines/titanic/star_control/star_control_sub2.cpp
index ebeb9bf..221efa9 100644
--- a/engines/titanic/star_control/star_control_sub2.cpp
+++ b/engines/titanic/star_control/star_control_sub2.cpp
@@ -21,7 +21,7 @@
  */
 
 #include "titanic/star_control/star_control_sub2.h"
-#include "titanic/star_control/star_control_sub12.h"
+#include "titanic/star_control/star_camera.h"
 
 namespace Titanic {
 
@@ -37,12 +37,12 @@ bool CStarControlSub2::loadYale(int v1) {
 }
 
 bool CStarControlSub2::selectStar(CSurfaceArea *surfaceArea,
-		CStarControlSub12 *sub12, const Common::Point &pt, void *handler) {
-	int index = baseFn1(surfaceArea, sub12, pt);
+		CStarCamera *camera, const Common::Point &pt, void *handler) {
+	int index = baseFn1(surfaceArea, camera, pt);
 	if (index == -1) {
 		return false;
 	} else if (!handler) {
-		sub12->proc14(_data[index]._position);
+		camera->proc14(_data[index]._position);
 		return true;
 	} else {
 		error("no handler ever passed in original");
diff --git a/engines/titanic/star_control/star_control_sub2.h b/engines/titanic/star_control/star_control_sub2.h
index 39f1de6..cd82b02 100644
--- a/engines/titanic/star_control/star_control_sub2.h
+++ b/engines/titanic/star_control/star_control_sub2.h
@@ -36,7 +36,7 @@ public:
 	/**
 	 * Selects a star
 	 */
-	virtual bool selectStar(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12,
+	virtual bool selectStar(CSurfaceArea *surfaceArea, CStarCamera *camera,
 		const Common::Point &pt, void *handler = nullptr);
 
 	virtual bool loadStar();
diff --git a/engines/titanic/star_control/star_control_sub7.cpp b/engines/titanic/star_control/star_control_sub7.cpp
index 257c203..8671586 100644
--- a/engines/titanic/star_control/star_control_sub7.cpp
+++ b/engines/titanic/star_control/star_control_sub7.cpp
@@ -21,16 +21,16 @@
  */
 
 #include "titanic/star_control/star_control_sub7.h"
-#include "titanic/star_control/star_control_sub12.h"
+#include "titanic/star_control/star_camera.h"
 
 namespace Titanic {
 
-void CStarControlSub7::draw(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarCloseup *closeup) {
+void CStarControlSub7::draw(CSurfaceArea *surfaceArea, CStarCamera *camera, CStarCloseup *closeup) {
 	if (_data.empty())
 		return;
 
-	FPose pose = sub12->proc23();
-	double threshold = sub12->proc25();
+	FPose pose = camera->proc23();
+	double threshold = camera->proc25();
 	FPoint center((double)surfaceArea->_width * 0.5,
 		surfaceArea->_height * 0.5);
 	FVector newV;
@@ -50,7 +50,7 @@ void CStarControlSub7::draw(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12,
 			+ pose._row2._z * star._position._y + pose._vector._z; 
 
 		if (newV._z > threshold) {
-			FVector vTemp = sub12->proc28(2, newV);
+			FVector vTemp = camera->proc28(2, newV);
 
 			FRect r1(center._x + vTemp._x, center._y + vTemp._y,
 				center._x + vTemp._x + 4.0, center._y + vTemp._y + 4.0);
diff --git a/engines/titanic/star_control/star_control_sub7.h b/engines/titanic/star_control/star_control_sub7.h
index be5a51f..e751ae0 100644
--- a/engines/titanic/star_control/star_control_sub7.h
+++ b/engines/titanic/star_control/star_control_sub7.h
@@ -33,7 +33,7 @@ public:
 	/**
 	 * Draw the item
 	 */
-	virtual void draw(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarCloseup *closeup);
+	virtual void draw(CSurfaceArea *surfaceArea, CStarCamera *camera, CStarCloseup *closeup);
 
 	/**
 	 * Adds a new star, or removes one if already present at the given co-ordinates
diff --git a/engines/titanic/star_control/star_control_sub8.cpp b/engines/titanic/star_control/star_control_sub8.cpp
index cba4fe0..23a65e8 100644
--- a/engines/titanic/star_control/star_control_sub8.cpp
+++ b/engines/titanic/star_control/star_control_sub8.cpp
@@ -22,7 +22,7 @@
 
 #include "titanic/star_control/star_control_sub8.h"
 #include "titanic/star_control/star_control_sub7.h"
-#include "titanic/star_control/star_control_sub12.h"
+#include "titanic/star_control/star_camera.h"
 #include "titanic/star_control/star_field.h"
 #include "titanic/star_control/star_ref.h"
 
@@ -93,13 +93,13 @@ void CStarControlSub8::selectStar(int index, CVideoSurface *surface,
 	}
 }
 
-bool CStarControlSub8::fn1(CStarField *starField, CSurfaceArea *surfaceArea, CStarControlSub12 *sub12) {
-	int count = starField->baseFn2(surfaceArea, sub12);
+bool CStarControlSub8::fn1(CStarField *starField, CSurfaceArea *surfaceArea, CStarCamera *camera) {
+	int count = starField->baseFn2(surfaceArea, camera);
 
 	if (count > 0) {
 		allocate(count);
 		CStarRef2 starRef(starField, &_positions);
-		starRef.process(surfaceArea, sub12);
+		starRef.process(surfaceArea, camera);
 		return true;
 	} else {
 		clear();
diff --git a/engines/titanic/star_control/star_control_sub8.h b/engines/titanic/star_control/star_control_sub8.h
index 992420f..7c96582 100644
--- a/engines/titanic/star_control/star_control_sub8.h
+++ b/engines/titanic/star_control/star_control_sub8.h
@@ -35,7 +35,7 @@ namespace Titanic {
 
 class CStarField;
 class CStarControlSub7;
-class CStarControlSub12;
+class CStarCamera;
 
 class CStarControlSub8 {
 private:
@@ -74,7 +74,7 @@ public:
 
 	void draw(CSurfaceArea *surfaceArea);
 
-	bool fn1(CStarField *starField, CSurfaceArea *surfaceArea, CStarControlSub12 *sub12);
+	bool fn1(CStarField *starField, CSurfaceArea *surfaceArea, CStarCamera *camera);
 	void fn2(CVideoSurface *surface, CStarField *starField, CStarControlSub7 *sub7);
 	void fn3();
 	void fn4(int index, CSurfaceArea *surfaceArea);
diff --git a/engines/titanic/star_control/star_field.cpp b/engines/titanic/star_control/star_field.cpp
index 3890b04..52629eb 100644
--- a/engines/titanic/star_control/star_field.cpp
+++ b/engines/titanic/star_control/star_field.cpp
@@ -22,7 +22,7 @@
 
 #include "titanic/star_control/star_field.h"
 #include "titanic/star_control/surface_area.h"
-#include "titanic/star_control/star_control_sub12.h"
+#include "titanic/star_control/star_camera.h"
 #include "titanic/titanic.h"
 
 namespace Titanic {
@@ -63,21 +63,21 @@ bool CStarField::initDocument() {
 	return valid;
 }
 
-void CStarField::render(CVideoSurface *surface, CStarControlSub12 *sub12) {
+void CStarField::render(CVideoSurface *surface, CStarCamera *camera) {
 	CSurfaceArea surfaceArea(surface);
-	draw(&surfaceArea, sub12, &_starCloseup);
+	draw(&surfaceArea, camera, &_starCloseup);
 	if (_showCrosshairs)
 		drawCrosshairs(&surfaceArea);
 
-	_sub7.draw(&surfaceArea, sub12, nullptr);
+	_sub7.draw(&surfaceArea, camera, nullptr);
 	_sub8.draw(&surfaceArea);
 
 	if (_points2On)
-		_points2.draw(&surfaceArea, sub12);
+		_points2.draw(&surfaceArea, camera);
 	if (_points1On)
-		_points1.draw(&surfaceArea, sub12);
+		_points1.draw(&surfaceArea, camera);
 
-	fn4(&surfaceArea, sub12);
+	fn4(&surfaceArea, camera);
 }
 
 int CStarField::get1() const {
@@ -168,12 +168,12 @@ void CStarField::drawCrosshairs(CSurfaceArea *surfaceArea) {
 	surfaceArea->setColorFromPixel();
 }
 
-void CStarField::fn4(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12) {
+void CStarField::fn4(CSurfaceArea *surfaceArea, CStarCamera *camera) {
 	FVector v1, v2, v3;
 	_val5 = 0;
 
 	if (_mode == MODE_STARFIELD) {
-		if (fn5(surfaceArea, sub12, v1, v2, v3) > -1.0) {
+		if (fn5(surfaceArea, camera, v1, v2, v3) > -1.0) {
 			surfaceArea->_pixel = 0xA0A0;
 			surfaceArea->setColorFromPixel();
 			surfaceArea->fillRect(FRect(v1._x, v1._y, v3._x, v3._y));
@@ -181,19 +181,19 @@ void CStarField::fn4(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12) {
 	}
 }
 
-double CStarField::fn5(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12,
+double CStarField::fn5(CSurfaceArea *surfaceArea, CStarCamera *camera,
 		FVector &v1, FVector &v2, FVector &v3) {
 	if (_sub8._fieldC < 0)
 		return -1.0;
 
 	const CBaseStarEntry *dataP = _sub7.getDataPtr(_sub8._fieldC);
 	v2 = dataP->_position;
-	FVector tv = sub12->proc29(2, v2);
+	FVector tv = camera->proc29(2, v2);
 
-	if (sub12->proc25() >= tv._z)
+	if (camera->proc25() >= tv._z)
 		return -1.0;
 
-	tv = sub12->proc28(2, tv);
+	tv = camera->proc28(2, tv);
 
 	v1 = FVector(tv._x + surfaceArea->_centroid._x,
 		tv._y + surfaceArea->_centroid._y, tv._z);
@@ -210,9 +210,9 @@ double CStarField::fn5(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12,
 	return v1._y - pt._y;
 }
 
-void CStarField::fn6(CVideoSurface *surface, CStarControlSub12 *sub12) {
+void CStarField::fn6(CVideoSurface *surface, CStarCamera *camera) {
 	CSurfaceArea surfaceArea(surface);
-	_sub8.fn1(this, &surfaceArea, sub12);
+	_sub8.fn1(this, &surfaceArea, camera);
 }
 
 void CStarField::fn7() {
@@ -225,11 +225,11 @@ void CStarField::fn8(CVideoSurface *surface) {
 	setSolved();
 }
 
-bool CStarField::mouseButtonDown(CVideoSurface *surface, CStarControlSub12 *sub12,
+bool CStarField::mouseButtonDown(CVideoSurface *surface, CStarCamera *camera,
 		int flags, const Common::Point &pt) {
 	if (_mode == MODE_STARFIELD) {
 		CSurfaceArea surfaceArea(surface);
-		return selectStar(&surfaceArea, sub12, pt);
+		return selectStar(&surfaceArea, camera, pt);
 	} else {
 		int starNum = _sub8.indexOf(pt);
 		if (starNum >= 0) {
diff --git a/engines/titanic/star_control/star_field.h b/engines/titanic/star_control/star_field.h
index 82acbed..0d80e27 100644
--- a/engines/titanic/star_control/star_field.h
+++ b/engines/titanic/star_control/star_field.h
@@ -51,7 +51,7 @@ private:
 	 */
 	void drawCrosshairs(CSurfaceArea *surfaceArea);
 
-	void fn4(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12);
+	void fn4(CSurfaceArea *surfaceArea, CStarCamera *camera);
 public:
 	CStarField();
 
@@ -70,7 +70,7 @@ public:
 	/**
 	 * Renders the contents of the starfield
 	 */
-	void render(CVideoSurface *surface, CStarControlSub12 *sub12);
+	void render(CVideoSurface *surface, CStarCamera *camera);
 
 	int get1() const;
 	void set1(int val);
@@ -117,9 +117,9 @@ public:
 	}
 
 	void fn1(CErrorCode *errorCode);
-	double fn5(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12,
+	double fn5(CSurfaceArea *surfaceArea, CStarCamera *camera,
 		FVector &v1, FVector &v2, FVector &v3);
-	void fn6(CVideoSurface *surface, CStarControlSub12 *sub12);
+	void fn6(CVideoSurface *surface, CStarCamera *camera);
 	void fn7();
 	void fn8(CVideoSurface *surface);
 	void fn9() { _starCloseup.fn1(); }
@@ -127,7 +127,7 @@ public:
 	/**
 	 * Called when the starfield is clicked
 	 */
-	bool mouseButtonDown(CVideoSurface *surface, CStarControlSub12 *sub12,
+	bool mouseButtonDown(CVideoSurface *surface, CStarCamera *camera,
 		int flags, const Common::Point &pt);
 
 	/**
diff --git a/engines/titanic/star_control/star_points1.cpp b/engines/titanic/star_control/star_points1.cpp
index cf5c98e..7e3a79b 100644
--- a/engines/titanic/star_control/star_points1.cpp
+++ b/engines/titanic/star_control/star_points1.cpp
@@ -21,7 +21,7 @@
  */
 
 #include "titanic/star_control/star_points1.h"
-#include "titanic/star_control/star_control_sub12.h"
+#include "titanic/star_control/star_camera.h"
 #include "titanic/titanic.h"
 
 namespace Titanic {
@@ -57,12 +57,12 @@ bool CStarPoints1::initialize() {
 	return true;
 }
 
-void CStarPoints1::draw(CSurfaceArea *surface, CStarControlSub12 *sub12) {
+void CStarPoints1::draw(CSurfaceArea *surface, CStarCamera *camera) {
 	if (_data.empty())
 		return;
 
-	FPose pose = sub12->proc23();
-	double threshold = sub12->proc25();
+	FPose pose = camera->proc23();
+	double threshold = camera->proc25();
 	FVector vector1, vector2, vector3, vector4;
 	FVector vTemp = _data[0];
 	double vWidth2 = (double)surface->_width * 0.5;
@@ -88,8 +88,8 @@ void CStarPoints1::draw(CSurfaceArea *surface, CStarControlSub12 *sub12) {
 		vector3._z = vTemp._x * pose._row1._z + vTemp._y * pose._row2._z + vTemp._z * pose._row3._z + pose._vector._z;
 
 		if (flag && vector1._z > threshold && vector3._z > threshold) {
-			vector2 = sub12->proc28(2, vector1);
-			vector4 = sub12->proc28(2, vector3);
+			vector2 = camera->proc28(2, vector1);
+			vector4 = camera->proc28(2, vector3);
 
 			r.bottom = vector4._y + vHeight2;
 			r.right = vector4._x + vWidth2;
diff --git a/engines/titanic/star_control/star_points1.h b/engines/titanic/star_control/star_points1.h
index 780cc50..aeab68f 100644
--- a/engines/titanic/star_control/star_points1.h
+++ b/engines/titanic/star_control/star_points1.h
@@ -29,7 +29,7 @@
 
 namespace Titanic {
 
-class CStarControlSub12;
+class CStarCamera;
 
 class CStarPoints1 {
 	struct CStarPointEntry : public FVector {
@@ -49,7 +49,7 @@ public:
 	/**
 	 * Draw the starfield points
 	 */
-	void draw(CSurfaceArea *surface, CStarControlSub12 *sub12);
+	void draw(CSurfaceArea *surface, CStarCamera *camera);
 };
 
 } // End of namespace Titanic
diff --git a/engines/titanic/star_control/star_points2.cpp b/engines/titanic/star_control/star_points2.cpp
index 7dec3f8..9adbd1c 100644
--- a/engines/titanic/star_control/star_points2.cpp
+++ b/engines/titanic/star_control/star_points2.cpp
@@ -21,7 +21,7 @@
  */
 
 #include "titanic/star_control/star_points2.h"
-#include "titanic/star_control/star_control_sub12.h"
+#include "titanic/star_control/star_camera.h"
 #include "titanic/titanic.h"
 
 namespace Titanic {
@@ -62,12 +62,12 @@ bool CStarPoints2::initialize() {
 	return true;
 }
 
-void CStarPoints2::draw(CSurfaceArea *surface, CStarControlSub12 *sub12) {
+void CStarPoints2::draw(CSurfaceArea *surface, CStarCamera *camera) {
 	if (_data.empty())
 		return;
 
-	FPose pose = sub12->proc23();
-	double threshold = sub12->proc25();
+	FPose pose = camera->proc23();
+	double threshold = camera->proc25();
 	FVector vector1, vector2, vector3, vector4;
 	double vWidth2 = (double)surface->_width * 0.5;
 	double vHeight2 = (double)surface->_height * 0.5;
@@ -99,8 +99,8 @@ void CStarPoints2::draw(CSurfaceArea *surface, CStarControlSub12 *sub12) {
 				+ pose._row1._y * se._v2._x + pose._vector._y;
 
 			if (vector1._z > threshold && vector3._z > threshold) {
-				vector2 = sub12->proc28(2, vector1);
-				vector4 = sub12->proc28(2, vector3);
+				vector2 = camera->proc28(2, vector1);
+				vector4 = camera->proc28(2, vector3);
 
 				r.bottom = vector4._y + vHeight2;
 				r.right = vector4._x + vWidth2;
diff --git a/engines/titanic/star_control/star_points2.h b/engines/titanic/star_control/star_points2.h
index c80de88..b807712 100644
--- a/engines/titanic/star_control/star_points2.h
+++ b/engines/titanic/star_control/star_points2.h
@@ -29,7 +29,7 @@
 
 namespace Titanic {
 
-class CStarControlSub12;
+class CStarCamera;
 
 class CStarPoints2 {
 	struct CStarPointEntry {
@@ -51,7 +51,7 @@ public:
 	/**
 	 * Draw the starfield points
 	 */
-	void draw(CSurfaceArea *surface, CStarControlSub12 *sub12);
+	void draw(CSurfaceArea *surface, CStarCamera *camera);
 };
 
 } // End of namespace Titanic
diff --git a/engines/titanic/star_control/star_ref.cpp b/engines/titanic/star_control/star_ref.cpp
index fe3f233..bdafd40 100644
--- a/engines/titanic/star_control/star_ref.cpp
+++ b/engines/titanic/star_control/star_ref.cpp
@@ -24,13 +24,13 @@
 
 namespace Titanic {
 
-void CBaseStarRef::process(CSurfaceArea *surface, CStarControlSub12 *sub12) {
+void CBaseStarRef::process(CSurfaceArea *surface, CStarCamera *camera) {
 	if (_stars->_data.empty())
 		return;
 
 	const double MAX_VAL = 1.0e9 * 1.0e9;
-	FPose pose = sub12->proc23();
-	double threshold = sub12->proc25();
+	FPose pose = camera->proc23();
+	double threshold = camera->proc25();
 	double vWidth2 = (double)surface->_width * 0.5;
 	double vHeight2 = (double)surface->_height * 0.5;
 	FVector vTemp, vector1, vector2;
@@ -45,7 +45,7 @@ void CBaseStarRef::process(CSurfaceArea *surface, CStarControlSub12 *sub12) {
 		double hyp = vector1._x * vector1._x + vector1._y * vector1._y + vector1._z * vector1._z;
 
 		if (vector1._z > threshold && hyp >= 1.0e12 && hyp < MAX_VAL) {
-			vector2 = sub12->proc28(2, vector1);
+			vector2 = camera->proc28(2, vector1);
 
 			const Common::Point pt((int)(vector2._x + vWidth2 - -0.5),
 				(int)(vector2._y + vHeight2 - -0.5));
diff --git a/engines/titanic/star_control/star_ref.h b/engines/titanic/star_control/star_ref.h
index 1ed2213..cb94555 100644
--- a/engines/titanic/star_control/star_ref.h
+++ b/engines/titanic/star_control/star_ref.h
@@ -22,7 +22,7 @@
 
 #include "common/rect.h"
 #include "titanic/star_control/base_stars.h"
-#include "titanic/star_control/star_control_sub12.h"
+#include "titanic/star_control/star_camera.h"
 #include "titanic/star_control/surface_area.h"
 
 #ifndef TITANIC_STAR_REF_H
@@ -38,7 +38,7 @@ public:
 	CBaseStarRef() : _stars(nullptr) {}
 	virtual ~CBaseStarRef() {}
 
-	void process(CSurfaceArea *surface, CStarControlSub12 *sub12);
+	void process(CSurfaceArea *surface, CStarCamera *camera);
 
 	virtual bool check(const Common::Point &pt, int index) { return false; }
 };
diff --git a/engines/titanic/star_control/star_view.cpp b/engines/titanic/star_control/star_view.cpp
index 6cd5391..9f869c8 100644
--- a/engines/titanic/star_control/star_view.cpp
+++ b/engines/titanic/star_control/star_view.cpp
@@ -30,18 +30,18 @@
 
 namespace Titanic {
 
-CStarView::CStarView() : _sub12((const CStar20Data *)nullptr), _owner(nullptr),
+CStarView::CStarView() : _camera((const CStar20Data *)nullptr), _owner(nullptr),
 		_starField(nullptr), _videoSurface(nullptr), _hasReference(0),
 		_videoSurface2(nullptr), _homePhotoMask(nullptr),
 		_field218(false), _showingPhoto(false) {
 	CStar20Data data = { 0, 0, 100000.0, 0, 20.0, 1.0, 1.0, 1.0 };
 
-	_sub12.proc3(&data);
+	_camera.proc3(&data);
 }
 
 void CStarView::load(SimpleFile *file, int param) {
 	if (!param) {
-		_sub12.load(file, param);
+		_camera.load(file, param);
 
 		_hasReference = file->readNumber();
 		if (_hasReference)
@@ -53,7 +53,7 @@ void CStarView::load(SimpleFile *file, int param) {
 }
 
 void CStarView::save(SimpleFile *file, int indent) {
-	_sub12.save(file, indent);
+	_camera.save(file, indent);
 
 	file->writeNumberLine(_hasReference, indent);
 	if (_hasReference)
@@ -70,8 +70,8 @@ void CStarView::setup(CScreenManager *screenManager, CStarField *starField, CSta
 
 void CStarView::reset() {
 	if (_hasReference) {
-		CStarControlSub12 sub12(&_sub13);
-		fn18(&sub12);
+		CStarCamera camera(&_sub13);
+		fn18(&camera);
 	}
 }
 
@@ -101,7 +101,7 @@ void CStarView::draw(CScreenManager *screenManager) {
 			// Render the display
 			_videoSurface->clear();
 			_videoSurface->lock();
-			_starField->render(_videoSurface, &_sub12);
+			_starField->render(_videoSurface, &_camera);
 			_videoSurface->unlock();
 
 			// Blit the resulting surface to the screen
@@ -114,7 +114,7 @@ bool CStarView::MouseButtonDownMsg(int flags, const Point &pt) {
 	if (_starField) {
 		return _starField->mouseButtonDown(
 			_showingPhoto ? _videoSurface2 : _videoSurface,
-			&_sub12, flags, pt);
+			&_camera, flags, pt);
 	}
 
 	return false;
@@ -135,7 +135,7 @@ bool CStarView::MouseMoveMsg(int unused, const Point &pt) {
 
 				FPoint angle(tempPt._x * -2.0 * distance / threshold, 
 					tempPt._y * -2.0 * distance / threshold);
-				_sub12.setViewportPosition(angle);
+				_camera.setViewportPosition(angle);
 				return true;
 			}
 		}
@@ -178,15 +178,15 @@ bool CStarView::KeyCharMsg(int key, CErrorCode *errorCode) {
 	case Common::KEYCODE_c:
 		if (v == -1) {
 			pose.setRotationMatrix(key == Common::KEYCODE_z ? Y_AXIS : X_AXIS, 1.0);
-			_sub12.proc22(pose);
-			_sub12.proc15(errorCode);
+			_camera.proc22(pose);
+			_camera.proc15(errorCode);
 			return true;
 		}
 		break;
 
 	case Common::KEYCODE_SEMICOLON:
 		if (v == -1) {
-			_sub12.proc16();
+			_camera.proc16();
 			errorCode->set();
 			return true;
 		}
@@ -194,7 +194,7 @@ bool CStarView::KeyCharMsg(int key, CErrorCode *errorCode) {
 
 	case Common::KEYCODE_PERIOD:
 		if (v == -1) {
-			_sub12.proc17();
+			_camera.proc17();
 			errorCode->set();
 			return true;
 		}
@@ -202,7 +202,7 @@ bool CStarView::KeyCharMsg(int key, CErrorCode *errorCode) {
 
 	case Common::KEYCODE_SPACE:
 		if (v == -1) {
-			_sub12.proc19();
+			_camera.proc19();
 			errorCode->set();
 			return true;
 		}
@@ -211,8 +211,8 @@ bool CStarView::KeyCharMsg(int key, CErrorCode *errorCode) {
 	case Common::KEYCODE_x:
 		if (v == -1) {
 			pose.setRotationMatrix(Y_AXIS, -1.0);
-			_sub12.proc22(pose);
-			_sub12.proc15(errorCode);
+			_camera.proc22(pose);
+			_camera.proc15(errorCode);
 			return true;
 		}
 		break;
@@ -220,8 +220,8 @@ bool CStarView::KeyCharMsg(int key, CErrorCode *errorCode) {
 	case Common::KEYCODE_QUOTE:
 		if (v == -1) {
 			pose.setRotationMatrix(X_AXIS, -1.0);
-			_sub12.proc22(pose);
-			_sub12.proc15(errorCode);
+			_camera.proc22(pose);
+			_camera.proc15(errorCode);
 			return true;
 		}
 		break;
@@ -234,21 +234,21 @@ bool CStarView::KeyCharMsg(int key, CErrorCode *errorCode) {
 }
 
 bool CStarView::canSetStarDestination() const {
-	return _sub12.is108();
+	return _camera.is108();
 }
 
 void CStarView::starDestinationSet() {
-	_sub12.reset108();
+	_camera.reset108();
 }
 
 void CStarView::resetPosition() {
-	_sub12.setPosition(FVector(0.0, 0.0, 0.0));
+	_camera.setPosition(FVector(0.0, 0.0, 0.0));
 }
 
 bool CStarView::fn1() {
 	if (_videoSurface) {
 		CErrorCode errorCode;
-		_sub12.proc15(&errorCode);
+		_camera.proc15(&errorCode);
 
 		if (_fader._index < 0 || _fader._index >= _fader._count)
 			_starField->fn1(&errorCode);
@@ -283,8 +283,8 @@ void CStarView::fn3(bool fadeIn) {
 void CStarView::fn4() {
 	FVector v1, v2;
 	randomizeVectors1(v1, v2);
-	_sub12.setPosition(v1);
-	_sub12.proc5(v2);
+	_camera.setPosition(v1);
+	_camera.proc5(v2);
 }
 
 void CStarView::fn5() {
@@ -301,8 +301,8 @@ void CStarView::fn7() {
 		FVector v1, v2;
 		randomizeVectors1(v1, v2);
 		v2 += star->_position;
-		_sub12.setPosition(v2);
-		_sub12.proc5(v1);
+		_camera.setPosition(v2);
+		_camera.proc5(v1);
 	}
 }
 
@@ -312,23 +312,23 @@ void CStarView::fn19(int index) {
 		FVector v1, v2;
 		randomizeVectors1(v1, v2);
 		v1 += star->_position;
-		_sub12.setPosition(v1);
-		_sub12.proc5(v2);
+		_camera.setPosition(v1);
+		_camera.proc5(v2);
 	}
 }
 
 void CStarView::fn8() {
-	_sub12.proc18();
+	_camera.proc18();
 }
 
 void CStarView::fn9() {
 	_field218 = !_field218;
 	if (_field218) {
-		_sub12.proc12(MODE_PHOTO, 30.0);
-		_sub12.proc12(MODE_STARFIELD, 28000.0);
+		_camera.proc12(MODE_PHOTO, 30.0);
+		_camera.proc12(MODE_STARFIELD, 28000.0);
 	} else {
-		_sub12.proc12(MODE_PHOTO, 0.0);
-		_sub12.proc12(MODE_STARFIELD, 0.0);
+		_camera.proc12(MODE_PHOTO, 0.0);
+		_camera.proc12(MODE_STARFIELD, 0.0);
 	}
 }
 
@@ -350,14 +350,14 @@ void CStarView::toggleCrosshairs() {
 
 void CStarView::fn13() {
 	_field218 = true;
-	_sub12.proc12(MODE_PHOTO, 30.0);
-	_sub12.proc12(MODE_STARFIELD, 28000.0);
+	_camera.proc12(MODE_PHOTO, 30.0);
+	_camera.proc12(MODE_STARFIELD, 28000.0);
 }
 
 void CStarView::fn14() {
 	_field218 = false;
-	_sub12.proc12(MODE_PHOTO, 0.0);
-	_sub12.proc12(MODE_STARFIELD, 0.0);
+	_camera.proc12(MODE_PHOTO, 0.0);
+	_camera.proc12(MODE_STARFIELD, 0.0);
 }
 
 void CStarView::setHasReference() {
@@ -378,7 +378,7 @@ void CStarView::fn16() {
 	if (_starField && !_showingPhoto) {
 		CSurfaceArea surfaceArea(_videoSurface);
 		FVector v1, v2, v3;
-		double val = _starField->fn5(&surfaceArea, &_sub12, v1, v2, v3);
+		double val = _starField->fn5(&surfaceArea, &_camera, v1, v2, v3);
 
 		if (val > -1.0) {
 			v1 += surfaceArea._centroid;
@@ -386,17 +386,17 @@ void CStarView::fn16() {
 
 			switch (_starField->get88()) {
 			case -1:
-				_sub12.fn2(v1, v2, v3);
+				_camera.fn2(v1, v2, v3);
 				_starField->fn7();
 				break;
 
 			case 0:
-				_sub12.fn3(&_sub13, v2);
+				_camera.fn3(&_sub13, v2);
 				_starField->fn7();
 				break;
 
 			case 1:
-				_sub12.fn1(&_sub13, v2);
+				_camera.fn1(&_sub13, v2);
 				_starField->fn7();
 				break;
 
@@ -409,12 +409,12 @@ void CStarView::fn16() {
 
 void CStarView::fn17() {
 	if (_starField && !_showingPhoto) {
-		_sub12.removeMatrixRow();
+		_camera.removeMatrixRow();
 		_starField->fn8(_videoSurface2);
 	}
 }
 
-void CStarView::fn18(CStarControlSub12 *sub12) {
+void CStarView::fn18(CStarCamera *camera) {
 	if (_starField) {
 		if (!_videoSurface2) {
 			CScreenManager *scrManager = CScreenManager::setCurrent();
@@ -428,11 +428,11 @@ void CStarView::fn18(CStarControlSub12 *sub12) {
 
 			_videoSurface2->clear();
 			_videoSurface2->lock();
-			_starField->render(_videoSurface2, sub12);
+			_starField->render(_videoSurface2, camera);
 
 			_starField->setCrosshairs(oldCrosshairs);
 			_starField->set54(oldVal);
-			_starField->fn6(_videoSurface2, sub12);
+			_starField->fn6(_videoSurface2, camera);
 			_videoSurface2->unlock();
 		}
 	}
diff --git a/engines/titanic/star_control/star_view.h b/engines/titanic/star_control/star_view.h
index f52dffe..b1acad3 100644
--- a/engines/titanic/star_control/star_view.h
+++ b/engines/titanic/star_control/star_view.h
@@ -25,7 +25,7 @@
 
 #include "titanic/support/simple_file.h"
 #include "titanic/support/video_surface.h"
-#include "titanic/star_control/star_control_sub12.h"
+#include "titanic/star_control/star_camera.h"
 #include "titanic/star_control/star_control_sub13.h"
 #include "titanic/star_control/surface_fader.h"
 #include "titanic/star_control/error_code.h"
@@ -41,7 +41,7 @@ private:
 	CStarControl *_owner;
 	CStarField *_starField;
 	CVideoSurface *_videoSurface;
-	CStarControlSub12 _sub12;
+	CStarCamera _camera;
 	bool _hasReference;
 	CStarControlSub13 _sub13;
 	CSurfaceFader _fader;
@@ -51,7 +51,7 @@ private:
 	bool _showingPhoto;
 private:
 	bool fn1();
-	void fn18(CStarControlSub12 *sub12);
+	void fn18(CStarCamera *camera);
 	void fn19(int v);
 
 	void randomizeVectors1(FVector &v1, FVector &v2);





More information about the Scummvm-git-logs mailing list