Alpha V2.5.4

This commit is contained in:
Flatlogic Bot 2026-03-06 10:07:39 +00:00
parent 10f9e8ec3f
commit 81cfad2a9e
4 changed files with 162 additions and 16 deletions

View File

@ -29,11 +29,27 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$error = 'Ce nom d\'utilisateur ou cet email est déjà utilisé.';
} else {
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
$stmt = $db->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
try {
$db->beginTransaction();
$stmt = $db->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->execute([$username, $email, $hashed_password]);
$new_user_id = $db->lastInsertId();
// Initialize resources for the new user
$resources = $db->query("SELECT id, slug FROM game_resources")->fetchAll(PDO::FETCH_ASSOC);
$res_stmt = $db->prepare("INSERT INTO user_resources (user_id, resource_id, amount) VALUES (?, ?, ?)");
foreach ($resources as $resource) {
$initialAmount = ($resource['slug'] === 'res_xp') ? 1 : 0;
$res_stmt->execute([$new_user_id, $resource['id'], $initialAmount]);
}
$db->commit();
$success = 'Compte créé avec succès ! Vous pouvez maintenant vous connecter.';
} catch (Exception $e) {
$db->rollBack();
$error = 'Erreur lors de la création du compte.';
}
}
@ -166,4 +182,4 @@ $page = $_GET['page'] ?? 'login';
<a href="index.php" class="back-link"><i class="fa-solid fa-arrow-left"></i> Retour à la galaxie</a>
</div>
</body>
</html>
</html>

View File

@ -0,0 +1,42 @@
<?php
require_once __DIR__ . '/config.php';
$db = db();
try {
// 1. Create the user_resources table
$db->exec("CREATE TABLE IF NOT EXISTS user_resources (
user_id INT NOT NULL,
resource_id INT NOT NULL,
amount BIGINT UNSIGNED NOT NULL DEFAULT 0,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (user_id, resource_id),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (resource_id) REFERENCES game_resources(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
echo "Table user_resources created (if it did not exist).\n";
// 2. Get all users and all resources
$users = $db->query("SELECT id FROM users")->fetchAll(PDO::FETCH_COLUMN);
$resources = $db->query("SELECT id, slug FROM game_resources")->fetchAll(PDO::FETCH_ASSOC);
if (empty($users) || empty($resources)) {
echo "No users or resources found to initialize.\n";
} else {
// 3. Initialize resources for each user
$stmt = $db->prepare("INSERT IGNORE INTO user_resources (user_id, resource_id, amount) VALUES (?, ?, ?)");
foreach ($users as $userId) {
foreach ($resources as $resource) {
$initialAmount = ($resource['slug'] === 'res_xp') ? 1 : 0;
$stmt->execute([$userId, $resource['id'], $initialAmount]);
}
}
echo "Resources initialized for " . count($users) . " users.\n";
}
echo "Migration completed successfully.\n";
} catch (PDOException $e) {
die("Migration failed: " . $e->getMessage() . "\n");
}

View File

@ -6,11 +6,36 @@ $db = db();
$user_role = 'user';
if (isset($_SESSION['user_id'])) {
$stmt = $db->prepare("SELECT role FROM users WHERE id = ?");
$stmt = $db->prepare("SELECT u.role, u.display_name, u.username, l.name as level_raw
FROM users u
LEFT JOIN levels l ON u.level_id = l.id
WHERE u.id = ?");
$stmt->execute([$_SESSION['user_id']]);
$u_data = $stmt->fetch();
$stmt = $db->prepare("SELECT u.level, u.grade, g.name as grade_name, g.image_url as grade_image FROM users u LEFT JOIN grades g ON u.grade = g.slug WHERE u.id = ?"); $stmt->execute([$_SESSION["user_id"]]); $extra = $stmt->fetch(); $_SESSION["level"] = $extra["level"]; $_SESSION["grade_name"] = $extra["grade_name"]; $_SESSION["grade_image"] = $extra["grade_image"];
$user_role = $u_data['role'] ?? 'user';
if ($u_data) {
$user_role = $u_data['role'] ?? 'user';
$_SESSION['display_name'] = $u_data['display_name'] ?: $u_data['username'];
$level_num = (int)filter_var($u_data['level_raw'], FILTER_SANITIZE_NUMBER_INT);
$_SESSION['level'] = $level_num;
$grade_type = ($user_role === 'admin') ? 'admin' : 'utilisateur';
$g_stmt = $db->prepare("SELECT name, image_url FROM grades
WHERE user_type = ?
AND (min_level <= ? OR min_level IS NULL)
AND (max_level >= ? OR max_level IS NULL)
LIMIT 1");
$g_stmt->execute([$grade_type, $level_num, $level_num]);
$grade_data = $g_stmt->fetch();
if ($grade_data) {
$_SESSION['grade_name'] = $grade_data['name'];
$_SESSION['grade_image'] = $grade_data['image_url'];
} else {
$_SESSION['grade_name'] = "Recrue";
$_SESSION['grade_image'] = "assets/images/placeholder_grade.png";
}
}
}
$view = isset($_GET['view']) ? $_GET['view'] : 'sector';
@ -37,9 +62,38 @@ $factions_map = []; foreach($factions_db as $f) $factions_map[$f['id']] = $f;
// Grid size: 6x6 = 36 slots per sector
$grid_size = 36;
// Mock Resources
$header_resources = $db->query("SELECT * FROM game_resources WHERE show_in_header = 1 ORDER BY CASE WHEN name = 'Crédits' THEN 1 WHEN name = 'Materials' THEN 2 WHEN name = 'Energie' THEN 3 WHEN name = 'Données' THEN 4 ELSE 5 END ASC, name ASC")->fetchAll(PDO::FETCH_ASSOC);
$resources = []; foreach($header_resources as $hr) { $resources[$hr["name"]] = ["val" => "0", "prod" => "", "icon" => $hr["icon"] ?: "fa-gem", "image" => $hr["image_url"]]; }
// Dynamic Resources
$resources = [];
if (isset($_SESSION['user_id'])) {
$stmt = $db->prepare("
SELECT gr.*, COALESCE(ur.amount, 0) as amount
FROM game_resources gr
LEFT JOIN user_resources ur ON gr.id = ur.resource_id AND ur.user_id = ?
WHERE gr.show_in_header = 1
ORDER BY CASE
WHEN gr.name = 'Crédits' THEN 1
WHEN gr.name = 'Materials' THEN 2
WHEN gr.name = 'Energie' THEN 3
WHEN gr.name = 'Données' THEN 4
ELSE 5
END ASC, gr.name ASC
");
$stmt->execute([$_SESSION['user_id']]);
$header_resources = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($header_resources as $hr) {
$resources[$hr["name"]] = [
"val" => (string)$hr["amount"],
"prod" => "",
"icon" => $hr["icon"] ?: "fa-gem",
"image" => $hr["image_url"]
];
}
} else {
$header_resources = $db->query("SELECT * FROM game_resources WHERE show_in_header = 1 ORDER BY CASE WHEN name = 'Crédits' THEN 1 WHEN name = 'Materials' THEN 2 WHEN name = 'Energie' THEN 3 WHEN name = 'Données' THEN 4 ELSE 5 END ASC, name ASC")->fetchAll(PDO::FETCH_ASSOC);
foreach($header_resources as $hr) {
$resources[$hr["name"]] = ["val" => "0", "prod" => "", "icon" => $hr["icon"] ?: "fa-gem", "image" => $hr["image_url"]];
}
}
if ($view === 'sector') {
$stmt = $db->prepare("SELECT * FROM planets WHERE galaxy_id = ? AND sector_id = ? AND slot BETWEEN 1 AND ?");
@ -941,15 +995,16 @@ function getStatusColor($status, $statuses_map) {
<h2>Profil Public</h2>
<button class="modal-close" onclick="document.getElementById('profileModal').style.display='none'">&times;</button>
</div>
<div class="modal-body" style="text-align: center;">
<div style="font-size: 24px; margin-bottom: 20px; color: #fff;">
<?php echo htmlspecialchars($_SESSION["grade_name"] ?? "N/A"); ?> <?php echo htmlspecialchars($_SESSION["display_name"] ?? $_SESSION["username"]); ?>
<div class="modal-body" style="text-align: center; padding-top: 40px; padding-bottom: 40px;">
<div style="display: flex; align-items: center; justify-content: center; gap: 15px; margin-bottom: 10px;">
<img src="<?php echo htmlspecialchars($_SESSION["grade_image"] ?? "assets/images/placeholder_grade.png"); ?>" style="width: 60px; height: 60px; object-fit: contain;">
<span style="font-size: 28px; font-weight: bold; color: #fff;">
<?php echo htmlspecialchars($_SESSION["grade_name"] ?? "Recrue"); ?>
<?php echo htmlspecialchars($_SESSION["display_name"] ?? $_SESSION["username"]); ?>
</span>
</div>
<div style="margin-bottom: 20px;">
<img src="<?php echo htmlspecialchars($_SESSION["grade_image"] ?? "assets/images/placeholder_grade.png"); ?>" style="width:100px; height:100px;">
</div>
<div class="stat-card" style="text-align: center; font-size: 18px; color: #88c0d0;">
Niveau <?php echo htmlspecialchars($_SESSION["level"] ?? "N/A"); ?>
<div style="font-size: 16px; color: #88c0d0; opacity: 0.8;">
Niveau <?php echo htmlspecialchars($_SESSION["level"] ?? "1"); ?>
</div>
</div>
</div>

33
patch_resources_v2.php Normal file
View File

@ -0,0 +1,33 @@
// Dynamic Resources
$resources = [];
if (isset($_SESSION['user_id'])) {
$stmt = $db->prepare("
SELECT gr.*, COALESCE(ur.amount, 0) as amount
FROM game_resources gr
LEFT JOIN user_resources ur ON gr.id = ur.resource_id AND ur.user_id = ?
WHERE gr.show_in_header = 1
ORDER BY CASE
WHEN gr.name = 'Crédits' THEN 1
WHEN gr.name = 'Materials' THEN 2
WHEN gr.name = 'Energie' THEN 3
WHEN gr.name = 'Données' THEN 4
ELSE 5
END ASC, gr.name ASC
");
$stmt->execute([$_SESSION['user_id']]);
$header_resources = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($header_resources as $hr) {
$resources[$hr["name"]] = [
"val" => (string)$hr["amount"],
"prod" => "",
"icon" => $hr["icon"] ?: "fa-gem",
"image" => $hr["image_url"]
];
}
} else {
// Fallback for guests (all 0)
$header_resources = $db->query("SELECT * FROM game_resources WHERE show_in_header = 1 ORDER BY CASE WHEN name = 'Crédits' THEN 1 WHEN name = 'Materials' THEN 2 WHEN name = 'Energie' THEN 3 WHEN name = 'Données' THEN 4 ELSE 5 END ASC, name ASC")->fetchAll(PDO::FETCH_ASSOC);
foreach($header_resources as $hr) {
$resources[$hr["name"]] = ["val" => "0", "prod" => "", "icon" => $hr["icon"] ?: "fa-gem", "image" => $hr["image_url"]];
}
}