OzRAUy;aD$Oym+nR-E2H#{TrUsSC(kl{HcILI_9MxZ#efhEE}J+viq!1} zLn$fBg)u5=z7MIDSQ_2zYIS7)f=j{7y?q)eD7~pEtVD-=g+ZbGn+-SmXrcbcD|jJ4 zj-~FCrC>0|=z)mx(eRTbtlv9ZhJT5t-%I5>gr(CMP9JyNW~t|ttLjQfUKrv6qsXZH zpB8>42GGoCF;sA~5(^LT%KnH$Vl;0#aH6a87@nP6NRdh|RE&oUAIxp>$;OMrafCy1 z1&B%+w+34|hX?n(A<`g9;I)FjZy)j$0zXCafms+t%wzZ_LrfY#pK73Pcbj_8yL;VE z6zp3=?aM>0V`CAs8jG!!gNSuOoEADeqyUu)Lg*F#PMU145D;jwM+GU0Sg|GXI)3~h zGgEn!1#s_&Y#FzkZZ+DoV;pas>XX{6D1C#jdeAb7qVOA*z{JHa2JG1;wUh-amz}T+7uqQ zEEV#vNZ3{RQ=FjI8L61Qit05!s8UcGaEs3fR`p6+vO1So!bEdRt=4{&%S<=oLLjr$ zitG7B1Vaw^i){r75I_iP(~R4XzstT+!zdHwC#3d42!O>O dVRdxtB+guh(ZRa LD8 zLRo>QN5MT};cTj# ?W95DynV4X>%CFyahFvzoPo#+CUb>N_I5Uyqqo@ zdyE}w?N*}@D6N8ys!&>Fd>lHM_ Uu}*KW%i^FINPs1(&w>9Jo;xWgclf?CLnO6;>It|nStUrgCy);=l%i&z>ba*d zJ`<=|Y6=9=Pe>yjZ2|^0Tv)Jy_FCzya4lFWG){FuYyPVqx3?5ij<0X^7(_7AR+v;G z-%e*&4uKh)XGYV6nABD+RqKt |^00BbZ96G6iIP$rZ(ZIky^5Xffafxu^~JmA zJ{khCCz qJKUpGKY?3w}jqtl&Fbv6^aB8;x zkjab;q@7k7hpOC-Fe>qGvzk1gdNOc(Q12<8#Q-yAD%9$D$`lm>ncY%%tSk^WBM*Nb zDQc!?rL`=F5Yx@f$ML7GQhhbJINi20{gqEk{4FH7JROgw @`ZV8Mhx z>2eET5Y&&bBaWf{l)Yb|C}=4CYO2bqh2bZI*KAA;AIPXtTCEc5bsF!h6Z}wnH)9?_ zc6S}$qYrc_v}yI#`;GNTmzC1I%_7Zatmre5s&!(;z7>>*JtIeZ6~=PFEv9;C5&A$i zQBM8%r;Xb_O@*pSTt|F+zMF#iOWutGXv`!Xj1ph)mMNShLlzm-SXne7CmGLT?spkz zdEQSn){NtTrAXP-Y?Kcj&1Rer9h%t$)@8k=m1FFAI^#N(3nv7wI2CsTJfsh`F+U%= z!1lOw^L6i#L#~*MTvcvO>ON)91vM*vpheeZlLV{3bsL8theUpbfR%(Mfdz$Gc>!0o ziwf&ZZdU7@`BH%{yf8 S419fSCdq7~~NpeBo5g zqy=Dkp+XP%@_pT6izoXQ2b9bxJT%v1@@Br-dL iwl&Tg=v6gN^r}nnhgwW}hZWStJ zJqaGN-)ylctCg#4t_D&Y1TV4lXWMO~VNzVGQ?rqOM&|5V9&H2yy^okjT#Bv-tV4Jp z@#rX4f1PYjRMQKW^ s3 zhQC?f0pb5zoOVwQ^xpE~aqijpL0JW%O*ZM(mSUl%6keFE9YU;N&DOvetwTOiI#p~5 zKavZlwg$sA4az;GIyz80&T3+Ayi9iO5?OSC|M&w}o3y&B?o%N_CAogBDS)@0bugJU zDv9UJjj}V8F#O}TB8EBmd;m9zaoVLjiqF{U jZ~igOxA*R` z9Ep*f=|F%%0m2J4#6hU5Y40P1bHu)4Yd7|$Xo(%yM=^KOk1&y{WC(gZ*J5)o#Ks3_ zPq0#%Ze +vsL)*fKkjcp%m7+ =35@1w_MFnJjtMM$uap!F-LG5+2}ILeyU&b+ALYH&(~2Rj`v5C z+Aqy-16V;vr0YWD_t6RRlxinlo1r}IU_*SWoK5rLwqU*18|hayr3P(U&AG{@*vcrJ z*MNauZ}}tbAt}b8Nk%-ra|2KMRtdAJWR6E>QJ(1ewYw4b;b!nf$KdVoVb=QEJ?*4T zxj_)n!--HVV3YX#6H*o$^2IJR>5l ^I43&wTD%SP8@)nGA`I GU7E8u4jN=lwF`swfrkIv!dKn>O%Es_nls zuW>P)2{|MYtg!5#_TJ(r)7fR9EBVqV%*p1?9K_UlLyuOHYw*12Bu^B*SQ2IEF~>7u zs90`&=<&y6GI1wtt0#!WWyQz^%Ahq0#=};)`>Ir102b|DSYDT@q0Hr}G9U6s3whs{ zb;H~bte{l4lc99Vwoyn#3;-Rpi`R}-v=&gN#TE8vZ|63t>Jz{C*`Vtg?s{FP#-1zj zljuB2dHbsO-JBPnn^`de1j!EO(N1qQrr*xr#k!xjA$u+4Zr5|xNV;efS|!H~FzC8) z%GTrpI~|?+(J1h#=Fq={F7n+HaaD5Gn)G>|igklLEp0&5T{-k<(hwLHn<7jq8347* zro6}LmmTn&ObWIbnTJ%KP}3+wVmWxu!2t#{+Tbx-sW8=NYQsG%Zi?;FD=l1LkF=uH z{uN-*H|~mK%Hm?}htkz|K(Y>1_q7T&^(}Qq9K|j5K!qr>>>7V`lSY*HBSvqf7Rh~; z*FPOb62-Zw*tWa?kWiwgnm^5~!<_=R>Z=M0sUP0RwZ7~otXdDNAoHVXb >SfsG-ITb2Fr z^YT4^d_t*PtO#8h#$H%mrtvejv rJ1*A%aS{Jle~VUx2mtOOwH9a()H8+ ziEc3F*86>mCzPyor4e$G12em)W0R4xUE!Uz(ud9_WR1zNr{e;~=}7r#+(d(C0puYd z0H=iGg`SfN7uXS`@rAwB4xs;|_{$(kFi&^=GxZ&jfBeW9y86dl3h C2v4us2G?Bm{fNEM&%2QsA^+&Bb1fE^i%`TY218sy_rDXNc7l zFHN0}YqFC`a7VFns@#w-U_W=uOp#T1U=o6sMAl+$7z0+*m{4vtJNe|7+wDSK`}B{~ zkOpgy+~XE#c5F8|!#dv~HIK_pCHtH2S@Ur{-D}k~3am{oB-l>^6ReaVY=xSi{-3Yi z4IgISf}fGUDcv =MyNecSxDtr=|WG?<(jNrf211BzAd$`z*(XjZrw|l!@sy* zZZv~c`6^z7IpX*u45nnm `-d361EyAlOc47$bJW&ugv02>_CPMU}^=99xM;ox< z%#!xYSM$x{UbM0K7)@~T7V)vPE^XZAx9AYMOe@cJ`}9J& FMg&p$2$e=@GfSEabN)ztAm&|a}pmJl>Dy{Xf<0EbDTu)UVc3mEbiw`!o> z7Wapg;}51^9^A;u&5bNTI8uYJgviMR6i}=S{C?T!o^Our%RUKxLGT`36Q0z)s`wCT zGURupPmJgsM)-Yuk-8MROyvg>Z!PcRo*s=Zi#wkT|E|$#cSgWQ0|5Y+-~a$F021gQ zjqX1r?f }GQYX>L4Eji#)@;3OobBpvhbqwm*$$l3 zH%-~;$z+dp )_TcKKmuYsT=;mFXYRSxYA#g#*>EcIn%2+Iwt@G#Q3C zU$^}l*cgKvzdMq}WQ7HPedf0~WO>kY0mDz~`KWN>r)mT=YPH0u3h9sFV+q1Q?ROHd zlZJ6l$AC~UB3Bg4)n}j6*9WfAQHnzqi)Z05w}^xk3A#xxBb^9Q5&pu&-G&-lcxgBo zsn8-Mb6#RPYw2RwlgHD%oB;|oLE#`l{v-;=N$8X)h15wW$U)8AJ*LRL_4H^&nltEL zUSto9$FQoa4Yz7sV{9$T0iv?)-rjGA@7mAZxyIV(JpMn}die3@37Vw{CFd-!C{!7+ zuo-KT Wdx0%OZ0AAby=^V1E!{w{6EEAagD$BX; zDjqaEgE<4OmE9`Wt%@)OA+5%at`VWe-3L}5=!wi7 7u8>qO^E|?zZpi-QF#hzD;0zwEZkrQe-{i&NFHRqrfnzu~g3NA@cxB zr9!+nWC_khru;wDb8~4W=|&(mA}&1o7zy;UeT~Uk*!!`9vZ!nT2JixK-P3H>HpZHB zV`hzc=;SdD1$uI^EwvbTS!Z{QuC2Tw#FwSw1{}oL6Etx8QU1sX;c=E8xd@>v@L!pF ztLKUi Dx)Qe;M%ShEL_ z0|kjp@LEXiVQPlN?M!GQ(|gK+rM?547x57( @175k&S_+dVTS1#zfRc3BD5 z=?}yWqph7l@FpY{*kEE;p6zf%QS)duF{EuhB1!zOKoT_DzB$OQZQZ_b3kh6;NfanX z8^|G-e;g-9($iB~#mauIwd9YSoyq#pHLXG#d0@mt3a!p$-SVE8FJJ(VQJ+SPvt!iZ zS4s&GC*?P_F>$6!)0uKa%xc_f< aPmB%k-JE4%6V+S(m2>vq9b& zlR9bz#kJ0Rk@ab7lKEQ3t(Hf?ca934obZe#h)fC^`&)0?7>iE nZrQEOG%sqdp(XVPPkyq~AB z^6^I2AaaVu(PSP*oqTJ~S8dFWx=uObIqQ!4G;y2jccetudMeZHPq_1&Oss`vGB=Pf z7D^245WpESUKa~DYREbQrhT~KPGPcJ68A1(DuQAGql~f1GkcS|%?wIYWT^5h(%Y8n zY*4Fjl>Wh|xLwPjKvgG)EgU%E#Bydu&F>#*XR^K<4`zvi#NL?5q2n&dXdsbZ$Jdg@ zG(5=Yav;%R58UX-K^l7w!itJPY86-{kQ|iL5|Me#Zy-1L?WG!6Dh4gqn);1irnxJU zr~`5oN|1v9KTrmEg8JGl=QOKFU6NR@Ly^~xu5295;+Hx4tM(`et1wPGEtA)N&}l|+ zU*>Vu^fw0(7S;BGU9!d@;R^gzA#fQ2vrB|>Vqhk0;VO*nzCtdJ(a@0F@g(bku&<@D zpBOo^BPPtMG~y?E9;sAJ{Jshf3;QU9-AFNR^XOR-m6)){%Q-^ g>Ek_yM^h)Kr;#{#>}&Omfqr}b#W=@2NjQgJ?V7*4ydKSvqI66PNG0ax!9)P z4hQk>!PL=MXlBzdGh;cjk#GD7QOnq-mZ;6GDre$IXd$5&r-hxDu^g95`;C`UVO-5N zbUIc}bU29ay%nqF)05UK>-julAw!t!X;F%cAlA(k3L^9AE>o|YEA>_{Q?J5S8PsUh zI+t!YekyN1P|NQ+U+Ir_!-*>ioq4Qpfwc7)E`EIR;~8`eA|Oa#qln aW~d{oJcXN^0 l<>ZT1+5LD|@%f5NeC?~{{< zS-7%G%c0cRaq0)Nf>xae-=&XFXV~rXbA{wY2M&1!hQ!8Sdb@UF5XGrl<=s8RzQfr# z0Pjm`z=rZL>vWA>Gg+;1(r%SZpev8ytbvnrPDOzOE2@Gbk5ZF!66c~5t3{q`Amz%% zR}StT`dyYZ*H!6A0v>H0Mspj;?xUbhzkWer2I9aVmD|%AQQDE@1fl2M?}U(oMiHCV zwo20!bCT}7mfw*CpJdK%<16CQ;0w}HN(Qf*Ut>LZw&nbX8~6|hm|}Ex)zJfG6q|L{ zQ_>MH-uZyY+0gZLG@FZrvZIm`R^@$O!0U;HUO&RvA1`OC$h9^abc3X)*Oa#M60@3R zgsGo8Qy|y*;4;WO4>JC#E4<4~N (bvS z`Ohfh&@2qrrlq3#CqQ^Nt!Xx8C0b<8ICZc+%<6{-o9;`5A*KIEM4qGpIoB93kwb?l z+Gw(9pv;om0m_CQsO_&1YsoO5_y7^Z7E2}gQRb3Z!=|Jlu+N+*%n9OP6&kfLYOZ*8 zlVPx*;LCMO(bVsPFb>CvE-_s`3aJZSb_Q!78_1zBL5aYF7t~!yqtF(6UtvBYMk-x5 zZG?hcsEc_H`FTqU3HypaXNlx?^^ z#j4q+&8*FId^tYX`&bLY91qN7#TIcH7t&) `8U}B)!LoD;2qcZ8L&c4Hj>dZE;EkY~rqAE{vok z2zhYK*zB1*^87UtYn+;OIhXrv^HCrj_o;QQ5MRw$)gDVII=mneqM3WGVKjnO*)X~Q zuODNsWK-IuITKO8sA3{NTiW!o79M(F6Ey8m<|$y!?j)62mJe=v_z#M~ZkFM5>U>Sk z9*D@bhlCW?c0)0} 4WLHOLTAJK2`=?kSf#PP|%d}hRES zj=thfEqZZjKQDyxqG2w}aW>a%fA|b*`sv=L8TOR(+?PVIpB;i6c%|e6Bu(<5Ur(`` z7($x|$KkH5oYJ26(t+s}G||%;CsT8z&mHQX#SbP&Ay6N~*5WcGANcc3Cj20&E@6p{ zNSJ;6%U_!^Q9XxgFQ4zi-kbmf&&8KYu0Yvs+{^2&&>h(xjS!K>IpI-i%H%zJk}@43 zp@+_%@)lFasRqXTl8Ks4ky@ItIAFJL5_*y$M Z#c5BC1}8({?f4TezwlmHV~XBT^0O 9F{YhBiiwDvXKp(~C11cgNm)Q%%Y6vK5}b!Yy^ CHNlbbX zJ+c~K6L!=f1B6=Ylt<&0ASNM}>8Nc=rhqU?&rqOA5Z%$>Wd#|A1!-;lj4|WK&`$s7 zZ; y|97V8#PlSDGAl&$eMp%wp(y2{q|XM8}iH6gQKh8-E`cr2BhO{jaXH2 z8KBfxpv^Y=H@|(IpqT8$lhq@<_7QJ~X1Bll&S;}P8Co)eLvkPboAKD`bcdM0(XXxp zwx1qaDuJHenunEawT!1pwrAqH26mZwWn)EpVUctjzgTmSke}eIqJHJ|9ZMVrt5KyH z$#gLVhc&Ny!_X&!{bHN{!@IMyiBxUQkFcHBH&l8oYfBI&pi<(C8K2%w&NvW*0Y!r) zbmVeq@8vevFJZ4--tBAp+&3ny+(>5%ttBD}GSnMH?>Y*A9rmhc{VTx^Mya8${>+b= zw4=)R<0<-@uh%(VdM^7}e6t9pT`R#v^+{&Jr&9Gmyyu_rDGb@&GAMho41f<8@hpq8 zeQ70tOjbrLr5%!m+BsU@i^)^nm@dS=R|-8M)b&maB2W<1Jhvipa==SV=g }gEL}LDz5A*+ZBH7IF z!4ELPhV578|6T&YVLn$*M^s@z6s{1jIHY73Xy>B}0xEwn>CUSs*{?n<
9YR`0gaXO-Y$O}5$qiOAyBvZQL88YpUsgEDPcr+`=5uMf7DvxXblNE$IDD1MGQ zU*9f2;L>fJHp>uxCBnBCT2 SAQ)Ee+mA7AoqW( zw`K`K*1>{^p*Nvl5bK@4u~DFe;IQG2w6)J%wMN_aevkde)RzA8R`-(j#@^vQ@r|d7 zGcb>`+v^h7X<$X71+J`Heb#P>e{t@zNTjgz<|+tH(lQ;rc=~nrS&&A`R}c&n7yu z?rACWOwwTMTaiVJp7n@ozu6M~@>UbcGtVYRxA4&=b3+UL1IO5BT)gnDuU&%#^Bg6+ zAKY2cf)wn$1~*)Y=7$m;IPG05BA13tUzP$(z18)D_a}I;f2wu!@VP%~(NB?h5He`E zmm(L&BKZB*7@8(j&PP5F18a|w%AoJSs`qoK<^SUJ{>&eUBmMg=ZW!DDjxsF&9m-tk zSle%MqJQ@EeLx8PSx+_7@+ q5Hs @ua}T5Dd{v;X*v=nJDDJH kEuD!N#^Hq6Xq-)8-QZ)^*SiPpY7|6 zlPHB-PcblD{E9zds%uc7Ipu0}l?_JP#j9+b(USn5{4-F)w0jOx*>!vF^Z_iRQbukN zd%^XVadee9&GAF*QKlGZEerek{hix)xrE*u*}QDRpMYP&FOBW@&I%6CP6YVX&Nw%_ zs&HH*RPN>II50yjlydXBX?eB9g|W$*b;A?@1}GqKc6Dw_(}q0yXMJWBoGn{Mb?mfb zuv(YW>bZ;3rZZMrwoM`TQ>pHN`x*Z*N_2!7GV;|?HmDRx!erx^R-4_0@sT$`h@_j| ziInCBi0h2X#~~6%OFbhj@lYO}{y|VS3LnZlu-z-d0?H?z+kg=svu&`7J5KvnVeFI- z3Vm}F#dzog;kb0yCjte;!TT&p`!fMC+`k0=8|$rfM&vV$v6LaD7Y^A1LFgeMH qyh>I(&VP@t1D#b_;L>q|Ra#c7iFqZ<`$z?;d@ zD+hsTTga%&UM6Jwz;o&|dGd;ntFSL<>xEAcJ+#Z>YyWMssd3~Qs|wo@4W9d#<<#Kz zSedg6-;hF(>n|U%n8Aj&(1p-;^;E ZNK^!MN5jP>7i}a(e s};$!4du8MD>V{GYs7*puMF8A zK2iyAuJiU6(WGpH;OfS1_aVf~k{p}~EWJtc?FSUeQub+7;g;A=f$w-RZQAu_B>HYH zG2C(Vclq!f%1OJ~7NfqdHAfJ!zkZa=SL`0N_i FxOnOjanzSuj7#PO!=HAuGbY ze@3Y8IGAET$ !l_X&=w?elA(p3BhRZj 00QrDOS&;xd7wWFS&GeGesb~;%s6sM3?ps#<7%P@Vjne$s37dfkP zNivK<=MU?yIy)UHV$?qKM z7=ykcI)u?Ep`JvW8TtcGi`TunUcm*MdLf#R4lD`N-Q{b5M;$=s`f =(FQMM&@3LAx54}&qnO$G zVQRNkAUW1vuUcH@e(ICuo`ZDJOx-g$o^qkcG2|e%_bVm;S5n30!z?YH*U_+YeyG!0 z;G<&*Xha*q3H6T`SjWzL;G9IMFECq~3(@iDJK^BIaW*De41v=4uSi-Nc{7bBCq?km z>sX4VJFcMRypwy{KVCqM!V!@_HOUN=N-L6@!A{4Izjz6Kl3HAd(ppGIhfvT~$BaEq zg1QZLMDtR5sRm$Sqq&9G5HWBH0(^V!@iYZ7 t{(Lr;ZWWtD8Rn{2(3?GEVB4My6og!$ERcJ79QqcDdmu=?tLA$GNC zy7JLUicb3SI0NaY*)Oi)u+xWaaMDQ=ITl@KJ5~PLtx6MXP7{f+FMbKW6|_sQF@Jtq zL^R49->jUZw%^@UwPhU@o>2h^InI#=yYsbIeSnGB>kzlRcGg@bFx?A7)cu-VaMZ;I z|9K?eAS7ic4d)L}aUl^J1^OixD%vxofCvS=Nhs?SpA@gZmpfTJB eQ+qel#xr`%xKZL8G75Kr8pgKO*EZW`(CQ-f7< zq)=qhi`a0L?j}0r8Bzcmydps=J}H6lmSnl)?w!_JqEYs K~3;8~e*`iX#3P&!d(uR-qct zBOralz7FoMrJvWaH=XHGnTPOJ;g7B!-{;^p=>?0HqMM?9W*zzq{DtrfVmOV(*W7#D zB8AEKf7(87z~o3n_qIYVkIb>0S#^%*Ib=N=1I;oEVA(ccO{ry;6H5+;Nqjki;$bwA zB#0+!k0jI2966Jzq<0F|-XN>kfoZ583N$|zAXnH}wgqh1<(~|xnN|n;AD9enVLh0@ zs}O()M5nnt3SeAbP#y&OzLh~nVhjyKp#Ruam)5Y36 hit|xTYPkCOXCHQ&1E5goTG$~?hkYZ6#1JO&8y)=quTQ%B5 z6CZTleHgK=is85o^165~w=75b+;=qFp7RUq2nQcJ%I9Cgj@OsTHxI(*;pAJ@!e~+r z4rt}Dw%MiBj mi2qY{cjG&FrfV_*2{@WOrqNVv&-8ug9sS zoQO*dYkw~VtT+oGT*S|HjvjAqm>#2GkcG0%Jo2N9 |W+J3SE$e5(x6l-*&QGC*5;XbfmOisd= 0< zLT?nUi=CLQ8;j^5pS>09x-3K_>oASvyz%F;Vc)ZRsb|_fjqH&`0eLsgA321Kv?M&j zCemNxXZ_SKg$HkPN&6L=(-6iRcH{{LHAlJv?`Bp0!2ce) 8 z9-RzI;^(6E9}`c|yr$e!v4CZ{56BS-@(4!#2@Xwizu#U4OF_sQ@lK@13bWeXs%I=X z@6!pyH?usc*)^VhQXx^_BI+P_r{Xy?{NG=VZp5kdOyIZ81tXB%3A{NT1S8heQifm{ z#m3p-_-2q>kXG@Fpf_!V5oo+eeE)`OY@N|u4-QFyQ+zR=lqr~O_cMtHu8rVE(99?d zLi*bR^B=)PFvCh$?2-gPK}Z+cIA*ZoT2V0-V9XMMgcazPOmU9`dsU94-E!J-Bv`gd zd~r+C6dUpm=!cLoI3rZZw`ulhQLif420)zR#Jb_6s1k-1>XAZ5kF3PRw-t~}w-6|) z&}RJPVFt>WRrdJpq2Fr93?lB%-v`Q`h6^|Kx119F5JJdG@Av#0$G;J#WT@gqOEL$T zfbg_ZK#g>}@y;}{F@upCE|Co-q}J^TtWP%eZ4usBm-_hkF`Ol&@I5({RJ^B3L{;&9 zg*koAv7ka>YY2FyGsD_8j4=i6foKs3!kDgt3IZ&WQQikR)rX<1jo7Sp8Q}u*;Dyh` zvBJ9~U%+YZLJ438e>xXS8jvamB<-cN5e-I|2d7hD8ttegM}|kXlm$p^qz`)hX$gI2 zv9Q!#9B7@#ztnivUy%pV91gPY2}x=Ndteh}>KZRU<+mdlna>myt@E*{1GZR)9W#(L z^&GdmGg3cMaBL*HA5pNl|H+xAMyO2@M55p$b$)fUOF~OlMh5iT2^NerE!MN&qZ288 z*D=NrN0mi7Wo)#A2h`GRtJ>w#&5 Q{@Cb3$KL&!uKTkZ2} z#YNr9h?vI`YG0Y39;WoF8f`m2S8u+;H3vCJOzsuDQ_Ir(>&xBtb(kg#Y9|H$&Yl+r z`jN86jKTvt;$Q^U+`0Ueh}w0QF^OAJ*=VN|D5^z^$xc)4C1^H!GD?g%QEw3P!>3D# zF#b_25eR@bnT>%j?E9l@ng2xJ{!mm%3!j zY6o2k@Z2U&b!sDBslnIpzylx>uhkb&Z{y2Pi&w!mD?fNLO)M*nzFz~M>MN-3`+@NU z=_ #vD$2Pk9=MyaMZ~9TJwqSv1pa-YlSOFN8btsAaH;@+zd!%6&^fz!+L--w z#&oQ=?X=m3=7$znyAdsl{7ve~-igBVywNDnj>FTrngFR4LnVByfcs)qx_SOs$kBa< z)3nONv#4*=%Hs+0rt}UC)<>WOOoTKPSyh~zp-CKyaP&6g4!{i<^7r@rUdOmG54=N{ zs8<-Efao6G1_22-Ie6QDN)Bet;KjzpbPN(k03#hzfdB2_b31&Rw~aqCt`}eujE- ;1kjw>tJ`NRWPFY}3bU6bn#&P~JpFVX$c_-nwN8ygwxao@E zlwJk}ogw?d
f)gAG!5NP!Kqq>K(D*DlIT{X2*@~NUqD z5GT _{ zCQTn{$(1Rh=~mAJQ*IQX?CFxmDx#E=RDzK>t2%H4J@_$IgmlXcGxSKCtE-qcxML=) zz{|Dwb3V9s)^k1jF5wzylvb_)mf`mEFNzImcJ-k)8Wjj?%5X2N08_ zu*b$__jVSrdiQ&~m{Z!1g+?Odr5;1DvS~X66@M)*hObWGDh)*q2*%+EHX(6)Jd?6G zqZQ*JG!WC~s%>9|ZgOi2Hl^NOCApaytHSL7yyc}`Ejisoo^s3Ae(QUYcy`+ElDf@+ zHd>;9whO|5wz9w3{BI`xn@2?ej^SYd> Z$BI`(_u8ig{GT+HYf)vC7fg!{1o}LuPE97T89Ujz!u6G)UE)T zO*?lC*Tlbtd3O_3#5o7&I}nx*o`H$-of#Yb$bc7a? KDIE+D3G4 jIbO9WPxHjfFVj6krAaW$p}+cqy+)Ze5JmYD}g*9 z*l)TeMaAlU&_&@gsKr{P7=j)y#30JhrGBV`P=)vy13wMw=ov`RNRjDlQT7&64bgoP zg1Y-~Q4YA*b?Fri`8%@?BjWb$9t-595EFE+fQ0qQk;Z*$D*P91YQB@#vu8^F)CUyI zK~bu^W6sX&e&_0gyKq4udQ-%oZ6x#ou5`2Y_<9*@# XSo5ELGd=SM(*iSZQroeefs oKT>TO z1(6eeB!LHr(<1IyX%Y@(B!ZsP#t7MGf(Y-hK!Em|NzU#Ez@zS^A?X=Hk3dR*6a^Or zI`+@^MeO~kqXkq!SL6fH!d2wM< (84Kp#$(F99Y5@+_3DwemK(Wthj+Uan8RY6PEIL4Hc<}WfeY;JH4 z^i1JnYxM@}KWv?c`t!-fOj>ezDh?Yd YG&KqxJx;fqM=xn!Mxjx(`OT%-A2 zHij8crQBmrK4A+78*;>#?iRZ+yW#bzdca?2yVVR};xr4U4pgm4ZzbY1dIFM6SmQ;V zVor#p;^t}Dr6w!EsJLVwevpm+z;8LiyttcOiZv*)`(QRYNP|M@b@77w+jbj_E3Cst z4zPalNP2{6)xc(CY7IQL0-8__MW`dA(UMwYLx;Jp&DhWkFtr96TLDg}1|!sg5p1!Q z0A9Gi{!eu}8Z9j~Hny1S8-E)EnOcL4t$-&~!x8G>2)4A8{9^$8Ps9Ar>LMB)2=Ny9 z7#lpmIya!f6<~S^7+V2Ks4k-V#}M#84X$RF7ZWR?iPbP9Iv9d2^Z_<{fc1{QcL14Q zTK$KC@LvYv5pjiS3sJLp&_``krC;$Fl(LD(X-^gJ>F?6YEv0^XPK==z6mgL4OjZO1 zO|)RB{;01Z6g@YfxDm$~1_T-e@>VY^Nq@Itfv*13AE6;-+ihhDDfQETUuIx|EgK!R zi@a^8rBXp)69>34{erO`tZhli!gkm%@1%RX!TZ93KX5WpZuqRURGFS@b;Txi5#9P* zmR7W_x}Vg7kJ!SG$A~4^W($_VCtKr0*vXXPKc-4>g=5vJ $REfE?8=a zbhtv856KY^$qD}f>R~GXzkrRT13w?<2$S#+q8xSd{s*>4w4;jp+u+99;D+0ZX8#93 zhT1^J{=slt810Yc&!nhW*I&iPLp3QjEL|0-_B>q` zf=zh(ktxl%`fBagTwN7OYfc_&W{tRip6jLw*>=$`N?pTEYwGKXb;+*9DI#*bI?%oA%MLEm1qZ2uVmVqG~vE7P2_fu#B zuJSNNJ~T|v*m~f@6ZMt(5^rJF!(m1rRu7T;UEFc=P54Od4at}g1VmmO2I0e&DFpEA zFeIySOazp1PjRJ`6Y&gujhsBFwI9!nQR}Hb>j)j&$ta`0bB=l^-6J~tJ-&j}wy1iP z*d4Nc_3Q{Zj2YC5T5Zh!j2?H6!$DUkUAd}Z*atVX1XXn9#(KXOa5V6Js?Sv2oR9uL z?OcUd)ZN-0T1un^R0KvsKtMu5KqQ9lZj>5HK{`Zfi6Nw8q!~&YY3c3~kdhJvq&vQm z*Y^T*{nq^loLRFb*4lgh)|`Fjob$}yk8I*xi)z` e|;_B?X>Kx-}1OkrjpZ 8rElyg)4nxxxL8>%@n&|7*dyKXLdaJ&WXwQn S#4FW7Bo;7-w82W}!AeTZ9s3Apo~>?A zR3wwu(_9ziagP^E7-|CJC -CU79 zN|B$&&=a$#$L!VJQ}U9>@{s+R7TIHcI;=B*2n06M_sJ3J8ne1=DdEt@^*)SMeJ)R= zc}}glj90rlOE(3my@BN%^9c4y=^@rb+9ltu5S{^M2hVTR)ehc#1C+OB?>Yt-Lc 08Vd+we zRR)5kyP60q?4myHkDu%XKuOPZkAIxX1wct^ncTIHZ8r!Lv|%C%JD-PgrIIXz LM|K z0vuRgvfln~t-NHt8y1YgUYl*=t~PYMrW^ZuL?g}l!J)JEwo3W;pZ7@do*%tQT*b&L zrCdo{bx5#)Ek4U^X_Ai!n9;S_V2ybI?Dk%?D(RK5wdk}d;BOvJ&G%wb;bLwgP#)B` zKbTi(|B8`@$-qqUup^DWb!xPh$Gc=ep?foZKSA(*kgaD*e!7-6x@1{;Mm(i?c0>BZ z zT;vm+16L^}U#P2N-o-AEN!@9FeM z?a`fs7Td{LPs1P0CNojId}xwmM)_!$c=f^2h!=a;hM8r;>exQxNHbn>%l^O#Ucgze zdvX?6{3_6Vq&Y8_c0>8)?T*7zia2f6V!(K0N)W}N>kEGw?1HE Jsiclm}z_OOXw8@%7 gHCNdwx?owvA9?1q!MHk8 zrFUH6Xw_?-h_Tz!j_;N~0oqd>2zx@8rwDUuN_&>dNY_q8GeQ3`Ghb4AgbuaE^tur+ z39`shtkboO1x$Z@pMqeRTzZm<(SgZ4^t0*vTJ`0!3b9!~kvqZPEH>DL@o5ws?B0k~ z)@vazlzwaK54KNp ZLRe>c}t^G)W`l ECNl?GrX&3 ze%i@HaVvP8n;BlMNv?_l&y>5{oLeqh3~{w@(<`skjEua8R_FQ?RVP7RW%2_~sh zen36!9&!efww;_{=FpJia|fmCy<79^kM!0`Bx~w;{b}h^3?vCyZ+UaX#k;!Yp+kT# z6Upj`$XnZxZfQJN`?+AJ+Hi FFW81$FMJ2Ut+w6|Iwd<%kTDD zFJ2;h{N2$f*5o6FXJoEQNPVt!eUl_Pw|m1uV>+h6RA7q**z;-A-IX!wD!rVl!A%TR zQz+B$b*7*OX@;DsDcz^Ox{o)TSm0m(fBQ*dLPzG^;GM=Ou`gAhjjb$SDH}X9H~Lk5 zo``6(9A~}ZqbJ(S-}lVPAD^xjYr9`q>#j*`G845n>UHAro?&51*vH-^60N)hYMgf@ zxu{ZuI0sG(ln $!XPkmk!f@3{1xXutz4(OVkft4>tte zZG-iFz;+34dxg(Qe=D(3M(Q2E{tAXT1VGr% m z`!qF0;QF3T0|ry8h3?_ZA-Sj}Q$Z?F{tf~545$;m(f%!_4AfV8fo{wZ ocodA`dtx3AgYLYdx ufJ$_1gv`s1_^{7 uX%6ohfEBuGvoF{FrZoOJZNJCmEeNMS4- ze5%x94Z4YM`TFtO^oEUMe{~G`IbqupOp> )|qagr+fx1 z>$|+8;r;}@RgASnd)?5e&UKQrEK91!Qpa3#lcBaXz)9m>QS4bp7RuxC6Y03*1;XH{ zpe_Ls ^$;g$lmZcw1YII-5!lq_M5md6I_@JBvlH5@_6I&7CmWnx;9xsvou=ab&ldg<83v z#;hNlvgzHT5WapR*}gP2{G|}4`qKN-%CNNpavdcC1@(J@Me_Y5)H>_s>qRZok5LD2 zNNna8q;e)h*+`6VgZyTdOJR!Tz1O5i@}K8r6?;X5AE7f9W+z8K %H%@}Z)lz_UJgh|hxnF*yv91XPUWnGz(Gv^-8 zv1rm-4%EEu+vR* {_N~d^X>>#-0H57hx*@YftduY ze2mAGqJJWOm|YO&vJ7dM(yjP%7UsE9w%R!kR_SIeq;wUfDH{lxh0tck(RzGNu~2jo z*pG;UFT)sYfLv2I>GoYhni68AK#`V-r4pjyt}nfdb+7;#lO4;P2h-@?0P(CbIn!%G z6h0g7l#xafH0x%5W3<=5vC`}%1|D0^C+_ty)gY|0uLOCVtKi=cJzPI`;QF};CHxcU z|4%gGZ<_yK9l@WyAwmK5tZ*YW_7P?MSBo)zKPH)KziErm2adQ)#kgECA!MRw)dq5m z*X}IxPwug;?vjw$HFYK?ze$GI+(Y&rPq9{TB_0W#y;u+5O#OP(#o2|Y{NJCRf zY_%o>+|IsyHc=i5y7a}B`SRS}^K?pVS(6KxO&+8;uN9PtX}{+U$(`9DoY}M^>8StL z_@8^s|BnA3$N$uq)gf+K$Pm12gkR XC_aM>Xm&bp9pL-%1`hUZ<%o6dOGY2uMx1e zQ+V5xl3*>eQnC}LESuj^z;Ucw4;)r8cxy> EG_@A58{*M2j#=jmu z{(BZ#*oERsEYyyKu>6q_*>U}F%ov63DXaC={QMRt$ex>YQMIqe1Zz=-slLY02Ugx? zw_CXJl_!gj;Pc;wPe}v?&+tnrWx#@0QN+V @I`IBxgY4T4>-e&hN*>O%$S{=(TP2hQY7@K;X#_ku)YIvVuHUI)>z zn<^$-e$PH*` c)06 ACy8OhA;)N_sdlshm@Jhsq>Zi&?#O!Lk(Qs|>@tky=zbo?o z#Zze4jS1#Oq3$OEA?g@D)G<4ncX3bN^HJ$F5jmDk)GYLqqk6JMlAHHd`brb=h~Y^c z>Wn+Lq6DlhH}+@uc-fYRAv1I@(w;03e7sGNm19#cUEZ6FO0tnlqVgT&D>Flw>!rpZ zLNl|WU@AF_{X;2HQ^WMWjQtODsuGQKAjeKx?3U`&YsHPca nn9_;hINx2zrgRPOVDY~q {hE!18h{de*gh?FV$2(JXbn;S2$jtDH+Mm10Uy|kd%S*lG z5rK%!wJ)Ie;qke1FXH6}K8WzEeSa>%06;g%Z}|Vy1qhJ|vFXYMR~*@ICd3vjh!lu1 z_6v%@yZ_paF4Y|o;a9_$7hnJYjTZ2yXeJ`T)!^Y}0!=zZf{Pd;BFoh%+hrD621J(g zWf+m*YDDZZ!K3?#1m~CWN0zJcsLL#G7!g^{R|CY$xN32}OmNDMNN|1`e`G;)$6oMY za{V6DD_&W|t3WiJUEnu)|JB5QENF;e#On10ctP?v7@?Mp$beX0y ^Zu*ouh1 zTJgF-0{|Ry0Kk9MzYyWHR|*f8;VTN4;J?cdi0G>a$;)U> _nd z68O`(0+H+LuJj6*`k%Qj_Na(lS9ds9xHSLFb+O<1#YJ@fU&fzT%L}$x?LV%a@=|E< T*fIb>0>4+nn{G(!{(AR+*2(O{ literal 0 HcmV?d00001 diff --git a/DungeonExplorer.csproj b/DungeonExplorer.csproj index f77ac762..6bb27bb6 100644 --- a/DungeonExplorer.csproj +++ b/DungeonExplorer.csproj @@ -43,12 +43,19 @@ + + - + + + + + + diff --git a/Game.cs b/Game.cs index f322d533..4d5981d0 100644 --- a/Game.cs +++ b/Game.cs @@ -1,15 +1,19 @@ using System; +using System.Runtime.InteropServices; namespace DungeonExplorer { public class Game { private Player player; - private Room currentRoom; + private RoomOne roomOne; + private RoomTwo roomTwo; + private RoomThree roomThree; + private RoomFour roomFour; + private RoomFive roomFive; public Game() { - // Initialize player with a name and starting health. Console.Write("Enter your name: "); string playerName = Console.ReadLine(); if (string.IsNullOrWhiteSpace(playerName)) @@ -18,64 +22,66 @@ public Game() playerName = "Steve"; } player = new Player(playerName, 100); - - // Create the room with the provided description. - currentRoom = new Room( - "As you push open the rustic wooden doors, the air thickens. The Orcs throne glistens from the dying flame in the centre of the floor. " + - "The rugged red carpet underneath your feet tears as you tread into the room, the breeze from the hall follows you in giving life back to the now roaring fire. " + - "The room, now engulfed in a flickering light, uncovers the throne room from its dark veil ... you decide to explore the room." - ); + roomOne = new RoomOne("\n You Slowly Push The Dungeon Doors Open Stumbling Down The Rocky Cavern, The Torch Lit Halls Flicker With Light\n " + + " You Reach A Wooden Door Which Swings Open To The Orcs Armoury - Bloodstained Weapons Are Hung on the wall but they still flicker with light \n" + + "You peer around the corner two old armour stands are idle in the room the armour looking new and polished untouched by war \n" + + "... You delve into the room to see whats around ..."); ; + roomTwo = new RoomTwo("\n You Pull Open A Door Handle, Its Rusted Iron Handle Chips In Your Hand It Opens Revealing A Cafeteria With An Orc Finishing Off His Meal \n"); + roomThree = new RoomThree("\n You Hear Metal Clanging Through The Door You Rush Through Clutching Your Sword To See What Thw Noise Is -" + +"\n An Orc Drops His Tools And Grabs The Strong Sword He Has Just Finished Tempering \n"); + roomFour = new RoomFour("The Blacksmiths Go Silent As The Flames Burn Out, A Chime Comes From A Door With A Cross On\n"+ + "You Tap The Door With Your New Sword As It Swings Open Revealing the Orcs Church"); + roomFive = new RoomFive("The Guard Topples Over Making A Horriffic Screach - You Hear A Massive Pound Come From The Double Doors Off to the Side \n"+ + "You Jam The Key You Found In the Armoury Into The Lock And With A Hard Twist The Doors Swing Open Revealing The King And His Throne"); } public void Start() { - Console.WriteLine("\nGame started...\n"); - - // Display the room's description. - Console.WriteLine(currentRoom.GetDescription()); - Console.WriteLine(); + Console.WriteLine("\n--- Room One: The Armory ---\n"); + Console.WriteLine(roomOne.GetDescription() + "\n"); - // Show travel options until all items have been collected. - while (currentRoom.HasRemainingItems()) + while (roomOne.HasRemainingItems()) { - Console.WriteLine("Where would you like to check out? Choose an option by number:"); - currentRoom.ShowLocations(); - - int choice = GetUserChoice(); - // Valid index check (user enters 1-4) - if (choice < 1 || choice > currentRoom.Locations.Count) - { - Console.WriteLine("Invalid option. Please choose a valid number."); - continue; - } - - // Pick up the item (if available) from the chosen location. - string itemFound = currentRoom.PickUpItemFromLocation(choice - 1); - if (itemFound != null) + Console.WriteLine("Choose a location to search:"); + roomOne.ShowLocations(); + int choice = GetUserChoice(1, roomOne.Locations.Count); + var item = roomOne.PickUpItemFromLocation(choice - 1); + if (item != null) { - player.PickUpItem(itemFound); + player.PickUpItem(item); } - Console.WriteLine("\nPlayer Status:"); - Console.WriteLine(player.GetStatus()); - Console.WriteLine(); + Console.WriteLine("\n" + player.GetStatus() + "\n"); } + Console.WriteLine("You collected all items in Room One.\n"); - Console.WriteLine("All items have been collected. You have explored every location!"); - Console.WriteLine("Press any key to exit the game."); - Console.ReadKey(); + Console.WriteLine("\n--- Room Two: Cafeteria ---\n"); + roomTwo.Enter(player); + if (player.Health <= 0) return; + + Console.WriteLine("\n--- Room Three: Blacksmith's Forge ---\n"); + roomThree.Enter(player); + if (player.Health <= 0) return; + + Console.WriteLine("\n--- Room Four: The Church ---\n"); + roomFour.Enter(player); + if (player.Health <= 0) return; + + Console.WriteLine("\n--- Room Five: Throne Room ---\n"); + roomFive.Enter(player); } - private int GetUserChoice() + private int GetUserChoice(int min, int max) { - Console.Write("Option: "); - string input = Console.ReadLine(); - int option; - if (int.TryParse(input, out option)) + while (true) { - return option; + Console.Write("Option: "); + string input = Console.ReadLine(); + if (int.TryParse(input, out int opt) && opt >= min && opt <= max) + { + return opt; + } + Console.WriteLine($"Please enter a number between {min} and {max}."); } - return -1; } } -} - +} \ No newline at end of file diff --git a/Location.cs b/Location.cs index 832a2890..065e3de6 100644 --- a/Location.cs +++ b/Location.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using DungeonExplorer; namespace DungeonExplorer { @@ -10,15 +8,14 @@ public class Location public string Description { get; private set; } public string Item { get; private set; } - public Location(string name, string description, string item) + public Location(string name, string description, string item) //Class For Creating POIs in Rooms { Name = name; Description = description; Item = item; } - // When picking up the item, return it and remove it from the location. - public string PickUpItem() + public string PickUpItem() // Allows the player to pick up items { string foundItem = Item; Item = null; @@ -26,3 +23,4 @@ public string PickUpItem() } } } + diff --git a/Orcs.cs b/Orcs.cs new file mode 100644 index 00000000..d8a9702b --- /dev/null +++ b/Orcs.cs @@ -0,0 +1,43 @@ +using System; +using DungeonExplorer; + +namespace DungeonExplorer +{ + public class Orc // Enemy Class + { + public string Name { get; private set; } + public int Health { get; set; } + public int Damage { get; private set; } + + public Orc(string name, int health, int damage) + { + Name = name; + Health = health; + Damage = damage; + } + + + + // Specifying Which Orcs Can Spawn In + public class OrcGrunt : Orc + { + public OrcGrunt() : base("Orc Grunt", 20, 5) { } + } + + public class OrcSoldier : Orc + { + public OrcSoldier() : base("Orc Soldier", 70, 15) { } + } + + public class OrcWarlord : Orc + { + public OrcWarlord() : base("Orc Warlord", 100, 20) { } + } + + public class OrcKing : Orc + { + public OrcKing() : base("Orc King", 150, 25) { } + } + } +} + diff --git a/Player.cs b/Player.cs index 28b639f3..64112f14 100644 --- a/Player.cs +++ b/Player.cs @@ -16,10 +16,7 @@ public Player(string name, int health) inventory = new List (); } - public string Name - { - get { return name; } - } + public string Name { get { return name; } } public int Health { @@ -31,6 +28,26 @@ public void PickUpItem(string item) { inventory.Add(item); Console.WriteLine($"{name} picked up {item}."); + + // Picking up armour increases health + if (item == "Helmet") + { + Health += 25; + Console.WriteLine("The Orc's Helmet Fits Your Head Perfectly - Your Health Increased by 25!"); + } + if (item == "Chestplate") + { + Health += 50; + Console.WriteLine("Its A Squeeze To Get Into However ... It fits - Your Health Increased by 50"); + + } + + if (item == "Health Potion") + { + int healAmount = 75; // Heal amount for health potion + Health += healAmount; + Console.WriteLine($"You Gulp Down The Healing Potion - It Tastes Horrible But Your Wounds Heal - Your health restored by 75"); + } } public string GetStatus() @@ -38,5 +55,13 @@ public string GetStatus() string invStatus = (inventory.Count > 0) ? string.Join(", ", inventory) : "No items"; return $"Player: {name}\nHealth: {health}\nInventory: {invStatus}"; } + + public int GetAttackDamage() + { + int damage = 10; // Default damage + if (inventory.Contains("Strong Sword")) + damage += 15; // Additional damage from Strong Sword + return damage; + } } } diff --git a/Room.cs b/Room.cs deleted file mode 100644 index 9b2d38bd..00000000 --- a/Room.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.Collections.Generic; -using DungeonExplorer; - -namespace DungeonExplorer -{ - public class Room - { - private string description; - public List Locations { get; private set; } - - public Room(string description) - { - this.description = description; - // Create four locations with specific items. - Locations = new List - { - new Location("Warped Wooden Table", "A creaky wooden table, scarred by time.", "Healing Chalice"), - new Location("Used Armour Set on a Statue", "An old armour set resting on a broken statue.", "Shield"), - new Location("Mural on the Wall", "A faded mural depicting ancient battles, with something glinting on its side.", "Key"), - new Location("Next to the Throne", "A grand throne with a sword laid across its seat.", "Sword") - }; - } - - public string GetDescription() - { - return description; - } - - // Display a list of locations and check if an item is available. - public void ShowLocations() - { - for (int i = 0; i < Locations.Count; i++) - { - string status = Locations[i].Item != null ? "Item available" : "Empty"; - Console.WriteLine($"{i + 1}. {Locations[i].Name} - {Locations[i].Description} ({status})"); - } - } - - // Checks if any location still has an item. - public bool HasRemainingItems() - { - foreach (var loc in Locations) - { - if (loc.Item != null) - return true; - } - return false; - } - - // When a location is visited, pick up the item if available. - public string PickUpItemFromLocation(int index) - { - Location loc = Locations[index]; - if (loc.Item != null) - { - Console.WriteLine($"\nYou travel to the {loc.Name} and find a {loc.Item}!"); - return loc.PickUpItem(); - } - else - { - Console.WriteLine($"\nYou travel to the {loc.Name} but find nothing of value."); - return null; - } - } - } -} diff --git a/RoomBase.cs b/RoomBase.cs new file mode 100644 index 00000000..f723712a --- /dev/null +++ b/RoomBase.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DungeonExplorer +{ + public abstract class Room // Base Class For Room Makes Rooms Accessible From The Game.cs Script + { + public string Description { get; protected set; } + public List Locations { get; private set; } + + public Room(string description) + { + Description = description; + Locations = new List (); + } + + public void ShowLocations() + { + for (int i = 0; i < Locations.Count; i++) + { + var loc = Locations[i]; + string status = loc.Item != null ? "Item available" : "Empty"; + Console.WriteLine($"{i + 1}. {loc.Name} - {loc.Description} ({status})"); + } + } + + public bool HasRemainingItems() => Locations.Exists(loc => loc.Item != null); + + public string PickUpItemFromLocation(int index) + { + var loc = Locations[index]; + if (loc.Item != null) + { + Console.WriteLine($"\nYou search the {loc.Name} and find a {loc.Item}!"); + return loc.PickUpItem(); + } + Console.WriteLine($"\nYou search the {loc.Name} but find nothing."); + return null; + } + } +} diff --git a/RoomFive.cs b/RoomFive.cs new file mode 100644 index 00000000..62d50026 --- /dev/null +++ b/RoomFive.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; + +namespace DungeonExplorer +{ + public class RoomFive : Room + { + private string description; + public List Locations { get; private set; } + + public RoomFive(string description) : base(description) + { + this.description = description; + Locations = new List + { + new Location("Throne", "A grand throne, now empty, with the orc king waiting to face you.", null) + }; + } + + public string GetDescription() => description; + + public void ShowLocations() + { + for (int i = 0; i < Locations.Count; i++) + { + var loc = Locations[i]; + string status = loc.Item != null ? "Item available" : "Empty"; + Console.WriteLine($"{i + 1}. {loc.Name} - {loc.Description} ({status})"); + } + } + + public bool HasRemainingItems() => Locations.Exists(loc => loc.Item != null); + + public string PickUpItemFromLocation(int index) + { + var loc = Locations[index]; + if (loc.Item != null) + { + Console.WriteLine($"\nYou search the {loc.Name} and find a {loc.Item}!"); + return loc.PickUpItem(); + } + Console.WriteLine($"\nYou search the {loc.Name} but find nothing."); + return null; + } + + // Encounter with the Orc King + public void Encounter(Player player) + { + Orc orc = new Orc("Orc King", 150, 25); + Battle.Start(player, orc); + + if (player.Health > 0) + { + Console.WriteLine("You have defeated the Orc King and completed your journey!"); + } + } + + public void Enter(Player player) + { + Console.WriteLine(GetDescription() + "\n"); + + Encounter(player); + if (player.Health <= 0) return; + + while (HasRemainingItems()) + { + Console.WriteLine("Choose a location to search:"); + ShowLocations(); + + int choice = GetUserChoice(1, Locations.Count); + var item = PickUpItemFromLocation(choice - 1); + if (item != null) + { + player.PickUpItem(item); + } + + Console.WriteLine("\n" + player.GetStatus() + "\n"); + } + + Console.WriteLine("You have explored all of Room Five.\n"); + } + + private int GetUserChoice(int min, int max) + { + while (true) + { + Console.Write("Option: "); + string input = Console.ReadLine(); + if (int.TryParse(input, out int opt) && opt >= min && opt <= max) + { + return opt; + } + Console.WriteLine($"Please enter a number between {min} and {max}."); + } + } + } +} diff --git a/RoomFour.cs b/RoomFour.cs new file mode 100644 index 00000000..d1b1ac1a --- /dev/null +++ b/RoomFour.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; + +namespace DungeonExplorer +{ + public class RoomFour : Room + { + private string description; + public List Locations { get; private set; } + + public RoomFour(string description) : base(description) + { + this.description = description; + Locations = new List + { + new Location("Altar", "A grand altar with inscriptions, dark and foreboding.", "Health Potion"), + new Location("Grand Door", "A massive door that leads further into the dungeon, guarded by the orc warlord.", null) + }; + } + + public string GetDescription() => description; + + public void ShowLocations() + { + for (int i = 0; i < Locations.Count; i++) + { + var loc = Locations[i]; + string status = loc.Item != null ? "Item available" : "Empty"; + Console.WriteLine($"{i + 1}. {loc.Name} - {loc.Description} ({status})"); + } + } + + public bool HasRemainingItems() => Locations.Exists(loc => loc.Item != null); + + public string PickUpItemFromLocation(int index) + { + var loc = Locations[index]; + if (loc.Item != null) + { + Console.WriteLine($"\nYou search the {loc.Name} and find a {loc.Item}!"); + return loc.PickUpItem(); + } + Console.WriteLine($"\nYou search the {loc.Name} but find nothing."); + return null; + } + + public void Encounter(Player player) + { + Orc orc = new Orc("Orc Warlord", 100, 20); + Battle.Start(player, orc); + + if (player.Health > 0) + { + Console.WriteLine("The orc warlord drops a health potion! You can pick it up."); + PickUpItemFromLocation(0); + } + } + + public void Enter(Player player) + { + Console.WriteLine(GetDescription() + "\n"); + + Encounter(player); + if (player.Health <= 0) return; + + while (HasRemainingItems()) + { + Console.WriteLine("Choose a location to search:"); + ShowLocations(); + + int choice = GetUserChoice(1, Locations.Count); + var item = PickUpItemFromLocation(choice - 1); + if (item != null) + { + player.PickUpItem(item); + } + + Console.WriteLine("\n" + player.GetStatus() + "\n"); + } + + Console.WriteLine("You collected all items in Room Four.\n"); + } + + private int GetUserChoice(int min, int max) + { + while (true) + { + Console.Write("Option: "); + string input = Console.ReadLine(); + if (int.TryParse(input, out int opt) && opt >= min && opt <= max) + { + return opt; + } + Console.WriteLine($"Please enter a number between {min} and {max}."); + } + } + } +} diff --git a/RoomOne.cs b/RoomOne.cs new file mode 100644 index 00000000..6274579f --- /dev/null +++ b/RoomOne.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; + +namespace DungeonExplorer +{ + public class RoomOne : Room + { + private string description; + public List Locations { get; private set; } + + public RoomOne(string description) : base(description) + { + this.description = description; + Locations = new List // Creates The POIs in Room One + { + new Location("Weapon Rack", "A rack filled with rusted weapons, but something glints among them.", "Old Sword"), + new Location("Wooden Crate", "A battered crate with something inside.", "Shield"), + new Location("Armor Stand", "A broken suit of armor that might still have useful parts.", "Helmet"), + new Location("Wall Hooks", "Hooks that once held weapons. One still hangs there.", "Throne Room Key") + }; + } + + public string GetDescription() => description; + + public void ShowLocations() + { + for (int i = 0; i < Locations.Count; i++) + { + var loc = Locations[i]; + string status = loc.Item != null ? "Item available" : "Empty"; + Console.WriteLine($"{i + 1}. {loc.Name} - {loc.Description} ({status})"); + } + } + + public bool HasRemainingItems() => Locations.Exists(loc => loc.Item != null); + + public string PickUpItemFromLocation(int index) + { + var loc = Locations[index]; + if (loc.Item != null) + { + Console.WriteLine($"\nYou search the {loc.Name} and find a {loc.Item}!"); + return loc.PickUpItem(); + } + Console.WriteLine($"\nYou search the {loc.Name} but find nothing."); + return null; + } + } +} diff --git a/RoomThree.cs b/RoomThree.cs new file mode 100644 index 00000000..dc3dbe86 --- /dev/null +++ b/RoomThree.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; + +namespace DungeonExplorer +{ + public class RoomThree : Room + { + private string description; + public List Locations { get; private set; } + + public RoomThree(string description) : base(description) + { + this.description = description; + Locations = new List + { + new Location("Forge", "A large forge with glowing embers and unfinished weapons.", "Health Potion"), + new Location("Work Bench", "A workbench with a sword resting on it, waiting for refinement.", "Strong Sword") + }; + } + + public string GetDescription() => description; + + public void ShowLocations() + { + for (int i = 0; i < Locations.Count; i++) + { + var loc = Locations[i]; + string status = loc.Item != null ? "Item available" : "Empty"; + Console.WriteLine($"{i + 1}. {loc.Name} - {loc.Description} ({status})"); + } + } + + public bool HasRemainingItems() => Locations.Exists(loc => loc.Item != null); + + public string PickUpItemFromLocation(int index) + { + var loc = Locations[index]; + if (loc.Item != null) + { + Console.WriteLine($"\nYou search the {loc.Name} and find a {loc.Item}!"); + return loc.PickUpItem(); + } + Console.WriteLine($"\nYou search the {loc.Name} but find nothing."); + return null; + } + + public void Encounter(Player player) + { + Orc orc = new Orc("Orc Soldier", 70, 15); + Battle.Start(player, orc); + + if (player.Health > 0) + { + Console.WriteLine("The orc drops a healing potion and a sword! You can pick them up."); + PickUpItemFromLocation(0); + PickUpItemFromLocation(1); + } + } + + public void Enter(Player player) + { + Console.WriteLine(GetDescription() + "\n"); + + Encounter(player); + + if (player.Health <= 0) return; + + while (HasRemainingItems()) + { + Console.WriteLine("Choose a location to search:"); + ShowLocations(); + + int choice = GetUserChoice(1, Locations.Count); + var item = PickUpItemFromLocation(choice - 1); + if (item != null) + { + player.PickUpItem(item); + } + + Console.WriteLine("\n" + player.GetStatus() + "\n"); + } + + Console.WriteLine("You Push Over The Hot Iron Tools However Cant Find Anything Else Worth Gathering.\n"); + } + + private int GetUserChoice(int min, int max) + { + while (true) + { + Console.Write("Option: "); + string input = Console.ReadLine(); + if (int.TryParse(input, out int opt) && opt >= min && opt <= max) + { + return opt; + } + Console.WriteLine($"Please enter a number between {min} and {max}."); + } + } + } +} diff --git a/RoomTwo.cs b/RoomTwo.cs new file mode 100644 index 00000000..30cd9de1 --- /dev/null +++ b/RoomTwo.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; + +namespace DungeonExplorer +{ + public class RoomTwo : Room + { + private string description; + public List Locations { get; private set; } + + public RoomTwo(string description) : base(description) + { + this.description = description; + Locations = new List + { + new Location("Benches", "A few benches with some broken plates around.", "Health Potion"), + new Location("Broken Plates", "Rusty and old plates scattered on the floor.", "Chestplate") + }; + } + + public string GetDescription() => description; + + public void ShowLocations() + { + for (int i = 0; i < Locations.Count; i++) + { + var loc = Locations[i]; + string status = loc.Item != null ? "Item available" : "Empty"; + Console.WriteLine($"{i + 1}. {loc.Name} - {loc.Description} ({status})"); + } + } + + public bool HasRemainingItems() => Locations.Exists(loc => loc.Item != null); + + public string PickUpItemFromLocation(int index) + { + var loc = Locations[index]; + if (loc.Item != null) + { + Console.WriteLine($"\nYou search the {loc.Name} and find a {loc.Item}!"); + return loc.PickUpItem(); + } + Console.WriteLine($"\nYou search the {loc.Name} but find nothing."); + return null; + } + + public void Encounter(Player player) // Creates the battle event + { + Orc orc = new Orc("Orc Grunt", 20, 5); + Battle.Start(player, orc); + + if (player.Health > 0) + { + Console.WriteLine("The orc drops a health potion! You can pick it up."); + PickUpItemFromLocation(0); // Auto-pick health potion from Benches + } + } + + public void Enter(Player player) // Allows the player to enter the room + { + Console.WriteLine(GetDescription()); + Encounter(player); + if (player.Health <= 0) return; + + while (HasRemainingItems() && player.Health > 0) + { + Console.WriteLine("\nChoose a location to search:"); + ShowLocations(); + Console.Write("Option: "); + if (int.TryParse(Console.ReadLine(), out int choice) && choice >= 1 && choice <= Locations.Count) + { + var item = PickUpItemFromLocation(choice - 1); + if (item != null) + { + player.PickUpItem(item); + } + } + else + { + Console.WriteLine("Invalid Input!"); + } + } + + Console.WriteLine("You Rummage Around But Can't Find Anything More Of Value In The Cafeteria"); + } + } +}