Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/SPZ/EggTV.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: EggTV Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
ObjectEggTV *EggTV;
11
12
void EggTV_Update(void)
13
{
14
RSDK_THIS(EggTV);
15
16
// Scanlines are drawn with INK_BLEND so this doesn't actually do anything...
17
// (Probably done because it could get real laggy with so many lines)
18
if (self->scanlineAlpha < 0x60)
19
self->scanlineAlpha += 4;
20
}
21
22
void EggTV_LateUpdate(void) {}
23
24
void EggTV_StaticUpdate(void) { RSDK.ProcessAnimation(&EggTV->animator); }
25
26
void EggTV_Draw(void)
27
{
28
EggTV_DrawTV();
29
30
if (globals->gameMode != MODE_COMPETITION)
31
EggTV_DrawScanlines();
32
}
33
34
void EggTV_Create(void *data)
35
{
36
RSDK_THIS(EggTV);
37
38
self->active = ACTIVE_BOUNDS;
39
self->drawGroup = self->drawOverTV ? Zone->objectDrawGroup[0] : (Zone->fgDrawGroup[0] + 1);
40
41
self->visible = true;
42
self->drawFX = FX_NONE;
43
self->updateRange.x = 0x800000 + self->size.x;
44
self->updateRange.y = 0x800000 + self->size.y;
45
46
self->hitbox.left = -(self->size.x >> 17);
47
self->hitbox.top = -(self->size.y >> 17);
48
self->hitbox.right = self->size.x >> 17;
49
self->hitbox.bottom = self->size.x >> 17;
50
}
51
52
void EggTV_StageLoad(void)
53
{
54
EggTV->aniFrames = RSDK.LoadSpriteAnimation("SPZ2/EggTV.bin", SCOPE_STAGE);
55
RSDK.SetSpriteAnimation(EggTV->aniFrames, 0, &EggTV->animator, true, 0);
56
}
57
58
void EggTV_DrawScanlines(void)
59
{
60
RSDK_THIS(EggTV);
61
62
int32 y = (((Zone->timer >> 1) & 1) << 16) - (self->size.y >> 1) + self->position.y;
63
if (self->size.y >= 0 && (self->size.y & 0xFFFF0000)) {
64
for (int32 i = 0; i < (self->size.y >> 16); i += 2) {
65
RSDK.DrawLine(self->position.x - (self->size.x >> 1), y, self->position.x + (self->size.x >> 1), y, 0x404060, self->scanlineAlpha,
66
INK_BLEND, false);
67
y += 0x20000;
68
}
69
}
70
}
71
void EggTV_DrawTV(void)
72
{
73
RSDK_THIS(EggTV);
74
75
self->alpha = 0xFF;
76
self->drawFX = FX_SCALE;
77
self->inkEffect = INK_NONE;
78
self->scale.x = ((self->size.x >> 16) << 9) / 0x60;
79
self->scale.y = ((self->size.y >> 16) << 9) / 0x60;
80
RSDK.DrawSprite(&EggTV->animator, NULL, false);
81
82
self->drawFX = FX_NONE;
83
}
84
85
#if GAME_INCLUDE_EDITOR
86
void EggTV_EditorDraw(void)
87
{
88
RSDK_THIS(EggTV);
89
90
self->updateRange.x = 0x800000 + self->size.x;
91
self->updateRange.y = 0x800000 + self->size.y;
92
93
EggTV_DrawTV();
94
95
if (showGizmos()) {
96
RSDK_DRAWING_OVERLAY(true);
97
98
DrawHelpers_DrawRectOutline(self->position.x, self->position.y, self->size.x, self->size.y, 0xFFFF00);
99
100
RSDK_DRAWING_OVERLAY(false);
101
}
102
}
103
104
void EggTV_EditorLoad(void)
105
{
106
EggTV->aniFrames = RSDK.LoadSpriteAnimation("SPZ2/EggTV.bin", SCOPE_STAGE);
107
RSDK.SetSpriteAnimation(EggTV->aniFrames, 0, &EggTV->animator, true, 14);
108
}
109
#endif
110
111
void EggTV_Serialize(void)
112
{
113
RSDK_EDITABLE_VAR(EggTV, VAR_VECTOR2, size);
114
RSDK_EDITABLE_VAR(EggTV, VAR_BOOL, drawOverTV);
115
}
116
117