new-project.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // JS pour la view projects/new
  2. (function(){
  3. var templates = {
  4. desert: { title: 'Paysage désertique', description: 'Terrain sablonneux avec dunes et oasis occasionnelles', emoji: '🏜️' },
  5. coastal: { title: 'Paysage littoral', description: 'Côtes avec plages, falaises et éléments marins', emoji: '🏖️' },
  6. mountain: { title: 'Paysage de montagne', description: 'Reliefs escarpés avec sommets enneigés et vallées', emoji: '🏔️' },
  7. rural: { title: 'Paysage rural', description: 'Champs, forêts et éléments agricoles traditionnels', emoji: '🌾' },
  8. urban: { title: 'Paysage urbain', description: 'Villes avec bâtiments, routes et infrastructures modernes', emoji: '🏙️' }
  9. };
  10. var mapTemplateEl = document.getElementById('mapTemplate');
  11. if (mapTemplateEl) {
  12. mapTemplateEl.addEventListener('change', function() {
  13. var selectedTemplate = this.value;
  14. var previewDiv = document.getElementById('templatePreview');
  15. var templateImage = document.getElementById('templateImage');
  16. var templateTitle = document.getElementById('templateTitle');
  17. var templateDescription = document.getElementById('templateDescription');
  18. if (selectedTemplate && templates[selectedTemplate]) {
  19. var t = templates[selectedTemplate];
  20. templateImage.innerHTML = '<span style="font-size: 3rem;">' + t.emoji + '</span>';
  21. templateTitle.textContent = t.title;
  22. templateDescription.textContent = t.description;
  23. previewDiv.style.display = 'block';
  24. } else {
  25. previewDiv.style.display = 'none';
  26. }
  27. });
  28. }
  29. // Gestion des presets hexagonaux et synchronisation du radius
  30. var hexPresets = document.getElementById('hexPresets');
  31. var hexRadius = document.getElementById('hexRadius');
  32. function hexCellsFromRadius(r) {
  33. // Formule nombre d'hexagones pour un rayon r : 1 + 3r(r+1)
  34. r = parseInt(r, 10) || 0;
  35. return 1 + 3 * r * (r + 1);
  36. }
  37. // Mettre à jour le champ radius caché quand le preset change
  38. if (hexRadius) {
  39. hexRadius.addEventListener('change', function() {
  40. var r = parseInt(this.value, 10) || 0;
  41. var radiusInput = document.getElementById('radiusInput');
  42. if (radiusInput) radiusInput.value = r;
  43. // redraw preview
  44. drawHexPreview(r);
  45. });
  46. }
  47. // Dessiner un aperçu SVG exact en maillage hexagonal (pointy-top)
  48. function drawHexPreview(radius) {
  49. var container = document.getElementById('hexPreview');
  50. if (!container) return;
  51. container.innerHTML = '';
  52. var svgNS = 'http://www.w3.org/2000/svg';
  53. var svg = document.createElementNS(svgNS, 'svg');
  54. svg.setAttribute('width', '100%');
  55. svg.setAttribute('height', '100%');
  56. svg.setAttribute('viewBox', '0 0 100 100');
  57. // Générer coordonnées axiales des hexagones pour un rayon donné
  58. var cells = [];
  59. for (var q = -radius; q <= radius; q++) {
  60. var r1 = Math.max(-radius, -q - radius);
  61. var r2 = Math.min(radius, -q + radius);
  62. for (var r = r1; r <= r2; r++) {
  63. cells.push({q: q, r: r});
  64. }
  65. }
  66. // Paramètres visuels : on va centrer et scaler dans le viewBox 0..100
  67. var N = cells.length;
  68. // Pour positionner les hex, utiliser conversion axial -> pixel pour pointy-top
  69. function hexToPixel(q, r, size) {
  70. var x = size * Math.sqrt(3) * (q + r/2);
  71. var y = size * 3/2 * r;
  72. return { x: x, y: y };
  73. }
  74. // Taille estimée : calculer bounding box non-scalée
  75. var size = 1; // unité
  76. var points = cells.map(function(c) { return hexToPixel(c.q, c.r, size); });
  77. var xs = points.map(p => p.x);
  78. var ys = points.map(p => p.y);
  79. var minX = Math.min.apply(null, xs);
  80. var maxX = Math.max.apply(null, xs);
  81. var minY = Math.min.apply(null, ys);
  82. var maxY = Math.max.apply(null, ys);
  83. var width = maxX - minX || 1;
  84. var height = maxY - minY || 1;
  85. // Définir un scale pour remplir le viewBox (tous en %) avec marges
  86. var padding = 6; // % padding
  87. var avail = 100 - 2*padding;
  88. var scale = Math.min(avail / width, avail / height);
  89. // Size (pixel unit in viewBox coords)
  90. var hexSize = scale * 0.9; // ajustement visuel
  91. // Center offset
  92. var offsetX = (100 - (width * scale)) / 2 - minX * scale;
  93. var offsetY = (100 - (height * scale)) / 2 - minY * scale;
  94. // Fonction pour dessiner un hexagon pointy-top at (cx,cy) with size s
  95. function hexPoints(cx, cy, s) {
  96. var pts = [];
  97. for (var i = 0; i < 6; i++) {
  98. var angle_deg = 60 * i - 30;
  99. var angle_rad = Math.PI / 180 * angle_deg;
  100. var x = cx + s * Math.cos(angle_rad);
  101. var y = cy + s * Math.sin(angle_rad);
  102. pts.push(x + ',' + y);
  103. }
  104. return pts.join(' ');
  105. }
  106. // Draw each hex
  107. cells.forEach(function(c, idx) {
  108. var p = hexToPixel(c.q, c.r, size);
  109. var cx = p.x * scale + offsetX;
  110. var cy = p.y * scale + offsetY;
  111. var s = hexSize / 2; // visual half-size
  112. var poly = document.createElementNS(svgNS, 'polygon');
  113. poly.setAttribute('points', hexPoints(cx, cy, s));
  114. poly.setAttribute('fill', '#e9ecef');
  115. poly.setAttribute('stroke', '#6c757d');
  116. poly.setAttribute('stroke-width', Math.max(0.2, s * 0.05));
  117. poly.setAttribute('opacity', '0.95');
  118. svg.appendChild(poly);
  119. });
  120. container.appendChild(svg);
  121. }
  122. // initial draw (respecter la valeur par défaut du select)
  123. if (hexRadius) drawHexPreview(parseInt(hexRadius.value,10));
  124. var form = document.getElementById('newProjectForm');
  125. if (form) {
  126. form.addEventListener('submit', function(e) {
  127. var name = (document.getElementById('mapName').value || '').trim();
  128. var radius = parseInt((document.getElementById('radiusInput') || {}).value, 10) || 0;
  129. if (!name) {
  130. alert('Veuillez saisir un nom pour votre carte.');
  131. e.preventDefault();
  132. return;
  133. }
  134. // Validation radius (1..15)
  135. if (radius < 1 || radius > 15) {
  136. alert('Le rayon doit être compris entre 1 et 15.');
  137. e.preventDefault();
  138. return;
  139. }
  140. // Log pour debug
  141. console.log('Création du projet (radius):', { name: name, radius: radius, template: document.getElementById('mapTemplate').value });
  142. });
  143. }
  144. })();