// TRANSLATE AND OUTPUT MOVES - we can either remove this completely,
// or update it so that Draft4's moves are displayed on-screen.
void TROUT (int8_t OLDPOS, int8_t NEWPOS, int8_t * MODEp) {
#define MODE (*MODEp)
//int8_t OLDX, OLDY, NEWX, NEWY;
(void)OLDPOS;(void)NEWPOS;
//OLDY = OLDPOS / 10;
//OLDX = OLDPOS - 10 * OLDY;
//NEWY = NEWPOS / 10;
//NEWX = NEWPOS - 10 * NEWY;
if (MODE == 0) { // MODE == 1 is when adding subsequent moves after jumps to output.
// p ("\nDRAFT4's move is ");
MODE = 1;
} else {
// p (" , ");
}
// print_symbol ((char) OLDX + 'A');
// print_symbol ((char) OLDY + '1');
// print_symbol ('-');
// print_symbol ((char) NEWX + 'A');
// print_symbol ((char) NEWY + '1');
}
int8_t position_of (char S1, char S2) {
return (int8_t) ((S1 - 'A') + 10 * (S2 - '1'));
}
static int8_t STATE;
static int8_t STATE_PieceNum;
static int8_t STATE_FromX;
static int8_t STATE_FromY;
static int8_t STATE_ToPos;
#define STATE_TIMEOUT STATE_ToPos /* re-using a variable which is not needed when outputting error */
static int8_t STATE_ToX;
static int8_t STATE_ToY;
static int8_t STATE_icon_style;
static inline void POS2XY (int8_t POS, int8_t *XP, int8_t *YP) {
int8_t X, Y;
Y = POS / 10;
X = POS - 10 * Y; // 1:8
X -= 4;
Y -= 4;
X *= 20;
Y *= 20;
*XP = X;
*YP = Y;
}
static inline void GetIcon (int8_t I, int8_t *XP, int8_t *YP, int8_t *icon_style) {
if (I <= 12) {
*icon_style = COMP_COLOUR == 'B' ? 0 : 1;
POS = COMP_POS (I);
if (CKTYPE(COMP_TYPE (I)) == CROWN)
*icon_style |= 2;
} else {
I -= 12; assert(1 <= I && I <= 12);
*icon_style = COMP_COLOUR == 'B' ? 1 : 0;
POS = OPP_POS (I);
if (CKTYPE(OPP_TYPE (I)) == CROWN)
*icon_style |= 2;
}
POS2XY (POS, XP, YP);
}
static inline void Display_Piece (int8_t X, int8_t Y, int8_t style) {
static const int white_big[] = {
// 0, 0, 0, // adjustment for corner/center!
-1, 120, 120, -1, 120,0, -1, 120,-120, -1,0,-120,
-1,-120,-120, -1,-120,0, -1,-120, 120, -1,0, 120,
1
};
set_scale(BIG_SCALE);
Reset0Ref();
switch (style) {
case 0: /* white uncrowned */
Moveto_d(Y+1/*+3*/,X+9);
set_scale(TINY_SCALE);
Intensity_a((uint8_t)(WHITE_INTENSITY-Dim));
break;
case 1: /* black uncrowned */
Moveto_d(Y+1/*+3*/,X+9);
set_scale(TINY_SCALE);
Intensity_a((uint8_t)(BLACK_INTENSITY-Dim));
break;
case 2: /* white crowned */
Moveto_d(Y+1/*+3*/,X+9);
set_scale(TINY_SCALE);
Intensity_a((uint8_t)(WHITE_INTENSITY-Dim));
#ifdef PIZERO
Draw_Line_d(120,120);
Draw_Line_d(120,0);
Draw_Line_d(120,-120);
Draw_Line_d(0,-120);
Draw_Line_d(-120,-120);
Draw_Line_d(-120,0);
Draw_Line_d(-120,120);
Draw_Line_d(0,120);
Moveto_d(100,-25);
#else
Draw_VLp((int8_t *)white_big);
Moveto_d(-20,35);
#endif
set_scale(TINY_SCALE_CROWNED);
break;
case 3: /* black crowned */
Moveto_d(Y+1/*+3*/,X+9);
set_scale(TINY_SCALE);
Intensity_a((uint8_t)(BLACK_INTENSITY-Dim));
#ifdef PIZERO
Draw_Line_d(120,120);
Draw_Line_d(120,0);
Draw_Line_d(120,-120);
Draw_Line_d(0,-120);
Draw_Line_d(-120,-120);
Draw_Line_d(-120,0);
Draw_Line_d(-120,120);
Draw_Line_d(0,120);
Moveto_d(100,-25);
#else
Draw_VLp((int8_t *)white_big);
Moveto_d(-20,35);
#endif
set_scale(TINY_SCALE_CROWNED);
break;
case 4: /* cursor box */;
Moveto_d (Y, X);
set_scale (SMALL_SCALE);
if ((Flash&128) == 0) Intensity_a((uint8_t)(WHITE_INTENSITY-Dim)); else Intensity_a((uint8_t)(BLACK_INTENSITY-Dim));
//Draw_VLp((int8_t *)box);
Moveto_d(-10,-11);
Draw_Line_d(0,80);
Draw_Line_d(80,0);
Draw_Line_d(0,-80);
Draw_Line_d(-80,0);
//Moveto_d(-20,35);
return;
}
// BUG: the diagonal sides should not be 120,120 but LENGTH 120, so 120/sqrt(2) - leave for now
#ifdef PIZERO
Draw_Line_d(120,120);
Draw_Line_d(120,0);
Draw_Line_d(120,-120);
Draw_Line_d(0,-120);
Draw_Line_d(-120,-120);
Draw_Line_d(-120,0);
Draw_Line_d(-120,120);
Draw_Line_d(0,120);
#else
Draw_VLp((int8_t *)white_big);
#endif
}
void Fadein_text(void) {
Reset0Ref ();
#ifdef BOARDHACK
if (STATE_TIMEOUT==0) Intensity_a((uint8_t)(DIM)); else Intensity_a((uint8_t)(Dim));
#else
Intensity_a(0x7f);
#endif
}
void Dim_Board(void) {
#ifdef BOARDHACK
if (STATE_TIMEOUT < 0) Dim += 1;
else if (STATE_TIMEOUT > 0) Dim -= 1;
if (Dim >= MAXDIM) Dim = MAXDIM;
if (Dim < 0) Dim = 0;
#endif
Dim=MAXDIM;Display_board (0);Dim=0;
}
void Display_board (int8_t IgnoringP) {
int8_t icon_style, I, J, X, Y, intensity_of_missing_piece=0x7F;
(void)J;
#ifdef DRAWGRID
set_scale(0x51);
Intensity_a(BACKGROUND_INTENSITY-(uint8_t)Dim);
// verticals
#ifdef INTERLACE
if (Flash&1)
#endif
for (I = 0; I < 9; I++) {
Reset0Ref(); Intensity_a(BACKGROUND_INTENSITY-(uint8_t)Dim);Moveto_d(120, (I-4)*31-4); Draw_Line_d(-124,0);Draw_Line_d(-124,0);
}
// horizontals
#ifdef INTERLACE
if (!(Flash&1))
#endif
for (I = 0; I < 9; I++) {
Reset0Ref(); Intensity_a(BACKGROUND_INTENSITY-(uint8_t)Dim);Moveto_d((I-4)*31-4, 120); Draw_Line_d(0,-124);Draw_Line_d(0,-124);
}
#endif
// and optionally, diagonals through the unused square colour
// (Officially, the pieces are black and red, and the board is red and green!)
#ifdef DRAWHATCH
set_scale(0x51);
for (J = 120; J >= -4; J-=124) {
for (I = 0; I < 8; I+=2) {
Reset0Ref(); Intensity_a(BACKGROUND_INTENSITY-(uint8_t)Dim);Moveto_d(J, (I-4)*31-4);
X = 4*31; Y = -124;
if (I > 4) { X = (8-I)*31; Y = ((4-(8-I))*31)-124; }
Draw_Line_d(Y,X);
}
Reset0Ref(); Intensity_a(BACKGROUND_INTENSITY-(uint8_t)Dim);Moveto_d(J-62, -128); Draw_Line_d(-62,62);
}
#endif
#ifdef DRAWHATCHBACK
// hatch in other direction. needs different calculation - not a mirror...
#endif
// If Piece IgnoringP is on the board, *do not* draw it.
// IgnoringP in range 1:12 and 13:24
// Computer's pieces:
Intensity_a(BLACK_INTENSITY-(uint8_t)Dim);
for (I = 1; I <= COMP_NUM; I++) {
if (IgnoringP != I) {
GetIcon (I, &X, &Y, &icon_style);
Display_Piece (X, Y, icon_style);
} else intensity_of_missing_piece = BLACK_INTENSITY-Dim;
}
IgnoringP -= 12;
// Human's pieces:
Intensity_a(WHITE_INTENSITY-(uint8_t)Dim);
for (I = 1; I <= OPP_NUM; I++) {
if (IgnoringP != I) {
GetIcon (I + 12, &X, &Y, &icon_style);
Display_Piece (X, Y, icon_style);
} else intensity_of_missing_piece = WHITE_INTENSITY-Dim;
}
Intensity_a((uint8_t)intensity_of_missing_piece); // assumes missing piece is displayed immediately after...
}
void Animate (int8_t PieceNum, int8_t NewPos) {
STATE_PieceNum = PieceNum;
STATE_ToPos = NewPos;
GetIcon (PieceNum, &STATE_FromX, &STATE_FromY, &STATE_icon_style);
POS2XY (STATE_ToPos, &STATE_ToX, &STATE_ToY);
}
static int8_t Cursor_X, Cursor_Y;