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 1.9KB

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