More ... | 編集履歴:差分記録開始以来の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]] + * sephira.as for HSP3 {{{ // こちらは互換があるということで掲載の必要なし? }}} * o2.hs for HHX {{{ // }}} |