HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
0728
するとんゲームの人拡張機能の追加方法15未解決


するとんゲームの人

リンク

2023/7/28(Fri) 14:48:47|NO.99806

すみません
ゲームを作っているのですが、拡張機能(MOD?)をゲームに追加するにはどうしたらいいでしょうか
こんな感じで頑張ったんですが、多分#includeではできない気がします
他の言語の力も借りないとですかね...?

#include "shell32.as" #include "hspinet.as" #include "mod_stbar.as" #include "user32.as" #include "kernel32.as" ver="1.0" title "するとんゲーム"+ver USERNAME = dir_cmdline if dir_cmdline = "" {USERNAME = "Guest"} if sysinfo(0) = "WindowsNT ver10.0" {dialog "Not Supported":end} oncmd gosub *WM_SIZE,0x0005 dialog "",16,"" if stat = 0 : stop expandFilename = refstr expandFilestart = "*"+refstr+"main" goto *expandFilestart *WM_SIZE //goto *GameReDraw return
最悪ウィンドウは別でいいですが、MOD側から本家に干渉したり、変数を読み取る方法あれば教えてほしいです



この記事に返信する


nennneko5787

リンク

2023/7/28(Fri) 15:25:22|NO.99807

こことか参考になると思います
http://hsp.tv/play/pforum.php?mode=pastwch&num=87768



GENKI

リンク

2023/7/29(Sat) 01:55:02|NO.99810

ご質問の文章からは具体的に何をしたいのか分からないので、スクリプトから推理して読み解く事にします。

> expandFilestart = "*"+refstr+"main"
> goto *expandFilestart

この書き方は、ご利用になれません。
gotoでジャンプするラベルは変数に格納することができますが、文字列ではありません。
ラベルを変数(ラベル型変数)に格納して使用する場合、次のようにして使用します。

mes "1" a = *sub gosub a mes "2" stop *sub mes "サブルーチン" return
ご覧の通り、ラベル型変数は1つだけだとあまり意味がないので、配列で使用すると便利です。


> oncmd gosub *WM_SIZE,0x0005

ウィンドウサイズを変更した際に何かしたいスクリプトのようです。では動くスクリプトを書いてみます。
ウィンドウ0はウィンドウサイズ固定なので、1以降を使うと簡単です。

#define WM_SIZE $5 gsel 0, -1 ; 0は使わないので非表示にする。 screen 1 ; 1以降は可変ウィンドウ oncmd gosub *l_WM_SIZE, WM_SIZE ;ウィンドウのサイズ変更 stop ; ウィンドウサイズが変更されたときの処理 *l_WM_SIZE ; サイズ変更後のクライアント領域のウィンドウ幅と高さ l = lparam<<16>>16 ; 下位ワード 幅 h = lparam>>16 ; 上位ワード 高さ title ""+l+", "+h return

user32.asと#includeの話が出ているので、user32モジュール(moduleを省略してmodと書くこともあります)を使う方法の例も書いておきます。
この例では、ウィンドウID0を可変ウィンドウに変更して使用しています。

#include "user32.as" ; user32.asをインクルードすると、GetWindowLong/SetWindowLong が使用できるようになります。 ; ウィンドウのスタイル style = 0x00010000 ; WS_MAXIMIZEBOX 最大化ボタンを持つ(なくてもいい) style|= 0x00040000 ; WS_SIZEBOX サイズ変更境界を持つ GetWindowLong hwnd, -16 ; GWL_STYLE SetWindowLong hwnd, -16, stat | style oncmd gosub *l_WM_SIZE, $5 ; WM_SIZEウィンドウのサイズ変更 stop ; ウィンドウサイズが変更されたときの処理 *l_WM_SIZE ; サイズ変更後のクライアント領域のウィンドウ幅と高さ l = lparam<<16>>16 ; 下位ワード 幅 h = lparam>>16 ; 上位ワード 高さ title ""+l+", "+h return
「#include "user32.as"」と書くことで以降は、GetWindowLong命令とSetWindowLong命令が使用できるようになります。
user32.asの場合、#include して使えるようになった命令の説明はHDLに記載されていません。Windowsの標準機能を呼び出しているので、そちらのマニュアルを見に行く必要があります。
https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-getwindowlongw
http://chokuto.ifdef.jp/urawaza/api/GetWindowLong.html


> 拡張機能(MOD?)をゲームに追加するにはどうしたらいいでしょうか

HSP3 モジュール機能ガイド
https://www.onionsoft.net/hsp/v36/doclib/module.htm
に、モジュールの書き方などに関する説明が書いてあり、…読んでもわからなかったと思います。
また するとんゲームの人 さんが求めている、入門者向けの「モジュールの使い方」については…そういえば見たこと無いような。
簡単なので書く人がいないのだと思うのですが、最初はその簡単が超難所でなかなか越えられないもの。それを超えると難しかったことを秒で忘れる。

モジュールを使い始める場合、最初はWin32API系(shell32, user32, kernel32)ではなくHDLに説明が記載されているものから使い始めることをお勧めします。
Win32API系は、マニュアル探して、解読してと大変。また、構造体があるとさらに難易度が…。

ということで、はじめは簡単で手ごろなところから慣れていく事をお勧めします。

#include "hspmath.as" mes "2 x 2 x 2" mes "2^3 = " + (2.0 * 2.0 * 2.0) mes "2^3 = " + pow(2,3) a = 3 mes "2^3 = " + pow(2,a)
これはhspmathモジュールを使用した例です。"hspmath.as"を#includeしたことで、pow関数が使用できるようになりました。
powにカーソルを合わせてF1キーを押すと、HDLが開いて関数の使用方法が表示されます。
このようにモジュールを#includeすると、モジュールが持っている命令を標準命令と同じような感覚で使えるようになります。



窓月らら

リンク

2023/7/29(Sat) 09:21:04|NO.99814

まずは使おうとしているモジュール等の説明書をよくお読みください。
使い方は書いてあるはずです。
また、組み合わせによっては競合・衝突して使えないケースはあります。
例えばサウンド系のプラグイン/モジュールを複数同時に使おうとしても
エラーになることはあります。



雪月夜

リンク

2023/7/29(Sat) 12:02:35|NO.99816

超簡単版ですが、拡張機能をMODファイルとして取り込む機能を作成しました。
MODの中身はXML風に記述されています。
実行するにはあらかじめ、ディレクトリ構造の各ファイルを作って配置する必要があります。

ディレクトリ構造(例)

C:\folder │ main.hsp │ └─extend └─testmod haikei.bmp haikei.mod

haikei.modの中身

<background> haikei.bmp </background>

main.hspの中身

#include "hspext.as" ;初期設定 color:boxf ;拡張機能設定 crlf="\n" extenddir=""+dir_cur+"\\"+"extend" chdir extenddir dirlist s_modlist,"*.*",0 split s_modlist,"\n",modlist repeat stat if modlist(cnt)="":continue modsubdir=""+extenddir+"\\"+modlist(cnt) chdir modsubdir dirlist s_modsublist,"*.*",0 split s_modsublist,"\n",modsublist repeat stat if getpath(modsublist(cnt),2)!=".mod":continue modfile=modsublist(cnt) gosub *readmod loop loop stop *readmod sdim modtext bload ""+modfile,modtext textid=0 maxtextid=strlen(modtext) type=0 tabname="" endtabname="" contenttext="" repeat if textid>=maxtextid:break ;改行は除く flg=0 switch wpeek(modtext,textid) case wpeek(crlf,) flg=1 swbreak swend if flg{ textid+=2 continue } ;コンテンツ読込 moji=strf("%c",peek(modtext,textid)) switch strf("%c",peek(modtext,textid)) case "<" if type=0{ tabname="" type=1 }else:if type=2{ type=1 } swbreak case ">" if type=1{ contenttext="" type=2 }else:if type=3{ if tabname=endtabname{ ;コンテンツ実行 if tabname="background"{ picload ""+contenttext } } } swbreak case "/" if type=1{ endtabname="" type=3 } swbreak default if type=1{ tabname+=""+moji }else:if type=2{ contenttext+=""+moji }else:if type=3{ endtabname+=""+moji } swbreak swend textid++ loop return

実行すると背景に画像(haikei.bmp)が表示されるMODです。

これはあくまで一例です。
機能を拡張する方法はいろいろあるので、他の方の意見も参考にしてみてください。



ze-na

リンク

2023/8/1(Tue) 22:36:12|NO.99840

>するとんゲームの人 さん

>ゲームを作っているのですが、拡張機能(MOD?)をゲームに追加するにはどうしたらいいでしょうか

MODとは改造や改変(modify)するという意味なので拡張機能とは少し違うかもです。
HSPではモジュール(module)のことをmodと言うので少々質問のやり取りがややこしくなっていますね。

添付スクリプトを見た感じ、自作ゲーム(本家)に追加ファイルなどから拡張機能を
起動出来るようにするイメージなのでしょうか?

HSPにはオブジェクトファイル(.ax)というHSPスクリプトファイルを固めた?ファイルを
作成することでそれと同じイメージのことが出来ます。ファイルの実行はrun命令、exec命令などで行います。

しかし、改めて調べたところ、同じウィンドウ上では出来ないようですので
するとんゲームの人 さんのやりたいことが可能かどうか試してみる必要があるかもしれません。

ちなみにHSP3.6beta5以降のrun命令には不具合があるので使用できません。。
その経緯については、別スレッドで書いてますので参照してください(未解決)

https://hsp.tv/play/pforum.php?mode=all&num=99827
run命令が時々正常に動きません

同一ウィンドウ上で拡張機能行うのであれば、高度な内容になりますが、
nennneko5787 さんの参考URLにある、HSP上に新スクリプト(Lua、mist、ModuleGSなど)を
実装する方法や他の言語(.dllなど)を利用したプラグイン的なものとなります。

>最悪ウィンドウは別でいいですが、MOD側から本家に干渉したり、変数を読み取る方法あれば教えてほしいです

vsaveとvloadという変数データをファイル化する命令を利用することで拡張機能側でも変数を読み込むことが出来ます。
ただし、変数データをファイル化するという都合上、アクセスが悪いことや暗号化もされていない?ので解析に使われる可能性があります。



するとんゲームの人

リンク

2023/8/2(Wed) 12:34:51|NO.99841

スマホから書き込んだのでID違うかもですが私です
拡張機能の件、皆さんの意見とコードを活用させていただきます
親切にありがとうございます

もう一つ疑問があるのですが、
WindowsDefenderにウイルス呼ばわりされるのですが、
WDを無効化する.regファイルをpackしておいて、実行したらまずいですかね?
ジューシーポテトってやつは危なっかしいですか?



するとんゲームの人

リンク

2023/8/2(Wed) 12:36:40|NO.99842




nennneko5787

リンク

2023/8/2(Wed) 18:44:19|NO.99846

まずいです
やめてください



するとんゲームの人

リンク

2023/8/2(Wed) 21:21:40|NO.99852

readme.txtに検査除外する方法を書くだけにしときます



tossee

リンク

2023/8/17(Thu) 14:11:43|NO.99912

>ジューシーポテトってやつは危なっかしいですか?
これはおそらくやばい奴だと思います



ぴーまん

リンク

2023/9/24(Sun) 16:49:13|NO.100079

>>雪月夜さん
このプログラムを使いたいのですが、dialog命令で.modファイルを選択できるようにしたいのですが
具体的にどうやって.modファイルを選んでいるのかがわからないので教えていただけませんか?



雪月夜

リンク

2023/9/24(Sun) 21:51:41|NO.100081

>>ぴーまんさん
上記のスクリプトはMODファイルを選択してるわけではありません
extendフォルダーの中に複数のMOD用フォルダを詰め込んで
それらを全部読み込む形式になっています

;extendフォルダー内に移動 extenddir=""+dir_cur+"\\"+"extend" chdir extenddir ;extendフォルダー内の各MODフォルダを読み込む dirlist s_modlist,"*.*",0 split s_modlist,"\n",modlist repeat stat if modlist(cnt)="":continue ;MODフォルダ内に移動 modsubdir=""+extenddir+"\\"+modlist(cnt) chdir modsubdir ;MODフォルダの中身を読み込む dirlist s_modsublist,"*.*",0 split s_modsublist,"\n",modsublist repeat stat if getpath(modsublist(cnt),2)!=".mod":continue ;modファイル読み込み modfile=modsublist(cnt) gosub *readmod loop loop
dialog命令でMODファイルを選択する場合だとフォルダー階層を調べる必要が無いので
以下のようなコードになります

;初期設定 color:boxf ;拡張機能設定 crlf="\n" dialog "",16 if getpath(refstr,2)=".mod"{ modfile=refstr gosub *readmod } stop *readmod sdim modtext bload ""+modfile,modtext textid=0 maxtextid=strlen(modtext) type=0 tabname="" endtabname="" contenttext="" repeat if textid>=maxtextid:break ;改行は除く flg=0 switch wpeek(modtext,textid) case wpeek(crlf,) flg=1 swbreak swend if flg{ textid+=2 continue } ;コンテンツ読込 moji=strf("%c",peek(modtext,textid)) switch moji case "<" if type=0{ tabname="" type=1 }else:if type=2{ type=1 } swbreak case ">" if type=1{ contenttext="" type=2 }else:if type=3{ if tabname=endtabname{ ;コンテンツ実行 if tabname="background"{ picload ""+contenttext } } } swbreak case "/" if type=1{ endtabname="" type=3 } swbreak default if type=1{ tabname+=""+moji }else:if type=2{ contenttext+=""+moji }else:if type=3{ endtabname+=""+moji } swbreak swend textid++ loop return
こんな感じでよろしいでしょうか?



HSPでインタプリタ

リンク

2023/9/26(Tue) 22:04:52|NO.100086

これってインタプリタ作れる?
html的な



nennneko5787

リンク

2023/9/27(Wed) 19:33:52|NO.100090

> NO.100086さん
新しくスレを作ってくれたのならば回答できます
ここでは無理っす



雪月夜

リンク

2023/9/27(Wed) 20:33:17|NO.100091

>>HSPでインタプリタさん
作れる作れないで言ったら作れると思います、それなりの知識は必要ですけど
ちなみにHTMLはインタプリタではないですよ



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.99806への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.