explosiongenerator.h

来自「这是整套横扫千军3D版游戏的源码」· C头文件 代码 · 共 119 行

H
119
字号
#ifndef EXPLOSION_GRAPHICS_H
#define EXPLOSION_GRAPHICS_H

#include "Sim/Misc/DamageArray.h"
#include "Lua/LuaParser.h"
#include "Sim/Objects/WorldObject.h"
#include <map>

class CUnit;
class CExplosionGenerator;

class CExpGenSpawnable : public CWorldObject
{
public:
	CR_DECLARE(CExpGenSpawnable);
	CExpGenSpawnable() : CWorldObject(){};
	CExpGenSpawnable(const float3& pos) : CWorldObject(pos){};
	virtual ~CExpGenSpawnable(){};
	virtual void Init(const float3& pos, CUnit *owner)=0;
};

class ClassAliasList 
{
public:
	ClassAliasList();

	void Load(const LuaTable&);
	creg::Class* GetClass(const std::string& name);
	std::string FindAlias(const std::string& className);
protected:
	std::map<std::string, std::string> aliases;
};

class CExplosionGeneratorHandler
{
public:
	CExplosionGeneratorHandler ();

	CExplosionGenerator* LoadGenerator(const std::string& tag);
	const LuaTable& GetTable() { return luaTable; }

	ClassAliasList projectileClasses, generatorClasses;
protected:
	std::map<std::string, CExplosionGenerator*> generators;
	LuaParser luaParser;
	LuaTable  luaTable;
};


class CExplosionGenerator
{
public:
	CR_DECLARE(CExplosionGenerator);

	CExplosionGenerator();
	virtual ~CExplosionGenerator();

	virtual void Explosion(const float3 &pos, float damage, float radius, CUnit *owner,float gfxMod, CUnit *hit,const float3 &dir) = 0;
	virtual void Load(CExplosionGeneratorHandler* loader, const std::string& tag) = 0;
};

class CStdExplosionGenerator : public CExplosionGenerator
{
public:
	CR_DECLARE(CStdExplosionGenerator);

	CStdExplosionGenerator();
	virtual ~CStdExplosionGenerator();

	void Explosion(const float3 &pos, float damage, float radius, CUnit *owner,float gfxMod, CUnit *hit,const float3 &dir);
	void Load (CExplosionGeneratorHandler* loader, const std::string& tag);
};

/* Defines the result of an explosion as a series of new projectiles */
class CCustomExplosionGenerator : public CStdExplosionGenerator
{
protected:
	CR_DECLARE(CCustomExplosionGenerator);

	struct ProjectileSpawnInfo
	{
		ProjectileSpawnInfo() { projectileClass=0; }

		creg::Class* projectileClass;
		std::vector<char> code;
		int count;// number of projectiles spawned of this type
		unsigned int flags;
	};
	// TODO: Handle ground flashes with more flexibility like the projectiles
	struct GroundFlashInfo { 
		GroundFlashInfo() { ttl=0; }

		float flashSize;
		float flashAlpha;
		float circleGrowth;
		float circleAlpha;
		int ttl;
		float3 color;
		unsigned int flags;
	} *groundFlash;

	bool useDefaultExplosions;
	std::vector<ProjectileSpawnInfo*> projectileSpawn;
	void ParseExplosionCode(ProjectileSpawnInfo *psi, int baseOffset, creg::IType *type, const std::string& script, std::string& code);
	void ExecuteExplosionCode (const char *code, float damage, char *instance, int spawnIndex, const float3 &dir);

public:
	CCustomExplosionGenerator();
	~CCustomExplosionGenerator();
	static void OutputProjectileClassInfo();

	void Load (CExplosionGeneratorHandler* loader, const std::string& tag);// throws content_error/runtime_error on errors
	void Explosion(const float3 &pos, float damage, float radius, CUnit *owner,float gfxMod, CUnit *hit, const float3 &dir);
};

extern CExplosionGeneratorHandler* explGenHandler;

#endif 

⌨️ 快捷键说明

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