Path: blob/master/RSDKv5/RSDK/Scene/Collision.hpp
1167 views
#ifndef COLLISION_H1#define COLLISION_H23namespace RSDK4{56enum TileCollisionModes {7TILECOLLISION_NONE, // no tile collisions8TILECOLLISION_DOWN, // downwards tile collisions9#if RETRO_REV0U10TILECOLLISION_UP, // upwards tile collisions11#endif12};1314enum CSides {15C_NONE,16C_TOP,17C_LEFT,18C_RIGHT,19C_BOTTOM,20};2122struct CollisionSensor {23Vector2 position;24bool32 collided;25uint8 angle;26};2728#if !RETRO_USE_ORIGINAL_CODE29#define DEBUG_HITBOX_COUNT (0x400)3031struct DebugHitboxInfo {32uint8 type;33uint8 collision;34void *entity;35Hitbox hitbox;36Vector2 pos;37};3839enum DebugHitboxTypes { H_TYPE_TOUCH, H_TYPE_CIRCLE, H_TYPE_BOX, H_TYPE_PLAT, H_TYPE_HAMMER };4041extern bool32 showHitboxes;42extern int32 debugHitboxCount;43extern DebugHitboxInfo debugHitboxList[DEBUG_HITBOX_COUNT];4445int32 AddDebugHitbox(uint8 type, uint8 dir, Entity *entity, Hitbox *hitbox);46#endif4748extern int32 collisionTolerance;49#if RETRO_REV0U50extern bool32 useCollisionOffset;51#else52extern int32 collisionOffset;53#endif54extern int32 collisionMaskAir;5556extern Hitbox collisionOuter;57extern Hitbox collisionInner;5859extern Entity *collisionEntity;6061extern CollisionSensor sensors[6];6263#if RETRO_REV0U64extern int32 collisionMinimumDistance;6566extern uint8 lowCollisionTolerance;67extern uint8 highCollisionTolerance;6869extern uint8 floorAngleTolerance;70extern uint8 wallAngleTolerance;71extern uint8 roofAngleTolerance;7273inline void SetupCollisionConfig(int32 minDistance, uint8 lowTolerance, uint8 highTolerance, uint8 floorAngleTolerance, uint8 wallAngleTolerance,74uint8 roofAngleTolerance)75{76collisionMinimumDistance = TO_FIXED(minDistance);77lowCollisionTolerance = lowTolerance;78highCollisionTolerance = highTolerance;79RSDK::floorAngleTolerance = floorAngleTolerance;80RSDK::wallAngleTolerance = wallAngleTolerance;81RSDK::roofAngleTolerance = roofAngleTolerance;82}83#endif8485#if RETRO_REV0U || RETRO_USE_MOD_LOADER86void CopyCollisionMask(uint16 dst, uint16 src, uint8 cPlane, uint8 cMode);8788inline void GetCollisionInfo(CollisionMask **masks, TileInfo **tiles)89{90if (masks)91*masks = (RSDK::CollisionMask *)collisionMasks;9293if (tiles)94*tiles = (RSDK::TileInfo *)tileInfo;95}96#endif9798bool32 CheckObjectCollisionTouch(Entity *thisEntity, Hitbox *thisHitbox, Entity *otherEntity, Hitbox *otherHitbox);99inline bool32 CheckObjectCollisionCircle(Entity *thisEntity, int32 thisRadius, Entity *otherEntity, int32 otherRadius)100{101int32 x = FROM_FIXED(thisEntity->position.x - otherEntity->position.x);102int32 y = FROM_FIXED(thisEntity->position.y - otherEntity->position.y);103int32 r = FROM_FIXED(thisRadius + otherRadius);104105#if !RETRO_USE_ORIGINAL_CODE106if (showHitboxes) {107bool32 collided = x * x + y * y < r * r;108Hitbox thisHitbox;109Hitbox otherHitbox;110thisHitbox.left = thisRadius >> 16;111otherHitbox.left = otherRadius >> 16;112113int32 thisHitboxID = AddDebugHitbox(H_TYPE_CIRCLE, FLIP_NONE, thisEntity, &thisHitbox);114int32 otherHitboxID = AddDebugHitbox(H_TYPE_CIRCLE, FLIP_NONE, otherEntity, &otherHitbox);115116if (thisHitboxID >= 0 && collided)117debugHitboxList[thisHitboxID].collision |= 1 << (collided - 1);118if (otherHitboxID >= 0 && collided)119debugHitboxList[otherHitboxID].collision |= 1 << (collided - 1);120}121#endif122123return x * x + y * y < r * r;124}125uint8 CheckObjectCollisionBox(Entity *thisEntity, Hitbox *thisHitbox, Entity *otherEntity, Hitbox *otherHitbox, bool32 setValues);126bool32 CheckObjectCollisionPlatform(Entity *thisEntity, Hitbox *thisHitbox, Entity *otherEntity, Hitbox *otherHitbox, bool32 setValues);127128bool32 ObjectTileCollision(Entity *entity, uint16 cLayers, uint8 cMode, uint8 cPlane, int32 xOffset, int32 yOffset, bool32 setPos);129bool32 ObjectTileGrip(Entity *entity, uint16 cLayers, uint8 cMode, uint8 cPlane, int32 xOffset, int32 yOffset, int32 tolerance);130131void ProcessObjectMovement(Entity *entity, Hitbox *outerBox, Hitbox *innerBox);132133void ProcessPathGrip();134void ProcessAirCollision_Down();135#if RETRO_REV0U136void ProcessAirCollision_Up();137#endif138139void SetPathGripSensors(CollisionSensor *cSensors);140141void FindFloorPosition(CollisionSensor *sensor);142void FindLWallPosition(CollisionSensor *sensor);143void FindRoofPosition(CollisionSensor *sensor);144void FindRWallPosition(CollisionSensor *sensor);145146void FloorCollision(CollisionSensor *sensor);147void LWallCollision(CollisionSensor *sensor);148void RoofCollision(CollisionSensor *sensor);149void RWallCollision(CollisionSensor *sensor);150151#if RETRO_REV0U152#include "Legacy/CollisionLegacy.hpp"153#endif154155} // namespace RSDK156157#endif // !COLLISION_H158159160