Commit 99fda169 authored by 神楽坂玲奈's avatar 神楽坂玲奈

临时提交

parent 5a2f4348
graphics/system/icon.gif

5.56 KB | W: | H:

graphics/system/icon.gif

5.48 KB | W: | H:

graphics/system/icon.gif
graphics/system/icon.gif
graphics/system/icon.gif
graphics/system/icon.gif
  • 2-up
  • Swipe
  • Onion skin
......@@ -16,29 +16,7 @@ class Iduel < Game
load File.expand_path('user.rb', File.dirname(__FILE__))
load File.expand_path('replay.rb', File.dirname(__FILE__))
end
def connect
require 'socket'
require 'open-uri'
begin
@conn = TCPSocket.new(Server, Port) #TODO: 阻塞优化,注意login。下面注释掉的两句实现connect无阻塞,但是login依然会阻塞所以只优化这里没有意义
#@conn = Socket.new(:INET, :STREAM)
@conn.set_encoding "GBK", "UTF-8", :invalid => :replace, :undef => :replace
@recv = Thread.new do
begin
#@conn.connect Socket.pack_sockaddr_in(Port, Server)
recv @conn.gets(RS) while @conn
rescue => exception
Game_Event.push Game_Event::Error.new(exception.class.to_s, exception.message)
$log.error [exception.inspect, *exception.backtrace].join("\n")
ensure
self.exit
end
end
rescue => exception
Game_Event.push Game_Event::Error.new("网络错误", "连接服务器失败")
$log.error [exception.inspect, *exception.backtrace].join("\n")
end
end
def rename
##8|241019,测试改昵称,5b58559aaf8869282fe3cb9585ffa909¢
#$N|iDuel系统,您的改名请求已经提交,重新登录后即可看到效果。¢
......@@ -61,6 +39,7 @@ class Iduel < Game
send(5, @key, room.id, password, checknum("WATCHROOMMSG", "#{@session}#{room.id}#{password}"))
end
def leave
return unless @room
if @room.include? @user
send(10, @key, room.id, checknum("QROOM", @session + room.id.to_s))
else
......@@ -81,13 +60,7 @@ class Iduel < Game
end
def send(head, *args)
return unless @conn
info = "##{head.to_s(16).upcase}|#{args.join(',')}" + RS
$log.info "<< #{info}"
info.gsub!("\n", "\r\n")
(@conn.write info) rescue Game_Event.push Game_Event::Error.new($!.class.to_s, $!.message)
end
def recv(info)
if info.nil?
@conn.close
......@@ -100,9 +73,7 @@ class Iduel < Game
Game_Event.push Game_Event.parse info
end
end
def checknum(head, *args)
Digest::MD5.hexdigest("[#{head}]_#{args.join('_')}_SCNERO".gsub("\n", "\r\n").encode("GBK"))
end
def qroom(room)
send(10, @key, room.id, checknum("QROOM", @session + room.id.to_s))
end
......@@ -110,6 +81,38 @@ class Iduel < Game
send(4, @key, msg, checknum("CHATP", @session))
#4|241019,test,2368c6b89b3e2eedb92e1b624a2a157c
end
private
def connect
require 'socket'
require 'open-uri'
begin
@conn = TCPSocket.new(Server, Port) #TODO: 阻塞优化,注意login。下面注释掉的两句实现connect无阻塞,但是login依然会阻塞所以只优化这里没有意义
#@conn = Socket.new(:INET, :STREAM)
@conn.set_encoding "GBK", "UTF-8", :invalid => :replace, :undef => :replace
@recv = Thread.new do
begin
#@conn.connect Socket.pack_sockaddr_in(Port, Server)
recv @conn.gets(RS) while @conn
rescue => exception
Game_Event.push Game_Event::Error.new(exception.class.to_s, exception.message)
$log.error('iduel-connect-1') {[exception.inspect, *exception.backtrace].join("\n")}
ensure
self.exit
end
end
rescue => exception
Game_Event.push Game_Event::Error.new("网络错误", "连接服务器失败")
$log.error('iduel-connect-2') {[exception.inspect, *exception.backtrace].join("\n")}
end
end
def checknum(head, *args)
Digest::MD5.hexdigest("[#{head}]_#{args.join('_')}_SCNERO".gsub("\n", "\r\n").encode("GBK"))
end
def send(head, *args)
return unless @conn
info = "##{head.to_s(16).upcase}|#{args.join(',')}" + RS
$log.info "<< #{info}"
info.gsub!("\n", "\r\n")
(@conn.write info) rescue Game_Event.push Game_Event::Error.new($!.class.to_s, $!.message)
end
end
\ No newline at end of file
......@@ -48,6 +48,7 @@ begin
rescue Exception => exception
exception.backtrace.each{|backtrace|break if backtrace =~ /^(.*)\.rb:\d+:in `.*'"$/} #由于脚本是从main.rb开始执行的,总会有个能匹配成功的文件
$log.fatal($1){[exception.inspect, *exception.backtrace].join("\n")}
$game.exit if $game
require_relative 'scene_error'
$scene = Scene_Error.new
retry
......
......@@ -71,6 +71,9 @@ class Game_Event
end
end
class PlayerLeave
def self.parse(info)
self.new
end
end
class Action
def self.parse(info)
......
......@@ -9,25 +9,71 @@ class NBX < Game
require 'digest/md5'
load File.expand_path('action.rb', File.dirname(__FILE__))
load File.expand_path('event.rb', File.dirname(__FILE__))
load File.expand_path('user.rb', File.dirname(__FILE__))
end
def login(username)
connect
Game_Event.push Game_Event::Login.new(User.new('localhost', username)) if @conn_hall
end
def host(name=@user.name)
@room = Room.new(@user.id, name, @user)
Game_Event.push Game_Event::Host.new(@room)
send(nil, "NewRoom", @room.player1.name)
@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 action(action)
if @room.player2
action.from_player = false
send(:room, action.escape)
action.from_player = true
end
end
def refresh
send(nil, 'NewUser', @user.name, 1)
end
def join(host, port=Port)
Thread.new do
begin
connect_loop TCPSocket.new(host, port)
rescue
Game_Event.push Game_Event::Error.new("网络错误", "连接服务器失败")
$log.error [exception.inspect, *exception.backtrace].join("\n")
end
end
end
def exit
send(:room, "关闭游戏王NetBattleX 2.7.2▊▊▊730462") rescue nil
@recv_hall.kill rescue nil
@conn_hall.close rescue nil
@conn_hall = nil
@conn_room.close rescue nil
@conn_room = nil
@conn_room_server.close rescue nil
@conn_room_server = nil
end
def exit_room
end
private
def send(user, head, *args)
case user
when User #大厅里给特定用户的回复
@conn_hall.send("#{head}|#{args.join(',')}", 0, user.host, Port)
@conn_hall.send("#{head}|#{args.join(',')}", 0, user.host, Port) if @conn_hall
when nil #大厅里的广播
@conn_hall.send("#{head}|#{args.join(',')}", 0, '<broadcast>', Port)
@conn_hall.send("#{head}|#{args.join(',')}", 0, '<broadcast>', Port) if @conn_hall
when :room #房间里,发给对手和观战者
@conn_room.write(head.gsub("\n", "\r\n") + RS)
@conn_room.write(head.gsub("\n", "\r\n") + RS) if @conn_room
when :watchers #房间里,发给观战者
end
end
def login(username)
connect
Game_Event.push Game_Event::Login.new(User.new('localhost', username)) if @conn_hall
end
def connect
require 'socket'
require 'open-uri'
......@@ -35,26 +81,20 @@ class NBX < Game
@conn_hall = UDPSocket.new
@conn_hall.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
@conn_hall.bind('0.0.0.0', Port)
@recv_hall = Thread.new { recv *@conn_hall.recvfrom(1024) while @conn_hall }
Thread.abort_on_exception = true
rescue => exception
@conn_hall = nil
@recv_hall = Thread.new do
begin
recv *@conn_hall.recvfrom(1024) while @conn_hall
rescue Exception => exception
self.exit
Game_Event.push Game_Event::Error.new(exception.class.to_s, exception.message)
$log.error('nbx-connect-1') {[exception.inspect, *exception.backtrace].join("\n")}
end
end
rescue Exception => exception
self.exit
Game_Event.push Game_Event::Error.new(exception.class.to_s, exception.message)
$log.error [exception.inspect, *exception.backtrace].join("\n")
end
end
def host(name=@user.name)
@room = Room.new(@user.id, name, @user)
Game_Event.push Game_Event::Host.new(@room)
send(nil, "NewRoom", @room.player1.name)
@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 action(action)
if @room.player2
action.from_player = false
send(:room, action.escape)
action.from_player = true
$log.error('nbx-connect-2') {[exception.inspect, *exception.backtrace].join("\n")}
end
end
def accept(client)
......@@ -70,19 +110,6 @@ class NBX < Game
$log.info ">> #{info}"
Game_Event.push Game_Event.parse info
end
def refresh
send(nil, 'NewUser', @user.name, 1)
end
def join(host, port=Port)
Thread.new do
begin
connect_loop TCPSocket.new(host, port)
rescue
Game_Event.push Game_Event::Error.new("网络错误", "连接服务器失败")
$log.error [exception.inspect, *exception.backtrace].join("\n")
end
end
end
def connect_loop(conn)
@conn_room = conn
begin
......@@ -92,13 +119,13 @@ class NBX < Game
send(:room, "[VerInf]|#{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(host, "对手")
@room.player2 = User.new(conn.addr[2], "对手")
while info = @conn_room.gets(RS)
recv_room(info)
end
rescue Exception => exception
Game_Event.push Game_Event::Error.new(exception.class.to_s, exception.message)
$log.error [exception.inspect, *exception.backtrace].join("\n")
$log.error('nbx-connect-loop') { [exception.inspect, *exception.backtrace].join("\n")}
ensure
@conn_room.close
@conn_room = nil
......
class User
def avatar(size=:small)
Surface.load("#{ENV['TEMP']}/#{ENV['USERNAME']}.bmp") rescue Surface.new(SWSURFACE, 1, 1, 32, 0,0,0,0)
end
end
......@@ -103,6 +103,7 @@ class Scene
def handle_game(event)
case event
when Game_Event::Error
$game.exit if $game
Widget_Msgbox.new(event.title, event.message, :ok => "确定"){$scene = Scene_Title.new if event.fatal}
else
$log.debug event
......
......@@ -40,7 +40,7 @@ class Scene_Duel < Scene
@opponent_lp_window = Window_LP.new(360,0, @room.player2, false)
@player_field_window = Window_Field.new(4, 398, $game.player_field, true)
@opponent_field_window = Window_Field.new(4, 60, $game.opponent_field, false)
@opponent_field_window.angle=180
#@opponent_field_window.angle=180
@phases_window = Window_Phases.new(122, 356)
@fieldback_window = Window_FieldBack.new(130,174)
......
#encoding: UTF-8
class Widget_InputBox < Window
attr_reader :value, :proc
attr_accessor :type
......
class Window
WLH = 24
attr_accessor :x, :y, :width, :height, :z, :contents, :angle, :visible, :viewport
alias visible? visible
def initialize(x, y, width, height, z=200)
@x = x
@y = y
......
......@@ -382,4 +382,10 @@ class Window_Field < Window
refresh
mousemoved(Mouse.state[0], Mouse.state[1])
end
def clear(x=0,y=0,width=@width,height=@height)
super
if $scene.fieldback_window.visible?
Surface.blit($scene.fieldback_window.contents, @x+x-$scene.fieldback_window.x, @y+y-$scene.fieldback_window.y, width, height, @contents, x, y)
end
end
end
\ No newline at end of file
......@@ -41,7 +41,8 @@ class Window_UserList < Window_List
#end
def clicked
#$scene.refresh_rect(*item_rect(@index)){draw_item(@index, 2)} if @index
@userwindow = Window_User.new(100,100,@list[@index])
return unless @index
@userwindow = Window_User.new(100,100,@list[@index])
end
def mousemoved(x,y)
return unless include?(x,y)
......
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