プラグイン

 

それでは早速、プラグインの作り方の解説を始めます。
なお、本解説はVCの取り扱いを心得ていることを前提に記述されています。

★概要の解説

まずは、プラグインを作成する為のテンプレートプロジェクトの概要を解説します。
説明の前に、テンプレートプロジェクトを以下の手順で開いてください。

1.AbyssLibSet.zipを解凍します。

2.PluginTemplateのソリューションファイル(.sln)を開きます。
 あなたがVC2005を使用しているのならAbyssLibSet→Src→PluginTemplate→Projects→VC2005を、
 あなたがVC2008を使用しているのならAbyssLibSet→Src→PluginTemplate→Projects→VC2008を、
 あなたがVC2010を使用しているのならAbyssLibSet→Src→PluginTemplate→Projects→VC2010を、
 あなたがVC2012を使用しているのならAbyssLibSet→Src→PluginTemplate→Projects→VC2012を開いてください。

以上の手順で、テンプレートプロジェクトを開けた筈です。
以下に、テンプレートプロジェクトに含まれる各種ファイルの役割を記します。

CMisc.h
CMisc.cpp
プラグインで使用可能な列挙体と構造体
含まれているのはTYPE_SYMBOL、TYPE_TOKEN、TYPE_OPERATOR、TYPE_SEPARATOR、
mystr、vector_mystr、Expression、Token、RubyTextToken、RubyTextTokenLine、TextToken、
TextTokenLine、TextTokenSection
FMisc.h
FMisc.cpp
プラグインで使用可能な関数
含まれているのはCreateRect
IOStream.h
IOStream.cpp
プラグインで使用可能な関数とクラス
含まれているのはIIOStream、SaveStringS、SaveMapList、SaveTemplate、LoadStringS、LoadMapList、LoadTemplate
SimulatedHeap.h プラグインで使用可能なクラス
含まれているのはISingleHeap、ICommandHeap
TextStream.h プラグインで使用可能なクラス
含まれているのはITextStream
TaskManager.h プラグインで使用可能な列挙体と構造体とクラス
含まれているのはDRAWTASK_TYPE、DRAWTASK_BLTTYPE、TASKMANAGER_CHPRIORITY、
DrawTask、Sprite、Button、EffectParam、UpdateParam、ITaskManager、ITMAccessor
TextManager.h プラグインで使用可能な構造体とクラス
含まれているのはRecord、ITextManager
InputManager.h プラグインで使用可能なクラス
含まれているのはIInputManager
SoundManager.h プラグインで使用可能なクラス
含まれているのはISoundManager
DrawManager.h プラグインで使用可能な列挙体とクラス
含まれているのはTEXTCURSOR、IDrawManager、IDMAccessor
Command.h プラグインで使用可能な列挙体と構造体とクラス
含まれているのはCmdParam、ICmd_Base、TYPE_CMD

命令を追加する場合、このファイルを編集する必要があります

Cmd_Sample.h
Cmd_Sample.cpp
命令を追加した場合のサンプル
Effect.h
Effect.cpp
プラグインで使用可能な列挙体
含まれているのはEFFECTTYPE

画面効果を追加する場合、このファイルを編集する必要があります

Update.h
Update.cpp
プラグインで使用可能な列挙体
含まれているのはUPDATETYPE

画面更新を追加する場合、このファイルを編集する必要があります

index.h プラグインで使用可能なマクロとヘッダファイルのinclude
含まれているのはABYSSLIB_DLL_VERSION(DLLにおけるABYSSLIB_VERSION)、WARNING
declare.h
declare.cpp
変数の定義
stdafx.h
stdafx.cpp
プリコンパイル済みヘッダ

プラグインで使用可能な関数
含まれているのはnew、delete

各種設定
パディング、動作環境、警告の抑制、ヘッダのinclude、名前空間のusingなど……

AbyssLib.h プラグインで使用可能な列挙体とクラス
含まれているのはNOVELENGINE_STATE、INovelEngine
PluginTemplate.cpp DllMainとエクスポート関数
含まれているのはDllMain、GetAbyssLibDllVersion(エクスポート関数)

命令を追加する場合、このファイルを編集する必要があります

画面効果を追加する場合、このファイルを編集する必要があります

画面更新を追加する場合、このファイルを編集する必要があります

環境設定の保存/読み込みを追加する場合、このファイルを編集する必要があります

ローカルデータの保存/読み込みを追加する場合、このファイルを編集する必要があります

描画タスク追加関数を追加する場合、このファイルを編集する必要があります

描画タスク処理関数を追加する場合、このファイルを編集する必要があります

描画関数を追加する場合、このファイルを編集する必要があります

命令を追加

命令を追加する方法を、ここでは解説します。

Command.h

初めに、追加する命令の列挙型を記述します。
既に宣言されている列挙型は、BasicCommands.dll内で使用されている列挙型です。
よって、追加する命令の列挙型は既に宣言されているものと重複しないようにしなければなりません。
具体的には1***〜429467***といった感じで、自分が使用する上位6桁を適当に設定するのがいいでしょう。
(0***(0〜999)はBasicCommands.dll内で使用する可能性があります、また他の人のプラグインと列挙型が重複しないよう注意してください)

次に、追加する命令のクラスを記述したファイル(以下、"Cmd_xxx.h"とする)をincludeしてください。

具体例は、Command.hを参照してください。

Cmd_xxx.h
Cmd_xxx.cpp

はじめに、追加する命令クラスを記述します。
命令クラスは、ICmd_Baseの派生型にし、コンストラクタで行うべき処理をInitializeメンバ関数に記述し、
デストラクタを実装せずデストラクタで行うべき処理をSuicideメンバ関数に委譲し記述するようにしてください。
以下に命令クラスの実装に関する簡単な説明を記します。

コンストラクタ クラスの初期化を実装してください
デストラクタ 絶対に実装しないでください
Initialize クラスの初期化を実装してください(不必要な場合は省略可能です)
(※ただし、メンバ変数の初期化は一時変数を除き行わないでください)
Suicide デストラクタで行うべき処理とdelete(this);を実装してください
Run 命令実行時の処理を実装してください
SetParam 命令に引数が渡された時の処理(メンバ変数への割り当て等)を実装してください(不必要な場合は省略可能です)
GetID 命令の種類を表す列挙型を取得する処理を実装してください
Print デバッグ時に命令の内容を表示する処理を実装してください
Save セーブ時に必要な値をファイルに書き込む処理を実装してください(不必要な場合は省略可能です)
Load ロード時に必要な値をファイルから読み込む処理を実装してください(不必要な場合は省略可能です)

次に、命令クラスのFactory関数(呼び出しに対してnewで生成した命令クラスを返す関数)を記述してください。
基本的には例に従い、return(new 命令クラス);でOKです。

最後に、命令クラスの解析関数(コンパイラで構文を解析する時に用いる関数)を記述してください。
解析関数の記述の仕方は、解析関数の記述方法を参照してください。

具体例はCmd_Sample.hおよびCmd_Sample.cpp、またはBasicCommandsを参照してください。

PluginTemplate.cpp

初めに、命令クラスのFactory関数と列挙型を関連付けます。
RegisterPFactory(列挙型, Factory関数の関数ポインタ);でOKです。

次に、命令クラスの解析関数と列挙型を関連付けます。
RegisterPAnalysis(列挙型, 解析関数の関数ポインタ);でOKです。

次に、命令の識別子("if"など)と列挙型を関連付けます。
RegisterPCommandName(識別子, 列挙型);でOKです。

最後に、実行中に入力受付(ボタンやメニューへのアクセス)が有効な命令の列挙型を登録します。
RegisterPEnableSystemCommand(列挙型);でOKです。

具体例はBasicCommandsを参照してください。

画面効果を追加

画面効果を追加する方法を、ここでは解説します。

Effect.h
Effect.cpp

初めに、追加する画面効果の列挙型を記述します。
既に宣言されている列挙型は、BasicCommands.dll内で使用されている列挙型です。
よって、追加する画面効果の列挙型は既に宣言されているものと重複しないようにしなければなりません。
具体的には1***〜429467***といった感じで、自分が使用する上位6桁を適当に設定するのがいいでしょう。
(0***(0〜999)はBasicCommands.dll内で使用する可能性があります、また他の人のプラグインと列挙型が重複しないよう注意してください)

次に、追加する画面効果関数を記述します。
グラフィック機能に対するアクセスはITaskManagerやITMAccessor、IDrawManagerやIDMAccessorを介して行います。

具体例はEffect.hおよびEffect.cpp、またはBasicCommandsを参照してください。

PluginTemplate.cpp

画面効果関数と列挙型を関連付けます。
RegisterPEffect1(列挙型, 画面効果関数の関数ポインタ);、RegisterPEffect2(列挙型, 画面効果関数の関数ポインタ);、
RegisterPEffect3(列挙型, 画面効果関数の関数ポインタ);でOKです。
RegisterPEffect1とRegisterPEffect2とRegisterPEffect3では画面効果関数の実行されるタイミングが異なります、
RegisterPEffect1は描画タスクリスト構築後、RegisterPEffect2はテキストウインドウ描画前、RegisterPEffect3はテキストウインドウ描画後です。
画面効果関数を実行させたいタイミングで、RegisterPEffect1かRegisterPEffect2かRegisterPEffect3かを判断してください。
画面効果関数を実行させたくないタイミングには、空関数と列挙型を関連付けてください(忘れるとランタイムエラーです、注意!)

例:テキストウインドウ描画後に実行される画面効果関数Effect_Flashの場合(Effect_Nopは空関数)
    RegisterPEffect1(EFFECTTYPE_FLASH , *Effect_Nop);
    RegisterPEffect2(EFFECTTYPE_FLASH , *Effect_Nop);
    RegisterPEffect3(EFFECTTYPE_FLASH , *Effect_Flash);

具体例はBasicCommandsを参照してください。

画面更新を追加

画面更新を追加する方法を、ここでは解説します。

Update.h
Update.cpp

初めに、追加する画面更新の列挙型を記述します。
既に宣言されている列挙型は、BasicCommands.dll内で使用されている列挙型です。
よって、追加する画面更新の列挙型は既に宣言されているものと重複しないようにしなければなりません。
具体的には1***〜429467***といった感じで、自分が使用する上位6桁を適当に設定するのがいいでしょう。
(0***(0〜999)はBasicCommands.dll内で使用する可能性があります、また他の人のプラグインと列挙型が重複しないよう注意してください)

次に、追加する画面更新関数を記述します。
グラフィック機能に対するアクセスはITaskManagerやITMAccessor、IDrawManagerやIDMAccessorを介して行います。

具体例はUpdate.hおよびUpdate.cpp、またはBasicCommandsを参照してください。

PluginTemplate.cpp

画面更新関数と列挙型を関連付けます。
RegisterPUpdate(列挙型, 画面更新関数の関数ポインタ);でOKです。

具体例はBasicCommandsを参照してください。

★環境設定の保存/読み込みを追加

環境設定の保存/読み込みを追加する方法を、ここでは解説します。
以下を行うことで、命令などの追加によって実装した新要素のパラメータを環境設定に保存/読み込みすることが可能となります。

xxx.h
xxx.cpp

初めに、保存関数と読み込み関数を作成します。
引数はINovelEngineクラスのポインタ、戻り値はvoid型となります。
Save〜関数またはLoad〜関数で変数の保存と読み込みを実装してください。

PluginTemplate.cpp

保存関数と読み込み関数をEXE側にエクスポートします。
RegisterPSaveEnvironmentDataFunc(プラグイン名, 保存関数の関数ポインタ);または
RegisterPLoadEnvironmentDataFunc(プラグイン名, 読み込み関数の関数ポインタ);でOKです。

具体例はBasicCommandsを参照してください。

★ローカルデータの保存/読み込みを追加

ローカルデータの保存/読み込みを追加する方法を、ここでは解説します。
以下を行うことで、命令などの追加によって実装した新要素のパラメータをローカルデータに保存/読み込みすることが可能となります。

xxx.h
xxx.cpp

初めに、保存関数と読み込み関数を作成します。
引数はINovelEngineクラスのポインタ、戻り値はvoid型となります。
Save〜関数またはLoad〜関数で変数の保存と読み込みを実装してください。

PluginTemplate.cpp

保存関数と読み込み関数をEXE側にエクスポートします。
RegisterPSaveLocalDataFunc(プラグイン名, 保存関数の関数ポインタ);または
RegisterPLoadLocalDataFunc(プラグイン名, 読み込み関数の関数ポインタ);でOKです。

具体例はBasicCommandsを参照してください。

★描画タスク追加関数を追加

描画タスク追加関数を追加する方法を、ここでは解説します。
以下を行うことで、様々な種類の描画タスクを取り扱う事が可能になります。

xxx.h
xxx.cpp

はじめに、描画タスク追加関数を作成します。
引数はINovelEngineクラスのポインタとDrawTask構造体のconst参照、戻り値はvoid型となります。
描画タスクの種類に応じた描画タスク追加関数を実装してください。
注意点として、最終的に描画タスクリストに描画タスクを追加する際にはPushTaskListIMを使用します。
(PushTaskListを使用すると、PushTaskList→作成した関数→PushTaskList→……の無限ループになります)

PluginTemplate.cpp

描画タスク追加関数をEXE側にエクスポートします。
RegisterPAddDrawTaskFunc(描画タスクの種類, 描画タスク追加関数の関数ポインタ)でOKです。

★描画タスク処理関数を追加

描画タスク処理関数を追加する方法を、ここでは解説します。
以下を行うことで、様々な種類の描画タスクを取り扱う事が可能になります。

xxx.h
xxx.cpp

はじめに、描画タスク処理関数を作成します。
引数はINovelEngineクラスのポインタとDrawTask構造体のconst参照、戻り値はvoid型となります。
描画タスクの種類に応じた描画タスク処理関数を実装してください。

PluginTemplate.cpp

描画タスク処理関数をEXE側にエクスポートします。
RegisterPDrawTaskFunc(描画タスクの種類, 描画タスク処理関数の関数ポインタ)でOKです。

★描画関数を追加

描画関数を追加する方法を、ここでは解説します。
以下を行うことで、様々な種類の転送方法を取り扱う事が可能になります。

xxx.h
xxx.cpp

はじめに、描画関数を作成します。
引数はINovelEngineクラスのポインタとDrawTask構造体のconst参照、戻り値はvoid型となります。
転送方法の種類に応じた描画関数を実装してください。

PluginTemplate.cpp

描画関数をEXE側にエクスポートします。
RegisterPBltFunc(転送方法の種類, 描画関数の関数ポインタ)でOKです。

 

以上でプラグインの説明は終了です、作成する場合にはBasicCommandsも参考にしてください。