1
0
Fork 0
forked from len0rd/rockbox
foxbox/apps/plugins/xrick/system/sysevt_rockbox.c
Sebastian Leonhardt 102c374248 added xrick game
original xrick code by 'BigOrno' at:
http://www.bigorno.net/xrick/

Rockbox port, plus bugfixes at:
https://github.com/pierluigi-vicinanza/xrick

Further changes:

 * Additonal fixes from g#3026
 * Port to modern plugin API
 * Add Pluginlib keymap fallback
 * Support all >1bpp screens
 * Fix build warnings in miniz
 * Better error message when resources are missing

Change-Id: Id83928bc2539901b0221692f65cbca41389c58e7
2024-06-30 17:24:16 -04:00

156 lines
3.9 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Port of xrick, a Rick Dangerous clone, to Rockbox.
* See http://www.bigorno.net/xrick/
*
* Copyright (C) 2008-2014 Pierluigi Vicinanza
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "xrick/system/system.h"
#include "xrick/config.h"
#include "xrick/control.h"
#include "xrick/game.h"
#include "xrick/system/sysmenu_rockbox.h"
#include "xrick/system/rockboxcodes.h"
/*
* Helper function to set/clear controls according to key press
*/
static inline void checkKey(int key, unsigned button, control_t control)
{
if (key & button)
{
control_set(control);
}
else
{
control_clear(control);
}
}
/*
* Process events, if any, then return
*/
void sysevt_poll(void)
{
static int previousKey, currentKey;
/* this is because "Restart Game" is handled via menu */
if (control_test(Control_END))
{
control_clear(Control_END);
}
for (;;)
{
/* check for USB connection */
if ((rb->default_event_handler(rb->button_get(false)) == SYS_USB_CONNECTED)
#if defined(HAS_BUTTON_HOLD)
|| rb->button_hold()
#endif
)
{
sysmenu_exec();
}
currentKey = rb->button_status();
if (currentKey != previousKey)
{
break;
}
else if (game_waitevt)
{
rb->yield();
}
else /* (currentKey == previousKey) && !game_waitevt */
{
return;
}
}
#ifdef XRICK_BTN_MENU
if (currentKey & XRICK_BTN_MENU)
{
sysmenu_exec();
}
#endif
#ifdef XRICK_BTN_PAUSE
checkKey(currentKey, XRICK_BTN_PAUSE, Control_PAUSE);
#endif
checkKey(currentKey, XRICK_BTN_UP, Control_UP);
checkKey(currentKey, XRICK_BTN_DOWN, Control_DOWN);
checkKey(currentKey, XRICK_BTN_LEFT, Control_LEFT);
checkKey(currentKey, XRICK_BTN_RIGHT, Control_RIGHT);
checkKey(currentKey, XRICK_BTN_FIRE, Control_FIRE);
#ifdef XRICK_BTN_UPLEFT
if (!control_test(Control_UP | Control_LEFT))
{
checkKey(currentKey, XRICK_BTN_UPLEFT, Control_UP | Control_LEFT);
}
#endif /* XRICK_BTN_UPLEFT */
#ifdef XRICK_BTN_UPRIGHT
if (!control_test(Control_UP | Control_RIGHT))
{
checkKey(currentKey, XRICK_BTN_UPRIGHT, Control_UP | Control_RIGHT);
}
#endif /* XRICK_BTN_UPRIGHT */
#ifdef XRICK_BTN_DOWNLEFT
if (!control_test(Control_DOWN | Control_LEFT))
{
checkKey(currentKey, XRICK_BTN_DOWNLEFT, Control_DOWN | Control_LEFT);
}
#endif /* XRICK_BTN_DOWNLEFT */
#ifdef XRICK_BTN_DOWNRIGHT
if (!control_test(Control_DOWN | Control_RIGHT))
{
checkKey(currentKey, XRICK_BTN_DOWNRIGHT, Control_DOWN | Control_RIGHT);
}
#endif /* XRICK_BTN_DOWNRIGHT */
previousKey = currentKey;
}
/*
* Wait for an event, then process it and return
*/
void sysevt_wait(void)
{
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
rb->cpu_boost(false);
#endif
sysevt_poll(); /* sysevt_poll deals with blocking case as well */
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
rb->cpu_boost(true);
#endif
}
/* eof */