mirror of
https://github.com/SAT-R/sa2.git
synced 2026-10-28 09:43:38 +00:00
bouncy chain -> chord
This commit is contained in:
1 parent
c35510e1cc
commit
911ad8a808
16 files changed
+379
-379
No files matched your search
Vendored
+1
-1
@@ -285,7 +285,7 @@
|
||||
"anim_commands.h": "c",
|
||||
"platform_crumbling.h": "c",
|
||||
"german_flute.h": "c",
|
||||
"bouncy_chain.h": "c",
|
||||
"chord.h": "c",
|
||||
"giant_propeller.h": "c",
|
||||
"collect_ring_effect.h": "c",
|
||||
"zone_1.h": "c",
|
||||
|
||||
@@ -61,7 +61,7 @@ Adv2,INTERACTABLES,99,19,,,,,
|
||||
14,5,15,28,NOTE_BLOCK__SPHERE,2,0,0,0
|
||||
14,5,26,26,NOTE_BLOCK__SPHERE,4,0,0,0
|
||||
22,5,22,16,GRIND_RAIL__START_AIR,-12,-3,24,3
|
||||
22,5,10,23,BOUNCY_CHAIN,0,0,0,0
|
||||
22,5,10,23,CHORD,0,0,0,0
|
||||
28,5,4,20,GRIND_RAIL__START_GROUND,-12,-3,24,3
|
||||
13,6,24,0,SPRING__UP,0,0,0,0
|
||||
15,6,7,12,BOOSTER,0,0,0,0
|
||||
@@ -95,7 +95,7 @@ Adv2,INTERACTABLES,99,19,,,,,
|
||||
21,7,18,4,NOTE_BLOCK__BLOCK,3,0,0,0
|
||||
21,7,22,4,NOTE_BLOCK__BLOCK,4,0,0,0
|
||||
21,7,26,4,NOTE_BLOCK__BLOCK,5,0,0,0
|
||||
23,7,14,7,BOUNCY_CHAIN,0,0,0,0
|
||||
23,7,14,7,CHORD,0,0,0,0
|
||||
30,7,24,4,GRIND_RAIL__END_AIR,-12,-3,24,3
|
||||
32,7,12,22,SPIKES__NORMAL_UP,0,0,0,0
|
||||
33,7,6,24,GRIND_RAIL__START_AIR,-12,-3,24,3
|
||||
@@ -137,7 +137,7 @@ Adv2,INTERACTABLES,99,19,,,,,
|
||||
32,9,11,14,COMMON_THIN_PLATFORM,0,0,0,0
|
||||
32,9,17,14,COMMON_THIN_PLATFORM,0,0,0,0
|
||||
33,9,15,0,BOOSTER,0,0,0,0
|
||||
33,9,6,15,BOUNCY_CHAIN,0,0,0,0
|
||||
33,9,6,15,CHORD,0,0,0,0
|
||||
35,9,22,24,NOTE_BLOCK__BLOCK,0,0,0,0
|
||||
35,9,26,24,NOTE_BLOCK__BLOCK,1,0,0,0
|
||||
35,9,30,24,NOTE_BLOCK__BLOCK,2,0,0,0
|
||||
@@ -164,7 +164,7 @@ Adv2,INTERACTABLES,99,19,,,,,
|
||||
40,9,26,0,NOTE_BLOCK__BLOCK,4,0,0,0
|
||||
40,9,30,0,NOTE_BLOCK__BLOCK,5,0,0,0
|
||||
42,9,12,1,SPRING__BIG_UPRIGHT,0,0,0,0
|
||||
42,9,6,21,BOUNCY_CHAIN,0,0,0,0
|
||||
42,9,6,21,CHORD,0,0,0,0
|
||||
43,9,16,6,GRIND_RAIL__START_GROUND,-5,-3,10,3
|
||||
43,9,4,23,SPRING__BIG_DOWNLEFT,1,0,0,0
|
||||
45,9,2,12,NOTE_BLOCK__BLOCK,0,0,0,0
|
||||
@@ -235,10 +235,10 @@ Adv2,INTERACTABLES,99,19,,,,,
|
||||
44,11,21,20,SPRING__UP,1,0,0,0
|
||||
44,11,17,20,SPRING__UP,0,0,0,0
|
||||
45,11,24,6,SPRING__RIGHT,1,0,0,0
|
||||
48,11,18,28,BOUNCY_CHAIN,0,0,0,0
|
||||
48,11,18,28,CHORD,0,0,0,0
|
||||
49,11,14,6,SPECIAL_RING,0,0,0,0
|
||||
50,11,0,8,BOOSTER,0,0,0,0
|
||||
51,11,30,16,BOUNCY_CHAIN,0,0,0,0
|
||||
51,11,30,16,CHORD,0,0,0,0
|
||||
53,11,11,13,TOGGLE__CHECKPOINT,0,0,0,0
|
||||
53,11,20,8,GRIND_RAIL__END_ALTERNATE,-3,-3,6,3
|
||||
54,11,0,8,GRIND_RAIL__START_GROUND,-5,-3,10,3
|
||||
@@ -249,7 +249,7 @@ Adv2,INTERACTABLES,99,19,,,,,
|
||||
60,11,6,26,NOTE_BLOCK__SPHERE,4,0,0,0
|
||||
61,11,0,23,NOTE_BLOCK__SPHERE,7,0,0,0
|
||||
64,11,10,14,GRIND_RAIL__START_AIR,-10,-3,20,3
|
||||
64,11,4,28,BOUNCY_CHAIN,0,0,0,0
|
||||
64,11,4,28,CHORD,0,0,0,0
|
||||
39,12,22,12,SPRING__UP,2,0,0,0
|
||||
39,12,18,12,SPRING__UP,2,0,0,0
|
||||
40,12,8,6,SPRING__UP,0,0,0,0
|
||||
@@ -278,8 +278,8 @@ Adv2,INTERACTABLES,99,19,,,,,
|
||||
56,12,22,12,SPIKES__HIDING_UP,0,0,0,0
|
||||
59,12,20,5,BOOSTER,5,1,0,0
|
||||
60,12,12,28,SPRING__LEFT,1,0,0,0
|
||||
62,12,26,20,BOUNCY_CHAIN,0,0,0,0
|
||||
63,12,12,8,BOUNCY_CHAIN,0,0,0,0
|
||||
62,12,26,20,CHORD,0,0,0,0
|
||||
63,12,12,8,CHORD,0,0,0,0
|
||||
66,12,9,20,GRIND_RAIL__END_AIR,-6,-3,12,3
|
||||
66,12,3,24,SPRING__UP,0,0,0,0
|
||||
48,13,22,16,SPRING__UP,1,0,0,0
|
||||
@@ -335,7 +335,7 @@ Adv2,INTERACTABLES,99,19,,,,,
|
||||
68,15,6,24,SPRING__UP,2,0,0,0
|
||||
68,15,2,24,SPRING__UP,1,0,0,0
|
||||
71,15,22,6,SPRING__SMALL_UPRIGHT,1,0,0,0
|
||||
72,15,6,27,BOUNCY_CHAIN,0,0,0,0
|
||||
72,15,6,27,CHORD,0,0,0,0
|
||||
74,15,6,0,SPRING__UP,0,0,0,0
|
||||
76,15,4,0,GRIND_RAIL__START_GROUND,-6,-3,12,3
|
||||
60,16,30,16,SPRING__UP,0,0,0,0
|
||||
@@ -358,8 +358,8 @@ Adv2,INTERACTABLES,99,19,,,,,
|
||||
74,16,22,4,NOTE_BLOCK__BLOCK,3,0,0,0
|
||||
74,16,26,4,NOTE_BLOCK__BLOCK,4,0,0,0
|
||||
74,16,30,4,NOTE_BLOCK__BLOCK,5,0,0,0
|
||||
75,16,0,4,BOUNCY_CHAIN,0,0,0,0
|
||||
75,16,0,30,BOUNCY_CHAIN,0,0,0,0
|
||||
75,16,0,4,CHORD,0,0,0,0
|
||||
75,16,0,30,CHORD,0,0,0,0
|
||||
75,16,26,22,SPRING__SMALL_UPRIGHT,1,0,0,0
|
||||
77,16,20,1,GRIND_RAIL__END_AIR,-3,-3,6,3
|
||||
78,16,2,16,NOTE_BLOCK__BLOCK,0,0,0,0
|
||||
|
||||
|
@@ -44,7 +44,7 @@ Adv2,INTERACTABLES,105,16,,,,,
|
||||
8,3,10,12,SPRING__UP,0,0,0,0
|
||||
8,3,6,12,SPRING__UP,0,0,0,0
|
||||
9,3,6,22,SPRING__RIGHT,2,0,0,0
|
||||
12,3,12,27,BOUNCY_CHAIN,0,0,0,0
|
||||
12,3,12,27,CHORD,0,0,0,0
|
||||
12,3,12,3,SPRING__BIG_UPRIGHT,1,0,0,0
|
||||
15,3,25,12,SPIKES__NORMAL_UP,0,0,0,0
|
||||
16,3,13,4,PIPE_INSTRUMENT_ENTRY,4,0,0,0
|
||||
@@ -91,7 +91,7 @@ Adv2,INTERACTABLES,105,16,,,,,
|
||||
39,4,21,22,NOTE_BLOCK__SPHERE,4,0,0,0
|
||||
39,4,29,23,NOTE_BLOCK__SPHERE,3,0,0,0
|
||||
40,4,22,16,BOOSTER,0,0,0,0
|
||||
40,4,10,31,BOUNCY_CHAIN,0,0,0,0
|
||||
40,4,10,31,CHORD,0,0,0,0
|
||||
40,4,7,28,SPECIAL_RING,0,0,0,0
|
||||
12,5,30,26,SPRING__UP,0,0,0,0
|
||||
12,5,26,26,SPRING__UP,1,0,0,0
|
||||
@@ -101,7 +101,7 @@ Adv2,INTERACTABLES,105,16,,,,,
|
||||
13,5,2,26,SPRING__UP,0,0,0,0
|
||||
14,5,25,9,KEYBOARD_HORIZONTAL_LEFT,-17,-1,36,3
|
||||
15,5,29,9,KEYBOARD_HORIZONTAL_LEFT,-17,-1,36,3
|
||||
23,5,26,17,BOUNCY_CHAIN,0,0,0,0
|
||||
23,5,26,17,CHORD,0,0,0,0
|
||||
23,5,23,14,SPIKES__HIDING_UP,0,0,0,0
|
||||
24,5,10,2,SPRING__UP,0,0,0,0
|
||||
25,5,4,12,SPRING__RIGHT,1,0,0,0
|
||||
@@ -156,7 +156,7 @@ Adv2,INTERACTABLES,105,16,,,,,
|
||||
16,6,18,18,NOTE_BLOCK__BLOCK,2,0,0,0
|
||||
16,6,22,18,NOTE_BLOCK__BLOCK,1,0,0,0
|
||||
16,6,26,18,NOTE_BLOCK__BLOCK,0,0,0,0
|
||||
20,6,8,27,BOUNCY_CHAIN,0,0,0,0
|
||||
20,6,8,27,CHORD,0,0,0,0
|
||||
21,6,25,16,TRUMPET_ENTRY,2,0,0,0
|
||||
24,6,13,16,TRUMPET_ENTRY,1,0,0,0
|
||||
29,6,30,0,SPRING__UP,1,4,1,1
|
||||
@@ -244,7 +244,7 @@ Adv2,INTERACTABLES,105,16,,,,,
|
||||
47,7,10,4,NOTE_BLOCK__BLOCK,3,0,0,0
|
||||
47,7,14,4,NOTE_BLOCK__BLOCK,4,0,0,0
|
||||
47,7,18,4,NOTE_BLOCK__BLOCK,5,0,0,0
|
||||
48,7,12,1,BOUNCY_CHAIN,0,0,0,0
|
||||
48,7,12,1,CHORD,0,0,0,0
|
||||
51,7,24,22,GRIND_RAIL__END_ALTERNATE,-12,-3,24,3
|
||||
52,7,19,16,CHECKPOINT,0,0,0,0
|
||||
52,7,19,0,TOGGLE__CHECKPOINT,0,0,0,0
|
||||
@@ -280,7 +280,7 @@ Adv2,INTERACTABLES,105,16,,,,,
|
||||
44,8,21,24,TRUMPET_ENTRY,2,0,0,0
|
||||
47,8,29,24,PIPE_INSTRUMENT_ENTRY,3,0,0,0
|
||||
47,8,24,29,PIPE_INSTRUMENT_ENTRY,5,0,0,0
|
||||
51,8,18,17,BOUNCY_CHAIN,0,0,0,0
|
||||
51,8,18,17,CHORD,0,0,0,0
|
||||
58,8,24,16,NOTE_BLOCK__SPHERE,2,0,0,0
|
||||
59,8,2,15,NOTE_BLOCK__SPHERE,3,0,0,0
|
||||
59,8,10,14,NOTE_BLOCK__SPHERE,4,0,0,0
|
||||
@@ -329,7 +329,7 @@ Adv2,INTERACTABLES,105,16,,,,,
|
||||
40,9,28,23,SPRING__RIGHT,2,0,0,0
|
||||
43,9,18,30,BOOSTER,0,0,0,0
|
||||
51,9,0,16,SPRING__RIGHT,0,0,0,0
|
||||
60,9,6,21,BOUNCY_CHAIN,0,0,0,0
|
||||
60,9,6,21,CHORD,0,0,0,0
|
||||
61,9,14,24,SPIKES__HIDING_UP,0,0,0,0
|
||||
62,9,27,31,NOTE_BLOCK__SPHERE,3,0,0,0
|
||||
63,9,12,6,GRIND_RAIL__START_AIR,-12,-3,24,3
|
||||
@@ -352,7 +352,7 @@ Adv2,INTERACTABLES,105,16,,,,,
|
||||
73,9,25,0,BOOSTER,0,0,0,0
|
||||
74,9,2,18,NOTE_BLOCK__BLOCK,1,0,0,0
|
||||
74,9,6,18,NOTE_BLOCK__BLOCK,0,0,0,0
|
||||
78,9,12,2,BOUNCY_CHAIN,0,0,0,0
|
||||
78,9,12,2,CHORD,0,0,0,0
|
||||
83,9,14,10,NOTE_BLOCK__SPHERE,0,0,0,0
|
||||
83,9,6,10,NOTE_BLOCK__SPHERE,0,0,0,0
|
||||
83,9,23,8,NOTE_BLOCK__SPHERE,2,0,0,0
|
||||
@@ -391,7 +391,7 @@ Adv2,INTERACTABLES,105,16,,,,,
|
||||
72,10,24,16,GRIND_RAIL__END_ALTERNATE,-12,-3,24,3
|
||||
75,10,8,2,KEYBOARD_VERTICAL,1,-22,3,48
|
||||
75,10,22,8,KEYBOARD_VERTICAL,-1,-19,3,39
|
||||
78,10,12,13,BOUNCY_CHAIN,0,0,0,0
|
||||
78,10,12,13,CHORD,0,0,0,0
|
||||
78,10,22,10,SPRING__UP,0,0,0,0
|
||||
80,10,21,8,TRUMPET_ENTRY,2,0,0,0
|
||||
82,10,16,4,GRIND_RAIL__START_GROUND,-12,-3,24,3
|
||||
@@ -435,7 +435,7 @@ Adv2,INTERACTABLES,105,16,,,,,
|
||||
89,11,22,14,NOTE_BLOCK__BLOCK,3,0,0,0
|
||||
89,11,26,14,NOTE_BLOCK__BLOCK,4,0,0,0
|
||||
89,11,30,14,NOTE_BLOCK__BLOCK,5,0,0,0
|
||||
90,11,6,5,BOUNCY_CHAIN,0,0,0,0
|
||||
90,11,6,5,CHORD,0,0,0,0
|
||||
63,12,10,12,SPRING__UP,2,0,0,0
|
||||
66,12,27,0,SPRING__UP,0,0,0,0
|
||||
73,12,29,4,TRUMPET_ENTRY,1,0,0,0
|
||||
|
||||
|
@@ -266,7 +266,7 @@
|
||||
#define SA2_ANIM_SPRING_MUS_PLA_2 573
|
||||
#define SA2_ANIM_PLATFORM_SQUARE_MUS_PLA 574
|
||||
#define SA2_ANIM_NOTE_BLOCK 575
|
||||
#define SA2_ANIM_VARIANT_NOTE_BLOCK_CHAIN_LINK 15
|
||||
#define SA2_ANIM_VARIANT_NOTE_BLOCK_CHORD_ELEM 15
|
||||
#define SA2_ANIM_NOTE_PARTICLES 576
|
||||
#define SA2_ANIM_VARIANT_NOTE_H 0
|
||||
#define SA2_ANIM_VARIANT_NOTE_V 1
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
#define IA__FLOATING_SPRING 55
|
||||
#define IA__NOTE_BLOCK__SPHERE 56
|
||||
#define IA__NOTE_BLOCK__BLOCK 57
|
||||
#define IA__BOUNCY_CHAIN 58
|
||||
#define IA__CHORD 58
|
||||
#define IA__KEYBOARD_VERTICAL 59
|
||||
#define IA__KEYBOARD_HORIZONTAL_LEFT 60
|
||||
#define IA__KEYBOARD_HORIZONTAL_RIGHT 61
|
||||
|
||||
@@ -272,7 +272,7 @@
|
||||
#define SE_MUSIC_PLANT_ENTER_HORN2 321
|
||||
#define SE_MUSIC_PLANT_EXIT_HORN2 322
|
||||
#define SE_MUSIC_PLANT_HORN3 323
|
||||
#define SE_MUSIC_PLANT_BOUNCY_CHAIN 324
|
||||
#define SE_MUSIC_PLANT_CHORD 324
|
||||
#define SE_MUSIC_PLANT_PIANO 325
|
||||
#define SE_MUSIC_PLANT_FLUTE_1 326
|
||||
#define SE_MUSIC_PLANT_FLUTE_2 327
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
#ifndef GUARD_INTERACTABLE_BOUNCY_CHAIN_H
|
||||
#define GUARD_INTERACTABLE_BOUNCY_CHAIN_H
|
||||
|
||||
#include "global.h"
|
||||
|
||||
#include "game/entity.h"
|
||||
|
||||
void CreateEntity_BouncyChain(MapEntity *, u16, u16, u8);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,10 @@
|
||||
#ifndef GUARD_INTERACTABLE_CHORD_H
|
||||
#define GUARD_INTERACTABLE_CHORD_H
|
||||
|
||||
#include "global.h"
|
||||
|
||||
#include "game/entity.h"
|
||||
|
||||
void CreateEntity_Chord(MapEntity *, u16, u16, u8);
|
||||
|
||||
#endif
|
||||
+2
-2
@@ -279,7 +279,7 @@ SECTIONS
|
||||
src/game/interactables_2/hot_crater/floating_spring.o(.text);
|
||||
src/game/interactables_2/music_plant/note_sphere.o(.text);
|
||||
src/game/interactables_2/music_plant/note_block.o(.text);
|
||||
src/game/interactables_2/music_plant/bouncy_chain.o(.text);
|
||||
src/game/interactables_2/music_plant/chord.o(.text);
|
||||
src/game/interactables_2/music_plant/keyboard.o(.text);
|
||||
src/game/interactables_2/music_plant/german_flute.o(.text);
|
||||
src/game/interactables_2/music_plant/pipe_horn.o(.text);
|
||||
@@ -768,7 +768,7 @@ SECTIONS
|
||||
sound/songs/midi/se_music_plant_enter_horn2.o(.rodata);
|
||||
sound/songs/midi/se_music_plant_exit_horn2.o(.rodata);
|
||||
sound/songs/midi/se_music_plant_horn3.o(.rodata);
|
||||
sound/songs/midi/se_music_plant_bouncy_chain.o(.rodata);
|
||||
sound/songs/midi/se_music_plant_chord.o(.rodata);
|
||||
sound/songs/midi/se_music_plant_piano.o(.rodata);
|
||||
sound/songs/midi/se_music_plant_flute_1.o(.rodata);
|
||||
sound/songs/midi/se_music_plant_flute_2.o(.rodata);
|
||||
|
||||
@@ -700,7 +700,7 @@ $(MID_SUBDIR)/se_music_plant_exit_horn2.s: %.s: %.mid
|
||||
$(MID_SUBDIR)/se_music_plant_horn3.s: %.s: %.mid
|
||||
$(MID2AGB) $< $@ -C $(MIDI_COMMENTS) -E -R$(STD_REVERB) -G6 -P20 -V120
|
||||
|
||||
$(MID_SUBDIR)/se_music_plant_bouncy_chain.s: %.s: %.mid
|
||||
$(MID_SUBDIR)/se_music_plant_chord.s: %.s: %.mid
|
||||
$(MID2AGB) $< $@ -C $(MIDI_COMMENTS) -E -R$(STD_REVERB) -G6 -P20 -V127
|
||||
|
||||
$(MID_SUBDIR)/se_music_plant_piano.s: %.s: %.mid
|
||||
|
||||
@@ -649,7 +649,7 @@ mAlignWord
|
||||
mAlignWord
|
||||
song C_DECL(se_music_plant_horn3), 2, 2
|
||||
mAlignWord
|
||||
song C_DECL(se_music_plant_bouncy_chain), 2, 2
|
||||
song C_DECL(se_music_plant_chord), 2, 2
|
||||
mAlignWord
|
||||
song C_DECL(se_music_plant_piano), 2, 2
|
||||
mAlignWord
|
||||
|
||||
File renamed without changes.
@@ -1,333 +0,0 @@
|
||||
#include "global.h"
|
||||
#include "core.h"
|
||||
#include "lib/m4a/m4a.h"
|
||||
#include "sprite.h"
|
||||
|
||||
#include "game/entity.h"
|
||||
#include "task.h"
|
||||
|
||||
#include "game/stage/player.h"
|
||||
#include "game/stage/camera.h"
|
||||
#include "game/interactables_2/music_plant/bouncy_chain.h"
|
||||
|
||||
#include "constants/animations.h"
|
||||
#include "constants/char_states.h"
|
||||
#include "constants/player_transitions.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
#define NUM_BOUNCY_CHAIN_LINKS 6
|
||||
#define CHAIN_WIDTH_PX (NUM_BOUNCY_CHAIN_LINKS * TILE_WIDTH)
|
||||
#define BOUNCE_MIN_ACCEL Q_8_8(4.0)
|
||||
#define BOUNCE_MAX_ACCEL Q_8_8(12.0)
|
||||
|
||||
typedef struct {
|
||||
s16 x;
|
||||
s16 y;
|
||||
// spike of oscillation
|
||||
s16 peak;
|
||||
} ChainLink;
|
||||
|
||||
typedef struct {
|
||||
/* 0x00 */ ChainLink links[NUM_BOUNCY_CHAIN_LINKS];
|
||||
/* 0x30 */ SpriteBase base;
|
||||
/* 0x3C */ Sprite s;
|
||||
/* 0x6C */ s32 posX;
|
||||
/* 0x70 */ s32 posY;
|
||||
/* 0x74 */ s16 bounceAccel;
|
||||
} Sprite_BouncyChain; /* size 0x78 */
|
||||
|
||||
static void Task_Idle(void);
|
||||
static void TaskDestructor_BouncyChain(struct Task *);
|
||||
static void Render(Sprite_BouncyChain *);
|
||||
static bool32 PlayerIsHittingChain(Sprite_BouncyChain *);
|
||||
static void LaunchPlayer(Sprite_BouncyChain *);
|
||||
static void HandleVibrateFinished(Sprite_BouncyChain *);
|
||||
static void ResetChainAndHandleBounce(Sprite_BouncyChain *);
|
||||
static void SetPlayerBouncePosition(Sprite_BouncyChain *);
|
||||
static bool32 ShouldDespawn(Sprite_BouncyChain *);
|
||||
|
||||
void CreateEntity_BouncyChain(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY)
|
||||
{
|
||||
struct Task *t = TaskCreate(Task_Idle, sizeof(Sprite_BouncyChain), 0x2010, 0, TaskDestructor_BouncyChain);
|
||||
Sprite_BouncyChain *chain = TASK_DATA(t);
|
||||
Sprite *s = &chain->s;
|
||||
u16 i;
|
||||
|
||||
chain->base.regionX = spriteRegionX;
|
||||
chain->base.regionY = spriteRegionY;
|
||||
chain->base.me = me;
|
||||
chain->base.spriteX = me->x;
|
||||
chain->base.id = spriteY;
|
||||
|
||||
SPRITE_INIT_WITHOUT_ANIM_OR_VRAM(s, 18, 2, 0);
|
||||
s->graphics.dest = (void *)(OBJ_VRAM0 + 0x3700);
|
||||
s->graphics.anim = SA2_ANIM_NOTE_BLOCK;
|
||||
s->variant = SA2_ANIM_VARIANT_NOTE_BLOCK_CHAIN_LINK;
|
||||
|
||||
chain->posX = TO_WORLD_POS(me->x, spriteRegionX);
|
||||
chain->posY = TO_WORLD_POS(me->y, spriteRegionY);
|
||||
SET_MAP_ENTITY_INITIALIZED(me);
|
||||
|
||||
UpdateSpriteAnimation(s);
|
||||
|
||||
for (i = 0; i < NUM_BOUNCY_CHAIN_LINKS; i++) {
|
||||
ChainLink *link = &chain->links[i];
|
||||
s16 offsetX = Q_8_8(i * TILE_WIDTH);
|
||||
s16 offsetY = 0;
|
||||
|
||||
link->x = offsetX;
|
||||
link->y = offsetY;
|
||||
|
||||
switch (i) {
|
||||
case 0:
|
||||
case 5: {
|
||||
link->peak = Q_8_8(0);
|
||||
} break;
|
||||
|
||||
case 1:
|
||||
case 4: {
|
||||
link->peak = Q_8_8(0.5);
|
||||
} break;
|
||||
|
||||
case 2:
|
||||
case 3: {
|
||||
link->peak = Q_8_8(0.5);
|
||||
// Required for match
|
||||
link->peak *= 2;
|
||||
} break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_Bounce(void)
|
||||
{
|
||||
u8 r7 = 0;
|
||||
Sprite_BouncyChain *chain = TASK_DATA(gCurTask);
|
||||
u8 i;
|
||||
|
||||
SetPlayerBouncePosition(chain);
|
||||
|
||||
for (i = 0; i < NUM_BOUNCY_CHAIN_LINKS; i++) {
|
||||
ChainLink *link = &chain->links[i];
|
||||
s16 r1 = I((chain->bounceAccel - link->y) * link->peak);
|
||||
|
||||
if (r1 <= link->y) {
|
||||
r7++;
|
||||
} else {
|
||||
r1 = (r1 - link->y) >> 2;
|
||||
if (r1 < Q_8_8(0.5)) {
|
||||
r1 = Q_8_8(0.5);
|
||||
}
|
||||
link->y += r1;
|
||||
}
|
||||
}
|
||||
|
||||
if (PLAYER_IS_ALIVE) {
|
||||
gPlayer.qWorldY = Q(chain->posY - 16) + chain->links[2].y;
|
||||
gPlayer.rotation = 64;
|
||||
}
|
||||
|
||||
if (r7 == NUM_BOUNCY_CHAIN_LINKS) {
|
||||
LaunchPlayer(chain);
|
||||
}
|
||||
|
||||
Render(chain);
|
||||
}
|
||||
|
||||
static void Task_Vibrate(void)
|
||||
{
|
||||
u8 r5 = 0;
|
||||
Sprite_BouncyChain *chain = TASK_DATA(gCurTask);
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < NUM_BOUNCY_CHAIN_LINKS; i++) {
|
||||
ChainLink *link = &chain->links[i];
|
||||
|
||||
u16 r2 = link->y;
|
||||
|
||||
if (link->y == 0) {
|
||||
r5++;
|
||||
} else {
|
||||
if (link->y > 0) {
|
||||
u32 value = r2 - Q_8_8(1);
|
||||
r2 = 0;
|
||||
link->y = value;
|
||||
|
||||
if (link->y < 0)
|
||||
link->y = 0;
|
||||
|
||||
} else {
|
||||
u32 value = r2 + Q_8_8(1);
|
||||
r2 = 0;
|
||||
link->y = value;
|
||||
|
||||
if (link->y > 0)
|
||||
link->y = r2;
|
||||
}
|
||||
|
||||
link->y = -link->y;
|
||||
}
|
||||
}
|
||||
|
||||
if (r5 == NUM_BOUNCY_CHAIN_LINKS) {
|
||||
HandleVibrateFinished(chain);
|
||||
}
|
||||
|
||||
if (PlayerIsHittingChain(chain)) {
|
||||
ResetChainAndHandleBounce(chain);
|
||||
}
|
||||
Render(chain);
|
||||
}
|
||||
|
||||
static void HandleBounce(Sprite_BouncyChain *chain)
|
||||
{
|
||||
if (PLAYER_IS_ALIVE) {
|
||||
Player_SetMovestate_IsInScriptedSequence();
|
||||
gPlayer.moveState |= MOVESTATE_IA_OVERRIDE;
|
||||
|
||||
gPlayer.charState = CHARSTATE_SPIN_ATTACK;
|
||||
gPlayer.qSpeedAirX = 0;
|
||||
gPlayer.qSpeedAirY = (s32)(gPlayer.qSpeedAirY * 3) >> 1;
|
||||
|
||||
CLAMP_INLINE(gPlayer.qSpeedAirY, BOUNCE_MIN_ACCEL, BOUNCE_MAX_ACCEL);
|
||||
}
|
||||
|
||||
chain->bounceAccel = (u16)gPlayer.qSpeedAirY * 2;
|
||||
|
||||
if (chain->bounceAccel < BOUNCE_MIN_ACCEL) {
|
||||
chain->bounceAccel = BOUNCE_MIN_ACCEL;
|
||||
}
|
||||
|
||||
gCurTask->main = Task_Bounce;
|
||||
}
|
||||
|
||||
static void Render(Sprite_BouncyChain *chain)
|
||||
{
|
||||
Sprite *s = &chain->s;
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < NUM_BOUNCY_CHAIN_LINKS; i++) {
|
||||
ChainLink *link = &chain->links[i];
|
||||
s16 elY = ABS(link->y) >> 3;
|
||||
s32 r2, r1;
|
||||
if (i > 2)
|
||||
elY = -elY;
|
||||
|
||||
r2 = chain->posX + 4;
|
||||
r2 += I(link->x + elY);
|
||||
r2 -= gCamera.x;
|
||||
s->x = r2;
|
||||
|
||||
r1 = chain->posY;
|
||||
r1 += I(link->y);
|
||||
r1 -= gCamera.y;
|
||||
s->y = r1;
|
||||
|
||||
DisplaySprite(s);
|
||||
}
|
||||
}
|
||||
|
||||
static bool32 PlayerIsHittingChain(Sprite_BouncyChain *chain)
|
||||
{
|
||||
if (PLAYER_IS_ALIVE && gPlayer.qSpeedAirY > 0) {
|
||||
s16 screenX = chain->posX - gCamera.x;
|
||||
s16 screenY = chain->posY - gCamera.y;
|
||||
s16 playerX = I(gPlayer.qWorldX) - gCamera.x;
|
||||
s16 playerY = I(gPlayer.qWorldY) - gCamera.y;
|
||||
|
||||
if ((screenX <= playerX) && ((screenX + CHAIN_WIDTH_PX) >= playerX) && ((screenY - 9) <= playerY) && ((screenY + 9) >= playerY)) {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void Task_Idle(void)
|
||||
{
|
||||
Sprite_BouncyChain *chain = TASK_DATA(gCurTask);
|
||||
|
||||
if (PlayerIsHittingChain(chain)) {
|
||||
HandleBounce(chain);
|
||||
}
|
||||
|
||||
if (ShouldDespawn(chain)) {
|
||||
chain->base.me->x = chain->base.spriteX;
|
||||
TaskDestroy(gCurTask);
|
||||
return;
|
||||
}
|
||||
|
||||
Render(chain);
|
||||
}
|
||||
|
||||
static void TaskDestructor_BouncyChain(struct Task UNUSED *t) { }
|
||||
|
||||
static void LaunchPlayer(Sprite_BouncyChain UNUSED *chain)
|
||||
{
|
||||
if (PLAYER_IS_ALIVE) {
|
||||
Player_ClearMovestate_IsInScriptedSequence();
|
||||
gPlayer.moveState &= ~MOVESTATE_IA_OVERRIDE;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
gPlayer.qSpeedAirY = -gPlayer.qSpeedAirY;
|
||||
m4aSongNumStart(SE_MUSIC_PLANT_BOUNCY_CHAIN);
|
||||
}
|
||||
|
||||
gCurTask->main = Task_Vibrate;
|
||||
}
|
||||
|
||||
static void HandleVibrateFinished(Sprite_BouncyChain UNUSED *chain) { gCurTask->main = Task_Idle; }
|
||||
|
||||
static void ResetChainAndHandleBounce(Sprite_BouncyChain *chain)
|
||||
{
|
||||
u8 i;
|
||||
for (i = 0; i < NUM_BOUNCY_CHAIN_LINKS; i++) {
|
||||
ChainLink *link = &chain->links[i];
|
||||
link->y = 0;
|
||||
}
|
||||
|
||||
HandleBounce(chain);
|
||||
}
|
||||
|
||||
// Because assigning it to a variable doesn't match...
|
||||
#define LOCAL_CHAIN_MARGIN (Q(chain->posX + (CHAIN_WIDTH_PX / 2)))
|
||||
|
||||
static void SetPlayerBouncePosition(Sprite_BouncyChain *chain)
|
||||
{
|
||||
if (PLAYER_IS_ALIVE) {
|
||||
if (gPlayer.qWorldX != LOCAL_CHAIN_MARGIN) {
|
||||
if (gPlayer.qWorldX > LOCAL_CHAIN_MARGIN) {
|
||||
gPlayer.qWorldX -= Q(0.5);
|
||||
|
||||
if (gPlayer.qWorldX < LOCAL_CHAIN_MARGIN)
|
||||
gPlayer.qWorldX = LOCAL_CHAIN_MARGIN;
|
||||
} else {
|
||||
gPlayer.qWorldX += Q(0.5);
|
||||
|
||||
if (gPlayer.qWorldX > LOCAL_CHAIN_MARGIN)
|
||||
gPlayer.qWorldX = LOCAL_CHAIN_MARGIN;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#undef LOCAL_CHAIN_MARGIN
|
||||
|
||||
static bool32 ShouldDespawn(Sprite_BouncyChain *chain)
|
||||
{
|
||||
s32 screenX, screenY;
|
||||
s16 otherX, otherY;
|
||||
|
||||
screenX = chain->posX;
|
||||
screenX -= gCamera.x;
|
||||
|
||||
screenY = chain->posY;
|
||||
screenY -= gCamera.y;
|
||||
|
||||
otherY = screenY;
|
||||
otherX = screenX;
|
||||
|
||||
if (IS_OUT_OF_RANGE_2(otherX, otherY, (CAM_REGION_WIDTH + (CHAIN_WIDTH_PX / 2)) / 2, CAM_REGION_WIDTH / 2)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@@ -0,0 +1,333 @@
|
||||
#include "global.h"
|
||||
#include "core.h"
|
||||
#include "lib/m4a/m4a.h"
|
||||
#include "sprite.h"
|
||||
|
||||
#include "game/entity.h"
|
||||
#include "task.h"
|
||||
|
||||
#include "game/stage/player.h"
|
||||
#include "game/stage/camera.h"
|
||||
#include "game/interactables_2/music_plant/chord.h"
|
||||
|
||||
#include "constants/animations.h"
|
||||
#include "constants/char_states.h"
|
||||
#include "constants/player_transitions.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
#define NUM_CHORD_ELEMENTS 6
|
||||
#define CHORD_WIDTH_PX (NUM_CHORD_ELEMENTS * TILE_WIDTH)
|
||||
#define BOUNCE_MIN_ACCEL Q_8_8(4.0)
|
||||
#define BOUNCE_MAX_ACCEL Q_8_8(12.0)
|
||||
|
||||
typedef struct {
|
||||
s16 x;
|
||||
s16 y;
|
||||
// spike of oscillation
|
||||
s16 peak;
|
||||
} ChordElement;
|
||||
|
||||
typedef struct {
|
||||
/* 0x00 */ ChordElement elements[NUM_CHORD_ELEMENTS];
|
||||
/* 0x30 */ SpriteBase base;
|
||||
/* 0x3C */ Sprite s;
|
||||
/* 0x6C */ s32 posX;
|
||||
/* 0x70 */ s32 posY;
|
||||
/* 0x74 */ s16 bounceAccel;
|
||||
} Sprite_Chord; /* size 0x78 */
|
||||
|
||||
static void Task_Idle(void);
|
||||
static void TaskDestructor_Chord(struct Task *);
|
||||
static void Render(Sprite_Chord *);
|
||||
static bool32 PlayerIsHittingChord(Sprite_Chord *);
|
||||
static void LaunchPlayer(Sprite_Chord *);
|
||||
static void HandleVibrateFinished(Sprite_Chord *);
|
||||
static void ResetChordAndHandleBounce(Sprite_Chord *);
|
||||
static void SetPlayerBouncePosition(Sprite_Chord *);
|
||||
static bool32 ShouldDespawn(Sprite_Chord *);
|
||||
|
||||
void CreateEntity_Chord(MapEntity *me, u16 spriteRegionX, u16 spriteRegionY, u8 spriteY)
|
||||
{
|
||||
struct Task *t = TaskCreate(Task_Idle, sizeof(Sprite_Chord), 0x2010, 0, TaskDestructor_Chord);
|
||||
Sprite_Chord *chord = TASK_DATA(t);
|
||||
Sprite *s = &chord->s;
|
||||
u16 i;
|
||||
|
||||
chord->base.regionX = spriteRegionX;
|
||||
chord->base.regionY = spriteRegionY;
|
||||
chord->base.me = me;
|
||||
chord->base.spriteX = me->x;
|
||||
chord->base.id = spriteY;
|
||||
|
||||
SPRITE_INIT_WITHOUT_ANIM_OR_VRAM(s, 18, 2, 0);
|
||||
s->graphics.dest = (void *)(OBJ_VRAM0 + 0x3700);
|
||||
s->graphics.anim = SA2_ANIM_NOTE_BLOCK;
|
||||
s->variant = SA2_ANIM_VARIANT_NOTE_BLOCK_CHORD_ELEM;
|
||||
|
||||
chord->posX = TO_WORLD_POS(me->x, spriteRegionX);
|
||||
chord->posY = TO_WORLD_POS(me->y, spriteRegionY);
|
||||
SET_MAP_ENTITY_INITIALIZED(me);
|
||||
|
||||
UpdateSpriteAnimation(s);
|
||||
|
||||
for (i = 0; i < NUM_CHORD_ELEMENTS; i++) {
|
||||
ChordElement *element = &chord->elements[i];
|
||||
s16 offsetX = Q_8_8(i * TILE_WIDTH);
|
||||
s16 offsetY = 0;
|
||||
|
||||
element->x = offsetX;
|
||||
element->y = offsetY;
|
||||
|
||||
switch (i) {
|
||||
case 0:
|
||||
case 5: {
|
||||
element->peak = Q_8_8(0);
|
||||
} break;
|
||||
|
||||
case 1:
|
||||
case 4: {
|
||||
element->peak = Q_8_8(0.5);
|
||||
} break;
|
||||
|
||||
case 2:
|
||||
case 3: {
|
||||
element->peak = Q_8_8(0.5);
|
||||
// Required for match
|
||||
element->peak *= 2;
|
||||
} break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void Task_Bounce(void)
|
||||
{
|
||||
u8 r7 = 0;
|
||||
Sprite_Chord *chord = TASK_DATA(gCurTask);
|
||||
u8 i;
|
||||
|
||||
SetPlayerBouncePosition(chord);
|
||||
|
||||
for (i = 0; i < NUM_CHORD_ELEMENTS; i++) {
|
||||
ChordElement *element = &chord->elements[i];
|
||||
s16 r1 = I((chord->bounceAccel - element->y) * element->peak);
|
||||
|
||||
if (r1 <= element->y) {
|
||||
r7++;
|
||||
} else {
|
||||
r1 = (r1 - element->y) >> 2;
|
||||
if (r1 < Q_8_8(0.5)) {
|
||||
r1 = Q_8_8(0.5);
|
||||
}
|
||||
element->y += r1;
|
||||
}
|
||||
}
|
||||
|
||||
if (PLAYER_IS_ALIVE) {
|
||||
gPlayer.qWorldY = Q(chord->posY - 16) + chord->elements[2].y;
|
||||
gPlayer.rotation = 64;
|
||||
}
|
||||
|
||||
if (r7 == NUM_CHORD_ELEMENTS) {
|
||||
LaunchPlayer(chord);
|
||||
}
|
||||
|
||||
Render(chord);
|
||||
}
|
||||
|
||||
static void Task_Vibrate(void)
|
||||
{
|
||||
u8 r5 = 0;
|
||||
Sprite_Chord *chord = TASK_DATA(gCurTask);
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < NUM_CHORD_ELEMENTS; i++) {
|
||||
ChordElement *element = &chord->elements[i];
|
||||
|
||||
u16 r2 = element->y;
|
||||
|
||||
if (element->y == 0) {
|
||||
r5++;
|
||||
} else {
|
||||
if (element->y > 0) {
|
||||
u32 value = r2 - Q_8_8(1);
|
||||
r2 = 0;
|
||||
element->y = value;
|
||||
|
||||
if (element->y < 0)
|
||||
element->y = 0;
|
||||
|
||||
} else {
|
||||
u32 value = r2 + Q_8_8(1);
|
||||
r2 = 0;
|
||||
element->y = value;
|
||||
|
||||
if (element->y > 0)
|
||||
element->y = r2;
|
||||
}
|
||||
|
||||
element->y = -element->y;
|
||||
}
|
||||
}
|
||||
|
||||
if (r5 == NUM_CHORD_ELEMENTS) {
|
||||
HandleVibrateFinished(chord);
|
||||
}
|
||||
|
||||
if (PlayerIsHittingChord(chord)) {
|
||||
ResetChordAndHandleBounce(chord);
|
||||
}
|
||||
Render(chord);
|
||||
}
|
||||
|
||||
static void HandleBounce(Sprite_Chord *chord)
|
||||
{
|
||||
if (PLAYER_IS_ALIVE) {
|
||||
Player_SetMovestate_IsInScriptedSequence();
|
||||
gPlayer.moveState |= MOVESTATE_IA_OVERRIDE;
|
||||
|
||||
gPlayer.charState = CHARSTATE_SPIN_ATTACK;
|
||||
gPlayer.qSpeedAirX = 0;
|
||||
gPlayer.qSpeedAirY = (s32)(gPlayer.qSpeedAirY * 3) >> 1;
|
||||
|
||||
CLAMP_INLINE(gPlayer.qSpeedAirY, BOUNCE_MIN_ACCEL, BOUNCE_MAX_ACCEL);
|
||||
}
|
||||
|
||||
chord->bounceAccel = (u16)gPlayer.qSpeedAirY * 2;
|
||||
|
||||
if (chord->bounceAccel < BOUNCE_MIN_ACCEL) {
|
||||
chord->bounceAccel = BOUNCE_MIN_ACCEL;
|
||||
}
|
||||
|
||||
gCurTask->main = Task_Bounce;
|
||||
}
|
||||
|
||||
static void Render(Sprite_Chord *chord)
|
||||
{
|
||||
Sprite *s = &chord->s;
|
||||
u8 i;
|
||||
|
||||
for (i = 0; i < NUM_CHORD_ELEMENTS; i++) {
|
||||
ChordElement *element = &chord->elements[i];
|
||||
s16 elY = ABS(element->y) >> 3;
|
||||
s32 r2, r1;
|
||||
if (i > 2)
|
||||
elY = -elY;
|
||||
|
||||
r2 = chord->posX + 4;
|
||||
r2 += I(element->x + elY);
|
||||
r2 -= gCamera.x;
|
||||
s->x = r2;
|
||||
|
||||
r1 = chord->posY;
|
||||
r1 += I(element->y);
|
||||
r1 -= gCamera.y;
|
||||
s->y = r1;
|
||||
|
||||
DisplaySprite(s);
|
||||
}
|
||||
}
|
||||
|
||||
static bool32 PlayerIsHittingChord(Sprite_Chord *chord)
|
||||
{
|
||||
if (PLAYER_IS_ALIVE && gPlayer.qSpeedAirY > 0) {
|
||||
s16 screenX = chord->posX - gCamera.x;
|
||||
s16 screenY = chord->posY - gCamera.y;
|
||||
s16 playerX = I(gPlayer.qWorldX) - gCamera.x;
|
||||
s16 playerY = I(gPlayer.qWorldY) - gCamera.y;
|
||||
|
||||
if ((screenX <= playerX) && ((screenX + CHORD_WIDTH_PX) >= playerX) && ((screenY - 9) <= playerY) && ((screenY + 9) >= playerY)) {
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void Task_Idle(void)
|
||||
{
|
||||
Sprite_Chord *chord = TASK_DATA(gCurTask);
|
||||
|
||||
if (PlayerIsHittingChord(chord)) {
|
||||
HandleBounce(chord);
|
||||
}
|
||||
|
||||
if (ShouldDespawn(chord)) {
|
||||
chord->base.me->x = chord->base.spriteX;
|
||||
TaskDestroy(gCurTask);
|
||||
return;
|
||||
}
|
||||
|
||||
Render(chord);
|
||||
}
|
||||
|
||||
static void TaskDestructor_Chord(struct Task UNUSED *t) { }
|
||||
|
||||
static void LaunchPlayer(Sprite_Chord UNUSED *chord)
|
||||
{
|
||||
if (PLAYER_IS_ALIVE) {
|
||||
Player_ClearMovestate_IsInScriptedSequence();
|
||||
gPlayer.moveState &= ~MOVESTATE_IA_OVERRIDE;
|
||||
gPlayer.transition = PLTRANS_UNCURL;
|
||||
gPlayer.qSpeedAirY = -gPlayer.qSpeedAirY;
|
||||
m4aSongNumStart(SE_MUSIC_PLANT_CHORD);
|
||||
}
|
||||
|
||||
gCurTask->main = Task_Vibrate;
|
||||
}
|
||||
|
||||
static void HandleVibrateFinished(Sprite_Chord UNUSED *chord) { gCurTask->main = Task_Idle; }
|
||||
|
||||
static void ResetChordAndHandleBounce(Sprite_Chord *chord)
|
||||
{
|
||||
u8 i;
|
||||
for (i = 0; i < NUM_CHORD_ELEMENTS; i++) {
|
||||
ChordElement *element = &chord->elements[i];
|
||||
element->y = 0;
|
||||
}
|
||||
|
||||
HandleBounce(chord);
|
||||
}
|
||||
|
||||
// Because assigning it to a variable doesn't match...
|
||||
#define LOCAL_CHORD_ELEMENT_MARGIN (Q(chord->posX + (CHORD_WIDTH_PX / 2)))
|
||||
|
||||
static void SetPlayerBouncePosition(Sprite_Chord *chord)
|
||||
{
|
||||
if (PLAYER_IS_ALIVE) {
|
||||
if (gPlayer.qWorldX != LOCAL_CHORD_ELEMENT_MARGIN) {
|
||||
if (gPlayer.qWorldX > LOCAL_CHORD_ELEMENT_MARGIN) {
|
||||
gPlayer.qWorldX -= Q(0.5);
|
||||
|
||||
if (gPlayer.qWorldX < LOCAL_CHORD_ELEMENT_MARGIN)
|
||||
gPlayer.qWorldX = LOCAL_CHORD_ELEMENT_MARGIN;
|
||||
} else {
|
||||
gPlayer.qWorldX += Q(0.5);
|
||||
|
||||
if (gPlayer.qWorldX > LOCAL_CHORD_ELEMENT_MARGIN)
|
||||
gPlayer.qWorldX = LOCAL_CHORD_ELEMENT_MARGIN;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#undef LOCAL_CHORD_ELEMENT_MARGIN
|
||||
|
||||
static bool32 ShouldDespawn(Sprite_Chord *chord)
|
||||
{
|
||||
s32 screenX, screenY;
|
||||
s16 otherX, otherY;
|
||||
|
||||
screenX = chord->posX;
|
||||
screenX -= gCamera.x;
|
||||
|
||||
screenY = chord->posY;
|
||||
screenY -= gCamera.y;
|
||||
|
||||
otherY = screenY;
|
||||
otherX = screenX;
|
||||
|
||||
if (IS_OUT_OF_RANGE_2(otherX, otherY, (CAM_REGION_WIDTH + (CHORD_WIDTH_PX / 2)) / 2, CAM_REGION_WIDTH / 2)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@@ -48,7 +48,7 @@
|
||||
#include "game/interactables_2/music_plant/pipe_horn.h"
|
||||
#include "game/interactables_2/music_plant/keyboard.h"
|
||||
#include "game/interactables_2/music_plant/note_block.h"
|
||||
#include "game/interactables_2/music_plant/bouncy_chain.h"
|
||||
#include "game/interactables_2/music_plant/chord.h"
|
||||
#include "game/interactables_2/music_plant/german_flute.h"
|
||||
|
||||
#include "game/interactables_2/ice_paradise/big_snowball.h"
|
||||
@@ -323,7 +323,7 @@ const MapEntityInit gSpriteInits_Interactables[] = {
|
||||
CreateEntity_FloatingSpring_Up,
|
||||
CreateEntity_NoteSphere,
|
||||
CreateEntity_NoteBlock,
|
||||
CreateEntity_BouncyChain,
|
||||
CreateEntity_Chord,
|
||||
CreateEntity_Keyboard_Vertical,
|
||||
CreateEntity_Keyboard_Horizontal_PushLeft,
|
||||
CreateEntity_Keyboard_Horizontal_PushRight,
|
||||
|
||||
Vendored
+4
-4
@@ -13,8 +13,8 @@
|
||||
|
||||
/* TODO: Make including <entity>.h from game code work */
|
||||
|
||||
//From "game/interactables_2/music_plant/bouncy_chain.h"
|
||||
#define NUM_BOUNCY_CHAIN_ELEMS 6
|
||||
//From "game/interactables_2/music_plant/chord.h"
|
||||
#define NUM_CHORD_ELEMS 6
|
||||
|
||||
// From light_bridge.h
|
||||
#define BRIDGE_SEGMENT_WIDTH 12
|
||||
@@ -163,8 +163,8 @@ DrawEntInteractableSA2(AppState *state, int x, int y, int kind, char data[4])
|
||||
#if 0
|
||||
// NOTE: The frame for the bouncy chain elements is in
|
||||
// variant 15 of NOTE_BLOCK, for some reason.
|
||||
case IA__BOUNCY_CHAIN: {
|
||||
for(int i = 0; i < NUM_BOUNCY_CHAIN_ELEMS; i++) {
|
||||
case IA__CHORD: {
|
||||
for(int i = 0; i < NUM_CHORD_ELEMS; i++) {
|
||||
|
||||
}
|
||||
} break;
|
||||
|
||||
Reference in new issue
Block a user