From 1148a0c566863751256ea9c6b04dea236dc3b2be Mon Sep 17 00:00:00 2001
From: EndrII <EndrIIMail@gmail.com>
Date: Wed, 11 Aug 2021 00:21:22 +0300
Subject: [PATCH] begin refactoring init level system

---
 src/Core/Crawl.qrc                    |   1 +
 src/Core/Crawl/defaultcontrol.h       |   5 +-
 src/Core/Crawl/iitem.h                |   1 +
 src/Core/Crawl/ilevel.cpp             |  27 ++++++
 src/Core/Crawl/ilevel.h               |  38 +++++++-
 src/Core/Crawl/ipreviewscaneworld.cpp |  47 +++++++++
 src/Core/Crawl/ipreviewscaneworld.h   |  43 ++++++++
 src/Core/Crawl/iworld.cpp             |  14 +--
 src/Core/Crawl/iworld.h               |  11 ++-
 src/Core/Crawl/iworlditem.cpp         |  17 +++-
 src/Core/Crawl/iworlditem.h           |   3 +-
 src/Core/Crawl/player.cpp             |  20 ++++
 src/Core/Crawl/player.h               |  31 ++++++
 src/Core/Crawl/snake.h                |   5 +-
 src/Core/Crawl/startdata.cpp          |  38 ++++++++
 src/Core/Crawl/startdata.h            |  61 ++++++++++++
 src/Core/CrawlModule/PreviewScane.qml | 135 ++++++++++++++++++++++++++
 17 files changed, 474 insertions(+), 23 deletions(-)
 create mode 100644 src/Core/Crawl/ipreviewscaneworld.cpp
 create mode 100644 src/Core/Crawl/ipreviewscaneworld.h
 create mode 100644 src/Core/Crawl/startdata.cpp
 create mode 100644 src/Core/Crawl/startdata.h
 create mode 100644 src/Core/CrawlModule/PreviewScane.qml

diff --git a/src/Core/Crawl.qrc b/src/Core/Crawl.qrc
index b3644af..b8766fd 100644
--- a/src/Core/Crawl.qrc
+++ b/src/Core/Crawl.qrc
@@ -24,5 +24,6 @@
         <file>CrawlCoreAssets/particles/smokeSprite.png</file>
         <file>CrawlModule/particles/Fire.qml</file>
         <file>CrawlModule/particles/Wint.qml</file>
+        <file>CrawlModule/PreviewScane.qml</file>
     </qresource>
 </RCC>
diff --git a/src/Core/Crawl/defaultcontrol.h b/src/Core/Crawl/defaultcontrol.h
index 249176d..fc65cc7 100644
--- a/src/Core/Crawl/defaultcontrol.h
+++ b/src/Core/Crawl/defaultcontrol.h
@@ -8,8 +8,7 @@
 #ifndef DEFAULTCONTROL_H
 #define DEFAULTCONTROL_H
 
-#include "icontrol.h"
-#include "global.h"
+#include "player.h"
 
 namespace CRAWL {
 
@@ -17,7 +16,7 @@ namespace CRAWL {
 /**
  * @brief The DefaultControl class This class contains default implementation of the game menu.
  */
-class CRAWL_EXPORT DefaultControl : public IControl {
+class CRAWL_EXPORT DefaultControl : public Player {
     Q_OBJECT
 public:
     DefaultControl();
diff --git a/src/Core/Crawl/iitem.h b/src/Core/Crawl/iitem.h
index 5e2936d..1bf3ade 100644
--- a/src/Core/Crawl/iitem.h
+++ b/src/Core/Crawl/iitem.h
@@ -22,6 +22,7 @@ class CRAWL_EXPORT IItem
 {
 public:
     IItem();
+    virtual ~IItem() = default;
 
     /**
      * @brief itemTextId All items contains own ids, override this method for create base for generate new item id.
diff --git a/src/Core/Crawl/ilevel.cpp b/src/Core/Crawl/ilevel.cpp
index 33bb3c3..e08d667 100644
--- a/src/Core/Crawl/ilevel.cpp
+++ b/src/Core/Crawl/ilevel.cpp
@@ -5,4 +5,31 @@
 //# of this license document, but changing it is not allowed.
 //#
 
+#include "iitem.h"
 #include "ilevel.h"
+#include "iworld.h"
+
+namespace CRAWL {
+
+ILevel::~ILevel() {
+    delete _world;
+    delete _previewScane;
+}
+
+IWorld *ILevel::world() {
+    return _world;
+}
+
+IWorld *ILevel::previewScane() {
+    return _previewScane;
+}
+
+void ILevel::setWorld(IWorld *newWorld) {
+    _world = newWorld;
+}
+
+void ILevel::setPreviewScane(IWorld *newPreviewScane) {
+    _previewScane = newPreviewScane;
+}
+
+}
diff --git a/src/Core/Crawl/ilevel.h b/src/Core/Crawl/ilevel.h
index 5cad4c6..bddf661 100644
--- a/src/Core/Crawl/ilevel.h
+++ b/src/Core/Crawl/ilevel.h
@@ -5,6 +5,8 @@
 //# of this license document, but changing it is not allowed.
 //#
 
+#include <QHash>
+
 #ifndef LEVEL_H
 #define LEVEL_H
 
@@ -12,22 +14,54 @@ namespace CRAWL {
 
 
 class IWorld;
+class IItem;
 
 /**
  * @brief The ILevel class This interface make the world instance object.
  * All levels libraries should be override this interface.
+ *
  */
 class ILevel
 {
 public:
     ILevel() = default;
-    virtual ~ILevel() = default;
+    virtual ~ILevel();
 
     /**
      * @brief world This method should be return pointer to the level world.
      * @return pointer to the level world.
+     * @see ILevel::setWorld
      */
-    virtual IWorld* world() = 0;
+    IWorld* world();
+
+    /**
+     * @brief previewScane this method should be create a model of the snake preview scane.
+     * @return pointer to the model of the preview scane.
+     * @see ILevel::setPreviewScane
+     */
+    IWorld* previewScane();
+
+protected:
+    /**
+     * @brief setWorld This method sets new world pointer.
+     * @param newWorld This is new world model object.
+     * @note The @a newWorld item will be distroued with the parent object.
+     * @see ILevel::world
+     */
+    void setWorld(IWorld *newWorld);
+
+    /**
+     * @brief setPreviewScane This method sets new object for the preview scane.
+     * @param newPreviewScane This is new value of the preview scane.
+     * @note The @a newPreviewScane item will be distroued with the parent object.
+     * @see ILevel::previewScane
+     */
+    void setPreviewScane(IWorld *newPreviewScane);
+
+private:
+
+    IWorld* _world = nullptr;
+    IWorld* _previewScane = nullptr;
 };
 
 }
diff --git a/src/Core/Crawl/ipreviewscaneworld.cpp b/src/Core/Crawl/ipreviewscaneworld.cpp
new file mode 100644
index 0000000..947b995
--- /dev/null
+++ b/src/Core/Crawl/ipreviewscaneworld.cpp
@@ -0,0 +1,47 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#include "ipreviewscaneworld.h"
+namespace CRAWL {
+
+IPreviewScaneWorld::IPreviewScaneWorld() {
+
+}
+
+QString IPreviewScaneWorld::itemTextId() const {
+    return "preview";
+}
+
+QString IPreviewScaneWorld::itemName() const {
+    return itemTextId();
+}
+
+QString IPreviewScaneWorld::description() const {
+    return "";
+}
+
+QString IPreviewScaneWorld::image() const {
+    return "";
+}
+
+int IPreviewScaneWorld::cost() const {
+    return 0;
+}
+
+int IPreviewScaneWorld::requiredTier() const {
+    return 0;
+}
+
+bool IPreviewScaneWorld::start(const StartData& config) {
+    _configuration = config;
+}
+
+bool IPreviewScaneWorld::stop() {
+
+}
+
+}
diff --git a/src/Core/Crawl/ipreviewscaneworld.h b/src/Core/Crawl/ipreviewscaneworld.h
new file mode 100644
index 0000000..a38b7ed
--- /dev/null
+++ b/src/Core/Crawl/ipreviewscaneworld.h
@@ -0,0 +1,43 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#ifndef IPREVIEWSCANEWORLD_H
+#define IPREVIEWSCANEWORLD_H
+
+#include "iworld.h"
+
+namespace CRAWL {
+
+/**
+ * @brief The IPreviewScaneWorld class is interface of the all preview scanes models.
+ */
+class CRAWL_EXPORT IPreviewScaneWorld: public IWorld
+{
+public:
+    IPreviewScaneWorld();
+
+    // IItem interface
+public:
+    QString itemTextId() const override final;
+    QString itemName() const override final;
+    QString description() const override final;
+    QString image() const override final;
+    int cost() const override final;
+    int requiredTier() const override final;
+
+    bool start(const StartData &config) override;
+    bool stop() override;
+
+signals:
+    void sigPrepareIsFinished(const StartData& config);
+
+private:
+    StartData _configuration;
+};
+
+}
+#endif // IPREVIEWSCANEWORLD_H
diff --git a/src/Core/Crawl/iworld.cpp b/src/Core/Crawl/iworld.cpp
index 528d7e7..337fd80 100644
--- a/src/Core/Crawl/iworld.cpp
+++ b/src/Core/Crawl/iworld.cpp
@@ -20,6 +20,7 @@
 #include "chrono"
 #include "diff.h"
 #include "eventserver.h"
+#include "player.h"
 
 namespace CRAWL {
 
@@ -40,9 +41,11 @@ IWorld::~IWorld() {
     delete _eventServer;
 }
 
-void IWorld::init() {prepare();}
+void IWorld::init() {
+    prepare();
+}
 
-IControl *IWorld::initUserInterface() const {
+Player *IWorld::initUserInterface() const {
     return new DefaultControl;
 }
 
@@ -83,12 +86,13 @@ void IWorld::initPlayerControl(IControl *control) {
     }
 }
 
-bool IWorld::start() {
+bool IWorld::start(const StartData& config) {
     _player->setposition({0,0,0});
 
     setWorldStatus(WorldStatus::Game);
     _backgroundAI->stopAI();
     _player->setControl(_userInterface);
+    setPlayer(initPlayer());
 
 
     worldChanged(_worldRules->cbegin());
@@ -151,8 +155,6 @@ bool IWorld::prepare() {
     _worldRules = initWorldRules();
 
     setHdr(initHdrBackGround());
-    setPlayer(initPlayer());
-    _player->initOnWorld(this, _player);
     _userInterface = initUserInterface();
     _backgroundAI = initBackGroundAI();
 
@@ -283,7 +285,7 @@ void IWorld::addAtomicItem(IWorldItem* obj) {
     _items.insert(obj->guiId(), obj);
     _itemsGroup.insert(obj->className(), obj->guiId());
 
-    obj->initOnWorld(this, _player);
+    obj->initOnWorld(this);
 }
 
 bool IWorld::removeAtomicItem(int id) {
diff --git a/src/Core/Crawl/iworld.h b/src/Core/Crawl/iworld.h
index 6f712ab..32de6b7 100644
--- a/src/Core/Crawl/iworld.h
+++ b/src/Core/Crawl/iworld.h
@@ -11,6 +11,7 @@
 #include "gameresult.h"
 #include "iitem.h"
 #include "playableobject.h"
+#include "startdata.h"
 
 #include <QHash>
 #include <QMap>
@@ -42,6 +43,7 @@ class IControl;
 class IAI;
 class IWorldLight;
 class EventServer;
+class Player;
 
 /**
  * @brief WorldObjects This is map list of the avalable objects and its count on a lvl-long point.
@@ -110,7 +112,7 @@ public:
      * @note The base implementation return default user interface.
      * @return pointer to userInterface.
      */
-    virtual IControl* initUserInterface() const;
+    virtual Player *initUserInterface() const;
 
     /**
      * @brief initHdrBackGround The implementation of this method must be return valid path to the hdr image map.
@@ -127,17 +129,18 @@ public:
 
     /**
      * @brief initPlayerControl This method should be configure all connections of @a control object.
-     * @brief control This is control object
+     * @param control This is control object
      * @note override this method if you have own IControl object.
      */
     virtual void initPlayerControl(IControl* control);
 
     /**
      * @brief start This method will be invoked when user click start button.
+     * @param config This is initialize level arguments.
      * @note The Default implementation reset all positions for all objects.
      * @return true if game started successful.
      */
-    virtual bool start();
+    virtual bool start(const StartData &config);
 
     /**
      * @brief stop This methos will be invoked when user click to return to main menu button.
@@ -487,8 +490,8 @@ private:
     WorldRule::const_iterator _currendWorldLevel;
 
     PlayableObject *_player = nullptr;
-    IControl *_userInterface = nullptr;
     IAI *_backgroundAI = nullptr;
+    Player *_userInterface = nullptr;
     int _worldStatus = 0;
     QHash<QString, std::function<IWorldItem*()>> _registeredTypes;
 
diff --git a/src/Core/Crawl/iworlditem.cpp b/src/Core/Crawl/iworlditem.cpp
index dd18590..94195b3 100644
--- a/src/Core/Crawl/iworlditem.cpp
+++ b/src/Core/Crawl/iworlditem.cpp
@@ -30,10 +30,17 @@ const IWorldItem *IWorldItem::getItem(int id) const {
 }
 
 const IWorldItem *IWorldItem::getPlayer() const {
-    return _playerObject;
+    if (!_world)
+        return nullptr;
+    return static_cast<const IWorldItem *>(_world->player());
 }
 
 void IWorldItem::render(unsigned int) {
+    auto _playerObject = getPlayer();
+
+    if (!_playerObject)
+        return;
+
     if (_playerObject->position().distanceToPoint(position()) >
             _world->cameraReleativePosition().z() * 3) {
         respawn();
@@ -42,9 +49,8 @@ void IWorldItem::render(unsigned int) {
 
 void IWorldItem::init() {}
 
-void IWorldItem::initOnWorld(const IWorld *world, const IWorldItem * player) {
+void IWorldItem::initOnWorld(const IWorld *world) {
     _world = world;
-    _playerObject = player;
 }
 
 int IWorldItem::supportedEvents() const {
@@ -60,6 +66,11 @@ void IWorldItem::destroy() {
 }
 
 void IWorldItem::respawn() {
+    auto _playerObject = getPlayer();
+
+    if (!_playerObject)
+        return;
+
     float dX = _world->cameraReleativePosition().z() * 2 +
             (rand() % static_cast<int>(_world->cameraReleativePosition().z()));
 
diff --git a/src/Core/Crawl/iworlditem.h b/src/Core/Crawl/iworlditem.h
index 8e60047..6df04b9 100644
--- a/src/Core/Crawl/iworlditem.h
+++ b/src/Core/Crawl/iworlditem.h
@@ -135,10 +135,9 @@ protected:
     void dropSupportOfEvent(int depricatedEvent);
 
 private:
-    void initOnWorld(const IWorld* world, const IWorldItem *player);
+    void initOnWorld(const IWorld* world);
 
     const IWorld* _world = nullptr;
-    const IWorldItem *_playerObject = nullptr;
 
     bool _fDecorative = true;
     bool _fDistroy = false;
diff --git a/src/Core/Crawl/player.cpp b/src/Core/Crawl/player.cpp
index f3c5baa..0bb6bdf 100644
--- a/src/Core/Crawl/player.cpp
+++ b/src/Core/Crawl/player.cpp
@@ -6,9 +6,29 @@
 //#
 
 #include "player.h"
+#include <user.h>
+
 namespace CRAWL {
 
 Player::Player() {
 
 }
+
+void Player::addXp(int newXp) {
+    if (_userData)
+        _userData->setXp(_userData->getXp() + newXp);
+}
+
+void Player::addMoney(int money) {
+    if (_userData)
+        _userData->setMoney(_userData->getMoney() + money);
+}
+
+User *Player::userData() const {
+    return _userData;
+}
+
+void Player::setUserData(User *newUserData) {
+    _userData = newUserData;
+}
 }
diff --git a/src/Core/Crawl/player.h b/src/Core/Crawl/player.h
index 4a33df0..5808846 100644
--- a/src/Core/Crawl/player.h
+++ b/src/Core/Crawl/player.h
@@ -11,8 +11,11 @@
 
 #include "icontrol.h"
 
+
 namespace CRAWL {
 
+class User;
+
 /**
  * @brief The Player class is main class of users.
  */
@@ -21,6 +24,34 @@ class CRAWL_EXPORT Player: public IControl
     Q_OBJECT
 public:
     Player();
+
+    /**
+     * @brief addXp This method add new xp to palyer.
+     * @param newXp this is value of experience
+     */
+    void addXp(int newXp);
+
+    /**
+     * @brief addMoney This method add money to user.
+     * @param money added amount of money
+     */
+    void addMoney(int money);
+
+    /**
+     * @brief userData This method sets user that control this object.
+     * @return current control user.
+     */
+    User *userData() const;
+
+    /**
+     * @brief setUserData This method sets user that control this object.
+     * @param newUserData This is new pointer of the new user.
+     */
+    void setUserData(User *newUserData);
+
+private:
+
+    User *_userData = nullptr;
 };
 }
 #endif // PLAYER_H
diff --git a/src/Core/Crawl/snake.h b/src/Core/Crawl/snake.h
index 4fc5423..669c425 100644
--- a/src/Core/Crawl/snake.h
+++ b/src/Core/Crawl/snake.h
@@ -8,6 +8,7 @@
 #ifndef CRAWL_SNAKE_H
 #define CRAWL_SNAKE_H
 
+#include "iitem.h"
 #include "playableobject.h"
 #include "Extensions/autogenerateclaster.h"
 
@@ -18,7 +19,7 @@ class SnakeItem;
 /**
  * @brief The Snake class This class implement render mehod for snake object.
  */
-class CRAWL_EXPORT Snake : public PlayableObject, public AutoGenerateClaster
+class CRAWL_EXPORT Snake : public PlayableObject, public AutoGenerateClaster, public IItem
 {
     Q_OBJECT
 public:
@@ -34,7 +35,6 @@ public:
     void remove(int id) override;
     void init() override;
 
-
     // IPlayer interface
     /**
      * @brief lengthBetwinItems This method return length betwin snake items;
@@ -132,7 +132,6 @@ private:
     float _speed;
 
     int _hp = 100;
-
 };
 
 }
diff --git a/src/Core/Crawl/startdata.cpp b/src/Core/Crawl/startdata.cpp
new file mode 100644
index 0000000..98761b7
--- /dev/null
+++ b/src/Core/Crawl/startdata.cpp
@@ -0,0 +1,38 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#include "startdata.h"
+
+namespace CRAWL {
+
+StartData::StartData() {
+
+}
+
+StartData::StartData(User *player, int snake) {
+    setPlayer(player);
+    setSnakeType(snake);
+}
+
+
+User *StartData::player() const{
+    return _player;
+}
+
+void StartData::setPlayer(User *newPlayer) {
+    _player = newPlayer;
+}
+
+int StartData::snakeType() const {
+    return _snakeType;
+}
+
+void StartData::setSnakeType(int newSnake) {
+    _snakeType = newSnake;
+}
+
+}
diff --git a/src/Core/Crawl/startdata.h b/src/Core/Crawl/startdata.h
new file mode 100644
index 0000000..8cd7758
--- /dev/null
+++ b/src/Core/Crawl/startdata.h
@@ -0,0 +1,61 @@
+//#
+//# Copyright (C) 2021-2021 QuasarApp.
+//# Distributed under the GPLv3 software license, see the accompanying
+//# Everyone is permitted to copy and distribute verbatim copies
+//# of this license document, but changing it is not allowed.
+//#
+
+#ifndef STARTDATA_H
+#define STARTDATA_H
+
+namespace CRAWL {
+
+class User;
+class PlayableObject;
+
+/**
+ * @brief The StartData class This class contains arguments for starting new game session.
+ */
+class StartData
+{
+public:
+    StartData();
+
+    StartData(User * player, int snake);
+
+    /**
+     * @brief player This method return pointer to user that will be control player snake.
+     * @return pointer to user that will be control player snake.
+     * @see StartData::setPlayer
+     */
+    User *player() const;
+
+    /**
+     * @brief setPlayer This method sets
+     * @param newPlayer This is new object of the user.
+     * @see StartData::player
+     */
+    void setPlayer(User *newPlayer);
+
+    /**
+     * @brief snakeType This method return select for game snake object type.
+     * @return select for game snake object.
+     * @see StartData::setSnakeType
+     */
+    int snakeType() const;
+
+    /**
+     * @brief setSnakeType This method sets new selected for game object type,
+     * @param newSnake This is  new selected for game object
+     * @see StartData::snakeType
+     */
+    void setSnakeType(int newSnake);
+
+private:
+    User *_player = nullptr;
+    int _snakeType;
+};
+
+}
+
+#endif // STARTDATA_H
diff --git a/src/Core/CrawlModule/PreviewScane.qml b/src/Core/CrawlModule/PreviewScane.qml
new file mode 100644
index 0000000..e7ed5a1
--- /dev/null
+++ b/src/Core/CrawlModule/PreviewScane.qml
@@ -0,0 +1,135 @@
+import QtQuick
+import QtQuick3D
+import QtQuick.Controls.Material
+import QtQuick.Controls
+import QtQuick.Layouts
+import QtQuick3D.Particles3D
+
+
+View3D {
+    id: scene;
+
+    property var model: null;
+    renderMode: View3D.Offscreen
+
+    PerspectiveCamera {
+        id: camera
+        position: Qt.vector3d(0,0, 100)
+    }
+
+    SceneEnvironment {
+        id: defautlBackground
+        backgroundMode: SceneEnvironment.Color
+        clearColor: "#777777"
+    }
+
+    environment: /*(privateRoot.world)? background:*/ defautlBackground
+
+    ParticleSystem3D {
+        id: privateRoot
+        property var arrayObjects: []
+        property var world: (model)? model.world: null
+
+        property var gameMenuModel: (model)? model.menu: null
+        property var player: (world)? world.player: null
+        property var releativeCameraPosition: (world)? world.cameraReleativePosition: null
+
+        function add (cppObjId) {
+            if (!model) {
+                console.log("create object fail")
+                return;
+            }
+
+            const objModel = model.getGameObject(cppObjId);
+
+            if (!objModel) {
+                console.log("object model not found");
+                return;
+            }
+
+            var viewTemplate = objModel.viewTemplate;
+
+            var temp = Qt.createComponent(viewTemplate)
+            if (temp.status === Component.Ready) {
+                var obj = temp.createObject(privateRoot)
+                obj.model = objModel;
+                arrayObjects.push(obj)
+            } else {
+                console.log("wrong viewTemplate in model " + temp.errorString());
+            }
+        }
+
+        function remove(id) {
+            if (typeof id !== "number" || id < 0) {
+                console.log("id not found");
+                return;
+            }
+
+            for (var i = 0; i < arrayObjects.length; ++i) {
+                if (id === arrayObjects[i].guiId) {
+                    arrayObjects[i].destroy();
+                    arrayObjects.splice(i,1);
+
+                }
+            }
+        }
+
+        Connections {
+            target: privateRoot.world;
+            function onSigOBjctsListChanged(diff) {
+                if (!diff) {
+                    console.log("diff not found");
+                    return;
+                }
+
+                let tempDifRem = [];
+                tempDifRem = diff.getRemoveIds();
+                let tempDifAdd = [];
+                tempDifAdd = diff.getAddedIds();
+
+                for (let i = 0; i < tempDifAdd.length; ++i) {
+                    privateRoot.add(tempDifAdd[i]);
+                }
+
+                for (let j = 0; j < tempDifRem.length; ++j) {
+                    privateRoot.remove(tempDifRem[j]);
+                }
+            }
+        }
+
+        Connections {
+            target: privateRoot;
+
+            function onGameMenuModelChanged() {
+                if (!privateRoot.gameMenuModel) {
+                    return;
+                }
+
+                const comp = Qt.createComponent(privateRoot.gameMenuModel.view);
+                if (comp.status === Component.Ready) {
+                    if (privateRoot.gameMenu) {
+                        privateRoot.gameMenu.destroy()
+                    }
+
+                    privateRoot.gameMenu = comp.createObject(scene);
+                    if (privateRoot.gameMenu === null) {
+                        // Error Handling
+                        console.log("Error creating object");
+                    }
+
+                    privateRoot.gameMenu.model = privateRoot.gameMenuModel;
+
+                } else if (comp.status === Component.Error) {
+                    // Error Handling
+                    console.log("Error loading component: " + privateRoot.gameMenuModel.view, comp.errorString());
+                }
+            }
+
+            function onShowMenuChanged() {
+                if (privateRoot.gameMenu) {
+                    privateRoot.gameMenu.visible = !showMenu
+                }
+            }
+        }
+    }
+}