ledHeadWii/source/platform/Platform_baseball.c

473 lines
12 KiB
C
Raw Permalink Normal View History

2020-03-03 18:49:42 +01:00
/*
LEDhead
Copyright 2001, Peter Hirschberg
Author: Peter Hirschberg
The current version of this SOURCE CODE as well as the official
versions of the LEDHEAD APPLICATION are available from my website
at: http://www.peterhirschberg.com
Based on the handheld electronic games by Mattel Electronics.
All trademarks copyrighted by their respective owners. This
program is not affiliated or endorsed by Mattel Electronics.
License agreement:
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 program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program (license.txt); if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Email : peter@peterhirschberg.com
Website : http://www.peterhirschberg.com
*/
#include "baseball.h"
#include "baseball_screen_png.h"
#include "baseball_blip_png.h"
#include "baseball_dimdigits_png.h"
#include "baseball_brightdigits_png.h"
#include "baseball_hit_raw.h"
#include "baseball_out_raw.h"
#include "baseball_run_raw.h"
#include "baseball_strike_raw.h"
#include "baseball_endpossession_raw.h"
#include "baseball_endgame_raw.h"
#define DIGIT_W 8
#define DIGIT_H 12
#define DIGIT_TYPE_OFF 0
#define DIGIT_TYPE_DIM 1
#define DIGIT_TYPE_BRIGHT 2
2020-05-25 18:02:06 +02:00
int Baseball_errno;
static BOOL bPower = FALSE;
static BOOL bPro2 = FALSE;
static BOOL bInited = FALSE;
2020-03-03 18:49:42 +01:00
// images
static GRRLIB_texImg *bmpScreen;
static GRRLIB_texImg *bmpBlip;
static GRRLIB_texImg *bmpDimDigits;
static GRRLIB_texImg *bmpBrightDigits;
2020-05-25 18:02:06 +02:00
static Sound_t tcWaveRes[BASEBALL_SOUND_NSOUNDS];
2020-03-03 18:49:42 +01:00
static Digit_t digit[4] = {
{ baseball_digit1_x, baseball_digit_y, 0, DIGIT_TYPE_OFF},
{ baseball_digit2_x, baseball_digit_y, 0, DIGIT_TYPE_OFF},
{ baseball_digit3_x, baseball_digit_y, 0, DIGIT_TYPE_OFF},
{ baseball_digit4_x, baseball_digit_y, 0, DIGIT_TYPE_OFF}
};
2020-05-25 18:02:06 +02:00
#define N_BLIPS (sizeof(blips)/sizeof(*blips))
static Blip_t blips[BASEBALL_NBLIPS] = {
{ baseball_blip_pitch_1_x, baseball_blip_pitch_1_y, BLIP_OFF }, // 0 blips for normal pitches
2020-03-03 18:49:42 +01:00
{ baseball_blip_pitch_2_x, baseball_blip_pitch_2_y, BLIP_OFF },
{ baseball_blip_pitch_3_x, baseball_blip_pitch_3_y, BLIP_OFF },
{ baseball_blip_pitch_4_x, baseball_blip_pitch_4_y, BLIP_OFF },
{ baseball_blip_pitch_5_x, baseball_blip_pitch_5_y, BLIP_OFF },
{ baseball_blip_pitch_6_x, baseball_blip_pitch_6_y, BLIP_OFF },
{ baseball_blip_pitch_7_x, baseball_blip_pitch_7_y, BLIP_OFF },
{ baseball_blip_pitch_8_x, baseball_blip_pitch_8_y, BLIP_OFF },
2020-05-25 18:02:06 +02:00
{ baseball_blip_pitch_9_x, baseball_blip_pitch_9_y, BLIP_OFF },
{ baseball_blip_pitchcurve_2_x, baseball_blip_pitchcurve_2_y, BLIP_OFF }, // 9 blips for curve balls
2020-03-03 18:49:42 +01:00
{ baseball_blip_pitchcurve_3_x, baseball_blip_pitchcurve_3_y, BLIP_OFF },
{ baseball_blip_pitchcurve_4_x, baseball_blip_pitchcurve_4_y, BLIP_OFF },
2020-05-25 18:02:06 +02:00
{ baseball_blip_pitchcurve_5_x, baseball_blip_pitchcurve_5_y, BLIP_OFF },
{ baseball_blip_base_0_x,baseball_blip_base_0_y, BLIP_OFF }, // 13 blips for home plate -> 1st base
{ baseball_blip_base_0A_x,baseball_blip_base_0A_y, BLIP_OFF },
{ baseball_blip_base_0B_x,baseball_blip_base_0B_y, BLIP_OFF },
{ baseball_blip_base_1_x,baseball_blip_base_1_y, BLIP_OFF }, // 16 blips for 1st base -> 2nd base
{ baseball_blip_base_1A_x,baseball_blip_base_1A_y, BLIP_OFF },
{ baseball_blip_base_1B_x,baseball_blip_base_1B_y, BLIP_OFF },
{ baseball_blip_base_2_x,baseball_blip_base_2_y, BLIP_OFF }, // 19 blips for 2nd base -> 3rd base
{ baseball_blip_base_2A_x,baseball_blip_base_2A_y, BLIP_OFF },
{ baseball_blip_base_2B_x,baseball_blip_base_2B_y, BLIP_OFF },
{ baseball_blip_base_3_x,baseball_blip_base_3_y, BLIP_OFF }, // 22 blips for 3rd base -> home plate
{ baseball_blip_base_3A_x,baseball_blip_base_3A_y, BLIP_OFF },
{ baseball_blip_base_3B_x,baseball_blip_base_3B_y, BLIP_OFF },
{ baseball_blip_deep1st_x,baseball_blip_deep1st_y, BLIP_OFF }, // 25 blip for deep 1st
{ baseball_blip_deep3rd_x,baseball_blip_deep3rd_y, BLIP_OFF }, // 26 blip for deep 3rd
{ baseball_blip_outfield_left_x,baseball_blip_outfield_left_y, BLIP_OFF }, // 27 blips for outfield left
2020-03-03 18:49:42 +01:00
{ baseball_blip_outfield_center_x,baseball_blip_outfield_center_y, BLIP_OFF },
2020-05-25 18:02:06 +02:00
{ baseball_blip_outfield_right_x,baseball_blip_outfield_right_y, BLIP_OFF } // 29 blips for outfield right
2020-03-03 18:49:42 +01:00
};
static Help_t help[] = {
{ WK_1, {195, 247} },
{ WK_2, {195, 280} },
{ WK_PLUS, {22, 247} },
{ WK_MINUS, {22, 280} },
{ WK_BLR, {94, 258} }
};
//----------------------------------------------------------------------------
//
//
2020-05-25 18:02:06 +02:00
static void Baseball_StopSound()
{
// stop all sounds...
Platform_StopSound();
}
2020-03-03 18:49:42 +01:00
void Baseball_Help()
{
Platform_Help(help, sizeof(help)/sizeof(*help));
}
2020-05-25 18:02:06 +02:00
BOOL Baseball_GetPower()
{
return bPower;
}
void Baseball_PowerOn()
{
bPower = TRUE;
}
void Baseball_PowerOff()
{
bPower = FALSE;
Baseball_StopSound();
}
void Baseball_SetSkill(int v)
{
bPro2 = (v == 0) ? FALSE : TRUE;
}
int Baseball_GetSkill()
{
return (bPro2 == TRUE) ? 1 : 0;
}
2020-03-03 18:49:42 +01:00
void Baseball_Init()
{
2020-05-25 18:02:06 +02:00
if (bInited)
return;
2020-03-03 18:49:42 +01:00
// Init sounds
2020-05-25 18:02:06 +02:00
Sound_set(&tcWaveRes[BASEBALL_SOUND_HIT], baseball_hit_raw, baseball_hit_raw_size, 82 );
Sound_set(&tcWaveRes[BASEBALL_SOUND_OUT], baseball_out_raw, baseball_out_raw_size, 392 );
Sound_set(&tcWaveRes[BASEBALL_SOUND_RUN], baseball_run_raw, baseball_run_raw_size, 423 );
Sound_set(&tcWaveRes[BASEBALL_SOUND_STRIKE], baseball_strike_raw, baseball_strike_raw_size, 22 );
Sound_set(&tcWaveRes[BASEBALL_SOUND_ENDPOSSESSION], baseball_endpossession_raw, baseball_endpossession_raw_size, 560 );
Sound_set(&tcWaveRes[BASEBALL_SOUND_ENDGAME], baseball_endgame_raw, baseball_endgame_raw_size, 712 );
2020-03-03 18:49:42 +01:00
// load images
bmpScreen = GRRLIB_LoadTexture(baseball_screen_png);
bmpBlip = GRRLIB_LoadTexture(baseball_blip_png);
bmpDimDigits = GRRLIB_LoadTexture(baseball_dimdigits_png);
GRRLIB_InitTileSet(bmpDimDigits, DIGIT_W, DIGIT_H, 0);
bmpBrightDigits = GRRLIB_LoadTexture(baseball_brightdigits_png);
GRRLIB_InitTileSet(bmpBrightDigits, DIGIT_W, DIGIT_H, 0);
PlatformSetInput(0);
// turn on the game
2020-05-25 18:02:06 +02:00
bPro2 = FALSE;
bPower = FALSE;
2020-03-03 18:49:42 +01:00
bInited = TRUE;
}
void Baseball_DeInit()
{
// stop all sounds...
2020-05-25 18:02:06 +02:00
Baseball_StopSound();
bPower = FALSE;
2020-03-03 18:49:42 +01:00
GRRLIB_FreeTexture(bmpScreen);
GRRLIB_FreeTexture(bmpBlip);
GRRLIB_FreeTexture(bmpDimDigits);
GRRLIB_FreeTexture(bmpBrightDigits);
bInited = FALSE;
}
void Baseball_Paint()
{
int p_switch;
p_switch = Platform_GetPowerSwitch(ONOFF_OFF12);
2020-05-25 18:02:06 +02:00
if(bPower) {
2020-03-03 18:49:42 +01:00
if(p_switch == -1) {
2020-05-25 18:02:06 +02:00
if(bPro2 == FALSE)
bPower = FALSE;
if(bPro2 == TRUE) {
bPower = TRUE;
bPro2 = FALSE;
2020-03-03 18:49:42 +01:00
}
}
if(p_switch == 1) {
2020-05-25 18:02:06 +02:00
if(bPro2 == 0) {
bPower = TRUE;
bPro2 = TRUE;
2020-03-03 18:49:42 +01:00
}
}
}
else {
if(p_switch == 1) {
2020-05-25 18:02:06 +02:00
bPower = TRUE;
bPro2 = FALSE;
2020-03-03 18:49:42 +01:00
}
}
// paint the backdrop
2020-05-25 18:02:06 +02:00
GRRLIB_DrawImg(realx(0), realy(0), bmpScreen, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF);
2020-03-03 18:49:42 +01:00
2020-05-25 18:02:06 +02:00
if (bPower == TRUE) {
int i;
if (bPro2 == FALSE) {
draw_switch(SWITCH_TYPE_1, baseball_pro_1_x, baseball_pro_1_y, SWITCH_POS_PRO1);
2020-03-03 18:49:42 +01:00
}
else {
2020-05-25 18:02:06 +02:00
draw_switch(SWITCH_TYPE_1, baseball_pro_1_x, baseball_pro_1_y, SWITCH_POS_PRO2);
2020-03-03 18:49:42 +01:00
}
// show blips
2020-05-25 18:02:06 +02:00
for(i=0; i< BASEBALL_NBLIPS; i++) {
Blip_t *pblip = &blips[i];
2020-03-03 18:49:42 +01:00
if(pblip->status != BLIP_OFF)
2020-05-25 18:02:06 +02:00
GRRLIB_DrawImg(realx(pblip->x), realy(pblip->y), bmpBlip, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF);
2020-03-03 18:49:42 +01:00
}
2020-05-25 18:02:06 +02:00
2020-03-03 18:49:42 +01:00
// show digits
for(i=0; i<4; i++) {
Digit_t *pdigit = &digit[i];
switch(pdigit->type) {
case DIGIT_TYPE_DIM:
2020-05-25 18:02:06 +02:00
GRRLIB_DrawTile(realx(pdigit->x), realy(pdigit->y), bmpDimDigits, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF, pdigit->val + 1);
2020-03-03 18:49:42 +01:00
break;
case DIGIT_TYPE_BRIGHT:
2020-05-25 18:02:06 +02:00
GRRLIB_DrawTile(realx(pdigit->x), realy(pdigit->y), bmpBrightDigits, 0, SCALE_X, SCALE_Y, 0xFFFFFFFF, pdigit->val + 1);
2020-03-03 18:49:42 +01:00
break;
case DIGIT_TYPE_OFF:
default:
break;
}
}
}
2020-05-25 18:02:06 +02:00
else {
Baseball_StopSound();
draw_switch(SWITCH_TYPE_1, baseball_pro_1_x, baseball_pro_1_y, SWITCH_POS_OFF);
2020-03-03 18:49:42 +01:00
}
}
void Baseball_PlaySound(int nSound, unsigned int nFlags)
{
Platform_PlaySound(&tcWaveRes[nSound], nFlags);
}
//----------------------------------------------------------------------------
// local fcn's
//
2020-05-25 18:02:06 +02:00
void Baseball_DrawBlip(BOOL state, int index)
2020-03-03 18:49:42 +01:00
{
2020-05-25 18:02:06 +02:00
Blip_t *pblip = &blips[index];
2020-03-03 18:49:42 +01:00
pblip->status = (state) ? BLIP_DIM : BLIP_OFF;
}
void Baseball_DrawStats(int innings, int outs, int balls, int strikes, BOOL bHomeTeam)
{
Digit_t *pdigit = &digit[0];
// innings
if (innings == -1)
{
pdigit->val = -1;
pdigit->type = DIGIT_TYPE_DIM;
}
else
{
pdigit->val = innings;
pdigit->type = DIGIT_TYPE_DIM;
}
// outs
pdigit++;
if (outs == -1)
{
pdigit->val = -1;
pdigit->type = DIGIT_TYPE_DIM;
}
else
{
if (bHomeTeam)
{
pdigit->val = outs;
pdigit->type = DIGIT_TYPE_DIM;
}
else
{
// draw decimal
pdigit->val = outs+11;
pdigit->type = DIGIT_TYPE_DIM;
}
}
// balls
pdigit++;
pdigit->val = balls;
pdigit->type = DIGIT_TYPE_DIM;
// strikes
pdigit++;
if (bHomeTeam)
{
// draw decimal
pdigit->val = strikes+11;
pdigit->type = DIGIT_TYPE_DIM;
}
else
{
pdigit->val = strikes;
pdigit->type = DIGIT_TYPE_DIM;
}
}
void Baseball_DrawScore(int vruns, int hruns)
{
if ((vruns==-1) && (hruns==-1))
{
// erase the digits display
int i;
for(i=0; i <4; i++) {
digit[i].val = -1;
digit[i].type = DIGIT_TYPE_BRIGHT;
}
}
else
{
int i;
for(i=0; i <4; i++) {
digit[i].type = DIGIT_TYPE_BRIGHT;
}
// draw visitors 10s place
digit[0].val = vruns/10;
// draw visitors 1s place
digit[1].val = vruns%10;
// draw home 10s place
digit[2].val = hruns/10;
// draw home 1s place
digit[3].val = hruns%10;
}
}
void Baseball_DrawFireWorks(void)
{
int i;
for(i=0; i <4; i++) {
2020-05-25 18:02:06 +02:00
digit[i].val = (i == 1) ? 10 : -1;
digit[i].type = DIGIT_TYPE_DIM;
2020-03-03 18:49:42 +01:00
}
}
BOOL Baseball_GetInputSCORE(BOOL *pChange)
{
static BOOL bLast = FALSE;
if (pChange){ *pChange = FALSE; }
// check the keys
if (Platform_GetInputPLUS())
{
if (!bLast && pChange)
{
*pChange = TRUE;
}
bLast = TRUE;
return TRUE;
}
bLast = FALSE;
return FALSE;
}
BOOL Baseball_GetInputPITCH(BOOL *pChange)
{
static BOOL bLast = FALSE;
if (pChange){ *pChange = FALSE; }
// check the keys
if (Platform_GetInputMINUS())
{
if (!bLast && pChange)
{
*pChange = TRUE;
}
bLast = TRUE;
return TRUE;
}
bLast = FALSE;
return FALSE;
}
BOOL Baseball_GetInputHIT(BOOL *pChange)
{
static BOOL bLast = FALSE;
if (pChange){ *pChange = FALSE; }
// check the keys
if (Platform_GetRealTimeInput2()) // NOTE: gets realtime key state
{
if (!bLast && pChange)
{
*pChange = TRUE;
}
bLast = TRUE;
return TRUE;
}
bLast = FALSE;
return FALSE;
}
BOOL Baseball_GetInputRUN(BOOL *pChange)
{
static BOOL bLast = FALSE;
if (pChange){ *pChange = FALSE; }
// check the keys
2020-05-25 18:02:06 +02:00
if (Platform_GetRealTimeInput1()) // NOTE: gets realtime key state
2020-03-03 18:49:42 +01:00
{
if (!bLast && pChange)
{
*pChange = TRUE;
}
bLast = TRUE;
return TRUE;
}
bLast = FALSE;
return FALSE;
}
void Baseball_GetSize(int *w, int *h)
{
*w = bmpScreen->w;
*h = bmpScreen->h;
}