diff --git a/assets/createimg.py b/assets/createimg.py new file mode 100644 index 0000000..8c32678 --- /dev/null +++ b/assets/createimg.py @@ -0,0 +1,248 @@ +from PIL import Image + +font8x8_ib8x8u = [ + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # 0000 (uni0000.dup1) + [0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e], # 0001 (uni0001) + [0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7, 0xff, 0x7e], # 0002 (uni0002) + [0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00], # 0003 (uni0003) + [0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00], # 0004 (uni0004) + [0x38, 0x7c, 0x38, 0xfe, 0xfe, 0x7c, 0x38, 0x7c], # 0005 (uni0005) + [0x10, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x7c], # 0006 (uni0006) + [0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00], # 0007 (uni0007) + [0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff], # 0008 (uni0008) + [0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00], # 0009 (uni0009) + [0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff], # 000a (uni000A) + [0x0f, 0x07, 0x0f, 0x7d, 0xcc, 0xcc, 0xcc, 0x78], # 000b (uni000B) + [0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18], # 000c (uni000C) + [0x3f, 0x33, 0x3f, 0x30, 0x30, 0x70, 0xf0, 0xe0], # 000d (uni000D) + [0x7f, 0x63, 0x7f, 0x63, 0x63, 0x67, 0xe6, 0xc0], # 000e (uni000E) + [0x99, 0x5a, 0x3c, 0xe7, 0xe7, 0x3c, 0x5a, 0x99], # 000f (uni000F) + [0x80, 0xe0, 0xf8, 0xfe, 0xf8, 0xe0, 0x80, 0x00], # 0010 (uni0010) + [0x02, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x02, 0x00], # 0011 (uni0011) + [0x18, 0x3c, 0x7e, 0x18, 0x18, 0x7e, 0x3c, 0x18], # 0012 (uni0012) + [0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00], # 0013 (uni0013) + [0x7f, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x00], # 0014 (uni0014) + [0x3e, 0x63, 0x38, 0x6c, 0x6c, 0x38, 0xcc, 0x78], # 0015 (uni0015) + [0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x00], # 0016 (uni0016) + [0x18, 0x3c, 0x7e, 0x18, 0x7e, 0x3c, 0x18, 0xff], # 0017 (uni0017) + [0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x00], # 0018 (uni0018) + [0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00], # 0019 (uni0019) + [0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00], # 001a (uni001A) + [0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00], # 001b (uni001B) + [0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00], # 001c (uni001C) + [0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00], # 001d (uni001D) + [0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x00, 0x00], # 001e (uni001E) + [0x00, 0xff, 0xff, 0x7e, 0x3c, 0x18, 0x00, 0x00], # 001f (uni001F) + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # 0020 (space) + [0x30, 0x78, 0x78, 0x30, 0x30, 0x00, 0x30, 0x00], # 0021 (exclam) + [0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00], # 0022 (quotedbl) + [0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00], # 0023 (numbersign) + [0x30, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x30, 0x00], # 0024 (dollar) + [0x00, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xc6, 0x00], # 0025 (percent) + [0x38, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0x76, 0x00], # 0026 (ampersand) + [0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00], # 0027 (quotesingle) + [0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00], # 0028 (parenleft) + [0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00], # 0029 (parenright) + [0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00], # 002a (asterisk) + [0x00, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0x00], # 002b (plus) + [0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x60], # 002c (comma) + [0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00], # 002d (hyphen) + [0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00], # 002e (period) + [0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00], # 002f (slash) + [0x7c, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0x7c, 0x00], # 0030 (zero) + [0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x00], # 0031 (one) + [0x78, 0xcc, 0x0c, 0x38, 0x60, 0xc4, 0xfc, 0x00], # 0032 (two) + [0x78, 0xcc, 0x0c, 0x38, 0x0c, 0xcc, 0x78, 0x00], # 0033 (three) + [0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x1e, 0x00], # 0034 (four) + [0xfc, 0xc0, 0xf8, 0x0c, 0x0c, 0xcc, 0x78, 0x00], # 0035 (five) + [0x38, 0x60, 0xc0, 0xf8, 0xcc, 0xcc, 0x78, 0x00], # 0036 (six) + [0xfc, 0xcc, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x00], # 0037 (seven) + [0x78, 0xcc, 0xcc, 0x78, 0xcc, 0xcc, 0x78, 0x00], # 0038 (eight) + [0x78, 0xcc, 0xcc, 0x7c, 0x0c, 0x18, 0x70, 0x00], # 0039 (nine) + [0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00], # 003a (colon) + [0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0x00], # 003b (semicolon) + [0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x00], # 003c (less) + [0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00], # 003d (equal) + [0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00], # 003e (greater) + [0x78, 0xcc, 0x0c, 0x18, 0x30, 0x00, 0x30, 0x00], # 003f (question) + [0x7c, 0xc6, 0xde, 0xde, 0xde, 0xc0, 0x78, 0x00], # 0040 (at) + [0x30, 0x78, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0x00], # 0041 (A) + [0xfc, 0x66, 0x66, 0x7c, 0x66, 0x66, 0xfc, 0x00], # 0042 (B) + [0x3c, 0x66, 0xc0, 0xc0, 0xc0, 0x66, 0x3c, 0x00], # 0043 (C) + [0xf8, 0x6c, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00], # 0044 (D) + [0xfe, 0x62, 0x68, 0x78, 0x68, 0x62, 0xfe, 0x00], # 0045 (E) + [0xfe, 0x62, 0x68, 0x78, 0x68, 0x60, 0xf0, 0x00], # 0046 (F) + [0x3c, 0x66, 0xc0, 0xc0, 0xce, 0x66, 0x3e, 0x00], # 0047 (G) + [0xcc, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0xcc, 0x00], # 0048 (H) + [0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00], # 0049 (I) + [0x1e, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00], # 004a (J) + [0xe6, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00], # 004b (K) + [0xf0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00], # 004c (L) + [0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0x00], # 004d (M) + [0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x00], # 004e (N) + [0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00], # 004f (O) + [0xfc, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00], # 0050 (P) + [0x78, 0xcc, 0xcc, 0xcc, 0xdc, 0x78, 0x1c, 0x00], # 0051 (Q) + [0xfc, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0xe6, 0x00], # 0052 (R) + [0x78, 0xcc, 0xe0, 0x70, 0x1c, 0xcc, 0x78, 0x00], # 0053 (S) + [0xfc, 0xb4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00], # 0054 (T) + [0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xfc, 0x00], # 0055 (U) + [0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00], # 0056 (V) + [0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x00], # 0057 (W) + [0xc6, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6, 0x00], # 0058 (X) + [0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x30, 0x78, 0x00], # 0059 (Y) + [0xfe, 0xc6, 0x8c, 0x18, 0x32, 0x66, 0xfe, 0x00], # 005a (Z) + [0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00], # 005b (bracketleft) + [0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x02, 0x00], # 005c (backslash) + [0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00], # 005d (bracketright) + [0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00], # 005e (asciicircum) + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff], # 005f (underscore) + [0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00], # 0060 (grave) + [0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00], # 0061 (a) + [0xe0, 0x60, 0x60, 0x7c, 0x66, 0x66, 0xdc, 0x00], # 0062 (b) + [0x00, 0x00, 0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x00], # 0063 (c) + [0x1c, 0x0c, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00], # 0064 (d) + [0x00, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00], # 0065 (e) + [0x38, 0x6c, 0x60, 0xf0, 0x60, 0x60, 0xf0, 0x00], # 0066 (f) + [0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8], # 0067 (g) + [0xe0, 0x60, 0x6c, 0x76, 0x66, 0x66, 0xe6, 0x00], # 0068 (h) + [0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00], # 0069 (i) + [0x0c, 0x00, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78], # 006a (j) + [0xe0, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0xe6, 0x00], # 006b (k) + [0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00], # 006c (l) + [0x00, 0x00, 0xcc, 0xfe, 0xfe, 0xd6, 0xc6, 0x00], # 006d (m) + [0x00, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0xcc, 0x00], # 006e (n) + [0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x00], # 006f (o) + [0x00, 0x00, 0xdc, 0x66, 0x66, 0x7c, 0x60, 0xf0], # 0070 (p) + [0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0x1e], # 0071 (q) + [0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0xf0, 0x00], # 0072 (r) + [0x00, 0x00, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x00], # 0073 (s) + [0x10, 0x30, 0x7c, 0x30, 0x30, 0x34, 0x18, 0x00], # 0074 (t) + [0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00], # 0075 (u) + [0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00], # 0076 (v) + [0x00, 0x00, 0xc6, 0xd6, 0xfe, 0xfe, 0x6c, 0x00], # 0077 (w) + [0x00, 0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00], # 0078 (x) + [0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8], # 0079 (y) + [0x00, 0x00, 0xfc, 0x98, 0x30, 0x64, 0xfc, 0x00], # 007a (z) + [0x1c, 0x30, 0x30, 0xe0, 0x30, 0x30, 0x1c, 0x00], # 007b (braceleft) + [0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00], # 007c (bar) + [0xe0, 0x30, 0x30, 0x1c, 0x30, 0x30, 0xe0, 0x00], # 007d (braceright) + [0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # 007e (asciitilde) + [0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0x00], # 007f (uni007F) + # --------------------------- 160-255 --------------------------- + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # 00a0 (uni00A0) + [0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00], # 00a1 (exclamdown) + [0x18, 0x18, 0x7e, 0xc0, 0xc0, 0x7e, 0x18, 0x18], # 00a2 (cent) + [0x38, 0x6c, 0x64, 0xf0, 0x60, 0xe6, 0xfc, 0x00], # 00a3 (sterling) + [0x00, 0xc6, 0x7c, 0xc6, 0xc6, 0x7c, 0xc6, 0x00], # 00a4 (currency) + [0xcc, 0xcc, 0x78, 0xfc, 0x30, 0xfc, 0x30, 0x30], # 00a5 (yen) + [0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00], # 00a6 (brokenbar) + [0x3e, 0x63, 0x38, 0x6c, 0x6c, 0x38, 0xcc, 0x78], # 00a7 (section) + [0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # 00a8 (dieresis) + [0x7e, 0x81, 0x9d, 0xa1, 0xa1, 0x9d, 0x81, 0x7e], # 00a9 (copyright) + [0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00], # 00aa (ordfeminine) + [0x00, 0x33, 0x66, 0xcc, 0x66, 0x33, 0x00, 0x00], # 00ab (guillemotleft) + [0x00, 0x00, 0x00, 0xfc, 0x0c, 0x0c, 0x00, 0x00], # 00ac (logicalnot) + [0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00], # 00ad (uni00AD) + [0x7e, 0x81, 0xb9, 0xa5, 0xb9, 0xa5, 0x81, 0x7e], # 00ae (registered) + [0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], # 00af (macron) + [0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00], # 00b0 (degree) + [0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0xfc, 0x00], # 00b1 (plusminus) + [0x70, 0x18, 0x30, 0x60, 0x78, 0x00, 0x00, 0x00], # 00b2 (uni00B2) + [0x70, 0x18, 0x30, 0x18, 0x70, 0x00, 0x00, 0x00], # 00b3 (uni00B3) + [0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00], # 00b4 (acute) + [0x00, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0xc0], # 00b5 (mu) + [0x7f, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x00], # 00b6 (paragraph) + [0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00], # 00b7 (periodcentered) + [0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x38], # 00b8 (cedilla) + [0x30, 0x70, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00], # 00b9 (uni00B9) + [0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00], # 00ba (ordmasculine) + [0x00, 0xcc, 0x66, 0x33, 0x66, 0xcc, 0x00, 0x00], # 00bb (guillemotright) + [0xc3, 0xc6, 0xcc, 0xdb, 0x37, 0x6f, 0xcf, 0x03], # 00bc (onequarter) + [0xc3, 0xc6, 0xcc, 0xde, 0x33, 0x66, 0xcc, 0x0f], # 00bd (onehalf) + [0xe0, 0x33, 0x66, 0x3c, 0xfb, 0x37, 0x6f, 0xc3], # 00be (threequarters) + [0x30, 0x00, 0x30, 0x60, 0xc0, 0xcc, 0x78, 0x00], # 00bf (questiondown) + [0xc0, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00], # 00c0 (Agrave) + [0x06, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00], # 00c1 (Aacute) + [0x7c, 0xc6, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0x00], # 00c2 (Acircumflex) + [0x76, 0xdc, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0x00], # 00c3 (Atilde) + [0xc6, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00], # 00c4 (Adieresis) + [0x30, 0x30, 0x00, 0x78, 0xcc, 0xfc, 0xcc, 0x00], # 00c5 (Aring) + [0x3e, 0x6c, 0xcc, 0xfe, 0xcc, 0xcc, 0xce, 0x00], # 00c6 (AE) + [0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x18, 0x0c, 0x78], # 00c7 (Ccedilla) + [0xe0, 0x00, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00], # 00c8 (Egrave) + [0x1c, 0x00, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00], # 00c9 (Eacute) + [0x78, 0xcc, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00], # 00ca (Ecircumflex) + [0xcc, 0x00, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00], # 00cb (Edieresis) + [0xe0, 0x00, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00], # 00cc (Igrave) + [0x1c, 0x00, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00], # 00cd (Iacute) + [0x7e, 0xc3, 0x3c, 0x18, 0x18, 0x18, 0x3c, 0x00], # 00ce (Icircumflex) + [0xcc, 0x00, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00], # 00cf (Idieresis) + [0xf8, 0x6c, 0x66, 0xf6, 0x66, 0x6c, 0xf8, 0x00], # 00d0 (Eth) + [0xfc, 0x00, 0xcc, 0xec, 0xfc, 0xdc, 0xcc, 0x00], # 00d1 (Ntilde) + [0xc0, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x00], # 00d2 (Ograve) + [0x06, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x00], # 00d3 (Oacute) + [0x7c, 0xc6, 0x38, 0x6c, 0xc6, 0x6c, 0x38, 0x00], # 00d4 (Ocircumflex) + [0x76, 0xdc, 0x38, 0x6c, 0xc6, 0x6c, 0x38, 0x00], # 00d5 (Otilde) + [0xc3, 0x18, 0x3c, 0x66, 0x66, 0x3c, 0x18, 0x00], # 00d6 (Odieresis) + [0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00, 0x00], # 00d7 (multiply) + [0x3a, 0x6c, 0xce, 0xd6, 0xe6, 0x6c, 0xb8, 0x00], # 00d8 (Oslash) + [0xe0, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00], # 00d9 (Ugrave) + [0x1c, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00], # 00da (Uacute) + [0x7c, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0x7c, 0x00], # 00db (Ucircumflex) + [0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00], # 00dc (Udieresis) + [0x1c, 0x00, 0xcc, 0xcc, 0x78, 0x30, 0x78, 0x00], # 00dd (Yacute) + [0xf0, 0x60, 0x7c, 0x66, 0x7c, 0x60, 0xf0, 0x00], # 00de (Thorn) + [0x78, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xcc, 0x00], # 00df (germandbls) + [0xe0, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00], # 00e0 (agrave) + [0x1c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00], # 00e1 (aacute) + [0x7e, 0xc3, 0x3c, 0x06, 0x3e, 0x66, 0x3f, 0x00], # 00e2 (acircumflex) + [0x76, 0xdc, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00], # 00e3 (atilde) + [0xcc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00], # 00e4 (adieresis) + [0x30, 0x30, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00], # 00e5 (aring) + [0x00, 0x00, 0x7f, 0x0c, 0x7f, 0xcc, 0x7f, 0x00], # 00e6 (ae) + [0x00, 0x00, 0x78, 0xc0, 0xc0, 0x78, 0x0c, 0x38], # 00e7 (ccedilla) + [0xe0, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00], # 00e8 (egrave) + [0x1c, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00], # 00e9 (eacute) + [0x7e, 0xc3, 0x3c, 0x66, 0x7e, 0x60, 0x3c, 0x00], # 00ea (ecircumflex) + [0xcc, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00], # 00eb (edieresis) + [0xe0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00], # 00ec (igrave) + [0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00], # 00ed (iacute) + [0x7c, 0xc6, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00], # 00ee (icircumflex) + [0xcc, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00], # 00ef (idieresis) + [0x30, 0x7e, 0x0c, 0x7c, 0xcc, 0xcc, 0x78, 0x00], # 00f0 (eth) + [0x00, 0xf8, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0x00], # 00f1 (ntilde) + [0x00, 0xe0, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00], # 00f2 (ograve) + [0x00, 0x1c, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00], # 00f3 (oacute) + [0x78, 0xcc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00], # 00f4 (ocircumflex) + [0x76, 0xdc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00], # 00f5 (otilde) + [0x00, 0xcc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00], # 00f6 (odieresis) + [0x30, 0x30, 0x00, 0xfc, 0x00, 0x30, 0x30, 0x00], # 00f7 (divide) + [0x00, 0x02, 0x7c, 0xce, 0xd6, 0xe6, 0x7c, 0x80], # 00f8 (oslash) + [0x00, 0xe0, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00], # 00f9 (ugrave) + [0x00, 0x1c, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00], # 00fa (uacute) + [0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00], # 00fb (ucircumflex) + [0x00, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00], # 00fc (udieresis) + [0x00, 0x1c, 0x00, 0xcc, 0xcc, 0x7c, 0x0c, 0x78], # 00fd (yacute) + [0xe0, 0x60, 0x7c, 0x66, 0x66, 0x7c, 0x60, 0xf0], # 00fe (thorn) + [0x00, 0xcc, 0x00, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8], # 00ff (ydieresis) +] + +def create_tileset(font_data, tile_size=8, tiles_per_row=16): + num_tiles = len(font_data) + rows = (num_tiles + tiles_per_row - 1) // tiles_per_row + img_width = tiles_per_row * tile_size + img_height = rows * tile_size + image = Image.new('1', (img_width, img_height), 0) # Create a new white image + + for index, char_data in enumerate(font_data): + x = (index % tiles_per_row) * tile_size + y = (index // tiles_per_row) * tile_size + for row in range(tile_size): + for col in range(tile_size): + if char_data[row] & (1 << (7 - col)): + image.putpixel((x + col, y + row), 1) # Set pixel to black + + image.save('font_tileset.png') + +create_tileset(font8x8_ib8x8u) diff --git a/assets/textures/8x8.png b/assets/textures/8x8.png index 46f927b..20c8e34 100644 Binary files a/assets/textures/8x8.png and b/assets/textures/8x8.png differ diff --git a/src/dusk/display/tileset.c b/src/dusk/display/tileset.c index aa5de98..2db646c 100644 --- a/src/dusk/display/tileset.c +++ b/src/dusk/display/tileset.c @@ -11,7 +11,7 @@ tileset_t TILESETS[TILESET_COUNT] = { // TILESET_NULL { 0, 0 }, // TILESET_FONT - { 1, 88 } + { 16, 14 } }; tilesetid_t TILESET_SLOTS[TILESET_SLOT_COUNT] = { diff --git a/src/dusk/overworld/entity/entity.c b/src/dusk/overworld/entity/entity.c index 9857ae5..8f669fc 100644 --- a/src/dusk/overworld/entity/entity.c +++ b/src/dusk/overworld/entity/entity.c @@ -32,6 +32,8 @@ void entityInit( // Call init assertNotNull(ENTITY_CALLBACKS[type].init, "Entity type init callback err."); ENTITY_CALLBACKS[type].init(ent); + + entityTurn(ent, FACING_DIRECTION_SOUTH); } void entityUpdate(entity_t *ent) { @@ -61,7 +63,20 @@ void entityTurn(entity_t *ent, const facingdir_t dir) { assertTrue(dir < FACING_DIRECTION_COUNT, "Invalid facing direction"); ent->direction = dir; - ent->frame = 1 + (dir * 3); + switch(dir) { + case FACING_DIRECTION_SOUTH: + ent->frame = 25; + break; + case FACING_DIRECTION_NORTH: + ent->frame = 24; + break; + case FACING_DIRECTION_EAST: + ent->frame = 26; + break; + case FACING_DIRECTION_WEST: + ent->frame = 27; + break; + } } void entityMove(entity_t *ent, const facingdir_t dir) { @@ -114,7 +129,7 @@ bool_t entityIsMoving(const entity_t *ent) { return ent->subX != 0 || ent->subY != 0; } -bool_t entityInteract(const entity_t *ent) { +bool_t entityInteract(entity_t *ent) { assertNotNull(ent, "Entity cannot be NULL."); assertTrue(ent->type == ENTITY_TYPE_PLAYER, "Entity should be player."); if(entityIsMoving(ent)) return false; @@ -129,7 +144,7 @@ bool_t entityInteract(const entity_t *ent) { assertTrue(target->type < ENTITY_TYPE_COUNT, "Invalid entity type."); if(ENTITY_CALLBACKS[target->type].interact == NULL) return false; - ENTITY_CALLBACKS[target->type].interact(target); + ENTITY_CALLBACKS[target->type].interact(ent, target); return true; } \ No newline at end of file diff --git a/src/dusk/overworld/entity/entity.h b/src/dusk/overworld/entity/entity.h index f095099..52bd52c 100644 --- a/src/dusk/overworld/entity/entity.h +++ b/src/dusk/overworld/entity/entity.h @@ -21,7 +21,7 @@ typedef enum { typedef struct { void (*init)(entity_t *); void (*update)(entity_t *); - void (*interact)(entity_t *); + void (*interact)(entity_t *, entity_t *); } entitycallback_t; typedef struct _entity_t { @@ -86,4 +86,4 @@ bool_t entityIsMoving(const entity_t *entity); * @param entity The entity that is doing the interaction. * @return TRUE if an entity was interacted with, FALSE otherwise. */ -bool_t entityInteract(const entity_t *entity); \ No newline at end of file +bool_t entityInteract(entity_t *entity); \ No newline at end of file diff --git a/src/dusk/overworld/entity/facing.c b/src/dusk/overworld/entity/facing.c index 27b4354..3b0cfce 100644 --- a/src/dusk/overworld/entity/facing.c +++ b/src/dusk/overworld/entity/facing.c @@ -47,4 +47,19 @@ void facingDirAdd(const facingdir_t dir, uint8_t *x, uint8_t *y) { *x += dx; *y += dy; +} + +facingdir_t facingDirFace( + const uint8_t x1, const uint8_t y1, + const uint8_t x2, const uint8_t y2 +) { + if(x1 == x2) { + if(y1 < y2) return FACING_DIRECTION_SOUTH; + if(y1 > y2) return FACING_DIRECTION_NORTH; + } else if(y1 == y2) { + if(x1 < x2) return FACING_DIRECTION_WEST; + if(x1 > x2) return FACING_DIRECTION_EAST; + } + + return FACING_DIRECTION_SOUTH; } \ No newline at end of file diff --git a/src/dusk/overworld/entity/facing.h b/src/dusk/overworld/entity/facing.h index 07a1e5b..ce845c9 100644 --- a/src/dusk/overworld/entity/facing.h +++ b/src/dusk/overworld/entity/facing.h @@ -33,4 +33,18 @@ void facingDirGetRelative(const facingdir_t dir, int8_t *x, int8_t *y); * @param x The x position to add to. * @param y The y position to add to. */ -void facingDirAdd(const facingdir_t dir, uint8_t *x, uint8_t *y); \ No newline at end of file +void facingDirAdd(const facingdir_t dir, uint8_t *x, uint8_t *y); + +/** + * Returns the facing direction to face from one position to another. + * + * @param x1 The x position to face from. + * @param y1 The y position to face from. + * @param x2 The x position to face to. + * @param y2 The y position to face to. + * @return The facing direction to face from one position to another. + */ +facingdir_t facingDirFace( + const uint8_t x1, const uint8_t y1, + const uint8_t x2, const uint8_t y2 +); \ No newline at end of file diff --git a/src/dusk/overworld/entity/npc.c b/src/dusk/overworld/entity/npc.c index 45c66ba..882b814 100644 --- a/src/dusk/overworld/entity/npc.c +++ b/src/dusk/overworld/entity/npc.c @@ -5,7 +5,7 @@ * https://opensource.org/licenses/MIT */ -#include "npc.h" +#include "entity.h" void npcInit(entity_t *ent) { } @@ -13,6 +13,7 @@ void npcInit(entity_t *ent) { void npcUpdate(entity_t *ent) { } -void npcInteract(entity_t *ent) { +void npcInteract(entity_t *player, entity_t *ent) { printf("Interact\n"); + entityTurn(ent, facingDirFace(player->x, player->y, ent->x, ent->y)); } \ No newline at end of file diff --git a/src/dusk/overworld/entity/npc.h b/src/dusk/overworld/entity/npc.h index b29d97f..f5290a8 100644 --- a/src/dusk/overworld/entity/npc.h +++ b/src/dusk/overworld/entity/npc.h @@ -31,6 +31,7 @@ void npcUpdate(entity_t *ent); /** * Handles interaction with an NPC. * + * @param player The player entity interacting. * @param ent The entity to interact with. */ -void npcInteract(entity_t *ent); \ No newline at end of file +void npcInteract(entity_t *player, entity_t *ent); \ No newline at end of file diff --git a/src/duskgl/display/shader/entityshader/entity_frag.glsl b/src/duskgl/display/shader/entityshader/entity_frag.glsl index 1d70729..89731b7 100644 --- a/src/duskgl/display/shader/entityshader/entity_frag.glsl +++ b/src/duskgl/display/shader/entityshader/entity_frag.glsl @@ -15,5 +15,7 @@ out vec4 FragColor; void main() { vec4 tColor = tilesetGetColor(uint(TILESET_SLOT_ENTITIES), v_TextureCoord); + if(tColor.a == 0.0) discard; + if(tColor.r == 0.0) discard; FragColor = vec4(1, 1, 1, 1) * tColor; }