[トップ][一覧][最近の更新]

編集履歴:差分

2010/06/30 05:55:00 JST以来のO2 for HSP3の変更箇所

  • + 追加された行
  • - 削除された行

編集履歴ページに戻る

  [[$$toc]]
+ 
  ----
  * はじめに...
  HSPTV!メルマガの「教えて!おにたま!!」からおにたまさんの回答の引用です。
  <<<
  現在のところ、O2システムはHSP2.6以降にのみ対応しています。~%
  ただし、プラグインDLL自体(sephira.dll)は、HSP3からであっても使用することができます。~%
  HSP3に対応していないのは、付属しているモジュールの「o2.as」になります。~%
  これは、ユーザーIDの入力やチャットウィンドウなど標準的なシステム表示をサポートするためのものになっています。~%
  HSP3に対応した「o2.as」は、準備中でなるべく早く公開したいと考えていますが、'''自信のある人はHSP3対応に修正してみてもいいかと思います'''。(...[1])~%
  また、O2のバージョンアップについては、'''機能の追加も含めて検討しています'''。(...[2])~%
  ただ、詳しい予定がまだ立っていない状態なのでもう暫らくお待ち下さい。
  >>>
  * 確認事項
  ** 自信のある人はHSP3対応に修正してみてもいい
  個人で修正したものを個人の範囲で利用するよりは、何か共有できるものをこしらえて、「hsp3.0でo2を利用したいのですが...」といった声を聞いたときは「HSPWikiに...」と案内できたほうが「現状2.6xのみ対応なのでHSP3での利用は諦めるか、自分でHSP3用に修正するしかない」の他の選択肢として、ここで修正版を載せる(修正は興味のある人全員で)というのはいいでしょうか?
  
  ** 機能の追加も含めて検討しています
  開発者サイドでもバージョンアップが検討されているということなのでここはもうしばらく我慢するべきでしょうか?
  
  * o2.as for HSP3
  {{{
  // このソースは間違いのある場合があり、使用は自己責任でお願いします。
  // 間違いなどありましたら、ごにょごにょしてください・・・
  
  #include	"sephira.as"
  #module "o2"
  
  #define MSG_LOGIN 1
  #define MSG_LOGOUT 2
  #define MSG_WHOIS 3
  #define MSG_WHOACK 4
  
  #deffunc o2init int
  
  	;	o2 initalize
  	;
  	buffer 3
  	picload "o2_bar.bmp"
  	gsel 0
  	btn_max=32
  	dim btn_fl,btn_max
  	dim btn_x,btn_max
  	dim btn_y,btn_max
  	dim btn_sx,btn_max
  	dim btn_sy,btn_max
  	sdim chatmes,256
  	alloc sysdata,512
  
  	;	user data initalize
  	;
  	sdim user_id,64
  	sdim user_pass,64
  	sdim user_option,256
  	user_id = "unknown"
  	user_pass = ""
  	user_option=""
  	;
  	exist "O2user_data.txt"
  	if strsize>0 {
  		notesel user_dat
  		noteload "O2user_data.txt"
  		noteget user_id,0
  		noteget user_pass,1
  	}
  	return
  *badinit
  	dialog "o2user.datファイルが不正です。"
  	end
  
  
  #deffunc o2datsave
  
  	randomize
  	memcpy sysdata,user_id,32,$20,0
  	memcpy sysdata,user_pass,32,$40,0
  	memcpy sysdata,user_option,$100,$80,0
  
  	sysdata.0 = $5302
  	sysdata.1=rnd ($8000)
  	sysdata.2=rnd ($8000)
  	dkey=sysdata.1 + sysdata.2
  	x=8:y=0:repeat 56+64
  	sysdata.x=(sysdata.x^dkey)+0x5522aa
  	y+=sysdata.x:x+:loop
  	sysdata.3=y
  	ID=str(user_id)
  	PASS=str(user_pass)
  		notesel user_data
  		noteadd ID,0,1
  		noteadd PASS,1,1
  		notesave "O2user_data.txt"
  
  	return
  
  
  #deffunc o2cls int _p1
  	y=_p1
  	cls 1
  	objmode 1,1
  	redraw 0
  	gmode 0,640,20
  	repeat y/20
  	pos 0,cnt*20:gcopy 3,0,20
  	loop
  	gmode 0,640,30
  	pos 0,0:gcopy 3,0,0
  	pos 0,y-30:gcopy 3,0,50
  	gmode 0,640,80
  	pos 0,y:gcopy 3,0,80
  	redraw 1
  	repeat btn_max:	btn_fl.cnt=-1:loop
  	btn_ent=0
  	return
  
  
  #deffunc o2wait int _p1a
  
  	wt=_p1a
  	seWait@ : o2stat=stat
  	await wt
  	await
  	return
  
  
  #deffunc o2button int _p12,int _p2,int _p3,int _p4,int _p5
  
  	if btn_ent>=btn_max : return
  	btn_fl.btn_ent	=_p12
  	btn_x.btn_ent	=_p2
  	btn_y.btn_ent	=_p3
  	btn_sx.btn_ent	=_p4
  	btn_sy.btn_ent	=_p5
  	btn_ent+
  	return
  
  #deffunc o2bdraw
  	gmode 0,120,20
  	repeat btn_max:	if btn_fl.cnt<0 : continue
  	c=btn_fl.cnt:x=btn_x.cnt:y=btn_y.cnt
  	sx=btn_sx.cnt:sy=btn_sy.cnt
  	if c&$100 {
  		px=sx*2:py=c&255*20+160
  	} else {
  		px=0:py=c*20+160
  		if mousex<x : px=sx
  		if mousey<y : px=sx
  		if x+sx<mousex : px=sx
  		if y+sy<mousey : px=sx
  	}
  	pos x,y:gcopy 3,px,py,sx,sy
  	loop
  	return
  
  #deffunc o2bcheck
  	mref _p10,64
  	res=-1
  	repeat btn_max:	if btn_fl.cnt<0 : continue
  	c=btn_fl.cnt
  	if (c&$100)=0 {
  		x=btn_x.cnt:y=btn_y.cnt:px=0
  		if mousex<x : px+
  		if mousey<y : px+
  		if x+btn_sx.cnt<mousex : px+
  		if y+btn_sy.cnt<mousey : px+
  		if px=0 : res=cnt
  	}
  	loop
  	_p10=res
  	return
  
  
  #deffunc o2sendchat str _p1c
  
  	seChatPut@ _p1c
  	return
  
  
  #deffunc o2sendchatp str _p1d,int _p2a
  
  	seChatPut@ _p1d,_p2a
  	return
  
  
  #deffunc o2putchat str _p1e,int _p2b
  
  	chatmes = _p1e
  	spcode=_p2b & 255
  	if spcode=MSG_WHOIS : goto *putc2
  	;
  	pos 16,chaty+16:gcopy 0,16,chaty+32,604,354-chaty
  	gmode 0,640,26
  	pos 0,374:gcopy 3,0,50
  	;
  	if spcode>0 : goto *putc1
  *putc0
  	color 0,0,0
  	pos 16,374:mes chatmes
  	return
  *putc1
  	a=strlen(chatmes):s1=strmid (chatmes,0,a-1)
  	color 160,0,0
  	pos 16,374
  	;
  	if spcode=MSG_LOGIN : mes s1+"さんがログインしました。"
  	if spcode=MSG_LOGOUT : mes s1+"さんがログアウトしました。"
  	if spcode=MSG_WHOACK : mes s1+"さんがロビーにいます。"
  	return
  *putc2
  	seChatPut@ "",MSG_WHOACK
  	return
  
  
  #deffunc o2lobby
  
  	sdim	in_mess,80
  	sdim	out_mess,80
  	gsel 0
  	o2cls 400
  	font "MS ゴシック",12,1+16
  	pos 16,420:mes "ID:"+user_id+" ( Chat Window )"
  
  	o2sendchatp "",MSG_LOGIN			; entry message
  	in_mess=""
  	objsize	480,24
  	pos 16,436 : input in_mess : mesid=stat
  	objsel mesid
  	meslen=0
  	chaty=130
  	color 64,64,64:boxf 16,chaty+12,620,chaty+13
  	;
  	o2button 0,500,16,120,20
  	lbmode=0:lbroom=0:o2stat=0
  	;
  	return
  
  
  #deffunc o2lstat
  
  	redraw 0
  	color 211,208,202:boxf 16,16,499,chaty
  	color 64,64,64:pos 16,16
  	seRoomStat@ : roommax = stat : room_name=""
  	if roommax=0 : mes "エントリーなし" : goto *lstat_ok
  	if roommax>8 : roommax=8
  	repeat roommax:pos 16,cnt*16+16
  	seRoomGet@ room_name , cnt
  	mes	"ROOM"+cnt+" "+room_name+" ("+stat+")"
  	loop
  *lstat_ok
  	redraw 1,16,16,500-16,chaty
  	return
  
  
  #deffunc o2lchat
  
  	o2lchat_stat@ = 0
  
  	;	status process
  	if o2stat = 2  : o2lchat_stat@ = 1
  	if o2stat = 11 : o2lchat_stat@ = -1 : o2errm="通信エラー"
  	if o2stat = 20 : o2lchat_stat@ = -1 : o2errm="LOBBYがいっぱいで入れない"
  	if o2stat = 21 : o2lchat_stat@ = -1 : o2errm="部屋に入れませんでした"
  
  	;	room process
  	o2lstat
  	o2bdraw
  	stick key,0,1
  	if key&$100 : goto *lcbtn
  	goto *lcloop
  *lcbtn
  	; button push
  	if roommax=0 : goto *lcbtn0
  	x=mousex:y=mousey
  	if (x<16)|(x>499) : goto *lcbtn0
  	if (y<16)|(y>chaty) : goto *lcbtn0
  	a=(y-16)/16
  	if a>=roommax : goto *lcbtn0
  	; select room
  	seRoomSet@ a:if stat = 10 : dialog "選択できません" : goto *lcloop
  	lbmode=2:lbroom=a
  	goto *lcloop
  *lcbtn0
  	o2bcheck:if stat==-1 : goto *lcloop
  *lcbtn1
  	; new room
  	if lbmode!=0 : goto *lcbtn1x
  	seRoomSet@ -1:if stat = 10 : dialog "エントリーできません" : goto *lcloop
  	lbmode=1:lbroom=-1
  	goto *lcloop
  *lcbtn1x
  	; exit room
  	seRoomSet@ -2:if stat = 10 : dialog "退出できません" : goto *lcloop
  	lbmode=0
  	goto *lcloop
  
  *lcloop
  	; chat process
  	seChatGet@ out_mess
  	if stat : o2putchat out_mess,stat>>8
  
  	;getkey	key_a,13		;リターンキーが押されたか?
  	if ( key&32 ){
  		a=strlen(in_mess)
  		if a : if a=meslen : goto *lcent
  	} else {
  		meslen=strlen(in_mess)
  	}
  	;stick a,$20,1
  	;if a&$20 : goto *lcent
  	;if a&1024 : actid=actid^1 : objsel actid
  	;if a&$100 : goto *o2m2
  
  	return
  *lcent
  	if in_mess="/who" : seChatPut@ "",MSG_WHOIS : in_mess=""
  	;
  	if in_mess!="" : seChatPut@ in_mess
  	o2wait 3
  	meslen=0:objprm	mesid,""
  	return
  
  
  #deffunc o2start str _p1f,int _p2d
  
  	sdim game_code,64
  	sdim server_name,64
  	game_code = _p1f
  	game_human = _p2d
  
  	if game_human>0 : server_name="o2.zener.co.jp" : else : server_name="127.0.0.1"
  
  	screen 0,640,480
  	gsel 0,1
  *o2m0
  	o2cls 400
  	font "MS ゴシック",12,1+16
  	objsize	240,24
  	pos 168,208:mes "ユーザーID"
  	pos 168,232:mes "パスワード"
  	pos 160,160
  	mes "以下の情報をもとにネットワークサーバーに接続します。"
  	mes "ログインするためのユーザーIDとパスワードを入力してください。"
  	pos 240,200
  	input user_id
  	input user_pass
  	sendmsg objinfo(1,2),204,'*',varptr(dum)
  	objprm 1,user_pass
  	o2button 1,280,260,120,20
  	actid=0:objsel actid
  *o2m1
  	o2bdraw
  	stick a,,1
  	if a&$100 : goto *o2m2
  	if a&$20 : goto *o2m2x
  	wait 5
  	goto *o2m1
  *o2m2
  	o2bcheck:if stat<=-1 : goto *o2m1
  *o2m2x
  	if user_id="" : goto *o2m1
  	;
  	o2cls 400
  	font "MS ゴシック",14,1+16
  	pos 200,220
  	mes "ネットワークサーバーに接続中です..."
  
  	if game_code!="" {
  		seGameCode@	game_code	;ゲームコードの設定
  	}
  
  	seName@		user_id		;名前の登録
  	sePassword@	user_pass	;パスワードの登録
  
  	;seLoginの#2パラメータ(Matching数、マイナスならばローカルテスト用)
  	seLogin@ server_name, game_human
  	if ( stat == 11 ):erm="通信ができませんでした":goto *o2m3
  	if ( stat == 12 ):erm="IDかパスワードが間違っています":goto *o2m3
  	if ( stat == 13 ):erm="すでにこのIDでログイン中です":goto *o2m3
  	if ( stat == 14 ):erm="O2のバージョンが異なります":goto *o2m3
  	if ( stat == 15 ):erm="ロビーが満員です":goto *o2m3
  	if ( stat == 16 ):erm="通信設定に間違いがあります":goto *o2m3
  
  	o2datsave
  
  	return
  *o2m3
  	ernum=stat
  	o2cls 400
  	font "MS ゴシック",14,1+16
  	pos 160,180
  	mes "サーバー接続中にエラーが発生しました。"
  	mes "エラー("+ernum+") : "+erm
  	;objsize 120,20
  	;pos 260,230
  	;button "OK",*o2m0
  	o2button 2,260,230,120,20
  *o2m4
  	o2bdraw
  	stick a,,1
  	if a&$20 : goto *o2m0
  	if a&$100 {
  		o2bcheck:if stat>=0 : goto *o2m0
  	}
  	wait 5
  	goto *o2m4
  
  
  #deffunc o2draw
  	return
  
  
  #deffunc o2error int _p1g
  
  	ernum=_p1g
  	o2cls 400
  	font "MS ゴシック",14,1+16
  	pos 160,180
  	mes "エラーが発生しました。"
  	mes o2errm
  	o2button 2,260,230,120,20
  *o2e
  	o2bdraw
  	stick a,,1
  	if a&$100 {
  		o2bcheck:if stat>=0 : return
  	}
  	wait 5
  	goto *o2e
  
  
  #deffunc o2game int _p1h
  
  	gcline=_p1h
  	if gcline<4 : gcline=4
  	if gcline>23 : gcline=23
  
  	sdim	in_mess,80
  	sdim	out_mess,80
  	gsel 0
  	o2cls 400
  	font "MS ゴシック",12,1+16
  	pos 16,420:mes "ID:"+user_id+" ( Chat Window )"
  
  	o2sendchatp "",MSG_LOGIN			; entry message
  	in_mess=""
  	objsize	480,24
  	pos 16,436 : input in_mess : mesid=stat
  	;objsel mesid
  	meslen=0
  	chaty=370-(gcline*16)
  	o2stat=0
  	color 64,64,64:boxf 16,chaty+12,620,chaty+13
  
  	o2gchat_stat@ = 0
  
  	dim o2ibuf,1024					; 4096byte alloc
  	ibufmax=4096
  	ibsize=0
  	ibcnt=0
  	ibdata=0
  	ibmode=4			; 0=waiting / 1=wait header / 2=recieve / 3=data ready / 4=n/c
  
  	return
  
  
  #deffunc o2gchat
  
  	;	big packet process
  
  	if ibmode>2 : goto *gcmain0
  	;
  	seDataStat@:if stat = 0 : goto *gcmain0
  	a=stat
  	if ibmode=2 : goto *gcmain1
  	if ibmode=1 : goto *gcmain2
  	ibmode=1
  	seDataGet@ ibdata
  	if ibdata!$ff : dialog "Packet error("+ibdata+")" : goto *gcmain0
  	a-:if a=0 : goto *gcmain0
  *gcmain2
  	seDataGet@ ibsize
  	ibcnt=0
  	if ibsize<1 : ibmode=0 : goto *gcmain0
  	ibmode=2
  	a-:if a=0 : goto *gcmain0
  *gcmain1
  	seDataGet@ o2ibuf.ibcnt
  	ibcnt+:if ibcnt>=ibsize : ibmode=3 : goto *gcmain0
  	a-:if a : goto *gcmain1
  	goto *gcmain0
  
  *gcmain0
  	;	status process
  	if o2stat = 11 : o2gchat_stat@ = -1 : o2errm="通信エラー"
  
  	;	chat process
  	seChatGet@ out_mess
  	if stat {
  		a=stat>>8
  		font "MS ゴシック",12,1+16
  		o2putchat out_mess,a
  	}
  	stick key,0,1
  	if ( key&32 ){
  		a=strlen(in_mess)
  		if a : if a=meslen : goto *gcent
  	} else {
  		meslen=strlen (in_mess)
  	}
  	return
  *gcent
  	if in_mess!="" : seChatPut@ in_mess
  	o2wait 3
  	meslen=0:objprm	mesid,""
  	return
  
  
  #deffunc o2gcls int _p1i
  	redraw 0
  	if _p1i<0 : return
  	if _p1i=0 : color 211,208,202
  	if _p1i=1 : color 0,0,0
  	boxf 16,16,624,chaty
  	return
  
  
  #deffunc o2gupdate
  	redraw 1,16,16,624-16,chaty-16
  	return
  
  
  #deffunc o2lexit
  
  	o2sendchatp "",MSG_LOGOUT
  	repeat 16
  	o2lchat
  	o2wait 30
  	loop
  	return
  
  
  #deffunc o2gexit
  
  	font "MS ゴシック",12,1+16
  	o2sendchatp "",MSG_LOGOUT
  	repeat 16
  	o2lchat
  	o2wait 30
  	loop
  	seRoomSet@ -3
  	return
  
  
  #deffunc o2sends val _v0c,int _p3c
  
  
  	seDataPut@ $ff,_p3c
  	a=strlen(_v0c):a=(a+4)>>2
  	seDataPut@ a,_p3c
  	ibdata=0
  
  	repeat a
  	memcpy ibdata,_v0c,4,0,cnt*4
  	seDataPut@ ibdata,_p3c
  	loop
  
  	return
  
  
  #deffunc o2send val _v0,int _p2e,int _p3a
  
  
  	seDataPut@ $ff,_p3a
  	seDataPut@ _p2e,_p3a
  
  	repeat _p2e
  	seDataPut@ _v0.cnt,_p3a
  	loop
  
  	return
  
  
  #deffunc o2recv val _v0a
  
  	mref _p0,64
  
  	if ibmode!3 : _p0=0 : return
  
  	memcpy _v0a,o2ibuf,ibsize
  	ibmode=0
  	_p0=ibsize
  	return
  
  
  #deffunc o2recvs val _v0b
  
  	mref _p0,64
  
  	if ibmode!3 : _p0=0 : return
  
  	memcpy _v0b,o2ibuf,ibsize<<2
  	ibmode=0
  	_p0=ibsize<<2
  	return
  
  
  #deffunc o2pkmode int _p1j
  
  	if _p1j : ibmode=0 : return
  	ibmode=4
  	return
  
  #global
  
  
  }}}
+ - チャットの入力ボックスに入力できる最大文字数で発言した際、私の環境(HSP3.21 OS:WindowsXP SP3 CPU:CeleronM)ではアプリケーションエラーが発生しました。チャットの受信データはユーザIDとコロン':'が頭に付くので、o2lobbyとo2gameのout_messは十分な大きさ(in_messが80バイトであれば97バイト以上)を指定すると対処できるかと思います。-- [[funsuke]]
- - 私の環境(HSP3.21 OS:WindowsXP SP3 CPU:CeleronM)でアプリケーションエラーが発生しました。チャットの受信データはユーザIDとコロン':'が頭に付くので、o2lobbyとo2gameのout_messは十分な大きさ(in_messが80であれば97以上)を指定すると良いです。-- [[funsuke]]
  
  * sephira.as for HSP3
  {{{
  // こちらは互換があるということで掲載の必要なし?
  }}}
  * o2.hs for HHX
  {{{
  // 
  }}}