Nessuna descrizione

sideway_stair.c 3.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include <pokeagb/pokeagb.h>
  2. #include <agb_debug.h>
  3. #define BLOCK_STATE_SIDEWAY_NW 0x80
  4. #define BLOCK_STATE_SIDEWAY_NE 0x81
  5. #define BLOCK_STATE_SIDEWAY_SW 0x82
  6. #define BLOCK_STATE_SIDEWAY_SE 0x83
  7. #define BEHAVIOR_STAIR_WEST 0xE0
  8. #define BEHAVIOR_STAIR_EAST 0xE1
  9. const u8 diagonal_animations[4] = {170,171,172,173};
  10. bool npc_sideway_try_walking(u8 block_state)
  11. {
  12. if(block_state >= BLOCK_STATE_SIDEWAY_NW) {
  13. npc_player_set_movement_and_x22(diagonal_animations[block_state - BLOCK_STATE_SIDEWAY_NW], 2);
  14. // Kinda have to do the thing when the player runs (ish)
  15. return true;
  16. }
  17. return false;
  18. }
  19. u8 npc_get_walkable_status(struct NpcState *npc, u16 x, u16 y, enum Direction direction, u8 roleTo) {
  20. dprintf("get_walkable: %d, %d, %d, %d\n", x,y, direction, roleTo);
  21. u8 block = npc_block_way(npc, x,y,direction);
  22. //check for diagonal stair stuff here
  23. struct NpcState dummyNpc;
  24. memcpy(&dummyNpc, npc, sizeof(struct NpcState));
  25. u16 roleFrom = cur_mapdata_block_role_at(npc->from.x, npc->from.y);
  26. if (direction == WEST) {
  27. dprintf("WEST with from: %d\n", roleFrom);
  28. if(roleFrom == BEHAVIOR_STAIR_WEST) {
  29. //walk up the stair to the west
  30. dummyNpc.from.y--;
  31. dummyNpc.to.y--;
  32. u8 altBlocked = npc_block_way(&dummyNpc, x,y-1, direction);
  33. dprintf("trying NW: %d\n", altBlocked);
  34. u8 roleStairTo = cur_mapdata_block_role_at(x, y-1);
  35. if(roleStairTo == BEHAVIOR_STAIR_WEST)
  36. return (altBlocked == 0) ? BLOCK_STATE_SIDEWAY_NW : altBlocked;
  37. }
  38. else if(roleFrom == BEHAVIOR_STAIR_EAST){
  39. //walk down the stair to the west
  40. dummyNpc.from.y++;
  41. dummyNpc.to.y++;
  42. u8 altBlocked = npc_block_way(&dummyNpc, x,y+1, direction);
  43. dprintf("trying SW: %d\n", altBlocked);
  44. u8 roleStairTo = cur_mapdata_block_role_at(x, y+1);
  45. if(roleStairTo == BEHAVIOR_STAIR_EAST)
  46. return (altBlocked == 0) ? BLOCK_STATE_SIDEWAY_SW : altBlocked;
  47. }
  48. } else if(direction == EAST) {
  49. if(roleFrom == BEHAVIOR_STAIR_EAST) {
  50. //walk up the stair to the east
  51. dummyNpc.from.y--;
  52. dummyNpc.to.y--;
  53. u8 altBlocked = npc_block_way(&dummyNpc, x,y-1, direction);
  54. dprintf("trying NE: %d\n", altBlocked);
  55. u8 roleStairTo = cur_mapdata_block_role_at(x, y-1);
  56. dprintf("x: %d, y: %d, roleStairTo: %d\n",x, dummyNpc.to.y, roleStairTo);
  57. if(roleStairTo == BEHAVIOR_STAIR_EAST)
  58. return (altBlocked == 0) ? BLOCK_STATE_SIDEWAY_NE : altBlocked;
  59. } else if (roleFrom == BEHAVIOR_STAIR_WEST) {
  60. //walk down the stair to the east
  61. dummyNpc.from.y++;
  62. dummyNpc.to.y++;
  63. u8 altBlocked = npc_block_way(&dummyNpc, x,y+1, direction);
  64. dprintf("trying SW: %d\n", altBlocked);
  65. u8 roleStairTo = cur_mapdata_block_role_at(x, y+1);
  66. if(roleStairTo == BEHAVIOR_STAIR_WEST)
  67. return (altBlocked == 0) ? BLOCK_STATE_SIDEWAY_SE : altBlocked;
  68. }
  69. }
  70. //continue with game code
  71. if(block == 3 && npc_is_passable_maybe(x,y,direction))
  72. return 5;
  73. if(npc_handle_jump(x,y,direction)) {
  74. sav1_secure_increment(0x2B);
  75. return 6;
  76. }
  77. else if(block == 4 && npc_handle_strength(x,y,direction)) {
  78. return 7;
  79. }
  80. return block;
  81. }