commit 478a4c45e56afdbafed2003b6d9194a2f4ce91e9
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed Mar 1 15:41:28 2023 +0100

    Progress with Skewb Diamond solver.

diff --git a/src/main/java/org/distorted/solvers/SolverSkewbDiamond.java b/src/main/java/org/distorted/solvers/SolverSkewbDiamond.java
index 1fdbeb55..8d2a4871 100644
--- a/src/main/java/org/distorted/solvers/SolverSkewbDiamond.java
+++ b/src/main/java/org/distorted/solvers/SolverSkewbDiamond.java
@@ -11,6 +11,7 @@ package org.distorted.solvers;
 
 import android.content.res.Resources;
 
+import org.distorted.main.R;
 import org.distorted.objectlib.main.ObjectType;
 import org.distorted.objectlib.main.TwistyObject;
 import org.distorted.objectlib.tablebases.ImplementedTablebasesList;
@@ -43,33 +44,84 @@ public class SolverSkewbDiamond extends SolverTablebase
   private static final int ERROR_CORNERS_CANNOT   = -18;
 
   private TablebasesAbstract mSolver;
+  private final int[] mFaceColors;
+
+  private static final int[] FREE_CENTERS = {0,2,5,7};
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public SolverSkewbDiamond(Resources res, TwistyObject object)
     {
     super(res,object);
+    mFaceColors = new int[8];
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int retCorner(int[][] corners, int c1, int c2)
+    {
+    for(int i=0; i<6; i++)
+      {
+      int[] cor = corners[i];
+      int twist = retCornerTwist(cor,c1,c2);
+      if( twist>=0 ) return i;
+      }
+
+    return -1;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int[] getCornersPermutation(int[][] corners)
+    {
+    int[] perm = new int[6];
+
+    perm[0] = retCorner(corners,mFaceColors[1],mFaceColors[4]);
+    perm[1] = retCorner(corners,mFaceColors[1],mFaceColors[6]);
+    perm[2] = retCorner(corners,mFaceColors[3],mFaceColors[6]);
+    perm[3] = retCorner(corners,mFaceColors[3],mFaceColors[4]);
+    perm[4] = retCorner(corners,mFaceColors[1],mFaceColors[3]);
+    perm[5] = retCorner(corners,mFaceColors[4],mFaceColors[6]);
+
+    return perm;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private int[] getCornersPermutation(int[] colors, int[][] corners)
+  private int[] getCornersTwist(int[] corners_perm, int[][] corners)
     {
+    int[] twist = new int[6];
+
+    twist[0] = retCornerTwist(corners[corners_perm[0]], mFaceColors[1],mFaceColors[4]);
+    twist[1] = retCornerTwist(corners[corners_perm[1]], mFaceColors[1],mFaceColors[6]);
+    twist[2] = retCornerTwist(corners[corners_perm[2]], mFaceColors[3],mFaceColors[6]);
+    twist[3] = retCornerTwist(corners[corners_perm[3]], mFaceColors[3],mFaceColors[4]);
+    twist[4] = retCornerTwist(corners[corners_perm[4]], mFaceColors[1],mFaceColors[3]);
+    twist[5] = retCornerTwist(corners[corners_perm[5]], mFaceColors[4],mFaceColors[6]);
 
+    return twist;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private int[] getCornersTwist(int[] colors, int[][] corners)
+  private int retCenter(int color, int[] centers)
     {
+    for(int i=0; i<4; i++ )
+      if( centers[FREE_CENTERS[i]]==color ) return i;
 
+    return -1;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private int[] getFreeCentersPermutation(int[] colors, int[] centers)
+  private int[] getFreeCentersPermutation(int[] centers)
     {
+    int[] perm = new int[4];
+
+    for(int i=0; i<4; i++ )
+      perm[i] = retCenter(mFaceColors[FREE_CENTERS[i]],centers);
 
+    return perm;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -89,6 +141,18 @@ public class SolverSkewbDiamond extends SolverTablebase
     return total;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int retCornerTwist(int[] corner, int c1, int c2)
+    {
+    if( corner[0]==c1 && corner[2]==c2 ) return 1;
+    if( corner[1]==c1 && corner[3]==c2 ) return 2;
+    if( corner[2]==c1 && corner[0]==c2 ) return 3;
+    if( corner[3]==c1 && corner[1]==c2 ) return 0;
+
+    return -1;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private int figureOutColor(int[][] corners, int c1, int c2)
@@ -96,11 +160,8 @@ public class SolverSkewbDiamond extends SolverTablebase
     for(int i=0; i<6; i++)
       {
       int[] cor = corners[i];
-
-      if( cor[0]==c1 && cor[2]==c2 ) return cor[1];
-      if( cor[1]==c1 && cor[3]==c2 ) return cor[2];
-      if( cor[2]==c1 && cor[0]==c2 ) return cor[3];
-      if( cor[3]==c1 && cor[1]==c2 ) return cor[0];
+      int twist = retCornerTwist(cor,c1,c2);
+      if( twist>=0 ) return cor[twist];
       }
 
     return -1;
@@ -158,14 +219,14 @@ public class SolverSkewbDiamond extends SolverTablebase
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  private int checkAllColorsDifferent(int[] colors)
+  private int checkAllColorsDifferent()
     {
     for(int i=0; i<8; i++)
       {
       boolean present = false;
 
       for(int j=0; j<8; j++)
-        if( colors[j]==i )
+        if( mFaceColors[j]==i )
           {
           present=true;
           break;
@@ -266,7 +327,6 @@ public class SolverSkewbDiamond extends SolverTablebase
     {
     int[][] corners = new int[6][4];
     int[] centers = new int[8];
-    int[] face_colors = new int[8];
 
     getCorners(object,corners);
     getCenters(object,centers);
@@ -274,21 +334,21 @@ public class SolverSkewbDiamond extends SolverTablebase
     int result1 = checkAllCentersPresent(centers);
     if( result1<0 ) return result1;
 
-    int result2 = figureOutFaceColors(face_colors,centers,corners);
+    int result2 = figureOutFaceColors(mFaceColors,centers,corners);
     if( result2<0 ) return result2;
 
-    int result3 = checkAllColorsDifferent(face_colors);
+    int result3 = checkAllColorsDifferent();
     if( result3<0 ) return result3;
 
-    int[] corners_perm = getCornersPermutation(face_colors, corners);
+    int[] corners_perm = getCornersPermutation(corners);
     boolean even1 = TablebaseHelpers.permutationIsEven(corners_perm);
     if( !even1 ) return ERROR_TWO_CORNERS;
 
-    int[] free_centers_perm = getFreeCentersPermutation(face_colors, centers);
+    int[] free_centers_perm = getFreeCentersPermutation(centers);
     boolean even2 = TablebaseHelpers.permutationIsEven(free_centers_perm);
     if( !even2 ) return ERROR_TWO_CENTERS;
 
-    int[] corners_twist = getCornersTwist(face_colors, corners);
+    int[] corners_twist = getCornersTwist(corners_perm, corners);
     int totalTwist = getTotalTwist(corners_twist);
     if( totalTwist<0 ) return ERROR_CORNER_TWIST;
 
@@ -298,32 +358,106 @@ public class SolverSkewbDiamond extends SolverTablebase
     return centers_perm_num + 12*(totalTwist + 128*corners_perm_num);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int getColorIndex4(int face)
+    {
+    switch(mFaceColors[face])
+      {
+      case 0: return R.string.color_violet4;
+      case 1: return R.string.color_grey4;
+      case 2: return R.string.color_blue4;
+      case 3: return R.string.color_red4;
+      case 4: return R.string.color_orange4;
+      case 5: return R.string.color_green4;
+      case 6: return R.string.color_white4;
+      case 7: return R.string.color_yellow4;
+      }
+
+    return -1;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int getColorIndex3(int face)
+    {
+    switch(mFaceColors[face])
+      {
+      case 0: return R.string.color_violet3;
+      case 1: return R.string.color_grey3;
+      case 2: return R.string.color_blue3;
+      case 3: return R.string.color_red3;
+      case 4: return R.string.color_orange3;
+      case 5: return R.string.color_green3;
+      case 6: return R.string.color_white3;
+      case 7: return R.string.color_yellow3;
+      }
+
+    return -1;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int getColorIndex2(int face)
+    {
+    switch(mFaceColors[face])
+      {
+      case 0: return R.string.color_violet2;
+      case 1: return R.string.color_grey2;
+      case 2: return R.string.color_blue2;
+      case 3: return R.string.color_red2;
+      case 4: return R.string.color_orange2;
+      case 5: return R.string.color_green2;
+      case 6: return R.string.color_white2;
+      case 7: return R.string.color_yellow2;
+      }
+
+    return -1;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private String centerError(Resources res, int face)
+    {
+    String color = res.getString(getColorIndex2(face));
+    return res.getString(R.string.solver_generic_missing_center,color);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private String cornerError(Resources res, int f1, int f2)
+    {
+    String c1 = res.getString(getColorIndex3(f1));
+    String c2 = res.getString(getColorIndex4(f2));
+    return res.getString(R.string.solver_generic_missing_corner2,c1,c2);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public String error(int index, Resources res)
     {
     switch(index)
       {
-      case ERROR_CORNER_FR_MISSING:
-      case ERROR_CORNER_BR_MISSING:
-      case ERROR_CORNER_BL_MISSING:
-      case ERROR_CORNER_FL_MISSING:
-      case ERROR_CORNER_TO_MISSING:
-      case ERROR_CORNER_BO_MISSING:
-
-      case ERROR_CENTER_0_MISSING :
-      case ERROR_CENTER_1_MISSING :
-      case ERROR_CENTER_2_MISSING :
-      case ERROR_CENTER_3_MISSING :
-      case ERROR_CENTER_4_MISSING :
-      case ERROR_CENTER_5_MISSING :
-      case ERROR_CENTER_6_MISSING :
-      case ERROR_CENTER_7_MISSING :
-
-      case ERROR_TWO_CORNERS      :
-      case ERROR_TWO_CENTERS      :
-      case ERROR_CORNER_TWIST     :
-      case ERROR_CORNERS_CANNOT   :
+      case ERROR_CORNER_FR_MISSING: return cornerError(res,1,4);
+      case ERROR_CORNER_BR_MISSING: return cornerError(res,1,6);
+      case ERROR_CORNER_BL_MISSING: return cornerError(res,3,6);
+      case ERROR_CORNER_FL_MISSING: return cornerError(res,3,4);
+      case ERROR_CORNER_TO_MISSING: return cornerError(res,1,3);
+      case ERROR_CORNER_BO_MISSING: return cornerError(res,4,6);
+
+      case ERROR_CENTER_0_MISSING : return centerError(res,0);
+      case ERROR_CENTER_1_MISSING : return centerError(res,1);
+      case ERROR_CENTER_2_MISSING : return centerError(res,2);
+      case ERROR_CENTER_3_MISSING : return centerError(res,3);
+      case ERROR_CENTER_4_MISSING : return centerError(res,4);
+      case ERROR_CENTER_5_MISSING : return centerError(res,5);
+      case ERROR_CENTER_6_MISSING : return centerError(res,6);
+      case ERROR_CENTER_7_MISSING : return centerError(res,7);
+
+      case ERROR_TWO_CORNERS      : return res.getString(R.string.solver_generic_two_corners);
+      case ERROR_TWO_CENTERS      : return res.getString(R.string.solver_generic_two_centers);
+      case ERROR_CORNER_TWIST     : return res.getString(R.string.solver_generic_corner_twist);
+      case ERROR_CORNERS_CANNOT   : return res.getString(R.string.solver_generic_corners_cannot);
       }
 
     return null;
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index d53e4d69..56dadc45 100755
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -84,10 +84,12 @@
     <string name="solver_generic_edge_twist">Eine Kante muss verdreht werden!</string>
     <string name="solver_generic_two_centers">Zwei Zentren müssen ausgetauscht werden!</string>
     <string name="solver_generic_two_edges">Zwei Randstücke müssen ausgetauscht werden!</string>
+    <string name="solver_generic_two_corners">Zwei Ecken müssen ausgetauscht werden!</string>
     <string name="solver_generic_missing_center">Die %1$s Mitte fehlt!</string>
     <string name="solver_generic_missing_corner">Die %1$s-%2$s-%3$s Ecke fehlt!</string>
     <string name="solver_generic_missing_vertex">Der %1$s-%2$s-%3$s Oktaeder fehlt!</string>
     <string name="solver_generic_missing_edge">Die %1$s-%2$s Kante fehlt!</string>
+    <string name="solver_generic_missing_corner2">Die %1$s-%2$s Ecke fehlt!</string>
     <string name="solver_generic_corners_cannot">Ecken können nicht verdreht werden, sodass alle Seiten einfarbig sind!</string>
     <string name="solver_generic_vertices_cannot">Oktaederstücke können nicht so verdreht werden, sodass alle Seiten einfarbig sind!</string>
     <string name="solver_generic_c_v_dont_match">Oktaederstücke und Tetraederecken passen nicht zusammen!</string>
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index 30171b3f..41d8f63e 100755
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -84,10 +84,12 @@
     <string name="solver_generic_edge_twist">¡Hay que torcer una borde!</string>
     <string name="solver_generic_two_centers">¡Hay que cambiar dos centros!</string>
     <string name="solver_generic_two_edges">¡Hay que cambiar dos piezas de borde!</string>
+    <string name="solver_generic_two_corners">¡Hay que cambiar dos esquinas!</string>
     <string name="solver_generic_missing_center">¡Falta el centro %1$s!</string>
     <string name="solver_generic_missing_corner">¡Falta la esquina %1$s-%2$s-%3$s!</string>
     <string name="solver_generic_missing_vertex">¡Falta el octaedro %1$s-%2$s-%3$s!</string>
     <string name="solver_generic_missing_edge">¡Falta la pieza del borde %1$s-%2$s!</string>
+    <string name="solver_generic_missing_corner2">¡Falta la esquina %1$s-%2$s!</string>
     <string name="solver_generic_corners_cannot">¡Las esquinas no se pueden torcer para que todos los lados sean monocromáticos!</string>
     <string name="solver_generic_vertices_cannot">¡Las piezas octaédricas no se pueden torcer para que todos los lados sean monocromáticos!</string>
     <string name="solver_generic_c_v_dont_match">¡Las piezas octaédricas y las esquinas tetraédricas no coinciden!</string>
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index c9c7972f..ffac13e9 100755
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -84,10 +84,12 @@
     <string name="solver_generic_edge_twist">Un bord doit être tourné !</string>
     <string name="solver_generic_two_centers">Deux centres doivent être échangés !</string>
     <string name="solver_generic_two_edges">Deux pièces de bord doivent être échangées !</string>
+    <string name="solver_generic_two_corners">Deux coins doivent être échangés !</string>
     <string name="solver_generic_missing_center">Centre %1$s manquant !</string>
     <string name="solver_generic_missing_corner">Coin %1$s-%2$s-%3$s manquant !</string>
     <string name="solver_generic_missing_vertex">L\'octaèdre %1$s-%2$s-%3$s manque !</string>
     <string name="solver_generic_missing_edge">La pièce de bordure %1$s-%2$s manque!</string>
+    <string name="solver_generic_missing_corner2">Coin %1$s-%2$s manquant !</string>
     <string name="solver_generic_corners_cannot">Les coins ne peuvent pas être tordus afin que tous les côtés soient monochromes !</string>
     <string name="solver_generic_vertices_cannot">Les pièces octaédriques ne peuvent pas être tordues afin que tous les côtés soient monochromes !</string>
     <string name="solver_generic_c_v_dont_match">Les pièces octaédriques et les coins tétraédriques ne correspondent pas !</string>
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index 18407f6a..31c8a87b 100755
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -85,10 +85,12 @@
     <string name="solver_generic_edge_twist">片方の端をひねる必要がある!</string>
     <string name="solver_generic_two_centers">2つのセンターを交換しなければならない!</string>
     <string name="solver_generic_two_edges">2 つのエッジ ピースを交換する必要があります。</string>
+    <string name="solver_generic_two_corners">2 つのコーナーを交換する必要があります ！</string>
     <string name="solver_generic_missing_center">%1$sのセンターが欠けてる！</string>
     <string name="solver_generic_missing_corner">%1$s%2$s%3$sのコーナーがない！</string>
     <string name="solver_generic_missing_vertex">%1$s-%2$s-%3$s八面体がありません！</string>
     <string name="solver_generic_missing_edge">%1$s%2$sボーダーピースはありません！</string>
+    <string name="solver_generic_missing_corner2">%1$s%2$sのコーナーがない！</string>
     <string name="solver_generic_corners_cannot">すべての面がモノクロになるようにコーナーをねじることはできません。</string>
     <string name="solver_generic_vertices_cannot">すべての面が単色になるように、八面体のピースをねじることはできません。</string>
     <string name="solver_generic_c_v_dont_match">八面体のピースと四面体の角が一致しません!</string>
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index 6887f1e9..9ca5624b 100755
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -84,10 +84,12 @@
     <string name="solver_generic_edge_twist">한쪽 가장자리를 비틀어야 합니다!</string>
     <string name="solver_generic_two_centers">두 개의 센터를 교환해야 합니다!</string>
     <string name="solver_generic_two_edges">두 모서리 조각을 교환해야 합니다!</string>
+    <string name="solver_generic_two_corners">두 모서리를 교환해야 합니다!</string>
     <string name="solver_generic_missing_center">%1$s 중앙이 사라졌습니다!</string>
     <string name="solver_generic_missing_corner">%1$s-%2$s-%3$s 모서리 금지!</string>
     <string name="solver_generic_missing_vertex">%1$s-%2$s-%3$s 팔면체가 없습니다!</string>
     <string name="solver_generic_missing_edge">%1$s%2$s 테두리 조각이 없습니다!</string>
+    <string name="solver_generic_missing_corner2">%1$s-%2$s 모서리 금지!</string>
     <string name="solver_generic_corners_cannot">모든면이 단색이되도록 모서리를 비틀 수 없습니다!</string>
     <string name="solver_generic_vertices_cannot">팔면체 조각은 뒤틀릴 수 없으므로 모든면이 단색입니다!</string>
     <string name="solver_generic_c_v_dont_match">팔면체 조각과 사면체 모서리가 일치하지 않습니다!</string>
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index 00907ec1..b84b8ab4 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -84,10 +84,12 @@
     <string name="solver_generic_edge_twist">Jedna z krawędzi musi byc obrócona!</string>
     <string name="solver_generic_two_centers">Dwa środki muszą być wymienione!</string>
     <string name="solver_generic_two_edges">Dwie krawędzie muszą być wymienione!</string>
+    <string name="solver_generic_two_corners">Dwa centry muszą być wymienione!</string>
     <string name="solver_generic_missing_center">Brakuje %1$s środka!</string>
     <string name="solver_generic_missing_corner">Brakuje %1$s-%2$s-%3$s rogu!</string>
     <string name="solver_generic_missing_vertex">Brakuje %1$s-%2$s-%3$s ośmiokątu!</string>
     <string name="solver_generic_missing_edge">Brakuje %1$s-%2$s krawędzi!</string>
+    <string name="solver_generic_missing_corner2">Brakuje %1$s-%2$s rogu!</string>
     <string name="solver_generic_corners_cannot">Narożników nie można skręcić tak, aby wszystkie boki były monochromatyczne!</string>
     <string name="solver_generic_vertices_cannot">Części ośmiościennych nie można skręcić tak, aby wszystkie boki były monochromatyczne!</string>
     <string name="solver_generic_c_v_dont_match">Części ośmiościenne i czworościenne rogi nie pasują do siebie!</string>
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index 411dcacb..a33b967e 100755
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -84,10 +84,12 @@
     <string name="solver_generic_edge_twist">Одно ребро должно быть переставлен!</string>
     <string name="solver_generic_two_centers">Два центра должны быть обменены!</string>
     <string name="solver_generic_two_edges">Два ребра должны быть заменены!</string>
+    <string name="solver_generic_two_corners">Два угла нужно поменять местами!</string>
     <string name="solver_generic_missing_center">Нет %1$s центра!</string>
     <string name="solver_generic_missing_corner">Нет %1$s-%2$s-%3$s угла!</string>
     <string name="solver_generic_missing_vertex">Нет %1$s-%2$s-%3$s октаэдра!</string>
     <string name="solver_generic_missing_edge">Нет %1$s-%2$s ребра!</string>
+    <string name="solver_generic_missing_corner2">Нет %1$s-%2$s угла!</string>
     <string name="solver_generic_corners_cannot">Углы нельзя скручивать так, чтобы все стороны были однотонными!</string>
     <string name="solver_generic_vertices_cannot">Восьмигранные фигуры нельзя скрутить так, чтобы все стороны были однотонными!</string>
     <string name="solver_generic_c_v_dont_match">Восьмигранные фигуры и четырехгранные углы не совпадают!</string>
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index ae02e02f..ec7b726f 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -90,10 +90,12 @@
     <string name="solver_generic_edge_twist">一条边需要扭动！</string>
     <string name="solver_generic_two_centers">必须要交换两个中心！</string>
     <string name="solver_generic_two_edges">必须交换两个边缘！</string>
+    <string name="solver_generic_two_corners">两个角必须交换！</string>
     <string name="solver_generic_missing_center">%1$s中心不見了！</string>
     <string name="solver_generic_missing_corner">没有%1$s-%2$s-%3$s的角落！</string>
     <string name="solver_generic_missing_vertex">没有%1$s-%2$s-%3$s八面体！</string>
     <string name="solver_generic_missing_edge">没有1$s-%2$s边！</string>
+    <string name="solver_generic_missing_corner2">没有%1$s-%2$s的角落！</string>
     <string name="solver_generic_corners_cannot">角不能扭曲，这样所有的面都是单色的！</string>
     <string name="solver_generic_vertices_cannot">八面体块不能扭曲，所以所有面都是单色的！</string>
     <string name="solver_generic_c_v_dont_match">八面体块和四面体角不匹配！</string>
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index 1bc8bdba..36a7090a 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -84,10 +84,12 @@
     <string name="solver_generic_edge_twist">一個邊緣要扭動！</string>
     <string name="solver_generic_two_centers">兩個中鋒要互換！</string>
     <string name="solver_generic_two_edges">必須交換兩個邊緣！</string>
+    <string name="solver_generic_two_corners">兩個角必須交換！</string>
     <string name="solver_generic_missing_center">%1$s的中心不见了！</string>
     <string name="solver_generic_missing_corner">沒有%1$s-%2$s-%3$s的角落!</string>
     <string name="solver_generic_missing_vertex">沒有%1$s-%2$s-%3$s八面體！</string>
     <string name="solver_generic_missing_edge">沒有1$s-%2$s邊！</string>
+    <string name="solver_generic_missing_corner2">沒有%1$s-%2$s的角落!</string>
     <string name="solver_generic_corners_cannot">角不能扭曲，這樣所有的面都是單色的！</string>
     <string name="solver_generic_vertices_cannot">八面體塊不能扭曲，所以所有面都是單色的！</string>
     <string name="solver_generic_c_v_dont_match">八面體塊和四面體角不匹配！</string>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index f6dd2cc1..e6f5fb41 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -104,10 +104,12 @@
     <string name="solver_generic_edge_twist">One edge has to be twisted!</string>
     <string name="solver_generic_two_centers">Two centers have to be exchanged!</string>
     <string name="solver_generic_two_edges">Two edges have to be exchanged!</string>
+    <string name="solver_generic_two_corners">Two corners have to be exchanged!</string>
     <string name="solver_generic_missing_center">The %1$s center is missing!</string>
     <string name="solver_generic_missing_corner">The %1$s-%2$s-%3$s corner is missing!</string>
     <string name="solver_generic_missing_vertex">The %1$s-%2$s-%3$s octahedron piece is missing!</string>
     <string name="solver_generic_missing_edge">The %1$s-%2$s edge is missing!</string>
+    <string name="solver_generic_missing_corner2">The %1$s-%2$s corner is missing!</string>
     <string name="solver_generic_corners_cannot">Corners cannot be twisted so that all faces are monochromatic!</string>
     <string name="solver_generic_vertices_cannot">Octahedral pieces cannot be twisted so that all faces are monochromatic!</string>
     <string name="solver_generic_c_v_dont_match">Octahedral pieces and tetrahedral corners do not match!</string>
