home *** CD-ROM | disk | FTP | other *** search
/ Fun CD 26 / OTACD26.ISO / etc / nawkk / yane0310 / ygs2k156.lzh / source / TScript.cpp < prev    next >
C/C++ Source or Header  |  2000-03-11  |  56KB  |  1,538 lines

  1. // TScript.cpp
  2.  
  3. #include "TScript.h"
  4.  
  5. //////////////////////////////////////////////////////////////////////////////
  6. #ifdef StartUp        //    スタートアップルーチンは必要なのか?
  7. //////////////////////////////////////////////////////////////////////////////
  8. //    スクリプトコンパイラーのシーン描画関数
  9. //////////////////////////////////////////////////////////////////////////////
  10. SCENE_DEFINE(GameStart) {
  11.     SCENE_STATIC(TScript,cmp){
  12.         if (cmp->m_nDebugMode!=0) {
  13.             cmp->SetDebugMode(((cmp->m_nDebugMode-1) & 2)!=0);    // デバッグ用スクリプトのアセンブルファイル出力
  14.             ErrorlogOutputEnable(((cmp->m_nDebugMode-1) & 1)!=0); // デバッグ用内部エラー出力
  15.         }
  16.         cmp->SetInstructionAreaSize(TInstructionArea);
  17.         LRESULT hr;
  18.         hr = cmp->Load("script/gamestart.c",false);
  19.         if (hr<0){
  20.             //    ファイルが存在しなければダイアログを開いて、実行するファイルを問い合わせる
  21.             CYFileDialog file;
  22.             char buf[256];
  23.             file.SetFileExt("c");
  24.             if (file.GetOpenFileName(buf)!=0 || cmp->Load(buf,false)!=0) {
  25.                 ysFrame.ReturnScene();    // それだけなのよん
  26.                 ysFrame.SetGameExit(NULL);    // 終了したときに呼び出される関数
  27.                 return ;
  28.             }
  29.         } else if (hr>0) {    // コンパイルエラー
  30.             ysFrame.ReturnScene();    // それだけなのよん
  31.             ysFrame.SetGameExit(NULL);    // 終了したときに呼び出される関数
  32.             return ;
  33.         }
  34.     }
  35.     SCENE_INITIALIZER;
  36.     LRESULT hr = cmp->ReExecute();
  37.     if (hr==0) {
  38.         ysFrame.ReturnScene();    // 実行終了
  39.         ysFrame.SetGameExit(NULL);    // 終了したときに呼び出される関数
  40.         //    正常終了なのだから、確認は不要
  41.         return ;
  42.     }
  43. }
  44. //////////////////////////////////////////////////////////////////////////////
  45. LRESULT Goodbye(void){
  46.     bool b = ysFrame.YesNo("確認","本当に終了するのですか?");
  47.     if (b) return 0; else return 1;
  48. }
  49. //////////////////////////////////////////////////////////////////////////////
  50. //    フレームワークからウィンドゥの生成前に呼び出される。
  51. //////////////////////////////////////////////////////////////////////////////
  52. void GameMain(void) {
  53.     ErrorlogOutputEnable(false); // デバッグ用エラー出力
  54.     ysFrame.SetAppName("YaneGameScript2000Platform");
  55.     ysFrame.SetNextScene(GameStart); // 次に表示するシーンの設定
  56.     ysWindow.SetWindowStyle(WS_VISIBLE|WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX);    //    最大化ボタンは付けない
  57.     ysFrame.SetGameExit(Goodbye); // 終了したときに呼び出される関数
  58.     ysDraw.SetDisplayMode(WindowMode,640,480,8);
  59.     ysFrame.SetMultiApp(false);
  60.  
  61.     //    イニシャライザを起動
  62.     LRESULT hr;
  63.     TScript cmp;
  64.     cmp.SetInstructionAreaSize(TInstructionArea);
  65.     hr = cmp.Load("script/gameinit.c",false);
  66.     if (hr==0) {
  67.         cmp.ReExecute();
  68.     } else if (hr>0) {    // コンパイルエラー(ファイルが存在しないのはOK)
  69.         ysFrame.SetGameExit(NULL);    // 終了したときに呼び出される関数
  70.         ysFrame.Quit();    // それだけなのよん
  71.         return ;
  72.     }
  73. }
  74. #endif
  75.  
  76.  
  77. //////////////////////////////////////////////////////////////////////////////
  78. //    ディフォルトイニシャライザの用意
  79. //////////////////////////////////////////////////////////////////////////////
  80. #ifdef DefaultTScript        //    ディフォルトイニシャライザが必要なのか?
  81. void TScript::Initialize(void) { }
  82. void TScript::Terminate(void) { }
  83. #endif
  84. //////////////////////////////////////////////////////////////////////////////
  85.  
  86. //////////////////////////////////////////////////////////////////////////////
  87. //    スクリプト関数の定義
  88. //////////////////////////////////////////////////////////////////////////////
  89. TScript* TScript::m_this = NULL;
  90.  
  91. TScript::TScript(void){
  92.     m_this = this;    //    掟破り:p
  93.  
  94.     //    staticなCSoundは不可。(デストラクタで処理が利かないため)
  95.     m_sound        =    new CSound        [m_nSoundMax];
  96.     m_plane        =    new CPlane        [m_nPlaneMax];
  97.     m_gametime    =    new CGameTime    [m_nGameTimeMax];
  98.     m_fpslayer    =    new CFPSLayer;
  99.     m_textlayer    =    new CTextLayer    [m_nTextLayerMax];
  100.  
  101.     m_alpString = new LPSTR [m_nStringMax];
  102.     for(int i=0;i<m_nStringMax;i++) {
  103.         m_alpString[i] = new char[m_nStringLength];
  104.     }
  105.     m_lpszSenarioString = new char[m_nStringLength];
  106.  
  107.     //    Randomize
  108.     srand((unsigned)CTimeBase::timeGetTime());    //    これで十分でしょう
  109.  
  110.     /////////////////////////////////////////////////////////////////
  111.     //                ユーザー公開関数の登録
  112.     /////////////////////////////////////////////////////////////////
  113.  
  114.     //    デバッグ用
  115.     RegistUserFunction("InnerLog",InnerLog);
  116.     RegistUserFunction("InnerLogMes",InnerLogMes);
  117.     
  118.     //    Wave
  119.     RegistUserFunction("LoadWave",LoadWave);
  120.     RegistUserFunction("PlayWave",PlayWave);
  121.     RegistUserFunction("StopWave",StopWave);
  122.     RegistUserFunction("PauseWave",PauseWave);
  123.     RegistUserFunction("ReplayWave",ReplayWave);
  124.     RegistUserFunction("IsPlayWave",IsPlayWave);
  125.     RegistUserFunction("ReleaseWave",ReleaseWave);
  126.     RegistUserFunction("ReleaseWaveAll",ReleaseWaveAll);
  127.     RegistUserFunction("SetLoopModeWave",SetLoopModeWave);
  128.     RegistUserFunction("SetVolumeWave",SetVolumeWave);
  129.     RegistUserFunction("SetVolumeWaveAll",SetVolumeWaveAll);
  130.     RegistUserFunction("SetWaveFormat",SetWaveFormat);
  131.     
  132.     //    CD関連
  133.     RegistUserFunction("OpenCD",OpenCD);
  134.     RegistUserFunction("CloseCD",CloseCD);
  135.     RegistUserFunction("StopCD",StopCD);
  136.     RegistUserFunction("PauseCD",PauseCD);
  137.     RegistUserFunction("ReplayCD",ReplayCD);
  138.     RegistUserFunction("PlayCDFromStart",PlayCDFromStart);
  139.     RegistUserFunction("PlayCD",PlayCD);
  140.     RegistUserFunction("PlayCDFromTo",PlayCDFromTo);
  141.     RegistUserFunction("PlayCDPos",PlayCDPos);
  142.     RegistUserFunction("IsPlayCD",IsPlayCD);
  143.     RegistUserFunction("SetLoopModeCD",SetLoopModeCD);
  144.     RegistUserFunction("GetSongMaxCD",GetSongMaxCD);
  145.     RegistUserFunction("GetCurrentPosCD",GetCurrentPosCD);
  146.     RegistUserFunction("EjectCD",EjectCD);
  147.     RegistUserVariable("SongLengthCD",(LONG&)ysCD.m_dwSongLength);
  148.     RegistUserVariable("SongStartCD",(LONG&)ysCD.m_dwSongStart);
  149.  
  150.     //    MIDI関連
  151.     RegistUserFunction("LoadMIDI",LoadMIDI);
  152.     RegistUserFunction("PlayMIDI",PlayMIDI);
  153.     RegistUserFunction("StopMIDI",StopMIDI);
  154.     RegistUserFunction("PauseMIDI",PauseMIDI);
  155.     RegistUserFunction("ReplayMIDI",ReplayMIDI);
  156.     RegistUserFunction("ReleaseMIDI",ReleaseMIDI);
  157.     RegistUserFunction("IsPlayMIDI",IsPlayMIDI);
  158.     RegistUserFunction("SetLoopModeMIDI",SetLoopModeMIDI);
  159.  
  160.     //    Bitmap関連
  161.     RegistUserFunction("GetBpp",GetBpp);
  162.     RegistUserFunction("LoadBitmap",LoadBitmapFile);
  163.     RegistUserFunction("LoadBitmapW",LoadBitmapFileW);
  164.     RegistUserFunction("SaveBitmap",SaveBitmapFile);
  165.     RegistUserFunction("ReleaseBitmap",ReleaseBitmap);
  166.     RegistUserFunction("GetPlaneSize",GetPlaneSize);
  167.     RegistUserFunction("SetColorKeyRGB",SetColorKeyRGB);
  168.     RegistUserFunction("SetColorKeyPos",SetColorKeyPos);
  169.     RegistUserFunction("ClearSecondary",ClearSecondary);
  170.     RegistUserFunction("ClearSecondaryRect",ClearSecondaryRect);
  171.     RegistUserFunction("SetFillColor",SetFillColor);
  172.     RegistUserFunction("SetFillColorRGB",SetFillColorRGB);
  173.     RegistUserFunction("Blt",Blt);
  174.     RegistUserFunction("BltRect",BltRect);
  175.     RegistUserFunction("BltFast",BltFast);
  176.     RegistUserFunction("BltFastRect",BltFastRect);
  177.     RegistUserFunction("BlendBlt",BlendBlt);
  178.     RegistUserFunction("BlendBltRect",BlendBltRect);
  179.     RegistUserFunction("ClipBlt",ClipBlt);
  180.     RegistUserFunction("ClipBltRect",ClipBltRect);
  181.     RegistUserFunction("ClipBltFast",ClipBltFast);
  182.     RegistUserFunction("ClipBltFastRect",ClipBltFastRect);
  183.     RegistUserFunction("ClipBlendBlt",ClipBlendBlt);
  184.     RegistUserFunction("ClipBlendBltRect",ClipBlendBltRect);
  185.     RegistUserFunction("BltR",BltR);
  186.     RegistUserFunction("BltRectR",BltRectR);
  187.     RegistUserFunction("BltFastR",BltFastR);
  188.     RegistUserFunction("BltFastRectR",BltFastRectR);
  189.     RegistUserFunction("BlendBltR",BlendBltR);
  190.     RegistUserFunction("BlendBltRectR",BlendBltRectR);
  191.     RegistUserFunction("ClipBltR",ClipBltR);
  192.     RegistUserFunction("ClipBltRectR",ClipBltRectR);
  193.     RegistUserFunction("ClipBltFastR",ClipBltFastR);
  194.     RegistUserFunction("ClipBltFastRectR",ClipBltFastRectR);
  195.     RegistUserFunction("ClipBlendBltR",ClipBlendBltR);
  196.     RegistUserFunction("ClipBlendBltRectR",ClipBlendBltRectR);
  197.     RegistUserFunction("EnableBlendColorKey",EnableBlendColorKey);
  198.     RegistUserFunction("FlushBlt",FlushBlt);
  199.     RegistUserFunction("MosaicBlt",MosaicBlt);
  200.  
  201.     RegistUserFunction("CreateSurface",CreateSurface);
  202.     RegistUserFunction("SwapToSecondary",SwapToSecondary);
  203.     RegistUserFunction("SetSecondaryOffset",SetSecondaryOffset);
  204.  
  205.     //    FPS関連
  206.     RegistUserFunction("SetFPS",SetFPS);
  207.     RegistUserFunction("GetFPS",GetFPS);
  208.     RegistUserFunction("GetRealFPS",GetRealFPS);
  209.     RegistUserFunction("ResetTime",ResetTime);
  210.     RegistUserFunction("GetTime",GetTime);
  211.     RegistUserFunction("PauseTime",PauseTime);
  212.     RegistUserFunction("RestartTime",RestartTime);
  213.     RegistUserFunction("PauseTimeAll",PauseTimeAll);
  214.     RegistUserFunction("RestartTimeAll",RestartTimeAll);
  215.     
  216.     // FPS表示関連
  217.     RegistUserFunction("FPSLayerOn",FPSLayerOn);
  218.     RegistUserFunction("FPSLayerOff",FPSLayerOff);
  219.     
  220.     //    画面効果関連
  221.     RegistUserFunction("SetBrightness",SetBrightness);
  222.     RegistUserFunction("RealizePalette",RealizePalette);
  223.     RegistUserFunction("FlushPalette",FlushPalette);
  224.     RegistUserFunction("SetSystemMemoryUse",SetSystemMemoryUse);
  225.  
  226.     //    文字表示関連
  227.     RegistUserFunction("TextLayerOn",TextLayerOn);
  228.     RegistUserFunction("TextLayerOff",TextLayerOff);
  229.     RegistUserFunction("TextMove",TextMove);
  230.     RegistUserFunction("TextOut",TextOut);
  231.     RegistUserFunction("TextSize",TextSize);
  232.     RegistUserFunction("TextHeight",TextHeight);
  233.     RegistUserFunction("TextColor",TextColor);
  234.     RegistUserFunction("TextBackColor",TextBackColor);
  235.     RegistUserFunction("TextBackColorDisable",TextBackColorDisable);
  236.     RegistUserFunction("TextFont",TextFont);
  237.     RegistUserFunction("TextBlend",TextBlend);
  238.     RegistUserFunction("TextBlt",TextBlt);
  239.     RegistUserFunction("TextGetSize",TextGetSize);
  240.     
  241.     //    文字列操作関数
  242.     RegistUserFunction("strcpy",strcpy);
  243.     RegistUserFunction("strncpy",strncpy);
  244.     RegistUserFunction("strcat",strcat);
  245.     RegistUserFunction("sprintf",sprintf);
  246.  
  247.     RegistUserFunction("sprintf0",sprintf0);    //    互換性のため残す
  248.     RegistUserFunction("sprintf1",sprintf1);
  249.     RegistUserFunction("sprintf2",sprintf2);
  250.     RegistUserFunction("sprintf3",sprintf3);
  251.  
  252.     //    キー入力関数
  253.     RegistUserFunction("KeyInput",KeyInput);
  254.     RegistUserFunction("IsPressUpKey",IsPressUpKey);
  255.     RegistUserFunction("IsPressDownKey",IsPressDownKey);
  256.     RegistUserFunction("IsPressLeftKey",IsPressLeftKey);
  257.     RegistUserFunction("IsPressRightKey",IsPressRightKey);
  258.     RegistUserFunction("IsPressReturnKey",IsPressReturnKey);
  259.     RegistUserFunction("IsPressSpaceKey",IsPressSpaceKey);
  260.     RegistUserFunction("IsPressEscKey",IsPressEscKey);
  261.     RegistUserFunction("IsPushUpKey",IsPushUpKey);
  262.     RegistUserFunction("IsPushDownKey",IsPushDownKey);
  263.     RegistUserFunction("IsPushLeftKey",IsPushLeftKey);
  264.     RegistUserFunction("IsPushRightKey",IsPushRightKey);
  265.     RegistUserFunction("IsPushReturnKey",IsPushReturnKey);
  266.     RegistUserFunction("IsPushSpaceKey",IsPushSpaceKey);
  267.     RegistUserFunction("IsPushEscKey",IsPushEscKey);
  268.     RegistUserFunction("IsPushKey",IsPushKey);            //    汎用Key
  269.     RegistUserFunction("IsPressKey",IsPressKey);
  270.     RegistUserFunction("IsPushJoyKey",IsPushJoyKey);    //    汎用JoyStick
  271.     RegistUserFunction("IsPressJoyKey",IsPressJoyKey);
  272.     RegistUserFunction("SetJoyButtonMax",SetJoyButtonMax);
  273.     RegistUserFunction("IsPushMIDIKey",IsPushMIDIKey);    //    汎用MIDI
  274.     RegistUserFunction("IsPressMIDIKey",IsPressMIDIKey);
  275.     RegistUserFunction("GetVelocityMIDIKey",GetVelocityMIDIKey);
  276.     RegistUserFunction("MouseLayerOn",MouseLayerOn);    //    Mouse入力
  277.     RegistUserFunction("MouseLayerOff",MouseLayerOff);
  278.     RegistUserFunction("GetMouseInfo",GetMouseInfo);
  279.     RegistUserFunction("SetMouseInfo",SetMouseInfo);
  280.     
  281.     //    バックアッププレーン
  282.     RegistUserFunction("EnableBackupPlane",EnableBackupPlane);
  283.     RegistUserFunction("DisableBackupPlane",DisableBackupPlane);
  284.     RegistUserFunction("SnapToBackupPlane",SnapToBackupPlane);
  285.     RegistUserFunction("BltFromBackupPlane",BltFromBackupPlane);
  286.     RegistUserFunction("SaveBackupPlane",SaveBackupPlane);
  287.  
  288.     //    シナリオ機能
  289.     RegistUserFunction("OpenSenario",OpenSenario);
  290.     RegistUserFunction("ReadSenario",ReadSenario);
  291.     RegistUserFunction("OpenSenario2",OpenSenario2);
  292.     RegistUserFunction("ReadSenarioToString",ReadSenarioToString);
  293.     RegistUserFunction("ReadLineToString",ReadLineToString);
  294.  
  295.     //    ディスプレイモードの変更
  296.     RegistUserFunction("SetDisplayMode",SetDisplayMode);
  297.     RegistUserFunction("ChangeDisplayMode",ChangeDisplayMode);
  298.  
  299.     //    ファイル入出力
  300.     RegistUserFunction("LoadFile",LoadFile);
  301.     RegistUserFunction("SaveFile",SaveFile);
  302.  
  303.     //    new,delete
  304.     TMemory.clear();
  305.     RegistUserFunction("new",NewMemory);
  306.     RegistUserFunction("delete",DeleteMemory);
  307.  
  308.     //  LoadLibrary,FreeLibrary
  309.     TLibrary.clear();
  310.     RegistUserFunction("LoadLibrary",LoadLibrary);
  311.     RegistUserFunction("FreeLibrary",FreeLibrary);
  312.     RegistUserFunction("GetFunction",GetFunction);
  313.  
  314.     //    その他
  315.     RegistUserFunction("Rand",Rand);
  316.     RegistUserFunction("GetCurrentDirectory",GetCurrentDirectory);
  317.     RegistUserFunction("SetCurrentDirectory",SetCurrentDirectory);
  318.     RegistUserFunction("SetConstParam",SetConstParam);
  319.     RegistUserFunction("GetConstParam",GetConstParam);
  320.  
  321.     //    ゲームフラグ管理
  322.     RegistUserFunction("LoadGameFlag",LoadGameFlag);
  323.     RegistUserFunction("SaveGameFlag",SaveGameFlag);
  324.     RegistUserFunction("LoadGameFlag2",LoadGameFlag2);
  325.     RegistUserFunction("SaveGameFlag2",SaveGameFlag2);
  326.     RegistUserFunction("ResetGameFlag",ResetGameFlag);
  327.     RegistUserFunction("ResetGameFlag2",ResetGameFlag2);
  328.  
  329.     // User変数
  330.     RegistUserVariable("gameflag",m_GameFlag[0]);
  331.     RegistUserVariable("gameflag2",m_GameFlag2[0]);
  332.     RegistUserVariable("string",(LONG&)m_alpString[0]);
  333.  
  334.     // イニシャライザでのみ呼び出される
  335.     RegistUserFunction("SetWindow",SetWindow);
  336.     RegistUserFunction("SetDebugMode",TSetDebugMode);
  337.  
  338.     Initialize();    //    各ゲーム専用初期化
  339. }
  340.  
  341.     /////////////////////////////////////////////////////////////////
  342. TScript::~TScript(){
  343.     DELETEPTR_SAFE(m_sound);
  344.     DELETEPTR_SAFE(m_plane);
  345.     DELETEPTR_SAFE(m_gametime);
  346.     DELETE_SAFE(m_fpslayer);
  347.     DELETEPTR_SAFE(m_textlayer);
  348.     for(int i=0;i<m_nStringMax;i++) {
  349.         DELETE_SAFE(m_alpString[i]);
  350.     }
  351.     DELETE_SAFE(m_alpString);
  352.     DELETE_SAFE(m_lpszSenarioString);
  353.  
  354.     DELETE_SAFE(m_yfpSenario);
  355.  
  356.     {
  357.         set<BYTE*>::iterator it = TMemory.begin();
  358.         while (it!=TMemory.end()) {    //    delete忘れをすべてdelete
  359.             delete *it;
  360.             it ++;
  361.         }
  362.         TMemory.clear();    //    一応クリア
  363.     }
  364.  
  365.     {
  366.         multiset<HINSTANCE>::iterator it = TLibrary.begin();
  367.         while (it!=TLibrary.end()) {    //    FreeLibrary忘れをすべてFreeLibrary
  368.             ::FreeLibrary(*it);
  369.             it ++;
  370.         }
  371.         TLibrary.clear();    //    一応クリア
  372.     }
  373.  
  374.     // mouse入力の解放
  375.     DELETE_SAFE(m_mouselayer);
  376.     DELETE_SAFE(m_mouseinput);
  377.  
  378.     Terminate();        //    各ゲーム専用終了コード
  379.  
  380.     ysDraw.EnableBackupPlane(false);    //    バックアッププレーンつぶしておく:p
  381.     ysDraw.SetFillColor(0);        // 余計なお世話か?
  382.     ysDraw.SetBrightness(256);
  383.     ysCD.Close();
  384. }
  385.  
  386. /////////////////////////////////////////////////////////////////////
  387. //    スクリプトでユーザーに一般公開している関数
  388. /////////////////////////////////////////////////////////////////////
  389.  
  390. //    デバッグ用
  391.  
  392. TUserFunc(TScript::InnerLog) {
  393.     char buf[256];
  394.     wsprintf(buf,"スクリプトから %d が出力されました",*p);
  395.     ::InnerLog(buf);
  396.     return 0;
  397. }
  398.  
  399. TUserFunc(TScript::InnerLogMes){
  400.     char buf[256];
  401.     wsprintf(buf,"スクリプトから %s が出力されました",*p);
  402.     ::InnerLog(buf);
  403.     return 0;
  404. }
  405.  
  406. /////////////////////////////////////////////////////////////////////
  407. //    Wave関連
  408. //        CSoundクラスを呼び出すだけだから、苦労はゼロ:p
  409.  
  410. CSound* TScript::m_sound = NULL;    // コンストラクタで確保しようね:p
  411.  
  412. TUserFunc(TScript::LoadWave)        {    return m_sound[*(p+1)].LoadWaveFile((LPSTR)*p);}
  413. TUserFunc(TScript::PlayWave)        {    return m_sound[*p].Play();    }
  414. TUserFunc(TScript::StopWave)        {    return m_sound[*p].Stop();    }
  415. TUserFunc(TScript::PauseWave)        {    return m_sound[*p].Pause();    }
  416. TUserFunc(TScript::ReplayWave)        {    return m_sound[*p].Replay();    }
  417. TUserFunc(TScript::IsPlayWave)        {    return m_sound[*p].IsPlay();}
  418. TUserFunc(TScript::SetLoopModeWave)    {    m_sound[*p].SetLoopMode(*(p+1)!=0); return 0; }
  419. TUserFunc(TScript::ReleaseWave)        {    return m_sound[*p].ReleaseWave();}
  420. TUserFunc(TScript::ReleaseWaveAll)    {
  421.     for(int i=0;i<m_nSoundMax;i++){
  422.         m_sound[i].ReleaseWave();
  423.     }
  424.     return 0;
  425. }
  426. TUserFunc(TScript::SetVolumeWave)    {    return m_sound[*p].SetVolume(*(p+1));}
  427. TUserFunc(TScript::SetVolumeWaveAll){
  428.     for(int i=0;i<m_nSoundMax;i++){
  429.         m_sound[i].SetVolume(*p);
  430.     }
  431.     return 0;
  432. }
  433. TUserFunc(TScript::SetWaveFormat)    {    return ysSound.SetFormat((int)*p); }
  434.  
  435. /////////////////////////////////////////////////////////////////////
  436. //    MIDI関連
  437. //        MIDIクラスを呼び出すだけだから、苦労はゼロ:p
  438.  
  439. TUserFunc(TScript::LoadMIDI)        {    return ysMIDIOut.Open((LPSTR)*p); }
  440. TUserFunc(TScript::PlayMIDI)        {    return ysMIDIOut.Play(); }
  441. TUserFunc(TScript::StopMIDI)        {    return ysMIDIOut.Stop(); }
  442. TUserFunc(TScript::PauseMIDI)        {    return ysMIDIOut.Pause(); }
  443. TUserFunc(TScript::ReplayMIDI)        {    return ysMIDIOut.Replay(); }
  444. TUserFunc(TScript::ReleaseMIDI)        {    return ysMIDIOut.Close(); }
  445. TUserFunc(TScript::IsPlayMIDI)        {    return ysMIDIOut.IsPlay(); }
  446. TUserFunc(TScript::SetLoopModeMIDI)    {    return ysMIDIOut.SetLoopMode(*p!=0); }
  447.  
  448. /////////////////////////////////////////////////////////////////////
  449. //    CDDA関連
  450. //        CDDAクラスを呼び出すだけだから、苦労はゼロ:p
  451.  
  452. TUserFunc(TScript::OpenCD)    { return ysCD.Open();    }
  453. TUserFunc(TScript::CloseCD)    { return ysCD.Close();    }
  454. TUserFunc(TScript::StopCD)    { return ysCD.Stop();    }
  455. TUserFunc(TScript::PauseCD)    { return ysCD.Pause();    }
  456. TUserFunc(TScript::ReplayCD){ return ysCD.Replay(); }
  457.  
  458. TUserFunc(TScript::IsPlayCD){
  459.     if (ysCD.IsPlay()) return 1; else return 0;
  460. }
  461.  
  462. TUserFunc(TScript::PlayCDFromStart)    { return ysCD.Play(); }
  463. TUserFunc(TScript::PlayCD)            { return ysCD.Play(*p);    }
  464. TUserFunc(TScript::PlayCDFromTo)    { return ysCD.Play(*p,*(p+1)); }
  465. TUserFunc(TScript::PlayCDPos)        { return ysCD.PlayDW(*p,*(p+1)); }
  466. TUserFunc(TScript::SetLoopModeCD)    { ysCD.SetLoopMode(*p!=0); return 0;}
  467. TUserFunc(TScript::GetSongMaxCD)    { return ysCD.GetSongMax();}
  468. TUserFunc(TScript::GetCurrentPosCD)    { DWORD dw; ysCD.GetCurrentPos(dw); return dw; }
  469. TUserFunc(TScript::EjectCD)            { return ysCD.Eject(*p!=0);    }
  470.  
  471. /////////////////////////////////////////////////////////////////////
  472. //    Bitmap関連
  473. //        CPlaneクラスを呼び出すだけだから、苦労はゼロ:p
  474.  
  475. CPlane* TScript::m_plane = NULL;    // コンストラクタで確保しようね:p
  476.  
  477. TUserFunc(TScript::GetBpp)            { return CPlane::GetBpp(); }
  478. TUserFunc(TScript::LoadBitmapFile)    { return m_plane[*(p+1)].LoadBitmapFile((LPSTR)*p,*(p+2)!=0); }
  479. TUserFunc(TScript::LoadBitmapFileW)    { return m_plane[*(p+2)].LoadBitmapFileW((LPSTR)*p,(LPSTR)*(p+1),*(p+3)!=0); }
  480. TUserFunc(TScript::SaveBitmapFile)    {
  481.     RECT rc;
  482.     SetRect(&rc,*(p+2),*(p+3),*(p+2) + *(p+4),*(p+3) + *(p+5));
  483.     return m_plane[*(p+1)].SaveBitmapFile((LPSTR)*p,rc);
  484. }
  485. TUserFunc(TScript::ReleaseBitmap)    { return m_plane[*p].ReleaseBitmap(); }
  486. TUserFunc(TScript::GetPlaneSize)    { m_plane[*p].GetSize((int&)*(long*)*(p+1),(int&)*(long*)*(p+2)); return 0; }
  487. TUserFunc(TScript::SetColorKeyRGB)    { return m_plane[*p].SetColorKey(RGB(*(p+1),*(p+2),*(p+3))); }
  488. TUserFunc(TScript::SetColorKeyPos)    { return m_plane[*p].SetColorKey(*(p+1),*(p+2)); }
  489. TUserFunc(TScript::ClearSecondary)    { return ysDraw.ClearSecondary(); }
  490. TUserFunc(TScript::ClearSecondaryRect)    {
  491.     RECT r;
  492.     SetRect(&r,*p,*(p+1),*p + *(p+2),*(p+1) + *(p+3));
  493.     return ysDraw.ClearSecondary(r);
  494. }
  495. TUserFunc(TScript::SetFillColor)    { ysDraw.SetFillColor(*p); return 0; }
  496. TUserFunc(TScript::SetFillColorRGB)    { ysDraw.SetFillColorRGB(RGB(*p,*(p+1),*(p+2))); return 0; }
  497.  
  498. TUserFunc(TScript::Blt)                { m_plane[*p].Blt(*(p+1),*(p+2)); return 0; }
  499. TUserFunc(TScript::BltRect)            {
  500.     RECT sr;
  501.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));
  502.     m_plane[*p].Blt(*(p+1),*(p+2),sr);
  503.     return 0;
  504. }
  505. TUserFunc(TScript::BltFast)            { m_plane[*p].BltFast(*(p+1),*(p+2)); return 0; }
  506. TUserFunc(TScript::BltFastRect)        {
  507.     RECT sr;
  508.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));
  509.     m_plane[*p].BltFast(*(p+1),*(p+2),sr);
  510.     return 0;
  511. }
  512. TUserFunc(TScript::BlendBlt)        {
  513.     return m_plane[*p].BlendBlt(*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6),*(p+7),*(p+8));
  514. }
  515. TUserFunc(TScript::BlendBltRect)            {
  516.     RECT sr;
  517.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));
  518.     return m_plane[*p].BlendBlt(*(p+1),*(p+2),sr,*(p+7),*(p+8),*(p+9),*(p+10),*(p+11),*(p+12));
  519. }
  520.  
  521.     //    転送先Clip系
  522. TUserFunc(TScript::ClipBlt)                {
  523.     RECT sr;
  524.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));
  525.     m_plane[*p].ClipBlt(*(p+1),*(p+2),sr);
  526.     return 0;
  527. }
  528. TUserFunc(TScript::ClipBltRect)            {
  529.     RECT sr;
  530.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));
  531.     RECT clip;
  532.     SetRect(&clip,*(p+7),*(p+8),*(p+7)+*(p+9),*(p+8)+*(p+10));
  533.     m_plane[*p].ClipBlt(*(p+1),*(p+2),sr,clip);
  534.     return 0;
  535. }
  536. TUserFunc(TScript::ClipBltFast)            {
  537.     RECT sr;
  538.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));
  539.     m_plane[*p].ClipBltFast(*(p+1),*(p+2),sr);
  540.     return 0;
  541. }
  542. TUserFunc(TScript::ClipBltFastRect)        {
  543.     RECT sr;
  544.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));
  545.     RECT clip;
  546.     SetRect(&clip,*(p+7),*(p+8),*(p+7)+*(p+9),*(p+8)+*(p+10));
  547.     m_plane[*p].ClipBltFast(*(p+1),*(p+2),sr,clip);
  548.     return 0;
  549. }
  550. TUserFunc(TScript::ClipBlendBlt)                {
  551.     RECT clip;
  552.     SetRect(&clip,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));        //    転送先矩形
  553.     return m_plane[*p].ClipBlendBlt(*(p+1),*(p+2),*(p+7),*(p+8),*(p+9),*(p+10),*(p+11),*(p+12),clip);
  554. }
  555. TUserFunc(TScript::ClipBlendBltRect)            {
  556.     RECT sr;
  557.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));        //    転送元矩形
  558.     RECT clip;
  559.     SetRect(&clip,*(p+7),*(p+8),*(p+7)+*(p+9),*(p+8)+*(p+10));    //    転送先クリッピング
  560.     return m_plane[*p].ClipBlendBlt(*(p+1),*(p+2),sr,*(p+11),*(p+12),*(p+13),*(p+14),*(p+15),*(p+16),clip);
  561. }
  562.  
  563. //    拡大縮小機能付
  564. TUserFunc(TScript::BltR)            { m_plane[*p].Blt(*(p+1),*(p+2),(double)*(p+3)/65536,(double)*(p+4)/65536); return 0; }
  565. TUserFunc(TScript::BltRectR)        {
  566.     RECT sr;
  567.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));
  568.     m_plane[*p].Blt(*(p+1),*(p+2),sr,(double)*(p+7)/65536,(double)*(p+8)/65536);
  569.     return 0;
  570. }
  571. TUserFunc(TScript::BltFastR)        { m_plane[*p].BltFast(*(p+1),*(p+2),(double)*(p+3)/65536,(double)*(p+4)/65536); return 0; }
  572. TUserFunc(TScript::BltFastRectR)    {
  573.     RECT sr;
  574.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));
  575.     m_plane[*p].BltFast(*(p+1),*(p+2),sr,(double)*(p+7)/65536,(double)*(p+8)/65536);
  576.     return 0;
  577. }
  578. TUserFunc(TScript::BlendBltR)        {
  579.     return m_plane[*p].BlendBlt(*(p+1),*(p+2),*(p+3),*(p+4),*(p+5),*(p+6),*(p+7),*(p+8),(double)*(p+9)/65536,(double)*(p+10)/65536);
  580. }
  581. TUserFunc(TScript::BlendBltRectR)    {
  582.     RECT sr;
  583.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));
  584.     return m_plane[*p].BlendBlt(*(p+1),*(p+2),sr,*(p+7),*(p+8),*(p+9),*(p+10),*(p+11),*(p+12),(double)*(p+13)/65536,(double)*(p+14)/65536);
  585. }
  586. TUserFunc(TScript::ClipBltR)        {
  587.     RECT sr;
  588.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));
  589.     m_plane[*p].ClipBlt(*(p+1),*(p+2),sr,(double)*(p+7)/65536,(double)*(p+8)/65536);
  590.     return 0;
  591. }
  592. TUserFunc(TScript::ClipBltRectR)    {
  593.     RECT sr;
  594.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));
  595.     RECT clip;
  596.     SetRect(&clip,*(p+7),*(p+8),*(p+7)+*(p+9),*(p+8)+*(p+10));
  597.     m_plane[*p].ClipBlt(*(p+1),*(p+2),sr,clip,(double)*(p+11)/65536,(double)*(p+12)/65536);
  598.     return 0;
  599. }
  600. TUserFunc(TScript::ClipBltFastR)    {
  601.     RECT sr;
  602.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));
  603.     m_plane[*p].ClipBltFast(*(p+1),*(p+2),sr,(double)*(p+7)/65536,(double)*(p+8)/65536);
  604.     return 0;
  605. }
  606. TUserFunc(TScript::ClipBltFastRectR){
  607.     RECT sr;
  608.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));
  609.     RECT clip;
  610.     SetRect(&clip,*(p+7),*(p+8),*(p+7)+*(p+9),*(p+8)+*(p+10));
  611.     m_plane[*p].ClipBltFast(*(p+1),*(p+2),sr,clip,(double)*(p+11)/65536,(double)*(p+12)/65536);
  612.     return 0;
  613. }
  614. TUserFunc(TScript::ClipBlendBltR)    {
  615.     RECT clip;
  616.     SetRect(&clip,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));        //    転送先矩形
  617.     return m_plane[*p].ClipBlendBlt(*(p+1),*(p+2),*(p+7),*(p+8),*(p+9),*(p+10),*(p+11),*(p+12),clip,(double)*(p+13)/65536,(double)*(p+14)/65536);
  618. }
  619. TUserFunc(TScript::ClipBlendBltRectR){
  620.     RECT sr;
  621.     SetRect(&sr,*(p+3),*(p+4),*(p+3)+*(p+5),*(p+4)+*(p+6));        //    転送元矩形
  622.     RECT clip;
  623.     SetRect(&clip,*(p+7),*(p+8),*(p+7)+*(p+9),*(p+8)+*(p+10));    //    転送先クリッピング
  624.     return m_plane[*p].ClipBlendBlt(*(p+1),*(p+2),sr,*(p+11),*(p+12),*(p+13),*(p+14),*(p+15),*(p+16),clip,(double)*(p+17)/65536,(double)*(p+18)/65536);
  625. }
  626. TUserFunc(TScript::EnableBlendColorKey){
  627.     m_plane[*p].EnableBlendColorKey(*(p+1)!=0);
  628.     return 0;
  629. }
  630. TUserFunc(TScript::FlushBlt)        {    //    added '99/12/1
  631.     RECT sr;
  632.     SetRect(&sr,*(p+1),*(p+2),*(p+1)+*(p+3),*(p+2)+*(p+4));
  633.     return m_plane[*p].FlushBlt(sr);
  634. }
  635. TUserFunc(TScript::MosaicBlt)        {    //    added '99/12/1
  636.     RECT sr;
  637.     SetRect(&sr,*(p+1),*(p+2),*(p+1)+*(p+3),*(p+2)+*(p+4));
  638.     return m_plane[*p].MosaicBlt(sr,*(p+5));
  639. }
  640.  
  641. TUserFunc(TScript::CreateSurface){
  642.     return m_plane[*p].CreateSurface(*(p+1),*(p+2));
  643. }
  644. TUserFunc(TScript::SwapToSecondary){
  645.     return m_plane[*p].SwapToSecondary();
  646. }
  647. TUserFunc(TScript::SetSecondaryOffset){
  648.     return ysDraw.SetSecondaryOffset(*p,*(p+1));
  649. }
  650.  
  651. /////////////////////////////////////////////////////////////////////
  652. //    タイマー関連
  653.  
  654. CGameTime* TScript::m_gametime = NULL;
  655.  
  656. TUserFunc(TScript::SetFPS)            { ysTime.SetFPS(*p); return 0; }
  657. TUserFunc(TScript::GetFPS)            { return ysTime.GetFPS(); }
  658. TUserFunc(TScript::GetRealFPS)        { return ysTime.GetRealFPS(); }
  659. TUserFunc(TScript::ResetTime)        { m_gametime[*p].ResetTime(); return 0; }
  660. TUserFunc(TScript::GetTime)            { return m_gametime[*p].GetTime(); }
  661. TUserFunc(TScript::PauseTime)        { m_gametime[*p].PauseTime(); return 0; }
  662. TUserFunc(TScript::RestartTime)        { m_gametime[*p].RestartTime(); return 0; }
  663. TUserFunc(TScript::PauseTimeAll)    { return m_gametime[*p].PauseTimeAll(); }
  664. TUserFunc(TScript::RestartTimeAll)    { return m_gametime[*p].RestartTimeAll(); }
  665.  
  666. /////////////////////////////////////////////////////////////////////
  667. //    FPS表示関連
  668.  
  669. CFPSLayer*    TScript::m_fpslayer = NULL;
  670.  
  671. TUserFunc(TScript::FPSLayerOn)        { LayerScreen += m_fpslayer; m_fpslayer->Move(*p,*(p+1)); return 0; }
  672. TUserFunc(TScript::FPSLayerOff)        { LayerScreen -= m_fpslayer; return 0; }
  673.  
  674. /////////////////////////////////////////////////////////////////////
  675. //    画面効果関連
  676.  
  677. TUserFunc(TScript::SetBrightness)        {    ysDraw.SetBrightness(*p); return 0; }
  678. TUserFunc(TScript::RealizePalette)        {    ysDraw.RealizePalette(m_plane[*p]); return 0; }
  679. TUserFunc(TScript::FlushPalette)        {    ysDraw.FlushPalette(); return 0; }
  680. TUserFunc(TScript::SetSystemMemoryUse)    {    ysDraw.SetSystemMemoryUse(*p!=0); return 0; }
  681.  
  682. /////////////////////////////////////////////////////////////////////
  683. //    文字列表示関連
  684.  
  685. CTextLayer*    TScript::m_textlayer = NULL;
  686.  
  687. TUserFunc(TScript::TextLayerOn)            {    LayerScreen += m_textlayer[*p]; m_textlayer[*p].Move(*(p+1),*(p+2)); return 0; }
  688. TUserFunc(TScript::TextLayerOff)        {    LayerScreen -= m_textlayer[*p]; return 0; }
  689. TUserFunc(TScript::TextMove)            {    m_textlayer[*p].Move(*(p+1),*(p+2)); return 0; }
  690. TUserFunc(TScript::TextOut)                {    m_textlayer[*p].SetText((LPSTR)*(p+1));    return 0; }
  691. TUserFunc(TScript::TextSize)            {    m_textlayer[*p].SetFontSize(*(p+1)); return 0; }
  692. TUserFunc(TScript::TextHeight)            {    m_textlayer[*p].SetHeight(*(p+1)); return 0; }
  693. TUserFunc(TScript::TextColor)            {    m_textlayer[*p].SetColor(RGB(*(p+1),*(p+2),*(p+3))); return 0; }
  694. TUserFunc(TScript::TextBackColor)        {    m_textlayer[*p].SetBackColor(RGB(*(p+1),*(p+2),*(p+3))); return 0; }
  695. TUserFunc(TScript::TextBackColorDisable){    m_textlayer[*p].SetBackColor(CLR_INVALID); return 0; }
  696. TUserFunc(TScript::TextFont)            {    
  697.     if (0<=*(p+1) && *(p+1)<=4) {
  698.         m_textlayer[*p].SetFont(*(p+1));    // 0から4か
  699.     } else {
  700.         m_textlayer[*p].SetFont((LPSTR)*(p+1));    // さもなくば文字列ポインタ
  701.     }
  702.     return 0;
  703. }
  704. TUserFunc(TScript::TextBlend)            {    m_textlayer[*p].SetBlend(*(p+1)); return 0; }
  705. TUserFunc(TScript::TextBlt)                {    
  706.     m_textlayer[*p].OnPaint();
  707.     //    textlayerの直接描画には、hdcも必要。
  708.     HDC hdc;
  709.     if (ysDraw.BeginPaintSecondary(hdc)==0){
  710.         m_textlayer[*p].OnPaint(hdc);
  711.         ysDraw.EndPaintSecondary();
  712.         return 0;
  713.     } else {
  714.         return 1;
  715.     }
  716. }
  717. TUserFunc(TScript::TextGetSize)            {    return m_textlayer[*p].GetSize((int&)*(int*)*(p+1),(int&)*(int*)*(p+2)); }
  718.  
  719. /////////////////////////////////////////////////////////////////////
  720. //    文字列操作関数
  721.  
  722. LPSTR* TScript::m_alpString;
  723.  
  724. TUserFunc(TScript::strcpy)                {    return (LONG)::strcpy((LPSTR)*p,(LPSTR)*(p+1)); }
  725. TUserFunc(TScript::strncpy)                {    // 漢字コードを考慮したn文字コピー
  726.     LPSTR p1 = (LPSTR)*p;
  727.     LPSTR p2 = (LPSTR)*(p+1);
  728.     int      n     = *(p+2);
  729.     for(;*p2!='\0' && n;n--,p1++){
  730.         *p1 = *(p2++);
  731.         //    漢字なのか?
  732.         if ((((BYTE)*p1)>=0x80 && ((BYTE)*p1)<=0xa0)||(((BYTE)*p1)>=0xe0 && ((BYTE)*p1)<=0xff)) *(++p1) = *(p2++);
  733.     }
  734.     *p1 = '\0';    //    終端文字だけ入れとかなくっちゃ!
  735.     return n;
  736. }
  737. TUserFunc(TScript::strcat)                {    return (LONG)::strcat((LPSTR)*p,(LPSTR)*(p+1)); }
  738. TUserFunc(TScript::sprintf)                {    ::wvsprintf((LPSTR)*p,(LPSTR)*(p+1),(va_list)(p+2)); return 0; }
  739.  
  740. TUserFunc(TScript::sprintf0)            {    ::wsprintf((LPSTR)*p,(LPSTR)*(p+1)); return 0; }
  741. TUserFunc(TScript::sprintf1)            {    ::wsprintf((LPSTR)*p,(LPSTR)*(p+1),*(p+2)); return 0; }
  742. TUserFunc(TScript::sprintf2)            {    ::wsprintf((LPSTR)*p,(LPSTR)*(p+1),*(p+2),*(p+3)); return 0; }
  743. TUserFunc(TScript::sprintf3)            {    ::wsprintf((LPSTR)*p,(LPSTR)*(p+1),*(p+2),*(p+3),*(p+4)); return 0; }
  744.  
  745. /////////////////////////////////////////////////////////////////////
  746. //    キー入力関数
  747.  
  748. TUserFunc(TScript::KeyInput)            {    KEY_INPUT; ysMIDIIn.GetKeyState(); return 0; }
  749.  
  750. TUserFunc(TScript::IsPressUpKey)        {    return RKEY_8; }
  751. TUserFunc(TScript::IsPressDownKey)        {    return RKEY_2; }
  752. TUserFunc(TScript::IsPressLeftKey)        {    return RKEY_4; }
  753. TUserFunc(TScript::IsPressRightKey)        {    return RKEY_6; }
  754. TUserFunc(TScript::IsPressSpaceKey)        {
  755.     if (TUSE_XZ_FOR_BUTTON) return RKEY_SPACE || KEYPRESS(DIK_Z);
  756.     return RKEY_SPACE;
  757. }
  758. TUserFunc(TScript::IsPressReturnKey)    {
  759.     if (TUSE_XZ_FOR_BUTTON) return RKEY_RETURN || KEYPRESS(DIK_X);
  760.     return RKEY_RETURN;
  761. }
  762.  
  763. TUserFunc(TScript::IsPressEscKey)        {    return RKEY_ESC;    }
  764.  
  765. TUserFunc(TScript::IsPushUpKey)            {    return KEY_8; }
  766. TUserFunc(TScript::IsPushDownKey)        {    return KEY_2; }
  767. TUserFunc(TScript::IsPushLeftKey)        {    return KEY_4; }
  768. TUserFunc(TScript::IsPushRightKey)        {    return KEY_6; }
  769. TUserFunc(TScript::IsPushSpaceKey)        {
  770.     if (TUSE_XZ_FOR_BUTTON) return KEY_SPACE || KEYPUSH(DIK_Z);
  771.     return KEY_SPACE;
  772. }
  773. TUserFunc(TScript::IsPushReturnKey)        {
  774.     if (TUSE_XZ_FOR_BUTTON) return KEY_RETURN || KEYPUSH(DIK_X);
  775.     return KEY_RETURN;
  776. }
  777.  
  778. TUserFunc(TScript::IsPushEscKey)        {    return KEY_ESC; }
  779. TUserFunc(TScript::IsPushKey)            {    return ysInput.IsKeyPushDown(*p); }
  780. TUserFunc(TScript::IsPressKey)            {    return ysInput.IsKeyPress(*p); }
  781. TUserFunc(TScript::IsPushJoyKey)        {    return ysJoy.IsKeyPushDown(*p); }
  782. TUserFunc(TScript::IsPressJoyKey)        {    return ysJoy.IsKeyPress(*p); }
  783. TUserFunc(TScript::SetJoyButtonMax)        {    ysJoy.SetButtonMax(*p); return 0;}
  784. TUserFunc(TScript::IsPushMIDIKey)        {    return ysMIDIIn.IsKeyPushDown(*p); }
  785. TUserFunc(TScript::IsPressMIDIKey)        {    return ysMIDIIn.IsKeyPress(*p); }
  786. TUserFunc(TScript::GetVelocityMIDIKey)    {    return ysMIDIIn.GetVelocity(*p); }
  787.  
  788. CMouseLayer* TScript::m_mouselayer = NULL;
  789. CMouseInput* TScript::m_mouseinput = NULL;
  790. TUserFunc(TScript::MouseLayerOn)        {
  791.     if (m_mouselayer!=NULL) {
  792.         m_mouselayer->SetPlane(&m_plane[*p],*(p+1),*(p+2));
  793.     } else {
  794.         m_mouselayer = new CMouseLayer(&m_plane[*p],*(p+1),*(p+2));
  795.     }
  796.     if (m_mouseinput==NULL) {
  797.         m_mouseinput = new CMouseInput;
  798.     }
  799.     return 0;
  800. }
  801. TUserFunc(TScript::MouseLayerOff)        {
  802.     DELETE_SAFE(m_mouselayer);
  803.     DELETE_SAFE(m_mouseinput);
  804.     return 0;
  805. }
  806. TUserFunc(TScript::GetMouseInfo)        {
  807.     if (m_mouseinput==NULL) return 1; // error
  808.     m_mouseinput->GetInfo((int&)*(int*)*p,(int&)*(int*)*(p+1),(int&)*(int*)*(p+2));
  809.     return 0;
  810. }
  811. TUserFunc(TScript::SetMouseInfo)        {
  812.     if (m_mouseinput==NULL) return 1; // error
  813.     m_mouseinput->SetXY((int)*p,(int)*(p+1));
  814.     return 0;
  815. }
  816.  
  817. /////////////////////////////////////////////////////////////////////
  818. //    バックアッププレーン
  819.  
  820. TUserFunc(TScript::EnableBackupPlane)    {    ysDraw.EnableBackupPlane(true);     return 0; }
  821. TUserFunc(TScript::DisableBackupPlane)    {    ysDraw.EnableBackupPlane(false); return 0; }
  822. TUserFunc(TScript::SnapToBackupPlane)    {    ysDraw.SnapToBackupPlane(); return 0; }
  823. TUserFunc(TScript::BltFromBackupPlane)    {    if (ysDraw.BltFromBackupPlane()) { ysDraw.ClearSecondary(); return 1; } else return 0; }
  824. TUserFunc(TScript::SaveBackupPlane)        {    return ysDraw.GetBackupPlane()->SaveBitmapFile((LPSTR)*p); }
  825.  
  826. /////////////////////////////////////////////////////////////////////
  827. //    シナリオ機能(要は、メッセージ表示機能)
  828.  
  829. CYFile* TScript::m_yfpSenario = NULL;
  830. int        TScript::m_nSenarioTextLayerNo = 0;
  831. LPSTR    TScript::m_lpszSenarioString = NULL;
  832.  
  833. TUserFunc(TScript::OpenSenario)        {
  834.     DELETE_SAFE(m_yfpSenario);    
  835.     m_yfpSenario = new CYFile;
  836.     //    ReadFile!!
  837.     if (m_yfpSenario->ReadFile((LPSTR)*p)!=0) {
  838.         DELETE_SAFE(m_yfpSenario);
  839.         return 2;    //    OpenError!!
  840.     }
  841.     m_nSenarioTextLayerNo = *(p+1);
  842.     return ReadSenario2();
  843. }
  844.  
  845. TUserFunc(TScript::ReadSenario)    {
  846.     KeyInput(NULL);
  847.     if (IsPushSpaceKey(NULL)) {
  848.         return ReadSenario2();
  849.     } else {
  850.         return 0;
  851.     }
  852. }
  853.  
  854. TUserFunc(TScript::OpenSenario2)    {
  855.     DELETE_SAFE(m_yfpSenario);    
  856.     m_yfpSenario = new CYFile;
  857.     //    ReadFile!!
  858.     if (m_yfpSenario->ReadFile((LPSTR)*p)!=0) {
  859.         DELETE_SAFE(m_yfpSenario);
  860.         return 2;    //    OpenError!!
  861.     }
  862.     return 0;
  863. }
  864.  
  865. TUserFunc(TScript::ReadSenarioToString)    {
  866.     if (m_yfpSenario==NULL) return 3;    //    呼ぶなっちゅーに!
  867.     if (m_yfpSenario->ReadLine2((LPSTR)*p)!=0) {
  868.         DELETE_SAFE(m_yfpSenario);
  869.         return 1;
  870.     }
  871.     return 0;
  872. }
  873.  
  874. TUserFunc(TScript::ReadLineToString)    {
  875.     if (m_yfpSenario==NULL) return 3;    //    呼ぶなっちゅーに!
  876.     if (m_yfpSenario->ReadLine((LPSTR)*p)!=0) {
  877.         DELETE_SAFE(m_yfpSenario);
  878.         return 1;
  879.     }
  880.     return 0;
  881. }
  882.  
  883.     /////////////////////////////////////////////////////////////////
  884.  
  885. long TScript::ReadSenario2(void){
  886.     if (m_yfpSenario==NULL) return 3;    //    呼ぶなっちゅーに!
  887.     if (m_yfpSenario->ReadLine2(m_lpszSenarioString)!=0) {
  888.         DELETE_SAFE(m_yfpSenario);
  889.         return 1;
  890.     }
  891.     m_textlayer[m_nSenarioTextLayerNo].SetText(m_lpszSenarioString);
  892.     return 0;
  893. }
  894.  
  895. /////////////////////////////////////////////////////////////////////
  896. //    ディスプレイモードの変更
  897.  
  898. int TScript::m_nDisplayMode1 = 0;
  899. int TScript::m_nDisplayMode2 = 1;
  900.  
  901. TUserFunc(TScript::SetDisplayMode)        { m_nDisplayMode1 = *p; m_nDisplayMode2 = *(p+1); return 0; }
  902. TUserFunc(TScript::ChangeDisplayMode)    {
  903.     int DisplayMode = 0;
  904.     switch (*p) {
  905.     case 1: DisplayMode = m_nDisplayMode1; break;
  906.     case 2: DisplayMode = m_nDisplayMode2; break;
  907.     default: return 1;    // Error!!
  908.     }
  909.     // DisplayMode 0:ScreenMode,1:FullScreen256,2:FullScreen64K,3:FullScreen16M,4:TrueColor
  910.     if (DisplayMode==0) {
  911.         return ysDraw.SetDisplayMode(WindowMode);
  912.     }
  913.  
  914.     ysDraw.BeginChangeDisplay();
  915.  
  916.     switch(DisplayMode){
  917.     case 1: break;
  918.     case 2: goto Disp16;
  919.     case 3: goto Disp24;
  920.     case 4: goto Disp32;
  921.     }
  922.  
  923.     //    FullScreenModeのときは、希望するモードにならなければ、その次の解像度にする。
  924.         ysDraw.TestDisplayMode(FullScreenMode,640,480,8);
  925. Disp16:
  926.         ysDraw.TestDisplayMode(FullScreenMode,640,480,16);
  927. Disp24:
  928.         ysDraw.TestDisplayMode(FullScreenMode,640,480,24);
  929. Disp32:
  930.         ysDraw.TestDisplayMode(FullScreenMode,640,480,32);
  931.         ysDraw.TestDisplayMode(WindowMode,640,480,0); // Windowモードならなんでも良い
  932.     return ysDraw.EndChangeDisplay();
  933. }
  934.  
  935. /////////////////////////////////////////////////////////////////////
  936. //    ファイル入出力
  937.  
  938. TUserFunc(TScript::LoadFile)    {
  939.     CYFile file;
  940.     if (file.ReadFile((LPSTR)*p)==0) {
  941.         CopyMemory((LPBYTE)*(p+1),file.GetFileMemory(),*(p+2));
  942.         return 0;
  943.     }
  944.     return 1;
  945. }
  946.  
  947. TUserFunc(TScript::SaveFile)    {
  948.     CYFile file;
  949.     return file.WriteFile((LPSTR)*p,(LPBYTE)*(p+1),*(p+2));
  950. }
  951.  
  952.  
  953. /////////////////////////////////////////////////////////////////////
  954. //    その他
  955.  
  956. TUserFunc(TScript::Rand)                {    return rand() % *p; }
  957. TUserFunc(TScript::GetCurrentDirectory)    {
  958.     string dir;
  959.     dir = CYFile::GetCurrentDirectory();
  960.     ::strcpy((LPSTR)*p,dir.c_str());
  961.     return 0;
  962. }
  963.  
  964. TUserFunc(TScript::SetCurrentDirectory)    {
  965.     CYFile::SetCurrentDirectory((LPSTR)*p);
  966.     return 0;
  967. }
  968.  
  969. /////////////////////////////////////////////////////////////////////
  970. //    ユーザー変数関連
  971.  
  972. LONG TScript::m_GameFlag[TGameFlagMax];
  973. LONG TScript::m_GameFlag2[TGameFlagMax2];
  974.  
  975. TUserFunc(TScript::LoadGameFlag)        {
  976.     CYFile file;
  977.     if (file.ReadFile((LPSTR)*p)==0) {
  978.         CopyMemory(TScript::m_GameFlag,file.GetFileMemory(),(sizeof(LONG))* TGameFlagMax);
  979.         return 0;
  980.     }
  981.     return 1;
  982. }
  983.  
  984. TUserFunc(TScript::SaveGameFlag)        {
  985.     CYFile file;
  986.     return file.WriteFile((LPSTR)*p,TScript::m_GameFlag,(sizeof(LONG)) * TGameFlagMax);
  987. }
  988.  
  989. TUserFunc(TScript::LoadGameFlag2)        {
  990.     CYFile file;
  991.     if (file.ReadFile((LPSTR)*p)==0) {
  992.         CopyMemory(TScript::m_GameFlag2,file.GetFileMemory(),(sizeof(LONG))* TGameFlagMax2);
  993.         return 0;
  994.     }
  995.     return 1;
  996. }
  997.  
  998. TUserFunc(TScript::SaveGameFlag2)        {
  999.     CYFile file;
  1000.     return file.WriteFile((LPSTR)*p,TScript::m_GameFlag2,(sizeof(LONG)) * TGameFlagMax2);
  1001. }
  1002.  
  1003. TUserFunc(TScript::ResetGameFlag){
  1004.     for (int i=0;i<TGameFlagMax;i++){
  1005.         m_GameFlag[i] = 0;
  1006.     }
  1007.     return 0;
  1008. }
  1009.  
  1010. TUserFunc(TScript::ResetGameFlag2){
  1011.     for (int i=0;i<TGameFlagMax2;i++){
  1012.         m_GameFlag2[i] = 0;
  1013.     }
  1014.     return 0;
  1015. }
  1016.  
  1017. /////////////////////////////////////////////////////////////////////
  1018.  
  1019. CBytePtrArray    TScript::TMemory;
  1020. TUserFunc(TScript::NewMemory){
  1021.     BYTE *pb = new BYTE[*p];
  1022.     TMemory.insert(pb);
  1023.     return (LONG)pb;
  1024. }
  1025.  
  1026. TUserFunc(TScript::DeleteMemory){
  1027.     int n;
  1028.     n = TMemory.erase((BYTE*)*p);    //    削除
  1029.     if (n==0) return 1;                //    そんなんnewして無いやん?
  1030.     delete (BYTE*)*p;
  1031.     return 0;
  1032. }
  1033.  
  1034. /////////////////////////////////////////////////////////////////////
  1035. //    LoadLibrary,FreeLibrary
  1036.  
  1037. CLibraryArray    TScript::TLibrary;
  1038.  
  1039. TUserFunc(TScript::LoadLibrary)    {
  1040.     HINSTANCE h = ::LoadLibrary(CYFile::MakeFullName((LPSTR)*p).c_str());
  1041.     if (h==NULL) return 0;
  1042.     TLibrary.insert(h);
  1043.     return (LONG)h;
  1044. }
  1045.  
  1046. TUserFunc(TScript::FreeLibrary)    {
  1047.     multiset<HINSTANCE>::iterator it;
  1048.     it = TLibrary.find((HINSTANCE)*p);
  1049.     if (it==TLibrary.end()) return 1;        //    そんなんLoadLibraryして無いやん?
  1050.     TLibrary.erase(it);    //    削除
  1051.     return ::FreeLibrary((HINSTANCE)*p)?0:1;
  1052. }
  1053.  
  1054. TUserFunc(TScript::GetFunction)    {
  1055.     FARPROC proc = GetProcAddress((HMODULE)*p,(LPCSTR)*(p+1));
  1056.     return (LONG)proc;
  1057. }
  1058.  
  1059. /////////////////////////////////////////////////////////////////////
  1060.  
  1061. TUserFunc(TScript::SetWindow){
  1062.     ysDraw.SetDisplayMode((EScreenMode)*p,*(p+1),*(p+2),*(p+3));
  1063.     return 0;
  1064. }
  1065.  
  1066. int TScript::m_nDebugMode = 0;
  1067.  
  1068. TUserFunc(TScript::TSetDebugMode){
  1069.     m_nDebugMode = *p + 1;    //    1加算しておく
  1070.     return 0;
  1071. }
  1072.  
  1073. /////////////////////////////////////////////////////////////////////
  1074. //    各種定数設定
  1075.  
  1076. //    各種定数初期化
  1077. int        TScript::m_nSoundMax            = TSoundMax;            //    総Soundチャンネル数
  1078. int        TScript::m_nPlaneMax            = TPlaneMax;            //    総プレーン数
  1079. int        TScript::m_nGameTimeMax            = TGameTimeMax;            //    総GameTime数
  1080. int        TScript::m_nTextLayerMax        = TTextLayerMax;        //    総テキストレイヤー数
  1081. int        TScript::m_nStringMax            = TStringMax;            //    string配列の数
  1082. int        TScript::m_nStringLength        = TStringLength;        //    string配列の大きさ
  1083. bool    TScript::m_bUSE_XZ_FOR_BUTTON    = TUSE_XZ_FOR_BUTTON;    //    XとZキーをスペース、リターンに割り当てる
  1084. DWORD    TScript::m_dwInstructionArea    = TInstructionArea;        //    命令エリアサイズ非制限
  1085.  
  1086. //    ScriptSDKに関数をエクスポートするためのクラス (C)yaneurao '00/01/04
  1087. //    クラスは、前方参照すると、レイアウトが狂うので…
  1088. #pragma pointers_to_members(full_generality,multiple_inheritance)
  1089. //    詳しくは、
  1090. //    http://www.sun-inet.or.jp/~yaneurao/rsp/
  1091. //        スーパープログラマーへの道 第90回~94回を参照のこと。
  1092. class CScriptSDK {
  1093. protected:
  1094.     //    CPlane関連
  1095.     LPDIRECTDRAWSURFACE (CPlane::*GetSurface)(void); 
  1096.     LPDIRECTDRAWPALETTE (CPlane::*GetPalette)(void);
  1097.     LRESULT (CPlane::*LoadBitmapFile)(string BitmapFileName,bool bLoadPalette=true);
  1098.     LRESULT (CPlane::*LoadBitmapFileW)(string BitmapFileName256,string BitmapFileNameElse
  1099.             ,bool bLoadPalette=true);
  1100.     LRESULT (CPlane::*ReleaseBitmap)(void);
  1101.     LRESULT (CPlane::*GetSize)(int &x,int &y);
  1102.     LRESULT    (CPlane::*SetColorKey)(COLORREF rgb);
  1103.     LRESULT    (CPlane::*SetColorKeyPos)(int x,int y);
  1104.     LRESULT    (CPlane::*Blt)(int x,int y);
  1105.     LRESULT    (CPlane::*BltRect)(int x,int y,RECT r);
  1106.     LRESULT    (CPlane::*BltFast)(int x,int y);
  1107.     LRESULT    (CPlane::*BltFastRect)(int x,int y,RECT r);
  1108.     LRESULT (CPlane::*BlendBlt)(int x,int y,int ar,int ag,int ab,int br,int bg,int bb);
  1109.     LRESULT (CPlane::*BlendBltRect)(int x,int y,RECT &rc,int ar,int ag,int ab,int br,int bg,int bb);
  1110.     LRESULT    (CPlane::*ClipBlt)(int x,int y,RECT &clip);
  1111.     LRESULT    (CPlane::*ClipBltRect)(int x,int y,RECT r,RECT &clip);
  1112.     LRESULT    (CPlane::*ClipBltFast)(int x,int y,RECT &clip);
  1113.     LRESULT    (CPlane::*ClipBltFastRect)(int x,int y,RECT r,RECT &clip);
  1114.     LRESULT (CPlane::*ClipBlendBlt)(int x,int y,int ar,int ag,int ab,int br,int bg,int bb,RECT &clip);
  1115.     LRESULT (CPlane::*ClipBlendBltRect)(int x,int y,RECT rc,int ar,int ag,int ab,int br,int bg,int bb,RECT &clip);
  1116.     LRESULT    (CPlane::*BltR)(int x,int y,double rx,double ry=-1);
  1117.     LRESULT    (CPlane::*BltRectR)(int x,int y,RECT &sr,double rx,double ry=-1);
  1118.     LRESULT    (CPlane::*BltFastR)(int x,int y,double rx,double ry=-1);
  1119.     LRESULT    (CPlane::*BltFastRectR)(int x,int y,RECT &sr,double rx,double ry=-1);
  1120.     LRESULT    (CPlane::*ClipBltR)(int x,int y,RECT &clip,double rx,double ry=-1);
  1121.     LRESULT    (CPlane::*ClipBltRectR)(int x,int y,RECT &sr,RECT &clip,double rx,double ry=-1);
  1122.     LRESULT    (CPlane::*ClipBltFastR)(int x,int y,RECT &clip,double rx,double ry=-1);
  1123.     LRESULT    (CPlane::*ClipBltFastRectR)(int x,int y,RECT &sr,RECT &clip,double rx,double ry=-1);
  1124.     LRESULT (CPlane::*BlendBltR)(int x,int y,int ar,int ag,int ab,int br,int bg,int bb,double rx,double ry=-1);
  1125.     LRESULT (CPlane::*BlendBltRectR)(int x,int y,RECT &rc,int ar,int ag,int ab,int br,int bg,int bb,double rx,double ry=-1);
  1126.     LRESULT (CPlane::*ClipBlendBltR)(int x,int y,int ar,int ag,int ab,int br,int bg,int bb,RECT &clip,double rx,double ry=-1);
  1127.     LRESULT (CPlane::*ClipBlendBltRectR)(int x,int y,RECT rc,int ar,int ag,int ab,int br,int bg,int bb,RECT &clip,double rx,double ry=-1);
  1128.     LRESULT (CPlane::*EnableBlendColorKey)(bool b);
  1129.     LRESULT (CPlane::*FlushBlt)(RECT &r);
  1130.     LRESULT    (CPlane::*MosaicBlt)(RECT &r,int d);
  1131.     LRESULT (CPlane::*CreateSurface)(int x,int y);
  1132.     LRESULT (CPlane::*BeginPaint)(HDC &hdc);
  1133.     LRESULT (CPlane::*EndPaint)(void);
  1134.     LRESULT    (CPlane::*SwapToSecondary)(void);
  1135.  
  1136.     CPlane* (*CreateCPlaneInstance)(void);
  1137.     void    (*DeleteCPlaneInstance)(CPlane*);
  1138.  
  1139.     //    Draw関連
  1140.     void    (CDirectDraw::*SetFillColor)(DWORD dwFillColor);
  1141.     void    (CDirectDraw::*SetFillColorRGB)(COLORREF rgb);
  1142.     int        (CDirectDraw::*GetBpp)(void);
  1143.     LRESULT    (CDirectDraw::*ClearSecondary)(void);
  1144.     LRESULT    (CDirectDraw::*ClearSecondaryRect)(RECT &r);
  1145.     LRESULT (CDirectDraw::*SetSecondaryOffset)(int ox,int oy);
  1146.     LRESULT (CDirectDraw::*BeginPaintSecondary)(HDC& hdc);
  1147.     LRESULT (CDirectDraw::*EndPaintSecondary)(void);
  1148.     LRESULT (CDirectDraw::*RealizePalette)(CPlane &plane);
  1149.     void    (CDirectDraw::*SetBrightness)(int bright);
  1150.     void    (CDirectDraw::*FlushPalette)(void);
  1151.     LPDIRECTDRAWPALETTE (CDirectDraw::*GetMainPalette)(void);
  1152.     LPDIRECTDRAWSURFACE (CDirectDraw::*GetSecondary)(void);
  1153.     
  1154.     //    CSound関連
  1155.     LRESULT (CSound::*LoadWaveFile)(const string& filename);
  1156.     LRESULT (CSound::*ReleaseWave)(void);
  1157.     LRESULT (CSound::*Play)(void);
  1158.     LRESULT (CSound::*Stop)(void);
  1159.     bool    (CSound::*IsPlay)(void);
  1160.     LRESULT (CSound::*Pause)(void);
  1161.     LRESULT (CSound::*Replay)(void);
  1162.     LRESULT (CSound::*SetVolume)(long volume);
  1163.     long    (CSound::*GetVolume)(void);
  1164.     void    (CSound::*SetLoopMode)(bool bLoop);
  1165.  
  1166.     CSound* (*CreateCSoundInstance)(void);
  1167.     void    (*DeleteCSoundInstance)(CSound*);
  1168.  
  1169.     //    File関連
  1170.  
  1171.     LRESULT    (CYFile::*ReadFile)(string filename);
  1172.     LPVOID    (CYFile::*GetFileMemory)(void);
  1173.     DWORD    (CYFile::*GetFileSize)(void);
  1174.     void    (CYFile::*ReleaseFileBuffer)(void);
  1175.     LRESULT    (CYFile::*WriteFile)(string filename,LPVOID mem,DWORD size);
  1176.     LRESULT    (CYFile::*ReadLine)(LPSTR buf);
  1177.     LRESULT    (CYFile::*ReadLine2)(LPSTR buf);
  1178.     LRESULT    (CYFile::*ReadData)(BYTE*p,DWORD size);
  1179.  
  1180.     CYFile* (*CreateCYFileInstance)(void);
  1181.     void    (*DeleteCYFileInstance)(CYFile*);
  1182.  
  1183.     //    MIDI関連
  1184.     LRESULT (CMIDIOutput::*MIDIOpen)(LPCTSTR pFileName,LPCTSTR pType=NULL);
  1185.     LRESULT (CMIDIOutput::*MIDIClose)(void);
  1186.     LRESULT (CMIDIOutput::*MIDIPlay)(void);
  1187.     LRESULT (CMIDIOutput::*MIDIReplay)(void);
  1188.     LRESULT (CMIDIOutput::*MIDIStop)(void);
  1189.     LRESULT (CMIDIOutput::*MIDIPause)(void);
  1190.     BOOL    (CMIDIOutput::*MIDIIsPlay)()const;
  1191.     LRESULT (CMIDIOutput::*MIDISetLoopMode)(BOOL bLoop);
  1192.  
  1193.     //    CD関連
  1194.     LRESULT    (CCDDA::*CDOpen)(void);
  1195.     LRESULT    (CCDDA::*CDClose)(void);
  1196.     LRESULT    (CCDDA::*CDStop)(void);
  1197.     LRESULT    (CCDDA::*CDPause)(void);
  1198.     LRESULT    (CCDDA::*CDReplay)(void);
  1199.     LRESULT (CCDDA::*CDPlay)(void);
  1200.     LRESULT (CCDDA::*CDPlay2)(int);
  1201.     bool    (CCDDA::*CDIsPlay)(void);
  1202.     void    (CCDDA::*CDSetLoopMode)(bool bLoop);
  1203.     int        (CCDDA::*CDGetSongMax)(void);
  1204.     LRESULT    (CCDDA::*CDEject)(bool bEject);
  1205.  
  1206.     //    キー入力関連
  1207.     void    (CVirtualKey::*ClearKeyDevice)(void);
  1208.     void    (CVirtualKey::*AddDevice)(CKeyBase*);
  1209.     void    (CVirtualKey::*RemoveDevice)(CKeyBase*);
  1210.     void    (CVirtualKey::*KeyInput)(void);
  1211.     void    (CVirtualKey::*ClearKeyList)(void);
  1212.     void    (CVirtualKey::*AddKey)(int vkey,CKeyBase*,int key);
  1213.     void    (CVirtualKey::*RemoveKey)(int vkey,CKeyBase*,int key);
  1214.     bool    (CVirtualKey::*IsVKeyPress)(int vkey);
  1215.     bool    (CVirtualKey::*IsVKeyPushDown)(int vkey);
  1216.     
  1217.     CVirtualKey* (*CreateCVirtualKeyInstance)(void);
  1218.     void    (*DeleteCVirtualKeyInstance)(CVirtualKey*);
  1219.  
  1220.     //    CGameTime
  1221.     void    (CGameTime::*ResetTime)(void);
  1222.     DWORD    (CGameTime::*GetTime)(void);
  1223.     void    (CGameTime::*PauseTime)(void);
  1224.     void    (CGameTime::*RestartTime)(void);
  1225.     
  1226.     CGameTime* (*CreateCGameTimeInstance)(void);
  1227.     void    (*DeleteCGameTimeInstance)(CGameTime*);
  1228.  
  1229.     //    その他
  1230.     //    エクスポートする関数を追加する場合は、ここに追加すること。決して途中に挿入しないこと。
  1231.     LRESULT    (CPlane::*SaveBitmapFile)(LPSTR filename,RECT &rc);
  1232.  
  1233.     //    Factory
  1234. private:
  1235.     static CPlane* _CreateCPlaneInstance(void) { return new CPlane; }
  1236.     static void    _DeleteCPlaneInstance(CPlane* p) { delete p; }
  1237.     static CSound* _CreateCSoundInstance(void) { return new CSound; }
  1238.     static void    _DeleteCSoundInstance(CSound* p) { delete p; }
  1239.     static CYFile* _CreateCYFileInstance(void) { return new CYFile; }
  1240.     static void    _DeleteCYFileInstance(CYFile* p) { delete p; }
  1241.     static CVirtualKey* _CreateCVirtualKeyInstance(void) { return new CVirtualKey; }
  1242.     static void    _DeleteCVirtualKeyInstance(CVirtualKey* p) { delete p; }
  1243.     static CGameTime* _CreateCGameTimeInstance(void) { return new CGameTime; }
  1244.     static void    _DeleteCGameTimeInstance(CGameTime* p) { delete p; }
  1245.  
  1246.     //    Initialize
  1247. public:
  1248.     CScriptSDK(void) {
  1249.         GetSurface        = CPlane::GetSurface;
  1250.         GetPalette        = CPlane::GetPalette;
  1251.         LoadBitmapFile    = CPlane::LoadBitmapFile;
  1252.         LoadBitmapFileW = CPlane::LoadBitmapFileW;
  1253.         SaveBitmapFile    = CPlane::SaveBitmapFile;    // added on ver1.01
  1254.         ReleaseBitmap    = CPlane::ReleaseBitmap;
  1255.         GetSize            = CPlane::GetSize;
  1256.         SetColorKey        = CPlane::SetColorKey;
  1257.         SetColorKeyPos    = CPlane::SetColorKey;
  1258.         Blt                = CPlane::Blt;
  1259.         BltRect            = CPlane::Blt;
  1260.         BltFast            = CPlane::BltFast;
  1261.         BltFastRect        = CPlane::BltFast;
  1262.         BlendBlt        = CPlane::BlendBlt;
  1263.         BlendBltRect    = CPlane::BlendBlt;
  1264.         ClipBlt            = CPlane::ClipBlt;
  1265.         ClipBltRect        = CPlane::ClipBlt;
  1266.         ClipBltFast        = CPlane::ClipBltFast;
  1267.         ClipBltFastRect    = CPlane::ClipBltFast;
  1268.         ClipBlendBlt    = CPlane::ClipBlendBlt;
  1269.         ClipBlendBltRect= CPlane::ClipBlendBlt;
  1270.         BltR            = CPlane::Blt;
  1271.         BltRectR        = CPlane::Blt;
  1272.         BltFastR        = CPlane::BltFast;
  1273.         BltFastRectR    = CPlane::BltFast;
  1274.         BlendBltR        = CPlane::BlendBlt;
  1275.         BlendBltRectR    = CPlane::BlendBlt;
  1276.         ClipBltR        = CPlane::ClipBlt;
  1277.         ClipBltRectR    = CPlane::ClipBlt;
  1278.         ClipBltFastR    = CPlane::ClipBltFast;
  1279.         ClipBltFastRectR= CPlane::ClipBltFast;
  1280.         ClipBlendBltR    = CPlane::ClipBlendBlt;
  1281.         ClipBlendBltRectR=CPlane::ClipBlendBlt;
  1282.         EnableBlendColorKey=CPlane::EnableBlendColorKey;
  1283.         FlushBlt        =CPlane::FlushBlt;
  1284.         MosaicBlt        =CPlane::MosaicBlt;
  1285.         CreateSurface    =CPlane::CreateSurface;
  1286.         BeginPaint        =CPlane::BeginPaint;
  1287.         EndPaint        =CPlane::EndPaint;
  1288.         SwapToSecondary    =CPlane::SwapToSecondary;
  1289.         CreateCPlaneInstance    = _CreateCPlaneInstance;
  1290.         DeleteCPlaneInstance    = _DeleteCPlaneInstance;
  1291.  
  1292.         SetFillColor    = CDirectDraw::SetFillColor;
  1293.         SetFillColorRGB    = CDirectDraw::SetFillColorRGB;
  1294.         GetBpp            = CDirectDraw::GetBpp;
  1295.         ClearSecondary    = CDirectDraw::ClearSecondary;
  1296.         ClearSecondaryRect    = CDirectDraw::ClearSecondary;
  1297.         SetSecondaryOffset    = CDirectDraw::SetSecondaryOffset;
  1298.         BeginPaintSecondary    = CDirectDraw::BeginPaintSecondary;
  1299.         EndPaintSecondary    = CDirectDraw::EndPaintSecondary;
  1300.         RealizePalette        = CDirectDraw::RealizePalette;
  1301.         SetBrightness        = CDirectDraw::SetBrightness;
  1302.         FlushPalette        = CDirectDraw::FlushPalette;
  1303.         GetMainPalette        = CDirectDraw::GetMainPalette;
  1304.         GetSecondary        = CDirectDraw::GetSecondary;
  1305.  
  1306.         LoadWaveFile        = CSound::LoadWaveFile;
  1307.         ReleaseWave            = CSound::ReleaseWave;
  1308.         Play                = CSound::Play;
  1309.         Stop                = CSound::Stop;
  1310.         IsPlay                = CSound::IsPlay;
  1311.         Pause                = CSound::Pause;
  1312.         Replay                = CSound::Replay;
  1313.         SetVolume            = CSound::SetVolume;
  1314.         GetVolume            = CSound::GetVolume;
  1315.         SetLoopMode            = CSound::SetLoopMode;
  1316.  
  1317.         CreateCSoundInstance = _CreateCSoundInstance;
  1318.         DeleteCSoundInstance = _DeleteCSoundInstance;
  1319.  
  1320.         ReadFile            = CYFile::ReadFile;
  1321.         GetFileMemory        = CYFile::GetFileMemory;
  1322.         GetFileSize            = CYFile::GetFileSize;
  1323.         ReleaseFileBuffer    = CYFile::ReleaseFileBuffer;
  1324.         WriteFile            = CYFile::WriteFile;
  1325.         ReadLine            = CYFile::ReadLine;
  1326.         ReadLine2            = CYFile::ReadLine2;
  1327.         ReadData            = CYFile::ReadData;
  1328.         CreateCYFileInstance= _CreateCYFileInstance;
  1329.         DeleteCYFileInstance= _DeleteCYFileInstance;
  1330.  
  1331.         MIDIOpen    = CMIDIOutput::Open;
  1332.         MIDIClose    = CMIDIOutput::Close;
  1333.         MIDIPlay    = CMIDIOutput::Play;
  1334.         MIDIReplay    = CMIDIOutput::Replay;
  1335.         MIDIStop    = CMIDIOutput::Stop;
  1336.         MIDIPause    = CMIDIOutput::Pause;
  1337.         MIDIIsPlay    = CMIDIOutput::IsPlay;
  1338.         MIDISetLoopMode = CMIDIOutput::SetLoopMode;
  1339.  
  1340.         CDOpen        = CCDDA::Open;
  1341.         CDClose        = CCDDA::Close;
  1342.         CDStop        = CCDDA::Stop;
  1343.         CDPause        = CCDDA::Pause;
  1344.         CDReplay    = CCDDA::Replay;
  1345.         CDPlay        = CCDDA::Play;
  1346.         CDPlay2        = CCDDA::Play;
  1347.         CDIsPlay    = CCDDA::IsPlay;
  1348.         CDSetLoopMode=CCDDA::SetLoopMode;
  1349.         CDGetSongMax= CCDDA::GetSongMax;
  1350.         CDEject        = CCDDA::Eject;
  1351.  
  1352.         ClearKeyDevice    = CVirtualKey::ClearKeyDevice;
  1353.         AddDevice        = CVirtualKey::AddDevice;
  1354.         RemoveDevice    = CVirtualKey::RemoveDevice;
  1355.         KeyInput        = CVirtualKey::KeyInput;
  1356.         ClearKeyList    = CVirtualKey::ClearKeyList;
  1357.         AddKey            = CVirtualKey::AddKey;
  1358.         RemoveKey        = CVirtualKey::RemoveKey;
  1359.         IsVKeyPress        = CVirtualKey::IsVKeyPress;
  1360.         IsVKeyPushDown    = CVirtualKey::IsVKeyPushDown;
  1361.         CreateCVirtualKeyInstance = _CreateCVirtualKeyInstance;
  1362.         DeleteCVirtualKeyInstance = _DeleteCVirtualKeyInstance;
  1363.  
  1364.         ResetTime        = CGameTime::ResetTime;
  1365.         GetTime            = CGameTime::GetTime;
  1366.         PauseTime        = CGameTime::PauseTime;
  1367.         RestartTime        = CGameTime::RestartTime;
  1368.         CreateCGameTimeInstance = _CreateCGameTimeInstance;
  1369.         DeleteCGameTimeInstance = _DeleteCGameTimeInstance;
  1370.  
  1371.     }
  1372. };
  1373.  
  1374.  
  1375. TUserFunc(TScript::SetConstParam){    //    各種定数の途中変更機能
  1376.  
  1377.     //    パラメータをあらかじめいれておく
  1378.     int        n    = *(p+1);
  1379.     bool    b    = *(p+1)!=0;
  1380.     LPSTR    r    = (LPSTR)*(p+1);
  1381.  
  1382.     //    小文字をすべて大文字に変換してチェックする必要あり
  1383.     char menu[_MAX_PATH];
  1384.     ToUpperStr(menu,(LPCSTR)*p);
  1385.  
  1386.     if (!strcmp(menu,"ENABLEPAUSE")){
  1387.         ysFrame.SetPauseUse(b);
  1388.     } else if (!strcmp(menu,"ENABLEMULTIAPP")){
  1389.         ysFrame.SetMultiApp(b);
  1390.     } else if (!strcmp(menu,"CAPTION")){
  1391.         return ysFrame.SetAppName(r);
  1392.  
  1393.     //    あとは、各種定数
  1394.     } else if (!strcmp(menu,"SOUNDMAX")){
  1395.         DELETEPTR_SAFE(m_sound);
  1396.         m_nSoundMax = n;
  1397.         m_sound        =    new CSound        [m_nSoundMax];
  1398.     } else if (!strcmp(menu,"PLANEMAX")){
  1399.         DELETEPTR_SAFE(m_plane);
  1400.         m_nPlaneMax = n;
  1401.         m_plane        =    new CPlane        [m_nPlaneMax];
  1402.     } else if (!strcmp(menu,"GAMETIMEMAX")){
  1403.         DELETEPTR_SAFE(m_gametime);
  1404.         m_nGameTimeMax = n;
  1405.         m_gametime    =    new CGameTime    [m_nGameTimeMax];
  1406.     } else if (!strcmp(menu,"TEXTLAYERMAX")){
  1407.         DELETEPTR_SAFE(m_textlayer);
  1408.         m_nTextLayerMax = n;
  1409.         m_textlayer    =    new CTextLayer    [m_nTextLayerMax];
  1410.     } else if (!strcmp(menu,"STRINGMAX")){
  1411.         //    いったん解放
  1412.         for(int i=0;i<m_nStringMax;i++) {
  1413.             DELETE_SAFE(m_alpString[i]);
  1414.         }
  1415.         DELETE_SAFE(m_alpString);
  1416.         DELETE_SAFE(m_lpszSenarioString);
  1417.  
  1418.         m_nStringMax = n;
  1419.  
  1420.         //    再確保
  1421.         m_alpString = new LPSTR [m_nStringMax];
  1422.         for(i=0;i<m_nStringMax;i++) {
  1423.             m_alpString[i] = new char[m_nStringLength];
  1424.         }
  1425.         m_lpszSenarioString = new char[m_nStringLength];
  1426.  
  1427.         //    再登録
  1428.         m_this -> RegistUserVariable("string",(LONG&)m_alpString[0]);
  1429.     } else if (!strcmp(menu,"STRINGLENGTH")){
  1430.         //    いったん解放
  1431.         for(int i=0;i<m_nStringMax;i++) {
  1432.             DELETE_SAFE(m_alpString[i]);
  1433.         }
  1434.         DELETE_SAFE(m_alpString);
  1435.         DELETE_SAFE(m_lpszSenarioString);
  1436.  
  1437.         m_nStringLength = n;
  1438.  
  1439.         //    再確保
  1440.         m_alpString = new LPSTR [m_nStringMax];
  1441.         for(i=0;i<m_nStringMax;i++) {
  1442.             m_alpString[i] = new char[m_nStringLength];
  1443.         }
  1444.         m_lpszSenarioString = new char[m_nStringLength];
  1445.  
  1446.         //    再登録
  1447.         m_this -> RegistUserVariable("string",(LONG&)m_alpString[0]);
  1448.     } else if (!strcmp(menu,"USE_XZ_FOR_BUTTON")){
  1449.         m_bUSE_XZ_FOR_BUTTON = b;
  1450.     } else if (!strcmp(menu,"INSTRUCTIONAREA")){
  1451.         m_dwInstructionArea = n;
  1452.  
  1453.     //    メッセージボックス
  1454.     } else if (!strcmp(menu,"MESSAGEBOX")){
  1455.         ysFrame.MessageOut((LPCSTR)*(p+1),(LPCSTR)*(p+2));
  1456.     } else if (!strcmp(menu,"YESNO")){
  1457.         return ysFrame.YesNo((LPCSTR)*(p+1),(LPCSTR)*(p+2))?1:0;    //    これは返し値必要
  1458.  
  1459.     //    フリップ描画
  1460.     } else if (!strcmp(menu,"USEFLIP")){
  1461.         ysDraw.SetDirectDrawFlipUse(b);
  1462.  
  1463.     //    ウィンドゥ位置の設定
  1464.     } else if (!strcmp(menu,"WINDOWPOS")){
  1465.         ysWindow.SetWindowPos(*(p+1),*(p+2));
  1466.  
  1467.     } else {
  1468.         //    未知の命令
  1469.         return 1;
  1470.     }
  1471.  
  1472.     return 0;
  1473. }
  1474.  
  1475. TUserFunc(TScript::GetConstParam){    //    各種定数の取得機能
  1476.     //    小文字をすべて大文字に変換してチェックする必要あり
  1477.     char menu[_MAX_PATH];
  1478.     ToUpperStr(menu,(LPCSTR)*p);
  1479.  
  1480.     if (!strcmp(menu,"ENCODEKEY")){
  1481.         LONG q = (LONG)m_loadfile.c_str();
  1482.         for(int i=3;i<13;i++){
  1483.             q ^= 0x53521abf;
  1484.             q += 0x16234613 >> i;
  1485.         }
  1486.         *(p+1) = q;
  1487.  
  1488.     //    ウィンドゥのサイズ取得
  1489.     } else if (!strcmp(menu,"SCREENSIZE")){
  1490.         ysWindow.GetScreenSize((int&)*(int*)*(p+1),(int&)*(int*)*(p+2));
  1491.     
  1492.     //    yaneuraoGameScriptSDK用エクスポート
  1493.     } else if (!strcmp(menu,"SCRIPTSDK")){
  1494.         static void* pointz[13]; // まあテキトーでええわ
  1495.         static CScriptSDK scriptsdk;
  1496.         pointz[0] = &scriptsdk;
  1497.         pointz[1] = m_plane;
  1498.         pointz[2] = (void*)m_nPlaneMax;            //    最大数を格納
  1499.         pointz[3] = (void*)sizeof(CPlane);        //    sizeを格納
  1500.         pointz[4] = m_sound;
  1501.         pointz[5] = (void*)m_nSoundMax;            //    最大数を格納
  1502.         pointz[6] = (void*)sizeof(CSound);        //    sizeを格納
  1503.         pointz[7] = (void*)&ysDraw;
  1504.         pointz[8] = (void*)&ysMIDIOut;
  1505.         pointz[9] = (void*)&ysCD;
  1506.         pointz[10] = (void*)&ysInput;
  1507.         pointz[11] = (void*)&ysJoy;
  1508.         pointz[12] = (void*)&ysMIDIIn;
  1509.         return (LONG)pointz;
  1510.  
  1511.     } else {
  1512.         //    未知の命令
  1513.         return 1;
  1514.     }
  1515.     return 0;
  1516. }
  1517.  
  1518. void TScript::ToUpperStr(LPSTR q2,LPCSTR q){
  1519.     //    一応、漢字コードを避けるためのルーチンも入れとこか…
  1520.     bool kanji=false;
  1521.     do {
  1522.         if (kanji) {
  1523.             kanji = false;
  1524.         } else if (((BYTE)*q>=0x80 && (BYTE)*q<=0xa0) || ((BYTE)*q>=0xe0 && (BYTE)*q<=0xff)) {
  1525.             kanji = true;    //    2バイトコードの1バイト目であった
  1526.         } else {
  1527.             kanji = false;    //    2バイトコードの1バイト目ではなかった
  1528.         }
  1529.         
  1530.         if (!kanji && (BYTE)*q >='a' && (BYTE)*q <= 'z') {
  1531.             *q2 = (BYTE)*q - 'a' + 'A';
  1532.         } else {
  1533.             *q2 = *q;
  1534.         }
  1535.         q2++;
  1536.     } while (*(q++));
  1537.     //    これで変換完了
  1538. }