Commit 8b07a504 authored by 神楽坂玲奈's avatar 神楽坂玲奈

NBX action解析大量增加

parent 48dcc949
......@@ -136,7 +136,7 @@ class Action
end
else
card = Game_Card.new(@card)
p "似乎凭空产生了卡片?"
puts "似乎凭空产生了卡片?"
p self
end
card.position = @position if @position
......@@ -271,6 +271,12 @@ class Action
@card = card
end
end
class MultiShow < Action
def initialize(from_player, cards)
super(from_player, nil)
@cards = cards
end
end
class Effect_Activate < Move
def initialize(from_player, from_pos, card)
@from_player = from_player
......@@ -286,13 +292,18 @@ class Action
super(from_player, from_pos, nil, card, nil, position)
end
end
class Ignored < Action
def initialize(str)
@str = str
end
end
class Unknown < Action
def initialize(*args)
puts 'unkonwn action'
p args
def initialize(str)
@str = str
puts 'unkonwn action ' + str
end
def run
puts 'unkonwn action run'
puts 'unkonwn action run ' + @str
end
end
def self.reset
......
#encoding: UTF-8
require_relative '../action'
class Action
CardFilter = /((?:<){0,1}(?:\[.*?\]\[(?:.*?)\]){0,1}[\s\d]*(?:>){0,1}|一张怪兽卡|一张魔\/陷卡)/.to_s
#FieldCardFilter = /(<>|<??>|<(?:(?:表攻|表守|里守)\|){0,1}\[.*?\]\[(?:.*?)\]){0,1}[\s\d]*>)/.to_s
PosFilter = /((?:手卡|手牌|场上|魔陷区|怪兽区|墓地|额外牌堆|除外区|卡组顶端|\(\d+\)){1,2})/.to_s
CardFilter = /((?:<)?(?:\[.*?\]\[(?:.*?)\])?[\s\d]*(?:>)?|一张怪兽卡|一张魔\/陷卡)/.to_s
#FieldCardFilter = /(<>|<??>|<(?:(?:表攻|表守|里守)\|)?\[.*?\]\[(?:.*?)\])?[\s\d]*>)/.to_s
PosFilter = /((?:手卡|手牌|场上|魔陷区|怪兽区|墓地|额外牌堆|除外区|卡组|卡组顶端|\(\d+\)){1,2})/.to_s
PositionFilter = /(攻击表示|防守表示|里侧表示|背面守备表示)/.to_s
PhaseFilter = /(抽卡`阶段|准备`阶段|主`阶段1|战斗`阶段|主`阶段2|结束`阶段)/.to_s
def self.parse_pos(pos)
......@@ -22,7 +22,7 @@ class Action
:extra
when "除外区"
:removed
when "卡组顶端"
when "卡组顶端", "卡组"
:deck
end
end
......@@ -145,8 +145,11 @@ class Action
end
end
def self.parse(str)
str =~ /^\[(\d+)\] (.*)▊▊▊.*?$/m
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
when /^┊(.*)┊$/m
......@@ -157,7 +160,7 @@ class Action
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 /^(?:(.*)\r\n){0,1}(◎|●)→(.*)$/m
when /^(?:(.*)\r\n)?(◎|●)→(.*)$/m
from_player = $2 == "◎"
msg = $1
case $3
......@@ -173,13 +176,15 @@ class Action
Side.new from_player
when "卡组洗切"
Shuffle.new from_player
when "查看卡组"
Ignored.new "查看卡组"
when "将顶牌放回卡组底部"
ReturnToDeckBottom.new(from_player, :deck)
when /抽取\((\d+)\)张卡/
MultiDraw.new from_player, $1.to_i
when /\[\d+年\d+月\d+日禁卡表\](?:<(.+)> ){0,1}先攻/
when /\[\d+年\d+月\d+日禁卡表\](?:<(.+)> )?先攻/
FirstToGo.new from_player, $1
when /\[\d+年\d+月\d+日禁卡表\](?:<(.+)> ){0,1}后攻/
when /\[\d+年\d+月\d+日禁卡表\](?:<(.+)> )?后攻/
SecondToGo.new from_player, $1
when /(.*)掷骰子,结果为 (\d+)/
Dice.new from_player, $2.to_i, $1
......@@ -189,7 +194,7 @@ class Action
Activate.new from_player, parse_pos($1), parse_pos($3), parse_card($2)
when /从#{PosFilter}~召唤#{CardFilter}#{PosFilter}/
Summon.new from_player, parse_pos($1), parse_pos($3), parse_card($2), msg
when /从#{PosFilter}~特殊召唤#{CardFilter}#{PosFilter}(?:呈#{PositionFilter}){0,1}/
when /从#{PosFilter}~特殊召唤#{CardFilter}#{PosFilter}(?:呈#{PositionFilter})?/
SpecialSummon.new from_player, parse_pos($1), parse_pos($3), parse_card($2), msg, $4 ? parse_position($4) : :attack
when /从手卡~取#{CardFilter}盖到#{PosFilter}/
Set.new from_player, :hand, parse_pos($2), parse_card($1)
......@@ -201,11 +206,13 @@ class Action
Remove.new from_player, parse_pos($1), parse_card($2)
when /#{CardFilter}#{PosFilter}~放回卡组顶端/
ReturnToDeck.new from_player, parse_pos($2), parse_card($1)
when /#{CardFilter}#{PosFilter}~放回卡组底端/
ReturnToDeckBottom.new from_player, parse_pos($2), parse_card($1)
when /#{CardFilter}#{PosFilter}返回额外牌堆/
ReturnToExtra.new from_player, parse_pos($2), parse_card($1)
when /从#{PosFilter}#{CardFilter}加入手卡/
ReturnToHand.new from_player, parse_pos($1), parse_card($2)
when /(?:己方){0,1}#{PosFilter}#{CardFilter}效果发(?:\~){0,1}动/
when /(?:己方)?#{PosFilter}.*#{CardFilter}效果发(?:\~)?动/
Effect_Activate.new(from_player, parse_pos($1), parse_card($2))
when /#{PosFilter}#{CardFilter}(?:变|改)为#{PositionFilter}/
ChangePosition.new(from_player, parse_pos($1), parse_card($2), parse_position($3))
......@@ -221,12 +228,14 @@ class Action
end
result.id = id
result
else
Unknown.new str
end
end
def escape
inspect
end
def run
$chat_window.add @from_player, escape if @from_player
$game.action self if @from_player
end
class FirstToGo
......@@ -388,6 +397,11 @@ class Action
end
end
end
class MultiShow
def escape
@cards.collect{|card|card.escape}.join("\r\n")
end
end
class Effect_Activate
def escape
pos = case @from_pos
......
......@@ -26,7 +26,7 @@ class Game_Event
PlayerJoin
when /关闭游戏王NetBattleX .*▊▊▊.*/
PlayerLeave
when /(\[\d+\] .*▊▊▊.*)/m
when /(\[\d+\] .*|(?:#{::Action::CardFilter}\r\n)*)▊▊▊.*/m
Action
else
Error
......@@ -76,9 +76,7 @@ class Game_Event
end
class Action
def self.parse(info)
info =~ /(.*)▊▊▊.*/m
str = $1 || info
self.new ::Action.parse(info), str
self.new ::Action.parse(info), info
end
end
class VerInf
......
......@@ -55,23 +55,23 @@ class Scene_Duel < Scene
end
def change_phase(phase)
Action::ChangePhase.new(@turn_player, [:DP, :SP, :M1, :BP, :M2, :EP][phase]).run
action Action::ChangePhase.new(@turn_player, [:DP, :SP, :M1, :BP, :M2, :EP][phase])
if phase == 5
@turn_player = !@turn_player
@phase = 0
@phases_window.player = @turn_player
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).run
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)
else
@phase = @phases_window.phase = phase
@phases_window.refresh
end
end
def reset
Action::Reset.new(true).run
action Action::Reset.new(true)
end
def first_to_go
Action::FirstToGo.new(true).run
action Action::FirstToGo.new(true)
end
def handle(event)
case event
......@@ -94,13 +94,13 @@ class Scene_Duel < Scene
when Event::KeyDown
case event.sym
when Key::F1
Action::Shuffle.new.run
action Action::Shuffle.new
@player_field_window.refresh
when Key::F2
first_to_go
@player_field_window.refresh
when Key::F3
Action::Dice.new(true).run
action Action::Dice.new(true)
when Key::F5
reset
@player_field_window.refresh
......@@ -111,13 +111,24 @@ class Scene_Duel < Scene
end
def action(action)
str = action.escape
if str =~ /^\[\d+\] (?:●|◎)→(.*)$/m
str = $1
end
$chat_window.add action.from_player, str if action.from_player
action.run
end
def handle_game(event)
case event
when Game_Event::Action
$chat_window.add event.action.from_player, event.str
event.action.run
str = event.str
if str =~ /^\[\d+\] (?:●|◎)→(.*)$/m
str = $1
end
$chat_window.add event.action.from_player, str
action event.action
@player_field_window.refresh
@opponent_field_window.refresh
when Game_Event::Error
......
......@@ -215,22 +215,22 @@ class Window_Field < Window
end
def clicked
return if !@player || @index.nil?
case @index
action = case @index
when :deck
case @action_window.index
when 0
Action::Draw.new(true).run
Action::Draw.new(true)
when 1
Action::Shuffle.new.run
Action::Shuffle.new
when 2
p "未实现"
#Action::Draw.new(true).run
#Action::Draw.new(true)
when 3
p "未实现"
when 4
Action::SendToGraveyard.new(true, :deck, @card).run
Action::SendToGraveyard.new(true, :deck, @card)
when 5
Action::Remove.new(true, :deck, @card).run
Action::Remove.new(true, :deck, @card)
when 6
p "未实现"
when 7
......@@ -244,129 +244,130 @@ class Window_Field < Window
case @action_window.index
when 0
if pos = @field.empty_field(@card)
Action::SpecialSummon.new(true, :extra, pos, @card, nil, :attack).run
Action::SpecialSummon.new(true, :extra, pos, @card, nil, :attack)
else
p "场位已满"
end
when 1
Action::Effect_Activate.new(true, :extra, @card).run
Action::Effect_Activate.new(true, :extra, @card)
when 2
Action::Remove.new(true, :extra, @card).run
Action::Remove.new(true, :extra, @card)
when 3
Action::SendToGraveyard.new(true, :extra, @card).run
Action::SendToGraveyard.new(true, :extra, @card)
end
when :removed
case @action_window.index
when 0 #特殊召唤
if pos = @field.empty_field(@card)
Action::SpecialSummon.new(true, :removed, pos, @card).run
Action::SpecialSummon.new(true, :removed, pos, @card)
else
p "场位已满"
end
when 1 #效果发动
Action::Effect_Activate.new(true, :removed, @card).run
Action::Effect_Activate.new(true, :removed, @card)
when 2 #加入手卡
Action::ReturnToHand.new(true, :removed, @card).run
Action::ReturnToHand.new(true, :removed, @card)
when 3
Action::ReturnToDeck.new(true, :removed, @card).run
Action::ReturnToDeck.new(true, :removed, @card)
when 4
Action::SendToGraveyard.new(true, :removed, @card).run
Action::SendToGraveyard.new(true, :removed, @card)
end
when :graveyard
case @action_window.index
when 0 #特殊召唤
if pos = @field.empty_field(@card)
Action::SpecialSummon.new(true, :graveyard, pos, @card).run
Action::SpecialSummon.new(true, :graveyard, pos, @card)
else
p "场位已满"
end
when 1 #效果发动
Action::Effect_Activate.new(true, :graveyard, @card).run
Action::Effect_Activate.new(true, :graveyard, @card)
when 2 #加入手卡
Action::ReturnToHand.new(true, :graveyard, @card).run
Action::ReturnToHand.new(true, :graveyard, @card)
when 3
Action::ReturnToDeck.new(true, :graveyard, @card).run
Action::ReturnToDeck.new(true, :graveyard, @card)
when 4
Action::Remove.new(true, :graveyard, @card).run
Action::Remove.new(true, :graveyard, @card)
end
when 0..5 #后场
case @action_window.index
when 0 #效果发动
Action::Effect_Activate.new(true, @index, @card).run
Action::Effect_Activate.new(true, @index, @card)
when 1 #返回卡组
Action::ReturnToDeck.new(true, @index, @card).run
Action::ReturnToDeck.new(true, @index, @card)
when 2 #送入墓地
Action::SendToGraveyard.new(true, @index, @card).run
Action::SendToGraveyard.new(true, @index, @card)
when 3 #从游戏中除外
Action::Remove.new(true, @index, @card).run
Action::Remove.new(true, @index, @card)
when 4 #加入手卡
Action::ReturnToHand.new(true, @index, @card).run
Action::ReturnToHand.new(true, @index, @card)
when 5 #盖伏
Action::ChangePosition.new(true, @index, @card, :set).run
Action::ChangePosition.new(true, @index, @card, :set)
end
when 6..10 #前场
case @action_window.index
when 0
Action::ChangePosition.new(true, @index, @card, :attack).run
Action::ChangePosition.new(true, @index, @card, :attack)
when 1
Action::ChangePosition.new(true, @index, @card, :defense).run
Action::ChangePosition.new(true, @index, @card, :defense)
when 2
Action::ChangePosition.new(true, @index, @card, :set).run
Action::ChangePosition.new(true, @index, @card, :set)
when 3
Action::FlipSummon.new(true, @index, @card).run
Action::FlipSummon.new(true, @index, @card)
when 4
Action::Flip.new(true, @index, @card).run
Action::Flip.new(true, @index, @card)
when 5
Action::Effect_Activate.new(true, @index, @card).run
Action::Effect_Activate.new(true, @index, @card)
when 6
p "未实现"
when 7
p "未实现"
when 8
Action::ReturnToDeck.new(true, @index, @card).run
Action::ReturnToDeck.new(true, @index, @card)
when 9
Action::SendToGraveyard.new(true, @index, @card).run
Action::SendToGraveyard.new(true, @index, @card)
when 10
Action::Tribute.new(true, @index, @card).run
Action::Tribute.new(true, @index, @card)
when 11
Action::ReturnToHand.new(true, @index, @card).run
Action::ReturnToHand.new(true, @index, @card)
end
when Integer #手卡
case @action_window.index
when 0 #召唤
if pos = @field.empty_field(@card)
Action::Summon.new(true, :hand, pos, @card).run
Action::Summon.new(true, :hand, pos, @card)
else
p "场位已满"
end
when 1 #特殊召唤
if pos = @field.empty_field(@card)
Action::SpecialSummon.new(true, :hand, pos, @card, nil, :attack).run
Action::SpecialSummon.new(true, :hand, pos, @card, nil, :attack)
else
p "场位已满"
end
when 2 #发动
if pos = @field.empty_field(@card)
Action::Activate.new(true, :hand, pos, @card).run
Action::Activate.new(true, :hand, pos, @card)
else
p "场位已满"
end
when 3 #放置
if pos = @field.empty_field(@card)
Action::Set.new(true, :hand, pos, @card).run
Action::Set.new(true, :hand, pos, @card)
else
p "场位已满"
end
when 4 #返回卡组
Action::ReturnToDeck.new(true, :hand, @card).run
Action::ReturnToDeck.new(true, :hand, @card)
when 5 #送入墓地
Action::SendToGraveyard.new(true, :hand, @card).run
Action::SendToGraveyard.new(true, :hand, @card)
when 6 #从游戏中除外
Action::Remove.new(true, :hand, @card).run
Action::Remove.new(true, :hand, @card)
when 7 #效果发动
Action::Effect_Activate.new(true, :hand, @card).run
Action::Effect_Activate.new(true, :hand, @card)
end
end
$scene.action action
@index = nil
refresh
mousemoved(Mouse.state[0], Mouse.state[1])
......
......@@ -2,13 +2,14 @@
# and open the template in the editor.
class Window_RoomChat < Window
WLH=16
require_relative 'widget_scrollbar'
Player_Color = [0,0,0xFF]
Opponent_Color = [0x66,0x66,0]
def initialize(x, y, width, height)
super(x,y,width,height-WLH)
@chat_input = Widget_InputBox.new(@x,@y+@height,@width,WLH){|text|Action::Chat.new(true, text).run}
@font = TTF.open("fonts/WenQuanYi Micro Hei.ttf", 16)
@font = TTF.open("fonts/WenQuanYi Micro Hei.ttf", 14)
@contents.fill_rect(0,0,@width, @height, 0x99FFFFFF)
@scroll = Widget_ScrollBar.new(@x+@width-20,@y,@height,0)
@list = []
......
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