Save_Costume_Equip, Save_Costume_Buy

This commit is contained in:
Ino 2025-07-17 13:07:13 +09:00
parent 97d32dee18
commit 1b0e26d684
14 changed files with 1225 additions and 14 deletions

View File

@ -1,9 +1,11 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
using UnityEngine.Purchasing;
public class GetServerTables
{
@ -22,6 +24,7 @@ public class GetServerTables
Get_ServerTable("CollectionList", new List<string> { "e_FirstRewardType", "n_FirstRewardValue", "n_FirstRewardCount", "e_RepeatRewardType", "n_RepeatRewardValue", "n_RepeatRewardCount" });
Get_ServerTable("GachaConfig", new List<string> { "n_Title", "s_Banner" });
Get_ServerTable("BattleMapConfig", new List<string> { "s_Scene", "s_BGM", "n_MapName", "n_MapDesc", "s_MapIcon", "n_Portals" });
Get_ServerTable("CostumeList", new List<string> { "n_CostumeDesc", "s_Image", "s_Prefab", "exception" });
}
static void Get_ServerTable(string path, List<string> except)

View File

@ -1892,6 +1892,43 @@ handlers.Save_Gacha = function(args)
}
return Get_Return(1);
}
handlers.Save_Costume_Equip = function(args)
{
var readonlydata = Get_UserReadOnlyData();
var error = Get_Error(readonlydata, args.Token);
if (error < 0) return Get_Return(error);
var urod = Get_JsonUserData(readonlydata);
if (IsObtainItem(urod, args.CostumeID))
{
urod.Equip.Equip["PCCostume"] = args.CostumeID;
Set_JsonUserData(urod);
return Get_Return(0);
}
return Get_Return(1);
}
handlers.Save_Costume_Buy = function(args)
{
var readonlydata = Get_UserReadOnlyData();
var error = Get_Error(readonlydata, args.Token);
if (error < 0) return Get_Return(error);
var urod = Get_JsonUserData(readonlydata);
if (IsObtainItem(urod, args.CostumeID)) return Get_Return(2);
var costumeData = Get_CostumeTable().find(f=>f.n_CostumeID == args.CostumeID);
var table = Get_MissionTable();
if (Use_Item(table, urod, 1, costumeData.n_Price))
{
Add_Item(table, Get_ItemTable(), urod, args.CostumeID, 1);
Set_JsonUserData(urod);
return Get_Return(0);
}
return Get_Return(1);
}
/////////////////////////////////// 서버 처리
handlers.Write_UnityInApp = function(args)
@ -22209,6 +22246,195 @@ function Get_GachaRandomItemID(bagid, grade)
return lst[Math.floor(Math.random() * lst.length)].n_RewardID;
}
function Get_CostumeTable()
{
return [
{
"n_CostumeID": "110001",
"n_Price": "0"
},
{
"n_CostumeID": "110002",
"n_Price": "1000"
},
{
"n_CostumeID": "110003",
"n_Price": "2000"
},
{
"n_CostumeID": "110004",
"n_Price": "3000"
},
{
"n_CostumeID": "110005",
"n_Price": "4000"
},
{
"n_CostumeID": "110006",
"n_Price": "5000"
},
{
"n_CostumeID": "110007",
"n_Price": "6000"
},
{
"n_CostumeID": "110008",
"n_Price": "7000"
},
{
"n_CostumeID": "110009",
"n_Price": "8000"
},
{
"n_CostumeID": "110010",
"n_Price": "9000"
},
{
"n_CostumeID": "110011",
"n_Price": "10000"
},
{
"n_CostumeID": "110012",
"n_Price": "11000"
},
{
"n_CostumeID": "110013",
"n_Price": "12000"
},
{
"n_CostumeID": "110014",
"n_Price": "13000"
},
{
"n_CostumeID": "110015",
"n_Price": "14000"
},
{
"n_CostumeID": "110016",
"n_Price": "15000"
},
{
"n_CostumeID": "110017",
"n_Price": "16000"
},
{
"n_CostumeID": "110018",
"n_Price": "17000"
},
{
"n_CostumeID": "110019",
"n_Price": "18000"
},
{
"n_CostumeID": "110020",
"n_Price": "19000"
},
{
"n_CostumeID": "110021",
"n_Price": "20000"
},
{
"n_CostumeID": "110022",
"n_Price": "21000"
},
{
"n_CostumeID": "110023",
"n_Price": "22000"
},
{
"n_CostumeID": "110024",
"n_Price": "23000"
},
{
"n_CostumeID": "110025",
"n_Price": "24000"
},
{
"n_CostumeID": "110026",
"n_Price": "25000"
},
{
"n_CostumeID": "110027",
"n_Price": "26000"
},
{
"n_CostumeID": "110028",
"n_Price": "27000"
},
{
"n_CostumeID": "110029",
"n_Price": "28000"
},
{
"n_CostumeID": "110030",
"n_Price": "29000"
},
{
"n_CostumeID": "110031",
"n_Price": "30000"
},
{
"n_CostumeID": "110032",
"n_Price": "31000"
},
{
"n_CostumeID": "110033",
"n_Price": "32000"
},
{
"n_CostumeID": "110034",
"n_Price": "33000"
},
{
"n_CostumeID": "110035",
"n_Price": "34000"
},
{
"n_CostumeID": "110036",
"n_Price": "35000"
},
{
"n_CostumeID": "110037",
"n_Price": "36000"
},
{
"n_CostumeID": "110038",
"n_Price": "37000"
},
{
"n_CostumeID": "110039",
"n_Price": "38000"
},
{
"n_CostumeID": "110040",
"n_Price": "39000"
},
{
"n_CostumeID": "110041",
"n_Price": "40000"
},
{
"n_CostumeID": "110042",
"n_Price": "41000"
},
{
"n_CostumeID": "110043",
"n_Price": "42000"
},
{
"n_CostumeID": "110044",
"n_Price": "43000"
},
{
"n_CostumeID": "110045",
"n_Price": "44000"
},
{
"n_CostumeID": "110046",
"n_Price": "45000"
}
]
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,186 @@
[
{
"n_CostumeID": "110001",
"n_Price": "0"
},
{
"n_CostumeID": "110002",
"n_Price": "1000"
},
{
"n_CostumeID": "110003",
"n_Price": "2000"
},
{
"n_CostumeID": "110004",
"n_Price": "3000"
},
{
"n_CostumeID": "110005",
"n_Price": "4000"
},
{
"n_CostumeID": "110006",
"n_Price": "5000"
},
{
"n_CostumeID": "110007",
"n_Price": "6000"
},
{
"n_CostumeID": "110008",
"n_Price": "7000"
},
{
"n_CostumeID": "110009",
"n_Price": "8000"
},
{
"n_CostumeID": "110010",
"n_Price": "9000"
},
{
"n_CostumeID": "110011",
"n_Price": "10000"
},
{
"n_CostumeID": "110012",
"n_Price": "11000"
},
{
"n_CostumeID": "110013",
"n_Price": "12000"
},
{
"n_CostumeID": "110014",
"n_Price": "13000"
},
{
"n_CostumeID": "110015",
"n_Price": "14000"
},
{
"n_CostumeID": "110016",
"n_Price": "15000"
},
{
"n_CostumeID": "110017",
"n_Price": "16000"
},
{
"n_CostumeID": "110018",
"n_Price": "17000"
},
{
"n_CostumeID": "110019",
"n_Price": "18000"
},
{
"n_CostumeID": "110020",
"n_Price": "19000"
},
{
"n_CostumeID": "110021",
"n_Price": "20000"
},
{
"n_CostumeID": "110022",
"n_Price": "21000"
},
{
"n_CostumeID": "110023",
"n_Price": "22000"
},
{
"n_CostumeID": "110024",
"n_Price": "23000"
},
{
"n_CostumeID": "110025",
"n_Price": "24000"
},
{
"n_CostumeID": "110026",
"n_Price": "25000"
},
{
"n_CostumeID": "110027",
"n_Price": "26000"
},
{
"n_CostumeID": "110028",
"n_Price": "27000"
},
{
"n_CostumeID": "110029",
"n_Price": "28000"
},
{
"n_CostumeID": "110030",
"n_Price": "29000"
},
{
"n_CostumeID": "110031",
"n_Price": "30000"
},
{
"n_CostumeID": "110032",
"n_Price": "31000"
},
{
"n_CostumeID": "110033",
"n_Price": "32000"
},
{
"n_CostumeID": "110034",
"n_Price": "33000"
},
{
"n_CostumeID": "110035",
"n_Price": "34000"
},
{
"n_CostumeID": "110036",
"n_Price": "35000"
},
{
"n_CostumeID": "110037",
"n_Price": "36000"
},
{
"n_CostumeID": "110038",
"n_Price": "37000"
},
{
"n_CostumeID": "110039",
"n_Price": "38000"
},
{
"n_CostumeID": "110040",
"n_Price": "39000"
},
{
"n_CostumeID": "110041",
"n_Price": "40000"
},
{
"n_CostumeID": "110042",
"n_Price": "41000"
},
{
"n_CostumeID": "110043",
"n_Price": "42000"
},
{
"n_CostumeID": "110044",
"n_Price": "43000"
},
{
"n_CostumeID": "110045",
"n_Price": "44000"
},
{
"n_CostumeID": "110046",
"n_Price": "45000"
}
]

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 25e47b8dc9d1d544aa3c774c39ab9011
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -9738,6 +9738,140 @@ RectTransform:
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &736185933554103205
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2791034562087862168}
- component: {fileID: 4340033923767190882}
- component: {fileID: 608002140257487184}
m_Layer: 5
m_Name: t_price
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2791034562087862168
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 736185933554103205}
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_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 5202689086125664225}
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: -23.5}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4340033923767190882
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 736185933554103205}
m_CullTransparentMesh: 1
--- !u!114 &608002140257487184
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 736185933554103205}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 0
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: 0000
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: a387e325271126742ad15569dba1ac57, type: 2}
m_sharedMaterial: {fileID: 2100000, guid: 6d7cd7be388f7ca40a8ad4491be308b8, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 45
m_fontSizeBase: 45
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 15
m_fontSizeMax: 60
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 4096
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 0
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &741420952296660453
GameObject:
m_ObjectHideFlags: 0
@ -32233,6 +32367,153 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_localtextKey: 303
--- !u!1 &2024988815681611524
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5202689086125664225}
- component: {fileID: 7647447993069442153}
- component: {fileID: 6636631908317074563}
- component: {fileID: 831726277066072416}
- component: {fileID: 7105456797310009491}
m_Layer: 5
m_Name: btn_buy
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!224 &5202689086125664225
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2024988815681611524}
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_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1321866432843117700}
- {fileID: 2791034562087862168}
m_Father: {fileID: 3415427979677609742}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -316.1, y: -422.3}
m_SizeDelta: {x: 285, y: 105}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7647447993069442153
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2024988815681611524}
m_CullTransparentMesh: 1
--- !u!114 &6636631908317074563
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2024988815681611524}
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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 77e44864c82b7a34e9407d1195f0a75a, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &831726277066072416
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2024988815681611524}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 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: 6636631908317074563}
m_OnClick:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 6148198238594025402}
m_TargetAssemblyTypeName: PCCostumeListUI, Assembly-CSharp
m_MethodName: OnClick_Buy
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 &7105456797310009491
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2024988815681611524}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ab4e7dba3733e584abb76cd4fbc0e116, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &2026341214895516771
GameObject:
m_ObjectHideFlags: 0
@ -51782,7 +52063,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: 738.5, y: -221.1}
m_AnchoredPosition: {x: 738.5, y: -221.09961}
m_SizeDelta: {x: 150, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &871456757264936865
@ -83774,7 +84055,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: -321.95, y: 433.1}
m_AnchoredPosition: {x: -321.9502, y: 433.0996}
m_SizeDelta: {x: 614.44, y: 673}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &5767857205581933968
@ -86021,6 +86302,81 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &5678774852946120124
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1321866432843117700}
- component: {fileID: 6099251906919557582}
- component: {fileID: 1742781105218144763}
m_Layer: 5
m_Name: i_price
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1321866432843117700
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5678774852946120124}
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_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 5202689086125664225}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 18.2}
m_SizeDelta: {x: 42, y: 42}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6099251906919557582
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5678774852946120124}
m_CullTransparentMesh: 1
--- !u!114 &1742781105218144763
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5678774852946120124}
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: 0
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 4b13d794012042040ad11715eab24321, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &5679207674724077063
GameObject:
m_ObjectHideFlags: 0
@ -94556,6 +94912,152 @@ MonoBehaviour:
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &6301371811069244108
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1730387210098273990}
- component: {fileID: 2718215880306310104}
- component: {fileID: 320703632450432855}
- component: {fileID: 5143610399850561575}
- component: {fileID: 326181614417730467}
m_Layer: 5
m_Name: btn_equip
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!224 &1730387210098273990
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6301371811069244108}
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_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1362157743404672636}
m_Father: {fileID: 3415427979677609742}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -316.1, y: -422.3}
m_SizeDelta: {x: 285, y: 105}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2718215880306310104
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6301371811069244108}
m_CullTransparentMesh: 1
--- !u!114 &320703632450432855
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6301371811069244108}
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_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 77e44864c82b7a34e9407d1195f0a75a, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &5143610399850561575
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6301371811069244108}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 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: 320703632450432855}
m_OnClick:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 6148198238594025402}
m_TargetAssemblyTypeName: PCCostumeListUI, Assembly-CSharp
m_MethodName: OnClick_Equip
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 &326181614417730467
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6301371811069244108}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ab4e7dba3733e584abb76cd4fbc0e116, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &6302017031979375108
GameObject:
m_ObjectHideFlags: 0
@ -98818,7 +99320,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 877f10554c53afd48b9a9b8475296de7, type: 3}
m_Sprite: {fileID: 21300000, guid: d06754960d83d774da91fad6ea294bd8, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
@ -99364,6 +99866,8 @@ RectTransform:
m_Children:
- {fileID: 3627951339441080801}
- {fileID: 3773886731536508620}
- {fileID: 1730387210098273990}
- {fileID: 5202689086125664225}
m_Father: {fileID: 6460844286923185742}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0.5}
@ -99386,6 +99890,11 @@ MonoBehaviour:
m_ScrollRect: {fileID: 2221162753265016721}
m_Content: {fileID: 0}
go_card: {fileID: 504793552493326698, guid: e1e8bee41897c0e4a91c37b16a0df650, type: 3}
gos:
- {fileID: 6301371811069244108}
- {fileID: 2024988815681611524}
texts:
- {fileID: 608002140257487184}
--- !u!1 &6654041026865147712
GameObject:
m_ObjectHideFlags: 0
@ -114141,7 +114650,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: -320, y: 0}
m_AnchoredPosition: {x: -319.99902, y: 0}
m_SizeDelta: {x: -640, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &3254060577559155519
@ -117031,7 +117540,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: -320, y: -39.999996}
m_AnchoredPosition: {x: -319.99902, y: -40}
m_SizeDelta: {x: -640, y: -80.00001}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6064773442626399942
@ -121299,7 +121808,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: -320, y: 0}
m_AnchoredPosition: {x: -319.99902, y: 0}
m_SizeDelta: {x: -640, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1424124553350710443
@ -122722,7 +123231,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 267.8994, y: 85.1001}
m_AnchoredPosition: {x: 267.8994, y: 85.09961}
m_SizeDelta: {x: 484, y: 138}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2042892934335301115
@ -122745,6 +123254,154 @@ MonoBehaviour:
- {fileID: 7758511807854377785}
- {fileID: 3357183664336981520}
slider_exp: {fileID: 0}
--- !u!1 &8230900310431774305
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1362157743404672636}
- component: {fileID: 429910629761229969}
- component: {fileID: 864785724519341298}
- component: {fileID: 7155695076410307478}
m_Layer: 5
m_Name: btnName
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1362157743404672636
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8230900310431774305}
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_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1730387210098273990}
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!222 &429910629761229969
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8230900310431774305}
m_CullTransparentMesh: 1
--- !u!114 &864785724519341298
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8230900310431774305}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 0
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\uCF54\uC2A4\uD2AC \uBCC0\uACBD"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: a387e325271126742ad15569dba1ac57, type: 2}
m_sharedMaterial: {fileID: 2100000, guid: 6d7cd7be388f7ca40a8ad4491be308b8, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 45
m_fontSizeBase: 45
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 15
m_fontSizeMax: 60
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 4096
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 0
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!114 &7155695076410307478
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8230900310431774305}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c2aa95ff1b7adc044bd9372cf2958828, type: 3}
m_Name:
m_EditorClassIdentifier:
m_localtextKey: 341
--- !u!1 &8231692541320541403
GameObject:
m_ObjectHideFlags: 0
@ -154266,7 +154923,7 @@ PrefabInstance:
- target: {fileID: 384003431067609950, guid: ac29e59f046396945852e680e8d0ac29,
type: 3}
propertyPath: m_AnchoredPosition.y
value: -204.4
value: -204.40039
objectReference: {fileID: 0}
- target: {fileID: 384003431067609950, guid: ac29e59f046396945852e680e8d0ac29,
type: 3}

View File

@ -1999,9 +1999,7 @@ public partial class ServerData
case eItem.Skill: Add_Skill(id, (int)amount); break;
case eItem.PC:
PC.Add_PC(id);
break;
case eItem.PC: PC.Add_PC(id); break;
case eItem.Pet:
if (!Pet.ContainsKey(key))
Pet.Add(key, new List<ObscuredInt> { (int)amount - 1, 1 });

View File

@ -2048,6 +2048,78 @@ public class ServerInfo : MyCoroutine
Set_Coroutine(() => { Save_Gacha(id, count, _act); }, 2f);
});
}
public void Save_Costume_Equip(int id, Action _act)
{
NetWait.Ins.Set(true);
PlayFabClientAPI.ExecuteCloudScript(new ExecuteCloudScriptRequest
{
FunctionName = MethodBase.GetCurrentMethod().Name,
GeneratePlayStreamEvent = true,
FunctionParameter = new
{
Token = m_LoginInfo.EntityToken.EntityToken,
CostumeID = id,
}
},
result =>
{
if (result.Error == null)
{
NetWait.Ins.Set(false);
var str_result = result.FunctionResult.ToString();
var error = MyErrorCheck(str_result);
// (0 성공, 1 실패 (없는 코스튬))
switch (error)
{
case 0: _act?.Invoke(); break;
case 1: ToastUI.Ins.Set(999900032); break;
}
}
else
Set_Coroutine(() => { Save_Costume_Equip(id, _act); }, 2f);
},
fail =>
{
Set_Coroutine(() => { Save_Costume_Equip(id, _act); }, 2f);
});
}
public void Save_Costume_Buy(int id, Action _act)
{
NetWait.Ins.Set(true);
PlayFabClientAPI.ExecuteCloudScript(new ExecuteCloudScriptRequest
{
FunctionName = MethodBase.GetCurrentMethod().Name,
GeneratePlayStreamEvent = true,
FunctionParameter = new
{
Token = m_LoginInfo.EntityToken.EntityToken,
CostumeID = id,
}
},
result =>
{
if (result.Error == null)
{
NetWait.Ins.Set(false);
var str_result = result.FunctionResult.ToString();
var error = MyErrorCheck(str_result);
// (0 성공, 1 실패 (젬 부족), 2 실패 (이미 있는 코스튬))
switch (error)
{
case 0: _act?.Invoke(); break;
case 1: ToastUI.Ins.Set(388); break;
case 2: ToastUI.Ins.Set(999900033); break;
}
}
else
Set_Coroutine(() => { Save_Costume_Buy(id, _act); }, 2f);
},
fail =>
{
Set_Coroutine(() => { Save_Costume_Buy(id, _act); }, 2f);
});
}
#endregion
#region

View File

@ -13,6 +13,13 @@ public class CostumeListTableData : TableDataBase
set { _CostumeID = value; _CostumeID.RandomizeCryptoKey(); }
} // 클래스 ID
ObscuredInt _Price;
public int n_Price
{
get { return _Price; }
set { _Price = value; _Price.RandomizeCryptoKey(); }
} // 구매 가격
public int n_CostumeDesc;
public string s_Image, s_Prefab;

View File

@ -1,5 +1,11 @@
using TMPro;
using UnityEngine;
public class PCCostumeListUI : uScrollViewMgr
{
public GameObject[] gos; // 0 착용 버튼, 1 구매 버튼
public TextMeshProUGUI[] texts; // 0 구매 비용
public override void Set()
{
gameObject.SetActive(true);
@ -9,13 +15,58 @@ public class PCCostumeListUI : uScrollViewMgr
(list_CardBase[i] as PCInfoUI_CostumeCard).SelectCard_MyCostume();
}
public void Select_Costume(CardBase card)
{
var selectcard = PCInfoUI.Ins.m_PCInfoUI_Center.Get_SelectCard();
var costumeid = selectcard.Get_IntData();
var sdata = ServerInfo.Ins.m_ServerData;
if (sdata.IsEquip(eItem.PCCostume, costumeid))
DSUtil.InActivateGameObjects(gos);
else if (sdata.IsObtainItem(costumeid))
DSUtil.InActivateGameObjects(gos, 0);
else
{
DSUtil.InActivateGameObjects(gos, 1);
var costumeData = table_costumelist.Ins.Get_Data_orNull(costumeid);
texts[0].text = DSUtil.GetThousandCommaText(costumeData.n_Price);
}
}
public void OnClick_Buy()
{
var sdata = ServerInfo.Ins.m_ServerData;
var selectcard = PCInfoUI.Ins.m_PCInfoUI_Center.Get_SelectCard();
var costumeid = selectcard.Get_IntData();
var costumeData = table_costumelist.Ins.Get_Data_orNull(costumeid);
if (!sdata.IsObtainItem(costumeid) && sdata.Check_ItemAmount(1, costumeData.n_Price))
{
ServerInfo.Ins.Save_Costume_Buy(costumeid, () =>
{
sdata.Use_Item(1, costumeData.n_Price);
sdata.Add_Item(costumeid, 1);
PCInfoUI.Ins.Set_UI();
});
}
}
public void OnClick_Equip()
{
var sdata = ServerInfo.Ins.m_ServerData;
var selectcard = PCInfoUI.Ins.m_PCInfoUI_Center.Get_SelectCard();
var costumeid = selectcard.Get_IntData();
if (sdata.IsObtainItem(costumeid) && !sdata.IsEquip(eItem.PCCostume, costumeid))
{
ServerInfo.Ins.Save_Costume_Equip(costumeid, () =>
{
sdata.Equip.Set_Equip(eItem.PCCostume, costumeid);
PCInfoUI.Ins.Set_UI();
});
}
}
}

View File

@ -22,6 +22,8 @@ public class PCInfoUI_Center : UI3DModel
SelectCard = choiceCard;
SelectCard.Set_Selected(true);
PCInfoUI.Ins.m_PCInfoUI_List.m_PCCostumeListUI.Select_Costume(choiceCard);
if (!firstInit)
{
firstInit = true;
@ -57,4 +59,6 @@ public class PCInfoUI_Center : UI3DModel
sdata.Equip.Set_Equip(eItem.PCCostume, SelectCard.Get_IntData());
PCInfoUI.Ins.Set_UI();
}
public CardBase Get_SelectCard() { return SelectCard; }
}

View File

@ -26,7 +26,7 @@ public class PCInfoUI_CostumeCard : CardBase
images[2].sprite = UIAtlasMgr.Ins.Get_Sprite("label 5");
gos[0].SetActive(false);
}
else if (sdata.PC.IsObtainPC(m_Data.n_CostumeID))
else if (sdata.IsObtainItem(m_Data.n_CostumeID))
{ // 보유중
texts[0].text = table_localtext.Ins.Get_Text(402);
texts[0].color = textColor;