Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
mycard
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
syntax_j
mycard
Commits
89688fc9
Commit
89688fc9
authored
Jan 18, 2012
by
神楽坂玲奈
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
iduel html replay
parent
fbff5c91
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
468 additions
and
149 deletions
+468
-149
lib/action.rb
lib/action.rb
+272
-69
lib/card.rb
lib/card.rb
+35
-19
lib/game_card.rb
lib/game_card.rb
+7
-4
lib/iduel/action.rb
lib/iduel/action.rb
+79
-26
lib/iduel/replay.rb
lib/iduel/replay.rb
+48
-16
lib/scene_duel.rb
lib/scene_duel.rb
+13
-10
lib/window_field.rb
lib/window_field.rb
+14
-5
No files found.
lib/action.rb
View file @
89688fc9
...
...
@@ -29,8 +29,7 @@ class Action
class
Go
<
Reset
def
run
super
player_field
.
hand
=
player_field
.
deck
.
shift
(
5
)
#player_field.hand.each{|card|card.position = :set}
player_field
.
hand
=
player_field
.
deck
.
pop
(
5
)
end
end
class
FirstToGo
<
Go
;
end
...
...
@@ -84,8 +83,7 @@ class Action
@position
=
position
end
def
run
puts
'-----------------------------------'
p
self
$log
.
debug
(
'--------------move action run--------------'
){
self
.
inspect
}
from_field
=
case
@from_pos
when
0
..
10
player_field
.
field
...
...
@@ -113,8 +111,6 @@ class Action
else
(
@card
.
is_a?
(
Game_Card
)
?
from_field
.
index
(
@card
)
:
from_field
.
index
{
|
card
|
card
.
card
==
@card
})
||
from_field
.
index
{
|
card
|!
card
.
known?
}
end
# p from_pos, from_field
# p from_field[from_pos] if from_pos
to_field
=
case
@to_pos
when
Integer
player_field
.
field
...
...
@@ -129,14 +125,24 @@ class Action
when
:removed
player_field
.
removed
end
if
from_pos
&&
from_field
[
from_pos
]
if
from_pos
card
=
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
]
when
Card
from_field
[
from_pos
].
card
=
@card
if
!
from_field
[
from_pos
]
from_field
[
from_pos
]
=
Game_Card
.
new
(
@card
)
from_field
[
from_pos
].
position
=
:attack
else
from_field
[
from_pos
].
card
=
@card
end
from_field
[
from_pos
]
when
:deck
player_field
.
deck
.
last
...
...
@@ -150,7 +156,7 @@ class Action
end
else
card
=
@card
==
:deck
?
player_field
.
deck
.
first
:
Game_Card
.
new
(
@card
)
$log
.
warn
(
"似乎凭空产生了卡片?"
){
self
.
inspect
}
$log
.
warn
(
'卡片移动'
){
'似乎凭空产生了卡片'
+
self
.
inspect
}
end
if
@position
if
@position
==
:"face-up"
...
...
@@ -227,7 +233,42 @@ class Action
end
class
Control
<
Move
def
initialize
(
from_player
,
from_pos
,
card
)
super
(
from_player
,
from_pos
,
:opponent
,
card
)
super
(
from_player
,
from_pos
,
nil
,
card
)
end
def
run
to_pos
=
opponent_field
.
field
[
6
..
10
].
index
(
nil
)
+
6
unless
to_pos
$log
.
warn
(
'转移控制权'
){
'没有空余场位'
}
return
end
card
=
if
@card
.
is_a?
Game_Card
@card
elsif
player_field
.
field
[
from_pos
]
card
=
player_field
.
field
[
from_pos
]
card
.
card
=
@card
card
else
Game_Card
.
new
(
@card
)
end
player_field
.
field
[
from_pos
]
=
nil
opponent_field
.
field
[
to_pos
]
=
card
end
end
class
SendToOpponentGraveyard
<
SendToGraveyard
def
run
card
=
if
@card
.
is_a?
Game_Card
@card
elsif
player_field
.
field
[
from_pos
]
card
=
player_field
.
field
[
from_pos
]
card
.
card
=
@card
card
else
Game_Card
.
new
(
@card
)
end
player_field
.
field
[
from_pos
]
=
nil
opponent_field
.
graveyard
.
unshift
card
end
end
class
Tribute
<
SendToGraveyard
;
end
...
...
@@ -266,84 +307,127 @@ class Action
player_field
.
hand
+=
player_field
.
deck
.
pop
(
@count
)
end
end
class
AllMonstersSendToGraveyard
<
SendToGraveyard
def
initialize
(
from_player
,
cards
)
@from_player
=
from_player
class
MultiMove
<
Action
def
initialize
(
from_player
,
from_pos
,
to_pos
,
cards
=
nil
)
super
(
from_player
)
@from_pos
=
from_pos
@to_pos
=
to_pos
@cards
=
cards
end
def
run
from_field
=
case
@from_pos
when
:hand
player_field
.
hand
when
:graveyard
player_field
.
graveyard
when
:spellsandtraps
player_field
.
field
[
0
..
5
]
when
:monsters
player_field
.
field
[
6
..
10
]
end
@cards
=
if
@cards
@cards
.
collect
do
|
card
|
if
card
.
is_a?
Game_Card
card
index
=
from_field
.
index
{
|
fieldcard
|
fieldcard
and
fieldcard
.
card
==
card
}
||
from_field
.
index
{
|
fieldcard
|
fieldcard
and
!
fieldcard
.
known?
}
if
index
fieldcard
=
from_field
[
index
]
from_field
[
index
]
=
nil
fieldcard
.
card
=
card
fieldcard
else
index
=
player_field
.
field
[
6
..
10
].
index
{
|
fieldcard
|
fieldcard
and
fieldcard
.
card
==
card
}
||
player_field
.
field
[
6
..
10
].
index
{
|
fieldcard
|
fieldcard
and
!
fieldcard
.
known?
}
if
index
index
+=
6
card
=
player_field
.
field
[
index
]
player_field
.
field
[
index
]
=
nil
card
else
Game_Card
.
new
(
@card
)
$log
.
warn
'似乎凭空产生了卡片'
end
$log
.
warn
'似乎凭空产生了卡片'
Game_Card
.
new
(
@card
)
end
end
else
player_field
.
field
[
6
..
10
].
compact
from_field
.
compact
end
to_field
,
position
=
case
@to_pos
when
:hand
[
player_field
.
hand
,
:set
]
when
:graveyard
[
player_field
.
graveyard
,
:attack
]
when
:deck
[
player_field
.
deck
,
:set
]
when
:removed
[
player_field
.
removed
,
:attack
]
end
player_field
.
field
[
6
..
10
]
=
nil
player_field
.
graveyard
+=
@cards
#执行部分
case
@from_pos
when
:hand
player_field
.
hand
.
clear
when
:graveyard
player_field
.
graveyard
.
clear
when
:spellsandtraps
player_field
.
field
[
0
..
5
]
=
Array
.
new
(
6
,
nil
)
when
:monsters
player_field
.
field
[
6
..
10
]
=
Array
.
new
(
5
,
nil
)
end
if
to_field
==
player_field
.
hand
or
to_field
==
player_field
.
deck
@cards
.
each
{
|
card
|
card
.
position
=
position
;
to_field
.
push
card
}
else
@cards
.
each
{
|
card
|
card
.
position
=
position
;
to_field
.
unshift
card
}
end
super
end
end
class
AllMonstersRemove
<
Remove
=begin #似乎不需要细分
class MonstersSendToGraveyard < MultiMove
def initialize(from_player, cards)
@from_player
=
from_player
@cards
=
cards
super(from_player, :monsters, :graveyard, cards)
end
def
run
@cards
||=
player_field
.
field
[
6
..
10
].
compact
player_field
.
field
[
6
..
10
]
=
nil
player_field
.
removed
+=
@cards
end
class MonstersRemove < MultiMove
def initialize(from_player, cards)
super(from_player, :monsters, :remove, cards)
end
end
class
AllMonstersReturnToDeck
<
ReturnToDeck
class
MonstersReturnToDeck < MultiMove
def initialize(from_player, cards)
@from_player
=
from_player
@cards
=
cards
super(from_player, :monsters, :deck, cards)
end
def
run
@cards
||=
player_field
.
field
[
6
..
10
].
compact
player_field
.
field
[
6
..
10
]
=
nil
player_field
.
deck
+=
@cards
end
class MonstersReturnToHand < MultiMove
def initialize(from_player, cards)
super(from_player, :monsters, :hand, cards)
end
end
class
AllMonstersReturnToHand
<
ReturnToHand
class
SpellsAndTrapsSendToGraveyard < MultiMove
def initialize(from_player, cards)
@from_player
=
from_player
@cards
=
cards
super(from_player, :spellsandtraps, :graveyard, cards)
end
def
run
@cards
||=
player_field
.
field
[
6
..
10
].
compact
player_field
.
field
[
6
..
10
]
=
nil
player_field
.
hand
+=
@cards
end
class SpellsAndTrapsRemove < MultiMove
def initialize(from_player, cards)
super(from_player, :spellsandtraps, :remove, cards)
end
end
class
AllMonstersCounter
<
Counter
def
initialize
(
from_player
)
@from_player
=
from_player
class
SpellsAndTrapsReturnToDeck < MultiMove
def initialize(from_player
, cards
)
super(from_player, :spellsandtraps, :deck, cards)
end
def
run
player_field
.
field
[
6
..
10
].
each_with_index
do
|
card
,
index
|
if
card
player_field
.
removed
<<
card
player_field
.
field
[
index
+
6
]
=
nil
end
end
end
class SpellsAndTrapsReturnToHand < MultiMove
def initialize(from_player, cards)
super(from_player, :spellsandtraps, :hand, cards)
end
end
class HandSendToGraveyard < MultiMove
def initialize(from_player, cards)
super(from_player, :hand, :graveyard, cards)
end
end
class HandRemove < MultiMove
def initialize(from_player, cards)
super(from_player, :hand, :remove, cards)
end
end
class HandReturnToDeck < MultiMove
def initialize(from_player, cards)
super(from_player, :hand, :deck, cards)
end
end
=end
class
RefreshField
<
Action
attr_reader
:field
def
initialize
(
from_player
,
field
,
msg
=
nil
)
...
...
@@ -357,22 +441,26 @@ class Action
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
)}
(
@field
[
:hand
]
-
player_field
.
hand
.
size
).
times
{
$log
.
warn
(
'刷新场地-手卡'
){
'似乎凭空产生了卡片'
};
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
)}
(
@field
[
:deck
]
-
player_field
.
deck
.
size
).
times
{
$log
.
warn
(
'刷新场地-卡组'
){
'似乎凭空产生了卡片'
};
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
)}
(
@field
[
:graveyard
]
-
player_field
.
graveyard
.
size
).
times
{
$log
.
warn
(
'刷新场地-墓地'
){
'似乎凭空产生了卡片'
};
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
]
if
player_field
.
field
[
pos
]
player_field
.
field
[
pos
].
card
=
@field
[
pos
][
:card
]
else
$log
.
warn
(
"刷新场地-
#{
pos
}
"
){
'似乎凭空产生了卡片'
}
player_field
.
field
[
pos
]
=
Game_Card
.
new
(
@field
[
pos
][
:card
])
end
player_field
.
field
[
pos
].
position
=
@field
[
pos
][
:position
]
else
player_field
.
field
[
pos
]
=
nil
...
...
@@ -409,17 +497,51 @@ class Action
end
end
class
EffectActivate
<
Move
def
initialize
(
from_player
,
from_pos
,
card
,
target_pos
=
nil
,
target_player
=
nil
)
def
initialize
(
from_player
,
from_pos
,
card
)
if
(
0
..
10
).
include?
(
from_pos
)
position
=
:"face-up"
else
position
=
nil
end
super
(
from_player
,
from_pos
,
to_pos
,
card
,
nil
,
position
)
end
end
class
ActivateAsk
<
Action
def
initialize
(
from_player
)
super
(
from_player
)
end
end
class
ActivateAnswer
<
Action
def
initialize
(
from_player
,
activate
)
super
(
from_player
)
@activate
=
activate
end
end
class
Target
<
Action
def
initialize
(
from_player
,
from_pos
,
card
,
target_player
,
target_pos
,
target_card
)
super
(
from_player
)
@from_pos
=
from_pos
@card
=
card
@target_pos
=
target_player
@target_pos
=
target_pos
@target_player
=
target_player
@target_card
=
target_card
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
player_field
.
field
[
@from_pos
]
else
$log
.
warn
(
'攻击宣言'
){
'似乎凭空产生了卡片'
+
self
.
inspect
}
player_field
[
@from_pos
]
=
Card
.
new
(
@card
)
end
end
$log
.
info
(
'攻击宣言'
){
self
.
inspect
}
end
end
class
ViewDeck
<
Action
;
end
class
LP
<
Action
attr_accessor
:operator
,
:value
...
...
@@ -439,13 +561,94 @@ class Action
end
end
end
class
Attack
<
Action
def
initialize
(
from_player
,
from_pos
,
to_pos
=
nil
,
card
)
super
(
from_player
)
@from_pos
=
from_pos
@to_pos
=
to_pos
@card
=
card
end
def
run
card
=
if
@card
.
is_a?
Game_Card
@card
elsif
@from_pos
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
]
else
$log
.
info
(
'直接攻击'
){
'功能未实现'
}
@card
end
end
end
class
Counter
<
Action
def
initialize
(
from_player
,
from_pos
,
card
,
operator
,
value
)
super
(
from_player
)
@from_pos
=
from_pos
@card
=
card
@operator
=
operator
@value
=
value
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
case
@operator
when
:become
card
.
counters
=
@value
else
$log
.
warn
(
'指示物操作'
){
'become以外的未实现'
+
self
.
inspect
}
end
end
end
class
Add
<
Action
def
initialize
(
from_player
,
card
)
super
(
from_player
)
@card
=
card
end
def
run
if
@card
.
extra?
player_field
.
extra
<<
Game_Card
.
new
(
@card
)
else
player_field
.
hand
<<
Game_Card
.
new
(
@card
)
end
end
end
class
Destroy
<
Action
def
initialize
(
from_player
,
from_pos
,
card
)
super
(
from_player
)
@from_pos
=
from_pos
@card
=
card
end
def
run
if
@from_pos
<=
10
player_field
.
field
[
@from_pos
]
=
nil
else
player_field
.
hand
.
delete_at
(
@from_pos
-
11
)
end
end
end
class
Unknown
<
Action
def
initialize
(
str
)
@str
=
str
$log
.
info
'unkonwn action '
+
str
$log
.
warn
(
'unkonwn action'
)
{
str
}
end
def
run
$log
.
info
'unkonwn action run '
+
@str
$log
.
warn
(
'unkonwn action run'
){
@str
}
end
end
def
self
.
reset
...
...
lib/card.rb
View file @
89688fc9
...
...
@@ -111,22 +111,22 @@ class Card
@all
.
clear
#清空缓存
end
end
attr_accessor
:id
attr_accessor
:number
attr_accessor
:name
attr_accessor
:card_type
attr_accessor
:monster_type
attr_accessor
:atk
attr_accessor
:def
attr_accessor
:attribute
attr_accessor
:type
attr_accessor
:level
attr_accessor
:lore
attr_accessor
:status
attr_accessor
:stats
attr_accessor
:archettypes
attr_accessor
:mediums
attr_accessor
:tokens
attr_accessor
:id
attr_accessor
:number
attr_accessor
:name
attr_accessor
:card_type
attr_accessor
:monster_type
attr_accessor
:atk
attr_accessor
:def
attr_accessor
:attribute
attr_accessor
:type
attr_accessor
:level
attr_accessor
:lore
attr_accessor
:status
attr_accessor
:stats
attr_accessor
:archettypes
attr_accessor
:mediums
attr_accessor
:tokens
def
initialize
(
hash
)
@id
=
hash
[
'id'
].
to_i
...
...
@@ -145,17 +145,27 @@ attr_accessor :tokens
@archettypes
=
hash
[
'archettypes'
].
split
(
"
\t
"
).
collect
{
|
archettype
|
stat
.
to_sym
}
@mediums
=
hash
[
'mediums'
].
split
(
"
\t
"
).
collect
{
|
medium
|
medium
.
to_sym
}
@tokens
=
hash
[
'tokens'
]
&&
hash
[
'tokens'
].
split
(
"
\t
"
).
collect
{
|
token
|
token
.
to_i
}
@token
=
hash
[
'token'
]
Card
.
cache
[
@id
]
=
self
end
def
create_image
@image
||=
Surface
.
load
(
"graphics/field/card.jpg"
).
display_format
end
def
image
@image
||=
Surface
.
load
"
#{
PicPath
}
/
#{
@id
-
1
}
.jpg"
rescue
Surface
.
load
"graphics/field/card.jpg"
@image
||=
Surface
.
load
(
"
#{
PicPath
}
/
#{
@id
-
1
}
.jpg"
).
display_format
rescue
create_image
end
def
image_small
@image_small
||=
image
.
transform_surface
(
0xFF000000
,
0
,
54.0
/
image
.
w
,
81.0
/
image
.
h
,
Surface
::
TRANSFORM_SAFE
)
end
def
image_horizontal
@image_horizontal
||=
image_small
.
transform_surface
(
0xFF000000
,
90
,
1
,
1
,
Surface
::
TRANSFORM_SAFE
)
if
@image_horizontal
.
nil?
image_horizontal
=
image_small
.
transform_surface
(
0xFF000000
,
90
,
1
,
1
,
Surface
::
TRANSFORM_SAFE
)
@image_horizontal
=
image_horizontal
.
copy_rect
(
1
,
1
,
81
,
54
)
#SDL的bug,会多出1像素的黑边
image_horizontal
.
destroy
end
@image_horizontal
end
def
unknown?
@id
==
1
...
...
@@ -169,6 +179,12 @@ attr_accessor :tokens
def
spell?
[:
通常魔法
,
:
速攻魔法
,
:
装备魔法
,
:
场地魔法
,
:
仪式魔法
,
:
永续魔法
].
include?
card_type
end
def
extra?
[:
融合怪兽
,
:
同调怪兽
,
:
超量怪兽
].
include?
card_type
end
def
token?
@token
end
def
inspect
"[
#{
card_type
}
][
#{
name
}
]"
end
...
...
lib/game_card.rb
View file @
89688fc9
#encoding: UTF-8
class
Game_Card
attr_accessor
:card
,
:position
#attack|defense|set,
attr_
accesso
r
:atk
,
:def
attr_accessor
:card
,
:position
,
:counters
attr_
write
r
:atk
,
:def
@@count
=
0
def
initialize
(
card
=
nil
)
@@count
+=
1
...
...
@@ -13,16 +13,19 @@ class Game_Card
@card
.
atk
.
to_i
#把"?"转为0
end
def
def
@card
.
atk
.
to_i
#把"?"转为0
@card
.
def
.
to_i
#把"?"转为0
end
def
reset
(
reset_position
=
true
)
@position
=
:set
if
reset_position
@atk
=
@card
.
atk
@def
=
@card
.
def
@counters
=
0
end
def
card
=
(
card
)
return
if
@card
==
card
@card
=
card
reset
(
false
)
@atk
=
@card
.
atk
@def
=
@card
.
def
end
def
known?
@card
!=
Card
::
Unknown
...
...
lib/iduel/action.rb
View file @
89688fc9
#encoding: UTF-8
#这个文件iduel和nbx相同,编辑时推荐使用软/硬链接来保持一致
class
Action
CardFilter
=
/((?:<)?(?:\[.*?\])?\[(?:.*?)\].*?(?:>)?|一张怪兽卡|一张魔\/陷卡|\?\?)/
CardFilter
=
/((?:<)?(?:\[.*?\])?\[(?:.*?)\].*?(?:>)?|一张怪兽卡|一张魔\/陷卡|
一张卡|
\?\?)/
PosFilter
=
/((?:手卡|手牌|场上|魔陷区|怪兽区|墓地|额外牌堆|除外区|卡组|卡组顶端|\(\d+\)){1,2})/
PositionFilter
=
/(表攻|表守|里守|攻击表示|防守表示|里侧表示|背面守备表示)/
PhaseFilter
=
/(抽卡`阶段|准备`阶段|主`阶段1|战斗`阶段|主`阶段2|结束`阶段)/
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(?:◎|●)→\\)/
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后场:<(?:
#{
CountersFilter
}#{
CardFilter
}
)?><(?:
#{
CountersFilter
}#{
CardFilter
}
)?><(?:
#{
CountersFilter
}#{
CardFilter
}
)?><(?:
#{
CountersFilter
}#{
CardFilter
}
)?><(?:
#{
CountersFilter
}#{
CardFilter
}
)?>\n场地\|<(?:无|
#{
CountersFilter
}
#{
CardFilter
}
)>\n(?:◎|●)→\\)/
def
self
.
parse_pos
(
pos
)
if
index
=
pos
.
index
(
"("
)
index
+=
1
pos
[
index
,
pos
.
index
(
")"
)
-
index
].
to_i
result
=
pos
[
index
,
pos
.
index
(
")"
)
-
index
].
to_i
result
+=
10
if
pos
[
"手卡"
]
result
else
case
pos
when
"手卡"
,
"手牌"
...
...
@@ -47,25 +49,25 @@ 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
def
self
.
parse_field
(
matched
)
#LP, 手卡, 卡组
, 墓地, 除外, 6指示物, 6表示形式, 6卡, 7指示物, 7表示形式, 7卡, 8指示物, 8表示形式, 8卡, 9指示物, 9表示形式, 9卡, 10指示物, 10表示形式, 10卡, 1指示物, 1卡, 2指示物, 2卡, 3指示物, 3卡, 4指示物, 4卡, 5指示物, 5卡, 0指示物, 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
[
7
]
&&
{
:counters
=>
arr
[
5
].
to_i
,
:position
=>
parse_position
(
arr
[
6
]),
:card
=>
parse_card
(
arr
[
7
])},
7
=>
arr
[
10
]
&&
{
:counters
=>
arr
[
8
].
to_i
,
: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
[
16
]
&&
{
:counters
=>
arr
[
14
].
to_i
,
:position
=>
parse_position
(
arr
[
15
]),
:card
=>
parse_card
(
arr
[
16
])},
10
=>
arr
[
19
]
&&
{
:counters
=>
arr
[
17
].
to_i
,
:position
=>
parse_position
(
arr
[
18
]),
:card
=>
parse_card
(
arr
[
19
])},
1
=>
arr
[
20
]
&&
{
:position
=>
arr
[
20
]
==
"??"
?
:
set
:
:attack
,
:card
=>
parse_card
(
arr
[
20
])},
2
=>
arr
[
21
]
&&
{
:position
=>
arr
[
21
]
==
"??"
?
:
set
:
:attack
,
:card
=>
parse_card
(
arr
[
21
])},
3
=>
arr
[
22
]
&&
{
:position
=>
arr
[
22
]
==
"??"
?
:
set
:
:attack
,
:card
=>
parse_card
(
arr
[
22
])},
4
=>
arr
[
23
]
&&
{
:position
=>
arr
[
23
]
==
"??"
?
:
set
:
:attack
,
:card
=>
parse_card
(
arr
[
23
])},
5
=>
arr
[
24
]
&&
{
:position
=>
arr
[
24
]
==
"??"
?
:
set
:
:attack
,
:card
=>
parse_card
(
arr
[
24
])},
0
=>
arr
[
25
]
&&
{
:position
=>
arr
[
25
]
==
"??"
?
:
set
:
:attack
,
:card
=>
parse_card
(
arr
[
25
])}
:lp
=>
matched
[
0
].
to_i
,
:hand
=>
matched
[
1
].
to_i
,
:deck
=>
matched
[
2
].
to_i
,
:graveyard
=>
matched
[
3
].
to_i
,
:removed
=>
matched
[
4
].
to_i
,
6
=>
matched
[
7
]
&&
{
:counters
=>
parse_counters
(
matched
[
5
]),
:position
=>
parse_position
(
matched
[
6
]),
:card
=>
parse_card
(
matched
[
7
])},
7
=>
matched
[
10
]
&&
{
:counters
=>
parse_counters
(
matched
[
8
]),
:position
=>
parse_position
(
matched
[
9
]),
:card
=>
parse_card
(
matched
[
10
])},
8
=>
matched
[
13
]
&&
{
:counters
=>
parse_counters
(
matched
[
11
]),
:position
=>
parse_position
(
matched
[
12
]),
:card
=>
parse_card
(
matched
[
13
])},
9
=>
matched
[
16
]
&&
{
:counters
=>
parse_counters
(
matched
[
14
]),
:position
=>
parse_position
(
matched
[
15
]),
:card
=>
parse_card
(
matched
[
16
])},
10
=>
matched
[
19
]
&&
{
:counters
=>
parse_counters
(
matched
[
17
]),
:position
=>
parse_position
(
matched
[
18
]),
:card
=>
parse_card
(
matched
[
19
])},
1
=>
matched
[
21
]
&&
{
:counters
=>
parse_counters
(
matched
[
20
]),
:position
=>
matched
[
21
]
==
"??"
?
:
set
:
:attack
,
:card
=>
parse_card
(
matched
[
21
])},
2
=>
matched
[
23
]
&&
{
:counters
=>
parse_counters
(
matched
[
22
]),
:position
=>
matched
[
23
]
==
"??"
?
:
set
:
:attack
,
:card
=>
parse_card
(
matched
[
23
])},
3
=>
matched
[
25
]
&&
{
:counters
=>
parse_counters
(
matched
[
24
]),
:position
=>
matched
[
25
]
==
"??"
?
:
set
:
:attack
,
:card
=>
parse_card
(
matched
[
25
])},
4
=>
matched
[
27
]
&&
{
:counters
=>
parse_counters
(
matched
[
26
]),
:position
=>
matched
[
27
]
==
"??"
?
:
set
:
:attack
,
:card
=>
parse_card
(
matched
[
27
])},
5
=>
matched
[
29
]
&&
{
:counters
=>
parse_counters
(
matched
[
28
]),
:position
=>
matched
[
29
]
==
"??"
?
:
set
:
:attack
,
:card
=>
parse_card
(
matched
[
29
])},
0
=>
matched
[
31
]
&&
{
:counters
=>
parse_counters
(
matched
[
30
]),
:position
=>
matched
[
31
]
==
"??"
?
:
set
:
:attack
,
:card
=>
parse_card
(
matched
[
31
])}
}
end
def
self
.
parse_position
(
position
)
...
...
@@ -148,8 +150,6 @@ class Action
"里守"
end
end
def
self
.
escape_phase
(
phase
)
case
phase
when
:DP
...
...
@@ -166,6 +166,9 @@ class Action
"结束`阶段"
end
end
def
self
.
parse_counters
(
counters
)
counters
.
to_i
end
def
self
.
parse
(
str
)
from_player
=
nil
case
str
...
...
@@ -208,6 +211,12 @@ class Action
Shuffle
.
new
from_player
when
"查看卡组"
ViewDeck
.
new
from_player
when
"要连锁吗?"
ActivateAsk
.
new
from_player
when
"我要连锁!"
ActivateAnswer
.
new
from_player
,
true
when
"请继续吧~"
ActivateAnswer
.
new
from_player
,
false
when
"将顶牌放回卡组底部"
ReturnToDeckBottom
.
new
(
from_player
,
:deck
)
when
/抽取\((\d+)\)张卡/
...
...
@@ -258,15 +267,59 @@ class Action
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
))
when
/
#{
PosFilter
}#{
CardFilter
}
转移控制权/
Control
.
new
(
from_player
,
parse_pos
(
$1
),
parse_card
(
$2
))
when
/
#{
PosFilter
}#{
CardFilter
}
打开/
Flip
.
new
(
from_player
,
parse_pos
(
$1
),
parse_card
(
$2
))
when
/己方场上所有怪兽卡\|(~
#{
CardFilter
}
)*~全部送往墓地/
when
/
#{
PosFilter
}#{
CardFilter
}
反转/
FlipSummon
.
new
(
from_player
,
parse_pos
(
$1
),
parse_card
(
$2
))
when
/
#{
PosFilter
}#{
CardFilter
}
向(左|右)移动/
from_pos
=
parse_pos
(
$1
)
to_pos
=
$3
==
'左'
?
from_pos
-
1
:
from_pos
+
1
Move
.
new
(
from_player
,
from_pos
,
to_pos
,
parse_card
(
$2
))
when
/己方(场上所有怪兽卡\||场上所有魔\/陷卡\||所有手卡\||墓地\|,,,,,\|\*:\d+张:\*)(?:~
#{
CardFilter
}
)*~全部(放回卡组顶端|送往墓地|除外|加入手卡)/
from_pos
=
case
$1
when
"场上所有怪兽卡|"
:monsters
when
"场上所有魔
\/
陷卡|"
:spellsandtraps
when
"所有手卡|"
:hand
else
if
$1
[
"墓地"
]
:graveyard
end
end
to_pos
=
case
$3
when
"放回卡组顶端"
:deck
when
"送往墓地"
:graveyard
when
"除外"
:removed
when
"加入手卡"
:hand
end
cards
=
$&
.
scan
(
CardFilter
).
collect
{
|
matched
|
parse_card
matched
.
first
}
AllMonstersSendToGraveyard
.
new
(
from_player
,
cards
)
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
/
#{
PhaseFilter
}
/
ChangePhase
.
new
(
from_player
,
parse_phase
(
$1
))
when
/LP(损失|回复|变成)<(-?\d+)>/
LP
.
new
(
from_player
,
case
$1
when
"损失"
;
:lose
;
when
"回复"
;
:increase
;
when
"变成"
;
:become
end
,
$2
.
to_i
)
when
/
#{
PosFilter
}#{
CardFilter
}
攻击-
#{
PosFilter
}
-
#{
CardFilter
}
/
Attack
.
new
(
from_player
,
parse_pos
(
$1
),
parse_pos
(
$3
),
parse_card
(
$2
))
when
/
#{
CardFilter
}
(?:直接)?攻击/
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
/添加一张手牌
#{
CardFilter
}
/
Add
.
new
(
from_player
,
parse_card
(
$1
))
when
/将
#{
PosFilter
}#{
CardFilter
}
撕掉!/
Destroy
.
new
(
from_player
,
parse_pos
(
$1
),
parse_card
(
$2
))
else
Unknown
.
new
str
end
...
...
lib/iduel/replay.rb
View file @
89688fc9
#encoding: UTF-8
class
Replay
Delimiter
=
/^.+?\(\d+\)(?:\(\d+:\d+:\d+\))?(?:: |:)\n ?/
Player_Filter
=
/^(.+?)\((\d+)\)(?:\(\d+:\d+:\d+\))?(?:: |:)\n ?\[\d+\] ◎→/
Opponent_Filter
=
/^(.+?)\((\d+)\)(?:\(\d+:\d+:\d+\))?(?:: |:)\n ?\[\d+\] ●→/
User_Filter
=
/(.+?)\((\d+)\)(?:\(\d+:\d+:\d+\))?(?::|:) */
Delimiter
=
/^
#{
User_Filter
}
\n ?/
Player_Filter
=
/
#{
Delimiter
}
\[\d+\] ◎→/
Opponent_Filter
=
/
#{
Delimiter
}
\[\d+\] ●→/
HTML_Player_Filter
=
/<font color=blue><strong>
#{
User_Filter
}
<\/strong>/
HTML_Opponent_Filter
=
/<font color=red><strong>
#{
User_Filter
}
<\/strong>/
attr_accessor
:room
,
:player1
,
:player2
,
:actions
def
add
(
action
)
# user = action.from_player ? $game.player1 : $game.player2
...
...
@@ -13,26 +16,55 @@ class Replay
file
=
open
(
filename
)
file
.
set_encoding
"GBK"
,
"UTF-8"
,
:invalid
=>
:replace
,
:undef
=>
:replace
result
=
self
.
new
(
file
)
contents
=
file
.
read
if
contents
=~
Player_Filter
result
.
player1
=
User
.
new
(
$2
.
to_i
,
$1
)
contents
=
file
.
read
.
strip
if
contents
[
0
,
7
]
==
"<table>"
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"]
#去除HTML标签
contents
.
gsub!
(
/<.*?>/
,
''
)
#处理HTML转义字符
require
'cgi'
contents
=
CGI
.
unescape_html
(
contents
)
else
result
.
player1
=
User
.
new
(
0
,
"我"
)
result
.
player1
=
User
.
new
(
$2
.
to_i
,
$1
)
if
contents
=~
Player_Filter
result
.
player2
=
User
.
new
(
$2
.
to_i
,
$1
)
if
contents
=~
Opponent_Filter
from_players
=
contents
.
scan
(
Delimiter
).
collect
do
|
matched
|
id
=
matched
[
1
].
to_i
name
=
matched
[
0
]
if
result
.
player1
and
result
.
player1
.
id
==
id
true
elsif
result
.
player2
and
result
.
player2
.
id
==
id
false
elsif
result
.
player1
.
nil?
result
.
player1
=
User
.
new
(
id
,
name
)
true
elsif
result
.
player2
.
nil?
result
.
player2
=
User
.
new
(
id
,
name
)
false
else
#无法匹配玩家,一般是观战消息..
false
end
end
end
if
contents
=~
Opponent_Filter
result
.
player2
=
User
.
new
(
$2
.
to_i
,
$1
)
else
result
.
player2
=
User
.
new
(
1
,
"对手"
)
end
result
.
actions
=
contents
.
split
(
Delimiter
).
collect
do
|
action_str
|
action_str
.
strip!
next
if
action_str
.
empty?
result
.
player1
||=
User
.
new
(
0
,
"我"
)
result
.
player2
||=
User
.
new
(
1
,
"对手"
)
lines
=
contents
.
split
(
Delimiter
)
lines
.
shift
#split后,在第一个操作之前会多出一个空白元素
lines
=
lines
.
each_slice
(
lines
.
size
/
from_players
.
size
).
collect
{
|
a
|
a
.
last
.
strip
}
from_players
=
from_players
.
to_enum
result
.
actions
=
lines
.
collect
do
|
action_str
|
action
=
Action
.
parse
action_str
action
.
from_player
=
from_players
.
next
Game_Event
::
Action
.
new
(
action
,
action_str
)
end
.
compact
end
$game
.
room
=
result
.
room
=
Room
.
new
(
0
,
"Replay"
,
result
.
player1
,
result
.
player2
)
result
end
def
self
.
html_decode
(
text
)
text
.
gsub
(
Regexp
.
new
(
HTML_Replacement
.
keys
.
collect
{
|
key
|
Regexp
.
escape
key
}.
join
(
'|'
)),
HTML_Replacement
)
end
def
get
@actions
.
shift
end
...
...
lib/scene_duel.rb
View file @
89688fc9
...
...
@@ -39,13 +39,16 @@ class Scene_Duel < Scene
@fieldback_window
=
Window_FieldBack
.
new
(
130
,
174
)
@cardinfo_window
=
Window_CardInfo
.
new
(
715
,
0
)
@player_lp_window
=
Window_LP
.
new
(
0
,
0
,
@room
.
player1
,
true
)
@opponent_lp_window
=
Window_LP
.
new
(
360
,
0
,
@room
.
player2
,
false
)
@player_field_window
=
Window_Field
.
new
(
4
,
398
,
$game
.
player_field
,
true
)
@opponent_field_window
=
Window_Field
.
new
(
4
,
60
,
$game
.
opponent_field
,
false
)
@player_lp_window
=
Window_LP
.
new
(
0
,
0
,
@room
.
player1
,
true
)
@opponent_lp_window
=
Window_LP
.
new
(
360
,
0
,
@room
.
player2
,
false
)
@chat_window
=
Window_RoomChat
.
new
(
@cardinfo_window
.
x
,
@cardinfo_window
.
height
,
1024
-
@cardinfo_window
.
x
,
768
-
@cardinfo_window
.
height
)
create_action_window
Card
.
find
(:
方程式同调士
)
Card
.
find
(:
异星的最终战士
)
super
end
...
...
@@ -67,7 +70,7 @@ class Scene_Duel < Scene
def
change_phase
(
phase
)
action
Action
::
ChangePhase
.
new
(
true
,
phase
)
if
phase
==
:EP
and
action
Action
::
TurnEnd
.
new
(
true
,
$game
.
player_field
,
$game
.
turn_player
?
$game
.
turn
:
$game
.
turn
.
next
)
action
Action
::
TurnEnd
.
new
(
true
,
$game
.
player_field
,
$game
.
turn_player
?
$game
.
turn
:
$game
.
turn
.
next
)
end
end
def
reset
...
...
@@ -151,13 +154,13 @@ class Scene_Duel < Scene
super
end
def
refresh
@player_field_window
.
refresh
@opponent
_field_window
.
refresh
@phases_window
.
player
=
$game
.
turn_player
@phases_window
.
phase
=
$game
.
phase
@fieldback_window
.
card
=
$game
.
player_field
.
field
[
0
]
||
$game
.
opponent_field
.
field
[
0
]
@player_lp_window
.
lp
=
$game
.
player_field
.
lp
@opponent_lp_window
.
lp
=
$game
.
opponent_field
.
lp
@fieldback_window
.
card
=
$game
.
player_field
.
field
[
0
]
||
$game
.
opponent_field
.
field
[
0
]
@player
_field_window
.
refresh
@opponent_field_window
.
refresh
@phases_window
.
player
=
$game
.
turn_player
@phases_window
.
phase
=
$game
.
phase
@player_lp_window
.
lp
=
$game
.
player_field
.
lp
@opponent_lp_window
.
lp
=
$game
.
opponent_field
.
lp
end
def
terminate
save_replay
...
...
lib/window_field.rb
View file @
89688fc9
...
...
@@ -89,18 +89,27 @@ class Window_Field < Window
if
(
6
..
10
).
include?
(
index
)
and
@cards
[
index
].
position
!=
:attack
@contents
.
put
(
@cards
[
index
].
image_horizontal
,
x
,
y
)
@contents
.
put
(
@border_horizontal
,
x
-
1
,
y
-
1
)
if
status
==
1
x
+=
(
Card_Size
[
1
]
-
Card_Size
[
0
])
/
2
y
-=
(
Card_Size
[
1
]
-
Card_Size
[
0
])
/
2
else
@contents
.
put
(
@cards
[
index
].
image_small
,
x
,
y
)
@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
(
'/'
)
x
+=
(
Card_Size
[
0
]
-
spacing
)
/
2
y
+=
Card_Size
[
1
]
-
height
@font
.
draw_blended_utf8
(
@contents
,
'/'
,
x
,
y
,
0xFF
,
0xFF
,
0xFF
)
@font
.
draw_blended_utf8
(
@contents
,
@cards
[
index
].
atk
.
to_s
,
x
-
@font
.
text_size
(
@cards
[
index
].
atk
.
to_s
)[
0
],
y
,
0xFF
,
0xFF
,
0xFF
)
@font
.
draw_blended_utf8
(
@contents
,
@cards
[
index
].
def
.
to_s
,
x
+
spacing
,
y
,
0xFF
,
0xFF
,
0xFF
)
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
)
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
)
end
end
def
item_rect
(
index
)
@items
[
index
]
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment