1 | #include "editor.h" |
2 | |
3 | // DDNet entity explanations by Lady Saavik |
4 | // TODO: Add other entities' tiles' explanations and improve new ones |
5 | |
6 | const 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 | |
491 | const 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 | |
599 | const 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 | |
669 | const 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 | |