Android 7でのイースターエッグのねこの体の色は、定義されている11色以外に多くの色を取り得ること、各部位の色の全てのパターンが現れるとも限らないので、ねこの色などを決めている乱数のシードを0~231-1まで変えて種類を数えるしかないと思います。
2017/08/25 追記: シードを0~2,147,483,647まで変えて数えました → Android 7 でのイースターエッグで表示されるねこの種類 (2)
ひとまず、選択可能なパターンでねこが何種類いるかソースを見ながら計算してみる。
(体の色が定義されている11色以外の色があるが、今回は考えない。)
1. 体の色
https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#82,https://android.googlesource.com/platform/frameworks/base/+/android-7.1.1_r50/packages/EasterEgg/src/com/android/egg/neko/Cat.java#151
前回のAndroid 7.0/7.1.1 でのイースターエッグで表示されるねこの違いで見た通り、定義されているのは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通り。
腹と同じで0(透明、つまり体の色と同じ)か0xFFFFFFFF(白)の 2通り。
Cat.java の167行目では顔の色が明るければ(!isDark(faceColor))口と鼻を黒くする。
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通り。
白か体の色と同じになるので 2通り。
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になる。
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
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 通り。
定義されている体の色だけで、これだけのパターンが考えられるので、えさを置いてねこが来て、では全部集めるのは厳しい。
背中も腹と同様に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を描画するとこんなねこになります。
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#172Cat.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#196Cat.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 件のコメント:
コメントを投稿