#define gpp getplayerproperty
#define cpp changeplayerproperty
#define gep getentityproperty
#define cep changeentityproperty
#define ov openborvariant
#define cv changeopenborvariant
#define oc openborconstant
#define glv getlocalvar
#define slv setlocalvar
#define sev setentityvar
#define gev getentityvar
#define sgv setglobalvar
#define ggv getglobalvar
#define glvp getlevelproperty
#define clvp changelevelproperty
#define glp getlayerproperty
#define clp changelayerproperty
char draw_fontstring(int x, int y, int z, int sortid, char str, char font_path, int wfont, int hfont, char mem_var, int reset_flag, void screen, int monospace_flag, int space_pixel) {
int i = 0;
int wchar = wfont/16;
int hchar = hfont/16;
int down_space = 0, xshift = 0, escape_n = 0;
if ( sortid == NULL() ) sortid = 0;
if ( z == NULL() ) z = 2000;
str += ""; // format to string
for ( i = 0; i < strlength(str); ++i ) {
char chara = getchar(str,i);
int chara_int = byte_to_int(chara);
if ( chara == "\n" ) {
down_space += hchar;
xshift = (i-escape_n)*wchar;
++escape_n;
}
draw_fontchar(x + i*wchar - xshift,y+down_space,z,sortid,font_path,wfont,hfont,chara_int,mem_var,reset_flag,screen,monospace_flag,space_pixel,chara);
}
slv("__prev_dx_space",NULL());
slv("__prev_sx_space",NULL());
}
char draw_fontchar(int x, int y, int z, int sortid, char font_path, int wfont, int hfont, int value, char mem_var, int reset_flag, void screen, int monospace_flag, int space_pixel, char chara) {
void font = getlocalvar(mem_var);
if ( font == NULL() ) { font = loadsprite(font_path); setlocalvar(mem_var,font); font = getlocalvar(mem_var); }
if ( reset_flag > 0 && font ) { free(font); setlocalvar(mem_var,NULL()); return (""); }
if ( font ) {
//int wfont = getgfxproperty(font, "srcwidth");
//int hfont = getgfxproperty(font, "srcheight");
int wchar = wfont/16;
int hchar = hfont/16;
int row = 0, column = 0;
int sx_space = 0, dx_space = 0;
int xcoord, ycoord, prev_sx_space = 0, prev_dx_space = 0;
row = value%16;
column = trunc(value/16);
xcoord = row*wchar;
ycoord = column*hchar;
//changedrawmethod(NULL(), "reset", 1);
changedrawmethod(NULL(), "enabled", 1);
// shift the single chara to (0,0) coords. then shift it to x,y coords
x = 0 - xcoord + x;
y = 0 - ycoord + y;
// ### MONOSPACE ###
if ( monospace_flag != NULL() && monospace_flag > 0 ) {
int i1 = 0, i2 = 0;
int tmp_space = wchar;
int space_flag = 0;
// scan sx -> dx
i1 = 0; i2 = 0; tmp_space = wchar;
for ( i2 = ycoord; i2 < ycoord+hchar; ++i2 ) {
sx_space = 0;
for ( i1 = xcoord; i1 < xcoord+wchar; ++i1 ) {
int pixel;
pixel = getgfxproperty(font,"pixel",i1,i2);
if ( pixel == 0 ) ++sx_space;
else break;
}
if ( sx_space < tmp_space ) tmp_space = sx_space;
if ( tmp_space == 0 ) break;
}
if ( tmp_space != wchar ) sx_space = tmp_space;
else { sx_space = 0; space_flag = 1; }
// scan dx -> sx
i1 = 0; i2 = 0; tmp_space = wchar;
for ( i2 = ycoord; i2 < ycoord+hchar; ++i2 ) {
dx_space = 0;
for ( i1 = xcoord+wchar-1; i1 >= xcoord; --i1 ) {
int pixel;
pixel = getgfxproperty(font,"pixel",i1,i2);
if ( pixel == 0 ) ++dx_space;
else break;
}
if ( dx_space < tmp_space ) tmp_space = dx_space;
if ( tmp_space == 0 ) break;
}
if ( tmp_space != wchar ) dx_space = tmp_space;
else { dx_space = 0; space_flag = 1; }
if ( space_flag == 1 ) {
sx_space = 0;
if ( space_pixel == NULL() ) space_pixel = 2;
dx_space = wchar-space_pixel;
wchar = space_pixel;
}
if ( glv("__prev_dx_space") == NULL() ) slv("__prev_dx_space",0);
prev_dx_space = glv("__prev_dx_space");
slv("__prev_dx_space",glv("__prev_dx_space")+dx_space);
if ( glv("__prev_sx_space") == NULL() ) slv("__prev_sx_space",0);
prev_sx_space = glv("__prev_sx_space");
slv("__prev_sx_space",glv("__prev_sx_space")+sx_space);
}
// ### MONOSPACE ###
changedrawmethod(NULL(), "clipx", xcoord + x-prev_dx_space-prev_sx_space);
changedrawmethod(NULL(), "clipy", ycoord + y);
changedrawmethod(NULL(), "cliph", hchar);
changedrawmethod(NULL(), "clipw", wchar);
if ( screen == NULL() ) drawsprite(font, x-prev_dx_space-prev_sx_space, y, z, sortid);
else drawspritetoscreen(font, screen, x-prev_dx_space-prev_sx_space, y);
//changedrawmethod(NULL(), "reset", 1);
changedrawmethod(NULL(), "enabled", 0);
}
return ("");
}
int trunc(int num) {
return num%(num+1);
}
char getchar(char str, int index) {
if ( index >= strlength(str) ) index = strlength(str)-1;
else if ( index < 0 ) index = 0;
if ( strlength(str) > 0 ) {
str = strright(str, index);
if ( strlength(str) > 1 ) {
index = 1;
str = strleft(str, index);
}
} //else str = "";
return str;
}
int byte_to_int(char character) {
if ( character == "\0" ) return 0;
else if ( character == "" ) return 1;
else if ( character == "" ) return 2;
else if ( character == "" ) return 3;
else if ( character == "" ) return 4;
else if ( character == "" ) return 5;
else if ( character == "" ) return 6;
else if ( character == "" ) return 7;
else if ( character == "" ) return 8;
else if ( character == " " ) return 9;
else if ( character == "
" ) return 10;
else if ( character == "" ) return 11;
else if ( character == "" ) return 12;
else if ( character == "
" ) return 13;
else if ( character == "" ) return 14;
else if ( character == "" ) return 15;
else if ( character == "" ) return 16;
else if ( character == "" ) return 17;
else if ( character == "" ) return 18;
else if ( character == "" ) return 19;
else if ( character == "" ) return 20;
else if ( character == "" ) return 21;
else if ( character == "" ) return 22;
else if ( character == "" ) return 23;
else if ( character == "" ) return 24;
else if ( character == "" ) return 25;
else if ( character == "" ) return 26;
else if ( character == "" ) return 27;
else if ( character == "" ) return 28;
else if ( character == "" ) return 29;
else if ( character == "" ) return 30;
else if ( character == "" ) return 31;
else if ( character == " " ) return 32;
else if ( character == "!" ) return 33;
else if ( character == "\"" ) return 34;
else if ( character == "#" ) return 35;
else if ( character == "$" ) return 36;
else if ( character == "%" ) return 37;
else if ( character == "&" ) return 38;
else if ( character == "'" ) return 39;
else if ( character == "(" ) return 40;
else if ( character == ")" ) return 41;
else if ( character == "*" ) return 42;
else if ( character == "+" ) return 43;
else if ( character == "," ) return 44;
else if ( character == "-" ) return 45;
else if ( character == "." ) return 46;
else if ( character == "/" ) return 47;
else if ( character == "0" ) return 48;
else if ( character == "1" ) return 49;
else if ( character == "2" ) return 50;
else if ( character == "3" ) return 51;
else if ( character == "4" ) return 52;
else if ( character == "5" ) return 53;
else if ( character == "6" ) return 54;
else if ( character == "7" ) return 55;
else if ( character == "8" ) return 56;
else if ( character == "9" ) return 57;
else if ( character == ":" ) return 58;
else if ( character == ";" ) return 59;
else if ( character == "<" ) return 60;
else if ( character == "=" ) return 61;
else if ( character == ">" ) return 62;
else if ( character == "?" ) return 63;
else if ( character == "@" ) return 64;
else if ( character == "A" ) return 65;
else if ( character == "B" ) return 66;
else if ( character == "C" ) return 67;
else if ( character == "D" ) return 68;
else if ( character == "E" ) return 69;
else if ( character == "F" ) return 70;
else if ( character == "G" ) return 71;
else if ( character == "H" ) return 72;
else if ( character == "I" ) return 73;
else if ( character == "J" ) return 74;
else if ( character == "K" ) return 75;
else if ( character == "L" ) return 76;
else if ( character == "M" ) return 77;
else if ( character == "N" ) return 78;
else if ( character == "O" ) return 79;
else if ( character == "P" ) return 80;
else if ( character == "Q" ) return 81;
else if ( character == "R" ) return 82;
else if ( character == "S" ) return 83;
else if ( character == "T" ) return 84;
else if ( character == "U" ) return 85;
else if ( character == "V" ) return 86;
else if ( character == "W" ) return 87;
else if ( character == "X" ) return 88;
else if ( character == "Y" ) return 89;
else if ( character == "Z" ) return 90;
else if ( character == "[" ) return 91;
else if ( character == "\\" ) return 92;
else if ( character == "]" ) return 93;
else if ( character == "^" ) return 94;
else if ( character == "_" ) return 95;
else if ( character == "`" ) return 96;
else if ( character == "a" ) return 97;
else if ( character == "b" ) return 98;
else if ( character == "c" ) return 99;
else if ( character == "d" ) return 100;
else if ( character == "e" ) return 101;
else if ( character == "f" ) return 102;
else if ( character == "g" ) return 103;
else if ( character == "h" ) return 104;
else if ( character == "i" ) return 105;
else if ( character == "j" ) return 106;
else if ( character == "k" ) return 107;
else if ( character == "l" ) return 108;
else if ( character == "m" ) return 109;
else if ( character == "n" ) return 110;
else if ( character == "o" ) return 111;
else if ( character == "p" ) return 112;
else if ( character == "q" ) return 113;
else if ( character == "r" ) return 114;
else if ( character == "s" ) return 115;
else if ( character == "t" ) return 116;
else if ( character == "u" ) return 117;
else if ( character == "v" ) return 118;
else if ( character == "w" ) return 119;
else if ( character == "x" ) return 120;
else if ( character == "y" ) return 121;
else if ( character == "z" ) return 122;
else if ( character == "{" ) return 123;
else if ( character == "|" ) return 124;
else if ( character == "}" ) return 125;
else if ( character == "~" ) return 126;
else if ( character == "" ) return 127;
else if ( character == "€" ) return 128;
else if ( character == "Â" ) return 129;
else if ( character == "‚" ) return 130;
else if ( character == "Æ’" ) return 131;
else if ( character == "„" ) return 132;
else if ( character == "…" ) return 133;
else if ( character == "†" ) return 134;
else if ( character == "‡" ) return 135;
else if ( character == "ˆ" ) return 136;
else if ( character == "‰" ) return 137;
else if ( character == "Å " ) return 138;
else if ( character == "‹" ) return 139;
else if ( character == "Å’" ) return 140;
else if ( character == "Â" ) return 141;
else if ( character == "Ž" ) return 142;
else if ( character == "Â" ) return 143;
else if ( character == "Â" ) return 144;
else if ( character == "‘" ) return 145;
else if ( character == "’" ) return 146;
else if ( character == "“" ) return 147;
else if ( character == "â€" ) return 148;
else if ( character == "•" ) return 149;
else if ( character == "–" ) return 150;
else if ( character == "—" ) return 151;
else if ( character == "˜" ) return 152;
else if ( character == "â„¢" ) return 153;
else if ( character == "Å¡" ) return 154;
else if ( character == "›" ) return 155;
else if ( character == "Å“" ) return 156;
else if ( character == "Â" ) return 157;
else if ( character == "ž" ) return 158;
else if ( character == "Ÿ" ) return 159;
else if ( character == " " ) return 160;
else if ( character == "¡" ) return 161;
else if ( character == "¢" ) return 162;
else if ( character == "£" ) return 163;
else if ( character == "¤" ) return 164;
else if ( character == "Â¥" ) return 165;
else if ( character == "¦" ) return 166;
else if ( character == "§" ) return 167;
else if ( character == "¨" ) return 168;
else if ( character == "©" ) return 169;
else if ( character == "ª" ) return 170;
else if ( character == "«" ) return 171;
else if ( character == "¬" ) return 172;
else if ( character == "Â" ) return 173;
else if ( character == "®" ) return 174;
else if ( character == "¯" ) return 175;
else if ( character == "°" ) return 176;
else if ( character == "±" ) return 177;
else if ( character == "²" ) return 178;
else if ( character == "³" ) return 179;
else if ( character == "´" ) return 180;
else if ( character == "µ" ) return 181;
else if ( character == "¶" ) return 182;
else if ( character == "·" ) return 183;
else if ( character == "¸" ) return 184;
else if ( character == "¹" ) return 185;
else if ( character == "º" ) return 186;
else if ( character == "»" ) return 187;
else if ( character == "¼" ) return 188;
else if ( character == "½" ) return 189;
else if ( character == "¾" ) return 190;
else if ( character == "¿" ) return 191;
else if ( character == "À" ) return 192;
else if ( character == "Ã" ) return 193;
else if ( character == "Â" ) return 194;
else if ( character == "Ã" ) return 195;
else if ( character == "Ä" ) return 196;
else if ( character == "Ã…" ) return 197;
else if ( character == "Æ" ) return 198;
else if ( character == "Ç" ) return 199;
else if ( character == "È" ) return 200;
else if ( character == "É" ) return 201;
else if ( character == "Ê" ) return 202;
else if ( character == "Ë" ) return 203;
else if ( character == "Ì" ) return 204;
else if ( character == "Ã" ) return 205;
else if ( character == "ÃŽ" ) return 206;
else if ( character == "Ã" ) return 207;
else if ( character == "Ã" ) return 208;
else if ( character == "Ñ" ) return 209;
else if ( character == "Ã’" ) return 210;
else if ( character == "Ó" ) return 211;
else if ( character == "Ô" ) return 212;
else if ( character == "Õ" ) return 213;
else if ( character == "Ö" ) return 214;
else if ( character == "×" ) return 215;
else if ( character == "Ø" ) return 216;
else if ( character == "Ù" ) return 217;
else if ( character == "Ú" ) return 218;
else if ( character == "Û" ) return 219;
else if ( character == "Ü" ) return 220;
else if ( character == "Ã" ) return 221;
else if ( character == "Þ" ) return 222;
else if ( character == "ß" ) return 223;
else if ( character == "Ã " ) return 224;
else if ( character == "á" ) return 225;
else if ( character == "â" ) return 226;
else if ( character == "ã" ) return 227;
else if ( character == "ä" ) return 228;
else if ( character == "Ã¥" ) return 229;
else if ( character == "æ" ) return 230;
else if ( character == "ç" ) return 231;
else if ( character == "è" ) return 232;
else if ( character == "é" ) return 233;
else if ( character == "ê" ) return 234;
else if ( character == "ë" ) return 235;
else if ( character == "ì" ) return 236;
else if ( character == "Ã" ) return 237;
else if ( character == "î" ) return 238;
else if ( character == "ï" ) return 239;
else if ( character == "ð" ) return 240;
else if ( character == "ñ" ) return 241;
else if ( character == "ò" ) return 242;
else if ( character == "ó" ) return 243;
else if ( character == "ô" ) return 244;
else if ( character == "õ" ) return 245;
else if ( character == "ö" ) return 246;
else if ( character == "÷" ) return 247;
else if ( character == "ø" ) return 248;
else if ( character == "ù" ) return 249;
else if ( character == "ú" ) return 250;
else if ( character == "û" ) return 251;
else if ( character == "ü" ) return 252;
else if ( character == "ý" ) return 253;
else if ( character == "þ" ) return 254;
else if ( character == "ÿ" ) return 255;
else return -1;
}