[トップ][編集][ノート][編集履歴][一覧][最近の更新][->English]

O2 for HSP3


はじめに...

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

//