본문으로 건너뛰기

값이 여러 개일 때

시트가 코드가 되는 모습으로


배열이 오는 자리는 셋입니다 — 셀 하나 안, 컬럼 여럿, 그리고 행 여럿입니다. 앞의 둘이 여기 있고, 셋째는 행으로 쌓는 배열에 있습니다.

  • 셀 하나 안에 여러 값 — 타입을 string[] 으로 적고 셀에 potion;cheap 처럼 적습니다
  • 컬럼 여러 개가 한 배열Weight[0] · Weight[1] 처럼 번호를 붙입니다

시트에서 쓰기 편한 쪽을 고르면 됩니다.

테이블 Loot

[System.Serializable]
public partial class LootRecord
{
#region Values
/// <summary>
/// primary index
/// </summary>
public int Index => _index;

/// <summary>
/// search tags
/// </summary>
public string[] Tags => _tags;

/// <summary>
/// weight 1
/// </summary>
public int[] Weight => _weight;
#endregion

#region Storage
internal int _index;
internal string[] _tags = System.Array.Empty<string>();
internal int[] _weight = System.Array.Empty<int>();
#endregion

#region ToString
public override string ToString()
{
var sb = new StringBuilder("{");
sb.Append("\"Index\":"); ToStringHelper.ToString(Index, sb);
sb.Append(",\"Tags\":"); ToStringHelper.ToString(Tags, sb);
sb.Append(",\"Weight\":"); ToStringHelper.ToString(Weight, sb);
sb.Append("}");
return sb.ToString();
}
#endregion
}

LootTable.cs

생성된 코드에서는 둘이 구별되지 않습니다. 둘 다 그냥 배열입니다 — 어느 쪽으로 적었는지는 시트의 사정이고, 코드는 그것을 알 필요가 없습니다.

Weight 는 컬럼이 둘이므로 길이가 언제나 2이고, Tags 는 행마다 다릅니다.


enum도 배열이 됩니다. 그리고 ? 를 어디에 붙이느냐로 「배열이 없는 것」과 「원소가 없는 것」이 갈립니다int?[] 는 원소가 없을 수 있고, int[]? 는 배열 자체가 없을 수 있습니다.

오른쪽 끝의 컬럼은 :field 칸에 # 만 적은 메모 컬럼입니다.

테이블 Drop

[System.Serializable]
public partial class DropRecord
{
#region Values
/// <summary>
/// primary index
/// </summary>
public int Index => _index;

/// <summary>
/// which grades
/// </summary>
public global::Tabbit.Fixtures.DocShowcase.Rarity[] Grades => _grades;

/// <summary>
/// how many of each
/// </summary>
public int[] Counts => _counts;
/// <summary>Whether element <paramref name="index"/> of <see cref="Counts"/> has a value.</summary>
public bool HasCountsAt(int index)
=> _countsHasValueAt == null
|| index < 0 || index >= _countsHasValueAt.Length
|| _countsHasValueAt[index];
#endregion

#region Storage
internal int _index;
internal global::Tabbit.Fixtures.DocShowcase.Rarity[] _grades = System.Array.Empty<global::Tabbit.Fixtures.DocShowcase.Rarity>();
internal int[] _counts = System.Array.Empty<int>();
internal bool[] _countsHasValueAt;
#endregion

#region ToString
public override string ToString()
{
var sb = new StringBuilder("{");
sb.Append("\"Index\":"); ToStringHelper.ToString(Index, sb);
sb.Append(",\"Grades\":"); ToStringHelper.ToString(Grades, sb);
sb.Append(",\"Counts\":"); ToStringHelper.ToString(Counts, sb);
sb.Append("}");
return sb.ToString();
}
#endregion
}

DropTable.cs

메모 컬럼은 생성된 코드에 없습니다. 시트를 쓰는 사람의 자리이고, 무엇을 적어도 모델에 들어가지 않습니다.

Counts 의 원소 타입이 「없을 수 있는 정수」인 것도 코드에 그대로 나타납니다 — 그 언어에 옵셔널이 있으면 그것으로, 없으면 그 언어가 없음을 나타내는 방법으로 나옵니다.