/*! Add new fire */ static void ws2812_anim_fire_update_burn(tu_ws2812_anim * pThis) { size_t lCountX; uint8_t lHeat; uint8_t lRandom; uint8_t lHeatBackup[3]; /* only on first row */ for(lCountX = 0; lCountX < WS2812_NR_COLUMNS; lCountX++) { lHeat = pThis->mFire.mHeat[lCountX]; lRandom = xorshift8_range(MIN_HEAT_UP, MAX_HEAT_UP); if(xorshift8() < xorshift8()) { /* heat up */ lHeat = add8_cl(lHeat, lRandom, MAX_HEAT); } else { /* cool down */ lHeat = sub8_f(lHeat, lRandom); } pThis->mFire.mHeat[lCountX] = lHeat; } /* blurr the first line to limit high variation */ lHeatBackup[0] = 0; lHeatBackup[1] = pThis->mFire.mHeat[0]; lHeatBackup[2] = pThis->mFire.mHeat[1]; for(lCountX = 0; lCountX < WS2812_NR_COLUMNS; lCountX++) { lHeat = (uint8_t)(((uint32_t)lHeatBackup[0] + ((uint32_t)lHeatBackup[1] << 1) + (uint32_t)lHeatBackup[2]) >> 2); lHeatBackup[0] = lHeatBackup[1]; lHeatBackup[1] = lHeatBackup[2]; if(lCountX < WS2812_NR_COLUMNS-1) { lHeatBackup[2] = pThis->mFire.mHeat[lCountX + 1]; } else { lHeatBackup[2] = 0; } pThis->mFire.mHeat[lCountX] = lHeat; } }
void do_key(char key) { short i, j; while (ANYKEY()) { readkeyboard(); do_halt(); } if (minefield[key]) { // boom drawstring("Oops, you appear to have stepped", 0, 176); drawstring("on a rotten egg and died. ", 0, 184); for (j = 0; j < 20; j++) { playfx(1); for (i = 0; i < 32*21; i++) { if (xorshift8() > 220) *((char*)0x4000+192*32+i) = xorshift8() & 7; } for (i = 0; i < 51; i++) xorshift8(); do_halt(); } reset_game(); } else { drawval(key, count_mines(key)); if (minefound[key] == 0) { minefound[key] = 1; found++; if (found == total) { framecounter = 0; drawstring("Congratulations!! You did it! ", 0, 176); drawstring("Step on a mine for a new game. ", 0, 184); } } playfx(0); } }
void setup_mines() { unsigned char i; total = 0; for (i = 0; i < 40; i++) { if (xorshift8() > 200) { minefield[i] = 1; } else { minefield[i] = 0; total++; } minefound[i] = 0; } }