1#include "editor.h"
2
3// DDNet entity explanations by Lady Saavik
4// TODO: Add other entities' tiles' explanations and improve new ones
5
6const char *CEditor::ExplainDDNet(int Tile, int Layer)
7{
8 switch(Tile)
9 {
10 case TILE_AIR:
11 return "EMPTY: Can be used as an eraser.";
12 case TILE_SOLID:
13 if(Layer == LAYER_GAME)
14 return "HOOKABLE: It's possible to hook and collide with it.";
15 break;
16 case TILE_DEATH:
17 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
18 return "KILL: Kills the tee.";
19 break;
20 case TILE_NOHOOK:
21 if(Layer == LAYER_GAME)
22 return "UNHOOKABLE: It's not possible to hook it, but can collide with it.";
23 break;
24 case TILE_NOLASER:
25 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
26 return "LASER BLOCKER: Doesn't let DRAGGING & SPINNING LASER and PLASMA TURRET reach tees through it.";
27 break;
28 case TILE_THROUGH_CUT:
29 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
30 return "HOOKTHROUGH: Shortcut for new hookthrough.";
31 break;
32 case TILE_THROUGH_ALL:
33 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
34 return "HOOKTHROUGH: Combined with a collision tile is new hookthrough, otherwise stops hooks, from all directions.";
35 break;
36 case TILE_THROUGH_DIR:
37 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
38 return "HOOKTHROUGH: Combined with a collision tile is new hookthrough, otherwise stops hook, from one direction.";
39 break;
40 case TILE_THROUGH:
41 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
42 return "HOOKTHROUGH: Combined with (UN)HOOKABLE tiles, allows to hook through the walls.";
43 break;
44 case TILE_JUMP:
45 if(Layer == LAYER_SWITCH)
46 return "JUMP: Sets defined amount of jumps (default is 2).";
47 break;
48 case TILE_FREEZE:
49 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
50 return "FREEZE: Freezes tees for 3 seconds.";
51 if(Layer == LAYER_SWITCH)
52 return "FREEZE: Freezes tees for defined amount of seconds.";
53 break;
54 case TILE_UNFREEZE:
55 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
56 return "UNFREEZE: Unfreezes tees immediately.";
57 break;
58 case TILE_TELEINEVIL:
59 if(Layer == LAYER_TELE)
60 return "RED TELEPORT: After falling into this tile, tees appear on TO with the same number. Speed and hooks are reset.";
61 break;
62 case TILE_DFREEZE:
63 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
64 return "DEEP FREEZE: Permanent freeze. Only UNDEEP tile can cancel this effect.";
65 break;
66 case TILE_DUNFREEZE:
67 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
68 return "UNDEEP: Removes DEEP FREEZE effect.";
69 break;
70 case TILE_LFREEZE:
71 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
72 return "LIVE FREEZE: Live frozen tees cannot move or jump, while hook and weapons can still be used.";
73 break;
74 case TILE_LUNFREEZE:
75 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
76 return "LIVE UNFREEZE: Removes LIVE FREEZE effect.";
77 break;
78 case TILE_TELEINWEAPON:
79 if(Layer == LAYER_TELE)
80 return "WEAPON TELEPORT: Teleports bullets shot into it to TELEPORT TO, where it comes out. Direction, angle and length are kept.";
81 break;
82 case TILE_TELEINHOOK:
83 if(Layer == LAYER_TELE)
84 return "HOOK TELEPORT: Teleports hooks entering into it to TELEPORT TO, where it comes out. Direction, angle and length are kept.";
85 break;
86 case TILE_WALLJUMP:
87 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
88 return "WALLJUMP: Placed next to a wall. Enables climbing up the wall.";
89 break;
90 case TILE_EHOOK_ENABLE:
91 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
92 return "ENDLESS HOOK: Activates endless hook.";
93 break;
94 case TILE_EHOOK_DISABLE:
95 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
96 return "ENDLESS HOOK OFF: Deactivates endless hook.";
97 break;
98 case TILE_HIT_ENABLE:
99 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
100 return "HIT OTHERS: You can hit others.";
101 if(Layer == LAYER_SWITCH)
102 return "HIT OTHERS: You can activate hitting others for single weapons, using delay number to select which.";
103 break;
104 case TILE_HIT_DISABLE:
105 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
106 return "HIT OTHERS: You can't hit others.";
107 if(Layer == LAYER_SWITCH)
108 return "HIT OTHERS: You can deactivate hitting others for single weapons, using delay number to select which.";
109 break;
110 case TILE_SOLO_ENABLE:
111 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
112 return "SOLO: You are now in a solo part.";
113 break;
114 case TILE_SOLO_DISABLE: // also TILE_SWITCHTIMEDOPEN
115 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
116 return "SOLO: You are now out of the solo part.";
117 if(Layer == LAYER_SWITCH)
118 return "TIME SWITCH: Activates switch (e.g. closes door) with the same number for a set amount of seconds.";
119 break;
120 case TILE_SWITCHTIMEDCLOSE:
121 if(Layer == LAYER_SWITCH)
122 return "TIME SWITCH: Deactivates switch (e.g. opens door) with the same number for a set amount of seconds.";
123 break;
124 case TILE_SWITCHOPEN:
125 if(Layer == LAYER_SWITCH)
126 return "SWITCH: Activates switch (e.g. closes door) with the same number.";
127 break;
128 case TILE_SWITCHCLOSE:
129 if(Layer == LAYER_SWITCH)
130 return "SWITCH: Deactivates switch (e.g. opens door) with the same number.";
131 break;
132 case TILE_TELEIN:
133 if(Layer == LAYER_TELE)
134 return "BLUE TELEPORT: After falling into this tile, tees appear on TO with the same number. Speed and hook are kept.";
135 break;
136 case TILE_TELEOUT:
137 if(Layer == LAYER_TELE)
138 return "TELEPORT TO: Destination tile for FROMs, WEAPON & HOOK TELEPORTs with the same numbers.";
139 break;
140 case TILE_BOOST:
141 if(Layer == LAYER_SPEEDUP)
142 return "SPEEDUP: Gives tee defined speed. Arrow shows direction and angle.";
143 break;
144 case TILE_TELECHECK:
145 if(Layer == LAYER_TELE)
146 return "CHECKPOINT TELEPORT: After having touched this tile, any CFRM will teleport you to CTO with the same number.";
147 break;
148 case TILE_TELECHECKOUT:
149 if(Layer == LAYER_TELE)
150 return "CHECKPOINT TELEPORT TO: Tees will appear here after touching TELEPORT CHECKPOINT with the same number and falling into CFROM TELEPORT.";
151 break;
152 case TILE_TELECHECKIN:
153 if(Layer == LAYER_TELE)
154 return "BLUE CHECKPOINT TELEPORT: Sends tees to CTO with the same number as the last touched TELEPORT CHECKPOINT. Speed and hook are kept.";
155 break;
156 case TILE_REFILL_JUMPS:
157 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
158 return "REFILL JUMPS: Restores all jumps.";
159 break;
160 case TILE_START:
161 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
162 return "START: Starts counting your race time.";
163 break;
164 case TILE_FINISH:
165 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
166 return "FINISH: End of race.";
167 break;
168 case TILE_STOP:
169 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
170 return "STOPPER: You can hook and shoot through it. You can't go through it against the arrow.";
171 break;
172 case TILE_STOPS:
173 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
174 return "STOPPER: You can hook and shoot through it. You can't go through it against the arrows.";
175 break;
176 case TILE_STOPA:
177 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
178 return "STOPPER: You can hook and shoot through it. You can't go through it.";
179 break;
180 case TILE_TELECHECKINEVIL:
181 if(Layer == LAYER_TELE)
182 return "RED CHECKPOINT TELEPORT: Send tees to CTO with the same number as the last touched TELEPORT CHECKPOINT. Speed and hook are reset.";
183 break;
184 case TILE_CP:
185 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
186 return "SPEEDER: Causes weapons, SHIELD, HEART and SPINNING LASER to move slowly.";
187 break;
188 case TILE_CP_F:
189 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
190 return "SPEEDER: Causes weapons, SHIELD, HEART and SPINNING LASER to move quickly.";
191 break;
192 case TILE_TUNE:
193 if(Layer == LAYER_TUNE)
194 return "TUNE ZONE: Area where defined tunes work.";
195 break;
196 case TILE_OLDLASER:
197 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
198 return "GLOBAL OLD SHOTGUN: Shotgun drags others always towards the shooter, even after having bounced. Shooter can't hit themselves. Place only one tile somewhere on the map.";
199 break;
200 case TILE_NPC:
201 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
202 return "GLOBAL COLLISION OFF: Nobody can collide with others. Place only one tile somewhere on the map.";
203 break;
204 case TILE_EHOOK:
205 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
206 return "GLOBAL ENDLESS HOOK ON: Everyone has endless hook. Place only one tile somewhere on the map.";
207 break;
208 case TILE_NOHIT:
209 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
210 return "GLOBAL HIT OTHERS OFF: Nobody can hit others. Place only one tile somewhere on the map.";
211 break;
212 case TILE_NPH:
213 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
214 return "GLOBAL HOOK OTHERS OFF: Nobody can hook others. Place only one tile somewhere on the map.";
215 break;
216 case TILE_UNLOCK_TEAM:
217 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
218 return "UNLOCK TEAM: Forces team to be unlocked so that team doesn't get killed when one dies.";
219 break;
220 case TILE_ADD_TIME:
221 if(Layer == LAYER_SWITCH)
222 return "PENALTY: Adds time to your current race time. Opposite of BONUS.";
223 break;
224 case TILE_NPC_DISABLE:
225 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
226 return "COLLISION OFF: You can't collide with others.";
227 break;
228 case TILE_UNLIMITED_JUMPS_DISABLE:
229 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
230 return "SUPER JUMP OFF: You don't have unlimited air jumps.";
231 break;
232 case TILE_JETPACK_DISABLE:
233 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
234 return "JETPACK OFF: You lose your jetpack gun.";
235 break;
236 case TILE_NPH_DISABLE:
237 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
238 return "HOOK OTHERS OFF: You can't hook others.";
239 break;
240 case TILE_SUBTRACT_TIME:
241 if(Layer == LAYER_SWITCH)
242 return "BONUS: Subtracts time from your current race time. Opposite of PENALTY.";
243 break;
244 case TILE_NPC_ENABLE:
245 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
246 return "COLLISION: You can collide with others.";
247 break;
248 case TILE_UNLIMITED_JUMPS_ENABLE:
249 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
250 return "SUPER JUMP: You have unlimited air jumps.";
251 break;
252 case TILE_JETPACK_ENABLE:
253 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
254 return "JETPACK: You have a jetpack gun.";
255 break;
256 case TILE_NPH_ENABLE:
257 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
258 return "HOOK OTHERS: You can hook others.";
259 break;
260 case TILE_CREDITS_1:
261 case TILE_CREDITS_2:
262 case TILE_CREDITS_3:
263 case TILE_CREDITS_4:
264 case TILE_CREDITS_5:
265 case TILE_CREDITS_6:
266 case TILE_CREDITS_7:
267 case TILE_CREDITS_8:
268 return "CREDITS: Who designed the entities.";
269 case TILE_ENTITIES_OFF_1:
270 case TILE_ENTITIES_OFF_2:
271 return "ENTITIES OFF SIGN: Informs people playing with entities about important marks, tips, information or text on the map.";
272 // Entities
273 case ENTITY_OFFSET + ENTITY_SPAWN:
274 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
275 return "SPAWN: Here tees will appear after joining the game or dying somewhere on the map.";
276 break;
277 case ENTITY_OFFSET + ENTITY_SPAWN_RED:
278 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
279 return "SPAWN: Red team members spawn here, same as normal spawn in DDRace.";
280 break;
281 case ENTITY_OFFSET + ENTITY_SPAWN_BLUE:
282 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
283 return "SPAWN: Blue team members spawn here, same as normal spawn in DDRace.";
284 break;
285 case ENTITY_OFFSET + ENTITY_FLAGSTAND_RED:
286 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
287 return "FLAG: Not used in DDRace. Place where red team flag is.";
288 break;
289 case ENTITY_OFFSET + ENTITY_FLAGSTAND_BLUE:
290 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
291 return "FLAG: Not used in DDRace. Place where blue team flag is.";
292 break;
293 case ENTITY_OFFSET + ENTITY_ARMOR_1:
294 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
295 return "SHIELD: Takes all weapons (except hammer and pistol) away.";
296 break;
297 case ENTITY_OFFSET + ENTITY_HEALTH_1:
298 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
299 return "HEART: Works like a FREEZE tile. Freezes tees for 3 seconds by default.";
300 break;
301 case ENTITY_OFFSET + ENTITY_WEAPON_SHOTGUN:
302 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
303 return "SHOTGUN: Drags the tees towards it. Bounces off the walls.";
304 break;
305 case ENTITY_OFFSET + ENTITY_WEAPON_GRENADE:
306 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
307 return "GRENADE LAUNCHER: Throws exploding bullets. Also known as rocket.";
308 break;
309 case ENTITY_OFFSET + ENTITY_POWERUP_NINJA:
310 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
311 return "NINJA: Makes you invisible in the darkest nights.";
312 break;
313 case ENTITY_OFFSET + ENTITY_WEAPON_LASER:
314 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
315 return "LASER: Unfreezes hit tee. Bounces off the walls. Also known as laser.";
316 break;
317 case ENTITY_OFFSET + ENTITY_LASER_FAST_CCW:
318 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
319 return "SPINNING LASER: Tile where freezing laser (made with LASER LENGTH) begins. Counter-Clockwise, fast.";
320 break;
321 case ENTITY_OFFSET + ENTITY_LASER_NORMAL_CCW:
322 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
323 return "SPINNING LASER: Tile where freezing laser (made with LASER LENGTH) begins. Counter-Clockwise, medium speed.";
324 break;
325 case ENTITY_OFFSET + ENTITY_LASER_SLOW_CCW:
326 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
327 return "SPINNING LASER: Tile where freezing laser (made with LASER LENGTH) begins. Counter-Clockwise, slow.";
328 break;
329 case ENTITY_OFFSET + ENTITY_LASER_STOP:
330 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
331 return "NON-SPINNING LASER: Tile where freezing laser (made with LASER LENGTH) begins.";
332 break;
333 case ENTITY_OFFSET + ENTITY_LASER_SLOW_CW:
334 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
335 return "SPINNING LASER: Tile where freezing laser (made with LASER LENGTH) begins. Clockwise, slow.";
336 break;
337 case ENTITY_OFFSET + ENTITY_LASER_NORMAL_CW:
338 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
339 return "SPINNING LASER: Tile where freezing laser (made with LASER LENGTH) begins. Clockwise, medium speed.";
340 break;
341 case ENTITY_OFFSET + ENTITY_LASER_FAST_CW:
342 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
343 return "SPINNING LASER: Tile where freezing laser (made with LASER LENGTH) begins. Clockwise, fast.";
344 break;
345 case ENTITY_OFFSET + ENTITY_LASER_SHORT:
346 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
347 return "LASER LENGTH: Put next to DOOR or SPINNING LASER, makes it 3 tiles long.";
348 break;
349 case ENTITY_OFFSET + ENTITY_LASER_MEDIUM:
350 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
351 return "LASER LENGTH: Put next to DOOR or SPINNING LASER, makes it 6 tiles long.";
352 break;
353 case ENTITY_OFFSET + ENTITY_LASER_LONG:
354 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
355 return "LASER LENGTH: Put next to DOOR or SPINNING LASER, makes it 9 tiles long.";
356 break;
357 case ENTITY_OFFSET + ENTITY_LASER_C_SLOW:
358 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
359 return "LASER LENGTH CHANGE: Put next to LASER LENGTH, causes it to length and shorten constantly. Works only on (NON-)SPINNING LASER, not on DOOR. Lengthen, slow.";
360 break;
361 case ENTITY_OFFSET + ENTITY_LASER_C_NORMAL:
362 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
363 return "LASER LENGTH CHANGE: Put next to LASER LENGTH, causes it to length and shorten constantly. Works only on (NON-)SPINNING LASER, not on DOOR. Lengthen, medium speed.";
364 break;
365 case ENTITY_OFFSET + ENTITY_LASER_C_FAST:
366 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
367 return "LASER LENGTH CHANGE: Put next to LASER LENGTH, causes it to length and shorten constantly. Works only on (NON-)SPINNING LASER, not on DOOR. Lengthen, fast.";
368 break;
369 case ENTITY_OFFSET + ENTITY_LASER_O_SLOW:
370 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
371 return "LASER LENGTH CHANGE: Put next to LASER LENGTH, causes it to length and shorten constantly. Works only on (NON-)SPINNING LASER, not on DOOR. Shorten, slow.";
372 break;
373 case ENTITY_OFFSET + ENTITY_LASER_O_NORMAL:
374 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
375 return "LASER LENGTH CHANGE: Put next to LASER LENGTH, causes it to length and shorten constantly. Works only on (NON-)SPINNING LASER, not on DOOR. Shorten, medium speed.";
376 break;
377 case ENTITY_OFFSET + ENTITY_LASER_O_FAST:
378 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
379 return "LASER LENGTH CHANGE: Put next to LASER LENGTH, causes it to length and shorten constantly. Works only on (NON-)SPINNING LASER, not on DOOR. Shorten, fast.";
380 break;
381 case ENTITY_OFFSET + ENTITY_PLASMAE:
382 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
383 return "PLASMA TURRET: Shoots plasma bullets at the closest tee. They explode on an obstactle they hit (wall or tee).";
384 break;
385 case ENTITY_OFFSET + ENTITY_PLASMAF:
386 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
387 return "PLASMA TURRET: Shoots plasma bullets that work like FREEZE at the closest tee.";
388 break;
389 case ENTITY_OFFSET + ENTITY_PLASMA:
390 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
391 return "PLASMA TURRET: Shoots plasma bullets that work like FREEZE at the closest tee. They also explode on an obstactly they hit (wall or tee).";
392 break;
393 case ENTITY_OFFSET + ENTITY_PLASMAU:
394 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
395 return "PLASMA TURRET: Shoots plasma bullets that work like UNFREEZE at the closest tee.";
396 break;
397 case ENTITY_OFFSET + ENTITY_CRAZY_SHOTGUN_EX:
398 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
399 return "EXPLODING BULLET: Bounces off the walls with explosion. Touching the bullet works like FREEZE tile (freezes for 3 seconds by default).";
400 break;
401 case ENTITY_OFFSET + ENTITY_CRAZY_SHOTGUN:
402 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
403 return "BULLET: Bounces off the walls without explosion. Touching the bullet works like FREEZE tile (freezes for 3 seconds by default).";
404 break;
405 case ENTITY_OFFSET + ENTITY_ARMOR_SHOTGUN:
406 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
407 return "SHOTGUN SHIELD: Takes shotgun away.";
408 break;
409 case ENTITY_OFFSET + ENTITY_ARMOR_GRENADE:
410 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
411 return "GRENADE SHIELD: Takes grenade away.";
412 break;
413 case ENTITY_OFFSET + ENTITY_ARMOR_NINJA:
414 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
415 return "NINJA SHIELD: Takes ninja away.";
416 break;
417 case ENTITY_OFFSET + ENTITY_ARMOR_LASER:
418 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
419 return "LASER SHIELD: Takes laser away.";
420 break;
421 case ENTITY_OFFSET + ENTITY_DRAGGER_WEAK:
422 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
423 return "DRAGGING LASER: Grabs and attracts the closest tee to it. Can't reach tees through walls and LASER BLOCKER. Weak.";
424 break;
425 case ENTITY_OFFSET + ENTITY_DRAGGER_NORMAL:
426 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
427 return "DRAGGING LASER: Grabs and attracts the closest tee to it. Can't reach tees through walls and LASER BLOCKER. Medium strength.";
428 break;
429 case ENTITY_OFFSET + ENTITY_DRAGGER_STRONG:
430 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
431 return "DRAGGING LASER: Grabs and attracts the closest tee to it. Can't reach tees through walls and LASER BLOCKER. Strong.";
432 break;
433 case ENTITY_OFFSET + ENTITY_DRAGGER_WEAK_NW:
434 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
435 return "DRAGGING LASER: Grabs and attracts the closest tee to it. Can reach tees through walls but not through LASER BLOCKER. Weak.";
436 break;
437 case ENTITY_OFFSET + ENTITY_DRAGGER_NORMAL_NW:
438 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
439 return "DRAGGING LASER: Grabs and attracts the closest tee to it. Can reach tees through walls but not through LASER BLOCKER. Medium strength.";
440 break;
441 case ENTITY_OFFSET + ENTITY_DRAGGER_STRONG_NW:
442 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
443 return "DRAGGING LASER: Grabs and attracts the closest tee to it. Can reach tees through walls but not through LASER BLOCKER. Strong.";
444 break;
445 case ENTITY_OFFSET + ENTITY_DOOR:
446 if(Layer == LAYER_GAME || Layer == LAYER_FRONT || Layer == LAYER_SWITCH)
447 return "DOOR: Combined with LASER LENGTH creates doors. Doesn't allow to go through it (only with NINJA).";
448 break;
449 case TILE_TELE_GUN_ENABLE:
450 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
451 return "TELEGUN: Turn gun on as telegun weapon.";
452 break;
453 case TILE_TELE_GUN_DISABLE:
454 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
455 return "TELEGUN OFF: Turn gun off as telegun weapon.";
456 break;
457 case TILE_ALLOW_TELE_GUN:
458 if(Layer == LAYER_FRONT)
459 return "TELEGUN: Place on top of a collision tile, activates a spot to teleport to, cancels movement.";
460 if(Layer == LAYER_SWITCH)
461 return "TELEGUN: Place on top of a collision tile, activates a spot to teleport to, cancels movement, for single weapons, using delay number to select which.";
462 break;
463 case TILE_ALLOW_BLUE_TELE_GUN:
464 if(Layer == LAYER_FRONT)
465 return "TELEGUN: Place on top of a collision tile, activates a spot to teleport to, preserves movement.";
466 if(Layer == LAYER_SWITCH)
467 return "TELEGUN: Place on top of a collision tile, activates a spot to teleport to, preserves movement, for single weapons, using delay number to select which.";
468 break;
469 case TILE_TELE_GRENADE_ENABLE:
470 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
471 return "TELEGRENADE: Turn grenade on as telegun weapon.";
472 break;
473 case TILE_TELE_GRENADE_DISABLE:
474 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
475 return "TELEGRENADE OFF: Turn grenade off as telegun weapon.";
476 break;
477 case TILE_TELE_LASER_ENABLE:
478 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
479 return "TELELASER: Turn laser on as telegun weapon.";
480 break;
481 case TILE_TELE_LASER_DISABLE:
482 if(Layer == LAYER_GAME || Layer == LAYER_FRONT)
483 return "TELELASER OFF: Turn laser off as telegun weapon.";
484 break;
485 }
486 if(Tile >= TILE_TIME_CHECKPOINT_FIRST && Tile <= TILE_TIME_CHECKPOINT_LAST && (Layer == LAYER_GAME || Layer == LAYER_FRONT))
487 return "TIME CHECKPOINT: Compares your current race time with your record to show you whether you are running faster or slower.";
488 return nullptr;
489}
490
491const char *CEditor::ExplainFNG(int Tile, int Layer)
492{
493 switch(Tile)
494 {
495 case TILE_PUB_AIR:
496 return "EMPTY: Can be used as an eraser.";
497 case TILE_PUB_HOOKABLE:
498 if(Layer == LAYER_GAME)
499 return "HOOKABLE: It's possible to hook and collide with it.";
500 break;
501 case TILE_PUB_DEATH:
502 if(Layer == LAYER_GAME)
503 return "DEATH: Kills the tee.";
504 break;
505 case TILE_PUB_UNHOOKABLE:
506 if(Layer == LAYER_GAME)
507 return "UNHOOKABLE: It's not possible to hook it, but can collide with it.";
508 break;
509 case TILE_FNG_SPIKE_GOLD:
510 if(Layer == LAYER_GAME)
511 return "GOLDEN SPIKE: Kills the tee and gives points to the killer. (Amount of points given is set inside the server)";
512 break;
513 case TILE_FNG_SPIKE_NORMAL:
514 if(Layer == LAYER_GAME)
515 return "NORMAL SPIKE: Kills the tee and gives points to the killer. (Amount of points given is set inside the server)";
516 break;
517 case TILE_FNG_SPIKE_RED:
518 if(Layer == LAYER_GAME)
519 return "RED SPIKE: Red team spikes. Gives negative points when killer is in blue team (Amount of points given is set inside the server)";
520 break;
521 case TILE_FNG_SPIKE_BLUE:
522 if(Layer == LAYER_GAME)
523 return "BLUE SPIKE: Blue team spikes. Gives negative points when killer is in red team (Amount of points given is set inside the server)";
524 break;
525 case TILE_FNG_SCORE_RED:
526 if(Layer == LAYER_GAME)
527 return "SCORE: Old tile used for showing red team score using laser text. No longer usable in FNG2";
528 break;
529 case TILE_FNG_SCORE_BLUE:
530 if(Layer == LAYER_GAME)
531 return "SCORE: Old tile used for showing blue team score using laser text. No longer usable in FNG2";
532 break;
533 case TILE_FNG_SPIKE_GREEN:
534 if(Layer == LAYER_GAME)
535 return "GREEN SPIKE: Kills the tee and gives points to the killer. (Amount of points given is set inside the server)";
536 break;
537 case TILE_FNG_SPIKE_PURPLE:
538 if(Layer == LAYER_GAME)
539 return "PURPLE SPIKE: Kills the tee and gives points to the killer. (Amount of points given is set inside the server)";
540 break;
541 case TILE_FNG_SPAWN:
542 if(Layer == LAYER_GAME)
543 return "SPAWN: Here tees will appear after joining the game or dying.";
544 break;
545 case TILE_FNG_SPAWN_RED:
546 if(Layer == LAYER_GAME)
547 return "SPAWN: Red team members spawn here.";
548 break;
549 case TILE_FNG_SPAWN_BLUE:
550 if(Layer == LAYER_GAME)
551 return "SPAWN: Blue team members spawn here.";
552 break;
553 case TILE_FNG_FLAG_RED:
554 if(Layer == LAYER_GAME)
555 return "FLAG: Not used in FNG. Place where red team flag is.";
556 break;
557 case TILE_FNG_FLAG_BLUE:
558 if(Layer == LAYER_GAME)
559 return "FLAG: Not used in FNG. Place where blue team flag is.";
560 break;
561 case TILE_FNG_SHIELD:
562 if(Layer == LAYER_GAME)
563 return "SHIELD: Does nothing in FNG.";
564 break;
565 case TILE_FNG_HEART:
566 if(Layer == LAYER_GAME)
567 return "HEART: Does nothing in FNG.";
568 break;
569 case TILE_FNG_SHOTGUN:
570 if(Layer == LAYER_GAME)
571 return "SHOTGUN: Not used in FNG. Gives you shotgun with 10 charges.";
572 break;
573 case TILE_FNG_GRENADE:
574 if(Layer == LAYER_GAME)
575 return "GRENADE: Gives you grenade weapon with 10 charges. Not really useful in FNG.";
576 break;
577 case TILE_FNG_NINJA:
578 if(Layer == LAYER_GAME)
579 return "NINJA: Does nothing in FNG.";
580 break;
581 case TILE_FNG_LASER:
582 if(Layer == LAYER_GAME)
583 return "LASER: Gives you laser weapon with 10 charges. Not really useful in FNG.";
584 break;
585 case TILE_FNG_SPIKE_OLD1:
586 case TILE_FNG_SPIKE_OLD2:
587 case TILE_FNG_SPIKE_OLD3:
588 if(Layer == LAYER_GAME)
589 return "SPIKE: Old FNG spikes. Deprecated.";
590 break;
591 }
592 if((Tile >= TILE_PUB_CREDITS1 && Tile <= TILE_PUB_CREDITS8) && Layer == LAYER_GAME)
593 return "CREDITS: Who designed the entities.";
594 else if((Tile == TILE_PUB_ENTITIES_OFF1 || Tile == TILE_PUB_ENTITIES_OFF2) && Layer == LAYER_GAME)
595 return "ENTITIES OFF SIGN: Informs people playing with entities about important marks, tips, information or text on the map.";
596 return nullptr;
597}
598
599const char *CEditor::ExplainVanilla(int Tile, int Layer)
600{
601 switch(Tile)
602 {
603 case TILE_PUB_AIR:
604 return "EMPTY: Can be used as an eraser.";
605 case TILE_PUB_HOOKABLE:
606 if(Layer == LAYER_GAME)
607 return "HOOKABLE: It's possible to hook and collide with it.";
608 break;
609 case TILE_PUB_DEATH:
610 if(Layer == LAYER_GAME)
611 return "DEATH: Kills the tee.";
612 break;
613 case TILE_PUB_UNHOOKABLE:
614 if(Layer == LAYER_GAME)
615 return "UNHOOKABLE: It's not possible to hook it, but can collide with it.";
616 break;
617 case TILE_VANILLA_SPAWN:
618 if(Layer == LAYER_GAME)
619 return "SPAWN: Here tees will appear after joining the game or dying.";
620 break;
621 case TILE_VANILLA_SPAWN_RED:
622 if(Layer == LAYER_GAME)
623 return "SPAWN: Red team members spawn here.";
624 break;
625 case TILE_VANILLA_SPAWN_BLUE:
626 if(Layer == LAYER_GAME)
627 return "SPAWN: Blue team members spawn here.";
628 break;
629 case TILE_VANILLA_FLAG_RED:
630 if(Layer == LAYER_GAME)
631 return "FLAG: Place where red team flag is.";
632 break;
633 case TILE_VANILLA_FLAG_BLUE:
634 if(Layer == LAYER_GAME)
635 return "FLAG: Place where blue team flag is.";
636 break;
637 case TILE_VANILLA_SHIELD:
638 if(Layer == LAYER_GAME)
639 return "SHIELD: Gives player +1 shield.";
640 break;
641 case TILE_VANILLA_HEART:
642 if(Layer == LAYER_GAME)
643 return "HEART: Gives player +1 health";
644 break;
645 case TILE_VANILLA_SHOTGUN:
646 if(Layer == LAYER_GAME)
647 return "SHOTGUN: Gives you shotgun weapon with 10 charges.";
648 break;
649 case TILE_VANILLA_GRENADE:
650 if(Layer == LAYER_GAME)
651 return "GRENADE: Gives you grenade weapon with 10 charges.";
652 break;
653 case TILE_VANILLA_NINJA:
654 if(Layer == LAYER_GAME)
655 return "NINJA: Gives you ninja for a period of time.";
656 break;
657 case TILE_VANILLA_LASER:
658 if(Layer == LAYER_GAME)
659 return "LASER: Gives you laser weapon with 10 charges.";
660 break;
661 }
662 if((Tile >= TILE_PUB_CREDITS1 && Tile <= TILE_PUB_CREDITS8) && Layer == LAYER_GAME)
663 return "CREDITS: Who designed the entities.";
664 else if((Tile == TILE_PUB_ENTITIES_OFF1 || Tile == TILE_PUB_ENTITIES_OFF2) && Layer == LAYER_GAME)
665 return "ENTITIES OFF SIGN: Informs people playing with entities about important marks, tips, information or text on the map.";
666 return nullptr;
667}
668
669const char *CEditor::Explain(EExplanation Explanation, int Tile, int Layer)
670{
671 switch(Explanation)
672 {
673 case EExplanation::NONE:
674 return nullptr;
675 case EExplanation::DDNET:
676 return ExplainDDNet(Tile, Layer);
677 case EExplanation::FNG:
678 return ExplainFNG(Tile, Layer);
679 case EExplanation::RACE:
680 return nullptr; // TODO: Explanations for Race
681 case EExplanation::VANILLA:
682 return ExplainVanilla(Tile, Layer);
683 case EExplanation::BLOCKWORLDS:
684 return nullptr; // TODO: Explanations for Blockworlds
685 }
686 dbg_assert(false, "logic error");
687 return nullptr;
688}
689