Selaa lähdekoodia

Start of categorySelection

Axel Nordh 5 vuotta sitten
vanhempi
sitoutus
c0bc1fd02d

+ 22 - 0
Assets/CategorySelection.cs

@@ -0,0 +1,22 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class CategorySelection : MonoBehaviour
+{
+
+    [SerializeField] Text CategoryNameText;
+    [SerializeField] Toggle selectionToggle;
+    // Start is called before the first frame update
+    void Start()
+    {
+        
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+}

+ 11 - 0
Assets/CategorySelection.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 47ede1e2fe705c64bb45674ed9c3d602
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 404 - 0
Assets/Prefab/CategorySelectionPrefab.prefab

@@ -0,0 +1,404 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1371924421486162242
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3142876351548256722}
+  - component: {fileID: 1739782199907424086}
+  - component: {fileID: 3041980410179559781}
+  - component: {fileID: 3390165171141065768}
+  m_Layer: 5
+  m_Name: CategorySelectionPrefab
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &3142876351548256722
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1371924421486162242}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 2125646616499892886}
+  - {fileID: 6722199714587859110}
+  m_Father: {fileID: 0}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 0, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 30}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1739782199907424086
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1371924421486162242}
+  m_CullTransparentMesh: 0
+--- !u!114 &3041980410179559781
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1371924421486162242}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 0.392}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &3390165171141065768
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1371924421486162242}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 47ede1e2fe705c64bb45674ed9c3d602, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  CategoryNameText: {fileID: 4160543270962120108}
+  selectionToggle: {fileID: 2211450434897073246}
+--- !u!1 &2829190927174883982
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 224279465433933413}
+  - component: {fileID: 8544897705812387654}
+  - component: {fileID: 2981709550003293134}
+  m_Layer: 5
+  m_Name: Background
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &224279465433933413
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2829190927174883982}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 8825892538204594810}
+  m_Father: {fileID: 6722199714587859110}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 20, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &8544897705812387654
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2829190927174883982}
+  m_CullTransparentMesh: 0
+--- !u!114 &2981709550003293134
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2829190927174883982}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!1 &5381993157718651365
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 6722199714587859110}
+  - component: {fileID: 2211450434897073246}
+  m_Layer: 5
+  m_Name: SelectionToggle
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &6722199714587859110
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5381993157718651365}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children:
+  - {fileID: 224279465433933413}
+  m_Father: {fileID: 3142876351548256722}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 1, y: 0.5}
+  m_AnchorMax: {x: 1, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 90, y: 30}
+  m_Pivot: {x: 1, y: 0.5}
+--- !u!114 &2211450434897073246
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 5381993157718651365}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 2981709550003293134}
+  toggleTransition: 1
+  graphic: {fileID: 8859562840450426656}
+  m_Group: {fileID: 0}
+  onValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_IsOn: 1
+--- !u!1 &6736812059776804670
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2125646616499892886}
+  - component: {fileID: 6054124670752630374}
+  - component: {fileID: 4160543270962120108}
+  m_Layer: 5
+  m_Name: CategoryName
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2125646616499892886
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6736812059776804670}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 3142876351548256722}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0.5}
+  m_AnchorMax: {x: 0, y: 0.5}
+  m_AnchoredPosition: {x: 0.000015258789, y: 0}
+  m_SizeDelta: {x: 490, y: 30}
+  m_Pivot: {x: 0, y: 0.5}
+--- !u!222 &6054124670752630374
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6736812059776804670}
+  m_CullTransparentMesh: 0
+--- !u!114 &4160543270962120108
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 6736812059776804670}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 14
+    m_FontStyle: 0
+    m_BestFit: 1
+    m_MinSize: 10
+    m_MaxSize: 18
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: New Text
+--- !u!1 &7890308777758596518
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 8825892538204594810}
+  - component: {fileID: 1191492277463693299}
+  - component: {fileID: 8859562840450426656}
+  m_Layer: 5
+  m_Name: Checkmark
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &8825892538204594810
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7890308777758596518}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 224279465433933413}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 20, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1191492277463693299
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7890308777758596518}
+  m_CullTransparentMesh: 0
+--- !u!114 &8859562840450426656
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 7890308777758596518}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1

+ 7 - 0
Assets/Prefab/CategorySelectionPrefab.prefab.meta

@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 0db0465e0b7d9ed4898de28a6b83a1b7
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 717 - 67
Assets/Scenes/NewGame.unity


+ 800 - 788
Assets/Scripts/Database/Database.cs

@@ -1,788 +1,800 @@
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-using Mono.Data.Sqlite;
-using System.Data;
-using System;
-using UnityEngine.Networking;
-using System.IO;
-
-public class Database : MonoBehaviour {
-    private const string onlineQuestionsUrl = "narkampen.nordh.xyz/narKampen/dbFiles/Question.php";
-    private const string serverUrl = "narkampen.nordh.xyz/narKampen/dbFiles/";
-    string connectionType;
-    string databaseUrl;
-    string gameMode;
-    int winAmount = -1;
-    int questionTimer = -1;
-
-    public GameObject questionCardPrefab;
-
-    private static Database instance;
-    public static Database Instance { get {
-            if (instance == null) {
-                instance = GameObject.FindObjectOfType<Database>();
-                if (instance == null) {
-                    GameObject container = new GameObject("Database");
-                    instance = container.AddComponent<Database>();
-                }
-            }
-            return instance;
-        }
-    }
-
-    IDbConnection conn;
-
-    internal void GetCategories(List<CategoryPanel.Category> list, string gameMode) {
-        if (gameMode.Equals("Online")) {
-            OnlineDatabase.Instance.GetCategories(list);
-        } else {
-            string sql = "SELECT name, r, g, b, a, id FROM category";
-            IDbCommand cmd = GetConnection();
-            cmd.CommandText = sql;
-
-            IDataReader reader = cmd.ExecuteReader();
-
-            while (reader.Read()) {
-                CategoryPanel.Category cat = new CategoryPanel.Category();
-
-                byte r = (byte)reader.GetInt32(1);
-                byte g = (byte)reader.GetInt32(2);
-                byte b = (byte)reader.GetInt32(3);
-                byte a = (byte)reader.GetInt32(4);
-                cat.color = new Color32(r, g, b, a);
-                cat.name = reader.GetString(0);
-                cat.id = reader.GetInt32(5);
-
-                list.Add(cat);
-            }
-            CloseConnection();
-        }
-    }
-
-    [Serializable]
-    public class Question {
-        public string question;
-        public string answer;
-        public string id;
-        public string category;
-    }
-
-    [Serializable]
-    public class Questions {
-        public List<Question> questionsList = new List<Question>();
-    }
-
-    [Serializable]
-    public class PlayerInfo {
-        public string username;
-        public string status;
-    }
-
-    [Serializable]
-    public class PlayerInfos {
-        public List<PlayerInfo> playerInfoList = new List<PlayerInfo>();
-    }
-
-    [Serializable]
-    public class Category {
-        public int r;
-        public int g;
-        public int b;
-        public int a;
-        public int id;
-        public string name;
-    }
-
-    [Serializable]
-    public class Categories {
-        public List<Category> categoryList = new List<Category>();
-    }
-
-    [Serializable]
-    public class OnlineGame {
-        public string id;
-        public string winNumber;
-        public string answerTimer;
-        public string roundTimeLimit;
-        public string currentPlayer;
-        public string round;
-        public string startDate;
-        public string LastPlayedDate;
-        public string finishedDate;
-        public string status;
-    }
-
-    [Serializable]
-    public class OnlineGames {
-        public List<OnlineGame> onlineGamesList = new List<OnlineGame>();
-    }
-
-    [Serializable]
-    public class UserName {
-        public string id;
-        public string username;
-    }
-
-    [Serializable]
-    public class UserNames {
-        public List<UserName> usernamesList = new List<UserName>();
-    }
-
-    internal void SetLastPlayedDate(int gameId) {
-        if (gameMode.Equals("Online")) {
-
-        }
-        string sql = "UPDATE game SET lastPlayedDate = DATE() WHERE id = " + gameId;
-        IDbCommand cmd = GetConnection();
-        cmd.CommandText = sql;
-        cmd.ExecuteNonQuery();
-
-        cmd.Dispose();
-        CloseConnection();
-    }
-
-    private IDbCommand GetConnection() {
-        if (databaseUrl == null) { // ej bra lösning för online
-            SetLocalOrOnline("Local");
-        }
-        conn = new SqliteConnection(databaseUrl);
-        conn.Open();
-        IDbCommand cmd = conn.CreateCommand();
-        return cmd;
-    }
-
-
-
-    private void CloseConnection() {
-        conn.Close();
-    }
-
-    string questionString = "";
-    string answerString = "";
-    string idString = "";
-    string categoryString = "";
-    private int round = -1;
-    private string SearchString;
-
-    public string QuestionString { get => questionString; set => questionString = value; }
-
-
-    private void Start() {
-        if (instance == null) {
-            instance = this;
-        }
-
-        if (databaseUrl == null || databaseUrl.Equals("")) {
-            SetLocalOrOnline("Local"); // Temporary, should not be needed after local testing
-        }
-    }
-
-    internal void SignIn(string username, int userId, bool keepSigendIn) {
-        int ksi = 0;
-        if (keepSigendIn) {
-            ksi = 1;
-        }
-        string sql = "INSERT OR REPLACE INTO userSettings (username, userId, keepSignedIn) VALUES ('" + username + "', " + userId + "," + ksi + ")";
-        IDbCommand cmd = GetConnection();
-        cmd.CommandText = sql;
-
-        cmd.ExecuteNonQuery();
-
-        sql = "INSERT OR REPLACE INTO settings (name, value) VALUES ('signedInUser', '" + username + "')";
-        cmd.CommandText = sql;
-        cmd.ExecuteNonQuery();
-
-        CloseConnection();
-    }
-
-    internal bool IsKeepSignedIn() {
-        string sql = "SELECT keepSignedIn FROM userSettings";
-        IDbCommand cmd = GetConnection();
-        cmd.CommandText = sql;
-
-        IDataReader reader = cmd.ExecuteReader();
-        int res = 0;
-        while (reader.Read()) {
-            res = reader.GetInt32(0);
-        }
-        return res == 1;
-    }
-
-    internal KeyValuePair<int, string> GetSignedInUser() {
-        // string sql = "SELECT userId, username FROM userSettings";
-        string sql = "SELECT userId, username FROM userSettings WHERE username = (SELECT value FROM settings WHERE name = 'signedInUser')";
-        IDbCommand cmd = GetConnection();
-        cmd.CommandText = sql;
-        int userId = -1;
-        string username = "";
-        IDataReader reader = cmd.ExecuteReader();
-        while (reader.Read()) {
-            userId = reader.GetInt32(0);
-            username = reader.GetString(1);
-        }
-
-        CloseConnection();
-        return new KeyValuePair<int, string>(userId, username);
-    }
-
-    internal void LogoutUser() {
-        // string sql = "UPDATE userSettings SET keepSignedIn = 0";
-        string sql = "DELETE FROM userSettings";
-        IDbCommand cmd = GetConnection();
-        cmd.CommandText = sql;
-        cmd.ExecuteNonQuery();
-
-        sql = "DELETE FROM settings WHERE name = 'signedInUser'";
-        cmd.CommandText = sql;
-        cmd.ExecuteNonQuery();
-
-        CloseConnection();
-
-
-    }
-
-    internal int GetQuestionTimer(int gameId, string gameMode) {
-        if (questionTimer == -1) {
-            string sql = "SELECT answerTimer FROM game WHERE id = " + gameId;
-            if (databaseUrl == null) {
-                SetLocalOrOnline("Local");
-            }
-            IDbCommand cmd = GetConnection();
-            cmd.CommandText = sql;
-            IDataReader reader = cmd.ExecuteReader();
-
-            while (reader.Read()) {
-                questionTimer = reader.GetInt32(0);
-            }
-            reader.Close();
-            cmd.Dispose();
-        }
-        CloseConnection();
-        return this.questionTimer;
-    }
-    
-    internal List<LocalGameScript> GetLocalGames(GameObject prefab) {
-        List<LocalGameScript> games = new List<LocalGameScript>();
-        string sql = "SELECT game.*, name, localUsers.id as userId FROM game INNER JOIN localGamePlayers on game.id = localGamePlayers.gameId INNER JOIN localUsers on playerId = localUsers.id order by game.id ASC, userId ASC";
-        IDbConnection conn = new SqliteConnection(databaseUrl);
-        conn.Open();
-        IDbCommand cmd = conn.CreateCommand();
-        cmd.CommandText = sql;
-        IDataReader reader = cmd.ExecuteReader();
-        int currentGame = -1;
-        GameObject localGame;
-        LocalGameScript lgs = null;
-
-        string currentPlayerName = "";
-        int currentPoints = 0;
-        while (reader.Read()) {
-
-
-            if (currentGame != reader.GetInt32(0)) {
-                localGame = Instantiate(prefab, new Vector2(0, 0), Quaternion.identity) as GameObject;
-                lgs = localGame.GetComponent<LocalGameScript>();
-
-                lgs.GameId = reader.GetInt32(0);
-                lgs.GameMode = reader.GetString(1);
-                lgs.QuestionsNeededToWin = reader.GetInt32(2).ToString();
-                lgs.AnswerTimer = reader.GetInt32(3);
-                lgs.NumberOfPlayers = reader.GetInt32(4).ToString();
-                lgs.CurrentPlayer = reader.GetString(5);
-                lgs.Round = reader.GetInt32(6).ToString();
-                lgs.StartDate = reader.GetString(7);
-                lgs.LastPlayedDate = reader.GetString(8);
-                lgs.FinishedDate = reader.IsDBNull(9) ? "" : reader.GetString(9);
-
-                currentPlayerName = reader.GetString(10);
-                currentPoints = GetPlayerPoints(reader.GetInt32(0), currentPlayerName);
-                lgs.AddPlayer(currentPlayerName, currentPoints);
-                games.Add(lgs);
-            } else if (currentGame == reader.GetInt32(0)) {
-                currentPlayerName = reader.GetString(10);
-                currentPoints = GetPlayerPoints(currentGame, currentPlayerName);
-                lgs.AddPlayer(currentPlayerName, currentPoints);
-            }
-
-            currentGame = reader.GetInt32(0);
-        }
-        reader.Close();
-        cmd.Dispose();
-        conn.Close();
-
-        return games;
-    }
-
-    internal void SetQuestionsLost(int gameId, string playerName, int questionsLost) {
-
-        string sql = "UPDATE localGamePlayers SET questionsLost = questionsLost + " + questionsLost + " WHERE gameId = " + gameId + " AND playerId = (SELECT id FROM localUsers WHERE  name = '" + playerName + "')";
-        IDbConnection conn = new SqliteConnection(databaseUrl);
-        conn.Open();
-        IDbCommand cmd = conn.CreateCommand();
-        cmd.CommandText = sql;
-
-        cmd.ExecuteNonQuery();
-
-        cmd.Dispose();
-        conn.Close();
-
-    }
-
-    internal void RemoveGame(int gameId) {
-        string sql = "DELETE FROM game WHERE id = " + gameId;
-
-        List<LocalGameScript> games = new List<LocalGameScript>();
-        IDbConnection conn = new SqliteConnection(databaseUrl);
-        conn.Open();
-        IDbCommand cmd = conn.CreateCommand();
-        cmd.CommandText = sql;
-        cmd.ExecuteNonQuery();
-
-        string deleteLockedQuestionsSql = "DELETE FROM usersLockedQuestions WHERE gameId = " + gameId;
-        cmd.CommandText = deleteLockedQuestionsSql;
-        cmd.ExecuteNonQuery();
-
-        cmd.Dispose();
-        conn.Close();
-    }
-
-    public string GetCurrentPlayer(int gameId, string gameMode) {
-        if (gameMode.Equals("Online")) {
-            return OnlineDatabase.Instance.GetCurrentPlayer(gameId);
-        }
-        string sql = "SELECT currentPlayer FROM game WHERE id = " + gameId;
-        IDbConnection conn = new SqliteConnection(databaseUrl);
-        conn.Open();
-        IDbCommand cmd = conn.CreateCommand();
-        cmd.CommandText = sql;
-        IDataReader reader = cmd.ExecuteReader();
-
-        string currentPlayer = "";
-        while (reader.Read()) {
-            currentPlayer = reader.GetString(0);
-        }
-        reader.Close();
-        cmd.Dispose();
-        conn.Close();
-
-        return currentPlayer;
-    }
-
-    public void SetCurrentPlayer(int gameId, string currentPlayer, string gameMode) {
-        if (gameMode.Equals("Online")) {
-            OnlineDatabase.Instance.SetCurrentPlayer(gameId, currentPlayer);
-        } else {
-            string sql = "UPDATE game SET currentPlayer = '" + currentPlayer + "' WHERE id = " + gameId;
-            IDbConnection conn = new SqliteConnection(databaseUrl);
-            conn.Open();
-            IDbCommand cmd = conn.CreateCommand();
-            cmd.CommandText = sql;
-            cmd.ExecuteNonQuery();
-
-            cmd.Dispose();
-            conn.Close();
-        }
-    }
-
-    internal int GetPlayerPoints(int gameId, string playerName) {
-        string sql = "SELECT count(*) FROM usersLockedQuestions WHERE gameId = " + gameId + " AND playerName = '" + playerName + "'";
-        IDbConnection conn = new SqliteConnection(databaseUrl);
-        conn.Open();
-        IDbCommand cmd = conn.CreateCommand();
-        cmd.CommandText = sql;
-        IDataReader reader = cmd.ExecuteReader();
-
-        int points = 0;
-        while (reader.Read()) {
-            points = reader.GetInt32(0);
-        }
-        reader.Close();
-        cmd.Dispose();
-        conn.Close();
-
-        return points;
-    }
-
-    internal void SetFinishedDate(int gameId, string finishedDate, string gameMode) {
-        if (gameMode.Equals("Online")) {
-            OnlineDatabase.Instance.SetFinishedDate(gameId, finishedDate);
-        } else {
-            string sql = "UPDATE game SET finishedDate = '" + finishedDate + "' WHERE id = " + gameId;
-            IDbConnection conn = new SqliteConnection(databaseUrl);
-            conn.Open();
-            IDbCommand cmd = conn.CreateCommand();
-            cmd.CommandText = sql;
-            cmd.ExecuteNonQuery();
-
-            cmd.Dispose();
-            conn.Close();
-        }
-    }
-
-    internal void SetRoundValue(int gameId, int round, string gameMode) {
-        if (gameMode.Equals("Online")) {
-            OnlineDatabase.Instance.SetRoundValue(gameId, round);
-        } else {
-            string sql = "UPDATE game SET round = " + round + " WHERE id = " + gameId;
-            IDbConnection conn = new SqliteConnection(databaseUrl);
-            conn.Open();
-            IDbCommand cmd = conn.CreateCommand();
-            cmd.CommandText = sql;
-            cmd.ExecuteNonQuery();
-
-            cmd.Dispose();
-            conn.Close();
-        }
-    }
-
-    internal int GetRoundValue(int gameId, string gameMode) {
-        if (gameMode.Equals("Online")) {
-            return OnlineDatabase.Instance.GetRoundValue(gameId);
-        }
-        if (this.round == -1) {
-            SetLocalOrOnline("Local");
-            string sql = "SELECT round FROM game WHERE id = " + gameId;
-            IDbConnection conn = new SqliteConnection(databaseUrl);
-            conn.Open();
-            IDbCommand cmd = conn.CreateCommand();
-            cmd.CommandText = sql;
-            IDataReader reader = cmd.ExecuteReader();
-            while (reader.Read()) {
-                this.round = reader.GetInt32(0);
-            }
-            reader.Close();
-            cmd.Dispose();
-            conn.Close();
-        }
-        return this.round;
-    }
-
-    internal List<KeyValuePair<string, int>> GetPlayersForGame(int gameId, string gameMode) {
-        if (gameMode.Equals("Online")) {
-            return OnlineDatabase.Instance.GetPlayersForGame(gameId);
-        }
-        string sql = "SELECT name, (SELECT count(*) FROM usersLockedQuestions WHERE playerName = localUsers.name AND gameId = " + gameId + ") as numAnswers  FROM localGamePlayers " +
-            "LEFT JOIN localUsers ON localGamePlayers.playerId = localUsers.id " +
-            "WHERE gameId = " + gameId;
-        IDbConnection conn = new SqliteConnection(databaseUrl);
-        conn.Open();
-        IDbCommand cmd = conn.CreateCommand();
-        cmd.CommandText = sql;
-
-        IDataReader reader = cmd.ExecuteReader();
-
-        List<KeyValuePair<string, int>> returnList = new List<KeyValuePair<string, int>>();
-        while (reader.Read()) {
-            KeyValuePair<string, int> player = new KeyValuePair<string, int>(reader.GetString(0), reader.GetInt32(1));
-            returnList.Add(player);
-        }
-
-        return returnList;
-    }
-
-    public string AnswerString { get => answerString; set => answerString = value; }
-    public string IdString { get => idString; set => idString = value; }
-    public string CategoryString { get => categoryString; set => categoryString = value; }
-
-    public void SetLocalOrOnline(string type) {
-        gameMode = type;
-        if (type.Equals("Local")) {
-            string databaseName = "narKampenLocal.db";
-            if (Application.platform == RuntimePlatform.Android) {
-                databaseUrl = Application.persistentDataPath + "/" + databaseName;
-
-                if (!File.Exists(databaseUrl)) {
-                    UnityWebRequest load = UnityWebRequest.Get("jar:file://" + Application.dataPath + "!/assets/" + databaseName);
-                    load.SendWebRequest();
-                    while (!load.isDone) { }
-
-                    File.WriteAllBytes(databaseUrl, load.downloadHandler.data);
-                }
-                databaseUrl = "URI=file:" + databaseUrl;
-            } else {
-                databaseUrl = "URI=file:" + Application.dataPath + "/narKampenLocal.db";
-            }
-        } else {
-            databaseUrl = onlineQuestionsUrl;
-        }
-        connectionType = type;
-    }
-
-    internal int GetQuestionsLost(int gameId, string playerName, string gameMode) {
-        if (gameMode.Equals("Online")) {
-            return OnlineDatabase.Instance.GetQuestionsLost(gameId, playerName);
-        }
-        string sql = "SELECT questionsLost FROM localGamePlayers WHERE gameId = " + gameId + " AND playerId = (SELECT id from localUsers WHERE name = '" + playerName + "')";
-        IDbConnection conn = new SqliteConnection(databaseUrl);
-        conn.Open();
-        IDbCommand cmd = conn.CreateCommand();
-        cmd.CommandText = sql;
-        IDataReader reader = cmd.ExecuteReader();
-        int returnValue = 0;
-        while (reader.Read()) {
-            returnValue = reader.GetInt32(0);
-        }
-        reader.Close();
-        cmd.Dispose();
-        conn.Close();
-
-        return returnValue;
-    }
-
-    public string GetGameMode(int gameId) {
-        if (this.gameMode == null) {
-            string sql = "SELECT gameMode FROM game WHERE id = " + gameId;
-            IDbConnection conn = new SqliteConnection(databaseUrl);
-            conn.Open();
-            IDbCommand cmd = conn.CreateCommand();
-            cmd.CommandText = sql;
-            IDataReader reader = cmd.ExecuteReader();
-            while (reader.Read()) {
-                this.gameMode = reader.GetString(0);
-            }
-            reader.Close();
-            cmd.Dispose();
-            conn.Close();
-        }
-        return this.gameMode;
-    }
-
-    public void LinkPlayersToLocalGame(List<string> playerNames, int gameId) {
-
-        IDbConnection conn = new SqliteConnection(databaseUrl);
-        conn.Open();
-        string questionSql = "SELECT id FROM questions order by random() limit 1";
-        IDbCommand cmd = conn.CreateCommand();
-        cmd.CommandText = questionSql;
-        IDataReader reader = cmd.ExecuteReader();
-        int questionId = -1;
-        while (reader.Read()) {
-            questionId = reader.GetInt32(0);
-        }
-        List<int> l = new List<int>();
-        l.Add(questionId);
-        foreach (string player in playerNames) {
-            string sql = "SELECT id FROM localUsers WHERE name = '" + player + "'";
-            int playerId;
-            cmd = conn.CreateCommand();
-            cmd.CommandText = sql;
-            reader = cmd.ExecuteReader();
-            if (reader.Read()) {
-                playerId = reader.GetInt32(0);
-            } else {
-                reader.Close();
-                sql = "INSERT INTO localUsers (name) VALUES ('" + player + "')";
-                cmd.CommandText = sql;
-                cmd.ExecuteNonQuery();
-
-                cmd.CommandText = "SELECT last_insert_rowid()";
-                Int64 lastInsert64 = (Int64)cmd.ExecuteScalar();
-                playerId = (int)lastInsert64;
-            }
-            cmd.Dispose();
-            reader.Close();
-
-            LinkPlayerToGame(playerId, gameId);
-            SavePlayersQuestion(l, player, gameId, "Local");
-
-        }
-        IDbCommand cmd2 = conn.CreateCommand();
-        cmd2.CommandText = "UPDATE game SET currentPlayer = '" + playerNames[0] + "' WHERE id = " + gameId;
-        cmd2.ExecuteNonQuery();
-        cmd2.Dispose();
-        conn.Close();
-    }
-
-    private void LinkPlayerToGame(int playerId, int gameId) {
-        string sql = "INSERT INTO localGamePlayers (gameId, playerId) VALUES (" + gameId + ", " + playerId + ")";
-        SqliteConnection conn2 = new SqliteConnection(databaseUrl);
-        conn2.Open();
-        IDbCommand cmd = conn2.CreateCommand();
-        cmd.CommandText = sql;
-        cmd.ExecuteNonQuery();
-        cmd.Dispose();
-        conn2.Close();
-    }
-
-    internal int GetWinCondition(int gameId, string gameMode) {
-        if (gameMode.Equals("Online")) {
-            return OnlineDatabase.Instance.GetWinCondition(gameId);
-        }
-        if (winAmount == -1) {
-            string sql = "SELECT winNumber FROM game WHERE id = " + gameId;
-            IDbConnection conn = new SqliteConnection(databaseUrl);
-            conn.Open();
-            IDbCommand cmd = conn.CreateCommand();
-            cmd.CommandText = sql;
-            IDataReader reader = cmd.ExecuteReader();
-            while (reader.Read()) {
-                this.winAmount = reader.GetInt32(0);
-            }
-            reader.Close();
-            cmd.Dispose();
-            conn.Close();
-        }
-        return this.winAmount;
-    }
-
-    public int SetupNewLocalGame(int winNumber, int numberOfPlayers, int questionTimer) {
-        string sql = "INSERT INTO game (winNumber, numberOfPlayers, answerTimer, gameMode, startedDate) VALUES (" + winNumber + "," + numberOfPlayers + "," + questionTimer + ", 'Local', DATE())";
-        IDbConnection conn = new SqliteConnection(databaseUrl);
-        conn.Open();
-        IDbCommand cmd = conn.CreateCommand();
-        cmd.CommandText = sql;
-        int status = cmd.ExecuteNonQuery();
-
-        cmd.CommandText = "SELECT last_insert_rowid()";
-        Int64 lastInsert64 = (Int64)cmd.ExecuteScalar();
-
-        return (int)lastInsert64;
-    }
-
-    public NewQuestionData GetNewQuestion(List<int> userAnsweredQuestions, string userName, string gameMode) {
-        if (gameMode.Equals("Online")) {
-            return OnlineDatabase.Instance.GetNewQuestion(userAnsweredQuestions, userName);
-        }
-        int gameId = GameObject.Find("GameManager").GetComponent<GameManagerScript>().GameId;
-        Color32 questionCategoryColor = new Color32(0, 0, 20, 20);
-        if (connectionType == null) {
-            SetLocalOrOnline(GetGameMode(gameId));
-        }
-
-        int id = -1;
-        int categoryId = -1;
-        string categoryName = "";
-        if (connectionType == "Local") {
-            IDbConnection conn = new SqliteConnection(databaseUrl);
-            conn.Open();
-            IDbCommand cmd = conn.CreateCommand();
-
-            string answeredIds = String.Join(",", userAnsweredQuestions);
-
-            string sql = "SELECT questions.id, question, answer, categoryId as category, name, category.R, category.G, category.B, category.A FROM questions INNER JOIN questionToCategory ON questions.id = questionToCategory.questionId INNER JOIN category on category.id = questionToCategory.categoryId WHERE questions.id NOT IN (" + answeredIds + ") AND questions.id NOT IN (SELECT questionId FROM questionsInGame WHERE gameId = " + gameId + " AND userId = (SELECT id from localUsers WHERE name = '" + userName + "')) ORDER BY RANDOM() limit 1";
-            cmd.CommandText = sql;
-            IDataReader reader = cmd.ExecuteReader();
-
-            while (reader.Read()) {
-                id = reader.GetInt32(0);
-                string question = reader.GetString(1);
-                int answer = reader.GetInt32(2);
-                categoryId = reader.GetInt32(3);
-                categoryName = reader.GetString(4);
-
-                idString = id.ToString();
-                questionString = question;
-                categoryString = categoryId.ToString();
-                answerString = answer.ToString();
-
-                byte r = (byte)reader.GetInt32(5);
-                byte g = (byte)reader.GetInt32(6);
-                byte b = (byte)reader.GetInt32(7);
-                byte a = (byte)reader.GetInt32(8);
-
-                questionCategoryColor = new Color32(r, g, b, a);
-            }
-            reader.Close();
-
-            string saveSentQuestionSql = "INSERT INTO questionsInGame (gameId, questionId, userId) VALUES (" + gameId + ", " + id + ", (SELECT id FROM localUsers WHERE name = '" + userName + "'))";
-            cmd.CommandText = saveSentQuestionSql;
-            cmd.ExecuteNonQuery();
-
-            cmd.Dispose();
-            conn.Close();
-        } else { // Connect Through db
-            Debug.Log("Online Call");
-            StartCoroutine(GetQuestionData(false));
-        }
-        NewQuestionData q = new NewQuestionData(answerString, questionString, categoryName, categoryId, id, questionCategoryColor);
-
-        return q;
-    }
-
-    public void SavePlayersQuestion(List<int> questionsToSave, string playerNameValue, int gameId, string gameMode) {
-        if (gameMode.Equals("Online")) {
-            OnlineDatabase.Instance.SavePlayersQuestion(questionsToSave, playerNameValue, gameId);
-        } else { 
-            SetLocalOrOnline(gameMode);
-            
-            string values = "";
-            foreach (int questionId in questionsToSave) {
-                values += "('" + playerNameValue + "'," + questionId + "," + gameId + "),";
-            }
-            values = values.Substring(0, values.Length - 1);
-            string sql = "INSERT OR IGNORE INTO usersLockedQuestions (playerName, questionId, gameId) VALUES " + values;
-            IDbConnection conn = new SqliteConnection(databaseUrl);
-            conn.Open();
-            IDbCommand cmd = conn.CreateCommand();
-            cmd.CommandText = sql;
-
-            cmd.ExecuteReader();
-
-            cmd.Dispose();
-            conn.Close();
-        }
-    }
-
-    public List<NewQuestionData> GetPlayerQuestions(int gameId, string playerNameValue, string gameMode) {
-        if (gameMode.Equals("Online")) {
-            return OnlineDatabase.Instance.GetPlayerQuestions(gameId, playerNameValue);
-        }
-        if (databaseUrl == null) {
-            SetLocalOrOnline(GetGameMode(gameId));
-        }
-        List<NewQuestionData> questions = new List<NewQuestionData>();
-
-        if (connectionType.Equals("Local")) {
-            string sql = "SELECT * FROM questions inner join questionToCategory on questions.id = questionToCategory.questionId INNER JOIN category ON category.id = questionToCategory.categoryId WHERE questions.id IN ( SELECT questionId FROM usersLockedQuestions WHERE gameId = " + gameId + " AND playerName = '" + playerNameValue + "') ORDER BY answer ASC";
-            IDbConnection conn = new SqliteConnection(databaseUrl);
-            conn.Open();
-            IDbCommand cmd = conn.CreateCommand();
-            cmd.CommandText = sql;
-
-            IDataReader reader = cmd.ExecuteReader();
-            while (reader.Read()) {
-                Color32 questionCategoryColor = new Color32((byte)reader.GetInt32(7), (byte)reader.GetInt32(8), (byte)reader.GetInt32(9), (byte)reader.GetInt32(10));
-
-                NewQuestionData questionData = new NewQuestionData(
-                    reader.GetInt32(2).ToString(), 
-                    reader.GetString(1), 
-                    reader.GetString(6),
-                    reader.GetInt32(5),
-                    reader.GetInt32(0), 
-                    questionCategoryColor);
-
-
-                questions.Add(questionData);
-            }
-            cmd.Dispose();
-            conn.Close();
-        }
-        return questions;
-    }
-
-    private IEnumerator GetQuestionData(bool showAnswer) {
-        UnityWebRequest www = UnityWebRequest.Get("narkampen.nordh.xyz/narKampen/dbFiles/Question.php");
-
-        yield return www.SendWebRequest();
-
-        if (www.isNetworkError || www.isHttpError) {
-            Debug.Log(www.error);
-        } else {
-            while (!www.isDone) {
-                yield return null;
-            }
-            // Show result
-            string jsonData = www.downloadHandler.text;
-
-            jsonData = "{\"questionsList\" : [ " + jsonData + " ]}";
-
-            Questions qe = new Questions();
-            JsonUtility.FromJsonOverwrite(jsonData, qe);
-
-            questionString = qe.questionsList[0].question;
-            answerString = qe.questionsList[0].answer;
-            idString = qe.questionsList[0].id;
-            categoryString = qe.questionsList[0].category;
-        }
-    }
-}
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using Mono.Data.Sqlite;
+using System.Data;
+using System;
+using UnityEngine.Networking;
+using System.IO;
+
+public class Database : MonoBehaviour {
+    private const string onlineQuestionsUrl = "narkampen.nordh.xyz/narKampen/dbFiles/Question.php";
+    private const string serverUrl = "narkampen.nordh.xyz/narKampen/dbFiles/";
+    string connectionType;
+    string databaseUrl;
+    string gameMode;
+    int winAmount = -1;
+    int questionTimer = -1;
+
+    public GameObject questionCardPrefab;
+
+    private static Database instance;
+    public static Database Instance { get {
+            if (instance == null) {
+                instance = GameObject.FindObjectOfType<Database>();
+                if (instance == null) {
+                    GameObject container = new GameObject("Database");
+                    instance = container.AddComponent<Database>();
+                }
+            }
+            return instance;
+        }
+    }
+
+    IDbConnection conn;
+
+    internal void GetCategories(List<CategoryPanel.Category> list, string gameMode) {
+        if (gameMode.Equals("Online")) {
+            OnlineDatabase.Instance.GetCategories(list);
+        } else {
+            //string sql = "SELECT name, r, g, b, a, id FROM category";
+            string sql = "SELECT category.*, count(*) as count FROM questions " +
+                            "INNER JOIN questionToCategory ON questions.id = questionToCategory.questionId " + 
+                            "INNER JOIN category ON questionToCategory.categoryId = category.id " + 
+                            "GROUP BY category.name";
+            IDbCommand cmd = GetConnection();
+            cmd.CommandText = sql;
+
+            IDataReader reader = cmd.ExecuteReader();
+
+            while (reader.Read()) {
+                CategoryPanel.Category cat = new CategoryPanel.Category();
+
+                byte r = (byte)reader.GetInt32(1);
+                byte g = (byte)reader.GetInt32(2);
+                byte b = (byte)reader.GetInt32(3);
+                byte a = (byte)reader.GetInt32(4);
+                cat.color = new Color32(r, g, b, a);
+                cat.name = reader.GetString(0);
+                cat.id = reader.GetInt32(5);
+                cat.questionCount = reader.GetInt32(6);
+
+                list.Add(cat);
+            }
+            CloseConnection();
+        }
+    }
+
+    [Serializable]
+    public class Question {
+        public string question;
+        public string answer;
+        public string id;
+        public string category;
+    }
+
+    [Serializable]
+    public class Questions {
+        public List<Question> questionsList = new List<Question>();
+    }
+
+    [Serializable]
+    public class PlayerInfo {
+        public string username;
+        public string status;
+    }
+
+    [Serializable]
+    public class PlayerInfos {
+        public List<PlayerInfo> playerInfoList = new List<PlayerInfo>();
+    }
+
+    [Serializable]
+    public class Category {
+        public int r;
+        public int g;
+        public int b;
+        public int a;
+        public int id;
+        public string name;
+    }
+
+    [Serializable]
+    public class Categories {
+        public List<Category> categoryList = new List<Category>();
+    }
+
+    [Serializable]
+    public class OnlineGame {
+        public string id;
+        public string winNumber;
+        public string answerTimer;
+        public string roundTimeLimit;
+        public string currentPlayer;
+        public string round;
+        public string startDate;
+        public string LastPlayedDate;
+        public string finishedDate;
+        public string status;
+    }
+
+    [Serializable]
+    public class OnlineGames {
+        public List<OnlineGame> onlineGamesList = new List<OnlineGame>();
+    }
+
+    [Serializable]
+    public class UserName {
+        public string id;
+        public string username;
+    }
+
+    [Serializable]
+    public class UserNames {
+        public List<UserName> usernamesList = new List<UserName>();
+    }
+
+    internal void SetLastPlayedDate(int gameId) {
+        if (gameMode.Equals("Online")) {
+
+        }
+        string sql = "UPDATE game SET lastPlayedDate = DATE() WHERE id = " + gameId;
+        IDbCommand cmd = GetConnection();
+        cmd.CommandText = sql;
+        cmd.ExecuteNonQuery();
+
+        cmd.Dispose();
+        CloseConnection();
+    }
+    
+    internal void FindRandomPlayer()
+    {
+        if (gameMode.Equals("Online")) {
+            OnlineDatabase.Instance.FindRandomPlayer();
+        }
+    }
+
+    private IDbCommand GetConnection() {
+        if (databaseUrl == null) { // ej bra lösning för online
+            SetLocalOrOnline("Local");
+        }
+        conn = new SqliteConnection(databaseUrl);
+        conn.Open();
+        IDbCommand cmd = conn.CreateCommand();
+        return cmd;
+    }
+
+
+
+    private void CloseConnection() {
+        conn.Close();
+    }
+
+    string questionString = "";
+    string answerString = "";
+    string idString = "";
+    string categoryString = "";
+    private int round = -1;
+    private string SearchString;
+
+    public string QuestionString { get => questionString; set => questionString = value; }
+
+
+    private void Start() {
+        if (instance == null) {
+            instance = this;
+        }
+
+        if (databaseUrl == null || databaseUrl.Equals("")) {
+            SetLocalOrOnline("Local"); // Temporary, should not be needed after local testing
+        }
+    }
+
+    internal void SignIn(string username, int userId, bool keepSigendIn) {
+        int ksi = 0;
+        if (keepSigendIn) {
+            ksi = 1;
+        }
+        string sql = "INSERT OR REPLACE INTO userSettings (username, userId, keepSignedIn) VALUES ('" + username + "', " + userId + "," + ksi + ")";
+        IDbCommand cmd = GetConnection();
+        cmd.CommandText = sql;
+
+        cmd.ExecuteNonQuery();
+
+        sql = "INSERT OR REPLACE INTO settings (name, value) VALUES ('signedInUser', '" + username + "')";
+        cmd.CommandText = sql;
+        cmd.ExecuteNonQuery();
+
+        CloseConnection();
+    }
+
+    internal bool IsKeepSignedIn() {
+        string sql = "SELECT keepSignedIn FROM userSettings";
+        IDbCommand cmd = GetConnection();
+        cmd.CommandText = sql;
+
+        IDataReader reader = cmd.ExecuteReader();
+        int res = 0;
+        while (reader.Read()) {
+            res = reader.GetInt32(0);
+        }
+        return res == 1;
+    }
+
+    internal KeyValuePair<int, string> GetSignedInUser() {
+        // string sql = "SELECT userId, username FROM userSettings";
+        string sql = "SELECT userId, username FROM userSettings WHERE username = (SELECT value FROM settings WHERE name = 'signedInUser')";
+        IDbCommand cmd = GetConnection();
+        cmd.CommandText = sql;
+        int userId = -1;
+        string username = "";
+        IDataReader reader = cmd.ExecuteReader();
+        while (reader.Read()) {
+            userId = reader.GetInt32(0);
+            username = reader.GetString(1);
+        }
+
+        CloseConnection();
+        return new KeyValuePair<int, string>(userId, username);
+    }
+
+    internal void LogoutUser() {
+        // string sql = "UPDATE userSettings SET keepSignedIn = 0";
+        string sql = "DELETE FROM userSettings";
+        IDbCommand cmd = GetConnection();
+        cmd.CommandText = sql;
+        cmd.ExecuteNonQuery();
+
+        sql = "DELETE FROM settings WHERE name = 'signedInUser'";
+        cmd.CommandText = sql;
+        cmd.ExecuteNonQuery();
+
+        CloseConnection();
+
+
+    }
+
+    internal int GetQuestionTimer(int gameId, string gameMode) {
+        if (questionTimer == -1) {
+            string sql = "SELECT answerTimer FROM game WHERE id = " + gameId;
+            if (databaseUrl == null) {
+                SetLocalOrOnline("Local");
+            }
+            IDbCommand cmd = GetConnection();
+            cmd.CommandText = sql;
+            IDataReader reader = cmd.ExecuteReader();
+
+            while (reader.Read()) {
+                questionTimer = reader.GetInt32(0);
+            }
+            reader.Close();
+            cmd.Dispose();
+        }
+        CloseConnection();
+        return this.questionTimer;
+    }
+    
+    internal List<LocalGameScript> GetLocalGames(GameObject prefab) {
+        List<LocalGameScript> games = new List<LocalGameScript>();
+        string sql = "SELECT game.*, name, localUsers.id as userId FROM game INNER JOIN localGamePlayers on game.id = localGamePlayers.gameId INNER JOIN localUsers on playerId = localUsers.id order by game.id ASC, userId ASC";
+        IDbConnection conn = new SqliteConnection(databaseUrl);
+        conn.Open();
+        IDbCommand cmd = conn.CreateCommand();
+        cmd.CommandText = sql;
+        IDataReader reader = cmd.ExecuteReader();
+        int currentGame = -1;
+        GameObject localGame;
+        LocalGameScript lgs = null;
+
+        string currentPlayerName = "";
+        int currentPoints = 0;
+        while (reader.Read()) {
+
+
+            if (currentGame != reader.GetInt32(0)) {
+                localGame = Instantiate(prefab, new Vector2(0, 0), Quaternion.identity) as GameObject;
+                lgs = localGame.GetComponent<LocalGameScript>();
+
+                lgs.GameId = reader.GetInt32(0);
+                lgs.GameMode = reader.GetString(1);
+                lgs.QuestionsNeededToWin = reader.GetInt32(2).ToString();
+                lgs.AnswerTimer = reader.GetInt32(3);
+                lgs.NumberOfPlayers = reader.GetInt32(4).ToString();
+                lgs.CurrentPlayer = reader.GetString(5);
+                lgs.Round = reader.GetInt32(6).ToString();
+                lgs.StartDate = reader.GetString(7);
+                lgs.LastPlayedDate = reader.GetString(8);
+                lgs.FinishedDate = reader.IsDBNull(9) ? "" : reader.GetString(9);
+
+                currentPlayerName = reader.GetString(10);
+                currentPoints = GetPlayerPoints(reader.GetInt32(0), currentPlayerName);
+                lgs.AddPlayer(currentPlayerName, currentPoints);
+                games.Add(lgs);
+            } else if (currentGame == reader.GetInt32(0)) {
+                currentPlayerName = reader.GetString(10);
+                currentPoints = GetPlayerPoints(currentGame, currentPlayerName);
+                lgs.AddPlayer(currentPlayerName, currentPoints);
+            }
+
+            currentGame = reader.GetInt32(0);
+        }
+        reader.Close();
+        cmd.Dispose();
+        conn.Close();
+
+        return games;
+    }
+
+    internal void SetQuestionsLost(int gameId, string playerName, int questionsLost) {
+
+        string sql = "UPDATE localGamePlayers SET questionsLost = questionsLost + " + questionsLost + " WHERE gameId = " + gameId + " AND playerId = (SELECT id FROM localUsers WHERE  name = '" + playerName + "')";
+        IDbConnection conn = new SqliteConnection(databaseUrl);
+        conn.Open();
+        IDbCommand cmd = conn.CreateCommand();
+        cmd.CommandText = sql;
+
+        cmd.ExecuteNonQuery();
+
+        cmd.Dispose();
+        conn.Close();
+
+    }
+
+    internal void RemoveGame(int gameId) {
+        string sql = "DELETE FROM game WHERE id = " + gameId;
+
+        List<LocalGameScript> games = new List<LocalGameScript>();
+        IDbConnection conn = new SqliteConnection(databaseUrl);
+        conn.Open();
+        IDbCommand cmd = conn.CreateCommand();
+        cmd.CommandText = sql;
+        cmd.ExecuteNonQuery();
+
+        string deleteLockedQuestionsSql = "DELETE FROM usersLockedQuestions WHERE gameId = " + gameId;
+        cmd.CommandText = deleteLockedQuestionsSql;
+        cmd.ExecuteNonQuery();
+
+        cmd.Dispose();
+        conn.Close();
+    }
+
+    public string GetCurrentPlayer(int gameId, string gameMode) {
+        if (gameMode.Equals("Online")) {
+            return OnlineDatabase.Instance.GetCurrentPlayer(gameId);
+        }
+        string sql = "SELECT currentPlayer FROM game WHERE id = " + gameId;
+        IDbConnection conn = new SqliteConnection(databaseUrl);
+        conn.Open();
+        IDbCommand cmd = conn.CreateCommand();
+        cmd.CommandText = sql;
+        IDataReader reader = cmd.ExecuteReader();
+
+        string currentPlayer = "";
+        while (reader.Read()) {
+            currentPlayer = reader.GetString(0);
+        }
+        reader.Close();
+        cmd.Dispose();
+        conn.Close();
+
+        return currentPlayer;
+    }
+
+    public void SetCurrentPlayer(int gameId, string currentPlayer, string gameMode) {
+        if (gameMode.Equals("Online")) {
+            OnlineDatabase.Instance.SetCurrentPlayer(gameId, currentPlayer);
+        } else {
+            string sql = "UPDATE game SET currentPlayer = '" + currentPlayer + "' WHERE id = " + gameId;
+            IDbConnection conn = new SqliteConnection(databaseUrl);
+            conn.Open();
+            IDbCommand cmd = conn.CreateCommand();
+            cmd.CommandText = sql;
+            cmd.ExecuteNonQuery();
+
+            cmd.Dispose();
+            conn.Close();
+        }
+    }
+
+    internal int GetPlayerPoints(int gameId, string playerName) {
+        string sql = "SELECT count(*) FROM usersLockedQuestions WHERE gameId = " + gameId + " AND playerName = '" + playerName + "'";
+        IDbConnection conn = new SqliteConnection(databaseUrl);
+        conn.Open();
+        IDbCommand cmd = conn.CreateCommand();
+        cmd.CommandText = sql;
+        IDataReader reader = cmd.ExecuteReader();
+
+        int points = 0;
+        while (reader.Read()) {
+            points = reader.GetInt32(0);
+        }
+        reader.Close();
+        cmd.Dispose();
+        conn.Close();
+
+        return points;
+    }
+
+    internal void SetFinishedDate(int gameId, string finishedDate, string gameMode) {
+        if (gameMode.Equals("Online")) {
+            OnlineDatabase.Instance.SetFinishedDate(gameId, finishedDate);
+        } else {
+            string sql = "UPDATE game SET finishedDate = '" + finishedDate + "' WHERE id = " + gameId;
+            IDbConnection conn = new SqliteConnection(databaseUrl);
+            conn.Open();
+            IDbCommand cmd = conn.CreateCommand();
+            cmd.CommandText = sql;
+            cmd.ExecuteNonQuery();
+
+            cmd.Dispose();
+            conn.Close();
+        }
+    }
+
+    internal void SetRoundValue(int gameId, int round, string gameMode) {
+        if (gameMode.Equals("Online")) {
+            OnlineDatabase.Instance.SetRoundValue(gameId, round);
+        } else {
+            string sql = "UPDATE game SET round = " + round + " WHERE id = " + gameId;
+            IDbConnection conn = new SqliteConnection(databaseUrl);
+            conn.Open();
+            IDbCommand cmd = conn.CreateCommand();
+            cmd.CommandText = sql;
+            cmd.ExecuteNonQuery();
+
+            cmd.Dispose();
+            conn.Close();
+        }
+    }
+
+    internal int GetRoundValue(int gameId, string gameMode) {
+        if (gameMode.Equals("Online")) {
+            return OnlineDatabase.Instance.GetRoundValue(gameId);
+        }
+        if (this.round == -1) {
+            SetLocalOrOnline("Local");
+            string sql = "SELECT round FROM game WHERE id = " + gameId;
+            IDbConnection conn = new SqliteConnection(databaseUrl);
+            conn.Open();
+            IDbCommand cmd = conn.CreateCommand();
+            cmd.CommandText = sql;
+            IDataReader reader = cmd.ExecuteReader();
+            while (reader.Read()) {
+                this.round = reader.GetInt32(0);
+            }
+            reader.Close();
+            cmd.Dispose();
+            conn.Close();
+        }
+        return this.round;
+    }
+
+    internal List<KeyValuePair<string, int>> GetPlayersForGame(int gameId, string gameMode) {
+        if (gameMode.Equals("Online")) {
+            return OnlineDatabase.Instance.GetPlayersForGame(gameId);
+        }
+        string sql = "SELECT name, (SELECT count(*) FROM usersLockedQuestions WHERE playerName = localUsers.name AND gameId = " + gameId + ") as numAnswers  FROM localGamePlayers " +
+            "LEFT JOIN localUsers ON localGamePlayers.playerId = localUsers.id " +
+            "WHERE gameId = " + gameId;
+        IDbConnection conn = new SqliteConnection(databaseUrl);
+        conn.Open();
+        IDbCommand cmd = conn.CreateCommand();
+        cmd.CommandText = sql;
+
+        IDataReader reader = cmd.ExecuteReader();
+
+        List<KeyValuePair<string, int>> returnList = new List<KeyValuePair<string, int>>();
+        while (reader.Read()) {
+            KeyValuePair<string, int> player = new KeyValuePair<string, int>(reader.GetString(0), reader.GetInt32(1));
+            returnList.Add(player);
+        }
+
+        return returnList;
+    }
+
+    public string AnswerString { get => answerString; set => answerString = value; }
+    public string IdString { get => idString; set => idString = value; }
+    public string CategoryString { get => categoryString; set => categoryString = value; }
+
+    public void SetLocalOrOnline(string type) {
+        gameMode = type;
+        if (type.Equals("Local")) {
+            string databaseName = "narKampenLocal.db";
+            if (Application.platform == RuntimePlatform.Android) {
+                databaseUrl = Application.persistentDataPath + "/" + databaseName;
+
+                if (!File.Exists(databaseUrl)) {
+                    UnityWebRequest load = UnityWebRequest.Get("jar:file://" + Application.dataPath + "!/assets/" + databaseName);
+                    load.SendWebRequest();
+                    while (!load.isDone) { }
+
+                    File.WriteAllBytes(databaseUrl, load.downloadHandler.data);
+                }
+                databaseUrl = "URI=file:" + databaseUrl;
+            } else {
+                databaseUrl = "URI=file:" + Application.dataPath + "/narKampenLocal.db";
+            }
+        } else {
+            databaseUrl = onlineQuestionsUrl;
+        }
+        connectionType = type;
+    }
+
+    internal int GetQuestionsLost(int gameId, string playerName, string gameMode) {
+        if (gameMode.Equals("Online")) {
+            return OnlineDatabase.Instance.GetQuestionsLost(gameId, playerName);
+        }
+        string sql = "SELECT questionsLost FROM localGamePlayers WHERE gameId = " + gameId + " AND playerId = (SELECT id from localUsers WHERE name = '" + playerName + "')";
+        IDbConnection conn = new SqliteConnection(databaseUrl);
+        conn.Open();
+        IDbCommand cmd = conn.CreateCommand();
+        cmd.CommandText = sql;
+        IDataReader reader = cmd.ExecuteReader();
+        int returnValue = 0;
+        while (reader.Read()) {
+            returnValue = reader.GetInt32(0);
+        }
+        reader.Close();
+        cmd.Dispose();
+        conn.Close();
+
+        return returnValue;
+    }
+
+    public string GetGameMode(int gameId) {
+        if (this.gameMode == null) {
+            string sql = "SELECT gameMode FROM game WHERE id = " + gameId;
+            IDbConnection conn = new SqliteConnection(databaseUrl);
+            conn.Open();
+            IDbCommand cmd = conn.CreateCommand();
+            cmd.CommandText = sql;
+            IDataReader reader = cmd.ExecuteReader();
+            while (reader.Read()) {
+                this.gameMode = reader.GetString(0);
+            }
+            reader.Close();
+            cmd.Dispose();
+            conn.Close();
+        }
+        return this.gameMode;
+    }
+
+    public void LinkPlayersToLocalGame(List<string> playerNames, int gameId) {
+
+        IDbConnection conn = new SqliteConnection(databaseUrl);
+        conn.Open();
+        string questionSql = "SELECT id FROM questions order by random() limit 1";
+        IDbCommand cmd = conn.CreateCommand();
+        cmd.CommandText = questionSql;
+        IDataReader reader = cmd.ExecuteReader();
+        int questionId = -1;
+        while (reader.Read()) {
+            questionId = reader.GetInt32(0);
+        }
+        List<int> l = new List<int>();
+        l.Add(questionId);
+        foreach (string player in playerNames) {
+            string sql = "SELECT id FROM localUsers WHERE name = '" + player + "'";
+            int playerId;
+            cmd = conn.CreateCommand();
+            cmd.CommandText = sql;
+            reader = cmd.ExecuteReader();
+            if (reader.Read()) {
+                playerId = reader.GetInt32(0);
+            } else {
+                reader.Close();
+                sql = "INSERT INTO localUsers (name) VALUES ('" + player + "')";
+                cmd.CommandText = sql;
+                cmd.ExecuteNonQuery();
+
+                cmd.CommandText = "SELECT last_insert_rowid()";
+                Int64 lastInsert64 = (Int64)cmd.ExecuteScalar();
+                playerId = (int)lastInsert64;
+            }
+            cmd.Dispose();
+            reader.Close();
+
+            LinkPlayerToGame(playerId, gameId);
+            SavePlayersQuestion(l, player, gameId, "Local");
+
+        }
+        IDbCommand cmd2 = conn.CreateCommand();
+        cmd2.CommandText = "UPDATE game SET currentPlayer = '" + playerNames[0] + "' WHERE id = " + gameId;
+        cmd2.ExecuteNonQuery();
+        cmd2.Dispose();
+        conn.Close();
+    }
+
+    private void LinkPlayerToGame(int playerId, int gameId) {
+        string sql = "INSERT INTO localGamePlayers (gameId, playerId) VALUES (" + gameId + ", " + playerId + ")";
+        SqliteConnection conn2 = new SqliteConnection(databaseUrl);
+        conn2.Open();
+        IDbCommand cmd = conn2.CreateCommand();
+        cmd.CommandText = sql;
+        cmd.ExecuteNonQuery();
+        cmd.Dispose();
+        conn2.Close();
+    }
+
+    internal int GetWinCondition(int gameId, string gameMode) {
+        if (gameMode.Equals("Online")) {
+            return OnlineDatabase.Instance.GetWinCondition(gameId);
+        }
+        if (winAmount == -1) {
+            string sql = "SELECT winNumber FROM game WHERE id = " + gameId;
+            IDbConnection conn = new SqliteConnection(databaseUrl);
+            conn.Open();
+            IDbCommand cmd = conn.CreateCommand();
+            cmd.CommandText = sql;
+            IDataReader reader = cmd.ExecuteReader();
+            while (reader.Read()) {
+                this.winAmount = reader.GetInt32(0);
+            }
+            reader.Close();
+            cmd.Dispose();
+            conn.Close();
+        }
+        return this.winAmount;
+    }
+
+    public int SetupNewLocalGame(int winNumber, int numberOfPlayers, int questionTimer) {
+        string sql = "INSERT INTO game (winNumber, numberOfPlayers, answerTimer, gameMode, startedDate) VALUES (" + winNumber + "," + numberOfPlayers + "," + questionTimer + ", 'Local', DATE())";
+        IDbConnection conn = new SqliteConnection(databaseUrl);
+        conn.Open();
+        IDbCommand cmd = conn.CreateCommand();
+        cmd.CommandText = sql;
+        int status = cmd.ExecuteNonQuery();
+
+        cmd.CommandText = "SELECT last_insert_rowid()";
+        Int64 lastInsert64 = (Int64)cmd.ExecuteScalar();
+
+        return (int)lastInsert64;
+    }
+
+    public NewQuestionData GetNewQuestion(List<int> userAnsweredQuestions, string userName, string gameMode) {
+        if (gameMode.Equals("Online")) {
+            return OnlineDatabase.Instance.GetNewQuestion(userAnsweredQuestions, userName);
+        }
+        int gameId = GameObject.Find("GameManager").GetComponent<GameManagerScript>().GameId;
+        Color32 questionCategoryColor = new Color32(0, 0, 20, 20);
+        if (connectionType == null) {
+            SetLocalOrOnline(GetGameMode(gameId));
+        }
+
+        int id = -1;
+        int categoryId = -1;
+        string categoryName = "";
+        if (connectionType == "Local") {
+            IDbConnection conn = new SqliteConnection(databaseUrl);
+            conn.Open();
+            IDbCommand cmd = conn.CreateCommand();
+
+            string answeredIds = String.Join(",", userAnsweredQuestions);
+
+            string sql = "SELECT questions.id, question, answer, categoryId as category, name, category.R, category.G, category.B, category.A FROM questions INNER JOIN questionToCategory ON questions.id = questionToCategory.questionId INNER JOIN category on category.id = questionToCategory.categoryId WHERE questions.id NOT IN (" + answeredIds + ") AND questions.id NOT IN (SELECT questionId FROM questionsInGame WHERE gameId = " + gameId + " AND userId = (SELECT id from localUsers WHERE name = '" + userName + "')) ORDER BY RANDOM() limit 1";
+            cmd.CommandText = sql;
+            IDataReader reader = cmd.ExecuteReader();
+
+            while (reader.Read()) {
+                id = reader.GetInt32(0);
+                string question = reader.GetString(1);
+                int answer = reader.GetInt32(2);
+                categoryId = reader.GetInt32(3);
+                categoryName = reader.GetString(4);
+
+                idString = id.ToString();
+                questionString = question;
+                categoryString = categoryId.ToString();
+                answerString = answer.ToString();
+
+                byte r = (byte)reader.GetInt32(5);
+                byte g = (byte)reader.GetInt32(6);
+                byte b = (byte)reader.GetInt32(7);
+                byte a = (byte)reader.GetInt32(8);
+
+                questionCategoryColor = new Color32(r, g, b, a);
+            }
+            reader.Close();
+
+            string saveSentQuestionSql = "INSERT INTO questionsInGame (gameId, questionId, userId) VALUES (" + gameId + ", " + id + ", (SELECT id FROM localUsers WHERE name = '" + userName + "'))";
+            cmd.CommandText = saveSentQuestionSql;
+            cmd.ExecuteNonQuery();
+
+            cmd.Dispose();
+            conn.Close();
+        } else { // Connect Through db
+            Debug.Log("Online Call");
+            StartCoroutine(GetQuestionData(false));
+        }
+        NewQuestionData q = new NewQuestionData(answerString, questionString, categoryName, categoryId, id, questionCategoryColor);
+
+        return q;
+    }
+
+    public void SavePlayersQuestion(List<int> questionsToSave, string playerNameValue, int gameId, string gameMode) {
+        if (gameMode.Equals("Online")) {
+            OnlineDatabase.Instance.SavePlayersQuestion(questionsToSave, playerNameValue, gameId);
+        } else { 
+            SetLocalOrOnline(gameMode);
+            
+            string values = "";
+            foreach (int questionId in questionsToSave) {
+                values += "('" + playerNameValue + "'," + questionId + "," + gameId + "),";
+            }
+            values = values.Substring(0, values.Length - 1);
+            string sql = "INSERT OR IGNORE INTO usersLockedQuestions (playerName, questionId, gameId) VALUES " + values;
+            IDbConnection conn = new SqliteConnection(databaseUrl);
+            conn.Open();
+            IDbCommand cmd = conn.CreateCommand();
+            cmd.CommandText = sql;
+
+            cmd.ExecuteReader();
+
+            cmd.Dispose();
+            conn.Close();
+        }
+    }
+
+    public List<NewQuestionData> GetPlayerQuestions(int gameId, string playerNameValue, string gameMode) {
+        if (gameMode.Equals("Online")) {
+            return OnlineDatabase.Instance.GetPlayerQuestions(gameId, playerNameValue);
+        }
+        if (databaseUrl == null) {
+            SetLocalOrOnline(GetGameMode(gameId));
+        }
+        List<NewQuestionData> questions = new List<NewQuestionData>();
+
+        if (connectionType.Equals("Local")) {
+            string sql = "SELECT * FROM questions inner join questionToCategory on questions.id = questionToCategory.questionId INNER JOIN category ON category.id = questionToCategory.categoryId WHERE questions.id IN ( SELECT questionId FROM usersLockedQuestions WHERE gameId = " + gameId + " AND playerName = '" + playerNameValue + "') ORDER BY answer ASC";
+            IDbConnection conn = new SqliteConnection(databaseUrl);
+            conn.Open();
+            IDbCommand cmd = conn.CreateCommand();
+            cmd.CommandText = sql;
+
+            IDataReader reader = cmd.ExecuteReader();
+            while (reader.Read()) {
+                Color32 questionCategoryColor = new Color32((byte)reader.GetInt32(7), (byte)reader.GetInt32(8), (byte)reader.GetInt32(9), (byte)reader.GetInt32(10));
+
+                NewQuestionData questionData = new NewQuestionData(
+                    reader.GetInt32(2).ToString(), 
+                    reader.GetString(1), 
+                    reader.GetString(6),
+                    reader.GetInt32(5),
+                    reader.GetInt32(0), 
+                    questionCategoryColor);
+
+
+                questions.Add(questionData);
+            }
+            cmd.Dispose();
+            conn.Close();
+        }
+        return questions;
+    }
+
+    private IEnumerator GetQuestionData(bool showAnswer) {
+        UnityWebRequest www = UnityWebRequest.Get("narkampen.nordh.xyz/narKampen/dbFiles/Question.php");
+
+        yield return www.SendWebRequest();
+
+        if (www.isNetworkError || www.isHttpError) {
+            Debug.Log(www.error);
+        } else {
+            while (!www.isDone) {
+                yield return null;
+            }
+            // Show result
+            string jsonData = www.downloadHandler.text;
+
+            jsonData = "{\"questionsList\" : [ " + jsonData + " ]}";
+
+            Questions qe = new Questions();
+            JsonUtility.FromJsonOverwrite(jsonData, qe);
+
+            questionString = qe.questionsList[0].question;
+            answerString = qe.questionsList[0].answer;
+            idString = qe.questionsList[0].id;
+            categoryString = qe.questionsList[0].category;
+        }
+    }
+}

+ 655 - 639
Assets/Scripts/Database/OnlineDatabase.cs

@@ -1,639 +1,655 @@
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-using Mono.Data.Sqlite;
-using System.Data;
-using System;
-using UnityEngine.Networking;
-using System.IO;
-using System.Text;
-
-public class OnlineDatabase : MonoBehaviour {
-    private const string onlineQuestionsUrl = "narkampen.nordh.xyz/narKampen/dbFiles/Question.php";
-    private const string serverUrl = "narkampen.nordh.xyz/narKampen/dbFiles/";
-    string gameMode;
-    int winAmount = -1;
-
-    public GameObject questionCardPrefab;
-
-    private static OnlineDatabase instance;
-    public static OnlineDatabase Instance { get { return instance; } }
-
-    private void Awake() {
-        if (instance == null) {
-            instance = this;
-        }
-    }
-
-    internal List<CategoryPanel.Category> GetCategories(List<CategoryPanel.Category> list) {
-        string response = CallOnlineDatabaseWithResponse("Categories.php", null);
-
-        response = "{\"categoryList\" :  " + response + " }";
-
-        Categories categories = new Categories();
-        JsonUtility.FromJsonOverwrite(response, categories);
-
-        foreach (Category c in categories.categoryList) {
-            CategoryPanel.Category cat = new CategoryPanel.Category();
-
-            cat.color = new Color32((byte)c.r, (byte)c.g, (byte)c.b, (byte)c.a);
-            cat.name = c.name;
-            cat.id = c.id;
-
-            list.Add(cat);
-        }
-        return list;
-    }
-
-    internal int SetupNewOnlineGame(int limitPerQuestion, int limitPerPlayer, int toWin, List<InviteSearchResult> inviteUsers) {
-        List<int> playerIds = new List<int>();
-        inviteUsers.ForEach(i => playerIds.Add(i.GetId()));
-        int currentUser = Database.Instance.GetSignedInUser().Key;
-        playerIds.Add(currentUser);
-
-        var form = new WWWForm();
-        form.AddField("currentUser", currentUser);
-        form.AddField("winNumber", toWin);
-        form.AddField("limitPerQuestion", limitPerQuestion);
-        form.AddField("limitPerPlayer", limitPerPlayer);
-        form.AddField("playerIds", String.Join(",", playerIds));
-
-        string response = CallOnlineDatabaseWithResponse("NewOnlineGame.php", form);
-
-        if (response.Equals("")) {
-            Debug.Log("Expected gameId in response for creating new game but did not get one");
-        }
-
-        if (Int32.TryParse(response, out int newGameId)) {
-            return newGameId; 
-        } else {
-            Debug.Log("Failed to get new game id with response " + response);
-            return -1;
-        }
-
-    }
-
-    [Serializable]
-    public class Question {
-        public string question;
-        public string answer;
-        public string id;
-        public string category;
-        public string categoryName;
-        public int r;
-        public int g;
-        public int b;
-        public int a;
-    }
-
-    [Serializable]
-    public class Questions {
-        public List<Question> questionsList = new List<Question>();
-    }
-
-    [Serializable]
-    public class PlayerInfo {
-        public string username;
-        public string status;
-    }
-
-    [Serializable]
-    public class PlayerInfos {
-        public List<PlayerInfo> playerInfoList = new List<PlayerInfo>();
-    }
-
-    [Serializable]
-    public class GamePlayerInfo {
-        public string username;
-        public string userLockedQuestions;
-    }
-
-    [Serializable]
-    public class GamePlayerInfos {
-        public List<GamePlayerInfo> gamePlayerInfoList = new List<GamePlayerInfo>();
-    }
-
-
-
-    [Serializable]
-    public class Category {
-        public int r;
-        public int g;
-        public int b;
-        public int a;
-        public int id;
-        public string name;
-    }
-
-    [Serializable]
-    public class Categories {
-        public List<Category> categoryList = new List<Category>();
-    }
-
-    [Serializable]
-    public class OnlineGame {
-        public string id;
-        public string winNumber;
-        public string answerTimer;
-        public string roundTimeLimit;
-        public string currentPlayer;
-        public string round;
-        public string startDate;
-        public string lastPlayedDate;
-        public string finishedDate;
-        public string status;
-        public string playerToAct;
-    }
-
-    [Serializable]
-    public class OnlineGames {
-        public List<OnlineGame> onlineGamesList = new List<OnlineGame>();
-    }
-
-    [Serializable]
-    public class UserName {
-        public string id;
-        public string username;
-    }
-
-    [Serializable]
-    public class UserNames {
-        public List<UserName> usernamesList = new List<UserName>();
-    }
-
-    private void CallDatabase(string filename, WWWForm formData) {
-        string postUrl = serverUrl + filename;
-
-        UnityWebRequest www = UnityWebRequest.Post(postUrl, formData);
-        www.SendWebRequest();
-
-        if (www.isNetworkError || www.isHttpError) {
-            Debug.Log(www.error);
-        } else {
-            while (!www.isDone) {
-            }
-        }
-    }
-
-    private string CallOnlineDatabaseWithResponse(string filename, WWWForm formData) {
-        string postUrl = serverUrl + filename;
-
-        UnityWebRequest www = UnityWebRequest.Post(postUrl, formData);
-        www.SendWebRequest();
-
-        if (www.isNetworkError || www.isHttpError) {
-            Debug.Log(www.error);
-        } else {
-            while (!www.isDone) {
-            }
-        }
-
-        return www.downloadHandler.text;
-    }
-
-    string questionString = "";
-    string answerString = "";
-    string idString = "";
-    string categoryString = "";
-
-    public string QuestionString { get => questionString; set => questionString = value; }
-
-
-    private void Start() {
-        if (instance == null) {
-            instance = this;
-        }
-    }
-
-    internal void SetLastPlayedDate(int gameId) {
-
-        WWWForm form = new WWWForm();
-        form.AddField("gameId", gameId);
-        form.AddField("f", "SetLastPlayed");
-        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
-
-        if (!response.Equals("")) {
-            Debug.Log(response);
-        }
-    }
-
-    internal void DeclineOnlineGame(string userName, int gameId) {
-        WWWForm formData = new WWWForm();
-        formData.AddField("userId", -1);
-        formData.AddField("f", "decline");
-        formData.AddField("gameId", gameId);
-        formData.AddField("userName", userName);
-
-        CallDatabase("OnlineGames.php", formData);
-    }
-
-    internal void AcceptOnlineGame(string userName, int gameId) {
-        WWWForm formData = new WWWForm();
-        formData.AddField("userId", -1);
-        formData.AddField("f", "accept");
-        formData.AddField("gameId", gameId);
-        formData.AddField("userName", userName);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", formData);
-        if (!response.Equals("")) {
-            Debug.Log(response);
-        }
-    }
-
-    internal List<OnlineGameScript> GetOnlineGames(int userId, string userName, GameObject prefab) {
-
-        WWWForm formData = new WWWForm();
-        formData.AddField("userId", userId);
-        formData.AddField("f", "list");
-        formData.AddField("gameId", -1);
-        formData.AddField("userName", userName);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", formData);
-
-        if (response.Equals("No games found for user") || response.Equals("")) {
-            return null;
-        }
-
-        response = "{\"onlineGamesList\" :  " + response + " }";
-
-        OnlineGames og = new OnlineGames();
-        JsonUtility.FromJsonOverwrite(response, og);
-
-        GameObject onlineGameObject;
-        OnlineGameScript ogs = null;
-        List<OnlineGameScript> games = new List<OnlineGameScript>();
-        foreach (OnlineGame game in og.onlineGamesList) {
-            onlineGameObject = Instantiate(prefab, new Vector2(0, 0), Quaternion.identity) as GameObject;
-            ogs = onlineGameObject.GetComponent<OnlineGameScript>();
-            ogs.CurrentPlayer = game.currentPlayer;
-            ogs.SetGameStatus(game.status);
-            Int32.TryParse(game.id, out int gameId);
-            List<KeyValuePair<string, string>> playerInfos = GetGameInfo(gameId);
-            if (game.status.Equals("PENDING")) {
-                string extraInfo = "";
-                foreach (KeyValuePair<string, string> s in playerInfos) {
-                    if (s.Value.Equals("WAITING") && s.Key.Equals(userName, StringComparison.InvariantCultureIgnoreCase)) {
-                        ogs.SetGameStatus("INVITED");
-                        extraInfo += s.Key + ",";
-                    } else if (s.Value.EndsWith("WAITING")) {
-                        extraInfo += s.Key + ",";
-                    }
-                }
-                extraInfo = extraInfo.TrimEnd(',');
-                ogs.SetGameStatusText(extraInfo);
-
-            } else if (game.status.Equals("OTHERS_TURN")) {
-                ogs.SetGameStatusText(game.playerToAct);
-            } else if (game.status.Equals("ACTIVE")) {
-                ogs.SetGameStatusText(game.playerToAct);
-            } else {
-                ogs.SetGameStatusText();
-            }
-
-            ogs.SetId(game.id);
-            ogs.SetWinNumber(game.winNumber);
-            ogs.SetAnswerTimer(game.answerTimer);
-            ogs.SetRoundTimeLimit(game.roundTimeLimit);
-            ogs.SetRound(game.round);
-            ogs.StartDate = game.startDate;
-            ogs.LastPlayedDate = game.lastPlayedDate;
-
-            games.Add(ogs);
-            ogs.PlayerInfos = playerInfos;
-        }
-
-        return games;
-    }
-
-    internal List<KeyValuePair<string, string>> GetGameInfo(int gameId) {
-        List<KeyValuePair<string, string>> returnList = new List<KeyValuePair<string, string>>();
-
-        WWWForm form = new WWWForm();
-        form.AddField("f", "GetGameInfo");
-        form.AddField("gameId", gameId);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGameInfo.php", form);
-
-        response = "{\"playerInfoList\" : " + response + " }";
-        PlayerInfos pi = new PlayerInfos();
-        JsonUtility.FromJsonOverwrite(response, pi);
-
-        foreach (PlayerInfo p in pi.playerInfoList) {
-            KeyValuePair<string, string> player = new KeyValuePair<string, string>(p.username, p.status);
-            returnList.Add(player);
-        }
-
-        return returnList;
-    }
-
-    internal void SetQuestionsLost(int gameId, string playerName, int questionsLost) {
-        WWWForm form = new WWWForm();
-        form.AddField("f", "SetQuestionsLost");
-        form.AddField("questionsLost", questionsLost);
-        form.AddField("userName", playerName);
-        form.AddField("gameId", gameId);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
-
-        if (!response.Equals("")) {
-            Debug.Log(response);
-        }
-    }
-
-    internal void RemoveGame(int gameId) {
-        WWWForm form = new WWWForm();
-        form.AddField("f", "DeleteGame");
-        form.AddField("gameId", gameId);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
-
-        if (!response.Equals("")) {
-            Debug.Log(response);
-        }
-    }
-
-    public string GetCurrentPlayer(int gameId) {
-        WWWForm form = new WWWForm();
-        form.AddField("f", "CurrentPlayer");
-        form.AddField("gameId", gameId);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
-        if (response.Equals("")) {
-            Debug.Log("Something wrong with current player for game with id: " + gameId);
-        }
-        return response;
-    }
-
-    public void SetCurrentPlayer(int gameId, string currentPlayer) {
-        WWWForm form = new WWWForm();
-        form.AddField("f", "SetCurrentPlayer");
-        form.AddField("gameId", gameId);
-        form.AddField("userName", currentPlayer);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
-
-        if (!response.Equals("")) {
-            Debug.Log(response);
-        }
-        
-    }
-
-    internal int GetPlayerPoints(int gameId, string playerName) {
-        WWWForm form = new WWWForm();
-        form.AddField("f", "GetPlayerPoints");
-        form.AddField("gameId", gameId);
-        form.AddField("userName", playerName);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
-        if (response.Equals("")) {
-            Debug.Log("Something wrong with current player for game with id: " + gameId);
-        }
-        Int32.TryParse(response, out int playerPoints);
-        return playerPoints;
-    }
-
-    internal void SetFinishedDate(int gameId, string finishedDate) {
-        WWWForm form = new WWWForm();
-        form.AddField("f", "SetFinishedDate");
-        form.AddField("gameId", gameId);
-        form.AddField("finishedDate", finishedDate);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
-
-        if (!response.Equals("")) {
-            Debug.Log(response);
-        }
-    }
-
-    internal void SetRoundValue(int gameId, int round) {
-        WWWForm form = new WWWForm();
-        form.AddField("f", "SetRound");
-        form.AddField("gameId", gameId);
-        form.AddField("round", round);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
-
-        if (!response.Equals("")) {
-            Debug.Log(response);
-        }
-    }
-
-    internal int GetRoundValue(int gameId) {
-        WWWForm form = new WWWForm();
-        form.AddField("f", "GetRound");
-        form.AddField("gameId", gameId);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
-        if (response.Equals("")) {
-            Debug.Log("Something wrong with getting round for game with id: " + gameId);
-        }
-        Int32.TryParse(response, out int round);
-        return round;
-    }
-
-    internal List<KeyValuePair<string, int>> GetPlayersForGame(int gameId) {
-        WWWForm form = new WWWForm();
-        form.AddField("f", "GetPlayers");
-        form.AddField("gameId", gameId);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
-        if (response.Equals("")) {
-            Debug.Log("Something wrong with getting players from game with id: " + gameId);
-        }
-
-        response = response = "{\"gamePlayerInfoList\" : " + response + " }";
-        GamePlayerInfos gpi = new GamePlayerInfos();
-        JsonUtility.FromJsonOverwrite(response, gpi);
-
-        List<KeyValuePair<string, int>> returnList = new List<KeyValuePair<string, int>>();
-        foreach (GamePlayerInfo p in gpi.gamePlayerInfoList) {
-            Int32.TryParse(p.userLockedQuestions, out int points);
-            KeyValuePair<string, int> player = new KeyValuePair<string, int>(p.username, points);
-            returnList.Add(player);
-        }
-
-        return returnList;
-    }
-
-    public string AnswerString { get => answerString; set => answerString = value; }
-    public string IdString { get => idString; set => idString = value; }
-    public string CategoryString { get => categoryString; set => categoryString = value; }
-
-    internal int GetQuestionsLost(int gameId, string playerName) {
-        WWWForm form = new WWWForm();
-        form.AddField("f", "GetQuestionsLost");
-        form.AddField("userName", playerName);
-        form.AddField("gameId", gameId);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
-        if (response.Equals("")) {
-            Debug.Log("Something wrong with getting questions lost from game with id: " + gameId + " and playername " + playerName);
-        }
-        Int32.TryParse(response, out int questionsLost);
-        return questionsLost;
-    }
-
-    internal int GetWinCondition(int gameId) {
-        if (winAmount == -1) {
-            WWWForm form = new WWWForm();
-            form.AddField("gameId", gameId);
-            form.AddField("f", "GetWinCondition");
-
-            string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
-
-            Int32.TryParse(response, out this.winAmount);
-
-        }
-        return this.winAmount;
-    }
-
-    public NewQuestionData newQuestionData;
-
-    public NewQuestionData GetNewQuestion(List<int> userAnsweredQuestions, string userName) {
-        int gameId = GameObject.Find("GameManager").GetComponent<GameManagerScript>().GameId;
-
-        Question q = GetQuestionData(false);
-
-        Color32 categoryColor = new Color32((byte)q.r, (byte)q.g, (byte)q.b, (byte)q.a);
-        //            Color32 questionCategoryColor = new Color32((byte)q.r, (byte)q.g, (byte)q.b, (byte)q.a);
-
-        Int32.TryParse(q.category, out int categoryId);
-        Int32.TryParse(q.id, out int questionId);
-
-        NewQuestionData questionData = new NewQuestionData(q.answer, q.question, q.categoryName, categoryId, questionId, categoryColor);
-
-        return questionData;
-    }
-
-    public void SavePlayersQuestion(List<int> questionsToSave, string playerNameValue, int gameId) {
-        WWWForm form = new WWWForm();
-        form.AddField("f", "SavePlayerQuestions");
-        form.AddField("gameId", gameId);
-        form.AddField("questionsToSave", String.Join(",",questionsToSave));
-        form.AddField("userName", playerNameValue);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
-
-        if (!response.Equals("")) {
-            Debug.Log(response);
-        }
-    }
-
-    public List<NewQuestionData> GetPlayerQuestions(int gameId, string playerName) {
-        List<NewQuestionData> questions = new List<NewQuestionData>();
-        WWWForm form = new WWWForm();
-        form.AddField("f", "PlayerQuestions");
-        form.AddField("gameId", gameId);
-        form.AddField("userName", playerName);
-
-        string response = CallOnlineDatabaseWithResponse("OnlineGameInfo.php", form);
-        response = "{\"questionsList\" : " + response + "}";
-        
-        Questions ql = new Questions();
-
-        JsonUtility.FromJsonOverwrite(response, ql);
-
-        foreach (Question q in ql.questionsList) {
-            /*GameObject question = Instantiate(questionCardPrefab, new Vector2(0, 0), Quaternion.identity) as GameObject;
-            NewQuestionData qc = question.GetComponent<NewQuestionData>();
-            */
-            Color categoryColor = new Color(q.r, q.g, q.b, q.a);
-//            Color32 questionCategoryColor = new Color32((byte)q.r, (byte)q.g, (byte)q.b, (byte)q.a);
-
-            Int32.TryParse(q.category, out int categoryId);
-            Int32.TryParse(q.id, out int questionId);
-
-            NewQuestionData questionData = new NewQuestionData(q.answer, q.question, q.categoryName, categoryId, questionId, categoryColor);
-
-            questions.Add(questionData);
-        }
-        
-        return questions;
-    }
-
-    private Question GetQuestionData(bool showAnswer) {
-        WWWForm form = new WWWForm();
-
-        string response = CallOnlineDatabaseWithResponse("Question.php", form);
-        
-        // Show result
-
-        response = "{\"questionsList\" : [ " + response + " ]}";
-
-        Questions qe = new Questions();
-        JsonUtility.FromJsonOverwrite(response, qe);
-        
-        return qe.questionsList[0];
-    }
-
-    public List<UserName> GetUsersToInvite(string searchString) {
-        string postUrl = "narkampen.nordh.xyz/narKampen/dbFiles/PlayerSearch.php?";
-        postUrl += "search=" + UnityWebRequest.EscapeURL(searchString);
-
-        UserNames uNames = new UserNames();
-        UnityWebRequest www = UnityWebRequest.Get(postUrl);
-        www.SendWebRequest();
-
-        if (www.isNetworkError || www.isHttpError) {
-            Debug.Log(www.error);
-        } else {
-            while (!www.isDone) {
-            }
-            // Show result
-            string jsonData = www.downloadHandler.text;
-
-            if (!jsonData.Equals("")) {
-                jsonData = "{\"usernamesList\" :  " + jsonData + " }";
-
-                JsonUtility.FromJsonOverwrite(jsonData, uNames);
-            }
-        }
-        // TODO handle empty
-        return uNames.usernamesList;
-    }
-
-    internal void SendNextPlayerMessage(int gameId, String nextPlayer)
-    {
-        WWWForm form = new WWWForm();
-        form.AddField("gameId", gameId);
-        form.AddField("playerName", nextPlayer);
-        form.AddField("title", LocalizationManager.Instance.GetText("FCM_NEXT_PLAYER_TITLE"));
-        List<KeyValuePair<string, int>> players = OnlineDatabase.Instance.GetPlayersForGame(gameId);
-        StringBuilder sb = new StringBuilder();
-        foreach (KeyValuePair<String, int> player in players)
-        {
-            sb.AppendLine(player.Key + " (" + player.Value + ")");
-        }
-        String message = String.Format(LocalizationManager.Instance.GetText("FCM_NEXT_PLAYER_MESSAGE"),sb.ToString());
-        form.AddField("message", message);
-        form.AddField("type", "FCMNextPlayer");
-        
-        //string response = CallOnlineDatabaseWithResponse("FCMNextPlayer.php", form);
-        CallDatabase("FCMMessageing.php", form);
-    }
-
-    internal void SendInviteForNewGame(int gameId, List<String> Players, String inviter) {
-        WWWForm form = new WWWForm();
-        form.AddField("gameId", gameId);
-        int index = 0;
-        foreach(String player in Players) {
-            form.AddField("player" + index++, player);
-        }
-        form.AddField("title", LocalizationManager.Instance.GetText("FCM_NEW_GAME_TITLE"));
-        form.AddField("message", String.Format(LocalizationManager.Instance.GetText("FCM_NEW_GAME_MESSAGE"), inviter));
-        form.AddField("type", "InviteMessage");
-        CallDatabase("FCMMessageing.php", form);
-    }
-
-    
-    internal void UpdatePlayerToken(int userId, string myToken)
-    {
-        WWWForm form = new WWWForm();
-        form.AddField("userId", userId);
-        form.AddField("token", myToken);
-        form.AddField("f", "UpdatePlayerToken");
-
-        CallDatabase("OnlineGames.php", form);
-    }
-
-}
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using Mono.Data.Sqlite;
+using System.Data;
+using System;
+using UnityEngine.Networking;
+using System.IO;
+using System.Text;
+
+public class OnlineDatabase : MonoBehaviour {
+    private const string onlineQuestionsUrl = "narkampen.nordh.xyz/narKampen/dbFiles/Question.php";
+    private const string serverUrl = "narkampen.nordh.xyz/narKampen/dbFiles/";
+    string gameMode;
+    int winAmount = -1;
+
+    public GameObject questionCardPrefab;
+
+    private static OnlineDatabase instance;
+    public static OnlineDatabase Instance { get { return instance; } }
+
+    private void Awake() {
+        if (instance == null) {
+            instance = this;
+        }
+    }
+
+    internal List<CategoryPanel.Category> GetCategories(List<CategoryPanel.Category> list) {
+        string response = CallOnlineDatabaseWithResponse("Categories.php", null);
+
+        response = "{\"categoryList\" :  " + response + " }";
+
+        Categories categories = new Categories();
+        JsonUtility.FromJsonOverwrite(response, categories);
+
+        foreach (Category c in categories.categoryList) {
+            CategoryPanel.Category cat = new CategoryPanel.Category();
+
+            cat.color = new Color32((byte)c.r, (byte)c.g, (byte)c.b, (byte)c.a);
+            cat.name = c.name;
+            cat.id = c.id;
+            cat.questionCount = c.count;
+
+            list.Add(cat);
+        }
+        return list;
+    }
+
+    internal int SetupNewOnlineGame(int limitPerQuestion, int limitPerPlayer, int toWin, List<InviteSearchResult> inviteUsers) {
+        List<int> playerIds = new List<int>();
+        inviteUsers.ForEach(i => playerIds.Add(i.GetId()));
+        int currentUser = Database.Instance.GetSignedInUser().Key;
+        playerIds.Add(currentUser);
+
+        var form = new WWWForm();
+        form.AddField("currentUser", currentUser);
+        form.AddField("winNumber", toWin);
+        form.AddField("limitPerQuestion", limitPerQuestion);
+        form.AddField("limitPerPlayer", limitPerPlayer);
+        form.AddField("playerIds", String.Join(",", playerIds));
+
+        string response = CallOnlineDatabaseWithResponse("NewOnlineGame.php", form);
+
+        if (response.Equals("")) {
+            Debug.Log("Expected gameId in response for creating new game but did not get one");
+        }
+
+        if (Int32.TryParse(response, out int newGameId)) {
+            return newGameId; 
+        } else {
+            Debug.Log("Failed to get new game id with response " + response);
+            return -1;
+        }
+
+    }
+
+    [Serializable]
+    public class Question {
+        public string question;
+        public string answer;
+        public string id;
+        public string category;
+        public string categoryName;
+        public int r;
+        public int g;
+        public int b;
+        public int a;
+    }
+
+    [Serializable]
+    public class Questions {
+        public List<Question> questionsList = new List<Question>();
+    }
+
+    [Serializable]
+    public class PlayerInfo {
+        public string username;
+        public string status;
+    }
+
+    [Serializable]
+    public class PlayerInfos {
+        public List<PlayerInfo> playerInfoList = new List<PlayerInfo>();
+    }
+
+    [Serializable]
+    public class GamePlayerInfo {
+        public string username;
+        public string userLockedQuestions;
+    }
+
+    [Serializable]
+    public class GamePlayerInfos {
+        public List<GamePlayerInfo> gamePlayerInfoList = new List<GamePlayerInfo>();
+    }
+
+
+
+    [Serializable]
+    public class Category {
+        public int r;
+        public int g;
+        public int b;
+        public int a;
+        public int id;
+        public string name;
+        public int count;
+    }
+
+    [Serializable]
+    public class Categories {
+        public List<Category> categoryList = new List<Category>();
+    }
+
+    [Serializable]
+    public class OnlineGame {
+        public string id;
+        public string winNumber;
+        public string answerTimer;
+        public string roundTimeLimit;
+        public string currentPlayer;
+        public string round;
+        public string startDate;
+        public string lastPlayedDate;
+        public string finishedDate;
+        public string status;
+        public string playerToAct;
+    }
+
+    [Serializable]
+    public class OnlineGames {
+        public List<OnlineGame> onlineGamesList = new List<OnlineGame>();
+    }
+
+    [Serializable]
+    public class UserName {
+        public string id;
+        public string username;
+    }
+
+    [Serializable]
+    public class UserNames {
+        public List<UserName> usernamesList = new List<UserName>();
+    }
+
+    private void CallDatabase(string filename, WWWForm formData) {
+        string postUrl = serverUrl + filename;
+
+        UnityWebRequest www = UnityWebRequest.Post(postUrl, formData);
+        www.SendWebRequest();
+
+        if (www.isNetworkError || www.isHttpError) {
+            Debug.Log(www.error);
+        } else {
+            while (!www.isDone) {
+            }
+        }
+    }
+
+    private string CallOnlineDatabaseWithResponse(string filename, WWWForm formData) {
+        string postUrl = serverUrl + filename;
+
+        UnityWebRequest www = UnityWebRequest.Post(postUrl, formData);
+        www.SendWebRequest();
+
+        if (www.isNetworkError || www.isHttpError) {
+            Debug.Log(www.error);
+        } else {
+            while (!www.isDone) {
+            }
+        }
+
+        return www.downloadHandler.text;
+    }
+
+    string questionString = "";
+    string answerString = "";
+    string idString = "";
+    string categoryString = "";
+
+    public string QuestionString { get => questionString; set => questionString = value; }
+
+
+    private void Start() {
+        if (instance == null) {
+            instance = this;
+        }
+    }
+
+    internal void SetLastPlayedDate(int gameId) {
+
+        WWWForm form = new WWWForm();
+        form.AddField("gameId", gameId);
+        form.AddField("f", "SetLastPlayed");
+        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
+
+        if (!response.Equals("")) {
+            Debug.Log(response);
+        }
+    }
+
+    internal void DeclineOnlineGame(string userName, int gameId) {
+        WWWForm formData = new WWWForm();
+        formData.AddField("userId", -1);
+        formData.AddField("f", "decline");
+        formData.AddField("gameId", gameId);
+        formData.AddField("userName", userName);
+
+        CallDatabase("OnlineGames.php", formData);
+    }
+
+    internal void AcceptOnlineGame(string userName, int gameId) {
+        WWWForm formData = new WWWForm();
+        formData.AddField("userId", -1);
+        formData.AddField("f", "accept");
+        formData.AddField("gameId", gameId);
+        formData.AddField("userName", userName);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", formData);
+        if (!response.Equals("")) {
+            Debug.Log(response);
+        }
+    }
+
+    internal List<OnlineGameScript> GetOnlineGames(int userId, string userName, GameObject prefab) {
+
+        WWWForm formData = new WWWForm();
+        formData.AddField("userId", userId);
+        formData.AddField("f", "list");
+        formData.AddField("gameId", -1);
+        formData.AddField("userName", userName);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", formData);
+
+        if (response.Equals("No games found for user") || response.Equals("")) {
+            return null;
+        }
+
+        response = "{\"onlineGamesList\" :  " + response + " }";
+
+        OnlineGames og = new OnlineGames();
+        JsonUtility.FromJsonOverwrite(response, og);
+
+        GameObject onlineGameObject;
+        OnlineGameScript ogs = null;
+        List<OnlineGameScript> games = new List<OnlineGameScript>();
+        foreach (OnlineGame game in og.onlineGamesList) {
+            onlineGameObject = Instantiate(prefab, new Vector2(0, 0), Quaternion.identity) as GameObject;
+            ogs = onlineGameObject.GetComponent<OnlineGameScript>();
+            ogs.CurrentPlayer = game.currentPlayer;
+            ogs.SetGameStatus(game.status);
+            Int32.TryParse(game.id, out int gameId);
+            List<KeyValuePair<string, string>> playerInfos = GetGameInfo(gameId);
+            if (game.status.Equals("PENDING")) {
+                string extraInfo = "";
+                foreach (KeyValuePair<string, string> s in playerInfos) {
+                    if (s.Value.Equals("WAITING") && s.Key.Equals(userName, StringComparison.InvariantCultureIgnoreCase)) {
+                        ogs.SetGameStatus("INVITED");
+                        extraInfo += s.Key + ",";
+                    } else if (s.Value.EndsWith("WAITING")) {
+                        extraInfo += s.Key + ",";
+                    }
+                }
+                extraInfo = extraInfo.TrimEnd(',');
+                ogs.SetGameStatusText(extraInfo);
+
+            } else if (game.status.Equals("OTHERS_TURN")) {
+                ogs.SetGameStatusText(game.playerToAct);
+            } else if (game.status.Equals("ACTIVE")) {
+                ogs.SetGameStatusText(game.playerToAct);
+            } else {
+                ogs.SetGameStatusText();
+            }
+
+            ogs.SetId(game.id);
+            ogs.SetWinNumber(game.winNumber);
+            ogs.SetAnswerTimer(game.answerTimer);
+            ogs.SetRoundTimeLimit(game.roundTimeLimit);
+            ogs.SetRound(game.round);
+            ogs.StartDate = game.startDate;
+            ogs.LastPlayedDate = game.lastPlayedDate;
+
+            games.Add(ogs);
+            ogs.PlayerInfos = playerInfos;
+        }
+
+        return games;
+    }
+
+    internal List<KeyValuePair<string, string>> GetGameInfo(int gameId) {
+        List<KeyValuePair<string, string>> returnList = new List<KeyValuePair<string, string>>();
+
+        WWWForm form = new WWWForm();
+        form.AddField("f", "GetGameInfo");
+        form.AddField("gameId", gameId);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGameInfo.php", form);
+
+        response = "{\"playerInfoList\" : " + response + " }";
+        PlayerInfos pi = new PlayerInfos();
+        JsonUtility.FromJsonOverwrite(response, pi);
+
+        foreach (PlayerInfo p in pi.playerInfoList) {
+            KeyValuePair<string, string> player = new KeyValuePair<string, string>(p.username, p.status);
+            returnList.Add(player);
+        }
+
+        return returnList;
+    }
+
+    internal void SetQuestionsLost(int gameId, string playerName, int questionsLost) {
+        WWWForm form = new WWWForm();
+        form.AddField("f", "SetQuestionsLost");
+        form.AddField("questionsLost", questionsLost);
+        form.AddField("userName", playerName);
+        form.AddField("gameId", gameId);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
+
+        if (!response.Equals("")) {
+            Debug.Log(response);
+        }
+    }
+
+    internal void RemoveGame(int gameId) {
+        WWWForm form = new WWWForm();
+        form.AddField("f", "DeleteGame");
+        form.AddField("gameId", gameId);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
+
+        if (!response.Equals("")) {
+            Debug.Log(response);
+        }
+    }
+
+    public string GetCurrentPlayer(int gameId) {
+        WWWForm form = new WWWForm();
+        form.AddField("f", "CurrentPlayer");
+        form.AddField("gameId", gameId);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
+        if (response.Equals("")) {
+            Debug.Log("Something wrong with current player for game with id: " + gameId);
+        }
+        return response;
+    }
+
+    public void SetCurrentPlayer(int gameId, string currentPlayer) {
+        WWWForm form = new WWWForm();
+        form.AddField("f", "SetCurrentPlayer");
+        form.AddField("gameId", gameId);
+        form.AddField("userName", currentPlayer);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
+
+        if (!response.Equals("")) {
+            Debug.Log(response);
+        }
+        
+    }
+
+    internal int GetPlayerPoints(int gameId, string playerName) {
+        WWWForm form = new WWWForm();
+        form.AddField("f", "GetPlayerPoints");
+        form.AddField("gameId", gameId);
+        form.AddField("userName", playerName);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
+        if (response.Equals("")) {
+            Debug.Log("Something wrong with current player for game with id: " + gameId);
+        }
+        Int32.TryParse(response, out int playerPoints);
+        return playerPoints;
+    }
+
+    internal void SetFinishedDate(int gameId, string finishedDate) {
+        WWWForm form = new WWWForm();
+        form.AddField("f", "SetFinishedDate");
+        form.AddField("gameId", gameId);
+        form.AddField("finishedDate", finishedDate);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
+
+        if (!response.Equals("")) {
+            Debug.Log(response);
+        }
+    }
+
+    internal void SetRoundValue(int gameId, int round) {
+        WWWForm form = new WWWForm();
+        form.AddField("f", "SetRound");
+        form.AddField("gameId", gameId);
+        form.AddField("round", round);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
+
+        if (!response.Equals("")) {
+            Debug.Log(response);
+        }
+    }
+
+    internal int GetRoundValue(int gameId) {
+        WWWForm form = new WWWForm();
+        form.AddField("f", "GetRound");
+        form.AddField("gameId", gameId);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
+        if (response.Equals("")) {
+            Debug.Log("Something wrong with getting round for game with id: " + gameId);
+        }
+        Int32.TryParse(response, out int round);
+        return round;
+    }
+
+    internal List<KeyValuePair<string, int>> GetPlayersForGame(int gameId) {
+        WWWForm form = new WWWForm();
+        form.AddField("f", "GetPlayers");
+        form.AddField("gameId", gameId);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
+        if (response.Equals("")) {
+            Debug.Log("Something wrong with getting players from game with id: " + gameId);
+        }
+
+        response = response = "{\"gamePlayerInfoList\" : " + response + " }";
+        GamePlayerInfos gpi = new GamePlayerInfos();
+        JsonUtility.FromJsonOverwrite(response, gpi);
+
+        List<KeyValuePair<string, int>> returnList = new List<KeyValuePair<string, int>>();
+        foreach (GamePlayerInfo p in gpi.gamePlayerInfoList) {
+            Int32.TryParse(p.userLockedQuestions, out int points);
+            KeyValuePair<string, int> player = new KeyValuePair<string, int>(p.username, points);
+            returnList.Add(player);
+        }
+
+        return returnList;
+    }
+
+    public string AnswerString { get => answerString; set => answerString = value; }
+    public string IdString { get => idString; set => idString = value; }
+    public string CategoryString { get => categoryString; set => categoryString = value; }
+
+    internal int GetQuestionsLost(int gameId, string playerName) {
+        WWWForm form = new WWWForm();
+        form.AddField("f", "GetQuestionsLost");
+        form.AddField("userName", playerName);
+        form.AddField("gameId", gameId);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
+        if (response.Equals("")) {
+            Debug.Log("Something wrong with getting questions lost from game with id: " + gameId + " and playername " + playerName);
+        }
+        Int32.TryParse(response, out int questionsLost);
+        return questionsLost;
+    }
+
+    internal int GetWinCondition(int gameId) {
+        if (winAmount == -1) {
+            WWWForm form = new WWWForm();
+            form.AddField("gameId", gameId);
+            form.AddField("f", "GetWinCondition");
+
+            string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
+
+            Int32.TryParse(response, out this.winAmount);
+
+        }
+        return this.winAmount;
+    }
+
+    public NewQuestionData newQuestionData;
+
+    public NewQuestionData GetNewQuestion(List<int> userAnsweredQuestions, string userName) {
+        int gameId = GameObject.Find("GameManager").GetComponent<GameManagerScript>().GameId;
+
+        Question q = GetQuestionData(false);
+
+        Color32 categoryColor = new Color32((byte)q.r, (byte)q.g, (byte)q.b, (byte)q.a);
+        //            Color32 questionCategoryColor = new Color32((byte)q.r, (byte)q.g, (byte)q.b, (byte)q.a);
+
+        Int32.TryParse(q.category, out int categoryId);
+        Int32.TryParse(q.id, out int questionId);
+
+        NewQuestionData questionData = new NewQuestionData(q.answer, q.question, q.categoryName, categoryId, questionId, categoryColor);
+
+        return questionData;
+    }
+
+    public void SavePlayersQuestion(List<int> questionsToSave, string playerNameValue, int gameId) {
+        WWWForm form = new WWWForm();
+        form.AddField("f", "SavePlayerQuestions");
+        form.AddField("gameId", gameId);
+        form.AddField("questionsToSave", String.Join(",",questionsToSave));
+        form.AddField("userName", playerNameValue);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGames.php", form);
+
+        if (!response.Equals("")) {
+            Debug.Log(response);
+        }
+    }
+
+    public List<NewQuestionData> GetPlayerQuestions(int gameId, string playerName) {
+        List<NewQuestionData> questions = new List<NewQuestionData>();
+        WWWForm form = new WWWForm();
+        form.AddField("f", "PlayerQuestions");
+        form.AddField("gameId", gameId);
+        form.AddField("userName", playerName);
+
+        string response = CallOnlineDatabaseWithResponse("OnlineGameInfo.php", form);
+        response = "{\"questionsList\" : " + response + "}";
+        
+        Questions ql = new Questions();
+
+        JsonUtility.FromJsonOverwrite(response, ql);
+
+        foreach (Question q in ql.questionsList) {
+            /*GameObject question = Instantiate(questionCardPrefab, new Vector2(0, 0), Quaternion.identity) as GameObject;
+            NewQuestionData qc = question.GetComponent<NewQuestionData>();
+            */
+            Color categoryColor = new Color(q.r, q.g, q.b, q.a);
+//            Color32 questionCategoryColor = new Color32((byte)q.r, (byte)q.g, (byte)q.b, (byte)q.a);
+
+            Int32.TryParse(q.category, out int categoryId);
+            Int32.TryParse(q.id, out int questionId);
+
+            NewQuestionData questionData = new NewQuestionData(q.answer, q.question, q.categoryName, categoryId, questionId, categoryColor);
+
+            questions.Add(questionData);
+        }
+        
+        return questions;
+    }
+
+    private Question GetQuestionData(bool showAnswer) {
+        WWWForm form = new WWWForm();
+
+        string response = CallOnlineDatabaseWithResponse("Question.php", form);
+        
+        // Show result
+
+        response = "{\"questionsList\" : [ " + response + " ]}";
+
+        Questions qe = new Questions();
+        JsonUtility.FromJsonOverwrite(response, qe);
+        
+        return qe.questionsList[0];
+    }
+
+    public List<UserName> GetUsersToInvite(string searchString) {
+        string postUrl = "narkampen.nordh.xyz/narKampen/dbFiles/PlayerSearch.php?";
+        postUrl += "search=" + UnityWebRequest.EscapeURL(searchString);
+
+        UserNames uNames = new UserNames();
+        UnityWebRequest www = UnityWebRequest.Get(postUrl);
+        www.SendWebRequest();
+
+        if (www.isNetworkError || www.isHttpError) {
+            Debug.Log(www.error);
+        } else {
+            while (!www.isDone) {
+            }
+            // Show result
+            string jsonData = www.downloadHandler.text;
+
+            if (!jsonData.Equals("")) {
+                jsonData = "{\"usernamesList\" :  " + jsonData + " }";
+
+                JsonUtility.FromJsonOverwrite(jsonData, uNames);
+            }
+        }
+        // TODO handle empty
+        return uNames.usernamesList;
+    }
+
+    internal void SendNextPlayerMessage(int gameId, String nextPlayer)
+    {
+        WWWForm form = new WWWForm();
+        form.AddField("gameId", gameId);
+        form.AddField("playerName", nextPlayer);
+        form.AddField("title", LocalizationManager.Instance.GetText("FCM_NEXT_PLAYER_TITLE"));
+        List<KeyValuePair<string, int>> players = OnlineDatabase.Instance.GetPlayersForGame(gameId);
+        StringBuilder sb = new StringBuilder();
+        foreach (KeyValuePair<String, int> player in players)
+        {
+            sb.AppendLine(player.Key + " (" + player.Value + ")");
+        }
+        String message = String.Format(LocalizationManager.Instance.GetText("FCM_NEXT_PLAYER_MESSAGE"),sb.ToString());
+        form.AddField("message", message);
+        form.AddField("type", "FCMNextPlayer");
+        
+        //string response = CallOnlineDatabaseWithResponse("FCMNextPlayer.php", form);
+        CallDatabase("FCMMessageing.php", form);
+    }
+
+    internal void SendInviteForNewGame(int gameId, List<String> Players, String inviter) {
+        WWWForm form = new WWWForm();
+        form.AddField("gameId", gameId);
+        int index = 0;
+        foreach(String player in Players) {
+            form.AddField("player" + index++, player);
+        }
+        form.AddField("title", LocalizationManager.Instance.GetText("FCM_NEW_GAME_TITLE"));
+        form.AddField("message", String.Format(LocalizationManager.Instance.GetText("FCM_NEW_GAME_MESSAGE"), inviter));
+        form.AddField("type", "InviteMessage");
+        CallDatabase("FCMMessageing.php", form);
+    }
+
+    
+    internal void UpdatePlayerToken(int userId, string myToken)
+    {
+        WWWForm form = new WWWForm();
+        form.AddField("userId", userId);
+        form.AddField("token", myToken);
+        form.AddField("f", "UpdatePlayerToken");
+
+        CallDatabase("OnlineGames.php", form);
+    }
+
+    
+    internal List<string> FindRandomPlayer() {
+        List<string> returnValue = new List<string>();
+        WWWForm form = new WWWForm();
+        form.AddField("f", "FindRandomPlayer");
+
+        String response = CallOnlineDatabaseWithResponse("", form);
+        
+        //TODO FIX ME
+
+        return returnValue;
+    }
+
+
+}

+ 73 - 71
Assets/Scripts/MainGame/CategoryPanel.cs

@@ -1,71 +1,73 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-using UnityEngine.UI;
-
-public class CategoryPanel : MonoBehaviour
-{
-    [Serializable]
-    public class Category
-    {
-        public string name;
-        public int id;
-        public Color32 color;
-    }
-
-    string gameMode;
-    GameManagerScript gms;
-    List<Category> categories;
-    // Start is called before the first frame update
-    void Start()
-    {
-        PopulatePanel();
-    }
-
-    private void PopulatePanel() {
-        if (categories == null) {
-            categories = new List<Category>();
-            Database.Instance.GetCategories(categories, GetGameMode());
-        }
-        foreach (Category cat in categories) {
-            AddText(cat.name, cat.color);
-        }
-    }
-
-    private void AddText(string text, Color32 color) {
-        color.a = 255;
-        GameObject go = new GameObject(text);
-        go.transform.SetParent(this.transform, false);
-        Text newText = go.AddComponent<Text>();
-        newText.text = text;
-        newText.color = color;
-        newText.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
-        newText.resizeTextForBestFit = true;
-        newText.resizeTextMaxSize = 18;
-        newText.resizeTextMinSize = 8;
-
-        newText.alignment = TextAnchor.MiddleCenter;
-    }
-
-    public Category GetCategoryById(int id) {
-        if (categories == null) {
-            categories = new List<Category>();
-            Database.Instance.GetCategories(categories, GetGameMode());
-        }
-        foreach (Category cat in categories) {
-            if (cat.id == id) {
-                return cat;
-            }
-        }
-        return null;
-    }
-
-    private string GetGameMode() {
-        if (gameMode == null) {
-            gameMode = PlayerPrefs.GetString("GameMode");
-        }
-
-        return gameMode;
-    }
-}
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class CategoryPanel : MonoBehaviour
+{
+    [Serializable]
+    public class Category
+    {
+        public string name;
+        public int id;
+        public Color32 color;
+
+        public int questionCount;
+    }
+
+    string gameMode;
+    GameManagerScript gms;
+    List<Category> categories;
+    // Start is called before the first frame update
+    void Start()
+    {
+        PopulatePanel();
+    }
+
+    private void PopulatePanel() {
+        if (categories == null) {
+            categories = new List<Category>();
+            Database.Instance.GetCategories(categories, GetGameMode());
+        }
+        foreach (Category cat in categories) {
+            AddText(cat.name, cat.color);
+        }
+    }
+
+    private void AddText(string text, Color32 color) {
+        color.a = 255;
+        GameObject go = new GameObject(text);
+        go.transform.SetParent(this.transform, false);
+        Text newText = go.AddComponent<Text>();
+        newText.text = text;
+        newText.color = color;
+        newText.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
+        newText.resizeTextForBestFit = true;
+        newText.resizeTextMaxSize = 18;
+        newText.resizeTextMinSize = 8;
+
+        newText.alignment = TextAnchor.MiddleCenter;
+    }
+
+    public Category GetCategoryById(int id) {
+        if (categories == null) {
+            categories = new List<Category>();
+            Database.Instance.GetCategories(categories, GetGameMode());
+        }
+        foreach (Category cat in categories) {
+            if (cat.id == id) {
+                return cat;
+            }
+        }
+        return null;
+    }
+
+    private string GetGameMode() {
+        if (gameMode == null) {
+            gameMode = PlayerPrefs.GetString("GameMode");
+        }
+
+        return gameMode;
+    }
+}

+ 131 - 124
Assets/Scripts/NewGameScene/InvitePanelScript.cs

@@ -1,124 +1,131 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-using UnityEngine.UI;
-
-public class InvitePanelScript : MonoBehaviour {
-    public Button closeButton;
-    public Button searchButton;
-    public Button doneButton;
-
-    public InputField searchField;
-
-    public GameObject inviteSearchResultPrefab;
-
-    public GameObject searchResultPanel;
-    public GameObject OnlineGameSettingsPanel;
-
-
-    private float autoSearchWait = 3f;
-    private bool searchActive = false;
-    private float autoSearchTime;
-    private int searchChars = 0;
-    private string searchedString = "";
-
-    // Start is called before the first frame update
-    void Start() {
-        closeButton.onClick.AddListener(HidePanel);
-        doneButton.onClick.AddListener(HidePanel);
-        searchButton.onClick.AddListener(CallInviteFunction);
-    }
-
-    // Update is called once per frame
-    void Update() {
-        if (searchField.text.Length < 3) {
-            ClearIvites();
-            searchActive = false;
-            searchButton.interactable = false;
-        } else if (searchActive && searchChars != searchField.text.Length) {
-            searchChars = searchField.text.Length;
-            autoSearchTime = Time.time + autoSearchWait;
-        } else if (searchActive && searchChars == searchField.text.Length && Time.time >= autoSearchTime) {
-            CallInviteFunction();
-        } else if (!searchActive && !searchField.text.Equals(searchedString)) {
-            searchActive = true;
-            autoSearchTime = Time.time + autoSearchWait;
-            searchButton.interactable = true;
-            searchChars = searchField.text.Length;
-        }
-    }
-
-    internal int InvitedCount() {
-        InviteSearchResult[] invites = this.GetComponentsInChildren<InviteSearchResult>();
-        int count = 0;
-        foreach (InviteSearchResult isr in invites) {
-            if (isr.ShouldInvite()) {
-                count++;
-            }
-        }
-
-        return count;
-    }
-
-    public List<InviteSearchResult> GetSelectedUsersForInvite() {
-        List<InviteSearchResult> result = new List<InviteSearchResult>();
-        foreach(InviteSearchResult isr in this.GetComponentsInChildren<InviteSearchResult>()) {
-            if (isr.ShouldInvite()) {
-                result.Add(isr);
-            }
-        }
-
-        return result;
-    }
-
-    public bool AreThereInvites() {
-        int count = InvitedCount();
-        return count > 0?true:false;
-    }
-
-    private void ClearIvites() {
-        InviteSearchResult[] invites = this.GetComponentsInChildren<InviteSearchResult>();
-        foreach (InviteSearchResult isr in invites) {
-            if (!isr.ShouldInvite()) {
-                Destroy(isr.gameObject);
-                Destroy(isr);
-            }
-        }
-    }
-
-    private void CallInviteFunction() {
-        ClearIvites();
-        searchedString = searchField.text;
-        searchActive = false;
-
-        List<OnlineDatabase.UserName> foundUsers = OnlineDatabase.Instance.GetUsersToInvite(searchField.text);
-        InviteSearchResult[] added = searchResultPanel.GetComponentsInChildren<InviteSearchResult>();
-        foreach (OnlineDatabase.UserName un in foundUsers) {
-            if (Database.Instance.GetSignedInUser().Key.ToString().Equals(un.id)) {
-                continue;
-            }
-            bool skip = false;
-            foreach (InviteSearchResult addedRes in added) {
-                if (addedRes.GetName().Equals(un.username))  {
-                    skip = true;
-                    break;
-                }
-            }
-            if (!skip) {
-                GameObject question = Instantiate(inviteSearchResultPrefab, new Vector2(0, 0), Quaternion.identity) as GameObject;
-                InviteSearchResult res = question.GetComponent<InviteSearchResult>();
-                res.SetName(un.username);
-                res.SetId(un.id);
-                res.transform.SetParent(searchResultPanel.transform, false);
-            }
-        }
-    }
-
-    void HidePanel() {
-
-        OnlineGameSettingsPanel.GetComponentInChildren<invitedPlayersTextScript>().updateText(InvitedCount());
-        gameObject.SetActive(false);
-        OnlineGameSettingsPanel.SetActive(true);
-    }
-}
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class InvitePanelScript : MonoBehaviour {
+    public Button closeButton;
+    public Button searchButton;
+    public Button doneButton;
+
+    public InputField searchField;
+
+    public GameObject inviteSearchResultPrefab;
+
+    public GameObject searchResultPanel;
+    public GameObject OnlineGameSettingsPanel;
+
+
+    private float autoSearchWait = 3f;
+    private bool searchActive = false;
+    private float autoSearchTime;
+    private int searchChars = 0;
+    private string searchedString = "";
+
+    [SerializeField] Button findRandomPlayerButton;
+
+    // Start is called before the first frame update
+    void Start() {
+        closeButton.onClick.AddListener(HidePanel);
+        doneButton.onClick.AddListener(HidePanel);
+        findRandomPlayerButton.onClick.AddListener(FindRandomPlayer);
+        searchButton.onClick.AddListener(CallInviteFunction);
+    }
+
+    // Update is called once per frame
+    void Update() {
+        if (searchField.text.Length < 3) {
+            ClearIvites();
+            searchActive = false;
+            searchButton.interactable = false;
+        } else if (searchActive && searchChars != searchField.text.Length) {
+            searchChars = searchField.text.Length;
+            autoSearchTime = Time.time + autoSearchWait;
+        } else if (searchActive && searchChars == searchField.text.Length && Time.time >= autoSearchTime) {
+            CallInviteFunction();
+        } else if (!searchActive && !searchField.text.Equals(searchedString)) {
+            searchActive = true;
+            autoSearchTime = Time.time + autoSearchWait;
+            searchButton.interactable = true;
+            searchChars = searchField.text.Length;
+        }
+    }
+
+    internal int InvitedCount() {
+        InviteSearchResult[] invites = this.GetComponentsInChildren<InviteSearchResult>();
+        int count = 0;
+        foreach (InviteSearchResult isr in invites) {
+            if (isr.ShouldInvite()) {
+                count++;
+            }
+        }
+
+        return count;
+    }
+
+    void FindRandomPlayer() {
+        Database.Instance.FindRandomPlayer();
+    }
+
+    public List<InviteSearchResult> GetSelectedUsersForInvite() {
+        List<InviteSearchResult> result = new List<InviteSearchResult>();
+        foreach(InviteSearchResult isr in this.GetComponentsInChildren<InviteSearchResult>()) {
+            if (isr.ShouldInvite()) {
+                result.Add(isr);
+            }
+        }
+
+        return result;
+    }
+
+    public bool AreThereInvites() {
+        int count = InvitedCount();
+        return count > 0?true:false;
+    }
+
+    private void ClearIvites() {
+        InviteSearchResult[] invites = this.GetComponentsInChildren<InviteSearchResult>();
+        foreach (InviteSearchResult isr in invites) {
+            if (!isr.ShouldInvite()) {
+                Destroy(isr.gameObject);
+                Destroy(isr);
+            }
+        }
+    }
+
+    private void CallInviteFunction() {
+        ClearIvites();
+        searchedString = searchField.text;
+        searchActive = false;
+
+        List<OnlineDatabase.UserName> foundUsers = OnlineDatabase.Instance.GetUsersToInvite(searchField.text);
+        InviteSearchResult[] added = searchResultPanel.GetComponentsInChildren<InviteSearchResult>();
+        foreach (OnlineDatabase.UserName un in foundUsers) {
+            if (Database.Instance.GetSignedInUser().Key.ToString().Equals(un.id)) {
+                continue;
+            }
+            bool skip = false;
+            foreach (InviteSearchResult addedRes in added) {
+                if (addedRes.GetName().Equals(un.username))  {
+                    skip = true;
+                    break;
+                }
+            }
+            if (!skip) {
+                GameObject question = Instantiate(inviteSearchResultPrefab, new Vector2(0, 0), Quaternion.identity) as GameObject;
+                InviteSearchResult res = question.GetComponent<InviteSearchResult>();
+                res.SetName(un.username);
+                res.SetId(un.id);
+                res.transform.SetParent(searchResultPanel.transform, false);
+            }
+        }
+    }
+
+    void HidePanel() {
+
+        OnlineGameSettingsPanel.GetComponentInChildren<invitePanelController>().updateText(InvitedCount());
+        gameObject.SetActive(false);
+        OnlineGameSettingsPanel.SetActive(true);
+    }
+}

+ 41 - 0
Assets/Scripts/NewGameScene/NewOnlineGameScript.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+using UnityEngine.UI;
+
+public class NewOnlineGameScript : MonoBehaviour
+{
+    public Slider answerTimeSlider;
+    public Slider daysToAnswerSlider;
+    public Slider correctsToWinSlider;
+    public GameObject invitePanel;
+
+    [SerializeField] Button StartButton;
+    
+
+    private InvitePanelScript ips;
+    // Start is called before the first frame update
+    void Start()
+    {
+        StartButton.onClick.AddListener(StartNewOnlineGame);
+        StartButton.interactable = false;
+        ips = invitePanel.GetComponent<InvitePanelScript>();
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        if (ips.AreThereInvites()) {
+            StartButton.interactable = true;
+        } 
+        // TODO, make sure there are enough questions selected in categories
+    }
+
+    void StartNewOnlineGame() {
+        List<InviteSearchResult> inviteUsers = ips.GetSelectedUsersForInvite();
+        OnlineDatabase.Instance.SetupNewOnlineGame((int)correctsToWinSlider.value, (int)daysToAnswerSlider.value, (int)correctsToWinSlider.value, inviteUsers);
+        SceneManager.LoadScene("MainMenu");
+    }
+}

+ 11 - 0
Assets/Scripts/NewGameScene/NewOnlineGameScript.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0b09f5ae81df2c34d81a0bcc7df14d8b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 51 - 50
Assets/Scripts/NewGameScene/StartOnlineGameButton.cs

@@ -1,50 +1,51 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-using UnityEngine.SceneManagement;
-using UnityEngine.UI;
-
-public class StartOnlineGameButton : MonoBehaviour
-{
-    public Slider answerTimeSlider;
-    public Slider daysToAnswerSlider;
-    public Slider correctsToWinSlider;
-    public GameObject invitePanel;
-
-    [SerializeField] Text CategoriesText;
-    [SerializeField] Button CategoriesButton;
-    
-
-    private InvitePanelScript ips;
-    private Button startButton;
-    // Start is called before the first frame update
-    void Start()
-    {
-        startButton = GetComponent<Button>();
-        startButton.onClick.AddListener(StartNewOnlineGame);
-        startButton.interactable = false;
-        ips = invitePanel.GetComponent<InvitePanelScript>();
-
-        CategoriesButton.onClick.AddListener(SelectCategories);
-    }
-
-    private void SelectCategories()
-    {
-        throw new NotImplementedException();
-    }
-
-    // Update is called once per frame
-    void Update()
-    {
-        if (ips.AreThereInvites()) {
-            startButton.interactable = true;
-        } 
-    }
-
-    void StartNewOnlineGame() {
-        List<InviteSearchResult> inviteUsers = ips.GetSelectedUsersForInvite();
-        OnlineDatabase.Instance.SetupNewOnlineGame((int)correctsToWinSlider.value, (int)daysToAnswerSlider.value, (int)correctsToWinSlider.value, inviteUsers);
-        SceneManager.LoadScene("MainMenu");
-    }
-}
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.SceneManagement;
+using UnityEngine.UI;
+
+public class StartOnlineGameButton : MonoBehaviour
+{
+    public Slider answerTimeSlider;
+    public Slider daysToAnswerSlider;
+    public Slider correctsToWinSlider;
+    public GameObject invitePanel;
+
+    [SerializeField] Button CategoriesButton;
+    [SerializeField] GameObject SelectCategoriesPanel;
+    
+
+    private InvitePanelScript ips;
+    private Button startButton;
+    // Start is called before the first frame update
+    void Start()
+    {
+        startButton = GetComponent<Button>();
+        startButton.onClick.AddListener(StartNewOnlineGame);
+        startButton.interactable = false;
+        ips = invitePanel.GetComponent<InvitePanelScript>();
+
+        CategoriesButton.onClick.AddListener(SelectCategories);
+    }
+
+    private void SelectCategories()
+    {
+        SelectCategoriesPanel.gameObject.SetActive(true);
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        if (ips.AreThereInvites()) {
+            startButton.interactable = true;
+        } 
+        // TODO, make sure there are enough questions selected in categories
+    }
+
+    void StartNewOnlineGame() {
+        List<InviteSearchResult> inviteUsers = ips.GetSelectedUsersForInvite();
+        OnlineDatabase.Instance.SetupNewOnlineGame((int)correctsToWinSlider.value, (int)daysToAnswerSlider.value, (int)correctsToWinSlider.value, inviteUsers);
+        SceneManager.LoadScene("MainMenu");
+    }
+}

+ 1 - 1
Assets/Scripts/NewGameScene/StartOnlineGameButton.cs.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 0b09f5ae81df2c34d81a0bcc7df14d8b
+guid: 7039be546e1ee194eab83b1576d51041
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2

+ 28 - 29
Assets/Scripts/NewGameScene/invitedPlayersTextScript.cs → Assets/Scripts/NewGameScene/invitePanelController.cs

@@ -1,29 +1,28 @@
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-using UnityEngine.UI;
-
-public class invitedPlayersTextScript : MonoBehaviour {
-    public Button inviteButton;
-    public GameObject InvitePanel;
-    private Text invitedPlayersText;
-    // Start is called before the first frame update
-    void Start() {
-        inviteButton.onClick.AddListener(OpenInvitePlayersDialog);
-        invitedPlayersText = GetComponent<Text>();
-        invitedPlayersText.text = 1 + " " + LocalizationManager.Instance.GetText("INVITED_PLAYERS_TEXT");
-    }
-
-    // Update is called once per frame
-    void Update() {
-
-    }
-
-    public void updateText(int count) {
-        invitedPlayersText.text = count + " " + LocalizationManager.Instance.GetText("INVITED_PLAYERS_TEXT");
-    }
-
-    void OpenInvitePlayersDialog() {
-        InvitePanel.SetActive(true);
-    }
-}
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class invitePanelController : MonoBehaviour {
+    public Button inviteButton;
+    public GameObject InvitePanel;
+    [SerializeField] Text invitedPlayersText;
+    // Start is called before the first frame update
+    void Start() {
+        inviteButton.onClick.AddListener(OpenInvitePlayersDialog);
+        invitedPlayersText.text = 1 + " " + LocalizationManager.Instance.GetText("INVITED_PLAYERS_TEXT");
+    }
+
+    // Update is called once per frame
+    void Update() {
+
+    }
+
+    public void updateText(int count) {
+        invitedPlayersText.text = count + " " + LocalizationManager.Instance.GetText("INVITED_PLAYERS_TEXT");
+    }
+
+    void OpenInvitePlayersDialog() {
+        InvitePanel.SetActive(true);
+    }
+}

+ 0 - 0
Assets/Scripts/NewGameScene/invitedPlayersTextScript.cs.meta → Assets/Scripts/NewGameScene/invitePanelController.cs.meta


+ 46 - 0
Assets/SelectCategoryScript.cs

@@ -0,0 +1,46 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class SelectCategoryScript : MonoBehaviour
+{
+
+    [SerializeField] Button doneButton;
+    [SerializeField] Button closeButton;
+    [SerializeField] GameObject CategoryToSelectPrefab;
+    // Start is called before the first frame update
+
+    private List<CategoryPanel.Category> categories;
+    private void Start() {
+        doneButton.onClick.AddListener(CloseDialogAction);
+        closeButton.onClick.AddListener(CloseDialogAction);
+
+        if (categories == null) {
+            categories = new List<CategoryPanel.Category>();
+        }
+
+        categories = OnlineDatabase.Instance.GetCategories(categories);
+
+        foreach (CategoryPanel.Category cat in categories)
+        {
+            GameObject go = Instantiate(CategoryToSelectPrefab, Vector3.zero, Quaternion.identity);
+            CategorySelection c = go.GetComponent<CategorySelection>();
+        }
+    }
+
+    internal void CloseDialogAction() {
+        gameObject.SetActive(false);
+    }
+
+    internal int GetSelectedCategoriesQuestionCount()
+    {
+        return 0;
+    }
+
+    internal void ShowDialog()
+    {
+        gameObject.SetActive(true);
+    }
+}

+ 11 - 0
Assets/SelectCategoryScript.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0b5cf238b4a276b48b11e79bc721272b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 103 - 97
Assets/Translations/ENGLISH.xml

@@ -1,98 +1,104 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Language LANG="english" ID="1">
-  <!-- Main Menu -->
-  <text key="YES">Yes</text>
-  <text key="NO">No</text>
-  <text key="OK">Ok</text>
-  <text key="BEFORE">before</text>
-  <text key="AFTER">after</text>
-  <text key="LOGIN">Login</text>
-  <text key="USERNAME"> * Username</text>
-  <text key="PASSWORD">* Password</text>
-  <text key="REGISTER">Register</text>
-  <text key="EMAIL">Email</text>
-  <text key="LOGOUT">Logout</text>
-  <text key="QUIT">Quit</text>
-  <text key="START_NEW_GAME">Start New Game</text>
-  <text key="BACK">Back</text>
-  <text key="ONLINE_GAME">Online game</text>
-  <text key="ONLINE_GAMES">Online games</text>
-  <text key="LOCAL_GAME">Local game</text>
-  <text key="LOCAL_GAMES">Local games</text>
-  <text key="SETTINGS_LOCAL_GAME">Settgings local game</text>
-  <text key="TIME_TO_ANSWER">Seconds to answer question</text>
-  <text key="TIME_TO_ANSWER_PLACEHOLDER">20 seconds</text>
-  <text key="NUM_ANSWERS_TO_WIN">Number of correct answers to win</text>
-  <text key="PLAYERS">Players</text>
-  <text key="START_GAME">Start game</text>
-  <text key="SETTINGS_ONLINE_GAME">Settgings online game</text>
-  <text key="TIME_TO_START_ROUND">Days to start next round</text>
-  <text key="TIME_TO_START_ROUND_PLACEHOLDER">3 days</text>
-  <text key="INVITE_PLAYERS">Invite players</text>
-  <text key="FINISHED_GAMES">Finished games</text>
-  <text key="NEEDED_TO_WIN">Needed to win</text>
-  <text key="NUMBER_OF_PLAYERS">Number of players</text>
-  <text key="ROUND">Round</text>
-  <text key="TITLE">When Now Then</text>
-  <text key="CATEGORIES">Categories</text>
-  <text key="REMOVE_GAME_TITLE_KEY">Remove game</text>
-  <text key="REMOVE_GAME_MESSAGE_KEY">Are you sure that you want to remove this game?</text>
-  <text key="PLAYER_SETTING_TEXT">Player {0} name</text>
-  <text key="PLAYER_TEXT">Player</text>
-  <text key="PLAYERS_TEXT">Players</text>
-  <text key="NAME">Name</text>
-  <text key="NEW_QUESTION">New question</text>
-  <text key="START_ROUND_TEXT">Start round</text>
-  <text key="QUESTIONS_LOST">Questions lost</text>
-  <text key="ARE_YOU_SURE_TITLE">Are you sure?</text>
-  <text key="DROPPED_QUESTION_DIALOG_MESSAGE_TEXT">Is your answer that '{0}' happened {1}?</text>
-  <text key="NEXT_QUESTION_CATEGORY">Next question category</text>
-  <text key="NEXT_PLAYER">Lock questions \\nNext player</text>
-  <text key="DROPPED_QUESTION_WRONG_ANSWER_TITLE">Sorry, wrong answer. The correct answer was {0}</text>
-  <text key="WINNER_DIALOG_TITLE">You won!</text>
-  <text key="WINNER_DIALOG_BUTTON">YEAY</text>
-  <text key="WINNER_DIALOG_MESSAGE">You reached the goal of {0} first, you lost {1} questions from your answer to unlocked questions. It took {2} rounds</text>
-  <text key="TIMER_DIALOG_TITLE">Time ran out!</text>
-  <text key="TIMER_DIALOG_MESSAGE">The time ran out and you lost {0} unlocked questions</text>
-  <text key="NEXT_PLAYER_DIALOG_TITLE">Time for next player</text>
-  <text key="NEXT_PLAYER_DIALOG_MESSAGE">Time for player {0}</text>
-  <text key="INVITE_DIALOG_TITLE">Invite players</text>
-  <text key="INVITE_DIALOG_SEARCH_BUTTON">Search...</text>
-  <text key="INVITE_DIALOG_SEARCH_FIELD_PLACEHOLDER">Search players</text>
-  <text key="INVITE_DIALOG_NAME_DIALOG_TEXT">Playername</text>
-  <text key="INVITE_DIALOG_INVITE_TEXT">Invite</text>
-  <text key="INVITE_PANEL_DIALOG_BUTTON">Done</text>
-  <text key="INVITE_COUNT_TEXT">Invite {0} players</text>
-  <text key="INVITED_PLAYERS_TEXT">players invited</text>
-  <text key="NEED_MORE_INPUT">More input needed</text>
-  <text key="REGISTER_ERROR_USERNAME_EMPTY">Username is obligatory and needs to be atleast 3 characters long</text>
-  <text key="REGISTER_ERROR_PASSWORD_EMPTY">Password is obligatory and needs to be atleast 6 characters long</text>
-  <text key="REGISTER_ERROR_PASSWORD_TO_SHORT">Password needs to be atleast 6 characters long</text>
-  <text key="REGISTER_ERROR_EMAIL_EMPTY">Email is obligatory</text>
-  <text key="REGISTER_ERROR_CONNECTION_FAIL">There was an error registering this user, try again later</text>
-  <text key="REGISTER_ERROR_USER_PASS_ALREADY_IN_USE">Failed to register, username/email already exists</text>
-  <text key="LOGIN_WRONG_USERNAME_PASSWORD">Wrong username/password</text>
-  <text key="LOGIN_USER_NOT_FOUND">Username not found</text>
-  <text key="KEEP_SIGNED_IN_TEXT">Keep me signed in</text>
-  <text key="ONLINE_GAME_STATUS_TITLE_VALUE_PENDING">Pending answers</text>
-  <text key="ONLINE_GAME_STATUS_TITLE">Status</text>
-  <text key="ONLINE_GAME_STATUS_TITLE_ACTIVE">Active Game</text>
-  <text key="ONLINE_GAME_STATUS_TITLE_DECLINED">Declined game</text>
-  <text key="ONLINE_GAME_STATUS_TITLE_INVITED">Invited to play</text>
-  <text key="ONLINE_GAME_STATUS_PENDING">Waiting for other player</text>
-  <text key="ONLINE_GAME_STATUS_YOUR_TURN">Your turn</text>
-  <text key="ONLINE_GAME_STATUS_ANOTHER_PLAYER">{0}s turn</text>
-  <text key="ONLINE_GAME_STATUS_DECLINED">Game invite declined</text>
-  <text key="ONLINE_GAME_STATUS_INVITED">You are invited</text>
-  <text key="ONLINE_GAME_STATUS_ACTIVE">{0}s turn</text>
-  <text key="ONLINE_PLAYER_STATUS_WAITING">Waiting for answer</text>
-  <text key="ONLINE_PLAYER_STATUS_ACCEPTED">Accepted</text>
-  <text key="ONLINE_PLAYER_STATUS_DECLINED">Denied</text>
-  <text key="LOCK_QUESTIONS">Lock questions</text>
-  <text key="FCM_NEXT_PLAYER_TITLE">It's your turn</text>
-  <text key="FCM_NEXT_PLAYER_MESSAGE">It is your turn to play in the match against {0}</text>
-  <text key="NOT_YOUR_TURN">It's not your turn</text>
-  <text key="FCM_NEW_GAME_MESSAGE">You have been invited to a new game with {0}</text>
-  <text key="FCM_NEW_GAME_TITLE">Want to play a game?</text>
-  
+<?xml version="1.0" encoding="utf-8"?>
+<Language LANG="english" ID="1">
+  <!-- Main Menu -->
+  <text key="YES">Yes</text>
+  <text key="NO">No</text>
+  <text key="OK">Ok</text>
+  <text key="BEFORE">before</text>
+  <text key="AFTER">after</text>
+  <text key="LOGIN">Login</text>
+  <text key="USERNAME"> * Username</text>
+  <text key="PASSWORD">* Password</text>
+  <text key="REGISTER">Register</text>
+  <text key="EMAIL">Email</text>
+  <text key="LOGOUT">Logout</text>
+  <text key="QUIT">Quit</text>
+  <text key="START_NEW_GAME">Start New Game</text>
+  <text key="BACK">Back</text>
+  <text key="ONLINE_GAME">Online game</text>
+  <text key="ONLINE_GAMES">Online games</text>
+  <text key="LOCAL_GAME">Local game</text>
+  <text key="LOCAL_GAMES">Local games</text>
+  <text key="SETTINGS_LOCAL_GAME">Settgings local game</text>
+  <text key="TIME_TO_ANSWER">Seconds to answer question</text>
+  <text key="TIME_TO_ANSWER_PLACEHOLDER">20 seconds</text>
+  <text key="NUM_ANSWERS_TO_WIN">Number of correct answers to win</text>
+  <text key="PLAYERS">Players</text>
+  <text key="START_GAME">Start game</text>
+  <text key="SETTINGS_ONLINE_GAME">Settgings online game</text>
+  <text key="TIME_TO_START_ROUND">Days to start next round</text>
+  <text key="TIME_TO_START_ROUND_PLACEHOLDER">3 days</text>
+  <text key="INVITE_PLAYERS">Invite players</text>
+  <text key="FINISHED_GAMES">Finished games</text>
+  <text key="NEEDED_TO_WIN">Needed to win</text>
+  <text key="NUMBER_OF_PLAYERS">Number of players</text>
+  <text key="ROUND">Round</text>
+  <text key="TITLE">When Now Then</text>
+  <text key="CATEGORIES">Categories</text>
+  <text key="REMOVE_GAME_TITLE_KEY">Remove game</text>
+  <text key="REMOVE_GAME_MESSAGE_KEY">Are you sure that you want to remove this game?</text>
+  <text key="PLAYER_SETTING_TEXT">Player {0} name</text>
+  <text key="PLAYER_TEXT">Player</text>
+  <text key="PLAYERS_TEXT">Players</text>
+  <text key="NAME">Name</text>
+  <text key="NEW_QUESTION">New question</text>
+  <text key="START_ROUND_TEXT">Start round</text>
+  <text key="QUESTIONS_LOST">Questions lost</text>
+  <text key="ARE_YOU_SURE_TITLE">Are you sure?</text>
+  <text key="DROPPED_QUESTION_DIALOG_MESSAGE_TEXT">Is your answer that '{0}' happened {1}?</text>
+  <text key="NEXT_QUESTION_CATEGORY">Next question category</text>
+  <text key="NEXT_PLAYER">Lock questions \\nNext player</text>
+  <text key="DROPPED_QUESTION_WRONG_ANSWER_TITLE">Sorry, wrong answer. The correct answer was {0}</text>
+  <text key="WINNER_DIALOG_TITLE">You won!</text>
+  <text key="WINNER_DIALOG_BUTTON">YEAY</text>
+  <text key="WINNER_DIALOG_MESSAGE">You reached the goal of {0} first, you lost {1} questions from your answer to unlocked questions. It took {2} rounds</text>
+  <text key="TIMER_DIALOG_TITLE">Time ran out!</text>
+  <text key="TIMER_DIALOG_MESSAGE">The time ran out and you lost {0} unlocked questions</text>
+  <text key="NEXT_PLAYER_DIALOG_TITLE">Time for next player</text>
+  <text key="NEXT_PLAYER_DIALOG_MESSAGE">Time for player {0}</text>
+  <text key="INVITE_DIALOG_TITLE">Invite players</text>
+  <text key="INVITE_DIALOG_SEARCH_BUTTON">Search...</text>
+  <text key="INVITE_DIALOG_SEARCH_FIELD_PLACEHOLDER">Search players</text>
+  <text key="INVITE_DIALOG_NAME_DIALOG_TEXT">Playername</text>
+  <text key="INVITE_DIALOG_INVITE_TEXT">Invite</text>
+  <text key="INVITE_PANEL_DIALOG_BUTTON">Done</text>
+  <text key="INVITE_COUNT_TEXT">Invite {0} players</text>
+  <text key="INVITED_PLAYERS_TEXT">players invited</text>
+  <text key="NEED_MORE_INPUT">More input needed</text>
+  <text key="REGISTER_ERROR_USERNAME_EMPTY">Username is obligatory and needs to be atleast 3 characters long</text>
+  <text key="REGISTER_ERROR_PASSWORD_EMPTY">Password is obligatory and needs to be atleast 6 characters long</text>
+  <text key="REGISTER_ERROR_PASSWORD_TO_SHORT">Password needs to be atleast 6 characters long</text>
+  <text key="REGISTER_ERROR_EMAIL_EMPTY">Email is obligatory</text>
+  <text key="REGISTER_ERROR_CONNECTION_FAIL">There was an error registering this user, try again later</text>
+  <text key="REGISTER_ERROR_USER_PASS_ALREADY_IN_USE">Failed to register, username/email already exists</text>
+  <text key="LOGIN_WRONG_USERNAME_PASSWORD">Wrong username/password</text>
+  <text key="LOGIN_USER_NOT_FOUND">Username not found</text>
+  <text key="KEEP_SIGNED_IN_TEXT">Keep me signed in</text>
+  <text key="ONLINE_GAME_STATUS_TITLE_VALUE_PENDING">Pending answers</text>
+  <text key="ONLINE_GAME_STATUS_TITLE">Status</text>
+  <text key="ONLINE_GAME_STATUS_TITLE_ACTIVE">Active Game</text>
+  <text key="ONLINE_GAME_STATUS_TITLE_DECLINED">Declined game</text>
+  <text key="ONLINE_GAME_STATUS_TITLE_INVITED">Invited to play</text>
+  <text key="ONLINE_GAME_STATUS_PENDING">Waiting for other player</text>
+  <text key="ONLINE_GAME_STATUS_YOUR_TURN">Your turn</text>
+  <text key="ONLINE_GAME_STATUS_ANOTHER_PLAYER">{0}s turn</text>
+  <text key="ONLINE_GAME_STATUS_DECLINED">Game invite declined</text>
+  <text key="ONLINE_GAME_STATUS_INVITED">You are invited</text>
+  <text key="ONLINE_GAME_STATUS_ACTIVE">{0}s turn</text>
+  <text key="ONLINE_PLAYER_STATUS_WAITING">Waiting for answer</text>
+  <text key="ONLINE_PLAYER_STATUS_ACCEPTED">Accepted</text>
+  <text key="ONLINE_PLAYER_STATUS_DECLINED">Denied</text>
+  <text key="LOCK_QUESTIONS">Lock questions</text>
+  <text key="FCM_NEXT_PLAYER_TITLE">It's your turn</text>
+  <text key="FCM_NEXT_PLAYER_MESSAGE">It is your turn to play in the match against {0}</text>
+  <text key="NOT_YOUR_TURN">It's not your turn</text>
+  <text key="FCM_NEW_GAME_MESSAGE">You have been invited to a new game with {0}</text>
+  <text key="FCM_NEW_GAME_TITLE">Want to play a game?</text>
+  <text key="SELECT_CATEGORIES_TEXT">{0} categories chosen</text>
+  <text key="SELECT_CATEGORIES_BUTTON">Select categories</text>
+  <text key="SELECT_CATEGORIES_DIALOG_TITLE">Select categories to play with</text>
+  <text key="SELECT_CATEGORY_DIALOG_TEXT">Categoryname</text>
+  <text key="SELECT_CATEGORY_DIALOG_SELECTED_TEXT">Selected</text>
+  
+  
 </Language>

+ 102 - 97
Assets/Translations/SWEDISH.xml

@@ -1,98 +1,103 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Language LANG="swedish" ID="0">
-  <!-- Main Menu -->
-  <text key="YES">Ja</text>
-  <text key="NO">Nej</text>
-  <text key="OK">Ok</text>
-  <text key="BEFORE">före</text>
-  <text key="AFTER">efter</text>
-  <text key="LOGIN">Logga in</text>
-  <text key="USERNAME">* Användarnamn</text>
-  <text key="PASSWORD">* Lösenord</text>
-  <text key="REGISTER">Registrera användare</text>
-  <text key="EMAIL">Epost</text>
-  <text key="LOGOUT">Logga ut</text>
-  <text key="QUIT">Avsluta</text>
-  <text key="START_NEW_GAME">Starta nytt spel</text>
-  <text key="BACK">Tillbaka</text>
-  <text key="ONLINE_GAME">Online</text>
-  <text key="ONLINE_GAMES">Online spel</text>
-  <text key="LOCAL_GAME">Lokalt</text>
-  <text key="LOCAL_GAMES">Lokala spel</text>
-  <text key="SETTINGS_LOCAL_GAME">Inställningar lokalt spel</text>
-  <text key="TIME_TO_ANSWER">Sekunder att svara</text>
-  <text key="TIME_TO_ANSWER_PLACEHOLDER">20 sekunder</text>
-  <text key="NUM_ANSWERS_TO_WIN">Antal korrekta svar för att vinna</text>
-  <text key="PLAYERS">Spelare</text>
-  <text key="START_GAME">Starta spel</text>
-  <text key="SETTINGS_ONLINE_GAME">Inställningar online spel</text>
-  <text key="TIME_TO_START_ROUND">Dagar att starta nästa runda</text>
-  <text key="TIME_TO_START_ROUND_PLACEHOLDER">3 dagar</text>
-  <text key="INVITE_PLAYERS">Bjud in spelare</text>
-  <text key="FINISHED_GAMES">Avslutade spel</text>
-  <text key="NEEDED_TO_WIN">För att vinna</text>
-  <text key="NUMBER_OF_PLAYERS">Antal spelare</text>
-  <text key="ROUND">Runda</text>
-  <text key="TITLE">När Kampen</text>
-  <text key="CATEGORIES">Kategorier</text>
-  <text key="REMOVE_GAME_TITLE_KEY">Ta bort spel</text>
-  <text key="REMOVE_GAME_MESSAGE_KEY">Är du säker på att du vill ta bort denna omgång?</text>
-  <text key="PLAYER_SETTING_TEXT">Namn spelare {0}</text>
-  <text key="PLAYER_TEXT">Spelare</text>
-  <text key="PLAYERS_TEXT">Spelare</text>
-  <text key="NAME">Namn</text>
-  <text key="NEW_QUESTION">Ny fråga</text>
-  <text key="START_ROUND_TEXT">Starta omgång</text>
-  <text key="QUESTIONS_LOST">Förlorade frågor</text>
-  <text key="ARE_YOU_SURE_TITLE">Är du säker?</text>
-  <text key="DROPPED_QUESTION_DIALOG_MESSAGE_TEXT">Vill du svara att '{0}' hände {1}?</text>
-  <text key="NEXT_QUESTION_CATEGORY">Nästa kategori</text>
-  <text key="NEXT_PLAYER">Lås frågor \\nNästa spelare</text>
-  <text key="DROPPED_QUESTION_WRONG_ANSWER_TITLE">Tyvärr fel svar, korrekt svar var {0}</text>
-  <text key="DROPPED_QUESTION_WRONG_ANSWER_MESSAGE">Du förlorade {0}, bättre lycka nästa gång!</text>
-  <text key="WINNER_DIALOG_TITLE">Du vann!</text>
-  <text key="WINNER_DIALOG_BUTTON">YEAY</text>
-  <text key="WINNER_DIALOG_MESSAGE">Du nådde målet på {0} frågor först, du förlorade {1} frågor vid felsvar. Det tog {2} rundor</text>
-  <text key="TIMER_DIALOG_TITLE">Tiden tog slut!</text>
-  <text key="TIMER_DIALOG_MESSAGE">Tiden tog slut och du förlorade {0} frågor</text>
-  <text key="NEXT_PLAYER_DIALOG_TITLE">Nästa spelare</text>
-  <text key="NEXT_PLAYER_DIALOG_MESSAGE">Dags för spelare {0}</text>
-  <text key="INVITE_DIALOG_TITLE">Bjud in spelare</text>
-  <text key="INVITE_DIALOG_SEARCH_BUTTON">Sök...</text>
-  <text key="INVITE_DIALOG_SEARCH_FIELD_PLACEHOLDER">Sök spelare</text>
-  <text key="INVITE_DIALOG_NAME_DIALOG_TEXT">Spelarnamn</text>
-  <text key="INVITE_DIALOG_INVITE_TEXT">Bjud in</text>
-  <text key="INVITE_PANEL_DIALOG_BUTTON">Färdig</text>
-  <text key="INVITE_COUNT_TEXT">Bjud in {0} spelare</text>
-  <text key="INVITED_PLAYERS_TEXT">spelare inbjudna</text>
-  <text key="NEED_MORE_INPUT">Skriv in fler tecken</text>
-  <text key="REGISTER_ERROR_USERNAME_EMPTY">Användarnamn är obligatoriskt, minst 3 tecken långt</text>
-  <text key="REGISTER_ERROR_PASSWORD_EMPTY">Lösenord är obligatoriskt, minst 6 tecken långt</text>
-  <text key="REGISTER_ERROR_PASSWORD_TO_SHORT">Lösenordet måste vara minst 6 tecken långt</text>
-  <text key="REGISTER_ERROR_EMAIL_EMPTY">Email är obligatoriskt</text>
-  <text key="REGISTER_ERROR_CONNECTION_FAIL">Något gick fel vid registrering, försök igen eller kontakta support</text>
-  <text key="REGISTER_ERROR_USER_PASS_ALREADY_IN_USE">Användarnamn eller epost finns redan registrerat</text>
-  <text key="LOGIN_WRONG_USERNAME_PASSWORD">Felaktigt användarnamn/lösenord</text>
-  <text key="LOGIN_USER_NOT_FOUND">Användaren hittades inte</text>
-  <text key="KEEP_SIGNED_IN_TEXT">Håll mig inloggad</text>
-  <text key="ONLINE_GAME_STATUS_TITLE_VALUE_PENDING">Väntar svar</text>
-  <text key="ONLINE_GAME_STATUS_TITLE">Status</text>
-  <text key="ONLINE_GAME_STATUS_TITLE_ACTIVE">Spelet igång</text>
-  <text key="ONLINE_GAME_STATUS_TITLE_DECLINED">Spelet nekat</text>
-  <text key="ONLINE_GAME_STATUS_TITLE_INVITED">Inbjuden till spel</text>
-  <text key="ONLINE_GAME_STATUS_PENDING">Väntar på andra spelare</text>
-  <text key="ONLINE_GAME_STATUS_YOUR_TURN">Din tur</text>
-  <text key="ONLINE_GAME_STATUS_ANOTHER_PLAYER">{0}s tur</text>
-  <text key="ONLINE_GAME_STATUS_DECLINED">Spelet nekat</text>
-  <text key="ONLINE_GAME_STATUS_INVITED">Du är inbjuden</text>
-  <text key="ONLINE_GAME_STATUS_ACTIVE">{0}s tur</text>
-  <text key="ONLINE_PLAYER_STATUS_WAITING">Väntar på svar</text>
-  <text key="ONLINE_PLAYER_STATUS_ACCEPTED">Accepterad</text>
-  <text key="ONLINE_PLAYER_STATUS_DECLINED">Nekat</text>
-  <text key="LOCK_QUESTIONS">Lås frågor</text>
-  <text key="FCM_NEXT_PLAYER_TITLE">Det är din tur</text>
-  <text key="FCM_NEXT_PLAYER_MESSAGE">Det är din tur i matchen mot {0}</text>
-  <text key="NOT_YOUR_TURN">Det är inte din tur</text>
-  <text key="FCM_NEW_GAME_MESSAGE">Du är inbjuden till ett nytt spel mot {0}</text>
-  <text key="FCM_NEW_GAME_TITLE">Vill du spela?</text>
+<?xml version="1.0" encoding="utf-8"?>
+<Language LANG="swedish" ID="0">
+  <!-- Main Menu -->
+  <text key="YES">Ja</text>
+  <text key="NO">Nej</text>
+  <text key="OK">Ok</text>
+  <text key="BEFORE">före</text>
+  <text key="AFTER">efter</text>
+  <text key="LOGIN">Logga in</text>
+  <text key="USERNAME">* Användarnamn</text>
+  <text key="PASSWORD">* Lösenord</text>
+  <text key="REGISTER">Registrera användare</text>
+  <text key="EMAIL">Epost</text>
+  <text key="LOGOUT">Logga ut</text>
+  <text key="QUIT">Avsluta</text>
+  <text key="START_NEW_GAME">Starta nytt spel</text>
+  <text key="BACK">Tillbaka</text>
+  <text key="ONLINE_GAME">Online</text>
+  <text key="ONLINE_GAMES">Online spel</text>
+  <text key="LOCAL_GAME">Lokalt</text>
+  <text key="LOCAL_GAMES">Lokala spel</text>
+  <text key="SETTINGS_LOCAL_GAME">Inställningar lokalt spel</text>
+  <text key="TIME_TO_ANSWER">Sekunder att svara</text>
+  <text key="TIME_TO_ANSWER_PLACEHOLDER">20 sekunder</text>
+  <text key="NUM_ANSWERS_TO_WIN">Antal korrekta svar för att vinna</text>
+  <text key="PLAYERS">Spelare</text>
+  <text key="START_GAME">Starta spel</text>
+  <text key="SETTINGS_ONLINE_GAME">Inställningar online spel</text>
+  <text key="TIME_TO_START_ROUND">Dagar att starta nästa runda</text>
+  <text key="TIME_TO_START_ROUND_PLACEHOLDER">3 dagar</text>
+  <text key="INVITE_PLAYERS">Bjud in spelare</text>
+  <text key="FINISHED_GAMES">Avslutade spel</text>
+  <text key="NEEDED_TO_WIN">För att vinna</text>
+  <text key="NUMBER_OF_PLAYERS">Antal spelare</text>
+  <text key="ROUND">Runda</text>
+  <text key="TITLE">När Kampen</text>
+  <text key="CATEGORIES">Kategorier</text>
+  <text key="REMOVE_GAME_TITLE_KEY">Ta bort spel</text>
+  <text key="REMOVE_GAME_MESSAGE_KEY">Är du säker på att du vill ta bort denna omgång?</text>
+  <text key="PLAYER_SETTING_TEXT">Namn spelare {0}</text>
+  <text key="PLAYER_TEXT">Spelare</text>
+  <text key="PLAYERS_TEXT">Spelare</text>
+  <text key="NAME">Namn</text>
+  <text key="NEW_QUESTION">Ny fråga</text>
+  <text key="START_ROUND_TEXT">Starta omgång</text>
+  <text key="QUESTIONS_LOST">Förlorade frågor</text>
+  <text key="ARE_YOU_SURE_TITLE">Är du säker?</text>
+  <text key="DROPPED_QUESTION_DIALOG_MESSAGE_TEXT">Vill du svara att '{0}' hände {1}?</text>
+  <text key="NEXT_QUESTION_CATEGORY">Nästa kategori</text>
+  <text key="NEXT_PLAYER">Lås frågor \\nNästa spelare</text>
+  <text key="DROPPED_QUESTION_WRONG_ANSWER_TITLE">Tyvärr fel svar, korrekt svar var {0}</text>
+  <text key="DROPPED_QUESTION_WRONG_ANSWER_MESSAGE">Du förlorade {0}, bättre lycka nästa gång!</text>
+  <text key="WINNER_DIALOG_TITLE">Du vann!</text>
+  <text key="WINNER_DIALOG_BUTTON">YEAY</text>
+  <text key="WINNER_DIALOG_MESSAGE">Du nådde målet på {0} frågor först, du förlorade {1} frågor vid felsvar. Det tog {2} rundor</text>
+  <text key="TIMER_DIALOG_TITLE">Tiden tog slut!</text>
+  <text key="TIMER_DIALOG_MESSAGE">Tiden tog slut och du förlorade {0} frågor</text>
+  <text key="NEXT_PLAYER_DIALOG_TITLE">Nästa spelare</text>
+  <text key="NEXT_PLAYER_DIALOG_MESSAGE">Dags för spelare {0}</text>
+  <text key="INVITE_DIALOG_TITLE">Bjud in spelare</text>
+  <text key="INVITE_DIALOG_SEARCH_BUTTON">Sök...</text>
+  <text key="INVITE_DIALOG_SEARCH_FIELD_PLACEHOLDER">Sök spelare</text>
+  <text key="INVITE_DIALOG_NAME_DIALOG_TEXT">Spelarnamn</text>
+  <text key="INVITE_DIALOG_INVITE_TEXT">Bjud in</text>
+  <text key="INVITE_PANEL_DIALOG_BUTTON">Färdig</text>
+  <text key="INVITE_COUNT_TEXT">Bjud in {0} spelare</text>
+  <text key="INVITED_PLAYERS_TEXT">spelare inbjudna</text>
+  <text key="NEED_MORE_INPUT">Skriv in fler tecken</text>
+  <text key="REGISTER_ERROR_USERNAME_EMPTY">Användarnamn är obligatoriskt, minst 3 tecken långt</text>
+  <text key="REGISTER_ERROR_PASSWORD_EMPTY">Lösenord är obligatoriskt, minst 6 tecken långt</text>
+  <text key="REGISTER_ERROR_PASSWORD_TO_SHORT">Lösenordet måste vara minst 6 tecken långt</text>
+  <text key="REGISTER_ERROR_EMAIL_EMPTY">Email är obligatoriskt</text>
+  <text key="REGISTER_ERROR_CONNECTION_FAIL">Något gick fel vid registrering, försök igen eller kontakta support</text>
+  <text key="REGISTER_ERROR_USER_PASS_ALREADY_IN_USE">Användarnamn eller epost finns redan registrerat</text>
+  <text key="LOGIN_WRONG_USERNAME_PASSWORD">Felaktigt användarnamn/lösenord</text>
+  <text key="LOGIN_USER_NOT_FOUND">Användaren hittades inte</text>
+  <text key="KEEP_SIGNED_IN_TEXT">Håll mig inloggad</text>
+  <text key="ONLINE_GAME_STATUS_TITLE_VALUE_PENDING">Väntar svar</text>
+  <text key="ONLINE_GAME_STATUS_TITLE">Status</text>
+  <text key="ONLINE_GAME_STATUS_TITLE_ACTIVE">Spelet igång</text>
+  <text key="ONLINE_GAME_STATUS_TITLE_DECLINED">Spelet nekat</text>
+  <text key="ONLINE_GAME_STATUS_TITLE_INVITED">Inbjuden till spel</text>
+  <text key="ONLINE_GAME_STATUS_PENDING">Väntar på andra spelare</text>
+  <text key="ONLINE_GAME_STATUS_YOUR_TURN">Din tur</text>
+  <text key="ONLINE_GAME_STATUS_ANOTHER_PLAYER">{0}s tur</text>
+  <text key="ONLINE_GAME_STATUS_DECLINED">Spelet nekat</text>
+  <text key="ONLINE_GAME_STATUS_INVITED">Du är inbjuden</text>
+  <text key="ONLINE_GAME_STATUS_ACTIVE">{0}s tur</text>
+  <text key="ONLINE_PLAYER_STATUS_WAITING">Väntar på svar</text>
+  <text key="ONLINE_PLAYER_STATUS_ACCEPTED">Accepterad</text>
+  <text key="ONLINE_PLAYER_STATUS_DECLINED">Nekat</text>
+  <text key="LOCK_QUESTIONS">Lås frågor</text>
+  <text key="FCM_NEXT_PLAYER_TITLE">Det är din tur</text>
+  <text key="FCM_NEXT_PLAYER_MESSAGE">Det är din tur i matchen mot {0}</text>
+  <text key="NOT_YOUR_TURN">Det är inte din tur</text>
+  <text key="FCM_NEW_GAME_MESSAGE">Du är inbjuden till ett nytt spel mot {0}</text>
+  <text key="FCM_NEW_GAME_TITLE">Vill du spela?</text>
+  <text key="SELECT_CATEGORIES_BUTTON">Välj kategorier</text>
+  <text key="SELECT_CATEGORIES_TEXT">{0} kategorier valda</text>
+  <text key="SELECT_CATEGORIES_DIALOG_TITLE">Välj kategorier att spela med</text>
+  <text key="SELECT_CATEGORY_DIALOG_TEXT">Kategorinamn</text>
+  <text key="SELECT_CATEGORY_DIALOG_SELECTED_TEXT">Vald</text>
 </Language>

+ 28 - 0
Assets/selectCategoriesPanelController.cs

@@ -0,0 +1,28 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+
+public class selectCategoriesPanelController : MonoBehaviour
+{
+
+    [SerializeField] Button OpenDialogButton; 
+    [SerializeField] GameObject SelectCategoriesDialog;
+    [SerializeField] Text SelectCategoriesText;
+    // Start is called before the first frame update
+    void Start()
+    {
+        OpenDialogButton.onClick.AddListener(ShowDialog);
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        SelectCategoriesDialog.GetComponent<SelectCategoryScript>().GetSelectedCategoriesQuestionCount();
+    }
+
+    internal void ShowDialog() {
+        SelectCategoriesDialog.SetActive(true);
+    }
+}

+ 11 - 0
Assets/selectCategoriesPanelController.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 479a1506ea2bf9d44bffb5e82a05a482
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 7 - 7
ProjectSettings/GvhProjectSettings.xml

@@ -1,8 +1,8 @@
-<projectSettings>
-  <projectSetting name="Google.IOSResolver.VerboseLoggingEnabled" value="False" />
-  <projectSetting name="Google.PackageManagerResolver.VerboseLoggingEnabled" value="False" />
-  <projectSetting name="Google.VersionHandler.VerboseLoggingEnabled" value="False" />
-  <projectSetting name="GooglePlayServices.AutoResolverEnabled" value="False" />
-  <projectSetting name="GooglePlayServices.PromptBeforeAutoResolution" value="False" />
-  <projectSetting name="GooglePlayServices.UseJetifier" value="True" />
+<projectSettings>
+  <projectSetting name="Google.IOSResolver.VerboseLoggingEnabled" value="False" />
+  <projectSetting name="Google.PackageManagerResolver.VerboseLoggingEnabled" value="False" />
+  <projectSetting name="Google.VersionHandler.VerboseLoggingEnabled" value="False" />
+  <projectSetting name="GooglePlayServices.AutoResolverEnabled" value="False" />
+  <projectSetting name="GooglePlayServices.PromptBeforeAutoResolution" value="False" />
+  <projectSetting name="GooglePlayServices.UseJetifier" value="True" />
 </projectSettings>

+ 33 - 32
dbFiles/Categories.php

@@ -1,33 +1,34 @@
-<?php
-/* Games.php */ 
-	$hostname = 'localhost';
-	$username = 'narKampen';
-	$pass = 'IfRLzj2HJBXA9eei';
-	$database = 'narKampen';
-	
-	$conn = new mysqli($hostname, $username, $pass, $database);
-	if (!$conn) {
-		die("Connection Failed. ". mysqli_connect_error());
-	}
-	mysqli_set_charset($conn,'utf8');
-		
-	$sql = "SELECT id, name, r, g, b ,a FROM category";
-	$result = $conn->query($sql);
-	
-	if ($result->num_rows > 0) {
-		$returnArray = array();
-		$i = 0;
-		while ($data = $result->fetch_assoc()) {
-			foreach ($data as $key => $value) {
-				$returnArray[$i][$key] = $value;
-			}
-			$i++;
-		}
-		echo json_encode($returnArray);
-		
-	} else {
-		echo "ERROR - No Categories found";
-	}
-	$conn->close();
-	
+<?php
+/* Games.php */ 
+	$hostname = 'localhost';
+	$username = 'narKampen';
+	$pass = 'IfRLzj2HJBXA9eei';
+	$database = 'narKampen';
+	
+	$conn = new mysqli($hostname, $username, $pass, $database);
+	if (!$conn) {
+		die("Connection Failed. ". mysqli_connect_error());
+	}
+	mysqli_set_charset($conn,'utf8');
+		
+	//$sql = "SELECT id, name, r, g, b ,a FROM category";
+	$sql = "SELECT category.*, count(*) as count FROM questions INNER JOIN questionToCategory ON questions.id = questionToCategory.questionId INNER JOIN category ON questionToCategory.categoryId = category.id GROUP BY category.name"
+	$result = $conn->query($sql);
+	
+	if ($result->num_rows > 0) {
+		$returnArray = array();
+		$i = 0;
+		while ($data = $result->fetch_assoc()) {
+			foreach ($data as $key => $value) {
+				$returnArray[$i][$key] = $value;
+			}
+			$i++;
+		}
+		echo json_encode($returnArray);
+		
+	} else {
+		echo "ERROR - No Categories found";
+	}
+	$conn->close();
+	
 ?>

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä