More ... | 編集履歴:差分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 {{{ // }}} |