Files
tmc/src/playerItem/playerItemCellOverwriteSet.c
T
2024-01-06 18:43:02 +01:00

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);
}
}