@sancti0n/nikke-utils 1.0.11 → 1.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sancti0n/nikke-utils",
3
- "version": "1.0.11",
3
+ "version": "1.0.12",
4
4
  "type": "module",
5
5
  "description": "Un kit complet pour les développeurs Nikke: Goddess of Victory",
6
6
  "repository": {
@@ -176,6 +176,7 @@ const characters = [
176
176
  { id: 173, name: "Yuni", rarity: "SSR", burst: "II", element: "Fire", manufacturer: "Missilis Industry", class: "Defender", weapon: "Rocket Launcher", squad: "Wardress", specialties: { 1: "Buffer", 2: "Crowd Controller", 3: "Debuffer", 4: "Healer" }, treasure: "no", reEnterBurstSkill: "no", canChangeBurstStageThreeToOne: "no", cooldown: { "II": 20 }, dateAdded: "2022-11-04" },
177
177
  { id: 174, name: "Zwei", rarity: "SSR", burst: "I", element: "Electric", manufacturer: "Elysion", class: "Supporter", weapon: "Shotgun", squad: "School Circle", specialties: { 1: "Buffer", 2: "Cover Heal", 3: "Pierce" }, treasure: "no", reEnterBurstSkill: "no", canChangeBurstStageThreeToOne: "no", cooldown: { "I": 20 }, dateAdded: "2024-08-08" },
178
178
  { id: 175, name: "Chime", rarity: "SSR", burst: "II", element: "Iron", manufacturer: "Pilgrim", class: "Supporter", weapon: "Sub Machine Gun", squad: "White Knight", specialties: { 1: "Buffer" }, treasure: "no", reEnterBurstSkill: "yes", canChangeBurstStageThreeToOne: "no", cooldown: { "II": 20 }, dateAdded: "2025-10-30" },
179
+ { id: 176, name: "Diesel: Winter Sweets", rarity: "SSR", burst: "III", element: "Fire", manufacturer: "Elysion", class: "Attacker", weapon: "Rocket Launcher", squad: "Infinity Rail", specialties: {}, treasure: "no", reEnterBurstSkill: "no", canChangeBurstStageThreeToOne: "no", cooldown: { "III": 40 }, dateAdded: "2025-12-04" },
179
180
  ];
180
181
 
181
182
  export function getAllNikkes() {
@@ -186,11 +187,21 @@ export function getNikkeByName(name) {
186
187
  return characters.find(char => char.name.toLowerCase() === name.toLowerCase());
187
188
  }
188
189
 
189
- export function getAllElementOfThisField(array, field) {
190
+ export function getAllElementOfThisField(field) {
190
191
  let t = [];
191
- for (let i = 0; i < array.length; i++) {
192
- if (t.indexOf(array[i][field]) < 0) {
193
- t.push(array[i][field]);
192
+ for (let i = 0; i < characters.length; i++) {
193
+ if (t.indexOf(characters[i][field]) < 0) {
194
+ t.push(characters[i][field]);
195
+ }
196
+ }
197
+ return t
198
+ }
199
+
200
+ export function getSpecialties(specialties) {
201
+ let t = [];
202
+ for (let i = 0; i < characters.length; i++) {
203
+ if (Object.values(characters[i]["specialties"]).indexOf(specialties) > -1) {
204
+ t.push(characters[i]);
194
205
  }
195
206
  }
196
207
  return t
package/test/index.html CHANGED
@@ -27,198 +27,7 @@
27
27
  <h2>CheckFullBurst</h2>
28
28
  <p id="team-output"></p>
29
29
 
30
- <script type="module">
31
-
32
- import {
33
- getAllNikkes,
34
- getNikkeByName,
35
- pullTen,
36
- checkFullBurst
37
- } from '../index.js';
38
-
39
- let currentNikkesData = [];
40
- let sortColumn = 'name'; // Tri par défaut sur 'name'
41
- let sortDirection = 'asc';
42
-
43
- // Définir les colonnes à afficher (y compris les colonnes triables)
44
- const columns = ['id', 'name', 'rarity', 'burst', 'element', 'manufacturer', 'class', 'weapon', 'squad', 'specialties', 'treasure', 'reEnterBurstSkill', 'canChangeBurstStageThreeToOne', 'cooldown', 'dateAdded'];
45
-
46
- // ----------------------------------------------------
47
- // LOGIQUE DE TRI
48
- // ----------------------------------------------------
49
-
50
- function sortData(column, direction) {
51
- const sortedData = [...currentNikkesData];
52
-
53
- sortedData.sort((a, b) => {
54
- let comparison = 0;
55
- let aVal = a[column] || '';
56
- let bVal = b[column] || '';
57
-
58
- if (column === 'dateAdded') {
59
- // 1. Traitement spécifique pour les dates
60
- const aTime = new Date(aVal).getTime();
61
- const bTime = new Date(bVal).getTime();
62
-
63
- comparison = aTime - bTime;
64
-
65
- // 2. Tri secondaire par NOM si les dates sont identiques
66
- if (comparison === 0) {
67
- return a.name.localeCompare(b.name);
68
- }
69
-
70
- } else {
71
- // Traitement par défaut (alphabétique pour 'name')
72
- comparison = aVal.localeCompare(bVal);
73
- }
74
-
75
- return direction === 'asc' ? comparison : comparison * -1;
76
- });
77
-
78
- return sortedData;
79
- }
80
-
81
- // Fonction appelée lors du clic sur l'en-tête
82
- function sortNikkesTable(event) {
83
- const newColumn = event.currentTarget.getAttribute('data-column');
84
-
85
- if (newColumn === sortColumn) {
86
- sortDirection = (sortDirection === 'asc') ? 'desc' : 'asc';
87
- } else {
88
- sortColumn = newColumn;
89
- sortDirection = 'asc';
90
- }
91
-
92
- // Mettre à jour et re-dessiner le tableau
93
- currentNikkesData = sortData(sortColumn, sortDirection);
94
- renderTable(currentNikkesData, sortColumn, sortDirection);
95
- }
96
- // ----------------------------------------------------
97
- // LOGIQUE DE RENDU DU TABLEAU
98
- // ----------------------------------------------------
99
-
100
- function renderTable(data, sortedCol, sortedDir) {
101
- const container = document.getElementById('nikkes-table-container');
102
- container.innerHTML = ''; // Nettoyer le conteneur
103
-
104
- if (!data || data.length === 0) {
105
- container.innerHTML = '<p>Aucune donnée de Nikke trouvée.</p>';
106
- return;
107
- }
108
-
109
- let html = '<table class="nikkes-table"><thead><tr>';
110
-
111
- // Création de l'en-tête
112
- columns.forEach(col => {
113
- const headerText = col.charAt(0).toUpperCase() + col.slice(1);
114
-
115
- let className = '';
116
- if (col === sortedCol) { // Si c'est la colonne triée
117
- className = `sorted-${sortedDir}`; // Applique la classe sorted-asc ou sorted-desc
118
- }
119
-
120
- // Ajout de l'attribut data-column pour le tri
121
- html += `<th data-column="${col}" class="${className}">${headerText}</th>`;
122
- });
123
- html += '</tr></thead><tbody>';
124
-
125
- // Création des lignes du tableau (inchangé)
126
- data.forEach(nikke => {
127
- html += '<tr>';
128
-
129
- columns.forEach(col => {
130
- let cellContent = nikke[col] || '-';
131
- //console.log(cellContent)
132
- if (typeof cellContent == 'object') {
133
- console.log(cellContent)
134
- cellContent = Object.values(cellContent).join(",<br/> ")
135
- }
136
- let className = '';
137
-
138
- if (col === 'rarity') {
139
- className = `rarity-${nikke[col]}`;
140
- }
141
-
142
- html += `<td class="${className}">${cellContent}</td>`;
143
- });
144
-
145
- html += '</tr>';
146
- });
147
-
148
- html += '</tbody></table>';
149
- container.innerHTML = html;
150
-
151
- // 3. Attacher les écouteurs d'événements APRÈS l'insertion du HTML
152
- // SÉLECTIONNE UNIQUEMENT LES COLONNES DEMANDÉES (name et dateAdded)
153
- const headers = container.querySelectorAll('th[data-column="name"], th[data-column="dateAdded"]');
154
-
155
- // Attache les événements de clic
156
- headers.forEach(header => {
157
- // Ajoute la classe cliquable pour le style (optionnel si le CSS est bien ciblé)
158
- header.classList.add('sortable-header');
159
- header.addEventListener('click', sortNikkesTable);
160
- });
161
-
162
- // Mettre à jour l'état de la console si nécessaire
163
- console.log(`Tableau affiché. Tri actuel: ${sortedCol} (${sortedDir})`);
164
- }
165
-
166
- // ----------------------------------------------------
167
- // INITIALISATION
168
- // ----------------------------------------------------
169
-
170
- // Récupérer les données initiales
171
- currentNikkesData = getAllNikkes();
172
-
173
- // Trier les données initiales
174
- currentNikkesData = sortData(sortColumn, sortDirection);
175
-
176
- // Rendre le tableau initial
177
- renderTable(currentNikkesData, sortColumn, sortDirection);
178
-
179
- // ----------------------------------------------------
180
- // CONSOLE LOGS (Optionnel - Pour vérifier les données)
181
- // ----------------------------------------------------
182
-
183
- const allData = getAllNikkes();
184
- console.log('Toutes les Nikkes:', allData);
185
- let allNikkes = "";
186
- for (let i = 0; i < allData.length; i++) {
187
- allNikkes += JSON.stringify(allData[i]) + "\n";
188
- }
189
- document.getElementById('data-output-all-nikkes').textContent = allNikkes;
190
-
191
- const rapi = getNikkeByName('Rapi');
192
- console.log('Rapi trouvée:', rapi);
193
-
194
- console.log('Liste complète des Nikkes (Taille) :', allData.length);
195
- console.log('Détails de Rapi (Objet) :', getNikkeByName('Rapi'));
196
-
197
- document.getElementById('data-output').textContent = JSON.stringify(getNikkeByName('Helm'), null, 2);
198
-
199
- const mesTirages = pullTen();
200
- console.log('Résultats Gacha (10 pull):', mesTirages);
201
- console.log('Nombre de SSR obtenus :', mesTirages.filter(r => r === 'SSR').length);
202
- document.getElementById('gacha-output').textContent = mesTirages.join(', ');
203
-
204
- const neon = getNikkeByName('Neon');
205
- const anis = getNikkeByName('Anis');
206
- const modernia = getNikkeByName('Modernia');
207
-
208
- const maTeamValide = [neon, anis, modernia, rapi];
209
- const teamResult = checkFullBurst(maTeamValide);
210
- console.log('Analyse de l\'équipe:', teamResult.message);
211
-
212
- const teamIncomplete = [anis, modernia, getNikkeByName('Rapi')];
213
- const incompleteResult = checkFullBurst(teamIncomplete);
214
- console.log('Analyse Équipe Valide :', teamResult.message);
215
- // 'Full Burst Ready!'
216
- console.log('Analyse Équipe Incomplète :', incompleteResult.message);
217
- //'Impossible de Full Burst. Manquant : Burst I'
218
-
219
- document.getElementById('team-output').textContent = `Valide: ${teamResult.message} | Invalide: ${incompleteResult.message}`;
220
-
221
- </script>
30
+ <script type="module" src="script.js"></script>
222
31
  </body>
223
32
 
224
33
  </html>
package/test/script.js ADDED
@@ -0,0 +1,188 @@
1
+ import {
2
+ getAllNikkes,
3
+ getNikkeByName,
4
+ pullTen,
5
+ checkFullBurst
6
+ } from '../index.js';
7
+
8
+ let currentNikkesData = [];
9
+ let sortColumn = 'name'; // Tri par défaut sur 'name'
10
+ let sortDirection = 'asc';
11
+
12
+ // Définir les colonnes à afficher (y compris les colonnes triables)
13
+ const columns = ['id', 'name', 'rarity', 'burst', 'element', 'manufacturer', 'class', 'weapon', 'squad', 'specialties', 'treasure', 'reEnterBurstSkill', 'canChangeBurstStageThreeToOne', 'cooldown', 'dateAdded'];
14
+
15
+ // ----------------------------------------------------
16
+ // LOGIQUE DE TRI
17
+ // ----------------------------------------------------
18
+
19
+ function sortData(column, direction) {
20
+ const sortedData = [...currentNikkesData];
21
+
22
+ sortedData.sort((a, b) => {
23
+ let comparison = 0;
24
+ let aVal = a[column] || '';
25
+ let bVal = b[column] || '';
26
+
27
+ if (column === 'dateAdded') {
28
+ // 1. Traitement spécifique pour les dates
29
+ const aTime = new Date(aVal).getTime();
30
+ const bTime = new Date(bVal).getTime();
31
+
32
+ comparison = aTime - bTime;
33
+
34
+ // 2. Tri secondaire par NOM si les dates sont identiques
35
+ if (comparison === 0) {
36
+ return a.name.localeCompare(b.name);
37
+ }
38
+
39
+ } else {
40
+ // Traitement par défaut (alphabétique pour 'name')
41
+ comparison = aVal.localeCompare(bVal);
42
+ }
43
+
44
+ return direction === 'asc' ? comparison : comparison * -1;
45
+ });
46
+
47
+ return sortedData;
48
+ }
49
+
50
+ // Fonction appelée lors du clic sur l'en-tête
51
+ function sortNikkesTable(event) {
52
+ const newColumn = event.currentTarget.getAttribute('data-column');
53
+
54
+ if (newColumn === sortColumn) {
55
+ sortDirection = (sortDirection === 'asc') ? 'desc' : 'asc';
56
+ } else {
57
+ sortColumn = newColumn;
58
+ sortDirection = 'asc';
59
+ }
60
+
61
+ // Mettre à jour et re-dessiner le tableau
62
+ currentNikkesData = sortData(sortColumn, sortDirection);
63
+ renderTable(currentNikkesData, sortColumn, sortDirection);
64
+ }
65
+ // ----------------------------------------------------
66
+ // LOGIQUE DE RENDU DU TABLEAU
67
+ // ----------------------------------------------------
68
+
69
+ function renderTable(data, sortedCol, sortedDir) {
70
+ const container = document.getElementById('nikkes-table-container');
71
+ container.innerHTML = ''; // Nettoyer le conteneur
72
+
73
+ if (!data || data.length === 0) {
74
+ container.innerHTML = '<p>Aucune donnée de Nikke trouvée.</p>';
75
+ return;
76
+ }
77
+
78
+ let html = '<table class="nikkes-table"><thead><tr>';
79
+
80
+ // Création de l'en-tête
81
+ columns.forEach(col => {
82
+ const headerText = col.charAt(0).toUpperCase() + col.slice(1);
83
+
84
+ let className = '';
85
+ if (col === sortedCol) { // Si c'est la colonne triée
86
+ className = `sorted-${sortedDir}`; // Applique la classe sorted-asc ou sorted-desc
87
+ }
88
+
89
+ // Ajout de l'attribut data-column pour le tri
90
+ html += `<th data-column="${col}" class="${className}">${headerText}</th>`;
91
+ });
92
+ html += '</tr></thead><tbody>';
93
+
94
+ // Création des lignes du tableau (inchangé)
95
+ data.forEach(nikke => {
96
+ html += '<tr>';
97
+
98
+ columns.forEach(col => {
99
+ let cellContent = nikke[col] || '-';
100
+ //console.log(cellContent)
101
+ if (typeof cellContent == 'object') {
102
+ console.log(cellContent)
103
+ cellContent = Object.values(cellContent).join(",<br/> ")
104
+ }
105
+ let className = '';
106
+
107
+ if (col === 'rarity') {
108
+ className = `rarity-${nikke[col]}`;
109
+ }
110
+
111
+ html += `<td class="${className}">${cellContent}</td>`;
112
+ });
113
+
114
+ html += '</tr>';
115
+ });
116
+
117
+ html += '</tbody></table>';
118
+ container.innerHTML = html;
119
+
120
+ // 3. Attacher les écouteurs d'événements APRÈS l'insertion du HTML
121
+ // SÉLECTIONNE UNIQUEMENT LES COLONNES DEMANDÉES (name et dateAdded)
122
+ const headers = container.querySelectorAll('th[data-column="name"], th[data-column="dateAdded"]');
123
+
124
+ // Attache les événements de clic
125
+ headers.forEach(header => {
126
+ // Ajoute la classe cliquable pour le style (optionnel si le CSS est bien ciblé)
127
+ header.classList.add('sortable-header');
128
+ header.addEventListener('click', sortNikkesTable);
129
+ });
130
+
131
+ // Mettre à jour l'état de la console si nécessaire
132
+ console.log(`Tableau affiché. Tri actuel: ${sortedCol} (${sortedDir})`);
133
+ }
134
+
135
+ // ----------------------------------------------------
136
+ // INITIALISATION
137
+ // ----------------------------------------------------
138
+
139
+ // Récupérer les données initiales
140
+ currentNikkesData = getAllNikkes();
141
+
142
+ // Trier les données initiales
143
+ currentNikkesData = sortData(sortColumn, sortDirection);
144
+
145
+ // Rendre le tableau initial
146
+ renderTable(currentNikkesData, sortColumn, sortDirection);
147
+
148
+ // ----------------------------------------------------
149
+ // CONSOLE LOGS (Optionnel - Pour vérifier les données)
150
+ // ----------------------------------------------------
151
+
152
+ const allData = getAllNikkes();
153
+ console.log('Toutes les Nikkes:', allData);
154
+ let allNikkes = "";
155
+ for (let i = 0; i < allData.length; i++) {
156
+ allNikkes += JSON.stringify(allData[i]) + "\n";
157
+ }
158
+ document.getElementById('data-output-all-nikkes').textContent = allNikkes;
159
+
160
+ const rapi = getNikkeByName('Rapi');
161
+ console.log('Rapi trouvée:', rapi);
162
+
163
+ console.log('Liste complète des Nikkes (Taille) :', allData.length);
164
+ console.log('Détails de Rapi (Objet) :', getNikkeByName('Rapi'));
165
+
166
+ document.getElementById('data-output').textContent = JSON.stringify(getNikkeByName('Helm'), null, 2);
167
+
168
+ const mesTirages = pullTen();
169
+ console.log('Résultats Gacha (10 pull):', mesTirages);
170
+ console.log('Nombre de SSR obtenus :', mesTirages.filter(r => r === 'SSR').length);
171
+ document.getElementById('gacha-output').textContent = mesTirages.join(', ');
172
+
173
+ const neon = getNikkeByName('Neon');
174
+ const anis = getNikkeByName('Anis');
175
+ const modernia = getNikkeByName('Modernia');
176
+
177
+ const maTeamValide = [neon, anis, modernia, rapi];
178
+ const teamResult = checkFullBurst(maTeamValide);
179
+ console.log('Analyse de l\'équipe:', teamResult.message);
180
+
181
+ const teamIncomplete = [anis, modernia, getNikkeByName('Rapi')];
182
+ const incompleteResult = checkFullBurst(teamIncomplete);
183
+ console.log('Analyse Équipe Valide :', teamResult.message);
184
+ // 'Full Burst Ready!'
185
+ console.log('Analyse Équipe Incomplète :', incompleteResult.message);
186
+ //'Impossible de Full Burst. Manquant : Burst I'
187
+
188
+ document.getElementById('team-output').textContent = `Valide: ${teamResult.message} | Invalide: ${incompleteResult.message}`;