Commit 3ba862c3 authored by 神楽坂玲奈's avatar 神楽坂玲奈

Replay进阶,能正确读iDuel观战的记录了

parent 2fa2e5ec
...@@ -132,14 +132,16 @@ class Action ...@@ -132,14 +132,16 @@ class Action
player_field.removed player_field.removed
end end
if from_pos && from_field[from_pos] if from_pos && from_field[from_pos]
case @card card = case @card
when Game_Card when Game_Card
card = from_field[from_pos] = @card from_field[from_pos] = @card
when nil, Card::Unknown when nil, Card::Unknown
card = from_field[from_pos] from_field[from_pos]
when Card when Card
card = from_field[from_pos] from_field[from_pos].card = @card
card.card = @card from_field[from_pos]
when :deck
player_field.deck.first
end end
if @to_pos if @to_pos
if from_field == player_field.field if from_field == player_field.field
...@@ -153,7 +155,16 @@ class Action ...@@ -153,7 +155,16 @@ class Action
puts "似乎凭空产生了卡片?" puts "似乎凭空产生了卡片?"
p self p self
end end
card.position = @position if @position if @position
if @position == :"face-up"
if card.position == :set and (6..10).include?(@to_pos || @from_pos) #里侧表示的怪兽
card.position = :defense
else
card.position = :attack
end
end
card.position = @position
end
if @to_pos if @to_pos
if @to_pos.is_a? Integer if @to_pos.is_a? Integer
to_field[@to_pos] = card to_field[@to_pos] = card
...@@ -207,11 +218,7 @@ class Action ...@@ -207,11 +218,7 @@ class Action
end end
end end
class ReturnToDeckBottom < Move class ReturnToDeckBottom < Move
def initialize(from_player, from_pos, card=Card.find(nil)) def initialize(from_player, from_pos, card)
if from_pos == :deck and card == Card.find(nil)
@from_player = from_player
card = player_field.deck.first
end
super(from_player, from_pos, :deckbottom, card, nil, :set) super(from_player, from_pos, :deckbottom, card, nil, :set)
end end
end end
...@@ -245,7 +252,7 @@ class Action ...@@ -245,7 +252,7 @@ class Action
class Draw < Move class Draw < Move
def initialize(from_player=true, msg=nil) def initialize(from_player=true, msg=nil)
@from_player = from_player @from_player = from_player
super(from_player, :deck, :hand, player_field.deck.first, msg, :set) super(from_player, :deck, :hand, :deck, msg, :set)
end end
end end
class MultiDraw < Action class MultiDraw < Action
...@@ -323,15 +330,11 @@ class Action ...@@ -323,15 +330,11 @@ class Action
@cards = cards @cards = cards
end end
end end
class Effect_Activate < Move class EffectActivate < Move
def initialize(from_player, from_pos, card) def initialize(from_player, from_pos, card)
@from_player = from_player @from_player = from_player
if (0..10).include?(from_pos) if (0..10).include?(from_pos)
if (6..10).include?(from_pos) && player_field.field[from_pos] && (player_field.field[from_pos].position == :set || player_field.field[from_pos].position == :defense) position = :"face-up"
position = :defense
else
position = :attack
end
else else
position = nil position = nil
end end
......
...@@ -6,7 +6,8 @@ class Action ...@@ -6,7 +6,8 @@ class Action
PosFilter = /((?:手卡|手牌|场上|魔陷区|怪兽区|墓地|额外牌堆|除外区|卡组|卡组顶端|\(\d+\)){1,2})/ PosFilter = /((?:手卡|手牌|场上|魔陷区|怪兽区|墓地|额外牌堆|除外区|卡组|卡组顶端|\(\d+\)){1,2})/
PositionFilter = /(表攻|表守|里守|攻击表示|防守表示|里侧表示|背面守备表示)/ PositionFilter = /(表攻|表守|里守|攻击表示|防守表示|里侧表示|背面守备表示)/
PhaseFilter = /(抽卡`阶段|准备`阶段|主`阶段1|战斗`阶段|主`阶段2|结束`阶段)/ PhaseFilter = /(抽卡`阶段|准备`阶段|主`阶段1|战斗`阶段|主`阶段2|结束`阶段)/
FieldFilter = /(?:LP:(\d+)\r\n手卡(?:数)?:(\d+)\r\n卡组:(\d+)\r\n墓地:(\d+)\r\n除外:(\d+)\r\n前场:\r\n <(?:#{PositionFilter}\|#{CardFilter})?>\r\n <(?:#{PositionFilter}\|#{CardFilter})?>\r\n <(?:#{PositionFilter}\|#{CardFilter})?>\r\n <(?:#{PositionFilter}\|#{CardFilter})?>\r\n <(?:#{PositionFilter}\|#{CardFilter})?>\r\n后场:<#{CardFilter}?><#{CardFilter}?><#{CardFilter}?><#{CardFilter}?><#{CardFilter}?>\r\n场地\|<(?:无|#{CardFilter})>\r\n(?:◎|●)→\\)/ CountersFilter = /\((\d+)\)/
FieldFilter = /(?:LP:(\d+)\n手卡(?:数)?:(\d+)\n卡组:(\d+)\n墓地:(\d+)\n除外:(\d+)\n前场:\n <(?:#{CountersFilter}?#{PositionFilter}\|#{CardFilter})?>\n <(?:#{CountersFilter}?#{PositionFilter}\|#{CardFilter})?>\n <(?:#{CountersFilter}?#{PositionFilter}\|#{CardFilter})?>\n <(?:#{CountersFilter}?#{PositionFilter}\|#{CardFilter})?>\n <(?:#{CountersFilter}?#{PositionFilter}\|#{CardFilter})?>\n后场:<#{CardFilter}?><#{CardFilter}?><#{CardFilter}?><#{CardFilter}?><#{CardFilter}?>\n场地\|<(?:无|#{CardFilter})>\n(?:◎|●)→\\)/
def self.parse_pos(pos) def self.parse_pos(pos)
if index = pos.index("(") if index = pos.index("(")
index += 1 index += 1
...@@ -55,17 +56,17 @@ class Action ...@@ -55,17 +56,17 @@ class Action
:deck => arr[2].to_i, :deck => arr[2].to_i,
:graveyard => arr[3].to_i, :graveyard => arr[3].to_i,
:removed => arr[4].to_i, :removed => arr[4].to_i,
6 => arr[5] && {:position => parse_position(arr[5]), :card => parse_card(arr[6])}, 6 => arr[7] && {:counters => arr[5].to_i, :position => parse_position(arr[6]), :card => parse_card(arr[7])},
7 => arr[7] && {:position => parse_position(arr[7]), :card => parse_card(arr[8])}, 7 => arr[10] && {:counters => arr[8].to_i, :position => parse_position(arr[9]), :card => parse_card(arr[10])},
8 => arr[9] && {:position => parse_position(arr[9]), :card => parse_card(arr[10])}, 8 => arr[13] && {:counters => arr[11].to_i, :position => parse_position(arr[12]), :card => parse_card(arr[13])},
9=> arr[11] && {:position => parse_position(arr[11]), :card => parse_card(arr[12])}, 9 => arr[16] && {:counters => arr[14].to_i, :position => parse_position(arr[15]), :card => parse_card(arr[16])},
10 => arr[13] && {:position => parse_position(arr[13]), :card => parse_card(arr[14])}, 10 => arr[19] && {:counters => arr[17].to_i, :position => parse_position(arr[18]), :card => parse_card(arr[19])},
1 => arr[15] && {:position => arr[15] == "??" ? :set : :attack, :card => parse_card(arr[15])}, 1 => arr[20] && {:position => arr[20] == "??" ? :set : :attack, :card => parse_card(arr[20])},
2 => arr[16] && {:position => arr[16] == "??" ? :set : :attack, :card => parse_card(arr[16])}, 2 => arr[21] && {:position => arr[21] == "??" ? :set : :attack, :card => parse_card(arr[21])},
3 => arr[17] && {:position => arr[17] == "??" ? :set : :attack, :card => parse_card(arr[17])}, 3 => arr[22] && {:position => arr[22] == "??" ? :set : :attack, :card => parse_card(arr[22])},
4 => arr[18] && {:position => arr[18] == "??" ? :set : :attack, :card => parse_card(arr[18])}, 4 => arr[23] && {:position => arr[23] == "??" ? :set : :attack, :card => parse_card(arr[23])},
5 => arr[19] && {:position => arr[19] == "??" ? :set : :attack, :card => parse_card(arr[19])}, 5 => arr[24] && {:position => arr[24] == "??" ? :set : :attack, :card => parse_card(arr[24])},
0 => arr[20] && {:position => arr[20] == "??" ? :set : :attack, :card => parse_card(arr[20])} 0 => arr[25] && {:position => arr[25] == "??" ? :set : :attack, :card => parse_card(arr[25])}
} }
end end
def self.parse_position(position) def self.parse_position(position)
...@@ -167,18 +168,19 @@ class Action ...@@ -167,18 +168,19 @@ class Action
end end
end end
def self.parse(str) def self.parse(str)
from_player = false from_player = nil
case str case str
when /^\[(\d+)\] (.*)$/m when /^\[(\d+)\] (.*)$/m
#p $2, $2.match(/(◎|●)→=\[0:0:0\]==回合结束==<(\d+)>=\[\d+\]\n#{FieldFilter}(.*)/)
id = $1.to_i id = $1.to_i
result = case $2 result = case $2
when /^┊(.*)┊$/m when /^┊(.*)┊$/m
Chat.new from_player, $1 Chat.new from_player, $1
when /^※\[(.*)\]\r\n(.*)\r\n注释$/m when /^※\[(.*)\]\n(.*)\n注释$/m
Note.new from_player, $2, Card.find($1.to_sym) Note.new from_player, $2, Card.find($1.to_sym)
when /^※(.*)$/ when /^※(.*)$/
Chat.new from_player, $1 Chat.new from_player, $1
when /^(◎|●)→=\[0:0:0\]==回合结束==<(\d+)>=\[\d+\]\r\n#{FieldFilter}(.*)$/ #把这货弄外面的原因是因为这个指令里开头有一个●→,后面还有,下面判msg的正则会判错 when /^(◎|●)→=\[0:0:0\]==回合结束==<(\d+)>=\[\d+\]\n#{FieldFilter}(.*)$/ #把这货弄外面的原因是因为这个指令里开头有一个●→,后面还有,下面判msg的正则会判错
field = $~.to_a field = $~.to_a
field.shift #去掉第一个完整匹配信息 field.shift #去掉第一个完整匹配信息
from_player = field.shift == "◎" from_player = field.shift == "◎"
...@@ -190,7 +192,7 @@ class Action ...@@ -190,7 +192,7 @@ class Action
field.shift field.shift
from_player = field.shift == "◎" from_player = field.shift == "◎"
RefreshField.new(from_player, parse_field(field)) RefreshField.new(from_player, parse_field(field))
when /^(?:(.*)\r\n)?(◎|●)→(.*)$/m when /^(?:(.*)\n)?(◎|●)→(.*)$/m
from_player = $2 == "◎" from_player = $2 == "◎"
msg = $1 msg = $1
case $3 case $3
...@@ -255,7 +257,7 @@ class Action ...@@ -255,7 +257,7 @@ class Action
when /从#{PosFilter}#{CardFilter}加入手卡/ when /从#{PosFilter}#{CardFilter}加入手卡/
ReturnToHand.new from_player, parse_pos($1), parse_card($2) ReturnToHand.new from_player, parse_pos($1), parse_card($2)
when /(?:己方)?#{PosFilter}.*?#{CardFilter}效果发(?:\~)?动/ when /(?:己方)?#{PosFilter}.*?#{CardFilter}效果发(?:\~)?动/
Effect_Activate.new(from_player, parse_pos($1), parse_card($2)) EffectActivate.new(from_player, parse_pos($1), parse_card($2))
when /#{PosFilter}#{CardFilter}(?:变|改)为#{PositionFilter}/ when /#{PosFilter}#{CardFilter}(?:变|改)为#{PositionFilter}/
ChangePosition.new(from_player, parse_pos($1), parse_card($2), parse_position($3)) ChangePosition.new(from_player, parse_pos($1), parse_card($2), parse_position($3))
when /#{PosFilter}#{CardFilter}打开/ when /#{PosFilter}#{CardFilter}打开/
...@@ -270,7 +272,7 @@ class Action ...@@ -270,7 +272,7 @@ class Action
end end
result.id = id result.id = id
result result
when /^(#{CardFilter}\r\n)*$/ when /^(#{CardFilter}\n)*$/
MultiShow.new from_player, $&.lines.collect{|card|parse_card(card)} MultiShow.new from_player, $&.lines.collect{|card|parse_card(card)}
else else
Unknown.new str Unknown.new str
...@@ -314,7 +316,7 @@ class Action ...@@ -314,7 +316,7 @@ class Action
end end
class TurnEnd class TurnEnd
def escape def escape
"[#{@id}] #{from_player ? '◎' : '●'}→=[0:0:0]==回合结束==<#{@turn}>=[0]\r\n"+ @field.escape "[#{@id}] #{from_player ? '◎' : '●'}→=[0:0:0]==回合结束==<#{@turn}>=[0]\n"+ @field.escape
end end
end end
class Shuffle class Shuffle
...@@ -443,10 +445,10 @@ class Action ...@@ -443,10 +445,10 @@ class Action
end end
class MultiShow class MultiShow
def escape def escape
@cards.collect{|card|card.escape}.join("\r\n") @cards.collect{|card|card.escape}.join("\n")
end end
end end
class Effect_Activate class EffectActivate
def escape def escape
pos = case @from_pos pos = case @from_pos
when :hand when :hand
...@@ -475,11 +477,11 @@ end ...@@ -475,11 +477,11 @@ end
class Game_Field class Game_Field
def escape def escape
"LP:#{@lp}\r\n手卡:#{@hand.size}\r\n卡组:#{@deck.size}\r\n墓地:#{@graveyard.size}\r\n除外:#{@removed.size}\r\n前场:\r\n" + "LP:#{@lp}\n手卡:#{@hand.size}\n卡组:#{@deck.size}\n墓地:#{@graveyard.size}\n除外:#{@removed.size}\n前场:\n" +
@field[6..10].collect{|card|" <#{"#{Action.escape_position_short(card)}|#{card.position == :set ? '??' : "[#{card.card_type}][#{card.name}] #{card.atk}#{' '+card.def.to_s}"}" if card}>\r\n"}.join + @field[6..10].collect{|card|" <#{"#{Action.escape_position_short(card)}|#{card.position == :set ? '??' : "[#{card.card_type}][#{card.name}] #{card.atk}#{' '+card.def.to_s}"}" if card}>\n"}.join +
"后场:" + "后场:" +
@field[1..5].collect{|card|"<#{card.position == :set ? '??' : card.escape if card}>"}.join + @field[1..5].collect{|card|"<#{card.position == :set ? '??' : card.escape if card}>"}.join +
"\r\n场地|<#{@field[0] ? @field[0].escape : '无'}>\r\n" + "\n场地|<#{@field[0] ? @field[0].escape : '无'}>\n" +
"◎→\\" "◎→\\"
end end
def self.parse(str) def self.parse(str)
......
...@@ -4,28 +4,31 @@ class Iduel < Game ...@@ -4,28 +4,31 @@ class Iduel < Game
Server = "iduel.ocgsoft.cn" Server = "iduel.ocgsoft.cn"
Port = 38522 Port = 38522
RS = "\xA1\xE9".force_encoding "GBK" RS = "\xA1\xE9".force_encoding("GBK").encode("UTF-8")
attr_accessor :session attr_accessor :session
attr_accessor :key attr_accessor :key
def initialize def initialize
super super
require 'socket'
require 'digest/md5' require 'digest/md5'
require 'open-uri'
require_relative 'action' require_relative 'action'
require_relative 'event' require_relative 'event'
require_relative 'user' require_relative 'user'
require_relative 'replay'
end
def connect
require 'socket'
require 'open-uri'
begin begin
@conn = TCPSocket.open(Server, Port) @conn = TCPSocket.open(Server, Port)
@conn.set_encoding "GBK" @conn.set_encoding "GBK", "UTF-8"
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 }
rescue rescue
Game_Event.push Game_Event::Error.new($!.class, $!.message) Game_Event.push Game_Event::Error.new($!.class.to_s, $!.message)
end end
end end
def login(username, password) def login(username, password)
connect
md5 = Digest::MD5.hexdigest(password) md5 = Digest::MD5.hexdigest(password)
send(0, username, md5, checknum("LOGINMSG", username, md5), Version) send(0, username, md5, checknum("LOGINMSG", username, md5), Version)
end end
...@@ -62,9 +65,11 @@ class Iduel < Game ...@@ -62,9 +65,11 @@ class Iduel < Game
def send(head, *args) def send(head, *args)
info = "##{head.to_s(16).upcase}|#{args.join(',')}".encode("GBK") + RS return unless @conn
info = "##{head.to_s(16).upcase}|#{args.join(',')}" + RS
puts "<< #{info}" puts "<< #{info}"
(@conn.write info) rescue Game_Event.push Game_Event::Error.new($!.class, $!.message) info.gsub!("\n", "\r\n")
(@conn.write info) rescue Game_Event.push Game_Event::Error.new($!.class.to_s, $!.message)
end end
def recv(info) def recv(info)
if info.nil? if info.nil?
...@@ -72,14 +77,15 @@ class Iduel < Game ...@@ -72,14 +77,15 @@ class Iduel < Game
@conn = nil @conn = nil
Game_Event::Error.parse(0) Game_Event::Error.parse(0)
else else
info.chomp!(RS) info.chomp!(RS)
info.encode! "UTF-8", :invalid => :replace, :undef => :replace info.delete!("\r")
#info.encode! "UTF-8", :invalid => :replace, :undef => :replace
puts ">> #{info}" puts ">> #{info}"
Game_Event.push Game_Event.parse info Game_Event.push Game_Event.parse info
end end
end end
def checknum(head, *args) def checknum(head, *args)
Digest::MD5.hexdigest("[#{head}]_#{args.join('_')}_SCNERO") Digest::MD5.hexdigest("[#{head}]_#{args.join('_')}_SCNERO".gsub("\n", "\r\n").encode("GBK"))
end 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))
......
#encoding: UTF-8
class Replay
Delimiter = /^.+?\(\d+\)\(\d+:\d+:\d+\): (?:\r)?\n /
Player_Filter = /^(.+?)\((\d+)\)\(\d+:\d+:\d+\): (?:\r)?\n \[\d+\] ◎→/
Opponent_Filter =/^(.+?)\((\d+)\)\(\d+:\d+:\d+\): (?:\r)?\n \[\d+\] ●→/
attr_accessor :room, :player1, :player2, :actions
def add(action)
# user = action.from_player ? $game.player1 : $game.player2
# @file.write("#{user.name}(#{user.id}):\r\n#{action.escape}\r\n")
end
def self.load(filename)
#TODO:效率优化
file = open(filename)
file.set_encoding "GBK", "UTF-8"
result = self.new(file)
contents = file.read
contents =~ Player_Filter
result.player1 = User.new($2.to_i, $1)
contents =~ Opponent_Filter
result.player2 = User.new($2.to_i, $1)
result.actions = contents.split(Delimiter).collect do |action_str|
action_str.chomp!
action = Action.parse action_str
Game_Event::Action.new(action, action_str)
end
$game.room = result.room = Room.new(0, "Replay", result.player1, result.player2)
result
end
def get
@actions.shift
end
def eof?
@actions.empty?
end
end
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#仅用于调试,发布时删 #仅用于调试,发布时删
alias gbk_puts puts alias gbk_puts puts
def puts(*args) def puts(*args)
gbk_puts(*(args.collect{|item|item.encode "GBK", :invalid => :replace, :undef => :replace})) gbk_puts(*(args.collect{|item|item.to_s.encode "GBK", :invalid => :replace, :undef => :replace}))
end end
def p(*args) def p(*args)
print(args.collect{|item|item.inspect.encode "GBK", :invalid => :replace, :undef => :replace}.join("\n")+"\n") rescue print(args.join("\n")+"\n") print(args.collect{|item|item.inspect.encode "GBK", :invalid => :replace, :undef => :replace}.join("\n")+"\n") rescue print(args.join("\n")+"\n")
......
...@@ -6,7 +6,7 @@ class Action ...@@ -6,7 +6,7 @@ class Action
PosFilter = /((?:手卡|手牌|场上|魔陷区|怪兽区|墓地|额外牌堆|除外区|卡组|卡组顶端|\(\d+\)){1,2})/ PosFilter = /((?:手卡|手牌|场上|魔陷区|怪兽区|墓地|额外牌堆|除外区|卡组|卡组顶端|\(\d+\)){1,2})/
PositionFilter = /(表攻|表守|里守|攻击表示|防守表示|里侧表示|背面守备表示)/ PositionFilter = /(表攻|表守|里守|攻击表示|防守表示|里侧表示|背面守备表示)/
PhaseFilter = /(抽卡`阶段|准备`阶段|主`阶段1|战斗`阶段|主`阶段2|结束`阶段)/ PhaseFilter = /(抽卡`阶段|准备`阶段|主`阶段1|战斗`阶段|主`阶段2|结束`阶段)/
FieldFilter = /(?:LP:(\d+)\r\n手卡(?:数)?:(\d+)\r\n卡组:(\d+)\r\n墓地:(\d+)\r\n除外:(\d+)\r\n前场:\r\n <(?:#{PositionFilter}\|#{CardFilter})?>\r\n <(?:#{PositionFilter}\|#{CardFilter})?>\r\n <(?:#{PositionFilter}\|#{CardFilter})?>\r\n <(?:#{PositionFilter}\|#{CardFilter})?>\r\n <(?:#{PositionFilter}\|#{CardFilter})?>\r\n后场:<#{CardFilter}?><#{CardFilter}?><#{CardFilter}?><#{CardFilter}?><#{CardFilter}?>\r\n场地\|<(?:无|#{CardFilter})>\r\n(?:◎|●)→\\)/ FieldFilter = /(?:LP:(\d+)\n手卡(?:数)?:(\d+)\n卡组:(\d+)\n墓地:(\d+)\n除外:(\d+)\n前场:\n <(?:#{PositionFilter}\|#{CardFilter})?>\n <(?:#{PositionFilter}\|#{CardFilter})?>\n <(?:#{PositionFilter}\|#{CardFilter})?>\n <(?:#{PositionFilter}\|#{CardFilter})?>\n <(?:#{PositionFilter}\|#{CardFilter})?>\n后场:<#{CardFilter}?><#{CardFilter}?><#{CardFilter}?><#{CardFilter}?><#{CardFilter}?>\n场地\|<(?:无|#{CardFilter})>\n(?:◎|●)→\\)/
def self.parse_pos(pos) def self.parse_pos(pos)
if index = pos.index("(") if index = pos.index("(")
index += 1 index += 1
...@@ -174,11 +174,11 @@ class Action ...@@ -174,11 +174,11 @@ class Action
result = case $2 result = case $2
when /^┊(.*)┊$/m when /^┊(.*)┊$/m
Chat.new from_player, $1 Chat.new from_player, $1
when /^※\[(.*)\]\r\n(.*)\r\n注释$/m when /^※\[(.*)\]\n(.*)\n注释$/m
Note.new from_player, $2, Card.find($1.to_sym) Note.new from_player, $2, Card.find($1.to_sym)
when /^※(.*)$/ when /^※(.*)$/
Chat.new from_player, $1 Chat.new from_player, $1
when /^(◎|●)→=\[0:0:0\]==回合结束==<(\d+)>=\[\d+\]\r\n#{FieldFilter}(.*)$/ #把这货弄外面的原因是因为这个指令里开头有一个●→,后面还有,下面判msg的正则会判错 when /^(◎|●)→=\[0:0:0\]==回合结束==<(\d+)>=\[\d+\]\n#{FieldFilter}(.*)$/ #把这货弄外面的原因是因为这个指令里开头有一个●→,后面还有,下面判msg的正则会判错
field = $~.to_a field = $~.to_a
field.shift #去掉第一个完整匹配信息 field.shift #去掉第一个完整匹配信息
from_player = field.shift == "◎" from_player = field.shift == "◎"
...@@ -190,7 +190,7 @@ class Action ...@@ -190,7 +190,7 @@ class Action
field.shift field.shift
from_player = field.shift == "◎" from_player = field.shift == "◎"
RefreshField.new(from_player, parse_field(field)) RefreshField.new(from_player, parse_field(field))
when /^(?:(.*)\r\n)?(◎|●)→(.*)$/m when /^(?:(.*)\n)?(◎|●)→(.*)$/m
from_player = $2 == "◎" from_player = $2 == "◎"
msg = $1 msg = $1
case $3 case $3
...@@ -255,7 +255,7 @@ class Action ...@@ -255,7 +255,7 @@ class Action
when /从#{PosFilter}#{CardFilter}加入手卡/ when /从#{PosFilter}#{CardFilter}加入手卡/
ReturnToHand.new from_player, parse_pos($1), parse_card($2) ReturnToHand.new from_player, parse_pos($1), parse_card($2)
when /(?:己方)?#{PosFilter}.*?#{CardFilter}效果发(?:\~)?动/ when /(?:己方)?#{PosFilter}.*?#{CardFilter}效果发(?:\~)?动/
Effect_Activate.new(from_player, parse_pos($1), parse_card($2)) EffectActivate.new(from_player, parse_pos($1), parse_card($2))
when /#{PosFilter}#{CardFilter}(?:变|改)为#{PositionFilter}/ when /#{PosFilter}#{CardFilter}(?:变|改)为#{PositionFilter}/
ChangePosition.new(from_player, parse_pos($1), parse_card($2), parse_position($3)) ChangePosition.new(from_player, parse_pos($1), parse_card($2), parse_position($3))
when /#{PosFilter}#{CardFilter}打开/ when /#{PosFilter}#{CardFilter}打开/
...@@ -270,7 +270,7 @@ class Action ...@@ -270,7 +270,7 @@ class Action
end end
result.id = id result.id = id
result result
when /^(#{CardFilter}\r\n)*$/ when /^(#{CardFilter}\n)*$/
MultiShow.new from_player, $&.lines.collect{|card|parse_card(card)} MultiShow.new from_player, $&.lines.collect{|card|parse_card(card)}
else else
Unknown.new str Unknown.new str
...@@ -314,7 +314,7 @@ class Action ...@@ -314,7 +314,7 @@ class Action
end end
class TurnEnd class TurnEnd
def escape def escape
"[#{@id}] #{from_player ? '◎' : '●'}→=[0:0:0]==回合结束==<#{@turn}>=[0]\r\n"+ @field.escape "[#{@id}] #{from_player ? '◎' : '●'}→=[0:0:0]==回合结束==<#{@turn}>=[0]\n"+ @field.escape
end end
end end
class Shuffle class Shuffle
...@@ -443,10 +443,10 @@ class Action ...@@ -443,10 +443,10 @@ class Action
end end
class MultiShow class MultiShow
def escape def escape
@cards.collect{|card|card.escape}.join("\r\n") @cards.collect{|card|card.escape}.join("\n")
end end
end end
class Effect_Activate class EffectActivate
def escape def escape
pos = case @from_pos pos = case @from_pos
when :hand when :hand
...@@ -475,11 +475,11 @@ end ...@@ -475,11 +475,11 @@ end
class Game_Field class Game_Field
def escape def escape
"LP:#{@lp}\r\n手卡:#{@hand.size}\r\n卡组:#{@deck.size}\r\n墓地:#{@graveyard.size}\r\n除外:#{@removed.size}\r\n前场:\r\n" + "LP:#{@lp}\n手卡:#{@hand.size}\n卡组:#{@deck.size}\n墓地:#{@graveyard.size}\n除外:#{@removed.size}\n前场:\n" +
@field[6..10].collect{|card|" <#{"#{Action.escape_position_short(card)}|#{card.position == :set ? '??' : "[#{card.card_type}][#{card.name}] #{card.atk}#{' '+card.def.to_s}"}" if card}>\r\n"}.join + @field[6..10].collect{|card|" <#{"#{Action.escape_position_short(card)}|#{card.position == :set ? '??' : "[#{card.card_type}][#{card.name}] #{card.atk}#{' '+card.def.to_s}"}" if card}>\n"}.join +
"后场:" + "后场:" +
@field[1..5].collect{|card|"<#{card.position == :set ? '??' : card.escape if card}>"}.join + @field[1..5].collect{|card|"<#{card.position == :set ? '??' : card.escape if card}>"}.join +
"\r\n场地|<#{@field[0] ? @field[0].escape : '无'}>\r\n" + "\n场地|<#{@field[0] ? @field[0].escape : '无'}>\n" +
"◎→\\" "◎→\\"
end end
def self.parse(str) def self.parse(str)
......
...@@ -2,11 +2,7 @@ class Replay ...@@ -2,11 +2,7 @@ class Replay
ReplayPath = 'replay' ReplayPath = 'replay'
LastReplay = 'lastreplay.txt' LastReplay = 'lastreplay.txt'
def initialize(filename=LastReplay) def initialize(filename=LastReplay)
@file = open(File.expand_path(filename, ReplayPath), 'w') @file = open(File.expand_path(filename, ReplayPath), 'w') unless filename.is_a? IO
end
def add(action)
action = action.escape if action.is_a? Action
@file.write action + "\n"
end end
def save(filename="#{Time.now.strftime("%Y-%m-%d_%H:%M-%S")}_#{$game.room.player1.name}(#{$game.room.player1.id})_#{$game.room.player2.name}(#{$game.room.player2.id}).txt") def save(filename="#{Time.now.strftime("%Y-%m-%d_%H:%M-%S")}_#{$game.room.player1.name}(#{$game.room.player1.id})_#{$game.room.player2.name}(#{$game.room.player2.id}).txt")
close close
...@@ -15,4 +11,16 @@ class Replay ...@@ -15,4 +11,16 @@ class Replay
def close def close
@file.close @file.close
end end
end def self.load(file)
@file = open(file)
end
def add(action)
#协议定义
end
def get
#协议定义
end
def eof?
@file.eof?
end
end
\ No newline at end of file
#==============================================================================
# ■ Scene_Login
#------------------------------------------------------------------------------
#  login
#==============================================================================
class Scene_Login_NBX < Scene
Vocab_Logging = "Logging"
def start
require_relative 'nbx/nbx'
$game = NBX.new
login
end
def login
username = $config['username'] && !$config['username'].empty? ? $config['username'] : $_ENV['username']
$game.login username
end
def update
while event = Game_Event.poll
handle_game(event)
end
super
end
def handle_game(event)
case event
when Game_Event::Login
require_relative 'scene_hall'
$scene = Scene_Hall.new
end
end
end
#encoding: UTF-8
require 'Scene_Watch'
class Scene_Replay < Scene_Watch
def initialize(replay)
@replay = replay
@count = 0
super(@replay.room)
end
def init_replay
end
def save_replay
end
def update
if @count >= 60
event = @replay.get
if event
Game_Event.push event
@count = 0
else
Widget_Msgbox.new("回放", "战报回放完毕") { $scene = Scene_Title.new }
end
end
@count += 1
super
end
end
#============================================================================== class Scene_Single < Scene
# ■ Scene_Login require 'Scene_Replay'
#------------------------------------------------------------------------------ require_relative 'iduel/iduel'
#  login def start
#============================================================================== $game = Iduel.new
$scene = Scene_Replay.new Replay.load("E:/game/yu-gi-oh/test_rep.txt")
class Scene_Single < Scene end
Vocab_Logging = "Logging" end
def start
require_relative 'nbx/nbx'
$game = NBX.new
login
end
def login
username = $config['username'] && !$config['username'].empty? ? $config['username'] : $_ENV['username']
$game.login username
end
def update
while event = Game_Event.poll
handle_game(event)
end
super
end
def handle_game(event)
case event
when Game_Event::Login
require_relative 'scene_hall'
$scene = Scene_Hall.new
end
end
end
...@@ -255,7 +255,7 @@ class Window_Field < Window ...@@ -255,7 +255,7 @@ class Window_Field < Window
Widget_Msgbox.new("特殊召唤", "场位已满") Widget_Msgbox.new("特殊召唤", "场位已满")
end end
when 2 when 2
Action::Effect_Activate.new(true, :extra, @card) Action::EffectActivate.new(true, :extra, @card)
when 3 when 3
Action::Remove.new(true, :extra, @card) Action::Remove.new(true, :extra, @card)
when 4 when 4
...@@ -272,7 +272,7 @@ class Window_Field < Window ...@@ -272,7 +272,7 @@ class Window_Field < Window
Widget_Msgbox.new("特殊召唤", "场位已满") Widget_Msgbox.new("特殊召唤", "场位已满")
end end
when 2 #效果发动 when 2 #效果发动
Action::Effect_Activate.new(true, :removed, @card) Action::EffectActivate.new(true, :removed, @card)
when 3 #加入手卡 when 3 #加入手卡
Action::ReturnToHand.new(true, :removed, @card) Action::ReturnToHand.new(true, :removed, @card)
when 4 when 4
...@@ -291,7 +291,7 @@ class Window_Field < Window ...@@ -291,7 +291,7 @@ class Window_Field < Window
Widget_Msgbox.new("特殊召唤", "场位已满") Widget_Msgbox.new("特殊召唤", "场位已满")
end end
when 2 #效果发动 when 2 #效果发动
Action::Effect_Activate.new(true, :graveyard, @card) Action::EffectActivate.new(true, :graveyard, @card)
when 3 #加入手卡 when 3 #加入手卡
Action::ReturnToHand.new(true, :graveyard, @card) Action::ReturnToHand.new(true, :graveyard, @card)
when 4 when 4
...@@ -302,7 +302,7 @@ class Window_Field < Window ...@@ -302,7 +302,7 @@ class Window_Field < Window
when 0..5 #后场 when 0..5 #后场
case @action_window.index case @action_window.index
when 0 #效果发动 when 0 #效果发动
Action::Effect_Activate.new(true, @index, @card) Action::EffectActivate.new(true, @index, @card)
when 1 #返回卡组 when 1 #返回卡组
Action::ReturnToDeck.new(true, @index, @card) Action::ReturnToDeck.new(true, @index, @card)
when 2 #送入墓地 when 2 #送入墓地
...@@ -327,7 +327,7 @@ class Window_Field < Window ...@@ -327,7 +327,7 @@ class Window_Field < Window
when 4 when 4
Action::Flip.new(true, @index, @card) Action::Flip.new(true, @index, @card)
when 5 when 5
Action::Effect_Activate.new(true, @index, @card) Action::EffectActivate.new(true, @index, @card)
when 6 when 6
Widget_Msgbox.new("攻击宣言", "功能未实现") Widget_Msgbox.new("攻击宣言", "功能未实现")
when 7 when 7
...@@ -374,7 +374,7 @@ class Window_Field < Window ...@@ -374,7 +374,7 @@ class Window_Field < Window
when 6 #从游戏中除外 when 6 #从游戏中除外
Action::Remove.new(true, :hand, @card) Action::Remove.new(true, :hand, @card)
when 7 #效果发动 when 7 #效果发动
Action::Effect_Activate.new(true, :hand, @card) Action::EffectActivate.new(true, :hand, @card)
end end
end end
$scene.action action if action.is_a? Action $scene.action action if action.is_a? Action
......
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