Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Y
ygopro-2pick
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
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
MyCard
ygopro-2pick
Commits
df6796ad
Commit
df6796ad
authored
May 01, 2017
by
mercury233
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
https://github.com/Fluorohydride/ygopro
into server-link
parents
090fbbe8
44b05a18
Changes
17
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
352 additions
and
68 deletions
+352
-68
gframe/deck_con.cpp
gframe/deck_con.cpp
+104
-21
gframe/deck_con.h
gframe/deck_con.h
+4
-0
gframe/drawing.cpp
gframe/drawing.cpp
+78
-20
gframe/duelclient.cpp
gframe/duelclient.cpp
+34
-6
gframe/event_handler.cpp
gframe/event_handler.cpp
+10
-5
gframe/game.cpp
gframe/game.cpp
+25
-3
gframe/game.h
gframe/game.h
+9
-0
gframe/gframe.cpp
gframe/gframe.cpp
+19
-8
gframe/menu_handler.cpp
gframe/menu_handler.cpp
+3
-0
gframe/replay_mode.cpp
gframe/replay_mode.cpp
+9
-0
gframe/single_duel.cpp
gframe/single_duel.cpp
+14
-0
gframe/single_mode.cpp
gframe/single_mode.cpp
+21
-3
gframe/tag_duel.cpp
gframe/tag_duel.cpp
+16
-0
ocgcore
ocgcore
+1
-1
script
script
+1
-1
strings.conf
strings.conf
+2
-0
system.conf
system.conf
+2
-0
No files found.
gframe/deck_con.cpp
View file @
df6796ad
...
...
@@ -66,6 +66,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break
;
if
(
mainGame
->
wQuery
->
isVisible
()
&&
id
!=
BUTTON_YES
&&
id
!=
BUTTON_NO
)
break
;
if
(
mainGame
->
wLinkMarks
->
isVisible
()
&&
id
!=
BUTTON_MARKERS_OK
)
break
;
switch
(
event
.
GUIEvent
.
EventType
)
{
case
irr
:
:
gui
::
EGET_BUTTON_CLICKED
:
{
switch
(
id
)
{
...
...
@@ -157,18 +159,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break
;
}
case
BUTTON_START_FILTER
:
{
filter_type
=
mainGame
->
cbCardType
->
getSelected
();
filter_type2
=
mainGame
->
cbCardType2
->
getItemData
(
mainGame
->
cbCardType2
->
getSelected
());
filter_lm
=
mainGame
->
cbLimit
->
getSelected
();
if
(
filter_type
==
1
)
{
filter_attrib
=
mainGame
->
cbAttribute
->
getItemData
(
mainGame
->
cbAttribute
->
getSelected
());
filter_race
=
mainGame
->
cbRace
->
getItemData
(
mainGame
->
cbRace
->
getSelected
());
filter_atk
=
parse_filter
(
mainGame
->
ebAttack
->
getText
(),
&
filter_atktype
);
filter_def
=
parse_filter
(
mainGame
->
ebDefense
->
getText
(),
&
filter_deftype
);
filter_lv
=
parse_filter
(
mainGame
->
ebStar
->
getText
(),
&
filter_lvtype
);
filter_scl
=
parse_filter
(
mainGame
->
ebScale
->
getText
(),
&
filter_scltype
);
}
FilterCards
();
StartFilter
();
if
(
!
mainGame
->
gameConf
.
separate_clear_button
)
ClearFilter
();
break
;
...
...
@@ -242,6 +233,31 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
is_clearing
=
false
;
break
;
}
case
BUTTON_MARKS_FILTER
:
{
mainGame
->
PopupElement
(
mainGame
->
wLinkMarks
);
break
;
}
case
BUTTON_MARKERS_OK
:
{
filter_marks
=
0
;
if
(
mainGame
->
btnMark
[
0
]
->
isPressed
())
filter_marks
|=
0100
;
if
(
mainGame
->
btnMark
[
1
]
->
isPressed
())
filter_marks
|=
0200
;
if
(
mainGame
->
btnMark
[
2
]
->
isPressed
())
filter_marks
|=
0400
;
if
(
mainGame
->
btnMark
[
3
]
->
isPressed
())
filter_marks
|=
0010
;
if
(
mainGame
->
btnMark
[
4
]
->
isPressed
())
filter_marks
|=
0040
;
if
(
mainGame
->
btnMark
[
5
]
->
isPressed
())
filter_marks
|=
0001
;
if
(
mainGame
->
btnMark
[
6
]
->
isPressed
())
filter_marks
|=
0002
;
if
(
mainGame
->
btnMark
[
7
]
->
isPressed
())
filter_marks
|=
0004
;
mainGame
->
HideElement
(
mainGame
->
wLinkMarks
);
break
;
}
}
break
;
}
...
...
@@ -258,12 +274,17 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
case
irr
:
:
gui
::
EGET_EDITBOX_ENTER
:
{
switch
(
id
)
{
case
EDITBOX_KEYWORD
:
{
irr
::
SEvent
me
;
me
.
EventType
=
irr
::
EET_GUI_EVENT
;
me
.
GUIEvent
.
EventType
=
irr
::
gui
::
EGET_BUTTON_CLICKED
;
me
.
GUIEvent
.
Caller
=
mainGame
->
btnStartFilter
;
me
.
GUIEvent
.
Element
=
mainGame
->
btnStartFilter
;
mainGame
->
device
->
postEventFromUser
(
me
);
StartFilter
();
break
;
}
}
break
;
}
case
irr
:
:
gui
::
EGET_EDITBOX_CHANGED
:
{
switch
(
id
)
{
case
EDITBOX_KEYWORD
:
{
if
(
mainGame
->
gameConf
.
auto_search_limit
>=
0
&&
(
wcslen
(
mainGame
->
ebCardName
->
getText
())
>=
mainGame
->
gameConf
.
auto_search_limit
))
StartFilter
();
break
;
}
}
...
...
@@ -783,6 +804,20 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
}
return
false
;
}
void
DeckBuilder
::
StartFilter
()
{
filter_type
=
mainGame
->
cbCardType
->
getSelected
();
filter_type2
=
mainGame
->
cbCardType2
->
getItemData
(
mainGame
->
cbCardType2
->
getSelected
());
filter_lm
=
mainGame
->
cbLimit
->
getSelected
();
if
(
filter_type
==
1
)
{
filter_attrib
=
mainGame
->
cbAttribute
->
getItemData
(
mainGame
->
cbAttribute
->
getSelected
());
filter_race
=
mainGame
->
cbRace
->
getItemData
(
mainGame
->
cbRace
->
getSelected
());
filter_atk
=
parse_filter
(
mainGame
->
ebAttack
->
getText
(),
&
filter_atktype
);
filter_def
=
parse_filter
(
mainGame
->
ebDefense
->
getText
(),
&
filter_deftype
);
filter_lv
=
parse_filter
(
mainGame
->
ebStar
->
getText
(),
&
filter_lvtype
);
filter_scl
=
parse_filter
(
mainGame
->
ebScale
->
getText
(),
&
filter_scltype
);
}
FilterCards
();
}
void
DeckBuilder
::
FilterCards
()
{
results
.
clear
();
const
wchar_t
*
pstr
=
mainGame
->
ebCardName
->
getText
();
...
...
@@ -860,6 +895,8 @@ void DeckBuilder::FilterCards() {
}
if
(
filter_effect
&&
!
(
data
.
category
&
filter_effect
))
continue
;
if
(
filter_marks
&&
(
data
.
link_marker
&
filter_marks
)
!=
filter_marks
)
continue
;
if
(
filter_lm
)
{
if
(
filter_lm
<=
3
&&
(
!
filterList
->
count
(
ptr
->
first
)
||
(
*
filterList
)[
ptr
->
first
]
!=
filter_lm
-
1
))
continue
;
...
...
@@ -874,12 +911,12 @@ void DeckBuilder::FilterCards() {
}
if
(
pstr
)
{
if
(
pstr
[
0
]
==
L'$'
)
{
if
(
wcsstr
(
text
.
name
,
&
pstr
[
1
])
==
0
)
if
(
!
CardNameContains
(
text
.
name
,
&
pstr
[
1
])
)
continue
;
}
else
if
(
pstr
[
0
]
==
L'@'
&&
set_code
)
{
if
(
!
check_set_code
(
data
,
set_code
))
continue
;
}
else
{
if
(
wcsstr
(
text
.
name
,
pstr
)
==
0
&&
wcsstr
(
text
.
text
,
pstr
)
==
0
if
(
!
CardNameContains
(
text
.
name
,
pstr
)
&&
wcsstr
(
text
.
text
,
pstr
)
==
0
&&
(
!
set_code
||
!
check_set_code
(
data
,
set_code
)))
continue
;
}
...
...
@@ -909,6 +946,8 @@ void DeckBuilder::ClearSearch() {
mainGame
->
ebScale
->
setEnabled
(
false
);
mainGame
->
ebCardName
->
setText
(
L""
);
ClearFilter
();
results
.
clear
();
myswprintf
(
result_string
,
L"%d"
,
0
);
}
void
DeckBuilder
::
ClearFilter
()
{
mainGame
->
cbAttribute
->
setSelected
(
0
);
...
...
@@ -921,6 +960,9 @@ void DeckBuilder::ClearFilter() {
filter_effect
=
0
;
for
(
int
i
=
0
;
i
<
32
;
++
i
)
mainGame
->
chkCategory
[
i
]
->
setChecked
(
false
);
filter_marks
=
0
;
for
(
int
i
=
0
;
i
<
8
;
i
++
)
mainGame
->
btnMark
[
i
]
->
setPressed
(
false
);
}
void
DeckBuilder
::
SortList
()
{
auto
left
=
results
.
begin
();
...
...
@@ -946,5 +988,46 @@ void DeckBuilder::SortList() {
break
;
}
}
static
inline
wchar_t
NormalizeChar
(
wchar_t
c
)
{
/*
// Convert all symbols and punctuations to space.
if (c != 0 && c < 128 && !isalnum(c)) {
return ' ';
}
*/
// Convert latin chararacters to uppercase to ignore case.
if
(
c
<
128
&&
isalpha
(
c
))
{
return
toupper
(
c
);
}
// Remove some accentued characters that are not supported by the editbox.
if
(
c
>=
232
&&
c
<=
235
)
{
return
'E'
;
}
if
(
c
>=
238
&&
c
<=
239
)
{
return
'I'
;
}
return
c
;
}
bool
DeckBuilder
::
CardNameContains
(
const
wchar_t
*
haystack
,
const
wchar_t
*
needle
)
{
if
(
!
needle
[
0
])
{
return
true
;
}
int
i
=
0
;
int
j
=
0
;
while
(
haystack
[
i
])
{
wchar_t
ca
=
NormalizeChar
(
haystack
[
i
]);
wchar_t
cb
=
NormalizeChar
(
needle
[
j
]);
if
(
ca
==
cb
)
{
j
++
;
if
(
!
needle
[
j
])
{
return
true
;
}
}
else
{
j
=
0
;
}
i
++
;
}
return
false
;
}
}
gframe/deck_con.h
View file @
df6796ad
...
...
@@ -12,10 +12,13 @@ class DeckBuilder: public irr::IEventReceiver {
public:
virtual
bool
OnEvent
(
const
irr
::
SEvent
&
event
);
void
FilterCards
();
void
StartFilter
();
void
ClearFilter
();
void
ClearSearch
();
void
SortList
();
bool
CardNameContains
(
const
wchar_t
*
haystack
,
const
wchar_t
*
needle
);
long
long
filter_effect
;
unsigned
int
filter_type
;
unsigned
int
filter_type2
;
...
...
@@ -29,6 +32,7 @@ public:
unsigned
int
filter_lv
;
unsigned
int
filter_scltype
;
unsigned
int
filter_scl
;
unsigned
int
filter_marks
;
int
filter_lm
;
int
hovered_code
;
int
hovered_pos
;
...
...
gframe/drawing.cpp
View file @
df6796ad
...
...
@@ -166,8 +166,13 @@ void Game::DrawBackGround() {
S3DVertex
*
vertex
=
0
;
if
(
dField
.
hovered_location
==
LOCATION_DECK
)
vertex
=
matManager
.
vFieldDeck
[
dField
.
hovered_controler
];
else
if
(
dField
.
hovered_location
==
LOCATION_MZONE
)
else
if
(
dField
.
hovered_location
==
LOCATION_MZONE
)
{
vertex
=
matManager
.
vFieldMzone
[
dField
.
hovered_controler
][
dField
.
hovered_sequence
];
ClientCard
*
pcard
=
mainGame
->
dField
.
mzone
[
dField
.
hovered_controler
][
dField
.
hovered_sequence
];
if
(
dInfo
.
duel_rule
>=
3
&&
pcard
&&
pcard
->
type
&
TYPE_LINK
)
{
DrawLinkedZones
(
pcard
);
}
}
else
if
(
dField
.
hovered_location
==
LOCATION_SZONE
)
vertex
=
matManager
.
vFieldSzone
[
dField
.
hovered_controler
][
dField
.
hovered_sequence
][
rule
];
else
if
(
dField
.
hovered_location
==
LOCATION_GRAVE
)
...
...
@@ -191,6 +196,36 @@ void Game::DrawBackGround() {
driver
->
drawVertexPrimitiveList
(
vertex
,
4
,
matManager
.
iRectangle
,
2
);
}
}
void
Game
::
DrawLinkedZones
(
ClientCard
*
pcard
)
{
int
mark
=
pcard
->
link_marker
;
matManager
.
mSelField
.
AmbientColor
=
0xff0261a2
;
driver
->
setMaterial
(
matManager
.
mSelField
);
if
(
dField
.
hovered_sequence
<
5
)
{
if
(
mark
&
LINK_MARKER_LEFT
&&
dField
.
hovered_sequence
>
0
)
driver
->
drawVertexPrimitiveList
(
&
matManager
.
vFieldMzone
[
dField
.
hovered_controler
][
dField
.
hovered_sequence
-
1
],
4
,
matManager
.
iRectangle
,
2
);
if
(
mark
&
LINK_MARKER_RIGHT
&&
dField
.
hovered_sequence
<
4
)
driver
->
drawVertexPrimitiveList
(
&
matManager
.
vFieldMzone
[
dField
.
hovered_controler
][
dField
.
hovered_sequence
+
1
],
4
,
matManager
.
iRectangle
,
2
);
if
((
mark
&
LINK_MARKER_TOP_LEFT
&&
dField
.
hovered_sequence
==
2
)
||
(
mark
&
LINK_MARKER_TOP
&&
dField
.
hovered_sequence
==
1
)
||
(
mark
&
LINK_MARKER_TOP_RIGHT
&&
dField
.
hovered_sequence
==
0
))
driver
->
drawVertexPrimitiveList
(
&
matManager
.
vFieldMzone
[
dField
.
hovered_controler
][
5
],
4
,
matManager
.
iRectangle
,
2
);
if
((
mark
&
LINK_MARKER_TOP_LEFT
&&
dField
.
hovered_sequence
==
4
)
||
(
mark
&
LINK_MARKER_TOP
&&
dField
.
hovered_sequence
==
3
)
||
(
mark
&
LINK_MARKER_TOP_RIGHT
&&
dField
.
hovered_sequence
==
2
))
driver
->
drawVertexPrimitiveList
(
&
matManager
.
vFieldMzone
[
dField
.
hovered_controler
][
6
],
4
,
matManager
.
iRectangle
,
2
);
}
else
{
int
swap
=
(
dField
.
hovered_sequence
==
5
)
?
0
:
2
;
if
(
mark
&
LINK_MARKER_BOTTOM_LEFT
)
driver
->
drawVertexPrimitiveList
(
&
matManager
.
vFieldMzone
[
dField
.
hovered_controler
][
0
+
swap
],
4
,
matManager
.
iRectangle
,
2
);
if
(
mark
&
LINK_MARKER_BOTTOM
)
driver
->
drawVertexPrimitiveList
(
&
matManager
.
vFieldMzone
[
dField
.
hovered_controler
][
1
+
swap
],
4
,
matManager
.
iRectangle
,
2
);
if
(
mark
&
LINK_MARKER_BOTTOM_RIGHT
)
driver
->
drawVertexPrimitiveList
(
&
matManager
.
vFieldMzone
[
dField
.
hovered_controler
][
2
+
swap
],
4
,
matManager
.
iRectangle
,
2
);
if
(
mark
&
LINK_MARKER_TOP_LEFT
)
driver
->
drawVertexPrimitiveList
(
&
matManager
.
vFieldMzone
[
1
-
dField
.
hovered_controler
][
4
-
swap
],
4
,
matManager
.
iRectangle
,
2
);
if
(
mark
&
LINK_MARKER_TOP
)
driver
->
drawVertexPrimitiveList
(
&
matManager
.
vFieldMzone
[
1
-
dField
.
hovered_controler
][
3
-
swap
],
4
,
matManager
.
iRectangle
,
2
);
if
(
mark
&
LINK_MARKER_TOP_RIGHT
)
driver
->
drawVertexPrimitiveList
(
&
matManager
.
vFieldMzone
[
1
-
dField
.
hovered_controler
][
2
-
swap
],
4
,
matManager
.
iRectangle
,
2
);
}
}
void
Game
::
DrawCards
()
{
for
(
int
p
=
0
;
p
<
2
;
++
p
)
{
for
(
auto
it
=
dField
.
mzone
[
p
].
begin
();
it
!=
dField
.
mzone
[
p
].
end
();
++
it
)
...
...
@@ -437,25 +472,48 @@ void Game::DrawMisc() {
pcard
=
dField
.
mzone
[
1
][
6
];
if
(
pcard
&&
(
pcard
->
position
&
POS_FACEUP
))
DrawStatus
(
pcard
,
593
,
291
,
555
,
338
);
pcard
=
dField
.
szone
[
0
][
6
];
if
(
pcard
)
{
adFont
->
draw
(
pcard
->
lscstring
,
recti
(
426
,
394
,
438
,
414
),
0xff000000
,
true
,
false
,
0
);
adFont
->
draw
(
pcard
->
lscstring
,
recti
(
427
,
395
,
439
,
415
),
0xffffffff
,
true
,
false
,
0
);
}
pcard
=
dField
.
szone
[
0
][
7
];
if
(
pcard
)
{
adFont
->
draw
(
pcard
->
rscstring
,
recti
(
880
,
394
,
912
,
414
),
0xff000000
,
true
,
false
,
0
);
adFont
->
draw
(
pcard
->
rscstring
,
recti
(
881
,
395
,
913
,
415
),
0xffffffff
,
true
,
false
,
0
);
}
pcard
=
dField
.
szone
[
1
][
6
];
if
(
pcard
)
{
adFont
->
draw
(
pcard
->
lscstring
,
recti
(
839
,
245
,
871
,
265
),
0xff000000
,
true
,
false
,
0
);
adFont
->
draw
(
pcard
->
lscstring
,
recti
(
840
,
246
,
872
,
266
),
0xffffffff
,
true
,
false
,
0
);
}
pcard
=
dField
.
szone
[
1
][
7
];
if
(
pcard
)
{
adFont
->
draw
(
pcard
->
rscstring
,
recti
(
463
,
245
,
495
,
265
),
0xff000000
,
true
,
false
,
0
);
adFont
->
draw
(
pcard
->
rscstring
,
recti
(
464
,
246
,
496
,
266
),
0xffffffff
,
true
,
false
,
0
);
if
(
dInfo
.
duel_rule
<
3
)
{
pcard
=
dField
.
szone
[
0
][
6
];
if
(
pcard
)
{
adFont
->
draw
(
pcard
->
lscstring
,
recti
(
426
,
394
,
438
,
414
),
0xff000000
,
true
,
false
,
0
);
adFont
->
draw
(
pcard
->
lscstring
,
recti
(
427
,
395
,
439
,
415
),
0xffffffff
,
true
,
false
,
0
);
}
pcard
=
dField
.
szone
[
0
][
7
];
if
(
pcard
)
{
adFont
->
draw
(
pcard
->
rscstring
,
recti
(
880
,
394
,
912
,
414
),
0xff000000
,
true
,
false
,
0
);
adFont
->
draw
(
pcard
->
rscstring
,
recti
(
881
,
395
,
913
,
415
),
0xffffffff
,
true
,
false
,
0
);
}
pcard
=
dField
.
szone
[
1
][
6
];
if
(
pcard
)
{
adFont
->
draw
(
pcard
->
lscstring
,
recti
(
839
,
245
,
871
,
265
),
0xff000000
,
true
,
false
,
0
);
adFont
->
draw
(
pcard
->
lscstring
,
recti
(
840
,
246
,
872
,
266
),
0xffffffff
,
true
,
false
,
0
);
}
pcard
=
dField
.
szone
[
1
][
7
];
if
(
pcard
)
{
adFont
->
draw
(
pcard
->
rscstring
,
recti
(
463
,
245
,
495
,
265
),
0xff000000
,
true
,
false
,
0
);
adFont
->
draw
(
pcard
->
rscstring
,
recti
(
464
,
246
,
496
,
266
),
0xffffffff
,
true
,
false
,
0
);
}
}
else
{
pcard
=
dField
.
szone
[
0
][
0
];
if
(
pcard
&&
(
pcard
->
type
&
TYPE_PENDULUM
)
&&
!
pcard
->
equipTarget
)
{
adFont
->
draw
(
pcard
->
lscstring
,
recti
(
454
,
430
,
466
,
450
),
0xff000000
,
true
,
false
,
0
);
adFont
->
draw
(
pcard
->
lscstring
,
recti
(
455
,
431
,
467
,
451
),
0xffffffff
,
true
,
false
,
0
);
}
pcard
=
dField
.
szone
[
0
][
4
];
if
(
pcard
&&
(
pcard
->
type
&
TYPE_PENDULUM
)
&&
!
pcard
->
equipTarget
)
{
adFont
->
draw
(
pcard
->
rscstring
,
recti
(
850
,
430
,
882
,
450
),
0xff000000
,
true
,
false
,
0
);
adFont
->
draw
(
pcard
->
rscstring
,
recti
(
851
,
431
,
883
,
451
),
0xffffffff
,
true
,
false
,
0
);
}
pcard
=
dField
.
szone
[
1
][
0
];
if
(
pcard
&&
(
pcard
->
type
&
TYPE_PENDULUM
)
&&
!
pcard
->
equipTarget
)
{
adFont
->
draw
(
pcard
->
lscstring
,
recti
(
806
,
222
,
838
,
242
),
0xff000000
,
true
,
false
,
0
);
adFont
->
draw
(
pcard
->
lscstring
,
recti
(
807
,
223
,
839
,
243
),
0xffffffff
,
true
,
false
,
0
);
}
pcard
=
dField
.
szone
[
1
][
4
];
if
(
pcard
&&
(
pcard
->
type
&
TYPE_PENDULUM
)
&&
!
pcard
->
equipTarget
)
{
adFont
->
draw
(
pcard
->
rscstring
,
recti
(
498
,
222
,
530
,
242
),
0xff000000
,
true
,
false
,
0
);
adFont
->
draw
(
pcard
->
rscstring
,
recti
(
499
,
223
,
531
,
243
),
0xffffffff
,
true
,
false
,
0
);
}
}
if
(
dField
.
extra
[
0
].
size
())
{
int
offset
=
(
dField
.
extra
[
0
].
size
()
>=
10
)
?
0
:
mainGame
->
textFont
->
getDimension
(
dataManager
.
GetNumString
(
1
)).
Width
;
...
...
gframe/duelclient.cpp
View file @
df6796ad
...
...
@@ -1014,7 +1014,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
mainGame
->
dField
.
remove_act
=
true
;
else
if
(
pcard
->
location
==
LOCATION_EXTRA
)
mainGame
->
dField
.
extra_act
=
true
;
else
if
(
pcard
->
location
==
LOCATION_SZONE
&&
(
pcard
->
sequence
==
0
||
pcard
->
sequence
==
6
)
&&
pcard
->
lscale
)
else
if
(
pcard
->
location
==
LOCATION_SZONE
&&
(
pcard
->
sequence
==
0
||
pcard
->
sequence
==
6
)
&&
(
pcard
->
type
&
TYPE_PENDULUM
)
)
mainGame
->
dField
.
pzone_act
[
pcard
->
controler
]
=
true
;
}
mainGame
->
dField
.
reposable_cards
.
clear
();
...
...
@@ -1295,10 +1295,14 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
myswprintf
(
textBuffer
,
dataManager
.
GetSysString
(
569
),
dataManager
.
GetName
(
select_hint
));
}
else
myswprintf
(
textBuffer
,
dataManager
.
GetSysString
(
560
));
select_hint
=
0
;
mainGame
->
stHintMsg
->
setText
(
textBuffer
);
}
else
mainGame
->
stHintMsg
->
setText
(
dataManager
.
GetSysString
(
570
));
}
else
{
if
(
select_hint
)
{
myswprintf
(
textBuffer
,
dataManager
.
GetDesc
(
select_hint
));
}
else
myswprintf
(
textBuffer
,
dataManager
.
GetSysString
(
570
));
}
select_hint
=
0
;
mainGame
->
stHintMsg
->
setText
(
textBuffer
);
mainGame
->
stHintMsg
->
setVisible
(
true
);
if
(
mainGame
->
dInfo
.
curMsg
==
MSG_SELECT_PLACE
&&
mainGame
->
chkAutoPos
->
isChecked
())
{
unsigned
int
filter
;
...
...
@@ -2910,6 +2914,30 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
mainGame
->
WaitFrameSignal
(
40
);
return
true
;
}
case
MSG_ROCK_PAPER_SCISSORS
:
{
/*int player = */
mainGame
->
LocalPlayer
(
BufferIO
::
ReadInt8
(
pbuf
));
if
(
mainGame
->
dInfo
.
isReplay
&&
mainGame
->
dInfo
.
isReplaySkiping
)
return
true
;
mainGame
->
gMutex
.
Lock
();
mainGame
->
PopupElement
(
mainGame
->
wHand
);
mainGame
->
gMutex
.
Unlock
();
return
false
;
}
case
MSG_HAND_RES
:
{
int
res
=
BufferIO
::
ReadInt8
(
pbuf
);
if
(
mainGame
->
dInfo
.
isReplay
&&
mainGame
->
dInfo
.
isReplaySkiping
)
return
true
;
mainGame
->
stHintMsg
->
setVisible
(
false
);
if
(
mainGame
->
dInfo
.
isFirst
)
mainGame
->
showcardcode
=
((
res
&
0x3
)
-
1
)
+
((((
res
>>
2
)
&
0x3
)
-
1
)
<<
16
);
else
mainGame
->
showcardcode
=
(((
res
>>
2
)
&
0x3
)
-
1
)
+
(((
res
&
0x3
)
-
1
)
<<
16
);
mainGame
->
showcarddif
=
50
;
mainGame
->
showcardp
=
0
;
mainGame
->
showcard
=
100
;
mainGame
->
WaitFrameSignal
(
60
);
return
false
;
}
case
MSG_ANNOUNCE_RACE
:
{
/*int player = */
mainGame
->
LocalPlayer
(
BufferIO
::
ReadInt8
(
pbuf
));
mainGame
->
dField
.
announce_count
=
BufferIO
::
ReadInt8
(
pbuf
);
...
...
@@ -3176,6 +3204,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
case
MSG_RELOAD_FIELD
:
{
mainGame
->
gMutex
.
Lock
();
mainGame
->
dField
.
Clear
();
mainGame
->
dInfo
.
duel_rule
=
BufferIO
::
ReadInt8
(
pbuf
);
int
val
=
0
;
for
(
int
i
=
0
;
i
<
2
;
++
i
)
{
int
p
=
mainGame
->
LocalPlayer
(
i
);
...
...
@@ -3291,7 +3320,6 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
myswprintf
(
event_string
,
dataManager
.
GetSysString
(
1609
),
dataManager
.
GetName
(
mainGame
->
dField
.
current_chain
.
code
));
mainGame
->
dField
.
last_chain
=
true
;
}
mainGame
->
dInfo
.
duel_rule
=
BufferIO
::
ReadInt8
(
pbuf
);
mainGame
->
gMutex
.
Unlock
();
break
;
}
...
...
gframe/event_handler.cpp
View file @
df6796ad
...
...
@@ -29,11 +29,16 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case
BUTTON_HAND2
:
case
BUTTON_HAND3
:
{
mainGame
->
wHand
->
setVisible
(
false
);
mainGame
->
stHintMsg
->
setText
(
L""
);
mainGame
->
stHintMsg
->
setVisible
(
true
);
CTOS_HandResult
cshr
;
cshr
.
res
=
id
-
BUTTON_HAND1
+
1
;
DuelClient
::
SendPacketToServer
(
CTOS_HAND_RESULT
,
cshr
);
if
(
mainGame
->
dInfo
.
curMsg
==
MSG_ROCK_PAPER_SCISSORS
){
DuelClient
::
SetResponseI
(
id
-
BUTTON_HAND1
+
1
);
DuelClient
::
SendResponse
();
}
else
{
mainGame
->
stHintMsg
->
setText
(
L""
);
mainGame
->
stHintMsg
->
setVisible
(
true
);
CTOS_HandResult
cshr
;
cshr
.
res
=
id
-
BUTTON_HAND1
+
1
;
DuelClient
::
SendPacketToServer
(
CTOS_HAND_RESULT
,
cshr
);
}
break
;
}
case
BUTTON_FIRST
:
...
...
gframe/game.cpp
View file @
df6796ad
...
...
@@ -527,10 +527,10 @@ bool Game::Initialize() {
ebDefense = env->addEditBox(L"", rect<s32>(260, 40 + 75 / 6, 340, 60 + 75 / 6), true, wFilter);
ebDefense->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
env->addStaticText(dataManager.GetSysString(1324), rect<s32>(10, 62 + 100 / 6, 80, 82 + 100 / 6), false, false, wFilter);
ebStar = env->addEditBox(L"", rect<s32>(60, 60 + 100 / 6, 1
9
0, 80 + 100 / 6), true, wFilter);
ebStar = env->addEditBox(L"", rect<s32>(60, 60 + 100 / 6, 1
0
0, 80 + 100 / 6), true, wFilter);
ebStar->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
env->addStaticText(dataManager.GetSysString(1336), rect<s32>(10
, 82 + 125 / 6, 80, 102 + 125
/ 6), false, false, wFilter);
ebScale = env->addEditBox(L"", rect<s32>(
60, 80 + 125 / 6, 190, 100 + 125
/ 6), true, wFilter);
env->addStaticText(dataManager.GetSysString(1336), rect<s32>(10
1, 62 + 100 / 6, 150, 82 + 100
/ 6), false, false, wFilter);
ebScale = env->addEditBox(L"", rect<s32>(
150, 60 + 100 / 6, 190, 80 + 100
/ 6), true, wFilter);
ebScale->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
env->addStaticText(dataManager.GetSysString(1325), rect<s32>(205, 62 + 100 / 6, 280, 82 + 100 / 6), false, false, wFilter);
ebCardName = env->addEditBox(L"", rect<s32>(260, 60 + 100 / 6, 390, 80 + 100 / 6), true, wFilter, EDITBOX_KEYWORD);
...
...
@@ -549,6 +549,23 @@ bool Game::Initialize() {
btnCategoryOK = env->addButton(rect<s32>(135, 175, 235, 200), wCategories, BUTTON_CATEGORY_OK, dataManager.GetSysString(1211));
for(int i = 0; i < 32; ++i)
chkCategory[i] = env->addCheckBox(false, recti(10 + (i % 4) * 90, 10 + (i / 4) * 20, 100 + (i % 4) * 90, 30 + (i / 4) * 20), wCategories, -1, dataManager.GetSysString(1100 + i));
btnMarksFilter = env->addButton(rect<s32>(60, 80 + 125 / 6, 190, 100 + 125 / 6), wFilter, BUTTON_MARKS_FILTER, dataManager.GetSysString(1374));
wLinkMarks = env->addWindow(rect<s32>(700, 30, 820, 150), false, dataManager.strBuffer);
wLinkMarks->getCloseButton()->setVisible(false);
wLinkMarks->setDrawTitlebar(false);
wLinkMarks->setDraggable(false);
wLinkMarks->setVisible(false);
btnMarksOK = env->addButton(recti(45, 45, 75, 75), wLinkMarks, BUTTON_MARKERS_OK, dataManager.GetSysString(1211));
btnMark[0] = env->addButton(recti(10, 10, 40, 40), wLinkMarks, -1, L"\u2196");
btnMark[1] = env->addButton(recti(45, 10, 75, 40), wLinkMarks, -1, L"\u2191");
btnMark[2] = env->addButton(recti(80, 10, 110, 40), wLinkMarks, -1, L"\u2197");
btnMark[3] = env->addButton(recti(10, 45, 40, 75), wLinkMarks, -1, L"\u2190");
btnMark[4] = env->addButton(recti(80, 45, 110, 75), wLinkMarks, -1, L"\u2192");
btnMark[5] = env->addButton(recti(10, 80, 40, 110), wLinkMarks, -1, L"\u2199");
btnMark[6] = env->addButton(recti(45, 80, 75, 110), wLinkMarks, -1, L"\u2193");
btnMark[7] = env->addButton(recti(80, 80, 110, 110), wLinkMarks, -1, L"\u2198");
for(int i=0;i<8;i++)
btnMark[i]->setIsPushButton(true);
//replay window
wReplay = env->addWindow(rect<s32>(220, 100, 800, 520), false, dataManager.GetSysString(1202));
wReplay->getCloseButton()->setVisible(false);
...
...
@@ -943,6 +960,7 @@ void Game::LoadConfig() {
gameConf.control_mode = 0;
gameConf.draw_field_spell = 1;
gameConf.separate_clear_button = 1;
gameConf.auto_search_limit = -1;
fseek(fp, 0, SEEK_END);
int fsize = ftell(fp);
fseek(fp, 0, SEEK_SET);
...
...
@@ -997,6 +1015,8 @@ void Game::LoadConfig() {
gameConf.draw_field_spell = atoi(valbuf);
} else if(!strcmp(strbuf, "separate_clear_button")) {
gameConf.separate_clear_button = atoi(valbuf);
} else if(!strcmp(strbuf, "auto_search_limit")) {
gameConf.auto_search_limit = atoi(valbuf);
} else {
// options allowing multiple words
sscanf(linebuf, "%s = %240[^\n]", strbuf, valbuf);
...
...
@@ -1050,6 +1070,8 @@ void Game::SaveConfig() {
fprintf(fp, "control_mode = %d\n", gameConf.control_mode);
fprintf(fp, "draw_field_spell = %d\n", gameConf.draw_field_spell);
fprintf(fp, "separate_clear_button = %d\n", gameConf.separate_clear_button);
fprintf(fp, "#auto_search_limit >= 0: Start search automatically when the user enters N chars\n");
fprintf(fp, "auto_search_limit = %d\n", gameConf.auto_search_limit);
fclose(fp);
}
void Game::ShowCardInfo(int code) {
...
...
gframe/game.h
View file @
df6796ad
...
...
@@ -36,6 +36,7 @@ struct Config {
int
control_mode
;
int
draw_field_spell
;
int
separate_clear_button
;
int
auto_search_limit
;
};
struct
DuelInfo
{
...
...
@@ -91,6 +92,7 @@ public:
void RefreshSingleplay();
void DrawSelectionLine(irr::video::S3DVertex* vec, bool strip, int width, float* cv);
void DrawBackGround();
void DrawLinkedZones(ClientCard* pcard);
void DrawCards();
void DrawCard(ClientCard* pcard);
void DrawMisc();
...
...
@@ -389,6 +391,10 @@ public:
irr::gui::IGUIWindow* wCategories;
irr::gui::IGUICheckBox* chkCategory[32];
irr::gui::IGUIButton* btnCategoryOK;
irr::gui::IGUIButton* btnMarksFilter;
irr::gui::IGUIWindow* wLinkMarks;
irr::gui::IGUIButton* btnMark[8];
irr::gui::IGUIButton* btnMarksOK;
//sort type
irr::gui::IGUIStaticText* wSort;
irr::gui::IGUIComboBox* cbSortType;
...
...
@@ -558,5 +564,8 @@ extern unsigned char draw_count;
#define BUTTON_CANCEL_SINGLEPLAY 352
#define COMBOBOX_SORTTYPE 370
#define BUTTON_MARKS_FILTER 380
#define BUTTON_MARKERS_OK 381
#define DEFAULT_DUEL_RULE 3
#endif // GAME_H
gframe/gframe.cpp
View file @
df6796ad
...
...
@@ -131,19 +131,30 @@ int main(int argc, char* argv[]) {
} else if(!strcmp(argv[i], "-k")) { // Keep on return
exit_on_return = false;
keep_on_return = true;
} else if(!strcmp(argv[i], "-d")) { // Deck
if(i + 2 < argc) { // select deck
++i;
GetParameterW(ygo::mainGame->gameConf.lastdeck, &argv[i][0]);
continue;
} else { // open deck
exit_on_return = !keep_on_return;
if(i < argc) {
open_file = true;
GetParameterW(open_file_name, &argv[i + 1][0]);
}
ClickButton(ygo::mainGame->btnDeckEdit);
break;
}
} else if(!strcmp(argv[i], "-c")) { // Create host
exit_on_return = !keep_on_return;
ygo::mainGame->HideElement(ygo::mainGame->wMainMenu);
ClickButton(ygo::mainGame->btnHostConfirm);
break;
} else if(!strcmp(argv[i], "-j")) { // Join host
exit_on_return = !keep_on_return;
ClickButton(ygo::mainGame->btnLanMode);
ClickButton(ygo::mainGame->btnJoinHost);
break;
} else if(!strcmp(argv[i], "-d")) { // Deck
exit_on_return = !keep_on_return;
if(i < argc) {
open_file = true;
GetParameterW(open_file_name, &argv[i + 1][0]);
}
ClickButton(ygo::mainGame->btnDeckEdit);
break;
} else if(!strcmp(argv[i], "-r")) { // Replay
exit_on_return = !keep_on_return;
if(i < argc) {
...
...
gframe/menu_handler.cpp
View file @
df6796ad
...
...
@@ -271,6 +271,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame
->
ebStar
->
setEnabled
(
false
);
mainGame
->
ebScale
->
setEnabled
(
false
);
mainGame
->
deckBuilder
.
filter_effect
=
0
;
mainGame
->
deckBuilder
.
filter_marks
=
0
;
mainGame
->
deckBuilder
.
result_string
[
0
]
=
L'0'
;
mainGame
->
deckBuilder
.
result_string
[
1
]
=
0
;
mainGame
->
deckBuilder
.
results
.
clear
();
...
...
@@ -280,6 +281,8 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame
->
device
->
setEventReceiver
(
&
mainGame
->
deckBuilder
);
for
(
int
i
=
0
;
i
<
32
;
++
i
)
mainGame
->
chkCategory
[
i
]
->
setChecked
(
false
);
for
(
int
i
=
0
;
i
<
8
;
i
++
)
mainGame
->
btnMark
[
i
]
->
setPressed
(
false
);
break
;
}
}
...
...
gframe/replay_mode.cpp
View file @
df6796ad
...
...
@@ -745,6 +745,15 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) {
DuelClient
::
ClientAnalyze
(
offset
,
pbuf
-
offset
);
break
;
}
case
MSG_ROCK_PAPER_SCISSORS
:
{
player
=
BufferIO
::
ReadInt8
(
pbuf
);
return
ReadReplayResponse
();
}
case
MSG_HAND_RES
:
{
pbuf
+=
1
;
DuelClient
::
ClientAnalyze
(
offset
,
pbuf
-
offset
);
break
;
}
case
MSG_ANNOUNCE_RACE
:
{
player
=
BufferIO
::
ReadInt8
(
pbuf
);
pbuf
+=
5
;
...
...
gframe/single_duel.cpp
View file @
df6796ad
...
...
@@ -1452,6 +1452,20 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer
::
ReSendToPlayer
(
*
oit
);
break
;
}
case
MSG_ROCK_PAPER_SCISSORS
:
{
player
=
BufferIO
::
ReadInt8
(
pbuf
);
WaitforResponse
(
player
);
NetServer
::
SendBufferToPlayer
(
players
[
player
],
STOC_GAME_MSG
,
offset
,
pbuf
-
offset
);
return
1
;
}
case
MSG_HAND_RES
:
{
pbuf
+=
1
;
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_GAME_MSG
,
offset
,
pbuf
-
offset
);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
for
(
auto
oit
=
observers
.
begin
();
oit
!=
observers
.
end
();
++
oit
)
NetServer
::
ReSendToPlayer
(
*
oit
);
break
;
}
case
MSG_ANNOUNCE_RACE
:
{
player
=
BufferIO
::
ReadInt8
(
pbuf
);
pbuf
+=
5
;
...
...
gframe/single_mode.cpp
View file @
df6796ad
...
...
@@ -57,8 +57,13 @@ int SingleMode::SinglePlayThread(void* param) {
mainGame
->
dInfo
.
clientname
[
0
]
=
0
;
mainGame
->
dInfo
.
turn
=
0
;
if
(
!
preload_script
(
pduel
,
fname2
,
slen
))
{
end_duel
(
pduel
);
return
0
;
wchar_t
fname
[
256
];
myswprintf
(
fname
,
L"./single/%ls"
,
open_file_name
);
slen
=
BufferIO
::
EncodeUTF8
(
fname
,
fname2
);
if
(
!
preload_script
(
pduel
,
fname2
,
slen
))
{
end_duel
(
pduel
);
return
0
;
}
}
mainGame
->
gMutex
.
Lock
();
mainGame
->
HideElement
(
mainGame
->
wSinglePlay
);
...
...
@@ -569,6 +574,19 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
DuelClient
::
ClientAnalyze
(
offset
,
pbuf
-
offset
);
break
;
}
case
MSG_ROCK_PAPER_SCISSORS
:
{
player
=
BufferIO
::
ReadInt8
(
pbuf
);
if
(
!
DuelClient
::
ClientAnalyze
(
offset
,
pbuf
-
offset
))
{
mainGame
->
singleSignal
.
Reset
();
mainGame
->
singleSignal
.
Wait
();
}
break
;
}
case
MSG_HAND_RES
:
{
pbuf
+=
1
;
DuelClient
::
ClientAnalyze
(
offset
,
pbuf
-
offset
);
break
;
}
case
MSG_ANNOUNCE_RACE
:
{
player
=
BufferIO
::
ReadInt8
(
pbuf
);
pbuf
+=
5
;
...
...
@@ -632,6 +650,7 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
case
MSG_RELOAD_FIELD
:
{
mainGame
->
gMutex
.
Lock
();
mainGame
->
dField
.
Clear
();
mainGame
->
dInfo
.
duel_rule
=
BufferIO
::
ReadInt8
(
pbuf
);
int
val
=
0
;
for
(
int
p
=
0
;
p
<
2
;
++
p
)
{
mainGame
->
dInfo
.
lp
[
p
]
=
BufferIO
::
ReadInt32
(
pbuf
);
...
...
@@ -694,7 +713,6 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
BufferIO
::
ReadInt8
(
pbuf
);
//chain count, always 0
SinglePlayReload
();
mainGame
->
dField
.
RefreshAllCards
();
mainGame
->
dInfo
.
duel_rule
=
BufferIO
::
ReadInt8
(
pbuf
);
mainGame
->
gMutex
.
Unlock
();
break
;
}
...
...
gframe/tag_duel.cpp
View file @
df6796ad
...
...
@@ -1480,6 +1480,22 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer
::
ReSendToPlayer
(
*
oit
);
break
;
}
case
MSG_ROCK_PAPER_SCISSORS
:
{
player
=
BufferIO
::
ReadInt8
(
pbuf
);
WaitforResponse
(
player
);
NetServer
::
SendBufferToPlayer
(
players
[
player
],
STOC_GAME_MSG
,
offset
,
pbuf
-
offset
);
return
1
;
}
case
MSG_HAND_RES
:
{
pbuf
+=
1
;
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_GAME_MSG
,
offset
,
pbuf
-
offset
);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
NetServer
::
ReSendToPlayer
(
players
[
2
]);
NetServer
::
ReSendToPlayer
(
players
[
3
]);
for
(
auto
oit
=
observers
.
begin
();
oit
!=
observers
.
end
();
++
oit
)
NetServer
::
ReSendToPlayer
(
*
oit
);
break
;
}
case
MSG_ANNOUNCE_RACE
:
{
player
=
BufferIO
::
ReadInt8
(
pbuf
);
pbuf
+=
5
;
...
...
ocgcore
@
c3859e4d
Subproject commit
e5e5b78d9270040e3e377bb54873a0922de7a5ba
Subproject commit
c3859e4d926aca7c77e19d939c4d588aced52889
script
@
e9d8a27f
Subproject commit
6b2388ce000829dfda768af40db69576e3527f12
Subproject commit
e9d8a27ff316dda638bf3cc1a8b71713c234f0f8
strings.conf
View file @
df6796ad
...
...
@@ -116,6 +116,7 @@
!
system
568
请选择要处理效果的卡
!
system
569
请选择[%
ls
]的位置
!
system
570
请选择要变成不能使用的卡片区域
!
system
571
请选择要移动到的位置
!
system
1000
卡组
!
system
1001
手卡
!
system
1002
怪兽区
...
...
@@ -358,6 +359,7 @@
!
system
1371
攻击↑
!
system
1372
守备↑
!
system
1373
名称↓
!
system
1374
连接标记
!
system
1390
等待行动中...
!
system
1391
等待行动中....
!
system
1392
等待行动中.....
...
...
system.conf
View file @
df6796ad
...
...
@@ -23,3 +23,5 @@ hide_hint_button = 1
control_mode
=
0
draw_field_spell
=
1
separate_clear_button
=
1
#auto_search_limit >= 0: Start search automatically when the user enters N chars.
auto_search_limit
= -
1
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