mirror of
https://github.com/zeldaret/tmc
synced 2026-06-27 10:43:05 -04:00
406 lines
16 KiB
C
406 lines
16 KiB
C
/**
|
|
* @file playerItemCellOverwriteSet.c
|
|
* @ingroup Items
|
|
*
|
|
* @brief Cell Overwrite Set Player Item
|
|
*/
|
|
#include "asm.h"
|
|
#include "common.h"
|
|
#include "entity.h"
|
|
#include "player.h"
|
|
#include "room.h"
|
|
#include "tiles.h"
|
|
|
|
typedef struct {
|
|
/*0x00*/ Entity base;
|
|
/*0x68*/ u8 unused[4];
|
|
/*0x6c*/ u16 tileType;
|
|
} PlayerItemCellOverwriteSetEntity;
|
|
|
|
// actTile for specialTile
|
|
const u8 gMapSpecialTileToActTile[] = {
|
|
0, // SPECIAL_TILE_0
|
|
0, // SPECIAL_TILE_1
|
|
0, // SPECIAL_TILE_2
|
|
0, // SPECIAL_TILE_3
|
|
0, // SPECIAL_TILE_4
|
|
0, // SPECIAL_TILE_5
|
|
0, // SPECIAL_TILE_6
|
|
0, // SPECIAL_TILE_7
|
|
0, // SPECIAL_TILE_8
|
|
0, // SPECIAL_TILE_9
|
|
0, // SPECIAL_TILE_10
|
|
0, // SPECIAL_TILE_11
|
|
0, // SPECIAL_TILE_12
|
|
0, // SPECIAL_TILE_13
|
|
0, // SPECIAL_TILE_14
|
|
0, // SPECIAL_TILE_15
|
|
0, // SPECIAL_TILE_16
|
|
0, // SPECIAL_TILE_17
|
|
0, // SPECIAL_TILE_18
|
|
0, // SPECIAL_TILE_19
|
|
ACT_TILE_241, // SPECIAL_TILE_20
|
|
0, // SPECIAL_TILE_21
|
|
0, // SPECIAL_TILE_22
|
|
ACT_TILE_83, // SPECIAL_TILE_23
|
|
ACT_TILE_242, // SPECIAL_TILE_24
|
|
ACT_TILE_243, // SPECIAL_TILE_25
|
|
0, // SPECIAL_TILE_26
|
|
0, // SPECIAL_TILE_27
|
|
0, // SPECIAL_TILE_28
|
|
0, // SPECIAL_TILE_29
|
|
0, // SPECIAL_TILE_30
|
|
0, // SPECIAL_TILE_31
|
|
ACT_TILE_240, // SPECIAL_TILE_32
|
|
0, // SPECIAL_TILE_33
|
|
0, // SPECIAL_TILE_34
|
|
0, // SPECIAL_TILE_35
|
|
0, // SPECIAL_TILE_36
|
|
0, // SPECIAL_TILE_37
|
|
0, // SPECIAL_TILE_38
|
|
0, // SPECIAL_TILE_39
|
|
0, // SPECIAL_TILE_40
|
|
0, // SPECIAL_TILE_41
|
|
0, // SPECIAL_TILE_42
|
|
0, // SPECIAL_TILE_43
|
|
0, // SPECIAL_TILE_44
|
|
0, // SPECIAL_TILE_45
|
|
0, // SPECIAL_TILE_46
|
|
0, // SPECIAL_TILE_47
|
|
0, // SPECIAL_TILE_48
|
|
0, // SPECIAL_TILE_49
|
|
0, // SPECIAL_TILE_50
|
|
0, // SPECIAL_TILE_51
|
|
0, // SPECIAL_TILE_52
|
|
0, // SPECIAL_TILE_53
|
|
0, // SPECIAL_TILE_54
|
|
0, // SPECIAL_TILE_55
|
|
0, // SPECIAL_TILE_56
|
|
0, // SPECIAL_TILE_57
|
|
0, // SPECIAL_TILE_58
|
|
0, // SPECIAL_TILE_59
|
|
0, // SPECIAL_TILE_60
|
|
0, // SPECIAL_TILE_61
|
|
0, // SPECIAL_TILE_62
|
|
0, // SPECIAL_TILE_63
|
|
ACT_TILE_61, // SPECIAL_TILE_64
|
|
ACT_TILE_61, // SPECIAL_TILE_65
|
|
ACT_TILE_61, // SPECIAL_TILE_66
|
|
ACT_TILE_61, // SPECIAL_TILE_67
|
|
ACT_TILE_61, // SPECIAL_TILE_68
|
|
ACT_TILE_61, // SPECIAL_TILE_69
|
|
ACT_TILE_61, // SPECIAL_TILE_70
|
|
ACT_TILE_61, // SPECIAL_TILE_71
|
|
ACT_TILE_61, // SPECIAL_TILE_72
|
|
0, // SPECIAL_TILE_73
|
|
0, // SPECIAL_TILE_74
|
|
0, // SPECIAL_TILE_75
|
|
0, // SPECIAL_TILE_76
|
|
0, // SPECIAL_TILE_77
|
|
0, // SPECIAL_TILE_78
|
|
0, // SPECIAL_TILE_79
|
|
0, // SPECIAL_TILE_80
|
|
ACT_TILE_58, // SPECIAL_TILE_81
|
|
0, // SPECIAL_TILE_82
|
|
0, // SPECIAL_TILE_83
|
|
0, // SPECIAL_TILE_84
|
|
0, // SPECIAL_TILE_85
|
|
0, // SPECIAL_TILE_86
|
|
0, // SPECIAL_TILE_87
|
|
0, // SPECIAL_TILE_88
|
|
0, // SPECIAL_TILE_89
|
|
0, // SPECIAL_TILE_90
|
|
0, // SPECIAL_TILE_91
|
|
0, // SPECIAL_TILE_92
|
|
0, // SPECIAL_TILE_93
|
|
0, // SPECIAL_TILE_94
|
|
0, // SPECIAL_TILE_95
|
|
0, // SPECIAL_TILE_96
|
|
0, // SPECIAL_TILE_97
|
|
0, // SPECIAL_TILE_98
|
|
0, // SPECIAL_TILE_99
|
|
0, // SPECIAL_TILE_100
|
|
0, // SPECIAL_TILE_101
|
|
0, // SPECIAL_TILE_102
|
|
0, // SPECIAL_TILE_103
|
|
0, // SPECIAL_TILE_104
|
|
ACT_TILE_40, // SPECIAL_TILE_105
|
|
0, // SPECIAL_TILE_106
|
|
0, // SPECIAL_TILE_107
|
|
0, // SPECIAL_TILE_108
|
|
0, // SPECIAL_TILE_109
|
|
0, // SPECIAL_TILE_110
|
|
0, // SPECIAL_TILE_111
|
|
0, // SPECIAL_TILE_112
|
|
0, // SPECIAL_TILE_113
|
|
0, // SPECIAL_TILE_114
|
|
0, // SPECIAL_TILE_115
|
|
0, // SPECIAL_TILE_116
|
|
ACT_TILE_18, // SPECIAL_TILE_117
|
|
ACT_TILE_18, // SPECIAL_TILE_118
|
|
ACT_TILE_18, // SPECIAL_TILE_119
|
|
ACT_TILE_18, // SPECIAL_TILE_120
|
|
ACT_TILE_18, // SPECIAL_TILE_121
|
|
ACT_TILE_18, // SPECIAL_TILE_122
|
|
ACT_TILE_18, // SPECIAL_TILE_123
|
|
ACT_TILE_18, // SPECIAL_TILE_124
|
|
0, // SPECIAL_TILE_125
|
|
ACT_TILE_116, // SPECIAL_TILE_126
|
|
ACT_TILE_116, // SPECIAL_TILE_127
|
|
ACT_TILE_41, // SPECIAL_TILE_128
|
|
0, // SPECIAL_TILE_129
|
|
ACT_TILE_35, // SPECIAL_TILE_130
|
|
ACT_TILE_41, // SPECIAL_TILE_131
|
|
ACT_TILE_41, // SPECIAL_TILE_132
|
|
ACT_TILE_41, // SPECIAL_TILE_133
|
|
ACT_TILE_41, // SPECIAL_TILE_134
|
|
ACT_TILE_41, // SPECIAL_TILE_135
|
|
ACT_TILE_41, // SPECIAL_TILE_136
|
|
ACT_TILE_16, // SPECIAL_TILE_137
|
|
ACT_TILE_16, // SPECIAL_TILE_138
|
|
ACT_TILE_16, // SPECIAL_TILE_139
|
|
ACT_TILE_16, // SPECIAL_TILE_140
|
|
ACT_TILE_41, // SPECIAL_TILE_141
|
|
ACT_TILE_80, // SPECIAL_TILE_142
|
|
ACT_TILE_81, // SPECIAL_TILE_143
|
|
0, // SPECIAL_TILE_144
|
|
ACT_TILE_15, // SPECIAL_TILE_145
|
|
0, // SPECIAL_TILE_146
|
|
0, // SPECIAL_TILE_147
|
|
0, // SPECIAL_TILE_148
|
|
0, // SPECIAL_TILE_149
|
|
0, // SPECIAL_TILE_150
|
|
};
|
|
|
|
// collisionData for specialTile
|
|
const u8 gMapSpecialTileToCollisionData[] = {
|
|
COLLISION_DATA_29, // SPECIAL_TILE_0
|
|
0, // SPECIAL_TILE_1
|
|
0, // SPECIAL_TILE_2
|
|
0, // SPECIAL_TILE_3
|
|
0, // SPECIAL_TILE_4
|
|
0, // SPECIAL_TILE_5
|
|
COLLISION_DATA_15, // SPECIAL_TILE_6
|
|
0, // SPECIAL_TILE_7
|
|
0, // SPECIAL_TILE_8
|
|
0, // SPECIAL_TILE_9
|
|
0, // SPECIAL_TILE_10
|
|
COLLISION_DATA_15, // SPECIAL_TILE_11
|
|
0, // SPECIAL_TILE_12
|
|
0, // SPECIAL_TILE_13
|
|
0, // SPECIAL_TILE_14
|
|
0, // SPECIAL_TILE_15
|
|
0, // SPECIAL_TILE_16
|
|
0, // SPECIAL_TILE_17
|
|
0, // SPECIAL_TILE_18
|
|
0, // SPECIAL_TILE_19
|
|
0, // SPECIAL_TILE_20
|
|
0, // SPECIAL_TILE_21
|
|
0, // SPECIAL_TILE_22
|
|
COLLISION_DATA_23, // SPECIAL_TILE_23
|
|
COLLISION_DATA_40, // SPECIAL_TILE_24
|
|
COLLISION_DATA_40, // SPECIAL_TILE_25
|
|
COLLISION_DATA_40, // SPECIAL_TILE_26
|
|
COLLISION_DATA_15, // SPECIAL_TILE_27
|
|
0, // SPECIAL_TILE_28
|
|
0, // SPECIAL_TILE_29
|
|
0, // SPECIAL_TILE_30
|
|
0, // SPECIAL_TILE_31
|
|
COLLISION_DATA_32, // SPECIAL_TILE_32
|
|
0, // SPECIAL_TILE_33
|
|
COLLISION_DATA_15, // SPECIAL_TILE_34
|
|
COLLISION_DATA_3, // SPECIAL_TILE_35
|
|
COLLISION_DATA_5, // SPECIAL_TILE_36
|
|
COLLISION_DATA_10, // SPECIAL_TILE_37
|
|
COLLISION_DATA_12, // SPECIAL_TILE_38
|
|
COLLISION_DATA_1, // SPECIAL_TILE_39
|
|
COLLISION_DATA_2, // SPECIAL_TILE_40
|
|
COLLISION_DATA_4, // SPECIAL_TILE_41
|
|
COLLISION_DATA_8, // SPECIAL_TILE_42
|
|
COLLISION_DATA_15, // SPECIAL_TILE_43
|
|
COLLISION_DATA_5, // SPECIAL_TILE_44
|
|
COLLISION_DATA_10, // SPECIAL_TILE_45
|
|
COLLISION_DATA_69, // SPECIAL_TILE_46
|
|
COLLISION_DATA_68, // SPECIAL_TILE_47
|
|
0, // SPECIAL_TILE_48
|
|
0, // SPECIAL_TILE_49
|
|
COLLISION_DATA_15, // SPECIAL_TILE_50
|
|
0, // SPECIAL_TILE_51
|
|
0, // SPECIAL_TILE_52
|
|
0, // SPECIAL_TILE_53
|
|
COLLISION_DATA_15, // SPECIAL_TILE_54
|
|
0, // SPECIAL_TILE_55
|
|
0, // SPECIAL_TILE_56
|
|
0, // SPECIAL_TILE_57
|
|
0, // SPECIAL_TILE_58
|
|
COLLISION_DATA_15, // SPECIAL_TILE_59
|
|
0, // SPECIAL_TILE_60
|
|
0, // SPECIAL_TILE_61
|
|
COLLISION_DATA_15, // SPECIAL_TILE_62
|
|
0, // SPECIAL_TILE_63
|
|
COLLISION_DATA_1, // SPECIAL_TILE_64
|
|
COLLISION_DATA_3, // SPECIAL_TILE_65
|
|
COLLISION_DATA_2, // SPECIAL_TILE_66
|
|
COLLISION_DATA_5, // SPECIAL_TILE_67
|
|
COLLISION_DATA_15, // SPECIAL_TILE_68
|
|
COLLISION_DATA_10, // SPECIAL_TILE_69
|
|
COLLISION_DATA_4, // SPECIAL_TILE_70
|
|
COLLISION_DATA_12, // SPECIAL_TILE_71
|
|
COLLISION_DATA_8, // SPECIAL_TILE_72
|
|
COLLISION_DATA_71, // SPECIAL_TILE_73
|
|
COLLISION_DATA_15, // SPECIAL_TILE_74
|
|
0, // SPECIAL_TILE_75
|
|
0, // SPECIAL_TILE_76
|
|
0, // SPECIAL_TILE_77
|
|
0, // SPECIAL_TILE_78
|
|
0, // SPECIAL_TILE_79
|
|
COLLISION_DATA_15, // SPECIAL_TILE_80
|
|
COLLISION_DATA_15, // SPECIAL_TILE_81
|
|
COLLISION_DATA_3, // SPECIAL_TILE_82
|
|
COLLISION_DATA_5, // SPECIAL_TILE_83
|
|
0, // SPECIAL_TILE_84
|
|
COLLISION_DATA_13, // SPECIAL_TILE_85
|
|
COLLISION_DATA_12, // SPECIAL_TILE_86
|
|
COLLISION_DATA_11, // SPECIAL_TILE_87
|
|
COLLISION_DATA_10, // SPECIAL_TILE_88
|
|
0, // SPECIAL_TILE_89
|
|
COLLISION_DATA_15, // SPECIAL_TILE_90
|
|
COLLISION_DATA_15, // SPECIAL_TILE_91
|
|
COLLISION_DATA_15, // SPECIAL_TILE_92
|
|
COLLISION_DATA_15, // SPECIAL_TILE_93
|
|
COLLISION_DATA_15, // SPECIAL_TILE_94
|
|
COLLISION_DATA_15, // SPECIAL_TILE_95
|
|
COLLISION_DATA_15, // SPECIAL_TILE_96
|
|
COLLISION_DATA_15, // SPECIAL_TILE_97
|
|
COLLISION_DATA_80, // SPECIAL_TILE_98
|
|
COLLISION_DATA_7, // SPECIAL_TILE_99
|
|
COLLISION_DATA_11, // SPECIAL_TILE_100
|
|
COLLISION_DATA_13, // SPECIAL_TILE_101
|
|
COLLISION_DATA_14, // SPECIAL_TILE_102
|
|
COLLISION_DATA_15, // SPECIAL_TILE_103
|
|
COLLISION_DATA_15, // SPECIAL_TILE_104
|
|
COLLISION_DATA_39, // SPECIAL_TILE_105
|
|
COLLISION_DATA_15, // SPECIAL_TILE_106
|
|
COLLISION_DATA_15, // SPECIAL_TILE_107
|
|
COLLISION_DATA_16, // SPECIAL_TILE_108
|
|
COLLISION_DATA_17, // SPECIAL_TILE_109
|
|
COLLISION_DATA_18, // SPECIAL_TILE_110
|
|
COLLISION_DATA_19, // SPECIAL_TILE_111
|
|
0, // SPECIAL_TILE_112
|
|
0, // SPECIAL_TILE_113
|
|
COLLISION_DATA_15, // SPECIAL_TILE_114
|
|
COLLISION_DATA_15, // SPECIAL_TILE_115
|
|
0, // SPECIAL_TILE_116
|
|
COLLISION_DATA_1, // SPECIAL_TILE_117
|
|
COLLISION_DATA_2, // SPECIAL_TILE_118
|
|
COLLISION_DATA_3, // SPECIAL_TILE_119
|
|
COLLISION_DATA_4, // SPECIAL_TILE_120
|
|
COLLISION_DATA_5, // SPECIAL_TILE_121
|
|
COLLISION_DATA_8, // SPECIAL_TILE_122
|
|
COLLISION_DATA_10, // SPECIAL_TILE_123
|
|
COLLISION_DATA_12, // SPECIAL_TILE_124
|
|
COLLISION_DATA_15, // SPECIAL_TILE_125
|
|
COLLISION_DATA_5, // SPECIAL_TILE_126
|
|
COLLISION_DATA_12, // SPECIAL_TILE_127
|
|
0, // SPECIAL_TILE_128
|
|
0, // SPECIAL_TILE_129
|
|
COLLISION_DATA_95, // SPECIAL_TILE_130
|
|
COLLISION_DATA_39, // SPECIAL_TILE_131
|
|
COLLISION_DATA_103, // SPECIAL_TILE_132
|
|
COLLISION_DATA_104, // SPECIAL_TILE_133
|
|
COLLISION_DATA_105, // SPECIAL_TILE_134
|
|
COLLISION_DATA_106, // SPECIAL_TILE_135
|
|
COLLISION_DATA_107, // SPECIAL_TILE_136
|
|
COLLISION_DATA_49, // SPECIAL_TILE_137
|
|
COLLISION_DATA_50, // SPECIAL_TILE_138
|
|
COLLISION_DATA_58, // SPECIAL_TILE_139
|
|
COLLISION_DATA_60, // SPECIAL_TILE_140
|
|
COLLISION_DATA_35, // SPECIAL_TILE_141
|
|
COLLISION_DATA_43, // SPECIAL_TILE_142
|
|
COLLISION_DATA_43, // SPECIAL_TILE_143
|
|
COLLISION_DATA_5, // SPECIAL_TILE_144
|
|
COLLISION_DATA_34, // SPECIAL_TILE_145
|
|
COLLISION_DATA_1, // SPECIAL_TILE_146
|
|
COLLISION_DATA_2, // SPECIAL_TILE_147
|
|
COLLISION_DATA_4, // SPECIAL_TILE_148
|
|
COLLISION_DATA_8, // SPECIAL_TILE_149
|
|
COLLISION_DATA_12, // SPECIAL_TILE_150
|
|
};
|
|
|
|
const u16 gUnk_080B7A3E[] = {
|
|
1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
|
|
0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
|
|
1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 129, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 16, 0, 64, 0, 3, 3, 3, 3, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0,
|
|
}; // TODO no need to store this in an u16?
|
|
// TODO figure out type from arm_sub_080B1B84 and arm_sub_080B1BA4, also related to specialTiles
|
|
|
|
void PlayerItemCellOverwriteSet(PlayerItemCellOverwriteSetEntity* this) {
|
|
static const s8 offsetByDirection[] = { 0, -16, 16, 0, 0, 16, -16, 0 };
|
|
u32 tmp;
|
|
Entity* player = &gPlayerEntity.base;
|
|
|
|
if (super->action == 0) {
|
|
this->tileType =
|
|
GetTileTypeAtTilePos(TILE(player->x.HALF.HI + offsetByDirection[player->animationState & 0xe],
|
|
player->y.HALF.HI + offsetByDirection[(player->animationState & 0xe) + 1]),
|
|
super->collisionLayer);
|
|
super->action++;
|
|
}
|
|
gPlayerState.mobility |= 0x80;
|
|
tmp = gInput.heldKeys & R_BUTTON;
|
|
if ((gInput.heldKeys & A_BUTTON) != 0) {
|
|
if ((gInput.newKeys & R_BUTTON) != 0) {
|
|
this->tileType =
|
|
GetTileTypeAtTilePos(TILE(player->x.HALF.HI + offsetByDirection[player->animationState & 0xe],
|
|
player->y.HALF.HI + offsetByDirection[(player->animationState & 0xe) + 1]),
|
|
super->collisionLayer);
|
|
}
|
|
if ((gInput.heldKeys & R_BUTTON) != 0) {
|
|
player->iframes = 2;
|
|
} else {
|
|
if ((gInput.newKeys & DPAD_RIGHT) != 0) {
|
|
this->tileType--;
|
|
}
|
|
if ((gInput.newKeys & DPAD_LEFT) != 0) {
|
|
this->tileType++;
|
|
}
|
|
if ((gInput.heldKeys & (DPAD_LEFT | DPAD_RIGHT)) != 0) {
|
|
if (++super->subtimer > 0x1e) {
|
|
super->subtimer = 30;
|
|
if ((gInput.heldKeys & DPAD_RIGHT) != 0) {
|
|
this->tileType--;
|
|
}
|
|
if ((gInput.heldKeys & DPAD_LEFT) != 0) {
|
|
this->tileType++;
|
|
}
|
|
}
|
|
} else {
|
|
super->subtimer = 0;
|
|
}
|
|
}
|
|
} else {
|
|
sub_0807B7D8(this->tileType,
|
|
TILE(player->x.HALF.HI + offsetByDirection[player->animationState & 0xe],
|
|
player->y.HALF.HI + offsetByDirection[(player->animationState & 0xe) + 1]),
|
|
super->collisionLayer);
|
|
gPlayerState.mobility &= ~0x80;
|
|
DeleteThisEntity();
|
|
}
|
|
if ((gInput.heldKeys & B_BUTTON) != 0) {
|
|
sub_0807B7D8(this->tileType,
|
|
TILE(player->x.HALF.HI + offsetByDirection[0], player->y.HALF.HI + offsetByDirection[1]),
|
|
super->collisionLayer);
|
|
sub_0807B7D8(this->tileType,
|
|
TILE(player->x.HALF.HI + offsetByDirection[2], player->y.HALF.HI + offsetByDirection[3]),
|
|
super->collisionLayer);
|
|
sub_0807B7D8(this->tileType,
|
|
TILE(player->x.HALF.HI + offsetByDirection[4], player->y.HALF.HI + offsetByDirection[5]),
|
|
super->collisionLayer);
|
|
sub_0807B7D8(this->tileType,
|
|
TILE(player->x.HALF.HI + offsetByDirection[6], player->y.HALF.HI + offsetByDirection[7]),
|
|
super->collisionLayer);
|
|
}
|
|
}
|