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

iduel观战初步

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