Merge pull request #16 from luksamuk/angle-override

Add option to override angles on tiles
This commit is contained in:
Lucas Vieira 2025-01-20 01:15:18 -03:00 committed by GitHub
commit 426778ad6e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 297 additions and 45 deletions

View file

@ -103,12 +103,20 @@
</tile>
<tile id="22">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0" width="16" height="16"/>
<object id="1" x="0" y="0" width="16" height="16">
<properties>
<property name="floor_angle" value="0xef3"/>
</properties>
</object>
</objectgroup>
</tile>
<tile id="23">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0" width="16" height="16"/>
<object id="1" x="0" y="0" width="16" height="16">
<properties>
<property name="floor_angle" value="0x10c"/>
</properties>
</object>
</objectgroup>
</tile>
<tile id="24">
@ -155,12 +163,20 @@
</tile>
<tile id="30">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0" width="16" height="16"/>
<object id="1" x="0" y="0" width="16" height="16">
<properties>
<property name="floor_angle" value="0xe2b"/>
</properties>
</object>
</objectgroup>
</tile>
<tile id="31">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0" width="16" height="16"/>
<object id="1" x="0" y="0" width="16" height="16">
<properties>
<property name="floor_angle" value="0x1ea"/>
</properties>
</object>
</objectgroup>
</tile>
<tile id="32">
@ -607,6 +623,9 @@
<tile id="105">
<objectgroup draworder="index" id="2">
<object id="2" x="0" y="16">
<properties>
<property name="floor_angle" value="0x16c"/>
</properties>
<polygon points="0,0 15.9091,-10 16,0"/>
</object>
</objectgroup>
@ -614,13 +633,20 @@
<tile id="106">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="6.125">
<properties>
<property name="floor_angle" value="0x16c"/>
</properties>
<polygon points="0,0 8.8125,-6 16,-6.125 16,9.875 0,9.875"/>
</object>
</objectgroup>
</tile>
<tile id="107">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0" width="16" height="16"/>
<object id="1" x="0" y="0" width="16" height="16">
<properties>
<property name="floor_angle" value="0xe93"/>
</properties>
</object>
</objectgroup>
</tile>
<tile id="108">
@ -640,6 +666,9 @@
<tile id="110">
<objectgroup draworder="index" id="2">
<object id="1" x="7.8125" y="15.9375">
<properties>
<property name="floor_angle" value="0x16c"/>
</properties>
<polygon points="0,0 8.125,-4.8125 8.1875,0.0625"/>
</object>
</objectgroup>
@ -647,18 +676,28 @@
<tile id="111">
<objectgroup draworder="index" id="2">
<object id="2" x="0.0909091" y="11.1818">
<properties>
<property name="floor_angle" value="0x16c"/>
</properties>
<polygon points="0,0 15.9091,-11.1818 15.9091,4.81818 -0.0909091,4.81818"/>
</object>
</objectgroup>
</tile>
<tile id="112">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0" width="16" height="16"/>
<object id="1" x="0" y="0" width="16" height="16">
<properties>
<property name="floor_angle" value="0x16c"/>
</properties>
</object>
</objectgroup>
</tile>
<tile id="113">
<objectgroup draworder="index" id="2">
<object id="1" x="0.0625" y="0.0625">
<properties>
<property name="floor_angle" value="0xe93"/>
</properties>
<polygon points="0,0 8.6875,0 15.875,4.4375 15.9375,15.9375 -0.0625,15.9375"/>
</object>
</objectgroup>
@ -694,6 +733,9 @@
<tile id="118">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="4.75">
<properties>
<property name="floor_angle" value="0x16c"/>
</properties>
<polygon points="0,0 8.4375,-4.625 16,-4.75 16,11.25 0,11.25"/>
</object>
</objectgroup>

View file

@ -952,6 +952,10 @@
<tile id="340">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0xa00"/>
<property name="lwall_angle" value="0xa00"/>
</properties>
<polygon points="0,0 16,0 16,13.0435 11.1304,16 0,16"/>
</object>
</objectgroup>
@ -959,6 +963,10 @@
<tile id="341">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0x955"/>
<property name="lwall_angle" value="0x955"/>
</properties>
<polygon points="0,0 16,0 16,6.04348 0.0869565,12.9565"/>
</object>
</objectgroup>
@ -966,6 +974,10 @@
<tile id="342">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0x888"/>
<property name="lwall_angle" value="0x888"/>
</properties>
<polygon points="0,0 16,0 16,2.08696 0.0434783,6"/>
</object>
</objectgroup>
@ -973,6 +985,10 @@
<tile id="343">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0x822"/>
<property name="lwall_angle" value="0x822"/>
</properties>
<polygon points="0,0 16,0 0.0434783,2"/>
</object>
</objectgroup>
@ -985,6 +1001,10 @@
<tile id="345">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0xa00"/>
<property name="lwall_angle" value="0xa00"/>
</properties>
<polygon points="0,0 16,0 16.0435,9.04348 9.04348,16.0435 0,16"/>
</object>
</objectgroup>
@ -992,6 +1012,10 @@
<tile id="346">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0xa00"/>
<property name="lwall_angle" value="0xa00"/>
</properties>
<polygon points="0,0 11,0.0434783 0,9.17391"/>
</object>
</objectgroup>
@ -999,6 +1023,10 @@
<tile id="347">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0xa00"/>
<property name="lwall_angle" value="0xa00"/>
</properties>
<polygon points="0,0 16,0 16.0435,10.913 13.087,15.9565 0,16"/>
</object>
</objectgroup>
@ -1006,6 +1034,10 @@
<tile id="348">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0xa00"/>
<property name="lwall_angle" value="0xa00"/>
</properties>
<polygon points="0,0 8.86957,0 0.0434783,11.0435"/>
</object>
</objectgroup>
@ -1013,6 +1045,10 @@
<tile id="349">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0xaaa"/>
<property name="lwall_angle" value="0xaaa"/>
</properties>
<polygon points="0,0 13,0.0434783 6.08696,16 0,16"/>
</object>
</objectgroup>
@ -1020,6 +1056,10 @@
<tile id="350">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0xb77"/>
<property name="lwall_angle" value="0xb77"/>
</properties>
<polygon points="0,0 5.95652,0.0434783 2.13043,15.913 0,16"/>
</object>
</objectgroup>
@ -1027,6 +1067,10 @@
<tile id="351">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0xbdd"/>
<property name="lwall_angle" value="0xbdd"/>
</properties>
<polygon points="0,0 2,0.0869565 0,16"/>
</object>
</objectgroup>
@ -1034,6 +1078,10 @@
<tile id="352">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0x7dd"/>
<property name="rwall_angle" value="0x7dd"/>
</properties>
<polygon points="0,0 16,0 16.0435,2"/>
</object>
</objectgroup>
@ -1041,6 +1089,10 @@
<tile id="353">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0x777"/>
<property name="rwall_angle" value="0x777"/>
</properties>
<polygon points="0,0 16,0 16.087,5.95652 0.0434783,2.04348"/>
</object>
</objectgroup>
@ -1048,6 +1100,10 @@
<tile id="354">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0x6aa"/>
<property name="rwall_angle" value="0x6aa"/>
</properties>
<polygon points="0,0 16,0 16.0435,12.913 0,6.08696"/>
</object>
</objectgroup>
@ -1055,6 +1111,10 @@
<tile id="355">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0x600"/>
<property name="rwall_angle" value="0x600"/>
</properties>
<polygon points="0,0 16,0 16,16 3.04348,15.913 0,13.087"/>
</object>
</objectgroup>
@ -1072,6 +1132,10 @@
<tile id="358">
<objectgroup draworder="index" id="2">
<object id="1" x="3.17391" y="0.0434783">
<properties>
<property name="ceil_angle" value="0x600"/>
<property name="rwall_angle" value="0x600"/>
</properties>
<polygon points="0,0 12.8261,-0.0434783 12.8261,8.86957"/>
</object>
</objectgroup>
@ -1079,6 +1143,10 @@
<tile id="359">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0x600"/>
<property name="rwall_angle" value="0x600"/>
</properties>
<polygon points="0,0 16,0 16,16 6.04348,16.0435 0,9"/>
</object>
</objectgroup>
@ -1086,6 +1154,10 @@
<tile id="361">
<objectgroup draworder="index" id="2">
<object id="1" x="6.30435" y="0.0869565">
<properties>
<property name="ceil_angle" value="0x600"/>
<property name="rwall_angle" value="0x600"/>
</properties>
<polygon points="0,0 9.69565,-0.0869565 9.73913,10.8696"/>
</object>
</objectgroup>
@ -1093,6 +1165,10 @@
<tile id="362">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="ceil_angle" value="0x600"/>
<property name="rwall_angle" value="0x600"/>
</properties>
<polygon points="0,0 16,0 16,16 2.04348,16 0.0434783,11.0435"/>
</object>
</objectgroup>
@ -1100,6 +1176,10 @@
<tile id="363">
<objectgroup draworder="index" id="2">
<object id="1" x="2.08696" y="0.0869565">
<properties>
<property name="ceil_angle" value="0x555"/>
<property name="rwall_angle" value="0x555"/>
</properties>
<polygon points="0,0 13.913,-0.0869565 13.913,15.913 6.91304,15.8261"/>
</object>
</objectgroup>
@ -1107,6 +1187,10 @@
<tile id="364">
<objectgroup draworder="index" id="2">
<object id="1" x="8.86957" y="0">
<properties>
<property name="ceil_angle" value="0x488"/>
<property name="rwall_angle" value="0x488"/>
</properties>
<polygon points="0,0 7.13043,0 7.13043,16 4.13043,15.9565"/>
</object>
</objectgroup>
@ -1114,6 +1198,10 @@
<tile id="365">
<objectgroup draworder="index" id="2">
<object id="1" x="12.7826" y="0.0434783">
<properties>
<property name="ceil_angle" value="0x422"/>
<property name="rwall_angle" value="0x422"/>
</properties>
<polygon points="0,0 3.21739,-0.0434783 3.21739,15.9565"/>
</object>
</objectgroup>
@ -1121,6 +1209,10 @@
<tile id="429">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="floor_angle" value="0xc22"/>
<property name="lwall_angle" value="0xc22"/>
</properties>
<polygon points="0,0 1.95652,15.8261 0,16"/>
</object>
</objectgroup>
@ -1128,6 +1220,10 @@
<tile id="430">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="floor_angle" value="0xc88"/>
<property name="lwall_angle" value="0xc88"/>
</properties>
<polygon points="0,0 2.30435,0.0434783 5.91304,15.7826 0,16"/>
</object>
</objectgroup>
@ -1135,6 +1231,10 @@
<tile id="431">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="floor_angle" value="0xd55"/>
<property name="lwall_angle" value="0xd55"/>
</properties>
<polygon points="0,0 6.04348,0.0434783 12.9565,15.913 0,16"/>
</object>
</objectgroup>
@ -1142,6 +1242,10 @@
<tile id="432">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="floor_angle" value="0xe00"/>
<property name="lwall_angle" value="0xe00"/>
</properties>
<polygon points="0,0 12.913,0 16,5.08696 16,16 0,16"/>
</object>
</objectgroup>
@ -1149,6 +1253,10 @@
<tile id="433">
<objectgroup draworder="index" id="2">
<object id="1" x="0.0869565" y="4.95652">
<properties>
<property name="floor_angle" value="0xe00"/>
<property name="lwall_angle" value="0xe00"/>
</properties>
<polygon points="0,0 8.86957,11.0435 -0.0869565,11.0435"/>
</object>
</objectgroup>
@ -1161,6 +1269,10 @@
<tile id="435">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="floor_angle" value="0xe00"/>
<property name="lwall_angle" value="0xe00"/>
</properties>
<polygon points="0,0 8.91304,0.0869565 15.9565,6.91304 16,16 0,16"/>
</object>
</objectgroup>
@ -1168,6 +1280,10 @@
<tile id="436">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="7">
<properties>
<property name="floor_angle" value="0xe00"/>
<property name="lwall_angle" value="0xe00"/>
</properties>
<polygon points="0,0 11,8.95652 0,9"/>
</object>
</objectgroup>
@ -1175,6 +1291,10 @@
<tile id="437">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="0">
<properties>
<property name="floor_angle" value="0xe00"/>
<property name="lwall_angle" value="0xe00"/>
</properties>
<polygon points="0,0 10.9565,0 15.9565,2.95652 16,16 0,16"/>
</object>
</objectgroup>
@ -1182,6 +1302,10 @@
<tile id="438">
<objectgroup draworder="index" id="2">
<object id="1" x="0" y="2.91304">
<properties>
<property name="floor_angle" value="0xeaa"/>
<property name="lwall_angle" value="0xeaa"/>
</properties>
<polygon points="0,0 15.913,7 16,13.087 0,13.087"/>
</object>
</objectgroup>
@ -1189,6 +1313,10 @@
<tile id="439">
<objectgroup draworder="index" id="2">
<object id="1" x="0.130435" y="9.91304">
<properties>
<property name="floor_angle" value="0xf77"/>
<property name="lwall_angle" value="0xf77"/>
</properties>
<polygon points="0,0 15.8696,3.04348 15.8696,6.08696 -0.130435,6.08696"/>
</object>
</objectgroup>
@ -1196,6 +1324,10 @@
<tile id="440">
<objectgroup draworder="index" id="2">
<object id="1" x="0.0434783" y="13.3478">
<properties>
<property name="floor_angle" value="0xfdd"/>
<property name="lwall_angle" value="0xfdd"/>
</properties>
<polygon points="0,0 15.9565,2.65217 -0.0434783,2.65217"/>
</object>
</objectgroup>
@ -1203,6 +1335,10 @@
<tile id="441">
<objectgroup draworder="index" id="2">
<object id="1" x="16" y="0">
<properties>
<property name="floor_angle" value="0x3dd"/>
<property name="rwall_angle" value="0x3dd"/>
</properties>
<polygon points="0,0 0,16 -2.08696,16.0435"/>
</object>
</objectgroup>
@ -1210,6 +1346,10 @@
<tile id="442">
<objectgroup draworder="index" id="2">
<object id="1" x="16" y="0">
<properties>
<property name="floor_angle" value="0x377"/>
<property name="rwall_angle" value="0x377"/>
</properties>
<polygon points="0,0 0,16 -6,16.0435 -2,0.0434783"/>
</object>
</objectgroup>
@ -1217,6 +1357,10 @@
<tile id="443">
<objectgroup draworder="index" id="2">
<object id="1" x="16" y="0">
<properties>
<property name="floor_angle" value="0x2aa"/>
<property name="rwall_angle" value="0x2aa"/>
</properties>
<polygon points="0,0 0,16 -13.0435,15.913 -6,0"/>
</object>
</objectgroup>
@ -1224,6 +1368,10 @@
<tile id="444">
<objectgroup draworder="index" id="2">
<object id="2" x="15.9565" y="4.95652">
<properties>
<property name="floor_angle" value="0x200"/>
<property name="rwall_angle" value="0x200"/>
</properties>
<polygon points="0,0 0.0434783,11.0435 -8.95652,10.9565"/>
</object>
</objectgroup>
@ -1231,6 +1379,10 @@
<tile id="445">
<objectgroup draworder="index" id="2">
<object id="2" x="3.04348" y="-0.0434783">
<properties>
<property name="floor_angle" value="0x200"/>
<property name="rwall_angle" value="0x200"/>
</properties>
<polygon points="0,0 12.9565,0.0434783 12.9565,16.0435 -3.04348,16.0435 -3,4.26087"/>
</object>
</objectgroup>
@ -1238,6 +1390,10 @@
<tile id="446">
<objectgroup draworder="index" id="2">
<object id="1" x="16.0435" y="7.04348">
<properties>
<property name="floor_angle" value="0x200"/>
<property name="rwall_angle" value="0x200"/>
</properties>
<polygon points="0,0 -0.0434783,8.95652 -11.0435,8.91304"/>
</object>
</objectgroup>
@ -1245,6 +1401,10 @@
<tile id="447">
<objectgroup draworder="index" id="3">
<object id="2" x="6.6087" y="0">
<properties>
<property name="floor_angle" value="0x200"/>
<property name="rwall_angle" value="0x200"/>
</properties>
<polygon points="0,0 9.3913,0 9.3913,16 -6.6087,16 -6.56522,6.95652"/>
</object>
</objectgroup>
@ -1257,6 +1417,10 @@
<tile id="449">
<objectgroup draworder="index" id="2">
<object id="1" x="16.0435" y="13.8696">
<properties>
<property name="floor_angle" value="0x022"/>
<property name="rwall_angle" value="0x022"/>
</properties>
<polygon points="0,0 -0.0434783,2.13043 -16.0435,2.13043"/>
</object>
</objectgroup>
@ -1264,6 +1428,10 @@
<tile id="450">
<objectgroup draworder="index" id="2">
<object id="1" x="16" y="9.91304">
<properties>
<property name="floor_angle" value="0x088"/>
<property name="rwall_angle" value="0x088"/>
</properties>
<polygon points="0,0 0,6.08696 -16,6.08696 -16,3.95652"/>
</object>
</objectgroup>
@ -1271,6 +1439,10 @@
<tile id="451">
<objectgroup draworder="index" id="3">
<object id="2" x="16" y="2.95652">
<properties>
<property name="floor_angle" value="0x155"/>
<property name="rwall_angle" value="0x155"/>
</properties>
<polygon points="0,0 0,13.0435 -16,13.0435 -15.9565,6.95652"/>
</object>
</objectgroup>
@ -1278,6 +1450,10 @@
<tile id="452">
<objectgroup draworder="index" id="2">
<object id="1" x="4.69565" y="0">
<properties>
<property name="floor_angle" value="0x200"/>
<property name="rwall_angle" value="0x200"/>
</properties>
<polygon points="0,0 11.3043,0 11.3043,16 -4.69565,16 -4.65217,2.82609"/>
</object>
</objectgroup>

View file

@ -68,6 +68,35 @@ extern Camera camera;
extern uint8_t level_ring_count;
extern int32_t level_water_y;
/* GROUND SENSOR COLLISION ANGLES */
// As a rule of thumb, only floor and ceiling min/max
// angles are well-defined.
// Floor: floor left <= x OR x <= floor right
// R.wall: floor right < x < ceiling min
// Ceiling: ceiling min <= x <= ceiling max
// L.wall: ceiling max < x < floor left
#define GSMODE_ANGLE_FLOOR_RIGHT 0x01d5 // ~41° (original: 45°)
#define GSMODE_ANGLE_CEIL_MIN 0x0600 // 135°
#define GSMODE_ANGLE_CEIL_MAX 0x0a00 // 225°
#define GSMODE_ANGLE_FLOOR_LEFT 0x0e94 // ~318° (original: 315°)
/* PUSH SENSOR COLLISION ANGLES */
// As opposed to ground sensors, here the L.Wall and R.Wall modes are
// well-defined.
#define PSMODE_ANGLE_RWALL_MIN 0x014e // ~41°
#define PSMODE_ANGLE_RWALL_MAX 0x0579 // 135°
#define PSMODE_ANGLE_LWALL_MIN 0x0a87 // 225°
#define PSMODE_ANGLE_LWALL_MAX 0x0db9 // ~318°
/* LANDING SPEED TRANSFER ANGLES */
// Depending on these angle ranges, X and Y air speed transfer to
// ground speed in different ways
#define LANDING_ANGLE_FLAT_LEFT 0x0f11 // 339
#define LANDING_ANGLE_FLAT_RIGHT 0x0105 // 23
#define LANDING_ANGLE_SLOPE_LEFT 0x0e0b // 316
#define LANDING_ANGLE_SLOPE_RIGHT 0x0200 // 45
void
load_player(Player *player,
const char *chara_filename,
@ -505,35 +534,29 @@ _player_update_collision_tb(Player *player)
player->angle = player->ev_grnd1.angle;
else if(!player->ev_grnd1.collided && player->ev_grnd2.collided)
player->angle = player->ev_grnd2.angle;
/* // In case both are available, get the angle on the left. */
/* // This introduces certain collision bugs but let's leave it */
/* // like this for now */
/* else player->angle = player->ev_grnd1.angle; */
// In case both are available, get the lowest angle always
else {
// In case both are available, get them based on gsp,
// but if gsp is zero, favor left sensor
player->angle =
(player->ev_grnd1.angle < player->ev_grnd2.angle)
(player->vel.vz <= 0)
? player->ev_grnd1.angle
: player->ev_grnd2.angle;
}
// TODO: FIX THIS!!!!!
int32_t deg = (abs(player->angle) * (360 << 12) >> 24);
// Set ground speed according to X and Y velocity,
// and plaform angle
if((deg <= 23) || (deg >= 339))
if((player->angle >= LANDING_ANGLE_FLAT_LEFT)
|| (player->angle <= LANDING_ANGLE_FLAT_RIGHT)) {
// Landed on very flat ground, conserve X
player->vel.vz = player->vel.vx;
else if((deg <= 45) || (deg >= 316))
} else if((player->angle <= LANDING_ANGLE_SLOPE_RIGHT)
|| (player->angle >= LANDING_ANGLE_SLOPE_LEFT)) {
// Slope ground, set to half vy
player->vel.vz =
((player->vel.vy * 2048) >> 12) * -SIGNUM(rsin(player->angle));
else
} else {
// Steep ground, set to full vy
player->vel.vz =
player->vel.vy * -SIGNUM(rsin(player->angle));
}
int32_t new_coord = 0;
if(player->ev_grnd1.collided) new_coord = player->ev_grnd1.coord;
@ -680,18 +703,6 @@ _player_resolve_collision_modes(Player *player)
int32_t p_angle = player->angle;
/* GROUND SENSORS COLLISION MODES */
// As a rule of thumb, only floor and ceiling min/max
// angles are well-defined. See:
// Floor: floor left <= x OR x <= floor right
// R.wall: floor right < x < ceiling min
// Ceiling: ceiling min <= x <= ceiling max
// L.wall: ceiling max < x < floor left
#define GSMODE_ANGLE_FLOOR_RIGHT 0x01d5 // ~41° (original: 45°)
#define GSMODE_ANGLE_CEIL_MIN 0x0600 // 135°
#define GSMODE_ANGLE_CEIL_MAX 0x0a00 // 225°
#define GSMODE_ANGLE_FLOOR_LEFT 0x0e94 // ~318° (original: 315°)
// Original collision mode ranges
if((p_angle >= GSMODE_ANGLE_FLOOR_LEFT) || (p_angle <= GSMODE_ANGLE_FLOOR_RIGHT))
// floor
player->gsmode = CDIR_FLOOR;
@ -710,13 +721,6 @@ _player_resolve_collision_modes(Player *player)
: CDIR_RWALL;
/* PUSH SENSORS COLLISION MODES */
// As opposed to ground sensors, here the L.Wall and R.Wall modes are
// well-defined.
#define PSMODE_ANGLE_RWALL_MIN 0x014e // ~41°
#define PSMODE_ANGLE_RWALL_MAX 0x0579 // 135°
#define PSMODE_ANGLE_LWALL_MIN 0x0a87 // 225°
#define PSMODE_ANGLE_LWALL_MAX 0x0db9 // ~318°
if((p_angle > PSMODE_ANGLE_LWALL_MAX) || (p_angle < PSMODE_ANGLE_RWALL_MIN))
player->psmode = CDIR_FLOOR;
else if((PSMODE_ANGLE_RWALL_MIN <= p_angle) && (p_angle <= PSMODE_ANGLE_RWALL_MAX))
@ -734,6 +738,7 @@ _player_resolve_collision_modes(Player *player)
void
player_update(Player *player)
{
// Angle slope pattern in degrees: 3, 12, 30, 45, 60, 78, 87
//_player_resolve_collision_modes(player);
_player_update_collision_lr(player); // Push sensor collision detection

View file

@ -66,7 +66,7 @@ def to_psx_angle(a):
return math.floor(rat * 4096)
def get_height_mask(d: Direction, points):
def get_height_mask(d: Direction, points, predef_angle):
# Perform iterative linecast.
# Linecast checks for a point within a geometry starting at a height
# of 15 until 1 (inclusive). 0 means no collision at that height.
@ -101,6 +101,11 @@ def get_height_mask(d: Direction, points):
if not found:
heightmask.append(0)
# When using a predefined angle, we don't need to perform any heavy
# angle calculations!
if predef_angle is not None:
return (heightmask, predef_angle)
# Build vector according to direction
# and heightmask.
# We have a somewhat naive approach here to determine angle: when we have
@ -146,11 +151,20 @@ def parse_masks(tiles):
res = []
for tile in tiles:
points = tile.get("points")
predef = tile.get("predef", {})
id = tile.get("id")
(floor, floor_angle) = get_height_mask(Direction.DOWN, points)
(ceil, ceil_angle) = get_height_mask(Direction.UP, points)
(rwall, rwall_angle) = get_height_mask(Direction.RIGHT, points)
(lwall, lwall_angle) = get_height_mask(Direction.LEFT, points)
(floor, floor_angle) = get_height_mask(
Direction.DOWN, points, predef.get("floor_angle")
)
(ceil, ceil_angle) = get_height_mask(
Direction.UP, points, predef.get("ceil_angle")
)
(rwall, rwall_angle) = get_height_mask(
Direction.RIGHT, points, predef.get("rwall_angle")
)
(lwall, lwall_angle) = get_height_mask(
Direction.LEFT, points, predef.get("lwall_angle")
)
res.append(
{
@ -171,6 +185,10 @@ def load_json(filename):
return json.load(fp)
def hex_to_int(s):
return int(s, 16)
def parse_json(j):
tiles = j.get("tiles")
res = []
@ -180,6 +198,15 @@ def parse_json(j):
objs = grp.get("objects")
if objs:
o = objs[0]
props = o.get("properties", [])
# Objects might have angle information encoded in them.
# In that case, take these premade angles.
# Name: angle_X value: ??
predef = {}
for prop in props:
has = True
predef[prop.get("name")] = hex_to_int(prop.get("value"))
id = tile.get("id")
x = round(o.get("x"), 0)
y = round(o.get("y"), 0)
@ -199,6 +226,7 @@ def parse_json(j):
{
"id": id,
"points": points,
"predef": predef,
}
)
else:
@ -219,6 +247,7 @@ def parse_json(j):
{
"id": id,
"points": points,
"predef": predef,
}
)
# print(f"Number of collidable tiles: {len(res)}")