Created
April 27, 2017 14:29
-
-
Save ufcpp/f1fd6a5acd7717565e4fddfa9431e9fa to your computer and use it in GitHub Desktop.
昔実際にこんな感じのビットフィールドが必要だったという例の模倣コード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 過去実際にビットフィールドを実用したときの模倣コード。 | |
// ここに書いてあるようなものを、ビット数けちるためにビットフィールド化した。 | |
// (完全にこのままではない。あと、それぞれの値の細かい説明は省く。) | |
// 当時は [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