Feat: Game Rounds and Damage Log.
This commit is contained in:
@@ -365,7 +365,7 @@ def save_game_round_player_damage():
|
|||||||
})
|
})
|
||||||
return jsonify({
|
return jsonify({
|
||||||
Model_View_MTG_Base.FLAG_STATUS: Model_View_MTG_Base.FLAG_SUCCESS if success else Model_View_MTG_Base.FLAG_FAILURE
|
Model_View_MTG_Base.FLAG_STATUS: Model_View_MTG_Base.FLAG_SUCCESS if success else Model_View_MTG_Base.FLAG_FAILURE
|
||||||
, Model_View_MTG_Base.FLAG_DATA: None
|
, Model_View_MTG_Base.FLAG_DATA: None if success else ", ".join([str(e) for e in errors])
|
||||||
})
|
})
|
||||||
# return redirect(url_for('routes_mtg_game.game_detail', game_id = game_id))
|
# return redirect(url_for('routes_mtg_game.game_detail', game_id = game_id))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|||||||
@@ -30,7 +30,12 @@ from typing import ClassVar
|
|||||||
|
|
||||||
class Model_View_MTG_Game(Model_View_MTG_Base):
|
class Model_View_MTG_Game(Model_View_MTG_Base):
|
||||||
ATTR_RECEIVED_FROM_COMMANDER_PLAYER_ID: ClassVar[str] = MTG_Game_Round_Player_Damage.ATTR_RECEIVED_FROM_COMMANDER_PLAYER_ID
|
ATTR_RECEIVED_FROM_COMMANDER_PLAYER_ID: ClassVar[str] = MTG_Game_Round_Player_Damage.ATTR_RECEIVED_FROM_COMMANDER_PLAYER_ID
|
||||||
|
FLAG_DAMAGE_LOG: ClassVar[str] = 'damage-log'
|
||||||
FLAG_IS_ELIMINATED: ClassVar[str] = MTG_Game_Round_Player_Damage.FLAG_IS_ELIMINATED
|
FLAG_IS_ELIMINATED: ClassVar[str] = MTG_Game_Round_Player_Damage.FLAG_IS_ELIMINATED
|
||||||
|
# ID_INPUT_ROUND: ClassVar[str] = 'input-round'
|
||||||
|
FLAG_ROUND_DISPLAY_ORDER_BUTTON: ClassVar[str] = 'btn-round-display-order'
|
||||||
|
FLAG_ROUND_DISPLAY_ORDER_MINUS: ClassVar[str] = 'round-display-order-minus'
|
||||||
|
FLAG_ROUND_DISPLAY_ORDER_PLUS: ClassVar[str] = 'round-display-order-plus'
|
||||||
PLAYER_SETUP_WRAPPER_TEMPLATE_ID: ClassVar[str] = 'player-setup-wrapper-template'
|
PLAYER_SETUP_WRAPPER_TEMPLATE_ID: ClassVar[str] = 'player-setup-wrapper-template'
|
||||||
|
|
||||||
damage_records: list = None
|
damage_records: list = None
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ RETURNS TABLE (
|
|||||||
, location_name TEXT
|
, location_name TEXT
|
||||||
, start_on TIMESTAMP
|
, start_on TIMESTAMP
|
||||||
, end_on TIMESTAMP
|
, end_on TIMESTAMP
|
||||||
|
, starting_life INT
|
||||||
, active BOOLEAN
|
, active BOOLEAN
|
||||||
, created_on TIMESTAMP
|
, created_on TIMESTAMP
|
||||||
, created_by_user_id INT
|
, created_by_user_id INT
|
||||||
@@ -60,6 +61,7 @@ BEGIN
|
|||||||
, GAME.location_name
|
, GAME.location_name
|
||||||
, GAME.start_on
|
, GAME.start_on
|
||||||
, GAME.end_on
|
, GAME.end_on
|
||||||
|
, GAME.starting_life
|
||||||
, GAME.active
|
, GAME.active
|
||||||
, GAME.created_on
|
, GAME.created_on
|
||||||
, GAME.created_by_user_id
|
, GAME.created_by_user_id
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ BEGIN
|
|||||||
DROP TABLE IF EXISTS Temp_MTG_Round_Damage_Save_Round_Player_Damage;
|
DROP TABLE IF EXISTS Temp_MTG_Round_Damage_Save_Round_Player_Damage;
|
||||||
DROP TABLE IF EXISTS Temp_MTG_Round_Damage_Save_Error;
|
DROP TABLE IF EXISTS Temp_MTG_Round_Damage_Save_Error;
|
||||||
|
|
||||||
CREATE TABLE Temp_MTG_Round_Damage_Save_Game (
|
CREATE TEMP TABLE Temp_MTG_Round_Damage_Save_Game (
|
||||||
game_id INT NOT NULL
|
game_id INT NOT NULL
|
||||||
, notes TEXT
|
, notes TEXT
|
||||||
, is_commander BOOLEAN
|
, is_commander BOOLEAN
|
||||||
@@ -43,7 +43,7 @@ BEGIN
|
|||||||
, change_set_id INT
|
, change_set_id INT
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE Temp_MTG_Round_Damage_Save_Player (
|
CREATE TEMP TABLE Temp_MTG_Round_Damage_Save_Player (
|
||||||
player_id INT NOT NULL
|
player_id INT NOT NULL
|
||||||
, game_id INT
|
, game_id INT
|
||||||
, user_id INT
|
, user_id INT
|
||||||
@@ -59,7 +59,7 @@ BEGIN
|
|||||||
, change_set_id INT
|
, change_set_id INT
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE Temp_MTG_Round_Damage_Save_Round (
|
CREATE TEMP TABLE Temp_MTG_Round_Damage_Save_Round (
|
||||||
temp_id INT NOT NULL
|
temp_id INT NOT NULL
|
||||||
, round_id INT
|
, round_id INT
|
||||||
, game_id INT
|
, game_id INT
|
||||||
@@ -74,10 +74,10 @@ BEGIN
|
|||||||
|
|
||||||
, is_new BOOLEAN
|
, is_new BOOLEAN
|
||||||
, error_name TEXT
|
, error_name TEXT
|
||||||
, is_duplicate BOOLEAN
|
, is_duplicate BOOLEAN DEFAULT FALSE
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE Temp_MTG_Round_Damage_Save_Round_Player_Damage (
|
CREATE TEMP TABLE Temp_MTG_Round_Damage_Save_Round_Player_Damage (
|
||||||
temp_id INT NOT NULL
|
temp_id INT NOT NULL
|
||||||
, damage_id INT
|
, damage_id INT
|
||||||
, temp_round_id INT
|
, temp_round_id INT
|
||||||
@@ -96,7 +96,7 @@ BEGIN
|
|||||||
|
|
||||||
, is_new BOOLEAN
|
, is_new BOOLEAN
|
||||||
, error_name TEXT
|
, error_name TEXT
|
||||||
, is_duplicate BOOLEAN
|
, is_duplicate BOOLEAN DEFAULT FALSE
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TEMP TABLE Temp_MTG_Round_Damage_Save_Error (
|
CREATE TEMP TABLE Temp_MTG_Round_Damage_Save_Error (
|
||||||
@@ -147,7 +147,7 @@ BEGIN
|
|||||||
, COALESCE(ROUND_T.updated_last_on, v_time_start) -- updated_last_on
|
, COALESCE(ROUND_T.updated_last_on, v_time_start) -- updated_last_on
|
||||||
, COALESCE(ROUND_T.updated_last_by_user_id, a_user_id) -- updated_last_by_user_id
|
, COALESCE(ROUND_T.updated_last_by_user_id, a_user_id) -- updated_last_by_user_id
|
||||||
|
|
||||||
, CASE WHEN ROUND.round_id IS NULL THEN TRUE ELSE FALSE END AS is_new
|
, CASE WHEN TCG_ROUND.round_id IS NULL THEN TRUE ELSE FALSE END AS is_new
|
||||||
, CONCAT(
|
, CONCAT(
|
||||||
'Round { id: '
|
'Round { id: '
|
||||||
, CAST(ROUND_T.round_id AS VARCHAR)
|
, CAST(ROUND_T.round_id AS VARCHAR)
|
||||||
@@ -160,12 +160,12 @@ BEGIN
|
|||||||
, ' }'
|
, ' }'
|
||||||
) -- error_name
|
) -- error_name
|
||||||
FROM tcg.public.TCG_MTG_Game_Round_Temp ROUND_T
|
FROM tcg.public.TCG_MTG_Game_Round_Temp ROUND_T
|
||||||
LEFT JOIN tcg.public.TCG_MTG_Game_Round ROUND
|
LEFT JOIN tcg.public.TCG_MTG_Game_Round TCG_ROUND
|
||||||
ON ROUND_T.round_id = ROUND.round_id
|
ON ROUND_T.round_id = TCG_ROUND.round_id
|
||||||
OR (
|
OR (
|
||||||
COALESCE(ROUND_T.round_id, 0) < 1
|
COALESCE(ROUND_T.round_id, 0) < 1
|
||||||
AND ROUND_T.game_id = ROUND.game_id
|
AND ROUND_T.game_id = TCG_ROUND.game_id
|
||||||
AND ROUND_T.display_order = ROUND.display_order
|
AND ROUND_T.display_order = TCG_ROUND.display_order
|
||||||
)
|
)
|
||||||
WHERE ROUND_T.guid = a_guid
|
WHERE ROUND_T.guid = a_guid
|
||||||
;
|
;
|
||||||
@@ -243,16 +243,18 @@ BEGIN
|
|||||||
WHERE PLAYER_DAMAGE_T.guid = a_guid
|
WHERE PLAYER_DAMAGE_T.guid = a_guid
|
||||||
;
|
;
|
||||||
|
|
||||||
UPDATE Temp_MTG_Round_Damage_Save_Round
|
UPDATE Temp_MTG_Round_Damage_Save_Round T_ROUND
|
||||||
SET round_id = COALESCE(ROUND.round_id, ROUND_T.round_id, 0)
|
SET round_id = COALESCE(TCG_ROUND.round_id, T_ROUND.round_id)
|
||||||
FROM tcg.public.TCG_MTG_Game_Round_Temp ROUND_T
|
FROM tcg.public.TCG_MTG_Game_Round TCG_ROUND
|
||||||
LEFT JOIN tcg.public.TCG_MTG_Game_Round ROUND
|
WHERE
|
||||||
ON ROUND_T.round_id = ROUND.round_id
|
(
|
||||||
OR (
|
T_ROUND.round_id = TCG_ROUND.round_id
|
||||||
ROUND_T.game_id = ROUND.game_id
|
OR (
|
||||||
AND ROUND_T.display_order = ROUND.display_order
|
T_ROUND.game_id = TCG_ROUND.game_id
|
||||||
|
AND T_ROUND.display_order = TCG_ROUND.display_order
|
||||||
|
)
|
||||||
)
|
)
|
||||||
WHERE COALESCE(ROUND_T.round_id, 0) < 1
|
AND COALESCE(T_ROUND.round_id, 0) < 1
|
||||||
;
|
;
|
||||||
|
|
||||||
UPDATE Temp_MTG_Round_Damage_Save_Round_Player_Damage T_PLAYER_DAMAGE
|
UPDATE Temp_MTG_Round_Damage_Save_Round_Player_Damage T_PLAYER_DAMAGE
|
||||||
@@ -350,6 +352,22 @@ BEGIN
|
|||||||
OR PLAYER.player_id = T_PLAYER_DAMAGE.received_from_commander_player_id
|
OR PLAYER.player_id = T_PLAYER_DAMAGE.received_from_commander_player_id
|
||||||
;
|
;
|
||||||
|
|
||||||
|
/*
|
||||||
|
INSERT INTO Temp_MTG_Round_Damage_Save_Error (
|
||||||
|
error_type_id
|
||||||
|
, message
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
v_bad_data_error_type_id -- error_type_id
|
||||||
|
, CONCAT(
|
||||||
|
'Rounds: '
|
||||||
|
, STRING_AGG(T_ROUND.error_name, ', ')
|
||||||
|
, '.'
|
||||||
|
) -- message
|
||||||
|
FROM Temp_MTG_Round_Damage_Save_Round T_ROUND
|
||||||
|
;
|
||||||
|
*/
|
||||||
|
|
||||||
-- Validate Round
|
-- Validate Round
|
||||||
-- Missing fields
|
-- Missing fields
|
||||||
WITH Round_Missing_Field AS (
|
WITH Round_Missing_Field AS (
|
||||||
@@ -404,7 +422,25 @@ BEGIN
|
|||||||
|
|
||||||
-- Duplicate
|
-- Duplicate
|
||||||
WITH
|
WITH
|
||||||
All_Round AS (
|
Existing_Round AS (
|
||||||
|
SELECT
|
||||||
|
TCG_ROUND.round_id
|
||||||
|
, TCG_ROUND.game_id
|
||||||
|
, TCG_ROUND.display_order
|
||||||
|
FROM tcg.public.TCG_MTG_Game_Round TCG_ROUND
|
||||||
|
LEFT JOIN Temp_MTG_Round_Damage_Save_Round T_ROUND ON TCG_ROUND.round_id = T_ROUND.round_id
|
||||||
|
WHERE
|
||||||
|
TCG_ROUND.active
|
||||||
|
/*
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM Temp_MTG_Round_Damage_Save_Round T_ROUND
|
||||||
|
WHERE T_ROUND.round_id = TCG_ROUND.round_id
|
||||||
|
)
|
||||||
|
*/
|
||||||
|
AND T_ROUND.temp_id IS NULL
|
||||||
|
)
|
||||||
|
, All_Round AS (
|
||||||
SELECT
|
SELECT
|
||||||
T_ROUND.temp_id
|
T_ROUND.temp_id
|
||||||
, T_ROUND.game_id
|
, T_ROUND.game_id
|
||||||
@@ -414,27 +450,23 @@ BEGIN
|
|||||||
UNION
|
UNION
|
||||||
SELECT
|
SELECT
|
||||||
NULL AS temp_id
|
NULL AS temp_id
|
||||||
, ROUND.game_id
|
, EXISTING_ROUND.game_id
|
||||||
, ROUND.display_order
|
, EXISTING_ROUND.display_order
|
||||||
, FALSE AS is_save_record
|
, FALSE AS is_save_record
|
||||||
FROM tcg.public.TCG_MTG_Game_Round ROUND
|
FROM Existing_Round EXISTING_ROUND
|
||||||
LEFT JOIN Temp_MTG_Round_Damage_Save_Round T_ROUND ON ROUND.round_id = T_ROUND.round_id
|
|
||||||
WHERE
|
|
||||||
T_ROUND.round_id IS NULL
|
|
||||||
AND ROUND.active
|
|
||||||
)
|
)
|
||||||
, Unique_Game_Round AS (
|
, Unique_Game_Round AS (
|
||||||
SELECT
|
SELECT
|
||||||
ALL_ROUND.game_id
|
ALL_ROUND.game_id
|
||||||
, ALL_ROUND.display_order
|
, ALL_ROUND.display_order
|
||||||
, COUNT(*) AS count
|
, COUNT(*) AS count_rounds
|
||||||
FROM All_Round ALL_ROUND
|
FROM All_Round ALL_ROUND
|
||||||
GROUP BY
|
GROUP BY
|
||||||
ALL_ROUND.game_id
|
ALL_ROUND.game_id
|
||||||
, ALL_ROUND.display_order
|
, ALL_ROUND.display_order
|
||||||
)
|
)
|
||||||
UPDATE Temp_MTG_Round_Damage_Save_Round T_ROUND
|
UPDATE Temp_MTG_Round_Damage_Save_Round T_ROUND
|
||||||
SET is_duplicate = CASE WHEN COALESCE(UNIQUE_GAME_ROUND.count, 0) > 1 THEN TRUE ELSE FALSE END
|
SET is_duplicate = CASE WHEN COALESCE(UNIQUE_GAME_ROUND.count_rounds, 0) > 1 THEN TRUE ELSE FALSE END
|
||||||
FROM Unique_Game_Round UNIQUE_GAME_ROUND
|
FROM Unique_Game_Round UNIQUE_GAME_ROUND
|
||||||
WHERE
|
WHERE
|
||||||
T_ROUND.game_id = UNIQUE_GAME_ROUND.game_id
|
T_ROUND.game_id = UNIQUE_GAME_ROUND.game_id
|
||||||
@@ -462,6 +494,123 @@ BEGIN
|
|||||||
;
|
;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
-- Testing TESTING
|
||||||
|
|
||||||
|
WITH
|
||||||
|
Existing_Round AS (
|
||||||
|
SELECT
|
||||||
|
TCG_ROUND.round_id
|
||||||
|
, TCG_ROUND.game_id
|
||||||
|
, TCG_ROUND.display_order
|
||||||
|
FROM tcg.public.TCG_MTG_Game_Round TCG_ROUND
|
||||||
|
LEFT JOIN Temp_MTG_Round_Damage_Save_Round T_ROUND ON TCG_ROUND.round_id = T_ROUND.round_id
|
||||||
|
WHERE
|
||||||
|
TCG_ROUND.active
|
||||||
|
/*
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT *
|
||||||
|
FROM Temp_MTG_Round_Damage_Save_Round T_ROUND
|
||||||
|
WHERE T_ROUND.round_id = TCG_ROUND.round_id
|
||||||
|
)
|
||||||
|
*/
|
||||||
|
AND T_ROUND.temp_id IS NULL
|
||||||
|
)
|
||||||
|
, All_Round AS (
|
||||||
|
SELECT
|
||||||
|
T_ROUND.temp_id
|
||||||
|
, T_ROUND.round_id
|
||||||
|
, T_ROUND.game_id
|
||||||
|
, T_ROUND.display_order
|
||||||
|
, TRUE AS is_save_record
|
||||||
|
FROM Temp_MTG_Round_Damage_Save_Round T_ROUND
|
||||||
|
UNION
|
||||||
|
SELECT
|
||||||
|
NULL AS temp_id
|
||||||
|
, EXISTING_ROUND.round_id
|
||||||
|
, EXISTING_ROUND.game_id
|
||||||
|
, EXISTING_ROUND.display_order
|
||||||
|
, FALSE AS is_save_record
|
||||||
|
FROM Existing_Round EXISTING_ROUND
|
||||||
|
)
|
||||||
|
, Unique_Game_Round AS (
|
||||||
|
SELECT
|
||||||
|
ALL_ROUND.game_id
|
||||||
|
, ALL_ROUND.display_order
|
||||||
|
, COUNT(*) AS count_rounds
|
||||||
|
FROM All_Round ALL_ROUND
|
||||||
|
GROUP BY
|
||||||
|
ALL_ROUND.game_id
|
||||||
|
, ALL_ROUND.display_order
|
||||||
|
)
|
||||||
|
INSERT INTO Temp_MTG_Round_Damage_Save_Error (
|
||||||
|
error_type_id
|
||||||
|
, message
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
v_bad_data_error_type_id -- error_type_id
|
||||||
|
, CONCAT(
|
||||||
|
'TEST: Existing rounds: '
|
||||||
|
, STRING_AGG(
|
||||||
|
CONCAT(
|
||||||
|
'{ Round ID: '
|
||||||
|
, CAST(EXISTING_ROUND.round_id AS VARCHAR)
|
||||||
|
, ', Game ID: '
|
||||||
|
, CAST(EXISTING_ROUND.game_id AS VARCHAR)
|
||||||
|
, ', Display order: '
|
||||||
|
, CAST(EXISTING_ROUND.display_order AS VARCHAR)
|
||||||
|
, ' }'
|
||||||
|
)
|
||||||
|
, ', '
|
||||||
|
)
|
||||||
|
) -- message
|
||||||
|
FROM Existing_Round EXISTING_ROUND
|
||||||
|
UNION
|
||||||
|
SELECT
|
||||||
|
v_bad_data_error_type_id -- error_type_id
|
||||||
|
, CONCAT(
|
||||||
|
'TEST: All rounds: '
|
||||||
|
-- , STRING_AGG(CONCAT(ALL_ROUND.temp_id, ' - ', ALL_ROUND.game_id, ' - ', ALL_ROUND.display_order), ', ')
|
||||||
|
, STRING_AGG(
|
||||||
|
CONCAT(
|
||||||
|
'{ Temp ID: '
|
||||||
|
, CAST(ALL_ROUND.temp_id AS VARCHAR)
|
||||||
|
, ', Round ID: '
|
||||||
|
, CAST(ALL_ROUND.round_id AS VARCHAR)
|
||||||
|
, ', Game ID: '
|
||||||
|
, CAST(ALL_ROUND.game_id AS VARCHAR)
|
||||||
|
, ', Display order: '
|
||||||
|
, CAST(ALL_ROUND.display_order AS VARCHAR)
|
||||||
|
, ' }'
|
||||||
|
)
|
||||||
|
, ', '
|
||||||
|
)
|
||||||
|
) -- message
|
||||||
|
FROM All_Round ALL_ROUND
|
||||||
|
UNION
|
||||||
|
SELECT
|
||||||
|
v_bad_data_error_type_id -- error_type_id
|
||||||
|
, CONCAT(
|
||||||
|
'TEST: Unique rounds: '
|
||||||
|
-- , STRING_AGG(CONCAT(UNIQUE_ROUND.game_id, ' - ', UNIQUE_ROUND.display_order, ' - ', UNIQUE_ROUND.count_rounds), ', ')
|
||||||
|
, STRING_AGG(
|
||||||
|
CONCAT(
|
||||||
|
'{ Game ID: '
|
||||||
|
, CAST(UNIQUE_ROUND.game_id AS VARCHAR)
|
||||||
|
, ', Display order: '
|
||||||
|
, CAST(UNIQUE_ROUND.display_order AS VARCHAR)
|
||||||
|
, ' Count: '
|
||||||
|
, CAST(UNIQUE_ROUND.count_rounds AS VARCHAR)
|
||||||
|
, ' }'
|
||||||
|
)
|
||||||
|
, ', '
|
||||||
|
)
|
||||||
|
) -- message
|
||||||
|
FROM Unique_Game_Round UNIQUE_ROUND
|
||||||
|
;
|
||||||
|
*/
|
||||||
|
|
||||||
-- Validate Damage
|
-- Validate Damage
|
||||||
-- Missing fields
|
-- Missing fields
|
||||||
WITH Player_Damage_Missing_Field AS (
|
WITH Player_Damage_Missing_Field AS (
|
||||||
@@ -550,7 +699,18 @@ BEGIN
|
|||||||
|
|
||||||
-- Duplicate Round Player Damage
|
-- Duplicate Round Player Damage
|
||||||
WITH
|
WITH
|
||||||
All_Player_Damage AS (
|
Existing_Player_Damage AS (
|
||||||
|
SELECT
|
||||||
|
T_PLAYER_DAMAGE.round_id
|
||||||
|
, T_PLAYER_DAMAGE.player_id
|
||||||
|
, COALESCE(T_PLAYER_DAMAGE.received_from_commander_player_id, 0) AS received_from_commander_player_id
|
||||||
|
FROM tcg.public.TCG_MTG_Game_Round_Player_Damage PLAYER_DAMAGE
|
||||||
|
LEFT JOIN Temp_MTG_Round_Damage_Save_Round_Player_Damage T_PLAYER_DAMAGE ON PLAYER_DAMAGE.damage_id = T_PLAYER_DAMAGE.damage_id
|
||||||
|
WHERE
|
||||||
|
T_PLAYER_DAMAGE.temp_id IS NULL
|
||||||
|
AND PLAYER_DAMAGE.active
|
||||||
|
)
|
||||||
|
, All_Player_Damage AS (
|
||||||
SELECT
|
SELECT
|
||||||
T_PLAYER_DAMAGE.temp_id
|
T_PLAYER_DAMAGE.temp_id
|
||||||
, T_PLAYER_DAMAGE.round_id
|
, T_PLAYER_DAMAGE.round_id
|
||||||
@@ -561,22 +721,18 @@ BEGIN
|
|||||||
UNION
|
UNION
|
||||||
SELECT
|
SELECT
|
||||||
NULL AS temp_id
|
NULL AS temp_id
|
||||||
, T_PLAYER_DAMAGE.round_id
|
, EXISTING_PLAYER_DAMAGE.round_id
|
||||||
, T_PLAYER_DAMAGE.player_id
|
, EXISTING_PLAYER_DAMAGE.player_id
|
||||||
, COALESCE(T_PLAYER_DAMAGE.received_from_commander_player_id, 0) AS received_from_commander_player_id
|
, EXISTING_PLAYER_DAMAGE.received_from_commander_player_id
|
||||||
, FALSE AS is_save_record
|
, FALSE AS is_save_record
|
||||||
FROM tcg.public.TCG_MTG_Game_Round_Player_Damage PLAYER_DAMAGE
|
FROM Existing_Player_Damage EXISTING_PLAYER_DAMAGE
|
||||||
LEFT JOIN Temp_MTG_Round_Damage_Save_Round_Player_Damage T_PLAYER_DAMAGE ON PLAYER_DAMAGE.damage_id = T_PLAYER_DAMAGE.damage_id
|
|
||||||
WHERE
|
|
||||||
T_PLAYER_DAMAGE.damage_id IS NULL
|
|
||||||
AND PLAYER_DAMAGE.active
|
|
||||||
)
|
)
|
||||||
, Unique_Game_Player_Damage AS (
|
, Unique_Game_Player_Damage AS (
|
||||||
SELECT
|
SELECT
|
||||||
ALL_PLAYER_DAMAGE.round_id
|
ALL_PLAYER_DAMAGE.round_id
|
||||||
, ALL_PLAYER_DAMAGE.player_id
|
, ALL_PLAYER_DAMAGE.player_id
|
||||||
, ALL_PLAYER_DAMAGE.received_from_commander_player_id
|
, ALL_PLAYER_DAMAGE.received_from_commander_player_id
|
||||||
, COUNT(*) AS count
|
, COUNT(*) AS count_damage
|
||||||
FROM All_Player_Damage ALL_PLAYER_DAMAGE
|
FROM All_Player_Damage ALL_PLAYER_DAMAGE
|
||||||
GROUP BY
|
GROUP BY
|
||||||
ALL_PLAYER_DAMAGE.round_id
|
ALL_PLAYER_DAMAGE.round_id
|
||||||
@@ -584,12 +740,12 @@ BEGIN
|
|||||||
, ALL_PLAYER_DAMAGE.received_from_commander_player_id
|
, ALL_PLAYER_DAMAGE.received_from_commander_player_id
|
||||||
)
|
)
|
||||||
UPDATE Temp_MTG_Round_Damage_Save_Round_Player_Damage T_PLAYER_DAMAGE
|
UPDATE Temp_MTG_Round_Damage_Save_Round_Player_Damage T_PLAYER_DAMAGE
|
||||||
SET is_duplicate = CASE WHEN COALESCE(UNIQUE_PLAYER_DAMAGE.count, 0) > 1 THEN TRUE ELSE FALSE END
|
SET is_duplicate = CASE WHEN COALESCE(UNIQUE_PLAYER_DAMAGE.count_damage, 0) > 1 THEN TRUE ELSE FALSE END
|
||||||
FROM Unique_Game_Player_Damage UNIQUE_PLAYER_DAMAGE
|
FROM Unique_Game_Player_Damage UNIQUE_PLAYER_DAMAGE
|
||||||
WHERE
|
WHERE
|
||||||
T_PLAYER_DAMAGE.round_id = UNIQUE_PLAYER_DAMAGE.round_id
|
T_PLAYER_DAMAGE.round_id = UNIQUE_PLAYER_DAMAGE.round_id
|
||||||
AND T_PLAYER_DAMAGE.player_id = UNIQUE_PLAYER_DAMAGE.player_id
|
AND T_PLAYER_DAMAGE.player_id = UNIQUE_PLAYER_DAMAGE.player_id
|
||||||
AND T_PLAYER_DAMAGE.received_from_commander_player_id = UNIQUE_PLAYER_DAMAGE.received_from_commander_player_id
|
AND COALESCE(T_PLAYER_DAMAGE.received_from_commander_player_id, 0) = UNIQUE_PLAYER_DAMAGE.received_from_commander_player_id
|
||||||
;
|
;
|
||||||
|
|
||||||
IF EXISTS (
|
IF EXISTS (
|
||||||
@@ -725,7 +881,7 @@ BEGIN
|
|||||||
, T_ROUND.display_order
|
, T_ROUND.display_order
|
||||||
;
|
;
|
||||||
|
|
||||||
UPDATE tcg.public.TCG_MTG_Game_Round ROUND
|
UPDATE tcg.public.TCG_MTG_Game_Round TCG_ROUND
|
||||||
SET
|
SET
|
||||||
game_id = T_ROUND.game_id
|
game_id = T_ROUND.game_id
|
||||||
, notes = T_ROUND.notes
|
, notes = T_ROUND.notes
|
||||||
@@ -736,16 +892,16 @@ BEGIN
|
|||||||
, change_set_id = v_change_set_id
|
, change_set_id = v_change_set_id
|
||||||
FROM Temp_MTG_Round_Damage_Save_Round T_ROUND
|
FROM Temp_MTG_Round_Damage_Save_Round T_ROUND
|
||||||
WHERE
|
WHERE
|
||||||
ROUND.round_id = T_ROUND.round_id
|
TCG_ROUND.round_id = T_ROUND.round_id
|
||||||
AND NOT T_ROUND.is_new
|
AND NOT T_ROUND.is_new
|
||||||
;
|
;
|
||||||
|
|
||||||
UPDATE Temp_MTG_Round_Damage_Save_Round T_ROUND
|
UPDATE Temp_MTG_Round_Damage_Save_Round T_ROUND
|
||||||
SET round_id = ROUND.round_id
|
SET round_id = TCG_ROUND.round_id
|
||||||
FROM tcg.public.TCG_MTG_Game_Round ROUND
|
FROM tcg.public.TCG_MTG_Game_Round TCG_ROUND
|
||||||
WHERE
|
WHERE
|
||||||
T_ROUND.game_id = ROUND.game_id
|
T_ROUND.game_id = TCG_ROUND.game_id
|
||||||
AND T_ROUND.display_order = ROUND.display_order
|
AND T_ROUND.display_order = TCG_ROUND.display_order
|
||||||
AND T_ROUND.is_new
|
AND T_ROUND.is_new
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -865,8 +1021,59 @@ DECLARE
|
|||||||
v_user_id INT := 3;
|
v_user_id INT := 3;
|
||||||
v_success BOOLEAN;
|
v_success BOOLEAN;
|
||||||
BEGIN
|
BEGIN
|
||||||
v_guid := gen_random_uuid();
|
v_guid := '6307bed6-73a1-41ab-9a90-79e18e14dd81'::UUID; -- gen_random_uuid();
|
||||||
|
|
||||||
|
CALL tcg.public.USP_TCG_MTG_Game_Round_Damage_Save (
|
||||||
|
a_comment := v_comment -- a_comment
|
||||||
|
, a_guid := v_guid -- a_guid
|
||||||
|
, a_user_id := v_user_id -- a_user_id
|
||||||
|
, o_success := v_success -- o_success
|
||||||
|
);
|
||||||
|
RAISE NOTICE 'Success: %', CASE WHEN v_success THEN 'TRUE' ELSE 'FALSE' END;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
|
|
||||||
|
SELECT *
|
||||||
|
-- DELETE
|
||||||
|
FROM tcg.public.Error ERROR
|
||||||
|
LEFT JOIN tcg.public.Error_Type ERROR_TYPE ON ERROR.error_type_id = ERROR_TYPE.error_type_id
|
||||||
|
;
|
||||||
|
SELECT *
|
||||||
|
FROM tcg.public.Error_Type ERROR_TYPE
|
||||||
|
;
|
||||||
|
SELECT *
|
||||||
|
FROM tcg.public.TCG_Change_Set CHANGE_SET
|
||||||
|
ORDER BY CHANGE_SET.change_set_id DESC
|
||||||
|
;
|
||||||
|
/*
|
||||||
|
SELECT *
|
||||||
|
FROM tcg.public.TCG_MTG_Game
|
||||||
|
;
|
||||||
|
;
|
||||||
|
*/
|
||||||
|
SELECT *
|
||||||
|
-- DELETE
|
||||||
|
FROM tcg.public.TCG_MTG_Game_Round_Temp
|
||||||
|
;
|
||||||
|
SELECT *
|
||||||
|
-- DELETE
|
||||||
|
FROM tcg.public.TCG_MTG_Game_Round_Player_Damage_Temp
|
||||||
|
;
|
||||||
|
SELECT *
|
||||||
|
-- DELETE
|
||||||
|
FROM tcg.public.TCG_MTG_Game_Round TCG_ROUND
|
||||||
|
LEFT JOIN tcg.public.TCG_MTG_Game GAME ON TCG_ROUND.game_id = GAME.game_id
|
||||||
|
;
|
||||||
|
SELECT *
|
||||||
|
-- DELETE
|
||||||
|
FROM tcg.public.TCG_MTG_Game_Round_Player_Damage PLAYER_DAMAGE
|
||||||
|
LEFT JOIN tcg.public.TCG_MTG_Game_Round TCG_ROUND ON PLAYER_DAMAGE.round_id = TCG_ROUND.round_id
|
||||||
|
LEFT JOIN tcg.public.TCG_MTG_Game GAME ON TCG_ROUND.game_id = GAME.game_id
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
INSERT INTO tcg.public.TCG_MTG_Game_Round_Temp (
|
INSERT INTO tcg.public.TCG_MTG_Game_Round_Temp (
|
||||||
guid
|
guid
|
||||||
, round_id
|
, round_id
|
||||||
@@ -927,52 +1134,8 @@ BEGIN
|
|||||||
, TRUE -- active
|
, TRUE -- active
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
*/
|
||||||
CALL tcg.public.USP_TCG_MTG_Game_Round_Damage_Save (
|
|
||||||
a_comment := v_comment -- a_comment
|
|
||||||
, a_guid := v_guid -- a_guid
|
|
||||||
, a_user_id := v_user_id -- a_user_id
|
|
||||||
, o_success := v_success -- o_success
|
|
||||||
);
|
|
||||||
RAISE NOTICE 'Success: %', CASE WHEN v_success THEN 'TRUE' ELSE 'FALSE' END;
|
|
||||||
END;
|
|
||||||
$$;
|
|
||||||
|
|
||||||
SELECT *
|
|
||||||
-- DELETE
|
|
||||||
FROM tcg.public.Error ERROR
|
|
||||||
LEFT JOIN tcg.public.Error_Type ERROR_TYPE ON ERROR.error_type_id = ERROR_TYPE.error_type_id
|
|
||||||
;
|
|
||||||
SELECT *
|
|
||||||
FROM tcg.public.Error_Type ERROR_TYPE
|
|
||||||
;
|
|
||||||
SELECT *
|
|
||||||
FROM tcg.public.TCG_Change_Set CHANGE_SET
|
|
||||||
ORDER BY CHANGE_SET.change_set_id DESC
|
|
||||||
;
|
|
||||||
/*
|
|
||||||
SELECT *
|
|
||||||
FROM tcg.public.TCG_MTG_Game
|
|
||||||
;
|
|
||||||
*/
|
|
||||||
SELECT *
|
|
||||||
-- DELETE
|
|
||||||
FROM tcg.public.TCG_MTG_Game_Round_Temp
|
|
||||||
;
|
|
||||||
SELECT *
|
|
||||||
-- DELETE
|
|
||||||
FROM tcg.public.TCG_MTG_Game_Round_Player_Damage_Temp
|
|
||||||
;
|
|
||||||
SELECT *
|
|
||||||
-- DELETE
|
|
||||||
FROM tcg.public.TCG_MTG_Game_Round ROUND
|
|
||||||
LEFT JOIN tcg.public.TCG_MTG_Game GAME ON ROUND.game_id = GAME.game_id
|
|
||||||
;
|
|
||||||
SELECT *
|
|
||||||
-- DELETE
|
|
||||||
FROM tcg.public.TCG_MTG_Game_Round_Player_Damage PLAYER_DAMAGE
|
|
||||||
LEFT JOIN tcg.public.TCG_MTG_Game_Round ROUND ON PLAYER_DAMAGE.round_id = ROUND.round_id
|
|
||||||
LEFT JOIN tcg.public.TCG_MTG_Game GAME ON ROUND.game_id = GAME.game_id
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
.topnav .container .logo {
|
.topnav .container .logo {
|
||||||
/* min-width: 35vh; */
|
/* min-width: 35vh; */
|
||||||
max-width: 30vw;
|
max-width: 30vw;
|
||||||
width: 30vw;
|
/* width: 30vw; */
|
||||||
/* min-height: 6vh; */
|
/* min-height: 6vh; */
|
||||||
max-height: 6vh;
|
max-height: 6vh;
|
||||||
margin: 0.5vh;
|
margin: 0.5vh;
|
||||||
|
|||||||
@@ -83,9 +83,6 @@ body.tcg-theme {
|
|||||||
.footer.tcg {
|
.footer.tcg {
|
||||||
background: var(--tcg-bg-secondary);
|
background: var(--tcg-bg-secondary);
|
||||||
border-top: 2px solid var(--tcg-border-color);
|
border-top: 2px solid var(--tcg-border-color);
|
||||||
color: var(--tcg-text-secondary);
|
|
||||||
padding: 2rem;
|
|
||||||
margin-top: 3rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.footer.tcg h3 {
|
.footer.tcg h3 {
|
||||||
|
|||||||
@@ -146,6 +146,62 @@
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Game Section */
|
||||||
|
#gameSection .row.round {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
color: var(--tcg-text-secondary);
|
||||||
|
margin: 0 auto 0.5vh;
|
||||||
|
width: fit-content;
|
||||||
|
}
|
||||||
|
#gameSection .row.round .row.round .round.display_order {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
background: var(--tcg-bg-card);
|
||||||
|
border: 1px solid var(--tcg-border-color);
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 0.25rem 0.5rem;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
#gameSection .row.round label {
|
||||||
|
margin-left: 30vw;
|
||||||
|
color: var(--tcg-text-secondary);
|
||||||
|
font-size: 1rem;
|
||||||
|
width: 4vw;
|
||||||
|
}
|
||||||
|
#gameSection .row.round input {
|
||||||
|
width: 10vw;
|
||||||
|
margin: 0 3vw 1vh;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
#gameSection .row.round .row.round span.round.display_order {
|
||||||
|
font-family: 'Cinzel', serif;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--tcg-text-primary);
|
||||||
|
min-width: 20px;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
#gameSection .row.round .row.round button.btn-round-display-order {
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
color: var(--tcg-text-secondary);
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 1rem;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
#gameSection .row.round .row.round button.btn-round-display-order:hover {
|
||||||
|
color: var(--tcg-accent-red);
|
||||||
|
transform: scale(1.2);
|
||||||
|
}
|
||||||
|
|
||||||
/* Players Grid */
|
/* Players Grid */
|
||||||
.players-grid {
|
.players-grid {
|
||||||
display: flex; /* grid;
|
display: flex; /* grid;
|
||||||
@@ -407,6 +463,34 @@
|
|||||||
color: var(--tcg-bg-primary);
|
color: var(--tcg-bg-primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.damage-log.container {
|
||||||
|
color: white;
|
||||||
|
margin: 2vh auto 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.damage-log.container table thead tr th.round_id,
|
||||||
|
.damage-log.container table tbody tr td.round_id {
|
||||||
|
width: 7vw;
|
||||||
|
}
|
||||||
|
.damage-log.container table thead tr th.player_id,
|
||||||
|
.damage-log.container table tbody tr td.player_id,
|
||||||
|
.damage-log.container table thead tr th.received_from_commander_player_id,
|
||||||
|
.damage-log.container table tbody tr td.received_from_commander_player_id {
|
||||||
|
width: 20vw;
|
||||||
|
}
|
||||||
|
.damage-log.container table thead tr th.health_change,
|
||||||
|
.damage-log.container table tbody tr td.health_change {
|
||||||
|
width: 7vw;
|
||||||
|
}
|
||||||
|
.damage-log.container table thead tr th.commander-deaths,
|
||||||
|
.damage-log.container table tbody tr td.commander-deaths {
|
||||||
|
width: 7vw;
|
||||||
|
}
|
||||||
|
.damage-log.container table thead tr th.is_eliminated,
|
||||||
|
.damage-log.container table tbody tr td.is_eliminated {
|
||||||
|
width: 7vw;
|
||||||
|
}
|
||||||
|
|
||||||
/* Save Indicator */
|
/* Save Indicator */
|
||||||
.save-indicator {
|
.save-indicator {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
|
|||||||
2
static/dist/css/main.bundle.css
vendored
2
static/dist/css/main.bundle.css
vendored
@@ -578,7 +578,7 @@ table div {
|
|||||||
.topnav .container .logo {
|
.topnav .container .logo {
|
||||||
/* min-width: 35vh; */
|
/* min-width: 35vh; */
|
||||||
max-width: 30vw;
|
max-width: 30vw;
|
||||||
width: 30vw;
|
/* width: 30vw; */
|
||||||
/* min-height: 6vh; */
|
/* min-height: 6vh; */
|
||||||
max-height: 6vh;
|
max-height: 6vh;
|
||||||
margin: 0.5vh;
|
margin: 0.5vh;
|
||||||
|
|||||||
2
static/dist/css/main.bundle.css.map
vendored
2
static/dist/css/main.bundle.css.map
vendored
File diff suppressed because one or more lines are too long
84
static/dist/css/tcg_game.bundle.css
vendored
84
static/dist/css/tcg_game.bundle.css
vendored
@@ -212,6 +212,62 @@
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Game Section */
|
||||||
|
#gameSection .row.round {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
color: var(--tcg-text-secondary);
|
||||||
|
margin: 0 auto 0.5vh;
|
||||||
|
width: fit-content;
|
||||||
|
}
|
||||||
|
#gameSection .row.round .row.round .round.display_order {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
background: var(--tcg-bg-card);
|
||||||
|
border: 1px solid var(--tcg-border-color);
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 0.25rem 0.5rem;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
#gameSection .row.round label {
|
||||||
|
margin-left: 30vw;
|
||||||
|
color: var(--tcg-text-secondary);
|
||||||
|
font-size: 1rem;
|
||||||
|
width: 4vw;
|
||||||
|
}
|
||||||
|
#gameSection .row.round input {
|
||||||
|
width: 10vw;
|
||||||
|
margin: 0 3vw 1vh;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
#gameSection .row.round .row.round span.round.display_order {
|
||||||
|
font-family: 'Cinzel', serif;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--tcg-text-primary);
|
||||||
|
min-width: 20px;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
#gameSection .row.round .row.round button.btn-round-display-order {
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
color: var(--tcg-text-secondary);
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 1rem;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
}
|
||||||
|
#gameSection .row.round .row.round button.btn-round-display-order:hover {
|
||||||
|
color: var(--tcg-accent-red);
|
||||||
|
transform: scale(1.2);
|
||||||
|
}
|
||||||
|
|
||||||
/* Players Grid */
|
/* Players Grid */
|
||||||
.players-grid {
|
.players-grid {
|
||||||
display: flex; /* grid;
|
display: flex; /* grid;
|
||||||
@@ -473,6 +529,34 @@
|
|||||||
color: var(--tcg-bg-primary);
|
color: var(--tcg-bg-primary);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.damage-log.container {
|
||||||
|
color: white;
|
||||||
|
margin: 2vh auto 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.damage-log.container table thead tr th.round_id,
|
||||||
|
.damage-log.container table tbody tr td.round_id {
|
||||||
|
width: 7vw;
|
||||||
|
}
|
||||||
|
.damage-log.container table thead tr th.player_id,
|
||||||
|
.damage-log.container table tbody tr td.player_id,
|
||||||
|
.damage-log.container table thead tr th.received_from_commander_player_id,
|
||||||
|
.damage-log.container table tbody tr td.received_from_commander_player_id {
|
||||||
|
width: 20vw;
|
||||||
|
}
|
||||||
|
.damage-log.container table thead tr th.health_change,
|
||||||
|
.damage-log.container table tbody tr td.health_change {
|
||||||
|
width: 7vw;
|
||||||
|
}
|
||||||
|
.damage-log.container table thead tr th.commander-deaths,
|
||||||
|
.damage-log.container table tbody tr td.commander-deaths {
|
||||||
|
width: 7vw;
|
||||||
|
}
|
||||||
|
.damage-log.container table thead tr th.is_eliminated,
|
||||||
|
.damage-log.container table tbody tr td.is_eliminated {
|
||||||
|
width: 7vw;
|
||||||
|
}
|
||||||
|
|
||||||
/* Save Indicator */
|
/* Save Indicator */
|
||||||
.save-indicator {
|
.save-indicator {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
|
|||||||
2
static/dist/css/tcg_game.bundle.css.map
vendored
2
static/dist/css/tcg_game.bundle.css.map
vendored
File diff suppressed because one or more lines are too long
190
static/dist/js/main.bundle.js
vendored
190
static/dist/js/main.bundle.js
vendored
@@ -260,7 +260,6 @@ class DOM {
|
|||||||
return returnVal;
|
return returnVal;
|
||||||
}
|
}
|
||||||
static getElementAttributeValueCurrent(element) {
|
static getElementAttributeValueCurrent(element) {
|
||||||
// debugger;
|
|
||||||
if (Validation.isEmpty(element)) return null;
|
if (Validation.isEmpty(element)) return null;
|
||||||
return element.getAttribute(attrValueCurrent);
|
return element.getAttribute(attrValueCurrent);
|
||||||
}
|
}
|
||||||
@@ -1024,12 +1023,6 @@ class TableBasePage extends BasePage {
|
|||||||
}
|
}
|
||||||
let formElement = TableBasePage.getFormFilters();
|
let formElement = TableBasePage.getFormFilters();
|
||||||
let comment = DOM.getElementValueCurrent(document.querySelector(idTextareaConfirm));
|
let comment = DOM.getElementValueCurrent(document.querySelector(idTextareaConfirm));
|
||||||
/*
|
|
||||||
Utils.consoleLogIfNotProductionEnvironment({ formElement, comment, records });
|
|
||||||
Utils.consoleLogIfNotProductionEnvironment('records');
|
|
||||||
Utils.consoleLogIfNotProductionEnvironment(records);
|
|
||||||
debugger;
|
|
||||||
*/
|
|
||||||
this.callSaveTableContent(records, formElement, comment).then(data => {
|
this.callSaveTableContent(records, formElement, comment).then(data => {
|
||||||
if (data[flagStatus] == flagSuccess) {
|
if (data[flagStatus] == flagSuccess) {
|
||||||
if (_verbose) {
|
if (_verbose) {
|
||||||
@@ -1689,11 +1682,18 @@ class PageMtgGame extends TableBasePage {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Render players to DOM
|
// Render players to DOM
|
||||||
|
const latestRoundId = PageMtgGame.getLatestRoundId();
|
||||||
|
const latestRound = rounds.filter(round => round[attrRoundId] == latestRoundId)[0];
|
||||||
|
const roundDisplayOrderLabel = PageMtgGame.getRoundDisplayOrderLabel();
|
||||||
|
DOM.setElementValuesCurrentAndPrevious(roundDisplayOrderLabel, latestRound[flagDisplayOrder]);
|
||||||
this.renderPlayers();
|
this.renderPlayers();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error loading game from server:', error);
|
console.error('Error loading game from server:', error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
static getRoundDisplayOrderLabel() {
|
||||||
|
return document.querySelector(['#gameSection', ' > .', flagRow, '.', flagRound, ' > .', flagRow, '.', flagRound, ' > .', flagRound, '.', flagDisplayOrder, ' > span.', flagRound, '.', flagDisplayOrder].join(''));
|
||||||
|
}
|
||||||
renderPlayers() {
|
renderPlayers() {
|
||||||
const grid = document.getElementById('playersGrid');
|
const grid = document.getElementById('playersGrid');
|
||||||
grid.innerHTML = '';
|
grid.innerHTML = '';
|
||||||
@@ -1710,7 +1710,16 @@ class PageMtgGame extends TableBasePage {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
*/
|
*/
|
||||||
const latestRoundId = PageMtgGame.getLatestRoundId();
|
|
||||||
|
let activeRoundId = PageMtgGame.getActiveRoundId();
|
||||||
|
const roundDisplayOrderLabel = PageMtgGame.getRoundDisplayOrderLabel();
|
||||||
|
if (activeRoundId < 0) {
|
||||||
|
const currentRoundDisplayOrder = Number(DOM.getElementValueCurrent(roundDisplayOrderLabel));
|
||||||
|
rounds.push(PageMtgGame.makeDefaultGameRound(currentRoundDisplayOrder));
|
||||||
|
activeRoundId = PageMtgGame.getActiveRoundId();
|
||||||
|
}
|
||||||
|
const latestRound = rounds.filter(round => round[attrRoundId] == activeRoundId)[0];
|
||||||
|
DOM.setElementValueCurrent(roundDisplayOrderLabel, latestRound[flagDisplayOrder]);
|
||||||
players.forEach((player, index) => {
|
players.forEach((player, index) => {
|
||||||
// Build display name: prefer user_name + deck_name, fallback to player name
|
// Build display name: prefer user_name + deck_name, fallback to player name
|
||||||
const playerId = player[attrPlayerId];
|
const playerId = player[attrPlayerId];
|
||||||
@@ -1721,7 +1730,7 @@ class PageMtgGame extends TableBasePage {
|
|||||||
let maxCommanderDamageReceived = 0;
|
let maxCommanderDamageReceived = 0;
|
||||||
damagePlayerPairs.forEach(damagePlayerPair => {
|
damagePlayerPairs.forEach(damagePlayerPair => {
|
||||||
const sourceId = damagePlayerPair[attrPlayerId];
|
const sourceId = damagePlayerPair[attrPlayerId];
|
||||||
const filteredPlayerDamages = damageRecords.filter(damage => damage[attrRoundId] == latestRoundId && damage[attrPlayerId] == playerId && damage[attrReceivedFromCommanderPlayerId] == sourceId); //[playerId] || {};
|
const filteredPlayerDamages = damageRecords.filter(damage => damage[attrRoundId] == activeRoundId && damage[attrPlayerId] == playerId && damage[attrReceivedFromCommanderPlayerId] == sourceId); //[playerId] || {};
|
||||||
if (filteredPlayerDamages.length == 0) {
|
if (filteredPlayerDamages.length == 0) {
|
||||||
damageRecords.push(PageMtgGame.makeDefaultGameRoundPlayerDamage(playerId, sourceId));
|
damageRecords.push(PageMtgGame.makeDefaultGameRoundPlayerDamage(playerId, sourceId));
|
||||||
}
|
}
|
||||||
@@ -1731,7 +1740,7 @@ class PageMtgGame extends TableBasePage {
|
|||||||
let life = startingLife + totalDamage;
|
let life = startingLife + totalDamage;
|
||||||
let isEliminatedByForce = damageRecords.filter(damage => damage[attrPlayerId] == playerId).map(damage => damage[flagIsEliminated]).some(Boolean);
|
let isEliminatedByForce = damageRecords.filter(damage => damage[attrPlayerId] == playerId).map(damage => damage[flagIsEliminated]).some(Boolean);
|
||||||
const isEliminated = isEliminatedByForce || !player[flagActive] || life < 1 || maxCommanderDamageReceived >= 21;
|
const isEliminated = isEliminatedByForce || !player[flagActive] || life < 1 || maxCommanderDamageReceived >= 21;
|
||||||
const playerOwnDamage = damageRecords.filter(damage => damage[attrPlayerId] == playerId && damage[attrReceivedFromCommanderPlayerId] == null && damage[attrRoundId] == latestRoundId)[0];
|
const playerOwnDamage = damageRecords.filter(damage => damage[attrPlayerId] == playerId && damage[attrReceivedFromCommanderPlayerId] == null && damage[attrRoundId] == activeRoundId)[0];
|
||||||
const card = document.createElement('div');
|
const card = document.createElement('div');
|
||||||
card.className = `player-card ${isEliminated ? 'eliminated' : ''}`;
|
card.className = `player-card ${isEliminated ? 'eliminated' : ''}`;
|
||||||
card.style.animationDelay = `${index * 0.1}s`;
|
card.style.animationDelay = `${index * 0.1}s`;
|
||||||
@@ -1778,12 +1787,42 @@ class PageMtgGame extends TableBasePage {
|
|||||||
`;
|
`;
|
||||||
grid.appendChild(card);
|
grid.appendChild(card);
|
||||||
});
|
});
|
||||||
|
this.reorderPlayerCards();
|
||||||
|
PageMtgGame.renderCommanderDamageLog();
|
||||||
|
|
||||||
// Hookup all event handlers
|
// Hookup all event handlers
|
||||||
|
this.hookupGameRoundEvents();
|
||||||
this.hookupPlayerCardEvents();
|
this.hookupPlayerCardEvents();
|
||||||
}
|
}
|
||||||
|
static renderCommanderDamageLog() {
|
||||||
|
const roundDisplayOrderLabel = PageMtgGame.getRoundDisplayOrderLabel();
|
||||||
|
const currentRoundDisplayOrder = Number(DOM.getElementValueCurrent(roundDisplayOrderLabel));
|
||||||
|
const damageTableBody = document.querySelector('.' + flagDamageLog + '.' + flagContainer + ' table tbody');
|
||||||
|
damageTableBody.innerHTML = '';
|
||||||
|
let newTableBodyHtml = '';
|
||||||
|
damageRecords.forEach(damage => {
|
||||||
|
if (damage[flagActive] && (damage[flagCommanderDeaths] > 0 || damage[flagHealthChange] != 0 || damage[flagIsEliminated]) && rounds.filter(r => r[attrRoundId] == damage[attrRoundId])[0][flagDisplayOrder] <= currentRoundDisplayOrder) {
|
||||||
|
let round = rounds.filter(r => r[attrRoundId] == damage[attrRoundId])[0];
|
||||||
|
let player = players.filter(p => p[attrPlayerId] == damage[attrPlayerId])[0];
|
||||||
|
let receivedFromPlayer = damage[attrReceivedFromCommanderPlayerId] == null ? {
|
||||||
|
[flagName]: ''
|
||||||
|
} : players.filter(p => p[attrPlayerId] == damage[attrReceivedFromCommanderPlayerId])[0];
|
||||||
|
newTableBodyHtml += `
|
||||||
|
<tr ${attrDamageId}="${damage[attrDamageId]}">
|
||||||
|
<td class="${attrRoundId}">${round[flagDisplayOrder]}</td>
|
||||||
|
<td class="${attrPlayerId}">${player[flagName]}</td>
|
||||||
|
<td class="${attrReceivedFromCommanderPlayerId}">${receivedFromPlayer[flagName]}</td>
|
||||||
|
<td class="${flagHealthChange}">${damage[flagHealthChange]}</td>
|
||||||
|
<td class="${flagCommanderDeaths}">${damage[flagCommanderDeaths]}</td>
|
||||||
|
<td class="${flagIsEliminated}">${damage[flagIsEliminated]}</td>
|
||||||
|
</tr>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
damageTableBody.innerHTML = newTableBodyHtml;
|
||||||
|
}
|
||||||
static makeDefaultGameRoundPlayerDamage(playerId, receivedFromCommanderPlayerId) {
|
static makeDefaultGameRoundPlayerDamage(playerId, receivedFromCommanderPlayerId) {
|
||||||
let roundId = PageMtgGame.getLatestRoundId();
|
let roundId = PageMtgGame.getActiveRoundId();
|
||||||
return {
|
return {
|
||||||
[attrDamageId]: -1 - damageRecords.length,
|
[attrDamageId]: -1 - damageRecords.length,
|
||||||
[attrRoundId]: roundId,
|
[attrRoundId]: roundId,
|
||||||
@@ -1797,13 +1836,32 @@ class PageMtgGame extends TableBasePage {
|
|||||||
static getLatestRoundId() {
|
static getLatestRoundId() {
|
||||||
let roundId = -1;
|
let roundId = -1;
|
||||||
if (rounds.length > 0) {
|
if (rounds.length > 0) {
|
||||||
let highestRoundDisplayOrder = Math.max(rounds.map(round => {
|
const highestRoundDisplayOrder = rounds.map(round => {
|
||||||
return round[flagDisplayOrder];
|
return round[flagDisplayOrder];
|
||||||
}));
|
}).reduce((acc, cur) => Math.max(acc, cur), 0);
|
||||||
roundId = rounds.filter(round => round[flagDisplayOrder] == highestRoundDisplayOrder)[0][attrRoundId];
|
const filteredRounds = rounds.filter(round => round[flagDisplayOrder] == highestRoundDisplayOrder);
|
||||||
|
if (filteredRounds.length > 0) {
|
||||||
|
roundId = filteredRounds[0][attrRoundId];
|
||||||
|
}
|
||||||
console.log({
|
console.log({
|
||||||
"method": "getLatestRoundId",
|
"method": "getLatestRoundId",
|
||||||
highestRoundDisplayOrder,
|
highestRoundDisplayOrder,
|
||||||
|
filteredRounds,
|
||||||
|
roundId
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return roundId;
|
||||||
|
}
|
||||||
|
static getActiveRoundId() {
|
||||||
|
const roundDisplayOrderLabel = PageMtgGame.getRoundDisplayOrderLabel();
|
||||||
|
const currentRoundDisplayOrder = Number(DOM.getElementValueCurrent(roundDisplayOrderLabel));
|
||||||
|
let roundId = -1;
|
||||||
|
if (rounds.length > 0) {
|
||||||
|
let filteredRounds = rounds.filter(round => round[flagDisplayOrder] == currentRoundDisplayOrder);
|
||||||
|
if (filteredRounds.length > 0) roundId = filteredRounds[0][attrRoundId];
|
||||||
|
console.log({
|
||||||
|
"method": "getActiveRoundId",
|
||||||
|
filteredRounds,
|
||||||
roundId
|
roundId
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -1839,14 +1897,38 @@ class PageMtgGame extends TableBasePage {
|
|||||||
`;
|
`;
|
||||||
}).join('');
|
}).join('');
|
||||||
}
|
}
|
||||||
|
hookupGameRoundEvents() {
|
||||||
|
let incrementRoundButtonSelector = '#gameSection .' + flagRow + '.' + flagRound + ' button.' + flagRoundDisplayOrderButton;
|
||||||
|
Events.hookupEventHandler("click", incrementRoundButtonSelector, (event, button) => {
|
||||||
|
const amount = button.classList.contains(flagRoundDisplayOrderPlus) ? 1 : -1;
|
||||||
|
const roundDisplayOrderButtonContainer = button.parentElement;
|
||||||
|
const roundDisplayOrderLabel = roundDisplayOrderButtonContainer.querySelector('span.' + flagRound + '.' + flagDisplayOrder);
|
||||||
|
const currentRoundDisplayOrder = Number(DOM.getElementValueCurrent(roundDisplayOrderLabel));
|
||||||
|
const newDisplayOrder = currentRoundDisplayOrder + amount;
|
||||||
|
DOM.setElementValueCurrent(roundDisplayOrderLabel, newDisplayOrder);
|
||||||
|
DOM.isElementDirty(roundDisplayOrderLabel);
|
||||||
|
this.updateAndToggleShowButtonsSaveCancel();
|
||||||
|
this.renderPlayers();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
static makeDefaultGameRound(displayOrder) {
|
||||||
|
const newDisplayOrder = displayOrder != null ? displayOrder : 1 + Math.max(rounds.map(round => round[flagDisplayOrder]));
|
||||||
|
return {
|
||||||
|
[attrRoundId]: -newDisplayOrder,
|
||||||
|
[attrGameId]: gameId,
|
||||||
|
[flagNotes]: null,
|
||||||
|
[flagDisplayOrder]: newDisplayOrder,
|
||||||
|
[flagActive]: true
|
||||||
|
};
|
||||||
|
}
|
||||||
hookupPlayerCardEvents() {
|
hookupPlayerCardEvents() {
|
||||||
// Life buttons
|
// Life buttons
|
||||||
let lifeButtonSelector = '.life-btn';
|
let lifeButtonSelector = '.life-btn';
|
||||||
Events.hookupEventHandler("click", lifeButtonSelector, (event, button) => {
|
Events.hookupEventHandler("click", lifeButtonSelector, (event, button) => {
|
||||||
const playerId = button.dataset.playerId;
|
const playerId = button.dataset.playerId;
|
||||||
const amount = parseInt(button.dataset.amount);
|
const amount = parseInt(button.dataset.amount);
|
||||||
const latestRoundId = PageMtgGame.getLatestRoundId();
|
const activeRoundId = PageMtgGame.getActiveRoundId();
|
||||||
const damageIndex = damageRecords.findIndex(damage => damage[attrRoundId] == latestRoundId && damage[attrPlayerId] == playerId && damage[attrReceivedFromCommanderPlayerId] == null);
|
const damageIndex = damageRecords.findIndex(damage => damage[attrRoundId] == activeRoundId && damage[attrPlayerId] == playerId && damage[attrReceivedFromCommanderPlayerId] == null);
|
||||||
this.changeLife(playerId // playerId
|
this.changeLife(playerId // playerId
|
||||||
, amount // amount
|
, amount // amount
|
||||||
, true // updateDamage
|
, true // updateDamage
|
||||||
@@ -1894,6 +1976,7 @@ class PageMtgGame extends TableBasePage {
|
|||||||
if (updateDamage) {
|
if (updateDamage) {
|
||||||
damageRecords[damageIndex][flagHealthChange] += amount;
|
damageRecords[damageIndex][flagHealthChange] += amount;
|
||||||
}
|
}
|
||||||
|
PageMtgGame.renderCommanderDamageLog();
|
||||||
|
|
||||||
// PageMtgGame.debouncedSave();
|
// PageMtgGame.debouncedSave();
|
||||||
this.updateAndToggleShowButtonsSaveCancel();
|
this.updateAndToggleShowButtonsSaveCancel();
|
||||||
@@ -1917,8 +2000,8 @@ class PageMtgGame extends TableBasePage {
|
|||||||
} else {
|
} else {
|
||||||
damageDisplay.classList.remove('lethal');
|
damageDisplay.classList.remove('lethal');
|
||||||
}
|
}
|
||||||
const latestRoundId = PageMtgGame.getLatestRoundId();
|
const activeRoundId = PageMtgGame.getActiveRoundId();
|
||||||
const damageIndex = damageRecords.findIndex(damageRecord => damageRecord[attrRoundId] == latestRoundId && damageRecord[attrPlayerId] == playerId && damageRecord[attrReceivedFromCommanderPlayerId] == sourceId);
|
const damageIndex = damageRecords.findIndex(damageRecord => damageRecord[attrRoundId] == activeRoundId && damageRecord[attrPlayerId] == playerId && damageRecord[attrReceivedFromCommanderPlayerId] == sourceId);
|
||||||
damageRecords[damageIndex][flagHealthChange] -= amount;
|
damageRecords[damageIndex][flagHealthChange] -= amount;
|
||||||
this.changeLife(playerId // playerId
|
this.changeLife(playerId // playerId
|
||||||
, -amount // amount
|
, -amount // amount
|
||||||
@@ -1936,9 +2019,10 @@ class PageMtgGame extends TableBasePage {
|
|||||||
deathDisplay.textContent = newDeaths;
|
deathDisplay.textContent = newDeaths;
|
||||||
DOM.setElementAttributeValueCurrent(deathDisplay, newDeaths);
|
DOM.setElementAttributeValueCurrent(deathDisplay, newDeaths);
|
||||||
DOM.isElementDirty(deathDisplay);
|
DOM.isElementDirty(deathDisplay);
|
||||||
const latestRoundId = PageMtgGame.getLatestRoundId();
|
const activeRoundId = PageMtgGame.getActiveRoundId();
|
||||||
const damageIndex = damageRecords.findIndex(damage => damage[attrRoundId] == latestRoundId && damage[attrPlayerId] == playerId && damage[attrReceivedFromCommanderPlayerId] == null);
|
const damageIndex = damageRecords.findIndex(damage => damage[attrRoundId] == activeRoundId && damage[attrPlayerId] == playerId && damage[attrReceivedFromCommanderPlayerId] == null);
|
||||||
damageRecords[damageIndex][flagCommanderDeaths] = newDeaths;
|
damageRecords[damageIndex][flagCommanderDeaths] = newDeaths;
|
||||||
|
PageMtgGame.renderCommanderDamageLog();
|
||||||
|
|
||||||
// PageMtgGame.debouncedSave();
|
// PageMtgGame.debouncedSave();
|
||||||
this.updateAndToggleShowButtonsSaveCancel();
|
this.updateAndToggleShowButtonsSaveCancel();
|
||||||
@@ -1956,14 +2040,65 @@ class PageMtgGame extends TableBasePage {
|
|||||||
eliminateBtn.textContent = 'Revive';
|
eliminateBtn.textContent = 'Revive';
|
||||||
}
|
}
|
||||||
const isEliminated = card.classList.contains('eliminated');
|
const isEliminated = card.classList.contains('eliminated');
|
||||||
const latestRoundId = PageMtgGame.getLatestRoundId();
|
const activeRoundId = PageMtgGame.getActiveRoundId();
|
||||||
const damageIndex = damageRecords.findIndex(damage => damage[attrRoundId] == latestRoundId && damage[attrPlayerId] == playerId && damage[attrReceivedFromCommanderPlayerId] == null);
|
const damageIndex = damageRecords.findIndex(damage => damage[attrRoundId] == activeRoundId && damage[attrPlayerId] == playerId && damage[attrReceivedFromCommanderPlayerId] == null);
|
||||||
damageRecords[damageIndex][flagIsEliminated] = isEliminated;
|
damageRecords[damageIndex][flagIsEliminated] = isEliminated;
|
||||||
DOM.setElementAttributeValueCurrent(eliminateBtn, isEliminated);
|
DOM.setElementAttributeValueCurrent(eliminateBtn, isEliminated);
|
||||||
DOM.isElementDirty(eliminateBtn);
|
DOM.isElementDirty(eliminateBtn);
|
||||||
|
this.reorderPlayerCards();
|
||||||
|
PageMtgGame.renderCommanderDamageLog();
|
||||||
|
|
||||||
// PageMtgGame.debouncedSave();
|
// PageMtgGame.debouncedSave();
|
||||||
this.updateAndToggleShowButtonsSaveCancel();
|
this.updateAndToggleShowButtonsSaveCancel();
|
||||||
}
|
}
|
||||||
|
reorderPlayerCards() {
|
||||||
|
let playerGrid = document.getElementById('playersGrid');
|
||||||
|
let currentPlayerCards = playerGrid.querySelectorAll('.player-card');
|
||||||
|
let newPlayerCards = [];
|
||||||
|
let playerCardMetas = [];
|
||||||
|
currentPlayerCards.forEach((playerCard, index) => {
|
||||||
|
newPlayerCards.push(playerCard.cloneNode(true));
|
||||||
|
playerCardMetas.push({
|
||||||
|
[flagIsEliminated]: playerCard.classList.contains(flagIsEliminated),
|
||||||
|
[attrPlayerId]: playerCard.dataset["playerId"],
|
||||||
|
[flagDisplayOrder]: index
|
||||||
|
});
|
||||||
|
});
|
||||||
|
let activeRoundId = PageMtgGame.getActiveRoundId();
|
||||||
|
let newPlayerGridInnerHTML = '';
|
||||||
|
let playerIdA, playerIdB, isEliminatedAsIntA, isEliminatedAsIntB, playerA, playerB, indexPlayerCard;
|
||||||
|
playerCardMetas.sort((a, b) => {
|
||||||
|
playerIdA = a[attrPlayerId];
|
||||||
|
playerIdB = b[attrPlayerId];
|
||||||
|
isEliminatedAsIntA = PageMtgGame.isPlayerEliminated(playerIdA, activeRoundId) ? 1 : 0;
|
||||||
|
isEliminatedAsIntB = PageMtgGame.isPlayerEliminated(playerIdB, activeRoundId) ? 1 : 0;
|
||||||
|
playerA = players.filter(p => p[attrPlayerId] == playerIdA)[0];
|
||||||
|
playerB = players.filter(p => p[attrPlayerId] == playerIdB)[0];
|
||||||
|
return players.length * isEliminatedAsIntA + playerA[flagDisplayOrder] - (players.length * isEliminatedAsIntB + playerB[flagDisplayOrder]);
|
||||||
|
}).forEach(playerCardMeta => {
|
||||||
|
indexPlayerCard = playerCardMeta[flagDisplayOrder];
|
||||||
|
newPlayerGridInnerHTML += newPlayerCards[indexPlayerCard].outerHTML;
|
||||||
|
});
|
||||||
|
playerGrid.innerHTML = newPlayerGridInnerHTML;
|
||||||
|
playerGrid.querySelectorAll('.' + flagInitialised).forEach(initialisedElement => {
|
||||||
|
initialisedElement.classList.remove(flagInitialised);
|
||||||
|
});
|
||||||
|
this.hookupPlayerCardEvents();
|
||||||
|
}
|
||||||
|
static isPlayerEliminated(playerId, roundId = null) {
|
||||||
|
if (roundId == null) roundId = PageMtgGame.getActiveRoundId();
|
||||||
|
let hasDamageWithIsEliminated = damageRecords.filter(damage => damage[attrRoundId] <= roundId && damage[attrPlayerId] == playerId && damage[flagIsEliminated]).length > 0;
|
||||||
|
let damageFromOtherPlayers = {};
|
||||||
|
let otherPlayerId;
|
||||||
|
damageRecords.filter(damage => damage[attrRoundId] <= roundId && damage[attrPlayerId] == playerId && damage[attrReceivedFromCommanderPlayerId] != null).forEach(damage => {
|
||||||
|
otherPlayerId = damage[attrReceivedFromCommanderPlayerId];
|
||||||
|
damageFromOtherPlayers[otherPlayerId] = damage[flagHealthChange] + (damageFromOtherPlayers[otherPlayerId] == null ? 0 : damageFromOtherPlayers[otherPlayerId]);
|
||||||
|
});
|
||||||
|
let maxDamageFromOtherCommander = Math.max(Object.keys(damageFromOtherPlayers).map(playerId => damageFromOtherPlayers[playerId]));
|
||||||
|
// .reduce((acc, cur) => acc + cur, 0);
|
||||||
|
let totalDamageTaken = damageRecords.filter(damage => damage[attrRoundId] <= roundId && damage[attrPlayerId] == playerId).map(damage => damage[flagHealthChange]).reduce((acc, cur) => acc + cur, 0);
|
||||||
|
return hasDamageWithIsEliminated || maxDamageFromOtherCommander >= 21 || totalDamageTaken >= startingLife;
|
||||||
|
}
|
||||||
static updatePlayerSetup() {
|
static updatePlayerSetup() {
|
||||||
const playerCountInput = document.getElementById('playerCount');
|
const playerCountInput = document.getElementById('playerCount');
|
||||||
if (!playerCountInput) return;
|
if (!playerCountInput) return;
|
||||||
@@ -2076,12 +2211,12 @@ class PageMtgGame extends TableBasePage {
|
|||||||
self.leave();
|
self.leave();
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
} else {
|
} else {
|
||||||
console.error('Failed to save players:', data[flagMessage]);
|
console.error('Failed to save player damages:', data[flagMessage]);
|
||||||
PageMtgGame.showError('An error occurred while creating the game');
|
PageMtgGame.showError('An error occurred while saving player damages');
|
||||||
}
|
}
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
console.error('Error creating game:', error);
|
console.error('Error saving player damages:', error);
|
||||||
PageMtgGame.showError('An error occurred while creating the game');
|
PageMtgGame.showError('An error occurred while saving player damages');
|
||||||
}).finally(() => {});
|
}).finally(() => {});
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@@ -2232,15 +2367,12 @@ class PageMtgGames extends TableBasePage {
|
|||||||
submitBtn.disabled = true;
|
submitBtn.disabled = true;
|
||||||
const games = [gameData];
|
const games = [gameData];
|
||||||
const comment = 'Create new game';
|
const comment = 'Create new game';
|
||||||
debugger;
|
|
||||||
// const self = this;
|
|
||||||
API.saveGame(games, form, comment).then(data => {
|
API.saveGame(games, form, comment).then(data => {
|
||||||
if (data[flagStatus] == flagSuccess) {
|
if (data[flagStatus] == flagSuccess) {
|
||||||
if (_verbose) {
|
if (_verbose) {
|
||||||
utils_Utils.consoleLogIfNotProductionEnvironment('Records saved!');
|
utils_Utils.consoleLogIfNotProductionEnvironment('Records saved!');
|
||||||
utils_Utils.consoleLogIfNotProductionEnvironment('Data received:', data);
|
utils_Utils.consoleLogIfNotProductionEnvironment('Data received:', data);
|
||||||
}
|
}
|
||||||
// this.callFilterTableContent(data[attrGameId]); // gameData.game_id
|
|
||||||
const gamePageHash = `${hashPageGame}/${data[attrGameId]}`;
|
const gamePageHash = `${hashPageGame}/${data[attrGameId]}`;
|
||||||
let filtersJson = {};
|
let filtersJson = {};
|
||||||
this.leave();
|
this.leave();
|
||||||
|
|||||||
2
static/dist/js/main.bundle.js.map
vendored
2
static/dist/js/main.bundle.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -141,7 +141,6 @@ export default class DOM {
|
|||||||
return returnVal;
|
return returnVal;
|
||||||
}
|
}
|
||||||
static getElementAttributeValueCurrent(element) {
|
static getElementAttributeValueCurrent(element) {
|
||||||
// debugger;
|
|
||||||
if (Validation.isEmpty(element)) return null;
|
if (Validation.isEmpty(element)) return null;
|
||||||
return element.getAttribute(attrValueCurrent);
|
return element.getAttribute(attrValueCurrent);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -236,12 +236,6 @@ export default class TableBasePage extends BasePage {
|
|||||||
}
|
}
|
||||||
let formElement = TableBasePage.getFormFilters();
|
let formElement = TableBasePage.getFormFilters();
|
||||||
let comment = DOM.getElementValueCurrent(document.querySelector(idTextareaConfirm));
|
let comment = DOM.getElementValueCurrent(document.querySelector(idTextareaConfirm));
|
||||||
/*
|
|
||||||
Utils.consoleLogIfNotProductionEnvironment({ formElement, comment, records });
|
|
||||||
Utils.consoleLogIfNotProductionEnvironment('records');
|
|
||||||
Utils.consoleLogIfNotProductionEnvironment(records);
|
|
||||||
debugger;
|
|
||||||
*/
|
|
||||||
this.callSaveTableContent(records, formElement, comment)
|
this.callSaveTableContent(records, formElement, comment)
|
||||||
.then(data => {
|
.then(data => {
|
||||||
if (data[flagStatus] == flagSuccess) {
|
if (data[flagStatus] == flagSuccess) {
|
||||||
|
|||||||
@@ -159,12 +159,38 @@ export default class PageMtgGame extends TableBasePage {
|
|||||||
console.log({ savedPlayers, damageRecords });
|
console.log({ savedPlayers, damageRecords });
|
||||||
|
|
||||||
// Render players to DOM
|
// Render players to DOM
|
||||||
|
const latestRoundId = PageMtgGame.getLatestRoundId();
|
||||||
|
const latestRound = rounds.filter(round => round[attrRoundId] == latestRoundId)[0];
|
||||||
|
const roundDisplayOrderLabel = PageMtgGame.getRoundDisplayOrderLabel();
|
||||||
|
DOM.setElementValuesCurrentAndPrevious(roundDisplayOrderLabel, latestRound[flagDisplayOrder]);
|
||||||
|
|
||||||
this.renderPlayers();
|
this.renderPlayers();
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error loading game from server:', error);
|
console.error('Error loading game from server:', error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
static getRoundDisplayOrderLabel() {
|
||||||
|
return document.querySelector([
|
||||||
|
'#gameSection'
|
||||||
|
, ' > .'
|
||||||
|
, flagRow
|
||||||
|
, '.'
|
||||||
|
, flagRound
|
||||||
|
, ' > .'
|
||||||
|
, flagRow
|
||||||
|
, '.'
|
||||||
|
, flagRound
|
||||||
|
, ' > .'
|
||||||
|
, flagRound
|
||||||
|
, '.'
|
||||||
|
, flagDisplayOrder
|
||||||
|
, ' > span.'
|
||||||
|
, flagRound
|
||||||
|
, '.'
|
||||||
|
, flagDisplayOrder
|
||||||
|
].join(''));
|
||||||
|
}
|
||||||
|
|
||||||
renderPlayers() {
|
renderPlayers() {
|
||||||
const grid = document.getElementById('playersGrid');
|
const grid = document.getElementById('playersGrid');
|
||||||
@@ -182,8 +208,17 @@ export default class PageMtgGame extends TableBasePage {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
*/
|
*/
|
||||||
const latestRoundId = PageMtgGame.getLatestRoundId();
|
|
||||||
|
let activeRoundId = PageMtgGame.getActiveRoundId();
|
||||||
|
const roundDisplayOrderLabel = PageMtgGame.getRoundDisplayOrderLabel();
|
||||||
|
if (activeRoundId < 0) {
|
||||||
|
const currentRoundDisplayOrder = Number(DOM.getElementValueCurrent(roundDisplayOrderLabel));
|
||||||
|
rounds.push(PageMtgGame.makeDefaultGameRound(currentRoundDisplayOrder));
|
||||||
|
activeRoundId = PageMtgGame.getActiveRoundId();
|
||||||
|
}
|
||||||
|
const latestRound = rounds.filter(round => round[attrRoundId] == activeRoundId)[0];
|
||||||
|
DOM.setElementValueCurrent(roundDisplayOrderLabel, latestRound[flagDisplayOrder]);
|
||||||
|
|
||||||
players.forEach((player, index) => {
|
players.forEach((player, index) => {
|
||||||
// Build display name: prefer user_name + deck_name, fallback to player name
|
// Build display name: prefer user_name + deck_name, fallback to player name
|
||||||
const playerId = player[attrPlayerId];
|
const playerId = player[attrPlayerId];
|
||||||
@@ -193,7 +228,7 @@ export default class PageMtgGame extends TableBasePage {
|
|||||||
damagePlayerPairs.forEach(damagePlayerPair => {
|
damagePlayerPairs.forEach(damagePlayerPair => {
|
||||||
const sourceId = damagePlayerPair[attrPlayerId];
|
const sourceId = damagePlayerPair[attrPlayerId];
|
||||||
const filteredPlayerDamages = damageRecords.filter(damage => (
|
const filteredPlayerDamages = damageRecords.filter(damage => (
|
||||||
damage[attrRoundId] == latestRoundId
|
damage[attrRoundId] == activeRoundId
|
||||||
&& damage[attrPlayerId] == playerId
|
&& damage[attrPlayerId] == playerId
|
||||||
&& damage[attrReceivedFromCommanderPlayerId] == sourceId
|
&& damage[attrReceivedFromCommanderPlayerId] == sourceId
|
||||||
)); //[playerId] || {};
|
)); //[playerId] || {};
|
||||||
@@ -229,7 +264,7 @@ export default class PageMtgGame extends TableBasePage {
|
|||||||
const playerOwnDamage = damageRecords.filter(damage => (
|
const playerOwnDamage = damageRecords.filter(damage => (
|
||||||
damage[attrPlayerId] == playerId
|
damage[attrPlayerId] == playerId
|
||||||
&& damage[attrReceivedFromCommanderPlayerId] == null
|
&& damage[attrReceivedFromCommanderPlayerId] == null
|
||||||
&& damage[attrRoundId] == latestRoundId
|
&& damage[attrRoundId] == activeRoundId
|
||||||
))[0];
|
))[0];
|
||||||
const card = document.createElement('div');
|
const card = document.createElement('div');
|
||||||
card.className = `player-card ${isEliminated ? 'eliminated' : ''}`;
|
card.className = `player-card ${isEliminated ? 'eliminated' : ''}`;
|
||||||
@@ -281,11 +316,51 @@ export default class PageMtgGame extends TableBasePage {
|
|||||||
grid.appendChild(card);
|
grid.appendChild(card);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.reorderPlayerCards();
|
||||||
|
|
||||||
|
PageMtgGame.renderCommanderDamageLog();
|
||||||
|
|
||||||
// Hookup all event handlers
|
// Hookup all event handlers
|
||||||
|
this.hookupGameRoundEvents();
|
||||||
this.hookupPlayerCardEvents();
|
this.hookupPlayerCardEvents();
|
||||||
}
|
}
|
||||||
|
static renderCommanderDamageLog() {
|
||||||
|
const roundDisplayOrderLabel = PageMtgGame.getRoundDisplayOrderLabel();
|
||||||
|
const currentRoundDisplayOrder = Number(DOM.getElementValueCurrent(roundDisplayOrderLabel));
|
||||||
|
|
||||||
|
const damageTableBody = document.querySelector('.' + flagDamageLog + '.' + flagContainer + ' table tbody');
|
||||||
|
damageTableBody.innerHTML = '';
|
||||||
|
|
||||||
|
let newTableBodyHtml = '';
|
||||||
|
damageRecords.forEach((damage) => {
|
||||||
|
if (
|
||||||
|
damage[flagActive]
|
||||||
|
&& (
|
||||||
|
damage[flagCommanderDeaths] > 0
|
||||||
|
|| damage[flagHealthChange] != 0
|
||||||
|
|| damage[flagIsEliminated]
|
||||||
|
)
|
||||||
|
&& rounds.filter(r => r[attrRoundId] == damage[attrRoundId])[0][flagDisplayOrder] <= currentRoundDisplayOrder
|
||||||
|
) {
|
||||||
|
let round = rounds.filter(r => r[attrRoundId] == damage[attrRoundId])[0];
|
||||||
|
let player = players.filter(p => p[attrPlayerId] == damage[attrPlayerId])[0];
|
||||||
|
let receivedFromPlayer = (damage[attrReceivedFromCommanderPlayerId] == null) ? { [flagName]: ''} : players.filter(p => p[attrPlayerId] == damage[attrReceivedFromCommanderPlayerId])[0];
|
||||||
|
newTableBodyHtml += `
|
||||||
|
<tr ${attrDamageId}="${damage[attrDamageId]}">
|
||||||
|
<td class="${attrRoundId}">${round[flagDisplayOrder]}</td>
|
||||||
|
<td class="${attrPlayerId}">${player[flagName]}</td>
|
||||||
|
<td class="${attrReceivedFromCommanderPlayerId}">${receivedFromPlayer[flagName]}</td>
|
||||||
|
<td class="${flagHealthChange}">${damage[flagHealthChange]}</td>
|
||||||
|
<td class="${flagCommanderDeaths}">${damage[flagCommanderDeaths]}</td>
|
||||||
|
<td class="${flagIsEliminated}">${damage[flagIsEliminated]}</td>
|
||||||
|
</tr>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
damageTableBody.innerHTML = newTableBodyHtml;
|
||||||
|
}
|
||||||
static makeDefaultGameRoundPlayerDamage(playerId, receivedFromCommanderPlayerId) {
|
static makeDefaultGameRoundPlayerDamage(playerId, receivedFromCommanderPlayerId) {
|
||||||
let roundId = PageMtgGame.getLatestRoundId();
|
let roundId = PageMtgGame.getActiveRoundId();
|
||||||
return {
|
return {
|
||||||
[attrDamageId]: -1 - damageRecords.length
|
[attrDamageId]: -1 - damageRecords.length
|
||||||
, [attrRoundId]: roundId
|
, [attrRoundId]: roundId
|
||||||
@@ -299,9 +374,24 @@ export default class PageMtgGame extends TableBasePage {
|
|||||||
static getLatestRoundId() {
|
static getLatestRoundId() {
|
||||||
let roundId = -1;
|
let roundId = -1;
|
||||||
if (rounds.length > 0) {
|
if (rounds.length > 0) {
|
||||||
let highestRoundDisplayOrder = Math.max(rounds.map(round => { return round[flagDisplayOrder]; }));
|
const highestRoundDisplayOrder = rounds.map(round => { return round[flagDisplayOrder]; })
|
||||||
roundId = rounds.filter(round => round[flagDisplayOrder] == highestRoundDisplayOrder)[0][attrRoundId];
|
.reduce((acc, cur) => Math.max(acc, cur), 0);
|
||||||
console.log({ "method": "getLatestRoundId", highestRoundDisplayOrder, roundId });
|
const filteredRounds = rounds.filter(round => round[flagDisplayOrder] == highestRoundDisplayOrder);
|
||||||
|
if (filteredRounds.length > 0) {
|
||||||
|
roundId = filteredRounds[0][attrRoundId];
|
||||||
|
}
|
||||||
|
console.log({ "method": "getLatestRoundId", highestRoundDisplayOrder, filteredRounds, roundId });
|
||||||
|
}
|
||||||
|
return roundId;
|
||||||
|
}
|
||||||
|
static getActiveRoundId() {
|
||||||
|
const roundDisplayOrderLabel = PageMtgGame.getRoundDisplayOrderLabel();
|
||||||
|
const currentRoundDisplayOrder = Number(DOM.getElementValueCurrent(roundDisplayOrderLabel));
|
||||||
|
let roundId = -1;
|
||||||
|
if (rounds.length > 0) {
|
||||||
|
let filteredRounds = rounds.filter(round => round[flagDisplayOrder] == currentRoundDisplayOrder);
|
||||||
|
if (filteredRounds.length > 0) roundId = filteredRounds[0][attrRoundId];
|
||||||
|
console.log({ "method": "getActiveRoundId", filteredRounds, roundId });
|
||||||
}
|
}
|
||||||
return roundId;
|
return roundId;
|
||||||
}
|
}
|
||||||
@@ -345,15 +435,39 @@ export default class PageMtgGame extends TableBasePage {
|
|||||||
.join('');
|
.join('');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hookupGameRoundEvents() {
|
||||||
|
let incrementRoundButtonSelector = '#gameSection .' + flagRow + '.' + flagRound + ' button.' + flagRoundDisplayOrderButton;
|
||||||
|
Events.hookupEventHandler("click", incrementRoundButtonSelector, (event, button) => {
|
||||||
|
const amount = button.classList.contains(flagRoundDisplayOrderPlus) ? 1 : -1;
|
||||||
|
const roundDisplayOrderButtonContainer = button.parentElement;
|
||||||
|
const roundDisplayOrderLabel = roundDisplayOrderButtonContainer.querySelector('span.' + flagRound + '.' + flagDisplayOrder);
|
||||||
|
const currentRoundDisplayOrder = Number(DOM.getElementValueCurrent(roundDisplayOrderLabel));
|
||||||
|
const newDisplayOrder = currentRoundDisplayOrder + amount;
|
||||||
|
DOM.setElementValueCurrent(roundDisplayOrderLabel, newDisplayOrder);
|
||||||
|
DOM.isElementDirty(roundDisplayOrderLabel);
|
||||||
|
this.updateAndToggleShowButtonsSaveCancel();
|
||||||
|
this.renderPlayers();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
static makeDefaultGameRound(displayOrder) {
|
||||||
|
const newDisplayOrder = (displayOrder != null) ? displayOrder : 1 + Math.max(rounds.map(round => round[flagDisplayOrder]));
|
||||||
|
return {
|
||||||
|
[attrRoundId]: -newDisplayOrder
|
||||||
|
, [attrGameId]: gameId
|
||||||
|
, [flagNotes]: null
|
||||||
|
, [flagDisplayOrder]: newDisplayOrder
|
||||||
|
, [flagActive]: true
|
||||||
|
};
|
||||||
|
}
|
||||||
hookupPlayerCardEvents() {
|
hookupPlayerCardEvents() {
|
||||||
// Life buttons
|
// Life buttons
|
||||||
let lifeButtonSelector = '.life-btn';
|
let lifeButtonSelector = '.life-btn';
|
||||||
Events.hookupEventHandler("click", lifeButtonSelector, (event, button) => {
|
Events.hookupEventHandler("click", lifeButtonSelector, (event, button) => {
|
||||||
const playerId = button.dataset.playerId;
|
const playerId = button.dataset.playerId;
|
||||||
const amount = parseInt(button.dataset.amount);
|
const amount = parseInt(button.dataset.amount);
|
||||||
const latestRoundId = PageMtgGame.getLatestRoundId();
|
const activeRoundId = PageMtgGame.getActiveRoundId();
|
||||||
const damageIndex = damageRecords.findIndex(damage => (
|
const damageIndex = damageRecords.findIndex(damage => (
|
||||||
damage[attrRoundId] == latestRoundId
|
damage[attrRoundId] == activeRoundId
|
||||||
&& damage[attrPlayerId] == playerId
|
&& damage[attrPlayerId] == playerId
|
||||||
&& damage[attrReceivedFromCommanderPlayerId] == null
|
&& damage[attrReceivedFromCommanderPlayerId] == null
|
||||||
));
|
));
|
||||||
@@ -410,6 +524,8 @@ export default class PageMtgGame extends TableBasePage {
|
|||||||
damageRecords[damageIndex][flagHealthChange] += amount;
|
damageRecords[damageIndex][flagHealthChange] += amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PageMtgGame.renderCommanderDamageLog();
|
||||||
|
|
||||||
// PageMtgGame.debouncedSave();
|
// PageMtgGame.debouncedSave();
|
||||||
this.updateAndToggleShowButtonsSaveCancel();
|
this.updateAndToggleShowButtonsSaveCancel();
|
||||||
}
|
}
|
||||||
@@ -436,9 +552,9 @@ export default class PageMtgGame extends TableBasePage {
|
|||||||
damageDisplay.classList.remove('lethal');
|
damageDisplay.classList.remove('lethal');
|
||||||
}
|
}
|
||||||
|
|
||||||
const latestRoundId = PageMtgGame.getLatestRoundId();
|
const activeRoundId = PageMtgGame.getActiveRoundId();
|
||||||
const damageIndex = damageRecords.findIndex(damageRecord => (
|
const damageIndex = damageRecords.findIndex(damageRecord => (
|
||||||
damageRecord[attrRoundId] == latestRoundId
|
damageRecord[attrRoundId] == activeRoundId
|
||||||
&& damageRecord[attrPlayerId] == playerId
|
&& damageRecord[attrPlayerId] == playerId
|
||||||
&& damageRecord[attrReceivedFromCommanderPlayerId] == sourceId
|
&& damageRecord[attrReceivedFromCommanderPlayerId] == sourceId
|
||||||
));
|
));
|
||||||
@@ -465,14 +581,16 @@ export default class PageMtgGame extends TableBasePage {
|
|||||||
DOM.setElementAttributeValueCurrent(deathDisplay, newDeaths);
|
DOM.setElementAttributeValueCurrent(deathDisplay, newDeaths);
|
||||||
DOM.isElementDirty(deathDisplay);
|
DOM.isElementDirty(deathDisplay);
|
||||||
|
|
||||||
const latestRoundId = PageMtgGame.getLatestRoundId();
|
const activeRoundId = PageMtgGame.getActiveRoundId();
|
||||||
const damageIndex = damageRecords.findIndex(damage => (
|
const damageIndex = damageRecords.findIndex(damage => (
|
||||||
damage[attrRoundId] == latestRoundId
|
damage[attrRoundId] == activeRoundId
|
||||||
&& damage[attrPlayerId] == playerId
|
&& damage[attrPlayerId] == playerId
|
||||||
&& damage[attrReceivedFromCommanderPlayerId] == null
|
&& damage[attrReceivedFromCommanderPlayerId] == null
|
||||||
));
|
));
|
||||||
damageRecords[damageIndex][flagCommanderDeaths] = newDeaths;
|
damageRecords[damageIndex][flagCommanderDeaths] = newDeaths;
|
||||||
|
|
||||||
|
PageMtgGame.renderCommanderDamageLog();
|
||||||
|
|
||||||
// PageMtgGame.debouncedSave();
|
// PageMtgGame.debouncedSave();
|
||||||
this.updateAndToggleShowButtonsSaveCancel();
|
this.updateAndToggleShowButtonsSaveCancel();
|
||||||
}
|
}
|
||||||
@@ -493,9 +611,9 @@ export default class PageMtgGame extends TableBasePage {
|
|||||||
}
|
}
|
||||||
const isEliminated = card.classList.contains('eliminated');
|
const isEliminated = card.classList.contains('eliminated');
|
||||||
|
|
||||||
const latestRoundId = PageMtgGame.getLatestRoundId();
|
const activeRoundId = PageMtgGame.getActiveRoundId();
|
||||||
const damageIndex = damageRecords.findIndex(damage => (
|
const damageIndex = damageRecords.findIndex(damage => (
|
||||||
damage[attrRoundId] == latestRoundId
|
damage[attrRoundId] == activeRoundId
|
||||||
&& damage[attrPlayerId] == playerId
|
&& damage[attrPlayerId] == playerId
|
||||||
&& damage[attrReceivedFromCommanderPlayerId] == null
|
&& damage[attrReceivedFromCommanderPlayerId] == null
|
||||||
));
|
));
|
||||||
@@ -503,9 +621,91 @@ export default class PageMtgGame extends TableBasePage {
|
|||||||
|
|
||||||
DOM.setElementAttributeValueCurrent(eliminateBtn, isEliminated);
|
DOM.setElementAttributeValueCurrent(eliminateBtn, isEliminated);
|
||||||
DOM.isElementDirty(eliminateBtn);
|
DOM.isElementDirty(eliminateBtn);
|
||||||
|
|
||||||
|
this.reorderPlayerCards();
|
||||||
|
PageMtgGame.renderCommanderDamageLog();
|
||||||
|
|
||||||
// PageMtgGame.debouncedSave();
|
// PageMtgGame.debouncedSave();
|
||||||
this.updateAndToggleShowButtonsSaveCancel();
|
this.updateAndToggleShowButtonsSaveCancel();
|
||||||
}
|
}
|
||||||
|
reorderPlayerCards() {
|
||||||
|
let playerGrid = document.getElementById('playersGrid');
|
||||||
|
let currentPlayerCards = playerGrid.querySelectorAll('.player-card');
|
||||||
|
let newPlayerCards = [];
|
||||||
|
let playerCardMetas = [];
|
||||||
|
currentPlayerCards.forEach((playerCard, index) => {
|
||||||
|
newPlayerCards.push(playerCard.cloneNode(true));
|
||||||
|
playerCardMetas.push({
|
||||||
|
[flagIsEliminated]: playerCard.classList.contains(flagIsEliminated)
|
||||||
|
, [attrPlayerId]: playerCard.dataset["playerId"]
|
||||||
|
, [flagDisplayOrder]: index
|
||||||
|
});
|
||||||
|
});
|
||||||
|
let activeRoundId = PageMtgGame.getActiveRoundId();
|
||||||
|
let newPlayerGridInnerHTML = '';
|
||||||
|
let playerIdA, playerIdB, isEliminatedAsIntA, isEliminatedAsIntB, playerA, playerB, indexPlayerCard;
|
||||||
|
playerCardMetas.sort((a, b) => {
|
||||||
|
playerIdA = a[attrPlayerId];
|
||||||
|
playerIdB = b[attrPlayerId];
|
||||||
|
isEliminatedAsIntA = PageMtgGame.isPlayerEliminated(playerIdA, activeRoundId) ? 1 : 0;
|
||||||
|
isEliminatedAsIntB = PageMtgGame.isPlayerEliminated(playerIdB, activeRoundId) ? 1 : 0;
|
||||||
|
playerA = players.filter(p => p[attrPlayerId] == playerIdA)[0];
|
||||||
|
playerB = players.filter(p => p[attrPlayerId] == playerIdB)[0];
|
||||||
|
return (
|
||||||
|
players.length * isEliminatedAsIntA
|
||||||
|
+ playerA[flagDisplayOrder]
|
||||||
|
) - (
|
||||||
|
players.length * isEliminatedAsIntB
|
||||||
|
+ playerB[flagDisplayOrder]
|
||||||
|
);
|
||||||
|
}).forEach((playerCardMeta) => {
|
||||||
|
indexPlayerCard = playerCardMeta[flagDisplayOrder];
|
||||||
|
newPlayerGridInnerHTML += newPlayerCards[indexPlayerCard].outerHTML;
|
||||||
|
});
|
||||||
|
|
||||||
|
playerGrid.innerHTML = newPlayerGridInnerHTML;
|
||||||
|
|
||||||
|
playerGrid.querySelectorAll('.' + flagInitialised).forEach((initialisedElement) => {
|
||||||
|
initialisedElement.classList.remove(flagInitialised);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.hookupPlayerCardEvents();
|
||||||
|
}
|
||||||
|
static isPlayerEliminated(playerId, roundId = null) {
|
||||||
|
if (roundId == null) roundId = PageMtgGame.getActiveRoundId();
|
||||||
|
let hasDamageWithIsEliminated = damageRecords.filter(damage => (
|
||||||
|
damage[attrRoundId] <= roundId
|
||||||
|
&& damage[attrPlayerId] == playerId
|
||||||
|
&& damage[flagIsEliminated]
|
||||||
|
)).length > 0;
|
||||||
|
let damageFromOtherPlayers = {};
|
||||||
|
let otherPlayerId;
|
||||||
|
damageRecords.filter(damage => (
|
||||||
|
damage[attrRoundId] <= roundId
|
||||||
|
&& damage[attrPlayerId] == playerId
|
||||||
|
&& damage[attrReceivedFromCommanderPlayerId] != null
|
||||||
|
))
|
||||||
|
.forEach((damage) => {
|
||||||
|
otherPlayerId = damage[attrReceivedFromCommanderPlayerId];
|
||||||
|
damageFromOtherPlayers[otherPlayerId] =
|
||||||
|
damage[flagHealthChange]
|
||||||
|
+ ((damageFromOtherPlayers[otherPlayerId] == null) ? 0 : damageFromOtherPlayers[otherPlayerId]);
|
||||||
|
});
|
||||||
|
let maxDamageFromOtherCommander = Math.max(Object.keys(damageFromOtherPlayers)
|
||||||
|
.map((playerId) => damageFromOtherPlayers[playerId]));
|
||||||
|
// .reduce((acc, cur) => acc + cur, 0);
|
||||||
|
let totalDamageTaken = damageRecords.filter(damage => (
|
||||||
|
damage[attrRoundId] <= roundId
|
||||||
|
&& damage[attrPlayerId] == playerId
|
||||||
|
))
|
||||||
|
.map((damage) => damage[flagHealthChange])
|
||||||
|
.reduce((acc, cur) => acc + cur, 0);
|
||||||
|
return (
|
||||||
|
hasDamageWithIsEliminated
|
||||||
|
|| maxDamageFromOtherCommander >= 21
|
||||||
|
|| totalDamageTaken >= startingLife
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
static updatePlayerSetup() {
|
static updatePlayerSetup() {
|
||||||
const playerCountInput = document.getElementById('playerCount');
|
const playerCountInput = document.getElementById('playerCount');
|
||||||
@@ -636,13 +836,13 @@ export default class PageMtgGame extends TableBasePage {
|
|||||||
window.location.reload();
|
window.location.reload();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
console.error('Failed to save players:', data[flagMessage]);
|
console.error('Failed to save player damages:', data[flagMessage]);
|
||||||
PageMtgGame.showError('An error occurred while creating the game');
|
PageMtgGame.showError('An error occurred while saving player damages');
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
console.error('Error creating game:', error);
|
console.error('Error saving player damages:', error);
|
||||||
PageMtgGame.showError('An error occurred while creating the game');
|
PageMtgGame.showError('An error occurred while saving player damages');
|
||||||
})
|
})
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -118,8 +118,6 @@ export default class PageMtgGames extends TableBasePage {
|
|||||||
|
|
||||||
const games = [gameData];
|
const games = [gameData];
|
||||||
const comment = 'Create new game';
|
const comment = 'Create new game';
|
||||||
debugger;
|
|
||||||
// const self = this;
|
|
||||||
API.saveGame(games, form, comment)
|
API.saveGame(games, form, comment)
|
||||||
.then(data => {
|
.then(data => {
|
||||||
if (data[flagStatus] == flagSuccess) {
|
if (data[flagStatus] == flagSuccess) {
|
||||||
@@ -127,7 +125,6 @@ export default class PageMtgGames extends TableBasePage {
|
|||||||
Utils.consoleLogIfNotProductionEnvironment('Records saved!');
|
Utils.consoleLogIfNotProductionEnvironment('Records saved!');
|
||||||
Utils.consoleLogIfNotProductionEnvironment('Data received:', data);
|
Utils.consoleLogIfNotProductionEnvironment('Data received:', data);
|
||||||
}
|
}
|
||||||
// this.callFilterTableContent(data[attrGameId]); // gameData.game_id
|
|
||||||
const gamePageHash = `${hashPageGame}/${data[attrGameId]}`;
|
const gamePageHash = `${hashPageGame}/${data[attrGameId]}`;
|
||||||
let filtersJson = {};
|
let filtersJson = {};
|
||||||
this.leave();
|
this.leave();
|
||||||
|
|||||||
@@ -21,8 +21,6 @@
|
|||||||
"is_production": "{{ model.app.app_config.is_production | lower }}",
|
"is_production": "{{ model.app.app_config.is_production | lower }}",
|
||||||
"is_development": "{{ model.app.app_config.is_development | lower }}",
|
"is_development": "{{ model.app.app_config.is_development | lower }}",
|
||||||
};
|
};
|
||||||
var flagAccessLevel = "{{ model.FLAG_ACCESS_LEVEL }}";
|
|
||||||
var flagAccessLevelRequired = "{{ model.FLAG_ACCESS_LEVEL_REQUIRED }}";
|
|
||||||
var flagActive = "{{ model.FLAG_ACTIVE }}";
|
var flagActive = "{{ model.FLAG_ACTIVE }}";
|
||||||
var flagActiveOnly = "{{ model.FLAG_ACTIVE_ONLY }}";
|
var flagActiveOnly = "{{ model.FLAG_ACTIVE_ONLY }}";
|
||||||
var flagAdd = "{{ model.FLAG_ADD }}";
|
var flagAdd = "{{ model.FLAG_ADD }}";
|
||||||
@@ -75,7 +73,6 @@
|
|||||||
var flagNameAttrOptionText = "{{ model.FLAG_NAME_ATTR_OPTION_TEXT}}";
|
var flagNameAttrOptionText = "{{ model.FLAG_NAME_ATTR_OPTION_TEXT}}";
|
||||||
var flagNameAttrOptionValue = "{{ model.FLAG_NAME_ATTR_OPTION_VALUE }}";
|
var flagNameAttrOptionValue = "{{ model.FLAG_NAME_ATTR_OPTION_VALUE }}";
|
||||||
var flagNamePlural = "{{ model.FLAG_NAME_PLURAL }}";
|
var flagNamePlural = "{{ model.FLAG_NAME_PLURAL }}";
|
||||||
var flagNavAdminHome = "{{ model.FLAG_NAV_ADMIN_HOME }}";
|
|
||||||
var flagNavMtgDecks = "{{ model.FLAG_NAV_MTG_DECKS }}";
|
var flagNavMtgDecks = "{{ model.FLAG_NAV_MTG_DECKS }}";
|
||||||
var flagNavMtgGame = "{{ model.FLAG_NAV_MTG_GAME }}";
|
var flagNavMtgGame = "{{ model.FLAG_NAV_MTG_GAME }}";
|
||||||
var flagNavMtgGames = "{{ model.FLAG_NAV_MTG_GAMES }}";
|
var flagNavMtgGames = "{{ model.FLAG_NAV_MTG_GAMES }}";
|
||||||
@@ -109,9 +106,6 @@
|
|||||||
var hashGetALTCHAChallenge = "{{ model.HASH_GET_ALTCHA_CHALLENGE }}";
|
var hashGetALTCHAChallenge = "{{ model.HASH_GET_ALTCHA_CHALLENGE }}";
|
||||||
var hashPageAccessibilityReport = "{{ model.HASH_PAGE_ACCESSIBILITY_REPORT }}";
|
var hashPageAccessibilityReport = "{{ model.HASH_PAGE_ACCESSIBILITY_REPORT }}";
|
||||||
var hashPageAccessibilityStatement = "{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}";
|
var hashPageAccessibilityStatement = "{{ model.HASH_PAGE_ACCESSIBILITY_STATEMENT }}";
|
||||||
var hashPageAdminHome = "{{ model.HASH_PAGE_ADMIN_HOME }}";
|
|
||||||
var hashPageContact = "{{ model.HASH_PAGE_CONTACT }}";
|
|
||||||
var hashPageContactSuccess = "{{ model.HASH_PAGE_CONTACT_SUCCESS }}";
|
|
||||||
var hashPageDataRetentionSchedule = "{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}";
|
var hashPageDataRetentionSchedule = "{{ model.HASH_PAGE_DATA_RETENTION_SCHEDULE }}";
|
||||||
var hashPageMtgDecks = "{{ model.HASH_PAGE_MTG_DECKS }}";
|
var hashPageMtgDecks = "{{ model.HASH_PAGE_MTG_DECKS }}";
|
||||||
var hashPageMtgGame = "{{ model.HASH_PAGE_MTG_GAME }}";
|
var hashPageMtgGame = "{{ model.HASH_PAGE_MTG_GAME }}";
|
||||||
|
|||||||
@@ -53,7 +53,22 @@
|
|||||||
|
|
||||||
<!-- Game Section (shown when game is active) -->
|
<!-- Game Section (shown when game is active) -->
|
||||||
<div class="{% if not model.players or model.players|length == 0 %}hidden{% endif %}" id="gameSection">
|
<div class="{% if not model.players or model.players|length == 0 %}hidden{% endif %}" id="gameSection">
|
||||||
|
<div class="{{ model.FLAG_ROW }} {{ model.FLAG_CONTAINER }} {{ model.FLAG_ROUND }}">
|
||||||
|
<div class="{{ model.FLAG_ROW }} {{ model.FLAG_CONTAINER }} {{ model.FLAG_ROUND }}">
|
||||||
|
{#
|
||||||
|
<label class="{{ model.FLAG_ROUND }}">Round</label>
|
||||||
|
<input type="number" id="{{ model.ID_INPUT_ROUND }}" class="{{ model.FLAG_ROUND }}" />
|
||||||
|
#}
|
||||||
|
<span class="{{ model.FLAG_ROUND }} {{ model.FLAG_DISPLAY_ORDER }}">Round:</span>
|
||||||
|
<div class="{{ model.FLAG_ROUND }} {{ model.FLAG_DISPLAY_ORDER}}">
|
||||||
|
<button class="{{ model.FLAG_ROUND_DISPLAY_ORDER_BUTTON }} {{ model.FLAG_ROUND_DISPLAY_ORDER_MINUS }}">−</button>
|
||||||
|
<span class="{{ model.FLAG_ROUND }} {{ model.FLAG_DISPLAY_ORDER }}"></span>
|
||||||
|
<button class="{{ model.FLAG_ROUND_DISPLAY_ORDER_BUTTON }} {{ model.FLAG_ROUND_DISPLAY_ORDER_PLUS }}">+</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="players-grid" id="playersGrid">
|
<div class="players-grid" id="playersGrid">
|
||||||
|
{#
|
||||||
{% for player in model.players %}
|
{% for player in model.players %}
|
||||||
{% set player_damage = [] %}
|
{% set player_damage = [] %}
|
||||||
{% for damage in model.damage_records %}
|
{% for damage in model.damage_records %}
|
||||||
@@ -108,9 +123,27 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
#}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="{{ model.FLAG_DAMAGE_LOG }} {{ model.FLAG_CONTAINER }}">
|
||||||
|
<h2 class="tcg-section-title">Damage Log</h2>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="{{ model.ATTR_ROUND_ID }}">Round</th>
|
||||||
|
<th class="{{ model.ATTR_PLAYER_ID }}">Player</th>
|
||||||
|
<th class="{{ model.ATTR_RECEIVED_FROM_COMMANDER_PLAYER_ID }}">Received From Commander</th>
|
||||||
|
<th class="{{ model.FLAG_HEALTH_CHANGE }}">Health Change</th>
|
||||||
|
<th class="{{ model.FLAG_COMMANDER_DEATHS }}">Commander Deaths</th>
|
||||||
|
<th class="{{ model.FLAG_IS_ELIMINATED }}">Is Eliminated</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody></tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="save-indicator" id="saveIndicator">Game Saved</div>
|
<div class="save-indicator" id="saveIndicator">Game Saved</div>
|
||||||
|
|
||||||
<div id="{{ model.PLAYER_SETUP_WRAPPER_TEMPLATE_ID }}" class="player-name-input-wrapper {{ model.FLAG_IS_COLLAPSED }}">
|
<div id="{{ model.PLAYER_SETUP_WRAPPER_TEMPLATE_ID }}" class="player-name-input-wrapper {{ model.FLAG_IS_COLLAPSED }}">
|
||||||
@@ -147,9 +180,13 @@
|
|||||||
var attrReceivedFromCommanderPlayerId = "{{ model.ATTR_RECEIVED_FROM_COMMANDER_PLAYER_ID }}";
|
var attrReceivedFromCommanderPlayerId = "{{ model.ATTR_RECEIVED_FROM_COMMANDER_PLAYER_ID }}";
|
||||||
var damageRecords = {{ model.convert_list_objects_to_json(model.damage_records) | tojson | safe }};
|
var damageRecords = {{ model.convert_list_objects_to_json(model.damage_records) | tojson | safe }};
|
||||||
var decks = {{ model.convert_list_objects_to_json(model.decks) | tojson | safe }};
|
var decks = {{ model.convert_list_objects_to_json(model.decks) | tojson | safe }};
|
||||||
|
var flagDamageLog = "{{ model.FLAG_DAMAGE_LOG }}";
|
||||||
var flagDisplayOrder = "{{ model.FLAG_DISPLAY_ORDER }}";
|
var flagDisplayOrder = "{{ model.FLAG_DISPLAY_ORDER }}";
|
||||||
var flagHealthChange = "{{ model.FLAG_HEALTH_CHANGE }}";
|
var flagHealthChange = "{{ model.FLAG_HEALTH_CHANGE }}";
|
||||||
var flagIsEliminated = "{{ model.FLAG_IS_ELIMINATED }}";
|
var flagIsEliminated = "{{ model.FLAG_IS_ELIMINATED }}";
|
||||||
|
var flagRoundDisplayOrderButton = "{{ model.FLAG_ROUND_DISPLAY_ORDER_BUTTON }}";
|
||||||
|
var flagRoundDisplayOrderMinus = "{{ model.FLAG_ROUND_DISPLAY_ORDER_MINUS }}";
|
||||||
|
var flagRoundDisplayOrderPlus = "{{ model.FLAG_ROUND_DISPLAY_ORDER_PLUS }}";
|
||||||
var flagPlayer = "{{ model.FLAG_PLAYER }}";
|
var flagPlayer = "{{ model.FLAG_PLAYER }}";
|
||||||
var game = {{ model.game.to_json() | tojson | safe }};
|
var game = {{ model.game.to_json() | tojson | safe }};
|
||||||
var gameId = {{ model.game.game_id }};
|
var gameId = {{ model.game.game_id }};
|
||||||
@@ -157,6 +194,7 @@
|
|||||||
var hashSaveGameRound = "{{ model.HASH_SAVE_MTG_GAME_ROUND }}";
|
var hashSaveGameRound = "{{ model.HASH_SAVE_MTG_GAME_ROUND }}";
|
||||||
var hashSaveGameRoundPlayerDamage = "{{ model.HASH_SAVE_MTG_GAME_ROUND_PLAYER_DAMAGE }}";
|
var hashSaveGameRoundPlayerDamage = "{{ model.HASH_SAVE_MTG_GAME_ROUND_PLAYER_DAMAGE }}";
|
||||||
var hashPageGames = "{{ model.HASH_PAGE_MTG_GAMES }}";
|
var hashPageGames = "{{ model.HASH_PAGE_MTG_GAMES }}";
|
||||||
|
var idInputRound = "#{{ model.ID_INPUT_ROUND }}";
|
||||||
var players = {{ model.convert_list_objects_to_json(model.players) | tojson | safe }};
|
var players = {{ model.convert_list_objects_to_json(model.players) | tojson | safe }};
|
||||||
var playerSetupWrapperTemplateId = "{{ model.PLAYER_SETUP_WRAPPER_TEMPLATE_ID }}";
|
var playerSetupWrapperTemplateId = "{{ model.PLAYER_SETUP_WRAPPER_TEMPLATE_ID }}";
|
||||||
var rounds = {{ model.convert_list_objects_to_json(model.rounds) | tojson | safe }};
|
var rounds = {{ model.convert_list_objects_to_json(model.rounds) | tojson | safe }};
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Filters Form -->
|
<!-- Filters Form -->
|
||||||
<form id="{{ model.ID_FORM_FILTERS }}" class="filters-form">
|
<form id="{{ model.ID_FORM_FILTERS }}" class="{{ model.FLAG_FORM_FILTERS }} {{ model.FLAG_IS_COLLAPSED }}">
|
||||||
{{ model.form_filters.hidden_tag() }}
|
{{ model.form_filters.hidden_tag() }}
|
||||||
<div class="filters-row">
|
<div class="filters-row">
|
||||||
<div class="filter-group">
|
<div class="filter-group">
|
||||||
|
|||||||
Reference in New Issue
Block a user