From bfd6f6454df7c64f1f1f96e7801ccfe02a96a320 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Sun, 27 Sep 2020 17:44:28 -0700 Subject: [PATCH 01/20] only support english for now. --- config/services.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/config/services.yaml b/config/services.yaml index f20664afa..d0eaf45a7 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -28,8 +28,6 @@ parameters: zh: 中文 supported_locales: - en - - es -# - de services: # default configuration for services in *this* file From d6815d8bace0855a4ec5d0ff3d8540630506f0ce Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Sun, 27 Sep 2020 17:51:22 -0700 Subject: [PATCH 02/20] customize styles and verbiage. --- assets/css/style.css | 6 ++++++ translations/messages.en.yml | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/assets/css/style.css b/assets/css/style.css index dd3967175..1960db9d1 100755 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -124,6 +124,12 @@ footer { } .navbar-default { font-size: 16px; + background-color: #a6dcee; + border-color: #1d7a99; +} + +.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { + background-color: #34afd8; } div.tags span.tag { diff --git a/translations/messages.en.yml b/translations/messages.en.yml index ba3c8c840..ae86e792e 100644 --- a/translations/messages.en.yml +++ b/translations/messages.en.yml @@ -1,4 +1,4 @@ -slogan: Deckbuilder for A Game of Thrones LCG 2nd Edition +slogan: A ThronesDB instance featuring new and revamped cards by the Design Team. data_load_fail: "Unable to load the data. Click here to reload your page." login_required: You must be logged in for this operation. From 234938ca3663d7fb718b4419e5fcfc8d332f1556 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Mon, 28 Sep 2020 17:03:00 -0700 Subject: [PATCH 03/20] currently only dealing with redesigns, reflect that in the site slogan. --- translations/messages.en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translations/messages.en.yml b/translations/messages.en.yml index ae86e792e..108f153e2 100644 --- a/translations/messages.en.yml +++ b/translations/messages.en.yml @@ -1,4 +1,4 @@ -slogan: A ThronesDB instance featuring new and revamped cards by the Design Team. +slogan: A ThronesDB instance featuring revamped cards by the Design Team. data_load_fail: "Unable to load the data. Click here to reload your page." login_required: You must be logged in for this operation. From 2a43a98f9a0eea5b6d0e12592ca4f58901b9e94b Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Tue, 29 Sep 2020 07:45:39 -0700 Subject: [PATCH 04/20] use redesigned instead of revamped. --- translations/messages.en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translations/messages.en.yml b/translations/messages.en.yml index 108f153e2..9e457010e 100644 --- a/translations/messages.en.yml +++ b/translations/messages.en.yml @@ -1,4 +1,4 @@ -slogan: A ThronesDB instance featuring revamped cards by the Design Team. +slogan: A ThronesDB instance featuring redesigned cards by the Design Team. data_load_fail: "Unable to load the data. Click here to reload your page." login_required: You must be logged in for this operation. From a465330c875ecb535a17535618d1aeeb45083fbd Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Tue, 29 Sep 2020 18:30:40 -0700 Subject: [PATCH 05/20] prevent originals of redesigned agendas from showing in new deck wizard. --- src/Controller/BuilderController.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Controller/BuilderController.php b/src/Controller/BuilderController.php index 9a401687a..6ef627a8d 100755 --- a/src/Controller/BuilderController.php +++ b/src/Controller/BuilderController.php @@ -51,6 +51,11 @@ class BuilderController extends AbstractController '00003', // Treaty (VDS) '00004', // Uniting the Seven Kingdoms (VDS) "00030", // The King's Voice (VHotK) + "10045", // The Wars To Come (SoD) + "11079", // The Free Folk (MoD) + "12045", // Sea of Blood (KotI) + "13079", // Kingdom of Shadows (BtRK) + "13118", // Valyrian Steel (LMHR) ]; /** From 29d5e48760243810e159f1560b4f8fd20ff7d3cc Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Tue, 29 Sep 2020 21:43:17 -0700 Subject: [PATCH 06/20] implements new RLs and BLs --- assets/js/app.deck.js | 158 ++++++++++++++------------ src/Classes/BannedListChecker.php | 113 +++++++++++++++++- src/Classes/RestrictedListChecker.php | 106 +---------------- 3 files changed, 200 insertions(+), 177 deletions(-) diff --git a/assets/js/app.deck.js b/assets/js/app.deck.js index 24ef2c564..228a4e683 100755 --- a/assets/js/app.deck.js +++ b/assets/js/app.deck.js @@ -27,23 +27,37 @@ card_line_label_tpl = _.template('<%= label %>'), layouts = {}, layout_data = {}, - // Restricted/Banned Lists issued by The Conclave (v2.0) + // Restricted/Banned Lists issued by The Playtesting Team (v2.1) joust_restricted_list = [ + ], + joust_pods = [ + ], + joust_banned_list = [ + "01119", // Doran's Game (Core) "02034", // Crown of Gold (TRtW) "02065", // Halder (NMG) "02091", // Raider from Pyke (CoW) "02092", // Iron Mines (CoW) "02102", // Ward (TS) + "03038", // To the Rose Banner! (WotN) + "04001", // The Dragon's Tail (AtSK) + "05010", // Taena Merryweather (LoCR) + "05049", // Littlefinger's Meddling (LoCR) "06004", // All Men Are Fools (AMAF) + "06011", // Drowned Disciple (AMAF) "06038", // Great Hall (GtR) "06039", // "The Dornishman's Wife" (GtR) "06040", // The Annals of Castle Black (GtR) + "06063", // Oldtown Informer (TRW) "06098", // Flea Bottom (OR) + "07018", // Abandoned Stronghold (WotW) + "08019", // The Iron Bank (TAK) "08080", // The King in the North (FotOG) "08082", // I Am No One (TFM) "09001", // Mace Tyrell (HoT) "09037", // Qotho (HoT) "09051", // Trade Routes (HoT) + "10017", // Dorne (SoD) "10045", // The Wars To Come (SoD) "10048", // Forced March (SoD) "10050", // Breaking Ties (SoD) @@ -53,91 +67,32 @@ "11034", // Meereen (TMoW) "11051", // Drowned God Fanatic (SoKL) "11061", // Meera Reed (MoD) + "11071", // Victarion Greyjoy (MoD) + "11076", // A Mission in Essos (MoD) + "11079", // The Free Folk (MoD) + "11081", // Bear Island Scout (IDP) + "11082", // Skagos (IDP) + "11085", // Three-Finger Hobb (IDP) + "11093", // Drogon (IDP) "11114", // Gifts for the Widow (DitD) "12002", // Euron Crow's Eye (KotI) "12029", // Desert Raider (KotI) + "12045", // Sea of Blood (KotI) "12046", // We Take Westeros! (KotI) "12047", // Return to the Fields (KotI) "13044", // Unexpected Guile (PoS) + "13079", // Kingdom of Shadows (BtRK) "13085", // Yoren (TB) "13086", // Bound for the Wall (TB) "13103", // The Queen's Retinue (LMHR) + "13118", // Valyrian Steel (LMHR) "14008", // Selyse Baratheon (FotS) + "15001", // Daenerys Targaryen (DotE) + "15017", // Womb of the World (DotE) "15030", // The Red Keep (DotE) "15033", // Clydas (DotE) "15045", // Bribery (DotE) - "16027", // Aloof and Apart (TTWDFL) - ], - joust_pods = [ - { - name: "P1", - restricted: "13085", // Yoren (TB) - cards: [ - "04026", // Craven (CtA) - "11085", // Three-Finger Hobb (IDP) - ], - }, - { - name: "P2", - restricted: "11051", // Drowned God Fanatic (SoKL) - cards: [ - "06011", // Drowned Disciple (AMAF) - ], - }, - { - name: "P3", - restricted: "11114", // Gifts for the Widow (DitD) - cards: [ - "15001", // Daenerys Targaryen (DotE) - ] - }, - { - name: "P4", - restricted: "09037", // Qotho (HoT) - cards: [ - "15017", // Womb of the World (DotE) - ] - }, - { - name: "P5", - restricted: "09001", // Mace Tyrell (HoT) - cards: [ - "09017", // The Hightower (HoT) - ] - }, - { - name: "P6", - restricted: "12029", // Desert Raider (KotI) - cards: [ - "06011", // Drowned Disciple (AMAF) - ] - }, - { - name: "P7", - restricted: "11021", // Wyman Manderly (TMoW) - cards: [ - "11081", // Bear Island Scout (IDP) - "11082", // Skagos (IDP) - ] - }, - { - name: "P8", - restricted: "06040", // The Annals of Castle Black (GtR) - cards: [ - "06063", // Oldtown Informer (TRW) - "06100", // Wheels Within Wheels (OR) - - ] - }, - ], - joust_banned_list = [ - "03038", // To the Rose Banner! (WotN) - "04001", // The Dragon's Tail (AtSK) - "05010", // Taena Merryweather (LoCR) - "05049", // Littlefinger's Meddling (LoCR) - "11076", // A Mission in Essos (MoD) - "12045", // Sea of Blood (KotI) - "13079", // Kingdom of Shadows (BtRK) + "15050", // At the Palace of Sorrows (DotE) "16001", // Ser Davos Seaworth (TTWDFL) "16002", // Melisandre's Favor (TTWDFL) "16003", // Wintertime Marauders (TTWDFL) @@ -170,6 +125,7 @@ "16034", // Search and Detain (TTWDFL) "16035", // The Art of Seduction (TTWDFL) "16036", // The Gathering Storm (TTWDFL) + "17147", // The Dragon's Tail (R) ], melee_restricted_list = [ "01001", // A Clash of Kings (Core) @@ -205,10 +161,66 @@ "15045", // Bribery (DotE) ], melee_banned_list = [ + "01119", // Doran's Game (Core) + "02034", // Crown of Gold (TRtW) + "02065", // Halder (NMG) + "02091", // Raider from Pyke (CoW) + "02092", // Iron Mines (CoW) + "02102", // Ward (TS) "03038", // To the Rose Banner! (WotN) + "04001", // The Dragon's Tail (AtSK) "05010", // Taena Merryweather (LoCR) "05049", // Littlefinger's Meddling (LoCR) + "06004", // All Men Are Fools (AMAF) + "06011", // Drowned Disciple (AMAF) + "06038", // Great Hall (GtR) + "06039", // "The Dornishman's Wife" (GtR) + "06040", // The Annals of Castle Black (GtR) + "06063", // Oldtown Informer (TRW) + "06098", // Flea Bottom (OR) + "07018", // Abandoned Stronghold (WotW) + "08019", // The Iron Bank (TAK) + "08080", // The King in the North (FotOG) + "08082", // I Am No One (TFM) + "09001", // Mace Tyrell (HoT) + "09037", // Qotho (HoT) + "09051", // Trade Routes (HoT) + "10017", // Dorne (SoD) + "10045", // The Wars To Come (SoD) + "10048", // Forced March (SoD) + "10050", // Breaking Ties (SoD) + "11012", // Nighttime Marauders (TSC) + "11021", // Wyman Manderly (TMoW) + "11033", // Hizdahr zo Loraq (TMoW) + "11034", // Meereen (TMoW) + "11051", // Drowned God Fanatic (SoKL) + "11061", // Meera Reed (MoD) + "11071", // Victarion Greyjoy (MoD) "11076", // A Mission in Essos (MoD) + "11079", // The Free Folk (MoD) + "11081", // Bear Island Scout (IDP) + "11082", // Skagos (IDP) + "11085", // Three-Finger Hobb (IDP) + "11093", // Drogon (IDP) + "11114", // Gifts for the Widow (DitD) + "12002", // Euron Crow's Eye (KotI) + "12029", // Desert Raider (KotI) + "12045", // Sea of Blood (KotI) + "12046", // We Take Westeros! (KotI) + "12047", // Return to the Fields (KotI) + "13044", // Unexpected Guile (PoS) + "13079", // Kingdom of Shadows (BtRK) + "13085", // Yoren (TB) + "13086", // Bound for the Wall (TB) + "13103", // The Queen's Retinue (LMHR) + "13118", // Valyrian Steel (LMHR) + "14008", // Selyse Baratheon (FotS) + "15001", // Daenerys Targaryen (DotE) + "15017", // Womb of the World (DotE) + "15030", // The Red Keep (DotE) + "15033", // Clydas (DotE) + "15045", // Bribery (DotE) + "15050", // At the Palace of Sorrows (DotE) "16001", // Ser Davos Seaworth (TTWDFL) "16002", // Melisandre's Favor (TTWDFL) "16003", // Wintertime Marauders (TTWDFL) diff --git a/src/Classes/BannedListChecker.php b/src/Classes/BannedListChecker.php index 95ca5174d..708857f9f 100644 --- a/src/Classes/BannedListChecker.php +++ b/src/Classes/BannedListChecker.php @@ -4,7 +4,7 @@ /** * Banned List Checker. - * The currently implemented BL were issued by The Conclave (v2.0), effective July 3rd, 2020. + * The currently implemented BL were issued by the Playtesting Team (v2.1), effective Sept 9th, 2020. * * Class BannedList * @package App\Classes @@ -12,13 +12,66 @@ class BannedListChecker { const JOUST_BANNED_CARDS = [ + "01119", // Doran's Game (Core) + "02034", // Crown of Gold (TRtW) + "02065", // Halder (NMG) + "02091", // Raider from Pyke (CoW) + "02092", // Iron Mines (CoW) + "02102", // Ward (TS) "03038", // To the Rose Banner! (WotN) "04001", // The Dragon's Tail (AtSK) "05010", // Taena Merryweather (LoCR) "05049", // Littlefinger's Meddling (LoCR) + "06004", // All Men Are Fools (AMAF) + "06011", // Drowned Disciple (AMAF) + "06038", // Great Hall (GtR) + "06039", // "The Dornishman's Wife" (GtR) + "06040", // The Annals of Castle Black (GtR) + "06063", // Oldtown Informer (TRW) + "06098", // Flea Bottom (OR) + "07018", // Abandoned Stronghold (WotW) + "08019", // The Iron Bank (TAK) + "08080", // The King in the North (FotOG) + "08082", // I Am No One (TFM) + "09001", // Mace Tyrell (HoT) + "09037", // Qotho (HoT) + "09051", // Trade Routes (HoT) + "10017", // Dorne (SoD) + "10045", // The Wars To Come (SoD) + "10048", // Forced March (SoD) + "10050", // Breaking Ties (SoD) + "11012", // Nighttime Marauders (TSC) + "11021", // Wyman Manderly (TMoW) + "11033", // Hizdahr zo Loraq (TMoW) + "11034", // Meereen (TMoW) + "11051", // Drowned God Fanatic (SoKL) + "11061", // Meera Reed (MoD) + "11071", // Victarion Greyjoy (MoD) "11076", // A Mission in Essos (MoD) + "11079", // The Free Folk (MoD) + "11081", // Bear Island Scout (IDP) + "11082", // Skagos (IDP) + "11085", // Three-Finger Hobb (IDP) + "11093", // Drogon (IDP) + "11114", // Gifts for the Widow (DitD) + "12002", // Euron Crow's Eye (KotI) + "12029", // Desert Raider (KotI) "12045", // Sea of Blood (KotI) + "12046", // We Take Westeros! (KotI) + "12047", // Return to the Fields (KotI) + "13044", // Unexpected Guile (PoS) "13079", // Kingdom of Shadows (BtRK) + "13085", // Yoren (TB) + "13086", // Bound for the Wall (TB) + "13103", // The Queen's Retinue (LMHR) + "13118", // Valyrian Steel (LMHR) + "14008", // Selyse Baratheon (FotS) + "15001", // Daenerys Targaryen (DotE) + "15017", // Womb of the World (DotE) + "15030", // The Red Keep (DotE) + "15033", // Clydas (DotE) + "15045", // Bribery (DotE) + "15050", // At the Palace of Sorrows (DotE) "16001", // Ser Davos Seaworth (TTWDFL) "16002", // Melisandre's Favor (TTWDFL) "16003", // Wintertime Marauders (TTWDFL) @@ -51,12 +104,70 @@ class BannedListChecker "16034", // Search and Detain (TTWDFL) "16035", // The Art of Seduction (TTWDFL) "16036", // The Gathering Storm (TTWDFL) + "17147", // The Dragon's Tail (R) ]; const MELEE_BANNED_LIST = [ + "01119", // Doran's Game (Core) + "02034", // Crown of Gold (TRtW) + "02065", // Halder (NMG) + "02091", // Raider from Pyke (CoW) + "02092", // Iron Mines (CoW) + "02102", // Ward (TS) "03038", // To the Rose Banner! (WotN) + "04001", // The Dragon's Tail (AtSK) "05010", // Taena Merryweather (LoCR) "05049", // Littlefinger's Meddling (LoCR) + "06004", // All Men Are Fools (AMAF) + "06011", // Drowned Disciple (AMAF) + "06038", // Great Hall (GtR) + "06039", // "The Dornishman's Wife" (GtR) + "06040", // The Annals of Castle Black (GtR) + "06063", // Oldtown Informer (TRW) + "06098", // Flea Bottom (OR) + "07018", // Abandoned Stronghold (WotW) + "08019", // The Iron Bank (TAK) + "08080", // The King in the North (FotOG) + "08082", // I Am No One (TFM) + "09001", // Mace Tyrell (HoT) + "09037", // Qotho (HoT) + "09051", // Trade Routes (HoT) + "10017", // Dorne (SoD) + "10045", // The Wars To Come (SoD) + "10048", // Forced March (SoD) + "10050", // Breaking Ties (SoD) + "11012", // Nighttime Marauders (TSC) + "11021", // Wyman Manderly (TMoW) + "11033", // Hizdahr zo Loraq (TMoW) + "11034", // Meereen (TMoW) + "11051", // Drowned God Fanatic (SoKL) + "11061", // Meera Reed (MoD) + "11071", // Victarion Greyjoy (MoD) + "11076", // A Mission in Essos (MoD) + "11079", // The Free Folk (MoD) + "11081", // Bear Island Scout (IDP) + "11082", // Skagos (IDP) + "11085", // Three-Finger Hobb (IDP) + "11093", // Drogon (IDP) + "11114", // Gifts for the Widow (DitD) + "12002", // Euron Crow's Eye (KotI) + "12029", // Desert Raider (KotI) + "12045", // Sea of Blood (KotI) + "12046", // We Take Westeros! (KotI) + "12047", // Return to the Fields (KotI) + "13044", // Unexpected Guile (PoS) + "13079", // Kingdom of Shadows (BtRK) + "13085", // Yoren (TB) + "13086", // Bound for the Wall (TB) + "13103", // The Queen's Retinue (LMHR) + "13118", // Valyrian Steel (LMHR) + "14008", // Selyse Baratheon (FotS) + "15001", // Daenerys Targaryen (DotE) + "15017", // Womb of the World (DotE) + "15030", // The Red Keep (DotE) + "15033", // Clydas (DotE) + "15045", // Bribery (DotE) + "15050", // At the Palace of Sorrows (DotE) "11076", // A Mission in Essos (MoD) "16001", // Ser Davos Seaworth (TTWDFL) "16002", // Melisandre's Favor (TTWDFL) diff --git a/src/Classes/RestrictedListChecker.php b/src/Classes/RestrictedListChecker.php index 8715547d2..55e301740 100644 --- a/src/Classes/RestrictedListChecker.php +++ b/src/Classes/RestrictedListChecker.php @@ -4,7 +4,7 @@ /** * Checks if a given list of cards is legal for tournament play in the Joust and Melee formats. - * The currently implemented RLs were issued by The Conclave (v2.0), effective July 3rd, 2020. + * The currently implemented RLs were issued by the Playtesting Team (v2.1), effective Sept 9th, 2020. * @package App\Classes */ class RestrictedListChecker @@ -12,46 +12,7 @@ class RestrictedListChecker /** * @var array */ - const JOUST_RESTRICTED_CARDS = [ - "02034", // Crown of Gold (TRtW) - "02065", // Halder (NMG) - "02091", // Raider from Pyke (CoW) - "02092", // Iron Mines (CoW) - "02102", // Ward (TS) - "06004", // All Men Are Fools (AMAF) - "06038", // Great Hall (GtR) - "06039", // "The Dornishman's Wife" (GtR) - "06040", // The Annals of Castle Black (GtR) - "06098", // Flea Bottom (OR) - "08080", // The King in the North (FotOG) - "08082", // I Am No One (TFM) - "09001", // Mace Tyrell (HoT) - "09037", // Qotho (HoT) - "09051", // Trade Routes (HoT) - "10045", // The Wars To Come (SoD) - "10048", // Forced March (SoD) - "10050", // Breaking Ties (SoD) - "11012", // Nighttime Marauders (TSC) - "11021", // Wyman Manderly (TMoW) - "11033", // Hizdahr zo Loraq (TMoW) - "11034", // Meereen (TMoW) - "11051", // Drowned God Fanatic (SoKL) - "11061", // Meera Reed (MoD) - "11114", // Gifts for the Widow (DitD) - "12002", // Euron Crow's Eye (KotI) - "12029", // Desert Raider (KotI) - "12046", // We Take Westeros! (KotI) - "12047", // Return to the Fields (KotI) - "13044", // Unexpected Guile (PoS) - "13085", // Yoren (TB) - "13086", // Bound for the Wall (TB) - "13103", // The Queen's Retinue (LMHR) - "14008", // Selyse Baratheon (FotS) - "15030", // The Red Keep (DotE) - "15033", // Clydas (DotE) - "15045", // Bribery (DotE) - "16027", // Aloof and Apart (TTWDFL) - ]; + const JOUST_RESTRICTED_CARDS = []; /** * @var array @@ -93,68 +54,7 @@ class RestrictedListChecker /** * @var array */ - const JOUST_PODS = [ - [ - "name" => "P1", - "restricted" => "13085", // Yoren (TB) - "cards" => [ - "04026", // Craven (CtA) - "11085", // Three-Finger Hobb (IDP) - ], - ], - [ - "name" => "P2", - "restricted" => "11051", // Drowned God Fanatic (SoKL) - "cards" => [ - "06011", // Drowned Disciple (AMAF) - ], - ], - [ - "name" => "P3", - "restricted" => "11114", // Gifts for the Widow (DitD) - "cards" => [ - "15001", // Daenerys Targaryen (DotE) - ] - ], - [ - "name" => "P4", - "restricted" => "09037", // Qotho (HoT) - "cards" => [ - "15017", // Womb of the World (DotE) - ] - ], - [ - "name" => "P5", - "restricted" => "09001", // Mace Tyrell (HoT) - "cards" => [ - "09017", // The Hightower (HoT) - ] - ], - [ - "name" => "P6", - "restricted" => "12029", // Desert Raider (KotI) - "cards" => [ - "06011", // Drowned Disciple (AMAF) - ] - ], - [ - "name" => "P7", - "restricted" => "11021", // Wyman Manderly (TMoW) - "cards" => [ - "11081", // Bear Island Scout (IDP) - "11082", // Skagos (IDP) - ] - ], - [ - "name" => "P8", - "restricted" => "06040", // The Annals of Castle Black (GtR) - "cards" => [ - "06063", // Oldtown Informer (TRW) - "06100", // Wheels Within Wheels (OR) - - ] - ], - ]; + const JOUST_PODS = []; /** * @param array $cardCodes From 5a347755d9ef9486a6ec7f1ece02563ce06c68e4 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Wed, 30 Sep 2020 17:25:10 -0700 Subject: [PATCH 07/20] implements deck validation rules for the redesigned KoSH agenda. --- assets/js/app.deck.js | 3 ++- assets/js/ui.deckedit.js | 2 +- src/Services/DeckValidationHelper.php | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/assets/js/app.deck.js b/assets/js/app.deck.js index 228a4e683..b3d795480 100755 --- a/assets/js/app.deck.js +++ b/assets/js/app.deck.js @@ -1496,7 +1496,8 @@ return card.faction_code === deck.get_minor_faction_code(agenda); case '09045': return card.type_code === 'character' && card.traits.indexOf(Translator.trans('card.traits.maester')) !== -1; - case '13079': + case '13079': // Kingdom of Shadows (BtRK) + case '17148': // Kingdom of Shadows (R) return card.type_code === 'character' && card_has_shadow_keyword(card, Translator.trans('card.keywords.shadow')); case '13099': return card.type_code === 'character' && card.traits.indexOf(Translator.trans('card.traits.kingsguard')) !== -1; diff --git a/assets/js/ui.deckedit.js b/assets/js/ui.deckedit.js index 5a9c300e8..d871578f7 100755 --- a/assets/js/ui.deckedit.js +++ b/assets/js/ui.deckedit.js @@ -194,7 +194,7 @@ var i; // special case - for "The Conclave", "Kingdom of Shadows", and "The White Book" pre-select all factions. - if (agendas.length && -1 !== ["09045", "13079", "13099"].indexOf(agendas[0]['code'])) { + if (agendas.length && -1 !== ["09045", "13079", "17148", "13099"].indexOf(agendas[0]['code'])) { faction_codes = app.deck.get_all_faction_codes(); } else { faction_codes = app.deck.get_minor_faction_codes(); diff --git a/src/Services/DeckValidationHelper.php b/src/Services/DeckValidationHelper.php index 5d2e9906e..2feed27ee 100755 --- a/src/Services/DeckValidationHelper.php +++ b/src/Services/DeckValidationHelper.php @@ -182,7 +182,8 @@ protected function isCardAllowedByAgenda(CardInterface $agenda, CardInterface $c return $card->getType()->getCode() === 'character'; } return false; - case '13079': // Kingdom of Shadows + case '13079': // Kingdom of Shadows (BtRK) + case '17148': // Kingdom of Shadows (R) $langKey = $this->translator->trans('card.keywords.shadow'); return $card->getType()->getCode() === 'character' && $card->hasShadowKeyword($langKey); case '13099': // The White Book From c2a739766cfbc722e000124b1164112bc600c50f Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Wed, 30 Sep 2020 17:25:33 -0700 Subject: [PATCH 08/20] implements deck validation rules for the redesigned VS agenda. --- assets/js/app.deck.js | 20 +++++++++++++++++- src/Services/DeckValidationHelper.php | 29 ++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/assets/js/app.deck.js b/assets/js/app.deck.js index b3d795480..4010da549 100755 --- a/assets/js/app.deck.js +++ b/assets/js/app.deck.js @@ -1144,7 +1144,7 @@ } else if (agenda && agenda.code === '10045') { expectedPlotDeckSize = 10; expectedMaxDoublePlot = 2; - } else if (agenda && ['13118', '16028'].indexOf(agenda.code) > -1) { + } else if (agenda && ['13118', '17152', '16028'].indexOf(agenda.code) > -1) { expectedMinCardCount = 75; } else if (agenda && agenda.code === '16030') { expectedMinCardCount = 100; @@ -1241,6 +1241,22 @@ } return true; }; + var validate_redesigned_valyrian_steel = function() { + var i, n; + var names = []; + var attachments = deck.get_cards(null, {type_code: 'attachment'}); + + for (i = 0, n = attachments.length; i < n; i++) { + if (attachments[i].indeck > 1) { + return false; + } + if (-1 !== names.indexOf(attachments[i].name)) { + return false; + } + names.push(attachments[i].name); + } + return true; + }; var validate_dark_wings_dark_words = function() { var i, n; var names = []; @@ -1328,6 +1344,8 @@ return validate_the_white_book(); case '13118': return validate_valyrian_steel(); + case '17152': + return validate_redesigned_valyrian_steel(); case '16028': return validate_dark_wings_dark_words(); } diff --git a/src/Services/DeckValidationHelper.php b/src/Services/DeckValidationHelper.php index 2feed27ee..c2996110d 100755 --- a/src/Services/DeckValidationHelper.php +++ b/src/Services/DeckValidationHelper.php @@ -53,7 +53,8 @@ public function findProblem(CommonDeckInterface $deck) $expectedPlotDeckSize = 10; $expectedMaxDoublePlot = 2; break; - case '13118': // Valyrian Steel + case '13118': // Valyrian Steel (BtRK) + case '17152': // Valyrian Steel (R) case '16028': // Dark Wings, Dark Words $expectedMinCardCount = 75; break; @@ -232,6 +233,8 @@ protected function validateAgenda(SlotCollectionInterface $slots, CardInterface return $this->validateTheWhiteBook($slots); case '13118': return $this->validateValyrianSteel($slots); + case '17152': + return $this->validateRedesignedValyrianSteel($slots); case '16028': return $this->validateDarkWingsDarkWords($slots); default: @@ -426,6 +429,30 @@ protected function validateValyrianSteel(SlotCollectionInterface $slots): bool return true; } + /** + * @param SlotCollectionInterface $slots + * @return bool + */ + protected function validateRedesignedValyrianSteel(SlotCollectionInterface $slots): bool + { + // Your deck cannot include more than 1 copy of each attachment. + $names = []; + + $attachmentsSlots = $slots->getDrawDeck()->filterByType('attachment'); + /* @var SlotInterface $slot */ + foreach ($attachmentsSlots as $slot) { + $name = $slot->getCard()->getName(); + if (in_array($name, $names)) { + return false; + } + if (1 < $slot->getQuantity()) { + return false; + } + $names[] = $name; + } + return true; + } + /** * @param SlotCollectionInterface $slots * @return bool From 1742c71471cd86ee7a6423b29f59dafcac3f02a4 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Wed, 30 Sep 2020 17:28:11 -0700 Subject: [PATCH 09/20] favicon and icons in blue. --- public/favicon.ico | Bin 1406 -> 15086 bytes public/icon-120.png | Bin 7726 -> 3750 bytes public/icon-192.png | Bin 11711 -> 6388 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/favicon.ico b/public/favicon.ico index f9706d60736b70c1b8a6b495e5db787522897517..d17fd0547e8c004b0ee9183bda5715deb7941f9c 100755 GIT binary patch literal 15086 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 literal 11711 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 From bfd959f12003b7e3812b70df43219734bf81a52d Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Thu, 1 Oct 2020 21:54:27 -0700 Subject: [PATCH 10/20] implements redesigned Sea of Blood. --- assets/js/app.deck.js | 6 ++++++ src/Services/DeckValidationHelper.php | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/assets/js/app.deck.js b/assets/js/app.deck.js index 4010da549..5a2e8325c 100755 --- a/assets/js/app.deck.js +++ b/assets/js/app.deck.js @@ -1211,6 +1211,10 @@ deck.validate_agenda = function validate_agenda(agenda) { + var validate_redesigned_sea_of_blood = function() { + var neutralEvents = deck.get_cards(null, { type_code: 'event', faction_code: 'neutral' }); + return !neutralEvents.length; + } var validate_the_white_book = function() { var i, n; var names = []; @@ -1348,6 +1352,8 @@ return validate_redesigned_valyrian_steel(); case '16028': return validate_dark_wings_dark_words(); + case '17149': + return validate_redesigned_sea_of_blood(); } return true; }; diff --git a/src/Services/DeckValidationHelper.php b/src/Services/DeckValidationHelper.php index c2996110d..3c320ce7a 100755 --- a/src/Services/DeckValidationHelper.php +++ b/src/Services/DeckValidationHelper.php @@ -237,11 +237,24 @@ protected function validateAgenda(SlotCollectionInterface $slots, CardInterface return $this->validateRedesignedValyrianSteel($slots); case '16028': return $this->validateDarkWingsDarkWords($slots); + case '17149': + return $this->validateRedesignedSeaOfBlood($slots); default: return true; } } + protected function validateRedesignedSeaOfBlood($slots): bool + { + $eventSlots = $slots->getDrawDeck()->filterByType('event'); + foreach ($eventSlots as $slot) { + if ($slot->getCard()->getFaction()->getCode() === 'neutral') { + return false; + } + } + return true; + } + /** * @param SlotCollectionInterface $slots * @param CardInterface $agenda From adbb7b8ff82471c7479bf8d5828bb3e0049d4cda Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Thu, 1 Oct 2020 23:16:41 -0700 Subject: [PATCH 11/20] implements redesigned The Free Folk --- assets/js/app.deck.js | 25 +++++++++++++++++--- assets/js/ui.deckedit.js | 4 ++-- src/Services/DeckValidationHelper.php | 34 +++++++++++++++++++++++++++ translations/messages.de.yml | 1 + translations/messages.en.yml | 1 + translations/messages.es.yml | 1 + 6 files changed, 61 insertions(+), 5 deletions(-) diff --git a/assets/js/app.deck.js b/assets/js/app.deck.js index 5a2e8325c..a39fed33e 100755 --- a/assets/js/app.deck.js +++ b/assets/js/app.deck.js @@ -1211,6 +1211,17 @@ deck.validate_agenda = function validate_agenda(agenda) { + var validate_redesigned_the_free_folk = function() { + var re = new RegExp(Translator.trans('card.traits.wildling') + '\\.'); + var i, n; + var nonNeutralCards = deck.get_cards(null, {faction_code: { $ne: 'neutral' }}); + for (i = 0, n = nonNeutralCards.length; i < n; i++) { + if (nonNeutralCards[i].type_code !== 'character' || ! re.test(nonNeutralCards[i].traits)) { + return false; + } + } + return true; + } var validate_redesigned_sea_of_blood = function() { var neutralEvents = deck.get_cards(null, { type_code: 'event', faction_code: 'neutral' }); return !neutralEvents.length; @@ -1344,6 +1355,8 @@ return false; } break; + case '17150': + return validate_redesigned_the_free_folk(); case '13099': return validate_the_white_book(); case '13118': @@ -1479,12 +1492,14 @@ */ deck.can_include_card = function can_include_card(card) { + var agendas = deck.get_agendas(); + var agendaCodes = agendas.map(function(agenda) { return agenda.code }); // neutral card => yes if(card.faction_code === 'neutral') return true; - // in-house card => yes - if(card.faction_code === faction_code) + // in-house card => yes, unless agenda is redesigned "Free Folk". + if(card.faction_code === faction_code && (-1 === agendaCodes.indexOf('17150'))) return true; // out-of-house and loyal => no @@ -1492,7 +1507,7 @@ return false; // agenda => yes - var agendas = deck.get_agendas(); + for(var i = 0; i < agendas.length; i++) { if(deck.card_allowed_by_agenda(agendas[i], card)) { return true; @@ -1525,6 +1540,10 @@ return card.type_code === 'character' && card_has_shadow_keyword(card, Translator.trans('card.keywords.shadow')); case '13099': return card.type_code === 'character' && card.traits.indexOf(Translator.trans('card.traits.kingsguard')) !== -1; + case '17150': + return card.faction_code === 'neutral' || + (card.type_code === 'character' && card.traits.indexOf(Translator.trans('card.traits.wildling')) !== -1); + } }; })(app.deck = {}, jQuery); diff --git a/assets/js/ui.deckedit.js b/assets/js/ui.deckedit.js index d871578f7..cb97a4fdb 100755 --- a/assets/js/ui.deckedit.js +++ b/assets/js/ui.deckedit.js @@ -193,8 +193,8 @@ var faction_codes = []; var i; - // special case - for "The Conclave", "Kingdom of Shadows", and "The White Book" pre-select all factions. - if (agendas.length && -1 !== ["09045", "13079", "17148", "13099"].indexOf(agendas[0]['code'])) { + // special case - for "The Conclave", "Kingdom of Shadows", "The Free Folk", and "The White Book" pre-select all factions. + if (agendas.length && -1 !== ["09045", "13079", "17148", "13099", "17150"].indexOf(agendas[0]['code'])) { faction_codes = app.deck.get_all_faction_codes(); } else { faction_codes = app.deck.get_minor_faction_codes(); diff --git a/src/Services/DeckValidationHelper.php b/src/Services/DeckValidationHelper.php index 3c320ce7a..4213b8d15 100755 --- a/src/Services/DeckValidationHelper.php +++ b/src/Services/DeckValidationHelper.php @@ -193,6 +193,12 @@ protected function isCardAllowedByAgenda(CardInterface $agenda, CardInterface $c return $card->getType()->getCode() === 'character'; } return false; + case '17150': // The Free Folk (R) + $trait = $this->translator->trans('card.traits.wildling'); + if (preg_match("/$trait\\./", $card->getTraits())) { + return $card->getType()->getCode() === 'character'; + } + return false; } return false; } @@ -239,6 +245,8 @@ protected function validateAgenda(SlotCollectionInterface $slots, CardInterface return $this->validateDarkWingsDarkWords($slots); case '17149': return $this->validateRedesignedSeaOfBlood($slots); + case '17150': + return $this->validateRedesignedFreeFolk($slots); default: return true; } @@ -413,6 +421,32 @@ protected function validateFreeFolk(SlotCollectionInterface $slots): bool return true; } + /** + * @param SlotCollectionInterface $slots + * @return bool + */ + protected function validateRedesignedFreeFolk(SlotCollectionInterface $slots): bool + { + foreach ($slots->getPlotDeck()->getSlots() as $slot) { + /* @var CardInterface $card */ + $card = $slot->getCard(); + if ($card->getFaction()->getCode() !== 'neutral') { + return false; + } + } + + foreach ($slots->getDrawDeck()->getSlots() as $slot) { + $trait = $this->translator->trans('card.traits.wildling'); + $card = $slot->getCard(); + if ($card->getFaction()->getCode() !== 'neutral' + && ! preg_match("/$trait\\./", $card->getTraits())) { + return false; + } + } + + return true; + } + /** * @param SlotCollectionInterface $slots * @return bool diff --git a/translations/messages.de.yml b/translations/messages.de.yml index e94c5ac85..088d04f3d 100644 --- a/translations/messages.de.yml +++ b/translations/messages.de.yml @@ -399,6 +399,7 @@ card: banner: Banner maester: Maester kingsguard: Königsgarde + wildling: Wildling reviews: title: Karten-Rezensionen none: Noch keine Rezensionen dieser Karte. diff --git a/translations/messages.en.yml b/translations/messages.en.yml index 9e457010e..dbc93cfec 100644 --- a/translations/messages.en.yml +++ b/translations/messages.en.yml @@ -399,6 +399,7 @@ card: banner: Banner maester: Maester kingsguard: Kingsguard + wildling: Wildling reviews: title: Reviews none: No review yet for this card. diff --git a/translations/messages.es.yml b/translations/messages.es.yml index faedf3eca..3d3219f5a 100644 --- a/translations/messages.es.yml +++ b/translations/messages.es.yml @@ -398,6 +398,7 @@ card: banner: Estandarte maester: Maestre kingsguard: Guardia Real + wildling: Salvaje reviews: title: Reseñas none: Aún no hay reseñas para esta carta. From e083e6f8c1e8c28511d6dde4f64cc033d8fcfded Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Thu, 1 Oct 2020 23:41:58 -0700 Subject: [PATCH 12/20] implements redesigned The Wars To Come. --- assets/js/app.deck.js | 2 +- src/Services/DeckValidationHelper.php | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/assets/js/app.deck.js b/assets/js/app.deck.js index a39fed33e..8cf330a3f 100755 --- a/assets/js/app.deck.js +++ b/assets/js/app.deck.js @@ -1141,7 +1141,7 @@ agendas.forEach(function (agenda) { if (agenda && agenda.code === '05045') { expectedPlotDeckSize = 12; - } else if (agenda && agenda.code === '10045') { + } else if (agenda && ['10045', '17151'].indexOf(agenda.code) > -1) { expectedPlotDeckSize = 10; expectedMaxDoublePlot = 2; } else if (agenda && ['13118', '17152', '16028'].indexOf(agenda.code) > -1) { diff --git a/src/Services/DeckValidationHelper.php b/src/Services/DeckValidationHelper.php index 4213b8d15..300bf8b78 100755 --- a/src/Services/DeckValidationHelper.php +++ b/src/Services/DeckValidationHelper.php @@ -46,10 +46,11 @@ public function findProblem(CommonDeckInterface $deck) foreach ($slots->getAgendas() as $agenda) { $code = $agenda->getCard()->getCode(); switch ($code) { - case '05045': // The Wars To Come + case '05045': // "The Rains of Castamere" $expectedPlotDeckSize = 12; break; - case '10045': // "The Rains of Castamere" + case '10045': // The Wars To Come (SoD) + case '17151': // The Wars To Come (R) $expectedPlotDeckSize = 10; $expectedMaxDoublePlot = 2; break; From e186b23a24ff713eece17def511efabf25d7de22 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Thu, 1 Oct 2020 23:48:21 -0700 Subject: [PATCH 13/20] corrects Melee RL. --- assets/js/app.deck.js | 10 +--------- src/Classes/RestrictedListChecker.php | 10 +--------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/assets/js/app.deck.js b/assets/js/app.deck.js index 8cf330a3f..96ae1bd7e 100755 --- a/assets/js/app.deck.js +++ b/assets/js/app.deck.js @@ -132,7 +132,6 @@ "01013", // Heads on Spikes (Core) "01043", // Superior Claim (Core) "01078", // Great Kraken (Core) - "01119", // Doran's Game (Core) "01146", // Robb Stark (Core) "01162", // Khal Drogo (Core) "02012", // Rise of the Kraken (TtB) @@ -142,23 +141,16 @@ "04003", // Riverrun (AtSK) "04118", // Relentless Assault (TC) "05001", // Cersei Lannister (LoCR) - "06004", // All Men Are Fools (AMAF) - "06011", // Drowned Disciple (AMAF) - "06039", // "The Dornishman's Wife" (GtR) - "06040", // The Annals of Castle Black (GtR) - "06098", // Flea Bottom (OR) "07036", // Plaza of Pride (WotW) "08013", // Nagga's Ribs (TAK) "08014", // Daario Naharis (TAK) - "08082", // I Am No One (TFM) "08098", // "The Song of the Seven" (TFM) "08120", // You Win Or You Die (SAT) - "09001", // Mace Tyrell (HoT) "09028", // Corpse Lake (HoT) "11039", // Trading With Qohor (TMoW) "11054", // Queensguard (SoKL) "13107", // Robert Baratheon (LMHR) - "15045", // Bribery (DotE) + "17114", // Doran's Game (R) ], melee_banned_list = [ "01119", // Doran's Game (Core) diff --git a/src/Classes/RestrictedListChecker.php b/src/Classes/RestrictedListChecker.php index 55e301740..7955da1af 100644 --- a/src/Classes/RestrictedListChecker.php +++ b/src/Classes/RestrictedListChecker.php @@ -22,7 +22,6 @@ class RestrictedListChecker "01013", // Heads on Spikes (Core) "01043", // Superior Claim (Core) "01078", // Great Kraken (Core) - "01119", // Doran's Game (Core) "01146", // Robb Stark (Core) "01162", // Khal Drogo (Core) "02012", // Rise of the Kraken (TtB) @@ -32,23 +31,16 @@ class RestrictedListChecker "04003", // Riverrun (AtSK) "04118", // Relentless Assault (TC) "05001", // Cersei Lannister (LoCR) - "06004", // All Men Are Fools (AMAF) - "06011", // Drowned Disciple (AMAF) - "06039", // "The Dornishman's Wife" (GtR) - "06040", // The Annals of Castle Black (GtR) - "06098", // Flea Bottom (OR) "07036", // Plaza of Pride (WotW) "08013", // Nagga's Ribs (TAK) "08014", // Daario Naharis (TAK) - "08082", // I Am No One (TFM) "08098", // "The Song of the Seven" (TFM) "08120", // You Win Or You Die (SAT) - "09001", // Mace Tyrell (HoT) "09028", // Corpse Lake (HoT) "11039", // Trading With Qohor (TMoW) "11054", // Queensguard (SoKL) "13107", // Robert Baratheon (LMHR) - "15045", // Bribery (DotE) + "17114", // Doran's Game (R) ]; /** From 52028689de21319d3562c8e8496759810987765c Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Fri, 2 Oct 2020 21:12:34 -0700 Subject: [PATCH 14/20] updates RLs and BLs in FAQ. --- templates/Default/faq.en.html.twig | 314 +++++++++++------------------ 1 file changed, 123 insertions(+), 191 deletions(-) diff --git a/templates/Default/faq.en.html.twig b/templates/Default/faq.en.html.twig index 28b514acf..8b2eeee9f 100644 --- a/templates/Default/faq.en.html.twig +++ b/templates/Default/faq.en.html.twig @@ -15,7 +15,7 @@

Notes, Errata, and Frequently Asked Questions

-

The Conclave (Version 2.0), effective 07/03/2020 (link).

+

Design Team (Version 2.1), effective 10/03/2020.

This document contains card clarification, errata, rule clarifications, frequently asked questions, and quick reference material for A Game of Thrones: The Card Game. The most recent version of this document is @@ -30,7 +30,7 @@

- New Content (Conclave v2.0): + New Content: Joust Restricted List, Joust Banned List, Melee Restricted List, @@ -537,178 +537,31 @@

Joust Restricted List

- -

A player may select one card from the restricted list for any given deck, and cannot then include any other - restricted cards in the same deck. A player may run as many copies of his or her chosen restricted card in a - deck as the regular game rules (or card text) allow.

- -

Some restricted cards are so powerful that their inclusion in a deck comes with additional - deckbuilding restrictions.
- If a player selects one of these cards as their restricted card, they may not include any of the cards - listed with immediately below them.

-

- For example:
- The Hightower - (House of Thorns, 17) is not restricted normally, but if - Mace Tyrell - (House of Thorns, 1) is your chosen restricted card, you cannot include - The Hightower - (House of Thorns, 17) in your deck.

-

This restriction would be displayed as following:

-
- Mace Tyrell (House of Thorns, 1)
- -
-
-
Neutral:
- The Annals of Castle Black (Guarding the - Realm, 40)
- - "The Dornishman's Wife" (Guarding the Realm, 39)
- Flea Bottom (Oberyn's Revenge, 98)
- The Wars To Come (Sand of Dorne, 45)
- Breaking Ties (Sands of Dorne, 50)
- Trade Routes (House of Thorns, 51)
- Great Hall (Guarding the Realm, 38)
- Forced March (Sands of Dorne, 48)
- Bribery (Dragons of the East, 45)
- Return to the Fields (Kings of the Isles, 47)
- The King in the North (Favor of the Old Gods, 80)
- Aloof and Apart (The Things We Do For Love, 27) -
-
-
- Baratheon:
- Selyse Baratheon (Fury of the Storm, 8) -
-
-
- Greyjoy:
- Raider from Pyke (Calm Over Westeros, 91)
- Iron Mines (Calm Over Westeros, 92)
- Drowned God Fanatic (Streets of King's Landing, 51)
- - Euron Crow’s Eye (Kings of the Isles, 2)
- We Take Westeros! (Kings of the Isles, 46)
- Nighttime Marauders (The Shadow City, 12) -
-
-
- Lannister:
- The Red Keep (Dragons of the East, 30) -
-
-
- Martell:
- Desert Raider (Kings of the Isles, 29) - -
-
-
- Night's Watch
- Yoren (The Blackwater, 85)
- - Bound for the Wall (The Blackwater, 86)
- Clydas (Dragons of the East, 33)
- Halder (No Middle Ground, 65) -
-
-
- Stark:
- Wyman Manderly (The March on Winterfell, 21)
- - Ward (True Steel, 102)
- Meera Reed (Music of Dragons, 61)
- I Am No One (The Faith Militant, 82)
-
-
-
- Tyrell:
- All Men Are Fools (All Men Are Fools, 4)
- Mace Tyrell (House of Thorns, 1)
- - The Queen's Retinue (Long May He Reign, 103)
- Unexpected Guile (Pit of Snakes, 44) -
-
-
- Targaryen:
- Hizdahr zo Loraq (The March on Winterfell, 33)
- Meereen (The March on Winterfell, 34)
- Gifts for the Widow (Dragons of the East, 14)
- - Qotho (House of Thorns, 37)
- - Crown of Gold (The Road to Winterfell, 34) -
+

The are no restricted cards in Joust.

Joust Banned List

-

The following cards are not legal for competitive play in Joust.

-
Neutral:
The Dragon's Tail (Across the Seven Kingdoms, 1)
Littlefinger's Meddling (Lions of Casterly Rock, 49)
+ Great Hall (Guarding the Realm, 38)
+ "The Dornishman's Wife" (Guarding the Realm, 39)
+ The Annals of Castle Black (Guarding the Realm, 40)
+ Flea Bottom (Oberyn's Revenge, 98)
+ The Iron Bank (The Archmaester's Key, 19)
+ The King in the North (Favor of the Old Gods, 80)
+ Trade Routes (House of Thorns, 51)
+ The Wars To Come (Sands of Dorne, 45)
+ Forced March (Sands of Dorne, 48)
+ Breaking Ties (Sands of Dorne, 50)
+ The Free Folk (Music of Dragons, 79)
Sea of Blood (Kings of the Isles, 45)
+ Return to the Fields (Kings of the Isles, 47)
Kingdom of Shadows (Beneath the Red Keep, 79)
+ Valyrian Steel (Long May He Reign, 118)
+ Bribery (Dragons of the East, 45)
+ At the Palace of Sorrows (Dragons of the East, 50)
Littlefinger (The Things We Do For Love, 17)
Vale Refugee (The Things We Do For Love, 18)
High Ground (The Things We Do For Love, 19)
@@ -725,16 +578,26 @@ Search and Detain (The Things We Do For Love, 34)
The Art of Seduction (The Things We Do For Love, 35)
The Gathering Storm (The Things We Do For Love, 36)
+ The Dragon's Tail (Redesigns, 47)

Baratheon:
+ Selyse Baratheon (Fury of the Storm, 8)
Ser Davos Seaworth (The Things We Do For Love, 1)
Melisandre's Favor (The Things We Do For Love, 2)

Greyjoy:
+ Raider from Pyke (Calm over Westeros, 91)
+ Iron Mines (Calm over Westeros, 92)
+ Drowned Disciple (All Men Are Fools, 11)
+ Nighttime Marauders (The Shadow City, 12)
+ Drowned God Fanatic (Streets of King's Landing, 51)
+ Victarion Greyjoy (Music of Dragons, 71)
+ Euron Crow's Eye (Kings of the Isles, 2)
+ We Take Westeros! (Kings of the Isles, 46)
Wintertime Marauders (The Things We Do For Love, 3)
Conquer (The Things We Do For Love, 4)
@@ -742,25 +605,41 @@
Lannister:
Taena Merryweather (Lions of Casterly Rock, 10)
+ The Red Keep (Dragons of the East, 30)
Spider's Whisperer (The Things We Do For Love, 5)
Wheels Within Wheels (The Things We Do For Love, 6)

Martell:
+ Doran's Game (Core Set, 119)
+ Dorne (Sands of Dorne, 17)
A Mission in Essos (Music of Dragons, 76)
+ Desert Raider (Kings of the Isles, 29)
Prince's Loyalist (The Things We Do For Love, 7)
You Murdered Her Children (The Things We Do For Love, 8)

Night's Watch
+ Halder (No Middle Ground, 65)
+ Abandoned Stronghold (Watchers on the Wall, 18)
+ Three-Finger Hobb (In Daznak's Pit, 85)
+ Yoren (The Blackwater, 85)
+ Bound for the Wall (The Blackwater, 86)
+ Clydas (Dragons of the East, 33)
Samwell Tarly (The Things We Do For Love, 9)
Old Bear Mormont (The Things We Do For Love, 10)

Stark:
+ Ward (True Steel, 102)
+ I Am No One (The Faith Militant, 82)
+ Wyman Manderly (The March on Winterfell, 21)
+ Meera Reed (Music of Dragons, 61)
+ Bear Island Scout (In Daznak's Pit, 81)
+ Skagos (In Daznak's Pit, 82)
Catelyn Stark (The Things We Do For Love, 11)
Snow Castle (The Things We Do For Love, 12)
@@ -768,22 +647,33 @@
Tyrell:
To the Rose Banner! (Wolves of the North, 38)
+ All Men Are Fools (All Men Are Fools, 4)
+ Oldtown Informer (The Red Wedding, 63)
+ Mace Tyrell (House of Thorns, 1)
+ Unexpected Guile (Pit of Snakes, 44)
+ The Queen's Retinue (Long May He Reign, 103)
The Queen of Thorns (The Things We Do For Love, 15)
Olenna's Study (The Things We Do For Love, 16)

Targaryen:
+ Crown of Gold (The Road to Winterfell, 34)
+ Qotho (House of Thorns, 37)
+ Hizdahr zo Loraq (The March on Winterfell, 33)
+ Meereen (The March on Winterfell, 34)
+ Drogon (In Daznak's Pit, 93)
+ Gifts for the Widow (Daggers in the Dark, 114)
+ Daenerys Targaryen (Dragons of the East, 1)
+ Womb of the World (Dragons of the East, 17)
Mad King Aerys (The Things We Do For Love, 13)
The Hatchlings' Feast (The Things We Do For Love, 14)

Melee Restricted List

-

A player may select one card from the restricted list for any given deck, and cannot then include any other restricted cards in the same deck. A player may run as many copies of his or her chosen restricted card in a deck as the regular game rules (or card text) allow.

-
Neutral:
A Clash of Kings (Core, 1)
Heads on Spikes (Core, 13)
@@ -791,17 +681,11 @@ The Lord of the Crossing (The King's Peace, 60)
Relentless Assault (Tyrion's Chain, 118)
- "The Dornishman's Wife" (Guarding the Realm, - 39)
- Flea Bottom (Oberyn's Revenge, 98)
"The Song of the Seven" (The Faith Militant, 98)
- The Annals of Castle Black (Guarding the Realm, 40) -
You Win or You Die (Someone Always Tells, 120)
- Trading With Qohor (The March on Winterfell, 39)
- Bribery (Dragons of the East, 45) + Trading With Qohor (The March on Winterfell, 39)

Baratheon:
@@ -812,10 +696,8 @@ Great Kraken (Core, 78)
Rise of the Kraken (Taking the Black, 12)
- Nagga's Ribs (The Archmaester's Key, 13)
+ Nagga's Ribs (The Archmaester's Key, 13)
Corpse Lake (House of Thorns, 28) -
- Drowned Disciple (All Men Are Fools, 11)

Lannister:
@@ -824,41 +706,52 @@

Martell:
- Doran's Game (Core, 119) + Doran's Game (Redesigns, 14)

Stark:
- Robb Stark (Core Set, 146)
+ Robb Stark (Core Set, 146)
Eddard Stark (Wolves of the North, 3)
- Riverrun (Across the Seven Kingdoms, 3)
- I Am No One (The Faith Militant, 82) + Riverrun (Across the Seven Kingdoms, 3)

Targaryen:
+ Khal Drogo (Core, 162)
Plaza of Pride (Watchers on the Wall, 36)
- Khal Drogo (Core, 162) -
- Daario Naharis (The Archmaester's Key, 14)
+ Daario Naharis (The Archmaester's Key, 14)
Queensguard (Streets of King’s Landing, 54)

Tyrell:
Lady Sansa's Rose (The Road to Winterfell, - 24)
- All Men Are Fools (All Men Are Fools, 4) -
- Mace Tyrell (House of Thorns, 1) + 24)

Melee Banned List

-

The following cards are not legal for competitive play in Melee.

-
Neutral:
+ The Dragon's Tail (Across the Seven Kingdoms, 1)
Littlefinger's Meddling (Lions of Casterly Rock, 49)
+ Great Hall (Guarding the Realm, 38)
+ "The Dornishman's Wife" (Guarding the Realm, 39)
+ The Annals of Castle Black (Guarding the Realm, 40)
+ Flea Bottom (Oberyn's Revenge, 98)
+ The Iron Bank (The Archmaester's Key, 19)
+ The King in the North (Favor of the Old Gods, 80)
+ Trade Routes (House of Thorns, 51)
+ The Wars To Come (Sands of Dorne, 45)
+ Forced March (Sands of Dorne, 48)
+ Breaking Ties (Sands of Dorne, 50)
+ The Free Folk (Music of Dragons, 79)
+ Sea of Blood (Kings of the Isles, 45)
+ Return to the Fields (Kings of the Isles, 47)
+ Kingdom of Shadows (Beneath the Red Keep, 79)
+ Valyrian Steel (Long May He Reign, 118)
+ Bribery (Dragons of the East, 45)
+ At the Palace of Sorrows (Dragons of the East, 50)
Littlefinger (The Things We Do For Love, 17)
Vale Refugee (The Things We Do For Love, 18)
High Ground (The Things We Do For Love, 19)
@@ -879,12 +772,21 @@
Baratheon:
+ Selyse Baratheon (Fury of the Storm, 8)
Ser Davos Seaworth (The Things We Do For Love, 1)
Melisandre's Favor (The Things We Do For Love, 2)

Greyjoy:
+ Raider from Pyke (Calm over Westeros, 91)
+ Iron Mines (Calm over Westeros, 92)
+ Drowned Disciple (All Men Are Fools, 11)
+ Nighttime Marauders (The Shadow City, 12)
+ Drowned God Fanatic (Streets of King's Landing, 51)
+ Victarion Greyjoy (Music of Dragons, 71)
+ Euron Crow's Eye (Kings of the Isles, 2)
+ We Take Westeros! (Kings of the Isles, 46)
Wintertime Marauders (The Things We Do For Love, 3)
Conquer (The Things We Do For Love, 4)
@@ -892,25 +794,41 @@
Lannister:
Taena Merryweather (Lions of Casterly Rock, 10)
+ The Red Keep (Dragons of the East, 30)
Spider's Whisperer (The Things We Do For Love, 5)
Wheels Within Wheels (The Things We Do For Love, 6)

Martell:
+ Doran's Game (Core Set, 119)
+ Dorne (Sands of Dorne, 17)
A Mission in Essos (Music of Dragons, 76)
+ Desert Raider (Kings of the Isles, 29)
Prince's Loyalist (The Things We Do For Love, 7)
You Murdered Her Children (The Things We Do For Love, 8)

Night's Watch
+ Halder (No Middle Ground, 65)
+ Abandoned Stronghold (Watchers on the Wall, 18)
+ Three-Finger Hobb (In Daznak's Pit, 85)
+ Yoren (The Blackwater, 85)
+ Bound for the Wall (The Blackwater, 86)
+ Clydas (Dragons of the East, 33)
Samwell Tarly (The Things We Do For Love, 9)
Old Bear Mormont (The Things We Do For Love, 10)

Stark:
+ Ward (True Steel, 102)
+ I Am No One (The Faith Militant, 82)
+ Wyman Manderly (The March on Winterfell, 21)
+ Meera Reed (Music of Dragons, 61)
+ Bear Island Scout (In Daznak's Pit, 81)
+ Skagos (In Daznak's Pit, 82)
Catelyn Stark (The Things We Do For Love, 11)
Snow Castle (The Things We Do For Love, 12)
@@ -918,16 +836,31 @@
Tyrell:
To the Rose Banner! (Wolves of the North, 38)
+ All Men Are Fools (All Men Are Fools, 4)
+ Oldtown Informer (The Red Wedding, 63)
+ Mace Tyrell (House of Thorns, 1)
+ Unexpected Guile (Pit of Snakes, 44)
+ The Queen's Retinue (Long May He Reign, 103)
The Queen of Thorns (The Things We Do For Love, 15)
Olenna's Study (The Things We Do For Love, 16)

Targaryen:
+ Crown of Gold (The Road to Winterfell, 34)
+ Qotho (House of Thorns, 37)
+ Hizdahr zo Loraq (The March on Winterfell, 33)
+ Meereen (The March on Winterfell, 34)
+ Drogon (In Daznak's Pit, 93)
+ Gifts for the Widow (Daggers in the Dark, 114)
+ Daenerys Targaryen (Dragons of the East, 1)
+ Womb of the World (Dragons of the East, 17)
Mad King Aerys (The Things We Do For Love, 13)
The Hatchlings' Feast (The Things We Do For Love, 14)
+ +

Frequently Asked Questions

This section provides answers to a number of common questions that are asked about the game. The entries are @@ -1330,5 +1263,4 @@

The above can be generalized and used when referring to the end of other periods, such as the end of a challenge or the end of a round.

-
From b572970cb20c5f178fefa8870828aa7cc6b9a4b0 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Mon, 5 Oct 2020 17:15:22 -0700 Subject: [PATCH 15/20] prevent bots from crawling the site. --- public/robots.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/robots.txt b/public/robots.txt index 4665fcae3..bc8af6bb8 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -2,4 +2,4 @@ # www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449 User-agent: * -Disallow: +Disallow: / From ed817d235f4c9c2b5e95a84261c69ec1fda3fceb Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Mon, 5 Oct 2020 18:23:22 -0700 Subject: [PATCH 16/20] suppress neutral events in deck builder for SoB (R) --- assets/js/app.deck.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/assets/js/app.deck.js b/assets/js/app.deck.js index 96ae1bd7e..6a4657b32 100755 --- a/assets/js/app.deck.js +++ b/assets/js/app.deck.js @@ -1486,9 +1486,10 @@ { var agendas = deck.get_agendas(); var agendaCodes = agendas.map(function(agenda) { return agenda.code }); - // neutral card => yes - if(card.faction_code === 'neutral') - return true; + // neutral card => yes, unless the agenda is redesigned "Sea of Blood" and the card is an event. + if(card.faction_code === 'neutral') { + return !(-1 !== agendaCodes.indexOf('17149') && card.type_code === 'event'); + } // in-house card => yes, unless agenda is redesigned "Free Folk". if(card.faction_code === faction_code && (-1 === agendaCodes.indexOf('17150'))) From b754c54918db3c5491b2b680a6553ec1ab5eb5b7 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Mon, 5 Oct 2020 18:54:49 -0700 Subject: [PATCH 17/20] correctly process agendas with pack name or code on import. --- assets/js/ui.deckimport.js | 3 +++ src/Services/DeckImportService.php | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/assets/js/ui.deckimport.js b/assets/js/ui.deckimport.js index ff06e5605..6a2f4b8c8 100755 --- a/assets/js/ui.deckimport.js +++ b/assets/js/ui.deckimport.js @@ -19,6 +19,9 @@ } else if(name.match(/^(\d+)x? (.*)/)) { qty = parseInt(RegExp.$1, 10); name = RegExp.$2.trim(); + } else if (name.match(/^([^(]+) \(([^)]+)\)/)) { + name = RegExp.$1.trim(); + packName = RegExp.$2.trim(); } if (packName) { card = app.data.cards.findOne({name: name, pack_name: packName}); diff --git a/src/Services/DeckImportService.php b/src/Services/DeckImportService.php index 658ff9826..1bf982244 100644 --- a/src/Services/DeckImportService.php +++ b/src/Services/DeckImportService.php @@ -65,10 +65,14 @@ public function parseTextImport($text) } elseif (preg_match('/^\s*#\d{3}\s(\d)x?([\pLl\pLu\pN\-\.\'\!\: ]+)/u', $line, $matches)) { $quantity = intval($matches[1]); $name = trim($matches[2]); - } elseif (preg_match('/^([^\(]+).*x(\d)/', $line, $matches)) { + } elseif (preg_match('/^([^\(]+).*x(\d)/u', $line, $matches)) { $quantity = intval($matches[2]); $name = trim($matches[1]); - } elseif (preg_match('/^([^\(]+)/', $line, $matches)) { + } elseif (preg_match('/^([^\(]+) \(([^)]+)/u', $line, $matches)) { + $quantity = 1; + $name = trim($matches[1]); + $packNameOrCode = trim($matches[2]); + } elseif (preg_match('/^([^\(]+)/u', $line, $matches)) { $quantity = 1; $name = trim($matches[1]); } else { From 6a0a51a22f0bcbb2d6c9c2fc3b18b25c88e0cf31 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Sun, 27 Dec 2020 15:51:34 -0800 Subject: [PATCH 18/20] corrects title of RL. --- assets/js/app.data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/app.data.js b/assets/js/app.data.js index adb663d3a..4ca356053 100755 --- a/assets/js/app.data.js +++ b/assets/js/app.data.js @@ -236,7 +236,7 @@ "16036", // The Gathering Storm (TTWDFL) ]; - data.restricted_list_title = 'The Conclave FAQ v2.0'; + data.restricted_list_title = 'Redesigns FAQ 2.1'; function onCollectionUpdate(updated) { database_changed = true; From 593f25de70f432d0a0629b4178982554edc3bc0f Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Mon, 11 Jan 2021 21:42:53 -0800 Subject: [PATCH 19/20] rm agendas from blacklist again, we're handling this on the frontend now. --- src/Controller/BuilderController.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Controller/BuilderController.php b/src/Controller/BuilderController.php index 00bfcea97..701487ef5 100755 --- a/src/Controller/BuilderController.php +++ b/src/Controller/BuilderController.php @@ -53,11 +53,6 @@ class BuilderController extends AbstractController '00003', // Treaty (VDS) '00004', // Uniting the Seven Kingdoms (VDS) "00030", // The King's Voice (VHotK) - "10045", // The Wars To Come (SoD) - "11079", // The Free Folk (MoD) - "12045", // Sea of Blood (KotI) - "13079", // Kingdom of Shadows (BtRK) - "13118", // Valyrian Steel (LMHR) ]; /** From 22129134dc78799c2ddc05c5d3089d3195f9be24 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Tue, 12 Jan 2021 21:19:56 -0800 Subject: [PATCH 20/20] adds shutdown notice to landing page. --- templates/Default/index.html.twig | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/templates/Default/index.html.twig b/templates/Default/index.html.twig index 69e8fa8b1..e258a0117 100755 --- a/templates/Default/index.html.twig +++ b/templates/Default/index.html.twig @@ -3,6 +3,13 @@ {% block body %}
+ {% include 'alerts.html.twig' %}

Thro