Commit acbcd980 authored by 神楽坂玲奈's avatar 神楽坂玲奈

临时提交,不能用

parent f5d31080
--- ---
fullscreen: false fullscreen: false
width: 1024 width: 1024
height: 768 height: 768
autologin: true autologin: true
username: zh99997 username: zh99997
password: "111111" password: '111111'
cd /d %~dp0 cd /d %~dp0
echo ------------------ >> log.txt echo ------------------ >> log.txt
echo ------------------ >> err.txt echo ------------------ >> err.txt
ruby\bin\ruby lib/main.rb >> log.txt 2>> err.txt ruby\bin\ruby lib/main.rb 0>>log.txt 2>>err.txt
\ No newline at end of file \ No newline at end of file
...@@ -31,10 +31,10 @@ class FPSTimer ...@@ -31,10 +31,10 @@ class FPSTimer
#yield #yield
nxt = @old + @spf nxt = @old + @spf
#now = #now =
yield if nxt > Time.now.to_f yield# if nxt > Time.now.to_f
if (sleeptime = nxt - Time.now.to_f) > 0 #if (sleeptime = nxt - Time.now.to_f) > 0
sleep(sleeptime) sleep(0.01)
end #end
#end #end
@old = nxt @old = nxt
calc_real_fps calc_real_fps
......
...@@ -37,7 +37,6 @@ $screen = Screen.open($config["width"], $config["height"], 0, style) ...@@ -37,7 +37,6 @@ $screen = Screen.open($config["width"], $config["height"], 0, style)
TTF.init TTF.init
Mixer.open(Mixer::DEFAULT_FREQUENCY,Mixer::DEFAULT_FORMAT,Mixer::DEFAULT_CHANNELS,512) Mixer.open(Mixer::DEFAULT_FREQUENCY,Mixer::DEFAULT_FORMAT,Mixer::DEFAULT_CHANNELS,512)
require_relative 'scene' require_relative 'scene'
require_relative 'window' require_relative 'window'
require_relative 'window_list' require_relative 'window_list'
...@@ -45,6 +44,8 @@ require_relative 'window_user' ...@@ -45,6 +44,8 @@ require_relative 'window_user'
require_relative 'scene_title' require_relative 'scene_title'
require_relative 'fpstimer' require_relative 'fpstimer'
require_relative 'widget_msgbox' require_relative 'widget_msgbox'
#4.times{Thread.new{loop{sleep 0.01}}}
Thread.current.priority=20
$fpstimer = FPSTimer.new $fpstimer = FPSTimer.new
$scene = Scene_Title.new $scene = Scene_Title.new
begin begin
......
...@@ -4,36 +4,86 @@ class NBX < Iduel ...@@ -4,36 +4,86 @@ class NBX < Iduel
Version = "20090622" Version = "20090622"
Port=2583 Port=2583
RS = "\xA1\xE9".force_encoding "GBK" RS = "\xA1\xE9".force_encoding "GBK"
attr_accessor :user attr_accessor :user, :room
def initialize def initialize
require 'socket' require 'socket'
require 'digest/md5' require 'digest/md5'
require 'open-uri' require 'open-uri'
#require_relative 'iduel_action' require_relative 'nbx_action'
require_relative 'nbx_event' require_relative 'nbx_event'
require_relative 'nbx_user' require_relative 'nbx_user'
#require_relative 'iduel_room' require_relative 'nbx_room'
@conn_hall = UDPSocket.new @conn_hall = UDPSocket.new
@conn_hall.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true) @conn_hall.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
@conn_hall.bind('0.0.0.0', Port) @conn_hall.bind('0.0.0.0', Port)
@recv = Thread.new { recv *@conn_hall.recvfrom(1024) while @conn_hall } @recv_hall = Thread.new { recv *@conn_hall.recvfrom(1024) while @conn_hall }
Thread.abort_on_exception = true Thread.abort_on_exception = true
end end
def send(user, head, *args) def send(user, head, *args)
@conn_hall.send("#{head}|#{args.join(',')}", 0, user ? user.host : '<broadcast>', Port) case user
when NBX::User #大厅里给特定用户的回复
@conn_hall.send("#{head}|#{args.join(',')}", 0, user.host, Port)
when nil #大厅里的广播
@conn_hall.send("#{head}|#{args.join(',')}", 0, '<broadcast>', Port)
when :room #房间里,发给对手和观战者
@conn_room.write(head.encode("GBK") + RS)
when :watchers #房间里,发给观战者
end
end end
def login(username) def login(username)
send(nil, 'USERONLINE', username, 1)
@user = User.new(username, 'localhost') @user = User.new(username, 'localhost')
send(nil, 'USERONLINE', username, 1)
end
def host
@room = NBX::Room.new(@user)
#p @room
#if room.player2
# @conn_hall.send(nil, "SingleRoomInfo", room.player1.name,room.player2.name, room.player2.host)
#else
send(nil, "SingleRoomInfo", @room.player1.name)
#end
@conn_room_server = TCPServer.new '0.0.0.0', Port #为了照顾NBX强制IPv4
@accept_room = Thread.new{Thread.start(@conn_room_server.accept) {|client| accept(client)} while @conn_room_server}
end
def accept(client)
if @conn_room #如果已经连接了,进入观战
else #连接
@conn_room = client
@conn_room.set_encoding "GBK"
send(:room, "[LinkOK]|#{Version}")
send(:room, "▓SetName:#{@user.name}▓")
send(:room, "[☆]开启 游戏王NetBattleX Version 2.7.0\r\n[10年3月1日禁卡表]\r\n▊▊▊E8CB04")
@room.player2 = User.new("对手", client.addr[2])
while info = @conn_room.gets(RS)
recv_room(info)
end
@conn_room.close
#send(:room, "▓SetName:zh▓") #原版协议里还要重复声明一次名字,不过似乎没什么用处,就给省略了
end
end
def recv_room(info)
info.chomp!(RS)
info.encode! "UTF-8", :invalid => :replace, :undef => :replace
puts ">> #{info}"
Event.push Event.parse info
end
def refresh
send(nil, 'USERONLINE', @user.name, 1)
end end
def connect(server, port=Port) def connect(server, port=Port)
#@conn = TCPSocket.open(server, port) #@conn = TCPSocket.open(server, port)
#@conn.set_encoding "GBK" #@conn.set_encoding "GBK"
#@recv = Thread.new { recv @conn.gets(RS) while @conn } #@recv_hall = Thread.new { recv @conn.gets(RS) while @conn }
end end
def recv(info, addrinfo) def recv(info, addrinfo)
puts ">> #{info} -- #{addrinfo[2]}"
Socket.ip_address_list.each do |localhost_addrinfo| Socket.ip_address_list.each do |localhost_addrinfo|
if localhost_addrinfo.ip_address == addrinfo[3] if localhost_addrinfo.ip_address == addrinfo[3]
addrinfo[2] = 'localhost' addrinfo[2] = 'localhost'
......
require_relative 'iduel_action' #偷懒MODE ON
class NBX::Action < Iduel::Action
end
\ No newline at end of file
...@@ -8,23 +8,89 @@ class NBX::Event ...@@ -8,23 +8,89 @@ class NBX::Event
def self.poll def self.poll
@queue.shift @queue.shift
end end
def self.parse(info, host) def self.parse(info, host=nil)
info =~ /^([A-Z]*)\|(.*)$/m if host #来自大厅的udp消息
case $1 info =~ /^(\w*)\|(.*)$/m
when "USERONLINE" case $1
NBX::Event::USERONLINE when "USERONLINE"
when "Query" NBX::Event::USERONLINE
end.new($2, host) when "SingleRoomInfo"
NBX::Event::SingleRoomInfo
end.new($2, host)
else #来自房间的消息
case info
when /▓SetName:(.*)▓/
NBX::Event::SetName
when /\[VerInf\]\|(.*)/
NBX::Event::VerInf
when /(\[☆\]开启 游戏王NetBattleX Version .*\r\n\[.*年.*月.*日禁卡表\]\r\n)▊▊▊.*/
NBX::Event::Connect
when /关闭游戏王NetBattleX .*▊▊▊.*/
NBX::Event::DisConnect
when /(\[\d+\] .*▊▊▊.*)/m
NBX::Event::Action
else
p '------unkonwn nbx event--------'
p info
end.new($1)
end
end end
end end
class NBX::Event::USERONLINE < NBX::Event class NBX::Event::USERONLINE < NBX::Event
attr_reader :user#, :session attr_reader :user#, :session
def initialize(info, host) def initialize(info, host)
username, need_reply = info.split(',') username, need_reply = info.split(',')
@user = NBX::User.new(username, host) @user = NBX::User.new(username, host)
@need_reply = need_reply == "1" @need_reply = need_reply == "1"
p info, need_reply, @need_reply, @need_reply and @user != $nbx.user if @need_reply and @user != $nbx.user
$nbx.send(@user, 'USERONLINE', $nbx.user.name) if @need_reply and @user != $nbx.user $nbx.send(@user, 'USERONLINE', $nbx.user.name)
if $nbx.room and $nbx.room.player1 == $nbx.user #如果自己是主机
if $nbx.room.player2
$nbx.send(@user, "SingleRoomInfo", $nbx.room.player1.name,$nbx.room.player2.name, $nbx.room.player2.host)
else
$nbx.send(@user, "SingleRoomInfo", $nbx.room.player1.name)
end
end
end
end
end
class NBX::Event::RoomConnect
attr_reader :user
def initialize(info, host)
@user = NBX::User.new(info, host)
$nbx.room.player2 = @user
end
end
class NBX::Event::SingleRoomInfo < NBX::Event
attr_reader :room
def initialize(info, host)
player1_name, player2_name, player2_host = info.split(',')
player1 = NBX::User.new(player1_name, host)
player2 = NBX::User.new(player2_name, player2_host) if player2_name
@room = NBX::Room.new(player1, player2)
end
end
class NBX::Event::SetName < NBX::Event
def initialize(info)
$nbx.room.player2.name = info
end
end
class NBX::Event::VerInf < NBX::Event
def initialize(info)
end
end
class NBX::Event::Connect < NBX::Event
def initialize(info)
end
end
class NBX::Event::DisConnect < NBX::Event
def initialize(info)
end
end
class NBX::Event::Action < NBX::Event
def initialize(info)
@action = ::Action.parse info
end end
end end
\ No newline at end of file
class NBX::Room
@@all = []
attr_accessor :player1, :player2
class << self
alias old_new new
def new(player1, player2=nil)
room = @@all.find{|room| room.player1 == player1 }
if room
room
else
room = old_new(player1, player2)
@@all << room
room
end
end
end
def initialize(player1, player2=nil)
@player1 = player1
@player2 = player2
end
def id
player1.host
end
def name
player1.name
end
def color
[0,0,0]
end
def private?
false
end
alias full? player2
end
\ No newline at end of file
...@@ -18,7 +18,10 @@ class NBX::User ...@@ -18,7 +18,10 @@ class NBX::User
@name = name @name = name
@host = host @host = host
end end
def avatar(size) def status
:waiting
end
def avatar(size=:small)
Surface.new(SWSURFACE, 1, 1, 32, 0,0,0,0) Surface.new(SWSURFACE, 1, 1, 32, 0,0,0,0)
end end
end end
\ No newline at end of file
...@@ -47,7 +47,9 @@ class Scene ...@@ -47,7 +47,9 @@ class Scene
# ● 更新画面 # ● 更新画面
#-------------------------------------------------------------------------- #--------------------------------------------------------------------------
def update def update
#p Thread.list
while event = Event.poll while event = Event.poll
p event
handle(event) handle(event)
end end
#@fps.clear(0,0,100,24) #@fps.clear(0,0,100,24)
......
#encoding: UTF-8
#============================================================================== #==============================================================================
# ■ Scene_Config # ■ Scene_Config
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
......
...@@ -28,7 +28,7 @@ class Scene_Duel < Scene ...@@ -28,7 +28,7 @@ class Scene_Duel < Scene
@room = room @room = room
end end
def start def start
$iduel.upinfo $iduel.upinfo if $iduel
@bgm = Mixer::Music.load "audio/bgm/title.ogg" @bgm = Mixer::Music.load "audio/bgm/title.ogg"
Mixer.fade_in_music(@bgm, 8000, -1) Mixer.fade_in_music(@bgm, 8000, -1)
@background = Surface.load "graphics/field/main.png" @background = Surface.load "graphics/field/main.png"
...@@ -55,6 +55,8 @@ class Scene_Duel < Scene ...@@ -55,6 +55,8 @@ class Scene_Duel < Scene
@action_window = Window_Action.new @action_window = Window_Action.new
@chat_window = Window_RoomChat.new(@cardinfo_window.x, @cardinfo_window.height, 1024-@cardinfo_window.x, 768-@cardinfo_window.height) @chat_window = Window_RoomChat.new(@cardinfo_window.x, @cardinfo_window.height, 1024-@cardinfo_window.x, 768-@cardinfo_window.height)
super super
#(Thread.list - [Thread.current]).each{|t|t.kill}
#p Thread.list
end end
def change_phase(phase) def change_phase(phase)
...@@ -160,8 +162,14 @@ class Scene_Duel < Scene ...@@ -160,8 +162,14 @@ class Scene_Duel < Scene
end end
def update def update
@cardinfo_window.update @cardinfo_window.update
while event = Iduel::Event.poll if $iduel
handle_iduel(event) while event = Iduel::Event.poll
handle_iduel(event)
end
elsif $nbx
while event = NBX::Event.poll
handle_iduel(event)
end
end end
super super
end end
......
...@@ -62,7 +62,12 @@ class Scene_Hall_NBX < Scene ...@@ -62,7 +62,12 @@ class Scene_Hall_NBX < Scene
#$iduel.qroom room #$iduel.qroom room
# end # end
#$iduel.close #$iduel.close
$scene = Scene_Login.new # $scene = Scene_Login.new
when Key::F2
$nbx.host
@joinroom_msgbox = Widget_Msgbox.new("创建房间", "正在等待对手"){}
when Key::F5
$nbx.refresh
end end
when Event::KeyUp when Event::KeyUp
case event.sym case event.sym
...@@ -108,7 +113,16 @@ class Scene_Hall_NBX < Scene ...@@ -108,7 +113,16 @@ class Scene_Hall_NBX < Scene
else else
@playerlist.refresh @playerlist.refresh
end end
when NBX::Event::SingleRoomInfo
if !@roomlist.list.include? event.room
@roomlist.list << event.room
@roomlist.list = @roomlist.list #OMG...
else
@roomlist.refresh
end
when NBX::Event::Connect
require_relative 'scene_duel'
$scene = Scene_Duel.new($nbx.room)
# #
#when Iduel::Event::OLIF #when Iduel::Event::OLIF
# @playerlist.list = event.users # @playerlist.list = event.users
......
...@@ -29,6 +29,7 @@ class Scene_Title < Scene ...@@ -29,6 +29,7 @@ class Scene_Title < Scene
end end
def update def update
while event = Event.poll while event = Event.poll
p event
case event case event
when Event::MouseMotion when Event::MouseMotion
if @command_window.include?(event.x, event.y) if @command_window.include?(event.x, event.y)
......
class Widget_InputBox < Window class Widget_InputBox < Window
=begin
attr_accessor :text, :proc attr_accessor :text, :proc
require 'tk' require 'tk'
@@font = TkFont.new("family" => 'WenQuanYi Micro Hei', @@font = TkFont.new("family" => 'WenQuanYi Micro Hei',
...@@ -15,7 +16,8 @@ class Widget_InputBox < Window ...@@ -15,7 +16,8 @@ class Widget_InputBox < Window
bind('Key-Return'){@@active.proc.call(get);delete(0, get.size);@@root.withdraw(true);true} bind('Key-Return'){@@active.proc.call(get);delete(0, get.size);@@root.withdraw(true);true}
pack pack
} }
Thread.new{Tk.mainloop}.priority = 1
Thread.new{Tk.mainloop}
def initialize(x,y,width,height,z=300, &block) def initialize(x,y,width,height,z=300, &block)
super(x,y,width,height,z) super(x,y,width,height,z)
@font = TTF.open("fonts/WenQuanYi Micro Hei.ttf", 20) @font = TTF.open("fonts/WenQuanYi Micro Hei.ttf", 20)
...@@ -36,6 +38,9 @@ class Widget_InputBox < Window ...@@ -36,6 +38,9 @@ class Widget_InputBox < Window
@@root.deiconify @@root.deiconify
@@entry.focus :force @@entry.focus :force
end end
=end
def method_missing(*args)
end
end end
#encoding: UTF-8
class Window_Config < Window class Window_Config < Window
def initialize(x,y) def initialize(x,y)
super(x,y,$screen.w, $screen.h) super(x,y,$screen.w, $screen.h)
......
...@@ -43,6 +43,9 @@ class Window_PlayerList < Window_List ...@@ -43,6 +43,9 @@ class Window_PlayerList < Window_List
@height = @item_max * WLH @height = @item_max * WLH
refresh refresh
end end
def clear(x=0,y=0,width=@width,height=@height)
@contents.fill_rect(x,y,width,height,0x66FFFFFF)
end
def clicked def clicked
#$scene.refresh_rect(*item_rect(@index)){draw_item(@index, 2)} if @index #$scene.refresh_rect(*item_rect(@index)){draw_item(@index, 2)} if @index
@userwindow = Window_User.new(100,100,@list[@index]) @userwindow = Window_User.new(100,100,@list[@index])
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment