📄 mmirussia.c
字号:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "mfw_sys.h"
//#include "typedef.h"
//#include "stddefs.h"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"
#include "p_sim.h"
#include "cus_aci.h"
#include "mfw_mfw.h"
#include "mfw_win.h"
#include "mfw_kbd.h"
#include "mfw_edt.h"
#include "mfw_tim.h"
#include "mfw_icn.h"
#include "mfw_mnu.h"
#include "mfw_sat.h"
#include "dspl.h"
#include "MmiMmi.h"
#include "MmiDummy.h"
#include "MmiDialogs.h"
#include "MmiSoftkeys.h"
#include "MmiIcons.h"
#include "MmiMenu.h"
#include "gdi.h"
#include "Audio.h"
#include "MmiSounds.h"
#include "MmiBookShared.h"
//#include "bmieastapi.h"
//#include "mmiicnother.h"
#include "Gamedisplay.h"
#include "mmi3dframe.h"
#include "mmiblklangdb.h"
//#include "mmigameicons.h"
#include "mmigame.h"
#include "MmiRussia.h"
#include "mmidialogs.h"
#include "..\bmi\icons\GameRussiaIcn.h"
#include "..\bmi\icons\GameIcn.h"
#include "mmiutilapi.h"
typedef game_color TColor;
#define russiagame 101
#define RUSSIAHELPINIT 22
#define RUSSIA_REMAINCOLOR
//#define Russiaframe Russia_BkgAttr[0].icons
typedef enum
{
MoveLeft,
MoveRight,
MoveUp,
MoveDown,
MoveNone
}R_MoveAspect;
typedef enum
{
R_Init,
R_Ready,
R_Start,
R_Stop
}GameState;
typedef enum
{
#ifndef GAME_SUBMENU
Russia_Initstate,
#endif
Russia_Gamestate,
Russia_Exitstate,
Russia_Overstate,
Russia_Scorestate,
Russia_Settingstate,
Russia_Helpstate,
Russia_Maxmode
}Russia_State;
Russia_State l_mode;
#if (MAIN_LCD_SIZE==3)
static int Current_Select;
#endif
#define RUSSIA_R_KEYCOUNT_MAX 3
typedef struct
{
T_MMI_CONTROL mmi_control; // common control parameter
T_MFW_HND win;
T_MFW_HND kbd;
T_MFW_HND kbd_long;
T_MFW_HND menu;
T_MFW_HND parent_win;
T_MFW_HND timer;
U8 russiaTimeflag;
S32 R_Speed;
int R_Score,R_Level,R_Count;
int R_keycount;//按键未释放下的按键,最大RUSSIA_R_KEYCOUNT_MAX
/* talcon : add the following line */
int R_LineCount; //total lines
UBYTE R_Preview,R_Nextview;
UBYTE Prekeycode;//按键未释放下的按键信息,used by timer左右下的快速移动
/*2003,talcon add*/
UBYTE R_NextviewColor;
GameState CurState;
UBYTE R_Coordinate[LINEROW][LineNumber];
UBYTE R_DummySiteAndStyle[4];
//2003/10/17,talcon,当前的选中状态,动画的类型类型,动画的索引
U8 R_CurSlect,R_AnimType,R_AnimIndx;
} T_game_russia;
/*2003/11/24,talcon add */
typedef enum
{
RussiaNone =0,
RussiaDiamond1 ,
RussiaDiamond2,
RussiaDiamond3,
RussiaDiamond4,
RussiaDiamond5,
RussiaDiamond6,
RussiaDiamond7,
RussiaDiamondEnd
};
typedef struct
{
int offsetX;
int offsetY;
}T_RussiaStyle_Offset;
typedef struct
{
T_RussiaStyle_Offset offset[4];
UBYTE next;
}T_RussiaStyle_Data;
T_RussiaStyle_Data R_StyleData[]=
{
//stytle 1
{
{ { 0, 0 },{ -1, 0 },{ 0,-1 },{ -1,-1 } },
1
},
//stytle 2
{
{ { 0, 0 },{ 1, 0 },{ -1,-1 },{ 0,-1 } },
8
},
//stytle 3
{
{ { 0, 0 },{ -1, 0 },{ 0,-1 },{ 1,-1 } },
9
},
//stytle 4
{
{ { 0, 0 },{ -1, 0 },{ 0,-1 },{ 1, 0 } },
10
},
//stytle 5
{
{ { 0, 0 },{ -1, 0 },{ -1,1 },{ 1, 0 } },
13
},
//stytle 6
{
{ { 0, 0 },{ -1, 0 },{ 1, 0 },{ 1,1 } },
16
},
//stytle 7
{
{ { 0, 0 },{ 1, 0 },{ 2, 0 },{ 3, 0 } },
19
},
//stytle 8
{
{ { 0, 0 },{ -1, 0 },{ -1,1 },{ 0,-1 } },
2
},
//stytle 9
{
{ { 0, 0 },{ -1,-1 },{ -1, 0 },{ 0,1 } },
3
},
//stytle 10
{
{ { 0, 0 },{ 0,-1 },{ 0,1 },{ -1, 0 } },
11
},
//stytle 11
{
{ { 0, 0 },{ -1, 0 },{ 1, 0 },{ 0,1 } },
12
},
//stytle 12
{
{ { 0, 0 },{ 0,-1 },{ 1, 0 },{ 0,1 } },
4
},
//stytle 13
{
{ { 0, 0 },{ 0,-1 },{ 0,1 },{ 1,1 } },
14
},
//stytle 14
{
{ { 0, 0 },{ -1, 0 },{ 1, 0 },{ 1,-1 } },
15
},
//stytle 15
{
{ { 0, 0 },{ -1,-1 },{ 0,-1 },{ 0,1 } },
5
},
//stytle 16
{
{ { 0, 0 },{ 0,-1 },{ 0,1 },{ 1,-1 } },
17
},
//stytle 17
{
{ { 0, 0 },{ -1, 0 },{ 1, 0 },{ -1,-1 } },
18
},
//stytle 18
{
{ { 0, 0 },{ -1,1 },{ 0,1 },{ 0,-1 } },
6
},
//stytle 19
{
{ { 0, 0 },{ 0,1 },{ 0,2 },{ 0,3 } },
7
}
};
/*end talcon add */
UBYTE CheckShapeLegal(UBYTE Dummy_X,UBYTE Dummy_Y,T_RussiaStyle_Data *pData,T_game_russia *parameter);
UBYTE removeShape(T_game_russia *parameter);
extern INT8 g_norejectkeyflag;
extern ffsgamedata ffs_gamedata;
GameScore *Russia_Score=(GameScore *)&ffs_gamedata.Russia_ffsScore;
/*Russia Diamond uesed function */
void Draw_PreviewShape(UBYTE style,UBYTE color);
void Draw_PreviewDiamond(UBYTE diamondcolor,U16 xposition,U16 yposition);
void DrawDiamond (UBYTE Offset_x,UBYTE Offset_y,UBYTE diamondcolor,T_game_russia *parameter);
void Draw_Shape (UBYTE Offset_x,UBYTE Offset_y,UBYTE Style,UBYTE diamondcolor,Boolean InitSite,T_game_russia *parameter);
void ChangeShape(UBYTE Dummy_X,UBYTE Dummy_Y,UBYTE Style,UBYTE diamondcolor,T_game_russia *parameter);
void ClearRow(UBYTE Row,T_game_russia *parameter);
Boolean JudgeLine(UBYTE Row,UBYTE State,T_game_russia *parameter);
Boolean MoveRow(UBYTE Row,T_game_russia *parameter);
Boolean MoveShape(UBYTE Dummy_X,UBYTE Dummy_Y,UBYTE Style,UBYTE diamondcolor,R_MoveAspect Way,T_game_russia *parameter);
Boolean JudgeCoordinate(UBYTE Dummy_X,UBYTE Dummy_Y,UBYTE Style);
T_MFW_HND GameRussiaStart (MfwHnd parent);
T_MFW_HND GameRussiaCreate( MfwHnd parent );
void GameRussiaDialog(T_MFW_HND win, USHORT event, SHORT value, void * parameter);
int GameRussia_win_cb (MfwEvt e, MfwWin *w);
int GameRussia_kbd_cb (MfwEvt e, MfwKbd *k);
void GameRussia_tim_cb(T_MFW_EVENT event,T_MFW_TIM * t);
void Dspl_Difficult(T_game_russia * data,UBYTE diffcult);
void Dspl_TotalLines(int lines);
void DrawText(U8 uX,U8 uY,U32 uColor,char *pszText);
void Russia_MnuItemIcnShow(T_game_russia * data);
void drawRussiaBkg();
void drawRussiaBkgByZone(int posX,int posY,int nWidth,int nHeight);
void Dspl_Score(int score);
extern GLOBAL int get_StringWidth(char *string);
//俄罗斯方块功能模块函数
void DrawDiamond(UBYTE Offset_x,UBYTE Offset_y,UBYTE diamondcolor,T_game_russia *parameter)
{
U16 xposition, yposition;
U8 diaType = diamondcolor & 0x0f;
if(Offset_x >=LINEROW || Offset_y >=LineNumber)return;
//zgzTraceDataFunc("DrawDiamond diamondcolor", (U16)diamondcolor);
xposition=BenchMark_X+Offset_x*DiamondWidth;
yposition=BenchMark_Y+Offset_y*DiamondWidth;
switch(diaType)
{
case RussiaNone:
//dspl_BitBlt(xposition, yposition, FKSIZE, FKSIZE, 0, (void *)Russiaback, 0);
dspl_BitBlt_ext(xposition, yposition,
Offset_x*DiamondWidth,Offset_y*DiamondWidth,
FKSIZE, FKSIZE,
DiamondWidth * LINEROW,DiamondWidth * LineNumber,
0, (void *)GET_ICONATTR(ICON_RUSSIA_BKG,0)->icons, 0);
break;
case RussiaDiamond1:
case RussiaDiamond2:
case RussiaDiamond3:
case RussiaDiamond4:
case RussiaDiamond5:
case RussiaDiamond6:
case RussiaDiamond7:
dspl_BitBlt(xposition, yposition, FKSIZE, FKSIZE, 0,
(void *)((char*)GET_ICONATTR(ICON_RUSSIA_DIAMONDS,0)->icons+FKSIZE * FKSIZE * 2 * (diaType - RussiaDiamond1)) , 0);
break;
}
parameter->R_Coordinate[Offset_x][Offset_y]=diamondcolor;
}//end Function:DrawDiamond
void Draw_Shape(UBYTE Offset_x,UBYTE Offset_y,
UBYTE Style,UBYTE diamondcolor,
Boolean InitSite,T_game_russia *parameter)
{
U8 umode;
umode=dspl_Enable(0);
if (diamondcolor )
{
parameter->R_DummySiteAndStyle[0]=Offset_x;
parameter->R_DummySiteAndStyle[1]=Offset_y;
parameter->R_DummySiteAndStyle[2]=Style;
parameter->R_DummySiteAndStyle[3]=diamondcolor;
}
/*2003/11/24,talcon modify*/
if((int)Style>=1 && (int)Style<=19)
{
T_RussiaStyle_Offset *pOffsetData = R_StyleData[Style-1].offset;
int i;
for(i = 0; i< 4; i++)
{
DrawDiamond(Offset_x + pOffsetData->offsetX,Offset_y + pOffsetData->offsetY,
diamondcolor,parameter);
pOffsetData ++ ;
}
}
/*end talcon modify*/
dspl_Enable(umode);
}
/**************************************************
$History:
********2003/11/24,talcon add
************************************************/
void Draw_PreviewShape(UBYTE style,UBYTE color)
{
UBYTE diamondtype,diamondcolor;
U16 xposition,yposition;
UBYTE StartBitX=86,StartBitY=27;
xposition=PREVIEWXPOS;
yposition=PREVIEWYPOS;
diamondtype=style;
diamondcolor=color;
//dspl_BitBlt(PREVIEWXPOS, PREVIEWYPOS, 30, 30, 0, (void *)Prebackgrd, 0);
drawRussiaBkgByZone(PREVIEWXPOS,PREVIEWYPOS,PREVIEWWIDTH,PREVIEWHEIGHT);
/*2003/11/24,talcon modify*/
#if 1
if((int)style>=1 && (int)style<=19)
{
T_RussiaStyle_Offset *pOffsetData = R_StyleData[style-1].offset;
int i;
int left = 0,right = 0,top = 0,bottom = 0;
for(i = 0; i< 4; i++)
{
if(left > pOffsetData->offsetX)
left = pOffsetData->offsetX;
else if(right < pOffsetData->offsetX )
right = pOffsetData->offsetX ;
if(top > pOffsetData->offsetY)
top = pOffsetData->offsetY;
else if(bottom < pOffsetData->offsetY )
bottom = pOffsetData->offsetY ;
pOffsetData ++ ;
}
pOffsetData -=4;
xposition += (PREVIEWWIDTH - (right - left) * FKSIZE)/2
+ (pOffsetData->offsetX - left) * FKSIZE;
yposition += (PREVIEWHEIGHT - (bottom - top) * FKSIZE)/2
+ ( pOffsetData->offsetY - top ) * FKSIZE;
for(i = 0; i< 4; i++)
{
Draw_PreviewDiamond(diamondcolor,xposition + pOffsetData->offsetX *FKSIZE,
yposition + pOffsetData->offsetY * FKSIZE);
pOffsetData ++ ;
}
}
#endif
/*end talcon modify*/
}
void Draw_PreviewDiamond(UBYTE diamondcolor,U16 xposition,U16 yposition)
{
switch(diamondcolor)
{
case RussiaDiamond1:
case RussiaDiamond2:
case RussiaDiamond3:
case RussiaDiamond4:
case RussiaDiamond5:
case RussiaDiamond6:
case RussiaDiamond7:
dspl_BitBlt(xposition, yposition, FKSIZE, FKSIZE, 0,
(void *)((char*)GET_ICONATTR(ICON_RUSSIA_DIAMONDS,0)->icons+FKSIZE * FKSIZE * 2 * (diamondcolor - RussiaDiamond1)) , 0);
break;
default:break;
}
}
void ChangeShape(UBYTE Dummy_X,UBYTE Dummy_Y,UBYTE Style,UBYTE diamondcolor,T_game_russia *parameter)
{
UBYTE newStyle;
T_RussiaStyle_Data *pStyleData = 0;
pStyleData = &R_StyleData[Style - 1];
newStyle = pStyleData->next;
if(newStyle == Style)
return;
pStyleData = &R_StyleData[newStyle - 1];
if(CheckShapeLegal(Dummy_X,Dummy_Y,pStyleData,parameter) )
return;
//删除旧的图形
Draw_Shape(Dummy_X,Dummy_Y,Style,0,False,parameter);
//画新的图形
Draw_Shape(Dummy_X,Dummy_Y,newStyle,diamondcolor,False,parameter);
}//end ChangeShape
void ClearRow(UBYTE Row,T_game_russia *parameter)
{
int i;
for (i=0;i<LINEROW;i++)
{
parameter->R_Coordinate[i][Row]=False;
DrawDiamond(i,Row,RussiaNone,parameter);
}
}//end ClearRow
Boolean JudgeLine(UBYTE Row,UBYTE State,T_game_russia *parameter)
{
int i;
if(State)//没有RussiaNone返回TRue
{
for(i=0;i<LINEROW;i++)
{
if( parameter->R_Coordinate[i][Row] == RussiaNone )
return False;
}
return (True);
}
else //全不是RussiaNone返回False
{
for(i=0;i<LINEROW;i++)
{
if( parameter->R_Coordinate[i][Row] != RussiaNone )
return True;
}
return(False);
}
return(True);
}//end JudgeLine
Boolean MoveRow(UBYTE Row,T_game_russia *parameter)
{
int i,MoveLine;
if(JudgeLine(Row,True,parameter))
{
ClearRow(Row,parameter);
MoveLine=Row-1;
while(MoveLine>=0)
{
if(JudgeLine(MoveLine,False,parameter))
{
for(i=0;i<LINEROW;i++)
{
parameter->R_Coordinate[i][MoveLine+1]=parameter->R_Coordinate[i][MoveLine];
DrawDiamond(i,MoveLine+1,parameter->R_Coordinate[i][MoveLine+1],parameter);
}
ClearRow(MoveLine,parameter);
MoveLine=MoveLine-1;
}
else
MoveLine=-1;
}
return(True);
}
else
return(False);
}//end MoveRow
Boolean MoveShape(UBYTE Dummy_X,UBYTE Dummy_Y,UBYTE Style,UBYTE diamondcolor,R_MoveAspect Way,T_game_russia *parameter)
{
Boolean Result = True;
/*2003/11/25,talcon modify it*/
UBYTE newDummy_X = Dummy_X,newDummy_Y = Dummy_Y;
UBYTE i;
UBYTE uShapeLegal ;
//memcpy(newOffsetData,pOldOffsetData ,sizeof(newOffsetData) );
switch(Way)
{
case MoveLeft:
newDummy_X --;
break;
case MoveRight:
newDummy_X ++;
break;
case MoveDown:
newDummy_Y ++;
break;
default:
return False;
break;
}
uShapeLegal = CheckShapeLegal(newDummy_X,newDummy_Y,&R_StyleData[Style -1],parameter);
if(uShapeLegal)
{
if(Way ==MoveDown)
#ifdef RUSSIA_REMAINCOLOR
Draw_Shape(Dummy_X,Dummy_Y,Style,diamondcolor | 0x80,False,parameter);
#else
Draw_Shape(Dummy_X,Dummy_Y,Style,RussiaBlue,False,parameter);
#endif
return False;
}
Draw_Shape(Dummy_X,Dummy_Y,Style,RussiaNone,False,parameter);
Draw_Shape(newDummy_X,newDummy_Y,Style,diamondcolor,False,parameter);
return Result;
}//end MoveShape
Boolean JudgeCoordinate(UBYTE Dummy_X,UBYTE Dummy_Y,UBYTE Style)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -