2021-04-08 20:09:59 +08:00
using MongoDB.Bson.Serialization.Attributes ;
using Sirenix.OdinInspector ;
using System.Collections ;
using System.Collections.Generic ;
using System.IO ;
using ET ;
using System ;
#if UNITY_EDITOR
using System.Linq ;
using UnityEngine ;
# endif
namespace Cal
{
#if UNITY
[Serializable]
public class DictionaryInt32Single : Dictionary < int , float > , ISerializationCallbackReceiver
{
[SerializeField] private List < int > keys = new List < int > ( ) ;
[SerializeField] private List < float > values = new List < float > ( ) ;
public void OnBeforeSerialize ( )
{
keys . Clear ( ) ;
values . Clear ( ) ;
foreach ( KeyValuePair < int , float > pair in this )
{
keys . Add ( pair . Key ) ;
values . Add ( pair . Value ) ;
}
}
public void OnAfterDeserialize ( )
{
this . Clear ( ) ;
if ( keys . Count ! = values . Count )
throw new System . Exception ( "there are " + keys . Count + " keys and " + values . Count + " values after deserialization. Make sure that both key and value types are serializable." ) ;
for ( int i = 0 ; i < keys . Count ; i + + )
this . Add ( keys [ i ] , values [ i ] ) ;
}
}
# endif
[GUIColor(0.8f, 0.8f, 1f)]
[BsonIgnoreExtraElements]
[HideReferenceObjectPicker]
[System.Serializable]
public class SkillParam
{
[LabelText("变化性数值")]
[DictionaryDrawerSettings(KeyLabel = "等级", ValueLabel = "数值")]
[ShowIf("skillSourcetype", SkillSourcetype.Changable)]
[BsonDictionaryOptions(Representation = MongoDB.Bson.Serialization.Options.DictionaryRepresentation.ArrayOfArrays)]
#if UNITY
[SerializeField]
public DictionaryInt32Single values ;
# else
public Dictionary < int , float > values ;
# endif
[HideInInspector]
public SkillSourcetype skillSourcetype ;
#if UNITY
[BsonIgnore]
[LabelText("变化最大等级")]
[PropertyRange(0, 15), PropertyOrder(-1)]
[ShowInInspector]
[ShowIf("skillSourcetype", SkillSourcetype.Changable)]
private int maxLevel
{
get
{
if ( values = = null )
return 0 ;
if ( values . Count = = 0 )
return 0 ;
return values . Last ( ) . Key ;
}
set
{
var dic = new DictionaryInt32Single ( ) ;
for ( int i = 1 ; i < = value ; i + + )
{
if ( values ! = null & & values . TryGetValue ( i , out var _value ) )
dic . Add ( i , _value ) ;
else
dic . Add ( i , 0 ) ;
}
values = dic ;
}
}
# endif
[LabelText("输入数值")]
[ShowIf("skillSourcetype", SkillSourcetype.Constage)]
public float value ;
//#if SERVER
// public SkillDataTableArgs args;
//#endif
#if UNITY_EDITOR
//[LabelText("选择参数")]
//[ShowIf("skillSourcetype", SkillSourcetype.Changable)]
//public SkillDataTableArgs args
//{
// get => SkillDataTableArgs.Args0; set
// {
// if (skillSourcetype == SkillSourcetype.Constage)
// {
// values = null;
// }
// else if (skillSourcetype == SkillSourcetype.Changable)
// {
// if (dic.Count == 0)
// {
// GenerateDic();
// }
// if (!dic.TryGetValue(skillId_, out var _dic))
// {
// Log.Error($"@dic has not the key = {skillId_}");
// return;
// }
// values = new Dictionary<int, float>();
// foreach (var kv in _dic)
// {
// int level = kv.Key;
// if (!kv.Value.TryGetValue((int)value, out var floatValue))
// {
// //Log.Error($"@_dic has not the key = {skillId_} args = {value}");
// continue;
// }
// values.Add(level, floatValue);
// }
// }
// else
// {
// values = null;
// }
// }
//}
#region Excel
// private void GenerateDic()
// {
// NPOI.XSSF.UserModel.XSSFWorkbook workbook;
// using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
// {
// workbook = new XSSFWorkbook(file);
// }
// ISheet sheet = workbook.GetSheetAt(0);
// for (int i = 4; i < 500; i++)
// {
// for (int j = 10; j < 30; j++)
// {
// int id = int.Parse(GetCellString(sheet, i, 1));
// string str = GetCellString(sheet, i, j);
// if (str != "")
// {
// if (!dic.TryGetValue(id / 100, out var _dic))
// {
// dic[id / 100] = _dic = new Dictionary<int, Dictionary<int, float>>();
// }
// if (!_dic.TryGetValue(id % 100, out var __dic))
// {
// _dic[id % 100] = __dic = new Dictionary<int, float>();
// }
// __dic.Add(j - 10, float.Parse(str));
// }
// }
// }
// }
// private static string GetCellString(ISheet sheet, int i, int j)
// {
// IRow _irow = sheet.GetRow(i);
// if (_irow != null)
// {
// return GetCellString(_irow, j);
// }
// return "";
// }
// private static string GetCellString(IRow row, int i)
// {
// ICell _icell = row.GetCell(i);
// if (_icell != null)
// {
// return GetCellString(_icell); ;
// }
// return "";
// }
// private static string GetCellString(ICell cell)
// {
// if (cell != null)
// {
// if (cell.CellType == CellType.Numeric || (cell.CellType == CellType.Formula && cell.CachedFormulaResultType == CellType.Numeric))
// {
// return cell.NumericCellValue.ToString();
// }
// else if (cell.CellType == CellType.String || (cell.CellType == CellType.Formula && cell.CachedFormulaResultType == CellType.String))
// {
// return cell.StringCellValue.ToString();
// }
// else if (cell.CellType == CellType.Boolean || (cell.CellType == CellType.Formula && cell.CachedFormulaResultType == CellType.Boolean))
// {
// return cell.BooleanCellValue.ToString();
// }
// else
// {
// return cell.ToString();
// }
// }
// return "";
// }
# endregion
[Button("不需要数值")]
[ButtonGroup("param")]
void NoneParam ( )
{
skillSourcetype = SkillSourcetype . None ;
values = null ;
}
[Button("固定型数值")]
[ButtonGroup("param")]
void InputParam ( )
{
skillSourcetype = SkillSourcetype . Constage ;
values = null ;
}
[Button("变化型数值")]
[ButtonGroup("param")]
void DataTableParam ( )
{
skillSourcetype = SkillSourcetype . Changable ;
}
# endif
}
[HideReferenceObjectPicker]
[Serializable]
public class ValueCalculate
{
[LabelText("伤害计算类型")]
public ValueCalculateType calculateType ;
2023-09-10 23:57:57 +08:00
[LabelText("伤害系数(XX%)")]
2021-04-08 20:09:59 +08:00
[SerializeField]
public SkillParam param ;
}
}