victor HF Staff commited on
Commit
2e90798
·
0 Parent(s):
This view is limited to 50 files because it contains too many changes.   See raw diff
.gitattributes ADDED
@@ -0,0 +1 @@
 
 
1
+ *.png filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ .aider*
2
+ node_modules
3
+ env.local
4
+ **/.DS_Store
5
+ server.mjs
6
+ .env
README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Fake Insects
3
+ emoji: 🐞
4
+ colorFrom: green
5
+ colorTo: blue
6
+ sdk: static
7
+ pinned: false
8
+ license: mit
9
+ header: mini
10
+ short_description: A game where you need to identify AI Generated insects
11
+ ---
12
+
13
+ Real pictures from Unsplash, AI pictures generated using XLabs-AI/flux-RealismLora
coin_flip.mp3 ADDED
Binary file (42.8 kB). View file
 
countdown.mp3 ADDED
Binary file (122 kB). View file
 
index.html ADDED
@@ -0,0 +1,272 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="overflow-hidden">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Fake Insects Game</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <style>
9
+ body, button, .cursor-pointer {
10
+ cursor: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='53' height='64' viewport='0 0 100 100' style='fill:black;font-size:32px;'><text y='50%'>🐛</text></svg>"), auto !important;
11
+ }
12
+ </style>
13
+ </head>
14
+ <body>
15
+ <audio id="coin-flip-sound" src="coin_flip.mp3"></audio>
16
+ <audio id="wiggle-sound" src="wiggle.mp3"></audio>
17
+ <audio id="countdown-sound" src="countdown.mp3"></audio>
18
+ <div
19
+ class="container mx-auto grid h-dvh max-w-4xl grid-rows-[40px,1fr,1fr] gap-1 overflow-hidden border-x bg-white pb-[90px] sm:pb-2 md:grid-cols-2 md:grid-rows-[40px,1fr]"
20
+ >
21
+ <div
22
+ class="flex items-center bg-gray-100 px-3 font-bold md:col-span-2"
23
+ >
24
+ <h1 class="sm:text-xl">
25
+ <span class="sm:text-2xl">🐞</span> Fake Insects <span class="bg-gray-200 text-sm text-gray-500 px-1 py-0.5 rounded ml-1 align-text-bottom">v0.0</span>
26
+ </h1>
27
+ <div class="flex items-center gap-1 max-sm:text-sm sm:gap-1.5 mx-auto">
28
+ <p class="rounded bg-black px-1.5 text-white">
29
+ <span class="font-normal">TIME LEFT:</span> <span id="time-left">25</span>s
30
+ </p>
31
+ <p class="rounded bg-black px-1.5 text-white">
32
+ <span class="font-normal">SCORE:</span> <span id="score">0</span>
33
+ </p>
34
+ </div>
35
+ </div>
36
+ <div class="overflow-hidden cursor-pointer" id="image1">
37
+ <img
38
+ class="size-full object-contain hidden-if-no-src"
39
+ src=""
40
+ alt="Insect 1"
41
+ />
42
+ </div>
43
+ <div class="overflow-hidden cursor-pointer" id="image2">
44
+ <img
45
+ class="size-full object-contain hidden-if-no-src"
46
+ src=""
47
+ alt="Insect 2"
48
+ />
49
+ </div>
50
+ </div>
51
+
52
+ <!-- only show at the start -->
53
+ <div
54
+ id="start-overlay"
55
+ class="absolute inset-0 grid place-items-center bg-black/50 p-6"
56
+ >
57
+ <div
58
+ class="flex max-w-xl flex-col gap-6 text-balance rounded-xl bg-white p-12 text-center shadow-2xl"
59
+ >
60
+ <div class="text-5xl">🐞</div>
61
+ <div>
62
+ <p class="mb-1 text-xl">
63
+ Find the
64
+ <b class="font-semibold"
65
+ >fake insect (AI generated) and click on it</b
66
+ >
67
+ to win a point!
68
+ </p>
69
+ <p class="text-lg text-gray-400">
70
+ You have 25 seconds to make as many points as possible.
71
+ </p>
72
+ </div>
73
+
74
+ <button
75
+ id="start-button"
76
+ class="flex h-12 items-center justify-center rounded-xl bg-green-500 px-6 font-semibold text-white hover:bg-green-600"
77
+ >
78
+ Start playing
79
+ </button>
80
+ </div>
81
+ </div>
82
+
83
+ <!-- only show after the player loses -->
84
+ <div
85
+ id="game-over-overlay"
86
+ class="absolute inset-0 grid hidden place-items-center bg-black/50 p-6"
87
+ >
88
+ <div
89
+ class="flex flex-col gap-6 rounded-xl bg-white p-12 text-center shadow-2xl"
90
+ >
91
+ <p id="game-over-reason"></p>
92
+ <div class="text-5xl">🐞</div>
93
+ <div>
94
+ <p class="mb-2 text-4xl font-bold">
95
+ Your score:
96
+ <span id="final-score" class="rounded-xl bg-black px-2 text-white">0</span>
97
+ </p>
98
+ <p id="game-over-message" class="text-lg text-gray-400">
99
+ You found 0 fake insects in 25 seconds.
100
+ </p>
101
+ </div>
102
+
103
+ <button
104
+ id="try-again-button"
105
+ class="flex h-12 items-center justify-center rounded-xl bg-black px-6 font-semibold text-white hover:bg-gray-700"
106
+ >
107
+ Try Again
108
+ </button>
109
+ </div>
110
+ </div>
111
+ </body>
112
+ <script>
113
+ const startOverlay = document.getElementById('start-overlay');
114
+ const gameOverOverlay = document.getElementById('game-over-overlay');
115
+ const startButton = document.getElementById('start-button');
116
+ const tryAgainButton = document.getElementById('try-again-button');
117
+ const timeLeftElement = document.getElementById('time-left');
118
+ const scoreElement = document.getElementById('score');
119
+ const finalScoreElement = document.getElementById('final-score');
120
+ const gameOverMessageElement = document.getElementById('game-over-message');
121
+ const image1 = document.getElementById('image1');
122
+ const image2 = document.getElementById('image2');
123
+
124
+ let score = 0;
125
+ let timeLeft = 25;
126
+ let timer;
127
+ let currentRound;
128
+ let preloadedImages = { real: [], fake: [] };
129
+ const totalImages = 100;
130
+
131
+ // Start preloading images immediately
132
+ preloadImages();
133
+
134
+ function preloadImages(count = 20) {
135
+ for (let i = 1; i <= count; i++) {
136
+ const index = Math.floor(Math.random() * totalImages) + 1;
137
+ const paddedIndex = index.toString().padStart(2, '0');
138
+
139
+ const realImg = new Image();
140
+ realImg.src = `insects/r/${paddedIndex}.png`;
141
+ preloadedImages.real.push(realImg);
142
+
143
+ const fakeImg = new Image();
144
+ fakeImg.src = `insects/f/${paddedIndex}.png`;
145
+ preloadedImages.fake.push(fakeImg);
146
+ }
147
+ }
148
+
149
+ function preloadAdditionalImages(count = 5) {
150
+ const realCount = Math.max(0, count - preloadedImages.real.length);
151
+ const fakeCount = Math.max(0, count - preloadedImages.fake.length);
152
+ if (realCount > 0 || fakeCount > 0) {
153
+ preloadImages(Math.max(realCount, fakeCount));
154
+ }
155
+ }
156
+
157
+ function getRandomImage(array) {
158
+ if (array.length <= 5) {
159
+ preloadAdditionalImages();
160
+ }
161
+ const randomIndex = Math.floor(Math.random() * array.length);
162
+ return array.splice(randomIndex, 1)[0];
163
+ }
164
+
165
+ function startGame() {
166
+ score = 0;
167
+ timeLeft = 25;
168
+ updateUI();
169
+ startOverlay.classList.add('hidden');
170
+ preloadAdditionalImages(); // Ensure we have enough images
171
+ startRound();
172
+ startTimer();
173
+ }
174
+
175
+ function startRound() {
176
+ preloadAdditionalImages();
177
+ const realImage = getRandomImage(preloadedImages.real);
178
+ const fakeImage = getRandomImage(preloadedImages.fake);
179
+
180
+ if (Math.random() < 0.5) {
181
+ image1.querySelector('img').src = realImage.src;
182
+ image2.querySelector('img').src = fakeImage.src;
183
+ currentRound = 2;
184
+ } else {
185
+ image1.querySelector('img').src = fakeImage.src;
186
+ image2.querySelector('img').src = realImage.src;
187
+ currentRound = 1;
188
+ }
189
+ }
190
+
191
+ function startTimer() {
192
+ timer = setInterval(() => {
193
+ timeLeft--;
194
+ updateUI();
195
+ if (timeLeft === 3) {
196
+ document.getElementById('countdown-sound').play();
197
+ }
198
+ if (timeLeft <= 0) {
199
+ endGame('timeout');
200
+ }
201
+ }, 1000);
202
+ }
203
+
204
+ function updateUI() {
205
+ timeLeftElement.textContent = timeLeft;
206
+ scoreElement.textContent = score;
207
+ }
208
+
209
+ function endGame(reason) {
210
+ clearInterval(timer);
211
+ document.getElementById('countdown-sound').pause();
212
+ document.getElementById('countdown-sound').currentTime = 0;
213
+ const elapsedTime = 25 - timeLeft;
214
+ finalScoreElement.textContent = score;
215
+ gameOverMessageElement.textContent = `You found ${score} fake insect${score !== 1 ? 's' : ''} in ${elapsedTime} second${elapsedTime !== 1 ? 's' : ''}.`;
216
+ const gameOverReasonElement = document.getElementById('game-over-reason');
217
+ if (reason === 'timeout') {
218
+ gameOverReasonElement.textContent = "Time's up!";
219
+ } else {
220
+ gameOverReasonElement.textContent = "You clicked a real insect!";
221
+ }
222
+ gameOverOverlay.classList.remove('hidden');
223
+ }
224
+
225
+ function handleImageClick(imageNumber) {
226
+ if (imageNumber === currentRound) {
227
+ const coinFlipSound = document.getElementById('coin-flip-sound').cloneNode();
228
+ coinFlipSound.play();
229
+ score++;
230
+ updateUI();
231
+ startRound();
232
+ } else {
233
+ const wiggleSound = document.getElementById('wiggle-sound').cloneNode();
234
+ wiggleSound.play();
235
+ endGame('wrong-click');
236
+ }
237
+ }
238
+
239
+ startButton.addEventListener('click', startGame);
240
+ tryAgainButton.addEventListener('click', () => {
241
+ gameOverOverlay.classList.add('hidden');
242
+ preloadAdditionalImages(); // Preload images before restarting
243
+ startGame();
244
+ });
245
+
246
+ image1.addEventListener('click', () => handleImageClick(1));
247
+ image2.addEventListener('click', () => handleImageClick(2));
248
+
249
+ // Function to hide images with no src
250
+ function hideImagesWithNoSrc() {
251
+ const images = document.querySelectorAll('.hidden-if-no-src');
252
+ images.forEach(img => {
253
+ if (!img.src || img.src === window.location.href) {
254
+ img.style.display = 'none';
255
+ } else {
256
+ img.style.display = 'block';
257
+ }
258
+ });
259
+ }
260
+
261
+ // Call the function when images are loaded or when their src changes
262
+ const observer = new MutationObserver(hideImagesWithNoSrc);
263
+ document.querySelectorAll('.hidden-if-no-src').forEach(img => {
264
+ observer.observe(img, { attributes: true, attributeFilter: ['src'] });
265
+ img.addEventListener('load', hideImagesWithNoSrc);
266
+ img.addEventListener('error', hideImagesWithNoSrc);
267
+ });
268
+
269
+ // Initial call to hide images with no src
270
+ hideImagesWithNoSrc();
271
+ </script>
272
+ </html>
insects/f/01.png ADDED

Git LFS Details

  • SHA256: 92c17e31aff38cbe8fa5fe95fde8f81f9078f3ebcb1f374eaf1c8198362ede7d
  • Pointer size: 131 Bytes
  • Size of remote file: 407 kB
insects/f/02.png ADDED

Git LFS Details

  • SHA256: 3c6e9ed6b7f40e95eb40e57dc95478efdaccf85d613ac9bdf0ad60634f73b598
  • Pointer size: 131 Bytes
  • Size of remote file: 224 kB
insects/f/03.png ADDED

Git LFS Details

  • SHA256: 96e8987c7365b1ef179d582ccc52a1105b28fe9c573e84aca7e514304cf0cf2f
  • Pointer size: 131 Bytes
  • Size of remote file: 270 kB
insects/f/04.png ADDED

Git LFS Details

  • SHA256: def84999002db799a4d0226d28f5a754966aa199790fa7ab828b0ef3ed17f240
  • Pointer size: 131 Bytes
  • Size of remote file: 339 kB
insects/f/05.png ADDED

Git LFS Details

  • SHA256: c4521c8e58cec4ae3a1df5f1152f62abd14609eaa0eb180a0d00b33783bc5b52
  • Pointer size: 131 Bytes
  • Size of remote file: 348 kB
insects/f/06.png ADDED

Git LFS Details

  • SHA256: da815f1c6adc862fea512321e46778240ee7aef9bec63c8de2d959546a94fe56
  • Pointer size: 132 Bytes
  • Size of remote file: 1.21 MB
insects/f/07.png ADDED

Git LFS Details

  • SHA256: ecb6f66405b3d7aa9485f302608e074a45c124b65809867f8f99d3142b784280
  • Pointer size: 131 Bytes
  • Size of remote file: 332 kB
insects/f/08.png ADDED

Git LFS Details

  • SHA256: 3c6f5c8ec4729785182e47262da11864a68c6a8c1082c2b88c6df1d641663d2a
  • Pointer size: 131 Bytes
  • Size of remote file: 328 kB
insects/f/09.png ADDED

Git LFS Details

  • SHA256: 3c95b0356d884c76a9031d4087c053a57d710ed3b0297dccbf83696ef50a23cf
  • Pointer size: 132 Bytes
  • Size of remote file: 1.13 MB
insects/f/10.png ADDED

Git LFS Details

  • SHA256: 67db7f04fcf449802b46a664a72dd455a0f2fd85f30efd16ed4d8638e5207453
  • Pointer size: 131 Bytes
  • Size of remote file: 333 kB
insects/f/100.png ADDED

Git LFS Details

  • SHA256: 3eaf189b1b97b610c57c80cc414f0135dd23af80ded616c7cd1612562af90b0a
  • Pointer size: 131 Bytes
  • Size of remote file: 362 kB
insects/f/11.png ADDED

Git LFS Details

  • SHA256: c51e6be623a4e31c2017243c9d9ced3af23e11c280d47a5bdad02542b963c0b9
  • Pointer size: 131 Bytes
  • Size of remote file: 268 kB
insects/f/12.png ADDED

Git LFS Details

  • SHA256: 032217a68e496872130b99abd0c743f42f7399d61d406f65f3cc0886b61ca8f8
  • Pointer size: 132 Bytes
  • Size of remote file: 1.05 MB
insects/f/13.png ADDED

Git LFS Details

  • SHA256: 172942f681efcf3b3f7d76d19963df754bf4cbaa013f0d8b73fe3ba111068e69
  • Pointer size: 131 Bytes
  • Size of remote file: 270 kB
insects/f/14.png ADDED

Git LFS Details

  • SHA256: 60f8beb78d1ff95f6fd7dfd1a3f082b75659ee94b5cbc9c09e29dfd760576440
  • Pointer size: 131 Bytes
  • Size of remote file: 244 kB
insects/f/15.png ADDED

Git LFS Details

  • SHA256: 32fcd5be782edc5b0c0a72f4c62b138373bcdfd40a32dd88677ed82ce62c5290
  • Pointer size: 131 Bytes
  • Size of remote file: 209 kB
insects/f/16.png ADDED

Git LFS Details

  • SHA256: bd51a22b8c634534d2cbc07c2fc29e61ac4649d0f558e4feda0a73042714e39a
  • Pointer size: 131 Bytes
  • Size of remote file: 356 kB
insects/f/17.png ADDED

Git LFS Details

  • SHA256: fc76a422235bb9330d5323407cf0bcead342a98b909dd81a1eb86e93ccac848c
  • Pointer size: 131 Bytes
  • Size of remote file: 273 kB
insects/f/18.png ADDED

Git LFS Details

  • SHA256: fc3a47d8e14df2ac1f61db3a8713b5ce50395129c7da71c91221f9a204cc4a25
  • Pointer size: 131 Bytes
  • Size of remote file: 459 kB
insects/f/19.png ADDED

Git LFS Details

  • SHA256: 2fe9585f507239dd578d3de5791977605d584799aa17445eadf56e5f2a177f57
  • Pointer size: 131 Bytes
  • Size of remote file: 296 kB
insects/f/20.png ADDED

Git LFS Details

  • SHA256: fbd859a1baaed879b3ab5f3521415cd8d8221234144bb82325090e87b747371d
  • Pointer size: 131 Bytes
  • Size of remote file: 350 kB
insects/f/21.png ADDED

Git LFS Details

  • SHA256: 759579712a03be6f29d2a0749dfdf2ffcced443749cf5ba2b68b842bccf19824
  • Pointer size: 132 Bytes
  • Size of remote file: 1.09 MB
insects/f/22.png ADDED

Git LFS Details

  • SHA256: a45b5c6766f2420949a68c94f7b08b5e15f5c4e68fffdf4e5f19e253ad836fdd
  • Pointer size: 131 Bytes
  • Size of remote file: 226 kB
insects/f/23.png ADDED

Git LFS Details

  • SHA256: 6693f90e0c7874f2aa61d3144ded11d62054161d9d100078ac36bfa401382326
  • Pointer size: 132 Bytes
  • Size of remote file: 1.38 MB
insects/f/24.png ADDED

Git LFS Details

  • SHA256: 30ba0c28b2b74c730b6928ce950bb012540bb09781df5bec3f1f7814ca523b39
  • Pointer size: 131 Bytes
  • Size of remote file: 337 kB
insects/f/25.png ADDED

Git LFS Details

  • SHA256: 73f52a90fec0f390aed74822fd537b798560bb18ec4cf9e031f601d9593c561a
  • Pointer size: 131 Bytes
  • Size of remote file: 294 kB
insects/f/26.png ADDED

Git LFS Details

  • SHA256: 871acc19aa92b786d0de85c1bdbb5ea15ad70d913daffa7f0d332a66c94e977d
  • Pointer size: 131 Bytes
  • Size of remote file: 375 kB
insects/f/27.png ADDED

Git LFS Details

  • SHA256: f22693f7332e8364fb1ac6afa555ab2569a3bedc10bdc07a6225fb4ef1b40c90
  • Pointer size: 131 Bytes
  • Size of remote file: 366 kB
insects/f/28.png ADDED

Git LFS Details

  • SHA256: 788c044f8f4f167bbf1f22a1c7c6ec0d545194bfe6d630025a69cdb2a950bf63
  • Pointer size: 131 Bytes
  • Size of remote file: 327 kB
insects/f/29.png ADDED

Git LFS Details

  • SHA256: 8b5b10b7f4f52ae474985264ab174cd54cda7ae21505a08ded2d6588d3a9379b
  • Pointer size: 131 Bytes
  • Size of remote file: 334 kB
insects/f/30.png ADDED

Git LFS Details

  • SHA256: c76e54fa8daf1d82d4a29ead2411440db7fda9161a4b24365593cd2bd527a7af
  • Pointer size: 131 Bytes
  • Size of remote file: 329 kB
insects/f/31.png ADDED

Git LFS Details

  • SHA256: a7ecc6868c02a668ce08b3c66257b51349001e2e7a056444b384cffb2d3ca915
  • Pointer size: 132 Bytes
  • Size of remote file: 1.1 MB
insects/f/32.png ADDED

Git LFS Details

  • SHA256: 1c8b75dde3cf96a36d06dbcb248712120fe2c4cadd4f8ab414b0c0a900bc1af3
  • Pointer size: 131 Bytes
  • Size of remote file: 325 kB
insects/f/33.png ADDED

Git LFS Details

  • SHA256: d85f373807570734bf1fdb41af0c27f66d20d138b0aafedfbbef7af8ba1d96b1
  • Pointer size: 131 Bytes
  • Size of remote file: 335 kB
insects/f/34.png ADDED

Git LFS Details

  • SHA256: 8f28725f8350886790f0adcf4d58aaa97f4af4b2cb9cb6bf2a19f3b2b4cf93e7
  • Pointer size: 131 Bytes
  • Size of remote file: 305 kB
insects/f/35.png ADDED

Git LFS Details

  • SHA256: 9106330938b64ede039763b28083c4bc646857d9e89cbfe1df25c2db852852c9
  • Pointer size: 131 Bytes
  • Size of remote file: 348 kB
insects/f/36.png ADDED

Git LFS Details

  • SHA256: 17f43b9453f9b4f2114444a260b4c68b77de4ebe2329a8ba7d6e4cebfa5c9cdc
  • Pointer size: 131 Bytes
  • Size of remote file: 231 kB
insects/f/37.png ADDED

Git LFS Details

  • SHA256: fa5f8e12eddfa58893bf1612c3e5c2569d8a434ddd1a6cdafc6d5d49fce47163
  • Pointer size: 131 Bytes
  • Size of remote file: 302 kB
insects/f/38.png ADDED

Git LFS Details

  • SHA256: 2db05d68f4f62ff5b603005db084211ca15c695c98519879bde294fd5e583f0c
  • Pointer size: 131 Bytes
  • Size of remote file: 373 kB
insects/f/39.png ADDED

Git LFS Details

  • SHA256: 8006e7cb0e248d1df7922a464984b647352ffdccc8e3fcc8983e281022d11738
  • Pointer size: 131 Bytes
  • Size of remote file: 399 kB
insects/f/40.png ADDED

Git LFS Details

  • SHA256: 3ee3fd4d464cca8522b42cf09db1e8e3df40a37a5aba2ab3612ac24ce4dcfc43
  • Pointer size: 132 Bytes
  • Size of remote file: 1.15 MB
insects/f/41.png ADDED

Git LFS Details

  • SHA256: 1cf4f9ddd84d5d1727f785cdf0d3c6d901c66204310d1965568a313dea62fe15
  • Pointer size: 131 Bytes
  • Size of remote file: 379 kB
insects/f/42.png ADDED

Git LFS Details

  • SHA256: 982a3f3271796129865382c55d34e47f862beb6762335b767e461cc44dce63a8
  • Pointer size: 131 Bytes
  • Size of remote file: 447 kB
insects/f/43.png ADDED

Git LFS Details

  • SHA256: 9d68184de57e2386fd3a12fbd79437175abdf3094fa8236845f84d52fc7cd0f7
  • Pointer size: 131 Bytes
  • Size of remote file: 343 kB