Skip to content

Instantly share code, notes, and snippets.

@ufcpp ufcpp/AbilityCode.cs
Created Apr 27, 2017

Embed
What would you like to do?
昔実際にこんな感じのビットフィールドが必要だったという例の模倣コード
// 過去実際にビットフィールドを実用したときの模倣コード。
// ここに書いてあるようなものを、ビット数けちるためにビットフィールド化した。
// (完全にこのままではない。あと、それぞれの値の細かい説明は省く。)
// 当時は [BitFields](https://github.com/ufcpp/BitFields/) とかまだなかったので、手作業でちまちまビット演算と仕様書を書いた。
using System;
// ## 概要
// パラメーターの種類。
// 戦闘用の力とかHPとか
// 内政用の資源生産力(時給・所持上限)とか速度アップとか。
//
// ##サイズ
// ビットフィールドで詰め込めば2バイト(short)で済む構造体。
// この作りだと6バイトに膨らむ。
//
// さらに、もし例えばJSONとかにするなら
// { "HasCurrent": true, "HasGain": true, "HasValue": true, "Index": 12345 }
// みたいになるわけで、結構巨大。
struct ParameterCode
{
public bool HasCurrent;
public bool HasGain;
public bool HasValue;
public short Index; // 実際に使っているのは10ビット
}
// ## 概要
// パラメーターがどう掛かってくるかとかのことをアビリティって呼んでる。
// 単純な加算であったり、倍率として掛かったり。
// 資源とかだと、「アイテムを使って即入手」みたいなのもある。
//
// ##サイズ
// ビットフィールドで詰め込めば8バイト(long)で済む構造体。
// この作りだと14バイトに膨らむ。
//
// さらに、もし例えばJSONとかにするなら
// { "Type": 1, "ParameterCode": { "HasCurrent":true, "HasGain": true, "HasValue": true, "Index": 12345 }, "AggregationMode": 1, "HeroPresence": 1, "HeroLife":1, "Option1": 123, "Option2": 123, "Option3": 123 }
// みたいになるわけで、かなり巨大。
//
// ##辞書のキー
// この値をキーにして、キャラクター、装備品、内政施設、研究とかで得た能力を集計していく。
// 相当数の集計を掛けるので、GetHashCodeとかEqualsが高速でないとちょっとつらい。
struct AbilityCode
{
public AbilityType Type; // 余裕を見て4ビット想定
public ParameterCode ParameterCode;
public AggregationMode AggregationMode; // 余裕を見て2ビット
public byte HeroPresence; // いる、いない、どちらでも の3値 = 2ビット
public byte HeroLife; // 生存、戦闘不能、どちらでも の3値 = 2ビット
byte Option1;
byte Option2;
byte Option3;
}
enum AbilityType : byte
{
Value,
UnlockA,
UnlockB,
Gain1,
Gain2,
Gain3,
}
enum AggregationMode : byte
{
Add,
Max,
}
class Program
{
static void Main()
{
unsafe
{
Console.WriteLine(sizeof(ParameterCode));
Console.WriteLine(sizeof(AbilityCode));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.