/*	
 *	ssbpLib.cpp
 *
 *	ssbpLibサポートモジュール
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2016-2017 Naoyuki Sawa
 *
 *	* Wed Apr 13 23:37:13 JST 2016 Naoyuki Sawa
 *	- 1st リリース
 *	  「ssbpLib」(https://github.com/SpriteStudio/ssbpLib/wiki)を、VC++6.0のCソースから使用するためのヘルパーDLLです。
 *	  VC++6.0ではC++対応が古過ぎてssbpLibのソースがコンパイル出来なかったので、VC++2015 update2でコンパイルしました。
 *	  作成したDLLは、VC++6.0からでも利用出来ます。
 *	- 自分で作成したファイルは、ssbpLib.h,ssbpLib.cppだけです。
 *	  ssbpLibフォルダ以下には、オリジナル版(https://github.com/SpriteStudio/ssbpLib/archive/1.2.3_SS5.6.1.zip)の、"ssbpLib-1.2.3_SS5.6.1/Players/ssbpLib/"フォルダ以下のファイルをそのまま入れてあります。
 *	  ただし、元ファイルは[UTF-8][LF]だったので、[SHIFT-JIS][CR+LF]に変換しました。文字コードを変換した事以外は、一切手を加えていません。
 *	  一部、関数の引数型でconstが不足していたり、気になる点は有ったのですが、致命的な問題は無いので敢えて手を加えずに、自分で実装したssbpLib.h,ssbpLib.cppの中で吸収しました。
 *	- ssbpLibフォルダ以下のモジュールのビルドでは、たくさんの警告が出ますが、元ソースには一切手を加えない方針なので、そのままとしました。
 *	  ssbpLib.cppのビルド時のみ、"ssbpLib/SS5PlayerPlatform.h"のインクルード内でなるべく警告が出ないように、プラグマで警告を抑制しました。
 *	- ssbpLib.cppの関数仕様は、基本的には、SS5Player.cppのメンバ関数の仕様をそのままに、C言語に変換したものです。
 *	  ただし、C言語で使えるようにするために、bool型の引数や戻り値は、int型に置き換えました。
 *	  また、アプリケーションの利便性のために、float型の引数や戻り値は、double型に置き換えました。float型は何かと使い辛いと思ったからです。
 *	- オリジナル版のライブラリを、keep/ssbpLib-1.2.3_SS5.6.1.zip に保存しておきました。
 *	* Fri Apr 15 21:07:28 JST 2016 Naoyuki Sawa
 *	- エラー処理を追加しました。
 *	  これまで、ssbpLibフォルダ以下の元ソースには一切手を加えない方針でしたが、止むを得ない理由によって、少しだけ手を加える事にしました。
 *	  止むを得ない理由とは、元ソースはエラー処理が十分でなく、ランタイムエラーが発生した時に原因が(あまりにも)わかりづらかったからです。
 *	  例えば、ResourceManager::addData()に、存在しないファイル名を指定した場合、リリースビルドでは一般保護例外で落ちてしまっていました。
 *	  そうなっていた理由は、エラーチェックがSS_ASSERT(),及び,SS_ASSERT2()だけで行われており、リリースビルドではどちらのマクロも無効化されるので、実質、エラーチェック無しになるからです。
 *	  ロジックエラーならばそれでもまあ良いのですが、リソースにかかわるエラー等はリリースビルドでも報告して欲しいので、以下の変更を行う事にしました。
 *	- SS_ASSERT()やSS_ASSERT2()等のエラーチェックマクロを、デバッグビルドでもリリースビルドでも有効にし、自前のエラー報告関数を呼び出すようにしました。
 *	  具体的には、fn_GetAddressの仕組みを利用して、アプリケーション側のvsyslogとvdieを呼び出すようにしました。
 *	  これらの関数が呼び出された時にどう処理するかは、アプリケーション次第です。
 *	  単純にvsyslogやvdieに引き渡す事も出来ますし、vdieの処理をダイアログを表示して停止するようにする事も出来ます。
 *	- 今回、ssbpLibフォルダ以下の元ソースを変更した箇所は、下記の二点だけです。
 *	  ・ssbpLib/SS5Player.h		'//{{2016/04/15'〜'//}}2016/04/15'で囲った部分 (二か所)
 *	  ・ssbpLib/SS5PlayerTypes.h	'//{{2016/04/15'〜'//}}2016/04/15'で囲った部分 (二か所)
 *	  二か所とも、変更内容は同じです。
 *	  何故かSS_ASSERT()やSS_ASSERT2()等のエラーチェックマクロが、全く同じ内容で二か所で定義されていたので、二か所とも同様に変更しました。
 *	- 上記の変更を行っていて、上記の二か所以外に、元ソースがSS_ASSERT()の使い方を間違っている箇所に気づきました。
 *	  ・ssbpLib\SS5Player.cpp  414行〜	＞SS_ASSERT(data != NULL, "Invalid data");
 *	  ・ssbpLib\SS5Player.cpp 1195行〜	＞SS_ASSERT(animeRef != NULL, msg.c_str());
 *	  正しくはSS_ASSERT2()を使うべきところ、間違ってSS_ASSERT()を使っており、エラーメッセージが出力されません。
 *	  マクロに対する引数不足ですが、VC++2015ではコンパイルエラーではなく警告止まりであり、ビルドは完了するようです。
 *	  上記の箇所も修正すべきかどうか悩んだのですが、そのままにしておく事にしました。
 *	  このままでも、ファイル名と行番号と条件式はエラーメッセージに出力されますので、エラー箇所の特定は出来るからです。
 *	- 今回の変更だけで、全てのエラーがvdie()に報告されるようになった訳では有りません。
 *	  例えば、Player::play()に対して、存在しないアニメーション名を指定すると、ssbpLib/SS5Player.cppの879行〜の
 *	  ＞AnimeRef* ref = _dic.at(animeName);
 *	  の処理の中でstd::out_of_range例外が投入され、捕捉されない例外となってアプリケーションが終了してしまいます。
 *	  これらにも対処するには、ssbpLib_Player_play()で例外を補足してvdie()に報告すれば良いのですが、ssbpLib_Player_play()だけでなく全ての関数でも対応するとなると少々手間がかかりそうです。
 *	  ひとまずこの対応は行わずに、しばらく様子を見てから、行うべきかどうか検討しようと思っています。
 *	* Fri Apr 15 23:25:13 JST 2016 Naoyuki Sawa
 *	- 上記で検討事項を、実施する事にしました。
 *	  少し使ってみたところ、やっぱり、捕捉されない例外となってアプリケーションが終了してしまうと、デバッグしづらいと思ったからです。
 *	  ssbpLib.cppモジュール内の、ssbpLibの各クラスのメンバ関数を呼び出している関数に、例外を補足してエラーとして報告する処理を追加しました。
 *	* Sun Apr 09 22:05:18 JST 2017 Naoyuki Sawa
 *	- コンパイラを、VS2015⇒VS2017に更新しました。
 *	  VS2017でソリューションを開くと自動変換が起動し、デフォルト設定のままで自動変換して、リビルドすると問題無くビルド出来ました。
 *	  引き続き使用しながら、検証しようと思います。
 *	* Tue Apr 18 21:46:46 JST 2017 Naoyuki Sawa
 *	- Visual Studio 2017をバージョンアップした事に伴い、当モジュールもリビルドしました。
 *	  当モジュールのソースコードには変更有りません。
 *	- 使用したコンパイラは、以下の通りです。
 *	  │Microsoft Visual Studio Community 2017 Version 15.1 (26403.7) Release	←バージョンアップ
 */
/*****************************************************************************
 *	
 *****************************************************************************/
#include "DxLib.h"	//型定義,関数定義だけを使用しライブラリはリンクしません。ライブラリをリンクしないためにプロジェクトの設定でDX_LIB_NOT_DEFAULTPATHを定義しました。スタブ関数を当モジュール内で定義するためにDX_NON_NAMESPACEも定義しました。
/*---------------------------------------------------------------------------*/
#pragma warning(disable: 4099)		//タイプ名は最初'class'として使われていましたが'struct'として使われています。
#pragma warning(disable: 4244)		//'double'から'float'への変換です。データが失われる可能性があります。
#include "ssbpLib/SS5PlayerPlatform.h"
#pragma warning(default: 4099)		//タイプ名は最初'class'として使われていましたが'struct'として使われています。
#pragma warning(default: 4244)		//'double'から'float'への変換です。データが失われる可能性があります。
using namespace ss;
#define SSBPLIB_BUILD
/*---------------------------------------------------------------------------*/
#include "ssbpLib.h"
/*****************************************************************************
 *	
 *****************************************************************************/
int	draw_count;	//SS5PlayerPlatform.cppで宣言だけされていて定義されていないのでここで定義する事にした。
void*	(*fn_GetAddress)(const char* pName);
/*****************************************************************************
 *	
 *****************************************************************************/
void ssbpLib_Init(void* (*_fn_GetAddress)(const char* pName)) {
	fn_GetAddress	= _fn_GetAddress;
}
extern "C" void syslog(int priority, const char* format, ...) {
	static void (*fn_vsyslog)(int,const char*,va_list);
	if(!fn_vsyslog) { fn_vsyslog = (void (*)(int,const char*,va_list))((*fn_GetAddress)("vsyslog")); }
	va_list ap;
	va_start(ap, format);
	(*fn_vsyslog)(priority, format, ap);
	va_end(ap);
}
extern "C" __declspec(noreturn) void die(const char* format, ...) {
	static void (*fn_vdie)(const char*,va_list);
	if(!fn_vdie) { fn_vdie = (void (*)(const char*,va_list))((*fn_GetAddress)("vdie")); }
	va_list ap;
	va_start(ap, format);
	(*fn_vdie)(format, ap);
	va_end(ap);
}
/*****************************************************************************
 *	DxLib
 *****************************************************************************/
int DeleteGraph(int GrHandle, int LogOutFlag) {	//SS5PlayerPlatform.cppから呼び出される。
	static int (*fn_DeleteGraph)(int,int);
	if(!fn_DeleteGraph) { fn_DeleteGraph = (int (*)(int,int))((*fn_GetAddress)("DeleteGraph")); }
	return (*fn_DeleteGraph)(GrHandle, LogOutFlag);
}
int LoadGraph(const TCHAR* FileName, int NotUse3DFlag) {	//SS5PlayerPlatform.cppから呼び出される。
	static int (*fn_LoadGraph)(const TCHAR*,int);
	if(!fn_LoadGraph) { fn_LoadGraph = (int (*)(const TCHAR*,int))((*fn_GetAddress)("LoadGraph")); }
	return (*fn_LoadGraph)(FileName, NotUse3DFlag);
}
int GetGraphSize(int GrHandle, int* SizeXBuf, int* SizeYBuf) {	//SS5PlayerPlatform.cppから呼び出される。
	static int (*fn_GetGraphSize)(int,int*,int*);
	if(!fn_GetGraphSize) { fn_GetGraphSize = (int (*)(int,int*,int*))((*fn_GetAddress)("GetGraphSize")); }
	return (*fn_GetGraphSize)(GrHandle, SizeXBuf, SizeYBuf);
}
int DrawPolygon3DBase(const VERTEX_3D* Vertex, int VertexNum, int PrimitiveType, int GrHandle, int TransFlag) {	//SS5PlayerPlatform.cppから呼び出される。
	static int (*fn_DrawPolygon3DBase)(const VERTEX_3D*,int,int,int,int);
	if(!fn_DrawPolygon3DBase) { fn_DrawPolygon3DBase = (int (*)(const VERTEX_3D*,int,int,int,int))((*fn_GetAddress)("DrawPolygon3DBase")); }
	return (*fn_DrawPolygon3DBase)(Vertex, VertexNum, PrimitiveType, GrHandle, TransFlag);
}
int SetDrawBlendMode(int BlendMode, int BlendParam) {	//SS5PlayerPlatform.cppから呼び出される。
	static int (*fn_SetDrawBlendMode)(int,int);
	if(!fn_SetDrawBlendMode) { fn_SetDrawBlendMode = (int (*)(int,int))((*fn_GetAddress)("SetDrawBlendMode")); }
	return (*fn_SetDrawBlendMode)(BlendMode, BlendParam);
}
int SetDrawBright(int RedBright, int GreenBright, int BlueBright) {	//SS5PlayerPlatform.cppから呼び出される。
	static int (*fn_SetDrawBright)(int,int,int);
	if(!fn_SetDrawBright) { fn_SetDrawBright = (int (*)(int,int,int))((*fn_GetAddress)("SetDrawBright")); }
	return (*fn_SetDrawBright)(RedBright, GreenBright, BlueBright);
}
/*****************************************************************************
 *	
 *****************************************************************************/
#define DIE()	die("%s(%d): %s: %s", __FILE__, __LINE__, __FUNCTION__, e.what())
/*****************************************************************************
 *	ResourceManager
 *****************************************************************************/
/*static*/ ssbpLib_ResourceManager* ssbpLib_ResourceManager_getInstance() {
	try {
		return ResourceManager::getInstance();
	} catch(const std::exception& e) { DIE(); }
}
/*static*/ ssbpLib_ResourceManager* ssbpLib_ResourceManager_create() {
	try {
		return ResourceManager::create();
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_ResourceManager_delete(ssbpLib_ResourceManager* obj) {
	try {
		delete obj;
	} catch(const std::exception& e) { DIE(); }
}
/*---------------------------------------------------------------------------*/
void ssbpLib_ResourceManager_addData(ssbpLib_ResourceManager* obj, const char* ssbpFilepath, const char* imageBaseDir/*NULL可*/) {	//戻り値は仕様上自明なので省略する事にした。もし戻り値を対応すると文字列の動的割り当てや呼び出し側での解放が必要になり使いづらくなってしまう。
	try {
		obj->addData(ssbpFilepath, imageBaseDir ? imageBaseDir : ResourceManager::s_null);
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_ResourceManager_addDataWithKey(ssbpLib_ResourceManager* obj, const char* dataKey, const char* ssbpFilepath, const char* imageBaseDir/*NULL可*/) {	//戻り値は仕様上自明なので省略する事にした。もし戻り値を対応すると文字列の動的割り当てや呼び出し側での解放が必要になり使いづらくなってしまう。
	try {
		obj->addDataWithKey(dataKey, ssbpFilepath, imageBaseDir ? imageBaseDir : ResourceManager::s_null);
	} catch(const std::exception& e) { DIE(); }
}
//void ssbpLib_ResourceManager_addData(ssbpLib_ResourceManager* obj, const char* dataKey, const ssbpLib_ProjectData* data, const char* imageBaseDir/*NULL可*/) {	//戻り値は仕様上自明なので省略する事にした。もし戻り値を対応すると文字列の動的割り当てや呼び出し側での解放が必要になり使いづらくなってしまう。	//Cリンケージではオーバーロード出来ない。こちらのバージョンは使わないと思うので削除した。
//	try {
//		obj->addData(dataKey, data, imageBaseDir ? imageBaseDir : ResourceManager::s_null);
//	} catch(const std::exception& e) { DIE(); }
//}
void ssbpLib_ResourceManager_removeData(ssbpLib_ResourceManager* obj, const char* dataKey) {
	try {
		obj->removeData(dataKey);
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_ResourceManager_removeAllData(ssbpLib_ResourceManager* obj) {
	try {
		obj->removeAllData();
	} catch(const std::exception& e) { DIE(); }
}
//ssbpLib_ResourceSet* ssbpLib_ResourceManager_getData(ssbpLib_ResourceManager* obj, const char* dataKey) {	//※TODO:ResourceManager::getData()を呼び出すと何故かリンクエラーになる問題が生じ未対応とした(現在の所アプリケーションから使う必要は無いと思うのでとりあえず…)。リンカバグの可能性も有ると思う。解決したら対応しろ。
//	try {
//		return obj->getData(dataKey);
//	} catch(const std::exception& e) { DIE(); }
//}
int ssbpLib_ResourceManager_changeTexture(ssbpLib_ResourceManager* obj, const char* ssbpName, const char* ssceName, long texture) {
	try {
		return obj->changeTexture((char*)ssbpName, (char*)ssceName, texture);	//キャストは警告抑制のためです。
	} catch(const std::exception& e) { DIE(); }
}
int ssbpLib_ResourceManager_releseTexture(ssbpLib_ResourceManager* obj, const char* ssbpName) {
	try {
		return obj->releseTexture((char*)ssbpName);	//キャストは警告抑制のためです。
	} catch(const std::exception& e) { DIE(); }
}
int ssbpLib_ResourceManager_getMaxFrame(ssbpLib_ResourceManager* obj, const char* ssbpName, const char* animeName) {
	try {
		return obj->getMaxFrame(ssbpName, animeName);
	} catch(const std::exception& e) { DIE(); }
}
/*****************************************************************************
 *	Player
 *****************************************************************************/
/*static*/ ssbpLib_Player* ssbpLib_Player_create(ssbpLib_ResourceManager* resman/*NULL可*/) {
	try {
		return Player::create(resman);
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_delete(ssbpLib_Player* obj) {
	try {
		delete obj;
	} catch(const std::exception& e) { DIE(); }
}
/*---------------------------------------------------------------------------*/
void ssbpLib_Player_setResourceManager(ssbpLib_Player* obj, ssbpLib_ResourceManager* resman/*NULL可*/) {
	try {
		obj->setResourceManager(resman);
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_releaseResourceManager(ssbpLib_Player* obj) {
	try {
		obj->releaseResourceManager();
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_setData(ssbpLib_Player* obj, const char* dataKey) {
	try {
		obj->setData(dataKey);
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_releaseData(ssbpLib_Player* obj) {
	try {
		obj->releaseData();
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_releaseAnime(ssbpLib_Player* obj) {
	try {
		obj->releaseAnime();
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_play(ssbpLib_Player* obj, const char* ssaeName, const char* motionName, int loop, int startFrameNo) {
	try {
		obj->play(ssaeName, motionName, loop, startFrameNo);
	} catch(const std::exception& e) { DIE(); }
}
//void ssbpLib_Player_play(ssbpLib_Player* obj, const char* animeName, int loop, int startFrameNo) {	//Cリンケージではオーバーロード出来ない。こちらのバージョンは使わないと思うので削除した。
//	try {
//		obj->play(ssaeName, loop, startFrameNo);
//	} catch(const std::exception& e) { DIE(); }
//}
void ssbpLib_Player_motionBlendPlay(ssbpLib_Player* obj, const char* animeName, int loop, int startFrameNo, double blendTime) {
	try {
		obj->motionBlendPlay(animeName, loop, startFrameNo, (float)blendTime);
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_animePause(ssbpLib_Player* obj) {
	try {
		obj->animePause();
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_animeResume(ssbpLib_Player* obj) {
	try {
		obj->animeResume();
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_stop(ssbpLib_Player* obj) {
	try {
		obj->stop();
	} catch(const std::exception& e) { DIE(); }
}
const char* ssbpLib_Player_getPlayPackName(ssbpLib_Player* obj) {	//元関数の戻り値が一時的でない文字列への参照なので、その文字列ポインタを取り出して返しても安全です。
	try {
		return obj->getPlayPackName().c_str();
	} catch(const std::exception& e) { DIE(); }
}
const char* ssbpLib_Player_getPlayAnimeName(ssbpLib_Player* obj) {	//元関数の戻り値が一時的でない文字列への参照なので、その文字列ポインタを取り出して返しても安全です。
	try {
		return obj->getPlayAnimeName().c_str();
	} catch(const std::exception& e) { DIE(); }
}
int ssbpLib_Player_getMaxFrame(ssbpLib_Player* obj) {
	try {
		return obj->getMaxFrame();
	} catch(const std::exception& e) { DIE(); }
}
int ssbpLib_Player_getFrameNo(ssbpLib_Player* obj) {
	try {
		return obj->getFrameNo();
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_setFrameNo(ssbpLib_Player* obj, int frameNo) {
	try {
		obj->setFrameNo(frameNo);
	} catch(const std::exception& e) { DIE(); }
}
double ssbpLib_Player_getStep(ssbpLib_Player* obj) {
	try {
		return obj->getStep();
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_setStep(ssbpLib_Player* obj, double step) {
	try {
		obj->setStep((float)step);
	} catch(const std::exception& e) { DIE(); }
}
int ssbpLib_Player_getLoop(ssbpLib_Player* obj) {
	try {
		return obj->getLoop();
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_setLoop(ssbpLib_Player* obj, int loop) {
	try {
		obj->setLoop(loop);
	} catch(const std::exception& e) { DIE(); }
}
int ssbpLib_Player_getLoopCount(ssbpLib_Player* obj) {
	try {
		return obj->getLoopCount();
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_clearLoopCount(ssbpLib_Player* obj) {
	try {
		obj->clearLoopCount();
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_setFrameSkipEnabled(ssbpLib_Player* obj, int enabled) {
	try {
		obj->setFrameSkipEnabled(!!enabled);	//!!は警告抑制のためです。
	} catch(const std::exception& e) { DIE(); }
}
int ssbpLib_Player_isFrameSkipEnabled(ssbpLib_Player* obj) {
	try {
		return obj->isFrameSkipEnabled();
	} catch(const std::exception& e) { DIE(); }
}
int ssbpLib_Player_getLabelToFrame(ssbpLib_Player* obj, const char* findLabelName) {
	try {
		return obj->getLabelToFrame((char*)findLabelName);	//キャストは警告抑制のためです。
	} catch(const std::exception& e) { DIE(); }
}
const char* ssbpLib_Player_getPartName(ssbpLib_Player* obj, int partId) {
	try {
		return obj->getPartName(partId);
	} catch(const std::exception& e) { DIE(); }
}
int ssbpLib_Player_indexOfPart(ssbpLib_Player* obj, const char* partName) {
	try {
		return obj->indexOfPart(partName);
	} catch(const std::exception& e) { DIE(); }
}
//int ssbpLib_Player_getPartState(ssbpLib_Player* obj, ssbpLib_ResluteState& result, const char* name, int frameNo) {	//アプリケーションから使う事は無いと思うので削除した。もし定義するならばResluteState構造体をアプリケーション側から参照出来るように定義する必要が生じる。
//	try {
//		return obj->getPartState(result, name, frameNo);
//	} catch(const std::exception& e) { DIE(); }
//}
void ssbpLib_Player_setPartVisible(ssbpLib_Player* obj, const char* partsname, int flg) {
	try {
		obj->setPartVisible(partsname, !!flg);	//!!は警告抑制のためです。
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_setPartCell(ssbpLib_Player* obj, const char* partsname, const char* sscename, const char* cellname) {
	try {
		obj->setPartCell(partsname, sscename, cellname);
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_setPosition(ssbpLib_Player* obj, double x, double y) {
	try {
		obj->setPosition((float)x, (float)y);
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_setRotation(ssbpLib_Player* obj, double x, double y, double z) {
	try {
		obj->setRotation((float)x, (float)y, (float)z);
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_setScale(ssbpLib_Player* obj, double x, double y) {
	try {
		obj->setScale((float)x, (float)y);
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_setAlpha(ssbpLib_Player* obj, int a) {
	try {
		obj->setAlpha(a);
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_setColor(ssbpLib_Player* obj, int r, int g, int b) {
	try {
		obj->setColor(r, g, b);
	} catch(const std::exception& e) { DIE(); }
}
//int ssbpLib_Player_changeInstanceAnime(ssbpLib_Player* obj, const char* partsname, const char* animeName, int overWrite, ssbpLib_Instance keyParam) {	//アプリケーションから使う事は無いと思うので削除した。もし定義するならばInstance構造体をアプリケーション側から参照出来るように定義する必要が生じる。
//	try {
//		return obj->changeInstanceAnime(partsname, animeName, overWrite, keyParam);
//	} catch(const std::exception& e) { DIE(); }
//}
//void ssbpLib_Player_setInstanceParam(ssbpLib_Player* obj, int overWrite, ssbpLib_Instance keyParam) {	//アプリケーションから使う事は無いと思うので削除した。もし定義するならばInstance構造体をアプリケーション側から参照出来るように定義する必要が生じる。
//	try {
//		obj->setInstanceParam(overWrite, keyParam);
//	} catch(const std::exception& e) { DIE(); }
//}
//void ssbpLib_Player_getInstanceParam(ssbpLib_Player* obj, int* overWrite, ssbpLib_Instance* keyParam) {	//アプリケーションから使う事は無いと思うので削除した。もし定義するならばInstance構造体をアプリケーション側から参照出来るように定義する必要が生じる。
//	try {
//		obj->getInstanceParam(overWrite, keyParam);
//	} catch(const std::exception& e) { DIE(); }
//}
void ssbpLib_Player_setFlip(ssbpLib_Player* obj, int flipX, int flipY) {	//ssbpLib/SS5PlayerPlatform.cppのSSDrawSprite()にバグが有るのか(?)、flipXもflipYも正しく反映されないようだ。実質、この関数は使えない。反転描画を行いたい場合は、この関数ではなくssbpLib_Player_setScale()を使え。ssbpLib_Player_setScale()を使えば正しく反転描画が出来るので、この関数が使えなくても実用上は問題無い。
	try {
		obj->setFlip(!!flipX, !!flipY);	//!!は警告抑制のためです。
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_setGameFPS(ssbpLib_Player* obj, double fps) {
	try {
		obj->setGameFPS((float)fps);
	} catch(const std::exception& e) { DIE(); }
}
//ssbpLib_CustomSprite* ssbpLib_Player_getSpriteData(ssbpLib_Player* obj, int partIndex) {	//アプリケーションから使う事は無いと思うので削除した。もし定義するならばCustomSprite構造体をアプリケーション側から参照出来るように定義する必要が生じる。
//	try {
//		return obj->getSpriteData(partIndex);
//	} catch(const std::exception& e) { DIE(); }
//}
void ssbpLib_Player_update(ssbpLib_Player* obj, double dt) {
	try {
		obj->update((float)dt);
	} catch(const std::exception& e) { DIE(); }
}
void ssbpLib_Player_draw(ssbpLib_Player* obj) {
	try {
		obj->draw();
	} catch(const std::exception& e) { DIE(); }
}
