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

iduel观战初步

parent aebd808b
...@@ -95,6 +95,9 @@ class Action ...@@ -95,6 +95,9 @@ class Action
player_field.extra player_field.extra
when :removed when :removed
player_field.removed player_field.removed
else
puts '奇怪的from_field'
puts
end end
if @from_pos.is_a? Integer if @from_pos.is_a? Integer
......
...@@ -2,8 +2,11 @@ module Cacheable ...@@ -2,8 +2,11 @@ module Cacheable
@@all = {} @@all = {}
def new(id, *args) def new(id, *args)
@@all[self] ||= {} @@all[self] ||= {}
@@all[self][id] ||= super() if result = @@all[self][id]
@@all[self][id].set(id, *args) result.set(id, *args)
@@all[self][id] result
else
@@all[self][id] = super(id, *args)
end
end end
end end
\ No newline at end of file
...@@ -8,10 +8,10 @@ class Game ...@@ -8,10 +8,10 @@ class Game
@users = [] @users = []
@rooms = [] @rooms = []
end end
def refresh
end
def login(username, password=nil) def login(username, password=nil)
end end
def refresh
end
def host def host
end end
def join(room) def join(room)
......
...@@ -98,7 +98,10 @@ class Game_Event ...@@ -98,7 +98,10 @@ class Game_Event
$game.room = @room $game.room = @room
end end
end end
class Leave < Game_Event
def initialize
end
end
class PlayerJoin < Game_Event class PlayerJoin < Game_Event
attr_reader :user attr_reader :user
def initialize(user) def initialize(user)
...@@ -114,7 +117,7 @@ class Game_Event ...@@ -114,7 +117,7 @@ class Game_Event
class Action < Game_Event class Action < Game_Event
attr_reader :action, :str attr_reader :action, :str
def initialize(action, str=Action.escape) def initialize(action, str=action.escape)
@action = action @action = action
@str = str @str = str
end end
......
This diff is collapsed.
This diff is collapsed.
...@@ -5,81 +5,83 @@ class Iduel < Game ...@@ -5,81 +5,83 @@ class Iduel < Game
Port = 38522 Port = 38522
RS = "\xA1\xE9".force_encoding "GBK" RS = "\xA1\xE9".force_encoding "GBK"
Color = [[0,0,0], [255,0,0], [0,255,0], [0,0,255], [255, 165, 0]]
attr_accessor :session attr_accessor :session
attr_accessor :key attr_accessor :key
def initialize def initialize
super
require 'socket' require 'socket'
require 'digest/md5' require 'digest/md5'
require 'open-uri' require 'open-uri'
require_relative 'action' require_relative 'action'
require_relative 'event' require_relative 'event'
require_relative 'user' require_relative 'user'
require_relative 'room'
@conn = TCPSocket.open(Server, Port) @conn = TCPSocket.open(Server, Port)
@conn.set_encoding "GBK" @conn.set_encoding "GBK"
Thread.abort_on_exception = true Thread.abort_on_exception = true
@recv = Thread.new { recv @conn.gets(RS) while @conn } @recv = Thread.new { recv @conn.gets(RS) while @conn }
end end
def login(username, password)
md5 = Digest::MD5.hexdigest(password)
send(0, username, md5, checknum("LOGINMSG", username, md5), VERSION)
end
def refresh
send(1, @key, checknum("UPINFOMSG", @session))
end
def host(name, password="", lv=0, color = 0)
send(6, @key, name, password, checknum("JOINROOMMSG", @session + name + password + "0"), 0, color, lv, 0, nil, nil) #TODO:v.ak, v.al
end
def join(room, password="")
send(6, @key, room.id, password, checknum("JOINROOMMSG", @session + room.id.to_s + password + "1"),1)
end
def watch(room, password="")
send(5, @key, room.id, password, checknum("WATCHROOMMSG", "#{@session}#{room.id}#{password}"))
end
def leave
if @room.include? @user
#
else
send("QUITWATCHROOM", @key, checknum("QUITWATCHROOM", @session))
end
end
def action(action)
send(2, "#{checknum("RMSG", @session)}@#{@key}", "#{action.escape}▊▊▊000000") if @room.include? @user#TODO:iduel校验字串
end
def exit
send(11, @key, checknum("ULO", "#{@session}"))
@recv.exit
@conn.close
@conn = nil
end
def send(head, *args) def send(head, *args)
info = "##{head.to_s(16).upcase}|#{args.join(',')}".encode("GBK") + RS info = "##{head.to_s(16).upcase}|#{args.join(',')}".encode("GBK") + RS
puts "<< #{info}" puts "<< #{info}"
(@conn.write info) rescue Event.push Event::Error.new(0) (@conn.write info) rescue Game_Event.push Game_Event::Error.new(0)
end end
def recv(info) def recv(info)
if info.nil? if info.nil?
@conn.close @conn.close
@conn = nil @conn = nil
Event::Error.new(0) Game_Event::Error.new(0)
else else
info.chomp!(RS) info.chomp!(RS)
info.encode! "UTF-8", :invalid => :replace, :undef => :replace info.encode! "UTF-8", :invalid => :replace, :undef => :replace
puts ">> #{info}" puts ">> #{info}"
Event.push Event.parse info Game_Event.push Game_Event.parse info
end end
end end
def close
$game.quit
@recv.exit
@conn.close
@conn = nil
end
def checknum(head, *args) def checknum(head, *args)
Digest::MD5.hexdigest("[#{head}]_#{args.join('_')}_SCNERO") Digest::MD5.hexdigest("[#{head}]_#{args.join('_')}_SCNERO")
end end
def login(username, password)
md5 = Digest::MD5.hexdigest(password)
send(0, username, md5, checknum("LOGINMSG", username, md5), VERSION)
end
def refresh
send(1, @key, checknum("UPINFOMSG", @session))
end
def join(room, password="")
send(6, @key, room.id, password, checknum("JOINROOMMSG", @session + room.id.to_s + password + "1"),1)
end
def qroom(room) def qroom(room)
send(10, @key, room.id, checknum("QROOM", @session + room.id.to_s)) send(10, @key, room.id, checknum("QROOM", @session + room.id.to_s))
end end
def action(action)
send(2, "#{checknum("RMSG", @session)}@#{@key}", "#{action.escape}▊▊▊000000") #TODO:iduel校验字串
end
def host(name, password="", lv=0, color = 0)
send(6, @key, name, password, checknum("JOINROOMMSG", @session + name + password + "0"), 0, color, lv, 0, nil, nil) #TODO:v.ak, v.al
end
def watch(room, password="")
send(5, @key, room.id, password, checknum("WATCHROOMMSG", "#{@session}#{room.id}#{password}"))
end
def chat(msg) def chat(msg)
send(4, @key, msg, checknum("CHATP", @session)) send(4, @key, msg, checknum("CHATP", @session))
#4|241019,test,2368c6b89b3e2eedb92e1b624a2a157c #4|241019,test,2368c6b89b3e2eedb92e1b624a2a157c
end end
def quitwatchroom
send("QUITWATCHROOM", @key, checknum("QUITWATCHROOM", @session))
end
def quit
send(11, @key, checknum("ULO", "#{@session}"))
end
end end
\ No newline at end of file
class Iduel::Room
@@all = []
attr_accessor :id, :name, :player1, :player2, :private, :color
class << self
alias old_new new
def new(id, *args)
id = id.to_i
room = @@all.find{|room| room.id == id }
if room
room
else
room = old_new(id, *args)
@@all << room
room
end
end
end
def initialize(id, name, player1, player2, private, color, session = nil, forbid = nil)
@id =id
@name = name
@player1 = player1
@player2 = player2
@private = private
@color = color
@forbid = forbid
@session = session
end
alias full? player2
alias private? private
end
\ No newline at end of file
class Iduel::User class User
@@all = [] attr_accessor :level, :exp
attr_accessor :id, :name, :level, :exp def self.parse(info)
class << self info =~ /(.+)\((\d+)\)/
alias old_new new new $2.to_i, $1
def new(id, name = "", level = nil, exp = nil)
if id.is_a? String and id =~ /(.*)\((\d+)\)/
id = $2.to_i
name=$1
else
id = id.to_i
end
user = @@all.find{|user| user.id == id }
if user
user.name = name if name
user.level = level if level
user.exp = exp if exp
user
else
user = old_new(id, name, level, exp)
@@all << user
user
end
end
end end
def initialize(id, name = "", level = nil, exp = nil) def initialize(id, name = "", level = nil, exp = nil)
@id = id @id = id
@name = name @name = name
@level = level @level = level
@exp = exp @exp = exp
#@status = :waiting end
#@room = nil def set(id, name = :keep, level = :keep, exp = :keep)
@id = id unless id == :keep
@name = name unless name == :keep
@level = level unless level == :keep
@exp = exp unless exp == :keep
end end
def avatar(size = :small) def avatar(size = :small)
cache = "graphics/avatars/#{@id}_#{size}.png" cache = "graphics/avatars/#{@id}_#{size}.png"
...@@ -57,6 +42,6 @@ class Iduel::User ...@@ -57,6 +42,6 @@ class Iduel::User
result result
end end
def room def room
$game.rooms.find{|room|room.player1 == self or room.player2 == self} $game.rooms.find{|room|room.include? self}
end end
end end
\ No newline at end of file
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
class Game_Event class Game_Event
def self.parse(info, host=nil) def self.parse(info, host=nil)
result = (if host #来自大厅的udp消息 if host #来自大厅的udp消息
info =~ /^(\w*)\|(.*)$/m info =~ /^(\w*)\|(.*)$/m
case $1 case $1
when "NewUser" when "NewUser"
...@@ -31,9 +31,7 @@ class Game_Event ...@@ -31,9 +31,7 @@ class Game_Event
else else
Error Error
end.parse($1) end.parse($1)
end) end
p info, result
result
end end
...@@ -79,6 +77,8 @@ class Game_Event ...@@ -79,6 +77,8 @@ class Game_Event
self.new ::Action.parse(info), info self.new ::Action.parse(info), info
end end
end end
#以下NBX专有
class VerInf class VerInf
def self.parse(info) def self.parse(info)
......
...@@ -10,8 +10,6 @@ class NBX < Game ...@@ -10,8 +10,6 @@ class NBX < Game
require 'open-uri' require 'open-uri'
require_relative 'action' require_relative 'action'
require_relative 'event' require_relative 'event'
require_relative 'user'
require_relative '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)
......
#class NBX::Room < Room
#end
\ No newline at end of file
#class NBX::User < User
#end
\ No newline at end of file
class Room class Room
Color = [[0,0,0], [255,0,0], [0,255,0], [0,0,255], [255, 165, 0]]
extend Cacheable extend Cacheable
attr_accessor :id, :name, :player1, :player2, :private, :color, :forbid attr_accessor :id, :name, :player1, :player2, :private, :color, :forbid
def set(id, name, player1, player2=nil, private=false, color=[0,0,0], forbid = nil) def initialize(id, name="", player1=nil, player2=nil, private=false, color=[0,0,0], session = nil, forbid = nil)
@id = id @id = id
@name = name @name = name
@player1 = player1 @player1 = player1
@player2 = player2 @player2 = player2
@private = private @private = private
@color = color @color = color
@session = session
@forbid = forbid @forbid = forbid
end end
def set(id=:keep, name=:keep, player1=:keep, player2=:keep, private=:keep, color=:keep, session = nil, forbid=:keep)
@id = id unless id == :keep
@name = name unless name == :keep
@player1 = player1 unless player1 == :keep
@player2 = player2 unless player2 == :keep
@private = private unless private == :keep
@color = color unless color == :keep
@session = session unless session == :keep
@forbid = forbid unless forbid == :keep
end
def include?(user)
@player1 == user or @player2 == user
end
alias full? player2 alias full? player2
alias private? private alias private? private
end end
\ No newline at end of file
...@@ -21,9 +21,10 @@ class Scene_Duel < Scene ...@@ -21,9 +21,10 @@ class Scene_Duel < Scene
attr_reader :player_field_window attr_reader :player_field_window
attr_reader :opponent_field_window attr_reader :opponent_field_window
attr_reader :fieldback_window attr_reader :fieldback_window
def initialize(room) def initialize(room, deck=nil)
super() super()
@room = room @room = room
@deck = deck
end end
def start def start
$game.refresh if $game $game.refresh if $game
...@@ -37,7 +38,7 @@ class Scene_Duel < Scene ...@@ -37,7 +38,7 @@ class Scene_Duel < Scene
@phases_window = Window_Phases.new(124, 357) @phases_window = Window_Phases.new(124, 357)
@turn_player = true @turn_player = true
$game.player_field = Game_Field.new Deck.load("test1.TXT") $game.player_field = Game_Field.new @deck
$game.opponent_field = Game_Field.new $game.opponent_field = Game_Field.new
@fieldback_window = Window_FieldBack.new(130,174) @fieldback_window = Window_FieldBack.new(130,174)
...@@ -135,6 +136,8 @@ class Scene_Duel < Scene ...@@ -135,6 +136,8 @@ class Scene_Duel < Scene
@opponent_field_window.refresh @opponent_field_window.refresh
when Game_Event::Error when Game_Event::Error
Widget_Msgbox.new(event.title, event.message){$scene = Scene_Title.new} Widget_Msgbox.new(event.title, event.message){$scene = Scene_Title.new}
when Game_Event::Leave
$scene = Scene_Hall.new
end end
end end
def update def update
......
...@@ -80,7 +80,7 @@ class Scene_Hall < Scene ...@@ -80,7 +80,7 @@ class Scene_Hall < Scene
@roomlist.list = $game.rooms @roomlist.list = $game.rooms
when Game_Event::Join when Game_Event::Join
require_relative 'scene_duel' require_relative 'scene_duel'
$scene = Scene_Duel.new(event.room) $scene = Scene_Duel.new(event.room, Deck.load("test1.TXT"))
when Game_Event::Watch when Game_Event::Watch
require_relative 'scene_watch' require_relative 'scene_watch'
$scene = Scene_Watch.new(event.room) $scene = Scene_Watch.new(event.room)
......
...@@ -16,31 +16,32 @@ class Scene_Login < Scene ...@@ -16,31 +16,32 @@ class Scene_Login < Scene
end end
end end
def login def login
@font.draw_blended_utf8($screen, Vocab_Logging, 0,0,255,0,255) @font.draw_blended_utf8($screen, Vocab_Logging, 0,0,255,0,255)
$screen.update_rect(0,0,100,24)
$game = Iduel.new $game = Iduel.new
$game.login(@username, @password) $game.login(@username, @password)
end end
def update def update
while event = Event.poll
case event
when Event::Quit
$scene = nil
end
end
while event = Game_Event.poll while event = Game_Event.poll
case event handle_game(event)
when Game_Event::LOGINOK end
require_relative 'scene_hall' super
$scene = Scene_Hall.new end
when Game_Event::Error def handle(event)
Widget_Msgbox.new(event.title, event.message){$scene = Scene_Title.new} case event
else when Event::Quit
p event $scene = nil
end end
end
def handle_game(event)
case event
when Game_Event::Login
require_relative 'scene_hall'
$scene = Scene_Hall.new
when Game_Event::Error
Widget_Msgbox.new(event.title, event.message){$scene = Scene_Title.new}
else
p event
end end
end end
end end
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
#============================================================================== #==============================================================================
require_relative 'scene_duel' require_relative 'scene_duel'
class Scene_Watch < Scene_Duel class Scene_Watch < Scene_Duel
def action(action)
action.run
end
end end
class User class User
attr_accessor :id, :name attr_accessor :id, :name
extend Cacheable extend Cacheable
def set(id, name = "") def initialize(id, name="")
@id = id @id = id
@name = name if name @name = name
end
def set(id, name = :keep)
@id = id
@name = name unless name == :keep
end end
def avatar(size = :small) def avatar(size = :small)
Surface.new(SWSURFACE, 1, 1, 32, 0,0,0,0) Surface.new(SWSURFACE, 1, 1, 32, 0,0,0,0)
......
...@@ -25,7 +25,6 @@ class Window_Action < Window_List ...@@ -25,7 +25,6 @@ class Window_Action < Window_List
@list_available = list.values @list_available = list.values
@height = @viewport[3] = @list.size*WLH+15*2 @height = @viewport[3] = @list.size*WLH+15*2
@item_max = @list.size @item_max = @list.size
p list
@index = @list_available.find_index(true) || 0 @index = @list_available.find_index(true) || 0
refresh refresh
@visible = true @visible = true
......
...@@ -78,7 +78,6 @@ class Window_Field < Window ...@@ -78,7 +78,6 @@ class Window_Field < Window
Surface.transform_draw(@cards[index].image_small, @contents, 90, 1, 1, 0, 0, @items[index][0]+Card_Size[1], @items[index][1],Surface::TRANSFORM_SAFE) Surface.transform_draw(@cards[index].image_small, @contents, 90, 1, 1, 0, 0, @items[index][0]+Card_Size[1], @items[index][1],Surface::TRANSFORM_SAFE)
@contents.put(@border_horizontal, @items[index][0]-1, @items[index][1]-1) if status == 1 @contents.put(@border_horizontal, @items[index][0]-1, @items[index][1]-1) if status == 1
else else
p index, @cards[index]
@contents.put(@cards[index].image_small, @items[index][0], @items[index][1]) @contents.put(@cards[index].image_small, @items[index][0], @items[index][1])
@contents.put(@border, @items[index][0]-1, @items[index][1]-1) if status == 1 @contents.put(@border, @items[index][0]-1, @items[index][1]-1) if status == 1
end end
......
...@@ -27,7 +27,7 @@ class Window_RoomList < Window_List ...@@ -27,7 +27,7 @@ class Window_RoomList < Window_List
@font.draw_blended_utf8(@contents, "R-#{room.id}", 24, WLH*index+8, *@color) @font.draw_blended_utf8(@contents, "R-#{room.id}", 24, WLH*index+8, *@color)
@font.draw_blended_utf8(@contents, room.full? ? "【决斗中】" : room.private? ? "【私密房】" : "【等待中】", 8, WLH*index+24, *@color) @font.draw_blended_utf8(@contents, room.full? ? "【决斗中】" : room.private? ? "【私密房】" : "【等待中】", 8, WLH*index+24, *@color)
@font.draw_blended_utf8(@contents, room.name, 128, WLH*index+8, *room.color) @font.draw_blended_utf8(@contents, room.name, 128, WLH*index+8, *room.color)
@font.draw_blended_utf8(@contents, room.player1.name, 128, WLH*index+24, *@color) @font.draw_blended_utf8(@contents, room.player1.name, 128, WLH*index+24, *@color)
@font.draw_blended_utf8(@contents, room.player2.name, 256, WLH*index+24, *@color) if room.full? @font.draw_blended_utf8(@contents, room.player2.name, 256, WLH*index+24, *@color) if room.full?
end end
......
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