Skip to content

Commit

Permalink
most battle flags
Browse files Browse the repository at this point in the history
  • Loading branch information
HailSanta authored and HailSanta committed Oct 19, 2023
1 parent 19774a9 commit 858ed5b
Show file tree
Hide file tree
Showing 301 changed files with 2,386 additions and 2,318 deletions.
12 changes: 6 additions & 6 deletions include/common_structs.h
Original file line number Diff line number Diff line change
Expand Up @@ -342,16 +342,16 @@ typedef struct PlayerData {
/* 0x292 */ s8 starBeamLevel;
/* 0x293 */ char unk_293;
/* 0x294 */ u16 actionCommandAttempts;
/* 0x296 */ s16 actionCommandSuccesses;
/* 0x296 */ u16 actionCommandSuccesses;
/* 0x298 */ u16 hitsTaken;
/* 0x29A */ u16 hitsBlocked;
/* 0x29C */ u16 playerFirstStrikes;
/* 0x29E */ u16 enemyFirstStrikes;
/* 0x2A0 */ u16 powerBounces;
/* 0x2A2 */ u16 battlesCount;
/* 0x2A4 */ u16 battlesWon;
/* 0x2A6 */ s16 unk_2A6;
/* 0x2A8 */ s16 battlesFled;
/* 0x2A6 */ u16 fleeAttempts;
/* 0x2A8 */ u16 battlesFled;
/* 0x2AA */ u16 trainingsDone;
/* 0x2AC */ s32 walkingStepsTaken;
/* 0x2B0 */ s32 runningStepsTaken;
Expand Down Expand Up @@ -979,8 +979,8 @@ typedef struct BattleStatus {
/* 0x21C */ s32 stickX;
/* 0x220 */ s32 stickY;
/* 0x224 */ s32 inputBitmask;
/* 0x228 */ s32 dpadX; /* 0-360 */
/* 0x22C */ s32 dpadY; /* 0-60 */
/* 0x228 */ s32 stickAngle; /* 0-360 */
/* 0x22C */ s32 stickMagnitude; /* 0-60 */
/* 0x230 */ s32 holdInputBuffer[64];
/* 0x330 */ s32 pushInputBuffer[64];
/* 0x430 */ s8 holdInputBufferPos;
Expand Down Expand Up @@ -1956,7 +1956,7 @@ typedef struct Actor {
/* 0x40C */ s8 targetListLength;
/* 0x40D */ s8 targetIndexList[MAX_ENEMY_ACTORS]; /* into targetData */
/* 0x425 */ s8 selectedTargetIndex; /* into target index list */
/* 0x426 */ s8 targetPartIndex;
/* 0x426 */ s8 targetPartID;
/* 0x427 */ char unk_427[1];
/* 0x428 */ s16 targetActorID;
/* 0x42A */ char unk_42A[2];
Expand Down
2 changes: 1 addition & 1 deletion include/effects.h
Original file line number Diff line number Diff line change
Expand Up @@ -2313,7 +2313,7 @@ typedef struct BreakingJunkFXData {
enum {
FX_BUFF_DATA_WATER_BLOCK = 0,
FX_BUFF_DATA_CLOUD_NINE = 1,
FX_BUFF_DATA_TURBO_CHARGE = 2
FX_BUFF_DATA_TURBO_CHARGE = 2,
};

typedef struct BuffData {
Expand Down
120 changes: 70 additions & 50 deletions include/enums.h
Original file line number Diff line number Diff line change
Expand Up @@ -1904,9 +1904,9 @@ enum EncounterOutcomes {
};

enum MerleeSpellType {
MERLEE_SPELL_0 = 0,
MERLEE_SPELL_1 = 1,
MERLEE_SPELL_2 = 2,
MERLEE_SPELL_NONE = 0,
MERLEE_SPELL_ATK_BOOST = 1,
MERLEE_SPELL_DEF_BOOST = 2,
MERLEE_SPELL_EXP_BOOST = 3,
MERLEE_SPELL_COIN_BOOST = 4,
};
Expand Down Expand Up @@ -1945,9 +1945,9 @@ enum SpeechFlags {
typedef enum HitResult {
HIT_RESULT_BACKFIRE = -1,
HIT_RESULT_HIT = 0,
HIT_RESULT_1 = 1, // KILL?
HIT_RESULT_NICE = 1,
HIT_RESULT_NO_DAMAGE = 2,
HIT_RESULT_3 = 3,
HIT_RESULT_NICE_NO_DAMAGE = 3,
HIT_RESULT_LANDED_ON_SPIKE = 4,
HIT_RESULT_LUCKY = 5,
HIT_RESULT_MISS = 6,
Expand Down Expand Up @@ -2907,6 +2907,26 @@ enum EventSupressFlags {
SUPPRESS_EVENT_FLAG_10000 = 0x10000, // usage is a bug?
};

// combination used for hammer-based attacks
#define SUPPRESS_EVENTS_HAMMER \
SUPPRESS_EVENT_SPIKY_TOP \
| SUPPRESS_EVENT_SHOCK_CONTACT \
| SUPPRESS_EVENT_BURN_CONTACT

// combination used for mostly for kooper's attacks
#define SUPPRESS_EVENTS_KOOPER_TEST \
SUPPRESS_EVENT_SPIKY_FRONT \
| SUPPRESS_EVENT_BURN_CONTACT

// combination used for mostly for kooper's attacks
#define SUPPRESS_EVENTS_KOOPER_DAMAGE \
SUPPRESS_EVENT_SPIKY_TOP \
| SUPPRESS_EVENT_EXPLODE_CONTACT \
| SUPPRESS_EVENT_SPIKY_FRONT \
| SUPPRESS_EVENT_SHOCK_CONTACT \
| SUPPRESS_EVENT_BURN_CONTACT \
| SUPPRESS_EVENT_ALT_SPIKY

enum PartnerActions {
PARTNER_ACTION_NONE = 0, // generic state
PARTNER_ACTION_USE = 1, // generic state
Expand Down Expand Up @@ -3532,18 +3552,22 @@ enum BattleStatusFlags1 {
BS_FLAGS1_MENU_OPEN = 0x00000002,
BS_FLAGS1_TATTLE_OPEN = 0x00000004,
BS_FLAGS1_SHOW_PLAYER_DECORATIONS = 0x00000008, // enables effects for Frozen, Water Block, and Cloud Nine to appear and follow the player
BS_FLAGS1_10 = 0x00000010, // enable attack bonuses (power plus, etc)
BS_FLAGS1_SP_EVT_ACTIVE = 0x00000020, // enable special events (other than hit/death/immune?)
BS_FLAGS1_40 = 0x00000040,
BS_FLAGS1_80 = 0x00000080,
// Enables attack bonuses like Power Plus and Merlee ATK boost.
// Almost always used with TestTarget functions when not called with DAMAGE_TYPE_TRIGGER_LUCKY.
BS_FLAGS1_INCLUDE_POWER_UPS = 0x00000010,
// Current hit may trigger special events on the target (other than hit/death/immune)
// These include FLIP_TRIGGER, FALL_TRIGGER, BURN_HIT, SPIN_SMASH_HIT, etc.
// This has no bearing on contact hazard events which affect the attacker like SPIKE_CONTACT or BURN_CONTACT.
BS_FLAGS1_TRIGGER_EVENTS = 0x00000020,
BS_FLAGS1_NICE_HIT = 0x00000040,
BS_FLAGS1_NO_RATING = 0x00000080, // prevents 'Nice!' or 'Super!' messages from appearing
BS_FLAGS1_EXECUTING_MOVE = 0x00000100,
BS_FLAGS1_200 = 0x00000200,
BS_FLAGS1_400 = 0x00000400, // UNUSED
BS_FLAGS1_FORCE_HIT_IMMUNE = 0x00000800,
BS_FLAGS1_SUPER_HIT = 0x00000200, // only works for partners and items, NOT player hits
BS_FLAGS1_FORCE_IMMUNE_HIT = 0x00000800,
BS_FLAGS1_AUTO_SUCCEED_ACTION = 0x00001000,
BS_FLAGS1_2000 = 0x00002000,
BS_FLAGS1_4000 = 0x00004000,
BS_FLAGS1_8000 = 0x00008000,
BS_FLAGS1_FREE_ACTION_COMMAND = 0x00008000,
BS_FLAGS1_10000 = 0x00010000,
BS_FLAGS1_DISABLE_CELEBRATION = 0x00020000,
BS_FLAGS1_BATTLE_FLED = 0x00040000, // used both when the player flees sucessfully or an enemy flees
Expand All @@ -3566,16 +3590,16 @@ enum BattleStatusFlags2 {
BS_FLAGS2_AWARDING_STAR_POINTS = 0x00000001, // star points move to the center of the screen
BS_FLAGS2_PLAYER_TURN_USED = 0x00000002, // set after player has used their action for this turn
BS_FLAGS2_PARTNER_TURN_USED = 0x00000004, // set after partner has used their action for this turn
BS_FLAGS2_8 = 0x00000008,
BS_FLAGS2_10 = 0x00000010,
BS_FLAGS2_OVERRIDE_INACTIVE_PLAYER = 0x00000008, // override inactive player animations and effects
BS_FLAGS2_OVERRIDE_INACTIVE_PARTNER = 0x00000010, // override inactive partner animations and effects
BS_FLAGS2_CANT_FLEE = 0x00000020,
BS_FLAGS2_PEACH_BATTLE = 0x00000040,
BS_FLAGS2_STORED_TURBO_CHARGE_TURN = 0x00000100, // prevents turbo charge turns from decrementing on begin player turn
BS_FLAGS2_DOING_JUMP_TUTORIAL = 0x00000200,
BS_FLAGS2_400 = 0x00000400,
BS_FLAGS2_FINAL_BOWSER_PART_1 = 0x00000400, // no other use for this flag, purpose unknown
BS_FLAGS2_NO_TARGET_AVAILABLE = 0x00001000,
BS_FLAGS2_IGNORE_DARKNESS = 0x00004000,
BS_FLAGS2_10000 = 0x00010000,
BS_FLAGS2_HIDE_BUFF_COUNTERS = 0x00010000, // hide turn counters for partner buffs (Cloud Nine, Water Block, etc)
BS_FLAGS2_NO_PLAYER_PAL_ADJUST = 0x00100000,
BS_FLAGS2_IS_FIRST_STRIKE = 0x01000000,
BS_FLAGS2_DONT_STOP_MUSIC = 0x02000000, // don't stop playing the current song when the battle ends
Expand Down Expand Up @@ -4242,25 +4266,25 @@ enum DebuffTypes {
};

enum GlobalOverrides {
GLOBAL_OVERRIDES_DISABLE_RENDER_WORLD = 0x00000002,
GLOBAL_OVERRIDES_DISABLE_DRAW_FRAME = 0x00000008,
GLOBAL_OVERRIDES_10 = 0x00000010,
GLOBAL_OVERRIDES_ENABLE_TRANSITION_STENCIL = 0x00000020,
GLOBAL_OVERRIDES_40 = 0x00000040,
GLOBAL_OVERRIDES_ENABLE_FLOOR_REFLECTION = 0x00000080,
GLOBAL_OVERRIDES_DISABLE_BATTLES = 0x00000100,
GLOBAL_OVERRIDES_200 = 0x00000200,
GLOBAL_OVERRIDES_400 = 0x00000400,
GLOBAL_OVERRIDES_800 = 0x00000800,
GLOBAL_OVERRIDES_1000 = 0x00001000,
GLOBAL_OVERRIDES_2000 = 0x00002000,
GLOBAL_OVERRIDES_4000 = 0x00004000,
GLOBAL_OVERRIDES_8000 = 0x00008000,
GLOBAL_OVERRIDES_WINDOWS_IN_FRONT_OF_CURTAINS = 0x00010000,
GLOBAL_OVERRIDES_20000 = 0x00020000,
GLOBAL_OVERRIDES_DISABLE_MENUS = 0x00040000,
GLOBAL_OVERRIDES_MESSAGES_IN_FRONT_OF_CURTAINS = 0x00100000,
GLOBAL_OVERRIDES_CANT_PICK_UP_ITEMS = 0x00200000,
GLOBAL_OVERRIDES_DISABLE_RENDER_WORLD = 0x00000002,
GLOBAL_OVERRIDES_DISABLE_DRAW_FRAME = 0x00000008,
GLOBAL_OVERRIDES_MESSAGES_OVER_FRONTUI = 0x00000010,
GLOBAL_OVERRIDES_SOFT_RESET = 0x00000020, // unused but functional
GLOBAL_OVERRIDES_40 = 0x00000040,
GLOBAL_OVERRIDES_ENABLE_FLOOR_REFLECTION = 0x00000080,
GLOBAL_OVERRIDES_DISABLE_BATTLES = 0x00000100,
GLOBAL_OVERRIDES_200 = 0x00000200,
GLOBAL_OVERRIDES_400 = 0x00000400,
GLOBAL_OVERRIDES_800 = 0x00000800,
GLOBAL_OVERRIDES_PREV_DISABLE_BATTLES = 0x00001000,
GLOBAL_OVERRIDES_PREV_200 = 0x00002000,
GLOBAL_OVERRIDES_PREV_400 = 0x00004000,
GLOBAL_OVERRIDES_PREV_800 = 0x00008000,
GLOBAL_OVERRIDES_WINDOWS_OVER_CURTAINS = 0x00010000,
GLOBAL_OVERRIDES_DONT_RESUME_SONG_AFTER_BATTLE = 0x00020000,
GLOBAL_OVERRIDES_DISABLE_MENUS = 0x00040000,
GLOBAL_OVERRIDES_MESSAGES_OVER_CURTAINS = 0x00100000,
GLOBAL_OVERRIDES_CANT_PICK_UP_ITEMS = 0x00200000,
};

#define MODEL_FLAGS_MASK_FFF0 (\
Expand Down Expand Up @@ -4591,13 +4615,18 @@ typedef enum SurfaceInteractMode {
SURFACE_INTERACT_LAND = 2,
} SurfaceInteractMode;

// flags that can be set on colliders
// passed into collision queries to selectively ignore certain types of objects or colliders
enum ColliderFlags {
COLLIDER_FLAGS_UPPER_MASK = 0x7FFFFE00, // map data dumper needs this to be first
COLLIDER_FLAGS_SURFACE_TYPE_MASK = 0x000000FF,
COLLIDER_FLAG_SAFE_FLOOR = 0x00000100,
COLLIDER_FLAG_IGNORE_SHELL = 0x00008000,
COLLIDER_FLAG_IGNORE_PLAYER = 0x00010000,
COLLIDER_FLAG_80000 = 0x00080000, // test version of DOCK walls?
COLLIDER_FLAG_IGNORE_SHELL = 0x00008000, // colliders marked with this flag are not solid for shells
COLLIDER_FLAG_IGNORE_PLAYER = 0x00010000, // colliders marked with this flag are not solid for player or partners
COLLIDER_FLAG_IGNORE_NPC = 0x00020000, // colliders marked with this flag are not solid for npcs or item entities
COLLISION_IGNORE_ENTITIES = 0x00040000, // used for collision queries, not set for colliders
COLLIDER_FLAG_DOCK_WALL = 0x00080000,
COLLISION_ONLY_ENTITIES = 0x00100000, // used for collision queries, not set for colliders
COLLIDER_FLAG_HAS_MODEL_PARENT = 0x80000000
};

Expand All @@ -4608,15 +4637,6 @@ enum ColliderFlagsModifyMode {
MODIFY_COLLIDER_FLAGS_SET_SURFACE = 3,
};

enum CollisionChannels {
COLLISION_CHANNEL_8000 = 0x00008000,
COLLISION_CHANNEL_10000 = 0x00010000,
COLLISION_CHANNEL_20000 = 0x00020000,
COLLISION_IGNORE_ENTITIES = 0x00040000,
COLLISION_CHANNEL_80000 = 0x00080000,
COLLISION_ONLY_ENTITIES = 0x00100000,
};

enum CameraFlags {
CAMERA_FLAG_INITIALIZED = 0x00000001,
CAMERA_FLAG_DISABLED = 0x00000002,
Expand All @@ -4631,8 +4651,8 @@ enum CameraFlags {

enum CameraMoveFlags {
CAMERA_MOVE_IGNORE_PLAYER_Y = 0x00000001,
CAMERA_MOVE_FLAG_2 = 0x00000002,
CAMERA_MOVE_FLAG_4 = 0x00000004,
CAMERA_MOVE_NO_INTERP_Y = 0x00000002,
CAMERA_MOVE_ACCEL_INTERP_Y = 0x00000004,
};

enum CameraUpdateType {
Expand Down
6 changes: 3 additions & 3 deletions include/functions.h
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ void btl_popup_messages_update(void);
void btl_popup_messages_draw_world_geometry(void);
void func_80255FD8(void);

void set_actor_pal_effect(Actor* actor, s32 arg1);
void set_actor_glow_pal(Actor* actor, s32 arg1);

void btl_set_popup_duration(s32 duration);
void switch_to_partner(s32 arg0);
Expand Down Expand Up @@ -795,8 +795,8 @@ void basic_ai_loiter_init(Evt* script, MobileAISettings* aiSettings, EnemyDetect
void PatrolAI_LoiterInit(Evt* script, MobileAISettings* aiSettings, EnemyDetectVolume* territory);

s32 func_80263230(Actor*, Actor*);
void set_part_pal_effect(ActorPart*, s32);
void func_80266E40(Actor*);
void set_part_glow_pal(ActorPart*, s32);
void clear_actor_static_pal_adjustments(Actor*);
void set_actor_flash_mode(Actor* actor, s32 arg1);
void remove_player_buffs(s32);
s32 is_actor_health_bar_visible(Actor*);
Expand Down
2 changes: 1 addition & 1 deletion src/23680.c
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,7 @@ s32 basic_ai_check_player_dist(EnemyDetectVolume* territory, Enemy* enemy, f32 r
y = npc->pos.y + npc->collisionHeight * 0.5;
z = npc->pos.z;
dist = dist2D(npc->pos.x, npc->pos.z, playerStatus->pos.x, playerStatus->pos.z);
if (npc_test_move_simple_with_slipping(COLLISION_CHANNEL_10000 | COLLISION_IGNORE_ENTITIES,
if (npc_test_move_simple_with_slipping(COLLIDER_FLAG_IGNORE_PLAYER | COLLISION_IGNORE_ENTITIES,
&x, &y, &z,
dist, atan2(npc->pos.x, npc->pos.z, playerStatus->pos.x, playerStatus->pos.z),
0.1f, 0.1f)) {
Expand Down
2 changes: 1 addition & 1 deletion src/39210_len_aa0.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ void npc_follow_init(Npc* npc, s32 targetNpcID, FollowAnims* anims, f32 walkSpee
npc->jumpVel = 0.0f;
npc->flags |= NPC_FLAG_GRAVITY;
npc->flags &= ~NPC_FLAG_IGNORE_PLAYER_COLLISION;
npc->collisionChannel = COLLISION_CHANNEL_10000;
npc->collisionChannel = COLLIDER_FLAG_IGNORE_PLAYER;
}

void npc_update_npc_tracking(Npc* npc) {
Expand Down
11 changes: 6 additions & 5 deletions src/77480.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ s32 player_raycast_down(f32* x, f32* y, f32* z, f32* length) {
}
}

colliderID = test_ray_colliders(0x10000, *x, *y, *z, 0, -1.0f, 0, &hitX, &hitY, &hitZ, &hitDepth, &hitNx, &hitNy, &hitNz);
colliderID = test_ray_colliders(COLLIDER_FLAG_IGNORE_PLAYER, *x, *y, *z, 0, -1.0f, 0, &hitX, &hitY, &hitZ, &hitDepth, &hitNx, &hitNy, &hitNz);
if (colliderID >= 0) {
ret = colliderID;
}
Expand Down Expand Up @@ -338,7 +338,7 @@ s32 player_raycast_up_corner(f32* x, f32* y, f32* z, f32* length) {
sy2 = sy = *y;
sz2 = sz = *z;
hitDepth = *length;
hitID = test_ray_colliders(0x10000, sx, sy, sz, 0.0f, 1.0f, 0.0f, &hitX, &hitY, &hitZ, &hitDepth, &hitNx, &hitNy, &hitNz);
hitID = test_ray_colliders(COLLIDER_FLAG_IGNORE_PLAYER, sx, sy, sz, 0.0f, 1.0f, 0.0f, &hitX, &hitY, &hitZ, &hitDepth, &hitNx, &hitNy, &hitNz);
if (hitID >= 0 && *length > hitDepth) {
*length = hitDepth;
ret = hitID;
Expand Down Expand Up @@ -459,7 +459,7 @@ s32 player_raycast_general(s32 mode, f32 startX, f32 startY, f32 startZ, f32 dir
}

if (mode == 4) {
ignoreFlags = COLLISION_CHANNEL_80000;
ignoreFlags = COLLIDER_FLAG_DOCK_WALL;
} else {
ignoreFlags = COLLIDER_FLAG_IGNORE_PLAYER;
}
Expand Down Expand Up @@ -1096,7 +1096,7 @@ s32 has_valid_conversation_npc(void) {
s32 cond;

if (npc != NULL && !(npc->flags & NPC_FLAG_10000000)) {
cond = (playerStatus->flags & (PS_FLAG_HAS_CONVERSATION_NPC | PS_FLAG_INPUT_DISABLED)) == PS_FLAG_HAS_CONVERSATION_NPC;
cond = !(playerStatus->flags & PS_FLAG_INPUT_DISABLED) && (playerStatus->flags & PS_FLAG_HAS_CONVERSATION_NPC);
ret = cond;
}
return ret;
Expand Down Expand Up @@ -1230,7 +1230,8 @@ void check_for_interactables(void) {
break;
}
} else if (
((playerStatus->flags & (PS_FLAG_HAS_CONVERSATION_NPC | PS_FLAG_INPUT_DISABLED)) == PS_FLAG_HAS_CONVERSATION_NPC)
(!(playerStatus->flags & PS_FLAG_INPUT_DISABLED))
&& (playerStatus->flags & PS_FLAG_HAS_CONVERSATION_NPC)
&& (npc != NULL)
&& (npc->flags & NPC_FLAG_10000000)
) {
Expand Down
6 changes: 3 additions & 3 deletions src/7E9D0.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,9 +163,9 @@ s32 phys_adjust_cam_on_landing(void) {
gCameras[CAM_DEFAULT].moveFlags &= ~CAMERA_MOVE_IGNORE_PLAYER_Y;
}
} else if (partnerStatus->partnerActionState != PARTNER_ACTION_NONE && partnerStatus->actingPartner == PARTNER_PARAKARRY) {
gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAG_2;
gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_NO_INTERP_Y;
} else {
gCameras[CAM_DEFAULT].moveFlags &= ~CAMERA_MOVE_FLAG_2;
gCameras[CAM_DEFAULT].moveFlags &= ~CAMERA_MOVE_NO_INTERP_Y;
}

return ret;
Expand Down Expand Up @@ -233,7 +233,7 @@ void phys_update_action_state(void) {
if (playerStatus->camResetDelay != 0) {
playerStatus->camResetDelay--;
if (playerStatus->camResetDelay == 0) {
gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_FLAG_4;
gCameras[CAM_DEFAULT].moveFlags |= CAMERA_MOVE_ACCEL_INTERP_Y;
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/80850_len_3060.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ void clear_player_data(void) {
playerData->starPoints = 0;
playerData->unk_11 = 0;
playerData->unk_288 = 0;
playerData->merleeSpellType = MERLEE_SPELL_0;
playerData->merleeSpellType = MERLEE_SPELL_NONE;
playerData->merleeCastsLeft = 0;
playerData->merleeTurnCount = -1;
playerData->maxStarPower = 0;
Expand Down Expand Up @@ -108,7 +108,7 @@ void clear_player_data(void) {
playerData->powerBounces = 0;
playerData->battlesCount = 0;
playerData->battlesWon = 0;
playerData->unk_2A6 = 0;
playerData->fleeAttempts = 0;
playerData->battlesFled = 0;
playerData->trainingsDone = 0;
playerData->walkingStepsTaken = 0;
Expand Down
Loading

0 comments on commit 858ed5b

Please sign in to comment.