2017/08/21

Android 7 でのイースターエッグで表示されるねこの種類 (1)

先に結論を書いておくと、数え切れてません。

Android 7でのイースターエッグのねこの体の色は、定義されている11色以外に多くの色を取り得ること、各部位の色の全てのパターンが現れるとも限らないので、ねこの色などを決めている乱数のシードを0~231-1まで変えて種類を数えるしかないと思います。

2017/08/25 追記: シードを0~2,147,483,647まで変えて数えました → Android 7 でのイースターエッグで表示されるねこの種類 (2)

ひとまず、選択可能なパターンでねこが何種類いるかソースを見ながら計算してみる。
(体の色が定義されている11色以外の色があるが、今回は考えない。)




2. 目、口、鼻

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#158

体の色が暗いか(isDark(mBodyColor))どうかで決まる。
体の色が暗いなら白、そうでなければそのまま(黒)。



3. 耳の内側

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#161

目、口、鼻と同様に体の色が暗いかどうかで決まる。
暗ければ 0xFFEF9A9A、そうでなければ 0x20D50000。画像は"2. 目、口、鼻"と同じ。


4. 腹

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#163,
https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#108
より、0(透明、つまり体の色と同じ)か0xFFFFFFFF(白)の2通り



5. 顔の色(というか鼻と口周り)

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#165

腹と同じで0(透明、つまり体の色と同じ)か0xFFFFFFFF(白)の 2通り
Cat.java の167行目では顔の色が明るければ(!isDark(faceColor))口と鼻を黒くする。


顔の色が明るくなったので、口と鼻が黒くなる(右)



6. つま先

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#172
Cat.javaの172行目からどのつま先を白くするかの処理。
174行目、4本とも白。
178行目、前足2本(Android 7.0の場合は右前足、右後ろ足)が白。
181行目、後ろ足2本(Android 7.0の場合は左前足、左後ろ足)が白。
184行目、4本のうちどれか1本が白。
172, 176, 179, 182行目の各条件を満たさない場合は、白くならない。
全部で 1 + 1 + 1 + 4 + 1= 8通り



7. しっぽの先

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#188
白か体の色と同じになるので 2通り



8. 頭

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#190,
https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#119,
https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#113

体の色が暗ければ(isDark(mBodyColor))、P_LIGHT_SPOT_COLORS、暗くなければP_DARK_SPOT_COLORS の各配列の中から選択。
P_LIGHT_SPOT_COLORS は Cat.java の119行目で0(透明、つまり体の色と同じ)か0xFFFFFFFF (白) の2通り。
P_DARK_SPOT_COLORS は Cat.java の113行目で0(透明、つまり体の色と同じ)、0xFF212121、0xFF6D4C41 の3通り。
暗いか暗くないかで2通り、または3通りになる。
1.の体の色では、黒いねこ(色は0xFF212121)のみisDarkがtrueになる。

体の色が暗い場合

体の色が明るい場合


9.襟

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#194,
https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#97

P_COLLAR_COLORSで、定義されている8色
0xFFFFFFFF, 0xFF000000, 0xFFF44336, 0xFF1976D2, 0xFFFDD835, 0xFFFB8C00, 0xFFF48FB1, 0xFF4CAF50



10.蝶ネクタイ

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#196
Cat.java の196~197行目。
0(透明、つまり蝶ネクタイを描画しない)か襟と同じ色の2通り



以上から、
1. 体の色
4. 腹
5. 顔の色(というか鼻と口周り)
6. つま先
7. しっぽの先
8. 頭
9.襟
10.蝶ネクタイ
が変わる。

黒いねこ(色は0xFF212121)の場合、
1 x 2 x 2 x 8 x 2 x 2 x 8 x 2 = 2,048 通り
それ以外のねこの場合、
10 x 2 x 2 x 8 x 2 x 3 x 8 x 2 = 30,720 通り
合計 32,768 通り

定義されている体の色だけで、これだけのパターンが考えられるので、えさを置いてねこが来て、では全部集めるのは厳しい。


おまけ: 背中

https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#164

背中も腹と同様に0(透明、つまり体の色と同じ)か0xFFFFFFFF(白)の2通りあるのですが、
https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#411
での戻り値の配列に back が抜けているため、描画されません。
backを描画するとこんなねこになります。



0 件のコメント:

コメントを投稿