1 // BlinkenSisters - Hunt for the Lost Pixels
2 // Bringing back the fun of the 80s
3 //
4 // (C) 2005-07 Rene Schickbauer, Wolfgang Dautermann
5 //
6 // See License.txt for licensing information
7 //
8
9 #define NEED_REGISTER_FUNCTION
10 #include "bl_lua.h"
11 #undef NEED_REGISTER_FUNCTION
12
13 #include "globals.h"
14 #include "bl_lua_bindings.h"
15 #include "fgobjects.h"
16 #include "errorhandler.h"
17 #include "lua.h"
18 #include "sound.h"
19 #include "levelhandler.h"
20 #include "engine.h"
21 #include "showvideo.h"
22 #include "triggers.h"
23 #include "outputfilter.h"
24
l2bDie(lua_State * L)25 static int l2bDie(lua_State *L) {
26 if(!lua_isstring(L, 1)) {
27 LUADIE(L, ERROR_LUAL2BTYPE, "");
28 } else {
29 LUADIE(L, ERROR_LUAL2BDIE, (char *)lua_tostring(L, 1));
30 }
31 return 0;
32 }
33
l2bLoadGFX(lua_State * L)34 static int l2bLoadGFX(lua_State *L) {
35 char tmp[1000];
36 if(!lua_isstring(L, 1)) {
37 LUADIE(L, ERROR_LUAL2BTYPE, "");
38 } else {
39 sprintf(tmp, "%s", lua_tostring(L, 1));
40 }
41
42 Uint32 idx = addFGObjGFX(tmp);
43 lua_pushnumber(L, idx);
44
45 return 1;
46 }
47
l2bAddObject(lua_State * L)48 static int l2bAddObject(lua_State *L) {
49 Uint32 gfxobj, x, y;
50 gfxobj = x = y = 0;
51 bool isBlocking = false;
52 bool isVisible = false;
53 bool isOnTop = false;
54 bool isKilling = false;
55 if(!lua_isnumber(L, 1) ||
56 !lua_isnumber(L, 2) ||
57 !lua_isnumber(L, 3) ||
58 !lua_isnumber(L, 4) ||
59 !lua_isnumber(L, 5) ||
60 !lua_isnumber(L, 6) ||
61 !lua_isnumber(L, 7)) {
62 LUADIE(L, ERROR_LUAL2BTYPE, "");
63 } else {
64 gfxobj = (Uint32)lua_tonumber(L, 1);
65 x = (Uint32)lua_tonumber(L, 2) * TILESIZE;
66 y = (Uint32)lua_tonumber(L, 3) * TILESIZE;
67 if(lua_tonumber(L, 4) > 0) {
68 isBlocking = true;
69 }
70 if(lua_tonumber(L, 5) > 0) {
71 isVisible = true;
72 }
73 if(lua_tonumber(L, 6) > 0) {
74 isOnTop = true;
75 }
76 if(lua_tonumber(L, 7) > 0) {
77 isKilling = true;
78 }
79
80 }
81
82 Uint32 idx = addFGObj(gfxobj, x, y, isBlocking, isVisible, isOnTop, isKilling);
83 lua_pushnumber(L, idx);
84
85 return 1;
86 }
87
88
l2bSetVisible(lua_State * L)89 static int l2bSetVisible(lua_State *L) {
90 Uint32 gfxobj = 0;
91 bool isVisible = false;
92 if(!lua_isnumber(L, 1) ||
93 !lua_isnumber(L, 2)) {
94 LUADIE(L, ERROR_LUAL2BTYPE, "");
95 } else {
96 gfxobj = (Uint32)lua_tonumber(L, 1);
97 if(lua_tonumber(L, 2) > 0) {
98 isVisible = true;
99 }
100
101 }
102
103 setFGObjSetVisible(gfxobj, isVisible);
104
105 return 0;
106 }
107
l2bSetBlocking(lua_State * L)108 static int l2bSetBlocking(lua_State *L) {
109 Uint32 gfxobj = 0;
110 bool isBlocking = false;
111 if(!lua_isnumber(L, 1) ||
112 !lua_isnumber(L, 2)) {
113 LUADIE(L, ERROR_LUAL2BTYPE, "");
114 } else {
115 gfxobj = (Uint32)lua_tonumber(L, 1);
116 if(lua_tonumber(L, 2) > 0) {
117 isBlocking = true;
118 }
119
120 }
121
122 setFGObjSetBlocking(gfxobj, isBlocking);
123
124 return 0;
125 }
126
l2bSetOnTop(lua_State * L)127 static int l2bSetOnTop(lua_State *L) {
128 Uint32 gfxobj = 0;
129 bool isOnTop = false;
130 if(!lua_isnumber(L, 1) ||
131 !lua_isnumber(L, 2)) {
132 LUADIE(L, ERROR_LUAL2BTYPE, "");
133 } else {
134 gfxobj = (Uint32)lua_tonumber(L, 1);
135 if(lua_tonumber(L, 2) > 0) {
136 isOnTop = true;
137 }
138
139 }
140
141 setFGObjSetOnTop(gfxobj, isOnTop);
142
143 return 0;
144 }
145
l2bSetElevator(lua_State * L)146 static int l2bSetElevator(lua_State *L) {
147 Uint32 gfxobj = 0;
148 bool isElevator = false;
149 if(!lua_isnumber(L, 1) ||
150 !lua_isnumber(L, 2)) {
151 LUADIE(L, ERROR_LUAL2BTYPE, "");
152 } else {
153 gfxobj = (Uint32)lua_tonumber(L, 1);
154 if(lua_tonumber(L, 2) > 0) {
155 isElevator = true;
156 }
157
158 }
159
160 setFGObjSetElevator(gfxobj, isElevator);
161
162 return 0;
163 }
164
l2bSetKilling(lua_State * L)165 static int l2bSetKilling(lua_State *L) {
166 Uint32 gfxobj = 0;
167 bool isKilling = false;
168 if(!lua_isnumber(L, 1) ||
169 !lua_isnumber(L, 2)) {
170 LUADIE(L, ERROR_LUAL2BTYPE, "");
171 } else {
172 gfxobj = (Uint32)lua_tonumber(L, 1);
173 if(lua_tonumber(L, 2) > 0) {
174 isKilling = true;
175 }
176 }
177
178 setFGObjSetKilling(gfxobj, isKilling);
179
180 return 0;
181 }
182
l2bSetPixel(lua_State * L)183 static int l2bSetPixel(lua_State *L) {
184 Uint32 gfxobj = 0;
185 bool isPixel = false;
186 if(!lua_isnumber(L, 1) ||
187 !lua_isnumber(L, 2)) {
188 LUADIE(L, ERROR_LUAL2BTYPE, "");
189 } else {
190 gfxobj = (Uint32)lua_tonumber(L, 1);
191 if(lua_tonumber(L, 2) > 0) {
192 isPixel = true;
193 }
194 }
195
196 setFGObjSetPixel(gfxobj, isPixel);
197
198 return 0;
199 }
200
l2bSetGFX(lua_State * L)201 static int l2bSetGFX(lua_State *L) {
202 Uint32 gfxobj, gfx;
203 gfxobj = gfx = 0;
204 if(!lua_isnumber(L, 1) ||
205 !lua_isnumber(L, 2)) {
206 LUADIE(L, ERROR_LUAL2BTYPE, "");
207 } else {
208 gfxobj = (Uint32)lua_tonumber(L, 1);
209 gfx = (Uint32)lua_tonumber(L, 2);
210 }
211
212 setFGObjSetGFX(gfxobj, gfx);
213
214 return 0;
215 }
216
l2bSetObjPos(lua_State * L)217 static int l2bSetObjPos(lua_State *L) {
218 Uint32 gfxobj, x, y;
219 gfxobj = x = y = 0;
220 if(!lua_isnumber(L, 1) ||
221 !lua_isnumber(L, 2) ||
222 !lua_isnumber(L, 3)) {
223 LUADIE(L, ERROR_LUAL2BTYPE, "");
224 } else {
225 gfxobj = (Uint32)lua_tonumber(L, 1);
226 x = (Sint32)lua_tonumber(L, 2);
227 y = (Sint32)lua_tonumber(L, 3);
228 }
229
230 setFGObjSetPos(gfxobj, x, y);
231
232 return 0;
233 }
234
l2bSetPlayerX(lua_State * L)235 static int l2bSetPlayerX(lua_State *L) {
236 Uint32 x;
237 x = 0;
238 if(!lua_isnumber(L, 1)) {
239 LUADIE(L, ERROR_LUAL2BTYPE, "");
240 } else {
241 x = (Uint32)lua_tonumber(L, 1);
242 }
243
244 spritex = (double)x;
245
246 return 0;
247 }
248
l2bGetPlayerX(lua_State * L)249 static int l2bGetPlayerX(lua_State *L) {
250 Uint32 x = (Uint32)spritex;
251 lua_pushnumber(L, x);
252
253 return 1;
254 }
255
l2bGetPlayerY(lua_State * L)256 static int l2bGetPlayerY(lua_State *L) {
257 Uint32 y = (Uint32)spritey;
258 lua_pushnumber(L, y);
259
260 return 1;
261 }
262
263
l2bSetPlayerY(lua_State * L)264 static int l2bSetPlayerY(lua_State *L) {
265 Uint32 y;
266 y = 0;
267 if(!lua_isnumber(L, 1)) {
268 LUADIE(L, ERROR_LUAL2BTYPE, "");
269 } else {
270 y = (Uint32)lua_tonumber(L, 1);
271 }
272
273 spritey = (double)y;
274
275 return 0;
276 }
277
l2bSetLockedBG(lua_State * L)278 static int l2bSetLockedBG(lua_State *L) {
279 if(!lua_isnumber(L, 1)) {
280 LUADIE(L, ERROR_LUAL2BTYPE, "");
281 } else {
282 if(lua_tonumber(L, 1) > 0) {
283 lockedBG = true;
284 } else {
285 lockedBG = false;
286 }
287 }
288
289 return 0;
290 }
291
l2bSetGravity(lua_State * L)292 static int l2bSetGravity(lua_State *L) {
293 if(!lua_isnumber(L, 1)) {
294 LUADIE(L, ERROR_LUAL2BTYPE, "");
295 } else {
296 if(lua_tonumber(L, 1) > 0) {
297 hasGravity = true;
298 } else {
299 hasGravity = false;
300 }
301 }
302
303 return 0;
304 }
305
l2bSetSpecialTiles(lua_State * L)306 static int l2bSetSpecialTiles(lua_State *L) {
307 if(!lua_isnumber(L, 1)) {
308 LUADIE(L, ERROR_LUAL2BTYPE, "");
309 } else {
310 if(lua_tonumber(L, 1) > 0) {
311 canPaintSpecialTiles = true;
312 } else {
313 canPaintSpecialTiles = false;
314 }
315 }
316
317 return 0;
318 }
319
l2bSetFreeMovement(lua_State * L)320 static int l2bSetFreeMovement(lua_State *L) {
321 if(!lua_isnumber(L, 1)) {
322 LUADIE(L, ERROR_LUAL2BTYPE, "");
323 } else {
324 if(lua_tonumber(L, 1) > 0) {
325 freeMovement = true;
326 } else {
327 freeMovement = false;
328 }
329 }
330
331 return 0;
332 }
333
334
l2bLoadSoundFX(lua_State * L)335 static int l2bLoadSoundFX(lua_State *L) {
336 char tmp[1000];
337 if(!lua_isstring(L, 1)) {
338 LUADIE(L, ERROR_LUAL2BTYPE, "");
339 } else {
340 sprintf(tmp, "%s", lua_tostring(L, 1));
341 }
342
343 Uint32 idx = addSoundFXLua(tmp);
344 lua_pushnumber(L, idx);
345
346 return 1;
347 }
348
349
l2bPlaySoundFX(lua_State * L)350 static int l2bPlaySoundFX(lua_State *L) {
351 Uint32 fx = 0;
352 if(!lua_isnumber(L, 1)) {
353 LUADIE(L, ERROR_LUAL2BTYPE, "");
354 } else {
355 fx = (Uint32)lua_tonumber(L, 1);
356 }
357
358 soundPlayFXLua(fx);
359
360 return 0;
361 }
362
l2bIncrementMaxPixels(lua_State * L)363 static int l2bIncrementMaxPixels(lua_State *L) {
364 Uint32 pixels = 0;
365 if(!lua_isnumber(L, 1)) {
366 LUADIE(L, ERROR_LUAL2BTYPE, "");
367 } else {
368 pixels = (Uint32)lua_tonumber(L, 1);
369 }
370
371 lhandle.numPixels += pixels ;
372
373 return 0;
374 }
375
l2bAddPixel(lua_State * L)376 static int l2bAddPixel(lua_State *L) {
377 Uint32 x = 0;
378 Uint32 y = 0;
379 if(!lua_isnumber(L, 1) ||
380 !lua_isnumber(L, 2)) {
381 LUADIE(L, ERROR_LUAL2BTYPE, "");
382 } else {
383 x = (Uint32)lua_tonumber(L, 1) * TILESIZE;
384 y = (Uint32)lua_tonumber(L, 2) * TILESIZE;
385 }
386
387 addPixel(x, y, PIXELTYPE_PIXEL);
388
389 return 0;
390 }
391
l2bAddGFXPixel(lua_State * L)392 static int l2bAddGFXPixel(lua_State *L) {
393 Uint32 gfxobj = 0;
394 Uint32 x = 0;
395 Uint32 y = 0;
396 Uint32 incMaxPixel = 0;
397
398 if(!lua_isnumber(L, 1) ||
399 !lua_isnumber(L, 2) ||
400 !lua_isnumber(L, 3) ||
401 !lua_isnumber(L, 4)) {
402 LUADIE(L, ERROR_LUAL2BTYPE, "");
403 } else {
404 gfxobj = (Uint32)lua_tonumber(L, 1);
405 x = (Uint32)lua_tonumber(L, 2) * TILESIZE;
406 y = (Uint32)lua_tonumber(L, 3) * TILESIZE;
407 incMaxPixel = (Uint32)lua_tonumber(L, 4);
408 }
409
410 Uint32 idx = addFGObj(gfxobj, x, y, false, true, false, false);
411 setFGObjSetPixel(idx, true);
412 if(incMaxPixel) {
413 lhandle.numPixels ++ ;
414 }
415 lua_pushnumber(L, idx);
416
417 return 1;
418 }
419
l2bAddBonusLive(lua_State * L)420 static int l2bAddBonusLive(lua_State *L) {
421 Uint32 x = 0;
422 Uint32 y = 0;
423 if(!lua_isnumber(L, 1) ||
424 !lua_isnumber(L, 2)) {
425 LUADIE(L, ERROR_LUAL2BTYPE, "");
426 } else {
427 x = (Uint32)lua_tonumber(L, 1) * TILESIZE;
428 y = (Uint32)lua_tonumber(L, 2) * TILESIZE;
429 }
430
431 addPixel(x, y, PIXELTYPE_LIVE);
432
433 return 0;
434 }
435
l2bAddBonusPoints(lua_State * L)436 static int l2bAddBonusPoints(lua_State *L) {
437 Uint32 x = 0;
438 Uint32 y = 0;
439 if(!lua_isnumber(L, 1) ||
440 !lua_isnumber(L, 2)) {
441 LUADIE(L, ERROR_LUAL2BTYPE, "");
442 } else {
443 x = (Uint32)lua_tonumber(L, 1) * TILESIZE;
444 y = (Uint32)lua_tonumber(L, 2) * TILESIZE;
445 }
446
447 addPixel(x, y, PIXELTYPE_POINTS);
448
449 return 0;
450 }
451
l2bPlayVideo(lua_State * L)452 static int l2bPlayVideo(lua_State *L) {
453 char tmp[1000];
454 bool trackergui = false;
455 if(!lua_isstring(L, 1) ||
456 !lua_isnumber(L, 2)) {
457 LUADIE(L, ERROR_LUAL2BTYPE, "");
458 } else {
459 sprintf(tmp, "%s", lua_tostring(L, 1));
460 if(lua_tonumber(L, 2) > 0) {
461 trackergui = true;
462 }
463 }
464
465 showVideo(tmp, trackergui, false);
466 gLastTick = BS_GetTicks();
467
468 return 0;
469 }
470
l2bSetCanExit(lua_State * L)471 static int l2bSetCanExit(lua_State *L) {
472 if(!lua_isnumber(L, 1)) {
473 LUADIE(L, ERROR_LUAL2BTYPE, "");
474 } else {
475 if(lua_tonumber(L, 1) > 0) {
476 allowedToExit = true;
477 } else {
478 allowedToExit = false;
479 }
480 }
481
482 return 0;
483 }
484
l2bGetCanExit(lua_State * L)485 static int l2bGetCanExit(lua_State *L) {
486 Uint32 yesno = 0;
487 if(allowedToExit) {
488 yesno = 1;
489 }
490 lua_pushnumber(L, yesno);
491
492 return 1;
493 }
494
l2bAddFGTrigger(lua_State * L)495 static int l2bAddFGTrigger(lua_State *L) {
496 Uint32 gfxobj = 0;
497 Uint32 x = 0;
498 Uint32 y = 0;
499 char funcname[100];
500 bool isActive = false;
501 bool isVisible = false;
502
503 if(!lua_isnumber(L, 1) ||
504 !lua_isnumber(L, 2) ||
505 !lua_isnumber(L, 3) ||
506 !lua_isstring(L, 4) ||
507 !lua_isnumber(L, 5) ||
508 !lua_isnumber(L, 6)) {
509 LUADIE(L, ERROR_LUAL2BTYPE, "");
510 } else {
511 gfxobj = (Uint32)lua_tonumber(L, 1);
512 x = (Uint32)lua_tonumber(L, 2) * TILESIZE;
513 y = (Uint32)lua_tonumber(L, 3) * TILESIZE;
514 sprintf(funcname, "%s", lua_tostring(L, 4));
515 if(lua_tonumber(L, 5) > 0) {
516 isActive = true;
517 }
518 if(lua_tonumber(L, 6) > 0) {
519 isVisible = true;
520 }
521 }
522
523 Uint32 idx = addFGObj(gfxobj, x, y, false, isVisible, false, false);
524 registerFGTrigger(idx, isActive, funcname);
525 lua_pushnumber(L, idx);
526
527 return 1;
528 }
529
l2bSetTriggerActive(lua_State * L)530 static int l2bSetTriggerActive(lua_State *L) {
531 Uint32 objid = 0;
532 bool isActive = false;
533 if(!lua_isnumber(L, 1) ||
534 !lua_isnumber(L, 2)) {
535 LUADIE(L, ERROR_LUAL2BTYPE, "");
536 } else {
537 if(lua_tonumber(L, 2) > 0) {
538 isActive = true;
539 }
540 objid = (Uint32)lua_tonumber(L, 1);
541 }
542 setTriggerActive(objid, isActive);
543
544 return 0;
545 }
546
l2bGetCollectedPixelCount(lua_State * L)547 static int l2bGetCollectedPixelCount(lua_State *L) {
548 lua_pushnumber(L, foundPixels);
549 return 1;
550 }
551
l2bSetCollectedPixelCount(lua_State * L)552 static int l2bSetCollectedPixelCount(lua_State *L) {
553 if(!lua_isnumber(L, 1)) {
554 LUADIE(L, ERROR_LUAL2BTYPE, "");
555 } else {
556 if(lua_tonumber(L, 1) >= 0) {
557 foundPixels = (Uint32)lua_tonumber(L, 1);
558 }
559 }
560
561 return 0;
562 }
563
l2bGetRequiredPixelCount(lua_State * L)564 static int l2bGetRequiredPixelCount(lua_State *L) {
565 lua_pushnumber(L, lhandle.numPixels);
566 return 1;
567 }
568
l2bSetRequiredPixelCount(lua_State * L)569 static int l2bSetRequiredPixelCount(lua_State *L) {
570 if(!lua_isnumber(L, 1)) {
571 LUADIE(L, ERROR_LUAL2BTYPE, "");
572 } else {
573 if(lua_tonumber(L, 1) >= 0) {
574 lhandle.numPixels = (Uint32)lua_tonumber(L, 1);
575 }
576 }
577
578 return 0;
579 }
580
l2bSetOutputFilter(lua_State * L)581 static int l2bSetOutputFilter(lua_State *L) {
582 if(!lua_isnumber(L, 1)) {
583 LUADIE(L, ERROR_LUAL2BTYPE, "");
584 } else {
585 if(lua_tonumber(L, 1) >= 0) {
586 setOutputFilter((Uint32)lua_tonumber(L, 1));
587 }
588 }
589
590 return 0;
591 }
592
l2bSetOutputFilterFading(lua_State * L)593 static int l2bSetOutputFilterFading(lua_State *L) {
594 if(!lua_isnumber(L, 1)) {
595 LUADIE(L, ERROR_LUAL2BTYPE, "");
596 } else {
597 if(lua_tonumber(L, 1) >= 0 && lua_tonumber(L, 1) <= 255) {
598 setOutputFilterFading((Uint32)lua_tonumber(L, 1));
599 }
600 }
601
602 return 0;
603 }
604
605
l2bKillPlayer(lua_State * L)606 static int l2bKillPlayer(lua_State *L) {
607 killPlayer = true;
608
609 // Avoid compiler warning about unused argument (because prototype requires it)
610 if(!L) {
611 return 0;
612 }
613
614 return 0;
615 }
616
blRegisterLuaBindings(lua_State * L)617 void blRegisterLuaBindings(lua_State *L) {
618 REGISTER(l2bDie, "Die");
619 REGISTER(l2bLoadGFX, "LoadGFX");
620 REGISTER(l2bAddObject, "AddObject");
621 REGISTER(l2bSetVisible, "SetVisible");
622 REGISTER(l2bSetBlocking, "SetBlocking");
623 REGISTER(l2bSetOnTop, "SetOnTop");
624 REGISTER(l2bSetElevator, "SetElevator");
625 REGISTER(l2bSetKilling, "SetKilling");
626 REGISTER(l2bSetPixel, "SetPixel");
627 REGISTER(l2bSetGFX, "SetGFX");
628 REGISTER(l2bSetObjPos, "SetObjPos");
629 REGISTER(l2bSetPlayerX, "SetPlayerX");
630 REGISTER(l2bGetPlayerX, "GetPlayerX");
631 REGISTER(l2bSetPlayerY, "SetPlayerY");
632 REGISTER(l2bGetPlayerY, "GetPlayerY");
633 REGISTER(l2bLoadSoundFX, "LoadSoundFX");
634 REGISTER(l2bPlaySoundFX, "PlaySoundFX");
635 REGISTER(l2bIncrementMaxPixels, "IncMaxPixels");
636 REGISTER(l2bAddPixel, "AddPixel");
637 REGISTER(l2bAddGFXPixel, "AddGFXPixel");
638 REGISTER(l2bAddBonusLive, "AddBonusLive");
639 REGISTER(l2bAddBonusPoints, "AddBonusPoints");
640 REGISTER(l2bSetLockedBG, "SetLockedBG");
641 REGISTER(l2bSetGravity, "SetGravity");
642 REGISTER(l2bSetSpecialTiles, "SetSpecialTiles");
643 REGISTER(l2bSetFreeMovement, "SetFreeMovement");
644 REGISTER(l2bPlayVideo, "PlayVideo");
645 REGISTER(l2bSetCanExit, "SetCanExit");
646 REGISTER(l2bGetCanExit, "GetCanExit");
647 REGISTER(l2bAddFGTrigger, "AddFGTrigger");
648 REGISTER(l2bSetTriggerActive, "SetTriggerActive");
649 REGISTER(l2bGetCollectedPixelCount, "GetCollectedPixelCount");
650 REGISTER(l2bGetRequiredPixelCount, "GetRequiredPixelCount");
651 REGISTER(l2bSetCollectedPixelCount, "SetCollectedPixelCount");
652 REGISTER(l2bSetRequiredPixelCount, "SetRequiredPixelCount");
653 REGISTER(l2bSetOutputFilter, "SetOutputFilter");
654 REGISTER(l2bSetOutputFilterFading, "SetOutputFilterFading");
655 REGISTER(l2bKillPlayer, "KillPlayer");
656
657
658 // Register required GLOBALS
659 REGISTERGLOBAL(OUTPUTFILTER_NONE, "OUTPUTFILTER_NONE");
660 REGISTERGLOBAL(OUTPUTFILTER_GREYSCALE, "OUTPUTFILTER_GREYSCALE");
661 REGISTERGLOBAL(OUTPUTFILTER_COLORINVERT, "OUTPUTFILTER_COLORINVERT");
662 REGISTERGLOBAL(OUTPUTFILTER_NOISERECT, "OUTPUTFILTER_NOISERECT");
663 REGISTERGLOBAL(OUTPUTFILTER_NOISECIRCLE, "OUTPUTFILTER_NOISECIRCLE");
664 REGISTERGLOBAL(OUTPUTFILTER_NOISESTRIPE, "OUTPUTFILTER_NOISESTRIPE");
665
666
667 }
668
669