A 2D tile-based sandbox game.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.cc 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include <swan/swan.h>
  2. #include "DefaultWorldGen.h"
  3. #include "entities/PlayerEntity.h"
  4. #include "entities/ItemStackEntity.h"
  5. #include "world/tree.h"
  6. #include <functional>
  7. class CoreMod: public Swan::Mod {
  8. public:
  9. CoreMod(Swan::World &world): Swan::Mod("core") {
  10. breakListener_ = world.evtTileBreak_.subscribe(
  11. [=](auto ...args) { return onTileBreak(args...); });
  12. registerSprite("entity/player-running");
  13. registerSprite("entity/player-still");
  14. registerSprite("misc/background-cave");
  15. registerTile({
  16. .name = "stone",
  17. .image = "core::tile/stone",
  18. .droppedItem = "core::stone",
  19. });
  20. registerTile({
  21. .name = "dirt",
  22. .image = "core::tile/dirt",
  23. .droppedItem = "core::dirt",
  24. });
  25. registerTile({
  26. .name = "grass",
  27. .image = "core::tile/grass",
  28. .droppedItem = "core::dirt",
  29. });
  30. registerTile({
  31. .name = "tree-trunk",
  32. .image = "core::tile/tree-trunk",
  33. .isSolid = false,
  34. .droppedItem = "core::tree-trunk",
  35. });
  36. registerTile({
  37. .name = "tree-leaves",
  38. .image = "core::tile/leaves",
  39. .isSolid = false,
  40. });
  41. registerTile({
  42. .name = "tree-seeder",
  43. .image = "core::tile/leaves",
  44. .onSpawn = spawnTree,
  45. });
  46. registerTile({
  47. .name = "torch",
  48. .image = "core::tile/torch",
  49. .isSolid = false,
  50. .lightLevel = 80/255.0,
  51. });
  52. registerItem({
  53. .name = "stone",
  54. .image = "core::tile/stone",
  55. });
  56. registerItem({
  57. .name = "dirt",
  58. .image = "core::tile/dirt",
  59. });
  60. registerItem({
  61. .name = "grass",
  62. .image = "core::tile/grass",
  63. });
  64. registerItem({
  65. .name = "tree-trunk",
  66. .image = "core::tile/tree-trunk",
  67. });
  68. registerWorldGen<DefaultWorldGen>("default");
  69. registerEntity<PlayerEntity>("player");
  70. registerEntity<ItemStackEntity>("item-stack");
  71. }
  72. void onTileBreak(const Swan::Context &ctx, Swan::TilePos pos, Swan::Tile &tile) {
  73. if (tile.droppedItem) {
  74. ctx.plane.spawnEntity<ItemStackEntity>(
  75. ctx, (Swan::Vec2)pos + Swan::Vec2{0.5, 0.5}, *tile.droppedItem);
  76. }
  77. }
  78. Swan::EventListener breakListener_;
  79. };
  80. extern "C" Swan::Mod *mod_create(Swan::World &world) {
  81. return new CoreMod(world);
  82. }