fix: preserve gameplay data and correct duel evaluation
- Preserve snake customizations across database migrations and merges. - Lazily load optional storage backends for SQLite maintenance scripts. - Match Apex territory and nearest-food tie-breaking semantics. - Resolve duel occupancy after simultaneous movement and food growth. - Recompute simulated head-to-head danger after body growth. - Add regression coverage and declare the aiofiles dependency.
This commit is contained in:
@@ -117,15 +117,26 @@ def copy_game_snakes(source:sqlite3.Connection, destination:sqlite3.Connection,
|
||||
"SELECT 1 FROM sqlite_master WHERE type='table' AND name='game_snakes'"
|
||||
).fetchone()
|
||||
if has_table:
|
||||
cursor = source.execute(
|
||||
"SELECT game_id, snake_id, snake_name, is_you FROM game_snakes ORDER BY game_id, snake_id"
|
||||
columns = object_columns(source, "game_snakes")
|
||||
customizations = (
|
||||
"COALESCE(customizations_json, '{}') AS customizations_json"
|
||||
if "customizations_json" in columns else "'{}' AS customizations_json"
|
||||
)
|
||||
cursor = source.execute(f"""
|
||||
SELECT game_id, snake_id, snake_name, is_you, {customizations}
|
||||
FROM game_snakes ORDER BY game_id, snake_id
|
||||
""")
|
||||
else:
|
||||
cursor = source.execute("""
|
||||
SELECT game_id, snake_id, MAX(snake_name), MAX(is_you)
|
||||
SELECT game_id, snake_id, MAX(snake_name), MAX(is_you),
|
||||
'{}' AS customizations_json
|
||||
FROM snake_turns GROUP BY game_id, snake_id ORDER BY game_id, snake_id
|
||||
""")
|
||||
sql = "INSERT INTO game_snakes (game_id,snake_id,snake_name,is_you) VALUES (?,?,?,?)"
|
||||
sql = """
|
||||
INSERT INTO game_snakes (
|
||||
game_id,snake_id,snake_name,is_you,customizations_json
|
||||
) VALUES (?,?,?,?,?)
|
||||
"""
|
||||
count = 0
|
||||
while rows := cursor.fetchmany(batch_size):
|
||||
values = [tuple(row) for row in rows if row[0] in allowed]
|
||||
|
||||
@@ -144,20 +144,27 @@ def copy_game_snakes(source:sqlite3.Connection, destination:sqlite3.Connection,
|
||||
SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'game_snakes'
|
||||
""").fetchone() is not None
|
||||
if has_game_snakes:
|
||||
cursor = source.execute("""
|
||||
SELECT game_id, snake_id, snake_name, is_you
|
||||
columns = object_columns(source, "game_snakes")
|
||||
customizations = (
|
||||
"COALESCE(customizations_json, '{}') AS customizations_json"
|
||||
if "customizations_json" in columns else "'{}' AS customizations_json"
|
||||
)
|
||||
cursor = source.execute(f"""
|
||||
SELECT game_id, snake_id, snake_name, is_you, {customizations}
|
||||
FROM game_snakes ORDER BY game_id, snake_id
|
||||
""")
|
||||
else:
|
||||
cursor = source.execute("""
|
||||
SELECT game_id, snake_id, MAX(snake_name), MAX(is_you)
|
||||
SELECT game_id, snake_id, MAX(snake_name), MAX(is_you),
|
||||
'{}' AS customizations_json
|
||||
FROM snake_turns
|
||||
GROUP BY game_id, snake_id
|
||||
ORDER BY game_id, snake_id
|
||||
""")
|
||||
sql = """
|
||||
INSERT INTO game_snakes (game_id, snake_id, snake_name, is_you)
|
||||
VALUES (?, ?, ?, ?)
|
||||
INSERT INTO game_snakes (
|
||||
game_id, snake_id, snake_name, is_you, customizations_json
|
||||
) VALUES (?, ?, ?, ?, ?)
|
||||
"""
|
||||
count = 0
|
||||
while rows := cursor.fetchmany(batch_size):
|
||||
|
||||
Reference in New Issue
Block a user