Axel Nordh 6 лет назад
Родитель
Сommit
7e6a58afc4

+ 374 - 26
Assets/MainMenu.unity

@@ -2000,7 +2000,7 @@ 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, y: -15.000427}
+  m_AnchoredPosition: {x: 0, y: -15.000366}
   m_SizeDelta: {x: 0, y: -30}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &306334728
@@ -2092,9 +2092,11 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   closeButton: {fileID: 1434926341}
   searchButton: {fileID: 230809368}
+  doneButton: {fileID: 740062922}
   searchField: {fileID: 2113556740}
   inviteSearchResultPrefab: {fileID: 263645073911821523, guid: dfb5e100c9a6c8c41a5021b533703fc1,
     type: 3}
+  searchResultPanel: {fileID: 880394574}
 --- !u!1 &315013602
 GameObject:
   m_ObjectHideFlags: 0
@@ -2301,7 +2303,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, y: 0.000024980936}
+  m_AnchoredPosition: {x: 0, y: -0.000021635915}
   m_SizeDelta: {x: 0, y: 0}
   m_Pivot: {x: 0, y: 1}
 --- !u!114 &321314050
@@ -2622,6 +2624,109 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 351569803}
   m_CullTransparentMesh: 0
+--- !u!1 &354528357
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 354528358}
+  - component: {fileID: 354528360}
+  - component: {fileID: 354528359}
+  - component: {fileID: 354528361}
+  m_Layer: 5
+  m_Name: InviteButtonPanel
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &354528358
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 354528357}
+  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: 1791419371}
+  - {fileID: 2039653378}
+  m_Father: {fileID: 1109971563}
+  m_RootOrder: 4
+  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: 1}
+--- !u!114 &354528359
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 354528357}
+  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_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
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &354528360
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 354528357}
+  m_CullTransparentMesh: 0
+--- !u!114 &354528361
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 354528357}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding:
+    m_Left: 200
+    m_Right: 200
+    m_Top: 10
+    m_Bottom: 10
+  m_ChildAlignment: 4
+  m_Spacing: 0
+  m_ChildForceExpandWidth: 1
+  m_ChildForceExpandHeight: 1
+  m_ChildControlWidth: 1
+  m_ChildControlHeight: 1
+  m_ChildScaleWidth: 0
+  m_ChildScaleHeight: 0
 --- !u!1 &359479518
 GameObject:
   m_ObjectHideFlags: 0
@@ -3005,9 +3110,9 @@ MonoBehaviour:
     m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
     m_FontSize: 14
     m_FontStyle: 0
-    m_BestFit: 0
+    m_BestFit: 1
     m_MinSize: 10
-    m_MaxSize: 40
+    m_MaxSize: 18
     m_Alignment: 4
     m_AlignByGeometry: 0
     m_RichText: 1
@@ -4211,7 +4316,7 @@ GameObject:
   - component: {fileID: 740062922}
   - component: {fileID: 740062921}
   m_Layer: 5
-  m_Name: InviteDialogInviteButton
+  m_Name: InviteDialogDoneButton
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
@@ -4249,7 +4354,7 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 78e7dcec242b8e54db8994e443fcf679, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  key: INVITE_DIALOG_BUTTON
+  key: INVITE_PANEL_DIALOG_BUTTON
 --- !u!114 &740062922
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -4288,7 +4393,7 @@ MonoBehaviour:
     m_PressedTrigger: Pressed
     m_SelectedTrigger: Selected
     m_DisabledTrigger: Disabled
-  m_Interactable: 0
+  m_Interactable: 1
   m_TargetGraphic: {fileID: 740062923}
   m_OnClick:
     m_PersistentCalls:
@@ -4744,7 +4849,7 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 1, y: 1}
-  m_AnchoredPosition: {x: -0.000015258789, y: -0.000021509353}
+  m_AnchoredPosition: {x: -0.000015258789, y: -0.000033080043}
   m_SizeDelta: {x: 0, y: 0}
   m_Pivot: {x: 0.5, y: 1}
 --- !u!114 &777178507
@@ -6072,7 +6177,7 @@ MonoBehaviour:
   m_TargetGraphic: {fileID: 761483707}
   m_HandleRect: {fileID: 761483706}
   m_Direction: 2
-  m_Value: 0
+  m_Value: 1
   m_Size: 1
   m_NumberOfSteps: 0
   m_OnValueChanged:
@@ -6810,8 +6915,8 @@ RectTransform:
   - {fileID: 455940066}
   - {fileID: 275260769}
   - {fileID: 1033939032}
-  - {fileID: 1791419371}
-  - {fileID: 1587969356}
+  - {fileID: 354528358}
+  - {fileID: 2083260543}
   m_Father: {fileID: 623810934}
   m_RootOrder: 3
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -7215,7 +7320,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, y: -0.000022232138}
+  m_AnchoredPosition: {x: 0, y: -0.000019490055}
   m_SizeDelta: {x: 0, y: 0}
   m_Pivot: {x: 0, y: 1}
 --- !u!114 &1273003562
@@ -8888,6 +8993,7 @@ GameObject:
   - component: {fileID: 1587969359}
   - component: {fileID: 1587969358}
   - component: {fileID: 1587969357}
+  - component: {fileID: 1587969361}
   - component: {fileID: 1587969360}
   m_Layer: 5
   m_Name: StartOnlineGameButton
@@ -8908,8 +9014,8 @@ RectTransform:
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_Children:
   - {fileID: 843398050}
-  m_Father: {fileID: 1109971563}
-  m_RootOrder: 5
+  m_Father: {fileID: 2083260543}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 0, y: 0}
@@ -8954,7 +9060,7 @@ MonoBehaviour:
     m_PressedTrigger: Pressed
     m_SelectedTrigger: Selected
     m_DisabledTrigger: Disabled
-  m_Interactable: 1
+  m_Interactable: 0
   m_TargetGraphic: {fileID: 1587969358}
   m_OnClick:
     m_PersistentCalls:
@@ -9015,10 +9121,23 @@ MonoBehaviour:
   m_MinWidth: 40
   m_MinHeight: 20
   m_PreferredWidth: 100
-  m_PreferredHeight: -1
+  m_PreferredHeight: 30
   m_FlexibleWidth: -1
   m_FlexibleHeight: -1
   m_LayoutPriority: 1
+--- !u!114 &1587969361
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1587969355}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 78e7dcec242b8e54db8994e443fcf679, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  key: START_GAME
 --- !u!1 &1593785319
 GameObject:
   m_ObjectHideFlags: 0
@@ -9089,7 +9208,7 @@ MonoBehaviour:
     m_HorizontalOverflow: 0
     m_VerticalOverflow: 0
     m_LineSpacing: 1
-  m_Text: Invite players
+  m_Text: Done
 --- !u!222 &1593785322
 CanvasRenderer:
   m_ObjectHideFlags: 0
@@ -9511,7 +9630,7 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0.5, y: 0}
   m_AnchorMax: {x: 0.5, y: 1}
-  m_AnchoredPosition: {x: 0, y: -15.000427}
+  m_AnchoredPosition: {x: 0, y: -15.000366}
   m_SizeDelta: {x: 797.5, y: -30}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &1687109497
@@ -10088,8 +10207,8 @@ RectTransform:
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_Children:
   - {fileID: 436254875}
-  m_Father: {fileID: 1109971563}
-  m_RootOrder: 4
+  m_Father: {fileID: 354528358}
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 0, y: 0}
@@ -10208,9 +10327,9 @@ MonoBehaviour:
   m_MinWidth: 40
   m_MinHeight: 20
   m_PreferredWidth: 100
-  m_PreferredHeight: -1
-  m_FlexibleWidth: -1
-  m_FlexibleHeight: -1
+  m_PreferredHeight: 30
+  m_FlexibleWidth: 1
+  m_FlexibleHeight: 1
   m_LayoutPriority: 1
 --- !u!1 &1808633000
 GameObject:
@@ -11623,6 +11742,235 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1993781845}
   m_CullTransparentMesh: 0
+--- !u!1 &2039653377
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2039653378}
+  - component: {fileID: 2039653383}
+  - component: {fileID: 2039653382}
+  - component: {fileID: 2039653381}
+  - component: {fileID: 2039653380}
+  - component: {fileID: 2039653379}
+  m_Layer: 5
+  m_Name: InvitedCountText
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2039653378
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2039653377}
+  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: 354528358}
+  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.000061035156, y: 0}
+  m_SizeDelta: {x: 200, y: 42.2}
+  m_Pivot: {x: 1, y: 0.5}
+--- !u!114 &2039653379
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2039653377}
+  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 &2039653380
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2039653377}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 539bd096d40d9934d916d02e161ee660, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  key: INVITE_COUNT_TEXT
+--- !u!225 &2039653381
+CanvasGroup:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2039653377}
+  m_Enabled: 1
+  m_Alpha: 0
+  m_Interactable: 0
+  m_BlocksRaycasts: 0
+  m_IgnoreParentGroups: 0
+--- !u!114 &2039653382
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2039653377}
+  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: 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: 1 Invited Player
+--- !u!222 &2039653383
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2039653377}
+  m_CullTransparentMesh: 0
+--- !u!1 &2083260542
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2083260543}
+  - component: {fileID: 2083260545}
+  - component: {fileID: 2083260544}
+  - component: {fileID: 2083260546}
+  m_Layer: 5
+  m_Name: StartGameButtonPanel
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &2083260543
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2083260542}
+  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: 1587969356}
+  m_Father: {fileID: 1109971563}
+  m_RootOrder: 5
+  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: 1}
+--- !u!114 &2083260544
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2083260542}
+  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_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
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &2083260545
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2083260542}
+  m_CullTransparentMesh: 0
+--- !u!114 &2083260546
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2083260542}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Padding:
+    m_Left: 200
+    m_Right: 200
+    m_Top: 10
+    m_Bottom: 10
+  m_ChildAlignment: 4
+  m_Spacing: 0
+  m_ChildForceExpandWidth: 1
+  m_ChildForceExpandHeight: 1
+  m_ChildControlWidth: 1
+  m_ChildControlHeight: 1
+  m_ChildScaleWidth: 0
+  m_ChildScaleHeight: 0
 --- !u!1 &2085075635
 GameObject:
   m_ObjectHideFlags: 0
@@ -11942,13 +12290,13 @@ MonoBehaviour:
   m_TargetGraphic: {fileID: 2113556741}
   m_TextComponent: {fileID: 1033898484}
   m_Placeholder: {fileID: 159193846}
-  m_ContentType: 0
+  m_ContentType: 4
   m_InputType: 0
   m_AsteriskChar: 42
-  m_KeyboardType: 0
+  m_KeyboardType: 1
   m_LineType: 0
   m_HideMobileInput: 0
-  m_CharacterValidation: 0
+  m_CharacterValidation: 3
   m_CharacterLimit: 0
   m_OnEndEdit:
     m_PersistentCalls:

+ 29 - 11
Assets/Prefab/InviteSearchResult.prefab

@@ -46,7 +46,7 @@ MonoBehaviour:
   m_GameObject: {fileID: 263645073092090044}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 2109663825, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
   m_Navigation:
@@ -83,8 +83,8 @@ MonoBehaviour:
   onValueChanged:
     m_PersistentCalls:
       m_Calls: []
-    m_TypeName: UnityEngine.UI.Toggle+ToggleEvent, UnityEngine.UI, Version=1.0.0.0,
-      Culture=neutral, PublicKeyToken=null
+    m_TypeName: UnityEngine.UI.Toggle+ToggleEvent, Unity.ugui, Version=1.0.0.0, Culture=neutral,
+      PublicKeyToken=null
   m_IsOn: 0
 --- !u!1 &263645073784785556
 GameObject:
@@ -140,7 +140,7 @@ MonoBehaviour:
   m_GameObject: {fileID: 263645073784785556}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
@@ -149,7 +149,7 @@ MonoBehaviour:
   m_OnCullStateChanged:
     m_PersistentCalls:
       m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+    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}
@@ -220,7 +220,7 @@ MonoBehaviour:
   m_GameObject: {fileID: 263645073850737808}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
@@ -229,7 +229,7 @@ MonoBehaviour:
   m_OnCullStateChanged:
     m_PersistentCalls:
       m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, Unity.ugui,
       Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
   m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
   m_Type: 1
@@ -240,6 +240,7 @@ MonoBehaviour:
   m_FillClockwise: 1
   m_FillOrigin: 0
   m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
 --- !u!1 &263645073911821523
 GameObject:
   m_ObjectHideFlags: 0
@@ -251,6 +252,7 @@ GameObject:
   - component: {fileID: 263645073911821520}
   - component: {fileID: 263645073911821526}
   - component: {fileID: 263645073911821521}
+  - component: {fileID: 7144088510451534092}
   m_Layer: 5
   m_Name: InviteSearchResult
   m_TagString: Untagged
@@ -296,7 +298,7 @@ MonoBehaviour:
   m_GameObject: {fileID: 263645073911821523}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
@@ -305,7 +307,7 @@ MonoBehaviour:
   m_OnCullStateChanged:
     m_PersistentCalls:
       m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+    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
@@ -316,6 +318,21 @@ MonoBehaviour:
   m_FillClockwise: 1
   m_FillOrigin: 0
   m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!114 &7144088510451534092
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 263645073911821523}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 516177c7b31dc424d99ba9a29827d734, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  userNameText: {fileID: 263645073784785562}
+  shouldInvite: {fileID: 263645073092089922}
 --- !u!1 &263645074332100305
 GameObject:
   m_ObjectHideFlags: 0
@@ -370,7 +387,7 @@ MonoBehaviour:
   m_GameObject: {fileID: 263645074332100305}
   m_Enabled: 1
   m_EditorHideFlags: 0
-  m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
@@ -379,7 +396,7 @@ MonoBehaviour:
   m_OnCullStateChanged:
     m_PersistentCalls:
       m_Calls: []
-    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
+    m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, Unity.ugui,
       Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
   m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
   m_Type: 0
@@ -390,3 +407,4 @@ MonoBehaviour:
   m_FillClockwise: 1
   m_FillOrigin: 0
   m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1

+ 6 - 8
Assets/Scripts/CategoryPanel.cs

@@ -19,12 +19,13 @@ public class CategoryPanel : MonoBehaviour
     // Start is called before the first frame update
     void Start()
     {
-        gms = GameObject.Find("GameManager").GetComponent<GameManagerScript>();
-        categories = gms.GetDatabase().GetCategories();
         PopulatePanel();
     }
 
     private void PopulatePanel() {
+        if (categories == null) {
+            categories = Database.Instance.GetCategories();
+        }
         foreach (Category cat in categories) {
             AddText(cat.name, cat.color);
         }
@@ -42,16 +43,13 @@ public class CategoryPanel : MonoBehaviour
         newText.resizeTextMaxSize = 18;
         newText.resizeTextMinSize = 8;
 
-        /*
-        LayoutElement le = go.AddComponent<LayoutElement>();
-        le.preferredHeight = 20f;
-        le.minHeight = 10f;
-        */
-
         newText.alignment = TextAnchor.MiddleCenter;
     }
 
     public Category GetCategoryById(int id) {
+        if (categories == null) {
+            categories = Database.Instance.GetCategories();
+        }
         foreach (Category cat in categories) {
             if (cat.id == id) {
                 return cat;

+ 64 - 25
Assets/Scripts/Database.cs

@@ -9,6 +9,7 @@ using System.IO;
 
 public class Database : MonoBehaviour {
     private const string onlineQuestionsUrl = "nordh.xyz/narKampen/dbFiles/Question.php";
+    private const string serverUrl = "nordh.xyz/narKampen/dbFiles/";
     string connectionType;
     string databaseUrl;
     string gameMode;
@@ -17,8 +18,16 @@ public class Database : MonoBehaviour {
 
     public GameObject questionCardPrefab;
 
+    private static Database instance;
+    public static Database Instance {  get { return instance; } }
+
     IDbConnection conn;
 
+    private void Awake() {
+        if (instance == null) {
+            instance = this;
+        }
+    }
 
     internal List<CategoryPanel.Category> GetCategories() {
         List<CategoryPanel.Category> list = new List<CategoryPanel.Category>();
@@ -45,6 +54,39 @@ public class Database : MonoBehaviour {
         return list;
     }
 
+    internal void SetupNewOnlineGame(int limitPerQuestion, int limitPerPlayer, int toWin, List<InviteSearchResult> inviteUsers) {
+        List<int> playerIds = new List<int>();
+        inviteUsers.ForEach(i => playerIds.Add(i.GetId()));
+        playerIds.Add(PlayerPrefs.GetInt("UserId"));
+
+        string sql = "INSERT INTO game(" +
+            "gameMode, " +
+            "winNumber, " +
+            "answerTimer, " +
+            "roundTimeLimit, " +
+            "numberOfPlayers, " +
+            "currentPlayer, " +
+            "round, " +
+            "startedDate) " +
+            "VALUES (" +
+            "'Online', " +
+            ""+toWin+", " +
+            ""+limitPerQuestion+", " +
+            ""+limitPerPlayer+", " +
+            ""+inviteUsers.Count+", " +
+            "(SELECT username FROM users WHERE id IN (" + String.Join(",",playerIds) + ") ORDER BY RAND() LIMIT 1), " +
+            "1, " +
+            "NOW())";
+
+        var form = new WWWForm();
+        form.AddField("winNumber", toWin);
+        form.AddField("limitPerQuestion", limitPerQuestion);
+        form.AddField("limitPerPlayer", limitPerPlayer);
+        form.AddField("playerIds", String.Join(",", playerIds));
+
+        CallDatabase("NewOnlineGame.php", form);
+    }
+
     [Serializable]
     public class Question {
         public string question;
@@ -60,13 +102,20 @@ public class Database : MonoBehaviour {
 
     [Serializable]
     public class UserName {
-        public int id;
-        public string name;
+        public string id;
+        public string username;
     }
 
     [Serializable]
     public class UserNames {
-        public List<UserName> userNamesList = new List<UserName>();
+        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();
     }
 
     internal void SetLastPlayedDate(int gameId) {
@@ -165,7 +214,7 @@ public class Database : MonoBehaviour {
                 lgs.Round = reader.GetInt32(6).ToString();
                 lgs.StartDate = reader.GetString(7);
                 lgs.LastPlayedDate = reader.GetString(8);
-                lgs.FinishedDate = reader.GetString(9);
+                lgs.FinishedDate = reader.IsDBNull(9)?"":reader.GetString(9);
 
                 currentPlayerName = reader.GetString(10);
                 currentPoints = GetPlayerPoints(reader.GetInt32(0), currentPlayerName);
@@ -617,37 +666,27 @@ public class Database : MonoBehaviour {
         }
     }
 
-    public List<InviteSearchResult> GetUsersToInvite(string searchString) {
-        SearchString = searchString;
-        List<InviteSearchResult> result = new List<InviteSearchResult>();
-
-        StartCoroutine(GetUsersToInvite());
-
-        return result;
-    }
-
-    private IEnumerator GetUsersToInvite() {
+    public List<UserName> GetUsersToInvite(string searchString) {
         string postUrl = "nordh.xyz/narKampen/dbFiles/PlayerSearch.php?";
-        postUrl += "search=" + UnityWebRequest.EscapeURL(SearchString);
+        postUrl += "search=" + UnityWebRequest.EscapeURL(searchString);
 
-        UnityWebRequest www = UnityWebRequest.Get(postUrl);
 
-        yield return www.SendWebRequest();
+        UserNames uNames = new UserNames();
+        UnityWebRequest www = UnityWebRequest.Get(postUrl);
+        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 = "{\"userNamesList\" : [" + jsonData + " ]}";
-
-            UserNames un = new UserNames();
-            JsonUtility.FromJsonOverwrite(jsonData, un);
-
-            yield return un.userNamesList;
-        } 
+            jsonData = "{\"usernamesList\" : [ " + jsonData + " ]}";
+            JsonUtility.FromJsonOverwrite(jsonData, uNames);
+        }
+        // TODO handle empty
+        return uNames.usernamesList;
     }
+    
 }

+ 1 - 7
Assets/Scripts/GameManagerScript.cs

@@ -17,7 +17,7 @@ public class GameManagerScript : MonoBehaviour {
     List<KeyValuePair<string, int>> players;
     // Start is called before the first frame update
     void Start() {
-        db = GameObject.Find("GameManager").GetComponent<Database>();
+        db = Database.Instance;
         GameId = PlayerPrefs.GetInt("GameId");
 
         db.SetLocalOrOnline("Local");
@@ -46,10 +46,4 @@ public class GameManagerScript : MonoBehaviour {
         return players;
     }
 
-    public Database GetDatabase() {
-        if (db == null) {
-            db = GameObject.Find("GameManager").GetComponent<Database>();
-        }
-        return db;
-    }
 }

+ 78 - 9
Assets/Scripts/InvitePanelScript.cs

@@ -4,38 +4,42 @@ using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
 
-public class InvitePanelScript : MonoBehaviour
-{
+public class InvitePanelScript : MonoBehaviour {
     public Button closeButton;
     public Button searchButton;
+    public Button doneButton;
 
     public InputField searchField;
 
     public GameObject inviteSearchResultPrefab;
 
+    public GameObject searchResultPanel;
+
     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()
-    {
+    void Start() {
+        closeButton.onClick.AddListener(HidePanel);
+        doneButton.onClick.AddListener(HidePanel);
+        searchButton.onClick.AddListener(CallInviteFunction);
     }
 
     // Update is called once per frame
-    void Update()
-    {
+    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) {
-            // toDo auto search
-            searchActive = false;
-        } else if (!searchActive) {
+            CallInviteFunction();
+        } else if (!searchActive && !searchField.text.Equals(searchedString)) {
             searchActive = true;
             autoSearchTime = Time.time + autoSearchWait;
             searchButton.interactable = true;
@@ -43,6 +47,71 @@ public class InvitePanelScript : MonoBehaviour
         }
     }
 
+    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<Database.UserName> foundUsers = Database.Instance.GetUsersToInvite(searchField.text);
+        InviteSearchResult[] added = searchResultPanel.GetComponentsInChildren<InviteSearchResult>();
+        foreach (Database.UserName un in foundUsers) {
+            if (PlayerPrefs.GetInt("UserId").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.transform.SetParent(searchResultPanel.transform, false);
+            }
+        }
+    }
+
     internal void ShowPanel() {
         CanvasGroup cg = this.GetComponent<CanvasGroup>();
         cg.alpha = 1f;

+ 29 - 9
Assets/Scripts/InviteSearchResult.cs

@@ -1,18 +1,38 @@
-using System.Collections;
+using System;
+using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
+using UnityEngine.UI;
 
 public class InviteSearchResult : MonoBehaviour
 {
-    // Start is called before the first frame update
-    void Start()
-    {
-        
+    public Text userNameText;
+    public Toggle shouldInvite;
+
+    private int id;
+
+    internal void SetName(string name) {
+        userNameText.text = name;
+    }
+
+    public bool ShouldInvite() {
+        return shouldInvite.isOn;
+    }
+
+    internal void SetId(int id) {
+        this.id = id;
+    }
+
+    internal void SetId(string id) {
+        Int32.TryParse(id, out int result);
+        this.id = result;
+    }
+
+    internal string GetName() {
+        return userNameText.text;
     }
 
-    // Update is called once per frame
-    void Update()
-    {
-        
+    internal int GetId() {
+        return id;
     }
 }

+ 1 - 4
Assets/Scripts/LocalGameScript.cs

@@ -48,12 +48,9 @@ public class LocalGameScript : MonoBehaviour
   
     public List<KeyValuePair<string, int>> Players { get => players; set => players = value; }
 
-    private Database db;
-
     private void Start() {
         startButton.onClick.AddListener(StartThisGame);
         deleteButton.onClick.AddListener(DeleteThisGame);
-        db = GameObject.Find("Main Panel").GetComponent<Database>();
     }
 
     public void AddPlayer(string name, int points) {
@@ -83,7 +80,7 @@ public class LocalGameScript : MonoBehaviour
         dialog.SetTitle(LANG.GetText("REMOVE_GAME_TITLE_KEY"));
         dialog.SetMessage(LANG.GetText("REMOVE_GAME_MESSAGE_KEY"));
         dialog.SetOnAccept(LANG.GetText("YES"),() => {
-            db.RemoveGame(gameId);
+            Database.Instance.RemoveGame(gameId);
             Destroy(this);
             Destroy(this.gameObject);
             dialog.Hide();

+ 6 - 2
Assets/Scripts/Localization/ButtonLocalization.cs

@@ -10,10 +10,14 @@ public class ButtonLocalization : MonoBehaviour
     void Start() {
         // Get the string value from localization manager from key 
         // and set the text component text value to the  returned string value 
-        GetComponent<Button>().GetComponentInChildren<Text>().text = LocalizationManager.Instance.GetText(key);
+        string text = LocalizationManager.Instance.GetText(key);
+        text = text.Replace("\\n", Environment.NewLine);
+        GetComponent<Button>().GetComponentInChildren<Text>().text = text;
     }
 
     internal void UpdateText() {
-        GetComponent<Button>().GetComponentInChildren<Text>().text = LocalizationManager.Instance.GetText(key);
+        string text = LocalizationManager.Instance.GetText(key);
+        text = text.Replace("\\n", Environment.NewLine);
+        GetComponent<Button>().GetComponentInChildren<Text>().text = text;
     }
 }

+ 6 - 2
Assets/Scripts/Localization/InputFieldLocalization.cs

@@ -10,10 +10,14 @@ public class InputFieldLocalization : MonoBehaviour
     void Start() {
         // Get the string value from localization manager from key 
         // and set the text component text value to the  returned string value 
-        GetComponent < InputField > ().placeholder.GetComponent<Text>().text = LocalizationManager.Instance.GetText(key);
+        string text = LocalizationManager.Instance.GetText(key);
+        text = text.Replace("\\n", Environment.NewLine);
+        GetComponent < InputField > ().placeholder.GetComponent<Text>().text = text;
     }
 
     internal void UpdateText() {
-        GetComponent<InputField>().placeholder.GetComponent<Text>().text = LocalizationManager.Instance.GetText(key);
+        string text = LocalizationManager.Instance.GetText(key);
+        text = text.Replace("\\n", Environment.NewLine);
+        GetComponent<InputField>().placeholder.GetComponent<Text>().text = text;
     }
 }

+ 7 - 2
Assets/Scripts/Localization/TextLocalization.cs

@@ -1,5 +1,6 @@
 using UnityEngine;
 using UnityEngine.UI;
+using System;
 
 [RequireComponent(typeof(Text))]
 public class TextLocalization : MonoBehaviour
@@ -9,10 +10,14 @@ public class TextLocalization : MonoBehaviour
     void Start() {
         // Get the string value from localization manager from key 
         // and set the text component text value to the  returned string value 
-        GetComponent<Text>().text = LocalizationManager.Instance.GetText(key);
+        string text = LocalizationManager.Instance.GetText(key);
+        text = text.Replace("\\n", Environment.NewLine);
+        GetComponent<Text>().text = text;
     }
 
     public void UpdateText() {
-        GetComponent<Text>().text = LocalizationManager.Instance.GetText(key);
+        string text = LocalizationManager.Instance.GetText(key);
+        text = text.Replace("\\n", Environment.NewLine);
+        GetComponent<Text>().text = text;
     }
 }

+ 5 - 11
Assets/Scripts/MainMenu.cs

@@ -23,8 +23,6 @@ public class MainMenu : MonoBehaviour {
     public GameObject onlineGamePrefab;
     public GameObject finishedGamePrefab;
 
-    private Database db;
-
     private readonly string gamesPostUrl = "nordh.xyz/narKampen/dbFiles/Games.php?";
 
     private void Start() {
@@ -36,16 +34,13 @@ public class MainMenu : MonoBehaviour {
         gameTypeSlider.onValueChanged.AddListener(SliderChoice);
         localPlayers.onValueChanged.AddListener(LocalPlayersAction);
         startLocalGameButton.onClick.AddListener(StartLocalGame);
-        
-
-        db = GameObject.Find("Main Panel").GetComponent<Database>();
 
         GetGames();
     }
 
     private void GetGames() {
         int loggedInUserId = PlayerPrefs.GetInt("UserId");
-        List<LocalGameScript> localGames = db.GetLocalGames(localGamePrefab);
+        List<LocalGameScript> localGames = Database.Instance.GetLocalGames(localGamePrefab);
         Transform localGamesList = GameObject.Find("LocalGamesList").transform;
         Transform finishedGamesList = GameObject.Find("FinishedGamesList").transform;
 
@@ -63,7 +58,7 @@ public class MainMenu : MonoBehaviour {
 
         }
         if (checkInternetConnection()) {
-            db.GetOnlineGames(loggedInUserId);
+            Database.Instance.GetOnlineGames(loggedInUserId);
         } else {
             // Display no internet information
             Debug.Log("No internet");
@@ -201,8 +196,7 @@ public class MainMenu : MonoBehaviour {
     }
 
     private void StartLocalGame() {
-        db = GameObject.Find("Main Panel").GetComponent<Database>();
-        db.SetLocalOrOnline("Local");
+        Database.Instance.SetLocalOrOnline("Local");
         List<string> playerNames = new List<string>();
 
         if (!Int32.TryParse(winningCountInputField.text, out int winningCount)) {
@@ -215,7 +209,7 @@ public class MainMenu : MonoBehaviour {
             questionTimer = 20;
         }
 
-        int gameId = db.SetupNewLocalGame(winningCount, players, questionTimer);
+        int gameId = Database.Instance.SetupNewLocalGame(winningCount, players, questionTimer);
 
         Transform settingsPanel = GameObject.Find("PlayerSettingsPanel").transform;
         PlayerSetting[] playerSettings = settingsPanel.GetComponentsInChildren<PlayerSetting>();
@@ -225,7 +219,7 @@ public class MainMenu : MonoBehaviour {
             playerNames.Add(playerName);
         }
 
-        db.LinkPlayersToLocalGame(playerNames, gameId);
+        Database.Instance.LinkPlayersToLocalGame(playerNames, gameId);
  
         PlayerPrefs.SetInt("GameId", gameId);
         SceneManager.LoadSceneAsync("narKampen");

+ 45 - 6
Assets/Scripts/NewOnlineGame.cs

@@ -1,6 +1,6 @@
 using System;
-using System.Collections;
 using System.Collections.Generic;
+using System.Text.RegularExpressions;
 using UnityEngine;
 using UnityEngine.UI;
 
@@ -14,19 +14,58 @@ public class NewOnlineGame : MonoBehaviour
     public InputField timeLimitPerQuestion;
     public InputField timeLimitPerPlayer;
 
+    Text invitedCountText;
+    InvitePanelScript ips;
+
     // Start is called before the first frame update
     void Start()
     {
         inviteButton.onClick.AddListener(OpenInvitePanel);
+        startButton.onClick.AddListener(StartNewGame);
+        invitedCountText = GameObject.Find("InvitedCountText").GetComponent<Text>();
     }
 
-    private void OpenInvitePanel() {
-        GameObject.Find("InvitePanel").GetComponent<InvitePanelScript>().ShowPanel();
+    private void Update() {
+        if (ips == null) {
+            ips = GameObject.Find("InvitePanel").GetComponent<InvitePanelScript>();
+        }
+
+        if (ips.AreThereInvites()) {
+            invitedCountText.GetComponent<CanvasGroup>().alpha = 1f;
+            string text = LocalizationManager.Instance.GetText("INVITE_COUNT_TEXT");
+            int invitedCount = ips.InvitedCount();
+            text = String.Format(text, invitedCount.ToString());
+            invitedCountText.text = text;
+            startButton.interactable = true;
+        }
     }
 
-    // Update is called once per frame
-    void Update()
-    {
+    private void StartNewGame() {
+        // Collect all information for new game;
+        // Send to Database;
+        int timeLimitQuestion = GetInputFieldValue(timeLimitPerQuestion);
+        int timeLimitPlayer = GetInputFieldValue(timeLimitPerPlayer);
+        int correctToWin = GetInputFieldValue(correctAnswersToWin);
+        List<InviteSearchResult> inviteUsers = ips.GetSelectedUsersForInvite();
+        Database.Instance.SetupNewOnlineGame(timeLimitQuestion, timeLimitPlayer, correctToWin, inviteUsers);
         
+        // Reload Online Games panel, new prefab Online game pending.
+    }
+
+    private int GetInputFieldValue(InputField inputField) {
+        int returnValue = 0;
+        if (inputField.text.Equals("")) {
+            string text = Regex.Match(inputField.placeholder.GetComponent<Text>().text, @"\d+").Value;
+            Int32.TryParse(text, out returnValue);
+        } else {
+            string text = Regex.Match(inputField.text, @"\d+").Value;
+            Int32.TryParse(text, out returnValue);
+        }
+
+        return returnValue;
+    }
+
+    private void OpenInvitePanel() {
+        GameObject.Find("InvitePanel").GetComponent<InvitePanelScript>().ShowPanel();
     }
 }

+ 1 - 2
Assets/Scripts/RoundButtonsScript.cs

@@ -46,8 +46,7 @@ public class RoundButtonsScript : MonoBehaviour
         if (svs == null) {
             svs = GameObject.Find("Scroll View").GetComponent<ScrollViewScript>();
         }
-        Database db = GameObject.Find("GameManager").GetComponent<Database>();
-        NewQuestion q = db.GetNewQuestion(svs.GetQuestionIdsInAnswerLine(), svs.currentPlayer);
+        NewQuestion q = Database.Instance.GetNewQuestion(svs.GetQuestionIdsInAnswerLine(), svs.currentPlayer);
         q.SetAnswerText("???? - ????");
         svs.SetNewQuestion(q);
 

+ 10 - 12
Assets/Scripts/ScrollViewScript.cs

@@ -18,7 +18,6 @@ public class ScrollViewScript : MonoBehaviour, IDropHandler {
     private int gameId;
 
     StatsScript statsScript;
-    Database db;
     GameManagerScript gameManagerScript;
     TimerScript ts;
 
@@ -31,7 +30,6 @@ public class ScrollViewScript : MonoBehaviour, IDropHandler {
     // Start is called before the first frame update
     void Start() {
         statsScript = GameObject.Find("StatsPanel").GetComponent<StatsScript>();
-        db = GameObject.Find("GameManager").GetComponent<Database>();
         gameManagerScript = GameObject.Find("GameManager").GetComponent<GameManagerScript>();
         ts = GameObject.Find("TimerCircle").GetComponent<TimerScript>();
 
@@ -39,17 +37,17 @@ public class ScrollViewScript : MonoBehaviour, IDropHandler {
 
         EventManager.StartListening("TimerEvent", TimerRunOutEvent);
         gameId = gameManagerScript.GameId;
-        currentPlayer = db.GetCurrentPlayer(gameId);
+        currentPlayer = Database.Instance.GetCurrentPlayer(gameId);
 
         ips = GameObject.Find("InformationPanel").GetComponent<InformationPanelScript>();
         ips.SetCurrentPlayer(currentPlayer);
 
         statsScript.MakeBold(currentPlayer);
 
-        List<QuestionCard> answerlineQuestions = db.GetPlayerQuestions(gameId, currentPlayer);
+        List<QuestionCard> answerlineQuestions = Database.Instance.GetPlayerQuestions(gameId, currentPlayer);
         SetQuestionsInAnswerLine(answerlineQuestions);
 
-        statsScript.SetQuestionsLost(db.GetQuestionsLost(gameId, currentPlayer));
+        statsScript.SetQuestionsLost(Database.Instance.GetQuestionsLost(gameId, currentPlayer));
         ShowRoundButtons(false);
     }
 
@@ -183,16 +181,16 @@ public class ScrollViewScript : MonoBehaviour, IDropHandler {
     }
 
     private void CheckWin() {
-        if (db.GetWinCondition(gameId) <= contentPanel.childCount) {
+        if (Database.Instance.GetWinCondition(gameId) <= contentPanel.childCount) {
 
             GenericDialog dialog = GenericDialog.Instance();
             dialog.title.text = LANG.GetText("WINNER_DIALOG_TITLE");
             string message = LANG.GetText("WINNER_DIALOG_MESSAGE");
-            dialog.message.text = String.Format(message, db.GetWinCondition(gameId), statsScript.GetQuestionsLost(), statsScript.GetRound());
+            dialog.message.text = String.Format(message, Database.Instance.GetWinCondition(gameId), statsScript.GetQuestionsLost(), statsScript.GetRound());
             dialog.SetOnAccept(LANG.GetText("WINNER_DIALOG_BUTTON"), () => {
                 dialog.Hide();
                 SetAllQuestionsLocked(true);
-                db.SetFinishedDate(gameId, DateTime.Today.ToShortDateString());
+                Database.Instance.SetFinishedDate(gameId, DateTime.Today.ToShortDateString());
                 GameObject.Find("NewQuestionButtonPanel").GetComponent<RoundButtonsScript>().SetGameOver();
             });
             dialog.SetOnDecline("", () => { });
@@ -288,7 +286,7 @@ public class ScrollViewScript : MonoBehaviour, IDropHandler {
         dialog.SetTitle(LANG.GetText("TIMER_DIALOG_TITLE"));
         dialog.SetMessage(String.Format(message, GetUnlockedQuestionCount()));
         dialog.SetOnAccept(LANG.GetText("OK"), () => {
-            if (db.GetGameMode(gameId).Equals("Local")) {
+            if (Database.Instance.GetGameMode(gameId).Equals("Local")) {
                 RemoveUnlockedQuestions();
                 ts.ResetTimer();
                 dialog.Hide();
@@ -322,13 +320,13 @@ public class ScrollViewScript : MonoBehaviour, IDropHandler {
         dialog.SetMessage(String.Format(message, currentPlayer));
         dialog.SetOnAccept(LANG.GetText("OK"), () => {
             RemoveAllQuestionsFromAnswerline();
-            List<QuestionCard> questions = db.GetPlayerQuestions(gameId, currentPlayer);
+            List<QuestionCard> questions = Database.Instance.GetPlayerQuestions(gameId, currentPlayer);
             SetQuestionsInAnswerLine(questions);
 
-            statsScript.SetQuestionsLost(db.GetQuestionsLost(gameManagerScript.GameId, currentPlayer));
+            statsScript.SetQuestionsLost(Database.Instance.GetQuestionsLost(gameManagerScript.GameId, currentPlayer));
 
             statsScript.MakeBold(currentPlayer);
-            db.SetCurrentPlayer(gameId, currentPlayer);
+            Database.Instance.SetCurrentPlayer(gameId, currentPlayer);
             ips.SetCurrentPlayer(currentPlayer);
             ResetNewQuestionPosition();
             ShowRoundButtons(false);

+ 3 - 3
Assets/Scripts/StatsScript.cs

@@ -21,13 +21,13 @@ public class StatsScript : MonoBehaviour {
         roundText = LocalizationManager.Instance.GetText("ROUND");
         questionsLostText = LocalizationManager.Instance.GetText("QUESTIONS_LOST");
         CreateStandardStats();
-        AddPlayersToStats(gms.GetPlayers());
+        AddPlayersToStats(Database.Instance.GetPlayersForGame(gms.GameId));
     }
 
     private void CreateStandardStats() {
         StatsLine round = CreateStatLine();
         round.SetStatName(roundText);
-        int roundValue = gms.GetDatabase().GetRoundValue(gms.GameId);
+        int roundValue = Database.Instance.GetRoundValue(gms.GameId);
 
         round.SetLocalizationKey("ROUND");
 
@@ -78,7 +78,7 @@ public class StatsScript : MonoBehaviour {
                 Int32.TryParse(sl.GetValue(), out int round);
                 round++;
                 sl.SetStatValue(round);
-                gms.GetDatabase().SetRoundValue(gms.GameId, round);
+                Database.Instance.SetRoundValue(gms.GameId, round);
                 break;
             }
         }

+ 2 - 9
Assets/Scripts/TimerScript.cs

@@ -19,21 +19,15 @@ public class TimerScript : MonoBehaviour
     Color finalColor = new Color32(130,0,16,220);
     Color startlColor = new Color32(16, 0, 255, 200);
 
-    Database db;
     GameManagerScript gms;
     TimerScript dialogTimer;
-    int gameId;
 
     // Start is called before the first frame update
     void Start()
     {
         dialogTimer = GameObject.Find("DialogTimerCircle").GetComponent<TimerScript>();
         gms = GameObject.Find("GameManager").GetComponent<GameManagerScript>();
-        db = gms.GetDatabase();
-        gameId = gms.GameId;
-        circleImage = this.GetComponent<Image>(); /*
-        time = db.GetQuestionTimer(gameId); 
-        timeAmount = time; */
+        circleImage = this.GetComponent<Image>();
         
         circleColor = circleImage.color;
 
@@ -45,8 +39,7 @@ public class TimerScript : MonoBehaviour
     }
 
     public void ResetTimer() {
-        gameId = gms.GameId;
-        time = db.GetQuestionTimer(gameId);
+        time = Database.Instance.GetQuestionTimer(gms.GameId);
         timeAmount = time;
         circleColor = Color.Lerp(startlColor, finalColor, 1 - (time / timeAmount));
 

+ 4 - 3
Assets/Translations/ENGLISH.xml

@@ -26,7 +26,7 @@
   <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">Time to start round (auto forfit round if timer runs out)</text>
+  <text key="TIME_TO_START_ROUND">Time to start round\n(auto forfit round if timer runs out)</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>
@@ -47,7 +47,7 @@
   <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">Next player</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>
@@ -61,6 +61,7 @@
   <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_DIALOG_BUTTON">Send invites</text>
+  <text key="INVITE_PANEL_DIALOG_BUTTON">Done</text>
+  <text key="INVITE_COUNT_TEXT">Invite {0} players</text>
   <text key="NEED_MORE_INPUT">More input needed</text>
 </Language>

+ 4 - 3
Assets/Translations/SWEDISH.xml

@@ -26,7 +26,7 @@
   <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">Tid för att starta sin runda (automatiskt förlorad runda om man går över tiden)</text>
+  <text key="TIME_TO_START_ROUND">Tid för att starta sin runda\n(automatiskt förlorad runda om man går över tiden)</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>
@@ -47,7 +47,7 @@
   <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">Nästa spelare</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>
@@ -62,6 +62,7 @@
   <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_DIALOG_BUTTON">Skicka inbjudningar</text>
+  <text key="INVITE_PANEL_DIALOG_BUTTON">Färdig</text>
+  <text key="INVITE_COUNT_TEXT">Bjud in {0} spelare</text>
   <text key="NEED_MORE_INPUT">Skriv in fler tecken</text>
 </Language>

BIN
Assets/narKampenLocal.db


+ 46 - 0
dbFiles/NewOnlineGame.php

@@ -0,0 +1,46 @@
+<?php
+	error_reporting( E_ALL );
+	$hostname = 'localhost';
+	$username = 'narKampen';
+	$pass = 'narKampenPassword';
+	$database = 'narKampen';
+
+	$conn = new mysqli($hostname, $username, $pass, $database);
+	
+	if (!$conn) {
+		die("Connection Failed. ". mysqli_connect_error());
+	}
+	mysqli_set_charset($conn,'utf8');
+	
+	$winNumber = $_POST['winNumber'];
+	$limitPerQuestion = $_POST['limitPerQuestion'];
+	$limitPerPlayer = $_POST['limitPerPlayer'];
+	$playerIds = $_POST['playerIds'];
+	
+	array playerIdsArray = explode(",",$playerIds);
+	
+	$sql = "INSERT INTO game(" .
+            "gameMode, " .
+            "winNumber, " .
+            "answerTimer, " .
+            "roundTimeLimit, " .
+            "numberOfPlayers, " .
+            "currentPlayer, " .
+            "round, " .
+            "startedDate) " .
+            "VALUES (" .
+            "'Online', " .
+            "$winNumber, " .
+            "$limitPerQuestion, " .
+            "$limitPerPlayer, " .
+            count($playerIdsArray) . ", " .
+            "(SELECT username 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;
+	}
+?>

+ 2 - 2
dbFiles/PlayerSearch.php

@@ -14,7 +14,7 @@
 	
 	$searchString = $conn->real_escape_string($_GET['search']);
 	
-	$sql = "SELECT id, name FROM users WHERE username LIKE '%$searchString%' LIMIT 20";
+	$sql = "SELECT id, username FROM users WHERE username LIKE '%$searchString%' LIMIT 20";
 	
 	$result = mysqli_query($conn, $sql);
 	
@@ -23,7 +23,7 @@
 	if (mysqli_num_rows($result) > 0) {
 		while ($row = mysqli_fetch_assoc($result)) {
 			$json += array('id' => $row['id'],
-				'usename' => $row['username'];
+				'username' => $row['username']);
 		}
 		$jsonString = json_encode($json);
 		echo $jsonString;