⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 battle.h

📁 用MFC写的RPG游戏
💻 H
字号:
//
// 执行战斗
//
//		Copyright (c) 2000-2001 Chihiro.SAKAMOTO (HyperWorks)
//
#ifndef	__battle_h__
#define	__battle_h__

#include "Action.h"
#include "Misc.h"
#include "Params.h"
#include "TextReader.h"
#include "Lexer.h"
#include "Character.h"

class CMainWin;

//
// 战斗类别
//
class CBattleAction: public CAction {
  protected:
	// 僗僥乕僞僗
	enum	{
		STATUS_WAIT_START,
		STATUS_NONE,
		STATUS_MOVE,
		STATUS_ATTACK,
		STATUS_MAGIC_ENEMY,
		STATUS_MAGIC_PLAYER,
		STATUS_COMMAND,
		STATUS_NEXTTURN,
		STATUS_ANIME,
		STATUS_BATTLE_END,
	} ;
	enum	{
		NONE            = 0,		// 一般地点
		RESTRICTED_AREA = 1 << 0,	// 禁区
		PLAYER          = 1 << 1,	// 有其他游戏者
		ENEMY           = 1 << 2,	// 有敌人
		OBJECT          = 1 << 3,	// 有东西在
		MOVEDIST        = 1 << 4,	// 有移动范围的光标
		ATTACKDIST      = 1 << 5,	// 有攻击范围的光标
	} ;
	enum	{
		TIMER_MOVE_ID = 1000,
		TIMER_ATTACK_ID,
		TIMER_NUMBER_ID,
		TIMER_MAGIC_ID,
		TIMER_MOVE_TIME = 50,
		TIMER_ATTACK_TIME = 100,
		TIMER_NUMBER_TIME = 100,
		TIMER_MAGIC_TIME = 100,
	} ;
	enum	{
		PLAYER_TURN,
		ENEMY_TURN,
	} ;
	enum	{
		COMMAND_NO_SELECT = -1,	// 未选取
		COMMAND_MOVE,			// 移动
		COMMAND_ATTACK,			// 直接攻击
		COMMAND_MAGIC_FIRST,	// 魔法1
		COMMAND_MAGIC_END = COMMAND_MAGIC_FIRST + MAX_MAGIC - 1,
		MAX_COMMAND,			// 最大命令数
	} ;

	class MapData {
	  public:
		MapData()
		{
			sprite = 0;
			type = 0;
			move_dist = 0;
			attack_dist = 0;
		}

		// 可移动吗?
		bool ChkMove(int _dist)
		{
			return type == CBattleAction::NONE
				|| ((type & CBattleAction::MOVEDIST) != 0 && move_dist < _dist);
		}

		// 可攻击吗?
		bool ChkAttack(int _dist)
		{
			return attack_dist < _dist;
		}

		// 判定在地图上的型别
		bool ChkType(unsigned char _type)
		{
			return (type & _type) == _type;
		}

	  public:
		CMapSprite *sprite;		// 地图上的sprite
		unsigned char type;		// 地图上好像有什么东西?
		char move_dist;			// 移动距离(作业用)
		char attack_dist;		// 攻击距离(作业用)
	} ;
	friend class MapData;

	class MoveAnime {
	  public:
		MoveAnime(CCharacter *_character, int _action)
		{
			action = _action;
			character = _character;
			count = 0;
		}

		int action;
		int count;
		CCharacter *character;
	} ;

	// 图像的管理
	class CChip {
	  public:
		CChip(const char *_name, const char *file)
		{
			name = _name;
			image = new CImage;
			if (!image->LoadImage(file)) {
				delete image;
				image = 0;
			}
		}
		CChip(const CChip &chip)
		{
			name = chip.name;
			image = chip.image;
			((CChip &)chip).image = 0;	//防止多重delete
		}
		~CChip()
		{
			delete image;
		}

		CImage *image;
		string name;
	} ;

  public:
	CBattleAction(CMainWin *win, CAction *oldAction);
	~CBattleAction();

	virtual	void Pause();
	virtual	void Resume();

	virtual	void LButtonDown(UINT modKeys, CPoint point);
	virtual	void RButtonDown(UINT modKeys, CPoint point);
	virtual	void MouseMove(UINT modKeys, CPoint point);

	virtual	void KeyDown(UINT key);
	virtual bool TimedOut(int timerId);

	virtual BOOL IdleAction();

	virtual void Abort();

	bool Load(const char *name);

  protected:
	bool LoadMap(const char *name);
	bool PlayerCmd(TextReader &reader, Lexer &lexer);
	bool EnemyCmd(TextReader &reader, Lexer &lexer);
	bool ObjectCmd(TextReader &reader, Lexer &lexer);
	bool MapSizeCmd(TextReader &reader, Lexer &lexer);
	bool MapImageCmd(TextReader &reader, Lexer &lexer);
	bool MapCmd(TextReader &reader, Lexer &lexer);
	void __cdecl Error(TextReader &reader, const char *fmt, ...);
	int FindMapStatus(const char *find);
	CImage *AddImage(const char *file);
	void DrawMap(CImage *image, const CRect &rect);
	void DrawMap(CImage *image);

	int PlayerNumber(int number) const { return PLAYER | (number << 8); }
	int EnemyNumber(int number) const { return ENEMY | (number << 8); }
	int ObjectNumber(int number) const { return OBJECT | (number << 8); }

	void SetCursor(CPoint point);
	void ClearCursor();
	void DrawCursor();
	void AddSprite(CSprite *s);
	void RemoveSprite(CSprite *s);
	void RedrawSprite(CSprite *s);
	void FindDist(int x, int y, int dist, bool first=true);
	void FindAttack(int x, int y, int dist, bool first=true);
	void AddDistCursor(int x, int y, int dist, int type);
	void ClearDistCursor();
	void MovePlayer(CCharacter *character, CPoint point);
	void MoveCharacter(int x, int y, int dist, CCharacter *character);
	void StartAnime();
	void ChangeTurn(int _turn);
	void ShowCommand(CPoint point);
	void HighlightCommand(int newsel, bool selection);
	void HighlightCommand(CPoint point);
	void HideCommand();
	void ShowTurnEnd(CPoint point);
	void HideTurnEnd();
	void SelectTurnEnd(bool sel);
	void Attack(CCharacter *from, CCharacter *to, bool player);
	void AttackPhase2();
	void AttackPhase3();
	void Magic(CCharacter *from, CCharacter *to, bool player);
	void FindAttackCalc(int x, int y, int dist);
	void MoveEnemy();
	void AttackEnemy();
	void ChangeStatus(CPoint point);
	void ChangePlayerStatus(CCharacter *ch);
	void SetPlayerStatus(int player);
	void SelectCommand(CPoint point);
	int FindCommand(CPoint point);
	CPoint CommandIndex(int idx);

	// 魔法动作
	bool MagicHeal();
	void HealPhase2();
	bool MagicFireBall();
	void FireBallPhase2();

	void UpdateRect(const CRect &rect);

  protected:
	CDrawImage *ViewImage;
	CImage		MapImage;
	CImage		Cursor;
	CImage		Command;
	CImage		TurnEnd;
	CImage		StatusBase;		// 基本状态的显示
	CDrawImage	Status[MAX_CHARACTER];
	CImage		PopupImageBase;
	CImage		PopupParts;
	CDrawImage	PopupImage;
	MapData    *_map_data;
	MapData   **map_data;
	CSize		MapSize;
	CRect		MapRect;
	int			status;
	int			turn;
	int			select;
	bool		sel_turnend;
	CMagicParam magic_param;
	HFONT		hFont;

	// 地图光标显示位置
	CPoint		CursorPos;

	// 角色动作选择的信息
	CPoint		SelPos;
	CCharacter *SelChar;

	// 角色的状态信息
	CCharacter *StatusChar;

	// 攻击动画
	CCharacter *AttackFrom;
	CCharacter *AttackTo;
	bool AttackPlayerToEnemy;
	int AttackAnimeCount;
	int AttackAnimeState;
	CSprite AttackSprite;

	// 魔法
	CImage FireBallImage;
	CImage HealImage;
	CImage Explosion;
	CMapSprite MagicSprite[2];

	map<int, CChip> chip_list;	// chip图像清单

	list<CCharacter> player_list;	// Player--游戏者
	list<CCharacter> enemy_list;	// Enemy---敌方
	list<CMapSprite> object_list;	// 障碍物
	list<CMapSprite> cursor_list;
	CMapSprite CursorSprite;
	CSprite CommandSprite[MAX_COMMAND];
	CSprite TurnEndSprite;
	CSprite StatusSprite[MAX_CHARACTER];
	CCharacter *StatusCharacter[MAX_CHARACTER];
	CSprite PopupSprite;
	CSprite Number[10];				// 数字
	int NumberView;
	list<MoveAnime> anime;

	class mapcomp: public binary_function<const CSprite *, const CSprite *, bool> {
	  public:
		result_type operator()(first_argument_type x, second_argument_type y) const
		{
			return *x < *y;
		}
	} ;
	typedef set<CSprite *, mapcomp>	mapset;

	mapset sprite;				// 所有贴图零件(sprite)的清单

	// EnemyTuen的暂时变量
	std::list<CCharacter>::iterator enemy_ptr;
	CCharacter *attack_target;
} ;

inline void CBattleAction::UpdateRect(const CRect &rect)
{
	DrawMap(ViewImage, rect);
	Parent->InvalidateRect(&rect);
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -