From f9e28acea4bf5751fd918b8a28e46d411a04b4cf Mon Sep 17 00:00:00 2001 From: Alice Date: Sat, 21 Mar 2020 18:43:27 +0100 Subject: [PATCH] "working" version (also cpc26 version) Way too much >_< --- assets-fx/icon-fx.png | Bin 7429 -> 6958 bytes assets-fx/img/ally.png | Bin 0 -> 584 bytes assets-fx/img/cloud.png | Bin 0 -> 583 bytes assets-fx/img/cloud_big.png | Bin 0 -> 683 bytes assets-fx/img/cursor.png | Bin 0 -> 619 bytes assets-fx/img/foe.png | Bin 0 -> 587 bytes assets-fx/img/foe_big.png | Bin 0 -> 608 bytes assets-fx/img/forest.png | Bin 0 -> 581 bytes assets-fx/img/forest_big.png | Bin 0 -> 630 bytes assets-fx/img/mountain.png | Bin 0 -> 585 bytes assets-fx/img/mountain_big.png | Bin 0 -> 546 bytes assets-fx/img/path.png | Bin 0 -> 580 bytes assets-fx/img/path_big.png | Bin 0 -> 553 bytes assets-fx/img/tanya.png | Bin 0 -> 610 bytes assets-fx/img/title.png | Bin 0 -> 1253 bytes cpc26.g1a | Bin 18808 -> 32448 bytes include/engine.h | 15 + include/level.h | 93 ++++ include/test.h | 89 ++++ src/engine.c | 870 +++++++++++++++++++++++++++++++++ src/main.c | 12 +- 21 files changed, 1075 insertions(+), 4 deletions(-) create mode 100644 assets-fx/img/ally.png create mode 100644 assets-fx/img/cloud.png create mode 100644 assets-fx/img/cloud_big.png create mode 100644 assets-fx/img/cursor.png create mode 100644 assets-fx/img/foe.png create mode 100644 assets-fx/img/foe_big.png create mode 100644 assets-fx/img/forest.png create mode 100644 assets-fx/img/forest_big.png create mode 100644 assets-fx/img/mountain.png create mode 100644 assets-fx/img/mountain_big.png create mode 100644 assets-fx/img/path.png create mode 100644 assets-fx/img/path_big.png create mode 100644 assets-fx/img/tanya.png create mode 100644 assets-fx/img/title.png create mode 100644 include/engine.h create mode 100644 include/level.h create mode 100644 include/test.h create mode 100644 src/engine.c diff --git a/assets-fx/icon-fx.png b/assets-fx/icon-fx.png index c92f12afab0af9f7b3d8e2bec76a1dc5cc9c08a1..3171b5f080ec6323c3b8b912d6a8f9f8b5b01ed2 100644 GIT binary patch delta 6915 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 Q(*OVf07*qoM6N<$f~N;y`2YX_ diff --git a/assets-fx/img/ally.png b/assets-fx/img/ally.png new file mode 100644 index 0000000000000000000000000000000000000000..d9cb702f3f814ae8a236e429650432a24b0b242b GIT binary patch literal 584 zcmV-O0=NB%P)EX>4Tx04R}tkv&MmKpe$iQ$>-ALyL$wWT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|}?mh0_0YbgZG^=AA&~)2O zCE{WxyDE0QB8V_T7)8I#EMrcRlJFg0_XzOyF2=L`&;2=i)ttqEfJi*c4AUmwAfDc| z4bJ<-5muB{;&b9LlP*a7$aTfzH_io@1)do()2Vsl2(egbW2KE*(bR~ih@+~eQ@)V# zSmnIMSu0mr^Pc>Lp`5<5%ypVWNMI35kRU=q6(y8mBSx!EiiH&I$9?>Ru3sXTLaq`R zITlcX2HEw4|H1EWt^DMKmlTQvoiC2_F${F=0*#vEd>=bb;{*sk16O*>U#SB#pQP7X zTJ#9$+XgPKTbi;5Tq6A~09J_QAt0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN zGD$>1R0!8&V88EX>4Tx04R}tkv&MmKpe$iQ$>-ALyL$wWT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|}?mh0_0YbgZG^=AA&~)2O zCE{WxyDE0QB8V_T7)8I#EMrcRlJFg0_XzOyF2=L`&;2=i)ttqEfJi*c4AUmwAfDc| z4bJ<-5muB{;&b9LlP*a7$aTfzH_io@1)do()2Vsl2(egbW2KE*(bR~ih@+~eQ@)V# zSmnIMSu0mr^Pc>Lp`5<5%ypVWNMI35kRU=q6(y8mBSx!EiiH&I$9?>Ru3sXTLaq`R zITlcX2HEw4|H1EWt^DMKmlTQvoiC2_F${F=0*#vEd>=bb;{*sk16O*>U#SB#pQP7X zTJ#9$+XgPKTbi;5Tq6Acg?5*Do30000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN zF-b&0R0!8?jzJ0lFbKnz{r}I|p+h#b7aT1~;z=yM2hN|+SNCUms`Ztxa!vWo8 VAnzLQmR|q>002ovPDHLkV1ke@^J@SA literal 0 HcmV?d00001 diff --git a/assets-fx/img/cloud_big.png b/assets-fx/img/cloud_big.png new file mode 100644 index 0000000000000000000000000000000000000000..172774f393bf714dd88e96c3be91ffd716022d93 GIT binary patch literal 683 zcmV;c0#yBpP)EX>4Tx04R~2kiSa9P!z_0X+=fshrmxz@<%Cl_Y(`9(kWkT;X6hW{urGBf2)L&tlqSUL z%`{VSBP!+Oawr;zbeo2}tvb(B%19m)d6|SeQhAy@%>RC`eVo;s*5*79ilA<_Rju(D z-XEbegtcc_xo*f>{{6Ow8K<84=NrEOzWGp4t+Ewm00009a7bBm000w+000w+0i%iu zC;$Ke2XskIMF->q6%I8ymdr{00003RNkll|Qqpq6US3`Z5 zt9j-sM9oA8x+a(&kbl6;2v+sOJh#I|s_fcOMCQ?nacw)>)+#soAna>NV0*>eoGokk zd(nN5EX>4Tx04R}tkv&MmKpe$iQ$>-ALyL$wWT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|}?mh0_0YbgZG^=AA&~)2O zCE{WxyDE0QB8V_T7)8I#EMrcRlJFg0_XzOyF2=L`&;2=i)ttqEfJi*c4AUmwAfDc| z4bJ<-5muB{;&b9LlP*a7$aTfzH_io@1)do()2Vsl2(egbW2KE*(bR~ih@+~eQ@)V# zSmnIMSu0mr^Pc>Lp`5<5%ypVWNMI35kRU=q6(y8mBSx!EiiH&I$9?>Ru3sXTLaq`R zITlcX2HEw4|H1EWt^DMKmlTQvoiC2_F${F=0*#vEd>=bb;{*sk16O*>U#SB#pQP7X zTJ#9$+XgPKTbi;5Tq6A~9K8}r_10000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN zRY^oaR2b8JkiiasFbG2nG5-H`|7!NUbV@cI7f30kAg#d+q$B~jNg-nVod!EX>4Tx04R}tkv&MmKpe$iQ$>-ALyL$wWT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|}?mh0_0YbgZG^=AA&~)2O zCE{WxyDE0QB8V_T7)8I#EMrcRlJFg0_XzOyF2=L`&;2=i)ttqEfJi*c4AUmwAfDc| z4bJ<-5muB{;&b9LlP*a7$aTfzH_io@1)do()2Vsl2(egbW2KE*(bR~ih@+~eQ@)V# zSmnIMSu0mr^Pc>Lp`5<5%ypVWNMI35kRU=q6(y8mBSx!EiiH&I$9?>Ru3sXTLaq`R zITlcX2HEw4|H1EWt^DMKmlTQvoiC2_F${F=0*#vEd>=bb;{*sk16O*>U#SB#pQP7X zTJ#9$+XgPKTbi;5Tq6A~0KQ`q5h0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN zHAzH4R0!97jX4ScAOOQs@&8|ri;8%4Y6&#(NmO630wg(rN*QGb0O`Z=FhQ2T)t#GX ZPXk7C7ywMp@w5N{002ovPDHLkV1iYM@?Zb} literal 0 HcmV?d00001 diff --git a/assets-fx/img/foe_big.png b/assets-fx/img/foe_big.png new file mode 100644 index 0000000000000000000000000000000000000000..99713f6a50c43b7eaf38ad11d127d28ccf3ee2f8 GIT binary patch literal 608 zcmV-m0-ybfP)EX>4Tx04R~2kiSa9P!z_0X+=fshrmxz@<%Cl_Y(`9(kWkT;X6hW{urGBf2)L&tlqSUL z%`{VSBP!+Oawr;zbeo2}tvb(B%19m)d6|SeQhAy@%>RC`eVo;s*5*79ilA<_Rju(D z-XEbegtcc_xo*f>{{6Ow8K<84=NrEOzWGp4t+Ewm00009a7bBm000w+000w+0i%iu zC;$Ke2XskIMF->q6%Pa_t6Uiy0002bNklNbql!Gu>J8-pjxg)HSw!EJ{8HAhBk}UYxV(UIB_J&#psvQnNpJ;R zSgvF>yeUxiSsEAv#vZDFjcd;YsrW;lIkcuIf-!O(>wVQX%EX>4Tx04R}tkv&MmKpe$iQ$>-ALyL$wWT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|}?mh0_0YbgZG^=AA&~)2O zCE{WxyDE0QB8V_T7)8I#EMrcRlJFg0_XzOyF2=L`&;2=i)ttqEfJi*c4AUmwAfDc| z4bJ<-5muB{;&b9LlP*a7$aTfzH_io@1)do()2Vsl2(egbW2KE*(bR~ih@+~eQ@)V# zSmnIMSu0mr^Pc>Lp`5<5%ypVWNMI35kRU=q6(y8mBSx!EiiH&I$9?>Ru3sXTLaq`R zITlcX2HEw4|H1EWt^DMKmlTQvoiC2_F${F=0*#vEd>=bb;{*sk16O*>U#SB#pQP7X zTJ#9$+XgPKTbi;5Tq6Ac9kNPey-0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN zFG)l}R0!97jY$dsAPfU1{r{iGLqWufIb|hL8K_Gq0qCy!9C5le1GP5$y>+|*X{a6V T8a8KS00000NkvXXu0mjf{kZM+ literal 0 HcmV?d00001 diff --git a/assets-fx/img/forest_big.png b/assets-fx/img/forest_big.png new file mode 100644 index 0000000000000000000000000000000000000000..0b104a4be02a654236caf5661cf7781ca8b2b7be GIT binary patch literal 630 zcmV-+0*U>JP)EX>4Tx04R~2kiSa9P!z_0X+=fshrmxz@<%Cl_Y(`9(kWkT;X6hW{urGBf2)L&tlqSUL z%`{VSBP!+Oawr;zbeo2}tvb(B%19m)d6|SeQhAy@%>RC`eVo;s*5*79ilA<_Rju(D z-XEbegtcc_xo*f>{{6Ow8K<84=NrEOzWGp4t+Ewm00009a7bBm000w+000w+0i%iu zC;$Ke2XskIMF->q6%H{DN*yWo0002xNklFx@75O-Ij%vzM>tS%T(Ry=xt`ZE|>9xc_@9C=W>%+54}uQlJ;!B+hi4-O`tdK z^1qvN9nCQ|ZawGYM&F%swd1P8Q_d%pw62e8$S>{Twa_@AFAKD@uUA+ysd QZU6uP07*qoM6N<$f*bD|2LJ#7 literal 0 HcmV?d00001 diff --git a/assets-fx/img/mountain.png b/assets-fx/img/mountain.png new file mode 100644 index 0000000000000000000000000000000000000000..206021affb39d06b4d78cf37b9355f01bcac4fc1 GIT binary patch literal 585 zcmV-P0=E5$P)EX>4Tx04R}tkv&MmKpe$iQ$>-ALyL$wWT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|}?mh0_0YbgZG^=AA&~)2O zCE{WxyDE0QB8V_T7)8I#EMrcRlJFg0_XzOyF2=L`&;2=i)ttqEfJi*c4AUmwAfDc| z4bJ<-5muB{;&b9LlP*a7$aTfzH_io@1)do()2Vsl2(egbW2KE*(bR~ih@+~eQ@)V# zSmnIMSu0mr^Pc>Lp`5<5%ypVWNMI35kRU=q6(y8mBSx!EiiH&I$9?>Ru3sXTLaq`R zITlcX2HEw4|H1EWt^DMKmlTQvoiC2_F${F=0*#vEd>=bb;{*sk16O*>U#SB#pQP7X zTJ#9$+XgPKTbi;5Tq6Ab_WOx5DX0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN zGf6~2R0!8yi?Iy=Fbu+Q)&F0n0}_eKL`;lrNs@r}vk@?~UmeJy6=0C<8n-BJ20lG` Xr#UA2NEX>4Tx04R~2kiSa9P!z_0X+=fshrmxz@<%Cl_Y(`9(kWkT;X6hW{urGBf2)L&tlqSUL z%`{VSBP!+Oawr;zbeo2}tvb(B%19m)d6|SeQhAy@%>RC`eVo;s*5*79ilA<_Rju(D z-XEbegtcc_xo*f>{{6Ow8K<84=NrEOzWGp4t+Ewm00009a7bBm000w+000w+0i%iu zC;$Ke2XskIMF->q6%H#J;OYlZ0001yNklAc7`NKQA0PQ_iLLM#NH~;_u07*qoM6N<$g6|yX_y7O^ literal 0 HcmV?d00001 diff --git a/assets-fx/img/path.png b/assets-fx/img/path.png new file mode 100644 index 0000000000000000000000000000000000000000..dcc3dfed65a7c92e9bb3c03508e6624bc0114547 GIT binary patch literal 580 zcmV-K0=xZ*P)EX>4Tx04R}tkv&MmKpe$iQ$>-ALyL$wWT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|}?mh0_0YbgZG^=AA&~)2O zCE{WxyDE0QB8V_T7)8I#EMrcRlJFg0_XzOyF2=L`&;2=i)ttqEfJi*c4AUmwAfDc| z4bJ<-5muB{;&b9LlP*a7$aTfzH_io@1)do()2Vsl2(egbW2KE*(bR~ih@+~eQ@)V# zSmnIMSu0mr^Pc>Lp`5<5%ypVWNMI35kRU=q6(y8mBSx!EiiH&I$9?>Ru3sXTLaq`R zITlcX2HEw4|H1EWt^DMKmlTQvoiC2_F${F=0*#vEd>=bb;{*sk16O*>U#SB#pQP7X zTJ#9$+XgPKTbi;5Tq6AcLi1Re-A0000PbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAV*0}P*;Ht7XSbN zE=fc|R0!8?jX??kFbu+?|NpZ)6pD;`GXzxrz3Cpf=QaEX>4Tx04R~2kiSa9P!z_0X+=fshrmxz@<%Cl_Y(`9(kWkT;X6hW{urGBf2)L&tlqSUL z%`{VSBP!+Oawr;zbeo2}tvb(B%19m)d6|SeQhAy@%>RC`eVo;s*5*79ilA<_Rju(D z-XEbegtcc_xo*f>{{6Ow8K<84=NrEOzWGp4t+Ewm00009a7bBm000w+000w+0i%iu zC;$Ke2XskIMF->q6%H*Y?%3?d0001(NklEX>4Tx04R~2kiSa9P!z_0X+=fshrmxz@<%Cl_Y(`9(kWkT;X6hW{urGBf2)L&tlqSUL z%`{VSBP!+Oawr;zbeo2}tvb(B%19m)d6|SeQhAy@%>RC`eVo;s*5*79ilA<_Rju(D z-XEbegtcc_xo*f>{{6Ow8K<84=NrEOzWGp4t+Ewm00009a7bBm000w+000w+0i%iu zC;$Ke2XskIMF->q6%Pt4JZX5o0002dNklgIeNng>u0uR-n~(l-)wFgw~~7IW(^wc=xF~JI7yhdXMQEAJ!jlz5=yQo zVAf=e!w0KQ?i5w_6QkAZXNdY=_@Z@@y6bQQgN4;E(;D1~u>Za?9Vk8=+eIiIfUAkZ w2#LnaUg%JHHbtX#>;Th*8B0$f#k~CJe%_UoEYUBEIsgCw07*qoM6N<$g6iQ46951J literal 0 HcmV?d00001 diff --git a/assets-fx/img/title.png b/assets-fx/img/title.png new file mode 100644 index 0000000000000000000000000000000000000000..f74f9b87358bd8a7193d327e809144f853c26cce GIT binary patch literal 1253 zcmVEX>4Tx04R~2kiSa9P!z_0X+=fshrmxz@<%Cl_Y(`9(kWkT;X6hW{urGBf2)L&tlqSUL z%`{VSBP!+Oawr;zbeo2}tvb(B%19m)d6|SeQhAy@%>RC`eVo;s*5*79ilA<_Rju(D z-XEbegtcc_xo*f>{{6Ow8K<84=NrEOzWGp4t+Ewm00009a7bBm000w+000w+0i%iu zC;$Ke2XskIMF->q6%RWP#y6YY000A2Nklu$v$2tGEx|0{RD&gKjtShd_p zmZgo=9{9MH+H&9b{YeT-SF#`hkdy#ON&o;<3VvM5-ydf@bxnUR=^WLWi%R)?+R(8- z#^}EPkLAqc0T`OY>~sNX0eBkA)$)j1#C4%2U4RDRTXY9j09$+J?zr)l0J6YXOF*qX zV>!b5T7~{v&iQt3Y`m1gkd!U`^CaMl77SXTi{n3`QY}`#Gvg00u$O3-rG6)D#MMIb#z53Q3Y-WcyhY1bSkI)(1qIc^ozf zjArUl3!ps}+bN_|AkfU?>RAi0MwF*xJ-LADMbOx>q%<6{FqMU%;FJJJ03;;E=ASYobsn)fUPAJ+7zCRsYi$c<>`v6+y@QUFH1`j#%>pbPMtjbs|= zAS2NN?3&_u$32{|nw)j2H|Aog9h3%20=!Wg`2+;*8q|9I@1i!q;98i=n`S{wfnFTN z-b@;G6}RVBY;FNr1nNasjs=le8J97DB=?7e4{2O4gq1#=)3Qz-LrpE*`*R-yaLhfm z9Ui8kv;Lghp#*KB!5J@gOP6P%w=RGhNB!5bJ>IVSaAN_u)jMe1$O2&T#3^v>T&HON zV8qBDYfkf417*i=uU0gB^zPmpprG!<$|GV^E}#X0L>Rk;Esg3|T9~KLNQ#wj21z%v zd;*G9!rt+M3DmOoWUXT9qfrvg;tEXCHV}S9sK> zR~m&KG7a1f3hKeh+nk|#7iT`%6B+!#9LzuPSmu zJhB|v`RoWX0?ygu(rAtZK!7-h+L<*0VASXLtzT3}6yz#?1Iqk-d~Eswdyi(7MWJJI P00000NkvXXu0mjf#}7B0 literal 0 HcmV?d00001 diff --git a/cpc26.g1a b/cpc26.g1a index c1f80621ccc522d0ab55b6d3024cb1782ef80175..7669ffb291e1e4293042d876e232c7b537501443 100644 GIT binary patch delta 15187 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 delta 1618 zcmYjRUr3u*6hHU#OP0h;gN;q7P7ih(L3ceThdytm4 z%N~~nT@zKH74OCMBkpf|LOg&GICrq_a-sILsn9np*Kj@$d7x)C+hiYtuFN^yH_ifH zpIS96TFYj<*D6fwX%cc3YqY_ZeJ|>I?Mf-053?iRWX18TXA~$>(;bJ{4WQZ;Hf_10 zwi`wLSj>M*QjPN+{}|D!#(`F2Sxt2;*cs;=mNugHCxH5rEPF0etE$7p4G5#gAnOrA zHw%u9TED2WA7aS;MXC;{Imw*$KcCQIw^`8KZo5lN!rY9#C~PUMv7qBD|D~ZrvWT^k z%hEdbbQm$sgN}EPeV|`FPC2@8Y^Ldv2^&Nsv%>UrMEs#MLL~bklbauz>cfRTVno72 z(QJb4Hn*7yX<}+3O_8oRz_!5bE}PUa!TMbmA*Nln+J=cC+qOKHYq=gQpZar7F3v5* zWvhFat#;nD*xhM)ylRuYM>1s@OzGZR`*jl&oc8^7J?l5c5fpmVBX@Z^7`4kTauZtA< zddNm9JZsoK^c=yNZC>V2d#i}#HnLpbh!C>x9v=?hmzo=6I61pG-fJj#l-L4dVJc$%2U7bQ3lH3q+B1A(V3Tm?-~rJ^aMHUlm(DM_`BJlV z>YWWnx0v+=(H{d)EY1G av}UcuACto7)K9M%=(2b*==tpHVe&tvM~6QE diff --git a/include/engine.h b/include/engine.h new file mode 100644 index 0000000..09009a9 --- /dev/null +++ b/include/engine.h @@ -0,0 +1,15 @@ +#ifndef _ENGINE_H_ +#define _ENGINE_H_ + +void start_engine(Level * level); +void init_engine(Level * level, Engine * engine); +void textbox(char * str); +void expo(Slide * slide, int nb_slide); +void move(Engine * engine); +void sprint(Engine * engine); +void atk(Engine * engine); +void atk2(Engine * engine); +void display(Engine * engine); +void player(Engine * engine); +void ia(Engine * engine); +#endif // _ENGINE_H_ diff --git a/include/level.h b/include/level.h new file mode 100644 index 0000000..d1f0406 --- /dev/null +++ b/include/level.h @@ -0,0 +1,93 @@ +#ifndef _LEVEL_H_ +#define _LEVEL_H_ + +#include +#include + +typedef struct { + enum {Ally, Foe, Zero} side; + char * name; + char * rank; + image_t * picture; + int x; + int y; + int HP; + int MP; + int ATK; + int DEF; +}Entity; + +typedef enum { + Forest, + Mountain, + Path, + Cloud, +}Tile_type; + +typedef struct { + Tile_type type; + Entity * entity; +}Tile; + +typedef struct { + int width; + int height; + Tile * tile; +}Map; + +typedef struct { + enum {Text, Art} type; + union { + const char * text; + image_t * art; + }; +}Slide; + +typedef struct Engine{ + Map * map; + int nb_event; + int event_pos; + struct Event{ + int turn; + void (*ev_func)(struct Engine *); + char * dialog; + }*event_list; + int nb_entity; + Entity * entity_list; + int nb_ally; + int nb_foe; + int turn; + int x_cursor; + int y_cursor; + int x_view; + int y_view; + bool victory; + bool defeat; +}Engine; + +typedef struct { + int turn; + void (*ev_func)(struct Engine *); + char * dialog; +}Event; + +typedef struct { + int nb_pro, nb_event, nb_epi; + Slide * prologue; + Event * event_list; + Slide * epilogue; +}Script; + +typedef struct { + char * name; + image_t * art; + char * description; + Map * map; + int nb_entity; + Entity * entity_list; + Script * script; +}Level; + + +#endif // _LEVEL_H_ + diff --git a/include/test.h b/include/test.h new file mode 100644 index 0000000..9009b33 --- /dev/null +++ b/include/test.h @@ -0,0 +1,89 @@ +#include +#include "level.h" + +extern image_t img_tanya; +extern image_t img_foe_big; + +Entity missing_no={Zero, "Zero", "Missing No", NULL,0,0,0,0,0,0}; +Entity entity_list_lvl1[] = {{Ally,"Tanya", "2nd lieutenant", &img_tanya, 6,27,100,30,100,5}, + {Zero,"Enemie", "", &img_foe_big, 1,0,100,100,10,5}, + {Zero,"Enemie", "", &img_foe_big, 10,0,100,100,10,5}, + {Zero,"Enemie", "", &img_foe_big, 3,0,100,100,10,5}, + {Zero,"Enemie", "", &img_foe_big, 5,0,100,100,10,5}, + {Zero,"Enemie", "", &img_foe_big, 6,0,100,100,10,5}, + {Zero,"Enemie", "", &img_foe_big, 7,0,100,100,10,5}, + {Zero,"Enemie", "", &img_foe_big, 8,0,100,100,10,5}, + {Zero,"Enemie", "", &img_foe_big, 9,0,100,100,10,5}}; +Tile tiles_lvl1[]={ + {Mountain, &missing_no},{Mountain, &entity_list_lvl1[1]},{Mountain, &missing_no},{Mountain, &entity_list_lvl1[3]},{Path, &missing_no},{Mountain, &entity_list_lvl1[4]},{Mountain, &entity_list_lvl1[5]},{Mountain, &entity_list_lvl1[6]},{Mountain, &entity_list_lvl1[7]},{Mountain, &entity_list_lvl1[8]},{Mountain, &entity_list_lvl1[2]},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no}, + {Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no}, + {Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no}, + {Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no}, + {Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no}, + {Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no}, + {Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no}, + {Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no}, + {Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no}, + {Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no}, + {Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no}, + {Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no}, + {Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Path, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Mountain, &missing_no}, + {Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no}, + {Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no}, + {Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Mountain, &missing_no}, + {Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no}, + {Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no}, + {Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no}, + {Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Mountain, &missing_no}, + {Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Mountain, &missing_no}, + {Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no}, + {Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Forest, &missing_no}, + {Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Forest, &missing_no}, + {Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no}, + {Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Forest, &missing_no}, + {Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no}, + {Forest, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Path, &missing_no},{Mountain, &missing_no},{Forest, &entity_list_lvl1[0]},{Mountain, &missing_no},{Forest, &missing_no},{Mountain, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Forest, &missing_no},{Forest, &missing_no}}; +Map map_lvl1 = { 14, 28, tiles_lvl1}; + +Slide pro_list_lvl1[] = { + {Text, .text="Il etait une fois un salarie japonais chef du departement des ressources humaines au coeur froid, renvoyant sans pitie pour son propre interet et celui de ses employeurs"}, + {Text, .text="Du moins cela aurait ete si un ex employe ne l'avait pousse sous le metro. Il se retrouvat alors face a Dieu."}, + {Text, .text="Ce dernier en colere face a son manque de foi et son impertinance le maudit a vivre une vie a l'opose de la precedante."}, + {Text, .text="Ainsi fut-il reincarne en orpheline dans un pays en guerre et ou la technologie n'etait pas autant devellopee."}, + {Text, .text="Il se decidat alors de survivre et réussir une nouvelle fois pour detruire et se venger de cette entite qu'il nomera X refusant de l'appeler Dieu."}, + {Text, .text="Cependant a ses 9 ans, par miracle ou par malediction l'on trouva sa capacite magique expetionel et on l'enrola de force parmis les mages volant."}, + {Text, .text="Et c'est ainsi que qu'il fut deploye dans le nord avec pour mission de reconaitre la position des troupes enemies pour le compte de l'artilerie."} +}; +void trouble(Engine * engine) +{ + for(int i=1; inb_entity;i++) + { + engine->entity_list[i].side=Foe; + } +} +void victory(Engine * engine) +{ + engine->victory=true; +} +Event event_list_lvl1[] = {{0,NULL,"Tanya: tachons de briller afin d'obtenir rapidement une promotion à l'arriere..."}, + {0,NULL,"Tanya: Controle, ici pixy1, rien à signaler, je continue mon inspection."}, + {0,NULL,"Controle: Pixy1, ici controle, Bien recu"}, + {8,&trouble,"Enemies: Nous devons suprimez les unités de reconnaissance enemies"}, + {9,NULL,"Tanya: Controle, je detecte 8 signature au loin, demande de replis"}, + {9,NULL,"Controle: negatif, nous envoyons renforts, seront sur place dans 20 tours"}, + {9,NULL,"Tanya: m'envoyer à ma mort ainsi, est-ce un tour de X..."}, + {179,&victory,"Tanya: Les renforts sont bientot la, quittons le combats sous les feux des projecteurs"}, + {179,NULL,"Enemies: un sort d'auto-destruction, retraite avant que les renfort enemis arrivent"}, + {179,NULL,"BOOOOOOUUUUUUM"}, + +}; + +Slide epi_list_lvl1[] = { + {Text, .text="Pour ses exploit heroique, le second lieutenant Tanya Von Degurechhaff recu la plus haute distinction militaire, la médaille d'assault au ailes d'argent"}, + {Text, .text="Devenant ainsi la plus jeunes personne vivante à la recevoir, obtenant egalement ainsi son surnom: Argent"}, + {Text, .text="Et maintenant si vous voulez la suite, aller lire l'oeuvre original, ou harcelez Alice pour qu'elle coninue son jeux ;)"}, +}; +Script script_lvl1 = {7,10,3, pro_list_lvl1,event_list_lvl1,epi_list_lvl1}; + +Level lvl1 = {"lvl1", NULL, "description", &map_lvl1, 9,entity_list_lvl1, &script_lvl1}; + diff --git a/src/engine.c b/src/engine.c new file mode 100644 index 0000000..afda7c6 --- /dev/null +++ b/src/engine.c @@ -0,0 +1,870 @@ +#include +#include +#include +#include "level.h" +#include "engine.h" +extern Entity missing_no; +void start_engine(Level * level) +{ + Engine game; + dclear(C_WHITE); + init_engine(level, &game); + expo(level->script->prologue, level->script->nb_pro); + display(&game); + while(!game.defeat && !game.victory) + { + while(game.event_posgame.map->width-4) game.x_view=game.map->width-4; + if(game.y_view>game.map->height-4) game.y_view=game.map->height-4; + + display(&game); + if(game.event_list[game.event_pos].ev_func!=NULL) + { + (*game.event_list[game.event_pos].ev_func)(&game); + } + textbox(game.event_list[game.event_pos].dialog); + while(getkey().key!=KEY_EXE); + drect(57,30,127,63,C_WHITE); + game.event_pos++; + } + if(game.entity_list[game.turn%game.nb_entity].HP != 0 && game.entity_list[game.turn%game.nb_entity].MP!=0) + { + game.x_cursor=game.entity_list[game.turn%game.nb_entity].x; + game.y_cursor=game.entity_list[game.turn%game.nb_entity].y; + game.x_view = game.x_cursor; + game.y_view = game.y_cursor; + if(game.x_view<3) game.x_view=3; + if(game.y_view<3) game.y_view=3; + if(game.x_view>game.map->width-4) game.x_view=game.map->width-4; + if(game.y_view>game.map->height-4) game.y_view=game.map->height-4; + switch(game.entity_list[game.turn%game.nb_entity].side) + { + case Ally: + display(&game); + player(&game); + break; + case Foe: + display(&game); + ia(&game); + display(&game); + break; + default: + game.turn++; + break; + } + }else{game.turn++;} + } + if(game.victory) + { + expo(level->script->epilogue, level->script->nb_epi); + } + else + { + dclear(C_WHITE); + dtext(35,25,"Game Over", C_BLACK, C_WHITE); + dupdate(); + getkey(); + } +} + +void textbox(char * str) +{ + int len = strlen(str); + int lines = (len/11)+1; + char buff[12]; + memset(buff,0,12); + drect(57,30,127,63,C_WHITE); + for(int i = 0; imap = level->map; + engine->nb_event = level->script->nb_event; + engine->event_list = level->script->event_list; + engine->nb_entity = level->nb_entity; + engine->entity_list = level->entity_list; + engine->nb_ally = 0; + engine->nb_foe = 0; + for (int i = 0; i < engine->nb_entity; i++) + { + switch(engine->entity_list[i].side) + { + case Ally: + engine->nb_ally++; + break; + case Foe: + engine->nb_foe++; + break; + default:break; + } + } + engine->turn = 0; + engine->event_pos=0; + engine->x_view = 3; + engine->y_view = 3; + engine->x_cursor = 3; + engine->y_cursor = 3; + engine->victory = false; + engine->defeat = false; +} +void move (Engine * engine) +{ + Entity * player = &engine->entity_list[engine->turn%engine->nb_entity]; + switch(getkey().key) + { + case KEY_UP: + case KEY_8: + if(player->y>0) + { + if(engine->map->tile[((player->y - 1)*engine->map->width+player->x)].entity->side == Zero) + { + engine->map->tile[(player->y - 1)*engine->map->width+player->x].entity = player; + engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no; + player->y--; + player->MP--; + engine->turn++; + } + } + break; + case KEY_DOWN: + case KEY_2: + if(player->ymap->height-1) + { + if(engine->map->tile[((player->y + 1)*engine->map->width+player->x)].entity->side == Zero) + { + engine->map->tile[(player->y + 1)*engine->map->width+player->x].entity = player; + engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no; + player->y++; + player->MP--; + engine->turn++; + } + } + break; + case KEY_LEFT: + case KEY_4: + if(player->x>0) + { + if(engine->map->tile[((player->y)*engine->map->width+player->x - 1)].entity->side == Zero) + { + engine->map->tile[(player->y)*engine->map->width+player->x-1].entity = player; + engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no; + player->x--; + player->MP--; + engine->turn++; + } + } + break; + case KEY_RIGHT: + case KEY_6: + if(player->xmap->width-1) + { + if(engine->map->tile[((player->y)*engine->map->width+player->x + 1)].entity->side == Zero) + { + engine->map->tile[(player->y)*engine->map->width+player->x + 1].entity = player; + engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no; + player->x++; + player->MP--; + engine->turn++; + } + } + break; + case KEY_5: + player->MP--; + engine->turn++; + break; + default: + break; + } +} + +void sprint(Engine * engine) +{ + Entity * player = &engine->entity_list[engine->turn%engine->nb_entity]; + switch(getkey().key) + { + case KEY_UP: + case KEY_8: + if(player->y>1) + { + if(engine->map->tile[((player->y - 2)*engine->map->width+player->x)].entity->side == Zero) + { + engine->map->tile[(player->y - 2)*engine->map->width+player->x].entity = player; + engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no; + player->y-=2; + player->MP-=2; + engine->turn++; + } + } + break; + case KEY_DOWN: + case KEY_2: + if(player->ymap->height-2) + { + if(engine->map->tile[((player->y + 2)*engine->map->width+player->x)].entity->side == Zero) + { + engine->map->tile[(player->y + 2)*engine->map->width+player->x].entity = player; + engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no; + player->y+=2; + player->MP-=2; + engine->turn++; + } + } + break; + case KEY_LEFT: + case KEY_4: + if(player->x>1) + { + if(engine->map->tile[((player->y)*engine->map->width+player->x - 2)].entity->side == Zero) + { + engine->map->tile[(player->y)*engine->map->width+player->x-2].entity = player; + engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no; + player->x-=2; + player->MP-=2; + engine->turn++; + } + } + break; + case KEY_RIGHT: + case KEY_6: + if(player->xmap->width-2) + { + if(engine->map->tile[((player->y)*engine->map->width+player->x + 2)].entity->side == Zero) + { + engine->map->tile[(player->y)*engine->map->width+player->x + 2].entity = player; + engine->map->tile[(player->y)*engine->map->width+player->x].entity = &missing_no; + player->x+=2; + player->MP-=2; + engine->turn++; + } + } + break; + case KEY_5: + player->MP--; + engine->turn++; + break; + default: + break; + } +} + +void atk (Engine * engine) +{ + Entity * player = &engine->entity_list[engine->turn%engine->nb_entity]; + switch(getkey().key) + { + case KEY_UP: + case KEY_8: + if(player->y>0) + { + if(engine->map->tile[((player->y - 1)*engine->map->width+player->x)].entity->side != Zero) + { + engine->map->tile[(player->y - 1)*engine->map->width+player->x].entity->HP -= player->ATK; + if(engine->map->tile[(player->y - 1)*engine->map->width+player->x].entity->HP<=0) + { + engine->nb_foe--; + engine->map->tile[(player->y - 1)*engine->map->width+player->x].entity = &missing_no; + } + player->MP--; + engine->turn++; + } + } + break; + case KEY_DOWN: + case KEY_2: + if(player->ymap->height-1) + { + if(engine->map->tile[((player->y + 1)*engine->map->width+player->x)].entity->side != Zero) + { + engine->map->tile[(player->y + 1)*engine->map->width+player->x].entity->HP = player->ATK; + if(engine->map->tile[(player->y + 1)*engine->map->width+player->x].entity->HP<=0) + { + engine->nb_foe--; + engine->map->tile[(player->y + 1)*engine->map->width+player->x].entity = &missing_no; + } + player->MP--; + engine->turn++; + } + } + break; + case KEY_LEFT: + case KEY_4: + if(player->x>0) + { + if(engine->map->tile[((player->y)*engine->map->width+player->x - 1)].entity->side != Zero) + { + engine->map->tile[(player->y)*engine->map->width+player->x-1].entity->HP -= player->ATK; + if(engine->map->tile[(player->y)*engine->map->width+player->x-1].entity->HP<=0) + { + engine->nb_foe--; + engine->map->tile[(player->y)*engine->map->width+player->x-1].entity = &missing_no; + } + player->MP--; + engine->turn++; + } + } + break; + case KEY_RIGHT: + case KEY_6: + if(player->xmap->width-1) + { + if(engine->map->tile[((player->y)*engine->map->width+player->x + 1)].entity->side != Zero) + { + engine->map->tile[(player->y)*engine->map->width+player->x + 1].entity->HP -= player->ATK; + if(engine->map->tile[(player->y)*engine->map->width+player->x+1].entity->HP<=0) + { + engine->nb_foe--; + engine->map->tile[(player->y)*engine->map->width+player->x+1].entity = &missing_no; + } + player->MP--; + engine->turn++; + } + } + break; + default: + break; + } + engine->victory = (engine->nb_foe==0); +} + +void atk2(Engine * engine) +{ + Entity * player = &engine->entity_list[engine->turn%engine->nb_entity]; + switch(getkey().key) + { + case KEY_UP: + case KEY_8: + if(player->y>1) + { + if(engine->map->tile[((player->y - 2)*engine->map->width+player->x)].entity->side != Zero) + { + engine->map->tile[(player->y - 2)*engine->map->width+player->x].entity->HP -= player->ATK; + if(engine->map->tile[(player->y - 2)*engine->map->width+player->x].entity->HP<=0) + { + engine->nb_foe--; + engine->map->tile[(player->y - 1)*engine->map->width+player->x].entity = &missing_no; + } + player->MP--; + engine->turn++; + } + } + break; + case KEY_DOWN: + case KEY_2: + if(player->ymap->height-2) + { + if(engine->map->tile[((player->y + 2)*engine->map->width+player->x)].entity->side != Zero) + { + engine->map->tile[(player->y + 2)*engine->map->width+player->x].entity->HP = player->ATK; + if(engine->map->tile[(player->y + 2)*engine->map->width+player->x].entity->HP<=0) + { + engine->nb_foe--; + engine->map->tile[(player->y + 2)*engine->map->width+player->x].entity = &missing_no; + } + player->MP--; + engine->turn++; + } + } + break; + case KEY_LEFT: + case KEY_4: + if(player->x>1) + { + if(engine->map->tile[((player->y)*engine->map->width+player->x - 2)].entity->side != Zero) + { + engine->map->tile[(player->y)*engine->map->width+player->x-2].entity->HP -= player->ATK; + if(engine->map->tile[(player->y)*engine->map->width+player->x-2].entity->HP<=0) + { + engine->nb_foe--; + engine->map->tile[(player->y)*engine->map->width+player->x-2].entity = &missing_no; + } + player->MP--; + engine->turn++; + } + } + break; + case KEY_RIGHT: + case KEY_6: + if(player->xmap->width-2) + { + if(engine->map->tile[((player->y)*engine->map->width+player->x + 2)].entity->side != Zero) + { + engine->map->tile[(player->y)*engine->map->width+player->x + 2].entity->HP -= player->ATK; + if(engine->map->tile[(player->y)*engine->map->width+player->x+2].entity->HP<=0) + { + engine->nb_foe--; + engine->map->tile[(player->y)*engine->map->width+player->x+2].entity = &missing_no; + } + player->MP--; + engine->turn++; + } + } + break; + default: + break; + } + engine->victory = (engine->nb_foe==0); +} + +void display(Engine * engine) +{ + extern image_t img_grid; + extern image_t img_forest; + extern image_t img_mountain; + extern image_t img_path; + extern image_t img_cloud; + extern image_t img_forest_big; + extern image_t img_mountain_big; + extern image_t img_path_big; + extern image_t img_cloud_big; + extern image_t img_foe; + extern image_t img_ally; + extern image_t img_cursor; + dclear(C_WHITE); + dimage(0,0,&img_grid); + for(int i = 0; i < 7; i++) + { + for( int j = 0; j < 7 ; j++) + { + switch(engine->map->tile[(engine->x_view)-3+j+(engine->map->width)*(engine->y_view-3+i)].type) + { + case Forest: + dimage(j*8+1,i*8+1,&img_forest); + break; + case Mountain: + dimage(j*8+1,i*8+1,&img_mountain); + break; + case Path: + dimage(j*8+1,i*8+1,&img_path); + break; + case Cloud: + dimage(j*8+1,i*8+1,&img_cloud); + break; + } + } + } + for(int i = 0; i < engine->nb_entity; i++) + { + if((engine->entity_list[i].x - engine->x_view)>=-3 && (engine->entity_list[i].y - engine->y_view)>=-3 && + (engine->entity_list[i].x - engine->x_view)<=3 && (engine->entity_list[i].y - engine->y_view)<=3) + { + switch(engine->entity_list[i].side) + { + case Ally: + dimage((engine->entity_list[i].x - engine->x_view + 3)*8+1,(engine->entity_list[i].y - engine->y_view + 3)*8+1, &img_ally); + break; + case Foe: + dimage((engine->entity_list[i].x - engine->x_view + 3)*8+1,(engine->entity_list[i].y - engine->y_view + 3)*8+1, &img_foe); + break; + default:break; + } + } + } + if(engine->map->tile[engine->x_cursor+(engine->map->width)*(engine->y_cursor)].entity->side==Zero) + { + switch(engine->map->tile[engine->x_cursor+(engine->map->width)*(engine->y_cursor)].type) + { + case Forest: + dimage(58,0,&img_forest_big); + dtext(58,30,"Forest",C_BLACK,C_WHITE); + break; + case Mountain: + dimage(58,0,&img_mountain_big); + dtext(58,30,"Mountain",C_BLACK,C_WHITE); + break; + case Path: + dimage(58,0,&img_path_big); + dtext(58,30,"Path",C_BLACK,C_WHITE); + break; + case Cloud: + dimage(58,0,&img_cloud_big); + dtext(58,30,"Cloud",C_BLACK,C_WHITE); + break; + } + }else{ + Entity * focus =engine->map->tile[engine->x_cursor+(engine->map->width)*(engine->y_cursor)].entity; + if(focus->side!=Zero) + { + dimage(58,0,focus->picture); + dprint(90,0,C_BLACK,C_WHITE,"%s",focus->name); + dprint(90,9,C_BLACK,C_WHITE,"HP:%d",focus->HP); + dprint(90,19,C_BLACK,C_WHITE,"MP:%d",focus->MP); + } + } + if((engine->x_cursor - engine->x_view)>=-3 && (engine->y_cursor - engine->y_view)>=-3 && + (engine->x_cursor - engine->x_view)<=3 && (engine->y_cursor - engine->y_view)<=3) + dimage((engine->x_cursor - engine->x_view + 3)*8,(engine->y_cursor - engine->y_view + 3)*8, &img_cursor); + dupdate(); + +} + + +void player(Engine * engine) +{ + const int old_turn=engine->turn; + while(old_turn==engine->turn) + { + switch(getkey().key) + { + case KEY_UP: + if(engine->y_cursor>0)engine->y_cursor--; + break; + case KEY_DOWN: + if(engine->y_cursormap->height-1)engine->y_cursor++; + break; + case KEY_LEFT: + if(engine->x_cursor>0)engine->x_cursor--; + break; + case KEY_RIGHT: + if(engine->x_cursormap->width-1)engine->x_cursor++; + break; + case KEY_8: + if(engine->y_view>3)engine->y_view--; + break; + case KEY_2: + if(engine->y_viewmap->height-4)engine->y_view++; + break; + case KEY_4: + if(engine->x_view>3)engine->x_view--; + break; + case KEY_6: + if(engine->x_viewmap->width-4)engine->x_view++; + break; + case KEY_5: + engine->x_view = engine->x_cursor; + engine->y_view = engine->y_cursor; + if(engine->x_view<3) engine->x_view=3; + if(engine->y_view<3) engine->y_view=3; + if(engine->x_view>engine->map->width-4) engine->x_view=engine->map->width-4; + if(engine->y_view>engine->map->height-4) engine->y_view=engine->map->height-4; + break; + case KEY_EXIT: + engine->defeat= true; + engine->turn++; + break; + case KEY_F1: + move(engine); + break; + case KEY_F2: + sprint(engine); + break; + case KEY_F3: + atk(engine); + break; + case KEY_F4: + atk2(engine); + break; + default: + break; + } + display(engine); + } + if(engine->entity_list[old_turn%engine->nb_entity].MP<=0) + { + engine->nb_ally--; + engine->map->tile[engine->entity_list[old_turn%engine->nb_entity].x+(engine->map->width)*engine->entity_list[old_turn%engine->nb_entity].y].entity = &missing_no; + engine->defeat = (engine->nb_ally == 0); + } +} + +void ia(Engine * engine) +{ + Entity * foe = &engine->entity_list[engine->turn%engine->nb_entity]; + if(foe->x>0 && engine->map->tile[foe->x-1+foe->y*engine->map->width].entity->side == Ally) + { + Entity * target = engine->map->tile[foe->x-1+foe->y*engine->map->width].entity; + dtext(0,0,"0",C_BLACK,C_WHITE); + dupdate(); + getkey(); + target->HP-=foe->ATK; + if(target->HP<=0) + { + engine->nb_ally--; + engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no; + engine->defeat = (engine->nb_ally == 0); + } + foe->MP--; + engine->turn++; + } else if(foe->y>0 && engine->map->tile[foe->x+(foe->y-1)*engine->map->width].entity->side == Ally) + { + Entity * target = engine->map->tile[foe->x+(foe->y-1)*engine->map->width].entity; + dtext(0,0,"1",C_BLACK,C_WHITE); + dupdate(); + getkey(); + target->HP-=foe->ATK; + if(target->HP<=0) + { + engine->nb_ally--; + engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no; + engine->defeat = (engine->nb_ally == 0); + } + foe->MP--; + engine->turn++; + } else if(foe->xmap->width-1 && engine->map->tile[foe->x+1+(foe->y)*engine->map->width].entity->side == Ally) + { + Entity * target = engine->map->tile[foe->x+1+(foe->y)*engine->map->width].entity; + dtext(0,0,"2",C_BLACK,C_WHITE); + dupdate(); + getkey(); + target->HP-=foe->ATK; + if(target->HP<=0) + { + engine->nb_ally--; + engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no; + engine->defeat = (engine->nb_ally == 0); + } + foe->MP--; + engine->turn++; + } else if(foe->ymap->height-1 && engine->map->tile[foe->x+(foe->y+1)*engine->map->width].entity->side == Ally) + { + Entity * target = engine->map->tile[foe->x+(foe->y+1)*engine->map->width].entity; + dtext(0,0,"3",C_BLACK,C_WHITE); + dupdate(); + getkey(); + target->HP-=foe->ATK; + if(target->HP<=0) + { + engine->nb_ally--; + engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no; + engine->defeat = (engine->nb_ally == 0); + } + foe->MP--; + engine->turn++; + }else if(foe->x>1 && engine->map->tile[foe->x-2+foe->y*engine->map->width].entity->side == Ally) + { + Entity * target = engine->map->tile[foe->x-2+foe->y*engine->map->width].entity; + dtext(0,0,"4",C_BLACK,C_WHITE); + dupdate(); + getkey(); + target->HP-=foe->ATK; + if(target->HP<=0) + { + engine->nb_ally--; + engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no; + engine->defeat = (engine->nb_ally == 0); + } + foe->MP-=2; + engine->turn++; + } else if(foe->y>1 && engine->map->tile[foe->x+(foe->y-2)*engine->map->width].entity->side == Ally) + { + Entity * target = engine->map->tile[foe->x+(foe->y-2)*engine->map->width].entity; + dtext(0,0,"5",C_BLACK,C_WHITE); + dupdate(); + getkey(); + target->HP-=foe->ATK; + if(target->HP<=0) + { + engine->nb_ally--; + engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no; + engine->defeat = (engine->nb_ally == 0); + } + foe->MP-=2; + engine->turn++; + } else if(foe->xmap->width-2 && engine->map->tile[foe->x+2+(foe->y)*engine->map->width].entity->side == Ally) + { + Entity * target = engine->map->tile[foe->x+2+(foe->y)*engine->map->width].entity; + dtext(0,0,"6",C_BLACK,C_WHITE); + dupdate(); + getkey(); + target->HP-=foe->ATK; + if(target->HP<=0) + { + engine->nb_ally--; + engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no; + engine->defeat = (engine->nb_ally == 0); + } + foe->MP-=2; + engine->turn++; + } else if(foe->ymap->height-2 && engine->map->tile[foe->x+(foe->y+2)*engine->map->width].entity->side == Ally) + { + Entity * target = engine->map->tile[foe->x+(foe->y+2)*engine->map->width].entity; + dtext(0,0,"7",C_BLACK,C_WHITE); + dupdate(); + getkey(); + target->HP-=foe->ATK; + if(target->HP<=0) + { + engine->nb_ally--; + engine->map->tile[target->x+(engine->map->width)*target->y].entity = &missing_no; + engine->defeat = (engine->nb_ally == 0); + } + foe->MP-=2; + engine->turn++; + }else{ int target_id=0; + dtext(0,0,"8",C_BLACK,C_WHITE); + dupdate(); + getkey(); + while(engine->entity_list[target_id].HP == 0 ||engine->entity_list[target_id].MP==0) + { + target_id++; + } + Entity * target = &engine->entity_list[target_id]; + int dx = target->x - foe->x; + int dy = target->y - foe->y; + if (dy > 2) + { + dtext(0,0,"9",C_BLACK,C_WHITE); + dupdate(); + getkey(); + if(engine->map->tile[foe->x+engine->map->width*(foe->y+2)].entity->side==Zero) + { + foe->MP-=2; + engine->map->tile[foe->x+engine->map->width*(foe->y+2)].entity = foe; + engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no; + foe->y+=2; + }else if(engine->map->tile[foe->x+engine->map->width*(foe->y+1)].entity->side==Zero) + { + foe->MP--; + engine->map->tile[foe->x+engine->map->width*(foe->y+1)].entity = foe; + engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no; + foe->y+=1; + }else{ + foe->MP--; + } + }else if (dy < -2) + { + if(engine->map->tile[foe->x+engine->map->width*(foe->y-2)].entity->side==Zero) + { + foe->MP-=2; + engine->map->tile[foe->x+engine->map->width*(foe->y-2)].entity = foe; + engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no; + foe->y-=2; + }else if(engine->map->tile[foe->x+engine->map->width*(foe->y-1)].entity->side==Zero) + { + foe->MP--; + engine->map->tile[foe->x+engine->map->width*(foe->y-1)].entity = foe; + engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no; + foe->y-=1; + }else{ + foe->MP--; + } + }else if (dx > 2) + { + if(engine->map->tile[foe->x+2+engine->map->width*(foe->y)].entity->side==Zero) + { + foe->MP-=2; + engine->map->tile[foe->x+2+engine->map->width*(foe->y)].entity = foe; + engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no; + foe->x+=2; + }else if(engine->map->tile[foe->x+1+engine->map->width*(foe->y)].entity->side==Zero) + { + foe->MP--; + engine->map->tile[foe->x+1+engine->map->width*(foe->y)].entity = foe; + engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no; + foe->x+=1; + }else{ + foe->MP--; + } + }else if (dx < -2) + { + if(engine->map->tile[foe->x-2+engine->map->width*(foe->y)].entity->side==Zero) + { + foe->MP-=2; + engine->map->tile[foe->x-2+engine->map->width*(foe->y)].entity = foe; + engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no; + foe->x-=2; + }else if(engine->map->tile[foe->x-1+engine->map->width*(foe->y)].entity->side==Zero) + { + foe->MP--; + engine->map->tile[foe->x-1+engine->map->width*(foe->y)].entity = foe; + engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no; + foe->x-=1; + }else{ + foe->MP--; + } + }else if (dy == 1) + { + if(engine->map->tile[foe->x+engine->map->width*(foe->y+1)].entity->side==Zero) + { + foe->MP--; + engine->map->tile[foe->x+engine->map->width*(foe->y+1)].entity = foe; + engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no; + foe->y+=1; + }else{ + foe->MP--; + } + }else if (dy == -1) + { + if(engine->map->tile[foe->x+engine->map->width*(foe->y-1)].entity->side==Zero) + { + foe->MP--; + engine->map->tile[foe->x+engine->map->width*(foe->y-1)].entity = foe; + engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no; + foe->y-=1; + }else{ + foe->MP--; + } + }else if (dx == 1) + { + if(engine->map->tile[foe->x+1+engine->map->width*(foe->y)].entity->side==Zero) + { + foe->MP--; + engine->map->tile[foe->x+1+engine->map->width*(foe->y)].entity = foe; + engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no; + foe->x+=1; + }else{ + foe->MP--; + } + }else if (dx == -1) + { + if(engine->map->tile[foe->x-1+engine->map->width*(foe->y)].entity->side==Zero) + { + foe->MP--; + engine->map->tile[foe->x-1+engine->map->width*(foe->y)].entity = foe; + engine->map->tile[foe->x+engine->map->width*(foe->y)].entity = &missing_no; + foe->x-=1; + }else{ + foe->MP--; + } + } + engine->turn++; + } + if (foe->MP<=0) + { + engine->nb_foe--; + engine->map->tile[foe->x+(engine->map->width)*foe->y].entity = &missing_no; + engine->victory = (engine->nb_foe == 0); + } +} diff --git a/src/main.c b/src/main.c index 4c4e20d..6e15d54 100644 --- a/src/main.c +++ b/src/main.c @@ -1,13 +1,17 @@ #include #include +#include "level.h" +#include "engine.h" +#include "test.h" int main(void) { - extern image_t img_grid; + extern image_t img_title; dclear(C_WHITE); - dimage(0, 0, &img_grid); + dimage(0,0,&img_title); dupdate(); + while(getkey().key!=KEY_EXE); + start_engine(&lvl1); - getkey(); - return 1; + return 0; }