From 48bf0f549d9e7d637e05fdae207b44c4e6d0ce8f Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Tue, 8 Jul 2014 17:02:28 +1000 Subject: [PATCH] Initial commit, read more After a few days of work, I'm committing what i've done so far. Mostly I've cherry picked the best parts of the multiplayer branch's modules, and adapted them for use here. I've written a few new components, and I've learnt a few things along the way. I may continue with this branch for a while, before moving the changes into the main branch. Alternatively, it might turn out that this single player version is more fun. We'll see. I've swapped the config system for a pure lua version instead. This is actually fairly flexible. I've also changed the map system and it's API a great deal. The tile sheet can be loaded from lua, and the save directory isn't hard coded anymore. I think this would be a good testbed for a lot of different systems, including the collision system, however the current system (using vectors) is inadequate. I'll have to dig up the old BBox, possilby. This branch will piggy back on the main repo for a while. --- makefile | 22 +++ out/rsc/setup.lua | 3 + rsc/graphics/fonts/pk_dark_16.bmp | Bin 0 -> 66614 bytes rsc/graphics/fonts/pk_dark_8.bmp | Bin 0 -> 33846 bytes rsc/graphics/fonts/pk_white_8.bmp | Bin 0 -> 33846 bytes rsc/graphics/interface/button_menu.bmp | Bin 0 -> 18054 bytes rsc/graphics/logos/krstudios.bmp | Bin 0 -> 270054 bytes rsc/graphics/sprites/aniflower.bmp | Bin 0 -> 12342 bytes rsc/graphics/sprites/coa2.bmp | Bin 0 -> 73782 bytes rsc/graphics/sprites/elliot2.bmp | Bin 0 -> 73782 bytes rsc/graphics/tilesets/MishMash.bmp | Bin 0 -> 1625142 bytes rsc/graphics/tilesets/blank.bmp | Bin 0 -> 786486 bytes rsc/graphics/tilesets/dirt.bmp | Bin 0 -> 110646 bytes rsc/graphics/tilesets/grass.bmp | Bin 0 -> 110646 bytes rsc/graphics/tilesets/longgrass.bmp | Bin 0 -> 110646 bytes rsc/graphics/tilesets/sand.bmp | Bin 0 -> 110646 bytes rsc/graphics/tilesets/terrain.bmp | Bin 0 -> 553014 bytes rsc/graphics/tilesets/water.bmp | Bin 0 -> 110646 bytes rsc/scripts/file_format.lua | 9 + rsc/scripts/generator.lua | 16 ++ rsc/scripts/in_world.lua | 33 ++++ rsc/setup.lua | 42 +++++ src/application.cpp | 171 +++++++++++++++++ src/application.hpp | 49 +++++ src/base_scene.cpp | 139 ++++++++++++++ src/base_scene.hpp | 74 ++++++++ src/character.cpp | 61 ++++++ src/character.hpp | 72 +++++++ src/graphics/image.cpp | 145 ++++++++++++++ src/graphics/image.hpp | 73 ++++++++ src/graphics/makefile | 37 ++++ src/graphics/sprite_sheet.cpp | 102 ++++++++++ src/graphics/sprite_sheet.hpp | 66 +++++++ src/in_world.cpp | 249 +++++++++++++++++++++++++ src/in_world.hpp | 93 +++++++++ src/linit.cpp | 85 +++++++++ src/main.cpp | 41 ++++ src/main_menu.cpp | 128 +++++++++++++ src/main_menu.hpp | 64 +++++++ src/makefile | 41 ++++ src/map/makefile | 37 ++++ src/map/region.cpp | 55 ++++++ src/map/region.hpp | 67 +++++++ src/map/region_api.cpp | 122 ++++++++++++ src/map/region_api.hpp | 30 +++ src/map/region_pager_api.cpp | 115 ++++++++++++ src/map/region_pager_api.hpp | 31 +++ src/map/region_pager_base.cpp | 100 ++++++++++ src/map/region_pager_base.hpp | 60 ++++++ src/map/region_pager_lua.cpp | 123 ++++++++++++ src/map/region_pager_lua.hpp | 51 +++++ src/map/tile_sheet.cpp | 61 ++++++ src/map/tile_sheet.hpp | 54 ++++++ src/map/tile_sheet_api.cpp | 82 ++++++++ src/map/tile_sheet_api.hpp | 31 +++ src/options_menu.cpp | 105 +++++++++++ src/options_menu.hpp | 63 +++++++ src/scene_list.hpp | 38 ++++ src/splash_screen.cpp | 58 ++++++ src/splash_screen.hpp | 52 ++++++ src/ui/button.cpp | 81 ++++++++ src/ui/button.hpp | 94 ++++++++++ src/ui/makefile | 37 ++++ src/ui/menu_bar.cpp | 139 ++++++++++++++ src/ui/menu_bar.hpp | 92 +++++++++ src/ui/raster_font.cpp | 60 ++++++ src/ui/raster_font.hpp | 54 ++++++ src/utilities/check_bounds.cpp | 40 ++++ src/utilities/check_bounds.hpp | 30 +++ src/utilities/frame_rate.hpp | 48 +++++ src/utilities/makefile | 37 ++++ src/utilities/simple_rng.hpp | 42 +++++ src/utilities/utility.cpp | 63 +++++++ src/utilities/utility.hpp | 37 ++++ src/utilities/vector2.hpp | 108 +++++++++++ todo.txt | 2 + 76 files changed, 4114 insertions(+) create mode 100644 makefile create mode 100644 out/rsc/setup.lua create mode 100644 rsc/graphics/fonts/pk_dark_16.bmp create mode 100644 rsc/graphics/fonts/pk_dark_8.bmp create mode 100644 rsc/graphics/fonts/pk_white_8.bmp create mode 100644 rsc/graphics/interface/button_menu.bmp create mode 100644 rsc/graphics/logos/krstudios.bmp create mode 100644 rsc/graphics/sprites/aniflower.bmp create mode 100644 rsc/graphics/sprites/coa2.bmp create mode 100644 rsc/graphics/sprites/elliot2.bmp create mode 100644 rsc/graphics/tilesets/MishMash.bmp create mode 100644 rsc/graphics/tilesets/blank.bmp create mode 100644 rsc/graphics/tilesets/dirt.bmp create mode 100644 rsc/graphics/tilesets/grass.bmp create mode 100644 rsc/graphics/tilesets/longgrass.bmp create mode 100644 rsc/graphics/tilesets/sand.bmp create mode 100644 rsc/graphics/tilesets/terrain.bmp create mode 100644 rsc/graphics/tilesets/water.bmp create mode 100644 rsc/scripts/file_format.lua create mode 100644 rsc/scripts/generator.lua create mode 100644 rsc/scripts/in_world.lua create mode 100644 rsc/setup.lua create mode 100644 src/application.cpp create mode 100644 src/application.hpp create mode 100644 src/base_scene.cpp create mode 100644 src/base_scene.hpp create mode 100644 src/character.cpp create mode 100644 src/character.hpp create mode 100644 src/graphics/image.cpp create mode 100644 src/graphics/image.hpp create mode 100644 src/graphics/makefile create mode 100644 src/graphics/sprite_sheet.cpp create mode 100644 src/graphics/sprite_sheet.hpp create mode 100644 src/in_world.cpp create mode 100644 src/in_world.hpp create mode 100644 src/linit.cpp create mode 100644 src/main.cpp create mode 100644 src/main_menu.cpp create mode 100644 src/main_menu.hpp create mode 100644 src/makefile create mode 100644 src/map/makefile create mode 100644 src/map/region.cpp create mode 100644 src/map/region.hpp create mode 100644 src/map/region_api.cpp create mode 100644 src/map/region_api.hpp create mode 100644 src/map/region_pager_api.cpp create mode 100644 src/map/region_pager_api.hpp create mode 100644 src/map/region_pager_base.cpp create mode 100644 src/map/region_pager_base.hpp create mode 100644 src/map/region_pager_lua.cpp create mode 100644 src/map/region_pager_lua.hpp create mode 100644 src/map/tile_sheet.cpp create mode 100644 src/map/tile_sheet.hpp create mode 100644 src/map/tile_sheet_api.cpp create mode 100644 src/map/tile_sheet_api.hpp create mode 100644 src/options_menu.cpp create mode 100644 src/options_menu.hpp create mode 100644 src/scene_list.hpp create mode 100644 src/splash_screen.cpp create mode 100644 src/splash_screen.hpp create mode 100644 src/ui/button.cpp create mode 100644 src/ui/button.hpp create mode 100644 src/ui/makefile create mode 100644 src/ui/menu_bar.cpp create mode 100644 src/ui/menu_bar.hpp create mode 100644 src/ui/raster_font.cpp create mode 100644 src/ui/raster_font.hpp create mode 100644 src/utilities/check_bounds.cpp create mode 100644 src/utilities/check_bounds.hpp create mode 100644 src/utilities/frame_rate.hpp create mode 100644 src/utilities/makefile create mode 100644 src/utilities/simple_rng.hpp create mode 100644 src/utilities/utility.cpp create mode 100644 src/utilities/utility.hpp create mode 100644 src/utilities/vector2.hpp create mode 100644 todo.txt diff --git a/makefile b/makefile new file mode 100644 index 0000000..3537520 --- /dev/null +++ b/makefile @@ -0,0 +1,22 @@ +#for use on Windows: + +#MKDIR=mkdir +#RM=del /y + +#CXXFLAGS+=-static-libgcc -static-libstdc++ -g -fno-inline-functions -Wall +#CXXFLAGS+=-static-libgcc -static-libstdc++ + +#export + +OUTDIR=out + +all: $(OUTDIR) + $(MAKE) -C src + +$(OUTDIR): + mkdir $(OUTDIR) + +clean: + $(RM) *.o *.a *.exe + +rebuild: clean all diff --git a/out/rsc/setup.lua b/out/rsc/setup.lua new file mode 100644 index 0000000..659d053 --- /dev/null +++ b/out/rsc/setup.lua @@ -0,0 +1,3 @@ +--reroute the program while in development +config = {debug = true} +dofile("../rsc/setup.lua") \ No newline at end of file diff --git a/rsc/graphics/fonts/pk_dark_16.bmp b/rsc/graphics/fonts/pk_dark_16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..97b23e0aba2af180d7b4dca6d86b64f6cae49cdd GIT binary patch literal 66614 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 XLbv`QHCs?K?aYozG9-42_WnD-s|6} zyF;_Z?j#B*0Eq&Ne2+aF``5qy^7mxNFMmwwFBoNNf8g(*I5NXO|C|yr9@(99wiuo< zOr?}m{$0{<|N2Kt+YTH6CbknOz?IUTfDOQ4KY$FJKmo3ljs$GL4nR3FZ~_Imf_H=5 zfdk0E2^8Q;3Bz=5zz!Th22P*=7m7^42JFBAWZ(n}aHWLbbZx*696$z6pa56e6Us~* zz@G!izzG!K@}+GXcHy2>cHy2>cHy2>cHy2>cHy2>cHy2>cHy2>cHy2>cHy2>cHy2>cHy2>cHy2>cHy2 z>cHy2>cHy2>cHy2>cHy2>cHy2>cHy2>cHy2>cHy2>cD4p;M=$F`2D)$>Dzbwu48pz zbzpU1b>RQK1LKFu=Y6_-3*sk}(98hM4Ikdtr}z{DAGn~If$X32@g{zk;+OpJ<<}4K z;EzxB&*QHJ_)^jI&*}TecXlzX4y+EW4y+EW4y+EW4*X6!;9n&5EiSarTRZ;u2KHyE z_!cR3DxiPc>Bp1XOKQBW^lni8 zKX|#hCx6xWonfrR7iQ0eg77;Pbzk=9A_o6CWP8 z)*H7w2Bt$~2p`Z*2A?*AMcW62e+h6#JL6{a`^|HC0y}?izUEo;S+@H5XOBD9!N*5P zW|UqZqfdwnHfOYRSZr!|4(oYMFQVmhe%W7=m7k4)v;3Q#7HUCn9@P2cUcGeoTf1lJ z?cg)#nBf92R4(^)Wadd9t-ztLN$bIjk{*_vG~ZRqZxftO}i|c8^)tb65V_@pfVD!PXI))BUUM z*%|FOs`5$Jyipelv*oee@QFLzGx;o6=Xy741}(nxV%;p8ryj~98z$W^_@&Fwf-S$f z^`mAmtDj_qv>{Hh9%Xb7o(W9a5-DsZguLOzW#I6*Zcq(29VfVZKP$hd<^J=4cIK!- z#6GX<(s;vu$1w1-@1EBJ>^j&w{dy?8@v4U4N0qi)wE0etP&3F3S;j-5U|+)s6CuiEydANLESbV~V< zo*JgxJ>m0@?9Gok`571SH~c<7`yE=C=qr}Rjd3U`FxUU$t|G7gA!~dcR3;zj*IB7VaC!D@@d;o zYD~MY$0W@Dn3aE9Y49^J3U%of!T))FZj2!=YLne1e8MmK_IiG+gB(#Is|$`W_LCaR zIi%FCk%I|#*JVYuRxs_b(X6S5{C59!HL1=hceww$be1pKlOXSYs3-WMe%p6QMyWi5q#5gAJPz_Bfp18gfV2ELOPA11YFgLoHrog+4{ViZ$QR#Z zY%-j@jc?#LLO+sg4(xhN zdh>stw#`PqX82i0+Ad$UK3wVdP$TMnfiqd`?`p=*#rQV&WWny%O;0WD!Bg@#@w|Ya9!BKAQfc$Ea~~vQ!EmJm8uWb{&+R6`w#vV>HT#&f4dLfpXoi3y6&vvEAD{!?;MQ# eEBN&Xc|3$3{h{VPZGA&btUB(4Hw1pB>wf{-UlCIP literal 0 HcmV?d00001 diff --git a/rsc/graphics/interface/button_menu.bmp b/rsc/graphics/interface/button_menu.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b2dcb2af1279b70df965d5e0adf1fbeacdb2e3ac GIT binary patch literal 18054 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 M2rvSSfO`b~0bxe40ssI2 literal 0 HcmV?d00001 diff --git a/rsc/graphics/sprites/aniflower.bmp b/rsc/graphics/sprites/aniflower.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fbc60f5b7c5737f2298f382ee800121b05e7d153 GIT binary patch literal 12342 zcmeH}Jx&}!5QT@>nI$AbhXe#f$T4zii4*u9NDiF(Dg?x&z5o{>aqi5qCH#6`^R`qo zwAk({%R!^rR?p9V_4=#c5!auuE|>N13gbCG-|+c>&&hIz5r4S<{vAKOuq@BZ^E{@3 zX)zcv^7(|*6xPhuB@5ea_^Lj8hALJIy`08#@ZlTB-R}f_{E{{f)!A zLUp&~qfTG*!xH~9+?laXG#||GN>IMWaYatP>+B%k!9m;d2mQDbTRw_Lm5_Ej2~@Pj zj=-%MOXi&9Ksi9!D&j|#ApFOEX zbXWTPGoHeuxtfd5XZRXCb`*_dqA+q7vBV&sUneR&Ki0eD^9n|%2v<7%kb~q_5y&Bm z1mC80;g3zu=Yds;jQsRZ8{#uLOFK&)s~|@Uv2fPK$h#eI=Ev8G)rc!hK0;<55;$5u zuHZDJ%5Dk3bzN2Z6w#7xB^M$-Cf(#+cobQw0L;s8tFWh5xYnY_`X*e0R)Nz#&hEFY w9|qoiY~*5Ueg$Lryd{XQicu4hF^OV2&Oa#OD$dhsU>cYPrh#c-8W=S27YPS~bpQYW literal 0 HcmV?d00001 diff --git a/rsc/graphics/sprites/coa2.bmp b/rsc/graphics/sprites/coa2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bd7b3c0e68a27ce935b84bbda7a7f184e1556bcc GIT binary patch literal 73782 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 Ia)1u}4>E?7uK)l5 literal 0 HcmV?d00001 diff --git a/rsc/graphics/sprites/elliot2.bmp b/rsc/graphics/sprites/elliot2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..89f66d82713f3ed60315c0f8ff1538aee2a954fc GIT binary patch literal 73782 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 L|0}`xwr%_m)tPtO literal 0 HcmV?d00001 diff --git a/rsc/graphics/tilesets/MishMash.bmp b/rsc/graphics/tilesets/MishMash.bmp new file mode 100644 index 0000000000000000000000000000000000000000..36093a82b48cce19583f058e9ebb06f597ff7b20 GIT binary patch literal 1625142 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%0DwdVH2=sO-&PizB~XdGF(nI5?7>rf&4+)9 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 literal 0 HcmV?d00001 diff --git a/rsc/graphics/tilesets/blank.bmp b/rsc/graphics/tilesets/blank.bmp new file mode 100644 index 0000000000000000000000000000000000000000..44b11c7863f0547b40c1550c7442547b48baa404 GIT binary patch literal 786486 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 zw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(L zXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuR zz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+! z>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_Uyp zFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~ zUT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870 zdcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw z!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3 zLoc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN z(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNny zoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xv zw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(L zXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuR zz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+! z>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_Uyp zFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~ zUT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870 zdcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw z!RwuRz0+Q3LofVagJ0L_^y_+|4cqSv_z#VN(_UypFSNnyoqD~~ zUT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870 zdcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw z!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3 zLoc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN z(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNny zoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xv zw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(L zXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuR zz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+! z>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_Uyp zFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~ zUT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870 zdcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw z!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3 zLoc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN z(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNny zoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xv zw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(L 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 zuXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZ zz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{ zd!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w} z>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz z2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C z4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8 zPJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d}) zck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0 zp$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO z^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9? zuXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZ zz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{ zd!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w} z>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz z2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C z4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8 zPJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d}) 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 z^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;) z7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~ zFSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0 zz20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ; z;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIs zX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+U zPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ- z+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20dr zw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV z^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;) z7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~ zFSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0 zz20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ; z;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIs zX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+U zPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ- z+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20dr zw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV z^-jIsX)m;)7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;) z7uw+UPQBh~FSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+UPQBh~ zFSMZ-+Tit0z20drw4oQ;;PpcV^-jIsX)m;)7uw+U^Qm9g>GTD9p$*&b z3;24SdcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(L zXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuR zz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+! z>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_Uyp zFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~ zUT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870 zdcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw z!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3 zLoc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN z(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNny zoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xv zw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(L zXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuR zz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+! z>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_Uyp zFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~ zUT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870 zdcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw z!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3 zLoc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN z(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNny zoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xv zw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(L zXhScw!RwuRz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuR zz0+Q3Loc+!>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+! z>z#VN(_UypFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>z#VN(_Uyp zFSNnyoqD~~UT8xvw8870dcD(LXhScw!RwuRz0+Q3Loc+!>*rIyuG8rY^g27wCmHY`-ty>vih& zPJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d}) zck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0 zp$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO z^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9? zuXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZ zz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{ zd!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w} z>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz z2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C z4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8 zPJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d}) zck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0 zp$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO z^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9? zuXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZ zz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{ zd!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w} z>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz z2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C z4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8 zPJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d}) zck1;{d!Y@z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z z&<3w}>h(^0p$)yz2CsMO^-g=C4ZY9?uXpP8PJ5vZz0d})ck1;{d!Y@z&<3w}>h(^0 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 zc)e4vciIbW=!G_Ty;HAu+6!&yg*JG-Q?Ga03vK9yHh8^LuXoxDZRmwIc)e4vciIbW z=!G_Ty;HAu+6!&yg*JG-Q?Ga03vK9yHh8^LuXoxDZRmwIc)e4vciIbW=!G_Ty;HAu z+6!&yg*JG-Q?Ga03vK9yHh8^LuXoxDZRmwIc)e4vciIbW=!G_Ty;HAu+6!&yg*JG- zQ?Ga03vK9yHh8^LuXoxDZRmwIc)e4vciIbW=!G_Ty;HAu+6!&yg*JG-Q?Ga03vK9y zHh8^LuXoxDZRmwIc)e4vciIbW=!G_Ty;HAu+6!&yg*JG-Q?Ga03vK9yHh8^LuXoxD zZRmwIc)e4vciIbW=!G_Ty;HAu+6!&yg*JG-Q?Ga03vK9yHh8^LuXoxDZRmwIc)e4v zciIbW=!G_Ty;HAu+6!&yg*JG-Q?Ga03vK9yHh8^LuXoxDZRmwIc)e4vciIbW=!G_T zy;HAu+6!&yg*JG-Q?Ga03vK9yHh8^LuXoxDZRmwIc)e4vciIbW=!G_Ty;HAu+6!&y zg*JG-Q?Ga03vK9yHh8^LuXoxDZRmwIc)e4vciIbW=!G_Ty;HAu+6!&yg*JG-Q?Ga0 z3vK9yHh8^LuXoxDZRmwIc)e4vciIbW=!G_Ty;HAu+6!&yg*JG-Q?Ga03vK9yHh8^L zuXoxDZRmwIc)e4vciIbW=!G_Ty;HAu+6!&yg*JG-Q?Ga03vK9yHh8^LuXoxDZRmwI zc)e4vciIbW=!G_Ty;HAu+6!&yg*JG-Q?Ga03vK9yHh8^LuXoxDZRmwIc)e4vciIbW z=!G_Ty;HAu+6!&yg*JG-Q?Ga03vK9yHh8^LuXoxDZRmwIc)e4vciIbW=!G_Ty;HAu z+6!&yg*JG-Q?Ga03vK9yHh8^LuXoxDZRmwIc)e4vciIbW=!G_Ty;HAu+6!&yg*JG- zQ?Ga03vK9yHh8^LuXoxDZRmwIc)e4vciIbW=!G_Ty;HAu+6!&yg*JG-Q?Ga03vK9y zHh8^LuXoxDZRmwIc)e4vciIbW=!G_Ty;HAu+6!&yg*JG-Q?Ga03vK9yHh8^LuXoxD zZRmwIc)e4vciIbW=!G_Ty;HAu+6!&yg*JG-Q?Ga03vK9yHh8^LuXoxDZRmwIc)e4v zciIbW=!G_Ty;HAu+6!&yg*JG-Q?Ga03vK9yHh8^LuXoxDZRmwIc)e4vciIbW=!G_T cy;HAu+6!&yg*JG-Q?Ga03vK9yHh8_$A9ZJRF8}}l literal 0 HcmV?d00001 diff --git a/rsc/graphics/tilesets/dirt.bmp b/rsc/graphics/tilesets/dirt.bmp new file mode 100644 index 0000000000000000000000000000000000000000..089ba2aed69991bf3ee8f86a2552aa4c6742f41c GIT binary patch literal 110646 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ǀVGl98=Aq^O<#9{pPc`(L}zSbQpmKDB}0`%mnYyQto@J2nu{0*;{ms!vs`5w68JbV3TVAJFeT z3wz^h{qJ3U%=bEf`S}j4!rSBSPh8qZ`|ouRz1Rpivl(>4Pi+0C-os{O&>X;Lf8Y@` z(>H@(u0MDjc1^`SmGW;5pbr00zUhO-}?{t9@VHraQM-b-Y^vjg2#n>;LG*LPsFZS z?(s~0b}hG;+&qF$)_>D*IE1%|)Zr)nbM-UldvpJ9y`ujLgg!ILOq%r{99;89hA1!3 zx7IBpPNTw8^fw=hc|z30hnw}8U*!xFmcHtIXKb@#&$>VKym`L53}01$8E69f&vx-@ zL3*(v2%2Ui-WZntGxMt(cx!qd2ayHwN9fNy8k3xHO?+1MnN(gya}UHHINwS0?oIXC zw6{rcS>bPel|rD=F6kK88DwU&-8WYv*wv&{mG|eo7Vhjn`pMqm`Tm14qCQbfRxE-nZ!_4dJmR<2KmY9X6q?oOk-y_!fm*ue z{qdB*aX&R%l^JR3{~qo?x4*aHkdL+#|8#X;?>})aI*uA|o(TAe^P^k`Rfn@Rj!5lz zpV!yTybh>7*Ddj_JYNAFhl6AHQ;SNf>Ts&YZ*u=>uiH0{{yHcHU;StB$kT~l!ciZ7 zR9k>v(J;lt$LZ?|eS_am1^i0$R^wtbIDh}WT+hA#+;z5#Rc%K))_>R{RB#$-eg}um z$2*J;OX-+>mcHMjZ~Qx{0B&;JZCzjo!HN6twNlpO?mwM>tpBiv`c{Q&C!sNKCLr^p zYF8j-PXz6r`hJDJ@ni*fvP;glx#C0h`7Au^{?l{w6fO#4MfMP!a$F&r(KjpU943m; z0}s-_sK~#z?85VH7V6RZcqkV7Z$4rR^_%s-H0V3RMh0Dov#h6Q&Exy)FDW&)={1?x zjQY$c9%H&mU_akog3<~9iW9hgOljC$SF_*xDn%2VtWUG}9z3A$=}lZWf>rp5DFh>e zVUsCZ^M|ZE>o-d@8N9AOlLlsJIxa08zRF4eF17IalGPs2x(EDkYEoR=!4mvAON%xEX<%v=5#b8%uiq;a;@Hk@{SR#W z)G`0A(8N0EWBPu7uGZK6zaFKtlbzWco!}&@7&9Zy&q(0JJO}M!W1f#KF7#n9L z75AZnJ@Gs1t1#^zhRYdH@#Q}|SZR%avPQuonsR;gL2 zyZP@qXFQ6J;Q{~6C8{zb2lSCrmsqQR>HVzcYed^QR-fhmtHTV z-rPGaf#!)-N((vdCi=BRh`_L0y{-SI`Gx+Q`peHZR#~op-Te&bz2SZCPtRe*VR+U3 zugVl}>Z?!$Y!S|MEHZ)-uMv?QfEITnbYvsq3-zNu7-G?d`c1Wk`qe)otMr@V%^mTi z;u|(*&No(Bu3xKBBjKFGP5(!3`dDh9@z6KPmxX!1UZJt za%Er;@JEvWsl?xu_VgJ?mVoEhtS9P6iJn!TFwdc%(V6q@iLcV<{fSi`RR3^39@d9N zkqmS9qHZ!1fK&M94UAb1H48v~(3(MTHjO!9ZT(#t zcpwg++*faRDngThAWPSrja+aTsozYm1Vk><_Yys^KJK5mR_|E-t1==ypn7nKaB4ts z4i)MWgY*OX@`>E#_otfQjA#oo7NAEs?0?fz5NIG=aVT#9O#*`AkkAxYI>|1@Gs3qA z14owru8SVtXX$&1xV7i{=U!I%_sR&fM7$D?8QFV(BrD*Wj*sah>$>|X&+}k!ea`!z z_eQ4I-0`vc$LbKI4!$WKtp-7sNVFz!9TKSKaYpX1?8*bC2YN&USt!Vl7KUe1O7A*HhH0`%bau6Vw7SrYlu z`f$s9zSvLr&Fy#Onr+|hIWa|;XodvS|70 z1l^eX@punAA6P@@&vk|@5KM%5^dI}Dl^iob`5Uof64vnZK@Z?BL<&!cZeMD-&b3-`bs^rJo)(k;C8Y%Bgd@!u@blKNC-Mo{4;`qXJk zHG?`?0&w_Iyx#xb7Iwu4`e8uKrvF`w4#-%gsjt-u=*^j%^&tT%?7E%{%}A$yELw+7 zdz^kf1#Iv^_4$DRy2PsbRAok1>GQ5$dOv$xI1sN-*1Z1%%MDUi)xWufp0B}+pGpBI z!t;RsAE94M^sM@Pz<*t0)%jLsMpo(fZtOz+-WHCf-G^ZMFmQ7T za*)VRq>P92S@TR^aXxFFInZy`2SKDP(f6eTFVS!M=R!;LDOFcNe2IQlW@ME<{Wrgt z_=j?D3y0%0*7WQ_`9HkSAQ1~m-xuA)k=0vbQ>RCO{>)oVFMTuqVf|ix5Z|=gBz)3; z&wSI^WU%^QyGrP<6~`V!e{$FJw5s3R!pZoIrISmH(`O7+PSj_x1ajlIJ%~hl)vpnx z@KdL5u0JRar|#^3U|t8Y#Q$KSlllW?ZsDXpMXtV|gI%1T!WNqT&nwR;oUH%M61uAd zc(=hPg5F-LC6*{sdc*tZ&lCro*vL)%Z<-I=8XoXJUQ5aZllr?feThkZPXXp~5o`|k z>W??FWEMX00J_^HvXdgdF7RZ1CdEn964)m6W3yZ_f=p=!rB=ax^mo;#l6`A~`qV^^ zxCn8xKAtjXY@^ zB~CJz;CX2|0AFz|8(A0*_#(T$f&hr~<3Zqorlve4^u_t*ffqp-)et6#`e>HLCx2J1 zq)_$eb*fLP4fK6V{+o+lt>0YqWRSZ%DRMsDiwulP>W$^R__x9@Q-S)3@sZ^H(GSrK z1{p(LD)2vF6JK2y{+R!!`K$Gti+%^cEAacN03WevEP9q51c%MXpU}@24Xdy6-!y-< Kesj_9;Qs^UF5@i# literal 0 HcmV?d00001 diff --git a/rsc/graphics/tilesets/grass.bmp b/rsc/graphics/tilesets/grass.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ac8c6e46e6e7dee769c2157f08930fbf94632706 GIT binary patch literal 110646 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 DiPYCg!c7uMGFa2b2*n4zmu{ES`b< zTMUzbVErd#9m>Z~_e-0W9;=}#)Q|^dJVZnM%i$+|G+axclD|A;t;}ZW>F2i!K3t!) z%W(X8^_iG=hOLbB^=Ebz{|>!4HCF$KESn1CMB0cU$JET`>;WA%^7 zvIQ<3VtqP0GBiu8vD1oqNsN&Vpw}{Vu+i}AZI74W@sb!Ln}rT$=wPGa*V`U1*~E_$ z&A=BElbL}Z`D2gLr$m-VXBmYrHT0xihU3rEKQZ4N>aZv3^E&@cVliN>{t;O=XKB@s zX1O4QNvqD~CD`$bw7nL7lxRhLB7f{r`j^P^NTN~rDwuMMvG}gZ8TDC`-}IP|j`^DV zwMi)jjMcvi&K4-3w;p6sT_t^(^;@%aB$ha*(Jv6q@{YkcZ-^fyGV?|Ga~7ZCqW)1C z+hg-Y0mqN*Vq4kZbXjNKkcr{A>J<(ncKS~67 zy%*9a@|QhO|AfqNAim0`++r*~X!Gi`=Ot^1`11)Lq6 zd-P$6(J;JF!-eppL_X1?{B;(xFob_p#`Z$^&gQ)Ov@C}V_;mV@0(emS9REX<96T_; zqHS1=crKNw_R=FAd_XygVG1&(hgGS4rQlWYqeLs}6Zy+_vaai&kQpw7|AP9gO0?;e zhA+5Zn>4Bc1M@5W(-!jR;rOagO4J@Su{ao-#qap!cf7(@#E%lK&R=J7Hk~hfPUJU= zgKf0y_$Byo{yOs1`m7#dkJH4YCwZ}+L+;le4%L`}`PI477CM^oH5-rYG(|(f=o2H6 zt9*mJ9DbB&MSUWF*<CM17%*IPwQOCuVeQ0 zIn6(9baXgS|Fm^X1h!HvLp!o5n#f~iWXCd)-yW}(Cq5~~nz}Q7l!#NT%U@^F5eD*) z;@BRAZ@^@X!hb=1Cgw+n)Z5tmb(BLHKT!V!p6(YtCsu6iKLlGM43>~t-jOXa_S_#o z>7${J@ZlfxTS_!apAs3*DEt@HXX^<2{bTRf{(U=<1NBe4=&!@&VI>?fEZYmF(VZ5c7zdn~8%BDC7S4 zr9>b8DZiyel)?4!bI;lWELDl;naH}{Hi{3`cOC5r^jMZo87wf;ZMa)awf_5Y9aQupNcpI>K1LRMkWO9E-dM zZFqjmP1!9|M0WiP3MZKIC!FfgtHfE$8DdxCe@bW6 z4ZHM|`Y5K<|ByapioFv4ejH~oqMhSk-E=m7b<>MZao$<~7dPrJj~O|g-~JY#*`GiG z-&Pf^uN&aY{{ghSGLZlP literal 0 HcmV?d00001 diff --git a/rsc/graphics/tilesets/sand.bmp b/rsc/graphics/tilesets/sand.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c5f156a5fb96c2a28b68135f45323057fe653b6f GIT binary patch literal 110646 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 I>38t|0rS7;rvLx| literal 0 HcmV?d00001 diff --git a/rsc/graphics/tilesets/terrain.bmp b/rsc/graphics/tilesets/terrain.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0a39c74c88f031545124e48e0c2f01249ab064cf GIT binary patch literal 553014 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 b{-SX|w1+mcBOKkg=w-Q&M=UrOizh%1R%3mxz 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 Pe38F*D&_wKQwRPZ%kb7f literal 0 HcmV?d00001 diff --git a/rsc/scripts/file_format.lua b/rsc/scripts/file_format.lua new file mode 100644 index 0000000..5cff60a --- /dev/null +++ b/rsc/scripts/file_format.lua @@ -0,0 +1,9 @@ +--overwriting the existing hard coded methods +function Region.Load(region) + --the return value signals if this succeeded or failed + return false +end + +function Region.Save(region) + -- +end diff --git a/rsc/scripts/generator.lua b/rsc/scripts/generator.lua new file mode 100644 index 0000000..f736ac1 --- /dev/null +++ b/rsc/scripts/generator.lua @@ -0,0 +1,16 @@ +--uber lazy declarations +function math.sqr(x) return x*x end +function math.dist(x, y, i, j) return math.sqrt(math.sqr(x-i) + math.sqr(y-j)) end + +--define these +function Region.Create(region) + for i = 1, Region.GetWidth() do + for j = 1, Region.GetHeight() do + Region.SetTile(region, i, j, 1, 1) --to show the basics are working + end + end +end + +function Region.Unload(region) + -- +end diff --git a/rsc/scripts/in_world.lua b/rsc/scripts/in_world.lua new file mode 100644 index 0000000..43350aa --- /dev/null +++ b/rsc/scripts/in_world.lua @@ -0,0 +1,33 @@ +local sheet = TileSheet.GetTileSheet() +local pager = RegionPager.GetRegionPager() + +--the selected tilesheet +TileSheet.Load(sheet, config.dir.tilesets .. "terrain.bmp", 32, 32) + +--tile macros, mapped to this tilesheet +local base = 14 +local shift = 36 +tiles = { + plains = base + shift * 0, + grass = base + shift * 1, + dirt = base + shift * 2, + sand = base + shift * 3, + water = base + shift * 4 +} + +--could set custom generation systems here, that differ from the global generators, etc. +function Region.Create(region) + for i = 1, Region.GetWidth() do + for j = 1, Region.GetHeight() do + local dist = math.dist(0, 0, i + Region.GetX(region) -1, j + Region.GetY(region) -1) + if dist < 10 then + Region.SetTile(region, i, j, 1, tiles.plains) + elseif dist < 12 then + Region.SetTile(region, i, j, 1, tiles.sand) + else + Region.SetTile(region, i, j, 1, tiles.water) + Region.SetSolid(region, i, j, true) + end + end + end +end diff --git a/rsc/setup.lua b/rsc/setup.lua new file mode 100644 index 0000000..c576eb3 --- /dev/null +++ b/rsc/setup.lua @@ -0,0 +1,42 @@ +--[[ + --reroute the program while in development + config = {debug = true} + dofile("../rsc/setup.lua") +--]] + +--catch the debug signal if the program was rerouted +local debug = false +if config ~= nil then + debug = config.debug +end + +--the program's configuration +config = { + debug = debug, + screen = { + width = 800, + height = 600, + fullscreen = false + }, + dir = { + fonts = "rsc/graphics/fonts/", + logos = "rsc/graphics/logos/", + sprites = "rsc/graphics/sprites/", + tilesets = "rsc/graphics/tilesets/", + interface = "rsc/graphics/interface/", + scripts = "rsc/scripts/", + maps = "rsc/maps/" + }, + mapname = "mapname" +} + +--development environment +if config.debug then + for k, v in pairs(config.dir) do + config.dir[k] = string.format("../%s", v) + end +end + +--"load" the scripted systems +dofile(config.dir.scripts .. "file_format.lua") +dofile(config.dir.scripts .. "generator.lua") \ No newline at end of file diff --git a/src/application.cpp b/src/application.cpp new file mode 100644 index 0000000..cffc3f5 --- /dev/null +++ b/src/application.cpp @@ -0,0 +1,171 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial Applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "application.hpp" + +#include +#include +#include + +//------------------------- +//Scene headers +//------------------------- + +//Add the custom scene headers here +#include "splash_screen.hpp" +#include "main_menu.hpp" +#include "options_menu.hpp" +#include "in_world.hpp" + +//------------------------- +//Public access members +//------------------------- + +void Application::Init(int argc, char** argv) { + std::cout << "Beginning " << argv[0] << std::endl; + + //------------------------- + //Initialize the APIs + //------------------------- + + //initialize SDL + if (SDL_Init(SDL_INIT_VIDEO)) { + throw(std::runtime_error("Failed to initialize SDL")); + } + std::cout << "Initialized SDL" << std::endl; + + //initialize lua + lua = luaL_newstate(); + if (!lua) { + throw(std::runtime_error("Failed to initialize lua")); + } + luaL_openlibs(lua); + std::cout << "Initialized lua" << std::endl; + + if (luaL_dofile(lua, "rsc\\setup.lua")) { + throw(std::runtime_error("Failed to initialize lua's startup script")); + } + std::cout << "Initialized lua's setup script" << std::endl; + + //------------------------- + //Setup the screen + //------------------------- + + lua_getglobal(lua, "config"); + lua_getfield(lua, 1, "screen"); + lua_getfield(lua, 2, "width"); + lua_getfield(lua, 2, "height"); + lua_getfield(lua, 2, "fullscreen"); + + int w = lua_tointeger(lua, 3); + int h = lua_tointeger(lua, 4); + int f = lua_toboolean(lua, 5); + + lua_pop(lua, 5); + + BaseScene::SetScreen(w ? w : 800, h ? h : 600, 0, f ? SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN : SDL_HWSURFACE|SDL_DOUBLEBUF); + std::cout << "Initialized the screen" << std::endl; + + //------------------------- + //finalize the startup + //------------------------- + + std::cout << "Startup completed successfully" << std::endl; + + //------------------------- + //debugging + //------------------------- + + //... +} + +void Application::Proc() { + LoadScene(SceneList::FIRST); + + //prepare the time system + typedef std::chrono::steady_clock Clock; + + std::chrono::duration delta(16); + Clock::time_point simTime = Clock::now(); + Clock::time_point realTime; + + //The main loop + while(activeScene->GetNextScene() != SceneList::QUIT) { + //switch scenes when necessary + if (activeScene->GetNextScene() != SceneList::CONTINUE) { + LoadScene(activeScene->GetNextScene()); + continue; + } + + //update the current time + realTime = Clock::now(); + + //simulate game time + while (simTime < realTime) { + //call each user defined function + activeScene->RunFrame(double(delta.count()) / std::chrono::duration::period::den); + simTime += delta; + } + + //draw the game to the screen + activeScene->RenderFrame(); + } + + UnloadScene(); +} + +void Application::Quit() { + std::cout << "Shutting down" << std::endl; + lua_close(lua); + SDL_Quit(); + std::cout << "Clean exit" << std::endl; +} + +//------------------------- +//Private access members +//------------------------- + +void Application::LoadScene(SceneList sceneIndex) { + UnloadScene(); + switch(sceneIndex) { + //add scene creation calls here + case SceneList::FIRST: + case SceneList::SPLASHSCREEN: + activeScene = new SplashScreen(lua); + break; + case SceneList::MAINMENU: + activeScene = new MainMenu(lua); + break; + case SceneList::OPTIONSMENU: + activeScene = new OptionsMenu(lua); + break; + case SceneList::INWORLD: + activeScene = new InWorld(lua); + break; + default: + throw(std::logic_error("Failed to recognize the scene index")); + } +} + +void Application::UnloadScene() { + delete activeScene; + activeScene = nullptr; +} diff --git a/src/application.hpp b/src/application.hpp new file mode 100644 index 0000000..e5be655 --- /dev/null +++ b/src/application.hpp @@ -0,0 +1,49 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef APPLICATION_HPP_ +#define APPLICATION_HPP_ + +#include "scene_list.hpp" +#include "base_scene.hpp" + +#include "lua/lua.hpp" + +class Application { +public: + Application() = default; + ~Application() = default; + + void Init(int argc, char** argv); + void Proc(); + void Quit(); + +private: + //Private access members + void LoadScene(SceneList sceneIndex); + void UnloadScene(); + + BaseScene* activeScene = nullptr; + + lua_State* lua = nullptr; +}; + +#endif \ No newline at end of file diff --git a/src/base_scene.cpp b/src/base_scene.cpp new file mode 100644 index 0000000..48512ec --- /dev/null +++ b/src/base_scene.cpp @@ -0,0 +1,139 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "base_scene.hpp" + +#include + +//------------------------- +//Static declarations +//------------------------- + +SDL_Surface* BaseScene::screen = nullptr; + +//------------------------- +//Public access members +//------------------------- + +BaseScene::BaseScene() { + // +} + +BaseScene::~BaseScene() { + // +} + +//------------------------- +//Program control +//------------------------- + +SDL_Surface* BaseScene::SetScreen(int w, int h, int bpp, Uint32 flags) { + if (!bpp) { + bpp = SDL_GetVideoInfo()->vfmt->BitsPerPixel; + } + + screen = SDL_SetVideoMode(w, h, bpp, flags); + + if (!screen) { + throw(std::runtime_error("Failed to create the screen surface")); + } + + return screen; +} + +SDL_Surface* BaseScene::GetScreen() { + return screen; +} + +SceneList BaseScene::SetNextScene(SceneList sceneIndex) { + return nextScene = sceneIndex; +} + +SceneList BaseScene::GetNextScene() const { + return nextScene; +} + +//------------------------- +//Frame loop +//------------------------- + +void BaseScene::RunFrame(double delta) { + FrameStart(); + HandleEvents(); + Update(delta); + FrameEnd(); +} + +void BaseScene::RenderFrame() { + SDL_FillRect(screen, 0, 0); + Render(screen); + SDL_Flip(screen); +} + +//------------------------- +//Event handlers +//------------------------- + +void BaseScene::HandleEvents() { + SDL_Event event; + + while(SDL_PollEvent(&event)) { + switch(event.type) { + case SDL_QUIT: + QuitEvent(); + break; + + case SDL_VIDEORESIZE: + SetScreen(event.resize.w, event.resize.h, 0, screen->flags); + break; + + case SDL_MOUSEMOTION: + MouseMotion(event.motion); + break; + + case SDL_MOUSEBUTTONDOWN: + MouseButtonDown(event.button); + break; + + case SDL_MOUSEBUTTONUP: + MouseButtonUp(event.button); + break; + + case SDL_KEYDOWN: + KeyDown(event.key); + break; + + case SDL_KEYUP: + KeyUp(event.key); + break; + +#ifdef USE_EVENT_JOYSTICK + //TODO: joystick/gamepad support +#endif + +#ifdef USE_EVENT_UNKNOWN + default: + UnknownEvent(event); + break; +#endif + }//switch + }//while +} diff --git a/src/base_scene.hpp b/src/base_scene.hpp new file mode 100644 index 0000000..a4bfd88 --- /dev/null +++ b/src/base_scene.hpp @@ -0,0 +1,74 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef BASESCENE_HPP_ +#define BASESCENE_HPP_ + +#include "scene_list.hpp" + +#include "SDL/SDL.h" + +class BaseScene { +public: + //Public access members + BaseScene(); + virtual ~BaseScene(); + + //Program control + static SDL_Surface* SetScreen(int w, int h, int bpp = 0, Uint32 flags = SDL_HWSURFACE|SDL_DOUBLEBUF); + static SDL_Surface* GetScreen(); + + SceneList SetNextScene(SceneList sceneIndex); + SceneList GetNextScene() const; + + //Frame loop + virtual void RunFrame(double delta); + virtual void RenderFrame(); + +protected: + virtual void FrameStart() {} + virtual void HandleEvents(); + virtual void Update(double delta) {} + virtual void FrameEnd() {} + virtual void Render(SDL_Surface* const screen) {} + + //Event handlers + virtual void QuitEvent() { SetNextScene(SceneList::QUIT); } + virtual void MouseMotion(SDL_MouseMotionEvent const&) {} + virtual void MouseButtonDown(SDL_MouseButtonEvent const&) {} + virtual void MouseButtonUp(SDL_MouseButtonEvent const&) {} + virtual void KeyDown(SDL_KeyboardEvent const&) {} + virtual void KeyUp(SDL_KeyboardEvent const&) {} + +#ifdef USE_EVENT_JOYSTICK + //TODO: joystick/gamepad support +#endif + +#ifdef USE_EVENT_UNKNOWN + virtual void UnknownEvent(SDL_Event const&) {} +#endif + +private: + static SDL_Surface* screen; + SceneList nextScene = SceneList::CONTINUE; +}; + +#endif diff --git a/src/character.cpp b/src/character.cpp new file mode 100644 index 0000000..eaa38d8 --- /dev/null +++ b/src/character.cpp @@ -0,0 +1,61 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "character.hpp" + +void Character::Update(double delta) { + if (motion.x && motion.y) { + origin += motion * delta * CHARACTER_WALKING_MOD; + } + else if (motion != 0) { + origin += motion * delta; + } + sprite.Update(delta); +} + +void Character::DrawTo(SDL_Surface* const dest, int camX, int camY) { + sprite.DrawTo(dest, origin.x - camX, origin.y - camY); +} + +void Character::CorrectSprite() { + //NOTE: These must correspond to the sprite sheet in use + if (motion.y > 0) { + sprite.SetYIndex(0); + } + else if (motion.y < 0) { + sprite.SetYIndex(1); + } + else if (motion.x > 0) { + sprite.SetYIndex(3); + } + else if (motion.x < 0) { + sprite.SetYIndex(2); + } + + //animation + if (motion != 0) { + sprite.SetDelay(0.1); + } + else { + sprite.SetDelay(0); + sprite.SetXIndex(0); + } +} diff --git a/src/character.hpp b/src/character.hpp new file mode 100644 index 0000000..fbf9ba4 --- /dev/null +++ b/src/character.hpp @@ -0,0 +1,72 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef CHARACTER_HPP_ +#define CHARACTER_HPP_ + +//components +#include "vector2.hpp" + +//graphics +#include "sprite_sheet.hpp" + +//std namespace +#include + +//the speeds that the characters move +constexpr double CHARACTER_WALKING_SPEED = 140.0; +constexpr double CHARACTER_WALKING_MOD = 1.0/sqrt(2.0); + +//the bounding boxes for the characters +constexpr double CHARACTER_BOUNDS_WIDTH = 32.0; +constexpr double CHARACTER_BOUNDS_HEIGHT = 32.0; + +class Character { +public: + Character() = default; + ~Character() = default; + + void Update(double delta); + + //graphics + void DrawTo(SDL_Surface* const, int camX, int camY); + void CorrectSprite(); + SpriteSheet* GetSprite() { return &sprite; } + + //accessors and mutators + Vector2 SetOrigin(Vector2 v) { return origin = v; } + Vector2 GetOrigin() const { return origin; } + Vector2 SetMotion(Vector2 v) { return motion = v; } + Vector2 GetMotion() const { return motion; } + Vector2 SetBounds(Vector2 v) { return bounds = v; } + Vector2 GetBounds() const { return bounds; } + +private: + //graphics + SpriteSheet sprite; + + //position + Vector2 origin = {0.0,0.0}; + Vector2 motion = {0.0,0.0}; + Vector2 bounds = {CHARACTER_BOUNDS_WIDTH,CHARACTER_BOUNDS_HEIGHT}; +}; + +#endif diff --git a/src/graphics/image.cpp b/src/graphics/image.cpp new file mode 100644 index 0000000..3b4f99b --- /dev/null +++ b/src/graphics/image.cpp @@ -0,0 +1,145 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "image.hpp" + +#include +#include + +Image& Image::operator=(Image const& rhs) { + //don't screw yourself + if (this == &rhs) { + return *this; + } + + FreeSurface(); + + //Copy the other Image's stuff + surface = rhs.surface; + clip = rhs.clip; + local = false; +} + +Image& Image::operator=(Image&& rhs) { + //don't screw yourself + if (this == &rhs) { + return *this; + } + + FreeSurface(); + + //Steal the other Image's stuff + surface = rhs.surface; + clip = rhs.clip; + local = rhs.local; + + rhs.surface = nullptr; + rhs.clip = {0, 0, 0, 0}; + rhs.local = false; +} + +SDL_Surface* Image::LoadSurface(std::string fname) { + FreeSurface(); + SDL_Surface* p = SDL_LoadBMP(fname.c_str()); + if (!p) { + std::ostringstream os; + os << "Failed to load file: " << fname; + throw(std::runtime_error(os.str())); + } + surface = p; + clip = {0, 0, (Uint16)surface->w, (Uint16)surface->h}; + local = true; + SetTransparentColor(255, 0, 255); //default + return surface; +} + +SDL_Surface* Image::CreateSurface(Uint16 w, Uint16 h) { + FreeSurface(); + Uint32 rmask, gmask, bmask, amask; +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + rmask = 0xff000000; + gmask = 0x00ff0000; + bmask = 0x0000ff00; + amask = 0x000000ff; +#else + rmask = 0x000000ff; + gmask = 0x0000ff00; + bmask = 0x00ff0000; + amask = 0xff000000; +#endif + SDL_Surface* p = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32, rmask, gmask, bmask, amask); + if (!p) { + throw(std::runtime_error("Failed to create Image surface")); + } + surface = p; + clip = {0, 0, (Uint16)surface->w, (Uint16)surface->h}; + local = true; + SetTransparentColor(255, 0, 255); //default + return surface; +} + +SDL_Surface* Image::SetSurface(SDL_Surface* p) { + FreeSurface(); + if (!p) { + throw(std::invalid_argument("No surface pointer provided")); + } + surface = p; + clip = {0, 0, (Uint16)surface->w, (Uint16)surface->h}; + local = false; + return surface; +} + +void Image::FreeSurface() { + if (local) { + SDL_FreeSurface(surface); + local = false; + } + surface = nullptr; + clip = {0, 0, 0, 0}; +} + +void Image::DrawTo(SDL_Surface* dest, Sint16 x, Sint16 y) { + if (!surface) { + throw(std::logic_error("No image surface to draw")); + } + SDL_Rect sclip = clip, dclip = {x,y}; + SDL_BlitSurface(surface, &sclip, dest, &dclip); +} + +void Image::SetTransparentColor(Uint8 r, Uint8 g, Uint8 b) { + if (!surface) { + throw(std::logic_error("Failed to set the transparent color")); + } + if (!local) { + throw(std::logic_error("Cannot set the transparent color of a non-local surface")); + } + SDL_SetColorKey(surface, SDL_SRCCOLORKEY, SDL_MapRGB(surface->format, r, g, b)); +} + +void Image::ClearTransparentColor() { + if (!surface) { + throw(std::logic_error("Failed to clear the transparent color")); + } + if (!local) { + throw(std::logic_error("Cannot clear the transparent color of a non-local surface")); + } + SDL_SetColorKey(surface, 0, 0); +} diff --git a/src/graphics/image.hpp b/src/graphics/image.hpp new file mode 100644 index 0000000..462e565 --- /dev/null +++ b/src/graphics/image.hpp @@ -0,0 +1,73 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef IMAGE_HPP_ +#define IMAGE_HPP_ + +#include "SDL/SDL.h" +#include + +class Image { +public: + Image() = default; + Image(Image const& rhs) { *this = rhs; } + Image(Image&& rhs) { *this = std::move(rhs); } + Image(std::string fname) { LoadSurface(fname); } + Image(Uint16 w, Uint16 h) { CreateSurface(w, h); } + Image(SDL_Surface* p) { SetSurface(p); } + ~Image() { FreeSurface(); } + + Image& operator=(Image const&); + Image& operator=(Image&&); + + SDL_Surface* LoadSurface(std::string fname); + SDL_Surface* CreateSurface(Uint16 w, Uint16 h); + SDL_Surface* SetSurface(SDL_Surface*); + SDL_Surface* GetSurface() const { return surface; } + void FreeSurface(); + + void DrawTo(SDL_Surface* const, Sint16 x, Sint16 y); + + //Clip handlers + SDL_Rect SetClip(SDL_Rect r) { return clip = r; } + SDL_Rect GetClip() const { return clip; } + + Sint16 SetClipX(Sint16 x) { return clip.x = x; } + Sint16 SetClipY(Sint16 y) { return clip.y = y; } + Uint16 SetClipW(Uint16 w) { return clip.w = w; } + Uint16 SetClipH(Uint16 h) { return clip.h = h; } + + Sint16 GetClipX() const { return clip.x; } + Sint16 GetClipY() const { return clip.y; } + Uint16 GetClipW() const { return clip.w; } + Uint16 GetClipH() const { return clip.h; } + + bool GetLocal() const { return local; } + + void SetTransparentColor(Uint8 r, Uint8 g, Uint8 b); + void ClearTransparentColor(); +protected: + SDL_Surface* surface = nullptr; + SDL_Rect clip = {0, 0, 0, 0}; + bool local = false; +}; + +#endif diff --git a/src/graphics/makefile b/src/graphics/makefile new file mode 100644 index 0000000..a4efd0c --- /dev/null +++ b/src/graphics/makefile @@ -0,0 +1,37 @@ +#config +INCLUDES+=. +LIBS+= +CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) + +#source +CXXSRC=$(wildcard *.cpp) + +#objects +OBJDIR=obj +OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) + +#output +OUTDIR=.. +OUT=$(addprefix $(OUTDIR)/,libcommon.a) + +#targets +all: $(OBJ) $(OUT) + ar -crs $(OUT) $(OBJ) + +$(OBJ): | $(OBJDIR) + +$(OUT): | $(OUTDIR) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(OUTDIR): + mkdir $(OUTDIR) + +$(OBJDIR)/%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +clean: + $(RM) *.o *.a *.exe + +rebuild: clean all diff --git a/src/graphics/sprite_sheet.cpp b/src/graphics/sprite_sheet.cpp new file mode 100644 index 0000000..7726484 --- /dev/null +++ b/src/graphics/sprite_sheet.cpp @@ -0,0 +1,102 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "sprite_sheet.hpp" + +#include +#include + +void SpriteSheet::Update(double delta) { + if (delay && (tick += delta) >= delay) { + if (++xIndex >= xCount) { + xIndex = 0; + } + tick = 0; + } + image.SetClipX(xIndex * image.GetClipW()); + image.SetClipY(yIndex * image.GetClipH()); +} + +SDL_Surface* SpriteSheet::LoadSurface(std::string fname, Uint16 xCellCount, Uint16 yCellCount) { + image.LoadSurface(fname); + + xCount = xCellCount; + yCount = yCellCount; + + image.SetClipW(image.GetSurface()->w / xCount); + image.SetClipH(image.GetSurface()->h / yCount); + + xIndex = yIndex = 0; + delay = tick = 0.0; +} + +SDL_Surface* SpriteSheet::SetSurface(SDL_Surface* surface, Uint16 xCellCount, Uint16 yCellCount) { + image.SetSurface(surface); + + xCount = xCellCount; + yCount = yCellCount; + + image.SetClipW(image.GetSurface()->w / xCount); + image.SetClipH(image.GetSurface()->h / yCount); + + xIndex = yIndex = 0; + delay = tick = 0.0; +} + +void SpriteSheet::FreeSurface() { + image.FreeSurface(); + xCount = yCount = 0; + xIndex = yIndex = 0; + delay = tick = 0.0; +} + +Uint16 SpriteSheet::SetXCount(Uint16 i) { + xIndex = 0; + return xCount = i; +} + +Uint16 SpriteSheet::SetYCount(Uint16 i) { + yIndex = 0; + return yCount = i; +} + +Uint16 SpriteSheet::SetXIndex(Uint16 i) { + if (i > xCount) { + std::ostringstream os; + os << "Cannot set x index to " << i; + throw(std::invalid_argument(os.str())); + } + return xIndex = i; +} + +Uint16 SpriteSheet::SetYIndex(Uint16 i) { + if (i > yCount) { + std::ostringstream os; + os << "Cannot set y index to " << i; + throw(std::invalid_argument(os.str())); + } + return yIndex = i; +} + +double SpriteSheet::SetDelay(double d) { + tick = 0; + return delay = d; +} diff --git a/src/graphics/sprite_sheet.hpp b/src/graphics/sprite_sheet.hpp new file mode 100644 index 0000000..8ecaa5b --- /dev/null +++ b/src/graphics/sprite_sheet.hpp @@ -0,0 +1,66 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef SPRITESHEET_HPP_ +#define SPRITESHEET_HPP_ + +#include "image.hpp" + +class SpriteSheet { +public: + SpriteSheet() = default; + SpriteSheet(std::string fname, Uint16 xCellCount, Uint16 yCellCount) { LoadSurface(fname, xCellCount, yCellCount); } + SpriteSheet(SDL_Surface* surface, Uint16 xCellCount, Uint16 yCellCount) { SetSurface(surface, xCellCount, yCellCount); } + ~SpriteSheet() { FreeSurface(); }; + + void Update(double delta); + + SDL_Surface* LoadSurface(std::string fname, Uint16 xCellCount, Uint16 yCellCount); + SDL_Surface* SetSurface(SDL_Surface* surface, Uint16 xCellCount, Uint16 yCellCount); + SDL_Surface* GetSurface() { return image.GetSurface(); } + void FreeSurface(); + + void DrawTo(SDL_Surface* const dest, Sint16 x, Sint16 y) { image.DrawTo(dest, x, y); } + + //accessors and mutators + Image* GetImage() { return ℑ } //OO breaker + + Uint16 SetXCount(Uint16); + Uint16 SetYCount(Uint16); + Uint16 SetXIndex(Uint16); + Uint16 SetYIndex(Uint16); + + Uint16 GetXCount() const { return xCount; } + Uint16 GetYCount() const { return yCount; } + Uint16 GetXIndex() const { return xIndex; } + Uint16 GetYIndex() const { return yIndex; } + + double SetDelay(double d); + double GetDelay() const { return delay; } + +private: + Image image; + Uint16 xCount = 0, yCount = 0; //number of cells + Uint16 xIndex = 0, yIndex = 0; //current cell being drawn + double delay = 0.0, tick = 0.0; +}; + +#endif diff --git a/src/in_world.cpp b/src/in_world.cpp new file mode 100644 index 0000000..83b00ca --- /dev/null +++ b/src/in_world.cpp @@ -0,0 +1,249 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "in_world.hpp" + +#include "utility.hpp" +#include "check_bounds.hpp" + +#include "region_pager_api.hpp" +#include "tile_sheet_api.hpp" + +#include + +//------------------------- +//Public access members +//------------------------- + +InWorld::InWorld(lua_State* L): lua(L) { + //register the pager + lua_pushstring(lua, TORTUGA_REGION_PAGER_PSEUDO_INDEX); + lua_pushlightuserdata(lua, &pager); + lua_settable(L, LUA_REGISTRYINDEX); + + //register the tilesheet + lua_pushstring(lua, TORTUGA_TILE_SHEET_PSEUDO_INDEX); + lua_pushlightuserdata(lua, &tileSheet); + lua_settable(L, LUA_REGISTRYINDEX); + + //setup the component objecrs + pager.SetLuaState(lua); + + //get the config info + lua_getglobal(lua, "config"); + lua_getfield(lua, -1, "dir"); + lua_getfield(lua, -1, "fonts"); + std::string fonts = lua_tostring(lua, -1); + lua_getfield(lua, -2, "interface"); + std::string interface = lua_tostring(lua, -1); + lua_getfield(lua, -3, "sprites"); + std::string sprites = lua_tostring(lua, -1); + lua_getfield(lua, -4, "scripts"); + std::string scripts = lua_tostring(lua, -1); + lua_pop(lua, 6); + + //run the additional scripts + if (luaL_dofile(lua, (scripts + "in_world.lua").c_str())) { + throw(std::runtime_error(std::string() + "Failed to run in_world.lua: " + lua_tostring(lua, -1) )); + } + + //setup the utility objects + buttonImage.LoadSurface(interface + "button_menu.bmp"); + buttonImage.SetClipH(buttonImage.GetClipH()/3); + font.LoadSurface(fonts + "pk_white_8.bmp"); + + //pass the utility objects + backButton.SetImage(&buttonImage); + backButton.SetFont(&font); + + //set the button positions + backButton.SetX(50); + backButton.SetY(50 + buttonImage.GetClipH() * 0); + + //set the button texts + backButton.SetText("Back"); + + //entities + character.GetSprite()->LoadSurface(sprites + "elliot2.bmp", 4, 4); + + //setup the camera + camera.margin.x = GetScreen()->w / 2 - character.GetSprite()->GetImage()->GetClipW() / 2; + camera.margin.y = GetScreen()->h / 2 - character.GetSprite()->GetImage()->GetClipH() / 2; + + //debug + // +} + +InWorld::~InWorld() { + //unregister the map components + lua_pushstring(lua, TORTUGA_REGION_PAGER_PSEUDO_INDEX); + lua_pushstring(lua, TORTUGA_TILE_SHEET_PSEUDO_INDEX); + lua_pushnil(lua); + lua_settable(lua, LUA_REGISTRYINDEX); + lua_pushnil(lua); + lua_settable(lua, LUA_REGISTRYINDEX); +} + +//------------------------- +//Frame loop +//------------------------- + +void InWorld::FrameStart() { + // +} + +void InWorld::Update(double delta) { + //update the entities + character.Update(delta); + + //check for collisions + for (int i = -6; i < 6; ++i) { + for (int j = -6; j < 6; ++j) { + Vector2 wallPoint = { + snapToBase(32.0, character.GetOrigin().x), + snapToBase(32.0, character.GetOrigin().y) + }; + wallPoint.x += i * 32; + wallPoint.y += j * 32; + + if (!pager.GetSolid(wallPoint.x / 32.0, wallPoint.y / 32.0)) { + continue; + } + + if (checkOverlap(character.GetOrigin(), character.GetBounds(), wallPoint, {32.0, 32.0})) { + std::cout << "1"; + } + } + } + + //update the camera + camera.origin.x = character.GetOrigin().x - camera.margin.x; + camera.origin.y = character.GetOrigin().y - camera.margin.y; + + //TODO: prune distant regions + + //summon nearby unloaded regions + const int left = snapToBase(REGION_WIDTH, camera.origin.x / tileSheet.GetTileW()); + const int top = snapToBase(REGION_HEIGHT, camera.origin.y / tileSheet.GetTileH()); + const int right = snapToBase(REGION_WIDTH, (camera.origin.x + GetScreen()->w) / tileSheet.GetTileW()); + const int bottom = snapToBase(REGION_HEIGHT, (camera.origin.y + GetScreen()->h) / tileSheet.GetTileH()); + + for (int i = left - REGION_WIDTH; i <= right + REGION_WIDTH; i += REGION_WIDTH) { + for (int j = top - REGION_HEIGHT; j <= bottom + REGION_HEIGHT; j += REGION_HEIGHT) { + pager.GetRegion(i, j); + } + } +} + +void InWorld::FrameEnd() { + // +} + +void InWorld::RenderFrame() { +// SDL_FillRect(GetScreen(), 0, 0); + Render(GetScreen()); + SDL_Flip(GetScreen()); + fps.Calculate(); +} + +void InWorld::Render(SDL_Surface* const screen) { + //draw all regions + for (std::list::iterator it = pager.GetContainer()->begin(); it != pager.GetContainer()->end(); it++) { + tileSheet.DrawRegionTo(screen, &(*it), camera.origin.x, camera.origin.y); + } + + //draw the characters + character.DrawTo(screen, camera.origin.x, camera.origin.y); + + //draw the UI + backButton.DrawTo(screen); + font.DrawStringTo(to_string_custom(fps.GetFrameRate()), screen, 0, 0); +} + +//------------------------- +//Event handlers +//------------------------- + +void InWorld::QuitEvent() { + //exit the game + SetNextScene(SceneList::QUIT); +} + +void InWorld::MouseMotion(SDL_MouseMotionEvent const& motion) { + backButton.MouseMotion(motion); +} + +void InWorld::MouseButtonDown(SDL_MouseButtonEvent const& button) { + backButton.MouseButtonDown(button); +} + +void InWorld::MouseButtonUp(SDL_MouseButtonEvent const& button) { + if (backButton.MouseButtonUp(button) == Button::State::HOVER) { + SetNextScene(SceneList::MAINMENU); + } +} + +void InWorld::KeyDown(SDL_KeyboardEvent const& key) { + //player movement + Vector2 motion = character.GetMotion(); + switch(key.keysym.sym) { + case SDLK_LEFT: + motion.x -= CHARACTER_WALKING_SPEED; + break; + case SDLK_RIGHT: + motion.x += CHARACTER_WALKING_SPEED; + break; + case SDLK_UP: + motion.y -= CHARACTER_WALKING_SPEED; + break; + case SDLK_DOWN: + motion.y += CHARACTER_WALKING_SPEED; + break; + } + if (character.GetMotion() != motion) { + character.SetMotion(motion); + character.CorrectSprite(); + } +} + +void InWorld::KeyUp(SDL_KeyboardEvent const& key) { + //player movement + Vector2 motion = character.GetMotion(); + switch(key.keysym.sym) { + //NOTE: The use of min/max here are to prevent awkward movements + case SDLK_LEFT: + motion.x = std::min(motion.x + CHARACTER_WALKING_SPEED, 0.0); + break; + case SDLK_RIGHT: + motion.x = std::max(motion.x - CHARACTER_WALKING_SPEED, 0.0); + break; + case SDLK_UP: + motion.y = std::min(motion.y + CHARACTER_WALKING_SPEED, 0.0); + break; + case SDLK_DOWN: + motion.y = std::max(motion.y - CHARACTER_WALKING_SPEED, 0.0); + break; + } + if (character.GetMotion() != motion) { + character.SetMotion(motion); + character.CorrectSprite(); + } +} diff --git a/src/in_world.hpp b/src/in_world.hpp new file mode 100644 index 0000000..8dddbb7 --- /dev/null +++ b/src/in_world.hpp @@ -0,0 +1,93 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef INWORLD_HPP_ +#define INWORLD_HPP_ + +//graphics & ui +#include "image.hpp" +#include "raster_font.hpp" +#include "button.hpp" + +//map stuff +#include "tile_sheet.hpp" +#include "region_pager_lua.hpp" + +//entities +#include "character.hpp" + +//utilities +#include "frame_rate.hpp" + +//framework +#include "base_scene.hpp" + +//APIs +#include "lua/lua.hpp" + +class InWorld : public BaseScene { +public: + //Public access members + InWorld(lua_State* L); + ~InWorld(); + +protected: + //Frame loop + void FrameStart(); + void Update(double delta); + void FrameEnd(); + void RenderFrame(); + void Render(SDL_Surface* const); + + //Event handlers + void QuitEvent(); + void MouseMotion(SDL_MouseMotionEvent const&); + void MouseButtonDown(SDL_MouseButtonEvent const&); + void MouseButtonUp(SDL_MouseButtonEvent const&); + void KeyDown(SDL_KeyboardEvent const&); + void KeyUp(SDL_KeyboardEvent const&); + + struct { + struct { + int x, y; + }origin, margin; + }camera; + + //shared parameters + lua_State* lua = nullptr; + + //graphics + Image buttonImage; + RasterFont font; + + //map stuff + TileSheet tileSheet; + RegionPagerLua pager; + + //entities + Character character; + + //UI + Button backButton; + FrameRate fps; +}; + +#endif diff --git a/src/linit.cpp b/src/linit.cpp new file mode 100644 index 0000000..eef8367 --- /dev/null +++ b/src/linit.cpp @@ -0,0 +1,85 @@ +/* $Id: linit.c,v 1.32, modified + * Initialization of libraries for lua.c and other clients + * See Copyright Notice in lua.h + * + * If you embed Lua in your program and need to open the standard + * libraries, call luaL_openlibs in your program. If you need a + * different set of libraries, copy this file to your project and edit + * it to suit your needs. + * + * Modified for use in Tortuga, renamed to linit.cpp + * Modifications are released under the zlib license: + * + * Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#define linit_c +#define LUA_LIB + +#include "lua/lua.hpp" + +#include "region_api.hpp" +#include "region_pager_api.hpp" +#include "tile_sheet_api.hpp" + +//these libs are loaded by lua.c and are readily available to any Lua program +static const luaL_Reg loadedlibs[] = { + //Standard libs + {"_G", luaopen_base}, + {LUA_LOADLIBNAME, luaopen_package}, + {LUA_COLIBNAME, luaopen_coroutine}, + {LUA_TABLIBNAME, luaopen_table}, + {LUA_IOLIBNAME, luaopen_io}, + {LUA_OSLIBNAME, luaopen_os}, + {LUA_STRLIBNAME, luaopen_string}, + {LUA_BITLIBNAME, luaopen_bit32}, + {LUA_MATHLIBNAME, luaopen_math}, + {LUA_DBLIBNAME, luaopen_debug}, + + //Tortuga's API + {TORTUGA_REGION_NAME, openRegionAPI}, + {TORTUGA_REGION_PAGER_NAME, openRegionPagerAPI}, + {TORTUGA_TILE_SHEET_NAME, openTileSheetAPI}, + + {NULL, NULL} +}; + + +//these libs are preloaded and must be required before used +static const luaL_Reg preloadedlibs[] = { + {NULL, NULL} +}; + +LUALIB_API void luaL_openlibs (lua_State *L) { + const luaL_Reg *lib; + //call open functions from 'loadedlibs' and set results to global table + for (lib = loadedlibs; lib->func; lib++) { + luaL_requiref(L, lib->name, lib->func, 1); + lua_pop(L, 1); //remove lib + } + //add open functions from 'preloadedlibs' into 'package.preload' table + luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD"); + for (lib = preloadedlibs; lib->func; lib++) { + lua_pushcfunction(L, lib->func); + lua_setfield(L, -2, lib->name); + } + lua_pop(L, 1); //remove _PRELOAD table +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..4a02c27 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,41 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "application.hpp" + +#include +#include + +using namespace std; + +int main(int argc, char** argv) { + try { + Application app; + app.Init(argc, argv); + app.Proc(); + app.Quit(); + } + catch(exception& e) { + cerr << "Fatal exception thrown: " << e.what() << endl; + return 1; + } + return 0; +} diff --git a/src/main_menu.cpp b/src/main_menu.cpp new file mode 100644 index 0000000..bfe63ec --- /dev/null +++ b/src/main_menu.cpp @@ -0,0 +1,128 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "main_menu.hpp" + +//------------------------- +//Public access members +//------------------------- + +MainMenu::MainMenu(lua_State* L): lua(L) { + //get the config info + lua_getglobal(lua, "config"); + lua_getfield(lua, -1, "dir"); + lua_getfield(lua, -1, "interface"); + std::string interface = lua_tostring(lua, -1); + lua_getfield(lua, -2, "fonts"); + std::string fonts = lua_tostring(lua, -1); + lua_pop(lua, 4); + + //setup the utility objects + image.LoadSurface(interface + "button_menu.bmp"); + image.SetClipH(image.GetClipH()/3); + font.LoadSurface(fonts + "pk_white_8.bmp"); + + //pass the utility objects + startButton.SetImage(&image); + startButton.SetFont(&font); + optionsButton.SetImage(&image); + optionsButton.SetFont(&font); + quitButton.SetImage(&image); + quitButton.SetFont(&font); + + //set the button positions + startButton.SetX(50); + startButton.SetY(50 + image.GetClipH() * 0); + optionsButton.SetX(50); + optionsButton.SetY(50 + image.GetClipH() * 1); + quitButton.SetX(50); + quitButton.SetY(50 + image.GetClipH() * 2); + + //set the button texts + startButton.SetText("Start"); + optionsButton.SetText("Options"); + quitButton.SetText("Quit"); + + //debug + // +} + +MainMenu::~MainMenu() { + // +} + +//------------------------- +//Frame loop +//------------------------- + +void MainMenu::FrameStart() { + // +} + +void MainMenu::Update(double delta) { + // +} + +void MainMenu::FrameEnd() { + // +} + +void MainMenu::Render(SDL_Surface* const screen) { + startButton.DrawTo(screen); + optionsButton.DrawTo(screen); + quitButton.DrawTo(screen); +} + +//------------------------- +//Event handlers +//------------------------- + +void MainMenu::MouseMotion(SDL_MouseMotionEvent const& motion) { + startButton.MouseMotion(motion); + optionsButton.MouseMotion(motion); + quitButton.MouseMotion(motion); +} + +void MainMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) { + startButton.MouseButtonDown(button); + optionsButton.MouseButtonDown(button); + quitButton.MouseButtonDown(button); +} + +void MainMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { + if (startButton.MouseButtonUp(button) == Button::State::HOVER) { + SetNextScene(SceneList::INWORLD); + } + if (optionsButton.MouseButtonUp(button) == Button::State::HOVER) { + SetNextScene(SceneList::OPTIONSMENU); + } + if (quitButton.MouseButtonUp(button) == Button::State::HOVER) { + QuitEvent(); + } +} + +void MainMenu::KeyDown(SDL_KeyboardEvent const& key) { + // +} + +void MainMenu::KeyUp(SDL_KeyboardEvent const& key) { + // +} diff --git a/src/main_menu.hpp b/src/main_menu.hpp new file mode 100644 index 0000000..f163501 --- /dev/null +++ b/src/main_menu.hpp @@ -0,0 +1,64 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef MAINMENU_HPP_ +#define MAINMENU_HPP_ + +#include "base_scene.hpp" + +#include "image.hpp" +#include "raster_font.hpp" +#include "button.hpp" + +#include "lua/lua.hpp" + +class MainMenu : public BaseScene { +public: + //Public access members + MainMenu(lua_State* L); + ~MainMenu(); + +protected: + //Frame loop + void FrameStart(); + void Update(double delta); + void FrameEnd(); + void Render(SDL_Surface* const); + + //Event handlers + void MouseMotion(SDL_MouseMotionEvent const&); + void MouseButtonDown(SDL_MouseButtonEvent const&); + void MouseButtonUp(SDL_MouseButtonEvent const&); + void KeyDown(SDL_KeyboardEvent const&); + void KeyUp(SDL_KeyboardEvent const&); + + //shared parameters + lua_State* lua = nullptr; + + //members + Image image; + RasterFont font; + Button startButton; + Button optionsButton; + Button quitButton; +}; + +#endif diff --git a/src/makefile b/src/makefile new file mode 100644 index 0000000..ac5fdd9 --- /dev/null +++ b/src/makefile @@ -0,0 +1,41 @@ +#config +INCLUDES+=. graphics map ui utilities +LIBS+=libcommon.a -lmingw32 -lSDLmain -lSDL -llua +CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) + +#source +CXXSRC=$(wildcard *.cpp) + +#objects +OBJDIR=obj +OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) + +#output +OUTDIR=../out +OUT=$(addprefix $(OUTDIR)/,jam) + +#targets +all: $(OBJ) $(OUT) + $(MAKE) -C graphics + $(MAKE) -C map + $(MAKE) -C ui + $(MAKE) -C utilities + $(CXX) $(CXXFLAGS) -o $(OUT) $(OBJ) $(LIBS) + +$(OBJ): | $(OBJDIR) + +$(OUT): | $(OUTDIR) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(OUTDIR): + mkdir $(OUTDIR) + +$(OBJDIR)/%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +clean: + $(RM) *.o *.a *.exe + +rebuild: clean all diff --git a/src/map/makefile b/src/map/makefile new file mode 100644 index 0000000..fe77b24 --- /dev/null +++ b/src/map/makefile @@ -0,0 +1,37 @@ +#config +INCLUDES+=. ../graphics ../utilities +LIBS+= +CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) + +#source +CXXSRC=$(wildcard *.cpp) + +#objects +OBJDIR=obj +OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) + +#output +OUTDIR=.. +OUT=$(addprefix $(OUTDIR)/,libcommon.a) + +#targets +all: $(OBJ) $(OUT) + ar -crs $(OUT) $(OBJ) + +$(OBJ): | $(OBJDIR) + +$(OUT): | $(OUTDIR) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(OUTDIR): + mkdir $(OUTDIR) + +$(OBJDIR)/%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +clean: + $(RM) *.o *.a *.exe + +rebuild: clean all diff --git a/src/map/region.cpp b/src/map/region.cpp new file mode 100644 index 0000000..c4fb712 --- /dev/null +++ b/src/map/region.cpp @@ -0,0 +1,55 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "region.hpp" + +#include "utility.hpp" + +#include +#include + +Region::Region(int argX, int argY): x(argX), y(argY) { + if (x != snapToBase(REGION_WIDTH, x) || y != snapToBase(REGION_HEIGHT, y)) { + throw(std::invalid_argument("Region location is off grid")); + } + memset(tiles, 0, REGION_WIDTH*REGION_HEIGHT*REGION_DEPTH*sizeof(type_t)); +} + +Region::Region(Region const& rhs): x(rhs.x), y(rhs.y) { + memcpy(tiles, rhs.tiles, REGION_WIDTH*REGION_HEIGHT*REGION_DEPTH*sizeof(type_t)); + solid = rhs.solid; +} + +Region::type_t Region::SetTile(int x, int y, int z, type_t v) { + return tiles[x][y][z] = v; +} + +Region::type_t Region::GetTile(int x, int y, int z) { + return tiles[x][y][z]; +} + +bool Region::SetSolid(int x, int y, bool b) { + return solid[x * REGION_WIDTH + y] = b; +} + +bool Region::GetSolid(int x, int y) { + return solid[x * REGION_WIDTH + y]; +} \ No newline at end of file diff --git a/src/map/region.hpp b/src/map/region.hpp new file mode 100644 index 0000000..0571c09 --- /dev/null +++ b/src/map/region.hpp @@ -0,0 +1,67 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef REGION_HPP_ +#define REGION_HPP_ + +#include +#include + +//the region's storage format +constexpr int REGION_WIDTH = 20; +constexpr int REGION_HEIGHT = 20; +constexpr int REGION_DEPTH = 3; + +//the size of the solid map +constexpr int REGION_SOLID_FOOTPRINT = ceil(REGION_WIDTH * REGION_HEIGHT / 8.0); + +class Region { +public: + typedef unsigned char type_t; + + Region() = delete; + Region(int x, int y); + Region(Region const&); + ~Region() = default; + + type_t SetTile(int x, int y, int z, type_t v); + type_t GetTile(int x, int y, int z); + + bool SetSolid(int x, int y, bool b); + bool GetSolid(int x, int y); + + //accessors + int GetX() const { return x; } + int GetY() const { return y; } + + std::bitset* GetSolidBitset() { return &solid; } +private: + const int x; + const int y; + + type_t tiles[REGION_WIDTH][REGION_HEIGHT][REGION_DEPTH]; + std::bitset solid; +}; + +//the memory footprint of the tile and solid data; not including any metadata +constexpr int REGION_FOOTPRINT = REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizeof(Region::type_t) + REGION_SOLID_FOOTPRINT; + +#endif diff --git a/src/map/region_api.cpp b/src/map/region_api.cpp new file mode 100644 index 0000000..2fd3dbb --- /dev/null +++ b/src/map/region_api.cpp @@ -0,0 +1,122 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "region_api.hpp" + +#include "region.hpp" + +static int setTile(lua_State* L) { + Region* region = reinterpret_cast(lua_touserdata(L, 1)); + int ret = region->SetTile(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_tointeger(L, 4)-1, lua_tointeger(L, 5)); + lua_pushinteger(L, ret); + return 1; +} + +static int getTile(lua_State* L) { + Region* region = reinterpret_cast(lua_touserdata(L, 1)); + int ret = region->GetTile(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_tointeger(L, 4)-1); + lua_pushinteger(L, ret); + return 1; +} + +static int setSolid(lua_State* L) { + Region* region = reinterpret_cast(lua_touserdata(L, 1)); + bool ret = region->SetSolid(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1, lua_toboolean(L, 4)); + lua_pushboolean(L, ret); + return 1; +} + +static int getSolid(lua_State* L) { + Region* region = reinterpret_cast(lua_touserdata(L, 1)); + bool ret = region->GetSolid(lua_tointeger(L, 2)-1, lua_tointeger(L, 3)-1); + lua_pushboolean(L, ret); + return 1; +} + +static int getX(lua_State* L) { + Region* region = reinterpret_cast(lua_touserdata(L, 1)); + lua_pushinteger(L, region->GetX()); + return 1; +} + +static int getY(lua_State* L) { + Region* region = reinterpret_cast(lua_touserdata(L, 1)); + lua_pushinteger(L, region->GetY()); + return 1; +} + +static int getWidth(lua_State* L) { + lua_pushinteger(L, REGION_WIDTH); + return 1; +} + +static int getHeight(lua_State* L) { + lua_pushinteger(L, REGION_HEIGHT); + return 1; +} + +static int getDepth(lua_State* L) { + lua_pushinteger(L, REGION_DEPTH); + return 1; +} + +static int load(lua_State* L) { + //EMPTY + lua_pushboolean(L, false); + return 1; +} + +static int save(lua_State* L) { + //EMPTY + return 0; +} + +static int create(lua_State* L) { + //EMPTY + return 0; +} + +static int unload(lua_State* L) { + //EMPTY + return 0; +} + +static const luaL_Reg regionLib[] = { + {"SetTile",setTile}, + {"GetTile",getTile}, + {"SetSolid",setSolid}, + {"GetSolid",getSolid}, + {"GetX",getX}, + {"GetY",getY}, + {"GetWidth",getWidth}, + {"GetHeight",getHeight}, + {"GetDepth",getDepth}, + {"Load",load}, + {"Save",save}, + {"Create",create}, + {"Unload",unload}, + {nullptr, nullptr} +}; + +LUAMOD_API int openRegionAPI(lua_State* L) { + luaL_newlib(L, regionLib); + return 1; +} \ No newline at end of file diff --git a/src/map/region_api.hpp b/src/map/region_api.hpp new file mode 100644 index 0000000..6e6733f --- /dev/null +++ b/src/map/region_api.hpp @@ -0,0 +1,30 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef REGIONAPI_HPP_ +#define REGIONAPI_HPP_ + +#include "lua/lua.hpp" + +#define TORTUGA_REGION_NAME "Region" +LUAMOD_API int openRegionAPI(lua_State* L); + +#endif diff --git a/src/map/region_pager_api.cpp b/src/map/region_pager_api.cpp new file mode 100644 index 0000000..cc8c3d1 --- /dev/null +++ b/src/map/region_pager_api.cpp @@ -0,0 +1,115 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "region_pager_api.hpp" + +#include "region_pager_lua.hpp" +#include "region.hpp" + +#include + +static int getRegionPager(lua_State* L) { + lua_pushstring(L, TORTUGA_REGION_PAGER_PSEUDO_INDEX); + lua_gettable(L, LUA_REGISTRYINDEX); +} + +//DOCS: These glue functions simply wrap RegionPagerLua's methods + +static int setTile(lua_State* L) { + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); + int ret = pager->SetTile(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4), lua_tointeger(L, 5)); + lua_pushinteger(L, ret); + return 1; +} + +static int getTile(lua_State* L) { + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); + int ret = pager->GetTile(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4)); + lua_pushinteger(L, ret); + return 1; +} + +static int setSolid(lua_State* L) { + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); + bool ret = pager->SetSolid(lua_tointeger(L, 2), lua_tointeger(L, 3), lua_toboolean(L, 4)); + lua_pushboolean(L, ret); + return 1; +} + +static int getSolid(lua_State* L) { + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); + bool ret = pager->GetSolid(lua_tointeger(L, 2), lua_tointeger(L, 3)); + lua_pushboolean(L, ret); + return 1; +} + +static int getRegion(lua_State* L) { + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); + Region* region = pager->GetRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); + lua_pushlightuserdata(L, region); + return 1; +} + +static int loadRegion(lua_State* L) { + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); + Region* region = pager->LoadRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); + lua_pushlightuserdata(L, region); + return 1; +} + +static int saveRegion(lua_State* L) { + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); + Region* region = pager->SaveRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); + lua_pushlightuserdata(L, region); + return 1; +} + +static int createRegion(lua_State* L) { + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); + Region* region = pager->CreateRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); + lua_pushlightuserdata(L, region); + return 1; +} + +static int unloadRegion(lua_State* L) { + RegionPagerLua* pager = reinterpret_cast(lua_touserdata(L, 1)); + pager->UnloadRegion(lua_tointeger(L, 2), lua_tointeger(L, 3)); + return 0; +} + +static const luaL_Reg regionPagerLib[] = { + {"GetRegionPager", getRegionPager}, + {"SetTile", setTile}, + {"GetTile", getTile}, + {"SetSolid", setSolid}, + {"GetSolid", getSolid}, + {"GetRegion", getRegion}, + {"LoadRegion", loadRegion}, + {"SaveRegion", saveRegion}, + {"CreateRegion", createRegion}, + {"UnloadRegion", unloadRegion}, + {nullptr, nullptr} +}; + +LUAMOD_API int openRegionPagerAPI(lua_State* L) { + luaL_newlib(L, regionPagerLib); + return 1; +} \ No newline at end of file diff --git a/src/map/region_pager_api.hpp b/src/map/region_pager_api.hpp new file mode 100644 index 0000000..56a7cec --- /dev/null +++ b/src/map/region_pager_api.hpp @@ -0,0 +1,31 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef REGIONPAGERAPI_HPP_ +#define REGIONPAGERAPI_HPP_ + +#include "lua/lua.hpp" + +#define TORTUGA_REGION_PAGER_PSEUDO_INDEX "RegionPagerPseudoIndex" +#define TORTUGA_REGION_PAGER_NAME "RegionPager" +LUAMOD_API int openRegionPagerAPI(lua_State* L); + +#endif diff --git a/src/map/region_pager_base.cpp b/src/map/region_pager_base.cpp new file mode 100644 index 0000000..8c31df1 --- /dev/null +++ b/src/map/region_pager_base.cpp @@ -0,0 +1,100 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "region_pager_base.hpp" + +#include "utility.hpp" + +#include +#include + +Region::type_t RegionPagerBase::SetTile(int x, int y, int z, Region::type_t v) { + Region* ptr = GetRegion(x, y); + return ptr->SetTile(x - ptr->GetX(), y - ptr->GetY(), z, v); +} + +Region::type_t RegionPagerBase::GetTile(int x, int y, int z) { + Region* ptr = GetRegion(x, y); + return ptr->GetTile(x - ptr->GetX(), y - ptr->GetY(), z); +} + +bool RegionPagerBase::SetSolid(int x, int y, int b) { + Region* ptr = GetRegion(x, y); + return ptr->SetSolid(x - ptr->GetX(), y - ptr->GetY(), b); +} + +bool RegionPagerBase::GetSolid(int x, int y) { + Region* ptr = GetRegion(x, y); + return ptr->GetSolid(x - ptr->GetX(), y - ptr->GetY()); +} + +Region* RegionPagerBase::GetRegion(int x, int y) { + x = snapToBase(REGION_WIDTH, x); + y = snapToBase(REGION_HEIGHT, y); + + //get the region by various means + Region* ptr = nullptr; + ptr = FindRegion(x, y); + if (ptr) return ptr; + ptr = LoadRegion(x, y); + if (ptr) return ptr; + return CreateRegion(x, y); +} + +Region* RegionPagerBase::FindRegion(int x, int y) { + //find the region + std::list::iterator it = find_if(regionList.begin(), regionList.end(), [x, y](Region& region) -> bool { + return region.GetX() == x && region.GetY() == y; + }); + return it != regionList.end() ? &(*it) : nullptr; +} + +Region* RegionPagerBase::PushRegion(Region* const ptr) { + regionList.push_front(*ptr); + return ®ionList.front(); +} + +Region* RegionPagerBase::LoadRegion(int x, int y) { + //TODO: load the region if possible + return nullptr; +} + +Region* RegionPagerBase::SaveRegion(int x, int y) { + //TODO: find & save the region + return nullptr; +} + +Region* RegionPagerBase::CreateRegion(int x, int y) { + if (FindRegion(x, y)) { + throw(std::logic_error("Cannot overwrite an existing region")); + } + regionList.emplace_front(x, y); + return ®ionList.front(); +} + +void RegionPagerBase::UnloadRegion(int x, int y) { + //custom loop, not FindRegion() + regionList.remove_if([x, y](Region& region) -> bool { return region.GetX() == x && region.GetY() == y; }); +} + +void RegionPagerBase::UnloadAll() { + regionList.clear(); +} \ No newline at end of file diff --git a/src/map/region_pager_base.hpp b/src/map/region_pager_base.hpp new file mode 100644 index 0000000..53bb097 --- /dev/null +++ b/src/map/region_pager_base.hpp @@ -0,0 +1,60 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef REGIONPAGERBASE_HPP_ +#define REGIONPAGERBASE_HPP_ + +#include "region.hpp" + +#include + +class RegionPagerBase { +public: + RegionPagerBase() = default; + virtual ~RegionPagerBase() { UnloadAll(); }; + + //tile manipulation + virtual Region::type_t SetTile(int x, int y, int z, Region::type_t v); + virtual Region::type_t GetTile(int x, int y, int z); + + //solid manipulation + virtual bool SetSolid(int x, int y, int b); + virtual bool GetSolid(int x, int y); + + //region manipulation + virtual Region* GetRegion(int x, int y); + virtual Region* FindRegion(int x, int y); + virtual Region* PushRegion(Region* const); + + virtual Region* LoadRegion(int x, int y); + virtual Region* SaveRegion(int x, int y); + virtual Region* CreateRegion(int x, int y); + virtual void UnloadRegion(int x, int y); + + virtual void UnloadAll(); + + //accessors & mutators + std::list* GetContainer() { return ®ionList; } +protected: + std::list regionList; +}; + +#endif diff --git a/src/map/region_pager_lua.cpp b/src/map/region_pager_lua.cpp new file mode 100644 index 0000000..368f950 --- /dev/null +++ b/src/map/region_pager_lua.cpp @@ -0,0 +1,123 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "region_pager_lua.hpp" + +#include "utility.hpp" + +#include + +Region* RegionPagerLua::LoadRegion(int x, int y) { + //load the region if possible + + //something to work on + Region tmpRegion(x, y); + + //API hook + lua_getglobal(lua, "Region"); + lua_getfield(lua, -1, "Load"); + lua_pushlightuserdata(lua, &tmpRegion); + if (lua_pcall(lua, 1, 1, 0) != LUA_OK) { + throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) )); + } + //success or failure + if (!lua_toboolean(lua, -1)) { + lua_pop(lua, 2); + return nullptr; + } + lua_pop(lua, 2); + regionList.push_front(tmpRegion); + return ®ionList.front(); +} + +Region* RegionPagerLua::SaveRegion(int x, int y) { + //find & save the region + Region* ptr = FindRegion(x, y); + if (ptr) { + //API hook + lua_getglobal(lua, "Region"); + lua_getfield(lua, -1, "Save"); + lua_pushlightuserdata(lua, ptr); + if (lua_pcall(lua, 1, 0, 0) != LUA_OK) { + throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) )); + } + lua_pop(lua, 1); + } + return ptr; +} + +Region* RegionPagerLua::CreateRegion(int x, int y) { + if (FindRegion(x, y)) { + throw(std::logic_error("Cannot overwrite an existing region")); + } + + //something to work on + Region tmpRegion(x, y); + + //API hook + lua_getglobal(lua, "Region"); + lua_getfield(lua, -1, "Create"); + lua_pushlightuserdata(lua, &tmpRegion); + //TODO: parameters + if (lua_pcall(lua, 1, 0, 0) != LUA_OK) { + throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) )); + } + lua_pop(lua, 1); + regionList.push_front(tmpRegion); + return ®ionList.front(); +} + +void RegionPagerLua::UnloadRegion(int x, int y) { + lua_getglobal(lua, "Region"); + + regionList.remove_if([&](Region& region) -> bool { + if (region.GetX() == x && region.GetY() == y) { + + //API hook + lua_getfield(lua, -1, "Unload"); + lua_pushlightuserdata(lua, ®ion); + if (lua_pcall(lua, 1, 0, 0) != LUA_OK) { + throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) )); + } + + return true; + } + return false; + }); + + lua_pop(lua, 1); +} + +void RegionPagerLua::UnloadAll() { + lua_getglobal(lua, "Region"); + + for (auto& it : regionList) { + //API hook + lua_getfield(lua, -1, "Unload"); + lua_pushlightuserdata(lua, &it); + if (lua_pcall(lua, 1, 0, 0) != LUA_OK) { + throw(std::runtime_error(std::string() + "Lua error: " + lua_tostring(lua, -1) )); + } + } + + lua_pop(lua, 1); + regionList.clear(); +} \ No newline at end of file diff --git a/src/map/region_pager_lua.hpp b/src/map/region_pager_lua.hpp new file mode 100644 index 0000000..8543e2d --- /dev/null +++ b/src/map/region_pager_lua.hpp @@ -0,0 +1,51 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef REGIONPAGERLUA_HPP_ +#define REGIONPAGERLUA_HPP_ + +#include "region_pager_base.hpp" + +#include "lua/lua.hpp" + +#include + +class RegionPagerLua : public RegionPagerBase { +public: + RegionPagerLua() = default; + ~RegionPagerLua() = default; + + //region manipulation + Region* LoadRegion(int x, int y) override; + Region* SaveRegion(int x, int y) override; + Region* CreateRegion(int x, int y) override; + void UnloadRegion(int x, int y) override; + + void UnloadAll() override; + + //accessors & mutators + lua_State* SetLuaState(lua_State* L) { return lua = L; } + lua_State* GetLuaState() { return lua; } +protected: + lua_State* lua = nullptr; +}; + +#endif diff --git a/src/map/tile_sheet.cpp b/src/map/tile_sheet.cpp new file mode 100644 index 0000000..819d709 --- /dev/null +++ b/src/map/tile_sheet.cpp @@ -0,0 +1,61 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "tile_sheet.hpp" + +void TileSheet::Load(std::string fname, int tileWidth, int tileHeight) { + image.LoadSurface(fname); + image.SetClipW(tileWidth); + image.SetClipH(tileHeight); + xCount = image.GetSurface()->w / image.GetClipW(); + yCount = image.GetSurface()->h / image.GetClipH(); +} + +void TileSheet::Unload() { + image.FreeSurface(); + xCount = yCount = 0; +} + +void TileSheet::DrawTileTo(SDL_Surface* const dest, int x, int y, Region::type_t tile) { + //0 is invisible + if (tile == 0) return; + image.SetClipX((tile-1) % xCount * image.GetClipW()); + image.SetClipY((tile-1) / xCount * image.GetClipH()); + image.DrawTo(dest, x, y); +} + +void TileSheet::DrawRegionTo(SDL_Surface* const dest, Region* const region, int camX, int camY) { + Region::type_t tile = 0; + for (register int i = 0; i < REGION_WIDTH; ++i) { + for (register int j = 0; j < REGION_HEIGHT; ++j) { + for (register int k = 0; k < REGION_DEPTH; ++k) { + tile = region->GetTile(i, j, k); + //0 is invisible + if (tile == 0) continue; + image.SetClipX((tile-1) % xCount * image.GetClipW()); + image.SetClipY((tile-1) / xCount * image.GetClipH()); + image.DrawTo(dest, + (region->GetX() + i) * image.GetClipW() - camX, + (region->GetY() + j) * image.GetClipH() - camY); + } + } + } +} \ No newline at end of file diff --git a/src/map/tile_sheet.hpp b/src/map/tile_sheet.hpp new file mode 100644 index 0000000..f9bf8ea --- /dev/null +++ b/src/map/tile_sheet.hpp @@ -0,0 +1,54 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef TILESHEET_HPP_ +#define TILESHEET_HPP_ + +#include "region.hpp" + +#include "image.hpp" + +#include + +class TileSheet { +public: + TileSheet() = default; + TileSheet(std::string f, int w, int h) { Load(f, w, h); } + ~TileSheet() = default; + + void Load(std::string fname, int tileWidth, int tileHeight); + void Unload(); + + void DrawTileTo(SDL_Surface* const dest, int x, int y, Region::type_t tile); + void DrawRegionTo(SDL_Surface* const dest, Region* const region, int camX, int camY); + + //accessors + Image* GetImage() { return ℑ } + int GetXCount() { return xCount; } + int GetYCount() { return yCount; } + int GetTileW() { return image.GetClipW(); } + int GetTileH() { return image.GetClipH(); } +private: + Image image; + int xCount = 0, yCount = 0; +}; + +#endif diff --git a/src/map/tile_sheet_api.cpp b/src/map/tile_sheet_api.cpp new file mode 100644 index 0000000..496dd16 --- /dev/null +++ b/src/map/tile_sheet_api.cpp @@ -0,0 +1,82 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "tile_sheet_api.hpp" + +#include "tile_sheet.hpp" + +static int getTileSheet(lua_State* L) { + lua_pushstring(L, TORTUGA_TILE_SHEET_PSEUDO_INDEX); + lua_gettable(L, LUA_REGISTRYINDEX); + return 1; +} + +static int load(lua_State* L) { + TileSheet* sheet = reinterpret_cast(lua_touserdata(L, 1)); + sheet->Load(lua_tostring(L, 2), lua_tointeger(L, 3), lua_tointeger(L, 4)); + return 0; +} + +static int unload(lua_State* L) { + TileSheet* sheet = reinterpret_cast(lua_touserdata(L, 1)); + sheet->Unload(); + return 0; +} + +static int getXCount(lua_State* L) { + TileSheet* sheet = reinterpret_cast(lua_touserdata(L, 1)); + lua_pushinteger(L, sheet->GetXCount()); + return 1; +} + +static int getYCount(lua_State* L) { + TileSheet* sheet = reinterpret_cast(lua_touserdata(L, 1)); + lua_pushinteger(L, sheet->GetYCount()); + return 1; +} + +static int getTileW(lua_State* L) { + TileSheet* sheet = reinterpret_cast(lua_touserdata(L, 1)); + lua_pushinteger(L, sheet->GetTileW()); + return 1; +} + +static int getTileH(lua_State* L) { + TileSheet* sheet = reinterpret_cast(lua_touserdata(L, 1)); + lua_pushinteger(L, sheet->GetTileH()); + return 1; +} + +static const luaL_Reg tileSheetLib[] = { + {"GetTileSheet",getTileSheet}, + {"Load",load}, + {"Unload",unload}, + {"GetXCount",getXCount}, + {"GetYCount",getYCount}, + {"GetTileW",getTileW}, + {"GetTileH",getTileH}, + {nullptr, nullptr} +}; + +LUAMOD_API int openTileSheetAPI(lua_State* L) { + luaL_newlib(L, tileSheetLib); + return 1; +} \ No newline at end of file diff --git a/src/map/tile_sheet_api.hpp b/src/map/tile_sheet_api.hpp new file mode 100644 index 0000000..0614e24 --- /dev/null +++ b/src/map/tile_sheet_api.hpp @@ -0,0 +1,31 @@ +/* Copyright: (c) Kayne Ruse 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef TILESHEETAPI_HPP_ +#define TILESHEETAPI_HPP_ + +#include "lua/lua.hpp" + +#define TORTUGA_TILE_SHEET_PSEUDO_INDEX "TileSheetPseudoIndex" +#define TORTUGA_TILE_SHEET_NAME "TileSheet" +LUAMOD_API int openTileSheetAPI(lua_State* L); + +#endif diff --git a/src/options_menu.cpp b/src/options_menu.cpp new file mode 100644 index 0000000..3178055 --- /dev/null +++ b/src/options_menu.cpp @@ -0,0 +1,105 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "options_menu.hpp" + +//------------------------- +//Public access members +//------------------------- + +OptionsMenu::OptionsMenu(lua_State* L): lua(L) { + //get the config info + lua_getglobal(lua, "config"); + lua_getfield(lua, -1, "dir"); + lua_getfield(lua, -1, "interface"); + std::string interface = lua_tostring(lua, -1); + lua_getfield(lua, -2, "fonts"); + std::string fonts = lua_tostring(lua, -1); + lua_pop(lua, 4); + + //setup the utility objects + image.LoadSurface(interface + "button_menu.bmp"); + image.SetClipH(image.GetClipH()/3); + font.LoadSurface(fonts + "pk_white_8.bmp"); + + //pass the utility objects + backButton.SetImage(&image); + backButton.SetFont(&font); + + //set the button positions + backButton.SetX(50); + backButton.SetY(50 + image.GetClipH() * 0); + + //set the button texts + backButton.SetText("Back"); +} + +OptionsMenu::~OptionsMenu() { + // +} + +//------------------------- +//Frame loop +//------------------------- + +void OptionsMenu::FrameStart() { + // +} + +void OptionsMenu::Update(double delta) { + // +} + +void OptionsMenu::FrameEnd() { + // +} + +void OptionsMenu::Render(SDL_Surface* const screen) { + backButton.DrawTo(screen); + + font.DrawStringTo("Oh, were you looking for the options screen?", screen, 50, 30); +} + +//------------------------- +//Event handlers +//------------------------- + +void OptionsMenu::MouseMotion(SDL_MouseMotionEvent const& motion) { + backButton.MouseMotion(motion); +} + +void OptionsMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) { + backButton.MouseButtonDown(button); +} + +void OptionsMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { + if (backButton.MouseButtonUp(button) == Button::State::HOVER) { + SetNextScene(SceneList::MAINMENU); + } +} + +void OptionsMenu::KeyDown(SDL_KeyboardEvent const& key) { + // +} + +void OptionsMenu::KeyUp(SDL_KeyboardEvent const& key) { + // +} diff --git a/src/options_menu.hpp b/src/options_menu.hpp new file mode 100644 index 0000000..aff1fc6 --- /dev/null +++ b/src/options_menu.hpp @@ -0,0 +1,63 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef OPTIONSMENU_HPP_ +#define OPTIONSMENU_HPP_ + +#include "base_scene.hpp" + +#include "image.hpp" +#include "raster_font.hpp" +#include "button.hpp" + +#include "lua/lua.hpp" + +//TODO: The options screen needs to be USED +class OptionsMenu : public BaseScene { +public: + //Public access members + OptionsMenu(lua_State* L); + ~OptionsMenu(); + +protected: + //Frame loop + void FrameStart(); + void Update(double delta); + void FrameEnd(); + void Render(SDL_Surface* const); + + //Event handlers + void MouseMotion(SDL_MouseMotionEvent const&); + void MouseButtonDown(SDL_MouseButtonEvent const&); + void MouseButtonUp(SDL_MouseButtonEvent const&); + void KeyDown(SDL_KeyboardEvent const&); + void KeyUp(SDL_KeyboardEvent const&); + + //shared parameters + lua_State* lua = nullptr; + + //members + Image image; + RasterFont font; + Button backButton; +}; + +#endif diff --git a/src/scene_list.hpp b/src/scene_list.hpp new file mode 100644 index 0000000..f0d9ff2 --- /dev/null +++ b/src/scene_list.hpp @@ -0,0 +1,38 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef SCENELIST_HPP_ +#define SCENELIST_HPP_ + +enum class SceneList { + //these are reserved + QUIT, + CONTINUE, + FIRST, + + //custom indexes + SPLASHSCREEN, + MAINMENU, + OPTIONSMENU, + INWORLD, +}; + +#endif diff --git a/src/splash_screen.cpp b/src/splash_screen.cpp new file mode 100644 index 0000000..d3e15a5 --- /dev/null +++ b/src/splash_screen.cpp @@ -0,0 +1,58 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "splash_screen.hpp" + +#include + +//------------------------- +//Public access members +//------------------------- + +SplashScreen::SplashScreen(lua_State* L): lua(L) { + //get the config info + lua_getglobal(lua, "config"); + lua_getfield(lua, -1, "dir"); + lua_getfield(lua, -1, "logos"); + std::string logos = lua_tostring(lua, -1); + lua_pop(lua, 3); + + logo.LoadSurface(logos + "krstudios.bmp"); + startTick = std::chrono::steady_clock::now(); +} + +SplashScreen::~SplashScreen() { + // +} + +//------------------------- +//Frame loop +//------------------------- + +void SplashScreen::Update(double delta) { + if (std::chrono::steady_clock::now() - startTick > std::chrono::duration(1)) { + SetNextScene(SceneList::MAINMENU); + } +} + +void SplashScreen::Render(SDL_Surface* const screen) { + logo.DrawTo(screen, (screen->w - logo.GetClipW()) / 2, (screen->h - logo.GetClipH()) / 2); +} diff --git a/src/splash_screen.hpp b/src/splash_screen.hpp new file mode 100644 index 0000000..8c92014 --- /dev/null +++ b/src/splash_screen.hpp @@ -0,0 +1,52 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef SPLASHSCREEN_HPP_ +#define SPLASHSCREEN_HPP_ + +#include "base_scene.hpp" + +#include "image.hpp" + +#include "lua/lua.hpp" + +#include + +class SplashScreen : public BaseScene { +public: + //Public access members + SplashScreen(lua_State* L); + ~SplashScreen(); + +protected: + //Frame loop + void Update(double delta); + void Render(SDL_Surface* const); + + //shared parameters + lua_State* lua = nullptr; + + //members + std::chrono::steady_clock::time_point startTick; + Image logo; +}; + +#endif diff --git a/src/ui/button.cpp b/src/ui/button.cpp new file mode 100644 index 0000000..59b0ae2 --- /dev/null +++ b/src/ui/button.cpp @@ -0,0 +1,81 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "button.hpp" + +#include + +Button::State Button::MouseMotion(SDL_MouseMotionEvent const& motion) { + return CalcState(motion.x, motion.y, motion.state & SDL_BUTTON_LMASK); +} + +Button::State Button::MouseButtonDown(SDL_MouseButtonEvent const& button) { + if (button.button == SDL_BUTTON_LEFT) { + return CalcState(button.x, button.y, true); + } + return state; +} + +Button::State Button::MouseButtonUp(SDL_MouseButtonEvent const& button) { + if (button.button == SDL_BUTTON_LEFT) { + return CalcState(button.x, button.y, false); + } + return state; +} + +void Button::DrawTo(SDL_Surface* const dest) { + if (!image || !font) { + throw(std::runtime_error("Surface not set for Button")); + } + image->SetClipY(state * image->GetClipH()); + image->DrawTo(dest, x, y); + font->DrawStringTo(text, dest, textX + x, textY + y); +} + +std::string Button::SetText(std::string t) { + if (!image || !font) { + throw(std::runtime_error("Surface not set for Button")); + } + //one line, cache the position + text = t; + textX = (image->GetClipW() / 2) - (font->GetCharW() * text.size() / 2); + textY = (image->GetClipH() / 2) - (font->GetCharH() / 2); + return text; +} + +Button::State Button::CalcState(Sint16 i, Sint16 j, bool leftPressed) { + if (!image || !font) { + throw(std::runtime_error("Surface not set for Button")); + } + //if out of bounds + if (i < x || i >= (x + image->GetClipW()) || + j < y || j >= (y + image->GetClipH()) + ) { + return state = State::NORMAL; + } + + if (leftPressed) { + return state = State::PRESSED; + } + else { + return state = State::HOVER; + } +} diff --git a/src/ui/button.hpp b/src/ui/button.hpp new file mode 100644 index 0000000..2fe2faa --- /dev/null +++ b/src/ui/button.hpp @@ -0,0 +1,94 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef BUTTON_HPP_ +#define BUTTON_HPP_ + +#include "image.hpp" +#include "raster_font.hpp" + +#include + +/* 3-phases, no toggle, centred text + * This class uses the size of the provided image as its bounds. Also, + * The provided image should be formatted correctly. + * + * The button's image should be divided into 3 sections virtucally, + * which act as the different button images. The clip width & height of the + * Image should be set manually, and the height should be 1/3 of the total + * graphical data. +*/ +class Button { +public: + enum State { + NORMAL = 0, HOVER = 1, PRESSED = 2 + }; + + Button() = default; + ~Button() = default; + + //handle input + State MouseMotion(SDL_MouseMotionEvent const&); + State MouseButtonDown(SDL_MouseButtonEvent const&); + State MouseButtonUp(SDL_MouseButtonEvent const&); + + //yet another draw function + void DrawTo(SDL_Surface* const); + + //accessors and mutators + Image* SetImage(Image* const ptr) { return image = ptr; } + Image* GetImage() { return image; } + RasterFont* SetFont(RasterFont* const ptr) { return font = ptr; } + RasterFont* GetFont() { return font; } + + Sint16 SetX(Sint16 i) { return x = i; } + Sint16 SetY(Sint16 i) { return y = i; } + Sint16 GetX() const { return x; } + Sint16 GetY() const { return y; } + + Sint16 SetTextX(Sint16 i) { return textX = i; } + Sint16 SetTextY(Sint16 i) { return textY = i; } + Sint16 GetTextX() const { return textX; } + Sint16 GetTextY() const { return textY; } + + State SetState(State s) { return state = s; } + State GetState() const { return state; } + + std::string SetText(std::string); + std::string GetText() const { return text; } + +private: + State CalcState(Sint16 x, Sint16 y, bool leftPressed); + + //point to the provided external objects + Image* image = nullptr; + RasterFont* font = nullptr; + + //positions + Sint16 x = 0, y = 0; + Sint16 textX = 0, textY = 0; + + // + State state = State::NORMAL; + std::string text; +}; + +#endif diff --git a/src/ui/makefile b/src/ui/makefile new file mode 100644 index 0000000..b9e0e14 --- /dev/null +++ b/src/ui/makefile @@ -0,0 +1,37 @@ +#config +INCLUDES+=. ../graphics +LIBS+= +CXXFLAGS+=-std=c++11 $(addprefix -I,$(INCLUDES)) + +#source +CXXSRC=$(wildcard *.cpp) + +#objects +OBJDIR=obj +OBJ+=$(addprefix $(OBJDIR)/,$(CXXSRC:.cpp=.o)) + +#output +OUTDIR=.. +OUT=$(addprefix $(OUTDIR)/,libcommon.a) + +#targets +all: $(OBJ) $(OUT) + ar -crs $(OUT) $(OBJ) + +$(OBJ): | $(OBJDIR) + +$(OUT): | $(OUTDIR) + +$(OBJDIR): + mkdir $(OBJDIR) + +$(OUTDIR): + mkdir $(OUTDIR) + +$(OBJDIR)/%.o: %.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +clean: + $(RM) *.o *.a *.exe + +rebuild: clean all diff --git a/src/ui/menu_bar.cpp b/src/ui/menu_bar.cpp new file mode 100644 index 0000000..2670e32 --- /dev/null +++ b/src/ui/menu_bar.cpp @@ -0,0 +1,139 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "menu_bar.hpp" + +#include +#include + +void MenuBar::DrawTo(SDL_Surface* const dest) { + for (auto& i : entries) { + i.DrawTo(dest); + } +} + +void MenuBar::MouseMotion(SDL_MouseMotionEvent const& motion) { + for (auto& i : entries) { + i.MouseMotion(motion); + } +} + +void MenuBar::MouseButtonDown(SDL_MouseButtonEvent const& button) { + for (auto& i : entries) { + i.MouseButtonDown(button); + } +} + +void MenuBar::MouseButtonUp(SDL_MouseButtonEvent const& button, int* entry, int* butt) { + *entry = *butt = -1; + int ret = -1; + for (auto& i : entries) { + ret = i.MouseButtonUp(button); + + if (ret != -1) { + *entry = (&i - entries.data()); + *butt = ret; + } + } +} + +void MenuBar::SetEntries(std::vector> info) { + if (!image || !font) { + throw(std::runtime_error("Surfaces not loaded into the menu bar")); + } + + entries.clear(); + for (int i = 0; i < info.size(); i++) { + //create the entry & the main button + entries.push_back(MenuBarEntry()); + entries[i].mainButton.SetImage(image); + entries[i].mainButton.SetFont(font); + entries[i].mainButton.SetText(info[i][0]); + entries[i].mainButton.SetX(i * image->GetClipW()); + entries[i].mainButton.SetY(0); + for (int j = 0; j < info[i].size()-1; j++) { + //create each drop button in this entry + entries[i].dropButtons.push_back(Button()); + entries[i].dropButtons[j].SetImage(image); + entries[i].dropButtons[j].SetFont(font); + entries[i].dropButtons[j].SetText(info[i][j+1]); + entries[i].dropButtons[j].SetX(i * image->GetClipW()); + entries[i].dropButtons[j].SetY((j+1) * image->GetClipH()); + } + } +} + +void MenuBar::MenuBarEntry::DrawTo(SDL_Surface* const dest) { + //only draw the dropButtons in the user has this menu open + mainButton.DrawTo(dest); + + if (!open) { + return; + } + + for (auto& i : dropButtons) { + i.DrawTo(dest); + } +} + +void MenuBar::MenuBarEntry::MouseMotion(SDL_MouseMotionEvent const& motion) { + //open the menu + bool o = mainButton.MouseMotion(motion) == Button::State::PRESSED; + + if (!(open |= o)) { + return; + } + + for (auto& i : dropButtons) { + //dragging down the menu + o |= i.MouseMotion(motion) == Button::State::PRESSED; + } + + open = o; +} + +void MenuBar::MenuBarEntry::MouseButtonDown(SDL_MouseButtonEvent const& button) { + //open the menu + if (!(open = mainButton.MouseButtonDown(button) == Button::State::PRESSED)) { + return; + } + + //update the others anyway + for (auto& i : dropButtons) { + i.MouseButtonDown(button); + } +} + +int MenuBar::MenuBarEntry::MouseButtonUp(SDL_MouseButtonEvent const& button) { + int ret = -1; + mainButton.MouseButtonUp(button); + + for (auto& i : dropButtons) { + //the user just released this button + if (i.GetState() != i.MouseButtonUp(button) && i.GetState() == Button::State::HOVER && open) { + //get this button's index + ret = (&i - dropButtons.data()); + } + } + + open = false; + return ret; +} diff --git a/src/ui/menu_bar.hpp b/src/ui/menu_bar.hpp new file mode 100644 index 0000000..e4dd392 --- /dev/null +++ b/src/ui/menu_bar.hpp @@ -0,0 +1,92 @@ +/* Copyright: (c) Kayne Ruse 2013, 2014 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef MENUBAR_HPP_ +#define MENUBAR_HPP_ + +#include "image.hpp" +#include "raster_font.hpp" +#include "button.hpp" + +#include +#include + +/* I've redesigned this so that the contents of the menu bar can't change during run time. + * This is more restrictive but I'm focusing on getting this working first. + * The Image and Font pointers must be set before the text data is entered. + * + * This class needs a rewrite. +*/ + +//TODO: This thing is fucking terrible, fix it and the button class +class MenuBar { +public: + MenuBar() = default; + ~MenuBar() = default; + + //yet another draw function + void DrawTo(SDL_Surface* const dest); + + //user inputs + void MouseMotion(SDL_MouseMotionEvent const&); + void MouseButtonDown(SDL_MouseButtonEvent const&); + void MouseButtonUp(SDL_MouseButtonEvent const&, int* entry, int* button); + + //manage the entries & buttons + void SetEntries(std::vector> info); + void ClearEntries() { entries.clear(); } + + //Accessors and mutators + Image* SetImage(Image* const ptr) { return image = ptr; } + Image* GetImage() { return image; } + RasterFont* SetFont(RasterFont* const ptr) { return font = ptr; } + RasterFont* GetFont() { return font; } + +private: + class MenuBarEntry; + + std::vector entries; + + Image* image = nullptr; + RasterFont* font = nullptr; +}; + +class MenuBar::MenuBarEntry { +public: + MenuBarEntry() = default; + ~MenuBarEntry() = default; + + void DrawTo(SDL_Surface* const dest); + + void MouseMotion(SDL_MouseMotionEvent const&); + void MouseButtonDown(SDL_MouseButtonEvent const&); + int MouseButtonUp(SDL_MouseButtonEvent const&); + +private: + Button mainButton; + + std::vector