Voltage552 menu was based. There is also the sound portion,
On that part next time ...
#include "stdafx.h"
#include "cMenu.h"
#include "cSound.h"
#include "Sounds.h"
//-----------------------------------------------------------------------------
// Name: PostReset()
// Desc: Creates Fonts and other Resources for Menu
//-----------------------------------------------------------------------------
void cMenu::PostReset(LPDIRECT3DDEVICE8 pDevice)
{
font = new cFont("Tahoma", 7, FT_BOLD);
font->InitDeviceObjects(pDevice);
font->RestoreDeviceObjects();
}
//-----------------------------------------------------------------------------
// Name: PreReset()
// Desc: Releases Fonts / objects for menu
//-----------------------------------------------------------------------------
void cMenu::PreReset(void)
{
font->InvalidateDeviceObjects();
font->DeleteDeviceObjects();
delete font;
font = NULL;
}
//-----------------------------------------------------------------------------
// Name: Init()
// Desc: Load Menu Defaults / Prepare Menu For Usage
//-----------------------------------------------------------------------------
void cMenu::Init()
{
if (opt.options.reset)INIT=false;
if(!INIT){
opt.options.move=0; // BUG FIX FOR RESET DISABLE MOVE BEFORE SETTING COORDINATES
X=Y=10; // TOP LEFT START
WIDTH=175; // MENU WIDTH
I_OFS=4; // OFSET FOR ITEM
S_OFS=WIDTH-2; // OFSET FOR STATE
T_SPC=16; // Space from Title and Start of Items
F_SPC=16; // Footer Spacing Hook Menu
I_SPC=15; // Item Spacing
I_CUR=0; // Set current Item
ABOR=0; // ANIMATION MOVE
BDIR=0; // ANIMATION HIGHLIGHT
SHOW=true; // false=hide true=show
INIT=true; // STOP INITATION
}
}
//-----------------------------------------------------------------------------
// Name: FPS()
//-----------------------------------------------------------------------------
char* cMenu::FPS(int en)
{
static int FPScounter = 0;
static float FPSfLastTickCount = 0.0f;
static float FPSfCurrentTickCount;
static char cfps[6] = "";
if(!en)
{
FPSfCurrentTickCount = clock() * 0.001f;
FPScounter++;
if((FPSfCurrentTickCount - FPSfLastTickCount) > 1.0f)
{
FPSfLastTickCount = FPSfCurrentTickCount;
sprintf(cfps," %d",FPScounter);
FPScounter = 0;
}
}
return cfps;
}
//-----------------------------------------------------------------------------
// Name: TIME()
// Desc: Outputs Current Time in USA Format
//-----------------------------------------------------------------------------
char* cMenu::TIME(void)
{
static char ctime[20] = "" ;
struct tm * current_tm;
time_t current_time;
time (¤t_time);
current_tm = localtime (¤t_time);
if(current_tm->tm_hour>12)
sprintf( ctime, "%d:%02d:%02d PM", current_tm->tm_hour - 12, current_tm->tm_min, current_tm->tm_sec );
else
sprintf( ctime, "%d:%02d:%02d AM", current_tm->tm_hour, current_tm->tm_min, current_tm->tm_sec );
return ctime;
}
//-----------------------------------------------------------------------------
// Name: DATE()
// Desc: Outputs Current Date in USA Format
//-----------------------------------------------------------------------------
char* cMenu:
ATE(void)
{
static char cdate[20] = "" ;
struct tm * current_tm;
time_t current_time;
time (¤t_time);
current_tm = localtime (¤t_time);
sprintf( cdate, "%d-%02d-%d",current_tm->tm_mon+1,current_tm->tm_mday,current_tm->tm_year-100+2000);
return cdate;
}
//-----------------------------------------------------------------------------
// Name: oprintf()
// Desc: equiv to sprintf but for output into of dest
//-----------------------------------------------------------------------------
char* cMenu:
printf (const char *fmt, ...)
{
static char buffer[225] = "";
va_list va_alist;
va_start (va_alist, fmt);
_vsnprintf (buffer,sizeof(buffer), fmt, va_alist);
va_end (va_alist);
return buffer;
}
//-----------------------------------------------------------------------------
// Name: Save()
// Desc: Saves Menu Item states for later Restoration
//-----------------------------------------------------------------------------
void cMenu::Save(char* szSection, char* szKey, int iValue,LPCSTR file)
{
char szValue[255];
sprintf(szValue, "%d", iValue);
WritePrivateProfileString(szSection, szKey, szValue, file);
}
//-----------------------------------------------------------------------------
// Name: Load()
// Desc: Loads Menu Item States From Previously Saved File
//-----------------------------------------------------------------------------
int cMenu::Load(char* szSection, char* szKey, int iDefaultValue,LPCSTR file)
{
int iResult = GetPrivateProfileInt(szSection, szKey, iDefaultValue, file);
return iResult;
}
//-----------------------------------------------------------------------------
// Name: additem()
// Desc: BaseFunction for aitem,acat,and atext
//-----------------------------------------------------------------------------
void cMenu::additem(char *title, char *states,int type, int *var, int show, int when)
{
if(show==when)
{
strcpy(items[NO].title,title);
getfield(states,items[NO].state,*var+1);
items[NO].type=type;
items[NO].max=nofields(states);
items[NO].val=var;
NO++;
}
if(type!=T_TEXT)
{
if (opt.options.load)
*var = Load("Items", title, *var,Base.GetFile("mset.ini"));
if (opt.options.save)
Save("Items", title, *var,Base.GetFile("mset.ini"));
if (opt.options.reset)
*var=0;
}
}
//-----------------------------------------------------------------------------
// Name: acat()
// Desc: Adds Folder/Category to Item index
//-----------------------------------------------------------------------------
void cMenu::acat(char *title, char *states,int *var)
{
additem(title,states,T_CAT,var,0,0);
}
//-----------------------------------------------------------------------------
// Name: aitem()
// Desc: Adds regular item to Item index
//-----------------------------------------------------------------------------
void cMenu::aitem(char *title, char *states,int *var,int show,int when)
{
additem(title,states,T_ITEM,var,show,when);
}
//-----------------------------------------------------------------------------
// Name: atext()
// Desc: Adds Text item to item index
//-----------------------------------------------------------------------------
void cMenu::atext(char *title, char *states,int show,int when)
{
additem(title,states,T_TEXT,&opt.text,show,when);
}
void cMenu::atext(char *title, char *states)
{
additem(title,states,T_TEXT,&opt.text,1,1);
}
//-----------------------------------------------------------------------------
// Name: nofields()
// Desc: Calculates Number of Fields in a String based on deliminator
//-----------------------------------------------------------------------------
int cMenu::nofields(char *str)
{
char *ptr;
int no;
for(no=1; (ptr=strchr(str,(char)'|'))!=NULL; no++)str=ptr+1;
return no;
}
//-----------------------------------------------------------------------------
// Name: getfield()
// Desc: Grabs Field in string based on deliminator
//-----------------------------------------------------------------------------
void cMenu::getfield(char *str,char *dst,int no)
{
char *ptr;
int i;
for(i=1; (ptr=strchr(str,(char)'|'))!=NULL ; i++)
{
if(i==no) break;
str=ptr+1;
}
if(ptr)
{
i=(int)(ptr-str);
strncpy(dst,str,i);
dst[i]=0;
}
else
strcpy(dst,str);
}
//-----------------------------------------------------------------------------
// Name: DrawBox()
// Desc: Fills Rectangle using DrawPrimitive Up
//-----------------------------------------------------------------------------
void cMenu:
rawBox( int x, int y, int w, int h, D3DCOLOR Color,LPDIRECT3DDEVICE8 pDevice)
{
struct Vertex
{
float x,y,z,ht;
DWORD Color;
}V[4] = {
{x,y+h, 0.0f, 0.0f, Color},
{x,y, 0.0f, 0.0f, Color},
{x+w,y+h, 0.0f, 0.0f, Color},
{x+w,y, 0.0f, 0.0f, Color}
};
pDevice->SetTexture(0, NULL);
pDevice->SetVertexShader(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1);
pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
pDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALP HA);
pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,V,sizeof(Ve rtex));
return;
}
//-----------------------------------------------------------------------------
// Name: DrawBorder()
// Desc: Fills outside of Rectangle using 4 calls to DrawBox
//-----------------------------------------------------------------------------
void cMenu:
rawBorder( int x, int y, int w, int h, D3DCOLOR Color,LPDIRECT3DDEVICE8 pDevice)
{
DrawBox(x, y, 1, h,Color,pDevice);
DrawBox(x,y+h, w, 1,Color,pDevice);
DrawBox(x, y, w, 1,Color,pDevice);
DrawBox(x+w,y, 1,h+1,Color,pDevice);
return;
}
//-----------------------------------------------------------------------------
// Name: ShowMenu()
// Desc: Core Menu Function Displays Menu Calls Other Menu functions and navigation
//-----------------------------------------------------------------------------
void cMenu::ShowMenu(LPDIRECT3DDEVICE8 pDevice)
{
//-----------------------------------------------------------------------------
// Desc: Check Hotkeys
//-----------------------------------------------------------------------------
int lm = GetAsyncKeyState(VK_LBUTTON)&1;
int rm = GetAsyncKeyState(VK_RBUTTON)&1;
int left = GetAsyncKeyState(VK_LEFT )&1;
int right = GetAsyncKeyState(VK_RIGHT)&1;
int up = GetAsyncKeyState(VK_UP )&1;
int down = GetAsyncKeyState(VK_DOWN )&1;
//-----------------------------------------------------------------------------
// Desc: Prepare/Reset Menu
//-----------------------------------------------------------------------------
Init();
//-----------------------------------------------------------------------------
// Desc: Show The Menu
//-----------------------------------------------------------------------------
if(GetAsyncKeyState(VK_INSERT)&1) SHOW=(!SHOW);
if(SHOW){
//-----------------------------------------------------------------------------
// Desc: Get Mouse Coordinates and translate
//-----------------------------------------------------------------------------
GetCursorPos(&mpos);
ScreenToClient(GetForegroundWindow(),&mpos);
//-----------------------------------------------------------------------------
// Desc: Move Menu by. DESIGNBABY in NewYork !
//-----------------------------------------------------------------------------
//if(mpos.x>X && mpos.x<X+WIDTH && mpos.y>Y && mpos.y<Y+T_SPC && GetAsyncKeyState(VK_LBUTTON)&1 && !opt.options.move) // If Header Clicked on
//{
// M_DRAG=1;
//}
//else
//{
// mofs.x=mpos.x - X;
// mofs.y=mpos.y - Y;
//}
//if(M_DRAG)
//{
// if(GetAsyncKeyState(VK_LBUTTON)&1)M_DRAG=0;
// X = mpos.x - mofs.x;
// Y = mpos.y - mofs.y;
//}
if(opt.options.move && GetAsyncKeyState(VK_LCONTROL))
{
X =(((X<=mpos.x+4) && (X>=mpos.x)) || ((X>=mpos.x-4) && (X<=mpos.x)))?(X=mpos.x)
X+=((mpos.x-X)/4));
Y =(((Y<=mpos.y+4) && (Y>=mpos.y)) || ((Y>=mpos.y-4) && (Y<=mpos.y)))?(Y=mpos.y)
Y+=((mpos.y-Y)/4));
}
DrawBox(X,Y,WIDTH,T_SPC,C_BOX,pDevice);
DrawBorder(X,Y,WIDTH,T_SPC,C_BORDER,pDevice);
font->DrawText(MC_FCTR(X,MC_MAXX),Y+2,C_TITLE,"DESIGNBA BY Menu",DT_CENTER|DT_SHADOW);
NO=0;
acat("|INFO|","[0/1]|[1/1]",&opt.info.main);
atext("By:","DESIGNBABY",opt.info.main,1);
atext("helper:","HackMissileSale",opt.info.main,1) ;
atext("Version","1.2 Public Release",opt.info.main,1);
atext("FPS",FPS(0),opt.info.main,1);
atext("Time",TIME(),opt.info.main,1);
atext("Date",DATE(),opt.info.main,1);
acat("|D3D|","[0/1]|[1/1]",&opt.d3d.main);
aitem("Fog","Off|Blue|Green|Red|Purple|White|Black |None",&opt.d3d.fog,opt.d3d.main,1);
aitem("GlassWalls","Off|On",&opt.d3d.glass,opt.d3d .main,1);
aitem("WallEffect","Off|Ghost|Red|Blue|Yellow|Gree n",&opt.d3d.wallcolor,opt.d3d.main,1);
acat("|CHAMS|","[0/1]|[1/1]",&opt.chams.main);
aitem("Chams","Off|ON",&opt.chams.chams,opt.chams. main,1);
aitem("Color 1","Red|Blue|Yellow|Green",&opt.chams.chamsf,opt.c hams.main,1);
aitem("Color 2","Red|Blue|Yellow|Green",&opt.chams.chamsb,opt.c hams.main,1);
aitem("Type","Clear|Phantom|Ghost|Solid",&opt.cham s.type,opt.chams.main,1);
DrawBox(X,MC_MSY,WIDTH,(NO*I_SPC),C_BOX,pDevice);
DrawBorder(X,MC_MSY,WIDTH,(NO*I_SPC),C_BORDER,pDev ice);
for(int no=0; no<NO; no++)
{
D3DCOLOR text;
text=(*(items[no].val)>0)?C_ON:C_OFF;
if(items[no].type==T_CAT)
text=C_CAT;
if(I_CUR==no)
{
if(BDIR==0)
(BTEX<0xFF/4)?BTEX+=1:BDIR=1;
if(BDIR==1)
(BTEX>0x00)?BTEX-=1:BDIR=0;
if(ABOR>I_SPC*I_CUR)
ABOR=I_SPC*I_CUR;
else if (ABOR<(-I_SPC*I_CUR))
ABOR=(-I_SPC*I_CUR);
if(ABOR<0)
ABOR++;
else if(ABOR>0)
ABOR--;
text=0xFF000000+(0x10000*(BTEX*4))+(0x100*(BTEX*4) )+0x1*(BTEX*4);
DrawBorder(X,MC_ITEMY(no)-ABOR,WIDTH,I_SPC,C_CUR,pDevice);
}
if(mpos.x>X && mpos.x<MC_MAXX && mpos.y>MC_ITEMY(no) && mpos.y<MC_ITEMY(no)+I_SPC)
{
text=0xFF000000+(0x10000*(BTEX*4))+(0x100*(BTEX*4) )+0x1*(BTEX*4);
DrawBorder(X,MC_ITEMY(no),WIDTH,I_SPC,C_CUR,pDevic e);
}
font->DrawText(X+I_OFS,MC_ITEMY(no)+2,text,items[no].title,DT_SHADOW);
font->DrawText(X+S_OFS,MC_ITEMY(no)+2,text,items[no].state,DT_RIGHT|DT_SHADOW);
}
DrawBox(X,MC_ITEMY(NO)+(F_SPC/2),WIDTH,(F_SPC),C_BOX,pDevice);
DrawBorder(X,MC_ITEMY(NO)+(F_SPC/2),WIDTH,(F_SPC),C_BORDER,pDevice);
font->DrawText(MC_FCTR(X,MC_MAXX),MC_ITEMY(NO)+(F_SPC/2)+2,RED,"[KOR Chams] DESIGNBABY",DT_CENTER|DT_SHADOW);
int mno = 999;
if(mpos.x>X && mpos.x<MC_MAXX && mpos.y<MC_ITEMY(NO) && mpos.y>Y)
mno = ((mpos.y-T_SPC)>Y)?((mpos.y - Y - T_SPC - (T_SPC/2)) / I_SPC)
999);
if(mno!=999 && rm && (*items[mno].val)>0)
{
(*items[mno].val)-=1;
Sound.wav.playsoundmem((LPCSTR)SWITCH);
}
if(mno!=999 && lm && (*items[mno].val)<(items[mno].max-1))
{
(*items[mno].val)+=1;
Sound.wav.playsoundmem((LPCSTR)SWITCH);
}
if(left && (*items[I_CUR].val)>0)
{
(*items[I_CUR].val)-=1;
Sound.wav.playsoundmem((LPCSTR)SWITCH);
}
if(right && (*items[I_CUR].val)<(items[I_CUR].max-1))
{
(*items[I_CUR].val)+=1;
Sound.wav.playsoundmem((LPCSTR)SWITCH);
}
if(up)
{
do {
I_CUR=(I_CUR==0)?(NO-1)
I_CUR-1);
if(ABOR>(-(I_SPC)))ABOR-=I_SPC;
} while (items[I_CUR].type==T_TEXT);
Sound.wav.playsoundmem((LPCSTR)MOVE);
}
if(down || items[I_CUR].type==T_TEXT)
{
do
{
I_CUR=(I_CUR+1)%NO;
if(ABOR<(I_SPC))ABOR+=I_SPC;
} while (items[I_CUR].type==T_TEXT);
Sound.wav.playsoundmem((LPCSTR)MOVE);
}
//-----------------------------------------------------------------------------
// Desc: Menu Saftey / Sanity Checks and ReEncryption
//-----------------------------------------------------------------------------
if(I_CUR>NO)I_CUR=NO-1; // Prevent Selection From Hiding be hind hidden item
//-----------------------------------------------------------------------------
}
}