From 65d8d93ce4c6649e03208fc7931d2a0ce7920a18 Mon Sep 17 00:00:00 2001 From: JackCarterSmith Date: Sat, 16 Mar 2024 11:18:01 +0100 Subject: [PATCH] General upgrade to modern toolchain > Conan v2 support ready > SDL2 lib fix > Both linux and windows patch --- .gitignore | 9 + CMakeLists.txt | 26 +-- README.md | 18 +- conanfile.py | 68 ++++++++ conanfile.txt | 25 --- pathfinder_algo_test.ods | Bin 0 -> 51664 bytes src/IAEngine.c | 64 ++++++- src/IAEngine.h | 2 +- src/arenaEngine.c | 361 +++++++++++++++++++++------------------ src/arenaEngine.h | 17 +- src/arenaGUI.h | 4 +- src/fileHandler.h | 4 +- src/main.c | 30 ++-- src/main.h | 4 +- src/menuGUI.c | 9 +- src/menuGUI.h | 4 +- 16 files changed, 397 insertions(+), 248 deletions(-) create mode 100644 conanfile.py delete mode 100644 conanfile.txt create mode 100644 pathfinder_algo_test.ods diff --git a/.gitignore b/.gitignore index fef25ea..0c7f655 100644 --- a/.gitignore +++ b/.gitignore @@ -61,6 +61,7 @@ CMakeLists.txt.user CMakeCache.txt CMakeFiles CMakeScripts +CMakeUserPresets.json Testing Makefile *.cmake @@ -69,3 +70,11 @@ compile_commands.json _deps .project +.vscode/ + +# Conan files +.vsconan/ +conan.lock +conanbuildinfo.txt +conaninfo.txt +graph_info.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 986d585..fa7161b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,15 +1,14 @@ # CMakeLists.txt -# Written by JackCarterSmith, 2021 -# This code is released under the AST license. +# Written by JackCarterSmith, 2024 +# This file is released under the AST license. -cmake_minimum_required(VERSION 3.5.1) -cmake_policy(VERSION 3.5.1) +cmake_minimum_required(VERSION 3.10) +cmake_policy(VERSION 3.10) set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR}) # define project -list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2) -set(APPEND CMAKE_EXE_LINKER_FLAGS -Wl,-subsystem,console) +#set(APPEND CMAKE_EXE_LINKER_FLAGS "-Wl,-subsystem,console") project(AST VERSION 1.0.0 DESCRIPTION "Arena Survival Tournament" LANGUAGES C) set(AST_NAME AST-${PROJECT_VERSION}) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/src/config.h @ONLY) @@ -17,14 +16,12 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/config.h.in ${CMAKE_CURRENT_SOURC include(FindPkgConfig) include(CheckIncludeFile) include(CheckCSourceCompiles) -#include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) -#conan_basic_setup() # Find SDL2, SDL2_image and SDL2_gfx libraries find_package(SDL2 REQUIRED) -include_directories(${SDL2_INCLUDE_DIR}) +include_directories(SDL2::SDL2) find_package(SDL2_image REQUIRED) -include_directories(${SDL2_image_INCLUDE_DIR}) +include_directories(SDL2_image::SDL2_image) # define src/headers files @@ -47,10 +44,15 @@ if(MSVC) endif() # Link SDL2::Main, SDL2::Image and SDL2::GFX to our project -target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARIES} ${SDL2_image_LIBRARIES}) +if(MINGW) + # Override mingw32 lib order due to a failure in SDL conan recipe (can't link against WinMain) + target_link_libraries(${PROJECT_NAME} mingw32 SDL2::SDL2 SDL2_image::SDL2_image) +else() + target_link_libraries(${PROJECT_NAME} SDL2::SDL2 SDL2_image::SDL2_image) +endif() # install executable install(TARGETS AST RUNTIME DESTINATION bin -) \ No newline at end of file +) diff --git a/README.md b/README.md index 3e13dca..916ff36 100644 --- a/README.md +++ b/README.md @@ -16,25 +16,23 @@ The game can do following and you can learn from that like we do when you create ## Compiling -Before compiling, you need to install your favorite compiler (GCC or MSVC) with CMake and the lib manager Conan (https://conan.io): +Before compiling, you need to install your favorite compiler (GCC or MSVC) with CMake and the lib manager Conan>=1.59 (https://conan.io): ```shell # For debian based distribution: -apt update -apt install build-essential cmake conan +apt-get update +apt-get install build-essential cmake conan ``` Clone the repo and launch in order conan and cmake in order to compile the program: ```shell -cd AST -mkdir build && cd build -cp -R ../data . -conan install .. --build=missing -cmake .. # or with '-G "MinGW Makefiles"' if under Windows -make +conan install . --build=missing -s build_type=Release -pr:b=default +cmake --preset release # or with '-G "MinGW Makefiles"/"Ninja"' if under Windows +cmake --build --preset release +cp -R data build/Release/. ``` ## Running -Simply run the program with `data` folder (required) and `logs` folder (optional) or use the launch script. \ No newline at end of file +Simply run the program with `data` folder (required) and `logs` folder (optional) or use the launch script. diff --git a/conanfile.py b/conanfile.py new file mode 100644 index 0000000..de64d9d --- /dev/null +++ b/conanfile.py @@ -0,0 +1,68 @@ +from conan import ConanFile +from conan.tools.cmake import CMakeToolchain, CMakeDeps, cmake_layout +from conan.tools.files import copy + +required_conan_version = ">=1.59" + +class AST(ConanFile): + name = "AST" + version = "0.4" + description = """Old school project + Turn based strategy game""" + license = "MIT" + author = "JackCarterSmith (j@jcsmith.fr)" + url = "https://git.jcsmith.fr/JCS-Prod/AST" + + package_type = "application" + revision_mode = "scm" + settings = "os", "compiler", "build_type", "arch" + generators = "CMakeToolchain", "CMakeDeps" + +# default_options = { +# "shared": True +# } + + def configure(self): + self.options["sdl"].shared = True + self.options["sdl"].vulkan = False + self.options["sdl"].opengles = False + self.options["sdl"].iconv = False + self.options["sdl_image"].shared = True + self.options["sdl_image"].with_libjpeg = False + self.options["sdl_image"].with_libtiff = False + self.options["sdl_image"].with_libwebp = False + self.options["sdl_image"].lbm = False + self.options["sdl_image"].pcx = False + self.options["sdl_image"].pnm = False + self.options["sdl_image"].svg = False + self.options["sdl_image"].tga = False + self.options["sdl_image"].xcf = False + self.options["sdl_image"].xpm = False + self.options["sdl_image"].xv = False + + if self.settings.os == "Linux": + self.options["sdl"].wayland = False + self.options["sdl"].nas = True + + if self.settings.os == "Windows": + self.options["sdl"].directx = False + + def requirements(self): + self.requires("sdl/2.28.5", override=True) + self.requires("sdl_image/[>=2.6.3 <2.7]") + + def layout(self): + cmake_layout(self, src_folder='.', build_folder='build') + + def generate(self): + for dep in self.dependencies.values(): + if self.settings.os == "Windows": + copy(self, "*.dll", dep.cpp_info.bindirs[0], self.build_folder) + +# def package(self): +# copy(self, "LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses")) +# copy(self, pattern="*.h", src=os.path.join(self.source_folder, "include"), dst=os.path.join(self.package_folder, "include")) +# copy(self, pattern="*.a", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False) +# copy(self, pattern="*.so", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False) +# copy(self, pattern="*.lib", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False) +# copy(self, pattern="*.dll", src=self.build_folder, dst=os.path.join(self.package_folder, "bin"), keep_path=False) diff --git a/conanfile.txt b/conanfile.txt deleted file mode 100644 index 6718a18..0000000 --- a/conanfile.txt +++ /dev/null @@ -1,25 +0,0 @@ -[requires] -sdl/2.0.16 -sdl_image/2.0.5 - -[generators] -cmake -cmake_find_package - -[options] -sdl:shared=True -sdl_image:shared=True -sdl_image:with_libjpeg=False -sdl_image:with_libtiff=False -sdl_image:with_libwebp=False -sdl_image:lbm=False -sdl_image:pcx=False -sdl_image:pnm=False -sdl_image:svg=False -sdl_image:tga=False -sdl_image:xcf=False -sdl_image:xpm=False -sdl_image:xv=False - -[imports] -bin, *.dll -> . \ No newline at end of file diff --git a/pathfinder_algo_test.ods b/pathfinder_algo_test.ods new file mode 100644 index 0000000000000000000000000000000000000000..96e01a05f0f77aaea1ba6187b574a03febff681a GIT binary patch literal 51664 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⁣!y`J6=U);NtUr`WF9Z(t&^m?FS?D?8b#n%3gO$DoAQFfOhPH&3gt|w%@Jow=hnZBo*j=y?^1y*G)U*w zV@aJ7&M<@^a)C?cndau^0!zaS%CE_==XchBT)1b&zS4>)LD3Mq?#@T0jSV;!Cul=u z0Xw-^*7T`9ItI3y#GcToB-Be*sb;vu$pWSy^M-YdY6zCSxD!u!QUOxkPPtW{+s`B3 zq+DJaON*N>E9tjyGhfW|AABp|IrmuMWG^y0AmV|)+gEB1f)-YcIlyme>UbrWYmztY zq&MUh-b~ZDYAH;}8hG$#(=t=UuI%zo+2zCMkvY=^Ss0x9u_MYMjM44v(E|G&-YpXL zy=W?hx1C}o-dCOA~07oqKDI)h(8SCZq1} z2W|vlXP7`g%-u#u3@cZjas@mW*H)1(BF@P+!`TE}3}l4ScUkhRs zPqvrFofDncW%EEJ@1t|YDd1wlwnY(1#{0UF4rI3k(aCkMYN2R2G0hQ#_88MX*Q)Fx zP~n?00QI>qR@i16e>x9((zyqEGK>5jyPLtU1JRNz5a@s(y3chK22(%?<^W$l&V9Dk zfECb_1E@C)VKwJ-ook;C&~OH`8JTk-A2Wc|4O|~9Om4a3aT@e+p5$zLt?)%j%nhGi zkF2nq+bk!^gDPbwrDU9*u>>={Pa#^2v+6qfSuSS!$k1;lgHWg(9c|Pv~#{Z%JAWx+1+Ei zo*_tOP2|kq5j&BjwHgCjc4rxr4(LyRkVFroK{yj2@|B^(Ck0}2Q}CHf@_uM`({k{s zfvr`pLDq;!iQx_x4pT5JGR;0UCaqa1R%BqspO}9Tt>9E>eMbOESf7^E>sm0524_il zR6Z{)li1UojWokW#LDvGP{07sSu_ICcvpOJOh<%7)9B zCznHglG;b<(7%^Rf+6NX*+7nYLLTa)`)1O2Vk9F8j6_>`yj$i(x6;M0$pDAAxYE z*Ojk6P=E$yKR!o;KFi6*9CAj6Z1vPdcewnxi%bf+f94!LE1rVJj`KQZyuK=!46YsO zLsw|lkjNBq$Qo1DCH*7Nd@9M}{+x3(QatGs8%}FXLVfN>=9+cpAp}3ppiQxZ?ewf} zkNXTo68-9|i)GiVW=sJ|q;qs879VY}EG=ZQ;Giy}L3q7jV7%05Y>WgsPO`?wpb6~V zG09So@L@p?JG6+$mo%BQgLavXpA#Lj@RmME;iB0k;{bw^&xUq{46>iMXUBv72+XM=< z^Pzoa%@gcqA;oHS73Mf*P~&yXn~^Y?!!&$~bbU;Te5 z&u@V8)*FC`^xMb7?Zp|iB1#)_W%3Aah$ zVV7x$$LgX)mTr%oQ$U2duUj)U1#WgYoAd|g!1;b(aO{L(1Z^pE$y}& z9pA3CR8tgY39$oIP4SWK9>&!cyu;$XS5?}xf|feR#F>^_pW@B%O@pNR*+%cLGv85y z_H5v6%CB2k6$sXJax6}p!FM`DM(bY82dMh#bSF=st}3Jw)nJmKfYM3M-2%Z zey8inO0nS55@1LZbhJ&oeNj)zjXo6N`CRu^d{Zn$5=?L|K&TiXR8nHD@Uszjo*n9!WD$iM%u+iBp-^@?*kFMys&BWfCv@RLy6M|BkdX@Km=zXLh2&T-6$YJ z{SFXeQTkHaI1mBOVAC%ZV4EwEao1@jggKLfmksVVv5(JbQ4Uao?y zTO2HqW7)7D`B$}$z}%zfS(kl#VH}`qG*E!9iH|;8*ubUQRg>h>&x%~vvN;Nkf04>b z&kq(fvN?;wS1itjd)!A{EuWL5q731T9S~57V#P}wsjm@We@GKJ8{t7pn)P^n-V%SA zH)23&D5Nb~%5O_Y?TGnXL;V^ntCZwu^CC5?cH*ivW16*gs_E<7#*seYMj9Bnv3`Bt zR|fHQQlmI2enU@gU8vy3_IocE{RZ7_R@Sba^c<+tXN9WQ*LUxpTzwdD2971WVWKvm zDk{(LGxGc}uWtv8#}B&)O(vgF<+!LQD2Vy9h6}3Tq6Wavtlrlar5MGUBp2{mmPV`m;?Ho|%?op&9DyEW@6vUR5sKg-V<994wr!E;gi0NyAlvS%W~7JsT^lnT1^t-0FyE9#i2 zfT*H|k7nG1iDEadB5YR<)b^AaFOOY9BmEo8 zAT=xOx>wsazvgaCZcUCQ-Cta;!*-6eDZd6tTf_A<2i$6%<#ObK>SRqg{K0@>iVlsJ z?jvA?gOO{<8X|_IoD9BS!Pce{QSGsG4Ddb_R7d#Hf^SJ*#Xkl5;OCLJfJ`EU&dG63 zi+_eR@I%mhW&T$#dsdi7FibJeF3&TZ%B*VlbwQ?XMyQ{s*R!dxDNDr zuX9Q(%fx+dGk#yzUAcm#KXChIEHRSR!l_AhF;wdv&; zs*}0QW!B+ zs4cFy3%}LwriDvtV{>U&J*$lPXfHHFHEn77Rn&md40o}PTpOEJQ;?H&gxZN_1s1v2 zy)*t18zX6i${_KVilEWi*f^HT{so%1-NU?&;=1-^RhLI;KRNNfbri45l$J52AF6{3 zq|AKC_~e8(y72h^ZtIIw>s@2+-FAYd=1Vejc%|9=8rDYADJpoMVm~>dkA8n#A!|C{ zUkB$%@qQk<{^Kui4d|v&+pJe2>!5L>9$o+u<}P|JE=0Mq@3R0w(w2?wy1Hj;7_Tol z+zBsGoUTp=8Smgo#I*Zn%+YYsuGpPX!Ch;CCRH2Rc*cSwDSO;v9QW~!uhpsydS(p) z^UxX7F=@)qD>O0XeC~r0%eDgQrevv>n2&Fqt;l6Io?dp!xO`ZpygwE}Fv(k$0P3X&uf#B_E8(g*)^%S8P3@Poq>^YV|f=nb?lcmvoTNJBk z;UhpwqcQe|R^dhu?*;EoM1@RffrPA@CT<|VJKX%Y+9R+muQyBvPmAQZ0@Cue4Yl+(Wu)>GBL1n?^VK{-r~n< z{y3#g#7pGMWLYbprfiN-HavOyt-Lsv*4$?djphNttUAV-dPm*TlyPoLOr$fPR`VQI zS^mL2#^@W^7Zw6Ub7a8krr{qMGxZ3?`a zrx@S7lod>oC2?hv>B@u*-ip9BT>T!FR5E_b2&=!yHc0<3uhN8J-?X(;;3!pL;z_D$ zImV3?+R`Wn9v}t1j1;C11mL7NKXE3h+quFmzyUNA031LBFRzW$pl2OeS4d|F#v5`G zB#LE`jMLmejM(!V_ncUU6v+^8)cdvhMci742G6Cl@&5MQ*}qF=x%W~DdAkrpS5rDT{0lOsVbl?>7d|(yYxP=Z;2f@DrNVt&=J#zyof7`gym~aL!NC%S z;c(>&a)Tuk;w-kYX7}Gro^PB=7Rd&$qm;OVlxiOI&`GMe*^b6Bjv(U%bD(%wRIulL zE1N~rO($z*-d{kTCjjzl$N`XNZ6<85)6@CIFUS_ldj{@3klS(=l~i!|k&H^~5*P4T zS#E1@`abGvDmxJPu^9QO0)4c{MO5XN%SyO-#k3J*93GYE$-Y@K0Utwvt2#{V=K4si zhIW8cZew>)Ed9oqk6uQ0?k8vP0laLwCgpY0)(>!zG?yX(7wPA9#}*H^cin1fJld~I z$3DH`H`cpaXYC{-W*7TJ3dBqk+$R<<3HqVg02cv~d}JL6CW@zDi+toVmIrnR4Mh$4 zbk=t&YH*@Y?r(_hFcm`dvSf`C9=m&zdS<->+Ym~|>9XR2-H1!N1I_P19gPZdJBW@c1M-)Dn!;EhexF`A9|8|o3%!Pb;tJ(W0mGCdZf-S zF~U+~jE59819;R5dof0gjpuf);o!h3YQ?c(NS@M@x?5Ch%9&W!Isy0*Wl81RXsTR& z&Jp%F%+DojI~YA$6g9{ONe4em#3YH7%2nx$r!uIj0g6{y`YZ5+Wz~2QWY#3H@|q}5 zH}dksRs2%Z+{c{l<4}EFNl1_#pOtP%@`eyesbH9>bW{}sGbKTPeRPk;*^}MVWESPR zob|S{(rh>(jA1iFhAbwwuO-%O^ZOWT&L%w8+1>D$-4Mcc62@(nOA6agf=fKplkQqe zCp$u*kYK9j#qWLry}Gl}HVuakrB@Q`q^P_e3V3tRUio(VvRk6WV5(+l^83{mN5je& z58ubnT9Npw>7)6gr)=DlkR793 zC>HFi0Zc=8kX9-qBHxg!Le@_K_VuQ%`7g9@>q$||K3>b9SfzwlN9}AKBXeC1Wo*ix zQw|b8Xn5?L?b8ZyD{--eU&@!Nx9@JAjG2x-zMSy5(WOGf7N^VRvXkO@Y_tf(M#ZIB z#aPURU!mZ>OBCmDpD?r33UF=rPY+CqvJ34hmkzJhz++Noc0z;H(U4PwhAoI7@)Y-$ zGfwMIenjB3u(Dd?nrwz~NQDuKNfhRhQcnHoLti}ItV@ZV9ZJ8hA!0B$4ZTA-lUFo68Jpsg3S5XKS1E5|cTx7N>aH_EzdJrfY) z0uFAAp0+tA1%g;r99jPpLi8WCUr_GMTAiVHQ)E~iGvNxq(Bp++L_hrSTRGj%i@EhwkPstj5Gjf94c?+sHm6fY9w(qY^8PmW=s4IaFV>zZZDwzw2Fi z>RVKQd+Is6Z6Sz6f(CH>8AoGf&BOO|JUZW+4(F0Of0R!gwte*{jzF+A$@;%|M?cM6 zI}s5;*4to-e{jGyL_9sjn7S#T!8_KBAr(L;^@=MlqrcOTqk_y&!Rc$ejd>?KR~~1f z?(?(i`+e?&q85dcvUjYsD@k~=kaD#&XozP72;K;(LJl@z=FJ^EK(0Qd>zbgI1 zA+HGl4!Mi)fYMO~kSUe;x1j$Ohil2QOCz!miX#WSBA6lo+5Mp4rD6H1rw8 z16osq0~R1uT{gH*F8lzi7^1%DH*du7Fu*ESrK~H6#jR#po*;&`D~WlWktP^$ymkYF z_6`qm%tp?A=z`F>Bb3~L)i*Y4!E~w*+ejTCa8hduD;;2ac zGG7^mMIixT2pn_kYxC-L$;uvn7Kk`35g=v&s5rPL4%9!-_?p3N&2ROG=c~d~;?F@q zH&+}fz3`O9Bg$tAjkhWqAmVq{2{)Xs=fg!VJ*fqe$dlL&r{IzACg`e=&fCqv_IOCTkfr^|uhBsg9ctqzQIB9fxD12`{st#MZB9YgorE~y#}0Z5t>ve74RE5uf>QqVp5 zqp|~Y??5m=gGEo)9x7CRdq|>YY?lPNM`G|j`y2u!&)6&K#=))}1Q1|YdTlWd>FbRT z#KM%kB7vCjz)=0|UH}1(kf(Ah*}l0&bl02=upYrE2$1FRF9?u<^$DRs*0PW-KM7fG zeniJn$OaRMFyRh$A4I8OcJRr4&n9Xd1wB@yWJ=}P-B=mm?yO?7=*h|El&B@-J+}~~ zH57=k^kb})lNGFIclYWyepgXJ%MZB&`uw&Xmrk*x%98wvJteyjIlFvj8urys00LmJ zP|V3zK9`KMW=w(i%oiY>6e=a>^Egtd}un8R$fZta^2{O}w2%k|VH+s%2cXD#|) ziw`HO43H1?eY5Z75MjI5uRd486$b%hCWC<**X2;S8k1bD@1FAyf_k7v*tI%{y{qF8 znBloCAO`cN<1D9PjrQ!=s=3!yMC62x!VIlMLqY*{!SGzu3A^3Kt`mhBR>`qox)ZM{ zoKn;PdXLFKWs>C%Gck`R@>(qoI^qDB z0vUoGhHM1!VhEC2nj2}u_Ema4*zUKBWEH{mglgqU7I6(O8p0So>X6)kJj5lOe0}UH zct|~qSTsJKQ&GE(O=nLNq%PwcXr}`Ix6X&Qd02_Egw`q=(!dq1)^6HB6pHZ6>zOsm zl32J1iVB}E(|-j~ci)J<<=Ly?gjKV^$=ZVqi!6uwCf4p#%v zKC77cs5LawF}YTH-pxLa$VIHTQMzKv+!gmN-v?u(rO3Pm%p@j0@R3rIh0MGJW;uhw zm2(xx{;lE*3tNw^>7U4xP|J8b;7Gwh;?fcJv+na|?%lB^fQcEv+UhMuS3-bl62LDk zeTRf92PTy=mAjD@LoE-vox3GP!ctm}C=2YMtdzw40dpq?j@Dig%2ki z;=}9-g-2iymZ`1|L3;cj^T)M|#no&bVgkxANP+Zl;5AIekSvm|U#5`lyub zo`gQ#KqhGT!D|32Y#uy9F}683cHm4|VgnbL!7YDt!7C$c4xFDbP_R)hQxP9 zezECwu)(oRsiEBoLgEJxZ=hf*Y3lOOY4fly8%(F3b6y`*K=JyDT{hqDi`feKy#O#U z!@QG*1JtnejmBjpW{~=B&|l(yhNY^b0Hb8)JGe5Mzx+*!@YBXQ996kc8dJf zhmMi(VR|I56Y`67AF5UisP)fUD-G6K{Xf@Q!hfx`y*o=!)Gl7ccSzwCKh<^@bmYL5 z^sxG{l!>FS;e`1e7+Dl!MkeD2F4(B|U~r|pqv}`sp11f710W>N;}po-JGPf#dlehr z>*swatP$GzCr1x;7f6h+~TH#jBiG{KMwZdr-pjNo{f30w!#S6^+VukD7K`Dc1dSE;~zJ+2CN*TgY z%5dm$BEX`l2~ZPs$_vzl<7bbbLov2$W4^F?bugJ2$e!u#du?Bf8k(CM_=a}$xI6T? ztuqO6^TPn568xQ|17r#Ncg6!aPX|)xX`}3sU_=4Y|+Z zk&JVbH11vJbz5Q_A4VH_ogRgTvyeBg$_*Gl%N>ej-*aqaUy^@cK8BO_!U*h8LlMLF zyQDmgNO5;XX&d4kqwm~y3HoXE4&CY#TbEw-S3gn-CNu@gw{Rn`GracZ`jw5N%8ksT zR8g1+G!#skq9>6XN5LcQPhwry@@-;KBfsbGVJ@a=Aglz2wZ7#)+fhl>qCxw|c2t@A zKenSt4wt?L4zO@e&T<%()skU|p_}VUo7;PCr~N`3B^m+R$YG!|g@P^V@ldd(je_lI zyWB6dF_(?GSMn$#<;pRALSdt3MY3h_Ik#`%BvXG?bP~0o%EB+wX*|&novJEqGEn;2 zI}$OBf#kjZ%thqzqK>>%YWvz6=?vYl45T6vmEMzxoR7OW&ehhw791Uo%e8W<0R}y1mx^5Lo_-)u;(8!69gOac=O6@H7!$&ALz#(NV`A@l` z&+)c*q*-SuAAsl}lGCM+UY*?Kd2yq5#f-&yP7MGxA(R)HWMm+dj3K1~B$7$)iaO$4 z84Ne%prqbyZg(`KFi78fwOx3==M*^@U%i>8Qaf9i+J>?`xog2XRj*_S_lsnTg-$3BxF4@uzaIe)N>QVxJ+)EX+8x)kximpGE<8s*;$ z5{hNSRrSoDggnD#t-)ihn7xT&8MQlpv5Z8do$HoT!=fYe9PGE0>O(hiHs5gAz>t6m zi@n>JM$sa{^_i0w4jr51-7~Oo2dvF5nK1Y9oi`EFkc3H5j|`-{$_gt{olwcl8go=@ zfQvH9>6DYMU0O`qe)NG%SZ+tutpi~B+tgS-$Ni$Jk-5>6TOoIwG++CG#()P)%@BC7 zi1D&mf-6}dZ>6t9wi#y~vc?W9ye)*aqM=gb0ktCnx!77JU_MU>HND#3={pfimg=Bn z+jUDx*<4lG@HpB3eon(mXyN&RQ@O1mrAFdq-|^o2a`Lxyfj?K8Udsjg9Pdr`-UvMV zzFiK!0`BVjKtKPVX*tkKta2OC!@;g`V$L8mK2jobxY%`m@`H;mgLZmXE0mewvxss_ z)w6DAA|;=-IC*826nthhe(B6b2)|IO@EWh5M$%{<^?XJGxDlg+4}O zJTBSa)V`giSlAJLUC) zKb)cc`SWC?s>ylvO6SkQ)4{~dCI5Ny^q3pgs$$=+(Y!=U=*XQ8FZ4JiVGZ)9N*#d>$0wfih0(}HWmuBPKc9zKk6enWo71{AMzdC{ZB?&J6MP`v{y4WO` zi%iyBPSK$p!k}SUB9|sCn=nkjT0&#i*DD*zK-{XyYGABw#OLg{nS3lWX-o;zo^j4r zmM!$gXkq-&j3Yy2@7=QVM(3`5%jI$#Mn;n{1)~Fj+F~S+{Db|)6(2O2ID4;r#p$AP zPrf-G+cn+esgCHxm4bK83U*~_^c(>%aWvOSHk>9m(odX2UN?0O?e||)_$zcw@4BSM zSKqj7Fk{FBL@z=tG;4Jqy;_`^^udrCy}H`dxteWJj<43^oh_5Sp3{5CKWEUeCXxFt zN|qtE+zgs&aBL=1Ph~#yihVbYspt9kYccw}(&0~Y{42qSQ@6KU6besI>C}^CH z>Wg?Hlc@fJne0G`N(0q+o7aiDJk>`A(z<8G1qv#x&7|mUR@mxIby79$Y&aB2{ z#*ySOZ8Ht0EiQWojp-2k_)hnDRRoS_PK&U5YnEeq=q%u<)s#R{?v**&Yw>~{4*zFd@Gu0ncXb$KN+G@`DKt6RGKgs4{ z%=SEeB9EjlVRx?a&rp?1@T-mtz{1Y4V&Geo3|?hSsisZ%`FZJzH2O zTbh`uvH6YKrQ!lF2~(mXHNsvse&>;f_A@fNKo#HK`giM?hwM%L?VC(z3;VAuL&wB3 zzqo%}b~8MEwNlW0S}yS8G4>3iZ|@7=XPfnDSwe#XPn=Adk~6ZYfV!iWr+s&1TIJ{V zlB&-zx8zKH7u4vPvlnueyq34+9=D99nu(KnhTDqU^<{l+8O_~0EPOlMMZNrvpvBep z)gH9u%wp4182zy~Jj|lkGv}=3da8j}!;1KnOe`Zk;r8MIqG8&AvHObFeT95)zfYSO zS}|G+_qwTpLBWZ5#P5*f|CwMZ{geCv$A@zC9G(x*te#>Wl{B4g9sN4WLz`rMc`ECG zAe+xPwMLIRW>b2h1l}|D-a2>0z&iyhK@tj7!g6`JI z?0rE4d_7?Sz3%Le)k2tIWlEh`p7wMb&j?CU7qa_V3j8rw*V?e2tu~AD~<*CAJT_)4|tAg(4Ncb8 zGQ4!x)%?TzyMALXp;eCB&o!SsuUb<#EeBQjzNweT-Z6$stI0nYM(3apdGST^?!&0W zLULm@wRmDs|RVYex%Zde;xiPx5f7C#geBcIW`r7S8gr$zxji(*W< zbT@o%yYg!#s+f%`0hgyetqTPTD+{wXZQlWr@FLaOSrrNvN zw5_atsC|OPuAJe_9oj zyvblSc((8*O5pty;Tsy9^n{4TF9^N)K#G~yV;#O{Kc4grwe*gMH0%W}V|zY))S`*f zHg2G8B`*R#d*<9+C|0dTMBsJR)9KA?_%9S|oxYpcwt0khu!Bv}r2F8MW-8zn(BSYJ zK!dw?hu#JddOqNN>B8PdG`gp?^I{MB;Iw;UD^~2slZ@U{|4zsx-NU4<*@1jR^vH6y z+;pQ;375DT2DgdaJ)V*?U!chHzTWVVx_2qnXS7>p*Fj6nM58Wa%&jM$)z9{Z!LvK| zKkZ;2*ECl9UGjX7dejUdsBkv>rNuROZw|~2m@`Z77$OWVOXro^ zNzEZ?ipZiBsH{rR0PxB!^Q z9;N&u6OjA^Lb_RF@~CcR=FkU2ZuIKMADwq5AWisMJ^tA;IqUfTi`G9Q;q%yHei5)v z_ep7&$&8t(uoH~2*|!DS<+PQ_HM`UIRD};!v&z6A+IgWq7+~kHOO3_A7j%S;{UfH! zQPad8!LQ!nq9$D3v<2!&(^wpC++A@?O}(V`1@VyTXZgvb{l`h^)jO_iw(M#&~{yzszsTrGKhJb6>*68)`dP6aM? zON6oBw3=io|3=UN3D_7`7Bh6wdqH=9~BxUIbehp`k;;$TmL8cuxaND2CPFTOk-2I8m}0dd|L z3oN@!thgWC&PIu2_e-2~+-7w`Eu449giEbUv!m4(B$j!(A#cAyJ{P-C9_UWy^z(Xt zYVhiKS{~Q`osMvBkvVf}Ew-I`e!IX&qQ^amT&cZC8lzbN8z+f0TpydQmBo$F(oJ9~ z*wA|Hr8EYGAh^HVcPF&BhJUv(&S0NI!E{e4$u66(`?y-@z&Nssh#2 zw>rN>Yd!~)>6nDFX`6Vh|Y|BH-px#34BA!+mu zU&bZUP#@y=N{yMBC@bT3wzmn4 z^49%8TT0XsH_Xm@SHe=T_0XtHF{*4lrnczm)4{SUpqpoc2&234Zp@Z&iX*$Pal=BO z;%mXyYc27J_dk8oA%_IGL_|(k&ESqlOw#+WL?e}c^fq1k>tov6hd))Y;j+{x&T?^LKS zUtcj&s<{(@hDN!71-^V89fKT=91ZO<8X9h}tKnlO$w+?iwd<(=py)q-ob8>hVLoow z|9RJ+)u{jc15FS7b=%d&#@^P`0|K*mb%6?9hq<~sSwK9l|NplV`CnSGadL>p7Ky zwEve@oUL6v|6hHf1^4~)a{_+-Pl?=I-8|h;P5obGqW`B6@Ebq+|7-_hX=&|b4PKP% z|6Q(s_sH(Qw1j%cZV(r1r~gHda{o&^ZXT|-9@bFk|Lz^l{+E`ZFbE7B3HAT@+^_!Y z9g$-E&v#_+46(I_UcY4zbB4G<{}%7^<;&*-xZ%`p0t-Ao-;)r-A?f zRyI~*G&DUsPiG4kh`kf^I_&qa{BAC`|Jm>Gi0?lIfwa7!4;26Ex0NCqn!19XJfE_L w;`P5@*nbiI&v^v&`Hvr@5*nJNs|(E91$H4j7I;HwXe8jDHF%zWH|nqd1Nerlg#Z8m literal 0 HcmV?d00001 diff --git a/src/IAEngine.c b/src/IAEngine.c index c8bd87d..efaa924 100644 --- a/src/IAEngine.c +++ b/src/IAEngine.c @@ -162,29 +162,75 @@ int FindPath(ARENA_H_TILE *arena,PLAYER *player1, PLAYER *player2) } -int IAEngine(ARENA_H_TILE *arena,TILE *t_list,PLAYER *player1,PLAYER *player2) -{ +/* +static void refreshWMap(float map[A_WIDTH][A_HEIGHT]) { + int16_t i,j,k,l; + uint8_t x,y; + float ng_matrix[3][3]; + + for (i=0; i=A_WIDTH ? A_WIDTH-1 : k; + l = l>=A_HEIGHT ? A_HEIGHT-1 : l; + ng_matrix[x][y] = map[k][l]; + } + } + + newmap[i][j] = (0.25 * (ng_matrix[0][0]) + 0.5 * (ng_matrix[1][0]) + 0.25 * (ng_matrix[2][0]) + + 0.5 * (ng_matrix[0][1]) + 1.0 * (ng_matrix[1][1]) + 0.5 * (ng_matrix[2][1]) + + 0.25 * (ng_matrix[0][2]) + 0.5 * (ng_matrix[1][2]) + 0.25 * (ng_matrix[2][2])) / 9; + } + } +} +*/ + +int IAEngine(ARENA_H_TILE *arena, TILE *t_list, PLAYER *p1, PLAYER *p2) { + /* + //uint8_t windowSizeX, windowSizeY; + //uint8_t scanStartX, scanStartY; + float wMap[A_WIDTH][A_HEIGHT] = {0.0f}; + + // Set the max value on the player location + wMap[p1->PositionX][p1->PositionY] = 1.0f; + + // Compute the max scan window (for optimization) + //windowSizeX = abs(p2->PositionX - p1->PositionX); + //windowSizeY = abs(p2->PositionY - p1->PositionY); + */ + + + + + + + + //Fonction avec seulement 2 joueurs, voir la gestion quand il y a 2 IA supplémentaire //Player 1 est le joueur, player 2 le bot int action; - if((player1 != NULL) & (player2 !=NULL)) + if((p1 != NULL) && (p2 !=NULL)) { //On récupère les positions des 2 joueurs . L'IA sait où est le joueur //action = FindShortestPath(player1->PositionX,player1->PositionY,player2->PositionX,player2->PositionY); - action = FindPath(arena,player1,player2); + action = FindPath(arena, p1, p2); //On vérifie si les 2 joueurs sont à côté pour attaquer printf("Vérification position\n"); - /*action = FindShortestPath(player1->PositionX,player1->PositionY,player2->PositionX,player2->PositionY); - if(action == 5) - { - AttackPlayer(player2,player1); - }*/ + //action = FindShortestPath(player1->PositionX,player1->PositionY,player2->PositionX,player2->PositionY); + //if(action == 5) + //{ + // AttackPlayer(player2,player1); + //} } return action; } diff --git a/src/IAEngine.h b/src/IAEngine.h index b458332..5dc69d0 100644 --- a/src/IAEngine.h +++ b/src/IAEngine.h @@ -1,6 +1,6 @@ #include "main.h" #include "arenaEngine.h" -#include +#include #ifndef IAENGINE_H_ #define IAENGINE_H_ diff --git a/src/arenaEngine.c b/src/arenaEngine.c index 328d171..98af09d 100644 --- a/src/arenaEngine.c +++ b/src/arenaEngine.c @@ -3,198 +3,229 @@ #include #include "arenaEngine.h" -/* - * Arena generate functions - */ + +/* ======================================= TILES STUFF ======================================= */ + +static TILE *createTile(const int id, const char *img_name, const TILE_CONFIG config, TILE *prev) { + TILE *tile = NULL; + char imgPath[64] = {0}; + char logMess[64] = {0}; + + // Allocate a new tile in memory + tile = calloc(1,sizeof(TILE)); + if (tile == NULL) { + sprintf(logMess, "Adding tile ID %d failed!", id); + addLogWarn(logMess); + return tile; + } + + // Configure the tile + tile->type_id = id; + sprintf(imgPath, "data/tile_%s.png", img_name); + tile->texture = IMG_Load(imgPath); + tile->canBeMined = (config & TILE_CONFIG_MINEABLE); + tile->isGround = (config & TILE_CONFIG_GROUND); + tile->nextTile = NULL; + + if (!tile->texture) { + sprintf(logMess, "Adding texture for tile ID %d failed!", id); + addLogWarn(logMess); + return tile; + } + + // Link to the previous tile in list + if (prev) + prev->nextTile = tile; + + // Return the pointer to new allocated tile + return tile; +} + +static void deleteAllTiles(TILE *tileList) { + if (!tileList) return; + + if (tileList->nextTile) + deleteAllTiles(tileList->nextTile); + + if (tileList->texture) + SDL_FreeSurface(tileList->texture); + + free(tileList); +} + + +/* ======================================= PLAYERS STUFF ======================================= */ + +static PLAYER *createPlayer(const int id, const char *img_name, int sPosX, int sPosY, PLAYER *prev) { + PLAYER *p = NULL; + char imgPath[64] = {0}; + char logMess[64] = {0}; + + // Allocate a new player in memory + p = calloc(1,sizeof(PLAYER)); + if (p == NULL) { + sprintf(logMess, "Adding player ID %d failed!", id); + addLogWarn(logMess); + return p; + } + + // Configure the player + p->Id = id; + p->PositionX = sPosX; + p->PositionY = sPosY; + sprintf(imgPath, "data/sprite_%s_0.png", img_name); + p->texture[DOWN] = IMG_Load(imgPath); + sprintf(imgPath, "data/sprite_%s_1.png", img_name); + p->texture[UP] = IMG_Load(imgPath); + sprintf(imgPath, "data/sprite_%s_2.png", img_name); + p->texture[LEFT] = IMG_Load(imgPath); + sprintf(imgPath, "data/sprite_%s_3.png", img_name); + p->texture[RIGHT] = IMG_Load(imgPath); + + if (!p->texture[DOWN] || !p->texture[UP] || !p->texture[LEFT] || !p->texture[RIGHT]) { + sprintf(logMess, "Adding texture for player ID %d failed!", id); + addLogWarn(logMess); + return p; + } + + // Link to the previous player in list + if (prev) + prev->suiv = p; + + // Return the pointer to new allocated tile + return p; +} + +static void deleteAllPlayers(PLAYER *pList) { + if (!pList) return; + + if (pList->suiv) + deleteAllPlayers(pList->suiv); + + if (pList->texture[RIGHT]) + SDL_FreeSurface(pList->texture[RIGHT]); + if (pList->texture[LEFT]) + SDL_FreeSurface(pList->texture[LEFT]); + if (pList->texture[UP]) + SDL_FreeSurface(pList->texture[UP]); + if (pList->texture[DOWN]) + SDL_FreeSurface(pList->texture[DOWN]); + + free(pList); +} + + + +/* ======================================= ARENA GLOBAL FUNCTIONS ======================================= */ + +static void setRaceToPlayer(PLAYER *p, int race_id) { + p->Race = race_id; + switch(race_id) { + //Race ORC + case 1: p->HealthPoints = 100; + p->AttacksPoints = 10; + break; + + //Race Elfe + case 2: p->HealthPoints = 80; + p->AttacksPoints = 9; + break; + + //Race Humaine + default: + case 3: p->HealthPoints = 90; + p->AttacksPoints = 9; + } +} + TILE *createTileList(void) { - TILE *tile_0 = NULL, *tile_1 = NULL, *tile_2 = NULL, *tile_3 = NULL, *tile_4 = NULL, *tile_5 = NULL; + uint16_t id = 0; + TILE *tile_0 = NULL; + TILE *tile_1 = NULL; + TILE *tile_2 = NULL; + TILE *tile_3 = NULL; + TILE *tile_4 = NULL; + TILE *tile_5 = NULL; - tile_0 = calloc(1,sizeof(TILE)); - tile_1 = calloc(1,sizeof(TILE)); - tile_2 = calloc(1,sizeof(TILE)); - tile_3 = calloc(1,sizeof(TILE)); - tile_4 = calloc(1,sizeof(TILE)); - tile_5 = calloc(1,sizeof(TILE)); + // GRASS tile + tile_0 = createTile(id++, + "grass", + (TILE_CONFIG_GROUND), + NULL + ); - tile_0->type_id = 0; - tile_0->texture = IMG_Load("data/tile_grass.png"); - tile_0->canBeMined = 0; - tile_0->isGround = 1; - tile_0->nextTile = tile_1; + // ROCK tile + tile_1 = createTile(id++, + "rock", + (TILE_CONFIG_GROUND), + tile_0 + ); - if (!tile_0->texture) addLogWarn("GRASS tex failed!"); + // TREE tile + tile_2 = createTile(id++, + "tree", + (TILE_CONFIG_NONE), + tile_1 + ); - tile_1->type_id = 1; - tile_1->texture = IMG_Load("data/tile_rock.png"); - tile_1->canBeMined = 0; - tile_1->isGround = 1; - tile_1->nextTile = tile_2; + // WATER tile + tile_3 = createTile(id++, + "water", + (TILE_CONFIG_NONE), + tile_2 + ); - tile_2->type_id = 2; - tile_2->texture = IMG_Load("data/tile_tree.png"); - tile_2->canBeMined = 0; - tile_2->isGround = 0; - tile_2->nextTile = tile_3; + // GOLD tile + tile_4 = createTile(id++, + "gold", + (TILE_CONFIG_GROUND | TILE_CONFIG_MINEABLE), + tile_3 + ); - tile_3->type_id = 3; - tile_3->texture = IMG_Load("data/tile_water.png"); - tile_3->canBeMined = 0; - tile_3->isGround = 0; - tile_3->nextTile = tile_4; - - tile_4->type_id = 4; - tile_4->texture = IMG_Load("data/tile_gold.png"); - tile_4->canBeMined = 1; - tile_4->isGround = 1; - tile_4->nextTile = tile_5; - - tile_5->type_id = 5; - tile_5->texture = IMG_Load("data/tile_spawn.png"); - tile_5->canBeMined = 0; - tile_5->isGround = 1; - tile_5->nextTile = NULL; + // SPAWN tile + tile_5 = createTile(id++, + "spawn", + (TILE_CONFIG_GROUND), + tile_4 + ); return tile_0; } PLAYER *createPlayerList(void) { - PLAYER *p0 = NULL, *p1 = NULL, *p2 = NULL, *p3 = NULL; + PLAYER *p0 = NULL; + PLAYER *p1 = NULL; + PLAYER *p2 = NULL; + PLAYER *p3 = NULL; int race; - p0 = calloc(1,sizeof(PLAYER)); - p1 = calloc(1,sizeof(PLAYER)); - p2 = calloc(1,sizeof(PLAYER)); - p3 = calloc(1,sizeof(PLAYER)); - - p0->Id = 0; - p0->PositionX = 0; - p0->PositionY = 0; - p0->texture[DOWN] = IMG_Load("data/sprite_player_0.png"); - p0->texture[UP] = IMG_Load("data/sprite_player_1.png"); - p0->texture[LEFT] = IMG_Load("data/sprite_player_2.png"); - p0->texture[RIGHT] = IMG_Load("data/sprite_player_3.png"); - p0->suiv = p1; - printf("Entrer le nom du joueur\n"); + // Create the player instance + p0 = createPlayer(0, "player", 0, 0, NULL); + printf("Enter the player name: "); scanf("%s",p0->Name); do { - printf("Race? 1:Orc 2: Elf 3:Humain \n"); + printf("1: Orc\n2: Elf\n3: Human\nRace? "); scanf("%d",&race); } while((race < 1) || (race > 3)); + setRaceToPlayer(p0, race); - p0->Race = race; + // Create the AI instance + p1 = createPlayer(1, "ia", (A_WIDTH-1), (A_HEIGHT-1), p0); + strcpy(p1->Name, "SKY-NUT"); + setRaceToPlayer(p1, (random_lim(3)+1)); - switch(race) - { - //Race ORC - case 1: p0->HealthPoints = 100; - p0->AttacksPoints = 10; - break; - - //Race Elfe - case 2: p0->HealthPoints = 80; - p0->AttacksPoints = 9; - break; - - //Race Humaine - case 3: p0->HealthPoints = 90; - p0->AttacksPoints = 9; - break; - } - - p1->Id = 1; - p1->PositionX = A_WIDTH-1; - p1->PositionY = A_HEIGHT-1; - p1->texture[DOWN] = IMG_Load("data/sprite_ia_0.png"); - p1->texture[UP] = IMG_Load("data/sprite_ia_1.png"); - p1->texture[LEFT] = IMG_Load("data/sprite_ia_2.png"); - p1->texture[RIGHT] = IMG_Load("data/sprite_ia_3.png"); - p1->suiv = p2; - strcpy(p1->Name,"SKY-NUT"); - p1->Race = random_lim(3)+1; - - switch(race) - { - //Race ORC - case 1: p1->HealthPoints = 100; - p1->AttacksPoints = 10; - break; - - //Race Elfe - case 2: p1->HealthPoints = 80; - p1->AttacksPoints = 9; - break; - - //Race Humaine - case 3: p1->HealthPoints = 90; - p1->AttacksPoints = 9; - break; - } - - p2->Id = 0; - p2->PositionX = 0; - p2->PositionY = A_HEIGHT; - //p2->texture[DOWN] = IMG_Load("data/sprite_player_0.png"); - //p2->texture[UP] = IMG_Load("data/sprite_player_1.png"); - //p2->texture[LEFT] = IMG_Load("data/sprite_player_2.png"); - //p2->texture[RIGHT] = IMG_Load("data/sprite_player_3.png"); - p2->suiv = p3; - - p3->Id = 0; - p3->PositionX = A_WIDTH; - p3->PositionY = 0; - //p3->texture[DOWN] = IMG_Load("data/sprite_player_0.png"); - //p3->texture[UP] = IMG_Load("data/sprite_player_1.png"); - //p3->texture[LEFT] = IMG_Load("data/sprite_player_2.png"); - //p3->texture[RIGHT] = IMG_Load("data/sprite_player_3.png"); - p3->suiv = NULL; + //TODO + p2 = createPlayer(2, "ia", 0, (A_HEIGHT-1), p1); + p3 = createPlayer(3, "ia", (A_WIDTH-1), 0, p2); return p0; } void clearRessourcesCache(TILE *t, PLAYER *p) { - PLAYER *p0 = NULL, *p1 = NULL, *p2 = NULL, *p3 = NULL; - TILE *tile_0 = NULL, *tile_1 = NULL, *tile_2 = NULL, *tile_3 = NULL, *tile_4 = NULL, *tile_5 = NULL; - int i; - - p0 = p; - p1 = p0->suiv; - p2 = p1->suiv; - p3 = p2->suiv; - - tile_0 = t; - tile_1 = tile_0->nextTile; - tile_2 = tile_1->nextTile; - tile_3 = tile_2->nextTile; - tile_4 = tile_3->nextTile; - tile_5 = tile_4->nextTile; - - for (i=0;i<=3;i++) { - SDL_FreeSurface(p0->texture[i]); - } - for (i=0;i<=3;i++) { - SDL_FreeSurface(p1->texture[i]); - } - /* - for (i=0;i<=3;i++) { - SDL_FreeSurface(p2->texture[i]); - } - for (i=0;i<=3;i++) { - SDL_FreeSurface(p3->texture[i]); - } - */ - - free(p3);free(p2);free(p1);free(p0); - - SDL_FreeSurface(tile_0->texture); - SDL_FreeSurface(tile_1->texture); - SDL_FreeSurface(tile_2->texture); - SDL_FreeSurface(tile_3->texture); - SDL_FreeSurface(tile_4->texture); - SDL_FreeSurface(tile_5->texture); - - free(tile_0);free(tile_1);free(tile_2);free(tile_3);free(tile_4);free(tile_5); + deleteAllPlayers(p); + deleteAllTiles(t); } ARENA_H_TILE* createHTile(ARENA_H_TILE* prevHTile) { diff --git a/src/arenaEngine.h b/src/arenaEngine.h index e2c88e8..4cfa801 100644 --- a/src/arenaEngine.h +++ b/src/arenaEngine.h @@ -1,6 +1,6 @@ #include "main.h" -#include -#include +#include +#include #include "fileHandler.h" #include "logHelper.h" @@ -8,6 +8,11 @@ #define ARENAENGINE_H_ +typedef uint8_t TILE_CONFIG; +#define TILE_CONFIG_NONE (0x0) +#define TILE_CONFIG_MINEABLE (0x1) +#define TILE_CONFIG_GROUND (0x2) + typedef struct tileType{ int type_id; @@ -15,7 +20,7 @@ typedef struct tileType{ int isGround; int canBeMined; struct tileType *nextTile; -}TILE; +} TILE; typedef struct Player { @@ -37,20 +42,20 @@ typedef struct Player struct Player * suiv; -}PLAYER; +} PLAYER; typedef struct arena_h_tile{ //Rows chained list int type_id; //PLAYER* playerOnTile; struct arena_h_tile *nextRow; struct arena_w_tile *nextColumn; -}ARENA_H_TILE; +} ARENA_H_TILE; typedef struct arena_w_tile{ //Columns chained list int type_id; //PLAYER* playerOnTile; struct arena_w_tile *nextColumn; -}ARENA_W_TILE; +} ARENA_W_TILE; //Generation functions diff --git a/src/arenaGUI.h b/src/arenaGUI.h index 56e67aa..8f53145 100644 --- a/src/arenaGUI.h +++ b/src/arenaGUI.h @@ -2,8 +2,8 @@ #include "arenaEngine.h" #include "logHelper.h" #include "IAEngine.h" -#include -#include +#include +#include //#include #ifndef ARENAGUI_H_ diff --git a/src/fileHandler.h b/src/fileHandler.h index 63d44d7..c7fca1b 100644 --- a/src/fileHandler.h +++ b/src/fileHandler.h @@ -1,6 +1,6 @@ #include "main.h" -#include -#include +#include +#include #ifndef FILEHANDLER_H_ #define FILEHANDLER_H_ diff --git a/src/main.c b/src/main.c index 80ed628..fdced49 100644 --- a/src/main.c +++ b/src/main.c @@ -3,11 +3,11 @@ #include #include #include "logHelper.h" -#include -#include -//#include -//#include -//#include +#include +#include +//#include +//#include +//#include #include "arenaEngine.h" #include "arenaGUI.h" #include "IAEngine.h" @@ -30,17 +30,25 @@ int random_lim(int max) { int main(int argc, char *argv[]) { - addLogInfo("Starting game..."); + addLogInfo("Starting game"); srand(time(NULL)); - addLogInfo("Try init SDL libs..."); + addLogInfo("Try init SDL libs"); initDisplayLib(); - addLogInfo("Load ressources in memory..."); + addLogInfo("Load resources in memory"); TILE *tile_ressources = createTileList(); PLAYER *player_ressources = createPlayerList(); - addLogInfo("Create SDL windows instance..."); - SDL_Window* gameWindows = SDL_CreateWindow("Arena Survival Tournament - alpha 0.3", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOWS_WIDTH, WINDOWS_HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS); + // Create and display the arena view + addLogInfo("Create SDL windows instance"); + SDL_Window* gameWindows = SDL_CreateWindow( + "Arena Survival Tournament - r4", + SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, + WINDOWS_WIDTH, + WINDOWS_HEIGHT, + (SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS) + ); addLogInfo("Creating new arena..."); ARENA_H_TILE* arena = NULL; @@ -55,7 +63,7 @@ int main(int argc, char *argv[]) { //IMG_Init(IMG_INIT_JPG & IMG_INIT_PNG); displayArena(arena, gameWindows, tile_ressources, A_HEIGHT, A_WIDTH, TILE_SIZE); - while (updateArena(gameWindows,arena,tile_ressources,player_ressources)!=0) {} + while (!updateArena(gameWindows,arena,tile_ressources,player_ressources)) {} SDL_DestroyWindow(gameWindows); deleteArena(arena); diff --git a/src/main.h b/src/main.h index 5fd73ad..f5a39a8 100644 --- a/src/main.h +++ b/src/main.h @@ -11,8 +11,8 @@ /* * Generator tiles spawn rate (in percent) */ -#define ROCK_GEN_RATE 28 -#define TREE_GEN_RATE 22 +#define ROCK_GEN_RATE 30 +#define TREE_GEN_RATE 25 #define WATER_GEN_RATE 8 #define GOLD_GEN_RATE 10 diff --git a/src/menuGUI.c b/src/menuGUI.c index 97013cf..64938dc 100644 --- a/src/menuGUI.c +++ b/src/menuGUI.c @@ -9,7 +9,14 @@ int createGameMenuWindows() { } SDL_Window *main_test; - main_test = SDL_CreateWindow("My test windows", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 320, 140, SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS); + main_test = SDL_CreateWindow( + "My test windows", + SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, + 320, + 140, + (SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS) + ); SDL_Delay(5000); SDL_DestroyWindow(main_test); diff --git a/src/menuGUI.h b/src/menuGUI.h index fe55a7d..122cae7 100644 --- a/src/menuGUI.h +++ b/src/menuGUI.h @@ -1,8 +1,8 @@ -#include +#include #ifndef MENUGUI_H_ #define MENUGUI_H_ - +int createGameMenuWindows(); #endif