2018-05-20 14:46:40 +08:00
/*
SelectionList . ino
Universal 8 bit Graphics Library ( https : //github.com/olikraus/u8g2/)
Copyright ( c ) 2016 , olikraus @ gmail . com
All rights reserved .
Redistribution and use in source and binary forms , with or without modification ,
are permitted provided that the following conditions are met :
* Redistributions of source code must retain the above copyright notice , this list
of conditions and the following disclaimer .
* Redistributions in binary form must reproduce the above copyright notice , this
list of conditions and the following disclaimer in the documentation and / or other
materials provided with the distribution .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES ,
INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT ,
STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE )
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
# include <Arduino.h>
# include <U8g2lib.h>
# ifdef U8X8_HAVE_HW_SPI
# include <SPI.h>
# endif
# ifdef U8X8_HAVE_HW_I2C
# include <Wire.h>
# endif
// Please UNCOMMENT one of the contructor lines below
// U8g2 Contructor List (Picture Loop Page Buffer)
// The complete list is available here: https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
// Please update the pin numbers according to your setup. Use U8X8_PIN_NONE if the reset pin is not connected
//U8G2_NULL u8g2(U8G2_R0); // null device, a 8x8 pixel display which does nothing
//U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
2018-05-21 19:38:42 +08:00
U8G2_SSD1306_128X64_NONAME_1_4W_HW_SPI u8g2 ( U8G2_R0 , /* cs=*/ 12 , /* dc=*/ 4 , /* reset=*/ 6 ) ; // Arduboy (Production, Kickstarter Edition)
2018-05-20 14:46:40 +08:00
//U8G2_SSD1306_128X64_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1306_128X64_NONAME_1_3W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* reset=*/ 8);
//U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
//U8G2_SSD1306_128X64_ALT0_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // same as the NONAME variant, but may solve the "every 2nd line skipped" problem
//U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* reset=*/ 8);
//U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // All Boards without Reset of the Display
//U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 16, /* data=*/ 17, /* reset=*/ U8X8_PIN_NONE); // ESP32 Thing, pure SW emulated I2C
//U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 16, /* data=*/ 17); // ESP32 Thing, HW I2C with pin remapping
//U8G2_SSD1306_128X64_NONAME_1_6800 u8g2(U8G2_R0, 13, 11, 2, 3, 4, 5, 6, A4, /*enable=*/ 7, /*cs=*/ 10, /*dc=*/ 9, /*reset=*/ 8);
//U8G2_SSD1306_128X64_NONAME_1_8080 u8g2(U8G2_R0, 13, 11, 2, 3, 4, 5, 6, A4, /*enable=*/ 7, /*cs=*/ 10, /*dc=*/ 9, /*reset=*/ 8);
//U8G2_SSD1306_128X64_VCOMH0_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // same as the NONAME variant, but maximizes setContrast() range
//U8G2_SSD1306_128X64_ALT0_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // same as the NONAME variant, but may solve the "every 2nd line skipped" problem
//U8G2_SH1106_128X64_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
//U8G2_SH1106_128X64_VCOMH0_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // same as the NONAME variant, but maximizes setContrast() range
//U8G2_SH1106_128X64_WINSTAR_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // same as the NONAME variant, but uses updated SH1106 init sequence
//U8G2_SH1106_72X40_WISE_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SH1107_64X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SH1107_128X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SH1107_128X128_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ 8);
//U8G2_SH1107_SEEED_96X96_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SH1122_256X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8G2_16BIT in u8g2.h
//U8G2_SSD1306_128X32_UNIVISION_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ 21, /* data=*/ 20, /* reset=*/ U8X8_PIN_NONE); // Adafruit Feather M0 Basic Proto + FeatherWing OLED
//U8G2_SSD1306_128X32_UNIVISION_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // Adafruit Feather ESP8266/32u4 Boards + FeatherWing OLED
//U8G2_SSD1306_128X32_UNIVISION_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // Adafruit ESP8266/32u4/ARM Boards + FeatherWing OLED
//U8G2_SSD1306_128X32_UNIVISION_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA); // pin remapping with ESP8266 HW I2C
//U8G2_SSD1306_64X48_ER_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // EastRising 0.66" OLED breakout board, Uno: A4=SDA, A5=SCL, 5V powered
//U8G2_SSD1306_48X64_WINSTAR_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
//U8G2_SSD1306_64X32_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
//U8G2_SSD1306_64X32_1F_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
//U8G2_SSD1306_96X16_ER_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // EastRising 0.69" OLED
//U8G2_SSD1322_NHD_256X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8G2_16BIT in u8g2.h
//U8G2_SSD1322_NHD_256X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Enable U8G2_16BIT in u8g2.h
//U8G2_SSD1322_NHD_128X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1322_NHD_128X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1325_NHD_128X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1325_NHD_128X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1326_ER_256X32_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // experimental driver for ER-OLED018-1
//U8G2_SSD1327_SEEED_96X96_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // Seeedstudio Grove OLED 96x96
//U8G2_SSD1327_SEEED_96X96_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // Seeedstudio Grove OLED 96x96
//U8G2_SSD1327_MIDAS_128X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1327_MIDAS_128X128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1329_128X96_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1329_128X96_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1305_128X32_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1305_128X32_NONAME_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1305_128X64_ADAFRUIT_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1305_128X64_ADAFRUIT_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1309_128X64_NONAME0_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1309_128X64_NONAME0_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1309_128X64_NONAME2_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_SSD1309_128X64_NONAME2_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_LD7032_60X32_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 11, /* data=*/ 12, /* cs=*/ 9, /* dc=*/ 10, /* reset=*/ 8); // SW SPI Nano Board
//U8G2_LD7032_60X32_1_4W_SW_I2C u8g2(U8G2_R0, /* clock=*/ 11, /* data=*/ 12, /* reset=*/ U8X8_PIN_NONE); // NOT TESTED!
//U8G2_UC1701_EA_DOGS102_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_UC1701_EA_DOGS102_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_PCD8544_84X48_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Nokia 5110 Display
//U8G2_PCD8544_84X48_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Nokia 5110 Display
//U8G2_PCF8812_96X65_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Could be also PCF8814
//U8G2_PCF8812_96X65_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Could be also PCF8814
//U8G2_HX1230_96X68_1_3W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* reset=*/ 8);
//U8G2_HX1230_96X68_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_KS0108_128X64_1 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*dc=*/ 17, /*cs0=*/ 14, /*cs1=*/ 15, /*cs2=*/ U8X8_PIN_NONE, /* reset=*/ U8X8_PIN_NONE); // Set R/W to low!
//U8G2_KS0108_ERM19264_1 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*dc=*/ 17, /*cs0=*/ 14, /*cs1=*/ 15, /*cs2=*/ 16, /* reset=*/ U8X8_PIN_NONE); // Set R/W to low!
//U8G2_ST7920_192X32_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ U8X8_PIN_NONE, /*dc=*/ 17, /*reset=*/ U8X8_PIN_NONE);
//U8G2_ST7920_192X32_1_SW_SPI u8g2(U8G2_R0, /* clock=*/ 18 /* A4 */ , /* data=*/ 16 /* A2 */, /* CS=*/ 17 /* A3 */, /* reset=*/ U8X8_PIN_NONE);
//U8G2_ST7920_128X64_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18 /* A4 */, /*cs=*/ U8X8_PIN_NONE, /*dc/rs=*/ 17 /* A3 */, /*reset=*/ 15 /* A1 */); // Remember to set R/W to 0
//U8G2_ST7920_128X64_1_SW_SPI u8g2(U8G2_R0, /* clock=*/ 18 /* A4 */ , /* data=*/ 16 /* A2 */, /* CS=*/ 17 /* A3 */, /* reset=*/ U8X8_PIN_NONE);
//U8G2_ST7920_128X64_1_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* CS=*/ 10, /* reset=*/ 8);
//U8G2_ST7920_128X64_1_HW_SPI u8g2(U8G2_R0, /* CS=*/ 10, /* reset=*/ 8);
//U8G2_ST7565_EA_DOGM128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_EA_DOGM128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_64128N_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_64128N_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_EA_DOGM132_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ U8X8_PIN_NONE); // DOGM132 Shield
//U8G2_ST7565_EA_DOGM132_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ U8X8_PIN_NONE); // DOGM132 Shield
//U8G2_ST7565_ZOLEN_128X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_ZOLEN_128X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_LM6059_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Adafruit ST7565 GLCD
//U8G2_ST7565_LM6059_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Adafruit ST7565 GLCD
//U8G2_ST7565_LX12864_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_LX12864_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_ERC12864_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_ERC12864_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_NHD_C12832_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_NHD_C12832_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_NHD_C12864_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_NHD_C12864_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_JLX12864_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7565_JLX12864_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7567_PI_132X64_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 7, /* dc=*/ 9, /* reset=*/ 8); // Pax Instruments Shield, LCD_BL=6
//U8G2_ST7567_PI_132X64_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 7, /* dc=*/ 9, /* reset=*/ 8); // Pax Instruments Shield, LCD_BL=6
//U8G2_ST7567_JLX12864_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 7, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7567_JLX12864_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 7, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7567_ENH_DG128064_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7567_ENH_DG128064_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7567_ENH_DG128064I_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7567_ENH_DG128064I_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST75256_JLX172104_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST75256_JLX172104_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST75256_JLX256128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
//U8G2_ST75256_JLX256128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
//U8G2_ST75256_JLX256128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 9, /* data=*/ 8, /* cs=*/ 7, /* dc=*/ 6, /* reset=*/ 5); // MKR Zero, Enable U8g2 16 bit mode for this display
//U8G2_ST75256_JLX256128_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 7, /* dc=*/ 6, /* reset=*/ 5); // MKR Zero, Enable U8g2 16 bit mode for this display
//U8G2_ST75256_JLX256160_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
//U8G2_ST75256_JLX256160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Uno, Enable U8g2 16 bit mode for this display
//U8G2_ST75256_JLX240160_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST75256_JLX240160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST75256_JLX25664_1_2ND_HW_I2C u8g2(U8G2_R0, /* reset=*/ 8); // Due, 2nd I2C, enable U8g2 16 bit mode for this display
//U8G2_NT7534_TG12864R_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_NT7534_TG12864R_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_ST7588_JLX12864_1_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ 5);
//U8G2_ST7588_JLX12864_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ 5);
//U8G2_IST3020_ERC19264_1_6800 u8g2(U8G2_R0, 44, 43, 42, 41, 40, 39, 38, 37, /*enable=*/ 28, /*cs=*/ 32, /*dc=*/ 30, /*reset=*/ 31); // Connect WR pin with GND
//U8G2_IST3020_ERC19264_1_8080 u8g2(U8G2_R0, 44, 43, 42, 41, 40, 39, 38, 37, /*enable=*/ 29, /*cs=*/ 32, /*dc=*/ 30, /*reset=*/ 31); // Connect RD pin with 3.3V
//U8G2_IST3020_ERC19264_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_LC7981_160X80_1_6800 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RW with GND
//U8G2_LC7981_160X160_1_6800 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RW with GND
//U8G2_LC7981_240X128_1_6800 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RW with GND
//U8G2_SED1520_122X32_1 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*dc=*/ A0, /*e1=*/ A3, /*e2=*/ A2, /* reset=*/ A4); // Set R/W to low!
//U8G2_T6963_240X128_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RD with +5V, FS0 and FS1 with GND
//U8G2_T6963_256X64_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect RD with +5V, FS0 and FS1 with GND
//U8G2_SED1330_240X128_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect /RD = E with +5V, enable is /WR = RW, FG with GND, 14=Uno Pin A0
//U8G2_SED1330_240X128_1_6800 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // A0 is dc pin, /WR = RW = GND, enable is /RD = E
//U8G2_RA8835_NHD_240X128_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // Connect /RD = E with +5V, enable is /WR = RW, FG with GND, 14=Uno Pin A0
//U8G2_RA8835_NHD_240X128_1_6800 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 17, /*cs=*/ 14, /*dc=*/ 15, /*reset=*/ 16); // A0 is dc pin, /WR = RW = GND, enable is /RD = E
//U8G2_UC1601_128X32_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_UC1601_128X32_1_3W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* reset=*/ 8);
//U8G2_UC1604_JLX19264_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_UC1604_JLX19264_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_UC1608_ERC24064_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // SW SPI, Due ERC24064-1 Test Setup
//U8G2_UC1608_ERC240120_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
//U8G2_UC1608_240X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // SW SPI, Due ERC24064-1 Test Setup
//U8G2_UC1610_EA_DOGXL160_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ U8X8_PIN_NONE);
//U8G2_UC1610_EA_DOGXL160_1_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ U8X8_PIN_NONE);
//U8G2_UC1611_EA_DOGM240_1_2ND_HW_I2C u8g2(U8G2_R0, /* reset=*/ 8); // Due, 2nd I2C, DOGM240 Test Board
//U8G2_UC1611_EA_DOGM240_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // SW SPI, Due DOGXL240 Test Board
//U8G2_UC1611_EA_DOGXL240_1_2ND_HW_I2C u8g2(U8G2_R0, /* reset=*/ 8); // Due, 2nd I2C, DOGXL240 Test Board
//U8G2_UC1611_EA_DOGXL240_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // SW SPI, Due DOGXL240 Test Board
//U8G2_UC1611_EW50850_1_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18, /*cs=*/ 3, /*dc=*/ 16, /*reset=*/ 16); // 240x160, Connect RD/WR1 pin with 3.3V, CS is aktive high
//U8G2_UC1638_160X128_1_4W_HW_SPI u8g2(U8G2_R2, /* cs=*/ 2, /* dc=*/ 3, /* reset=*/ 4); // Not tested
//U8G2_SSD1606_172X72_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // eInk/ePaper Display
//U8G2_SSD1607_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // eInk/ePaper Display, original LUT from embedded artists
//U8G2_SSD1607_GD_200X200_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // Good Display
//U8G2_IL3820_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // WaveShare 2.9 inch eInk/ePaper Display, enable 16 bit mode for this display!
//U8G2_IL3820_V2_296X128_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8); // ePaper Display, lesser flickering and faster speed, enable 16 bit mode for this display!
// End of constructor list
2018-05-21 19:38:42 +08:00
# define ST_FP 4
/* object types */
struct _st_ot_struct
{
/*
missle and hit :
bit 0 : player missle and trash
bit 1 : trash , which might hit the player
*/
uint8_t missle_mask ; /* this object is a missle: it might destroy something if the target is_hit_fn says so */
uint8_t hit_mask ; /* if missle_mask & hit_mask is != 0 then the object can be destroyed */
uint8_t points ;
uint8_t draw_fn ;
uint8_t move_fn ;
/* ST_MOVE_FN_NONE, ST_MOVE_FN_X_SLOW */
uint8_t destroy_fn ; /* object can be destroyed by a missle (e.g. a missle from the space ship) */
/* ST_DESTROY_FN_NONE, ST_DESTROY_FN_SPLIT */
uint8_t is_hit_fn ; /* is hit procedure */
/* ST_IS_HIT_FN_NONE, ST_IS_HIT_BBOX */
uint8_t fire_fn ;
/* ST_FIRE_FN_NONE, ST_FIRE_FN_X_LEFT */
} ;
typedef struct _st_ot_struct st_ot ;
/*
objects , which are visible at the play area
*/
struct _st_obj_struct
{
uint8_t ot ; /* object type: zero means, object is not used */
int8_t tmp ; /* generic value, used by ST_MOVE_IMPLODE */
/* absolute position */
/* LCD pixel position is x>>ST_FP and y>>ST_FP */
int16_t x , y ;
int8_t x0 , y0 , x1 , y1 ; /* object outline in pixel, reference point is at 0,0 */
} ;
typedef struct _st_obj_struct st_obj ;
# define ST_DRAW_NONE 0
# define ST_DRAW_BBOX 1
# define ST_DRAW_TRASH1 2
# define ST_DRAW_PLAYER1 3
# define ST_DRAW_TRASH2 4
# define ST_DRAW_PLAYER2 5
# define ST_DRAW_PLAYER3 6
# define ST_DRAW_GADGET 7
# define ST_DRAW_BACKSLASH 8
# define ST_DRAW_SLASH 9
# define ST_DRAW_BIG_TRASH 10
# define ST_MOVE_NONE 0
# define ST_MOVE_X_SLOW 1
# define ST_MOVE_PX_NORMAL 2
# define ST_MOVE_PX_FAST 3
# define ST_MOVE_PLAYER 4
# define ST_MOVE_PY 5
# define ST_MOVE_NY 6
# define ST_MOVE_IMPLODE 7
# define ST_MOVE_X_FAST 8
# define ST_MOVE_WALL 9
# define ST_MOVE_NXPY 10
# define ST_MOVE_NXNY 11
# define ST_IS_HIT_NONE 0
# define ST_IS_HIT_BBOX 1
# define ST_IS_HIT_WALL 2
# define ST_DESTROY_NONE 0
# define ST_DESTROY_DISAPPEAR 1
# define ST_DESTROY_TO_DUST 2
# define ST_DESTROY_GADGET 3
# define ST_DESTROY_PLAYER 4
# define ST_DESTROY_PLAYER_GADGETS 5
# define ST_DESTROY_BIG_TRASH 6
# define ST_FIRE_NONE 0
# define ST_FIRE_PLAYER1 1
# define ST_FIRE_PLAYER2 2
# define ST_FIRE_PLAYER3 3
# define ST_OT_WALL_SOLID 1
# define ST_OT_BIG_TRASH 2
# define ST_OT_MISSLE 3
# define ST_OT_TRASH1 4
# define ST_OT_PLAYER 5
# define ST_OT_DUST_PY 6
# define ST_OT_DUST_NY 7
# define ST_OT_TRASH_IMPLODE 8
# define ST_OT_TRASH2 9
# define ST_OT_PLAYER2 10
# define ST_OT_PLAYER3 11
# define ST_OT_GADGET 12
# define ST_OT_GADGET_IMPLODE 13
# define ST_OT_DUST_NXPY 14
# define ST_OT_DUST_NXNY 15
/*================================================================*/
/* graphics object */
/*================================================================*/
u8g2_t * st_u8g2 ;
u8g2_uint_t u8g_height_minus_one ;
# define ST_AREA_HEIGHT (st_u8g2->height - 8)
# define ST_AREA_WIDTH (st_u8g2->width)
/*================================================================*/
/* object types */
/*================================================================*/
const st_ot st_object_types [ ] U8X8_PROGMEM =
{
/* 0: empty object type */
{ 0 , 0 , 0 , ST_DRAW_NONE , ST_MOVE_NONE , ST_DESTROY_DISAPPEAR , ST_IS_HIT_NONE , ST_FIRE_NONE } ,
/* 1: wall, player will be destroyed */
{ 2 , 1 , 30 , ST_DRAW_BBOX , ST_MOVE_WALL , ST_DESTROY_DISAPPEAR , ST_IS_HIT_WALL , ST_FIRE_NONE } ,
/* ST_OT_BIG_TRASH (2) */
{ 2 , 1 , 0 , ST_DRAW_BIG_TRASH , ST_MOVE_X_SLOW , ST_DESTROY_BIG_TRASH , ST_IS_HIT_BBOX , ST_FIRE_NONE } ,
/* 3: simple space ship (player) missle */
{ 1 , 0 , 0 , ST_DRAW_BBOX , ST_MOVE_PX_FAST , ST_DESTROY_DISAPPEAR , ST_IS_HIT_NONE , ST_FIRE_NONE } ,
/* ST_OT_TRASH1 (4): trash */
{ 2 , 1 , 0 , ST_DRAW_TRASH1 , ST_MOVE_X_SLOW , ST_DESTROY_TO_DUST , ST_IS_HIT_BBOX , ST_FIRE_NONE } ,
/* ST_OT_PLAYER (5): player space ship */
{ 0 , 2 , 0 , ST_DRAW_PLAYER1 , ST_MOVE_PLAYER , ST_DESTROY_PLAYER , ST_IS_HIT_BBOX , ST_FIRE_PLAYER1 } ,
/* ST_OT_DUST_PY (6): Last part of trash */
{ 0 , 0 , 0 , ST_DRAW_BBOX , ST_MOVE_PY , ST_DESTROY_NONE , ST_IS_HIT_NONE , ST_FIRE_NONE } ,
/* ST_OT_DUST_NY (7): Last part of trash */
{ 0 , 0 , 0 , ST_DRAW_BBOX , ST_MOVE_NY , ST_DESTROY_NONE , ST_IS_HIT_NONE , ST_FIRE_NONE } ,
/* ST_OT_TRASH_IMPLODE (8): trash was hit */
{ 0 , 0 , 5 , ST_DRAW_TRASH1 , ST_MOVE_IMPLODE , ST_DESTROY_NONE , ST_IS_HIT_NONE , ST_FIRE_NONE } ,
/* ST_OT_TRASH2 (9): trash */
{ 2 , 1 , 0 , ST_DRAW_TRASH2 , ST_MOVE_X_SLOW , ST_DESTROY_TO_DUST , ST_IS_HIT_BBOX , ST_FIRE_NONE } ,
/* ST_OT_PLAYER2 (10): player space ship+1x enhancement */
{ 0 , 2 , 0 , ST_DRAW_PLAYER2 , ST_MOVE_PLAYER , ST_DESTROY_PLAYER_GADGETS , ST_IS_HIT_BBOX , ST_FIRE_PLAYER2 } ,
/* ST_OT_PLAYER3 (11): player space ship+2x enhancement */
{ 0 , 2 , 0 , ST_DRAW_PLAYER3 , ST_MOVE_PLAYER , ST_DESTROY_PLAYER_GADGETS , ST_IS_HIT_BBOX , ST_FIRE_PLAYER3 } ,
/* ST_OT_GADGET (12): adds enhancements */
{ 0 , 1 , 0 , ST_DRAW_GADGET , ST_MOVE_X_FAST , ST_DESTROY_GADGET , ST_IS_HIT_BBOX , ST_FIRE_NONE } ,
/* ST_OT_GADGET_IMPLODE (13) */
{ 0 , 0 , 20 , ST_DRAW_GADGET , ST_MOVE_IMPLODE , ST_DESTROY_NONE , ST_IS_HIT_NONE , ST_FIRE_NONE } ,
/* ST_OT_DUST_NXPY (14): Last part of trash */
{ 0 , 0 , 0 , ST_DRAW_BACKSLASH , ST_MOVE_NXPY , ST_DESTROY_NONE , ST_IS_HIT_NONE , ST_FIRE_NONE } ,
/* ST_OT_DUST_NXNY (15): Last part of trash */
{ 0 , 0 , 0 , ST_DRAW_SLASH , ST_MOVE_NXNY , ST_DESTROY_NONE , ST_IS_HIT_NONE , ST_FIRE_NONE } ,
} ;
/*================================================================*/
/* list of all objects on the screen */
/*================================================================*/
/* use AVR RAMEND constant to derive the number of allowed objects */
# if RAMEND < 0x300
# define ST_OBJ_CNT 25
# else
//#define ST_OBJ_CNT 45
# define ST_OBJ_CNT 60
# endif
st_obj st_objects [ ST_OBJ_CNT ] ;
/*================================================================*/
/* about players space ship*/
/*================================================================*/
/* player position */
uint8_t st_player_pos ;
/* points */
# define ST_POINTS_PER_LEVEL 25
uint16_t st_player_points ;
uint16_t st_player_points_delayed ;
uint16_t st_highscore = 0 ;
/*================================================================*/
/* overall game state */
/*================================================================*/
# define ST_STATE_PREPARE 0
# define ST_STATE_IPREPARE 1
# define ST_STATE_GAME 2
# define ST_STATE_END 3
# define ST_STATE_IEND 4
uint8_t st_state = ST_STATE_PREPARE ;
/*================================================================*/
/* game difficulty */
/*================================================================*/
uint8_t st_difficulty = 1 ;
# define ST_DIFF_VIS_LEN 30
# define ST_DIFF_FP 5
uint16_t st_to_diff_cnt = 0 ;
/*================================================================*/
/* bitmaps */
/*================================================================*/
const uint8_t st_bitmap_player1 [ ] =
{
/* 01100000 */ 0x060 ,
/* 11111000 */ 0x0f8 ,
/* 01111110 */ 0x07e ,
/* 11111000 */ 0x0f8 ,
/* 01100000 */ 0x060
} ;
const uint8_t st_bitmap_player2 [ ] =
{
/* 01100000 */ 0x060 ,
/* 01111100 */ 0x078 ,
/* 01100000 */ 0x060 ,
/* 11100000 */ 0x0e0 ,
/* 11111000 */ 0x0f8 ,
/* 01111110 */ 0x07e ,
/* 11111000 */ 0x0f8 ,
/* 01100000 */ 0x060
} ;
const uint8_t st_bitmap_player3 [ ] =
{
/* 01100000 */ 0x060 ,
/* 01111100 */ 0x078 ,
/* 01100000 */ 0x060 ,
/* 11100000 */ 0x0e0 ,
/* 11111000 */ 0x0f8 ,
/* 01111110 */ 0x07e ,
/* 11111000 */ 0x0f8 ,
/* 11100000 */ 0x0e0 ,
/* 01100000 */ 0x060 ,
/* 01111100 */ 0x078 ,
/* 01100000 */ 0x060
} ;
const uint8_t st_bitmap_trash_5x5_1 [ ] =
{
/* 01110000 */ 0x070 ,
/* 11110000 */ 0x0f0 ,
/* 11111000 */ 0x0f8 ,
/* 01111000 */ 0x078 ,
/* 00110000 */ 0x030 ,
} ;
const uint8_t st_bitmap_trash_5x5_2 [ ] =
{
/* 00110000 */ 0x030 ,
/* 11111000 */ 0x0f8 ,
/* 11111000 */ 0x0f8 ,
/* 11110000 */ 0x0f0 ,
/* 01110000 */ 0x070 ,
} ;
const uint8_t st_bitmap_trash_7x7 [ ] =
{
/* 00111000 */ 0x038 ,
/* 01111100 */ 0x07c ,
/* 11111100 */ 0x0fc ,
/* 11111110 */ 0x0fe ,
/* 11111110 */ 0x0fe ,
/* 01111110 */ 0x07e ,
/* 01111000 */ 0x078 ,
} ;
const uint8_t st_bitmap_gadget [ ] =
{
/* 01110000 */ 0x070 ,
/* 11011000 */ 0x0d8 ,
/* 10001000 */ 0x088 ,
/* 11011000 */ 0x0d8 ,
/* 01110000 */ 0x070 ,
} ;
/*================================================================*/
/* forward definitions */
/*================================================================*/
uint8_t st_rnd ( void ) U8X8_NOINLINE ;
static st_obj * st_GetObj ( uint8_t objnr ) U8X8_NOINLINE ;
uint8_t st_GetMissleMask ( uint8_t objnr ) ;
uint8_t st_GetHitMask ( uint8_t objnr ) ;
int8_t st_FindObj ( uint8_t ot ) U8X8_NOINLINE ;
void st_ClrObjs ( void ) U8X8_NOINLINE ;
int8_t st_NewObj ( void ) U8X8_NOINLINE ;
uint8_t st_CntObj ( uint8_t ot ) ;
uint8_t st_CalcXY ( st_obj * o ) U8X8_NOINLINE ;
void st_SetXY ( st_obj * o , uint8_t x , uint8_t y ) U8X8_NOINLINE ;
void st_FireStep ( uint8_t is_auto_fire , uint8_t is_fire ) U8X8_NOINLINE ;
void st_InitTrash ( uint8_t x , uint8_t y , int8_t dir ) ;
void st_NewGadget ( uint8_t x , uint8_t y ) ;
void st_NewPlayerMissle ( uint8_t x , uint8_t y ) ;
void st_NewTrashDust ( uint8_t x , uint8_t y , int ot ) ;
void st_NewTrashDustAreaArgs ( int16_t x , int16_t y , int ot ) ;
void st_SetupPlayer ( uint8_t objnr , uint8_t ot ) ;
/*================================================================*/
/* utility functions */
/*================================================================*/
char st_itoa_buf [ 12 ] ;
char * st_itoa ( unsigned long v )
{
volatile unsigned char i = 11 ;
st_itoa_buf [ 11 ] = ' \0 ' ;
while ( i > 0 )
{
i - - ;
st_itoa_buf [ i ] = ( v % 10 ) + ' 0 ' ;
v / = 10 ;
if ( v = = 0 )
break ;
}
return st_itoa_buf + i ;
}
uint8_t st_rnd ( void )
{
return rand ( ) ;
}
/*
for the specified index number , return the object
*/
static st_obj * st_GetObj ( uint8_t objnr )
{
return st_objects + objnr ;
}
/*
check , if this is a missle - like object ( that is , can this object destroy something else )
*/
uint8_t st_GetMissleMask ( uint8_t objnr )
{
st_obj * o = st_GetObj ( objnr ) ;
return u8x8_pgm_read ( & ( st_object_types [ o - > ot ] . missle_mask ) ) ;
}
/*
check , if this is a missle - like object ( that is , can this object destroy something else )
*/
uint8_t st_GetHitMask ( uint8_t objnr )
{
st_obj * o = st_GetObj ( objnr ) ;
return u8x8_pgm_read ( & ( st_object_types [ o - > ot ] . hit_mask ) ) ;
}
/*
search an empty object
*/
int8_t st_FindObj ( uint8_t ot )
{
int8_t i ;
for ( i = 0 ; i < ST_OBJ_CNT ; i + + )
{
if ( st_objects [ i ] . ot = = ot )
return i ;
}
return - 1 ;
}
/*
delete all objects
*/
void st_ClrObjs ( void )
{
int8_t i ;
for ( i = 0 ; i < ST_OBJ_CNT ; i + + )
st_objects [ i ] . ot = 0 ;
}
/*
search an empty object
*/
int8_t st_NewObj ( void )
{
int8_t i ;
for ( i = 0 ; i < ST_OBJ_CNT ; i + + )
{
if ( st_objects [ i ] . ot = = 0 )
return i ;
}
return - 1 ;
}
/*
count number of objectes of the provided type
st_CntObj ( 0 ) will return the number of empty objects , that means if
st_CntObj ( 0 ) > 0 then st_NewObj ( ) will return a valid index
*/
uint8_t st_CntObj ( uint8_t ot )
{
uint8_t i ;
uint8_t cnt = 0 ;
for ( i = 0 ; i < ST_OBJ_CNT ; i + + )
{
if ( st_objects [ i ] . ot = = ot )
cnt + + ;
}
return cnt ;
}
/*
calculate the pixel coordinates of the reference point of an object
return rhe x value
*/
uint8_t st_px_x , st_px_y ; /* pixel within area */
uint8_t st_CalcXY ( st_obj * o )
{
//st_obj *o = st_GetObj(objnr);
st_px_y = o - > y > > ST_FP ;
st_px_x = o - > x > > ST_FP ;
return st_px_x ;
}
void st_SetXY ( st_obj * o , uint8_t x , uint8_t y )
{
o - > x = ( ( int16_t ) x ) < < ST_FP ;
o - > y = ( ( int16_t ) y ) < < ST_FP ;
}
/*
calculate the object bounding box and place it into some global variables
*/
int16_t st_bbox_x0 , st_bbox_y0 , st_bbox_x1 , st_bbox_y1 ;
void st_CalcBBOX ( uint8_t objnr )
{
st_obj * o = st_GetObj ( objnr ) ;
st_bbox_x0 = ( uint16_t ) ( o - > x > > ST_FP ) ;
st_bbox_x1 = st_bbox_x0 ;
st_bbox_x0 + = o - > x0 ;
st_bbox_x1 + = o - > x1 ;
st_bbox_y0 = ( uint16_t ) ( o - > y > > ST_FP ) ;
st_bbox_y1 = st_bbox_y0 ;
st_bbox_y0 + = o - > y0 ;
st_bbox_y1 + = o - > y1 ;
}
/*
clip bbox with the view window . requires a call to st_CalcBBOX
return 0 , if the bbox is totally outside the window
*/
uint8_t st_cbbox_x0 , st_cbbox_y0 , st_cbbox_x1 , st_cbbox_y1 ;
uint8_t st_ClipBBOX ( void )
{
if ( st_bbox_x0 > = ST_AREA_WIDTH )
return 0 ;
if ( st_bbox_x0 > = 0 )
st_cbbox_x0 = ( uint16_t ) st_bbox_x0 ;
else
st_cbbox_x0 = 0 ;
if ( st_bbox_x1 < 0 )
return 0 ;
if ( st_bbox_x1 < ST_AREA_WIDTH )
st_cbbox_x1 = ( uint16_t ) st_bbox_x1 ;
else
st_cbbox_x1 = ST_AREA_WIDTH - 1 ;
if ( st_bbox_y0 > = ST_AREA_HEIGHT )
return 0 ;
if ( st_bbox_y0 > = 0 )
st_cbbox_y0 = ( uint16_t ) st_bbox_y0 ;
else
st_cbbox_y0 = 0 ;
if ( st_bbox_y1 < 0 )
return 0 ;
if ( st_bbox_y1 < ST_AREA_HEIGHT )
st_cbbox_y1 = ( uint16_t ) st_bbox_y1 ;
else
st_cbbox_y1 = ST_AREA_HEIGHT - 1 ;
return 1 ;
}
/*================================================================*/
/* universal member functions */
/*================================================================*/
uint8_t st_IsOut ( uint8_t objnr )
{
st_CalcBBOX ( objnr ) ;
if ( st_bbox_x0 > = ST_AREA_WIDTH )
return 1 ;
if ( st_bbox_x1 < 0 )
return 1 ;
if ( st_bbox_y0 > = ST_AREA_HEIGHT )
return 1 ;
if ( st_bbox_y1 < 0 )
return 1 ;
return 0 ;
}
void st_Disappear ( uint8_t objnr )
{
st_obj * o = st_GetObj ( objnr ) ;
st_player_points + = u8x8_pgm_read ( & ( st_object_types [ o - > ot ] . points ) ) ;
o - > ot = 0 ;
}
/*================================================================*/
/* type dependent member functions */
/*================================================================*/
void st_Move ( uint8_t objnr )
{
st_obj * o = st_GetObj ( objnr ) ;
switch ( u8x8_pgm_read ( & ( st_object_types [ o - > ot ] . move_fn ) ) )
{
case ST_MOVE_NONE :
break ;
case ST_MOVE_X_SLOW :
o - > x - = ( 1 < < ST_FP ) / 8 ;
o - > x - = st_difficulty ;
o - > y + = ( int16_t ) o - > tmp ;
if ( o - > y > = ( ( ST_AREA_HEIGHT - 1 ) < < ST_FP ) | | o - > y < = 0 )
o - > tmp = - o - > tmp ;
break ;
case ST_MOVE_X_FAST :
o - > x - = ( 1 < < ST_FP ) / 2 ;
o - > y + = ( int16_t ) o - > tmp ;
if ( o - > y > = ( ( ST_AREA_HEIGHT - 1 ) < < ST_FP ) | | o - > y < = 0 )
o - > tmp = - o - > tmp ;
break ;
case ST_MOVE_PX_NORMAL :
o - > x + = ( 1 < < ST_FP ) / 4 ;
break ;
case ST_MOVE_PX_FAST :
o - > x + = ( 1 < < ST_FP ) ;
break ;
case ST_MOVE_PLAYER :
o - > y = st_player_pos < < ST_FP ;
break ;
case ST_MOVE_PY :
o - > y + = 3 * ST_FP ;
break ;
case ST_MOVE_NY :
o - > y - = 3 * ST_FP ;
break ;
case ST_MOVE_NXPY :
o - > y + = 3 * ST_FP ;
o - > x - = 3 * ST_FP ;
break ;
case ST_MOVE_NXNY :
o - > y - = 3 * ST_FP ;
o - > x - = 3 * ST_FP ;
break ;
case ST_MOVE_IMPLODE :
o - > tmp + + ;
if ( ( o - > tmp & 0x03 ) = = 0 )
{
if ( o - > x0 ! = o - > x1 )
o - > x0 + + ;
else
st_Disappear ( objnr ) ;
}
break ;
case ST_MOVE_WALL :
o - > x - = 1 ;
o - > x - = ( st_difficulty > > 1 ) ;
break ;
}
}
void st_DrawBBOX ( uint8_t objnr )
{
uint8_t y0 , y1 ;
/*st_obj *o = st_GetObj(objnr);*/
st_CalcBBOX ( objnr ) ;
if ( st_ClipBBOX ( ) = = 0 )
return ;
/* st_cbbox_x0, st_cbbox_y0, st_cbbox_x1, st_cbbox_y1; */
// w = st_cbbox_x1-st_cbbox_x0;
// w++;
// h = st_cbbox_y1-st_cbbox_y0;
// h++;
//dog_SetVLine(st_cbbox_x0, st_cbbox_y0, st_cbbox_y1);
//dog_SetVLine(st_cbbox_x1, st_cbbox_y0, st_cbbox_y1);
//dog_SetHLine(st_cbbox_x0, st_cbbox_x1, st_cbbox_y0);
//dog_SetHLine(st_cbbox_x0, st_cbbox_x1, st_cbbox_y1);
u8g2_SetDrawColor ( st_u8g2 , 1 ) ;
y0 = u8g_height_minus_one - st_cbbox_y0 ;
y1 = u8g_height_minus_one - st_cbbox_y1 ;
u8g2_DrawFrame ( st_u8g2 , st_cbbox_x0 , y1 , st_cbbox_x1 - st_cbbox_x0 + 1 , y0 - y1 + 1 ) ;
//dog_SetBox(st_cbbox_x0, st_cbbox_y0, st_cbbox_x1, st_cbbox_y1);
/*
if ( o - > ot = = ST_OT_PLAYER )
{
dog_DrawStr ( 0 , 26 , font_4x6 , st_itoa ( st_cbbox_y0 ) ) ;
dog_DrawStr ( 10 , 26 , font_4x6 , st_itoa ( st_cbbox_y1 ) ) ;
}
*/
}
# ifdef FN_IS_NOT_IN_USE
void st_DrawFilledBox ( uint8_t objnr )
{
st_CalcBBOX ( objnr ) ;
if ( st_ClipBBOX ( ) = = 0 )
return ;
/* st_cbbox_x0, st_cbbox_y0, st_cbbox_x1, st_cbbox_y1; */
dog_SetBox ( st_cbbox_x0 , st_cbbox_y0 , st_cbbox_x1 , st_cbbox_y1 ) ;
}
# endif
void st_DrawBitmap ( uint8_t objnr , const uint8_t * bm , uint8_t w , uint8_t h )
{
/* st_obj *o = st_GetObj(objnr); */
st_CalcBBOX ( objnr ) ;
/* result is here: int16_t st_bbox_x0, st_bbox_y0, st_bbox_x1, st_bbox_y1 */
//dog_SetBitmapP(st_bbox_x0,st_bbox_y1,bm,w,h);
u8g2_DrawBitmap ( st_u8g2 , st_bbox_x0 , u8g_height_minus_one - st_bbox_y1 , ( w + 7 ) / 8 , h , bm ) ;
}
void st_DrawObj ( uint8_t objnr )
{
st_obj * o = st_GetObj ( objnr ) ;
switch ( u8x8_pgm_read ( & ( st_object_types [ o - > ot ] . draw_fn ) ) )
{
case ST_DRAW_NONE :
break ;
case ST_DRAW_BBOX :
st_DrawBBOX ( objnr ) ;
break ;
case ST_DRAW_TRASH1 :
st_DrawBitmap ( objnr , st_bitmap_trash_5x5_1 , o - > x1 - o - > x0 + 1 , 5 ) ;
break ;
case ST_DRAW_TRASH2 :
st_DrawBitmap ( objnr , st_bitmap_trash_5x5_2 , o - > x1 - o - > x0 + 1 , 5 ) ;
break ;
case ST_DRAW_BIG_TRASH :
st_DrawBitmap ( objnr , st_bitmap_trash_7x7 , o - > x1 - o - > x0 + 1 , 7 ) ;
break ;
case ST_DRAW_PLAYER1 :
st_DrawBitmap ( objnr , st_bitmap_player1 , 7 , 5 ) ;
break ;
case ST_DRAW_PLAYER2 :
st_DrawBitmap ( objnr , st_bitmap_player2 , 7 , 8 ) ;
break ;
case ST_DRAW_PLAYER3 :
st_DrawBitmap ( objnr , st_bitmap_player3 , 7 , 11 ) ;
break ;
case ST_DRAW_GADGET :
/* could use this proc, but... */
/* st_DrawBitmap(objnr, st_bitmap_gadget,o->x1-o->x0+1, 5); */
/* ... this one looks also funny. */
st_DrawBitmap ( objnr , st_bitmap_gadget , 5 , 5 ) ;
break ;
case ST_DRAW_BACKSLASH :
{
uint8_t x ;
uint8_t y ;
x = st_CalcXY ( o ) ;
y = st_px_y ;
// dog_SetPixel(x,y);
// x++; y--;
// dog_SetPixel(x,y);
// x++; y--;
// dog_SetPixel(x,y);
u8g2_SetDrawColor ( st_u8g2 , 1 ) ;
u8g2_DrawPixel ( st_u8g2 , x , u8g_height_minus_one - y ) ;
x + + ; y - - ;
u8g2_DrawPixel ( st_u8g2 , x , u8g_height_minus_one - y ) ;
x + + ; y - - ;
u8g2_DrawPixel ( st_u8g2 , x , u8g_height_minus_one - y ) ;
}
break ;
case ST_DRAW_SLASH :
{
uint8_t x ;
uint8_t y ;
x = st_CalcXY ( o ) ;
y = st_px_y ;
// dog_SetPixel(x,y);
// x++; y++;
// dog_SetPixel(x,y);
// x++; y++;
// dog_SetPixel(x,y);
u8g2_SetDrawColor ( st_u8g2 , 1 ) ;
u8g2_DrawPixel ( st_u8g2 , x , u8g_height_minus_one - y ) ;
x + + ; y + + ;
u8g2_DrawPixel ( st_u8g2 , x , u8g_height_minus_one - y ) ;
x + + ; y + + ;
u8g2_DrawPixel ( st_u8g2 , x , u8g_height_minus_one - y ) ;
}
break ;
}
}
uint8_t st_IsHitBBOX ( uint8_t objnr , uint8_t x , uint8_t y )
{
st_CalcBBOX ( objnr ) ;
if ( st_ClipBBOX ( ) = = 0 )
return 0 ; /* obj is outside (not visible) */
if ( x < st_cbbox_x0 )
return 0 ;
if ( x > st_cbbox_x1 )
return 0 ;
if ( y < st_cbbox_y0 )
return 0 ;
if ( y > st_cbbox_y1 )
return 0 ;
return 1 ;
}
void st_Destroy ( uint8_t objnr )
{
int8_t nr ;
st_obj * o = st_GetObj ( objnr ) ;
switch ( u8x8_pgm_read ( & ( st_object_types [ o - > ot ] . destroy_fn ) ) )
{
case ST_DESTROY_NONE : /* only usefull for missels or walls which stay alife */
break ;
case ST_DESTROY_DISAPPEAR : /* this should be the default operation */
st_Disappear ( objnr ) ;
break ;
case ST_DESTROY_GADGET :
nr = st_FindObj ( ST_OT_PLAYER2 ) ;
if ( nr > = 0 )
st_SetupPlayer ( nr , ST_OT_PLAYER3 ) ;
else
{
nr = st_FindObj ( ST_OT_PLAYER ) ;
if ( nr > = 0 )
st_SetupPlayer ( nr , ST_OT_PLAYER2 ) ;
}
st_NewTrashDustAreaArgs ( o - > x , o - > y , ST_OT_DUST_PY ) ;
st_NewTrashDustAreaArgs ( o - > x , o - > y , ST_OT_DUST_NY ) ;
o - > ot = ST_OT_GADGET_IMPLODE ;
o - > tmp = 0 ;
break ;
case ST_DESTROY_TO_DUST :
st_NewTrashDustAreaArgs ( o - > x , o - > y , ST_OT_DUST_PY ) ;
st_NewTrashDustAreaArgs ( o - > x , o - > y , ST_OT_DUST_NY ) ;
o - > ot = ST_OT_TRASH_IMPLODE ;
o - > tmp = 0 ;
break ;
case ST_DESTROY_BIG_TRASH :
st_NewTrashDustAreaArgs ( o - > x , o - > y , ST_OT_DUST_PY ) ;
st_NewTrashDustAreaArgs ( o - > x , o - > y , ST_OT_DUST_NY ) ;
st_InitTrash ( ( o - > x > > ST_FP ) - 1 , ( o - > y > > ST_FP ) + 3 , 2 + ( st_rnd ( ) & 3 ) ) ;
st_InitTrash ( ( o - > x > > ST_FP ) - 2 , ( o - > y > > ST_FP ) - 3 , - 2 - ( st_rnd ( ) & 3 ) ) ;
st_Disappear ( objnr ) ;
break ;
case ST_DESTROY_PLAYER :
st_Disappear ( objnr ) ;
st_state = ST_STATE_END ;
o - > tmp = 0 ;
break ;
case ST_DESTROY_PLAYER_GADGETS :
/* o->ot = ST_OT_PLAYER; */
st_SetupPlayer ( objnr , ST_OT_PLAYER ) ;
break ;
}
}
/*
check if the target ( objnr ) has been hit .
st_IsHit ( ) must also destroy the target .
return value :
0 : do not destroy the missle
1 : destroy the missle
*/
uint8_t st_IsHit ( uint8_t objnr , uint8_t x , uint8_t y , uint8_t missle_mask )
{
uint8_t hit_mask = st_GetHitMask ( objnr ) ;
st_obj * o ;
if ( ( hit_mask & missle_mask ) = = 0 )
return 0 ;
o = st_GetObj ( objnr ) ;
switch ( u8x8_pgm_read ( & ( st_object_types [ o - > ot ] . is_hit_fn ) ) )
{
case ST_IS_HIT_NONE :
break ;
case ST_IS_HIT_BBOX :
if ( st_IsHitBBOX ( objnr , x , y ) ! = 0 )
{
st_Destroy ( objnr ) ;
return 1 ;
}
break ;
case ST_IS_HIT_WALL :
if ( st_IsHitBBOX ( objnr , x , y ) ! = 0 )
{
o - > x0 + + ;
if ( o - > x0 < o - > x1 )
{
st_NewTrashDust ( x , y , ST_OT_DUST_NXPY ) ;
st_NewTrashDust ( x , y , ST_OT_DUST_NXNY ) ;
}
else
{
st_Destroy ( objnr ) ;
st_NewTrashDust ( x , y , ST_OT_DUST_NXPY ) ;
st_NewTrashDust ( x , y , ST_OT_DUST_NXNY ) ;
st_NewTrashDust ( x , y , ST_OT_DUST_NY ) ;
st_NewTrashDust ( x , y , ST_OT_DUST_PY ) ;
}
return 1 ;
}
break ;
}
return 0 ;
}
/* update all fire counters */
uint8_t st_fire_player = 0 ;
uint8_t st_fire_period = 51 ;
uint8_t st_manual_fire_delay = 20 ;
uint8_t st_is_fire_last_value = 0 ;
/*
is_auto_fire = = 1
is_fire will be ignored , autofire enabled
is_auto_fire = = 0
a transition from 1 to 0 on the is_fire variable will issue a missle
*/
void st_FireStep ( uint8_t is_auto_fire , uint8_t is_fire )
{
if ( is_auto_fire ! = 0 )
{
st_fire_player + + ;
if ( st_fire_player > = st_fire_period )
st_fire_player = 0 ;
}
else
{
if ( st_fire_player < st_manual_fire_delay )
{
st_fire_player + + ;
}
else
{
if ( st_is_fire_last_value = = 0 )
if ( is_fire ! = 0 )
st_fire_player = 0 ;
}
st_is_fire_last_value = is_fire ;
}
}
void st_Fire ( uint8_t objnr )
{
st_obj * o = st_GetObj ( objnr ) ;
uint8_t x ;
uint8_t y ;
switch ( u8x8_pgm_read ( & ( st_object_types [ o - > ot ] . fire_fn ) ) )
{
case ST_FIRE_NONE :
break ;
case ST_FIRE_PLAYER1 :
if ( st_fire_player = = 0 )
{
/* create missle at st_px_x and st_px_y */
x = st_CalcXY ( o ) ;
y = st_px_y ;
st_NewPlayerMissle ( x , y ) ;
}
break ;
case ST_FIRE_PLAYER2 :
if ( st_fire_player = = 0 )
{
/* create missle at st_px_x and st_px_y */
x = st_CalcXY ( o ) ;
y = st_px_y ;
st_NewPlayerMissle ( x , y ) ;
st_NewPlayerMissle ( x , y + 4 ) ;
}
break ;
case ST_FIRE_PLAYER3 :
if ( st_fire_player = = 0 )
{
/* create missle at st_px_x and st_px_y */
x = st_CalcXY ( o ) ;
y = st_px_y ;
st_NewPlayerMissle ( x , y ) ;
st_NewPlayerMissle ( x , y + 4 ) ;
st_NewPlayerMissle ( x , y - 4 ) ;
}
break ;
}
}
/*================================================================*/
/* object init functions */
/*================================================================*/
/*
x , y are pixel coordinats within the play arey
*/
void st_NewGadget ( uint8_t x , uint8_t y )
{
st_obj * o ;
int8_t objnr = st_NewObj ( ) ;
if ( objnr < 0 )
return ;
o = st_GetObj ( objnr ) ;
st_SetXY ( o , x , y ) ;
o - > ot = ST_OT_GADGET ;
o - > tmp = 8 ;
//o->x = (x)<<ST_FP;
//o->y = (y)<<ST_FP;
o - > x0 = - 3 ;
o - > x1 = 1 ;
o - > y0 = - 2 ;
o - > y1 = 2 ;
}
/*
x , y are pixel coordinats within the play arey
dir : direction
0 : random
! = 0 - - > assigned
*/
void st_InitTrash ( uint8_t x , uint8_t y , int8_t dir )
{
st_obj * o ;
int8_t objnr = st_NewObj ( ) ;
if ( objnr < 0 )
return ;
o = st_GetObj ( objnr ) ;
if ( ( st_rnd ( ) & 1 ) = = 0 )
o - > ot = ST_OT_TRASH1 ;
else
o - > ot = ST_OT_TRASH2 ;
if ( dir = = 0 )
{
o - > tmp = 0 ;
if ( st_rnd ( ) & 1 )
{
if ( st_rnd ( ) & 1 )
o - > tmp + + ;
else
o - > tmp - - ;
}
}
else
{
o - > tmp = dir ;
}
st_SetXY ( o , x , y ) ;
//o->x = (x)<<ST_FP;
//o->y = (y)<<ST_FP;
o - > x0 = - 3 ;
o - > x1 = 1 ;
o - > y0 = - 2 ;
o - > y1 = 2 ;
if ( st_difficulty > = 5 )
{
if ( ( st_rnd ( ) & 3 ) = = 0 )
{
o - > ot = ST_OT_BIG_TRASH ;
o - > y0 - - ;
o - > y1 + + ;
o - > x0 - - ;
o - > x1 + + ;
}
}
}
/*
x , y are pixel coordinats within the play arey
*/
void st_NewTrashDust ( uint8_t x , uint8_t y , int ot )
{
st_obj * o ;
int8_t objnr = st_NewObj ( ) ;
if ( objnr < 0 )
return ;
o = st_GetObj ( objnr ) ;
o - > ot = ot ;
st_SetXY ( o , x , y ) ;
//o->x = (x)<<ST_FP;
//o->y = (y)<<ST_FP;
o - > x0 = 0 ;
o - > x1 = 0 ;
o - > y0 = - 2 ;
o - > y1 = 2 ;
}
void st_NewTrashDustAreaArgs ( int16_t x , int16_t y , int ot )
{
st_NewTrashDust ( x > > ST_FP , y > > ST_FP , ot ) ;
}
void st_NewWall ( void )
{
st_obj * o ;
int8_t objnr = st_NewObj ( ) ;
int8_t h ;
if ( objnr < 0 )
return ;
o = st_GetObj ( objnr ) ;
o - > ot = ST_OT_WALL_SOLID ;
h = st_rnd ( ) ;
h & = 63 ;
h = ( int8_t ) ( ( ( int16_t ) h * ( int16_t ) ( ST_AREA_HEIGHT / 4 ) ) > > 6 ) ;
h + = ST_AREA_HEIGHT / 6 ;
o - > x0 = 0 ;
o - > x1 = 5 ;
o - > x = ( ST_AREA_WIDTH - 1 ) < < ST_FP ;
if ( ( st_rnd ( ) & 1 ) = = 0 )
{
o - > y = ( ST_AREA_HEIGHT - 1 ) < < ST_FP ;
o - > y0 = - h ;
o - > y1 = 0 ;
}
else
{
o - > y = ( 0 ) < < ST_FP ;
o - > y0 = 0 ;
o - > y1 = h ;
}
}
void st_NewPlayerMissle ( uint8_t x , uint8_t y )
{
st_obj * o ;
int8_t objnr = st_NewObj ( ) ;
if ( objnr < 0 )
return ;
o = st_GetObj ( objnr ) ;
o - > ot = ST_OT_MISSLE ;
st_SetXY ( o , x , y ) ;
//o->x = x<<ST_FP;
//o->y = y<<ST_FP;
o - > x0 = - 4 ;
o - > x1 = 1 ;
o - > y0 = 0 ;
o - > y1 = 0 ;
}
void st_SetupPlayer ( uint8_t objnr , uint8_t ot )
{
st_obj * o = st_GetObj ( objnr ) ;
switch ( ot )
{
case ST_OT_PLAYER :
o - > ot = ot ;
o - > y0 = - 2 ;
o - > y1 = 2 ;
break ;
case ST_OT_PLAYER2 :
o - > ot = ot ;
o - > y0 = - 2 ;
o - > y1 = 5 ;
break ;
case ST_OT_PLAYER3 :
o - > ot = ot ;
o - > y0 = - 5 ;
o - > y1 = 5 ;
break ;
}
}
void st_NewPlayer ( void )
{
st_obj * o ;
int8_t objnr = st_NewObj ( ) ;
if ( objnr < 0 )
return ;
o = st_GetObj ( objnr ) ;
o - > x = 6 < < ST_FP ;
o - > y = ( ST_AREA_HEIGHT / 2 ) < < ST_FP ;
o - > x0 = - 6 ;
o - > x1 = 0 ;
st_SetupPlayer ( objnr , ST_OT_PLAYER ) ;
}
/*================================================================*/
/* trash creation */
/*================================================================*/
void st_InitDeltaWall ( void )
{
uint8_t i ;
uint8_t cnt = 0 ;
uint8_t max_x = 0 ;
uint8_t max_l ;
uint8_t min_dist_for_new = 40 ;
uint8_t my_difficulty = st_difficulty ;
if ( st_difficulty > = 2 )
{
max_l = ST_AREA_WIDTH ;
max_l - = min_dist_for_new ;
if ( my_difficulty > 30 )
my_difficulty = 30 ;
min_dist_for_new - = my_difficulty ;
for ( i = 0 ; i < ST_OBJ_CNT ; i + + )
{
if ( st_objects [ i ] . ot = = ST_OT_WALL_SOLID )
{
cnt + + ;
if ( max_x < ( st_objects [ i ] . x > > ST_FP ) )
max_x = ( st_objects [ i ] . x > > ST_FP ) ;
}
}
/* if ( cnt < upper_trash_limit ) */
if ( max_x < max_l )
{
st_NewWall ( ) ;
}
}
}
void st_InitDeltaTrash ( void )
{
uint8_t i ;
uint8_t cnt = 0 ;
uint8_t max_x = 0 ;
uint8_t max_l ;
uint8_t upper_trash_limit = ST_OBJ_CNT - 7 ;
uint8_t min_dist_for_new = 20 ;
uint8_t my_difficulty = st_difficulty ;
if ( my_difficulty > 14 )
my_difficulty = 14 ;
min_dist_for_new - = my_difficulty ;
for ( i = 0 ; i < ST_OBJ_CNT ; i + + )
{
if ( st_objects [ i ] . ot = = ST_OT_TRASH1 | | st_objects [ i ] . ot = = ST_OT_TRASH2 | | st_objects [ i ] . ot = = ST_OT_GADGET | | st_objects [ i ] . ot = = ST_OT_BIG_TRASH )
{
cnt + + ;
if ( max_x < ( st_objects [ i ] . x > > ST_FP ) )
max_x = ( st_objects [ i ] . x > > ST_FP ) ;
}
}
max_l = ST_AREA_WIDTH ;
max_l - = min_dist_for_new ;
if ( cnt < upper_trash_limit )
if ( max_x < max_l )
{
if ( ( st_difficulty > = 3 ) & & ( ( st_rnd ( ) & 7 ) = = 0 ) )
st_NewGadget ( ST_AREA_WIDTH - 1 , rand ( ) & ( ST_AREA_HEIGHT - 1 ) ) ;
else
st_InitTrash ( ST_AREA_WIDTH - 1 , rand ( ) & ( ST_AREA_HEIGHT - 1 ) , 0 ) ;
}
}
void st_InitDelta ( void )
{
st_InitDeltaTrash ( ) ;
st_InitDeltaWall ( ) ;
/*
uint8_t cnt ;
cnt = st_CntObj ( 2 ) ;
if ( cnt = = 0 )
st_InitBrick1 ( ) ;
*/
}
/*================================================================*/
/* API: game draw procedure */
/*================================================================*/
void st_DrawInGame ( uint8_t fps )
{
uint8_t i ;
/* draw all objects */
for ( i = 0 ; i < ST_OBJ_CNT ; i + + )
st_DrawObj ( i ) ;
//dog_ClrBox(0, ST_AREA_HEIGHT, st_u8g2->width-1, ST_AREA_HEIGHT+3);
u8g2_SetDrawColor ( st_u8g2 , 0 ) ;
u8g2_DrawBox ( st_u8g2 , 0 , u8g_height_minus_one - ST_AREA_HEIGHT - 3 , st_u8g2 - > width , 4 ) ;
u8g2_SetDrawColor ( st_u8g2 , 1 ) ;
u8g2_DrawHLine ( st_u8g2 , 0 , u8g_height_minus_one - ST_AREA_HEIGHT + 1 , ST_AREA_WIDTH ) ;
u8g2_DrawHLine ( st_u8g2 , 0 , u8g_height_minus_one , ST_AREA_WIDTH ) ;
u8g2_SetFont ( st_u8g2 , u8g_font_4x6r ) ;
u8g2_DrawStr ( st_u8g2 , 0 , u8g_height_minus_one - ST_AREA_HEIGHT , st_itoa ( st_difficulty ) ) ;
u8g2_DrawHLine ( st_u8g2 , 10 , u8g_height_minus_one - ST_AREA_HEIGHT - 3 , ( st_to_diff_cnt > > ST_DIFF_FP ) + 1 ) ;
u8g2_DrawVLine ( st_u8g2 , 10 , u8g_height_minus_one - ST_AREA_HEIGHT - 4 , 3 ) ;
u8g2_DrawVLine ( st_u8g2 , 10 + ST_DIFF_VIS_LEN , u8g_height_minus_one - ST_AREA_HEIGHT - 4 , 3 ) ;
/* player points */
u8g2_DrawStr ( st_u8g2 , ST_AREA_WIDTH - 5 * 4 - 2 , u8g_height_minus_one - ST_AREA_HEIGHT , st_itoa ( st_player_points_delayed ) ) ;
/* FPS output */
if ( fps > 0 )
{
//i = dog_DrawStr(ST_AREA_WIDTH-5*4-2-7*4, ST_AREA_HEIGHT, font_4x6, "FPS:");
i = u8g2_DrawStr ( st_u8g2 , ST_AREA_WIDTH - 5 * 4 - 2 - 7 * 4 , u8g_height_minus_one - ST_AREA_HEIGHT , " FPS: " ) ;
//dog_DrawStr(ST_AREA_WIDTH-5*4-2-7*4+i, ST_AREA_HEIGHT, font_4x6, st_itoa(fps));
u8g2_DrawStr ( st_u8g2 , ST_AREA_WIDTH - 5 * 4 - 2 - 7 * 4 + i , u8g_height_minus_one - ST_AREA_HEIGHT , st_itoa ( fps ) ) ;
}
/*dog_DrawStr(60+i, ST_AREA_HEIGHT, font_4x6, st_itoa(st_CntObj(0)));*/
}
void st_Draw ( uint8_t fps )
{
switch ( st_state )
{
case ST_STATE_PREPARE :
case ST_STATE_IPREPARE :
//dog_DrawStr(0, (st_u8g2->height-6)/2, font_4x6, "SpaceTrash");
u8g2_SetFont ( st_u8g2 , u8g_font_4x6r ) ;
u8g2_SetDrawColor ( st_u8g2 , 1 ) ;
//dog_DrawStrP(0, (st_u8g2->height-6)/2, font_4x6, DOG_PSTR("SpaceTrash"));
u8g2_DrawStr ( st_u8g2 , 0 , u8g_height_minus_one - ( st_u8g2 - > height - 6 ) / 2 , " SpaceTrash " ) ;
//dog_SetHLine(st_u8g2->width-st_to_diff_cnt-10, st_u8g2->width-st_to_diff_cnt, (st_u8g2->height-6)/2-1);
u8g2_DrawHLine ( st_u8g2 , st_u8g2 - > width - st_to_diff_cnt - 10 , u8g_height_minus_one - ( st_u8g2 - > height - 6 ) / 2 + 1 , 11 ) ;
break ;
case ST_STATE_GAME :
st_DrawInGame ( fps ) ;
break ;
case ST_STATE_END :
case ST_STATE_IEND :
u8g2_SetFont ( st_u8g2 , u8g_font_4x6r ) ;
u8g2_SetDrawColor ( st_u8g2 , 1 ) ;
//dog_DrawStr(0, (st_u8g2->height-6)/2, font_4x6, "Game Over");
//dog_DrawStrP(0, (st_u8g2->height-6)/2, font_4x6, DOG_PSTR("Game Over"));
u8g2_DrawStr ( st_u8g2 , 0 , u8g_height_minus_one - ( st_u8g2 - > height - 6 ) / 2 , " Game Over " ) ;
//dog_DrawStr(50, (st_u8g2->height-6)/2, font_4x6, st_itoa(st_player_points));
u8g2_DrawStr ( st_u8g2 , 50 , u8g_height_minus_one - ( st_u8g2 - > height - 6 ) / 2 , st_itoa ( st_player_points ) ) ;
//dog_DrawStr(75, (st_u8g2->height-6)/2, font_4x6, st_itoa(st_highscore));
u8g2_DrawStr ( st_u8g2 , 75 , u8g_height_minus_one - ( st_u8g2 - > height - 6 ) / 2 , st_itoa ( st_highscore ) ) ;
//dog_SetHLine(st_to_diff_cnt, st_to_diff_cnt+10, (st_u8g2->height-6)/2-1);
u8g2_DrawHLine ( st_u8g2 , st_to_diff_cnt , u8g_height_minus_one - ( st_u8g2 - > height - 6 ) / 2 + 1 , 11 ) ;
break ;
}
}
void st_SetupInGame ( void )
{
st_player_points = 0 ;
st_player_points_delayed = 0 ;
st_difficulty = 1 ;
st_to_diff_cnt = 0 ;
st_ClrObjs ( ) ;
st_NewPlayer ( ) ;
/* st_InitBrick1(); */
}
/*================================================================*/
/* API: game setup */
/*================================================================*/
void st_Setup ( u8g2_t * u8g )
{
st_u8g2 = u8g ;
u8g2_SetBitmapMode ( u8g , 1 ) ;
u8g_height_minus_one = u8g - > height ;
u8g_height_minus_one - - ;
}
/*================================================================*/
/* API: game step execution */
/*================================================================*/
/*
player_pos : 0. .255
*/
void st_StepInGame ( uint8_t player_pos , uint8_t is_auto_fire , uint8_t is_fire )
{
uint8_t i , j ;
uint8_t missle_mask ;
/* rescale player pos */
//st_player_pos = ((uint16_t)player_pos * (uint16_t)ST_AREA_HEIGHT)/256;
if ( player_pos < 64 )
st_player_pos = 0 ;
else if ( player_pos > = 192 )
st_player_pos = ST_AREA_HEIGHT - 2 - 1 ;
else
st_player_pos = ( ( uint16_t ) ( ( player_pos - 64 ) ) * ( uint16_t ) ( ST_AREA_HEIGHT - 2 ) ) / 128 ;
st_player_pos + = 1 ;
/* move all objects */
for ( i = 0 ; i < ST_OBJ_CNT ; i + + )
st_Move ( i ) ;
/* check for objects which left the play area */
for ( i = 0 ; i < ST_OBJ_CNT ; i + + )
if ( st_objects [ i ] . ot ! = 0 )
if ( st_IsOut ( i ) ! = 0 )
st_Disappear ( i ) ;
/* missle and destruction handling */
for ( i = 0 ; i < ST_OBJ_CNT ; i + + )
{
missle_mask = st_GetMissleMask ( i ) ;
if ( missle_mask ! = 0 ) /* should we apply missle handling? */
if ( st_CalcXY ( st_objects + i ) ! = 0 ) /* yes: calculate pixel reference point (st_px_x, st_px_y) */
for ( j = 0 ; j < ST_OBJ_CNT ; j + + ) /* has any other object been hit? */
if ( i ! = j ) /* except missle itself... */
if ( st_IsHit ( j , st_px_x , st_px_y , missle_mask ) ! = 0 ) /* let the member function decide */
{ /* let the member function destroy the object if required */
st_Destroy ( i ) ;
}
}
/* handle fire counter */
st_FireStep ( is_auto_fire , is_fire ) ;
/* fire */
for ( i = 0 ; i < ST_OBJ_CNT ; i + + )
st_Fire ( i ) ;
/* create new objects */
st_InitDelta ( ) ;
/* increase difficulty */
st_to_diff_cnt + + ;
if ( st_to_diff_cnt = = ( ST_DIFF_VIS_LEN < < ST_DIFF_FP ) )
{
st_to_diff_cnt = 0 ;
st_difficulty + + ;
st_player_points + = ST_POINTS_PER_LEVEL ;
}
/* update visible player points */
if ( st_player_points_delayed < st_player_points )
st_player_points_delayed + + ;
}
void st_Step ( uint8_t player_pos , uint8_t is_auto_fire , uint8_t is_fire )
{
switch ( st_state )
{
case ST_STATE_PREPARE :
st_to_diff_cnt = st_u8g2 - > width - 10 ; /* reuse st_to_diff_cnt */
st_state = ST_STATE_IPREPARE ;
break ;
case ST_STATE_IPREPARE :
st_to_diff_cnt - - ;
if ( st_to_diff_cnt = = 0 )
{
st_state = ST_STATE_GAME ;
st_SetupInGame ( ) ;
}
break ;
case ST_STATE_GAME :
st_StepInGame ( player_pos , is_auto_fire , is_fire ) ;
break ;
case ST_STATE_END :
st_to_diff_cnt = st_u8g2 - > width - 10 ; /* reuse st_to_diff_cnt */
if ( st_highscore < st_player_points )
st_highscore = st_player_points ;
st_state = ST_STATE_IEND ;
break ;
case ST_STATE_IEND :
st_to_diff_cnt - - ;
if ( st_to_diff_cnt = = 0 )
st_state = ST_STATE_PREPARE ;
break ;
}
}
uint8_t pin_up = A0 ;
uint8_t pin_down = A3 ;
uint8_t pin_fire = 7 ;
2018-05-20 14:46:40 +08:00
void setup ( void ) {
// U8g2 SH1106 Proto-Shield
//u8g2.begin(/* menu_select_pin= */ 2, /* menu_next_pin= */ 4, /* menu_prev_pin= */ 7, /* menu_up_pin= */ 6, /* menu_down_pin= */ 5, /* menu_home_pin= */ 3);
// DOGS102 Shield (http://shieldlist.org/controlconnection/dogs102)
// u8g2.begin(/* menu_select_pin= */ 5, /* menu_next_pin= */ 4, /* menu_prev_pin= */ 2, /* menu_up_pin= */ U8X8_PIN_NONE, /* menu_down_pin= */ U8X8_PIN_NONE, /* menu_home_pin= */ 3);
// DOGM128 Shield (http://shieldlist.org/schmelle2/dogm128) + DOGXL160 Shield
//u8g2.begin(/* menu_select_pin= */ 2, /* menu_next_pin= */ 3, /* menu_prev_pin= */ 7, /* menu_up_pin= */ U8X8_PIN_NONE, /* menu_down_pin= */ U8X8_PIN_NONE, /* menu_home_pin= */ 8);
// MKR Zero Test Board
u8g2 . begin ( /*Select=*/ 0 , /*Right/Next=*/ 1 , /*Left/Prev=*/ 2 , /*Up=*/ 4 , /*Down=*/ 3 , /*Home/Cancel=*/ A6 ) ;
// Arduboy
//u8g2.begin(/*Select=*/ A0, /*Right/Next=*/ 5, /*Left/Prev=*/ 9, /*Up=*/ 8, /*Down=*/ 10, /*Home/Cancel=*/ A1); // Arduboy DevKit
2018-05-21 19:38:42 +08:00
u8g2 . begin ( /*Select=*/ 7 , /*Right/Next=*/ A1 , /*Left/Prev=*/ A2 , /*Up=*/ pin_up , /*Down=*/ pin_down , /*Home/Cancel=*/ 8 ) ; // Arduboy 10 (Production)
2018-05-20 14:46:40 +08:00
}
2018-05-21 19:38:42 +08:00
// uint8_t userInterfaceSelectionList(const char *title, uint8_t start_pos, const char *sl)
// userInterfaceMessage(const char *title1, const char *title2, const char *title3, const char *buttons)
// uint8_t userInterfaceInputValue(const char *title, const char *pre, uint8_t *value, uint8_t lo, uint8_t hi, uint8_t digits, const char *post) {
uint8_t a ;
uint8_t b ;
uint8_t y = 128 ;
2018-05-20 14:46:40 +08:00
void loop ( void ) {
2018-05-21 19:38:42 +08:00
u8g2 . setFont ( u8g2_font_6x10_tr ) ;
u8g2 . setFontDirection ( 0 ) ;
u8g2 . setFontRefHeightAll ( ) ;
st_Setup ( u8g2 . getU8g2 ( ) ) ;
//u8g2.setFont(u8g2_font_6x12_tf);
//a = u8g2.userInterfaceSelectionList( "SpaceTrash", 0, "Start Game\nOptions\nCredits");
//if ( a == 1 )
{
for ( ; ; )
{
st_Step ( y , /* is_auto_fire */ 0 , /* is_fire */ digitalRead ( pin_fire ) ) ;
u8g2 . firstPage ( ) ;
do
{
st_Draw ( 0 ) ;
} while ( u8g2 . nextPage ( ) ) ;
if ( digitalRead ( pin_down ) )
{
y + + ;
}
if ( digitalRead ( pin_up ) )
{
y - - ;
}
}
}
/*
if ( a = = 2 )
{
u8g2 . userInterfaceInputValue ( " Brightness " , " " , & b , 0 , 63 , 2 , " " ) ;
u8g2 . setContrast ( b * 4 ) ;
}
if ( a = = 3 )
{
u8g2 . userInterfaceMessage ( " Credits: " , " Oli " , " & Kids " , " Ok " ) ;
}
*/
2018-05-20 14:46:40 +08:00
}