From ab44401114a17fdd8f9ead9356e2fd623be6dddd Mon Sep 17 00:00:00 2001 From: David O'Toole Date: Mon, 14 Dec 2009 04:11:06 -0500 Subject: [PATCH] use pager and textbox --- forest/README | 45 ++++++++-------- forest/forest.fasl | Bin 578020 -> 601983 bytes forest/forest.lisp | 128 +++++++++++++++++++++++++++++++++------------ forest/forest.org | 2 +- forest/forest.pak | 1 + forest/splash.png | Bin 0 -> 9665 bytes forest/splash.xcf | Bin 0 -> 59594 bytes widgets.lisp | 4 +- 8 files changed, 121 insertions(+), 59 deletions(-) create mode 100644 forest/splash.png create mode 100644 forest/splash.xcf diff --git a/forest/README b/forest/README index f3e0d3c..86aa463 100644 --- a/forest/README +++ b/forest/README @@ -1,25 +1,26 @@ -((("Welcome to Sanctuary, a Novella Rogue-like in Common Lisp.")) -(("")) -(("You are an archer and initiate monk of the Sanctuary Order. Humanity")) -(("and the four continents of the Known World have fallen into a dark")) -(("age, where undead horrors from the deeps of the earth have scoured the")) -(("land of its people and polluted its very soil. The third Aentis Oscori")) -(("(literally \"Dark Age\") is predicted by ancient tablets to last 100,000")) -(("years, and the warrior-monks of the Sanctuary Order are charged with")) -(("protecting the few lands still fertile and the few people still living")) -(("in the Known World. In their libraries they preserve the knowledge of")) -(("ages past in the hope that a distant future generation may retake the")) -(("Earth and restore Humanity to its rightful place.")) -(("")) -(("You live in a time nearly 1,000 years after the falling of the Dark")) -(("Age. Armed lightly with bow and arrow, wool clothing, and leather")) -(("armor, you set out from Nothbess town heading south through the")) -(("wilderness toward your destination, Valisade Monastery. You've been")) -(("summoned to Valisade for unknown reasons, and commanded to make haste")) -(("through the mountains instead of the safer route to the southwest.")) -(("")) - -(("You are +Welcome to Sanctuary, a Novella Rogue-like in Common Lisp. + +You are an archer and initiate monk of the Sanctuary Order. Humanity +and the four continents of the Known World have fallen into a dark +age, where undead horrors from the deeps of the earth have scoured the +land of its people and polluted its very soil. The third Aentis Oscori +(literally "Dark Age") is predicted by ancient tablets to last 100,000 +years, and the warrior-monks of the Sanctuary Order are charged with +protecting the few lands still fertile and the few people still living +in the Known World. In their libraries they preserve the knowledge of +ages past in the hope that a distant future generation may retake the +Earth and restore Humanity to its rightful place. + +You live in a time nearly 1,000 years after the falling of the Dark +Age. Armed lightly with bow and arrow, wool clothing, and leather +armor, you set out from Nothbess town heading south through the +wilderness toward your destination, Valisade Monastery. You've been +summoned to Valisade for unknown reasons, and commanded to make haste +through the mountains instead of the safer route to the southwest. + + + + diff --git a/forest/forest.fasl b/forest/forest.fasl index 36d85536140ad3cae88edcfaf42ad995bf50f3f0..56030c0afc3dd7c95133374332b39af33cfb0305 100644 GIT binary patch delta 15576 zcmb7K34B!5)t`6Yo0%6T`$`g)zzk*rSrtnV5(r@gjD!%R0xoQcI|xW9TImoKaeRiw z2p3yXzzvjE5fQXfp|u6usL&60szIniT?z(k6luQyxi>TOE(!g<{_?vy_kXs#opauu zd2{S>Z^y^JRU>@kZ=G8=^Y;9l(e<>P|ITeld z%j&gd^=w(azO3F@R_|O^?^;&x-cfHZc_^6a$#M^LI2<)-6=-A70%)~p#P?}>FZO7G z!!bl#XFTj<+^7AD=&ye1Gz_1^@HRn7H}$j&Y_9z@CIgelJHO--O4a zk<5_RX)DkVn{Om@XZfZA{?8rmv`Hi~d_LcJ-weO5u}zTbe*G%_!jd?RJr3l{_5H+` zYxulAw?06>z$*=A_%)3^0kNS^le$j=kcX!V_|k7&{rIX@mp}h}lhfGKG|+Hb&t~*A zwxxi#zT_Uko+;q{cDhr_w}R{afH@qa^xO1>dc$!2uHl|OV#QZt%Hz;RqlI_!3iN5k z`aOCT+fcwyy{%XBZ)ogOctq@7>B)+xdEZgv-3U4Aeb~*Dx7bsQJ<2nh#duqv zF#81KDp@_Qd;t7;_hWOA*5WBsE$RVHnjRWNX%SRHs|_lsv;=ZY68*v9j3(~s6U*mM zGgEoi8Z(yf{H2*x?0Fz#05r&ULZ>z@+`b{yCvP;)<;_}B3Qx^-Ck8JCoQzhDM%Cdt zOwL{%R)c?Tb;!dcWOYdRPaE+6C>n#tkSkF&^3g-pc#+1pRgLiYqG}XC$6x~^HihU> z)hH_DHMx2j-_znWO3rs48Y?D4QAtYB)7XXhKdi@op0w8O*Y4rkc5RZIqTh0+@r~^) zJ(UV@)78HAyT44d$}+JNma{is@~zQ}Kl-HG-F$R(a^DY#yVvI)?p)Z=bOou#TFyK$ zOWp_#wEn^Oj?n7(>`i7`%)+tKRV=Ugqbnuj_nq2OucM~pHf9|?QOu3d`G3OIIXv(nU_|0`ySHs)(@!4#k47 z$jc>vyd>2iqR@?_4n6iKP-lsl97<6Q5SSB%nk-~eQxv*du&K~Z3X5lB94QYMx+@?G z7rM#R7ln@8!uwA_Q0T6dXbOmo?5XHcp_>L8DRfr>Xzc33o%0W|5A@PGfQ(FRm2NH| zDjjZ@3Fp0C^7${hQ}~{j+_C)a9d1vr2W`7QkL;c0^Fe$QM^&fr`LD8GeA^%0#lcO^ z?&_w-7SIef#ni#ejcB)_&9U_f=b%9glfMlF+qDn`C(!_+SEGdZF8BGOPkowDxPH8a zgQMHUB8sZ$)%IsVzI@+AUw&6Jk@kzB5V_pm4nR47MkP}X>3U$pYfsg&ee^?pQa;aj1`z8;`(lIydT-_xs0|>UxfIf#o>fW1LPh_mVsd5 z_k!R?%#PBXlkU8?B6{i0dlw19cV7F!EHC5-PH27Sdd22Y;NM58Yjv)#WB(vG@)mnX z4|M4kdn<`4oI})!++yzs!gMTRiW>R=dK76*ppi&h0idy!g*y*=wV+wN9Z;CqBJD-+ zWTeGWq>V)jKay%9TPY)~v>C#1e!oO^&hnigh%m8T>~a)8W0Qw&sx#59N2^CG;E4^c zj36{I88X0Xc7d>~g?>yIeJD1d5kCh_8on$IUjf0we+$x0$k7bX4Y^lI)vu4}{4}*2 z@Z69Kn~9M79TXxV_Zk3&+@34i78E^4)C96TJKns6@tmTbs zOmCJiQGRBA2%>Pr{YaKhe&iwZ>i9J_{=W-()f%%deyxq?DB`=;wdQnY6!C3q&5Kz_AwRy>ta6{lAf7&n{HwKQKEIBei-vmo#86_;y^IoL zN@t%gnRMSGOmg-Cf>~bnDP<`Zs~y4u(oK%TYEEWNzipvW1AMt3LjRvkO3vq%1M zX%v@Ml7#PXr2SJg;?<&!5>M?-vHX>F=7lV&h=0A#yz=TE=enWk(cO;jc+|q?o<44x zZI^8aPppEz{-}NiYJ6R8mK4XM6Wy1i-4PhqrF97zQ zLGkr&O%LM#6b}s({?mj}dq9X|JLiqITA4M>)JeYtCBug>9K{VVg z7{j|Qy|Wh`ttv9he5e`1TACFA``sEVB)%a_P7(UTa|`t}Oa`}J^oEVPDr4ZKyx(nF zU-x~>-bh&XMjBuGD|3pm5PQN8Y}YdRo(WDTf9y$j&-fAGbzW6*mF3$eI8*uHN6enA zM;hO|-s~F_n*6F2cr_Gwf}gB1Gg(WjV7o$-U$>k?dC5X8ojoLZP(5G;4uk@m`G&sk zO!iaBjtx!TY6Z520(&fHg*50Hk-TpO-VX(yx10ef`7kByewXDOCwZGBPY+Gr&u7kr zaxm=!n{3ba_xsnX?3Qo>KBYK9p& z9ts??;;!KvYq6Nc$^4%i%sy$?Bs(0h(diyXbI^U=a?WgCy(>Ls2qY0^X!2>xIiUHI z(di{A;LEM-WljFkDyxT`)qr)}h)$@o-3puzRYH4?fG0y$yw4Cq^NmW zL)i9qX}hoTG&=Z5vP9sM`zpUA%=->;WkftowR@1G?+*{x4iA3eLC%Ie5LP{$LF$E< z&^ZTq_%G&=x<29|)+%eH0UP%7rA4lunp|e@=@A8d%vvTDtiUeXALo4DSi;geH3w%$ zG<$_Nv-Q7Q&hCUR%YldgW;xR%9wN(WRhH8)q7Ye5s}Pm!sA!~`DbgR&hmxcs!3rD>RiscP zS7cZS+KOx|t%){pR8rmDrPCHV>q6!idg!vVRyd@p<8AAg0f8j!3`YdSJQ_Y6j|hmR zv9^FX(#|q2inBS8F$o9%_XegnuUsGFrjL4-a}5=hbcXzTTQkzL=0sd#!yYD$2HS3> zY3pT%=EqU)=48fgB$bND3KOxyiIEk$TQOtHxlw$APudRj}pFpRd9poo~0)S!#Kd6N#5$s^T+!Oyg8jOw^PIT~6!liSq z$mny!eL}t6szDsITT>7R?bbZRLA$jWanNp!Ordf{os3Z6N72a+1rAWPzZ?UHCLa!6 z(;8|x7Fu%LihCKJsUn?k7YE0~B$DzBr*rz~JZc0F8K%fdUWFKuHxI z{zLKVT^sR$xY$kV4Okbpxl3J$k7!2f!eRStYtEVNDm)t1GWUE;m)XKYbhdDS_5O$1 z#@9wXP+j1=i(I|KQ5BzRm+e(##=FQkzB)$F%0nlzVRFllS#csYtEg6w#H6jbIhY8~ z90KRz$5WjtA5Y_8{~E3AI8D~}cw%0YH*PXBd&^URQ?V}LlvJ%aT9O*`v4-?ZOz@kyJ^ zT(;fC@7!ee=_RL+=oQCM)ozVH9jZDlS3|S!B}&X2G-;HW5}%gFzuROEiF;El<9IY~ zQu&0(%^ry#Aj7P^WgbVO*6=JTp|c+Pi3xr!fabL9MhzxI@wF?X=I1^i8TZMEW#pcATU7gvD4Q=f_n;`>X>c|t(c zlVhREW0vzP0r40)9I8ZIo)Qo@r30bLL!EVFF!2UiUv$(s<=M-pYo8~u?Q%iLqHm#O zH5|Z+j-;M?qQ-QnHka(m95^Oo6UnCo_E4OHqqm1*`04VM9v%yJ^0*HCr!1l>BJ(gD z%qw*f%xs~~zj@NUB>PhY(fy;oAD*7D{5^ETCv(tpe$U4|We#$Ehc9ei8_65%oP9Ze z%1ll_3!g1L^u8duhb7!0}{AZi-s;y=fD`F?onh$2@viBuE zB=Jb{ZK_Z?A<2i5{8^G$B-tiOvn0Qeq!@4Jn($S8YV*uB5C0Q=XVnMW9c~YgTfae@% zxooOrmD*T?BrCzja!UJS3B2DVr(a8uTbLk5dQ_4Xk}Q*CrX*F843i{75={{8Tb^{* z>F0@Ooq6nVeB^+%KM6j2#>UzpSXxk$>5`0-q)d_mNqmwxBst2rbzr)0O7glS8zi}3 zl153ckz|Y{LnO(Sq>mu%hge$fnk!v?ea)d*xehDQ%P?8rV;eznQt!5r? z(%gC46_Q^pNs1(A`Nlg;zxJUdha`Dkl4eQnl;k=|MoE${2;ZA!) zKCKZN#nLEC^5@TEdD`cE^?X#NgM#o`OSC-g3CUU^Sr6=h;ath8m#i}r!5Sp{_bz}F zkLWl5du5*Xar40{Ki_!|GCc^i!27)A&03A0FJA-)0~+y@gA)s|Qnz3Z zyA8)w^*XDC(#Gk2zWxcLmJiLxcq5nKRo~zCePO@be=4 zV01A_5DbKXZNgJjU1y@tiT8AaB34nOL>T3hQ8KnjHA)a$q|xRSbYmG0%fe!OTX^oS z#X(TijX^B<#oh2d;Fom6?*aaW-SA_;zbMSd_>t2zAs8GM*!XVnFYbo#0{4tBBUwRHdNMWQyFjNtw;#I;W3MU1eVc@WI+eRmYIb2ao0;i1Big1|@pGTsP;WsDc ziXuW6yb(dtwVz$*sbNMV75#WPu248};EYl@9&joZP7iQKE1Vc`0#Qy7yKjPZX_N(y z8=Nr;#|6$|TOoq_9 zhD_+Ci8t6;PZM!2*Alls-upxiC`PA~GyJk*203e!#k7rTXXh^+M6qm>HM32WNJj6Y zqE0BqQhgquhEhC}%sQgtU}q&yrGxf~Vl_*SBWh}!D51iiESha$A}XbZjgV!rO;*9K z1IPQ^D4nxuSbC+U&MMv)q{3Pko|NcejfHXwq6)T&qSuYFM|iG}*isL+R0`#UMe%Es zHLy*Vyf#_j+GIUzV?Uw%hmj~(ZL&JGiCQFoMIvfYnHlnnejMj}xh+GIs&6J;O>Tao*1GU3}~mbb~&Zj<@kCX!e#N+hp+Cz;QQ zAh`|$h;tP^I2C#xnvh89{dwq#EUu43Poyoqv<)(msN&_L$jlA2D3OWc)uc$h9^^*k zS`76>a+%Z<+4PJ)F*O7YX6t%hB4@uFiCVcKGIL=rqOD=?!3(Pk*kO2UC+yLKgMMxl_n>r zcv7dO_D$=Z{#N=o8L#!cBy)GBH|v|M+1Y8m%6iT2byu(3dK-O>{yY1(_Wy-9alpF+ z?!KTZ_x9XafABZ{sd9@na9)7xP zbNR1Fyg%}xiqcWvkFqLrN54I~_R^n^IXQOLWuJ^+T76^fZ)+PTpO|b-{c`Fh(~_@U za&6nSk4|4OqjF}-tnIU2n_W;hp>9Fl=K2roW3O9v-GUn*xapCb({H(I&f9Yi2j{gc zj$3-i(zM108x!wZbl1SU-?;nZd+uNM*}bN<>4BK0u}!x$ty+<>@}<=eKh$r{J8N_K z*>$Cl%v;~Se%zz8H>}u@wrT$3r=Qrr`ON0LEvvRXx8>$%K6z%zv)iBj=vjTMckB3_ z8oL==>T~pWe({R~Z(-wa0o2Wjo|xFt*wsMub!JNQ)2t`|_;u40oJ+boN`a$5W48j7 z;PNsLRAck;zlGim;_C~CMDNfcN6;S>v{FG!6m+$M=r?tpUhpt#Nr*xq`sr?T2>M-h z6m3zErJ(oo?V9&1sK0`a42o(79WCo@(9yC;K?MqODyV5-)QzKMxPp2r=yS@%$gUl< zqhQMpJ8Zc}LGhRe$TNU(s1wE#qxeA)#L;OWIxI__p6!ekTuDM%54=8An zf&vOEQIO`vhoR{3U-egpP|(u~3Mr^gK@}?MXZL9+s4Ryb29daQ0Y=f5zIJq{g059i zp@Lir`mB%L%YFr|BNU7bf3qU2QV>(n(cX5a3lua|K`sS--pg*cPauphE88=Q@O}kN zRZzZy+OzFWKU2^?1+7s~okTc)QD(;~LcfBX3Ob%;AMkeyvJ^B|K@$|@?LlWPu=(AcQRpB9SG5$YNNsAzKh4L8;&nAlTs% zNF3tDDzYfD)oMU1&_EKk1?$KckVU{ETQOyc#7PUbl=QrNGc)f%KR-X_+~5D6d)~SC zoOy3vY`TXro4ZFPZ%AlswS56Cxz!8Fji5JHnnJ zwZ(imxpzt)!S75agT9rY z#)+dL_%rZtB>c1K$iL3Y6?|V?p=UxBtQE~>^H>Yd@rNNZ!6I1s_hHbPc~*TKl#JK-&Lb?--3 zTXYB3NC`nAg1UYxebbx;oSay7%zBNHIedGDT4pnpN0XSFBQo~eVkN^ z_5ayX_P|kgT#=rk@^eg%0WsI57{|ilDZ@Jztxlh|L@ILhy(Ksn|5uT+Ro^tx-;;E- zl98)=s&S^mz>#_XSZ3Q@Rg$JtzI!b5_Da~dBIT3VG`)%Mi1C4+CPuL*#$0a<6OB>g zjRAv4V{{wsjS-?`ELI&L58IcJgnG3&6CcWTB|$vj$d4rq zF?F@G|TF>u9Sz7;6hO%<;`-GVJHNuAI6cqn{q@?Rt*S5 zH%9}}%^B(Dyn#BZN%H%M;obC}M4%EYXx0tKGVjx6xD=IMPjAXi+EPrSNAD}eERmJM zmp0!=PhM-5yBkaps=kUNA(!M(65id=nZG5G$v5Thz1a?$l#Yz=D`VRnS#6#Tb({nw zcPQF<<-2f0xtg$4LE^sPLdmI{a+=XWx6tJ4Bopao0Kc ze0WRN&v}amY*vh0VBpBQ@5pRZr0wcB^Db?6sOnCN&5EtTk$GK__E5a6*y{9 z*LW)mHxOSFPJ!NfvTKrn+(fX!Cb%gePTBiZU6Gec-jd3?|Jgg9r>xKkD+(g zjre77Sn%sRVd$yJNk#gU#J9+aTpu#7MII1#2)5($7h*O9As6+`^OKa^2TH~fwslX( zsNW?}U>hA@0l29#X4`C5#$I=1UH9zrGCg*B&Pm|*_&JA9)uflvs75Y>&7&JZl-A|X z)CKP0`Oem>CQELevcjd5H7K^@4%>aj*5t53Q+x$Zht&IKdzsiiOH!mm=VjT- z9VaJ6KMPmK%!kZuVWyIqHO$OrCYu?78otG!q%M*say!Uyz1~9R>HVx+J{y0+8LZqO zI_46YiD%{^$sP}BHZ$`*GcIPnU}h^btC(59Odd1o%)~R(g&C2Vf0EV-5c&o)7nnK8 z%mHRLGV>xc8O-!&CWM)*BsE&JaA%ouFteJO+00C1CW{(=gn=DH62pKFd`POJcni5x zB3ij4bjr4xGTKyyeH~Ac{iVmA%Wh-gQ<*XzqNw9K3s_6WBk(Hb`L#~In!4+GoA!yYA z2s+tW-OWNa@8@$qdp*o=JZH~J(dp<9I#C!U3UAOKie`g3*vzZ{g>n3|;DB{_Jo97K zWrvdC7q0rt5*CDa;rMaLH4K#TNC^dH0#ZzNkg}1~1(Y15bOvQ2QaXV$2^4+@+!s6< zgqS50$LAu)5O91>b=HQ3CVb!HCsHaW$v-CPiOPeJRApiD(dASlz25&+8cNbv_H z4=H}2Oh<|g%8V49U30bukY*w$Jt(t~B7u^R6cLmHqzIrCg2MNK2ejvOIJ4f&LE(z< zgxvs#A<>y)JflvCbYk}769S!h;qeKcPRx0Hf}<02ADyt%Qb1nw)S2DhD(T_1WWFlx z@=6j&3smU?uOxz0qDo(RcPfCi5G2bej(-uX5al@m9*$*^Is8g|%I+;t zkl6t3yX4U;1<|f9V^^Wg>1G}2rfrC_3ZNmDGGDbNSt_&@-K-2nqs(aNf)$_lC; zBdw!l49CB0hcrYByfD53gAH&ifw#tGswSFsBCVX~h5R?5rc3lzl@3$gUJdmV#l$yY zMTky!QD_xp@v``(G)8|>f7}0Hz}v=4#s?vho!dI!=`z^Fg|>%&9CkW z=}24Dy{MRIn?1THI=9=6?lIHbgFT9SCii;2S4*!d%OLAfYfe&f@~V`B zeJ=EQ*eAB{(EgcEP8$%GR-Jx4{oJ6Y!Dlnp4cR#K@UW%BBS%~uQIhF5vUX(uQPZD3 zHG1Tj#<2zCvU0ZM6y|=NTQc>;)aYq#(`U{&Gh^k zdrp7E@vp)WnsxEg6E{wrfOB3Bs2Aky0KY)zOt~vL6X%y;e@*of%zkEFGRLdcN%iCS zm0&r(96nv@D?JZ~&PYM@9sI!a&8O-JpL=vLP-r6vO5p_lM zquQt5v`-@XR6};1YmEkVt~RxWy$dfR`U24!L^Ba(Ac{fsO)t$A?5>?!bfqEcjObcV z%|h3HMAe8EBg#S4ACbMKhc@VOM1v5uo3);o5q*wmE24#n#v@9Fzg=mLI{?we1nt}r zMC%bPMPx&iiiksWCm#CGSM4M5TH1xkfv5=4a7=O9C?cYaSnZrX7M=&Zx7qf@XeXB= znt><zd={GI5nb!14O)t5AR;}YAEUMFjv?BslHI%eb!c)b zq9jE3qqIS9AUcMq22l~B(Ujo&?9OIElMd?Irdj+Kgy9qH&12BWmg7iwV!aCJpLbZz6gT(J(|Yh_1q~GT#9o zL9`Z8ftKtpQH!o0g0*3eBHD^*3Zf?viHNQQX=Cn1WM7Lg2T=^73Zphm79ttZ$v~~A z6VW_G8Fqx-5PcM&4YL7J0iq;C0fFiZ5z%@?Ih4H5zkX=46QZ+%Hs~jaau8V% z35fmuBO}lAFAGifMD$nqqmOUl21Esjh9i;?9aGQNd%gu76w01|LppHikX0!< H-LU@wfT*+5 diff --git a/forest/forest.lisp b/forest/forest.lisp index 9391e01..4aee464 100644 --- a/forest/forest.lisp +++ b/forest/forest.lisp @@ -57,7 +57,7 @@ (when [is-player stepper] [say self "You don't need this map; you've memorized the way."])) -;;; Forest addresses +;;; The World addresses of the levels in the game. (defun generate-level-address (n) (ecase n @@ -1350,8 +1350,38 @@ south. You can hear the monks singing in the distance.") [print-inventory-slot self 1 :show-as 2] [newline self])) +;;; Pager and splash screen + +(defvar *pager* nil) + +(define-prototype splash (:parent =widget=)) + +(define-method render splash () + (xe2:draw-resource-image "splash" 0 0 + :destination )) + +(defvar *space-bar-function*) + +(define-method dismiss splash () + [select *pager* :game] + (when (functionp *space-bar-function*) + (funcall *space-bar-function*)) + ;; TODO ugh this is a hack! + (xe2:show-widgets)) + +(define-prototype splash-prompt (:parent =prompt=) + (default-keybindings :initform '(("SPACE" nil "dismiss .")))) + +;;; Help prompt + +(define-prototype help-prompt (:parent =prompt=) + (default-keybindings :initform '(("N" nil "page-down .") + ("P" nil "page-up .")))) + ;;; Main program. +(defparameter *pager-height* 16) + (defparameter *room-window-width* 800) (defparameter *room-window-height* 600) @@ -1365,48 +1395,78 @@ south. You can hear the monks singing in the distance.") (let* ((prompt (clone =room-prompt=)) (universe (clone =universe=)) (narrator (clone =narrator=)) + (help (clone =textbox=)) (quickhelp (clone =formatter=)) + (splash (clone =splash=)) + (splash-prompt (clone =splash-prompt=)) + (help-prompt (clone =help-prompt=)) (player (clone =player=)) (status (clone =status=)) (viewport (clone =viewport=))) ;; - (setf *status* status) - [resize status :height 60 :width 800] - [move status :x 5 :y 0] - [set-character status player] + [resize splash :height (- *room-window-height* 20 *pager-height*) :width *room-window-width*] + [move splash :x 0 :y 0] + [resize splash-prompt :width 10 :height 10] + [move splash-prompt :x 0 :y 0] + [hide splash-prompt] + [set-receiver splash-prompt splash] ;; - [resize prompt :height 20 :width 100] - [move prompt :x 0 :y 0] - [hide prompt] - [install-keybindings prompt] + [resize help-prompt :width 10 :height 10] + [move help-prompt :x 0 :y 0] + [hide help-prompt] + [set-receiver help-prompt help] ;; - [resize narrator :height 80 :width *room-window-width*] - [move narrator :x 0 :y (- *room-window-height* 80)] - [set-verbosity narrator 0] + (labels ((spacebar () + (setf *status* status) + [resize status :height 60 :width 800] + [move status :x 5 :y 0] + [set-character status player] + ;; + [resize prompt :height 20 :width 100] + [move prompt :x 0 :y 0] + [hide prompt] + [install-keybindings prompt] + ;; + [resize narrator :height 80 :width *room-window-width*] + [move narrator :x 0 :y (- *room-window-height* 100 *pager-height*)] + [set-verbosity narrator 0] + ;; + [resize quickhelp :height 85 :width 280] + [move quickhelp :y (- *room-window-height* 100 *pager-height*) :x (- *room-window-width* 280)] + (let ((text (find-resource-object "quickhelp-message"))) + (dolist (line text) + (dolist (string line) + (funcall #'send nil :print-formatted-string quickhelp string)) + [newline quickhelp])) + ;; + [play universe + :address (generate-level-address *start-level*) + :player player + :narrator narrator + :prompt prompt + :viewport viewport] + [set-tile-size viewport 16] + [resize viewport :height 470 :width *room-window-width*] + [move viewport :x 0 :y 60] + [set-origin viewport :x 0 :y 0 + :height (truncate (/ (- *room-window-height* 200) 16)) + :width (truncate (/ *room-window-width* 16))] + [adjust viewport] + [select *pager* 2] + [loadout player])) + (setf *space-bar-function* #'spacebar)) ;; - [resize quickhelp :height 85 :width 280] - [move quickhelp :y (- *room-window-height* 100) :x (- *room-window-width* 280)] - (let ((text (find-resource-object "quickhelp-message"))) - (dolist (line text) - (dolist (string line) - (funcall #'send nil :print-formatted-string quickhelp string)) - [newline quickhelp])) + [resize help :height 540 :width 800] + [move help :x 0 :y 0] + (let ((text (find-resource-object "help-message"))) + [set-buffer help text]) ;; - [play universe - :address (generate-level-address *start-level*) - :player player - :narrator narrator - :prompt prompt - :viewport viewport] - [set-tile-size viewport 16] - [resize viewport :height 470 :width *room-window-width*] - [move viewport :x 0 :y 60] - [set-origin viewport :x 0 :y 0 - :height (truncate (/ (- *room-window-height* 200) 16)) - :width (truncate (/ *room-window-width* 16))] - [adjust viewport] - [loadout player] ;; - (xe2:install-widgets prompt viewport narrator status quickhelp))) + (setf *pager* (clone =pager=)) + [auto-position *pager*] + (xe2:install-widgets splash-prompt splash) + [add-page *pager* :map prompt viewport narrator status quickhelp] + [add-page *pager* :help help-prompt help])) + (init-forest) diff --git a/forest/forest.org b/forest/forest.org index 180027e..6993ad6 100644 --- a/forest/forest.org +++ b/forest/forest.org @@ -1,4 +1,4 @@ -** TODO +** TODO Split file ** TODO [#A] WXAD controls ** TODO [#A] add 8-way firing *** TODO diagonal arrow tile diff --git a/forest/forest.pak b/forest/forest.pak index 8f598f0..f1ce161 100644 --- a/forest/forest.pak +++ b/forest/forest.pak @@ -109,6 +109,7 @@ (:name "sanctuary-map" :type :image :file "sanctuary-map.png") (:name "tiny-map" :type :image :file "tiny-map.png") (:name "wall" :type :image :file "wall.png") + (:name "splash" :type :image :file "splash.png") (:name "ruin-floor" :type :image :file "ruin-floor.png") (:name "bip" :type :sample :file "bip.wav" :properties (:volume 10)) (:name "serve" :type :sample :file "serve.wav" :properties (:volume 10)) diff --git a/forest/splash.png b/forest/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..85714ef7267e89ab865dee5d866911fce2b298ec GIT binary patch literal 9665 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 literal 0 HcmV?d00001 diff --git a/forest/splash.xcf b/forest/splash.xcf new file mode 100644 index 0000000000000000000000000000000000000000..f7f3986bf2723541b2731bba5b9504b4a744f87b GIT binary patch literal 59594 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 is set." (clon:with-field-values (max-displayed-rows) self (when (integerp max-displayed-rows) @@ -597,7 +597,7 @@ normally." (- (- max-displayed-rows *next-screen-context-lines*))))))) -(define-method page-down textbox (buffer) +(define-method page-down textbox () "Scroll down one page, only when is set." (clon:with-field-values (max-displayed-rows) self (when (integerp max-displayed-rows)