www.gusucode.com > VC++游戏圣剑英雄传2双刃剑源程序+开发文档-源码程序 > VC++游戏圣剑英雄传2双刃剑源程序+开发文档-源码程序\code\source\FIGHT\Goods.cpp
//Download by http://www.NewXing.com //******************************************** // 物品 相关函数 // 创建于2000年7月07日 //******************************************** #include "..\gamelib\goldpoint2.h" #include "..\interface\interface2.h" #include "..\main.h" #include "..\map.h" #include "..\role.h" #include "menu_inc.h" int CGoods::MAX_GOODS=0; stGoods *CGoods::GOODS=NULL; RECT CGoods::GoodsRect; CGoods::CGoods() { Select=0; PicWidth=PicHeight=32; } CGoods::~CGoods() { if( GOODS != NULL && MAX_GOODS > 0 ) { _FREE(GOODS); MAX_GOODS=0; } } //读取窗口 void CGoods::LoadWindowIni(char *filename, char *index) { LoadListWindowIni(filename, index); //物品介绍窗口 CIniSet Ini(filename); char* strFile = Ini.ReadText(index, "AboutWindowFile"); char* strIndex = Ini.ReadText(index, "AboutWindowIndex"); AboutWindow.LoadWindowIni(strFile, strIndex); free(strFile); free(strIndex); AboutWindow.dialogx-=32; AboutWindow.dialogy-=32; AboutWindow.dialogw+=64; AboutWindow.dialogh+=64; } //读取物体列表 void CGoods::LoadGoodsIni(char *filename) { char *index; char *temp; CIniSet Ini(filename); MAX_GOODS=Ini.ReadInt( "物品", "MAX_GOODS" ); PicWidth=Ini.ReadInt( "物品", "Width" ); PicHeight=Ini.ReadInt( "物品", "Height" ); GoodsRect=GetRect(0,0,PicWidth, PicHeight); GOODS=(stGoods *)realloc(GOODS, sizeof(stGoods)*MAX_GOODS); for(int i=0; i<MAX_GOODS; i++) { index=Ini.ReadText("物品列表", i); GOODS[i].Id=Ini.ReadInt(index, "Id"); //获得物品Id //获得物品名字 temp=Ini.ReadText(index, "Name"); strcpy( GOODS[i].Name, temp); free(temp); //获得物品介绍 temp=Ini.ReadText(index, "About"); strcpy( GOODS[i].About, temp); free(temp); GOODS[i].Class=Ini.ReadInt(index, "Class"); GOODS[i].Money=Ini.ReadInt(index, "Money"); //价值 GOODS[i].Exp=Ini.ReadInt(index, "Exp"); //经验 GOODS[i].Hp=Ini.ReadInt(index, "Hp"); //生命 GOODS[i].MaxHp=Ini.ReadInt(index, "MaxHp"); //生命最大值 GOODS[i].Mp=Ini.ReadInt(index, "Mp"); //魔法 GOODS[i].MaxMp=Ini.ReadInt(index, "MaxMp"); //魔法最大值 GOODS[i].Attack=Ini.ReadInt(index, "Attack"); //攻击 GOODS[i].Defend=Ini.ReadInt(index, "Defend"); //防御 GOODS[i].MagicAct=Ini.ReadInt(index, "MagicAct"); //魔法攻击 GOODS[i].MagicDef=Ini.ReadInt(index, "MagicDef"); //魔法防御 GOODS[i].Stamina=Ini.ReadInt(index, "Stamina"); //耐力 GOODS[i].Luck=Ini.ReadInt(index, "Luck"); //幸运 GOODS[i].Speed=Ini.ReadInt(index, "Speed"); //敏捷 GOODS[i].Bp=Ini.ReadInt(index, "Bp"); //体力 GOODS[i].Ip=Ini.ReadInt(index, "Ip"); //精神 //读入物品的图片 temp=Ini.ReadText(index, "PicFileName"); strcpy( GOODS[i].PicFileName, temp); CreateBitmap( GOODS[i].Pic, PicWidth, PicHeight, temp); DDSetColorKey( GOODS[i].Pic, ColorKey ); free(temp); free(index); } } //显示物品列表框 void CGoods::ShowGoodsListWindow(LPDIRECTDRAWSURFACE surf, bool bShowWindow, int left, int top) { int n; static MouseY=-1; ShowListWindow(surf, bShowWindow, left, top); //鼠标移动选择 if( MouseY != point.y ) { MouseY=point.y; if( point.x > x && point.x < x+Width-ScrollBar.Width && point.y > y && point.y < y+Height ) { Select=(point.y-y)/LineHeight + ScrollBar.CurNum; if( Select >= role[0].Propertiy.CurGoodsNum ) Select=role[0].Propertiy.CurGoodsNum-1; } } //显示 int shownum=(ScrollBar.PageNum<role[0].Propertiy.CurGoodsNum)?ScrollBar.PageNum:role[0].Propertiy.CurGoodsNum; for(int i=0; i<shownum; i++) { n=ScrollBar.CurNum+i; if( n==Select ) { if( ScrollBar.PageNum < ScrollBar.MaxNum-ScrollBar.MinNum ) Bar(surf, x, y+LineHeight*i+2, x+Width-ScrollBar.Width, y+LineHeight*(i+1)-2, SelectColor); else Bar(surf, x, y+LineHeight*i+2, x+Width-1, y+LineHeight*(i+1)-2, SelectColor); } Blt(surf, x, y+LineHeight*i, GOODS[role[0].Propertiy.Goods[n]].Pic, GetRect(0, 0, PicWidth, LineHeight), true); DWORD c=Font.GetColor(); Font.SetColor(0); Font.PrintText(surf, x+Column[1].x+1, y+4+LineHeight*i+1, GOODS[role[0].Propertiy.Goods[n]].Name); Font.PrintText(surf, x+Column[3].x+1, y+4+LineHeight*i+1, "%5d", role[0].Propertiy.GoodsNum[n]); Font.SetColor(c); Font.PrintText(surf, x+Column[1].x, y+4+LineHeight*i, GOODS[role[0].Propertiy.Goods[n]].Name); Font.PrintText(surf, x+Column[3].x, y+4+LineHeight*i, "%5d", role[0].Propertiy.GoodsNum[n]); } //选择 if( mouse == LB_UP ) { if( point.x > x && point.x < x+Width-ScrollBar.Width && point.y > y && point.y < y+Height ) { int sel=(point.y-y)/LineHeight + ScrollBar.CurNum; if( sel == Select ) //使用 { UseGoods(sel); Menu.ReInitMenu(); //更新屏幕 } } } //使用 if( A_UP ) { UseGoods(Select); Menu.ReInitMenu(); //更新屏幕 } //下一个 if( DOWN_DOWN && Select < ScrollBar.MaxNum-1 ) { CMenu::Sound_Change.Play(); Select++; if( Select >= ScrollBar.CurNum + ScrollBar.PageNum ) ScrollBar.SetCurNum(ScrollBar.CurNum+1); } //上一个 if( UP_DOWN && Select > 0 ) { CMenu::Sound_Change.Play(); Select--; if( Select < ScrollBar.CurNum ) ScrollBar.SetCurNum(ScrollBar.CurNum-1); } } //显示物品说明 void CGoods::ShowAboutWindow(LPDIRECTDRAWSURFACE surf, bool bShowWindow) { AboutWindow.ShowWindow(surf, bShowWindow); Font.PrintText(surf, AboutWindow.dialogx+34, AboutWindow.dialogy+34, GOODS[role[0].Propertiy.Goods[Select]].About); } //------------------------------------ //初始化数据 void CGoods::Init(LPDIRECTDRAWSURFACE surf) { ScrollBar.MinNum=0; ScrollBar.MaxNum=role[0].Propertiy.CurGoodsNum; GetGameSurface(lpDDSBackGround); FillSurface(lpDDSBack, RGB16(0)); ABlt(lpDDSBackGround, 0,0, lpDDSBack, RectScreen, 0, 24); PopWindow(surf, PopWindowStyle, PopWindowStep); AboutWindow.ShowWindow(surf); } //菜单循环 void CGoods::DoMenu(LPDIRECTDRAWSURFACE surf, bool bShow) { ShowAboutWindow(surf, bShow); ShowGoodsListWindow(surf, bShow); } //使用一个物品 void CGoods::UseGoods(int sel) { int goods=role[0].Propertiy.Goods[sel]; if( role[0].Propertiy.CurGoodsNum > 0 ) Blt(lpDDSBackGround, 0,0, lpDDSBack, RectScreen, false); int num=Menu.RoleSel.DoMenu(lpDDSBack); if( num != -1 ) { //产生效果 GoodEffect(goods, &role[num]); role[0].DelObject(GOODS[goods].Name, 1); ScrollBar.MinNum=0; ScrollBar.MaxNum=role[0].Propertiy.CurGoodsNum; //滚动条修正 if( ScrollBar.MaxNum < ScrollBar.PageNum ) ScrollBar.MaxNum = ScrollBar.PageNum; //当前位置修正 if( ScrollBar.CurNum > ScrollBar.MaxNum - ScrollBar.PageNum ) { ScrollBar.CurNum = ScrollBar.MaxNum - ScrollBar.PageNum; } //当前位置修正 if( ScrollBar.MaxNum - ScrollBar.CurNum < ScrollBar.PageNum ) { ScrollBar.CurNum = ScrollBar.MaxNum - ScrollBar.PageNum; } ScrollBar.CountNewRect(); } } //使用物品的结果 int CGoods::GoodEffect(int GoodNum, CRole *Role) { //if( GOODS[GoodNum].Class==GC_GOODS )//类型 { Role->Propertiy.Exp+=GOODS[GoodNum].Exp; //经验 Role->Propertiy.MaxHp+=GOODS[GoodNum].MaxHp; //生命最大值 Role->Propertiy.Hp+=GOODS[GoodNum].Hp; //生命 if( Role->Propertiy.Hp > Role->Propertiy.MaxHp ) Role->Propertiy.Hp = Role->Propertiy.MaxHp; Role->Propertiy.MaxMp+=GOODS[GoodNum].MaxMp; //魔法最大值 Role->Propertiy.Mp+=GOODS[GoodNum].Mp; //魔法 if( Role->Propertiy.Mp > Role->Propertiy.MaxMp ) Role->Propertiy.Mp = Role->Propertiy.MaxMp; Role->Propertiy.Attack+=GOODS[GoodNum].Attack; //攻击 Role->Propertiy.Defend+=GOODS[GoodNum].Defend; //防御 Role->Propertiy.MagicAct+=GOODS[GoodNum].MagicAct; //魔法攻击 Role->Propertiy.MagicDef+=GOODS[GoodNum].MagicDef; //魔法防御 Role->Propertiy.Stamina+=GOODS[GoodNum].Stamina; //耐力 Role->Propertiy.Luck+=GOODS[GoodNum].Luck; //幸运 Role->Propertiy.Speed+=GOODS[GoodNum].Speed; //敏捷 Role->Propertiy.Bp+=GOODS[GoodNum].Bp; //体力 Role->Propertiy.Ip+=GOODS[GoodNum].Ip; //精神 } return 1; } //获取物体编号 int CGoods::GetGoodsNum(char *name) { for(int i=0; i<MAX_GOODS; i++) { if( strcmp(name, GOODS[i].Name)==0 ) return i; } return -1; }