Added UROKO design function(size adjustment).
[chise/kage.git] / engine / kagecd.js
index 9d69aed..a28be90 100755 (executable)
@@ -1,3 +1,5 @@
+// may be it can join 3curve and 4curve. the difference is may be only calculating x,y,ix,iy\r
+\r
 function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){\r
   var rad, t;\r
   var x, y, v;\r
@@ -7,6 +9,7 @@ function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){
   var deltad;\r
   var XX, XY, YX, YY;\r
   var poly, poly2;\r
+       var hosomi;\r
   \r
   if(kage.kShotai == kage.kMincho){ // mincho\r
     switch(a1){\r
@@ -15,7 +18,7 @@ function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){
       delta = -1 * kage.kMinWidthY * 0.5;\r
       break;\r
     case 1:\r
-    case 2:\r
+    case 2: // must be 32\r
     case 6:\r
     case 22:\r
       delta = 0;\r
@@ -49,9 +52,9 @@ function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){
     case 8:\r
     case 7:\r
     case 9:\r
-    case 15:\r
-    case 14:\r
-    case 17:\r
+    case 15: // it can change to 15->5\r
+    case 14: // it can change to 14->4\r
+    case 17: // no need\r
     case 5:\r
       delta = 0;\r
       break;\r
@@ -74,6 +77,11 @@ function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){
       y4 = y4 + delta * Math.sin(rad) * v;\r
     }\r
     \r
+               hosomi = 0.5;\r
+               if(Math.sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)) < 50){\r
+                       hosomi += 0.4 * (1 - Math.sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)) / 50);\r
+               }\r
+\r
     poly = new Polygon();\r
     poly2 = new Polygon();\r
     for(tt = 0; tt <= 1000; tt = tt + kage.kRate){\r
@@ -101,9 +109,20 @@ function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){
         ib = kage.kMinWidthT;\r
       }\r
       \r
-      if(a1 == 7){ deltad = Math.sqrt(t); }\r
-      else if(a2 == 7){ deltad = Math.sqrt(1.0 - t); }\r
+      if(a1 == 7 && a2 == 0){ // L2RD: fatten\r
+        deltad = Math.pow(t, hosomi) * kage.kL2RDfatten;\r
+                       }\r
+      else if(a1 == 7){\r
+                               deltad = Math.pow(t, hosomi);\r
+                       }\r
+                       else if(a2 == 7){\r
+                               deltad = Math.pow(1.0 - t, hosomi);\r
+                       }\r
       else{ deltad = 1; }\r
+\r
+                       if(deltad < 0.15){\r
+                               deltad = 0.15;\r
+                       }\r
       ia = ia * deltad;\r
       ib = ib * deltad;\r
       \r
@@ -164,11 +183,11 @@ function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){
         }\r
       }\r
       else{ //bottom to up\r
-        if(x1 == x2){ //is it right?\r
+        if(x1 == x2){\r
           poly = new Polygon();\r
           poly.push(x1 - kage.kMinWidthT, y1);\r
           poly.push(x1 + kage.kMinWidthT, y1);\r
-          poly.push(x1 - kage.kMinWidthT, y1 + kage.kMinWidthY);\r
+          poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);\r
           polygons.push(poly);\r
         }\r
         else{\r
@@ -187,7 +206,7 @@ function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){
       poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);\r
       poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);\r
       poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);\r
-      poly.push(x1 - kage.kMinWidthT, y1);\r
+      poly.push(x1, y1 + kage.kMinWidthT);\r
       polygons.push(poly);\r
     }\r
     \r
@@ -195,42 +214,35 @@ function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){
       if(y1 <= y4){ //from up to bottom\r
         if(x1 == x2){\r
           poly = new Polygon();\r
-          poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5);\r
-          poly.push(x1 + kage.kMinWidthT + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY);\r
-          poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2);\r
+                                       poly.push(x1 + kage.kMinWidthT, y1);\r
+                                       poly.push(x1 + kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);\r
+          poly.push(x1 + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);\r
           polygons.push(poly);\r
         }\r
         else{\r
           poly = new Polygon();\r
-          poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5) * YX,\r
-                    y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5) * YY);\r
-          poly.push(x1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YX,\r
-                    y1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YY);\r
-          poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
-                    y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
+          poly.push(x1 + kage.kMinWidthT * XX,\r
+                    y1 + kage.kMinWidthT * XY);\r
+          poly.push(x1 + kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX,\r
+                    y1 + kage.kMinWidthT * 1.5 * XY + kage.kMinWidthY * YY);\r
+          poly.push(x1 + kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX,\r
+                    y1 + kage.kMinWidthT * 0.5 * XY + kage.kMinWidthY * 3 * YY);\r
           polygons.push(poly);\r
         }\r
       }\r
       else{ //from bottom to up\r
-        if(x1 == x2){ //is it right?\r
+        if(x1 == x2){\r
           poly = new Polygon();\r
-          poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY * 0.5);\r
-          poly.push(x1 + kage.kMinWidthT + kage.kMinWidthT * 0.5, y1 - kage.kMinWidthY * 0.5 - kage.kMinWidthY);\r
-          poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY * 0.5 - kage.kMinWidthY * 2);\r
+          poly.push(x1 - kage.kMinWidthT, y1);\r
+          poly.push(x1 - kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);\r
+          poly.push(x1 - kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);\r
           polygons.push(poly);\r
         }\r
-        else{ //SETSUGOUMEN GA KAKERUNODE HOKYOU\r
+        else{\r
           poly = new Polygon();\r
-          poly.push(x1 - (kage.kMinWidthT - 1) * XX + (kage.kMinWidthY * 0.5) * YX,\r
-                    y1 - (kage.kMinWidthT - 1) * XY + (kage.kMinWidthY * 0.5) * YY);\r
-          poly.push(x1 - (kage.kMinWidthT - 0) * XX + (kage.kMinWidthY * 0.5) * YX,\r
-                    y1 - (kage.kMinWidthT - 0) * XY + (kage.kMinWidthY * 0.5) * YY);\r
-          poly.push(x1 - (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YX,\r
-                    y1 - (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YY);\r
-          poly.push(x1 - (kage.kMinWidthT - 0) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
-                    y1 - (kage.kMinWidthT - 0) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
-          poly.push(x1 - (kage.kMinWidthT - 1) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
-                    y1 - (kage.kMinWidthT - 1) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
+          poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
+          poly.push(x1 - kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX, y1 + kage.kMinWidthY * YY - kage.kMinWidthT * 1.5 * XY);\r
+          poly.push(x1 - kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX, y1 + kage.kMinWidthY * 3 * YY - kage.kMinWidthT * 0.5 * XY);\r
           polygons.push(poly);\r
         }\r
       }\r
@@ -244,33 +256,33 @@ function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){
     XX = Math.cos(rad) * v;\r
     XY = Math.sin(rad) * v;\r
     \r
-    if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle\r
+    if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle ... it can change to 15->5\r
       if(x3 == x4){\r
         poly = Polygon();\r
         poly.push(x4 - kage.kMinWidthT, y4);\r
-        poly.push(x4 - kage.kMinWidthT * 0.6, y4 + kage.kMinWidthT * 0.6);\r
+        poly.push(x4 - kage.kMinWidthT * 0.7, y4 + kage.kMinWidthT * 0.7);\r
         poly.push(x4, y4 + kage.kMinWidthT);\r
-        poly.push(x4 + kage.kMinWidthT * 0.6, y4 + kage.kMinWidthT * 0.6);\r
+        poly.push(x4 + kage.kMinWidthT * 0.7, y4 + kage.kMinWidthT * 0.7);\r
         poly.push(x4 + kage.kMinWidthT, y4);\r
         polygons.push(poly);\r
       }\r
       else if(y3 == y4){\r
         poly = new Polygon();\r
         poly.push(x4, y4 - kage.kMinWidthT);\r
-        poly.push(x4 + kage.kMinWidthT * 0.6, y4 - kage.kMinWidthT * 0.6);\r
+        poly.push(x4 + kage.kMinWidthT * 0.7, y4 - kage.kMinWidthT * 0.7);\r
         poly.push(x4 + kage.kMinWidthT, y4);\r
-        poly.push(x4 + kage.kMinWidthT * 0.6, y4 + kage.kMinWidthT * 0.6);\r
+        poly.push(x4 + kage.kMinWidthT * 0.7, y4 + kage.kMinWidthT * 0.7);\r
         poly.push(x4, y4 + kage.kMinWidthT);\r
         polygons.push(poly);\r
       }\r
       else{\r
         poly = new Polygon();\r
         poly.push(x4 + Math.sin(rad) * kage.kMinWidthT * v, y4 - Math.cos(rad) * kage.kMinWidthT * v);\r
-        poly.push(x4 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v + Math.sin(rad) * kage.kMinWidthT * 0.6 * v,\r
-                  y4 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v - Math.cos(rad) * kage.kMinWidthT * 0.6 * v);\r
+        poly.push(x4 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v + Math.sin(rad) * kage.kMinWidthT * 0.7 * v,\r
+                  y4 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v - Math.cos(rad) * kage.kMinWidthT * 0.7 * v);\r
         poly.push(x4 + Math.cos(rad) * kage.kMinWidthT * v, y4 + Math.sin(rad) * kage.kMinWidthT * v);\r
-        poly.push(x4 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v - Math.sin(rad) * kage.kMinWidthT * 0.6 * v,\r
-                  y4 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v + Math.cos(rad) * kage.kMinWidthT * 0.6 * v);\r
+        poly.push(x4 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v - Math.sin(rad) * kage.kMinWidthT * 0.7 * v,\r
+                  y4 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v + Math.cos(rad) * kage.kMinWidthT * 0.7 * v);\r
         poly.push(x4 - Math.sin(rad) * kage.kMinWidthT * v, y4 + Math.cos(rad) * kage.kMinWidthT * v);\r
         polygons.push(poly);\r
       }\r
@@ -293,7 +305,7 @@ function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){
       }\r
     }\r
     \r
-    if(a2 == 15){ //jump up\r
+    if(a2 == 15){ //jump up ... it can change to 15->5\r
       if(y3 == y4){\r
         poly = new Polygon();\r
         poly.push(x4, y4 - kage.kMinWidthT + 1);\r
@@ -315,7 +327,7 @@ function cdDrawBezier(kage, polygons, x1, y1, x2, y2, x3, y3, x4, y4, a1, a2){
       }\r
     }\r
     \r
-    if(a2 == 14){ //jump to left, allways go left\r
+    if(a2 == 14){ //jump to left, allways go left ... it can change to 14->4\r
       poly = new Polygon();\r
       poly.push(x4, y4);\r
       poly.push(x4, y4 - kage.kMinWidthT);\r
@@ -477,6 +489,7 @@ function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
   var deltad;\r
   var XX, XY, YX, YY;\r
   var poly, poly2;\r
+       var hosomi;\r
   \r
   if(kage.kShotai == kage.kMincho){ // mincho\r
     switch(a1){\r
@@ -485,7 +498,7 @@ function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
       delta = -1 * kage.kMinWidthY * 0.5;\r
       break;\r
     case 1:\r
-    case 2:\r
+    case 2: // ... must be 32\r
     case 6:\r
     case 22:\r
       delta = 0;\r
@@ -518,9 +531,9 @@ function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
     case 1:\r
     case 7:\r
     case 9:\r
-    case 15:\r
-    case 14:\r
-    case 17:\r
+    case 15: // it can change to 15->5\r
+    case 14: // it can change to 14->4\r
+    case 17: // no need\r
     case 5:\r
       delta = 0;\r
       break;\r
@@ -545,6 +558,11 @@ function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
       x3 = x3 + delta * Math.cos(rad) * v;\r
       y3 = y3 + delta * Math.sin(rad) * v;\r
     }\r
+\r
+               hosomi = 0.5;\r
+               if(Math.sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)) < 50){\r
+                       hosomi += 0.4 * (1 - Math.sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)) / 50);\r
+               }\r
     \r
     poly = new Polygon();\r
     poly2 = new Polygon();\r
@@ -575,10 +593,20 @@ function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
         ib = kage.kMinWidthT;\r
       }\r
       \r
-      if(a1 == 7 && a2 == 0){ deltad = Math.sqrt(t) * kage.kL2RDfatten; } //L2RD: fatten\r
-      else if(a1 == 7){ deltad = Math.sqrt(t); }\r
-      else if(a2 == 7){ deltad = Math.sqrt(1.0 - t); }\r
+      if(a1 == 7 && a2 == 0){ // L2RD: fatten\r
+                                       deltad = Math.pow(t, hosomi) * kage.kL2RDfatten;\r
+                       }\r
+      else if(a1 == 7){\r
+                               deltad = Math.pow(t, hosomi);\r
+                       }\r
+                       else if(a2 == 7){\r
+                               deltad = Math.pow(1.0 - t, hosomi);\r
+                       }\r
       else{ deltad = 1; }\r
+      \r
+                       if(deltad < 0.15){\r
+                               deltad = 0.15;\r
+                       }\r
       ia = ia * deltad;\r
       ib = ib * deltad;\r
       \r
@@ -640,11 +668,11 @@ function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
         }\r
       }\r
       else{ //bottom to up\r
-        if(x1 == x2){ //is it right?\r
+        if(x1 == x2){\r
           poly = new Polygon();\r
           poly.push(x1 - kage.kMinWidthT, y1);\r
           poly.push(x1 + kage.kMinWidthT, y1);\r
-          poly.push(x1 - kage.kMinWidthT, y1 + kage.kMinWidthY);\r
+          poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY);\r
           polygons.push(poly);\r
         }\r
         else{\r
@@ -663,7 +691,7 @@ function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
       poly.push(x1, y1 - kage.kMinWidthY - kage.kWidth);\r
       poly.push(x1 + kage.kMinWidthT + kage.kWidth, y1 + kage.kMinWidthY);\r
       poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthT);\r
-      poly.push(x1 - kage.kMinWidthT, y1);\r
+      poly.push(x1, y1 + kage.kMinWidthT);\r
       polygons.push(poly);\r
     }\r
     \r
@@ -671,42 +699,35 @@ function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
       if(y1 <= y3){ //from up to bottom\r
         if(x1 == x2){\r
           poly = new Polygon();\r
-          poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5);\r
-          poly.push(x1 + kage.kMinWidthT + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY);\r
-          poly.push(x1 + kage.kMinWidthT, y1 + kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2);\r
+          poly.push(x1 + kage.kMinWidthT, y1);\r
+          poly.push(x1 + kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);\r
+          poly.push(x1 + kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);\r
           polygons.push(poly);\r
         }\r
         else{\r
           poly = new Polygon();\r
-          poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5) * YX,\r
-                    y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5) * YY);\r
-          poly.push(x1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YX,\r
-                    y1 + (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YY);\r
-          poly.push(x1 + kage.kMinWidthT * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
-                    y1 + kage.kMinWidthT * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
+          poly.push(x1 + kage.kMinWidthT * XX,\r
+                    y1 + kage.kMinWidthT * XY);\r
+          poly.push(x1 + kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX,\r
+                    y1 + kage.kMinWidthT * 1.5 * XY + kage.kMinWidthY * YY);\r
+          poly.push(x1 + kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX,\r
+                    y1 + kage.kMinWidthT * 0.5 * XY + kage.kMinWidthY * 3 * YY);\r
           polygons.push(poly);\r
         }\r
       }\r
       else{ //from bottom to up\r
-        if(x1 == x2){ //is it right?\r
+        if(x1 == x2){\r
           poly = new Polygon();\r
-          poly.push(x1 + kage.kMinWidthT, poly2[0].Y = y1 - kage.kMinWidthY * 0.5);\r
-          poly.push(x1 + kage.kMinWidthT + kage.kMinWidthT * 0.5, y1 - kage.kMinWidthY * 0.5 - kage.kMinWidthY);\r
-          poly.push(x1 + kage.kMinWidthT, y1 - kage.kMinWidthY * 0.5 - kage.kMinWidthY * 2);\r
+          poly.push(x1 - kage.kMinWidthT, y1);\r
+          poly.push(x1 - kage.kMinWidthT * 1.5, y1 + kage.kMinWidthY);\r
+          poly.push(x1 - kage.kMinWidthT * 0.5, y1 + kage.kMinWidthY * 3);\r
           polygons.push(poly);\r
         }\r
-        else{ //SETSUGOUMEN GA KAKERUNODE HOKYOU\r
+        else{\r
           poly = new Polygon();\r
-          poly.push(x1 - (kage.kMinWidthT - 1) * XX + (kage.kMinWidthY * 0.5) * YX,\r
-                    y1 - (kage.kMinWidthT - 1) * XY + (kage.kMinWidthY * 0.5) * YY);\r
-          poly.push(x1 - (kage.kMinWidthT - 0) * XX + (kage.kMinWidthY * 0.5) * YX,\r
-                    y1 - (kage.kMinWidthT - 0) * XY + (kage.kMinWidthY * 0.5) * YY);\r
-          poly.push(x1 - (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YX,\r
-                    y1 - (kage.kMinWidthT + kage.kMinWidthT * 0.5) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY) * YY);\r
-          poly.push(x1 - (kage.kMinWidthT - 0) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
-                    y1 - (kage.kMinWidthT - 0) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
-          poly.push(x1 - (kage.kMinWidthT - 1) * XX + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YX,\r
-                    y1 - (kage.kMinWidthT - 1) * XY + (kage.kMinWidthY * 0.5 + kage.kMinWidthY * 2) * YY);\r
+          poly.push(x1 - kage.kMinWidthT * XX, y1 - kage.kMinWidthT * XY);\r
+          poly.push(x1 - kage.kMinWidthT * 1.5 * XX + kage.kMinWidthY * YX, y1 + kage.kMinWidthY * YY - kage.kMinWidthT * 1.5 * XY);\r
+          poly.push(x1 - kage.kMinWidthT * 0.5 * XX + kage.kMinWidthY * 3 * YX, y1 + kage.kMinWidthY * 3 * YY - kage.kMinWidthT * 0.5 * XY);\r
           polygons.push(poly);\r
         }\r
       }\r
@@ -720,39 +741,39 @@ function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
     XX = Math.cos(rad) * v;\r
     XY = Math.sin(rad) * v;\r
     \r
-    if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle\r
+    if(a2 == 1 || a2 == 8 || a2 == 15){ //the last filled circle ... it can change 15->5\r
       if(x2 == x3){\r
         poly = new Polygon();\r
         poly.push(x3 - kage.kMinWidthT, y3);\r
-        poly.push(x3 - kage.kMinWidthT * 0.6, y3 + kage.kMinWidthT * 0.6);\r
+        poly.push(x3 - kage.kMinWidthT * 0.7, y3 + kage.kMinWidthT * 0.7);\r
         poly.push(x3, y3 + kage.kMinWidthT);\r
-        poly.push(x3 + kage.kMinWidthT * 0.6, y3 + kage.kMinWidthT * 0.6);\r
+        poly.push(x3 + kage.kMinWidthT * 0.7, y3 + kage.kMinWidthT * 0.7);\r
         poly.push(x3 + kage.kMinWidthT, y3);\r
         polygons.push(poly);\r
       }\r
       else if(y2 == y3){\r
         poly = new Polygon();\r
         poly.push(x3, y3 - kage.kMinWidthT);\r
-        poly.push(x3 + kage.kMinWidthT * 0.6, y3 - kage.kMinWidthT * 0.6);\r
+        poly.push(x3 + kage.kMinWidthT * 0.7, y3 - kage.kMinWidthT * 0.7);\r
         poly.push(x3 + kage.kMinWidthT, y3);\r
-        poly.push(x3 + kage.kMinWidthT * 0.6, y3 + kage.kMinWidthT * 0.6);\r
+        poly.push(x3 + kage.kMinWidthT * 0.7, y3 + kage.kMinWidthT * 0.7);\r
         poly.push(x3, y3 + kage.kMinWidthT);\r
         polygons.push(poly);\r
       }\r
       else{\r
         poly = new Polygon();\r
         poly.push(x3 + Math.sin(rad) * kage.kMinWidthT * v, y3 - Math.cos(rad) * kage.kMinWidthT * v);\r
-        poly.push(x3 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v + Math.sin(rad) * kage.kMinWidthT * 0.6 * v,\r
-                  y3 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v - Math.cos(rad) * kage.kMinWidthT * 0.6 * v);\r
+        poly.push(x3 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v + Math.sin(rad) * kage.kMinWidthT * 0.7 * v,\r
+                  y3 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v - Math.cos(rad) * kage.kMinWidthT * 0.7 * v);\r
         poly.push(x3 + Math.cos(rad) * kage.kMinWidthT * v, y3 + Math.sin(rad) * kage.kMinWidthT * v);\r
-        poly.push(x3 + Math.cos(rad) * kage.kMinWidthT * 0.8 * v - Math.sin(rad) * kage.kMinWidthT * 0.6 * v,\r
-                  y3 + Math.sin(rad) * kage.kMinWidthT * 0.8 * v + Math.cos(rad) * kage.kMinWidthT * 0.6 * v);\r
+        poly.push(x3 + Math.cos(rad) * kage.kMinWidthT * 0.7 * v - Math.sin(rad) * kage.kMinWidthT * 0.7 * v,\r
+                  y3 + Math.sin(rad) * kage.kMinWidthT * 0.7 * v + Math.cos(rad) * kage.kMinWidthT * 0.7 * v);\r
         poly.push(x3 - Math.sin(rad) * kage.kMinWidthT * v, y3 + Math.cos(rad) * kage.kMinWidthT * v);\r
         polygons.push(poly);\r
       }\r
     }\r
     \r
-    if(a2 == 9 || (a1 == 7 && a2 == 0)){ // Math.sinnyu & L2RD Harai\r
+    if(a2 == 9 || (a1 == 7 && a2 == 0)){ // Math.sinnyu & L2RD Harai ... no need for a2=9\r
       if(y2 == y3){\r
         poly = new Polygon();\r
         poly.push(x3, y3 + kage.kMinWidthT * kage.kL2RDfatten);\r
@@ -770,7 +791,7 @@ function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
       }\r
     }\r
     \r
-    if(a2 == 15){ //jump up\r
+    if(a2 == 15){ //jump up ... it can change 15->5\r
       if(y2 == y3){\r
         poly = new Polygon();\r
         poly.push(x3, y3 - kage.kMinWidthT + 1);\r
@@ -792,7 +813,7 @@ function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
       }\r
     }\r
     \r
-    if(a2 == 14){ //jump to left, allways go left\r
+    if(a2 == 14){ //jump to left, allways go left ... it can change 14->4\r
       poly = new Polygon();\r
       poly.push(x3, y3);\r
       poly.push(x3, y3 - kage.kMinWidthT);\r
@@ -949,7 +970,7 @@ function cdDrawCurve(kage, polygons, x1, y1, x2, y2, x3, y3, a1, a2){
 function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){\r
   var rad;\r
   var v, x1, y1, x2, y2;\r
-  var a1, a2;\r
+  var a1, a2, opt1, opt2;\r
   var XX, XY, YX, YY;\r
   var poly;\r
   \r
@@ -958,8 +979,10 @@ function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){
     y1 = ty1;\r
     x2 = tx2;\r
     y2 = ty2;\r
-    a1 = ta1;\r
-    a2 = ta2;\r
+    a1 = ta1 % 100;\r
+    a2 = ta2 % 100;\r
+    opt1 = Math.floor(ta1 / 100);\r
+    opt2 = Math.floor(ta2 / 100);\r
     \r
     if(x1 == x2){ //if TATE stroke, use y-axis\r
       poly = new Polygon(4);\r
@@ -969,7 +992,7 @@ function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){
         poly.set(0, x1 + kage.kMinWidthT, y1 + kage.kMinWidthY / 2);\r
         break;\r
       case 1:\r
-      case 6:\r
+      case 6: //... no need\r
       case 22:\r
         poly.set(3, x1 - kage.kMinWidthT, y1);\r
         poly.set(0, x1 + kage.kMinWidthT, y1);\r
@@ -986,7 +1009,7 @@ function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){
       \r
       switch(a2){\r
       case 0:\r
-        if(a1 == 6){ //KAGI's tail\r
+        if(a1 == 6){ //KAGI's tail ... no need\r
           poly.set(2, x2 - kage.kMinWidthT, y2);\r
           poly.set(1, x2 + kage.kMinWidthT, y2);\r
         }\r
@@ -1000,12 +1023,12 @@ function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){
         poly.set(1, x2 + kage.kMinWidthT, y2);\r
         break;\r
       case 13:\r
-        poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kWidth * kage.kKakato + kage.kMinWidthT);\r
-        poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kWidth * kage.kKakato);\r
+        poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kAdjustKakatoL[opt2] + kage.kMinWidthT);\r
+        poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kAdjustKakatoL[opt2]);\r
         break;\r
       case 23:\r
-        poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kWidth * kage.kKakato * 0.5 + kage.kMinWidthT);\r
-        poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kWidth * kage.kKakato * 0.5);\r
+        poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kAdjustKakatoR[opt2] + kage.kMinWidthT);\r
+        poly.set(1, x2 + kage.kMinWidthT, y2 + kage.kAdjustKakatoR[opt2]);\r
         break;\r
       case 32:\r
         poly.set(2, x2 - kage.kMinWidthT, y2 + kage.kMinWidthY);\r
@@ -1033,14 +1056,14 @@ function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){
         polygons.push(poly);\r
       }\r
       \r
-      if((a1 == 6 && a2 == 0) || a2 == 1){ //KAGI NO YOKO BOU NO SAIGO NO MARU\r
+      if((a1 == 6 && a2 == 0) || a2 == 1){ //KAGI NO YOKO BOU NO SAIGO NO MARU ... no need only used at 1st=yoko\r
         poly = new Polygon();\r
         poly.push(x2 - kage.kMinWidthT, y2);\r
         poly.push(x2 - kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);\r
         poly.push(x2, y2 + kage.kMinWidthT);\r
         poly.push(x2 + kage.kMinWidthT * 0.6, y2 + kage.kMinWidthT * 0.6);\r
         poly.push(x2 + kage.kMinWidthT, y2);\r
-       poly.reverse(); // for fill-rule\r
+        poly.reverse(); // for fill-rule\r
         polygons.push(poly);\r
       }\r
     }\r
@@ -1053,7 +1076,7 @@ function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){
         poly.push(x1, y1 + kage.kMinWidthT);\r
         polygons.push(poly);\r
         \r
-        if(a2 == 1 || a2 == 0 || a2 == 5){\r
+        if(a2 == 1 || a2 == 0 || a2 == 5){ // no need a2=1\r
           //KAGI NO YOKO BOU NO SAIGO NO MARU\r
           poly = new Polygon();\r
           poly.push(x2, y2 - kage.kMinWidthT);\r
@@ -1076,36 +1099,20 @@ function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){
         }\r
       }\r
       else{\r
+        //always same\r
         poly = new Polygon(4);\r
-        switch(a1){\r
-        case 0:\r
-          poly.set(0, x1, y1 - kage.kMinWidthY);\r
-          poly.set(3, x1, y1 + kage.kMinWidthY);\r
-          break;\r
-        case 2:\r
-          poly.set(0, x1 - kage.kMinWidthT, y1 - kage.kMinWidthY);\r
-          poly.set(3, x1 - kage.kMinWidthT, y1 + kage.kMinWidthY);\r
-          break;\r
-        }\r
-        \r
-        switch(a2){\r
-        case 0:\r
-          poly.set(1, x2, y2 - kage.kMinWidthY);\r
-          poly.set(2, x2, y2 + kage.kMinWidthY);\r
-          break;\r
-        case 2:\r
-          poly.set(1, x2 + kage.kMinWidthT, y2 - kage.kMinWidthY);\r
-          poly.set(2, x2 + kage.kMinWidthT, y2 + kage.kMinWidthY);\r
-        }\r
-        \r
+        poly.set(0, x1, y1 - kage.kMinWidthY);\r
+        poly.set(1, x2, y2 - kage.kMinWidthY);\r
+        poly.set(2, x2, y2 + kage.kMinWidthY);\r
+        poly.set(3, x1, y1 + kage.kMinWidthY);\r
         polygons.push(poly);\r
         \r
         //UROKO\r
         if(a2 == 0){\r
           poly = new Polygon();\r
           poly.push(x2, y2 - kage.kMinWidthY);\r
-          poly.push(x2 - 24, y2);\r
-          poly.push(x2 - 12, y2 - 12);\r
+          poly.push(x2 - kage.kAdjustUrokoX[opt2], y2);\r
+          poly.push(x2 - kage.kAdjustUrokoX[opt2] / 2, y2 - kage.kAdjustUrokoY[opt2]);\r
           polygons.push(poly);\r
         }\r
       }\r
@@ -1113,40 +1120,20 @@ function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){
     else{ //for others, use x-axis\r
       rad = Math.atan((y2 - y1) / (x2 - x1));\r
       if((Math.abs(y2 - y1) < Math.abs(x2 - x1)) && (a1 != 6) && (a2 != 6) && !(x1 > x2)){ //ASAI KAUDO\r
+        //always same\r
         poly = new Polygon(4);\r
-        switch(a1){ //must be 0 or 2\r
-        case 0:\r
-          poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthY, y1 - Math.cos(rad) * kage.kMinWidthY);\r
-          poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthY, y1 + Math.cos(rad) * kage.kMinWidthY);\r
-          break;\r
-        case 2:\r
-          poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthY - kage.kMinWidthT * Math.cos(rad),\r
-                   y1 - Math.cos(rad) * kage.kMinWidthY - kage.kMinWidthT * Math.sin(rad));\r
-          poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthY - kage.kMinWidthT * Math.cos(rad),\r
-                   y1 + Math.cos(rad) * kage.kMinWidthY - kage.kMinWidthT * Math.sin(rad));\r
-          break;\r
-        }\r
-        \r
-        switch(a2){ //must be 0 or 2\r
-        case 0:\r
-          poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);\r
-          poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthY, y2 + Math.cos(rad) * kage.kMinWidthY);\r
-          break;\r
-        case 2:\r
-          poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthY + kage.kMinWidthT * Math.cos(rad),\r
-                   y2 - Math.cos(rad) * kage.kMinWidthY + kage.kMinWidthT * Math.sin(rad));\r
-          poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthY + kage.kMinWidthT * Math.cos(rad),\r
-                   y2 + Math.cos(rad) * kage.kMinWidthY + kage.kMinWidthT * Math.sin(rad));\r
-        }\r
-        \r
+        poly.set(0, x1 + Math.sin(rad) * kage.kMinWidthY, y1 - Math.cos(rad) * kage.kMinWidthY);\r
+        poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);\r
+        poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthY, y2 + Math.cos(rad) * kage.kMinWidthY);\r
+        poly.set(3, x1 - Math.sin(rad) * kage.kMinWidthY, y1 + Math.cos(rad) * kage.kMinWidthY);\r
         polygons.push(poly);\r
         \r
         //UROKO\r
         if(a2 == 0){\r
           poly = new Polygon();\r
           poly.push(x2 + Math.sin(rad) * kage.kMinWidthY, y2 - Math.cos(rad) * kage.kMinWidthY);\r
-          poly.push(x2 - Math.cos(rad) * 24, y2 - Math.sin(rad) * 24);\r
-          poly.push(x2 - Math.cos(rad) * 12 + Math.sin(rad) * 12, y2 - Math.sin(rad) * 12 - Math.cos(rad) * 12);\r
+          poly.push(x2 - Math.cos(rad) * kage.kAdjustUrokoX[opt2], y2 - Math.sin(rad) * kage.kAdjustUrokoX[opt2]);\r
+          poly.push(x2 - Math.cos(rad) * kage.kAdjustUrokoX[opt2] / 2 + Math.sin(rad) * kage.kAdjustUrokoX[opt2] / 2, y2 - Math.sin(rad) * kage.kAdjustUrokoY[opt2] - Math.cos(rad) * kage.kAdjustUrokoY[opt2]);\r
           polygons.push(poly);\r
         }\r
       }\r
@@ -1194,23 +1181,23 @@ function cdDrawLine(kage, polygons, tx1, ty1, tx2, ty2, ta1, ta2){
                      y2 + Math.cos(rad) * kage.kMinWidthT * v + kage.kMinWidthT * 0.5 * Math.sin(rad) * v);\r
           }\r
           break;\r
-        case 1:\r
+        case 1: // is needed?\r
         case 5:\r
           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v, y2 - Math.cos(rad) * kage.kMinWidthT * v);\r
           poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v, y2 + Math.cos(rad) * kage.kMinWidthT * v);\r
           break;\r
         case 13:\r
-          poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kWidth * kage.kKakato * Math.cos(rad) * v,\r
-                   y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kWidth * kage.kKakato * Math.sin(rad) * v);\r
-          poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kWidth * kage.kKakato + kage.kMinWidthT) * Math.cos(rad) * v,\r
-                   y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kWidth * kage.kKakato + kage.kMinWidthT) * Math.sin(rad) * v);\r
+          poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoL[opt2] * Math.cos(rad) * v,\r
+                   y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoL[opt2] * Math.sin(rad) * v);\r
+          poly.set(2, x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoL[opt2] + kage.kMinWidthT) * Math.cos(rad) * v,\r
+                   y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoL[opt2] + kage.kMinWidthT) * Math.sin(rad) * v);\r
           break;\r
         case 23:\r
-          poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kWidth * kage.kKakato * 0.5 * Math.cos(rad) * v,\r
-                   y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kWidth * kage.kKakato * 0.5 * Math.sin(rad) * v);\r
+          poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoR[opt2] * Math.cos(rad) * v,\r
+                   y2 - Math.cos(rad) * kage.kMinWidthT * v + kage.kAdjustKakatoR[opt2] * Math.sin(rad) * v);\r
           poly.set(2,\r
-                   x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kWidth * kage.kKakato * 0.5 + kage.kMinWidthT) * Math.cos(rad) * v,\r
-                   y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kWidth * kage.kKakato * 0.5 + kage.kMinWidthT) * Math.sin(rad) * v);\r
+                   x2 - Math.sin(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoR[opt2] + kage.kMinWidthT) * Math.cos(rad) * v,\r
+                   y2 + Math.cos(rad) * kage.kMinWidthT * v + (kage.kAdjustKakatoR[opt2] + kage.kMinWidthT) * Math.sin(rad) * v);\r
           break;\r
         case 32:\r
           poly.set(1, x2 + Math.sin(rad) * kage.kMinWidthT * v + kage.kMinWidthY * Math.cos(rad) * v,\r