-
Notifications
You must be signed in to change notification settings - Fork 19
/
objectrenderer.cpp
4759 lines (4146 loc) · 168 KB
/
objectrenderer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#include "objectrenderer.h"
#include "objects.h"
#include "imagecache.h"
#include <QPainter>
#include <QPainterPath>
SpriteRenderer::SpriteRenderer(const Sprite *spr, Tileset *tilesets[])
{
this->spr = spr;
switch (spr->getid()) {
case 1: // Water Flow For Pipe
ret = new PipeFlowRenderer(spr);
break;
case 2: // Downwards Water Pull
ret = new DownWaterPullRenderer(spr);
break;
case 3: // Cheep Chomp
ret = new NormalImageRenderer(spr, "cheep_chomp.png");
break;
case 4: // Burner Right
ret = new BurnerRenderer(spr, "burner_right");
break;
case 5: // Burner Down
ret = new BurnerRenderer(spr, "burner_down");
break;
case 6: // Burner Left
ret = new BurnerRenderer(spr, "burner_left");
break;
case 7: // Burner Up
ret = new BurnerRenderer(spr, "burner_up");
break;
case 8: // Swoop
ret = new NormalImageRenderer(spr, "swoop.png");
break;
case 9: // Whomp
ret = new WhompRenderer(spr);
break;
case 10: // Switchable Conveyor Belt - Lemmy Battle
ret = new NormalImageRenderer(spr, "switchable_conveyor_belt_lemmy.png");
break;
case 16: // Amp
ret = new NormalImageRenderer(spr, "amp.png");
break;
case 17: // Amp Circle
ret = new CoinCircleRenderer(spr, tilesets[0]);
break;
case 18: // Tile God
ret = new TileGodRenderer(spr, tilesets[0]);
break;
case 19: // Desert Crater
ret = new NormalImageRenderer(spr, "desert_crater.png");
break;
case 20: // Gold Block
ret = new GoldBlockRenderer(spr, tilesets[0]);
break;
case 21: // Note Block
ret = new NoteBlockRenderer(spr);
break;
case 22: // Special Exit Controller
ret = new SpecialExitControllerRenderer(spr);
break;
case 24: case 25: // Flying Question Block
ret = new FlyingQuestionBlockRenderer(spr);
break;
case 26: // Roulette Block
ret = new RouletteBlockRenderer(spr);
break;
case 27: // POW Block
ret = new NormalImageRenderer(spr, "pow_block.png");
break;
case 28: // Movement Controlled POW Block
ret = new MovementSpriteRenderer(spr, "pow_block.png");
break;
case 29: // Bob-omb
ret = new NormalImageRenderer(spr, "bob-omb.png");
break;
case 31: // Boomerang Bro.
ret = new NormalImageRenderer(spr, "boomerang_bro.png");
break;
case 32: // Fire Bro.
ret = new NormalImageRenderer(spr, "fire_bro.png");
break;
case 33: // Hammer Bro.
ret = new NormalImageRenderer(spr, "hammer_bro.png");
break;
case 34: // Sledge Bro.
ret = new NormalImageRenderer(spr, "sledge_bro.png");
break;
case 35: // Lava Bubble
ret = new NormalImageRenderer(spr, "lava_bubble.png");
break;
case 36: // Arc Lava Bubble
ret = new ArcLavaBubbleRenderer(spr);
break;
case 38: // Reznor Wheel
ret = new ReznorWheelRenderer(spr);
break;
case 39: // Reznor Battle Dissapearing Blocks
ret = new ReznorBlockRenderer(spr);
break;
case 40: // ! Burner Right
ret = new BurnerRenderer(spr, "!burner_right");
break;
case 41: // ! Burner Down
ret = new BurnerRenderer(spr, "!burner_down");
break;
case 42: // ! Burner Left
ret = new BurnerRenderer(spr, "!burner_left");
break;
case 43: // ! Burner Up
ret = new BurnerRenderer(spr, "!burner_up");
break;
case 44: // Track-controlled Burner - Four Directions
ret = new FourBurnerRenderer(spr);
break;
case 45: // Track Controlled Burner Right
ret = new BurnerRenderer(spr, "track_burner_right");
break;
case 46: // Track Controlled Burner Down
ret = new BurnerRenderer(spr, "track_burner_down");
break;
case 47: // Track Controlled Burner Left
ret = new BurnerRenderer(spr, "track_burner_left");
break;
case 48: // Track Controlled Burner Up
ret = new BurnerRenderer(spr, "track_burner_up");
break;
case 51: // Fuzzy
ret = new FuzzyRenderer(spr);
break;
case 52: // Checkpoint Flag
ret = new NormalImageRenderer(spr, "checkpoint_flag.png");
break;
case 55: // Coin
ret = new NormalImageRenderer(spr, "coin.png");
break;
case 56: // Coin Bubble
ret = new NormalImageRenderer(spr, "coin_bubble.png");
break;
case 59: // Rotation Controlled Coin
ret = new RotationSpriteRenderer(spr, "coin.png");
break;
case 60: // Movement Controlled Coin
ret = new MovementSpriteRenderer(spr, "coin.png");
break;
case 61: // Red Coin
ret = new RedCoinRenderer(spr, "red_coin.png");
break;
case 62: // Rotation Controlled Red Coin
ret = new RotationSpriteRenderer(spr, "red_coin.png");
break;
case 63: // Skewer Left
ret = new SkewerRenderer(spr);
break;
case 64: // Skewer Right
ret = new SkewerRenderer(spr);
break;
case 65: // Morton Pipe
ret = new NormalImageRenderer(spr, "morton_pipe.png");
break;
case 66: // Pipe Cannon
ret = new NormalImageRenderer(spr, "pipe_cannon.png");
break;
case 67: // Pipe Cannon - Ludwig Bossfight
ret = new NormalImageRenderer(spr, "pipe_cannon_ludwig.png");
break;
case 69: // Door
ret = new NormalImageRenderer(spr, "door.png");
break;
case 70: // Castle Boss Door
ret = new NormalImageRenderer(spr, "door_castle.png");
break;
case 71: // Closed Door
ret = new NormalImageRenderer(spr, "door_closed.png");
break;
case 72: // Final Boss Door
ret = new NormalImageRenderer(spr, "door_final_boss.png");
break;
case 73: // Ghost House Door
ret = new NormalImageRenderer(spr, "door_ghosthouse.png");
break;
case 74: // Ghost House Door - Event triggered
ret = new NormalImageRenderer(spr, "door_ghosthouse_event.png");
break;
case 75: // Tower Boss Door
ret = new NormalImageRenderer(spr, "door_tower.png");
break;
case 76: // Big Thwomp
ret = new NormalImageRenderer(spr, "big_thwomp.png");
break;
case 77: // Thwomp
ret = new NormalImageRenderer(spr, "thwomp.png");
break;
case 78: // Fire Bar
ret = new FireBarRenderer(spr);
break;
case 81: // Fireball Pipe - ! Junction
ret = new NormalImageRenderer(spr, "fireballpipe_junction.png");
break;
case 82: // Fire Snake
ret = new FireSnakeRenderer(spr);
break;
case 83: // Fish Bone
ret = new NormalImageRenderer(spr, "fish_bone.png");
break;
case 84: // Flag Controller - Chainer
ret = new FlagRenderer(spr);
break;
case 85: // Flag Controller - IF
ret = new FlagRenderer(spr);
break;
case 86: // Flag Controller - Zone enter
ret = new FlagRenderer(spr);
break;
case 87: // Flag Controller - Multi Chainer
ret = new FlagRenderer(spr);
break;
case 88: // Flag Controller - On screen
ret = new FlagRenderer(spr);
break;
case 89: // porcupuffer
ret = new NormalImageRenderer(spr, "porcupuffer.png");
break;
case 91: // Coin Coffer
ret = new NormalImageRenderer(spr, "coin_coffer.png");
break;
case 92: // Grinder
ret = new NormalImageRenderer(spr, "grinder.png");
break;
case 93: // Scuttlebug
ret = new NormalImageRenderer(spr, "scuttlebug.png");
break;
case 94: // Flipper (One way gate)
ret = new FlipperRenderer(spr);
break;
case 95: // Blooper
ret = new BlooperRenderer(spr);
break;
case 96: // Blooper Nanny
ret = new BlooperRenderer(spr);
break;
case 97: // End of Level Flag
ret = new GoalRenderer(spr);
break;
case 99: // Wiggler
ret = new NormalImageRenderer(spr, "wiggler.png");
break;
case 100: // Rotation Controlled ? Block
ret = new ItemBlockRenderer(spr, tilesets[0]);
break;
case 101: // Movement Controlled ? Block
ret = new ItemBlockRenderer(spr, tilesets[0]);
break;
case 102: // Iggy
ret = new NormalImageRenderer(spr, "iggy.png");
break;
case 104: // Lakitu
ret = new NormalImageRenderer(spr, "lakitu.png");
break;
case 106: // Trampoline
ret = new NormalImageRenderer(spr, "trampoline.png");
break;
case 107: // Path Controlled Climbable Fence
ret = new PathContFenceRenderer(spr);
break;
case 108: // Spider Web
ret = new NormalImageRenderer(spr, "spider_web.png");
break;
case 109: // Signboard
ret = new SignboardRenderer(spr);
break;
case 110: // Dry Bones
ret = new NormalImageRenderer(spr, "dry_bones.png");
break;
case 111: // Giant Dry Bones
ret = new NormalImageRenderer(spr, "giant_dry_bones.png");
break;
case 113: // Flame Chomp
ret = new NormalImageRenderer(spr, "flame_chomp.png");
break;
case 114: // Floating Box
ret = new FloatingBoxRenderer(spr);
break;
case 115: // Bullet Bill Launcher
ret = new BulletBillLauncherRenderer(spr);
break;
case 116: // Bullet Bill Turret
ret = new BulletBillTurretRenderer(spr);
break;
case 117: // Banzai Bill Launcher
ret = new NormalImageRenderer(spr, "banzai_bill_launcher.png");
break;
case 118: // Bullet Bill
ret = new BulletBillRenderer(spr);
break;
case 119: // Banzi Bill
ret = new BanzaiBillRenderer(spr);
break;
case 120: // Up Down Mushroom
ret = new UpDownMushroomRenderer(spr);
break;
case 121: // Expanding Mushroom
ret = new ExpandMushroomRenderer(spr);
break;
case 122: // Synchronized Expanding Mushroom
ret = new ExpandMushroomRenderer(spr);
break;
case 123: // Bouncy Mushroom
ret = new BouncyMushroomRenderer(spr);
break;
case 124: // Mushroom Platform
ret = new MushroomPlatformRenderer(spr);
break;
case 125: // Bowser
ret = new NormalImageRenderer(spr, "bowser.png");
break;
case 127: // Bowser Flame
ret = new BowserFlameRenderer(spr);
break;
case 128: // Dry Bowser
ret = new NormalImageRenderer(spr, "dry_bowser.png");
break;
case 131: // Bowser Block
ret = new BowserBlockRenderer(spr, tilesets[0]);
break;
case 132: // Bowser Battle Switch Controller
ret = new NormalImageRenderer(spr, "bowser_switch.png");
break;
case 133: // Bowser Shutter
ret = new NormalImageRenderer(spr, "bowser_shutter.png");
break;
case 134: // Bowser Bridge
ret = new NormalImageRenderer(spr, "bowser_bridge.png");
break;
case 135: // Goomba
ret = new GoombaRenderer(spr);
break;
case 136: // Bone Goomba
ret = new BoneGoombaRenderer(spr);
break;
case 137: // Micro Goomba
ret = new NormalImageRenderer(spr, "micro_goomba.png");
break;
case 138: // Paragoomba
ret = new NormalImageRenderer(spr, "paragoomba.png");
break;
case 139: // Goomba Tower
ret = new GoombaTowerRenderer(spr);
break;
case 140: // Crowber
ret = new NormalImageRenderer(spr, "crowber.png");
break;
case 141: // Larry
ret = new NormalImageRenderer(spr, "larry.png");
break;
case 142: // Lemmy
ret = new NormalImageRenderer(spr, "lemmy.png");
break;
case 143: // Conveyor Belt Switch
ret = new NormalImageRenderer(spr, "conveyor_belt_switch.png");
break;
case 144: // Horizontal Lift
ret = new LiftRenderer(spr, "lift_platform");
break;
case 145: // Vertical Lift
ret = new LiftRenderer(spr, "lift_platform");
break;
case 146: // Track Controlled Lift
ret = new TrackLiftRenderer(spr);
break;
case 147: // 3 Plat rickshaw
ret = new ThreePlatRickRenderer(spr);
break;
case 148: // Move While On Lift
ret = new NormalImageRenderer(spr, "move_while_on_lift.png");
break;
case 149: // Changeable Direction Platform
ret = new NormalImageRenderer(spr, "change_direction_platofrm.png");
break;
case 150: // Seesaw Lift
ret = new NormalImageRenderer(spr, "seesaw_lift.png");
break;
case 151: // Scale Lift
ret = new ScalePlatformRenderer(spr);
break;
case 152: // Path Controlled Lift With Peepa
ret = new PeepaLiftRenderer(spr);
break;
case 154: // 3 Plat rickshaw
ret = new FourPlatRickRenderer(spr);
break;
case 155: // Ludwig
ret = new NormalImageRenderer(spr, "ludwig.png");
break;
case 158: // Buzzy Beetle
ret = new BuzzyBeetleRenderer(spr);
break;
case 159: // Spike Top
ret = new SpikeTopRenderer(spr);
break;
case 162: // Morton
ret = new NormalImageRenderer(spr, "morton.png");
break;
case 163: // Climing Koopa - Horizontal
ret = new ClimbKoopaHorRenderer(spr);
break;
case 164: // Climing Koopa - Vertical
ret = new ClimbKoopaVertRenderer(spr);
break;
case 165: // Koopa Troopa
ret = new KoopaTroopaRenderer(spr);
break;
case 167: // Pipe Piranha Plant - Down
ret = new NormalImageRenderer(spr, "piranha_pipe_down.png");
break;
case 168: // Fire Pipe Piranha Plant - Down
ret = new NormalImageRenderer(spr, "piranha_fire_pipe_down.png");
break;
case 169: // Pipe Piranha Plant - Left
ret = new NormalImageRenderer(spr, "piranha_fire_pipe_left.png");
break;
case 170: // Pipe Piranha Plant - Right
ret = new NormalImageRenderer(spr, "piranha_fire_pipe_right.png");
break;
case 171: // Pipe Piranha Plant - Up
ret = new NormalImageRenderer(spr, "piranha_fire_pipe_up.png");
break;
case 172: // Pipe bone Piranha Plant - Up
ret = new NormalImageRenderer(spr, "bone_piranha_pipe_up.png");
break;
case 173: // Pipe Bone Piranha Plant - Left
ret = new NormalImageRenderer(spr, "bone_piranha_pipe_left.png");
break;
case 174: // Pipe Bone Piranha Plant - Right
ret = new NormalImageRenderer(spr, "bone_piranha_pipe_right.png");
break;
case 175: // Grounded Piranha Plant
ret = new PlantRenderer(spr, "piranha_plant");
break;
case 176: // Big Grounded Pirahna Plant
ret = new PlantRenderer(spr, "big_piranha_plant");
break;
case 177: // Grounded Fire Piranha Plant
ret = new PlantRenderer(spr, "fire_piranha_plant");
break;
case 178: // Big Grounded Fire Pirahna Plant
ret = new PlantRenderer(spr, "big_fire_piranha_plant");
break;
case 179: // Grounded Bone Piranha Plant
ret = new PlantRenderer(spr, "bone_piranha_plant");
break;
case 180: // Big Grounded Bone Pirahna Plant
ret = new PlantRenderer(spr, "big_bone_piranha_plant");
break;
case 181: // Pipe Piranha Plant - Left
ret = new NormalImageRenderer(spr, "piranha_pipe_left.png");
break;
case 182: // Pipe Piranha Plant - Right
ret = new NormalImageRenderer(spr, "piranha_pipe_right.png");
break;
case 183: // Pipe Piranha Plant - Up
ret = new NormalImageRenderer(spr, "piranha_pipe_up.png");
break;
case 184: // Parabomb
ret = new NormalImageRenderer(spr, "parabomb.png");
break;
case 185: // Koopa Paratroopa
ret = new KoopaParatroopaRenderer(spr);
break;
case 186: // Paratroopa Circle
ret = new CoinCircleRenderer(spr, tilesets[0]);
break;
case 187: // Path Controlled Rectangle Lift
ret = new PathRecLiftRenderer(spr, tilesets[0]);
break;
case 189: // Rectangle Lift - Tower
ret = new RecLiftRenderer(spr, "tower_rectangle_lift/");
break;
case 190: // Rectangle Lift - Ghosthouse (Checkered)
ret = new RecLiftRenderer(spr, "checkered_rectangle_lift/");
break;
case 191: // Rectangle Lift - Desert
ret = new RecLiftRenderer(spr, "desert_rectangle_lift/");
break;
case 192: // Rectangle Lift - Castle
ret = new RecLiftRenderer(spr, "castle_rectangle_lift/");
break;
case 193: // Rectangle Lift - Underwater
ret = new RecLiftRenderer(spr, "underwater_rectangle_lift/");
break;
case 194: // Cheep Cheep
ret = new CheepCheepRenderer(spr);
break;
case 195: // Big Cheep Cheep
ret = new BigCheepRenderer(spr);
break;
case 196: // Coin Cheep
ret = new NormalImageRenderer(spr, "coin_cheep.png");
break;
case 197: // Jumping Cheep Cheep
ret = new JumpingCheepRenderer(spr);
break;
case 199: // Cheep Cheep Circle
ret = new CoinCircleRenderer(spr, tilesets[0]);
break;
case 200: // Spiny Cheep Cheep
ret = new SpinyCheepRenderer(spr);
break;
case 203: // Rotation Controlled Brick Block
ret = new ItemBlockRenderer(spr, tilesets[0]);
break;
case 204: // Movement Controlled Brick Block
ret = new ItemBlockRenderer(spr, tilesets[0]);
break;
case 205: // Red Ring
ret = new NormalImageRenderer(spr, "red_ring.png");
break;
case 206: // Gold Ring
ret = new NormalImageRenderer(spr, "gold_ring.png");
break;
case 207: // Underwater Rock
ret = new NormalImageRenderer(spr, "underwater_rock.png");
break;
case 208: // Big Underwater Rock
ret = new NormalImageRenderer(spr, "big_underwater_rock.png");
break;
case 209: // Swinging Rope
ret = new SwingingRopeRenderer(spr);
break;
case 210: // Tightrope
ret = new TightropeRenderer(spr);
break;
case 211: // Roy Koopa
ret = new NormalImageRenderer(spr, "boss_roy.png");
break;
case 212: // Roy Battle Walls
ret = new NormalImageRenderer(spr, "roy_wall.png");
break;
case 213: // Pokey
ret = new PokeyRenderer(spr);
break;
case 215: // Bob-omb Cannon
ret = new BobOmbCannonRenderer(spr);
break;
case 216: // Boss Shutter
ret = new NormalImageRenderer(spr, "boss_shutter.png");
break;
case 219: // Star Coin
ret = new NormalImageRenderer(spr, "star_coin.png");
break;
case 220: // Rotation Controlled Star Coin
ret = new RotationSpriteRenderer(spr, "star_coin.png");
break;
case 221: // ! Switch
ret = new SwitchRenderer(spr, "exclamation_switch.png");
break;
case 222: // Brick Block Contaning ! Switch
ret = new BrickBlockSwitchRenderer(spr, "exclamation_switch.png", tilesets[0]);
break;
case 223: // ? Switch
ret = new SwitchRenderer(spr, "question_switch.png");
break;
case 224: // Brick Block Contaning ? Switch
ret = new BrickBlockSwitchRenderer(spr, "question_switch.png", tilesets[0]);
break;
case 225: // P Switch
ret = new SwitchRenderer(spr, "p_switch.png");
break;
case 226: // Brick Block Contaning P Switch
ret = new BrickBlockSwitchRenderer(spr, "p_switch.png", tilesets[0]);
break;
case 227: // Floating Barrel
ret = new NormalImageRenderer(spr, "barrel.png");
break;
case 228: // Boo
ret = new NormalImageRenderer(spr, "boo.png");
break;
case 229: // Big Boo
ret = new BigBooRenderer(spr);
break;
case 230: // Peepa Circle
ret = new CoinCircleRenderer(spr, tilesets[0]);
break;
case 231: // Boohemoth
ret = new BoohemothRenderer(spr);
break;
case 232: // Spiny
ret = new SpinyRenderer(spr);
break;
case 233: // Celing Spiny
ret = new CeilingSpinyRenderer(spr);
break;
case 234: // Spiked Ball
ret = new NormalImageRenderer(spr, "spiked_ball.png");
break;
case 235: // Big Spiked Ball
ret = new NormalImageRenderer(spr, "big_spiked_ball.png");
break;
case 236: // Mega Spiked Ball
ret = new NormalImageRenderer(spr, "mega_spiked_ball.png");
break;
case 239: // Swinging Vine
ret = new SwingingVineRenderer(spr);
break;
case 240: // Urchin
ret = new UrchinRenderer(spr);
break;
case 241: // Rotating Urchin
ret = new RotatingUrchinRenderer(spr);
break;
case 242: // Whirlpool
ret = new NormalImageRenderer(spr, "whirlpool.png");
break;
case 243: // Ghost Wall
ret = new GhostWallRenderer(spr);
break;
case 244: // Chain Chomp
ret = new ChainChompRenderer(spr);
break;
case 245: // Wendy
ret = new NormalImageRenderer(spr, "wendy.png");
break;
case 247: // Invisible Bouncy Block
ret = new InvisibleBouncyBlockRenderer(spr);
break;
case 248: // Move Once On Ghost House Platform
ret = new MoveOnGhostPlatRenderer(spr);
break;
case 249: // Rotation Controlled Rectangle Lift - Tower
ret = new RotRecLiftRenderer(spr, "tower_rectangle_lift/");
break;
case 250: // Rotation Controlled Rectangle Lift - GhostHouse (checkered)
ret = new RotRecLiftRenderer(spr, "checkered_rectangle_lift/");
break;
case 251: // Treasure Chest
ret = new NormalImageRenderer(spr, "treasure_chest.png");
break;
case 252: // Item
ret = new ItemRenderer(spr);
break;
case 253: // Larry Battle Platform
ret = new LarryPlatformRenderer(spr, tilesets[0]);
break;
case 254: // Vertical Lift - Totem
ret = new LiftRenderer(spr, "totem_lift");
break;
case 255: // Bowser Head Statue
ret = new NormalImageRenderer(spr, "bowser_head_statue.png");
break;
case 257: // Movement Controlled Bone Platform
ret = new BonePlatformRenderer(spr);
break;
case 259: // Rotation Controlled Hard Block
ret = new HardBlockRenderer(spr, tilesets[0]);
break;
case 267: // Long Question Block
ret = new ItemBlockRenderer(spr, tilesets[0]);
break;
case 268: // Rectangle Lift - Lava
ret = new LavaRectLiftRenderer(spr);
break;
case 269: // Gold Ship
ret = new NormalImageRenderer(spr, "gold_ship.png");
break;
case 270: // Icy Spiked Ball
ret = new NormalImageRenderer(spr, "icy_spiked_ball.png");
break;
case 271: // Big Icy Spiked Ball
ret = new NormalImageRenderer(spr, "big_icy_spiked_ball.png");
break;
case 272: // Peach Cage
ret = new NormalImageRenderer(spr, "peach_cage.png");
break;
case 273: // Coin Roulette Block
ret = new CoinRouletteRenderer(spr);
break;
case 274: // Flying Gold Block Spawn Point
ret = new NormalImageRenderer(spr, "flying_gold_block.png");
break;
case 275: // Long Question Block - Underground
ret = new ItemBlockRenderer(spr, tilesets[0]);
break;
case 276: // Long Question Block - Lava
ret = new ItemBlockRenderer(spr, tilesets[0]);
break;
case 277: // Switchable Conveyor Belt
ret = new NormalImageRenderer(spr, "switchable_conveyor_belt.png");
break;
case 278: // Assist Block
ret = new NormalImageRenderer(spr, "assist_block.png");
break;
case 279: // Lemmy Ball
ret = new NormalImageRenderer(spr, "lemmy_ball.png");
break;
case 280: // + Clock
ret = new ClockRenderer(spr);
break;
case 281: // Rectangle Ice Lift
ret = new NormalImageRenderer(spr, "ice_lift_rectangle.png");
break;
case 282: // Rotation Controlled Rectangle Lift - GhostHouse
ret = new RecLiftRenderer(spr, "ghost_rectangle_lift/");
break;
case 283: // Rectangle Lift Larry Battle
ret = new EventRecLiftRenderer(spr, "rect_lift_larry");
break;
case 284: // Chandelier Lift - Small
ret = new NormalImageRenderer(spr, "chandelier_small.png");
break;
case 285: // Chandelier Lift - Medium
ret = new NormalImageRenderer(spr, "chandelier_medium.png");
break;
case 286: // Chandelier Lift - Big
ret = new NormalImageRenderer(spr, "chandelier_big.png");
break;
case 287: // Toad House Door
ret = new NormalImageRenderer(spr, "door_toadhouse.png");
break;
case 289: // Bouncy Mushroom Platform - Castle
ret = new BounceMushCastleRenderer(spr);
break;
case 290: // Path Controlled Fence(Small)
ret = new NormalImageRenderer(spr, "small_path_fence.png");
break;
case 291: // Path Controlled Fence(Big)
ret = new NormalImageRenderer(spr, "big_path_fence.png");
break;
case 292: // Warp Cannon Signboard
ret = new NormalImageRenderer(spr, "sign_big.png");
break;
case 293: // Punching Glove
ret = new NormalImageRenderer(spr, "punching_glove.png");
break;
case 294: // Warp Cannon
ret = new NormalImageRenderer(spr, "warp_cannon.png");
break;
case 296: // Toad
ret = new NormalImageRenderer(spr, "toad.png");
break;
case 297: // Horizontal Rail Controlled Fence
ret = new RailContFenceRenderer(spr);
break;
case 299: // Rectangle Lift Lemmy Battle
ret = new NormalImageRenderer(spr, "rect_lift_lemmy.png");
break;
case 300: // Applause Coin
ret = new NormalImageRenderer(spr, "coin.png");
break;
case 302: // Moon Coin
ret = new NormalImageRenderer(spr, "moon_coin.png");
break;
case 303: // Rotation Controlled Moon Coin
ret = new RotationSpriteRenderer(spr, "moon_coin.png");
break;
case 305: // Path Controlled Ice Lift
ret = new IceLiftRenderer(spr);
break;
case 307: // Event Activated Rectangle Lift - Ruins
ret = new EventRecLiftRenderer(spr, "rect_lift_ruins");
break;
case 308: // Event Activated Rectangle Lift - Sand
ret = new EventRecLiftRenderer(spr, "rect_lift_sand");
break;
case 310: // Big Bowser Battle Lift
ret = new BowserLiftRenderer(spr);
break;
case 311: // Coin Meteor
ret = new CoinMeteorRenderer(spr);
break;
case 313: // Underwater Rectangle Lift
ret = new UnderwaterRecLiftRenderer(spr);
break;
case 314: // Ruins Rickshaw
ret = new RuinsRickRenderer(spr);
break;
case 315: // Peach
ret = new NormalImageRenderer(spr, "peach.png");
break;
case 318: // Event Controlled Rectangle Lift
ret = new EventRecLiftRenderer(spr, "event_rect_lift_tower");
break;
case 320: // Path Controlled Lift
ret = new PathLiftRenderer(spr);
break;
case 321: // Snowy Mushroom Platform
ret = new MushroomPlatformRenderer(spr);
break;
case 322: // Big Grinder
ret = new NormalImageRenderer(spr, "big_grinder.png");
break;
default:
ret = new RoundedRectRenderer(spr, QString("%1").arg(spr->getid()), QColor(0,90,150,150));
break;
}
}
void SpriteRenderer::render(QPainter *painter, QRect *drawrect)
{
ret->render(painter, drawrect);
delete ret;
}
NormalImageRenderer::NormalImageRenderer(const Object *obj, QString filename)
{
rect = QRect(obj->getx()+obj->getOffsetX(), obj->gety()+obj->getOffsetY(), obj->getwidth(), obj->getheight());
this->name = filename;
}
NormalImageRenderer::NormalImageRenderer(QRect rect, QString filename)
{
this->rect = rect;
this->name = filename;
}
void NormalImageRenderer::render(QPainter* painter, QRect *)
{
painter->drawPixmap(rect, ImageCache::getInstance()->get(SpriteImg, name));
}
RoundedRectRenderer::RoundedRectRenderer(const Object *obj, QString text, QColor color, QTextOption align)
{
this->obj = obj;
this->text = text;
this->color = color;
this->align = align;
}
void RoundedRectRenderer::render(QPainter *painter, QRect *)
{
QRect rect(obj->getx()+obj->getOffsetX(), obj->gety()+obj->getOffsetY(), obj->getwidth(), obj->getheight());
painter->setPen(QColor(0,0,0));
QPainterPath path;
path.addRoundedRect(rect, 2.0, 2.0);
painter->fillPath(path, color);
painter->drawPath(path);
painter->setFont(QFont("Arial", 7, QFont::Normal));
painter->drawText(rect, text, align);
painter->setPen(Qt::NoPen);
}
CircleRenderer::CircleRenderer(int offsetx, int offsety, int width, int height, QString text, QColor color, QTextOption align)
{
this->offsetx = offsetx;
this->offsety = offsety;
this->width = width;
this->height = height;
this->text = text;
this->color = color;
this->align = align;
}
void CircleRenderer::render(QPainter *painter, QRect *)
{
QRect ellipse(offsetx, offsety, width, height);
painter->setPen(color);
painter->drawEllipse(ellipse);
painter->setFont(QFont("Arial", 7, QFont::Normal));
painter->drawText(ellipse, text, align);
painter->setPen(Qt::NoPen);
}
MovIndicatorRenderer::MovIndicatorRenderer(int startX, int startY, int endX, int endY, bool vertical, QColor color)
: MovIndicatorRenderer::MovIndicatorRenderer(startX, startY, endX, endY, 4, 10, vertical, color)
{}
MovIndicatorRenderer::MovIndicatorRenderer(int startX, int startY, int endX, int endY, int thickness, int radius, bool vertical, QColor color)
{
this->startX = startX;
this->startY = startY;
this->endX = endX;
this->endY = endY;
this->thickness = thickness;
this->radius = radius;
this->vertical = vertical;
this->color = color;
}
void MovIndicatorRenderer::render(QPainter *painter)
{
QPen outline(QColor(0,0,0,150), thickness * 2, Qt::SolidLine);
QPen fill(color, thickness, Qt::SolidLine);
painter->setPen(outline);
if (vertical && endY == startY)
return;
else if (!vertical && endX == startX)
return;
for (int i = 0; i <= 1; i++)
{
if (i == 1)
painter->setPen(fill);
else
painter->setPen(outline);
if (vertical)
{
if (endY < startY) // Go Up
{
painter->drawLine(startX, startY + (radius/2), startX, endY + (radius*2) - 2);
painter->drawEllipse(startX - (radius/2), endY + (radius/2), radius, radius);
}
else // Go Down
{
painter->drawLine(startX, startY, startX, endY - (radius*2) + 2);
painter->drawEllipse(startX - (radius/2), endY - (1.5*radius), radius, radius);
}
}
else
{
if (endX < startX) // Go Left
{
painter->drawLine(startX, startY, endX + (radius*2) - 2, startY);
painter->drawEllipse(endX + (radius/2), startY - (radius/2), radius, radius);
}
else // Go Right
{
painter->drawLine(startX, startY, endX - (radius*2) + 2, startY);
painter->drawEllipse(endX - (1.5*radius), startY - (radius/2), radius, radius);
}
}
}
painter->setPen(Qt::NoPen);
}
// Rotate a pixmap around an arbitrary point
QPixmap rotateAroundPoint(QPixmap image, QPointF curPos, QPointF anchor, qreal angle, QPointF &newPos)
{
qreal angleRads = qDegreesToRadians(angle);
QPointF center(image.width() / 2, image.height() / 2);
qreal dist = QLineF(anchor, center).length();
qreal a = qAtan2(anchor.y() - center.y(), anchor.x() - center.x());
QPointF rotAnchor(qCos(angleRads + a) * dist, qSin(angleRads + a) * dist);
rotAnchor += center;
QPixmap rotImage = image.transformed(QTransform().rotateRadians(angleRads));
QPointF rotCenter(rotImage.width() / 2, rotImage.height() / 2);
QPointF offset = rotCenter - center;
newPos = curPos - (rotAnchor + offset);
return rotImage;
}
// Sprite Renderers
// Sprite 1: Water Flow For Pipe
PipeFlowRenderer::PipeFlowRenderer(const Sprite *spr)
{
this->spr = spr;
}
void PipeFlowRenderer::render(QPainter *painter, QRect *)
{
QPixmap air = ImageCache::getInstance()->get(SpriteImg, "air.png");
QPixmap bubbles = ImageCache::getInstance()->get(SpriteImg, "bubbles.png");
switch (spr->getNybble(11))
{
case 1:
air = air.transformed(QTransform().rotate(180));
bubbles = bubbles.transformed(QTransform().rotate(180));
break;
case 2:
air = air.transformed(QTransform().rotate(90));
bubbles = bubbles.transformed(QTransform().rotate(90));
break;
case 3:
air = air.transformed(QTransform().rotate(-90));
bubbles = bubbles.transformed(QTransform().rotate(-90));
break;
default:
break;
}
int x = spr->getx()+spr->getOffsetX();
int y = spr->gety()+spr->getOffsetY();
if (spr->getNybble(4) != 1)
painter->drawPixmap(x, y, spr->getwidth(), spr->getheight(), air);
painter->drawPixmap(x, y, spr->getwidth(), spr->getheight(), bubbles);
}
// Sprite 2: Downwards Water Pull
DownWaterPullRenderer::DownWaterPullRenderer(const Sprite *spr)
{