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

刷场地、回合结束指令

parent 8b07a504
...@@ -81,9 +81,9 @@ class Action ...@@ -81,9 +81,9 @@ class Action
end end
def run def run
from_field = case @from_pos from_field = case @from_pos
when Integer when 0..10
player_field.field player_field.field
when :hand when Integer, :hand
player_field.hand player_field.hand
when :field when :field
player_field.field player_field.field
...@@ -98,7 +98,11 @@ class Action ...@@ -98,7 +98,11 @@ class Action
end end
if @from_pos.is_a? Integer if @from_pos.is_a? Integer
if @from_pos > 10
from_pos = @from_pos - 11
else
from_pos = @from_pos from_pos = @from_pos
end
else else
from_pos = (@card.is_a?(Game_Card) ? from_field.index(@card) : from_field.index{|card|card.card == @card}) || from_field.index{|card|!card.known?} from_pos = (@card.is_a?(Game_Card) ? from_field.index(@card) : from_field.index{|card|card.card == @card}) || from_field.index{|card|!card.known?}
end end
...@@ -212,6 +216,7 @@ class Action ...@@ -212,6 +216,7 @@ class Action
end end
end end
class Tribute < SendToGraveyard; end class Tribute < SendToGraveyard; end
class Discard < SendToGraveyard; end
class ChangePosition < Move class ChangePosition < Move
def initialize(from_player, from_pos, card, position) def initialize(from_player, from_pos, card, position)
super(from_player, from_pos, from_pos, card, nil, position) super(from_player, from_pos, from_pos, card, nil, position)
...@@ -243,23 +248,47 @@ class Action ...@@ -243,23 +248,47 @@ class Action
player_field.hand += player_field.deck.shift(@count) player_field.hand += player_field.deck.shift(@count)
end end
end end
class Refresh_Field < Action class RefreshField < Action
attr_reader :lp, :hand_count, :deck_count, :graveyard_count, :removed_count, :field attr_reader :field
def initialize(from_player, msg, lp, hand_count, deck_count, graveyard_count, removed_count, field) def initialize(from_player, field, msg=nil)
super(from_player, msg) super(from_player, msg)
@lp = lp
@hand_count = hand_count
@deck_count = deck_count
@graveyard_count = graveyard_count
@removed_count = removed_count
@field = field @field = field
end end
def run
player_field.lp = @field[:lp]
if player_field.hand.size > @field[:hand]
player_field.hand.pop(player_field.hand.size-@field[:hand])
elsif player_field.hand.size < @field[:hand]
(@field[:hand]-player_field.hand.size).times{player_field.hand.push Game_Card.new(Card::Unknown)}
end
if player_field.deck.size > @field[:deck]
player_field.deck.pop(player_field.deck.size-@field[:deck])
elsif player_field.deck.size < @field[:deck]
(@field[:deck]-player_field.deck.size).times{player_field.deck.push Game_Card.new(Card::Unknown)}
end
if player_field.graveyard.size > @field[:graveyard]
player_field.graveyard.pop(player_field.graveyard.size-@field[:graveyard])
elsif player_field.graveyard.size < @field[:graveyard]
(@field[:graveyard]-player_field.graveyard.size).times{player_field.graveyard.push Game_Card.new(Card::Unknown)}
end
(0..10).each do |pos|
if @field[pos]
player_field.field[pos] ||= Game_Card.new(@field[pos][:card])
player_field.field[pos].card = @field[pos][:card]
p player_field.field[pos].card
player_field.field[pos].position = @field[pos][:position]
else
player_field.field[pos] = nil
end
end
p player_field
end
end end
class Turn_End < Refresh_Field class TurnEnd < RefreshField
attr_reader :turn attr_reader :turn
def initialize(from_player, msg, lp, hand_count, deck_count, graveyard_count, removed_count, field, turn) def initialize(from_player, field, turn, msg=nil)
super(from_player, msg, lp, hand_count, deck_count, graveyard_count, removed_count, field) super(from_player, field, msg)
@turn = turn @turn = turn
end end
end end
......
...@@ -60,4 +60,12 @@ class Game_Field ...@@ -60,4 +60,12 @@ class Game_Field
empty_spelltrap_field empty_spelltrap_field
end end
end end
#def shuffle_hand
# @hand.shuffle!
# @hand.each{|card|card.card = Card::Unknown if card.position == :set}
#end
#def shuffle_deck
# @deck.shuffle!
# @deck.each{|card|card.card = Card::Unknown if card.position == set}
#end
end end
\ No newline at end of file
...@@ -157,7 +157,7 @@ class Action ...@@ -157,7 +157,7 @@ class Action
when /^※(.*)$/ when /^※(.*)$/
Chat.new from_player, $1 Chat.new from_player, $1
when /^(◎|●)→=\[0:0:0\]==回合结束==<(\d+)>=\[0\]\r\nLP:(\d+)\r\n手卡:(\d+)\r\n卡组:(\d+)\r\n墓地:(\d+)\r\n除外:(\d+)\r\n前场:\r\n #{PositionFilter}#{CardFilter}\r\n #{CardFilter}\r\n #{CardFilter}\r\n #{CardFilter}\r\n #{CardFilter}\r\n后场:#{CardFilter}#{CardFilter}#{CardFilter}#{CardFilter}#{CardFilter}\r\n场地|#{CardFilter}\r\n◎→\\(.*)$/ when /^(◎|●)→=\[0:0:0\]==回合结束==<(\d+)>=\[0\]\r\nLP:(\d+)\r\n手卡:(\d+)\r\n卡组:(\d+)\r\n墓地:(\d+)\r\n除外:(\d+)\r\n前场:\r\n #{PositionFilter}#{CardFilter}\r\n #{CardFilter}\r\n #{CardFilter}\r\n #{CardFilter}\r\n #{CardFilter}\r\n后场:#{CardFilter}#{CardFilter}#{CardFilter}#{CardFilter}#{CardFilter}\r\n场地|#{CardFilter}\r\n◎→\\(.*)$/
Turn_End.new($1 == "◎", $19, $3.to_i, $4.to_i, $5.to_i, $6.to_i, $7.to_i, [parse_fieldcard($18), parse_fieldcard($13), parse_fieldcard($14), parse_fieldcard($15), parse_fieldcard($16), parse_fieldcard($17), parse_fieldcard($8), parse_fieldcard($9), parse_fieldcard($10), parse_fieldcard($11), parse_fieldcard($12)], $2.to_i) TurnEnd.new($1 == "◎", $19, $3.to_i, $4.to_i, $5.to_i, $6.to_i, $7.to_i, [parse_fieldcard($18), parse_fieldcard($13), parse_fieldcard($14), parse_fieldcard($15), parse_fieldcard($16), parse_fieldcard($17), parse_fieldcard($8), parse_fieldcard($9), parse_fieldcard($10), parse_fieldcard($11), parse_fieldcard($12)], $2.to_i)
when /^(?:(.*)\r\n){0,1}(◎|●)→(.*)$/m when /^(?:(.*)\r\n){0,1}(◎|●)→(.*)$/m
from_player = $2 == "◎" from_player = $2 == "◎"
msg = $1 msg = $1
...@@ -243,7 +243,7 @@ class Action ...@@ -243,7 +243,7 @@ class Action
"[#{@id}] ◎→#{Action.escape_phase(@phase)}" "[#{@id}] ◎→#{Action.escape_phase(@phase)}"
end end
end end
class Turn_End class TurnEnd
def escape def escape
"[#{@id}] ◎→=[0:0:0]==回合结束==<0>=[0]\r\n"+ @field.escape "[#{@id}] ◎→=[0:0:0]==回合结束==<0>=[0]\r\n"+ @field.escape
end end
......
#encoding: UTF-8 #encoding: UTF-8
class Iduel class Iduel < Game
VERSION = "20110131" VERSION = "20110131"
Server = "iduel.ocgsoft.cn" Server = "iduel.ocgsoft.cn"
Port = 38522 Port = 38522
...@@ -12,10 +12,10 @@ class Iduel ...@@ -12,10 +12,10 @@ class Iduel
require 'socket' require 'socket'
require 'digest/md5' require 'digest/md5'
require 'open-uri' require 'open-uri'
require_relative 'iduel_action' require_relative 'action'
require_relative 'iduel_event' require_relative 'event'
require_relative 'iduel_user' require_relative 'user'
require_relative 'iduel_room' 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
......
#encoding: UTF-8 #encoding: UTF-8
require_relative '../action' require_relative '../action'
class Action class Action
CardFilter = /((?:<)?(?:\[.*?\]\[(?:.*?)\])?[\s\d]*(?:>)?|一张怪兽卡|一张魔\/陷卡)/.to_s CardFilter = /((?:<)?(?:\[.*?\])?\[(?:.*?)\][\s\d]*(?:>)?|一张怪兽卡|一张魔\/陷卡|\?\?)/
#FieldCardFilter = /(<>|<??>|<(?:(?:表攻|表守|里守)\|)?\[.*?\]\[(?:.*?)\])?[\s\d]*>)/.to_s PosFilter = /((?:手卡|手牌|场上|魔陷区|怪兽区|墓地|额外牌堆|除外区|卡组|卡组顶端|\(\d+\)){1,2})/
PosFilter = /((?:手卡|手牌|场上|魔陷区|怪兽区|墓地|额外牌堆|除外区|卡组|卡组顶端|\(\d+\)){1,2})/.to_s PositionFilter = /(表攻|表守|里守|攻击表示|防守表示|里侧表示|背面守备表示)/
PositionFilter = /(攻击表示|防守表示|里侧表示|背面守备表示)/.to_s PhaseFilter = /(抽卡`阶段|准备`阶段|主`阶段1|战斗`阶段|主`阶段2|结束`阶段)/
PhaseFilter = /(抽卡`阶段|准备`阶段|主`阶段1|战斗`阶段|主`阶段2|结束`阶段)/.to_s 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(?:◎|●)→\\)/
def self.parse_pos(pos) def self.parse_pos(pos)
if index = pos.index("(") if index = pos.index("(")
index += 1 index += 1
...@@ -46,13 +46,34 @@ class Action ...@@ -46,13 +46,34 @@ class Action
[card["表守"] ? :defense : card["里守"] ? :set : :attack, parse_card(card)] [card["表守"] ? :defense : card["里守"] ? :set : :attack, parse_card(card)]
end end
end end
def self.parse_field(arr)
#LP, 手卡, 卡组,墓地,除外,6表示形式,6卡,7表示形式,7卡,8表示形式,8卡,9表示形式,9卡,10表示形式,10卡,1,2,3,4,5,0
{
:lp => arr[0].to_i,
:hand => arr[1].to_i,
:deck => arr[2].to_i,
:graveyard => arr[3].to_i,
:removed => arr[4].to_i,
6 => arr[5] && {:position => parse_position(arr[5]), :card => parse_card(arr[6])},
7 => arr[7] && {:position => parse_position(arr[7]), :card => parse_card(arr[8])},
8 => arr[9] && {:position => parse_position(arr[9]), :card => parse_card(arr[10])},
9=> arr[11] && {:position => parse_position(arr[11]), :card => parse_card(arr[12])},
10 => arr[13] && {:position => parse_position(arr[13]), :card => parse_card(arr[14])},
1 => arr[15] && {:position => arr[15] == "??" ? :set : :attack, :card => parse_card(arr[15])},
2 => arr[16] && {:position => arr[16] == "??" ? :set : :attack, :card => parse_card(arr[16])},
3 => arr[17] && {:position => arr[17] == "??" ? :set : :attack, :card => parse_card(arr[17])},
4 => arr[18] && {:position => arr[18] == "??" ? :set : :attack, :card => parse_card(arr[18])},
5 => arr[19] && {:position => arr[19] == "??" ? :set : :attack, :card => parse_card(arr[19])},
0 => arr[20] && {:position => arr[20] == "??" ? :set : :attack, :card => parse_card(arr[20])}
}
end
def self.parse_position(position) def self.parse_position(position)
case position case position
when "攻击表示" when "攻击表示", "表攻"
:attack :attack
when "防守表示" when "防守表示", "表守"
:defense :defense
when "里侧表示", "背面守备表示" when "里侧表示", "背面守备表示", "里守"
:set :set
end end
end end
...@@ -147,8 +168,6 @@ class Action ...@@ -147,8 +168,6 @@ class Action
def self.parse(str) def self.parse(str)
from_player = false from_player = false
case str case str
when /^(#{CardFilter}\r\n)*$/m
MultiShow.new from_player, $&.lines.collect{|card|parse_card(card)}
when /^\[(\d+)\] (.*)$/m when /^\[(\d+)\] (.*)$/m
id = $1.to_i id = $1.to_i
result = case $2 result = case $2
...@@ -158,8 +177,18 @@ class Action ...@@ -158,8 +177,18 @@ class Action
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+)>=\[0\]\r\nLP:(\d+)\r\n手卡:(\d+)\r\n卡组:(\d+)\r\n墓地:(\d+)\r\n除外:(\d+)\r\n前场:\r\n #{PositionFilter}#{CardFilter}\r\n #{CardFilter}\r\n #{CardFilter}\r\n #{CardFilter}\r\n #{CardFilter}\r\n后场:#{CardFilter}#{CardFilter}#{CardFilter}#{CardFilter}#{CardFilter}\r\n场地|#{CardFilter}\r\n◎→\\(.*)$/ when /^(◎|●)→=\[0:0:0\]==回合结束==<(\d+)>=\[\d+\]\r\n#{FieldFilter}(.*)$/ #把这货弄外面的原因是因为这个指令里开头有一个●→,后面还有,下面判msg的正则会判错
Turn_End.new($1 == "◎", $19, $3.to_i, $4.to_i, $5.to_i, $6.to_i, $7.to_i, [parse_fieldcard($18), parse_fieldcard($13), parse_fieldcard($14), parse_fieldcard($15), parse_fieldcard($16), parse_fieldcard($17), parse_fieldcard($8), parse_fieldcard($9), parse_fieldcard($10), parse_fieldcard($11), parse_fieldcard($12)], $2.to_i) field = $~.to_a
field.shift #去掉第一个完整匹配信息
from_player = field.shift == "◎"
turn = field.shift.to_i
msg = field.pop
TurnEnd.new(from_player, parse_field(field), turn, msg)
when /^(◎|●)→#{FieldFilter}$/
field = $~.to_a
field.shift
from_player = field.shift == "◎"
RefreshField.new(from_player, parse_field(field))
when /^(?:(.*)\r\n)?(◎|●)→(.*)$/m when /^(?:(.*)\r\n)?(◎|●)→(.*)$/m
from_player = $2 == "◎" from_player = $2 == "◎"
msg = $1 msg = $1
...@@ -174,7 +203,7 @@ class Action ...@@ -174,7 +203,7 @@ class Action
Reset.new from_player Reset.new from_player
when "换SIDE……" when "换SIDE……"
Side.new from_player Side.new from_player
when "卡组洗切" when "卡组洗切", "切洗卡组"
Shuffle.new from_player Shuffle.new from_player
when "查看卡组" when "查看卡组"
Ignored.new "查看卡组" Ignored.new "查看卡组"
...@@ -202,6 +231,18 @@ class Action ...@@ -202,6 +231,18 @@ class Action
SendToGraveyard.new(from_player, parse_pos($2), parse_card($1)) SendToGraveyard.new(from_player, parse_pos($2), parse_card($1))
when /将~#{PosFilter}~的#{CardFilter}解~放/ when /将~#{PosFilter}~的#{CardFilter}解~放/
Tribute.new(from_player, parse_pos($1), parse_card($2)) Tribute.new(from_player, parse_pos($1), parse_card($2))
when /随机将一张卡从手卡\((\d+\))~放回卡组顶端/
ReturnToDeck.new(from_player, $1.to_i+10, nil)
when /随机舍弃~手卡~#{CardFilter}/
Discard.new(from_player, :hand, parse_card($1))
when /随机将手卡的#{CardFilter}从游戏中除外/
Remove.new from_player, :hand, parse_card($1)
when /随机显示一张手卡为:#{CardFilter}/
Show.new(from_player, :hand, parse_card($1))
when /第(\d+)张手牌为:#{CardFilter}/
Show.new(from_player, $1.to_i+10, parse_card($2))
when /\|--\+>手卡:(?:\[#{CardFilter}\])*/
MultiShow.new from_player, $&.scan(CardFilter).collect{|matched|parse_card(matched.first)}
when /将#{PosFilter}#{CardFilter}从游戏中除外/ when /将#{PosFilter}#{CardFilter}从游戏中除外/
Remove.new from_player, parse_pos($1), parse_card($2) Remove.new from_player, parse_pos($1), parse_card($2)
when /#{CardFilter}#{PosFilter}~放回卡组顶端/ when /#{CardFilter}#{PosFilter}~放回卡组顶端/
...@@ -228,6 +269,8 @@ class Action ...@@ -228,6 +269,8 @@ class Action
end end
result.id = id result.id = id
result result
when /^(#{CardFilter}\r\n)*$/
MultiShow.new from_player, $&.lines.collect{|card|parse_card(card)}
else else
Unknown.new str Unknown.new str
end end
...@@ -268,7 +311,7 @@ class Action ...@@ -268,7 +311,7 @@ class Action
"[#{@id}] #{from_player ? '◎' : '●'}#{Action.escape_phase(@phase)}" "[#{@id}] #{from_player ? '◎' : '●'}#{Action.escape_phase(@phase)}"
end end
end end
class Turn_End class TurnEnd
def escape def escape
"[#{@id}] #{from_player ? '◎' : '●'}→=[0:0:0]==回合结束==<0>=[0]\r\n"+ @field.escape "[#{@id}] #{from_player ? '◎' : '●'}→=[0:0:0]==回合结束==<0>=[0]\r\n"+ @field.escape
end end
...@@ -343,7 +386,7 @@ class Action ...@@ -343,7 +386,7 @@ class Action
when 0..10 when 0..10
"场上(#{@from_pos})" "场上(#{@from_pos})"
end end
"[#{@id}] #{from_player ? '◎' : '●'}#{@from_pos == :hand ? "一张卡" : @card.escape}#{pos}~放回卡组顶端" #TODO:set=【一张卡】 "[#{@id}] #{from_player ? '◎' : '●'}#{@card.nil? or @from_pos == :hand ? "一张卡" : @card.escape}#{pos}~放回卡组顶端" #TODO:set=【一张卡】
end end
end end
class ReturnToDeckBottom class ReturnToDeckBottom
...@@ -438,6 +481,10 @@ class Game_Field ...@@ -438,6 +481,10 @@ class Game_Field
"\r\n场地|<#{@field[0] ? @field[0].escape : '无'}>\r\n" + "\r\n场地|<#{@field[0] ? @field[0].escape : '无'}>\r\n" +
"◎→\\" "◎→\\"
end end
def self.parse(str)
end
end end
class Card class Card
def escape def escape
......
...@@ -61,7 +61,7 @@ class Scene_Duel < Scene ...@@ -61,7 +61,7 @@ class Scene_Duel < Scene
@turn_player = !@turn_player @turn_player = !@turn_player
@phase = 0 @phase = 0
@phases_window.player = @turn_player @phases_window.player = @turn_player
action Action::Turn_End.new(true, "Turn End", $game.player_field.lp, $game.player_field.hand.size, $game.player_field.deck.size, $game.player_field.graveyard.size, $game.player_field.removed.size, $game.player_field, 1) action Action::TurnEnd.new(true, "Turn End", $game.player_field.lp, $game.player_field.hand.size, $game.player_field.deck.size, $game.player_field.graveyard.size, $game.player_field.removed.size, $game.player_field, 1)
else else
@phase = @phases_window.phase = phase @phase = @phases_window.phase = phase
@phases_window.refresh @phases_window.refresh
...@@ -112,11 +112,13 @@ class Scene_Duel < Scene ...@@ -112,11 +112,13 @@ class Scene_Duel < Scene
def action(action) def action(action)
if action.from_player
str = action.escape str = action.escape
if str =~ /^\[\d+\] (?:●|◎)→(.*)$/m if str =~ /^\[\d+\] (?:●|◎)→(.*)$/m
str = $1 str = $1
end end
$chat_window.add action.from_player, str if action.from_player $chat_window.add action.from_player, str
end
action.run action.run
end end
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
class Scene_Login < Scene class Scene_Login < Scene
Vocab_Logging = "Logging" Vocab_Logging = "Logging"
def start def start
require_relative 'iduel' require_relative 'iduel/iduel'
@font = TTF.open("fonts/WenQuanYi Micro Hei.ttf", 24) @font = TTF.open("fonts/WenQuanYi Micro Hei.ttf", 24)
if $config["autologin"] if $config["autologin"]
@username = $config["username"] @username = $config["username"]
......
...@@ -78,6 +78,7 @@ class Window_Field < Window ...@@ -78,6 +78,7 @@ 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
......
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