Axel Nordh 5 лет назад
Родитель
Сommit
c630ebd179
39 измененных файлов с 2036 добавлено и 389 удалено
  1. 30 1
      Assets/Data/google-services.json
  2. 2 0
      Assets/NewDropZoneScript.cs
  3. 2 2
      Assets/Prefab/AnswerlineQuestion.prefab
  4. 7 94
      Assets/Prefab/OnlineGame.prefab
  5. 931 19
      Assets/Scenes/MainMenu.unity
  6. 403 27
      Assets/Scenes/NewGame.unity
  7. 312 17
      Assets/Scenes/User.unity
  8. 3 3
      Assets/Scenes/narKampen.unity
  9. 12 2
      Assets/Scripts/Database/Database.cs
  10. 7 6
      Assets/Scripts/Database/OnlineDatabase.cs
  11. 15 4
      Assets/Scripts/GameManagerScript.cs
  12. 13 6
      Assets/Scripts/Login/Login.cs
  13. 1 1
      Assets/Scripts/Login/Register.cs
  14. 2 6
      Assets/Scripts/MainGame/InformationPanelScript.cs
  15. 8 6
      Assets/Scripts/MainGame/NewQuestionCardController.cs
  16. 18 6
      Assets/Scripts/MainGame/NewQuestionsPanel.cs
  17. 0 79
      Assets/Scripts/MainGame/RoundButtonsScript.cs
  18. 0 11
      Assets/Scripts/MainGame/RoundButtonsScript.cs.meta
  19. 9 17
      Assets/Scripts/MainGame/ScrollViewScript.cs
  20. 27 3
      Assets/Scripts/MainMenu.cs
  21. 11 2
      Assets/Scripts/NewGameScene/GameInfoScript.cs
  22. 9 6
      Assets/Scripts/NewGameScene/GamesScrollController.cs
  23. 15 3
      Assets/Scripts/NewGameScene/OnlineGameScript.cs
  24. 13 1
      Assets/Scripts/NewGameScene/StartOnlineGameButton.cs
  25. 30 1
      Assets/StreamingAssets/google-services-desktop.json
  26. 1 1
      Assets/StreamingAssets/google-services-desktop.json.meta
  27. BIN
      Assets/StreamingAssets/narKampenLocal.db
  28. 5 3
      Assets/Translations/ENGLISH.xml
  29. 5 3
      Assets/Translations/SWEDISH.xml
  30. BIN
      Assets/narKampenLocal.db
  31. BIN
      NarKampenV0.3-11.aab
  32. 1 1
      ProjectSettings/AndroidResolverDependencies.xml
  33. 1 0
      ProjectSettings/GvhProjectSettings.xml
  34. 3 3
      ProjectSettings/ProjectSettings.asset
  35. 10 2
      dbFiles/FCMMessageing.php
  36. 55 49
      dbFiles/NewOnlineGame.php
  37. 3 3
      dbFiles/OnlineGames.php
  38. 70 0
      dbFiles/ReadQuestionsFromFile.php
  39. 2 1
      dbFiles/Register.php

+ 30 - 1
Assets/Data/google-services.json

@@ -6,6 +6,35 @@
     "storage_bucket": "narkampen.appspot.com"
   },
   "client": [
+    {
+      "client_info": {
+        "mobilesdk_app_id": "1:108102546370:android:b897599a5695f2308b9c5b",
+        "android_client_info": {
+          "package_name": "se.axelnordh.narkampen"
+        }
+      },
+      "oauth_client": [
+        {
+          "client_id": "108102546370-2bu9lhiunhhi5v6up5dcuntnucoo5dcf.apps.googleusercontent.com",
+          "client_type": 3
+        }
+      ],
+      "api_key": [
+        {
+          "current_key": "AIzaSyCBQiFiFWvzWMFrTBWtHVagJ5xk-T_ytGw"
+        }
+      ],
+      "services": {
+        "appinvite_service": {
+          "other_platform_oauth_client": [
+            {
+              "client_id": "108102546370-crv9k8j6892fmbchirjuqcoiia1191fm.apps.googleusercontent.com",
+              "client_type": 3
+            }
+          ]
+        }
+      }
+    },
     {
       "client_info": {
         "mobilesdk_app_id": "1:108102546370:android:c379d06ef36a3e568b9c5b",
@@ -36,7 +65,7 @@
         "appinvite_service": {
           "other_platform_oauth_client": [
             {
-              "client_id": "108102546370-2bu9lhiunhhi5v6up5dcuntnucoo5dcf.apps.googleusercontent.com",
+              "client_id": "108102546370-crv9k8j6892fmbchirjuqcoiia1191fm.apps.googleusercontent.com",
               "client_type": 3
             }
           ]

+ 2 - 0
Assets/NewDropZoneScript.cs

@@ -80,8 +80,10 @@ public class NewDropZoneScript : MonoBehaviour, IDropHandler, IPointerEnterHandl
             }
             Destroy(gameObject);
             GameObject.Find("GameManager").GetComponent<GameManagerScript>().StopTimer();
+            // TODO Check win condition, if met show Congratulations and send loss message to others
             draggedQuestion.GetComponentInParent<NewQuestionCardController>().GenerateNewQuestion();
         } else { // Wrong answer
+        // TODO Visa fel svar dialog
             GameObject.Find("GameManager").GetComponent<GameManagerScript>().RemoveUnlockedQuestions();
             GameObject.Find("GameManager").GetComponent<GameManagerScript>().NextRound();
         }

+ 2 - 2
Assets/Prefab/AnswerlineQuestion.prefab

@@ -660,8 +660,8 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 1, y: 1}
-  m_AnchoredPosition: {x: 0.000015258789, y: 17.4}
-  m_SizeDelta: {x: 0, y: 34.848633}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 10, y: 10}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!222 &3555725356691519508
 CanvasRenderer:

+ 7 - 94
Assets/Prefab/OnlineGame.prefab

@@ -1,84 +1,5 @@
 %YAML 1.1
 %TAG !u! tag:unity3d.com,2011:
---- !u!1 &4443270112465168313
-GameObject:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  serializedVersion: 6
-  m_Component:
-  - component: {fileID: 4443270112465168312}
-  - component: {fileID: 4443270112465168293}
-  - component: {fileID: 4443270112465168295}
-  m_Layer: 5
-  m_Name: StatusText
-  m_TagString: Untagged
-  m_Icon: {fileID: 0}
-  m_NavMeshLayer: 0
-  m_StaticEditorFlags: 0
-  m_IsActive: 1
---- !u!224 &4443270112465168312
-RectTransform:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 4443270112465168313}
-  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: 4443270113653808743}
-  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: 0}
-  m_Pivot: {x: 0.5, y: 0.5}
---- !u!222 &4443270112465168293
-CanvasRenderer:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 4443270112465168313}
-  m_CullTransparentMesh: 0
---- !u!114 &4443270112465168295
-MonoBehaviour:
-  m_ObjectHideFlags: 0
-  m_CorrespondingSourceObject: {fileID: 0}
-  m_PrefabInstance: {fileID: 0}
-  m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 4443270112465168313}
-  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_OnCullStateChanged:
-    m_PersistentCalls:
-      m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, Unity.ugui,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
-  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: 0
-    m_AlignByGeometry: 0
-    m_RichText: 1
-    m_HorizontalOverflow: 0
-    m_VerticalOverflow: 0
-    m_LineSpacing: 1
-  m_Text: Status
 --- !u!1 &4443270112486813073
 GameObject:
   m_ObjectHideFlags: 0
@@ -140,11 +61,10 @@ MonoBehaviour:
   m_Material: {fileID: 0}
   m_Color: {r: 1, g: 1, b: 1, a: 0.39215687}
   m_RaycastTarget: 1
+  m_Maskable: 1
   m_OnCullStateChanged:
     m_PersistentCalls:
       m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, Unity.ugui,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
   m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
   m_Type: 1
   m_PreserveAspect: 0
@@ -186,7 +106,7 @@ RectTransform:
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_Children: []
   m_Father: {fileID: 4443270113653808743}
-  m_RootOrder: 1
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 0, y: 0}
@@ -229,11 +149,10 @@ MonoBehaviour:
   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_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, Unity.ugui,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
   m_FontData:
     m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
     m_FontSize: 14
@@ -241,7 +160,7 @@ MonoBehaviour:
     m_BestFit: 1
     m_MinSize: 10
     m_MaxSize: 18
-    m_Alignment: 0
+    m_Alignment: 4
     m_AlignByGeometry: 0
     m_RichText: 1
     m_HorizontalOverflow: 0
@@ -314,11 +233,10 @@ MonoBehaviour:
   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_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, Unity.ugui,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
   m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
   m_Type: 1
   m_PreserveAspect: 0
@@ -412,8 +330,6 @@ MonoBehaviour:
   m_OnClick:
     m_PersistentCalls:
       m_Calls: []
-    m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, Unity.ugui, Version=1.0.0.0,
-      Culture=neutral, PublicKeyToken=null
 --- !u!114 &1023584018781346570
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -501,11 +417,10 @@ MonoBehaviour:
   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_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, Unity.ugui,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
   m_FontData:
     m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
     m_FontSize: 14
@@ -550,7 +465,6 @@ RectTransform:
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_Children:
-  - {fileID: 4443270112465168312}
   - {fileID: 4443270113229645986}
   m_Father: {fileID: 4443270113283690093}
   m_RootOrder: 0
@@ -583,11 +497,10 @@ MonoBehaviour:
   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_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, Unity.ugui,
-      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
   m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0}
   m_Type: 1
   m_PreserveAspect: 0

Разница между файлами не показана из-за своего большого размера
+ 931 - 19
Assets/Scenes/MainMenu.unity


Разница между файлами не показана из-за своего большого размера
+ 403 - 27
Assets/Scenes/NewGame.unity


+ 312 - 17
Assets/Scenes/User.unity

@@ -277,7 +277,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   m_Navigation:
-    m_Mode: 3
+    m_Mode: 0
     m_SelectOnUp: {fileID: 0}
     m_SelectOnDown: {fileID: 0}
     m_SelectOnLeft: {fileID: 0}
@@ -441,7 +441,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   m_Navigation:
-    m_Mode: 2
+    m_Mode: 4
     m_SelectOnUp: {fileID: 2118721990}
     m_SelectOnDown: {fileID: 760699001}
     m_SelectOnLeft: {fileID: 0}
@@ -883,9 +883,9 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   m_Navigation:
-    m_Mode: 2
+    m_Mode: 4
     m_SelectOnUp: {fileID: 1437897727}
-    m_SelectOnDown: {fileID: 1421835109}
+    m_SelectOnDown: {fileID: 286826074}
     m_SelectOnLeft: {fileID: 0}
     m_SelectOnRight: {fileID: 0}
   m_Transition: 1
@@ -1211,9 +1211,9 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   m_Navigation:
-    m_Mode: 3
-    m_SelectOnUp: {fileID: 0}
-    m_SelectOnDown: {fileID: 0}
+    m_Mode: 4
+    m_SelectOnUp: {fileID: 231128498}
+    m_SelectOnDown: {fileID: 1421835109}
     m_SelectOnLeft: {fileID: 0}
     m_SelectOnRight: {fileID: 0}
   m_Transition: 1
@@ -1777,9 +1777,9 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   m_Navigation:
-    m_Mode: 2
-    m_SelectOnUp: {fileID: 0}
-    m_SelectOnDown: {fileID: 0}
+    m_Mode: 4
+    m_SelectOnUp: {fileID: 39834638}
+    m_SelectOnDown: {fileID: 918568527}
     m_SelectOnLeft: {fileID: 0}
     m_SelectOnRight: {fileID: 0}
   m_Transition: 1
@@ -2164,7 +2164,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   m_Navigation:
-    m_Mode: 0
+    m_Mode: 4
     m_SelectOnUp: {fileID: 760699001}
     m_SelectOnDown: {fileID: 0}
     m_SelectOnLeft: {fileID: 0}
@@ -2244,6 +2244,84 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   key: REGISTER
+--- !u!1 &922987120
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 922987121}
+  - component: {fileID: 922987123}
+  - component: {fileID: 922987122}
+  m_Layer: 5
+  m_Name: Text
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &922987121
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 922987120}
+  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: 1846551966}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &922987122
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 922987120}
+  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: 0
+    m_MinSize: 10
+    m_MaxSize: 40
+    m_Alignment: 4
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: Avsluta
+--- !u!222 &922987123
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 922987120}
+  m_CullTransparentMesh: 0
 --- !u!1 &992426361
 GameObject:
   m_ObjectHideFlags: 0
@@ -2336,6 +2414,57 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 992426361}
   m_CullTransparentMesh: 0
+--- !u!1 &1024087803
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1024087805}
+  - component: {fileID: 1024087804}
+  m_Layer: 0
+  m_Name: GameManager
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!114 &1024087804
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1024087803}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1c60aa30e7224b44cadef4fd405f83f9, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  db: {fileID: 0}
+  odb: {fileID: 0}
+  NewQuestionCard: {fileID: 0}
+  AnswerLine: {fileID: 0}
+  AnswerLineQuestionCard: {fileID: 0}
+  DropZonePrefab: {fileID: 0}
+  TimerPanel: {fileID: 0}
+  movementSpeed: 1
+--- !u!4 &1024087805
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1024087803}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 967.44006, y: 639.55316, z: -393.5201}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 0}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
 --- !u!1 &1158075059
 GameObject:
   m_ObjectHideFlags: 0
@@ -2532,6 +2661,7 @@ RectTransform:
   - {fileID: 1197443346}
   - {fileID: 1190930875}
   - {fileID: 27433607}
+  - {fileID: 1846551966}
   m_Father: {fileID: 1551309669}
   m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -2613,8 +2743,8 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: b1757e6c5ffeaf245966f8c7028a436f, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  username: {fileID: 1437897725}
-  password: {fileID: 231128496}
+  usernameInputField: {fileID: 1437897727}
+  passwordInputField: {fileID: 231128498}
   loginButton: {fileID: 1421835109}
   SwedishButton: {fileID: 1190930877}
   EnglishButton: {fileID: 27433609}
@@ -2658,7 +2788,7 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 0, y: 1}
-  m_AnchoredPosition: {x: -0.000030517578, y: 0}
+  m_AnchoredPosition: {x: 0, y: 0}
   m_SizeDelta: {x: 40, y: 40}
   m_Pivot: {x: 0, y: 1}
 --- !u!114 &1190930876
@@ -2694,7 +2824,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   m_Navigation:
-    m_Mode: 3
+    m_Mode: 0
     m_SelectOnUp: {fileID: 0}
     m_SelectOnDown: {fileID: 0}
     m_SelectOnLeft: {fileID: 0}
@@ -3325,7 +3455,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   m_Navigation:
-    m_Mode: 2
+    m_Mode: 4
     m_SelectOnUp: {fileID: 0}
     m_SelectOnDown: {fileID: 231128498}
     m_SelectOnLeft: {fileID: 0}
@@ -3679,6 +3809,171 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1634757285}
   m_CullTransparentMesh: 0
+--- !u!1 &1846551965
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1846551966}
+  - component: {fileID: 1846551970}
+  - component: {fileID: 1846551969}
+  - component: {fileID: 1846551968}
+  - component: {fileID: 1846551971}
+  - component: {fileID: 1846551967}
+  m_Layer: 5
+  m_Name: AvslutaSpelet
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1846551966
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1846551965}
+  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: 922987121}
+  m_Father: {fileID: 1172685348}
+  m_RootOrder: 9
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0}
+  m_AnchorMax: {x: 0.5, y: 0}
+  m_AnchoredPosition: {x: -0.000011444, y: 430}
+  m_SizeDelta: {x: 120, y: 30}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1846551967
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1846551965}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_IgnoreLayout: 1
+  m_MinWidth: -1
+  m_MinHeight: -1
+  m_PreferredWidth: -1
+  m_PreferredHeight: -1
+  m_FlexibleWidth: -1
+  m_FlexibleHeight: -1
+  m_LayoutPriority: 1
+--- !u!114 &1846551968
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1846551965}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 0
+    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: 1846551969}
+  m_OnClick:
+    m_PersistentCalls:
+      m_Calls:
+      - m_Target: {fileID: 1024087804}
+        m_MethodName: QuitApplication
+        m_Mode: 1
+        m_Arguments:
+          m_ObjectArgument: {fileID: 0}
+          m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+          m_IntArgument: 0
+          m_FloatArgument: 0
+          m_StringArgument: 
+          m_BoolArgument: 0
+        m_CallState: 2
+--- !u!114 &1846551969
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1846551965}
+  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!222 &1846551970
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1846551965}
+  m_CullTransparentMesh: 0
+--- !u!114 &1846551971
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1846551965}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 78e7dcec242b8e54db8994e443fcf679, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  key: QUIT
 --- !u!1 &1856687807
 GameObject:
   m_ObjectHideFlags: 0
@@ -4108,7 +4403,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   m_Navigation:
-    m_Mode: 2
+    m_Mode: 4
     m_SelectOnUp: {fileID: 0}
     m_SelectOnDown: {fileID: 39834638}
     m_SelectOnLeft: {fileID: 0}

+ 3 - 3
Assets/Scenes/narKampen.unity

@@ -1955,7 +1955,7 @@ GameObject:
   - component: {fileID: 1052864998}
   - component: {fileID: 1052864997}
   m_Layer: 5
-  m_Name: CurrentPlayer
+  m_Name: LoggedInPlayer
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
@@ -2012,7 +2012,7 @@ MonoBehaviour:
     m_HorizontalOverflow: 0
     m_VerticalOverflow: 0
     m_LineSpacing: 1
-  m_Text: Current Player
+  m_Text: Logged in player
 --- !u!222 &1052864998
 CanvasRenderer:
   m_ObjectHideFlags: 0
@@ -2476,7 +2476,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   quitButton: {fileID: 1848882436}
-  currentPlayerText: {fileID: 1052864997}
+  loggedInPlayerText: {fileID: 1052864997}
   swedishButton: {fileID: 44609805}
   englishButton: {fileID: 456354910}
   logoutButton: {fileID: 0}

+ 12 - 2
Assets/Scripts/Database/Database.cs

@@ -178,7 +178,7 @@ public class Database : MonoBehaviour {
         }
     }
 
-    internal void KeepSignedIn(string username, int userId, bool keepSigendIn) {
+    internal void SignIn(string username, int userId, bool keepSigendIn) {
         int ksi = 0;
         if (keepSigendIn) {
             ksi = 1;
@@ -188,6 +188,11 @@ public class Database : MonoBehaviour {
         cmd.CommandText = sql;
 
         cmd.ExecuteNonQuery();
+
+        sql = "INSERT OR REPLACE INTO settings (name, value) VALUES ('signedInUser', '" + username + "')";
+        cmd.CommandText = sql;
+        cmd.ExecuteNonQuery();
+
         CloseConnection();
     }
 
@@ -205,7 +210,8 @@ public class Database : MonoBehaviour {
     }
 
     internal KeyValuePair<int, string> GetSignedInUser() {
-        string sql = "SELECT userId, username FROM userSettings";
+        // 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;
@@ -225,8 +231,12 @@ public class Database : MonoBehaviour {
         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();
 
 

+ 7 - 6
Assets/Scripts/Database/OnlineDatabase.cs

@@ -139,7 +139,7 @@ public class OnlineDatabase : MonoBehaviour {
         public string currentPlayer;
         public string round;
         public string startDate;
-        public string LastPlayedDate;
+        public string lastPlayedDate;
         public string finishedDate;
         public string status;
         public string playerToAct;
@@ -296,6 +296,7 @@ public class OnlineDatabase : MonoBehaviour {
             ogs.SetRoundTimeLimit(game.roundTimeLimit);
             ogs.SetRound(game.round);
             ogs.StartDate = game.startDate;
+            ogs.LastPlayedDate = game.lastPlayedDate;
 
             games.Add(ogs);
             ogs.PlayerInfos = playerInfos;
@@ -596,20 +597,19 @@ public class OnlineDatabase : MonoBehaviour {
         WWWForm form = new WWWForm();
         form.AddField("gameId", gameId);
         form.AddField("playerName", nextPlayer);
-        form.AddField("title", LocalizationManager.Instance.GetText("FCM_NextPlayerTitle"));
+        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 + ">");
-            
+            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("FCMMessage.php", form);
+        CallDatabase("FCMMessageing.php", form);
     }
 
     internal void SendInviteForNewGame(int gameId, List<String> Players, String inviter) {
@@ -619,9 +619,10 @@ public class OnlineDatabase : MonoBehaviour {
         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("FCMMessage.php", form);
+        CallDatabase("FCMMessageing.php", form);
     }
 
     

+ 15 - 4
Assets/Scripts/GameManagerScript.cs

@@ -47,9 +47,17 @@ public class GameManagerScript : MonoBehaviour {
             odb = OnlineDatabase.Instance;
             odb.SetLastPlayedDate(GameId);
         }
-        statsScript = GameObject.Find("StatsPanel").GetComponent<StatsScript>();
+        GameObject statsPanelObject = GameObject.Find("StatsPanel");
+        if (statsPanelObject != null) {
+            statsScript = statsPanelObject.GetComponent<StatsScript>();
+        }
 
-        scrollViewScript = GameObject.FindGameObjectWithTag("AnswerLine").transform.parent.parent.GetComponent<ScrollViewScript>();
+        GameObject answerLineObject = GameObject.FindGameObjectWithTag("AnswerLine");
+        
+        if (answerLineObject != null) {
+            scrollViewScript = answerLineObject.transform.parent.parent.GetComponent<ScrollViewScript>();
+        }
+        
         currentPlayer = Database.Instance.GetCurrentPlayer(GameId, GetGameMode());
     }
 
@@ -152,7 +160,7 @@ public class GameManagerScript : MonoBehaviour {
             t += Time.deltaTime / 10.0f;
             float step = movementSpeed * Time.deltaTime;
             NewQuestionCard.transform.position = Vector3.Lerp(NewQuestionCard.transform.position, AnswerLine.transform.position, t);
-            if (Vector3.Distance(NewQuestionCard.transform.position, AnswerLine.transform.position) < 0.001f)
+            if (Vector3.Distance(NewQuestionCard.transform.position, AnswerLine.transform.position) < 0.01f)
             {
                 NewQuestionCard.transform.position = AnswerLine.transform.position;
             }
@@ -220,7 +228,6 @@ public class GameManagerScript : MonoBehaviour {
             statsScript.MakeBold(currentPlayer);
             Database.Instance.SetCurrentPlayer(GameId, currentPlayer, GetGameMode());
             InformationPanelScript ips = GameObject.Find("InformationPanel").GetComponent<InformationPanelScript>();
-            ips.SetCurrentPlayer(currentPlayer);
 
             if (GameMode.Equals("Online")) {
                 OnlineDatabase.Instance.SendNextPlayerMessage(GameId, currentPlayer);
@@ -242,4 +249,8 @@ public class GameManagerScript : MonoBehaviour {
     public static string GetCurrentPlayer() {
         return currentPlayer;
     }
+
+    public void QuitApplication() {
+        Application.Quit();
+    }
 }

+ 13 - 6
Assets/Scripts/Login/Login.cs

@@ -13,8 +13,8 @@ using Firebase;
 
 public class Login : MonoBehaviour {
 
-    public GameObject username;
-    public GameObject password;
+    public InputField usernameInputField;
+    public InputField passwordInputField;
 
     public Button loginButton;
     public Button SwedishButton;
@@ -51,6 +51,11 @@ public class Login : MonoBehaviour {
         EnglishButton.onClick.AddListener(() => SwitchLanguage(1));
     }
 
+    private void Awake() {
+        usernameInputField.Select();
+        usernameInputField.gameObject.SetActive(true);
+    }
+
     private void SwitchLanguage(int langId) {
         LocalizationManager.Instance.currentLanguageID = langId;
         TextLocalization[] texts = FindObjectsOfType(typeof(TextLocalization)) as TextLocalization[];
@@ -70,8 +75,8 @@ public class Login : MonoBehaviour {
     }
 
     private void Update() {
-        Username = username.GetComponent<InputField>().text;
-        Password = password.GetComponent<InputField>().text;
+        Username = usernameInputField.text;
+        Password = passwordInputField.text;
 
         if (Input.GetKeyDown(KeyCode.Tab)) {
             Selectable next = system.currentSelectedGameObject.GetComponent<Selectable>().FindSelectableOnDown();
@@ -137,8 +142,10 @@ public class Login : MonoBehaviour {
                 errorColor.a = 0;
                 errorText.color = errorColor;
                 Int32.TryParse(u.userId, out int userId);
-                Database.Instance.KeepSignedIn(Username, userId, keepSignedIn.isOn);
-                OnlineDatabase.Instance.UpdatePlayerToken(userId, fs.MyToken);
+                Database.Instance.SignIn(Username, userId, keepSignedIn.isOn);
+                if (fs != null && fs.MyToken != null && !fs.MyToken.Equals("")) {
+                    OnlineDatabase.Instance.UpdatePlayerToken(userId, fs.MyToken);
+                }
                 SceneManager.LoadScene("MainMenu");
             } else {
                 errorText.text = LocalizationManager.Instance.GetText("LOGIN_WRONG_USERNAME_PASSWORD");

+ 1 - 1
Assets/Scripts/Login/Register.cs

@@ -126,7 +126,7 @@ public class Register : MonoBehaviour {
             if (int.TryParse(www.downloadHandler.text, out int userId)) {
                 errorColor.a = 0;
                 errorText.color = errorColor;
-                Database.Instance.KeepSignedIn(Username, userId, false);
+                Database.Instance.SignIn(Username, userId, false);
                 SceneManager.LoadScene("MainMenu");
             } else {
                 errorText.text = LocalizationManager.Instance.GetText("REGISTER_ERROR_USER_PASS_ALREADY_IN_USE");

+ 2 - 6
Assets/Scripts/MainGame/InformationPanelScript.cs

@@ -7,7 +7,7 @@ using UnityEngine.SceneManagement;
 public class InformationPanelScript : MonoBehaviour
 {
     public Button quitButton;
-    public Text currentPlayerText;
+    public Text loggedInPlayerText;
 
     public Button swedishButton;
     public Button englishButton;
@@ -21,7 +21,7 @@ public class InformationPanelScript : MonoBehaviour
         quitButton.onClick.AddListener(quitButtonAction);
         swedishButton.onClick.AddListener(() => SwitchLanguage(0));
         englishButton.onClick.AddListener(() => SwitchLanguage(1));
-        currentPlayerText.text = Database.Instance.GetSignedInUser().Value;
+        loggedInPlayerText.text = GameManagerScript.GetCurrentPlayer();
         if (logoutButton != null) {
             logoutButton.onClick.AddListener(() => {
                 Database.Instance.LogoutUser();
@@ -30,10 +30,6 @@ public class InformationPanelScript : MonoBehaviour
         }
     }
 
-    public void SetCurrentPlayer(string playerName) {
-        currentPlayerText.text = playerName;
-    }
-
     void quitButtonAction() {
         if (returnToMenu) {
             SceneManager.LoadSceneAsync("MainMenu");

+ 8 - 6
Assets/Scripts/MainGame/NewQuestionCardController.cs

@@ -19,8 +19,10 @@ public class NewQuestionCardController : MonoBehaviour, IPointerClickHandler {
     [SerializeField] GameObject startParent;
     [SerializeField] GameObject gameManager;
 
+    public bool BackClickable { get => backClickable; set => backClickable = value; }
+
     public void OnPointerClick(PointerEventData eventData) {
-        if (cardBack.activeSelf && rotateDone && backClickable)
+        if (cardBack.activeSelf && rotateDone && BackClickable)
         {
             RotateCard();
         }
@@ -82,15 +84,15 @@ public class NewQuestionCardController : MonoBehaviour, IPointerClickHandler {
         ShowBackside();
         string gameMode = gameManager.GetComponent<GameManagerScript>().GetGameMode();
         if (gameMode.Equals("Online")) {
-            if (currentPlayer.Equals(SignedInUser.Value)) {
-                backClickable = true;
+            if (currentPlayer.Equals(SignedInUser.Value, StringComparison.InvariantCultureIgnoreCase)) {
+                BackClickable = true;
             } else {
-                backClickable = false;
+                BackClickable = false;
             }
         } else {
-            backClickable =  true;
+            BackClickable =  true;
         }
-        transform.parent.GetComponent<NewQuestionsPanel>().generateNewQuestion(backClickable);
+        transform.parent.GetComponent<NewQuestionsPanel>().generateNewQuestion(BackClickable);
     }
 
     private void resetPosition() {

+ 18 - 6
Assets/Scripts/MainGame/NewQuestionsPanel.cs

@@ -2,6 +2,8 @@
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
+using System;
+
 
 public class NewQuestionsPanel : MonoBehaviour
 {
@@ -22,15 +24,18 @@ public class NewQuestionsPanel : MonoBehaviour
     {
         gameManagerScript = gameManager.GetComponent<GameManagerScript>();
         int gameId = gameManagerScript.GameId;
-        string gameMode = Database.Instance.GetGameMode(gameId);
+        string gameMode = gameManagerScript.GameMode;
+        //string gameMode = Database.Instance.GetGameMode(gameId);
         string currentPlayer = Database.Instance.GetCurrentPlayer(gameId, gameMode);
 
-        if (Database.Instance.GetRoundValue(gameManagerScript.GameId, gameManagerScript.GameMode) <= 1) {
+        if (currentPlayer.Equals(Database.Instance.GetSignedInUser().Value, StringComparison.InvariantCultureIgnoreCase ) && Database.Instance.GetRoundValue(gameManagerScript.GameId, gameManagerScript.GameMode) <= 1) {
             List<NewQuestionData> usersQuestions = Database.Instance.GetPlayerQuestions(gameId, currentPlayer, gameManagerScript.GameMode);
             NewQuestionData qd = usersQuestions[0];
             AnswerText.text = qd.Answer;
             QuestionText.text = qd.Question;
             QuestionData = qd;
+        } else if (!currentPlayer.Equals(Database.Instance.GetSignedInUser().Value, StringComparison.InvariantCultureIgnoreCase)) {
+            SetNotYourTurn();
         }
     }
 
@@ -45,7 +50,9 @@ public class NewQuestionsPanel : MonoBehaviour
     // Update is called once per frame
     void Update()
     {
-        
+        if (!GameManagerScript.GetCurrentPlayer().Equals(Database.Instance.GetSignedInUser().Value, StringComparison.InvariantCultureIgnoreCase)) {
+            SetNotYourTurn();
+        }
     }
 
     public void generateNewQuestion(bool setQuestionActive) {
@@ -65,10 +72,15 @@ public class NewQuestionsPanel : MonoBehaviour
             QuestioncardBackside.GetComponent<Image>().color = QuestionData.CategoryColor;
             GetComponentInChildren<Button>().interactable = true;
         } else {
-            backCategoryText.text = LocalizationManager.Instance.GetText("NOT_YOUR_TURN");
-            QuestioncardBackside.GetComponent<Image>().color = new Color(130f,130f,130f,255f);
-            GetComponentInChildren<Button>().interactable = false;
+            SetNotYourTurn();
         }
     }
 
+    private void SetNotYourTurn()
+    {
+        backCategoryText.text = LocalizationManager.Instance.GetText("NOT_YOUR_TURN");
+        QuestioncardBackside.GetComponent<Image>().color = new Color(130f, 130f, 130f, 255f);
+        GetComponentInChildren<Button>().interactable = false;
+        GetComponentInChildren<NewQuestionCardController>().BackClickable = false;
+    }
 }

+ 0 - 79
Assets/Scripts/MainGame/RoundButtonsScript.cs

@@ -1,79 +0,0 @@
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine.UI;
-using UnityEngine;
-using System;
-
-public class RoundButtonsScript : MonoBehaviour
-{
-    public Button newQuestionButton;
-    public Button nextPlayerButton;
-
-    public GameObject QuestionAnswerLine;
-
-    public GameObject nextCategoryText;
-    public GameObject QuestionCardPrefab;
-    public GameObject NewQuestionCardPanel;
-
-    private ScrollViewScript svs;
-    private TimerScript ts;
-
-    // Start is called before the first frame update
-    void Start()
-    {
-        newQuestionButton.onClick.AddListener(NewQuestion);
-        nextPlayerButton.onClick.AddListener(NextPlayer);
-        svs = GameObject.Find("Scroll View").GetComponent<ScrollViewScript>();
-        ts = GameObject.Find("TimerCircle").GetComponent<TimerScript>();
-    }
-
-
-    void NewQuestion() {
-        HidePanel();
-        ts.ResetTimer();
-        ts.StartTimer();
-    }
-
-  
-    void NextPlayer() {
-        svs.SetAllQuestionsLocked(true);
-        svs.NextPlayer();
-        HidePanel();
-    }
-
-    public void HidePanel() {
-        gameObject.SetActive(false);
-    }
-
-    public void ShowPanel() {
-
-        if (svs == null) {
-            svs = GameObject.Find("Scroll View").GetComponent<ScrollViewScript>();
-        }
-        NewQuestionData q = Database.Instance.GetNewQuestion(svs.GetQuestionIdsInAnswerLine(), svs.currentPlayer, svs.GetGameMode());
-        //q.SetAnswerText("???? - ????");
-        //svs.SetNewQuestion(q);
-
-        Text nqct = nextCategoryText.GetComponent<Text>();
-        CategoryPanel cp = GameObject.Find("Categories").GetComponent<CategoryPanel>();
-        CategoryPanel.Category cat = cp.GetCategoryById(q.CategoryId);
-        nqct.text = cat.name;
-
-        gameObject.SetActive(true);
-    }
-
-    internal void DeactivateNextPlayer() {
-        nextPlayerButton.interactable = false;
-        newQuestionButton.GetComponentInChildren<Text>().text = LocalizationManager.Instance.GetText("START_ROUND_TEXT");
-    }
-
-    internal void ActivateNextPlayer() {
-        nextPlayerButton.interactable = true;
-        newQuestionButton.GetComponentInChildren<Text>().text = LocalizationManager.Instance.GetText("NEW_QUESTION");
-    }
-    
-    public void SetGameOver() {
-        nextPlayerButton.interactable = false;
-        newQuestionButton.interactable = false;
-    }
-}

+ 0 - 11
Assets/Scripts/MainGame/RoundButtonsScript.cs.meta

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

+ 9 - 17
Assets/Scripts/MainGame/ScrollViewScript.cs

@@ -37,13 +37,9 @@ public class ScrollViewScript : MonoBehaviour {
         gameId = gameManagerScript.GameId;
         currentPlayer = Database.Instance.GetCurrentPlayer(gameId, GetGameMode());
 
-        ips = GameObject.Find("InformationPanel").GetComponent<InformationPanelScript>();
-        ips.SetCurrentPlayer(currentPlayer);
-
         statsScript.MakeBold(currentPlayer);
 
         List<NewQuestionData> answerlineQuestions = Database.Instance.GetPlayerQuestions(gameId, currentPlayer, GetGameMode());
-        //if (answerlineQuestions.Count > 0) {
         if (Database.Instance.GetRoundValue(gameId, GetGameMode()) > 1) {
             SetQuestionsInAnswerLine(answerlineQuestions);
         }
@@ -85,7 +81,7 @@ public class ScrollViewScript : MonoBehaviour {
             answerLineQuestionCard.SetQuestionSafe();
 
             if (gameMode.Equals("Online")) {
-                if (signedInUser.Value.Equals(currentPlayer)) {
+                if (signedInUser.Value.Equals(GameManagerScript.GetCurrentPlayer(), StringComparison.InvariantCultureIgnoreCase)) {
                     answerLineQuestionCard.SetFrostingActive(false);
                 } else {
                     answerLineQuestionCard.SetFrostingActive(true);
@@ -109,14 +105,15 @@ public class ScrollViewScript : MonoBehaviour {
     }
 
     public int GetUnlockedQuestionCount() {
-        int unlockedQuestionCount = 0;
+        /*int unlockedQuestionCount = 0;
         for (int i = 0; i < contentPanel.childCount; i++) {
             QuestionCard qc = contentPanel.GetChild(i).GetComponent<QuestionCard>();
             if (!qc.IsQuestionSafe()) {
                 unlockedQuestionCount++;
             }
         }
-        return unlockedQuestionCount;
+        */
+        return contentPanel.GetComponentsInChildren<QuestionCard>().Where(q => !q.IsQuestionSafe()).ToArray().Length;;
     }
 
     public void SetAllQuestionsLocked(bool needsSave) {
@@ -164,7 +161,7 @@ public class ScrollViewScript : MonoBehaviour {
         }
 
         gameManagerScript.UpdateQuestiosLost(lostQuestions, currentPlayer);
-        statsScript.SetQuestionsInAnswerLine(currentPlayer, contentPanel.childCount - lostQuestions);
+        statsScript.SetQuestionsInAnswerLine(currentPlayer, contentPanel.GetComponents<AnswerLineQuestionCard>().Length);
     }
 
  
@@ -175,14 +172,10 @@ public class ScrollViewScript : MonoBehaviour {
         dialog.SetTitle(LocalizationManager.Instance.GetText("TIMER_DIALOG_TITLE"));
         dialog.SetMessage(String.Format(message, GetUnlockedQuestionCount()));
         dialog.SetOnAccept(LocalizationManager.Instance.GetText("OK"), () => {
-            if (PlayerPrefs.GetString("GameMode").Equals("Local")) {
-                RemoveUnlockedQuestions();
-                ts.ResetTimer();
-                dialog.Hide();
-                NextPlayer();
-            } else {
-                // TODO online
-            }
+            RemoveUnlockedQuestions();
+            ts.ResetTimer();
+            dialog.Hide();
+            NextPlayer();
         });
         dialog.SetOnDecline("", () => dialog.Hide());
         dialog.Show();
@@ -216,7 +209,6 @@ public class ScrollViewScript : MonoBehaviour {
 
             statsScript.MakeBold(currentPlayer);
             Database.Instance.SetCurrentPlayer(gameId, currentPlayer, GetGameMode());
-            ips.SetCurrentPlayer(currentPlayer);
             dialog.Hide();
         });
         dialog.SetOnDecline("", () => dialog.Hide());

+ 27 - 3
Assets/Scripts/MainMenu.cs

@@ -10,13 +10,16 @@ public class MainMenu : MonoBehaviour {
 
     public Button startNewGameButton;
     public Button quitButton;
-    public Transform activeGamesPanel;
+    public Transform localGamesPanelTitle;
+    public Transform onlineGamesPanelTitle;
 
     public GameObject localGamePrefab;
     public GameObject onlineGamePrefab;
     public GameObject finishedGamePrefab;
 
     private int loggedInUserId;
+    private DateTime lastPlayedLocal;
+    private DateTime lastPlayedOnline;
 
     private void Start() {
         startNewGameButton.onClick.AddListener(StartNewGameAction);
@@ -27,11 +30,18 @@ public class MainMenu : MonoBehaviour {
     private void Awake() {
         GetGames();
         UpdateOnlineGamesLists();
+        if (lastPlayedLocal > lastPlayedOnline) {
+            localGamesPanelTitle.GetComponent<GamesScrollController>().expandThis(localGamesPanelTitle.name);
+        } else {
+            onlineGamesPanelTitle.GetComponent<GamesScrollController>().expandThis(onlineGamesPanelTitle.name);
+        }
     }
 
     public void UpdateOnlineGamesLists() {
         KeyValuePair<int, string> loggedInUser = Database.Instance.GetSignedInUser();
         Transform onlineGamesList = GameObject.Find("OnlineGamesList").transform;
+        Transform finishedGamesList = GameObject.Find("FinishedGamesList").transform;
+        
 
         foreach (OnlineGameScript ogs in onlineGamesList.GetComponentsInChildren<OnlineGameScript>()) {
             Destroy(ogs);
@@ -39,12 +49,22 @@ public class MainMenu : MonoBehaviour {
         }
 
         int onlineIndex = 1;
+        int finishedGamesIndex = 1;
         if (checkInternetConnection()) {
             List<OnlineGameScript> onlineGames = OnlineDatabase.Instance.GetOnlineGames(loggedInUser.Key, loggedInUser.Value, onlineGamePrefab);
             if (onlineGames != null) {
                 foreach (OnlineGameScript ogs in onlineGames) {
-                    ogs.transform.SetParent(onlineGamesList, false);
-                    ogs.transform.SetSiblingIndex(onlineIndex++);
+                    DateTime.TryParse(ogs.LastPlayedDate, out DateTime onlineLastPlayedDate);
+                    if (lastPlayedOnline == null || onlineLastPlayedDate > lastPlayedOnline) {
+                        lastPlayedOnline = onlineLastPlayedDate;
+                    }
+                    if (ogs.GameStatus.Equals("DECLINED")) {
+                        ogs.transform.SetParent(finishedGamesList, false);
+                        ogs.transform.SetSiblingIndex(finishedGamesIndex++);
+                    } else {
+                        ogs.transform.SetParent(onlineGamesList, false);
+                        ogs.transform.SetSiblingIndex(onlineIndex++);
+                    }
                 }
             }
         } else {
@@ -73,6 +93,10 @@ public class MainMenu : MonoBehaviour {
         int localIndex = 1;
         int finishedIndex = 1;
         foreach (LocalGameScript lgs in localGames) {
+            DateTime.TryParse(lgs.LastPlayedDate, out DateTime localLastPlayedDate);
+            if (lastPlayedLocal == null || localLastPlayedDate > lastPlayedLocal) {
+                lastPlayedLocal = localLastPlayedDate;
+            }
             if (lgs.FinishedDate.Equals("")) {
                 lgs.transform.SetParent(localGamesList.transform, false);
                 lgs.transform.SetSiblingIndex(localIndex++);

+ 11 - 2
Assets/Scripts/NewGameScene/GameInfoScript.cs

@@ -18,6 +18,10 @@ public class GameInfoScript : MonoBehaviour {
     private int gameId;
     private int questionTimer;
 
+    [SerializeField] Text answerTimeValueText;
+    [SerializeField] Text questionsToWinValueText;
+    [SerializeField] Text DaysToStartRoundValueText;
+
     // Start is called before the first frame update
     void Start() {
         cancelButton.onClick.AddListener(Hide);
@@ -34,6 +38,11 @@ public class GameInfoScript : MonoBehaviour {
         String currentPlayer = Database.Instance.GetSignedInUser().Value;
         gameId = onlineGameScript.GetId();
         questionTimer = onlineGameScript.AnswerTimer;
+
+        answerTimeValueText.text = onlineGameScript.AnswerTimer.ToString();
+        questionsToWinValueText.text = onlineGameScript.WinNumber.ToString();
+        DaysToStartRoundValueText.text = onlineGameScript.RoundTimeLimit.ToString();
+
         foreach (KeyValuePair<string, string> player in onlineGameScript.PlayerInfos) {
             GameObject slp = Instantiate(playerInfoPrefab, new Vector2(0, 0), Quaternion.identity) as GameObject;
             OnlinePlayerInfoScript opi = slp.GetComponent<OnlinePlayerInfoScript>();
@@ -44,13 +53,13 @@ public class GameInfoScript : MonoBehaviour {
             } else {
                 opi.SetPlayerStatus(player.Value);
             }
-
             opi.transform.SetParent(playersPanel, false);
         }
 
         acceptButton.enabled = false;
         acceptButton.interactable = false;
-        if ("ACTIVE".Equals(onlineGameScript.GameStatus)) {
+
+        if (onlineGameScript.GameStatus.Equals("ACTIVE")) {
             acceptButton.enabled = true;
             acceptButton.interactable = true;
         }

+ 9 - 6
Assets/Scripts/NewGameScene/GamesScrollController.cs

@@ -14,9 +14,7 @@ public class GamesScrollController : MonoBehaviour, IPointerClickHandler {
     public GameObject finishedGamesPanel;
     public GameObject gamesPanel;
 
-    public void OnPointerClick(PointerEventData eventData) {
-        GameObject clickedObject = GameObject.Find(eventData.pointerPress.name);
-
+    public void expandThis(string objectName) {
         bool finishExpanded = finishedGamesPanel.GetComponent<RectTransform>().rect.height > 31f ? true : false;
         bool localExpanded = localGamesPanel.GetComponent<RectTransform>().rect.height > 31f ? true : false;
         bool onlineExpanded = onlineGamesPanel.GetComponent<RectTransform>().rect.height > 31f ? true : false;
@@ -27,7 +25,7 @@ public class GamesScrollController : MonoBehaviour, IPointerClickHandler {
         if (onlineExpanded) { numberExpanded++; };
 
 
-        if (clickedObject.name.Equals("LocalGamesTitle")) {
+        if (objectName.Equals("LocalGamesTitle")) {
             if (localExpanded) {
                 Minimize(localGamesPanel);
             } else {
@@ -35,7 +33,7 @@ public class GamesScrollController : MonoBehaviour, IPointerClickHandler {
                 Minimize(onlineGamesPanel);
                 Minimize(finishedGamesPanel);
             }
-        } else if (clickedObject.name.Equals("OnlineGamesTitle")) {
+        } else if (objectName.Equals("OnlineGamesTitle")) {
             if (onlineExpanded) {
                 Minimize(onlineGamesPanel);
             } else {
@@ -43,7 +41,7 @@ public class GamesScrollController : MonoBehaviour, IPointerClickHandler {
                 Minimize(localGamesPanel);
                 Minimize(finishedGamesPanel);
             }
-        } else if (clickedObject.name.Equals("FinishedGamesTitle")) {
+        } else if (objectName.Equals("FinishedGamesTitle")) {
             if (finishExpanded) {
                 Minimize(finishedGamesPanel);
                 finishedGamesPanel.GetComponentInChildren<Scrollbar>().handleRect.parent.GetComponentInChildren<Image>().enabled = false;
@@ -56,6 +54,11 @@ public class GamesScrollController : MonoBehaviour, IPointerClickHandler {
         }
     }
 
+    public void OnPointerClick(PointerEventData eventData) {
+        GameObject clickedObject = GameObject.Find(eventData.pointerPress.name);
+        expandThis(clickedObject.name);
+    }
+
     private void Maximize(GameObject activeObject) {
         float gamesPanelHeight = gamesPanel.GetComponent<RectTransform>().rect.height;
 

+ 15 - 3
Assets/Scripts/NewGameScene/OnlineGameScript.cs

@@ -18,7 +18,7 @@ public class OnlineGameScript : MonoBehaviour {
     private string currentPlayer;
     private int round;
     private string startDate;
-    private string LastPlayedDate;
+    private string lastPlayedDate;
     private string finishedDate;
 
     private List<KeyValuePair<string, string>> playerInfos;
@@ -37,7 +37,7 @@ public class OnlineGameScript : MonoBehaviour {
     public string CurrentPlayer { get => currentPlayer; set => currentPlayer = value; }
     public int Round { get => round; set => round = value; }
     public string StartDate { get => startDate; set => startDate = value; }
-    public string LastPlayedDate1 { get => LastPlayedDate; set => LastPlayedDate = value; }
+    public string LastPlayedDate { get => lastPlayedDate; set => lastPlayedDate = value; }
     public string FinishedDate { get => finishedDate; set => finishedDate = value; }
     public string GameStatus {
         get { return gameStatus; }
@@ -53,6 +53,8 @@ public class OnlineGameScript : MonoBehaviour {
 
     private string PENDING_TITLE = "ONLINE_GAME_STATUS_TITLE_VALUE_PENDING";
     private string ACTIVE_TITLE = "ONLINE_GAME_STATUS_TITLE_ACTIVE";
+    private string DECLINED_TITLE = "ONLINE_GAME_STATUS_TITLE_DECLINED";
+    private string INVITED_TITLE = "ONLINE_GAME_STATUS_TITLE_INVITED";
 
     private string PENDING = "ONLINE_GAME_STATUS_PENDING";
     private string DECLINED = "ONLINE_GAME_STATUS_DECLINED";
@@ -94,7 +96,8 @@ public class OnlineGameScript : MonoBehaviour {
         } else if ("INVITED".Equals(status)) {
             image.color = statusColors[4];
         } else if ("ACTIVE".Equals(status)) {
-            if (CurrentPlayer.Equals(Database.Instance.GetSignedInUser().Value, StringComparison.InvariantCultureIgnoreCase)) {
+            Int32.TryParse(CurrentPlayer, out int currentPlayerId);
+            if (currentPlayerId == Database.Instance.GetSignedInUser().Key) {
                 image.color = statusColors[2];
             } else {
                 image.color = statusColors[1];
@@ -116,20 +119,29 @@ public class OnlineGameScript : MonoBehaviour {
         if ("PENDING".Equals(GameStatus)) {
             gameStatusText.gameObject.GetComponent<TextLocalization>().key = PENDING;
             gameStatusText.text = LocalizationManager.Instance.GetText(PENDING);
+            gameTitleText.gameObject.GetComponent<TextLocalization>().key = PENDING_TITLE;
             SetTitleText(LocalizationManager.Instance.GetText(PENDING_TITLE));
         } else if ("YOUR_TURN".Equals(GameStatus)) {
             gameStatusText.gameObject.GetComponent<TextLocalization>().key = YOUR_TURN;
             gameStatusText.text = LocalizationManager.Instance.GetText(YOUR_TURN);
+            gameTitleText.gameObject.GetComponent<TextLocalization>().key = "FCM_NEXT_PLAYER_TITLE";
+            SetTitleText(LocalizationManager.Instance.GetText("FCM_NEXT_PLAYER_TITLE"));
         } else if ("OTHERS_TURN".Equals(GameStatus)) {
             gameStatusText.gameObject.GetComponent<TextLocalization>().key = OTHERS_TURN;
             string message = LocalizationManager.Instance.GetText(OTHERS_TURN);
             gameStatusText.text = String.Format(message, extraInfo);
+            gameTitleText.gameObject.GetComponent<TextLocalization>().key = "NOT_YOUR_TURN";
+            SetTitleText(LocalizationManager.Instance.GetText("NOT_YOUR_TURN"));
         } else if ("DECLINED".Equals(GameStatus)) {
             gameStatusText.gameObject.GetComponent<TextLocalization>().key = DECLINED;
             gameStatusText.text = LocalizationManager.Instance.GetText(DECLINED);
+            gameTitleText.gameObject.GetComponent<TextLocalization>().key = DECLINED_TITLE;
+            SetTitleText(LocalizationManager.Instance.GetText(DECLINED_TITLE));
         } else if ("INVITED".Equals(GameStatus)) {
             gameStatusText.gameObject.GetComponent<TextLocalization>().key = INVITED;
             gameStatusText.text = LocalizationManager.Instance.GetText(INVITED);
+            gameTitleText.gameObject.GetComponent<TextLocalization>().key = INVITED_TITLE;
+            SetTitleText(LocalizationManager.Instance.GetText(INVITED_TITLE));
         } else if ("ACTIVE".Equals(GameStatus)) {
             TextLocalization textLocalization = gameStatusText.gameObject.GetComponent<TextLocalization>();
             textLocalization.key = ACTIVE;

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

@@ -1,4 +1,5 @@
-using System.Collections;
+using System;
+using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.SceneManagement;
@@ -11,6 +12,10 @@ public class StartOnlineGameButton : MonoBehaviour
     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
@@ -20,6 +25,13 @@ public class StartOnlineGameButton : MonoBehaviour
         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

+ 30 - 1
Assets/StreamingAssets/google-services-desktop.json

@@ -6,6 +6,35 @@
     "storage_bucket": "narkampen.appspot.com"
   },
   "client": [
+    {
+      "client_info": {
+        "mobilesdk_app_id": "1:108102546370:android:b897599a5695f2308b9c5b",
+        "android_client_info": {
+          "package_name": "se.axelnordh.narkampen"
+        }
+      },
+      "oauth_client": [
+        {
+          "client_id": "108102546370-2bu9lhiunhhi5v6up5dcuntnucoo5dcf.apps.googleusercontent.com",
+          "client_type": 3
+        }
+      ],
+      "api_key": [
+        {
+          "current_key": "AIzaSyCBQiFiFWvzWMFrTBWtHVagJ5xk-T_ytGw"
+        }
+      ],
+      "services": {
+        "appinvite_service": {
+          "other_platform_oauth_client": [
+            {
+              "client_id": "108102546370-crv9k8j6892fmbchirjuqcoiia1191fm.apps.googleusercontent.com",
+              "client_type": 3
+            }
+          ]
+        }
+      }
+    },
     {
       "client_info": {
         "mobilesdk_app_id": "1:108102546370:android:c379d06ef36a3e568b9c5b",
@@ -36,7 +65,7 @@
         "appinvite_service": {
           "other_platform_oauth_client": [
             {
-              "client_id": "108102546370-2bu9lhiunhhi5v6up5dcuntnucoo5dcf.apps.googleusercontent.com",
+              "client_id": "108102546370-crv9k8j6892fmbchirjuqcoiia1191fm.apps.googleusercontent.com",
               "client_type": 3
             }
           ]

+ 1 - 1
Assets/StreamingAssets/google-services-desktop.json.meta

@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 3120c7189ae7c4b49a8dbb694b912f6f
+guid: 356e6efe83a950047917694d34bc86e3
 TextScriptImporter:
   externalObjects: {}
   userData: 

BIN
Assets/StreamingAssets/narKampenLocal.db


+ 5 - 3
Assets/Translations/ENGLISH.xml

@@ -20,13 +20,13 @@
   <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">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">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>
@@ -40,7 +40,7 @@
   <text key="PLAYER_SETTING_TEXT">Player {0} name</text>
   <text key="PLAYER_TEXT">Player</text>
   <text key="PLAYERS_TEXT">Players</text>
-  <text key="NAME">namn</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>
@@ -77,6 +77,8 @@
   <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>

+ 5 - 3
Assets/Translations/SWEDISH.xml

@@ -20,13 +20,13 @@
   <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">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">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>
@@ -40,7 +40,7 @@
   <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="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>
@@ -78,6 +78,8 @@
   <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>

BIN
Assets/narKampenLocal.db


BIN
NarKampenV0.3-11.aab


+ 1 - 1
ProjectSettings/AndroidResolverDependencies.xml

@@ -69,7 +69,7 @@
   </files>
   <settings>
     <setting name="androidAbis" value="arm64-v8a,armeabi-v7a" />
-    <setting name="bundleId" value="se.nordh.xyz.narKampen" />
+    <setting name="bundleId" value="se.axelnordh.narkampen" />
     <setting name="explodeAars" value="True" />
     <setting name="gradleBuildEnabled" value="True" />
     <setting name="gradleTemplateEnabled" value="False" />

+ 1 - 0
ProjectSettings/GvhProjectSettings.xml

@@ -2,6 +2,7 @@
   <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>

+ 3 - 3
ProjectSettings/ProjectSettings.asset

@@ -119,7 +119,7 @@ PlayerSettings:
     16:10: 1
     16:9: 1
     Others: 1
-  bundleVersion: 0.4
+  bundleVersion: 0.47
   preloadedAssets: []
   metroInputSource: 0
   wsaTransparentSwapchain: 0
@@ -163,9 +163,9 @@ PlayerSettings:
   androidSupportedAspectRatio: 1
   androidMaxAspectRatio: 2.1
   applicationIdentifier:
-    Android: se.nordh.xyz.narKampen
+    Android: se.axelnordh.narkampen
   buildNumber: {}
-  AndroidBundleVersionCode: 14
+  AndroidBundleVersionCode: 17
   AndroidMinSdkVersion: 19
   AndroidTargetSdkVersion: 0
   AndroidPreferredInstallLocation: 1

+ 10 - 2
dbFiles/FCMMessageing.php

@@ -1,5 +1,13 @@
 <?php
 /* FCM - Messageing */
+	require_once '../vendor/autoload.php';
+
+	putenv('GOOGLE_APPLICATION_CREDENTIALS=/home/axel/configs/narkampen-firebase-adminsdk-k42j5-d3d0354e37.json');
+
+	$client = new Google_Client();
+	$client->useApplicationDefaultCredentials();
+	$client->addScope('https://www.googleapis.com/auth/firebase.messaging');
+	$httpClient = $client->authorize();
 
 	$hostname = 'localhost';
 	$username = 'narKampen';
@@ -27,8 +35,8 @@
 		}
 	} else if ($messageType === "InviteMessage") {
 		$i = 0;
-		while ($_POST['player' + $i] != null) {
-			$token = getToken($gameId, $conn->real_escape_string($_POST['player' $i]));
+		while ($_POST['player' . $i] != null) {
+			$token = getToken($gameId, $conn->real_escape_string($_POST['player' . $i]));
 			sendMessage($token);
 		}
 

+ 55 - 49
dbFiles/NewOnlineGame.php

@@ -17,58 +17,64 @@
 	$limitPerPlayer = $_POST['limitPerPlayer'];
 	$playerIds = $_POST['playerIds'];
 	$currentUser = $_POST['currentUser'];
+	$functionName = $_POST['f'];
 	
-	$playerIdsArray = explode(",",$playerIds);
-	$playerCount = count($playerIdsArray);
-	if ($playerCount == 1) {
-		$status = "STARTED";
-	} else {
-		$status = "PENDING";
-	}
-	$sql = "INSERT INTO game(" .
-            "gameMode, " .
-			"status, " .
-            "winNumber, " .
-            "answerTimer, " .
-            "roundTimeLimit, " .
-            "numberOfPlayers, " .
-            "currentPlayer, " .
-            "round, " .
-            "startedDate) " .
-            "VALUES (" .
-            "'Online', " .
-			"'$status', " .
-            "$winNumber, " .
-            "$limitPerQuestion, " .
-            "$limitPerPlayer, " .
-            "$playerCount, " .
-            "(SELECT id FROM users WHERE id IN ($playerIds) ORDER BY RAND() LIMIT 1), " .
-            "1, " .
-            "NOW())";
-	
-	$result = mysqli_query($conn, $sql);
-	$error = mysqli_error($conn);
-	if ($error !== "") {
-		echo $error;
-	}
-	$gameId = mysqli_insert_id($conn);
-	$playerPartInsertSql = "";
-	foreach ($playerIdsArray AS $playerId) {
-		if ($currentUser == $playerId) {
-			$playerPartInsertSql .= "($gameId, $playerId, 1, 1, 'ACCEPTED'),";
+	if ($functionName === "NewGame") {
+		$playerIdsArray = explode(",",$playerIds);
+		$playerCount = count($playerIdsArray);
+		if ($playerCount == 1) {
+			$status = "STARTED";
 		} else {
-			$playerPartInsertSql .= "($gameId, $playerId, 1, 1, 'WAITING'),";
+			$status = "PENDING";
 		}
-	}
-	$playerPartInsertSql = rtrim($playerPartInsertSql,",");
-	$playerSql = "INSERT INTO gamePlayers (gameId, playerId, userLockedQuestions, questionsLost, status) VALUES $playerPartInsertSql";
-	
-	$result = mysqli_query($conn,$playerSql);
-	$error = mysqli_error($conn);
-	
-	echo $gameId;
-	if ($error !== "") {
-		echo $error . " from sql " . $playerSql;
+		$sql = "INSERT INTO game(" .
+				"gameMode, " .
+				"status, " .
+				"winNumber, " .
+				"answerTimer, " .
+				"roundTimeLimit, " .
+				"numberOfPlayers, " .
+				"currentPlayer, " .
+				"round, " .
+				"startedDate) " .
+				"VALUES (" .
+				"'Online', " .
+				"'$status', " .
+				"$winNumber, " .
+				"$limitPerQuestion, " .
+				"$limitPerPlayer, " .
+				"$playerCount, " .
+				"(SELECT id FROM users WHERE id IN ($playerIds) ORDER BY RAND() LIMIT 1), " .
+				"1, " .
+				"NOW())";
+		
+		$result = mysqli_query($conn, $sql);
+		$error = mysqli_error($conn);
+		if ($error !== "") {
+			echo $error;
+		}
+		$gameId = mysqli_insert_id($conn);
+		$playerPartInsertSql = "";
+		foreach ($playerIdsArray AS $playerId) {
+			if ($currentUser == $playerId) {
+				$playerPartInsertSql .= "($gameId, $playerId, 1, 1, 'ACCEPTED'),";
+			} else {
+				$playerPartInsertSql .= "($gameId, $playerId, 1, 1, 'WAITING'),";
+			}
+		}
+		$playerPartInsertSql = rtrim($playerPartInsertSql,",");
+		$playerSql = "INSERT INTO gamePlayers (gameId, playerId, userLockedQuestions, questionsLost, status) VALUES $playerPartInsertSql";
+		
+		$result = mysqli_query($conn,$playerSql);
+		$error = mysqli_error($conn);
+		
+		echo $gameId;
+		if ($error !== "") {
+			echo $error . " from sql " . $playerSql;
+		}
+	} else if ($functionName === "GetCategories") {
+		$sql = "SELECT category.name, count(*) FROM questions INNER JOIN questionToCategory ON questions.id = questionToCategory.questionId INNER JOIN category ON questionToCategory.categoryId = category.id GROUP BY category.name"
+		
 	}
 
 ?>

+ 3 - 3
dbFiles/OnlineGames.php

@@ -18,7 +18,7 @@
 	$userId = $conn->query("SELECT id FROM users where username = '$userName'")->fetch_assoc()['id'];
 	
 	if ($callFunction === "list"){	
-		$sql = "SELECT game.*, users.username as playerToAct FROM game LEFT JOIN users on currentPlayer = users.id WHERE users.id IN (SELECT gameId FROM gamePlayers WHERE playerId = $userId)";
+		$sql = "SELECT game.*, users.username as playerToAct FROM game LEFT JOIN users on currentPlayer = users.id WHERE game.id IN (SELECT gameId FROM gamePlayers WHERE playerId = $userId) ORDER BY FIELD(PlayerToAct, '$userName') DESC, lastPlayedDate DESC";
 		$result = $conn->query($sql);
 
 		if ($result->num_rows > 0) {
@@ -44,8 +44,8 @@
 			$sql = "SELECT count(*) as c FROM gamePlayers WHERE gameId = $gameId AND status NOT LIKE 'DECLINED'";
 			$result = $conn->query($sql);
 			while ($data = $result->fetch_assoc()) {
-				if ($data['c'] == 1) { // Alla utom den som startade spelet har nekat, sätt status till declined på game
-					$sql = "UPDATE game SET status = 'DECLINED' WHERE id = $gameId";
+				if ($data['c'] == 1) { // Alla utom den som startade spelet har nekat, ta bort spelet från game
+					$sql = "DELETE FROM game WHERE id = $gameId";
 					$result = $conn->query($sql);
 					if (!$result) {
 						echo "UPDATE game status failed " . $conn->error;

+ 70 - 0
dbFiles/ReadQuestionsFromFile.php

@@ -0,0 +1,70 @@
+<?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');
+	
+// Check if file is CSV
+// get Filename, remove ending, this is the category name
+// get file contents 
+
+if (file_exists($argv[1]) {
+	$file = fopen($argv[1], "r");
+	$fileinfo = pathinfo($argv[1]);
+	
+	$categoryName = str_replace("_"," ", $fileinfo['filename']);
+	
+	while ($data = fgetcsv($file, 1000, ",") !== false) {
+		$answer = $data[0];
+		$question = $data[1];
+	 
+		if ($answer == null || $question == null || $answer = "" || $question == "") {
+			echo "Failed to get answer and/or question from " . print_r($data,true) .  "\r\n";
+			die();
+		}
+	 
+		$sql = "INSERT INTO questions (answer, question) 
+			VALUES ($answer, '$question') 
+			ON DUPLICATE KEY UPDATE SET 
+			answer = $answer,
+			id = LAST_INSERT_ID(id)";
+		$conn->querry($sql);
+		$questionId = $conn->insert_id;	 
+		if ($questionId == 0) {
+		
+			echo "Nothing insered or updated by sql: \r\n";
+			echo $sql;
+			die(); // Should not happen!
+		}
+		
+		$sql = "SELECT id FROM category WHERE name = '$categoryName'";
+		$result = $conn->querry($sql);
+		
+		$categoryId = -1;
+		while ($row = $result->fetch_assoc()) {
+			$categoryId = $row['id'];
+		}
+		
+		if ($categoryId == -1) {
+			$sql = "INSERT INTO category (name, r,g,b,a) VALUES ($categoryName, 255,255,255,255)";
+			$conn->querry($sql);
+			$categoryId = $conn->insert_id;
+		}
+		
+		$sql = "INSERT INTO questionToCategory (questionId, categoryId) VALUES ($questionId, $categoryId)";
+		$conn->querry($sql);
+		
+		echo "inserted question $question into category $categoryName \r\n";
+ }
+ 
+ fclose($file);
+} else {
+	echo "Run with file as first argument";
+}

+ 2 - 1
dbFiles/Register.php

@@ -16,13 +16,14 @@
 	$salt = $conn->real_escape_string($_GET['s']);
 	$deviceId = $conn->real_escape_string($_GET['did']);
 	$os = $conn->real_escape_string($_GET['os']);
+	$token = $conn->real_escape_string($_GET['t']);
 	
 	if ($newUsername == '' || $newPassword == '' || $newEmail == '' || $salt == '') {
 		echo "Supply values for all required fields";
 		return;
 	}
 	
-	$sql = "INSERT INTO users (username, password, email, salt, last_login, os, deviceId) VALUES ('$newUsername', '$newPassword', '$newEmail', '$salt', NOW(), '$os', '$deviceId')";
+	$sql = "INSERT INTO users (username, password, email, salt, last_login, os, deviceId, messageToken) VALUES ('$newUsername', '$newPassword', '$newEmail', '$salt', NOW(), '$os', '$deviceId', '$token')";
 	if ($conn->query($sql) === true) {
 		echo $conn->insert_id;
 	} else {

Некоторые файлы не были показаны из-за большого количества измененных файлов