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

重写Move#run,指示物、备注支持。添加了几个操作指令,基本能解析各种常见指令了

parent 89688fc9
This diff was suppressed by a .gitattributes entry.
......@@ -41,13 +41,6 @@ class Action
super
end
end
class Note < Action
attr_reader :card
def initialize(from_player, msg, card)
super(from_player, msg)
@card = card
end
end
class Coin < Action
attr_reader :result
def initialize(from_player, result=rand(1)==0, msg=nil)
......@@ -75,89 +68,71 @@ class Action
end
class Move < Action
attr_reader :from_pos, :to_pos, :card, :position
def initialize(from_player, from_pos, to_pos=nil, card=Card::Unknown, msg=nil, position=nil)
def initialize(from_player, from_pos, to_pos=nil, card=nil, msg=nil, position=nil)
super(from_player, msg)
@from_pos = from_pos
@to_pos = to_pos
@card = card
@position = position
end
def run
$log.debug('--------------move action run--------------'){self.inspect}
from_field = case @from_pos
when 0..10
def parse_field(pos)
case pos
when 0..10, :field
player_field.field
when Integer, :hand
when 11..70, :hand, :handtop, :handrandom
player_field.hand
when :field
player_field.field
when 71..130,:deck, :decktop, :deckbottom
player_field.deck
when :graveyard
player_field.graveyard
when :deck
player_field.deck
when :extra
player_field.extra
when :removed
player_field.removed
end
from_pos = if @from_pos.is_a? Integer
if @from_pos > 10
@from_pos - 11
else
@from_pos
end
elsif @card == :deck
end
def run
#$log.debug('移动操作执行'){self.inspect}
from_field = parse_field(@from_pos)
from_pos = case @from_pos
when 0..10
@from_pos
when 11..70
@from_pos - 11
when 71..130
@from_pos - 71
when :handtop
player_field.hand.size - 1
when :decktop
player_field.deck.size - 1
else
(@card.is_a?(Game_Card) ? from_field.index(@card) : from_field.index{|card|card.card == @card}) || from_field.index{|card|!card.known?}
end
to_field = case @to_pos
when Integer
player_field.field
when :hand
player_field.hand
when :graveyard
player_field.graveyard
when :deck, :deckbottom
player_field.deck
when :extra
player_field.extra
when :removed
player_field.removed
end
if from_pos
card = case @card
to_field = parse_field(@to_pos)
card = if from_pos
case @card
when Game_Card
from_field[from_pos] = @card
when nil, Card::Unknown
if !from_field[from_pos]
from_field[from_pos] = Game_Card.new(Card::Unknown)
$log.warn('卡片移动'){'似乎凭空产生了卡片' + self.inspect}
from_field[from_pos].position = :attack
end
from_field[from_pos]
@card
when Card
if !from_field[from_pos]
from_field[from_pos] = Game_Card.new(@card)
from_field[from_pos].position = :attack
else
if from_field[from_pos]
from_field[from_pos].card = @card
end
from_field[from_pos]
when :deck
player_field.deck.last
end
if @to_pos
if from_field == player_field.field
from_field[from_pos] = nil
else
from_field.delete_at from_pos
$log.warn('移动操作1'){'似乎凭空产生了卡片' + self.inspect}
from_field[from_pos] = Game_Card.new(@card)
end
from_field[from_pos]
else
from_field[from_pos] || Game_Card.new
end
else
card = @card == :deck ? player_field.deck.first : Game_Card.new(@card)
$log.warn('卡片移动'){'似乎凭空产生了卡片' + self.inspect}
else #没有来源
$log.warn('移动操作2'){'似乎凭空产生了卡片' + self.inspect}
Game_Card.new(@card)
end
if @position
if @position == :"face-up"
if card.position != :attack and (6..10).include?(@to_pos || @from_pos) #里侧表示的怪兽
......@@ -169,15 +144,27 @@ class Action
card.position = @position
end
end
if @to_pos
if @to_pos.is_a? Integer
if from_pos
if from_field == player_field.field
from_field[from_pos] = nil
else
from_field.delete_at from_pos
end
end
case @to_pos
when 0..10
to_field[@to_pos] = card
elsif @to_pos == :hand or @to_pos == :deck
to_field << card
else
when :hand, :deck, :decktop, :extra, :graveyard, :removed
to_field.push card
when :deckbottom
to_field.unshift card
else
$log.error('移动操作3'){'错误的to_pos' + self.inspect}
end
end
super
end
end
......@@ -249,6 +236,7 @@ class Action
card.card = @card
card
else
$log.warn('转移控制权'){'似乎凭空产生了卡片'+self.inspect}
Game_Card.new(@card)
end
......@@ -291,7 +279,7 @@ class Action
class Draw < Move
def initialize(from_player=true, msg=nil)
@from_player = from_player
super(from_player, :deck, :hand, :deck, msg, :set)
super(from_player, :decktop, :hand, nil, msg, :set)
end
end
class Counter < Action
......@@ -304,7 +292,7 @@ class Action
end
def run
super
player_field.hand += player_field.deck.pop(@count)
player_field.hand.concat player_field.deck.pop(@count)
end
end
class MultiMove < Action
......@@ -491,10 +479,32 @@ class Action
end
end
class MultiShow < Action
def initialize(from_player, cards)
def initialize(from_player, from_pos=nil, cards)
super(from_player, nil)
@from_pos = from_pos
@cards = cards
end
def run
return if @cards[0].is_a? Game_Card #本地消息,不处理
case @from_pos
when :hand
if player_field.hand.size > @cards.size
player_field.hand.pop(player_field.hand.size-@cards.size)
end
@cards.each_with_index do |card, index|
if player_field.hand[index]
player_field.hand[index].card = card
else
player_field.hand[index] = Game_Card.new card
end
end
when 71..130
cards = @cards.to_enum
player_field.deck[@from_pos-71, @cards.size].each do |game_card|
game_card.card = cards.next
end
end
end
end
class EffectActivate < Move
def initialize(from_player, from_pos, card)
......@@ -615,6 +625,46 @@ class Action
end
end
end
class Note < Action
def initialize(from_player, from_pos, card, note)
super(from_player)
@from_pos = from_pos
@card = card
@note = note
end
def run
card = if @card.is_a? Game_Card
@card
else
if player_field.field[@from_pos]
player_field.field[@from_pos].card = @card
else
$log.warn('指示物操作'){'似乎凭空产生了卡片' + self.inspect}
player_field.field[@from_pos] = Game_Card.new(@card)
player_field.field[@from_pos].position = :attack
end
player_field.field[@from_pos]
end
card.note = @note
end
end
class Token < SpecialSummon
def initialize(from_player, to_pos, card, position=:defense)
super(from_player, nil, to_pos, card)
end
end
class MultiToken < SpecialSummon
def initialize(from_player, num, card, position=:attack)
super(from_player, nil, nil, card)
@num = num
end
def run
@num.times do
@to_pos = player_field.field[6..10].index(nil)+6
super
end
end
end
class Add < Action
def initialize(from_player, card)
super(from_player)
......
......@@ -47,6 +47,7 @@ class Card
def new(id)
find(id)
end
def load_from_ycff3(db = "E:/game/yu-gi-oh/YGODATA/YGODAT.mdb")
require 'win32ole'
conn = WIN32OLE.new('ADODB.Connection')
......@@ -148,7 +149,6 @@ class Card
@token = hash['token']
Card.cache[@id] = self
end
def create_image
@image ||= Surface.load("graphics/field/card.jpg").display_format
......@@ -185,9 +185,9 @@ class Card
def token?
@token
end
def inspect
"[#{card_type}][#{name}]"
end
#def inspect
# "[#{card_type}][#{name}]"
#end
Unknown = Card.new('id' => 0, 'number' => :"00000000", 'name' => "", 'lore' => '', 'card_type' => :通常怪兽, 'stats' => "", 'archettypes' => "", 'mediums' => "")
Unknown.instance_eval{@image = CardBack; @image_small = CardBack_Small}
end
\ No newline at end of file
#encoding: UTF-8
class Game_Card
attr_accessor :card, :position, :counters
attr_accessor :card, :position, :counters, :note
attr_writer :atk, :def
@@count = 0
def initialize(card=nil)
......
#encoding: UTF-8
#这个文件iduel和nbx相同,编辑时推荐使用软/硬链接来保持一致
class Action
CardFilter = /((?:<)?(?:\[.*?\])?\[(?:.*?)\].*?(?:>)?|一张怪兽卡|一张魔\/陷卡|一张卡|\?\?)/
PosFilter = /((?:手卡|手牌|场上|魔陷区|怪兽区|墓地|额外牌堆|除外区|卡组|卡组顶端|\(\d+\)){1,2})/
CardFilter = /(<?\[?Token[ \\\d]*\]?>?|<?(?:\[.*?\])?\[(?:.*?)\][ \d]*>?|一张怪兽卡|一张魔\/陷卡|一张卡|\?\?)/
PosFilter = /((?:手卡|手牌|场上|魔陷区|怪兽区|墓地|墓地\|,,,,,\|\*\:\d+张\:\*|额外牌堆|除外区|卡组|卡组顶端|\(\d+\)){1,2})/
PositionFilter = /(表攻|表守|里守|攻击表示|防守表示|里侧表示|背面守备表示)/
PhaseFilter = /(抽卡`阶段|准备`阶段|主`阶段1|战斗`阶段|主`阶段2|结束`阶段)/
CountersFilter = /(?:\()?(\d+)?(?:\))?/
......@@ -25,15 +25,19 @@ class Action
:extra
when "除外区"
:removed
when "卡组顶端", "卡组"
when "卡组顶端"
:decktop
when "卡组"
:deck
end
end
end
def self.parse_card(card)
if index = card.rindex("[")
if card['Token']
@token ||= Card.new('name'=>:Token, 'id'=>-1, 'token'=>true, 'number'=>:"00000000", 'card_type' => :通常怪兽, 'stats' => "", 'archettypes' => "", 'mediums' => "", 'lore' => "这张卡作为衍生物使用。")
elsif index = card.rindex('[')
index += 1
name = card[index, card.rindex("]")-index].to_sym
name = card[index, card.rindex(']')-index].to_sym
Card.find(name)
else
Card.find(nil)
......@@ -209,8 +213,6 @@ class Action
Side.new from_player
when "卡组洗切", "切洗卡组"
Shuffle.new from_player
when "查看卡组"
ViewDeck.new from_player
when "要连锁吗?"
ActivateAsk.new from_player
when "我要连锁!"
......@@ -218,9 +220,11 @@ class Action
when "请继续吧~"
ActivateAnswer.new from_player, false
when "将顶牌放回卡组底部"
ReturnToDeckBottom.new(from_player, :deck)
ReturnToDeckBottom.new(from_player, :decktop)
when /抽取\((\d+)\)张卡/
MultiDraw.new from_player, $1.to_i
when /己方卡组第(\d+)张加入手卡/
ReturnToHand.new(from_player, $1.to_i+71, nil)
when /\[\d+年\d+月\d+日禁卡表\](?:<(.+)> )?先攻/
FirstToGo.new from_player, $1
when /\[\d+年\d+月\d+日禁卡表\](?:<(.+)> )?后攻/
......@@ -229,6 +233,12 @@ class Action
Dice.new from_player, $2.to_i, $1
when /(.*)抛硬币,结果为(.+)/
Coin.new from_player, $2=="正面", $1
when "查看卡组"
ViewDeck.new from_player
when /查看卡组上方(\d+)张卡/
ViewDeck.new from_player, $1.to_i
when /刚才抽到的卡是:#{CardFilter}/
Show.new(from_player, :handtop, parse_card($1))
when /从#{PosFilter}~发动#{CardFilter}#{PosFilter}/
Activate.new from_player, parse_pos($1), parse_pos($3), parse_card($2)
when /从#{PosFilter}~召唤#{CardFilter}#{PosFilter}/
......@@ -244,15 +254,23 @@ class Action
when /随机将一张卡从手卡\((\d+\))~放回卡组顶端/
ReturnToDeck.new(from_player, $1.to_i+10, nil)
when /随机舍弃~手卡~#{CardFilter}/
Discard.new(from_player, :hand, parse_card($1))
Discard.new(from_player, :handrandom, parse_card($1))
when /随机将手卡的#{CardFilter}从游戏中除外/
Remove.new from_player, :hand, parse_card($1)
Remove.new from_player, :handrandom, parse_card($1)
when /随机显示一张手卡为:#{CardFilter}/
Show.new(from_player, :hand, parse_card($1))
Show.new(from_player, :handrandom, 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)}
MultiShow.new from_player, :hand, $&.scan(CardFilter).collect{|matched|parse_card(matched.first)}
when /^(?:(\d+)#{CardFilter}\n?)+$/
from_pos = 71
cards = $&.lines.collect do |line|
line =~ /(\d+)#{CardFilter}/
from_pos ||= $1.to_i + 71
parse_card($2)
end
MultiShow.new from_player, from_pos, cards
when /将#{PosFilter}#{CardFilter}从游戏中除外/
Remove.new from_player, parse_pos($1), parse_card($2)
when /#{CardFilter}#{PosFilter}~放回卡组顶端/
......@@ -263,7 +281,7 @@ class Action
ReturnToExtra.new from_player, parse_pos($2), parse_card($1)
when /从#{PosFilter}#{CardFilter}加入手卡/
ReturnToHand.new from_player, parse_pos($1), parse_card($2)
when /(?:己方)?#{PosFilter}.*?#{CardFilter}效果发(?:\~)?动/
when /(?:己方)?#{PosFilter}.*?#{CardFilter}(?:选择(.*)为对象>)?效果发(?:\~)?动/
EffectActivate.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))
......@@ -304,8 +322,8 @@ class Action
MultiMove.new(from_player, from_pos, to_pos, cards)
when /己方#{PosFilter}#{CardFilter}送入对手墓地/
SendToOpponentGraveyard.new(from_player, parse_pos($1), parse_card($2))
when /#{PosFilter}#{CardFilter}选择(我方)?-#{PosFilter}- #{CardFilter}为效果对象/
Target.new(from_player, parse_pos($1), parse_card($2), $3 ? true : false, parse_pos($4), parse_card($5))
when /#{PosFilter}#{CardFilter}选择(我方)?-#{PosFilter}- (?:#{PositionFilter}\|)?#{CardFilter}为效果对象/
Target.new(from_player, parse_pos($1), parse_card($2), $3 ? true : false, parse_pos($4), parse_card($6))
when /#{PhaseFilter}/
ChangePhase.new(from_player, parse_phase($1))
when /LP(损失|回复|变成)<(-?\d+)>/
......@@ -316,6 +334,12 @@ class Action
Attack.new(from_player, nil, nil, parse_card($1))
when /(?:清空)?#{PosFilter}#{CardFilter}的指示物(?:加一|减一)?,现为#{CountersFilter}/
Counter.new(from_player, parse_pos($1), parse_card($2), :become, parse_counters($3))
when /己方#{PosFilter}#{CardFilter}修改备注为:(.*)/
Note.new(from_player, parse_pos($1), parse_card($2), $3)
when /~特殊召唤#{CardFilter}#{PosFilter}#{PositionFilter}/
Token.new(from_player, parse_pos($2), parse_card($1), parse_position($3))
when /~特殊召唤(\d+)个#{CardFilter}#{PositionFilter}/
MultiToken.new(from_player, $1.to_i, parse_card($2), parse_position($3))
when /添加一张手牌#{CardFilter}/
Add.new(from_player, parse_card($1))
when /将#{PosFilter}#{CardFilter}撕掉!/
......@@ -328,8 +352,10 @@ class Action
end
result.id = id
result
when /^(#{CardFilter}\n)*$/
MultiShow.new from_player, $&.lines.collect{|card|parse_card(card)}
when /系统消息:.+?\(\d+\)已经退出房间/
Reset.new from_player
when /^(#{CardFilter}\n?)*$/
MultiShow.new from_player, nil, $&.lines.collect{|card|parse_card(card)}
else
Unknown.new str
end
......
......@@ -17,7 +17,7 @@ class Replay
file.set_encoding "GBK", "UTF-8", :invalid => :replace, :undef => :replace
result = self.new(file)
contents = file.read.strip
if contents[0,7] == "<table>"
if contents['<td width="75%" valign="top">']
result.player1 = User.new($2.to_i, $1) if contents =~ HTML_Player_Filter
result.player2 = User.new($2.to_i, $1) if contents =~ HTML_Opponent_Filter
from_players = contents.scan(Regexp.union(HTML_Player_Filter, HTML_Opponent_Filter)).collect{|matched|matched[0] ? true : false} #匹配player成功matched前两位有值,opponent成功后两位有值,["尸体", "100015", nil, nil], il, nil], [nil, nil, "游戏的徒弟", "288436"]
......
......@@ -435,7 +435,7 @@ class Action
case from_pos
when 0..10
#场上
when Integer
when 11..70
"第#{@from_pos-10}张手牌为:#{@card.escape}"
end
end
......
......@@ -12,7 +12,6 @@ class Scene_Replay < Scene_Watch
def save_replay
end
def update
#p Time.now
if @count and @count >= 60
event = @replay.get
if event
......
......@@ -20,6 +20,7 @@ class Window_Field < Window
#Card_Size = [Card::CardBack.w, Card::CardBack.h]
Card_Size = [54, 81]
attr_accessor :action_window
WLH = 16
def initialize(x, y, field,player=true)
@border = Surface.load('graphics/field/border.png')
@border_horizontal = Surface.load('graphics/field/border_horizontal.png') #@border.transform_surface(0x66000000,90,1,1,Surface::TRANSFORM_SAFE|Surface::TRANSFORM_AA)#FUCK!
......@@ -96,20 +97,33 @@ class Window_Field < Window
@contents.put(@border, x-1, y-1) if status == 1
end
if (6..10).include?(index) and @cards[index].position != :set
spacing, height = @font.text_size('/')
spacing = @font.text_size('/')[0]
atkdef_x = x + (Card_Size[0] - spacing) / 2
atkdef_y = y + Card_Size[1] - height
@font.draw_blended_utf8(@contents, '/' , atkdef_x, atkdef_y, 0xFF, 0xFF, 0xFF)
@font.draw_blended_utf8(@contents, @cards[index].atk.to_s , atkdef_x - @font.text_size(@cards[index].atk.to_s)[0], atkdef_y, 0xFF, 0xFF, 0xFF)
@font.draw_blended_utf8(@contents, @cards[index].def.to_s , atkdef_x + spacing, atkdef_y, 0xFF, 0xFF, 0xFF)
atkdef_y = y + Card_Size[1] - WLH
draw_shaded_text('/' , atkdef_x, atkdef_y)
draw_shaded_text(@cards[index].atk.to_s , atkdef_x - @font.text_size(@cards[index].atk.to_s)[0], atkdef_y)
draw_shaded_text(@cards[index].def.to_s , atkdef_x + spacing, atkdef_y)
#@font.draw_blended_utf8(@contents, '/' , atkdef_x, atkdef_y, 0xFF, 0xFF, 0xFF)
#@font.draw_blended_utf8(@contents, @cards[index].atk.to_s , atkdef_x - @font.text_size(@cards[index].atk.to_s)[0], atkdef_y, 0xFF, 0xFF, 0xFF)
#@font.draw_blended_utf8(@contents, @cards[index].def.to_s , atkdef_x + spacing, atkdef_y, 0xFF, 0xFF, 0xFF)
end
if @cards[index].note && !@cards[index].note.empty?
note_x = x
note_y = y + Card_Size[1] - WLH*3
draw_shaded_text(@cards[index].note, note_x, note_y)
end
if @cards[index].counters != 0
height ||= @font.text_size('/')[1] #不太规范,凑合能用
counters_x = x
counters_y = y + Card_Size[1] - height*2
@font.draw_blended_utf8(@contents, @cards[index].counters.to_s , counters_x, counters_y, 0xFF, 0xFF, 0xFF)
@@counter ||= Surface.load("graphics/field/counter.png")
@contents.put @@counter, counters_x, counters_y
draw_shaded_text(" × #{@cards[index].counters}", counters_x+16, counters_y)
end
end
def draw_shaded_text(text,x,y,size=1,font=@font)
@font.draw_blended_utf8(@contents, text, x+size, y+size, 0x00, 0x00, 0x00)
@font.draw_blended_utf8(@contents, text, x, y, 0xFF, 0xFF, 0xFF)
end
def item_rect(index)
@items[index]
......
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