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

刷场地、回合结束指令

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