Closes #224 #227 Excel To Json, Time*Weather

This commit is contained in:
IDMhan 2024-04-03 14:09:36 +09:00
parent 15bf5ce8c6
commit 733cf4fd65
31 changed files with 2609 additions and 0 deletions

View File

@ -0,0 +1,190 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using ExcelDataReader;
using Newtonsoft.Json.Linq;
using UnityEditor;
using UnityEngine;
namespace _02.Scripts.Editor
{
public class DifferencePopup : EditorWindow
{
private List<Difference> differences;
private string selectedExcelFile;
private string jsonFolderPath;
private Vector2 scrollPosition;
private string excelFolderPath = "Assets/Resources/Excel";
public delegate void OnCloseHandler();
public event OnCloseHandler OnClose;
public static DifferencePopup ShowWindow(List<Difference> differences, string selectedExcelFile,
string jsonFolderPath)
{
DifferencePopup window = GetWindow<DifferencePopup>("비교창");
window.differences = differences;
window.selectedExcelFile = selectedExcelFile;
window.jsonFolderPath = jsonFolderPath;
return window;
}
private void OnGUI()
{
EditorGUILayout.LabelField("비교대상 : " + selectedExcelFile, EditorStyles.boldLabel);
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
foreach (var difference in differences)
{
EditorGUILayout.LabelField("속성: " + difference.PropertyName);
EditorGUILayout.LabelField("새로운 값: " + difference.NewValue);
EditorGUILayout.LabelField("기존의 값: " + difference.ExistingValue);
EditorGUILayout.Space();
}
EditorGUILayout.EndScrollView();
if (GUILayout.Button("저장"))
{
string excelPath = Path.Combine(excelFolderPath, selectedExcelFile + ".xlsx");
string jsonPath = Path.Combine(jsonFolderPath, selectedExcelFile + ".json");
try
{
JArray newArray = ExcelToJsonConverter.ConvertExcelToJsonArray(excelPath);
File.WriteAllText(jsonPath, newArray.ToString());
//EditorUtility.DisplayDialog("Success", "Changes saved successfully.", "OK");
ExcelToJsonConverter.toggleStates[selectedExcelFile] = false;
OnClose?.Invoke();
this.Close();
bool anyToggled = false;
foreach (var toggleState in ExcelToJsonConverter.toggleStates.Values)
{
if (toggleState)
{
anyToggled = true;
break;
}
}
if (anyToggled)
{
ExcelToJsonConverter.Instance.ProcessSelectedFiles();
}
}
catch (Exception e)
{
Debug.LogError($"저장에 실패했습니다: {e.Message}");
EditorUtility.DisplayDialog("실패", "저장에 실패했습니다. 콘솔을 확인해주세요.",
"확인");
}
}
if (GUILayout.Button("저장하지 않고 닫기"))
{
ExcelToJsonConverter.toggleStates[selectedExcelFile] = false;
OnClose?.Invoke();
this.Close();
bool anyToggled = false;
foreach (var toggleState in ExcelToJsonConverter.toggleStates.Values)
{
if (toggleState)
{
anyToggled = true;
break;
}
}
if (anyToggled)
{
ExcelToJsonConverter.Instance.ProcessSelectedFiles();
}
}
}
private void OnDestroy()
{
ExcelToJsonConverter.toggleStates[selectedExcelFile] = false;
OnClose?.Invoke();
}
// private JArray ConvertExcelToJsonArray(string excelPath)
// {
// FileStream stream = File.Open(excelPath, FileMode.Open, FileAccess.Read);
// IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//
// DataSet result = excelReader.AsDataSet(new ExcelDataSetConfiguration()
// {
// ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
// {
// UseHeaderRow = true
// }
// });
//
// stream.Close();
// DataTable table = result.Tables[0];
//
// JArray jsonArray = new JArray();
// foreach (DataRow row in table.Rows)
// {
// JObject obj = new JObject();
// foreach (DataColumn column in table.Columns)
// {
// string cellValue = row[column].ToString();
// if (float.TryParse(cellValue, out float floatResult))
// {
// if (floatResult % 1 == 0) // If the value is a whole number
// {
// obj[column.ColumnName] = Convert.ToInt32(floatResult);
// }
// else
// {
// obj[column.ColumnName] = floatResult;
// }
// }
// else if (IsString(cellValue))
// {
// obj[column.ColumnName] = cellValue;
// }
// else
// {
// obj[column.ColumnName] = cellValue;
// }
// }
//
// jsonArray.Add(obj);
// }
//
// return jsonArray;
// }
private bool IsString(string value)
{
return value.Any(c => !char.IsDigit(c));
}
public class Difference
{
public int Index { get; set; }
public string PropertyName { get; set; }
public string NewValue { get; set; }
public string ExistingValue { get; set; }
public Difference(string propertyName, string newValue, string existingValue, int index)
{
PropertyName = propertyName;
NewValue = newValue;
ExistingValue = existingValue;
Index = index;
}
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 974c0982732174a6bb82ac66de663c45

View File

@ -0,0 +1,319 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using ExcelDataReader;
using Newtonsoft.Json.Linq;
using UnityEditor;
using UnityEngine;
namespace _02.Scripts.Editor
{
public class ExcelToJsonConverter : EditorWindow
{
private readonly string excelFolderPath = "Assets/Resources/Excel";
private readonly string jsonFolderPath = "Assets/Resources/JSON";
public static Dictionary<string, bool> toggleStates;
private List<DifferencePopup.Difference> differences;
private bool showPopup = false;
private string selectedExcelFile;
public static ExcelToJsonConverter Instance { get; private set; }
private Vector2 scrollPosition;
[MenuItem("Tools/EXCEL TO JSON - BlueWater")]
public static void ShowWindow()
{
Instance = GetWindow<ExcelToJsonConverter>("EXCEL TO JSON");
}
private void OnEnable()
{
toggleStates = new Dictionary<string, bool>();
var excelFiles = Directory.GetFiles(excelFolderPath, "*.xlsx");
foreach (var excelFile in excelFiles)
{
toggleStates[Path.GetFileNameWithoutExtension(excelFile)] = false;
}
}
public void ProcessSelectedFiles()
{
List<DifferencePopup.Difference> currentDifferences = new List<DifferencePopup.Difference>();
bool differencesFound = false;
foreach (var excelFile in toggleStates.Keys)
{
if (toggleStates[excelFile])
{
string excelPath = Path.Combine(excelFolderPath, excelFile + ".xlsx");
string jsonPath = Path.Combine(jsonFolderPath, excelFile + ".json");
JArray newJsonArray = ConvertExcelToJsonArray(excelPath);
if (File.Exists(jsonPath))
{
JArray existingJsonArray = JArray.Parse(File.ReadAllText(jsonPath));
currentDifferences = CompareJsonObjects(newJsonArray, existingJsonArray);
if (currentDifferences.Count > 0)
{
selectedExcelFile = excelFile;
differences = currentDifferences;
showPopup = true;
differencesFound = true;
break;
}
}
else
{
File.WriteAllText(jsonPath, newJsonArray.ToString());
}
}
}
if (!differencesFound && !showPopup)
{
EditorUtility.DisplayDialog("달라진점이 없음",
"비교 대상인 새로운 엑셀 파일과 기존의 제이슨 파일에서 다른 점을 발견하지 못했습니다.", "확인");
}
}
private void OnGUI()
{
EditorGUILayout.LabelField("EXCEL TO JSON - Select & Compare", EditorStyles.boldLabel);
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
List<string> keys = new List<string>(toggleStates.Keys);
foreach (var excelFile in keys)
{
bool currentValue = toggleStates[excelFile];
bool newValue = EditorGUILayout.ToggleLeft(excelFile, currentValue);
if (currentValue != newValue)
{
toggleStates[excelFile] = newValue;
}
}
EditorGUILayout.EndScrollView();
if (GUILayout.Button("수정사항 체크"))
{
CheckModifiedToggles();
}
GUILayout.Space(10);
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("전체 해제"))
{
foreach (var excelFile in keys)
{
toggleStates[excelFile] = false;
}
}
if (GUILayout.Button("전체 선택"))
{
foreach (var excelFile in keys)
{
toggleStates[excelFile] = true;
}
}
EditorGUILayout.EndHorizontal();
GUILayout.Space(10);
if (GUILayout.Button("선택된 파일들 비교 및 병합"))
{
ProcessSelectedFiles();
}
if (showPopup)
{
DifferencePopup window = DifferencePopup.ShowWindow(differences, selectedExcelFile, jsonFolderPath);
window.OnClose += () => showPopup = false;
}
}
public void CheckModifiedToggles()
{
List<string> keysToCheck = new List<string>(toggleStates.Keys);
foreach (var excelFile in keysToCheck)
{
string excelPath = Path.Combine(excelFolderPath, excelFile + ".xlsx");
string jsonPath = Path.Combine(jsonFolderPath, excelFile + ".json");
if (File.Exists(jsonPath))
{
JArray newJsonArray = ConvertExcelToJsonArray(excelPath);
JArray existingJsonArray = JArray.Parse(File.ReadAllText(jsonPath));
List<DifferencePopup.Difference> currentDifferences =
CompareJsonObjects(newJsonArray, existingJsonArray);
if (currentDifferences.Count > 0)
{
toggleStates[excelFile] = true;
}
else
{
toggleStates[excelFile] = false;
}
}
}
}
public static JArray ConvertExcelToJsonArray(string excelPath)
{
FileStream stream = File.Open(excelPath, FileMode.Open, FileAccess.Read);
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
DataSet result = excelReader.AsDataSet(new ExcelDataSetConfiguration()
{
ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
{
UseHeaderRow = true
}
});
stream.Close();
DataTable table = result.Tables[0];
JArray jsonArray = new JArray();
foreach (DataRow row in table.Rows)
{
JObject obj = new JObject();
foreach (DataColumn column in table.Columns)
{
string cellValue = row[column].ToString();
if (float.TryParse(cellValue, out float floatResult))
{
if (floatResult % 1 == 0)
{
obj[column.ColumnName] = Convert.ToInt32(floatResult);
}
else
{
obj[column.ColumnName] = floatResult;
}
}
else if (IsString(cellValue))
{
obj[column.ColumnName] = cellValue;
}
else
{
obj[column.ColumnName] = cellValue;
}
}
jsonArray.Add(obj);
}
return jsonArray;
}
private static bool IsString(string value)
{
return value.Any(c => !char.IsDigit(c));
}
private List<DifferencePopup.Difference> CompareJsonObjects(JArray newObj, JArray existingObj)
{
List<DifferencePopup.Difference> differences = new List<DifferencePopup.Difference>();
int minLength = Mathf.Min(newObj.Count, existingObj.Count);
int maxLength = Mathf.Max(newObj.Count, existingObj.Count);
for (int i = 0; i < maxLength; i++)
{
if (i < minLength)
{
JObject newItem = newObj[i] as JObject;
JObject existingItem = existingObj[i] as JObject;
if (newItem != null && existingItem != null)
{
HashSet<string> allPropertyNames = new HashSet<string>(newItem.Properties().Select(p => p.Name));
allPropertyNames.UnionWith(existingItem.Properties().Select(p => p.Name));
foreach (string propertyName in allPropertyNames)
{
JToken newToken;
JToken existingToken;
if (newItem.TryGetValue(propertyName, out newToken) &&
existingItem.TryGetValue(propertyName, out existingToken))
{
string newValueWithoutSpaces = newToken.ToString().Replace(" ", "");
string existingValueWithoutSpaces = existingToken.ToString().Replace(" ", "");
if (!newValueWithoutSpaces.Equals(existingValueWithoutSpaces))
{
differences.Add(new DifferencePopup.Difference(propertyName, newToken.ToString(),
existingToken.ToString(), i));
}
}
else if (!newItem.TryGetValue(propertyName, out newToken) &&
existingItem.TryGetValue(propertyName, out existingToken))
{
differences.Add(new DifferencePopup.Difference(propertyName, "N/A",
existingToken.ToString(), i));
}
else if (newItem.TryGetValue(propertyName, out newToken) &&
!existingItem.TryGetValue(propertyName, out existingToken))
{
differences.Add(new DifferencePopup.Difference(propertyName, newToken.ToString(), "N/A",
i));
}
}
}
else
{
Debug.LogError($"해당 인덱스에서 JSON 객체를 비교하지 못했습니다 {i}");
}
}
else
{
// 추가된 행에 대한 차이를 처리합니다.
JObject newItem = i < newObj.Count ? newObj[i] as JObject : null;
JObject existingItem = i < existingObj.Count ? existingObj[i] as JObject : null;
JObject availableItem = newItem ?? existingItem;
string newValue, existingValue;
foreach (var property in availableItem.Properties())
{
if (newItem != null && newItem.TryGetValue(property.Name, out JToken newToken))
{
newValue = newToken.ToString();
}
else
{
newValue = "N/A";
}
if (existingItem != null && existingItem.TryGetValue(property.Name, out JToken existingToken))
{
existingValue = existingToken.ToString();
}
else
{
existingValue = "N/A";
}
differences.Add(new DifferencePopup.Difference(property.Name, newValue, existingValue, i));
}
}
}
return differences;
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 15dc83aa064e348db8d3cd13a8ebd8b7

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5f6124a557c154cb0bf3d78ad0cbda39
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata>
<id>ExcelDataReader</id>
<version>3.6.0</version>
<authors>ExcelDataReader developers</authors>
<owners>ExcelDataReader developers</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<license type="expression">MIT</license>
<licenseUrl>https://licenses.nuget.org/MIT</licenseUrl>
<projectUrl>https://github.com/ExcelDataReader/ExcelDataReader</projectUrl>
<iconUrl>https://nugetgallery.blob.core.windows.net/icons/ExcelDataReader.2.1.png</iconUrl>
<description>Lightweight and fast library written in C# for reading Microsoft Excel files (2.0-2007).</description>
<tags>excel xls xlsx</tags>
<repository type="git" url="https://github.com/ExcelDataReader/ExcelDataReader.git" commit="e5b7d41b580603c866b9097496139080c0bba105" />
<dependencies>
<group targetFramework=".NETFramework2.0">
<dependency id="SharpZipLib" version="0.86.0" exclude="Build,Analyzers" />
</group>
<group targetFramework=".NETFramework4.5" />
<group targetFramework=".NETStandard1.3">
<dependency id="NETStandard.Library" version="1.6.1" exclude="Build,Analyzers" />
<dependency id="System.Data.Common" version="4.3.0" exclude="Build,Analyzers" />
</group>
<group targetFramework=".NETStandard2.0" />
</dependencies>
<frameworkAssemblies>
<frameworkAssembly assemblyName="System.Data" targetFramework=".NETFramework2.0, .NETFramework4.5" />
<frameworkAssembly assemblyName="System" targetFramework=".NETFramework2.0, .NETFramework4.5" />
<frameworkAssembly assemblyName="System.IO.Compression" targetFramework=".NETFramework4.5" />
</frameworkAssemblies>
</metadata>
</package>

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 412bb38b305a34e98addb3e0c647c80d
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 874c347e659d4479396e802894f8c8e2
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e9f2ec082b2aa42fd89317af82cc5c9f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 6c73703c55c084c6aba39f15caad23af

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 81abb8eb25c6f480f8d77a3dbd6033f2
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata>
<id>ExcelDataReader.DataSet</id>
<version>3.6.0</version>
<authors>ExcelDataReader developers</authors>
<owners>ExcelDataReader developers</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<license type="expression">MIT</license>
<licenseUrl>https://licenses.nuget.org/MIT</licenseUrl>
<projectUrl>https://github.com/ExcelDataReader/ExcelDataReader</projectUrl>
<iconUrl>https://nugetgallery.blob.core.windows.net/icons/ExcelDataReader.2.1.png</iconUrl>
<description>ExcelDataReader extension for reading Microsoft Excel files into System.Data.DataSet.</description>
<tags>excel xls xlsx dataset</tags>
<repository type="git" url="https://github.com/ExcelDataReader/ExcelDataReader.git" commit="e5b7d41b580603c866b9097496139080c0bba105" />
<dependencies>
<group targetFramework=".NETFramework2.0">
<dependency id="ExcelDataReader" version="3.6.0" exclude="Build,Analyzers" />
</group>
<group targetFramework=".NETFramework3.5">
<dependency id="ExcelDataReader" version="3.6.0" exclude="Build,Analyzers" />
</group>
<group targetFramework=".NETStandard2.0">
<dependency id="ExcelDataReader" version="3.6.0" exclude="Build,Analyzers" />
</group>
</dependencies>
</metadata>
</package>

View File

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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 11109328dc6ce4ac9928da300b3c1ea0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 476e04bb22293496d905dcc20aea52c7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: e72d261c8145e4bc8bde46077607e051

View File

@ -0,0 +1,71 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>ExcelDataReader.DataSet</name>
</assembly>
<members>
<member name="T:ExcelDataReader.ExcelDataReaderExtensions">
<summary>
ExcelDataReader DataSet extensions
</summary>
</member>
<member name="M:ExcelDataReader.ExcelDataReaderExtensions.AsDataSet(ExcelDataReader.IExcelDataReader,ExcelDataReader.ExcelDataSetConfiguration)">
<summary>
Converts all sheets to a DataSet
</summary>
<param name="self">The IExcelDataReader instance</param>
<param name="configuration">An optional configuration object to modify the behavior of the conversion</param>
<returns>A dataset with all workbook contents</returns>
</member>
<member name="T:ExcelDataReader.ExcelDataSetConfiguration">
<summary>
Processing configuration options and callbacks for IExcelDataReader.AsDataSet().
</summary>
</member>
<member name="P:ExcelDataReader.ExcelDataSetConfiguration.UseColumnDataType">
<summary>
Gets or sets a value indicating whether to set the DataColumn.DataType property in a second pass.
</summary>
</member>
<member name="P:ExcelDataReader.ExcelDataSetConfiguration.ConfigureDataTable">
<summary>
Gets or sets a callback to obtain configuration options for a DataTable.
</summary>
</member>
<member name="P:ExcelDataReader.ExcelDataSetConfiguration.FilterSheet">
<summary>
Gets or sets a callback to determine whether to include the current sheet in the DataSet. Called once per sheet before ConfigureDataTable.
</summary>
</member>
<member name="T:ExcelDataReader.ExcelDataTableConfiguration">
<summary>
Processing configuration options and callbacks for AsDataTable().
</summary>
</member>
<member name="P:ExcelDataReader.ExcelDataTableConfiguration.EmptyColumnNamePrefix">
<summary>
Gets or sets a value indicating the prefix of generated column names.
</summary>
</member>
<member name="P:ExcelDataReader.ExcelDataTableConfiguration.UseHeaderRow">
<summary>
Gets or sets a value indicating whether to use a row from the data as column names.
</summary>
</member>
<member name="P:ExcelDataReader.ExcelDataTableConfiguration.ReadHeaderRow">
<summary>
Gets or sets a callback to determine which row is the header row. Only called when UseHeaderRow = true.
</summary>
</member>
<member name="P:ExcelDataReader.ExcelDataTableConfiguration.FilterRow">
<summary>
Gets or sets a callback to determine whether to include the current row in the DataTable.
</summary>
</member>
<member name="P:ExcelDataReader.ExcelDataTableConfiguration.FilterColumn">
<summary>
Gets or sets a callback to determine whether to include the specific column in the DataTable. Called once per column after reading the headers.
</summary>
</member>
</members>
</doc>

View File

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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 0b452a245db9f424f92f4238ded49adc
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 868f1f5f8663c4fe0b2c271f50f4606d
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 91449ffd9dec84c5284a14b729455f7d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,172 @@
[
{
"idx": 10001,
"name": "wildman1",
"speed": 3,
"hurry": 3,
"wait": 3,
"base_happy_point": 30,
"taste_1": 2,
"taste_2": 1,
"taste_3": 0,
"picky_1": 11,
"picky_2": 0,
"picky_3": 0,
"bully": 0,
"tip": 11100,
"dialogue": 101
},
{
"idx": 10002,
"name": "wildman2",
"speed": 3,
"hurry": 3,
"wait": 3,
"base_happy_point": 30,
"taste_1": 2,
"taste_2": 1,
"taste_3": 0,
"picky_1": 11,
"picky_2": 0,
"picky_3": 0,
"bully": 0,
"tip": 22200,
"dialogue": 101
},
{
"idx": 10003,
"name": "viking1",
"speed": 3,
"hurry": 3,
"wait": 3,
"base_happy_point": 30,
"taste_1": 2,
"taste_2": 1,
"taste_3": 0,
"picky_1": 31,
"picky_2": 0,
"picky_3": 0,
"bully": 1,
"tip": 22200,
"dialogue": 102
},
{
"idx": 10004,
"name": "viking2",
"speed": 3,
"hurry": 3,
"wait": 3,
"base_happy_point": 30,
"taste_1": 2,
"taste_2": 1,
"taste_3": 0,
"picky_1": 31,
"picky_2": 0,
"picky_3": 0,
"bully": 0,
"tip": 32200,
"dialogue": 102
},
{
"idx": 10005,
"name": "pirate1",
"speed": 3,
"hurry": 3,
"wait": 3,
"base_happy_point": 30,
"taste_1": 1,
"taste_2": 2,
"taste_3": 0,
"picky_1": 41,
"picky_2": 0,
"picky_3": 0,
"bully": 0,
"tip": 33300,
"dialogue": 103
},
{
"idx": 10006,
"name": "oldman1",
"speed": 1,
"hurry": 1,
"wait": 1,
"base_happy_point": 30,
"taste_1": 1,
"taste_2": 2,
"taste_3": 0,
"picky_1": 41,
"picky_2": 0,
"picky_3": 0,
"bully": 1,
"tip": 44200,
"dialogue": 104
},
{
"idx": 10007,
"name": "soldier1",
"speed": 2,
"hurry": 2,
"wait": 2,
"base_happy_point": 30,
"taste_1": 1,
"taste_2": 2,
"taste_3": 0,
"picky_1": 41,
"picky_2": 0,
"picky_3": 0,
"bully": 0,
"tip": 65432,
"dialogue": 105
},
{
"idx": 10008,
"name": "soldier2",
"speed": 2,
"hurry": 2,
"wait": 2,
"base_happy_point": 20,
"taste_1": 1,
"taste_2": 2,
"taste_3": 0,
"picky_1": 21,
"picky_2": 0,
"picky_3": 0,
"bully": 0,
"tip": 105400,
"dialogue": 106
},
{
"idx": 10009,
"name": "chinaman1",
"speed": 2,
"hurry": 2,
"wait": 1,
"base_happy_point": 20,
"taste_1": 1,
"taste_2": 2,
"taste_3": 0,
"picky_1": 21,
"picky_2": 0,
"picky_3": 0,
"bully": 0,
"tip": 1510500,
"dialogue": 107
},
{
"idx": 10010,
"name": "knight1",
"speed": 2,
"hurry": 2,
"wait": 1,
"base_happy_point": 20,
"taste_1": 1,
"taste_2": 2,
"taste_3": 0,
"picky_1": 21,
"picky_2": 0,
"picky_3": 0,
"bully": 1,
"tip": 20201000,
"dialogue": 108
}
]

View File

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

View File

@ -1,4 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="ExcelDataReader" version="3.6.0" manuallyInstalled="true" />
<package id="ExcelDataReader.DataSet" version="3.6.0" manuallyInstalled="true" />
<package id="Newtonsoft.Json" version="13.0.3" manuallyInstalled="true" />
</packages>