void JE_outTextGlow( SDL_Surface * screen, int x, int y, const char *s ) { int16_t z; uint8_t c = 15; if (warningRed) { c = 7; } JE_outTextAdjust(screen, x - 1, y, s, 0, -12, textGlowFont, false); JE_outTextAdjust(screen, x, y - 1, s, 0, -12, textGlowFont, false); JE_outTextAdjust(screen, x + 1, y, s, 0, -12, textGlowFont, false); JE_outTextAdjust(screen, x, y + 1, s, 0, -12, textGlowFont, false); if (frameCountMax > 0) for (z = 1; z <= 12; z++) { setjasondelay(frameCountMax); JE_outTextAdjust(screen, x, y, s, c, z - 10, textGlowFont, false); if (JE_anyButton()) { frameCountMax = 0; } NETWORK_KEEP_ALIVE(); JE_showVGA(); wait_delay(); } for (z = (frameCountMax == 0) ? 6 : 12; z >= textGlowBrightness; z--) { setjasondelay(frameCountMax); JE_outTextAdjust(screen, x, y, s, c, z - 10, textGlowFont, false); if (JE_anyButton()) { frameCountMax = 0; } NETWORK_KEEP_ALIVE(); JE_showVGA(); wait_delay(); } textGlowBrightness = 6; }
void JE_playAnim( const char *animfile, uint8_t startingframe, uint8_t speed ) { uint32_t i; int pageNum; if (JE_loadAnim(animfile) != 0) { return; /* Failed to open or process file */ } /* Blank screen */ JE_clr256(VGAScreen); JE_showVGA(); /* re FileHeader.nRecords-1: It's -1 in the pascal too. * The final frame is a delta of the first, and we don't need that. * We could also, if we ever ended up needing to loop anis, check * the bools in the header to see if we should render the last * frame. But that's never going to be encessary :) */ for (i = startingframe; i < FileHeader.nRecords-1; i++) { /* Handle boring crap */ setjasondelay(speed); /* Load required frame. The loading function is smart enough to not re-load an already loaded frame */ pageNum = JE_findPage(i); if(pageNum == -1) { break; } if (JE_loadPage(pageNum) != 0) { break; } /* render frame. */ if (JE_renderFrame(i) != 0) { break; } JE_showVGA(); /* Return early if user presses a key */ service_SDL_events(true); if (newkey) { break; } /* Wait until we need the next frame */ NETWORK_KEEP_ALIVE(); wait_delay(); } JE_closeAnim(); }
// captures joystick input for configuring assignments // returns false if non-joystick input was detected // TODO: input from joystick other than the one being configured probably should not be ignored bool detect_joystick_assignment( int j, Joystick_assignment *assignment ) { // get initial joystick state to compare against to see if anything was pressed const int axes = SDL_JoystickNumAxes(joystick[j].handle); Sint16 *axis = malloc(axes * sizeof(*axis)); for (int i = 0; i < axes; i++) axis[i] = SDL_JoystickGetAxis(joystick[j].handle, i); const int buttons = SDL_JoystickNumButtons(joystick[j].handle); Uint8 *button = malloc(buttons * sizeof(*button)); for (int i = 0; i < buttons; i++) button[i] = SDL_JoystickGetButton(joystick[j].handle, i); const int hats = SDL_JoystickNumHats(joystick[j].handle); Uint8 *hat = malloc(hats * sizeof(*hat)); for (int i = 0; i < hats; i++) hat[i] = SDL_JoystickGetHat(joystick[j].handle, i); bool detected = false; do { setjasondelay(1); SDL_JoystickUpdate(); for (int i = 0; i < axes; ++i) { Sint16 temp = SDL_JoystickGetAxis(joystick[j].handle, i); if (abs(temp - axis[i]) > joystick_analog_max * 2 / 3) { assignment->type = AXIS; assignment->num = i; assignment->negative_axis = temp < axis[i]; detected = true; break; } } for (int i = 0; i < buttons; ++i) { Uint8 new_button = SDL_JoystickGetButton(joystick[j].handle, i), changed = button[i] ^ new_button; if (!changed) continue; if (new_button == 0) // button was released { button[i] = new_button; } else // button was pressed { assignment->type = BUTTON; assignment->num = i; detected = true; break; } } for (int i = 0; i < hats; ++i) { Uint8 new_hat = SDL_JoystickGetHat(joystick[j].handle, i), changed = hat[i] ^ new_hat; if (!changed) continue; if ((new_hat & changed) == SDL_HAT_CENTERED) // hat was centered { hat[i] = new_hat; } else { assignment->type = HAT; assignment->num = i; assignment->x_axis = changed & (SDL_HAT_LEFT | SDL_HAT_RIGHT); assignment->negative_axis = changed & (SDL_HAT_LEFT | SDL_HAT_UP); detected = true; } } service_SDL_events(true); JE_showVGA(); wait_delay(); } while (!detected && !newkey && !newmouse); free(axis); free(button); free(hat); return detected; }