More ... | O2 for HSP3はじめに...HSPTV!メルマガの「教えて!おにたま!!」からおにたまさんの回答の引用です。
確認事項自信のある人は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
sephira.as for HSP3// こちらは互換があるということで掲載の必要なし? o2.hs for HHX// |