xevil-2.02r2.orig/0040755000175000017500000000000007675236133013321 5ustar aaronlaaronlxevil-2.02r2.orig/win32/0040755000175000017500000000000007675236133014263 5ustar aaronlaaronlxevil-2.02r2.orig/win32/res/0040755000175000017500000000000007675236133015054 5ustar aaronlaaronlxevil-2.02r2.orig/win32/res/!DOG0_RU.BMP0100644000175000017500000000302606603537414016546 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,|,,,,|,,,,,,,,,,,,,,| ,,,, ,,,,,,,,,,,,,,| ,,,,| ,,,,,,,,,,,,| ,,,,| ,,,,,,,,,,,| ,,,,, ,,,!,,,,,,| ,,,, |,,,!,,,,,, ,, |,,| !,,,,,, | | !,,,,,,, | !,,,,,,, | !q,,,,,,, , ,, ,,, |qq , ,,,,,,,,,, | ,,,,,,,,,,, | | ,,|,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,,, |, |,,,,,,,,,,,,,,,,,,,, ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/27A.BMP0100644000175000017500000000525606604107434015742 0ustar aaronlaaronlBM 6($.xhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,|||,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,潽潽,,,,,,,,,,,,,,,,,潽潽|,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,潽潽|,,,,,,,,,,,,,,,潽|,,,,,,,,,,,,,,,,,潽|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,f,,,,,,,,,,,,,,,,,,fffffffffffff,,,,,,,,,,,,,,,,,fffffffffff,,,,,,,,,,,,,,,,,fffffffffffffff,,,,,,,,,,,,,,,,,ffffffffffffffff,,,,,,,,,,,,,,,,,fffffffffffff,,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,mmmfff,,,,,,,,,,,,,,,,,,,,,,mmmmfffffmm,,,,,,,,,,,,,,,,,,,,mmfffffmm,,,,,,,,,,,,,,,,,,mmfffffmmm,,,,,,,,,,,,,,,,,mmmmffffmmm,,,,,,,,,,,,,,,,mmffffmmm,,,,,,,,,,,,,,,,mmmfmm,,,,,,,,,,,,,,,,,mmmmffmm,,,,,,,,,,,,,,,,,,mmmffmmmm,,,,,,,,,,,,,,,,,,,,mmmff,,,,,,,,,,,,,,,,,,,,,,,,,mmmff,,,,,,,,,,,,,,,,,,,,,,,,,,mmmmf,,,,,,,,,,,,,,,,,,,,,,,,,,,mmmmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,m?mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,??mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,?????m,,,,,,,,,,,,,,,,,,,,,,,,,,,? ? ??,,,,,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?? ? ,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/39A.BMP0100644000175000017500000000602606604044314015736 0ustar aaronlaaronlBM 6("8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|潽,,,,,,,,,,,,,,,|||,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,潽,,,,,,,,,,,,,,,,,,,潽,,,,潽,,,,,,,,,,,,,,,,,,,|,,,,潽,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,|,,,潽,,,,,,,,,,,,,,,,,,,,|,潽,,,,,,,,,,,,,,,,,,,|,潽,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,f,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,ffffffffff,,,,,,,,,,,,,,,,,,,,fffffffffff,,,,,,,,,,,,,,,,,,,,ffffffffff,,,,,,,,,,,,,,,,,,,,,ffffffffff,,,,,,,,,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,,,,,,fffffff,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ff,,,,,,,,,,,,,,,,,,,,,,,,fffffff,,,,,,,,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,,,,,,,mffffff,,,,,,,,,,,,,,,,,,,,mmffffff,,,,,,,,,,,,,,,,,,,mffffffff,,,,,,,,,,,,,,,,,,,mfffff,,,,,,,,,,,,,,,,,,,mfffmmmmmmmmmm,,,,,,,,,,,,,,,mffffmmmmmmm,,mmm,,,,,mffffmmmmmmm,,,,,mffffmmm,,,,,mfffmm,,,,,,mfffmmmmm,,,,,,,mmmmmmmmm,,mmmmmmmmmm,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,m?mmm,,,,,,,,,,,,,,,,,,,,,,,,,,??mmm,,,,,,,,,,,,,,,,,,,,,,,,,?????m,,,,,,,,,,,,,,,,,,,,,,,,,? ? ??,,,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?? ? ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/AAANEW7.BMP0100644000175000017500000000606606624463626016446 0ustar aaronlaaronlBM6 6(@ hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,ll,,,,,,,,,,,,,,ll,,,,,,,,,,,,,,,ll,,,,,,,,,,,,,,,,ll,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,,,@,,,,,,,,,,,,,ll,,,,,,,,,,,l,,,,,,,,,@,,,,,,,@,,,,,,,,,,@@@,,,,@@@,,,,@@@,,~r,,@@@,,~~Cr,,@@@,,~@@@Cr@@@Crr>CCCCCCCCCnnCnrrrnCCCnrrrnnC>nnCCnrrnCrnCCCnrrrrr>CCCCnCCCrnCrnCCCCCnrrnCCCrn>CCCrrr>CCCCCnrrrnCnr>CCnrCCCnCCCCCCCCCrnCCCnCCn>>nrn>CrCCCCrnCCCnCn>CCrnCCCCrCnCCCCCCrCCCCnCCCnrnnnnCnCCnCCCnrCCC>CnCCCCCrCnrrnCrCCnCCCCnCCCCCrn@>CCnrrnCrCCnnCCC>CCCCCCCnrrCrCCCnnCCCCCCCCCCCn@n>C>CrCCCCCrnCCCn>nCCCCCnrCrCCnnCCCCCCnCCCCCnn@nnrCC>CnCCCCnr>rCCCCnrnCCrCnrCCCCCCrCCCCCnCC@nnrC>CCCCCCCrC>rCCCnrnCCCCrrrCCCCCCrCCCCnrCC>r@nCnr>CCCCCCCnCCrrrnCCCCCCnCnnCCCC>CnCCCCnrnC>n@nCnrCn>C>CCCCCCCCrrrrrnnnrrrCnCrCCCC>CCCCCCnrnCnrnnrrnCnCCC>CCCCCCCCCr>>>>>>>>>>>>>>>>>>>>>>CC>>>>CnnC>>>>>>>>>>>>>>>>>>>Cr>>>nC>Cxevil-2.02r2.orig/win32/res/ALTAR2.BMP0100644000175000017500000001006606604100414016320 0ustar aaronlaaronlBM66(0@ hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U, ??nnnnnnnn ,,, ??Gnnnnnnn ,,, ???nnnnnnn ,,, ???nnnnnnn ,,, nrrrrrrrrrnnrrrrrnrrnn,,, ??????????????G?GnGnnnnnnnnnnnnnnnnnnnnnn,,,  n" =,," =:; ,,,  ;F&!===,,&!===e ,,,  m.""&R,,.""&Rlf ,,,  n&""Jy,&""&Rz:? ,,,  m""qʽ||||,"""&Rze ,,,  ?m|ʽ||lʽm,!&Szf ,,,  n ʽ||||||m| =Jze ,,,  m=|| エ|l⽽| =l:? ,,,  mFɽ||||ʴm| =f ,,,  ;F&p||;|?|ʴɵm|l==e ,,,  n."q ʽ;| | ;|ʽʴ||lJRle ,,,  m&""q| |½ス|ʽ||JRz;? ,,,  m"""Jyʽm;|||q&Rze ,,,  ;G!&S|:| ;| ;|||mE&Sze ,,,  m =J|| | ;| ;|;|m| =Jzf ,,, m |m;|q||½| |ʽ||l:?,,,mm n" 1|ʽ|>emm,,,mm ?m&!l|||||={|emm,,,mmm."Fmz| z| ||| |=|||qmmm,,, mm&"Jl y1l |= |ʽ|| ||>m m,,, m"""r=zz |ʽʽ|`||yzm ,,, m!&z|z Sʽ|qSzm ,,,  mm =q/zSS;|mJzfm ,,,  m =n ;nʾn|{=la ,,,  n" |mɴ y9z;f;| =e; ,,,  ?F&!=mzzz`zdzSz;S|ʽl==? ,,,  m.""Jzz|{zz{mSz;;n|ʽJRle ,,,  n&""Jy zm=z;nr;|ʽJRza? ,,,, , m"""&yy z|df;'S;||||q&Rzf, ,,,,,,, ?F=!Jzxq z9zSSz| ||EJSze,,,,,,,,, m|||mq,q |z{m |d|ɽ|mqze,,,,,,,,, F ,yz スz |½| :,,,,,,,,,, , ,= =q||ʽx ,,,,,,,,,,,,,, , | |, |||,,,,,,,,,,,,,, | | | ,,,,,,,,,,,,, | | ::::: { ,,,,,,,,,,,,,, | ,,,,,,,,,,,,,,, || || | ,,,,,,,,, , | | | | ,,,,,,,,, | | |m %,,,,,,,,,, ql U| | =| | | =< ,,,,, m  mq qzq ,,,,, qzz| | | m| z|,,,,,,, =zzm |q ||||9m m| qzzz  , , zzzT q m U |m =zzzq , FzSq | mm |=zzm zzSz ,,,, SSzSz= ,  ,, ,,mzqmzz= mSzSq =SSSzSzzF , , zq , zzzzz=,,SSSS qSSSSSzzzzmm , =zrU , zzzzzz9 , SSS=,,,, FSSSSSSzzzz=,,,<=zzzq,,,mzzzzSU ,=SF ,,, =SSSSSSSSz ,mzzzq ,FzSSzS ,, = , ,,, , FSSSSSSS ,qzzzz SSSSS ,, , ,,,,,,,,,  FmqJm,,, SSzSS ,, SSSSS ,,, ,,,,,,,,, , ,, SSSSq ,, === ,,,,,,,,,,,,,,,,, , , , =SSSq , , , ,,,,,,,,,,,,,,,,,,,,,, , ,,,,,,, , , ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , , ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , , ,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/ALTAR3.BMP0100644000175000017500000001006606604044314016327 0ustar aaronlaaronlBM66(0@ hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U, ??nnnnnnnn ,,, ??Gnnnnnnn ,,, ???nnnnnnn ,,, ???nnnnnnn ,,, nrrrrrrrrrnnrrrrrnrrnn,,, ??????????????G?GnGnnnnnnnnnnnnnnnnnnnnnn,,,  n =Jz,, =Jz:; ,,,  ;F =l,, =le ,,,  m" m,," =f ,,,  n&!lm,&!===:? ,,,  m."qʽ||||,.""&Rle ,,,  ?F&qʽ||lʽm,&""&Rzf ,,,  nFʽ||||||mq""&Rze ,,,  m=|| エ|l⽽|!&Sz:? ,,,  n ɽ||||ʴm|=Jzf ,,,  ;m|||;|?|ʴɵm| =le ,,,  n"| ʽ;| | ;|ʽʴ||l =e ,,,  m&!l| |½ス|ʽ||l==;? ,,,  m.""Jyʽm;|||q&Rle ,,,  ;G&""&R|:| ;| ;|||qF&Rze ,,,  m"""&R|| | ;| ;|;|mqJ&Rzf ,,, m!&zm;|q||½| |ʽqzz:?,,,mm n =qʽqzemm,,,mm ?m ||||||={ɽ>;mm,,,mmm" mz| z| ||| |=|||mmmm,,, mm&!El y1l |= |ʽ|| |||>m m,,, m.""q=zz |ʽʽ|`||ylm ,,, m&""Jz|z Sʽ|yRzm ,,,  mm"""&R/zSS;|qRzfm ,,,  m!&Sn ;nʾn|JSz:? ,,,  n =qɴ y9z;f;|mJze ,,,  ;F mzzz`zdzSz;S|ʽ =lf ,,,  m" zz|{zz{mSz;;n|ʽ =e ,,,  n&!ly zm=z;nr;|ʽl==:? ,,,, , m.""Jyy z|df;'S;||||qJRlf, ,,,,,,, ?GJ""&yxq z9zSSz| ||J&Rze,,,,,,,,, mqqqry,q |z{m |d|qry>;,,,,,,,,, E#n ,yz スz |½|#n:,,,,,,,,,, ,# ,= =q||ʽx #,,,,,,,,,,,,,, ,#n | |, |||,,,,,,,,,,,,,, | | # #n| ,,,,,,,,,,,,, | | :G:: #{ ,,,,,,,,,,,,,, | # ,,,,,,,,,,,,,,,#n || || | #n,,,,,,,,, ,# | |#n | | #,,,,,,,,, #n |# | |m %,,,,,,,,,, ql U|# | =| |#n| =< ,,,,,#nm #n #mq qzq ,,,,,# qzz| | # | m| z|,,,,,,, =zzm |q ||||9m m| qzzz #n, , zzzT q #n m U |m =zzzq #, FzSq #n| mm# |=zzm#n zzSz ,,,, SSzSz=#,  ,, ,,mzqmzz=#mSzSq #n=SSSzSzzF ,#n, zq#n, zzzzz=,,SSSS # qSSSSSzzzzmm#, =zrU#, zzzzzz9 , SSS=,,,, FSSSSSSzzzz=,,,<=zzzq,,,mzzzzSU ,=SF #n,,, =SSSSSSSSz ,mzzzq ,FzSSzS ,,#n = ,#,,, , FSSSSSSS ,qzzzz SSSSS ,,#, ,,,,,,,,,#n FmqJm,,, SSzSS ,, SSSSS ,,, ,,,,,,,,,#, ,,#n SSSSq#n,, === ,,,,,,,,,,,,,,,,, ,#n, ,# =SSSq#,#n, ,#n,,,,,,,,,,,,,,,,,,,,,,#, ,,,,,,,#, ,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,#n, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,#, ,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/ARROW.CUR0100644000175000017500000000050606427265626016322 0ustar aaronlaaronl 0( @xevil-2.02r2.orig/win32/res/AUTOLANC.BMP0100644000175000017500000000302606604100414016577 0ustar aaronlaaronlBM6(( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,//,,,,,,,,,,,,//////////////////////,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BABYSEAL.MID0100644000175000017500000001170106624662060016561 0ustar aaronlaaronlMThdMTrkIYT`All KillBabySealsQ XQ ⃆QR/MTrko!Piano Concerto7>ORSR OO9YTUOPH7 S X[9OT;_VfO_9 X:[k O,VX[ X YbGXbY8X Y_4XWYO YbX7X_YV[ ;YO]3<XeOV ;@FLPOdTY LaLWGO=Ok*T>T[/L O@(J[>[S[Ob$T+JOS>~NLB@Q[JY_Q NJ\NJ QYJY >U(BQJNk7POWGJJ_>kOJG77>ORSR OO9YTUOPH7 S X[9OT;_VfO_9 X:[k O,VX[ X YbGXbY8X Y_4XWYO YbX7X_YV[ ;YO]3<XeOV ;@FLPOdTY LaLWGO=Ok*T>T[/L O@(J[>[S[Ob$T+JOS>~NLB@Q[JY_Q NJ\NJ QYJY >U(BQJNk7POWGJJ_>kOJG77>ORSR OO9YTUOPH7 S X[9OT;_VfO_9 X:[k O,VX[ X YbGXbY8X Y_4XWYO YbX7X_YV[ ;YO]3<XeOV ;@FLPOdTY LaLWGO=Ok*T>T[/L O@(J[>[S[Ob$T+JOS>~NLB@Q[JY_Q NJ\NJ QYJY >U(BQJNk7POWGJJ_>kOJG7<@LPpC(p@(.CBC(K<%O_<<L@CBC(p@(*CFC( <P<;TW@CODC(p@(QCC(2<><@C@LC(p@(SR'C$T%C(TY(< S<MCUJZJ(pM("JNJ(MMCSUJ5CNOYpG(pJ(%GKG(UCSdCPO G JAG(pJ(.GBG(OC!CPVdSJ G[G(pJ($GLG(5C;CPJ GLG(pJ(UdG VEVUG(+UCDXbCUJGV9G(VfMX#UfJ(&G V@GUV_!U$CJGVyViGbYkCWJbsCVYJG?SiJbVkGWObsGSVOJ]OiHbTk<@C@LC(p@(SR'C$T%C(TY(< S<MCUJZJ(pM("JNJ(MMCSUJ5CNOYpG(pJ(%GKG(UCSdCPO G JAG(pJ(.GBG(OC!CPVdSJ G[G(pJ($GLG(5C;CPJ GLG(pJ(UdG VEVUG(+UCDXbCUJGV9G(VfMX#UfJ(&G V@GUV_!U$CJGVyViGbYkCWJbsCVYJG?SiJbVkGWObsGSVOJ]OiHbTki/[ 7d< -+7_@d0i7b#>/"7e/b7Y>W!0@77>/K$W0d@YeCdcHbCR$Cf0H@5>Y+W7dC CdcGbC+$>7!Cf+GBd >YEb"&W2dC&>E2B;d 7d CW5C ; 7h0`$_0dB$04t(t?4(!+d7n7+Q;k/kS/;0_d2dD>2;d/dD;/d2dD>2;d/dD;/C;k/k<@+7*;>C/MAGJAd5_G;uAGJ5MAhJGC>>d2dxJGC>>2hGC>;;d/dxGC>;;/hHC@<nrnC>nr뼼rrnC>nrrrrrrrrrr>CrrrrrrnrrrrnrrrrCrrr>rrnrrrnrrrrnnrr븸rrnCCnrrrrrrrrC>>Crrrr뼼rrrrrC>>Crrrr뼼rrrrrn>>nrrrrrrrrrrCCrrrrrrnnrrrn>nrrrrrrrrrnnrnCnrrrrrnrrnnnrrrrrrrrrrnnnrrrrrrrrrrrrrrrCnrrrr븸rnnnrrrrrrrrrCCrrrrrnrƸrƼrƼnnnnrrrrrnrrrrrrr뼼rrrr뼼rrrrrjjrrrrrrrrrrrrrnrrrrrrrrrnrrrrrrrnrrrrrrrr뼼rrƼrrrrƼnrrnrrnnrrnrrrrrrrrrrrrrrrrrrrrrnrrrrrnrrrrrrrrrrrrrrrrrrrrrrrrnrrnrrrrrrrrnnnrrrrrrrrrrnrrrrrrrnrrrrrxevil-2.02r2.orig/win32/res/BANG.WAV0100644000175000017500000000445006430314156016130 0ustar aaronlaaronlRIFF WAVEfmt ++data~~~~~~~~~~~}}}}}}|||||{{{{{zzzzyyyyxxxxwwwvvvuuuttssrrqqqppoonnmmmlllkkkjjjjiiiiiiiiiiiijjjjkkllmmnoppqrstuvwx{}|~|M}sW8+pXoQ;. \0&5Lv=q۲tkt®ܶ䣫ۿƱlNJ\M')\}־uy{iifjncZ[GOdAN:HZC38MJ8IHIm\XjkyvmZDI/# !!6[`pvɷsn[A1*$-?FShq|}z|z{xxw}~}|}|ztmkjie_^^^XXX\\UU^\`_\ejdjorvuxw}|||~}y{z{{yz}~y}~xwyyvxwuyvszyvzy{}|}|~||~|wxwz{xwx{z~{}}|~}}~|zz}|{||~}}~~}|yyywywuwvsuuvvtxxzwxz||~~~|}~~~}~~}~}}}~|{z}}|zz|z{{yzz{zywyzwxvwxwuxxxxxy{|{||||}~}~{{~}}}{||||||}{{}}||}}~~}~~~}~}~}}~}}}~~}~~~~~~~}~~~~~~~~~}~~}~~}}~}}~~}~}}~~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xevil-2.02r2.orig/win32/res/BANGBANG.WAV0100644000175000017500000001257406430314124016561 0ustar aaronlaaronlRIFFtWAVEfmt +"Vfact dataD K -?I+<`@, YoFܫA0 F1z5#m;c9JIBK5fLD?qſP%Sg3Z=:S X"1O* zP$͉O&Q zܸ+5T9B 3(h"(7HA52CNA r)){nsSz,}p N&F'%iq0ߐW<ђ=8w'>mߺ֒.7#w@XfE5C+ZV(N=;~seR`rEE3*QQ"*!" Ljڥɗr-]w˙~2$<ǹou|GKM4ݤ{1[ܣMI ! } m&9)h#<$~HblrzA{{+T<6$$"UwsԣŒ> W ڦЉCBt6S\Ly8qO[ZYC1CzJZLiXZ[ed `H9,&/4OROB8( L0էKIVHȟ [BFrC6&`O+*8x9* zA -EGF1@/( '&f:,&(r5:;/0%#0-Xn W 1  sn u0>1z5pB*tʚAKԟa}X_ړզ@3c̀+9,-8SPC K ;2 :c$*F)iK-GDP)<+%{,h+: <(q^$C]_KDש'n+ uy y{ @G {%Z}S% ^Ѥخ^ġ Pu" E]i X`  .3  0 :$lS'3:2"2Y5/)%$g%-)i9#8*77P9jBB+EEB+?v/@. 47]>I][erbPxm+dY\YkSmHi[NFKLNE~3T1:6 2%J 7! Hru?ùFW.)F34߅/LK.6 ¿͔wF, uB7 X<" %Z%  ##%?(-P0'z4 F1USF2"Z V(Xyv2&  +{6;.## $&++$.=6A IHE4KKC6u+!h] ЬcȪ!׆'|AMP> q Eq RF1 BvS.=R\vY$] +vZ 3{{ oxX5[|8UO*} f.zo#P<-E W$Sb $%*)Y# Fj)  ngP'tmR'*g`m;Ba[vA+(! #)5(- GSt'$; S9XF> zk6$259"<">'_1bb#tv_0 t|.EV+tY"}%7&t"y f{U{ jdXJ!:)u,tg  TA t6 :`? gI ?9M $: YeO wz 3p@X 6&L<ded;Bo Z F^OB 6Qn4J>XH o \U_C% ` G.p*3?KId.]xIRe4%rz?B/{/3j5btM`1)G^xot o )" $|9;PU!-VmLOM " U 4}h7#yI sYGV*p.Y+Tw{T|lcxu5W'(i4c%g "#, C5E;eKEe!WZ 2Z(tt`[WwjppTy)K/? ^662zk{4&I{ (d\bYGBEEyG>HG>ZA95n*v}*u"~Hw)wG[cCOP7Ns 2BpnZT1iy]N>`Q.pc4b:cQ;sGlWlZtlnI 5-[L2_#3QaK2W98kB9(3Y2)BWG%(QY%`I)!GtxQ9dBjX2hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mffffffmmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ffffffffffmmm,,,,,,,,,,,,,,,,,,,,,,,,ffffffmmmmmmmmmmmm,,,,,,,,,,,潽,,,,,,,,,澾ffffffffffffffmmmmmmm,,mmm,,潽fffffffffffmmmmmmmm,ffffffffffffmmmm潽fffffffffffffmmfffffffffffffffffffmmmmm,,fffffffffmmmmmmmmm?mmmmmmmmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,? ? ?? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?? ? ,,,,,,,,,,xevil-2.02r2.orig/win32/res/BITMAP6.BMP0100644000175000017500000000606606624346334016461 0ustar aaronlaaronlBM6 6(@ hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Ul@@@@@@@@@@@@@@@@@@@@@@l@lllllllllllllllll@@@@@@@@@@@@@@@@@@@l,,l@@@l@@@@@@@@@@@@l@lllllllllllllllllllll,,,,l@@@@@@@@@@@@@@@l@ll@lllllllllll@lllll,,,,l@@@@@@@@@@@@@@@@l@lllllllllllllllllll,,,,l@@@@@@@@@@@@@@@@l@lllllllllllllllllll,,,l@@@@@@@@@@@@@@@@l@lllllllllllllllllllll,,,lllllllllllllllll,,,,lll@llllllllllllllll,,,,,,,,,,l@@@@@@@@@@@@@@@@@@@@@@@@l@lllllllllllllllll@@@@@@@@@@@@@@@@@@@l,@,,@,,,,,,@,,@,,@,,,@,,,㶶,,,@,,,@,,,,,,,,@,,,,,,@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@,,,,,,,,,,,,,,,,@@,,@@,,,,,,,,,,,,,,@@,l@@@@@@@@@@@@@@@@@@@@@@l@lllllllllllllllll@@@@@@@@@@@@@@@@@@@l,,l@@@l@@@@@@@@@@@@l@lllllllllllllllllllll,,,,l@@@@@@@@@@@@@@@l@ll@lllllllllllll@lllll,,,,l@@@@@@@@@@@@@@@@l@lllllllllllllllll,,,,l@@@@@@@@@@@@@@@@l@lllllllllllllllll,,,,l@@@@@@@@@@@@@@@@l@lllllllllllllllllll,,,,lllllllllllllllll,,,,lll@llllllllllllllll,,,,,,,,,,l@@@@@@@@@@@@@@@@@@@@@@@@l@lllllllllllllllll@@@@@@@@@@@@@@@@@@@lxevil-2.02r2.orig/win32/res/BLACK.BMP0100644000175000017500000000406606604071402016216 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Uxevil-2.02r2.orig/win32/res/LANCE_HO.BMP0100644000175000017500000000232606647433504016623 0ustar aaronlaaronlBM6(PhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,/////////////////////////// //////////////////////////////////////////////////////// ///////////////////////////,,,xevil-2.02r2.orig/win32/res/BMP00001.BMP0100644000175000017500000000376606604044314016411 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,/,,///,,,,,,,,,,,,,,,,/,,,//,,,,,,,,,,,,,,//,,///,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00003.BMP0100644000175000017500000000406606604044314016405 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,, ,,    ,,,,,,,,,,,,,,,,,,,,,,,,////,,,, ,,,,,,////,,,, ,,,,,,////,,,,,, ,,,,////,,,,,, ,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,, ,,,, ,,,,,,,,,,,,,,,,,,,,,, ,,,, ,,,,,,,,,,,,,,,,,,,,,,,, ,, ,,,,,, ,,,,,,,,,,,,,,,, ,, ,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,, ,,,, ,,,,,,,,,,,,,,,,,,,,,,,, ,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00004.BMP0100644000175000017500000000546606604044322016412 0ustar aaronlaaronlBM6 6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,m,,,,,mm,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,xevil-2.02r2.orig/win32/res/BMP00005.BMP0100644000175000017500000000246606604044314016411 0ustar aaronlaaronlBM66(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,~~,,,,,,,,,,,~ /,,,,,,,,,,,,~/,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00006.BMP0100644000175000017500000000316606604044314016410 0ustar aaronlaaronlBMv6( @hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,//,,,,,//,,,/,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00007.BMP0100644000175000017500000000316606604044314016411 0ustar aaronlaaronlBMv6( @hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,//,/,//,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00008.BMP0100644000175000017500000000366606604044314016417 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,/,,,,,,,,,/,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00009.BMP0100644000175000017500000000366606604044314016420 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,//,,,,,,,,,/,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//xevil-2.02r2.orig/win32/res/BMP00010.BMP0100644000175000017500000000263606604044314016404 0ustar aaronlaaronlBM6(hhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,//,,,,,,,,,,,/,,,,,,//,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00012.BMP0100644000175000017500000000406606624436532016416 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U || ,, |,,,,,,,,,,| ,, || | , |||||,,,,,,,,||||| , | || ,,| |,, || , | | , |||,, ||,,,,,,,,,,|| ,,||| | , |||||,,,,,,,,||||| , |, || | | || ,, | | ,, || ,, |,,,,,,,,,,| ,, || ,, |, |||||,,,,,,,,||||| ,| ,, || ,,| |,, || ,, , | | , ,, || ,, |,,,,,,,,,,| ,, || ,, , |||||,,,,,,,,||||| , ,, || ,,| |,, || ,, , | | , ,, || ,, |,,,,,,,,,,| ,, || ,, , |||||,,,,,,,,||||| , ,, || ,,| |,, || ,, , | | , ,, |||,, ||,,,,,,,,,,|| ,,||| ,, , |||||,,,,,,,,||||| , ,, || | | || ,, | | ,, || ,, |,,,,,,,,,,| ,, || ,, |, |||||,,,,,,,,||||| ,| ,, || ,,| |,, || ,, , | | , ,, || ,, |,,,,,,,,,,| ,, || ,, , |||||,,,,,,,,||||| , ,, || ,,| |,, || ,, , | | , ,xevil-2.02r2.orig/win32/res/BMP00013.BMP0100644000175000017500000000546606604100422016404 0ustar aaronlaaronlBM6 6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,m,,,,,,,,,mm,,,,,,,,,mmm,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00016.BMP0100644000175000017500000000237606604044314016413 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,, ,, ,, ,,, ,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00021.BMP0100644000175000017500000000406606615374650016420 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Uxevil-2.02r2.orig/win32/res/BMP00024.BMP0100644000175000017500000000340606604044314016405 0ustar aaronlaaronlBM6(&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rr~~rr~~,,,,,,,,,,,,,,,,,,,,,,,,,,,~rr~~rr~~r,,,,,,,,,,,,,,,,,,,,,,,,,~rr~~rr~~rr,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,~~~~~~~~~~~~~ ,,,,,,,,,,~//~~~~~ ,,,~//~~~ee ee,,~~~~~~~~,,, eeeeeeee,,,,,,, eeee,,,,,,,,,,,,,,,,,,,,,,,,ee,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00025.BMP0100644000175000017500000000316606604044314016411 0ustar aaronlaaronlBMv6( @hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,~~,,,,,~,,~ /~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00027.BMP0100644000175000017500000000246606604044314016415 0ustar aaronlaaronlBM66(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,/,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,//,,,,,,,,,,,,,//~/,,,,,,,,,,,,/~~/,,,,,,,,,,,//~~~/,,,,,,,,,//~~~~/,,,,,,,////~~~~/,,,/////~~~/,,,,///~~~/,,,,,///~~/,,,,,,,///~~/,,,,,,,,///~/,,,,,,,,,,///~/,,,,,,,,,,,////,,,,,,,,,,,,,///xevil-2.02r2.orig/win32/res/BMP00028.BMP0100644000175000017500000000316606604044314016414 0ustar aaronlaaronlBMv6( @hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,//,,,,,//,,,/,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00029.BMP0100644000175000017500000000316606604044314016415 0ustar aaronlaaronlBMv6( @hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,//,/,//,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00030.BMP0100644000175000017500000000366606604044314016412 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,//,,,,,,,,,/,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//xevil-2.02r2.orig/win32/res/BMP00031.BMP0100644000175000017500000000366606604044314016413 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,/,,,,,,,,,/,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00032.BMP0100644000175000017500000000326606604044314016410 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,/,,,,,,,,,,,,/,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00033.BMP0100644000175000017500000000326606604044314016411 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,/,,,,,,,,,,,,/,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00034.BMP0100644000175000017500000000276606604044314016416 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U/,,,,,,/,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,//,,,,//,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00036.BMP0100644000175000017500000000326606604044316016416 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,/,,,,,,,,,,,,/,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00037.BMP0100644000175000017500000000326606604044316016417 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,/,,,,,,,,,,,,/,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00043.BMP0100644000175000017500000000276606604044316016420 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U/,,,,,,/,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,//,,,,//,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00054.BMP0100644000175000017500000002406606604071376016425 0ustar aaronlaaronlBM6(6(^`$hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// /,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// //,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// //,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// //,,,,,,,,,,,,,,,,,,,,,/ ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// //,,,,,,,,,,,,,,,,,,,,,/ ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// //,,,,,,,,,,,,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,,,,,,,,,// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ ///,,,,,,,,,,,,,,,,,,,,// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,/////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,///// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,//// // //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,//// /// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,//// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,/// ///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////,,,,,,,,,,,,,,,,,,,,,,,,,////////////////,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////////,,,,,,,,,,,,,,,,,,,,,////////////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////////////,,,,,,,,,,,,,,,,,,//////////// // ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// ///////////,,,,,,,,,,,///////////// ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////// //////////////,,,,,,,/////////////// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////////////////////// /////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////////////////// ////////////////////,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// ////////// ////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// //////// //////////,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// /,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,/ ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /////,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,/ ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,///// ///,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,//// ///,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,/ ///////,,,,,,,,,,,,,,,,,,,,,,,//// ///////,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,,,,/// ///////,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,// ////,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,/// ///,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,///// ///////,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,////// ////////,,,,,,,,,,,,,,,,,,,,// ////,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,///////// ////////,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,//////// /////////,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,/ ////// / ///////////////,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,/// // / ///////////////,,,,,,,,,,,,,,,////////,,,,,,,,,,,,/// // ///,,,,,,,,,,,,,,,,////////// //////////////,,,,,,,,,,///////////,,,,,,,,,,,,//// //// ////,,,,,,,,,,,,////////// /// /////////,,,,,,,,,////////////,,,,,,,,,,,,,///////////////////,,,,,,,/////// ///////////////////////// //,,,,,,,,,,,,,////////////////////////,,////// //////////////////////// //,,,,,,,,,,,,,,,,,/////////////////////////// ////// ////////// ///// ///////,,,,,,,,,,,,,,,,//////////////////////////// /////// /////// //// ///////,,,,,,,,,,,,,,,,,,,/////////// ////////// ////////// ////////// ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////// //////// ////////// //////////// ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////// //////////// /////// ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////// ////////////// ////// ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////////////////,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////////////,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ////// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00055.BMP0100644000175000017500000000340606604044316016413 0ustar aaronlaaronlBM6(&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~rr~~rr,,,,,,,,,,,,,,,,,,,,,,,,,,r~~rr~~rr~,,,,,,,,,,,,,,,,,,,rr~~rr~~rr~,,,,,,,,,,,,,,,,~~~~~~~~~~~~,,,,,,,,,,,~~~~~,,,,,,,,,, ~~~~~~~~~~~~~,,, ~~~~~//~,,ee ee~~~//~eeeeeeee ,,,~~~~~~~~,eeee ,,,,,,,,,,,,ee,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00056.BMP0100644000175000017500000002172606604044316016421 0ustar aaronlaaronlBM#6(\XhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,///// ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,/////// ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,///// // ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,////// /////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,////// /////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,////// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,////// /////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,/////// / ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// //////,,,,,////// ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,//////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// /////,,,,,,,//////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ///////,,,,,,,,///////// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ///////,,,,,,,,,/////// ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// /////////,,,,,,,///////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /////,,,,,,,///////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// /////////,,,,,////////////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////// ////,,,,////////////// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,// //////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,/// ///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,//////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,//////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////// //// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// //// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////// /// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,///////////// /// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////// / ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////// /////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////// // //////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////// / ///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////// ////////////// /// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// // ///// /// // // ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////// /// ///// / /////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// // ///// // ///////// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// /////// ////////////// / ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////////////////// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// ///////////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// /////////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////// /////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////// ////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,///,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,////////,,,,,,,,,,,,,////// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////,//////////,,,,,,,,,,,/////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,////////////////,,////////,,,,,,,,,,,,,////// ////,,,,,,,,,,,,,,/////////////////,,,,/////////////////////////,,,,,,,,,,,,,,,,////// //,,,,,,,,,,,,////////////////////,,////////// ////////////,,,,,,,,,,,,,,,,,,/////// ,,,,,,,,,////////////////// ////////// //////////,,,,,,,,,,,,,,,,,,,,,,,/////// ,,,,,//////////////////// ///////// ////////////,,,,,,,,,,,,,,,,,,,,,,,,,,// /// //////////////////////////////////////////////,,///,,,,,,,,,,,,,,,,,,,,,,,,,,// // /////////////////// ///////////////////////,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// ///////////////// ///////////,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////// ///////// ///////// /////////////,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// /////////// ///// //////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////////// ////// ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////// //////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////// ///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////// ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////// //,,////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ // ////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// ////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// /////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////// ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00065.BMP0100644000175000017500000000566606604044316016426 0ustar aaronlaaronlBM 6(< hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U | |||| ,,,,,nn ,,,,,, ,,ⴴ,, ,,,,,,, | | ,,,,,n nn nn|, ٴ}}د,, ٯ,,,,, || | ,,nn n;;n nn ||ٴ洴|||{}T, | || | ,,n!;;n ||| 洴 | |, || ,, !!!!! 潽|| T}洴| | | ,, ,,,n!!11;;11!n|| {,,,,,,,,,,,,, !1!;;!11! || ٯ|||| TTT,,,,,,,,,,,,,,n!111!;;11n| {ڽ ,,,,,,,,,,,,,,,,,, !1!;!;!1! T}}ٯ|TTT,,,,,,,,,,,,nn;;;;nn }}ڽT T ,,,,,,,,,,,,1;;1;1!}}k ||,,,,,,,,,,,,n;11;;n}}شzkڽ"",,,,,,,,,,,;!!1111!!;ششش|ڵkzz"R ||,,,,,,,,,,,,,1;!!11!!;1"R"ٽ!洽| kkR ||,,,,,,,,,,,,,nn nn nnRR"ٴ||ڵ, | | ,,,,,,,,,,,,,,RRR"| , | ,,,,,,,,,,,,,,,,,,,, zRzyRy"R"׽|ٴڱ||, , ,,,,,,,,,,,,,,,,,,,,zRz"RRR| |ὴ|,,,,,,,, ,,,,,,,,,,,,,,,,,,,,, zRzyRR| |,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,zqzy"RR||||,,z,,,,,,,,,,,,,,,,,,,,,,,,,,,, yRR ,,ڱ,z,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,| |yR|| |, ,,ڱ,zz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|yRR|| ,,,,,,z,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,| | yR , ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, , , ,,,,,,zz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,| | |,,,,,,,,,,,,,z,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, || ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,| | |,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,| |, ,,,,,,,,,,,,z,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,||,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,, ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00074.BMP0100644000175000017500000000225606604044316016416 0ustar aaronlaaronlBM6( xhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00078.BMP0100644000175000017500000000511606604044316016420 0ustar aaronlaaronlBMN 6(4hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,~~~,,,~~~~,~~~~~~~~~~,,,,~~~,,,,~~~,,,,~~~,,,,~~~~~~~~~~~~~~~~~~,,,,~~~~~~~~~~~~~~~~~~~~~,,,,~~~~~~~~~~~~~~~~~,,,,~~~~~~~~~~~~~~~~~~~~~,,,,~~~~~~~~~~~~~~~~~~~~~~,,,,~~~~~~~~~~~~~~~~~,,,,~~~,,,,~~~~,,,,~~~~~~~~~~~~~~~~~,,,~~~~~~~~~~~~~~~~~,,,~~~~~~~~~~~~~~~~~~~~,,,~~~~~~~~~~~~~~~~~,,,~~~~~~~~~~~~~~~~~~~~~~~,,,~~~~~~~~~~~~~~~,,,~~~~,,,~~~,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/EGG.BMP0100644000175000017500000000321606604044316016004 0ustar aaronlaaronlBM6(XhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00081.BMP0100644000175000017500000000225606604044316016414 0ustar aaronlaaronlBM6( xhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00084.BMP0100644000175000017500000000225606604044316016417 0ustar aaronlaaronlBM6( xhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00085.BMP0100644000175000017500000000406606604044316016421 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U~ ~~ ~~~~~~ ~  ~~~~~ ~~~~ ~~~~~~~~~~~~~~~~   ~ ~   ~ ~~ ~~~~~ ~~~~ ~~~   ~~     ~ ~ ~~~~~~ ~~~~~~~~ ~~~   ~~ ~ ~  ~~~ ~~ ~~~~ ~ ~/~~/// ~  ~   / /~~~/ ~~~~  ~~  ~~~~ // ~ ~/ / ~ ~~~ ~  ~~~ ~ ~  xevil-2.02r2.orig/win32/res/BMP00091.BMP0100644000175000017500000003046606604044316016421 0ustar aaronlaaronlBM616(x`-hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ///,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ///,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,//// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /,,,,,,,,,,,,,,,,,,,,,,,,,////// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// /,,,,,,,,,,,,,,,,,,,,,,,,,//// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,/ // /,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,// /// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// /,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ////,,,,,,,,,,,,,,,,,/////,,,,,,,,//////////,,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ///,,,,,,,,,,,,,,,,/////////,,,,//////////////,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,////////////////// //,,,/// ///////////,,,,//// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,//////////////////// //,//// ////////,//// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////////////////////////////////////////// /////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////////////////////////////////////////// /////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////// ////// ////////////////// // //////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,/////////// ////////////////////////// /////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,//////////////////////////////// ////////////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,//////////////////////////// ///////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// / ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// / //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,/////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// // /,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ////,,,,,,,,,,,,,,,,,,,,,////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// // //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,,,,,,,,,,////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,///// /,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// // ////,,,,,,,,,,,//// /,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////  ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// // /////,,,,,,,,,///// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// /////,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// //////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ////,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// ///// // /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// / ///,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////// ////// /// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //// /////// /// // ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ///,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //// //////// // // ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// /// /// ///// / / ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ///,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// //// /// ///// // // //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////// // //////// /// ///,,,,,,,,,,,,,,,,,,,,,,,,,///////////////,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////// /// //////// /// ////,,,,,,,,,,,,,,,,,,,,,///////////////////,////////////////////////////////////// ////////// ///// //////// //// ///,,,,,,,/////////////// /////////////,///////////// ////////////////////// /////////// ///// //////// ////// ////,,,////////////////// /////////////////////// / /////////// ///// ////////////// /////// //////////// /////////// ////////////////////// //////// ////////////////////// //////// //////// //////////////////////////,///////////// ///////////////////////////////////////////////// //////////////////////////////////////////////,,,,,////////////////////////////////////////////////////////////////// /////////////////////////////////////////////,,,,,,,////// ///////////////////////////////// ////////////////////// //////,,////////,,,,,,,,,,////////////,,,,,,,,,,,///// ///////////////////////////// ///////////////////// /////////,,,,///,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,//////////////,,,,,,,,,,,,,,,,,,,/////////,,,/////////////////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,//////////////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00092.BMP0100644000175000017500000002406606604044316016421 0ustar aaronlaaronlBM6(6(``$hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ /////,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ ///,,,,,,,,,,//// /,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,/// /,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ///,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ////,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,,,,,,// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ///,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ///,,,,,,,,,// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ///,,,,,,,,,// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ////,,,,,,,,// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ////,,,,,,,,// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,,// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,,,/ ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ /////,,,,,,,,// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ///////,,,,,,,,,/ ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ////,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ////,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ///,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ///,,,,,,,,,,,,/////,,,,,,,,,//////////////////,,,,,,,,,,,,,,,,,,,,,,///////////////////////////,,,,,,,,,,,,//////,,,/////////////////////////,,,,,,,,,,,,,,,,///////////////////////////////,,,,,,,,,,,,////////// // ////// /////,,,,,,,,///////////// ///// /////,,,,,,,,,,,,,////////// ////////// /// ////,,,,,/////////// //////// /////////,,,,,,,,,,,,,////////////////////////////////////////////////////////////////////// /////////////,,,,,,,,,,,,,//////////////////////////////////////////////////////////////////////////////////,,,,,,,,,,,,,////////// ///////////////////////////// ////// ////////////////,,,,,,,,,,,,,,,,//// ///////////////////////// //// /////////////////,,,,,,,,,,,,,,,,///////////////////,,,,,,,,,,,//////////////////// ////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////,,,,,,,,,,,,///////////////// /////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// /,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// //,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ///,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ ///,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ////,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// / ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// /////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ////,,,,,,// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,//// // ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ ////,,,,,,// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ ////,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,///   ///// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ ////,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,/// //// ///// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,///  //////// ///// /,,,,,,,,,,,,,,,,,,,,,,,,,,/ /////,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,//// /////////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,//// /////////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,//// /// ///////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,// /,,,,,,,,,,,,,,,,,,,,,,,,/// // ////// // ////,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,// //,,,,,,,,,,,,,,,,,,,,,//// // ///// // / //,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,/ //,,,,,,,,,,,,,,,,,,,,////  // ///// // / ///,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,// //,,,,,,,,,,,,,,,,,,,,,,/// //// ///// /// ////,,,,,,,,,,,,,,,,,,,,,,,////////,,,,/// //,,,,,,,,,,,,,,,,,,,,,,// ////////// /// ////,,,,,,,,,,,,,,,,,,,,,,,////////,,,//// /,,,,,,,,,,,,,,,,,,,,,// ////////// /// ///////////,,,,,,,,,,,,,,,,,////////,,,,/// //,,,,,,,////,,,,,,,,,/// ////////// /// ///////////////,,,,,,,,,,,/////////,,,,/// /,,,,,///////////////////// ////////////// / /////// ////////////////////////////,,,,/// ///,/////// //////////////// ////////////// // ///// ///////////////////////////,,,,,////////// /////// / /// ////////////// ////////// //// ////// //////// ////,,,,,//////// ////////// // ////////////// //////////// ///////// ////// /////,,,,,////////////////////////////////// ///////////////////////////////////////// ////////////,,,,///////////////////////////////// /////////////////////////////////////////// ///////////,,,,,,//////////////// /////////////////////////,,,////////,,,,,,,,,////////////////,,,,,,,,,/////////// //////////////////////////////,,,,,///,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,//////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,//////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00093.BMP0100644000175000017500000002376606604044316016430 0ustar aaronlaaronlBM'6(hX#hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// /////,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/ ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// /////,,////////////////,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,//////////////////,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ///////////// //////////,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////// // ////////,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////// /////// ////,,,,,,,,,,,,,,,,,,,,,,,,,///// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,///// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,/////////////////,,,,,,,,,,,,,,,,,,,,,,,,,///// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,,,,,,///// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,//// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /////,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,//////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,///////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /////,,,,/////////////////////////// ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //////,,//////////////////////////// //////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //////////////////////////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //////////////////////////// //////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////////////// /////// /////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////// ///////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////// //////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////// ////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////// ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////// /////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////////,,///////////,,,,,,,,,,,,,,,,,,///////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////,,,////// //////,,,,,,,,,,,,,,///////////////////////////////,,////,,,,,,,,,,,,,///////////////,,,,,,,////// /////,,,,,,,,,,/////////// / ///////////////////////,,,,,,,,,,,,,,,////// //////,,,,,/////// /////,,,,,////////// ////////// //////////////,,,,,,,,,,,,,,,////// //////////,//////// ///////////////// /////////////////// ////////////////,,,,,,,,,,,,,,,///////// ////////////// //////////// ////////////////////////////////////,,,,,,,,,,,,,,,,,,/////////////////////// ///////// ////////////,,,,,//////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////// ///////// ////////////,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////// // //////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////// / ////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////// ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////// ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////// ////,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////// ///////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// ////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00094.BMP0100644000175000017500000002376606604044316016431 0ustar aaronlaaronlBM'6(hX#hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// //,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// //,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// //,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// //,,,//// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,/// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,//// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,//// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,//// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,//// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,///// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,//////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,///////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,//////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,//////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,/////// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,/////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ////,,,,,////,,//// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// //,,,,,,//////,,//// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ///,,,,/////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////,,,,////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// /////,////////// ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////////// ///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////// /////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////// /////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////// /////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////// ///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////// ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////// ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// / ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,////////,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,////////////////,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// ///////////////////////////,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /////////////////////////////,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ///////////// //// ///////// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////// //////// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////// //////////// //////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// ////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// / //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00096.BMP0100644000175000017500000000241606604044316016420 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,     ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00099.BMP0100644000175000017500000000345606604044316016430 0ustar aaronlaaronlBM.6(&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,~~,,,,,,,~~,,,,,,,~~,,,,,,,~~,,,,,,,,~~,,,,,,,,,~~~~~~~,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,~~~,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,, ,,,,,,,,,,,,,,,,, ,,,,, ,,,,,,,,,~,,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,,~,,,,,,,,,,,~,,,,,,,,,,~,,,,,,,,,~,,,,,,,,,,~,,,,,,,,,,,,~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00101.BMP0100644000175000017500000000345606604044316016410 0ustar aaronlaaronlBM.6(&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,~~,,,,,,,~~,,,,,,,~~,,,,,,,~~,,,,,,,,~~,,,,,,,,,~~~~~~~,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,~~~,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,, ,,,,,,,,,,,,,,,,, ,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,~,,,,,,,,,,~,,,,,,,,,~~~,,,,,,,,,,~,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00103.BMP0100644000175000017500000000340606604044316016405 0ustar aaronlaaronlBM6(&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~rr~~rr,,,,,,,,,,,,,,,,,,,,,,,r~~rr~~rr~,,,,,,,,,,,,,,,,,,,,,rr~~rr~~rr~,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~,,,,,,,,,~~~~~,,,, ~~~~~~~~~~~~~,,,,,,,, ~~~~~//~,ee ee~~~//~,,eeeeeeee ,,,~~~~~~~~,,,,eeee ,,,,,,,ee,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00105.BMP0100644000175000017500000000340606604044316016407 0ustar aaronlaaronlBM6(&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~rr~~rr,,,,,,,,,,,,,,,,,,,,,,,,r~~rr~~rr~,,,,,,,,,,,,,,,,,,,,,,rr~~rr~~rr~,,,,,,,,,,,,,,,,,~~~~~~~~~~~~,,,,,,,,~~~~~,,,,,, ~~~~~~~~~~~~~,,,,ee,,,,, ~~~~~//~,,eeee ee~~~//~eeeeeeee ,,,~~~~~~~~,eeee ,,,,,,,,,,,ee,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00107.BMP0100644000175000017500000000345606604044316016416 0ustar aaronlaaronlBM.6(&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~,,,,,,,,,,,,~,,,,,,,,,,~,,,,,,,,,~,,,,,,,,,,~,,,,,,,,,,,~,,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,,~,,,,,,,,, ,,,,, ,,,,,,,,,,,,,,,,, ,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,~~~,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,~~~~~~~,,,,,,,,,~~,,,,,,,,~~,,,,,,,~~,,,,,,,~~,,,,,,,~~,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00109.BMP0100644000175000017500000000345606604044316016420 0ustar aaronlaaronlBM.6(&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,~,,,,,,,,,,~~~,,,,,,,,,~,,,,,,,,,,~,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,, ,,,,,,,,,,,,,,,,, ,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,~~~,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,~~~~~~~,,,,,,,,,~~,,,,,,,,~~,,,,,,,~~,,,,,,,~~,,,,,,,~~,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00111.BMP0100644000175000017500000000340606604044316016404 0ustar aaronlaaronlBM6(&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rr~~rr~~,,,,,,,,,,,,,,,,,,,,,,,,~rr~~rr~~r,,,,,,,,,,,,,,,,,,,,,,~rr~~rr~~rr,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,~~~~~~~~~~~~~ ,,,,,~//~~~~~ ,,,,,,,~//~~~ee ee,~~~~~~~~,,, eeeeeeee,,,,,,,,, eeee,,,,,,,,,,,,,,,,,,,,,,,,ee,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00113.BMP0100644000175000017500000000340606604044316016406 0ustar aaronlaaronlBM6(&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rr~~rr~~,,,,,,,,,,,,,,,,,,,,,,,,~rr~~rr~~r,,,,,,,,,,,,,,,,,,,,,,,~rr~~rr~~rr,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,~~~~~~~~~~~~~ ,,,,,,~//~~~~~ ,,,,,ee,,,,~//~~~ee eeee,,~~~~~~~~,,, eeeeeeee,,,,,,, eeee,,,,,,,,,,,,,,,,,,,,,,,,,,ee,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00127.BMP0100644000175000017500000000246606604044316016420 0ustar aaronlaaronlBM66(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,, ,,,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,, ~ ,,,,,,,,,,,, ~~ ,,,,,,,,,,, ~~~ ,,,,,,,,, ~~~~ ,,,,,,,  ~~~~ ,,,  ~~~ ,,,,  ~~~ ,,,,,  ~~ ,,,,,,,  ~~ ,,,,,,,,  ~ ,,,,,,,,,,  ~ ,,,,,,,,,,,  ,,,,,,,,,,,,, xevil-2.02r2.orig/win32/res/BMP00134.BMP0100644000175000017500000000246606604044316016416 0ustar aaronlaaronlBM66(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,~~,,,,,,,,,,,~~~,,,,,,,,,~~~~,,,,,,,~~~~,,,~~~,,,,~~~,,,,,~~,,,,,,,~~,,,,,,,,~,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00138.BMP0100644000175000017500000000246606604044316016422 0ustar aaronlaaronlBM66(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,~~,,,,,,,,,,,~~~,,,,,,,,,~~~~,,,,,,,~~~~,,,~~~,,,,~~~,,,,,~~,,,,,,,~~,,,,,,,,~,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00151.BMP0100644000175000017500000000646606604044316016421 0ustar aaronlaaronlBM6 6(00 hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,GC,,,,,,Ɲ,,?GC,,,,,,,,,,,,,,,,,,,,,,,,,,rGCCC,,,rƝ??CCG,,,,,,,,,,,,,,,,,,,,,,,,,rCG???CGC???G,,,,,,,,,,,,,,,,,,,,,,,,,ƝGG???G???Gn,,,,,,,,,,,,,,,,,,,,,,,,,G?n??CG,????nr,,C,,,,,,,,,,,,,,,,,,,,,,n?r??C?,????n,,G,,,,,,,,,,,,,,,,,rn??G?,??G?,??,,,,,,,,,,,,,G???,?Ɲ,rC?,???,,,,,,,,,,,,rC?G?,,G?C??,,,,,,,,,,,rG?C??,,,ƝnG?n,?,,,,,,,,,,ƝnG?n??,,,,GC?,,,,,,,,,nGC?,,,,,GC?,,,,,,,,,ƝƝ??GC?,,,,GCC?G,,,,,,,,,,nn??GCC?G,,ƝCCC?Cnr,,,,,,,,,,n???CCC?CnrGGGGC?Gnr,,,,,,,,,,???,,GGGGC?nrr,,,,,,,,,GCC?G,,??GGG,,Ɲ,,,,,,,,,CCC?Cnr,?,,,ƝCG,,G?CCG,,,,,,,,GGGC?Gnr,?,,GC,ƝrnC?CCC,,,,,,,,GGGC?nrr?r,,,G,ƝrnG?CGGG,,,,,,,GGGCCGnr,,ƝƝ,,,,,?rrn?CGGG,,,,,,,,CGGGnGCG,rr,,,,nnƝ,,rnGCCGGG,,,,,,,,,CCGrG?C,,nƝ?,,ƝrGr,GCGnGGGC,,,,,,,,,GCCrGC?Ɲnr?,,rrnnn,,C?GrGCC,,,,,,,,,,GCCGnnrrƝ,,nƝ?CGrCC,,,,,,,,,,GGGGrƝ,,,ƝrrnnGCC,,,,,,,,,,,,,,nnnrr,,,,ƝƝrGG,,,,,,,,,,,,,,,,Ɲ,r,r,Ɲrrnnn,,,,,,,,,,,,,,,,,,,,,,r,n?,Ɲ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rƝ??????rrrr,,,,,,,,,,,,,,,GGGGCCGnr,,Ɲ,,,,,rrrrrrrr,,,,,,,,,,,,,,,,CGGGnGCG,r,Ɲrrnnn,,,,,,,,,,,,,,,,GCCGrG?C,,n,,rƝG?,,,,,,,,,,,,,,,,,,,GCCrGC?Ɲ,,,,,CGG?,,,,,,,,,,,,,,,,,,,,,,,Gnnrr,,,,,,GGCCC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Ɲ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BMP00154.BMP0100644000175000017500000001254606604044316016420 0ustar aaronlaaronlBMf6(b,0hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,/////////////// /////////////////////////////////////////////////////,,,,,,,,,,,,,,,,,,,////////////////// ////// ////////////////////////////////// /////////////////,,,,,,,,,,,,,,,,,///////////////// ///// //////////// ///////// ////////////////////////,,,,,,,,,,,,,,,,/////// ////// ////// ////////// /////////// ///////////////////////,,,,,,,,,,,,,,,,/////// //////////////////////////////////////// ////////////////////////,,,,,,,,,,,,,,,,,//////// /////////////////////////////////////// /////////////////////////,,,,,,,,,,,,,,,,,////////// /////,,,,,,,,,,////////////// ///// ///////////////// /////////,,,,,,,,,,,,,,,,,,,,///////// ////,,,,,,,,,,,,,,//////////// //// ///////////////// ///////,,,,,,,,,,,,,,,,,,,,,,,///////// /////,,,,,,,,,,,,,,///////// //// //,,,//////////// //////,,,,,,,,,,,,,,,,,,,,,,,,,////// //////,,,,,,,,,,,,,,,////// / //////,,,,,/////////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //////,,,,,,,,,,,,,,//// ////,,,,,,,,,,,//////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //////,,,,,,,,,,,,,,/// /////,,,,,,,,,,,,,////////// /,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// ///////,,,,,,,,,,,/// ///////,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////// /////////,,,,,,,,,,/// ///////,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////// //////////////,,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// /////// ///////,,,,,,,,//// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////// /////// ///////,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////// ////// ///////,,,,,,,/// //////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// //////////////////// ///////,,,,,,,,/// ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////////////////// ///////,,,,,,,,,//// ////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //////////,,,,,,//// /////,,,,,,,,,,,,////// ///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// ////////,,,,,,,/// /////,,,,,,,,,,,,,,,//////// ////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,/// /////,,,,,,,,,,,,,,,,,,///// ///////,,,,,,,,,,,,,,,,,,,,,,,/// /////,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,,////////// ////////,,,,,,,,,,,,,,,,,,,,,// //,,,,,,,//,,,///////////,,,,,,,,,,,,,,,,,,,,,,,//////////////////////,,,,,,,,,,,,,,,,,,,,// //,,,,,,,////////////////,,,,,,,,,,,,,,,,,,,,,,,,,///////////////////////,,,,,,,,,,,,,,,,,,,/////,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,///////,,//////,,,,,,,,,,,,,,,,,,//////,,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //,,,////,,,,/////,,,,,,,,,,,,,,,,,,//////,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //,,,,,,,,//////,,,,,,,,,,,,,,,,,,////,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// /,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,//// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ///,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/BREAKDWN.WAV0100644000175000017500000012462406430260022016614 0ustar aaronlaaronlRIFFWAVEfmt +"VfactTdata\mBH % V A Q0  _ A NC <%hiHŲ EZF1yy ,HmV( 2Jgf = ;. O  X(b#ZݠY޲蔼>q`ۢ^ ޞXt6a&cA~]SN/CJq FCȶ]ν^&}%bàƌwGoϓ z%s10ZHFazYp1WgRE (j7 9A??JR2 'm=b]Xz~%/Ai % 9cmr.lUB& %TaG BTj%:ֳɲŬDvë,IXg!duE#\06g5LРqBeK ʱRӨg n&@Z 3 'v!&,1R.|+055.6530-89B;I5>HAf;73,,p$">!- )))07Q/ 'Vg"(/o Q]*" ڏϚ^ΧtCݭrz"Œ<ӕ^ ࢝X)"Bۙd{,2> 2?K$e-031/,)/5.j'y-3Q/+-.(/"$0'GbW"R17>EwLJH[=1?@NL K3KZKC:9B82+_/22FYrDP/DXH8$GU&IV1T'RHQkPPPTXP2IPpXSOOPHAfI(Q_H?JtTLEA>@EC908@7A/-*cU  | 8E'e)C#4q`>(8ƺ@ƴĪܞ D~ʕm Ithá\ `eʖ1G?{e@r#t Og}@ P$(*&# &(-247d3/K24-3y18=HK>3h>/IA9P>BA@lCFi?8:<AEB @DHUD@;>;=?1=|:98.$/:+,=4,-.bXhyU0 `{Ȏ ̊yfTگƵIި-|{{̹ pϻ]ԘM޽)w,qD߿;:8x$ՒwA?7mǣY ɯv%穬Vw[گ"fӥ8ȶ5\݅Ks(w \ ,$ VC#3)+-/>1#2 3/8V=?B>z; AFIK MNKIGIF5O&XSNYd[QNK_SZUePZdZ7PRUS'RRSSmTOJM QMJOQT8J@-D@H>\58;A\7-<38187E/&%$#$%R  u` N 9&[sfXuC[L<GZϮ1EcֻNl/ӆ[Ÿ`‹ŲR- Ǜ(ޟwDP!   M"#$ ~G%-L2788C;===|>O?JGCOGJIE OXIWUP,L*O+R,^/j`WY[\*XSSS*X\XT\?dVFIR[lmbpX:E2G22tK_di`q\_SGJ:)8KGINSUxME#=4N|DfJB:ACG*- .  z1I?"5<7Y9/&,3/+06[2.,*.;1e.+*)$!6? P b]U n5_fo-E b mutJ#=/=MGFBFFSeB!ڛXkzwв[❗ IXdvCģC7(ȺI=3]=! ,?//BA&A-3(#]1??t>*q,A<)7C=dC8- 9 D>9??fE>8:{;?B?<725m82>-16a1+,]"%240-# Z"מ#Χc NxCmߵ jȺYv #^>Ym'cFL7Y ) OF!2$&'U&%1.6@B?渆mȈs{{}֌bY. 25.% tRM!)27=?AJTTH<2IU\b:decaebhnsUtt,uhux{xu}mB\ou[igehlkuKztok*rCyrflyjha[JXUSIRONXJyHF9,-.*T&'))$U!S o{q z`G^t߀.D{ձĂSجVTP'鲤g3‘ ʏΞט'QwX7COt pE @( DZ q  ^$/EY I9. o*YLA3%2=BKYZωVۈ__a]n債 ¾ơLVq 6 0#(- 5<7=T> ISLEaS2aK`j_cf#t%{tYy~e|{}iy&|~0w}o nle]%YT"N}G`>C52.#l(Q¿ȺӳTA3ѫUժիߪ !=I?ĘxXضdu!p}Iܾ63)94.;aA80485l2&/+4#^l] eJkƇƠݩ!E,nua!1)!.Kf׭HʋGʟ-ɸBxEZ GH!'! !4-h9453,.0*<# (,C:G{>O5 CPIBTjfeckkrniMmpz{}rk|~yz{&}z/~{s}f~g6Q\hhb[dmjgj#nalj]PV+\5aGf2_X []QFSKP?NKJJH@m6=DBE?><4^+/& * ) 0Z~" V T  =6j1WSk# SpH֧ U͞AכqnKˌl ѕu ϜhѮBFӮ:.PLݬ-|4̐ܺ}h '''t3>@KBFG@LKIiRZc]_cNfjnrvtr2{~Jy1oopopnvcX[3_iXQmLEGA9C+!#fK AP !"T'y" q8쬛ÔeۛVՌ6ڃd3򔴚k^PJ|Ɖ}X6 `߹9Cg/ H 6 ) U|z % .O/Ռgμu8yQ%*.ٱdDVfuǹ&4vȟ¾ɢ|Bƙy4gؽ{" YX 0**+Z.51CVSUZ`k`T`=k+vogoJwrfnuH}Yvmonmv.z&vv|wPu%snjfbgldU\W1S4Q4OG@AWB{:2:,%NN! UjߴF%؂Ka"sş%iFHFحجҫ}mZ2˶ۉXnt'Pu >$)2H;l<=vHZSTAV\5cbbgmt.|-{2z}uy"~sib[WVQUZfUO=U{Zhu_J,H:FC@CiFyKPME:>A~EIgNSL\DJMQOMzLKwIGCZ?@@B.&w34R665P.&'5((})*,1s7xvK$Yj  ( 5Q h n  h'rZ A(r 0>&# =;$f!(Ut1hjdiډ%Ю4ٓܽc/fid`~W_ `ěͶ(? lK#,1:5{;ACEwMDU[_bQeBhnskyc\rl}2 ui*n7snieNadohbD]TKEc?-2$-46+ "$2nV 6 ` *C+s%ӭ7ƅǾ@Ǯz&*-Z˒Ǘœ˧Ҳ {LԮ֜׏!` S -1&,g9(50=;EJrOfP\QPPuZLdb_Z]TVYI:BK$GEC7+3];4M.022?2d.*+--.O5;=>@=j;MR`PAAe@FMPSV Z`gikD\LYfb]'lzGyw}n6ejprs)ttwzZ~~|T||zuxz0xu"{F{%vsquzRwtmeplDsmXhb{]bf`c-`oWNzTIZVSoOSK@J-IA:4.M.-+("b/xeW y}goXB^̕ ΄z@ 6ZáIΊ^ʉ4Hx{a/BF䱁"㫥&@Qf} gy/ȿŝW:](5 !n'314048&AfINSZa]IZagkoks&wYy{vrsM}zvyM|riiiaY_eSi)mh+dmkrki"`_V__`]a1b[TX]d\,[bXU\b]R BGMeG*A=GOMM*N3O5PU[kQGMS[MFIQKJJ~MePQnSF9?ErB&?cBE?9999+->"' {yvϔ:9\ ³ù۳*y &L"ºahkĕ|d ͹fb; hgv {"""x0 .*o"&1&%Z 0vER^$ݕ̇x:ɩŒnų͵ҷ]˿cG|ΫXCԟؒ[-c3(.2,&/8P+ -<37+K*[);LQJGxS+_VNSX[^\ZYDY[^W\QTWQpKQW\aFQ@6N[VuQONX)cp[SCSR'TUEO INTM=GLPZd[xRDUXDTtP/LGO[WNWFEECaBd5i('%A# T"=ߝuMڨ˜3slҗǰ8KZ@߅|*ؐ:vڣgģt/c՚NJy  ~*v wz_(?*4s>{>>Pbfj b;Ye,r~z*iz~>r}Ilzu@utPvw8}x.|{"{uUp)|9xuhmjglWsJzAk<\gsolheOoy sl/lk]ryofZjmno2qrnlfj ofr^\$[VPRRRV[XV R6Tĺgޯ8aX B!&v,%2230.,:+,../ 25440p+77B=7;?AD@ =9z6&>E<39?<963&83  OU%S~NewJC;ϨdզC[p2NۋPMCÍC"yͯjH“ gǾ7QyE T<(&&'#(t4@<842}/2655d<C;4"@K@\6:u630s:Do9.../0"+U9.z mA֫ 8l]!dEݥmB)۷C]tvzH yL/'x b c 9d5 v I T ] + f75u&*.,w"ɷjG!=W Ò/ ršH򒚓X򞡟Qoc<'1;Nh BQ9˿~1Ẕxbۛ=r{T>8.Swrɛ!د;i"! 1O!HLM *,)D()3 >z=oVİV׋~(K=wYE>׽º7%Yǃ0q }շ~N3fhl)P`kvro G  * @F!eA",=1%;1caegeb_\\]!S&I7AI9E6@3,&-)S, S HYڟ3CϾΨբǜq[ȁ1ސG-mM큀0L+ kלּKk? ௖Ͱv884۳ѵ"Lm͖4֩c[x' $ >?(#H$,0'!*""I,53L123B204598)875AM/QTWY U\PZcNfh/o{uuu2tr:vy}wqJlgjn||z7uoRw~uu[uvwyhxkqw/{|}}~{w}tqx5}obc3eq~n0_ hplkeeejjo%mjPlmh_bAd!f]T%V,X|XXV1T PKL NO.P J{޾ 3|ΟϔЋt\ɏ'»)R~V$kӴ{cȾ%aӓi ? c$ (+/}332012;DvH4LN Qh\gggfg5i`kmUlko)slvyz.|A{v|}tkt^|tmoqpoe[aOh`W-\`.P?vD?I=<2-).3&Z< "&".| TLډ̂}޿qҪ ~QF: ٓdlxkG5$񷽸Ⱦ<Ȃ!ź7ɼlĪ Wa!Lyº2|V-ԟۃh !N r%667Q@H^JKTi]adg kg?djpudz{{w~u~q}Mx3ss8tqnjf`Q[_dRA-CDGRKHF 7'.S6+S!$(`t(u  o ?ޱ .=pU5T{ͦxNŵ9`~PfÍ_ޓ1‹2 jQ󊖌O8!T.u$ύČAÈŒf ѕʏ JK ɞdF𜘓GPj ӣf&ҷwv7 նǶ}Gz7eӥʭޮfۦSΥlAÇW%9։]4vM+  ( #0%C-**(e6D_D!DJQM8J S[W^`WNV^^^]X\>l,|qgmPsx~ wov}z~~x}|| {{|'y6vz'6vIm'f_ g ohdb\V"WWR NIEHJ'IG;/d-1+!A *ؾܥ0ӤڷT,դJض"ɧ$ۍb0ΖަPytjM(՜РЧ Nʏa[Px5΁ Iŵ An&Rp? y D %!1*p$*0h35~8:P>AF:2;DSCADGLQHK?fDIY#jc?]Y]u]dkfahpnmlklDn+v~pxr8z~y~{wvUv|wxtvp.milookOgdaaja]XBWUP(LVC:yI<':.28*$$r?w ;7עِԆ0[Ƶet?w ࡴ%U >{zv@ Γ]ҵPɗX+?_pɗ!Ī.˖˶uHrܽ|b߲;>+ĺZAַ.^._A <,6(  H!i O"6&q("!a',0-*_.1J,&+w0I+&*/*?%/!o? 02Dډ+ΉmL@gQd"JoVkq|<6,į3LgVlL3,{E%+421p13B6=ENA=@C%LTOJ*PU6XZc`3fHd^bRiJpg^&ins6kbkto@kkkhebm7uyZ~xHsstQy}tkosJtu#utld9gikmlkigb>[xag1^T/X[ZY8VRR"SKwDGIQGD5?{9M<?<:_0% " YZBqyԖصܐnS6ș-^Ǹr!ʧ#{OכƓz-\ҀLθK;/}[ 2-T {;%#%E$,596;41&/3n824/S,(,K0L-L*(0'S!y;'N%PF 7i~ފםѲ˱ʬ2EľNuɭF`x…Ôı|*cvםqJSVu$y!QIe pkh +s r! 2r4$/(!'-,+(%t%Q%A 0_#~j *` m '9e K 5p}8<Ea /@%Y4BߞB<4ؓnrډ2 3Xpl-ܣ߭@2#Nzc!aV Hj ]6 S  )WcAZ~ޟyT4NdYOΗ$Nvslo4ªo4 EÂ_Bʨ PƐ |ԫ Tݷ׸2ݭLϬx7Ґ+_08tۮDgssug\(f&u15'^ޚ +|P۱ڍ3w YӖc1{œýѢ>b҃֨PTܧ߁]'V}T( >dD.Q$W$\$,4G79<|?BDA ?{FMIEFJGBR?][ZS`KIGeKNRVMC5INQT*OfIWLMOLWJIHHIIB=@GNBs58y<(?A<8P<@ <{7`8D9u=A6BBA>@T?d>??}I-SMlHZLLPiPPM2KIHqJLGpAC0FXKPhRSTlH<,>?@AD-H@7<,@/?.>:b73.02.*&'#s<? j x(fۡ vyyCu/>ꦕAcF%ج}Ij 3U!$ N &,K#!)/N445x310d/1 421w1p1|/-1"6<B@?`;7 7=7:<>0@AC@===g9 5W@\@?<9<>^CqCC>@< BGIKO7SUXWVUTSRNJRHZ:]1`YSPMpTZWlTOO8J2N0RO8MeLKT|]aONA}GMISDQAQ>eAwDSC,B>;9;8779<-J!#"!~zY4BSk~LY?Ҫڻ|ܨvXŦaݙ1~*ԅ#niBJcW.ݎlQfǟ#zJ ۳BҺnsֱ;Xi{nSoU𯈶׾ʼK7$ωn&`#"Y $qU:)8rl/o  ~)W;!'E.j..:EEGHKN4PQBRRW\Q` degSikihknPqssLs|:}s{}s~|{l}[|yv,|qYz}?}=z{j}y\vp`kmo6onn6oqrwp(nf^]x\W"SVZZZ0ZuYTNRVO5IC<@SCF8JC;[>@> @r:4C5555f30-*)(3()+%~ @ ^ h UH hJ > rmD+' -E~M@2"cDQڼZً[%ֱ9הWӆBpɛ+˸$ϊMˡ˜͕ϕʘFҽȖhM2`QA ՏVULZh(jTMB]Ի^tM G4R 2 Y$,x-.7"@~AB:FILOQTSR`n[jfjoruuLtt#u+z5|2z|zM}v}t}/sqmp}qru{w{ yqr t=p]l.kjiihh_5WXZVZZY2XURwL[AD=5(423d34 665Z42+/+.1,c&%% P%n$T  W\#c 2 FOF4 y; } W s U =  8 ^ 88W 0 j ^ O b ~,W#q CI *   h W [5KczEJfdbѭȑxɶo拶ܕ2ڦ'qA)`9Ŕį]Nýn’/zOkHJgӼξRƠ"ÞА^kij %]"'X-V.V/1b46:97/6090<}<KME+>C|I?y69@6>V<60?478o9.743v2/,/ 3-K(-( (%#%(!"# w*;50o,\}U " >xD^?]}3G g }}G LDk_cejB/Da|Y145{%@d[q"A, <fLS@ #g u">s 9}jYLߜQQқ:Ӛ xBn͚ˊ(T 5\ŀQ>*7A߱{aα.<𭒮0Bp/IJoXҷC1 !EA;͗U$e>F) #x\!!!u#%'*P.2e46I655A5?BJG+EFGECIOPQRzSTIXx\a[IZXVp^f`[XUWY]^ _Z.V]#e^CXZE]^^u_],\WSR_RRSnSSQOPQOMOMMKJrNRL^GG?HECBB;5F<>59=m:7t655;5827//p0'  "b% (OD TC5r 9hzKhѯ\9Χ2Aþà +˲)OkfApoEXã/kÞj kcX)B->]}ywKԊ^7 Ou[}uV#XՍwd+i~P"Gi /ɇ\̚ր׫A0- Y #<&n+0.-V./5:.85N>F^C?GPOOI[CHNKGFKNRPQTWmXX.^lcKb,aBZZSSSZqaiqFjb fFiiyjvlunj/g jl.kziihmwrsnnjig-ijosi_;ej~dS^2dj.fKb0glga d-fc`^&\E`fdYMSAXePHMSSSTVRPJ`GDsF8HDAxABAF@LGC@"=m:7[64203630//+(9)h*v(&%%>&u'"!&Z 8!Q  ,* G W  "To R>S!ߞޑ߁7ט^ӄѠοˇP+=ͦS?>91dWISW?j1JN!zS.j Z ;sh^Raquw}.]^qтйfÑBᾁW)ýqǮɈ.IW:Ɣ`˅ȧh'fʧUTO̻$ @܆;)`-5gfb&#Kn+;$x=@AL8$|5V}&ؾz ɛa&ɼߵ"a޵/O԰Ȳ1 Mar[?u${ǂ}q=+Van5" qQ3Y!#+3-h'*-q/0130. /X/v01489;4-S,*.R1462V.(#'b,&{!"#f/    [M_T##JqGBg=k(B&6@ dr0l".-<%N M$Q%/+((c)*W,*)+-1433f0-)1&+11p10/*&%-5-n%16-k1432r5B8~76)4135p30477S7s7o7s7553+-R'1:F2)*L,p($)/)$=(+p) ''"'%#Y"!#j$"+!#&#s 3XYZ   x A}y'w*zfIo7?KN-DMX_-CK)/A.Mz)C )c m&= ;# A7fX߹]۲&ؘӒԌ_/Uwna&Β$Q́-N-խ-АNר׼'Q4nt?? N KXe?$#W" $%%E$H&H(U(a()*z))()2+*7*('()p&[#"  @: v!6y $[ f\Q[ mTh?]vS#݄fC 9ӂņŌ&G|ڲ"d\PѶgejmT6Ulֻ@ܺǿ+ k ԰R"/oDUB xP'U "|&(*+,-.3~8?76;APAA}DyGFEA=ADB@?C?@B7A^@AAECD:EEB?C??pBEK@CCnC>D:;<<[;*=><:N;;\84g56431/F37_0)O,.=)#`$%V%%|&e'%$ g,<] .wZI; E N . + z@ L{_%[ Y]E. +RC3y.7:yԵyȒʫ_ԿbP<6/&kLϡf{ܠ bݚ,z%ӚJB8Y{aE򢿧*nbS&R{+dԚԦڴi~x{h PZB"# !"# ep$|+(%'|)((9,/-+)w')',* (b+.,*x)()+-+*O)(6)h*)(<))*+'#C'*d*)('# ! I "$" x^   : `N4e$bMN׺UboчdB˞?͆RǮȁƭi5Z̴-ǫzF`{HɯC7=E\o'wZܡ/?LH|(GmS;h* P  # 4+@<"L<?@B ,:om>S&~`2M ^ RU&$#Q5pS&q>wv:x#vkp ^  A = k  ?~;$Sa%iM 4 =u$ksl_y?ޭuGi [f$w,(9` $ 6f ڶG8֨Vіь΂˟ѩ͏zˮG̍?oŚpʈ.=ORϯYԋٛ"mPV9g 8eS=o7d8=aae,x<AEg :]XU@4 u5 _E&-T$W <Zw v O )P w  I ~  $6Eh:k.3CAA  a[pL u ?   0xB\q4+uCdwl_4PfiUV@(Ztg8, Z^]\Uk޻<ڻ؃ӼtdQЊ#́gĶ Qھ$ ǿfIyśT ̵\ӣvD؞׶n %e97xb@#6g M8_D(jL/mQ,Glj(bd ^ky@% GR#[3BRqPT782-dA|9:G B"- B[sG!D"6$*&@!Y>!(&33t2913k6556B8f;>>T?h>=AE)@:uAGHCb?=:n?DA2?A?>j==tzI;ZS Z"eo{ #N}T*!3Q O N 6 e'++#c $l @  m  % Q @ = p  {h W .s ^  B Z w^ D #    F  ) a9a I[ * ce/ m  ]<m9 xY:'mP .;H_p?^}Zuf9|-;HezIg+M9qؾYԣQK>ϵ8ʹ6>C˷'[ƎĀqV<[ygɵ̀H nmP.FھAWVagyq> k  I7@,`fJ#!"#f#""!!P$'#6 !#&]*$3#' $# #'%`$#"t$% P"C ! ASseX  % ^ P + Oq v 7<  # * B o  | $ W 7 U ABC Vl{VxY?vyzm`RFf*//%mA:t;/$uacpDtI+ r~.Z|ig7) mUHoPh:b<X+$,xUXIqs>z}UA& U:nB[Bnav  I Uc j U K A >C3& B 7 { ev  ( # %\ ( w/ v s o ] g s  cW *!(o_v><;|7lvp v(szZ} zsYw jAwM.DMzAJ@3X b*3#+ Bt5h~" tC7[ Vo0R^+F-f+7S UWd vAJ $oF~7+ B#j<:P n X a u ] oOJDX!qPbxrPRQ9 b_ Fx , U w uZi}  C  > : 3 i j 5* {0AO J5 Kg;pl5ABSl"T'#8(TO2{{o1E9U-}NN[iS;-UsI_39,<\:SnGoh[bbzmD.P&YhIjh|;/ya~<{6OKK#QQSBT,kT  HiN 79#+eQeA&X%wj9.#8 $Ob!IEJ: a:txAMx9CMte6}{ H(V%WPn8xT8{?Mb(5W9GxKKnHX ,Tz!4E #B ( [6;' #a@zp  U 7 D  [ 8 n  { tFI * | i  0 = z 8 y ) H{B )  E/s%Wo)c6l_OgV@\xg\U36W3 Ey>m&1=Vjqm'K=3IHIZjda<`qa 8 U U # 1hu U  H o J 7  a  n7={>wC1o Xh ^ 9 /  y >  8 s  -3GZWyNvBq 4b0q) B#JE,)DN)yb/C/%+H6$MaY obi8u_/Z/eY9V('U It= rGeFN"/sNAteS7`'HUJ;)W K;!z%>$u;x5D:868{*i$Vp :i A tbs{R! 3d~ .@PON^j5mT9^!eQb.Z}@"e;b_:}- !Z,b#H9C#XQ>`tB}$:Q !WOE9%2X2 ,EZxA32Z!jpH}}GJMm |F\is__Z{;\-ZVL "2H(P7bsiI@7ch` YIfM4Pm.rv)N Pf)Q>*Zy0f=gc]0,<VZa+6=4]+s EqUB/#7UA)q,%wj?#5X{&7bL)TbX\&xK2BU5n{Y<HS )zY:u` e8zqC  UkUF&)u9zT!hbC4(64T+`-@ Ah-E[v,ub,h?r{q<gmI^r3UNFmhAq;SZa Z;" xZF6R/mjSZ#KrBTbN6)ulaF(E` sbX0ZU'QFsyy2/2.)Mr)2HsZBU2(  j9+ 4H`1jAFH!TM.ur@dnvdUA2Zn8b2Wy4xG>HKx/ fANZ.)ps w  n by.T})2Ed;:< 9MZH8)d[Q/@S`NWs!Z1-PPS(b3^H7Zzlg Fg`Xr3tU7{%Yp\b=c >Q>& =%7DCc*^A#Dp ':3)+$b zF;hN{56vD  TYT*1DT"DrA rjiIauI.u#{.v;c;g\fnf`:a$)[C*#5GHJpJ"[OGNbC <;j;Ir=WOv% 0UQIPV4sP.y[g9qbzBGd)2 b%/ 7 `AZ ugZ ,}Q# TJn&QvP%BH/l[#{|"<N(SBm5@FJ4]J5V/{rg4#Ifyt.ICBiv:GQpAtUJjKD}]j RY!8yL9"GTrdAEFy% &kx .:{#hy-#;IT[c.iU&KmP.tN>eN9|#KqTh&~#{v4XQ f_T/ B~); e8t;|`"]E6q fO[2,+ $u8`ZlA4Tw} >uXD5JcA$W)ixB]&2l(mA$8J`,8W=])Q pK=}j|] ]H8*J5" Qc) 1p^4.}7s4;j(VdEn|ld#8;?"fI~p3T(c}N3R3h2q`2R5#yy28Xy;7J`Ao[j g]ZK{ytK>y&yc:ZX988+ 3A8<EZsA:98Ad'Nl "A& 5WA^6Z_[^dT, RyS0FXt{?C 6;,yU:2)QxY2..6x#:`L`"N"A`ZT 4z~3KQWZNBBB2,+`h=812Kcfii+ +I)y`EDEj|;3`!Fqm:vN?9EK@2@pW.~TNr2WyfT/ Ks[}hhiws["ZfBf t^<""1ys>^.J;hc`cd`mcDoKZ)ccdZK,h2BU! (552 wN"2BdwcQyUUXZ`K655Tmm.#nijP1}i($ ,zz(a<5]QI:]PWc 0>M,1!: ;VXB/XXl~VBe qBBp$q uB3eotX>Qg~l Xp`~QD~3q3o~Bvq́X oXbègBW~uXj/l/3[33сk`gqX]qqg~~fQlqS $~B3lB`͏q$ oqk X ͋~g WB~e~Bq~X~ ]~GBlB3/3]`\̀ ~Bp ./`S3͏goo~g3Bu~*~Bj Bk ~SfkB~~// Xe﨏$b~lpBqXXG ѥggB\]BG Bl[X B~D[l~kXg~Ѿ3Bo3B\X Bl33 qqa&I3 f/喂kWX3~fjS3BoG[3gt[qgb3XDq]j /pv͂DQtgWڙB~p[$X`̀X/ q/X寀SBX[b~po͂/33~qbBlf~Bt\gB\bg~p̀X ]ggBGWuu~fVgWo~uqqр~  t/ ~BqBqgBlp g o~[eoa`3͂ ~p8GXkqਔBB~*oq̀XXfo~BBր BBXXV̀ QX`BpVgoS~͂Dp]~qpo3X~f[g]BB3q qB3XIp\͟QDtgjǵo ͂pq~G[gȁ/X\t3bVbt]lplo`tlBBB~bBpq~BfXXX`]b lD $Q3kI]fBXtkWktX~Qvl3B\bg~3 VlX3q3/ pq B~ ~kSoXBlu~ X~3foXq/VXo3 B]VW~ogX;Vb3BB~B3ถXBl\֥Xbq>做83Xvq~$ p]3v[g8 ]͏aX*g lWV]Xg]g~vl;3B~3qlBfXlBͯ 3DlX[q~ `͂3Xg]\XgXev`p3tB~~XfX]B/ooq~Qkpk$3Q̀B3gfpB~S ̀~ q$XXugVaрu[ XXBpgl[3/oB~~B  B唁]e$>3lB;lB pXWjXbI/gq]壋~D3pbqB3v ~BlXuX3͙3gWlQI ko~WX܀V;~X[gBX~~Sg 3௾ BWWBpB/[XjW/[~]XlB€ ~u~~j3kpB/3gBl3~[X͠ ҂~Qj]kq Bb u$͂qpp tBlvͩDX$ [͋ jt~oX\e[\tXB]W3Q~lI~WW qB~QvG$ gqbBXpfB~tB]X\뀀/`X~]a~ X$偀~Bo~B3>I~~qॣ[Q́$3~k~ܨX]/~.BqlqBo$~3BtB~X3 tBg~aqXXXЀQ3qBp~gXW X/uVgt͌3$̀3Bgo~/3~~[BD/*BGр&g~[BBBBq~f~~3͂g\[VWq Qq3oplg$o~3 ~ BրBgBf/u3 B eB 3\\//b `3``3kBB~~XWgB B~B~ [ot `3XXXͣ uB*~Ig]f~S 3\kùB́B [BQ  B~ q~B~XXpB]qq~pXv̀3DqtBBbl~~QXl~Blo\tB p Xg]`bBql3ol~~~gX͕B~3 ~ܤQ/ܐe]$ 3BBq̀BVSugqQq\~Q ~lql3p3gWBSD /\[рX~p~Bf\Xg\o \ /Xuo3 .3[3̀~33v SBܨQB\`qBI`BBgB3g[]B3B~W`3/3qBp&vb[ͯk33lB̀ BpX [3~ &3k/o~3g 3BXX]]38g[pu l33~  ~l[3kul f~́t333 W\XX kb8g[v͏Dv33B̀̀ ܀e3B~]f/q3p~qQ3͏Gg3 ~8W\B܀33сqSSWg3]f~Vq]`XB3B33BB͂ 3Xu3 $́&~qll3 3B~~~gaqe~3Bg3pWogD] ~>]X[  $GB[gܐSXuBt~lutBBB Bp~gq͐/3p$/oB3XX]~ oBu3ugр gXtXBk~3~~lbQ ]b[W* B~/]3̀o~͂B WXqྂD~3WW3kB~lQ3͑~~DQf W pB p 3\bB33[BB>/lq3p~]l~Q~Qq~B~̀83  W~B$  W ~BB~~B~S8\B` t[gb~ ~lj~BG3a~娤X ~ܠ~XX3B3B B3B  `fo$p̀̀ q ov$tB$vl 3Qgj.DXXQ/]BgXG G`V ~~ f [¾q~~t; 3lk $f/qqqoqt~tp q/gBlQok3X\]~B~ bp]Wb~`3 Buj~B~lb~p ͏gBkGfo~lBk8q\̀B //ྀ3[\XBqVgBBq~3W3VfDoB~X3X]GV. 3Bl`g33fB྾g[]`k~fD~ XbX`qQ$gSXb\~ bBg$ k ~̀B[X̀/`D/\u3b~3q BoqlDXB3 . q̀b3ku [ǵf~W[~3BtjqG\jlX֨Gg[gXb3pBtó͂3XDj]ͨqW`BX[XW~qpBBqg͚XpbXBX~־gq3X33~B X̀/3XlрXX3v~D3р3ù`~ *k~噀BB~ `[3Bg͖  ~B]娔qu W娨~q Dl3ͣXfW]BVu~BBpp* ~̀ qB~eځX3 $o 3Vplo] b~~l3 [/ X\BVj́~󾂂*3VX/q~f3DDVXov/рjXlGvjlX `kfB\ //pGbk/~ցXX~8X͂~~kt܂*a jg ̀[͕3B]͔~l/ ~ ]`BgBX́]D\e B~gրX~DBkbD~\ /qBWBBBX  I[X̀q ~~сb~;o>Ѿb I83XuW/a.BqkXf/[\]\v3333[f~婀bgXf X\ Q] BXV\X[ 䌠3Q3~X]pqo ~u͑gBvB tvb G`q3[ vXX3g$~ gXgW Bl 3G  Qlp33`B[/3vgS;X f~ Xe ggB333]]G3`X3B \8 [X[X 3͑fuX  kXBo[[X~33QVBk3/\/ ܔ\]qQXX$V/~B p~`~XXljXX o$fbѩgq]G3oXQրk3Xq8Iͼ[XI[Wg]Я BBq8/t~>Xqqp3~ VkGWDt]W33[V[~/V~XX͙G.333Xg\XB3Wt͖Bq$XB>3vXB>~l 󂁀DBk qf~lp  bX lVXBBpv̀B~bW G$WXBf3Xg$G;3p/aq ]8BtB ]] ͷ̀3X X~~ $ͥbgXg j BV[g G͌ ~B~gIB~BqBVgfXao3\bGBXWgpxevil-2.02r2.orig/win32/res/CHPDEATH.WAV0100644000175000017500000002371606430314204016601 0ustar aaronlaaronlRIFF'WAVEfmt ++fact'data'~~~~zx~~~~~~~|{{z{zz}||~~wpppoou{|~~~}vkhbeprs||{~|~xfX]\[djw{vwww}lRxoTe`gcfvz|{xznhWGGWhjpxvvqvxJ!?72SrzrW[do²T-'(*uhshY[dp~úT(UT`MYy]ggbbxʟ:]R#@J>Mp|]Kjj5-2,JZw~^C_~Y/ JDjͫy=?[z~lE@7Lód7Txlrʵ|R#6e^EUlml˶uX% *h~NE`h[l˧ۻV Oº_ZffVaҶʬq)mȠd[gXWuҽƑa 1ȬzWjhDYzӳʠBKѾ[g}\Pey޹ԹkD4 ^㮉w[t^X\sֱ̲{XM<RץhxiaZu̽Ȯ|q]>Z͚pb_Z{ȱwvjJNtcVWyǮ{fO ?ƮdWUhļqb- -_z`RgO+U~pVVvEBi|iU]k,(I}|sbSdc6!`{j[RfůD6r|w\JQv|K) Hrs^Yg{@(%6YqtrOMrT:24J]~{napuJ=APggptwjhq~sM@JVkpqvm~xqp|{qTFX^rwomj{ljv}|o[Y_jltzty}qpyq_ZVcotwu|qp|we`l_bmsvt~vy~~qeddoonqox~rm{~z}ydafsrpxplx|mu}zkclyvnqwwyw}ypqoszyurpw{}~|rijovooz{~~y{~~vnqmhlovsuz{z~vsi`bnxxotxvwzyy~yjhiinrwzwzx}wmhegpmlrw|zzplb`bcmry~{~iTLT_dmy||wqvtbNFK\hnx}wtvmUE@EQ_lt}yhmw]>+.Ccssx~lhn|a8$/JfphivL+ (Fw}_^drY0._okb_j}ǧwP:]yn\_qǒrK>weah⿏wK ,o§r|eavlnE-xfxuhtpn9 -%qx[pu{םoxA*4{wkvuïרmh]4 , cbf{uǾɑ`]<3 7{v^jwƾش}]F((*W~mcgx׼_K*&(H{ociqǪ|S?58d£lfnzϼgB(#K^nm{k@"(Tjtku|||ƹ\/-Vjohyzt|ͽY*;c~pkhhpi6 *Hwzlc_o½i? 3Ow~yohdo~q[:#?Uq}uto_cxxhM35IUk{txygcv{sbPAFPUfqumtvopx}{i`RU^g}~zx}|||w{th\_jqw}zz}{wwvvvztidechmpwz{|wxxrtuvusy}k__cjlnojmqv{unkkpv{}xwv{~~pbb_bdekkpwyytrtsx{zxtz~znabeb``gllsywtopvruysst{zskb]WY\]acntuyysmmrwusw{{~ztfZSMPU`imopuvvuqpoqspx~yhNGGKSZjrrwyzqomprrtwy~|fSD9?ESdhty}}wrkmrmnqwu`H.(,1D]p}}ysjdgeefksw{sW41Zw|neXVUV]hqx{}yb7>oyjaVONSals}ʿxU- .T{pa[^^_`goq{мV8!1^t_]gstquyw}ԱqQ9 #)Emm^eo}iL< ?@Ijk^a{TA1 'XC-`aWbτE83-4RmWZƶidzóyHJKP`mtlzͯx}ڭkPXOWcp}tï`VGBK\inʱɼ߷^NJCJZ`cn˲}{޷iHA03HK[pzv㼑lMA)$97Dhvq{ϨjTA':SVzww~ƒaK /3bzngft{~}~Ȧg<%+RyYMHBU]blccgbms{|@1_ittTA8+8HP[TRXMVahvwY+6Tc|cR7-6BQ[[[XS[eox~}dC Fq}veZN@>@HW_iohegipwzlcN'6\pypeZRJ;,%$,4=<>>H[kqt~ʿ׻Ǻÿ|_Xg}ºӾzZE?\·ϺS1'!FrpiwêiJ(!%6Ywȹ}ӝwbI85AZjéÂV6 8HNb}ȬwvvՖwN9ANohvڼިfdu׻ĔqOH^q첔ԳǀcC%+G~n]w}u<45[:CzzKOYahjw^kx{̃$!+Tgx~f-(-9H2):@BFQkrw>,>U]_B!4C+*AEJSd1 *1c~fDMValuzosC<%)3Mm^sŖ{՗gHC6%@Xc{ʶzktxntؼwH=76cԴtwrpɥsgH5DG~Ӹ~|ɺʼrP;-0Lvp\]gr~upnP%-[{rxpgaKE:$':QY^gWKMQ`dlxxwy{|yk]QKKGI4:ZVOG861,' (BQZaVEDIV\bprqtw|yskbXQRYP0 ;_olfZLJLMB65@Sew|ka_bju}tnfionmaD$!0Hakkjmle^XSJN^mvuxwnhjqstx}vrqtqpkX=+%)9J_mlpppqmhaWU[gx}vsu|nXJGMUcsy~zsuo\QJQbpxuy}}gO>59LZltxz~zrd^^cl|xtos{}~y`H6'',CYenpvtqrneYWYakx{urqrv}~Z4%#9Z}p^[iwhI@AGPGKc|zx5~npggdmK+IxƷ|{KCZiw5hUߥoSIK[jC*WdS`Tf=8LN[re_}cjZ}lZLPB4@lhtqf<9P`jmfW^x7nah_50%-KhnxxcN]kE*@QQMXsiZp?F ZUO-8:F@(c_ji[bar]&46  8FEF-&1-6800%'-)>PT]adf]_ggkpze1_1&NN`eoU// !?H,5>6@CT^C=FBFMWcTBE?79=MPL]jijjli`dlihox}~|xytnqlM#! ,2UY;S[ZaPSK25FP]aalZNZY[[`oom~{Ůʵ¿wi^ZYdt½Ŀ|yƺrhfkx{wpeQ<*#(2I_ilhd`[YWRKFFMW[[WPHBCHLOSUVVTSOIEA=7321,! "')/4369<><=@=2&#&%&'0Kejoursvwuqnr|˴Ѿøʵ}lVG3*?TW^aXQE;:1,/037;A@60-*,3>ILLLIEA>>><4!   &29@HKHIKOTO?'  4HT\hj_TPMKMTbfgqz}~̹sfbrþϸο~fP?0%)4@Rfzukeeccgjpu~̼̾¾˲}sf]^VS]lzzzwsot|}l[N?:94?Rauvnfa\YYUTY]ejjjheejq}~vrniWH>/"$2CSakrtnheba`ekns{ʴķ}cQ;%(02EU[aemnaZVPJGMUVTY^XQNPRR\iqtwz{wstsommjVA7& )8CHOXUMFCA::>EFDKOKEBGIKUcnsv{|xuuvusuwrdVM8&%.9P]epx}zwvnjnqx|umd^h~ºzw¾½Ž|v}|srzwj`VU_gs}~|vw|~xnbSIA:?GR^fospmjfc`^^^]_cgigd`[XZ_elquvsqnkigggggjifc_WK>3+"$.9CMUXSOOKIGGJIILPSSQNJECGMSY]aa_]\[ZYXYYX[\[YTJ>1%$/9CJONKKGEDBEDEILPPMJGDCGMTZ^cdcba`_^^^^^_`a^XPD7+# &.ALY`lx~zyzyy{~|{yuuw|vcVLC@DO\do{}|{{yz~|{yvuv|xfYOFDHR^ep|~~}}~}{wwy}~m`UJFHP\dmy~}~zxz}|maWMKPYdlv|{|{ncWNLPXblw{{|vlaYSUZaju~}~|tj`XVX]cmv}}}}|tlb[XY]bktz~~|{|}|unf`\\_bhov{~xrkfdcehlrw{~{wrnllnosvy}~~}~|ywutstuwy{|}~}|{zzz{||}~~~~}}}|}}}}~~~~~~~~~~~~}}}}}}}}~~}}}~~~~xevil-2.02r2.orig/win32/res/CLOAK.BMP0100644000175000017500000000376606604100416016237 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,/,,,//,,,,,,,,,,,,,,//,,///,,,,,,,,,,,,,//,,///,,,,,,,,,,,,,,////,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/CLOAK.WAV0100644000175000017500000006606206430260102016250 0ustar aaronlaaronlRIFF*lWAVEfmt ++factkdatak}}}~~~~~~~~}}~~}}|}}~~~~~~~~~~~~~~~~~~~~~~~}}}}~~}{{{||}~}}}}}~~~~~~}}}|}}~~}~~~}}~~}}~}}}}}~~~}zy{}}~{yxxz}zyz{~}zyy{}}||}}{zyyz{{{zz}}z{}~~~}}}}}}}~}xtqsv{}zwww{}zz{~~~~|zz{~}zwwz|zwv|}}}{ywxz}}~}|zzz|}{wont|}{{}}zy{{ywuvy~}|z}{wvuwz|~xttw~{xwy~~}|{|}}~~zwtrrstz~}}}}}z||{{{{|~ztoorw}|~zvttsuw|}|yz}|}}ywwz{}|}~xrons|}zxxy}}zzz|{zz~{qkglpx}|zzzxx|{voihl~yx{~}zwv{|wvz~wojhjppw~yuvz~~zzzzvsqqrtuy}}}xz}zwwx}{xvy~zy}smhhhmr||tlhffjpx~}zwwy||wtqrw~~}tpqwzz|yttpv}~{yvvwzzrkhkrw~~upqy}ussqsxz||}zywwtstvyy}}ywussqqw}wttqppttttw{{~wstzvvnhfm{~||~}}~yqkimvv|}{{yvtz}xuuyywy}~~~zwtpijrxu{vvnklnqrv}}yzzxtpns}|w~~}}zrrha]`q}unnijpttqu{~~~wt{{|zzzwqpuwqsx}}wwtw}}zwwwyyz~}qe``gwzxz}~zxz}{{}}|ywy}}wqsszzxz|y}xpd^_ht}}}}zwtt}|rrq{}}uqjimqpqxx}zz}zphccfntzzzwtlkqzzhbkzx}~~vohmtwz~{ttggiqwz|wqkr}}zpfqrknwwonmlntx}wqzwrtzzuk_j}wy}z{}||~zx{}qinzxwtyytx|rgcbm{xowukehz}qlwxsswz~~}wvx|ywqh^_juzxwy~||cbksx~~{wx~zzwqken}tw~wd_w~qlx|}urtukit|rnt|zv`\f}rib`q~vttsqr}~}xuw{wb]jvkel}vw~tq{|ue^dpyuv}}u]ID`}tefwne_bsz}}}xqkmrzswvqxzy]\p{z}sz|rxyqnvt^Vcrgq}zwphtwwtutjflsbcqwkkqsqv|qou}zzwpx{stmx{igrjhmwtbW\y~}sluwv}}reg}xqqw}m|}v~mey~ntonxzzzwx|}z|zu~stzwle{wyzqUg}y|wuqtkb`ptw~tqw}ukvvtjjztv|tt~zqlxwkfemto{xsncizygm{wljkpy__qjkxwvnqvpb^o}wtqqt~~}trpbupnkkqphxpmyvg^bsxt}||}l^Us~|}zzqnvt\\Ofttnqqox{fns^bzkekkq{hhagz||vohfnyqv||zzt`PYwzwhh}g^__es~unnz}sb]]quorr~t~t~~|bUa}zzzYbwuutqhnpwyvyy}zhYZZmnqkY\}edwwtgnz}}www}{ssnx|{|rhnnnYe~nYiqqzoqvxxzzzkTTS[qq{qbnurv|zzm^atiZg}{qppwwwkmot~m``dzqS__miwwusqy~|vutwtvvzxykVVO^|aTetjkuuumfus_\etfKGGq{qissmm|ubg{{hduxiq}y|zwwqkknogjvvmWI\z|{uqowz|[R_wzcc_fN]www}tpuyzb_qqzjkvq{}}x}zz|tcchh\Wrxcbp~kctm[akaasfn{qwyykq~}}~}ufh}tijuuSRv}uPPS{uv}tppuzz}jjZX__\qgGCVvqXQyiYY\z{UMaay{vuuyeeiwh[elRXqkb{fFM}~|tw\KSkhPLkwhrQTptnriUfz}wronYBUqTZx{_eht~tlswxrs~|eS_vtzVItUOl_wq`euoSYwwqz|qeahn[SUvppkETuhntffrwz`dn~dTZukhtthn{bisbVavUE\wt|vTeeLa~SIfzy_GSrbywcv}oSI]|wz}wqWLX}wk=WwbZgvzkotfÚkPH_qfVnz^DlS^w{qz{YNj_Zotu}}hYcizzyxggqYMUwqy}tcr_oŶnvkf}jT]}nP\npts}jVqojf_nhl{YDewj}SgdEEujsvtfMVngn|}lbmyyqxqrwi]W[նksbOuSJb}V9>lƿz_Tino~iltYStkdPBmokKk`tyvhcVRV^nQeww_Yphtymqzq_;{x{}xxse_\syxoz\N{zzfzykheylza8-Gҭw|Yzqo~}qon|zi`YZhzopqfwS?nz_vi`~t}zxÏTF`re^vnmztgehz{X@Lsthv|owk~z]ivo_bb~bdkx~ynhhhrrLOfftssƽb_Svvtkͯx^]frhhnxhltuuzYOfFMqqyjjpourtVPz{f\g}hPezzrw{{rmtVbxjdggwťwRPzzn\Yc̠obzwgnxxq]v~jzukswGIIbntȲgg22kn__moPFt̽sguyv}q]]auun\ejmjzzo_av_iWWhzL1TʹVYruqqpob|~}teVOVvvoWc~eZʬy^QQh{jekkl_jf{ơkOG]]q|~tttw^i}zgmk]||dYj_Ymd~nh}}}}_Pezyurpp}nMDwѢrSOonnfqqebrzz}}}^\g`JJ]_bkŶwoJH`}~f\_uka}tmqoaq{TF]]ox}jUwmmndqv||rW`zutj\\bfk}}mhlQQS}_fee`osn¶hZmSKccvvw}fwuYJPezjPPVmf\\\rvmetcqnllwwkv}krtYPOmwtMMGƥqYSSRYktoznlYY|pntzzzM3kͱp57qte}ii8QkkuJTѾguDD\bDEjkzwZIXOPR|[:St89~bHzŤ}tprvSszvkKpl|ܞ4Lk_yLOV˭qs2VwaMG}kb۹NSt}[?&^TmHGb{m||RhtO_tgmthY=U}awN-BerM/A`rtvR}}Gzz]aeqhiq/k佁k\?CwnwzgPYъO.8xlmS}wRRvqnkv\VekzwحHeb[Lf/hĘjGL֨p~{E M{M1IXhzP1_zzeiڽ}@l~yod|ttpt}q\gPu_YmͭU8>O{}nZ6qcUBJdtˏ_S`k]ltxyw\wtż|nwVB67_߻vssW`kkhxpdgtG=-GչxpfYPe]ek0AƜlV=TXKi龒wneqv\V\oveY]zkDrqA'˶|nYcx{MkzVw§vscGHn}qbdnaykmw{wwl2.r[ggl~ư~wwwX?G[v~{tq}lT//&9YᓓN:Yye--KVbsF:99Nyw\Ig}|tui|~~kfwe>>_mde|{]__{_;Ių_SrlWz†jee\MLXbtpuT88CqwBP}}cAǿȳWPYBRRr˸h`pzkn|P8lʧheuZA\}{onwwxgC;b~Pll{ǭ{kPBBVqhODUб_PwwwTpuSII@X{jRC;;File created by GoldWave. GoldWave copyright (C) Chris Craigxevil-2.02r2.orig/win32/res/CLOAK1.BMP0100644000175000017500000000376606604100416016320 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,/,,///,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/CLOAK3.BMP0100644000175000017500000000376606604044316016330 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,/,,,,//,,,,,,,,,,,,,,,,,,,,,,,///,,//,,,,,,,,,,,,,,,,,,,,,,,,,/,,//,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/CLOAK4.BMP0100644000175000017500000000376606604044316016331 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,/,,,,//,,,,,,,,,,,,,,,,,,,,,,,///,,//,,,,,,,,,,,,,,,,,,,,,,,,,/,,//,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/CLOAK5.BMP0100644000175000017500000000376606604044316016332 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,//,,////,,,,,,,,,,,,,,,,//,,,///,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/DEATH.WAV0100644000175000017500000003544006430260104016242 0ustar aaronlaaronlRIFF;WAVEfmt ++fact:data:~~~~~}}}}}}}}}}}}}}}}|}}}}}}}}}}}}}|||||||||||||||{{{{|{{{{{{{{{{{{{||||||||||||||}}}}}}}|||}}}}||||}}}|||}}~~~~}}}|}~|{{~}zxxz{|~~~}|zz|}~}yy|}||~}|{{||{yy{{yxxxxyyz|~~||~|wwyxwy||{|}|{zz||yxvwy{~~|}}zwvyz|~|zzz|~~~|zz}~zz|~~~~|}}xttuwy|}zxxz~|wsolmt{}zxqqy|ywxvrqru}yrjgiov~p}_Rryrywuu{~zvskehqw{jJ\rqt|{|nnlcgicz{rlkmq}ylmotwoa^qrhdbduynhivtl[TfxhZOM]wxvv{^?Icfjgepx{gcv~z^^nmitYUal}p\Ye|~yWJ`qsoGG^ewǹxdmeNQ[axfSWahyz^CYk\bobaa`fun{pN|xiAR/;yR,8h|X@ %h< 8isϫ}]ToͻX%7MewKHoٿtO.5l绒a}+zMu¦إp $c{ʑ30h%QzmzF- Vz|{K\dTzіQ237QjD }2cO嬄HS,,2k#!QD=v`75,<-_Gӏ5`C> vh>oOĊϤVQktv͖Z-&pʟQyfrMgtJDTTx2+ Q5K? QӰO?abW-[{fqX9@*9կ⤄6N2q<s][Tt̽~dY 5{g哌\2YoAJA#F^nAp^\C -8@ȗ2BR;⾽o24`hjէy^+emjq/5*sef0R ˝8?^79¸ѧwL583AyI[[B_p_Q#i* C OJ@N3ɪ~c5#+7`~w^GSfymW 12Y]Eݪ>MA'f% .xDF6$OxMo/0o[9~0jHOӭ@, R~yg49ai͐nN~B|]`Ƕʱj,"s])!BYgRg3sGRJuᫀ>|V> 5q~ŗҭ GF[lZ39?g㡊'3!}[Ś~޻vj> Kl5j'~?7̞<oL3JaصňECÏB)er۱vG 9\ ZfGSZMQdCMe3Cœ^"EKОt.!`nZh{kHGa.ÿa|i~,fӐcYD,0Pho`VR>>Voǭkcy԰-ãt`k|RWHHi? NŽj_RFK\spdiaYUQgU>|cKϽܮ[V) 1˰͐_ ;;aмT0F%ج_*7Exž}]D5=ZmüjH5@[l{{+X'{˜Owk!fw_#RW4ċ~Jޫ]$($EowøsM\N,T|oijΔev ]U}tʽ `D%h=UnTwǝs%: S®hC@:q`71ٲVb3ox?0N>$UǷ.P$$-)![CiäOI&&WtARj̙P0<5o 3vM4W L709zMpY+wh"?Mc\a2آ4,OMU M%UHh\ !kčDW[:Od&宅J~m0;(Ms =- 7)4)=ݞw~&URT7s-Tt7q Gm"Wkq"'~c6p0}n<6u$MHRnZ0 n-Qߋqk_Z_v}gff@/{t`T'x -mHt'6E8H~݄!܂:%RѴ52"֢{r>/$9gіnN, "QsSE8%t=6X͙s8:R9Cآg8#"Jz`% #IfƢoI*/Vi.oҀ;8t9Q $C\S 77HvI%IЊsU6*lNM%eȢc(!_Ҧs>SТu; >awԼyG+$0TǝB /%?h}YʳkTddTcbgSOrdm̼h?9HxӦq<;qk`v"Q͋RtI"e՚nB.-RngZ1!8byK ("@̝pB crB8[`W'.ܗfK-5㯤Yd_FRJ\,/0tḎpaPJ\w < @i4E8^GY}1 SٔjO,3c๗j0%:0PU =s־z}ۛ`!Lu=w83yhaR[ΚTMn6i.?lvͫw2&;oŒJ2Gt³U0/_t2jG(![ӺH"5IKi{oyxihxqjlggwzqoN4kǸRKWB;Y˭i2a`Vc/^~ǣH|\7FC*SRUyenhUb|kokN<]p/\˰aGH.%U)@^q=&2R0 L",dɳh[r*%/ #R'cЃEr!MQ%kzKWeLn~%9IjF86M/7u%)Q i,Xf>j Rғl^6?smj  #&sC%@foSQRq/!?%vҽl@7IS>\^R_U˪]@)2aj. 7Pd`<'9#8hϬllg_jS7oV\S2y,Ts&Yr1]-xl1j/:k nj}#LS=Q˻U .*$RSa*H~@O Ger0W [hƗƨc Y=$?sڢw]YeڵkI0>!Jlu`jl/揳"fA}QܣW R9#/4;6_e!?{贎dShv(={A-si2ڻ"GJ$BknD<j :sj\Lڽv4=ftgpT*e(9:7xK7AYr9mf2M- WT\@QM&TY]J 4 u;"3jOM;tx- -eժ{bO^>:I^n FC1tM!IPk }h[|~3)M܍L*,T|P*9jȜqL(#TGU $6 m']St?.uNC$//XD""#I}D6v][w_ZK,xqj${1 O_)u85v:*T)>%:/!xhAbw4ԃ er' VH|iKEΏk?6k Fݔ0cWZ!Axi6F -yϮb,)Z^1_}9'Dp龑Z.-`ԌHq1t |31gçyG2GpΖa4=yΨnEF{,B[78=L~±^:9]ժvQ2&R`S\or_V[xdt.{IszăUEADgxO@Qp׼qM,$=h{ghr|~tu 91 T<HxԽ{ofZayZN`yůrW:-=`}koy{ztw-bl =GӚjURJNxgMRnķr]E2s[tpz4"*Fо^35VtˢgH/:fkLZqxiPH_~Le r_W0pMG:3ZZG[ovyfG=Wxt|}jn{xz̭d1%$[9$(+5~mʉ@%/8DuO;K`m°sSHZov}qadut`^eu? YX pċG+7CNy̽YFWlu}bRVZ^ok`^^h}unv~X* j U*-yΒC %CyϯL''>^ӸvT<@Zy¼nZONWo}cURYiukuJ-#>30-a$L;jE@LWinSQcs}q^X[^cm~xeZW\pz}l:/ W,cGG AЮb.1DF[˴lAA]kumNK\hs||t`dhfyt|4+40'Z=ؿk6#7Rgë|fNJcvhXEE`ÊA8|ٶy:1JiۺscuKk66Q RAVҊ4UԓkFOjdfeqypv}}}}Sf} "91ZΆ8IוhCD~ƢrT?1ARztUGKZqu^T[l}ysos{t}xjerxn}o:6@2/sȄ-@IH̥T" 0lիz]RGMjx~zvqaV[htzrj^UZk~}o\LFSmkTDBTmºS7@.3x݅\O02iK3>QqͿjJ@Rnz`IBQnt`QM]wjUKTh|~qhfnw{whbnu6&8&D cΓS=B;:`obkmfqhTaw}~xi{{k`n{zog~q0r%_ޥP(FϤk&0bd5%MwɤyVBLrϮi* @f KȦs>%)>[oULVmu`SVethTL^uqqIBdpyhdjw|vt{~~~wuvw{wtwyxuyvtwwxyw}|rcEH^g{mXXhqO90;W}¦]A6>UukTIM\rwid`gyywunls{wofm{~yx|hQQE8TŬc?ILJhǯ~Q==:@hxe_VXt^FCKZxdLIQ]syjb[`punfeox|eYUQWm~i_hruvpojott|nB@MPUw|SPPThƾb7,*4rՖ`D&ApЦvY?2;Tx~oaW]kzwhajx~tukXbwrqmk{s[SHASxkYLDOosd^[`rsglpmktphnrtw}zsgRLZpzjXRfnQHJTlsVJQ_ryaW^jxv`Yft~}qggp}tp_Nfts{fXbwnd\[ezrgfio{skikpxwogcivulf_dr|xkbeks~{rrww{jSMTbyfNEPg{td[`o~saTYmukfcjvzvspeiuyupnpjUFBVnw_NGSmxdYW_o~qjggn|rljjsa]f`l|jdfrqg`_gvrhfioyxpoqu}}wpkp||wuttzvs^Qbr{tb_oyziOCL_yt^RR_vxh_]fwqb`fnzwleemyxkkWOkwy{m\XdujWMN]tq`WZfuuicfmwzqichvxtpqxyzroqntzur|}ma[brukeixxpnoxyoinz}xuomtz~pea``l{h]bkrndqxlo~y{u|}~~z}{y|~}y|zhW[irp^atoeckyzvv|{vuw|{uqy||xluxt|uv{~sjgku~rjfiq{yrnnrzzvrqqqv|vruy{}xz{uajoi{shimykVPTavt_W[fw|kehmx}pedmz~uroowtmc`hr~wiejt{cQJP`vubXWbszkbbiv{pijq{~vporx}vtk\hz{~rfis~k]V\lqd_eqvkfhs{sooqv|uux|~zuxz{~rllgcnungdl}xtqos|yqrz|{|z|y}~x|jakos~mhnwiTOWh|q\SZj|uf_dp{oeepupot~}uwzw~yy|{oihlvtlkowvrqu{~xurry}wsw~~}|~~zrqyzurtvw|}vutuy|{{|}z|}z}}~~wkkq{{vu~rebchxuf_ajywlhjpzriint|yrpqu{xtrfcpzwnghp~m]UWaq}ndbgp}vnkms|{tstuzxsrpqtrpv}yxxy~yxvv|~}}}rgaclzxibaiv|rkjox}yxz}|{}|vt}}|gWcirzjchrt`TS\m|j^]co~qigkr|{oeenx{smhiswohjqztoloygYUJKhu_VMHXti]OYvhH78MqìiNAG\zzbLCMbyhPCKawn\QUdtzrkip{}xsrwaQJGU{[GISa|gV[l{uphcnttxz~{tos|}wplq}|tnkp{yliqusv{rkjt{rosy}xsllqwukhjqy|tnnrw|}yxz}~zywsrxxsrtzzwwy{~|wmjou{utx{tporywpnqxyssv{ztruzxrsy}{z}umklo{xjgjnw}pknt{}pgfmv~tllqy|wrqty{wwz~|zz}|ywwy~zqifm{}{nen|znnz}us|}{}{z|xz{|xevil-2.02r2.orig/win32/res/DEMONSUM.BMP0100644000175000017500000000255606604100414016627 0ustar aaronlaaronlBMn6( 8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,v,,,,,,',,,//,,,,,,//,,,,,,//,,,),,////,,,,////,,v,,/ /,,W,,////,, ,,/ /,,%,,//,,,,/ /,,΁,,//,,B,,/ /,,,,////,,,,,,,////,΁////,B/// // ///,,//,,,,////,,,,,,,,сxevil-2.02r2.orig/win32/res/DG_ATU.BMP0100644000175000017500000000302606604071376016412 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,, ,,,,,,, ,,,,,,,, ,,,,, ,,,,,,,,, ,,, ,,,,,,,,, ||,,,,,,,, |,,,,,,,,, |,,,|,,,,,, |,,,|,,,,,, ,,,|,,,,,, ||,,,,,,, | ,,,,, | ,,, | |,, | ||,,| |||| ||,,,,| | ! |,,,,, | | | qqq| ,,,,, | q,,, ,,,,, | ,,,, ,,,,,, ,,,, ,,,,,, , ,,,,, ,,,,,,,, ,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,|,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/DISPLAYB.BMP0100644000175000017500000000646606604044316016623 0ustar aaronlaaronlBM6 6(@$ hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Um>9 99=9`=9=|:|=|=|>||==|=|>||=m|l|mm|m=99 9=99=`>|9=:|9>|=|>|=|9=||>||m||m||=9 99 999`=9=:|=9=`=9|9|9|=|==|>|>||m|lm99 999 =9=9|9|9=`=9>`==|=|>|>||=|m|=ll|m=|=9 9 9 999`=99=9=:=`=9>`=9|9|9=|||m||||lmm|9 19  999=99=9|:`=9=9`==`==|>|>|===||>||m|=9 9 19 9 9 9=9999=9|9|=9=9|9=`>|>|=|=|>|l|m||mmm99 119 9999999=9=9999=99|9=9|=>|>|=||||m9=9 11   9=99999=9=99=9=`=`>|9|>||=>||>|||m|m=9 1 11 999999=999|99|99|9=|:=>>||||l|>|||m>9 11 1199  9 9999=99999=99=99=|:|>`====||m=lm=|9  9 9 91 9  9999999 9= =`9|9||:|:>|>=a||||>|=||l`>9 9 9191 9999 99 999=99=9:|:===9|>|>|>|||>|m=||>=9 1 91  9 99999999 `99`=`9|9=`>9=9=|||>|=|=m|9 1191 91199 9 = 9=9=99=99|>9|9=>`=9|>|=|=||99 9 91  9 99999999 9`9|99|>`=9=9=`===||=m>l 9 11111 1 191  9 99=999=99=`>`>|>|:|9|==|>|= 11 9919 9 999=99=`=999=`==|99|=|=||>|=m 111 1 9 999 99 99999=`9=9|:|9|=a=9|=|>m|= 9 11 1 9 9199 9 9 =9=9=`=:=9`=9|9=`=|=|=||>=>| 9 91  1 91  =99 999999>`=9|9|99|:|:|===|>111 9 1 919  9 9 9=9=9=9=9=`=9|9|=9|==||=>=11 9  99 9 999 99999999=`9=a=9|:=|9|9=>|== 1 11 9 91  99 9 9=9|9|999=9=`=`==|9>|>|=`>=m9 91911 19 9 9 9999999999=`9=`=9|:=|9=9|>|==m>111111 11 99 1999 =99=9=9=9 ==`=9|=|9>|9|==9=>91111 111 111 19 9  999999999 =999=`=99|9|=9=`=9=9 11111 91 1 919 9 99=999=9=`= |=9=`==:=9=`>|>=99 9 9 19 911 1  99  999999999= 9|9=9`=`=9=99 99 11911 9 11 199 9999 =9 =9 =99=99=9=a=9|9|999 1 11 911 9 1 19199 9 99 999999{=9d9=`=9=99999  1 1 11 9  9 9 9 999 =99999=9=99>`:99 9 9 9 19 9 9 11911 19 9 99 99999=9=999=9=99 9 9 11 1199 99 9 999 9 99999=9=9999  999 9 1 11 1  119 1  9 9=999=999999 9 1 1199 9 9 119 9 9 99 99 999999999 99=>xevil-2.02r2.orig/win32/res/DOGATT.WAV0100644000175000017500000000703006430260034016373 0ustar aaronlaaronlRIFFWAVEfmt **fact data }|zwtqqqqrtvxyz||xtpljjjjlnsw||xsmjjjlloquwxz|~~}}|{||wtqpprtttwz{{{{zxvtttwz}~zwtsstvwz~ztppqrtx~~zwtolmqux|~|z{{}}ytojhjnpsx~~vljljdbit|~|vpg\QS]gmqw|~wgTJMTZajptvx}}wrgTHMX^dmtzxnd]XWX]`djr}t`H<@JR\ivv\DJPWdn}qU?=GPWcpú|gJ9@LRZgp|vaI?GPWamzýr]PMPT[ckt¼~kUHLU]dmupQ@EPT_m}kO=CPW_n{eK?GSZeypTGMZbom]Zbjpzm]ax|c]i{{hZX]]\^dlvwg\\]_`dhozo\TZdlt{~n\Zkwjdgs|mn~np|pgbdefglrvgrmUKS]gw}wmhnywfXXfwtht|dczeV^tzjeoaWlwbW]imomnomzhPM]ddhpxbe{tZPZcdhsw`dw|bRT]dpxd`nrpdMScjyhT\mzdJL]lz\PWcw}_N^s}{\GP`qzc\fp~_MUbj}`HO`qoXXbgohNRdq]GPctw_X]cj|lMNdw|WHTdt}fXZdt[DPduxTK\npSLXgmLJ\r~`MQ]moPLWg~^LXhz|VGSbs^LXmqOGTfqSO`wdLL[ntTLYpz[N[i{eLM`ufT[kbIJYhdTZmkWSYdp|`T\gtz\PYen~^MT_i~mVUcl|tZTcmsziZd|zpzxv}yigv{jWTdvywwmdhvx{pb`hthVSX`hy~pkov}zpjgip~p\QU]bgmtylTFMW]gt~wm`PLRZ`kt|ydPFMW]dlrzt\LLSZdnxtmhddjpw~|||zxtstxz}}{qg]WZajt}ypcUPW^eo|~umgdjr{xvx~}kZUZblv~xtsw|||~shdfny{x~wpnopsz|utrpnt}ztqlhjkkmszwlgip|wtx||o`X[dpyxz}}jZX`kzrhglwvqtz}zxy~|{}}|||}~}~tkfhpw~}{xtqppoqx}wsrv}}tpt}zwux}vppt{}xwz|wtpqwvqrssu}}|~}|}xtolnw|~vnlmr{|pjlt}yvwx|zpkmt}yuw|~|zyz}}{z|}xttvz|wvy~|urtv||wvzzwwwy}~vqty~ywwy~}}~|||}|xxy|~~~|yy}}|zzz}ytstyzvvx{xtvx}}||~{urtzxuvy|wux}wrqu{xttvz|z||wtsw}}wttx|{xxy|~zwttw|}zyz}}}}~}}}~~|||}~|||}~zwwz|}}}|zzz|~}{||}~}zyz}}}}~|{{}|{{|}yxz|}{yxy|~zwwy|{xwx}|xxx{~~~|ywwx}}}~}zxxy||xxz}~{xx{}}ywx|~||~}xvux||xwwx}zwvw|~|{}{wwy}}zxy|~}zz|~|z{}|zz|{wtuy~|zz{}{xxz~{xxz}{xxz}yvvx}|yxz~}yxz}|yxx|~{zz}}zz{}~ywuw{}||~~{yxz}|zz|~|z{}|{{}|zzz|}}}}~|||}}||{{{||||}}||{{{z{||||{|}~~~}{zz{}}||}|yxx{~~zwwz~~}}xttwy}~}}|||~zxy{}}}}}~}}xevil-2.02r2.orig/win32/res/DOGDEATH.WAV0100644000175000017500000001565006430314152016600 0ustar aaronlaaronlRIFFWAVEfmt ++factndatan`}wü[R<|HPT94׹pK|OۙXvhkݦR[pޤřܬ04ޤ4[<Ì!3\`\tHwu8廲4ݢg嬷~嬲NԎ…p塂mp|pbsmlTmZ܀OK<0hŨ4~$H头._(忠\؃rwx2m墡<6ɀ!X`}hzu圭3rʕN(^pgyN"忨wxύ;w@bXr'|q4E]$҇דĴܧȴܼΐȾ ݥܲP%@Ҹ9$Ҵؠ4yfԬxt㬽<|DĨ9TԔ|| voƨn8l4= T5s\ބSov;LmSNY:jSMa0lQxdWEmGU^T+U2ggSZoiTsvnPm|dNgDN]/^bhZ|]5saYU_v|=is,pjݥwhߪ}hl$m5zu}Qp|_fnGmѵjXX}$w^x1MlLup_g̴arȨ"ώp۱GȬeeztdUH[{P-TLpcCioRhd8bTrTrPVigz]rlRqp}lt8Ղowawzvy/yt̗up$ϐyn2΍wnAȍuqEƏqp>Ôpo:ǘjg le!аxh(rX2tOQTxprD_ELQXC{d4eN||ƀ<\KҧIĒ/TMŀ~~0HKƆzxƿt*崄Fbve{{qumoZ`S^TYQFPy?Nm<\Q1k>2|*8<pNsdYcOnT:D 90*QT#A08:HM;]d@y}bϤ'ݹ7;h@\ue/r1Y!G.};@r8Lp(h)i(f6vTed\oJaC`4_)`l\[XPN:,G.cB >f03^0ED69oT%7`_`D0XHj~ytopKhq]>=.H[J$-I_G LT^,$6OF)F4:ZEG4L87xO0OD/Y8q"QV-Yp>`Qt3[V5o4LB^Qci9ipSbjzl2\];Qp}clxh5dpNb|1Dy~'btV/f3FmllMdnC$T_nu6TXtEHTay4NQsMITdՀ8XQ$)d˸p8v)SXHӝ-0!KzLI_k<|fP+V}o#7bpq'<\SlLFLFv5XK]h"QgfK ?lqz%1`qoD$Hllx,7^ptR0Kmr;;[ou_4A^k{ڈA1G^h`24IXh̉G,5IVlh3*8HWvɏR00>L_ܷ}F.3AOgѥl<.6DToŔ]80:HZvҴV:6@MaȨ|S<9BQg;tR@>FVmȵoQA@H[t¬kRDCL`yhRDCNd~dPFGTjxaPHJXns`RJL[on_TMO\o~l^UOP\nzk`WPS]nvh_WRT_nth`YUXbp~qha\X[dr{phb\Z]ftxnhc^]`jwtlhd_\cq~vqpmhaak{~upoonlknvxrppqsvz~|xtrrux|}{yxyz|}~||z{|~~~~~~~~~~}}}||||||}}}}}}||||||||||||||}}||||||||||||||||||||}}}}}}}}}}}|||}}}}}}}}}}}|||||||}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~}}}}}|}}}~~~~~}|zxxxxxxxxyzzzzzzyyz{|||||{yyyz|}}|{ywuuvxy{||{xvttvy~~xsnmpw~tkddhq|mb``_dvo]TLKSlfQKGDKd«xQDFJP\vŕ`FGLOTf;[EGMSZp̻S@FPV\qʾ[DHT]dxþoLEP^it̪rLEPZanȰRCIWblѼPAKYahÌXCGT`jʐV?FT_hϑV?ET^hϐTMXks<1@PZlf40@OZp[11BOYtO,1FT]z׌D+4GQ]{<*7JTcp6+>>>B>BBBnBnnnnBnB>>B>nnnnn>>>>B>BBBnBnnnnBnB>>Bnnnnn>>>>B>BBBnBnnnnBnB>>nnnnn>>>>B>BBBnBnnnnBnB>nnnnn>>>>B>BBBnBnnnnBnBnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnB>>Bnnnnn>nn>nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnBBnnnnnrBrrnnnxevil-2.02r2.orig/win32/res/DOORTOP.BMP0100644000175000017500000000406606604044322016531 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**UnnBrrBnnnnnBBrrBBBnnnnnrBBrrrrBBrBnBnnnnrBrrrrrrBrBnnnnrBrrrnnnnrrrBrnnnnnrrnnnnnnnnrrnnnnnnnnnnnnnnnnnnnnn@nnnnrnnnnnnnnnnnnnnnnnnnrBnnnnrnnnnnnnnnnnnnnnnnnnnrnnnnnBB>>>>>>>B>BBBBBBBBBBBnnnnnrnnnnnB>>Bnnnnn>r@@@@@r>nnnnnn@@@@@nnnnnnn@@@@@nnnnnnn@@@@@nnnnnnn@@@@@nnnnnnn@@@@@nnnnnnn@@@@@nnnnnnn@@@@@nnnnnn>n@@@@@n>nnnnn>B@@@@@nBnnnnnnBn>nnnnnnnBBnnnnnnnnnnnnn>rnnnnnnBn>>>>>>>>>>>>>Bnnnnnnn>BnnnnnBnnrBnB>BnnnnnnnnnnnnnnnnnBnnnrBnBnnBnBBnnnnnnnnnnnnnnnnnnnnnnBnrBnrBnnnnnnnnnnnnnnnnnnnnnnrr>>BBnBnnnnnnnnnnrxevil-2.02r2.orig/win32/res/DOPPEL.BMP0100644000175000017500000000316606604044316016371 0ustar aaronlaaronlBMv6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,, ,,,,,, ,,,,,  ,,,,  ,,,  ,,  ,,  ,,  ,,   , ,, ,  /// /,,,/  //,  ///  /  /  ,  /   ,    ,   ,,   ,,   ,,  ,,,  ,,,,  ,,,,,  ,,,,,, ,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/DOPPEL.WAV0100644000175000017500000004044206430260070016400 0ustar aaronlaaronlRIFFAWAVEfmt ++fact@data@99SSS``lllllvvvش}}jjjttqqxxxjj[[[??888??BBBBBHHHDDHHHWW```nnkkklleee``DDDGGRRRXX[[[[[```jjzzz³}}}lfa`RMReezȠ~}lae~tladdgjyz}~l[DGFZlvzj_M5:[Rjsn~xlxsnkn~Ӿ~q_fgd`lsjjq}॒laU.%##:B[G[`ZB525?9:>GWpfglaWQHFA?::3-+38NMKe]}~~˹ƳeWQedRD>LDQ[¸ysnyaXXUL?HLHGD[es}f[W_xn[aetd`MLRjlzyxsβvjq~zv~q`[R9-9?URMWZjyge[W``j̭zqUFHD?)(-334?GNMAN[alptxlgd:238A2--.8DX[d~vMN[WNHU`gkRQWnxѹjMB2 35BZe~zvtna`]`jdǾļkns}tx}v`_`[NMWZ`}}x}}x}xss~}}xvpKFMLD5+#2?Zxx~xxnpeq}}x}}}}txpdQX]z~}xdesjjWXjxq`jkssz~xj`MGHMG38B`f׮}`ffke}nnejWHD8253245224KejgssnaL>-.8/-/25HRZet v~}}sxxxjjjZZ[[[[[GGGKKUUUMMRRRkkggg``WWWMM```ss˵sssllGGG<<:::44HHHWWaaannttt}}}xx___XXeeeZZ[[[eeggglljjj[[LLLHHXXXZZaaassxxxssxxxxxxzzqqqjjeeeqq}}}¿~~qqqeeeee``[[[ZZDDDBBFFFWW```ggsssssxxxؿkkRRRHH555&&BBBDDSSSjjsssxxxxxyyyll}}}~~~~~~~~~eeell~~~zzƼaSA2#44?f}μsdatvxxjj[HMU`xtple28WZUQHHZjt~ݵseWW_p}R:ADBRdѼWRRRWneƫxjkA4 :DH]e}ypeeljSW[[jdXRMLWGHjxΩvv[UH?K``jzxvjf]WadSQUnx}zyx}xtsaa]WLgv}~tz~qkZ[`gjs}sj`R?n}xx¯xxxqqkkkkk________``XXXaa˸zzzxx}}}~~yyyqqxxxsslllggdddMM[[[gg```SSUUUQQDDDQQjjjttxxxppaaaUU]]]jjΨjj555((22ddd~~[[[..###22ZZZ}}ĥkkfffnnyyyxxtttaajjjllkkkttppfffUUXXXxxǼxxsssxxxxxxxx___>>BBBMMgggᳳ}}UUU..###%%33HHH[[ƮjjWWWBB+++##(((WˠUKK_f~npvƛx}kfjsƼ`5 3}˳t}}Ѵ]LHHeq~pRUM`yzpqsy`H&.DҩlW]g}sstln[aplqnje_essjeyzx[F5dՠn]pffp]&HH`}}ӲfKa>/dqƼnMDRӮlnxqN>?p}tppn`f`eejnleef̴xvnH>>))555ee˙kkkQQ999))::xxx̴ǵHHH Usqj~yjȮvsnsjWv~~[G?QvS9-2jvleUM)28yy[B5/!3K˭?)epk}ƠlUtkKD?Nsy_svZqzΥg`lv}kDH}׸nS-:Knxa<84MeZ`~}g>>UUqqqӼ}}sslllQQHHHeexx}}}vvv]]HHH//:::lllldddUUlllݼyyyWW:::<<<˕+ M~MZn}yzMAҔggsHL[jGyΖZUstg-().W˥l~B 9xgLΛl35?Wdfa~_8Mgǥ`5#>[psxltnQHM}ۈ}e[R~n[}q}/ :UοxƺZ4-5Byvvׂ_F?DFRRv}ssxaQUsdRM¯psĥnqp_Xsnf<(5S῔nax~eD?d~˸˼p??_dZM<-:vtfL2-esͼyk-evsa?K}8-#3kzzdj}nSny[KN`plQNѿsjyy`K 3Əje[X]}zx~ˈ~}jMRpZB.3D˺DDD ::ggg```SSRRRXXfff˸nnneevvHHH??vvvaaRRRMMaaa˜dddGGfffjj___ttvvvaasssijjjjWW+++22HHHdd߭aa<<<[[qqq[[DDDMMfffnnnQQ״UUFFF??HHHRRxxxnnsss}}}qq]]]FF///MMvvvغtt___WWLLL[[```nn```FFfff²ddd``vvv}}}zzfff[[///UU}}}泳lllkk```WWxxx[[QQQ~~XXXSSdddvvȸįttfffHHWWW55222DD]]]ppqqkkkjFWҼyj[DUnjegSHx}kKRR߮Wdss[kXD2MƠƿl5BWdZxqΔzR?xf5Dƺ~M4WjfZff43q}yqG:ᮕQsȵxadxtqktnMQWj~dμKD#/2>N>ѵjl`L?:Ds}dZ]}yxQ:Lx``pvj[zf:>QdZۯƠG2Mnsppep4.8U˾n`avf]gN4/Zk濛©ZWxfZDM_˦4WteXzjҥyµy`RQ?FDGFesx[kӊaaa33(((LLxxxeeRRRHHBBB]]¥zzlljjjsssHH...44lllĥ~~~xxݿnnDDD::]]]ggfffyyaaa>>###UUҲµxxxWWaaallkkk[[jjjaa~~~ΠnnnMM???qqvvHHHLLjj222##LLLppѸzzzssfffeevvnnnfflll}}Ӡxxjjjgg888__ݵsssnn}}}QQQFF___yynnnxxxee}}}???MMHHH[[___``aaaHH}}}˩nWFz]LnjθeeeNNsssDDD22HHHzz~~~gggMM555RRzzzsssyylleeeGG???LLtttدjjDDD55DDD~~nnnzzxxnnnjjjjkkkxxzzzeesss}}}RR222WWgggݛzzz55444??MMMpp۵ggg}}}xxkkaaayySS???}}վ}}NN)))XXzzzll}}}UU[[[ssgggeesssHHBBBRRtttyyᵵxx}}}__MMM44<<>`}ƹddlllxxyyyxxMMMRRxxxvvvjjyyy}}xxxvvvaaxxxkkppp``nnnyyzz[[[GGMMMnnll]]]ssssgggZZ```qqqfffLL___}}~~nnnaaNNN]]jjjxxxxxxxxddqqqzzznnqqqݳWWXXXeepppMMM--dddSSBBBNNQQQ[[yyy[[vvvyyy}}vveeeddeee}}ճnnnppqqqggMMMUUjjjxxsssWWWZZXXXnQfz}pps[t [HLlz]nxk}v}xpsjxsktRH[ƼjBDDMۜ~v~vyyk}+tƫ}jG(2Wd[}g[y~jtq`lnnxn岠UK52j͸eeez}sjjplgjx~~xx`aglxeaq}]MZenfpkstsznjynllfny~}xx~X`[jensn`f}fsn~zqX[ytxqns͛pjv}gZXz_M5k}q`[XM8>>HH~~XX???yyxxvvvxxxttzzznnyyfffppfffll}}}sslllqqqqqZZZRR[[[zzjjaaaRRaaajj~~xxx~sx}ygqq}}}}~z}nyknyzqt~tRMtƼldx}`fx}vv}ztne}:2pƩz]s}`ly}q~stjnxs}qvxv~nz¯sd[gplRRgs}~x}n_Xltxxe[dy}s}sgM[`~pkjznvttpdnx~sgenx}ktzsv~yxy`ZBNUte_AAtyzvvvlyxnWZx}vvvyxtsnx}~}g_[yssvgegnsxpgj~vvvggqqq}}tttvvsssyy}}}}}}}}~~~~~zzlllzz~~~qqjjj}}zz}}}gg]]]tt~~vvvvvvnn[[[eexxxyyytt}}}xxsssyyxxqqq55(((WWlllss~~~}}lll}}}jjjjjqqqyy~~vvfffllppp__WWWaapppjj[[[``sss}}~~sssppzzzvskjsqy~}zjktls}}~x`Xnsvpz}~zsUUa}x`Flpksn[}sl}}txxzs}l]qxxjef~x}skp~x}tgfnz}vtxssfexzzy}v~~yxx}t}nvxxx}}}skqte`t}~s}~}xnFile created by GoldWave. GoldWave copyright (C) Chris Craigxevil-2.02r2.orig/win32/res/DOPPEL1.BMP0100644000175000017500000000316606604100416016444 0ustar aaronlaaronlBMv6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/DRAGONDE.BMP0100644000175000017500000000512606604657644016605 0ustar aaronlaaronlBMV 6(8 hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,///////////////////////////,,,,,,,,,,////////////////////////////,,,,,,,,,//////////////////////////////,,,,,,,,///////////////////////////////////,,,,,,///////////////////////////////////////,,,,,//////////////////////////////////,,,,,//////////////////////////,,,//////////////////////,,//////// ///////////////,/////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////,/,////,//,,/,,////,//,,,,,///,,/,,,,,,,,,,///,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/DRAGONHE.BMP0100644000175000017500000001034606604044316016573 0ustar aaronlaaronlBM6(8: hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>>>>">,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zzzzzzzz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zz zz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,z z,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,z z,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, zzzz ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, zz">>>zz ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zz>>>>>>>>zz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zzzzzzzz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>"zzzzz>>>>>>zzzzz">,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>">">>>>>"">">>>">>>>",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>>"">">">">">>"">">"""">,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>">>>>>>""">">">">"">"""",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>>"">>"">">">""">"">>>>",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>">>>"">">>">>"">>""">"",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>>"">>"">">>>>>>>""">",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"">>""""">>"">""">"">>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>>""">>>">>>>">">"">,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>>>>>>">>>">>>""""">,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>>>">""">">"">>"">"">>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>">>>">">">>""">""">">,,,,,,,,,,,,,,,,,,,,,,,,,,,,,>">>>>>">">"">>>>">">">>"",,,,,,,,,,,,,,,,,,,,,,,,,,,,>>">>>"">"">">>">""""""""",,,,,,,,,,,,,,,,,,,,,,,,,,,,">>>>>>">>""">>">>">""">>",,,,,,,,,,,,,,,,,,,,,,,,,,,>">>">"">"">">">">>">",,,,,,,,,,,,,,,,,,,,,,,,,,>""">">>>"">>">"">,,,,,,,,,,,,,,,,,,,,,,,,,,>"">///">>>">///"">>>,,,,,,,,,,,,,,,,,,,,,,,,,">"">/////>>""">/////>>>"",,,,,,,,,,,,,,,,,,,,,,,,>">>////>>>>>"////>">>,,,,,,,,,,,,,,,,,,,,,,,,>>">/////>>">>>>>/////>>>>,,,,,,,,,,,,,,,,,,,,,,,>>>>////>>""">">""////>>>>,,,,,,,,,,,,,,,,,,,,,,>""//>">>""">">">//>">,,,,,,,,,,,,,,,,,,,,,,""//>>">""">">"">>""//>>,,,,,,,,,,,,,,,,,,,,,""//""">>"""">>>>">>>>//>>,,,,,,,,,,,,,,,,,,z>>"""""">">>>>">>""">>z,,,,,,,,,,,,,,zzz>>""">>>"">>>>">>">>>">>>>zzz,,,,,,,,,,,zzzzzz>>>>>"">">">"">"""">>">>>>">>>zzzzzz,,,,,,,,,zzzzzzz>""">>""""">"">>>>>>"""">">>>>zzzzzzz,,,,,,,zzzzzzzzz">">>"">>""">>>">>""""">">>>>zzzzzzzzz,,,,,,zzzzzzzzzzzzzzzzzzzz,,,,,zzzzzzzz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zzzzzzzz,,,,zzzzzz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zzzzzz,,,zzzzzz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zzzzzz,,zzzzz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zzzzz,,zzzz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zzzz,,zzz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zzz,,zzz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zzz,,zz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zz,,zz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zz,zz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zzzz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zzz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,zz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,z,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/DRGBITE.BMP0100644000175000017500000001034606605047264016472 0ustar aaronlaaronlBM6(8: hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,//////////////////,,,,,,,,,,,,,,,,,,,,,,////////////////////////,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,///// ////,,,,,,,,,,,,,,,,,//// //////,,,,,,,,,,,  /// //// ,,,,,  // /   ,,,   /  ,,/////  ///,,,,,/,, ,,,,///////////////////////////,,,,,,,//////////////////////////////,,,,,,,/////////////////////////,,,,,,//////////////////,,,,,,/////////////,,,,,,//////////,,,,,,,/////////////,,,,,,,//////,,,,,,,   ,,,,,,,   ,,,,,,,   ,,,,,,     ,,,,       ,,,       ,,,       ,,,       ,,     ,   ,     ////////  /////////// ,,,/////////////,,,,,,,////////////////,,,,,,,,,,,////////////////////////,,,,,,,,,,,,///////////////////////////,,,,,,,,,,,,,,/////////////////,,,,,,,,,,,,,,,,,,,//////////////////,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,, ,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/DRG_1.BMP0100644000175000017500000001034606605047264016246 0ustar aaronlaaronlBM6(8: hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//  ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,  /// // //// ,,,,,  // / /   ,,,   / /   ,,/////  ///,,,,,/,, ,,,,///////////////////////////,,,,,,,//////////////////////////////,,,,,,,/////////////////////////,,,,,,//////////////////,,,,,,/////////////,,,,,,//////////,,,,,,,/////////////,,,,,,,//////,,,,,,,  ,,,,,,,   ,,,,,,,   ,,,,,,    ,,,,      ,,,      ,,,     ,,,     ,,    ,   ,      ////////  /////////// ,,,/////////////,,,,,,,////////////////,,,,,,,,,,,////////////////////////,,,,,,,,,,,,///////////////////////////,,,,,,,,,,,,,,/////////////////,,,,,,,,,,,,,,,,,,,//////////////////,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,, ,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/DRG_2.BMP0100644000175000017500000001034606605047264016247 0ustar aaronlaaronlBM6(8: hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,  //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,//////////,,,,,,,,,,, //// // ///  ,,,,,,,,   / / //  ,,,,   / /   ,,,///  /////, ,,/,,,,,,///////////////////////////,,,,,,//////////////////////////////,,,,,,,/////////////////////////,,,,,,,//////////////////,,,,,,/////////////,,,,,,,//////////,,,,,,,/////////////,,,,,,,//////,,,,,,,  ,,,,,,,   ,,,,,,,   ,,,,,,    ,,,,      ,,,      ,,,     ,,,     ,,,    ,,       ////////    /////////// ,,,/////////////,,,,,,,,////////////////,,,,,,,,,////////////////////////,,,,,,,,,,,,,///////////////////////////,,,,,,,,,,,,,,,,/////////////////,,,,,,,,,,,,//////////////////,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,, ,,,, ,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/DRG_BDY.BMP0100644000175000017500000001034606605047264016524 0ustar aaronlaaronlBM6(8: hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,////////,,,,,,,,,///////////,,,,,,,/////////////,,,,,,////////////////,,,,,//////////////////,,,,/////////////////////,,,///////////////////////,,//////////////////////////,,///////////////////////////,////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////,//////////////////////////////////////////,,//////////////////////////////////////////,,//////////////////////////////////////////,,,/////////////////////////////////////////,,,,////////////////////////////////////////,,,,,///////////////////////////////////////,,,,,,//////////////////////////////////////,,,,,,,////////////////////////////////////,,,,,,,,,//////////////////////////////////,,,,,,,,,,////////////////////////////////,,,,,,,,,,,//////////////////////////////,,,,,,,,,////////////////////////////,,,,,,,,,,//////////////////////////,,,,,,,,,,,,,,///////////////////////,,,,,,,,,,,,,,,,//////////////////,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/DRG_HEAD.BMP0100644000175000017500000001034606605047264016607 0ustar aaronlaaronlBM6(8: hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//  ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,  /// // //// ,,,,,  // / /   ,,,   / /   ,,/////  ///,,,,,/,, ,,,,///////////////////////////,,,,,,,//////////////////////////////,,,,,,,/////////////////////////,,,,,,//////////////////,,,,,,/////////////,,,,,,//////////,,,,,,,/////////////,,,,,,,//////,,,,,,,   ,,,,,,,   ,,,,,,,   ,,,,,,     ,,,,       ,,,       ,,,       ,,,       ,,     ,   ,     ////////  /////////// ,,,/////////////,,,,,,,////////////////,,,,,,,,,,,////////////////////////,,,,,,,,,,,,///////////////////////////,,,,,,,,,,,,,,/////////////////,,,,,,,,,,,,,,,,,,,//////////////////,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,, ,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/DROPLIFT.BMP0100644000175000017500000000451206604044316016625 0ustar aaronlaaronlBMJ 6(1hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/DWHISTLE.BMP0100644000175000017500000000240606604044316016625 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/EGG_OPEN.BMP0100644000175000017500000000321606604044316016625 0ustar aaronlaaronlBM6(XhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/EMPTY.BMP0100644000175000017500000000406606615374650016315 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Uxevil-2.02r2.orig/win32/res/explosion.wav0100644000175000017500000010364206430314162017601 0ustar aaronlaaronlRIFFWAVEfmt ++8factgdatag~~~}|{{|||{||}}~~~}||{{|}~}zywutvxz{~}yy{|zyy}~{yvvwyzzyxwvvy~}wsqokgcbdku{wttvy}~}yunfcdhox{ogb`_clz{qkjhhkq|sd]dqǭ{]4#Vsr_j¯Ýq^N@514=@- %).:QhwwfL3! %[ͽ}|zsi`ZUNC>GXgo{wd\RF@@ADFJMPSVXY\do{õ{uoje^VLA869<;4*  1E[qƻt\G8225;COY`cfilpqmgb_[YXWWWY[]_afmvż}hTMONGBHXgg`\P5!#:TW@))954AYpx{j?#'Ju~i[XVZivkd]TKHIKMQhõy|̳|qjh_E!+=Obrķ{ymOMcyhYOLVp͸iM;2/,%$8Wxn]OD=98;AGOWalwoXC64;FSaq~xqkfb_][YXZ_fif`^]\bu~~uZ?6DV\SE6)"$+5AO^n|~ȤlVC3'  #4:<>ADIPXco|ºyh[SPPPQU]foxm][^^[XVUW_lx|xl\NEHWgvٵkSMMJCACGIKMS`q}}|~u`KDB<4-)'(-5?KYgqzŲ|xugQ3(,*/~wqfRAGjvsv}}od\SMLE3 '8Smshccoȿ}kWB0)8H[ly~Ϸ~vcVSTUX\_adiqz}yz|sd_kurgYKBBNYdruaM8# #/Ei̷|vswjMIXfo{ymdlÿlWQSO?.# #)1;EP[emty}~||~}rcTIA>EKE7)#"'2AUj{~||zxy|t]WVSPD, 0?MZdluʲugbehjlorv{}yvsqponmmmmnnoopqsuwz~wnjipý|h_YUUVX[_begjlmnopqqqqqponmljiikqwyyz}ò|l`XTRTX_foxztojea^[YWVVVVX\_abeig^TRW`kyÿfT\hp}yeQA74;FP_pypg`ZTPLHC??FWk}qam}umd\SKC=7434574++@U[\boyfU`}rou½tg[NA73:AA:5567?KUZ\]]_choxȽ}yuqnkhc^XSNKJJHD?:65:BKPPJA?GNLNcxգw~qM,!%.8BLV^fmsx|{|{}~ztnf^VNGA;62/./15;BKRRJ:-3Ll~uld]VPIFKSTMGDDOaikjgdccdhmt{p[ICIZks{~yoaXYXQS]dixĻzqic^YTOKJQ[[SNP]d\M@;;>CKU_jucF7-$!#',5?KWer˼{tmf`[XXWURQQQQR[frywspg\TPVizʶiP;(  !,8EQ]ju˽~ywvtsldbbbcehmqrqrttqwl`lyrjd`^_`behknrttrolc`ioov~~}|yo[HAED@FT`o«ugfkqw½xl\PK?#$ 2=CKSY^dmw¾ug`ZUW^cjulSGFIQ[gtŻ~`D.#*EinXE9435776:Leuqkp~jOM]liP43M[N86/5A?-   -;K[m~˹stztohZD- $1;BN`szxvlholYG>=CJHDEFGMS^v|wj[NGGIOTXgysmksƿ}xuplk^HBLU]dluo[O]uva\YPT`dpȺ~qbQLNNWql_^cknibYOF>977:?GOYeq}ɲxne^UKB>:646;<8557:>Odsz|xoe]_flu~Ƶwj`Z[aca]]^Z@ !4@CGIHIKOXent~ȴwoeXQNHB>6) #3=7*&&$+A]tsfYLCBGIP]nͷwutoiee_WWY[gqjVGCIRYgvwr}пƾ~ue[URROHFPf}pe]XSK?:BNQOOU]gz̶~k^Yf}~viT>2-,6DR_pĮ~rkd]XTQPQTVUST\o}tr{Ǿ~spqpt}rptmb`ccchqx|~~|xqkhggfhjlnpsw|~qjo{·ymaXRKD=71,(&/ASXWXXWTMHJQ[hvſʲnik[B697/(%"$2G[l~ȶ{vuxzzz{{{{xrjaZQIG<'#'# .Qn|Ľzl]L<2/17?HT`js}kW;!,BJKWlre]YXZ^`_^][YUQNMMOQI@<846=FKQPLUcnw˼{smjigghgec`ZRLMUf|z^E8+() #''%(.5FRRTY\\^bgnu~ƽ{uqgSEA?86>JLF=0##,8EVk~sjaXPKKNT\bddivwj\LA:3-/37>ITZWPNVak|ľ|yxyz|xrlfbckv{srrmhikknw|{|}unhefd_\ZVL?:DRWZgx|z||k_VPKE@??=:7435:DQWYagilsttvqlklkigghkou|zmb`dc`bipx}zy{~zrg^ZY_jvα}l`UMHEAADEFEGPZ_dc`\RE=;89=><>DOd{o`SQ[jsrrup`PJLXl}wuplgcbcacjoruwy|zy~}sgZPLPSL?.+>QcutcUOS[`_^aegkqy|vqmkmt{pf]UTY]blvyy{z}}ndgu}}|yrmotvwy}~|}vbRC4'(/233:Qo|slgd`[VROIDBELWdksº~rmospe`fmnkf_WSSTUVZajt~wl`TIDCDHTdyƺ}pcVI>7425>IRZcn{ʾsga]ZTMD8-')2;?@FRZ^gt|~ɾ}rjhhiihhif_`cfhlswoeb^YXZZWYcwwl_UQSX]cjmg^[_cdgotutux~{{ʽ{sk]ND?7.)&&*0458>FQ^ksuw}ÿŴ|oo{vlfdb_cksy|vqsyz{{og`[WWVQJHKOUZ[VRT_lv|ºwdTKJIIHE>4,(+3751,($"%0CYnĹxnd^]``^\^dm|~vqke_YTRSX^frrmoruy|}rh]M;.'# ):HPTWVPLNW_gqzļwlc[TNIEB@>=<<>CKV^bcehjkoy|tqqqpmg`WLA7) #.9EQ^hr{vgYPJC;547=FOSRW_egfhpx{yuojhlxvlkr|ysmd_ac`]bku|ytt{yz{wtme]XW^qzhT@- ,;J[k{¿·{sle_ZVSSUY]bgmt}¶~}}|||{yvspnjc[TLFA=6/'$%)/7BOXXX]ejheeda_^`djot{ǾsbQ@0!  #9DILOPRV^iu´}uppswyuqofYNE:/&!!(1=IWdrŶoaXRMGA??=:5.&"#,4..258IQTTTUUUTTUYaimnopplgdgozzrmifdhsyx|Ŀuib`cebZL6! ')&$'.2-%(6FTduö{zz{|~yofclx~gTF6!.@P`rxqjd`_cjqvzƽ{ujXF7.'"*DFFCBA>;77>NaqŴwbM:-'),/37Of~ȳwgVICEJKD;65.(.9@EQfzxkaXSQLB:;CTmtjitzij{|h\ctxod]ZZ`gmnrkUGCEHJIIQ`nt~{sv{}aH:6;AEM\jqtqg]YYXYbs}sqx|p`TMHGKRUL>45?EDFPZ^YUZeozʥ{g\YZ_fkg`bpucXTOHFE@BO_m|¾ukeYTWYTL?4:Vuvg`cn{vokijmonh`[[`fmuy{~vmgjry~wlbVJFHKR]hnot}xxzysmljecca_`_WMGJPVYZat~|Ȼxwwoe^[VQQYcioyywvrpmdZQIA80.8K\gq|}}}pgefjpvqcXUW]l||xÿvkffbQ;'(08@GRf}hXVVOGGRbnvwvvrf[^r|wz|yu{|zc[_iniehonf]SF5)(,.,0AZq~lekxvpoqy}la^`bcc\U[qȺ}nd__agmprrmaVRWds~}qd_^ZVTSOOU[]`caUHBJ_už|lktyoZ?)&Bezlb^cq}njmonihrtoqx}ztwqhistdZWV[cd\QIC?>DWt˿{nYKYw}vz̷eP@=GYe`F$$D[fjgXEE_°~tmpvq_OR]eknfTL[uyvxufQEOo{nhb_tgdZNHRfv}xou{ofjqoc\`lyxmaUS_x{o`NEIWlrhlxr^VZfv{rswxywqqv}vjehotxxsjcaa_[WSI:5BZq|º½~rpzrd[X]huxnec`XPNPPJ>34CT[[Z^dq|sid_`dffgnsphhmt|{yyvyzfellaUK>)!;Wju|ygWWev{oklg]Y`q̵oVMPZekq}{mruZLKT\\UOF<9;92*&%%+9Qlλ~tonicabhtyo_VX`jsvw|}~zomuĸvbTI??TlsgYYcmqpnlg^XWRH=3(#%0C\~ww|zn`[`m{xpus_D415;<;5//5:?Mez{vvy~}~{zzyqbUWaiiggd]UPKFDM]myuifkrvvw}ù}l_WRMGB?BNe}}~xbNEJXk~}tgZND<9=FPW[]]ZYarʼwfYRU^hljdbgow|~|yw}sjd]WROVce][`ckyxoebirw~zreO6#$*+)/Dax}qg_\^afmrocXU[bgmuɺ|rot|vmmy~uryvkjptuwkP?@KTURLKVjyusssroosuxξtgYNIMV]_cgjuzyxtnbVU_m~toucɵ}wpoolcYV`mqi\K=:I`q|p]Ydwrospgj~{oecefjxwbYY\^`gsķujeb_]_`]YX[exwkszqtxcZanuqlmqm^NHLTWUV[ajugOEO`jkf\W^lyvaVUY\_aj|~urt~~wqjdgmkdfu|nit}}ytme_dnqoozfTNWguztjgs~zz{~|~{xyzxwuohefhif]W`z|uqmgdjtxu{vt}oYOTZTMR_igaakzp\LGPbrx{zpowymdZKCOepqrwzzƸ{mhhffjpwڿzf_g{qJ'2Vq~}|yfZQHDEJT\_cqʹ~~~jYZlsees}qnxu|t_K=FV__[Y[[WV[`^XWar}{usrt{ǩucTMJFBFZqjSGK[m|}nedkzrq]=3D]iaQGL_xuu¦z|wmf]PKWlwx|vjlzwY9*2J`f_VS[l{·ohgny{ti_brzuzvgYQT_kvva\gsxn[YhufO0&8DGCEWsxiflt~̼ylimswunils|{{nd_YPMPRJ;04DW_^`rķqX\q|r`[m~rjlzteXS[iyxrqporvq]A+(5ES`iot}xS6&)Hn¿µdO>0(.?Xr~{tgSECHKKJJQbszr^SYm}ohmyȶzmfe]I73=ITar}mkoomje`_adimkaZ[_dn|~rhjxztqveXVZct~xzxlcciorxvj`]bkotzmhgfgijhdbfjiehq~~sjm{}vkb_clz{tzvljntxwsu{npxi\PGCEQfhC.))&#'3CPTTSSYj}ojkg]UWdrzyrko{jYKHP\ee]VUZ]__`dghjpvyvrsxzr]IEQcqytkmwyswǺmkoleelvysrqpryxmc\`r}z||tcL7(*7=H]uǥzO, )DXesʷhN=;GZkyǼ~x{bIBNf{{trw|yqmnqz|dQGIKIN]mz|y|xidhmry|sh[Wasży_J;1.4?KWblszĻtnmj_TNMQ_vsb[ZYUL@6358Nl}r|qjkvm^UXcou|dL=:=FXhoryymhn˿yaV\m{tc]i~oS7$ &5Ot~~}~s_NFL^owyzvmhikr~qddmv}ƿ~|z{ze\^ffYIFHB87DYsƻ|V?855;HU^_\]bhq}spld\[h~hVQZpƿq_Z[\XK?>Kf̸z]B3029H[ixo[RRSRRZkwvu|wbTOT_jwwe`kwwmb\bs~wtvwzukek}yrjbWE/&*/14?O^m{k[W_e^I02Zzi^^pŵz~ta`o˾j^[\an{~zuztyrZ?)"2@D?99?KaytfWLPiͿ˻zaJ;46AYz{iXJ?:<<2$ (6G^rwrs~ɨobjuti[MC@ETj½dC/*3CLD1 /Kbuͻynq~iWOS_myȺv\ND<1#.Mcpronns­q`bnpaND<0+4EV___lsJ4.19GSTI4 !AhͺqcZX]cgmŸ~m[G3'! $)2@Y~t^K;/,.5?L[mePB?I\q}wpdVIGOVYZWMFSoɷ|fZ`q~n_RJJQ`r}ȿpO<2,,4DR\hzϿk^\_gpxzrigqhO?91"'8KdԿtaM( ?gԸzrh[LA=;8;EUfsz}̴q]WWVO=& 1NuìĽvmlfWB, +>O_dcm۾uprx~{tqywtb5%JsĽ|pieccdhkh]M;25@M`yu|zp]NN_xj`bkzi]^ckuytomeUE=74:Lf|~ynX?12>O`o}ygO8*-9CJQX\fs}ñzg`bkwxsuzȹmG47DNPOPUXWTU\kĪdI7(&0/*3Ns°zaI825PdrwwͽhSJLQOD>GZrǪ]A05Tj|vszxja^bkrw|~|rjhglwçxfWMIJLMNOOMKO\pտfO<-"*@Yn{}vo^H7.$ (8M`mrv̹wnpĽ{iZPQ^svdXSSY`dd`[UMD;438>I_xvcQHIS`o|ñzmmquw{|xsokhlty{{{½vS3 0GZjzļsrx|zxtu{~kYSX^\UNMPZelmkm{~vtxsgXH:349<6*$3Qu|zzyx{s`WX_fkmolaTJGO]jrvzubSIITdrαylf_VK@8446>KZgotz~uu{~|xwzytrwwmcal{smigd\OHM[n~zvmcbjuzwqmp}}|xlhqxk\QR\kzrpuYGBJXgwypgbcjs{uog]RR_o|ukb^clv~wuwxsgS;+)5DNMFACKYmͽwfbrzuw}{qkmt~via]]coy{wiXI=1'#2?HJObxȬuaL:26CMTc~ýxgWIBMh{snhaZ[fwwnhhkosyywlXKKWhzse[SPVeu~|vqqzuaUSUUTTUY_cgmt}ŴymbVE2 &7FWl{xxwvusqtyyy}|fXTV[^_`gsvl^Y`murkkoruwwsopv~vieiykI/4]wmnwyfYQR]o{}{nejwupsw{}{ywuqpqu||qr}whYLISesqaQJILWmuglxwg\]cgghn~Ź}tjb\XUTW`mvwtu~xtstxsi]VYdqwy}~{}|xtttqh]TKFGNX`baflmpynYKDACHRbw͹vfTC0$#.AWmxlc_]YSValrw|}~}{¿|woe]XW[bjr|yoeWK?88AMT[h|}pf]VRRX_ht~{ngku}{xsrysZHBGPX^aa`bdhpztjjqz}tjegp}}qliggfc][_hy{gQA>@?99EXhrvy{rkisȿpechnuxtty~xqory}ónZE7/*(((*/)&3ER]ccaacis{qe^ZTMHIO[l{{qf]W\lǫ]KDJ]vobYQJE?;9:?JV_gpyķraO?3+$'0=JU_ly~ǹ}qdTC3& &4BNURKEDFKR\fknuºu\OLJC5( (5DUaiov|~{xoc[ZZVOMTbq|ķǺv`NGP]gntxth[RNKC3""'#$*1;IVaikid^XX]ack{vr{vjaXUX]biopjcacejvvi^XVTOJJNXdnusfYK@846?DFEGP\fow|{uswȼr`PB70/4:<>FVgu}|vrnjea^^_eo~xoe[QJGIMPQQSWY[`ghdabekqy{tpt|̶Ŧg]]^[VUY]]ZRJHNU^gnj]QH=/  .;DN\k}Ⱥ~wqqsuvvsjb_ckrwy|oWC90& %4GYhurcWLEFO`swjjoqokhilnopqrrsx{naRC5) %*.4?JU]dgn{Ȼǿ}umd[PF>82/-07?FLNMMT_jsz|wqnosuttuwxtmhghe`^cq~|zzʻz}|iYROICFSdorofXKFDBACIQVVTTVXURQSVYam{¶yokjknu}wi_YUTRMD;4,"$')-5CQ\h{ueVOT^dd_XV^mzǺoZD88?CB>>GYlwyz|~{wspmnrwzz{}|vquuh_]_ca]_fjjjjjkli`XWas~}wcN;59?@AAABEHHFEHOZdqzqdQ@76:ETfv¶k]_n~|vxnWC82/.06?M^mw~~xocUGCGNU\fpx~ýʰfH738?BCEHKOT^ivǹ|pbQCCMW\_a]QE=ELS[dp~{||{{{ytpqw}zwqlihggmwzsquz~pa[\_aekoppqxŻlWLJP[fjf`]alzvh^^gopkdYNKQY_eq¹{uqopsx}~zwyztme`_\VPNPRV[blvsbSOVbnuwuqlggo|{m_UQOORWblu|~uru{}sjfgnw~~{wwzzqnqu{|{xrkggmz~|yuqprvy{ytnjge^VRSVWX[akvvrqqqqprw{|{wrootxyx||ndcehfeinrttttw|}{qd[W^n~vomrz}xvslb[TNLPXaiosvyƽraTNQYdkkfcbbdioqnnv~uplgaZUSQU\eilnmf^Z`m}}usstutph_[]dlquzytrrsv|yroszvmhfc^\akw~}n_YWWZ_elu~|wne_ZWX_ju~|vqnorqkb[Y]dlt|ʺvi]WXcu~||~}xpgccdehmu}}rhcdjqwzzw{xropv|xqi_YWZ]^bgjowxg\X\fqx}}|xvvurmgcbdksy~}vqpsy}}pc^cnwyw{~zz{oe[UPJDBFNYfvzo`O?4..3=JWblw¿mXG:58:CQ]fjmnpvwia_`fpxxric^\^fow|q`VQLGDFQbr~wkc__`eijgc^WOLPYbkr{ukaWQPONNVcpx{sihp}xojhhfb][\_hyvjddfjmmieehkjd`dnzpmmkdUC4.0=Toózod[SLKQY]\XTU\lsmjluvk`YW[fpx}rd_dnzpc^^blyveTNVcknpxznb\^dils|~ulhfdccejov~|vvz{vlbZYajnmmmnmieflrvzrbYWWTPLHGN`yIJ}kdefhkkfb`^XSQSZhuzxrq|m`^biqysg^[am~vpnpqpquyyseUJJSdy{wtoifhls|y~sjc^\^cglvti_VRVarymeekus\SYhyxqlea`bca`fq{|qjkpv{vh^[^eo{rgdkwxvx{|}~{wy~vrpnmmjfb`cjomighlrzŸxqpu{~}wmc][\]\]^afmvvnlnnlighp|vbL:1/05CYo}¾ufVD4%'05;AGKSaqƶhSD=:863/3@Ufro^QNUct{{~zqhfkv|zzyulecehjmsz}xrpsz|vtuvuvyzyxz{tqonqzync__^[YZ_hr|re\VVX]fv}qmlnvyngdflu{wvqibdgffn|~yutv}i]Y[afkpstrnklqv|~z{~}yx}tgZUW^hv}y{}zyz|}wsssty~wib`cjtz{xvuw{|qjjp{tiegoy{vu{}xuvxywuyzuqt}~l`ZULB;:?HYs}wze[]gqwzzkYLJTe{}k_ZUNM[u{eSO[lx}~ygPDNfw{tjcbjywrmd^_i{shnpb\[[XRNQZ``bkv~{sqtyufWORX^etysswzz|~yy}|qns~}rjhhjox~|sicacb_XTU\flq{{nkliddlzwg[VSRXcpusqv~~wt|ƾs[H=5/-5ESY]dmuz}~{vspmmprpkhikq{{rs{xm]H4$!&-6AUnϿrjfeddefd^TLILUdsvne\TOMNQU[__][[\^][[bm{riikljfhq}»|m`WUX[_hw}l^SH=3+')/7@M^ku}zxsib^ZURV_gltŹq]PQY_acdddfknoruy{tt|}sjb`guzgXOICCN_r}k[MDHVadcbaabcdeilpytns|qgdd`WONU`pºugadkmnpnieht~xi\W[air}yohhkkgfn{oeenzxl\MDBEGJO\m}sfYMGHMRSQRX`hqx|}zwuxse]Z\bku|zvmbXSW_fhf`ZXY\al|ürkjmpqneXI>=AEA:59EWnϹoYD1 +;Matǿvomljd\WWWRLN\q}kZLFFILOU\bd`UG=9=FWmqf`_bgow}~~}zwwz}~~~yxyzvmir{k`\][UNKOUXZamuy|{oeXG9/-1;HXhvmYNJHEDGLT`oĶ}paQB859AECAFScmqrtw}ymc][\]_`a_YRPT^jx{sgZNFDGLMLLPXevylgjostw}o]PKJMT`mw}~vh[RNMOV_js|}ocZWZ_^ZXYZUK?9:EYm|ƻk[OF>:?L_lu|{snnuƼxiYJ?5,%'1AR`kvy\< .F_uȻwaPC>DUj{~vnigeefhlwvbPB=BSkxnic\TOTbvudVNOYj{zoigikkksþ}skhgd`[URTZ_bbfp~|tnkjknrxyj^XWZ`goy{upib`aa^\alx|y|{kYH<3.0>WstidejlgXE5,'! %.>Sk}x{}wx|}wqlfbceffda]ZXZfy~}~wvund[VV\fnu}pb[\dq}ľzg_er~{{xqlhghihe_[YZ[YSNOWcoz}|||zxvy}zjelyxplmooliggktǻseVIABGOU]iyƹ|hR<'1Qr|qha_aht}qe__dmyvjcchpyzrtymb\[_dgilvtmnt¼q_QJJOV]cghgefjnwzohfefkqsofZOKR`rvi__hxxoihmvκrdYUW\dkmkgb_]XQJIKOWcu|oheca`do}}tibaelruw¿}vposywmga]\[[\_doytwjZSNH?:89?KWaju°snnkdYL?1'$)059AO`rs_L:%  8QkweZRI?7009H\m{mZH5  (>]}ȷzocVG;3/./6BQ`mw~îsdTG;1( .=M\ju~vqpoorvy{|{vpkkox|pgccglqu|zslgfhlsx|}|}ukdcky|ogb__bfgeb_`fpyĿv`K:/'"#+77:@IVgz¼{vvy~|wsnkjfZOOXafhls{~{{~tlkoqpmmqxzqkkpwytsvzytldbixsia^bkrtvx{tVQ[lr]J?Lby{sld`cjr||jVKOfsf^XSMGA@FQ_ovu|{vph`WNGHOZgr{wqkechmrzwpkgbZOF@BJ[p~}|{|}|xpha^^`en|{wwx|{oecehihfgkry{z}~{uqppqu~ûrf^VRPNJFDDDHS_n¼vohl}}ofeglrw}zsolf_ZWW[agloqrv}tjc__bceinruy{qjgaZUTSPKKRZ^_cgghmv~~ywwvwxzƽ}n_QIFEFHJMR_rtnlnu}zxzwqpqtuussv|{rnnorv}~wtqmhfjqy|tja[WWZdq|{tomoqsuuust}{maWPPV]eo|umllidbit}z{~~}ysmhe`WK>7;GU`gklmnoqrtv~~tjdaer|ogegjjjlptutsrsu|xtz}|wpljjjkkms{~xrpsy~wqnrwsqqu||vslaWU]o}j]WSPPTZ`en}ĸrWC;?Ma{{pnqssvslmonha\ZYZ\ahs~zvvxxwuronnpv}{sstx}~ofcfnvyy{}wpligda`bflrwz{zyz}|wsomlmqw|xvsrpqsttsrsqnjgfedcceksz}|zxvttrokfb]WSOMKKKLMPV]diou{|yx{~}{{yunidxevil-2.02r2.orig/win32/res/FIRE.BMP0100644000175000017500000000555606604100416016132 0ustar aaronlaaronlBMn 6(**8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,G,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ƝGG,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ƝGGGC,,,,,,,,,,,,,,,,,,,,,,GCGGGGC,,,,,,,,,,,,,,,,,,,???CCGGGGCC,,,,,,,,,,,,,,,,,,?????CCCCCGGCC,,,,,,,,,,,,,,,,,????ƝƝ????CnrrC,r,,,,,,,,,,,,,?,,,,,,ƝGCGnGGGGGGn,r,,,,,,,,,G,,,,ƝnnrnC?CnGnrrn,,,,,,,,CGƝƝrrrrGC?nrnrrn,,,,,???CGGƝƝƝrrrrnƝr,,,,C?,,?CCG?ƝrrrƝ,,ƝrrrrGCG,,,GG,,,,,,,,,Ɲnnr,,,,Ɲ?rrCCn,,,nC,,,,,,,??CnGCGn,,Ɲr?,Cr,,Ɲ,,GGnrnGC????????,Ɲrnn?,G,,GnrGGCCCCCC,?,G,,n,CC????ƝnGGCCGG,,,,?,G,,,GC????,,GCGGGGCGnGn??,,n,,,,????ƝƝƝGGGCG?nrnrnrn,,,????CƝGGG,,r,,,,,Ɲ????,,,r,,,???,,,,,Ɲ,Ɲrnn,,,,,,,,,,,,,,,,Ɲr,,,,,,,,,,,,,,,,,,,,,,,,,Ɲ,,,,,,,,?Ɲr??Ɲ,,Ɲr,,,,Gr,,?ƝƝƝrr,,,,,CGƝ?rƝrrrrrGC?nrn,,,,,?CGG??????Ɲ,??,,,,nC?CnGn,,,C????CCG??Ɲr,,GGGGGGn,,,,GGC??????GƝn,Ɲrnn,CnrrCG,,,,,CC???????CnGC,,Ɲr,CGGCCG,,,,,GCGGnrnGC??????,,,,Ɲ,GGCCG,,,,,,??rGGCCCCƝ,,Ɲr,,GGCG,,,,,,,GCGGnrƝnGGCCƝƝrr,,GCG,,,,,,,,,r?GCrrrrGC?nrn,,G,,,,,,,,,,rrƝn??nnrnC?CnGn,,,,,,,,,,,,,,,,,,??GCGnGGGGGGn,,,,,,,,,,,,,,,,,,,,,,,Ɲ?????CnrrCG,,,,,,,,,,,,,,,,,,,,,,n??CCCCCGGCCG,,,,,,,,,,,,,,,,,,,,,nrƝnn?CCGGGGCCG,,,,,,,,,,,,,,,,,,,,,,,r,,?GCGGGGCG,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ƝGGGCG,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/FIRE.MID0100644000175000017500000001553306624662060016133 0ustar aaronlaaronlMThdMTrkYYT`AllFireNoPatchNEWQXQSQQSQ/MTrk! Pick Bass"88D,D,8888D,D,8888D,D,8888D,D,8888D,D,8888D,D,8888D,D,8888D,D,8888D,D,8888D,D,8888D,D,8888D,D,8888D,D,8888D,D,8888D,D,8888D,D,8/MTrk!Burn4 )b%b'b(b&bE&'() %.%b)b'b(b&b&%'() )b%b'b(b&bE&'() %)b%b'b(b&bE&'() %.%b)b'b&b&%')"%b)b'b(b&b&%'() )b%b'b(b&bE&'() %/MTrke!Brooding Melody3y7<`8F]7;U,84j=<#0;N+<58:.;8-G<7<`HF8F]G7MU=U,H84Jf:f M=\J:xG@7@`HF8FvG7jMb=bH8EJl:lM=J:ZG:7:`HH8H\G7NR>RH8CK`;`7N>)QjAj=K;cQA Oj?j NR>RO?N>EXrHr XH Y|I| `|liT|YIg`lTy7<`8F]7;U,84j=<#0;N+<58:.;8-G<7<`HF8F]G7MU=U,H84Jf:f M=\J:xG@7@`HF8FvG7jMb=bH8EJl:lM=J:ZG:7:`HH8H\G7NR>RH8CK`;`7N>)QjAj=K;cQA Oj?j NR>RO?N>uQjAj QA Oj?j NR>RO?N>%]~M~H\~L~X]MH[~K~\LpZ~J~+[KpZJ}7<`8F]7;U,84j=<#0;N+<58:.;8-G<7<`HF8F]G7MU=U,H84Jf:f M=\J:xG@7@`HF8FvG7jMb=bH8EJl:lM=J:ZG:7:`HH8H\G7NR>RH8CK`;`7N>)QjAj=K;cQA Oj?j NR>RO?N>uQjAj QA Oj?j NR>RO?N>%]~M~H\~L~X]MH[~K~\LpZ~J~+[KpZJ7j=<#0;N+<58:.;8-G<7<`HF8F]G7MU=U,H84Jf:f M=\J:xG@7@`HF8FvG7jMb=bH8EJl:lM=J:ZG:7:`HH8H\G7NR>RH8CK`;`7N>)QjAj=K;{Oj?jXQAVNR>RbO?tKL;L5N>yK;7<`8F]7;U,84j=<#0;N+<58:.;8-G<7<`HF8F]G7MU=U,H84Jf:f M=\J:xG@7@`HF8FvG7jMb=bH8EJl:lM=J:ZG:7:`HH8H\G7NR>RH8CK`;`7N>)QjAj=K;cQA Oj?j NR>RO?N>EXrHr XH Y|I| `|liT|YIg`lT/MTrk!Shower Knifing/Dark Pad0*R6UXxMxMM!XXfMfFM XXfMfMM!XbYfNbPNYT\K\IKTX\M\JMX 7f+bXpMp*6MXXLMLMMXxY~N~JNYXTMTMMXN|IdVI"MZHZNwHMY+%H1UXxMx 7DM!XXfMfFM XXfMfMM!XbYfNbPNYT\K\IKTX\M\JMX $b0_XpMp41 %MXXLMLMMXxY~N~JNYXTMTMMXN|IdVI"MZHZNwHMp$0][i;Zd'[Z1ViiUd%VU:SdO`fBS4`U`nJ`6`iL`X`kM`H`nM`l_W`kK_ `B__!`k8_#`_ddR_9_R#]k=P]]%PTNW*[k=N[`iP`<`iI`G`iF`I`kM`_f`n7_.`Z_f`q8_#`7]i.Pb/]P*R6UXxMxMM!XXfMfFM XXfMfMM!XbYfNbPNYT\K\IKTX\M\JMX 7f+bXpMp*6MXXLMLMMXxY~N~JNYXTMTMMXN|IdVI"MZHZNwHMY+%H1UXxMx 7DM!XXfMfFM XXfMfMM!XbYfNbPNYT\K\IKTX\M\JMX $b0_XpMp41 %MXXLMLMMXxY~N~JNYXTMTMMXN|IdVI"MZHZNwHMp$0/MTrk !Snare38,Kick35#p-#K& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&#p& ,#&#p&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#p&4,#&#p&4-#&C&4-&B&4-&C&4-&K&4-&K#p&4,#&#p&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#p&4,#&#p-#K& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&#& ,#&#&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#&4,#&#&4-#&C&4-&B&4-&C&4-&K&4-&K#&4,#&#&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#&4,#&#-##-##c-#2#c-#4#c-#2#c-#4#c-#2#c-#4#c-#2#c-#4#c-#2#c-#4#c-#2#c-#4#c-#2#c-#4#c-#2#c-#4#p-#K& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&#p& ,#&#p&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#p&4,#&#p&4-#&C&4-&B&4-&C&4-&K&4-&K#p&4,#&#p&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#p&4,#&#p-#K& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&#& ,#&#&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#&4,#&#&4-#&C&4-&B&4-&C&4-&K&4-&K#&4,#&#&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#&4,#&#&4-#&C&4-&B&4-&C&4-&K&4-&K#&4,#&#p-#K& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&#p& ,#&#p&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#p&4,#&#p&4-#&C&4-&B&4-&C&4-&K&4-&K#p&4,#&#p&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#p&4,#&#p-#K& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&#& ,#&#&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#&4,#&#&4-#&C&4-&B&4-&C&4-&K&4-&K#&4,#&#&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#&4,#&#&4-#&C&4-&B&4-&C&4-&K&4-&K#&4,#&#f-#K& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&#f& ,#&#f&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#f&4,#&#f&4#f,#&#C&4-&B&4-&C&4-&K&4-&K#f&4,#&#f&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#f&4,#&#f-#K& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&#f& ,#&#f&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#f&4,#&#f&4-#&C&4-&B&4-&C&4-&K&4-&K#f&4,#&#f&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#f&4,#&#c-#2#c-#4#c-#2#c-#4#c-#2#c-#4#c-#2#c-#4#c-#2#c-#4#c-#2#c-#4#c-#2#c-#4#c-#2#c-#4#p-#K& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&#p& ,#&#p&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#p&4,#&#p&4-#&C&4-&B&4-&C&4-&K&4-&K#p&4,#&#p&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#p&4,#&#p-#K& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&& -&#& ,#&#&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#&4,#&#&4-#&C&4-&B&4-&C&4-&K&4-&K#&4,#&#&4,#&K&4-&K&4-&K&4-&J&4-&K&4-&K&4-&K&4-&K#&4,#&#-##-#/xevil-2.02r2.orig/win32/res/FIREBALL.BMP0100644000175000017500000000536606604100416016564 0ustar aaronlaaronlBM 6(0$hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,GG,,,,,,,,?GG,,,,,,,,,,,,,,,,,,,,,,,,,,rGGGG,,,r??GGG,,,,,,,,,,,,,,,,,,,,,,,,,rGG???GGG???G,,,,,,,,,,,,,,,,,,,,,,,,,GG???G???Gn,,,,,,,,,,,,,,,,,,,,,,,,,G?n??GG,????nr,,G,,,,,,,,,,,,,,,,,,,,,,n?r??G?,????n,,G,,,,,,,,,,,,,,,,,rn??G?,??G?,?,,,,,,,,,,,,,,G???,?,rG?,?,,,,,,,,,,,,,,rG?G?,,G?G?,,,,,,,,,,,,,,rG?G??,,,nG?n,,,,,,,,,,,,,,nG?n??,,,,GG?,,,,,,,,,,,,,nGG?,,,,,GG?,,,,,,,,,,,,,??GG?,,,,GGG?G,,,,,,,,,,,,,,nn??GGG?G,,GGG?Gnr,,,,,,,,,,,,,,n???GGG?GnrGGGGG?Gnr,,,,,,,,,,,,,,???,,GGGGG?nrr,,,,,,,,,,,,GGG?G,,??GGG,,,,,,,,,,,,,,GGG?Gnr,?,,,GG,,G?,,,,,,,,,,,,GGGG?Gnr,?,,GG,rnG?,,,,,,,,,,,,GGGG?nrr?r,,,G,rnG?,,,,,,,,,,,,GGGGGGnr,,,,,,,?rrn?,,,,,,,,,,,,GGGGnGGG,rr,,,,nn,,rnGG,,,,,,,,,,,,,GGGrG?G,,n?,,rGr,GGGn,,,,,,,,,,,,,GGGrGG?nr?,,rrnnn,,G?Gr,,,,,,,,,,,,,,GGGGnnrr,,n?GGr,,,,,,,,,,,,,,GGGGr,,,rrnnGG,,,,,,,,,,,,,,,,,nnnrr,,,,rGG,,,,,,,,,,,,,,,,,,,r,r,rrnnn,,,,,,,,,,,,,,,,,,,,,,r,n?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r??????rrrr,,,,,,,,,,,,,,,,,,GGGGGGGnr,,,,,,,rrrrrrr,,,,,,,,,,,,,,,,,,,GGGGnGGG,r,rrnnn,,,,,,,,,,,,,,,,,,,GGGGrG?G,,n,,rG,,,,,,,,,,,,,,,,,,,,GGGrGG?,,,,,GGG,,,,,,,,,,,,,,,,,,,,,,,,Gnnrr,,,,,,GGGGG,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/FIREBALL.WAV0100644000175000017500000001442406430260066016603 0ustar aaronlaaronlRIFF WAVEfmt +"Vfactn dataTr.F '8="P 36  rMR>kWݢۍLc?w~R(Rw:K[߳ـ׫рωɉq@ǣs`ѵ)Ci°pE 14۫^i$pƿ+cҳ^@Z T!!&,^32:9=l@A?D> ` Dg28v#:k 9 %-6-/1/1*'*0(60)'*,--/'}-d  JbH  5 h j?#-h31BLFSW`{c:fo[sz{Q}z{|}|Bx~~} yqoidnb^ake(`W9UM-C6$'] D@ 4Mmnnwan~>  Eoys#%"v*J/82<>A?ApD@CB@@69s3g:8H>79?;+3Z-5->+/ x&ӪΏ#U7{c¨8b(ܡrW{ z"FG p:2% dExR`O]یJ 2&M j#m (*$B4-;3T5<9\= Dh?IDMUET6OMW3OLO'QKQGKQ[VVT-QVONSFJD?\@ 9B; 7:/-G-3%(##:Q7NӤ?ϻRġtW# ׸4ÕVn2*? K<< '0,-3v5DH@NY.M\U_bcggjji\ggclA`gam`lqkdpfagm dh#gmesnmcd\y[;]YXVVfOW R8HK 5H<178&$*O7}# c{: =p"k& !C.)&/0g22\35n98?PCMrO(MOLPPU P#aJ[]Tc`cCm$f)oQkiu_[ VWFKFC832g6<$2'"z' <&#s)(W#%&X" Fd+oY'.A3#4=24?AANPYL.h[hr4tu3;~C|mzp3pezpjb@XDN.9620t-#)>U 5)29=yn G!$4O؏&'؂טie4_8[JH;5-D5ߚׁAkﯷ]f@Y7Q й,U<0ؾpӹ`Xք[ˀ@ѾɑKȴ~Tĩ&8a'C2% +!>T8:DYY~fRicbheaeohmoss{v-~uyhs_sbKp;jQbWrTY|DLK?nCL?E?X;\E:Ho;7+83+A.#Rn  -K=9Fc)̆#˓v2ro>.f /L?gR?i~ўվ:X@"gtz)q,14;8?9/9e &!# `> |}Z>?f3]G[Ǐ %1T­>R}" IRHiҜp)ӕkٛՊX^Ǭ?'q BS< C;i޻ޒktg`  U 3 T  ] !r SA;ZV+g * &52mFpN&)o%Sݱ٘ђQ$8bN'0;ګ;س@+jmwH ju (T> D 4qFbk9m1ެe9ESG.# o +*%1&5p6_=:w:JIYP`d iox|v}pvQosnRlIha\ZWrSrRIH@k;X7*.2*!a$FZ _fx( p+2;x9;?M28.J9/0#&?@\,!n3{Է׬բi׾78]e //ZB +*t@\D a#) Byo02!_{A  *";$+0>3;EAGtRTS]X\XH[V0W`!_XW5RUI0TLGNJMG;7BF-1*&^ Z !0diWN*K*)U"XfvߍOY۠QB@2CwBFJM[PM^a\.hc nmx pUyGpZj di\CbSvZTnMGK9OFAh@TE?ME@IDDD6CIC?<:@;D;3@4? rMsD 2 ,\n>}\C#UH=W~LxQQ߶ިޓ#Yދ(P5jي7]gֶܷ.;ŴēLVO FLj7˫IJbC879n(NYvŭ(Ho: ~9.) $:%Z-2.5/ 9$.>y>?CNKrJYOJCGJIHKKmMPMfTO VLfQM>DJ=s7Iu5B7+/'&" -/e#Oͣáq({]yH!8ߙocѶZנй79:'GVMxevil-2.02r2.orig/win32/res/FLAG.BMP0100644000175000017500000000232206604053336016112 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,///,,,,,,,/////,,,,,///////,,,/////,,,,,///,,,,,,,/,,,,,,xevil-2.02r2.orig/win32/res/FLAME2.BMP0100644000175000017500000000646606604044316016322 0ustar aaronlaaronlBM6 6(00 hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ƝGG,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ƝGGGC,,,,,,,,,,,,,,,,,,,,,,,,,,,,GCGGGGC,,,,,,,,,,,,,,,,,,,,,,,,,???CCGGGGCC,,,,,,,,,,,,,,,,,,,,,,,,?????CCCCCGGCC,,,,,,,,,,,,,,,,,,,,,,,????ƝƝ????CnrrC,r,,,,,,,,,,,,,,,,,,,?,,,,,,ƝGCGnGGGGGGn,r,,,,,,,,,,,,,,,,,,,,ƝnnrnC?CnGnrrn,,,,,,,,,,,,,,CGƝƝrrrrGC?nrnrrn,,,,,,,,,,,???CGGƝƝƝrrrrnƝr,,,,,,,,,,C?,,?CCG?ƝrrrƝ,,ƝrrrrGCG,,,,,,,,,GG,,,,,,,,,Ɲnnr,,,,Ɲ?rrCCn,,,,,,,,,nC,,,,,,,??CnGCGn,,Ɲr?,Cr,,,,,,,,Ɲ,,GGnrnGC????????,Ɲrnn?,G,,,,,,,GnrGGCCCCCC,?,G,,,,,,,?n,CC????ƝnGGCCGG,,,,?,G,,,,,,?,GC????,,GCGGGGCGnGn??,,n,,,,,,,,????ƝƝƝGGGCG?nrnrnrn,,,,,,,?????CƝGGG,,r,,,,,,,,,,Ɲ????,,,r,,,,,,,,,???,,,,,Ɲ,Ɲrnn,,,,,,,,,,,,,,,,,,,,,,Ɲr,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Ɲ,,,,,,,,,,,,,,?Ɲr??Ɲ,,Ɲr,,,,,,,,,,Gr,,?ƝƝƝrr,,,,,,,,,,,CGƝ?rƝrrrrrGC?nrn,,,,,,,,,,,?CGG??????Ɲ,??,,,,nC?CnGn,,,,,,,,,C????CCG??Ɲr,,GGGGGGn,,,,,,,,,,GGC??????GƝn,Ɲrnn,CnrrCG,,,,,,,,,,,CC???????CnGC,,Ɲr,CGGCCG,,,,,,,,,,,GCGGnrnGC??????,,,,Ɲ,GGCCG,,,,,,,,,,,,??rGGCCCCƝ,,Ɲr,,GGCG,,,,,,,,,,,,GCGGnrƝnGGCCƝƝrr,,GCG,,,,,,,,,,,,,,,r?GCrrrrGC?nrn,,G,,,,,,,,,,,,,,,,rrƝn??nnrnC?CnGn,,,,,,,,,,,,,,,,,,,,,,,,??GCGnGGGGGGn,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Ɲ?????CnrrCG,,,,,,,,,,,,,,,,,,,,,,,,,,,,n??CCCCCGGCCG,,,,,,,,,,,,,,,,,,,,,,,,,,,nrƝnn?CCGGGGCCG,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r,,?GCGGGGCG,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ƝGGGCG,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/FLAME3.BMP0100644000175000017500000000646606604044316016323 0ustar aaronlaaronlBM6 6(00 hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,nƝG,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,CCGƝ???GrG?G,,,,,,,,,,,,,,,,,,,,,,,?Cnr,?,,,,,,,,,CCG,,,,,,,,,,,,,,,,,,,,,,,,,,??,??,,,,,,,,,,nrƝ,,,,,,,,,,,,,,,,,,,,,,,,,??,,,,,,,,,,,,,,,nG,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?,,,,,,,,,,,,,,,,G,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?,,,,,,?Ɲ,,,,,,C,,,,,,,,,,,r,,,,,,,,,,,,,,,,,?,,,,CG??,,,,,,?G,,,,,,,,,,,,,,,,,,,,,,,,,,GC,,,GCC??,,rC??CC,,G,,,,,,,,,,,,,,,,,,ƝG?,,G???CGC??,,,,,,,,,,,,,,,,,,,,,??GC,,nG???ƝG??,,,,,,,,,,,,,,,,,,,?ƝC,,rn????,GC?,,,,,,,,,,,,,,,,,,,,???G,,n????,?C??,,,,,,,,,,,,,,,,??Ɲ,?G??,?G??nr,,,,,,,,,,,,???,?Cr,?,???GƝ,,,,,,,G,,,,??C?G,,?G?Cr,,,,,,,,,,,,?,n?GnƝ,,,??C?Gr,,Ɲ,,,,,,G,,,,,,Ɲ?CG,,,,??n?GnƝ,Ɲ,,,,,,,,,,Ɲ?CG,,,,,Ɲ?CGn,,,,,,,,Ɲ,,ƝG?CCGƝ,,,,Ɲ?CG??ƝƝ,,,,,,,,,,,ƝrnC?CCC,,ƝG?CCG??nn,,,,,,,,,,ƝrnG?CGGGGƝrnC?CCC???n,,,,,,,,,rrn?CGGGGƝ,,Ɲ???,,,,,,,,,,,Ɲ,,GGG??,,G?CCG,,,,,,,,,CC?G,,GC,,,?,ƝrnC?CCC,,,,,,,,,,CC?Cnr,CG,,?,ƝrnG?CGG,,,,,,,,,,,GC?Gnr,G,,,r?rrn?CGG,,,,,,,,,,,GC?nrr?,,,,,Ɲ,,rnGCCGG,,,,,,,,,,,GCCGnr,,Ɲnn,,,,rr,GCGnGGG,,,,,,,,,,,GGnGCG,rGr,,?Ɲn,,C?GrGCC,,,,,,,,,,,CGrG?C,,nnnrr,,?rnƝ?CGrCCG,,,,,,,,,,,CCrGC?ƝnƝ,,ƝrrnnGCCG,,,,,,,,,,,CCGnnrr,,Ɲ,ƝƝrGGGG,,,,,,,,,,,,GGrƝ,,,,Ɲrrnnn,,,,,,,,,,,,,,,,,nnnrr,r,Ɲr,Ɲ,,,,,,,,,,,,,,,,,,,,Ɲ,?n,Ɲr,,,,,,,,,,,,,,,,,,,,,rrrr??????r,,,,,,,,,,,,,,,,,,,,,,,,,,rrrrrrrr,,,,,Ɲ,,rnGCCGG,,,,,,,,,,,,,,,,,,,,,nnnrr,r,GCGnGG,,,,,,,,,,,,,,,,,,,,,,,Ɲrn,,C?GrG,,,,,,,,,,,,,,,,,,,,,,,,,,GCnnƝ?CGr,,,,,,,,,,,,,,,,,,,,,,,,,,,,CCCGGGn,,,rrnnGC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Gnr,,,,,ƝrGGG,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rrnnn,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/FROG.WAV0100644000175000017500000001005406430260056016152 0ustar aaronlaaronlRIFF$WAVEfmt ++datazxzzzxxxxxxxxxxxxxxxxxxxxxxxwxwxxwxwxwxxxxxxxxxxxxzzzzzxzwwwwxxzzzzzzxwwwxzzzzzzzzwx{}{uqrwzwtu}~qlowunlrxu{wieituoilw{{qlo{zzzuokknrrqqu~~}zww{~wqkebchkorx}}wuwz}zzz~wqononorz{wtqqnnouz}}zxz{}zxxzzzwwwx{}}}}~~{wttuwutttwwwwxzzwtuuklwwlfn}rql`VZkw`PPbu~xorwxqlr}ocTHHVk}xlb`fnqt{{lbchqw~{k]YWY_hu~~}wuxzwrlc\\bkoqqqttqlhhknoqw}}x{t`\fi]SVhk]_bZMJWr~n\Vb{zkkwztobQHQf}~wqoiYJHWl{wrtrkiq~fSPZht{zqqnhflzwrqnkiltuqkiq{zux}zrkfltwwx~~wux~}}{{~}wttttwz~zwtqlc\]lteckn`VYouxxn_]nt``ql]bournrzrnbPGM`x{r`PMZlzzz{ukiru_TYbiq{uc\_``bl}{ux}{tor~xnnu{xrou~torwxurrzztux}}{}}{{~zzwtrrtwxunir~r`ZcleZ\l~orun_Vb{}ihwlciz{rtzlowt`SVh{nlqobMGSl~}wzrq}wr~xe]cquw{}h]`hlno}tllnkhiutlow~ztu{}xqlrz}zxzzunilu}zzzzx{zwuuwwz}zwutrnhirz~uhcefc\]l}uwzukfo{or~}khr~}qiq}zkfkofYQ\qtrz}t_T]rz}{ln}xz}we`iqtt}o]Y\_`erwifhihluwoottqor{zxz}zwtttwwttttwwwwwxz}}{}zqke_YWY`kqokilqtqnotz~{wx{}}}}{{~~}{zzzzwttuwwwuqnlkkkkkkiffltuoebkurift~zrio`ctwbZct}uno}uiinn_PN_u~torukZT\q{w}uzx~tbY\floqzqhefeekwzttuwuw{zww{zwwwwrkhkqtwwxz}}wtruz~~}zz}}{{}}zzz{}~~}zwtnkfbbfr}~tlloi``n{}zi]e{}ll{zweco{zniqxlku{o_Zew~ulltuiYS`u~x~{nq}}kfltxw{uf\YWY]huzqkkiknt~{zwwtttuz~}xx{}wttttqnqw}}zz~}~zwwwzzxwwuttokecht{wkcekf\Wbzut{~qbbrznt{uikxtntn]\itqb]hwzoccnrkZTbxrq}{ln{wtqw{xqoz}k`beeelz{qkhechu{unheflqwz}}}}{{~zz{zwz}{wtuz}}{{~}wuwwwwtuwwtqnkifho}zlflrokkxrtz{n_`r}k`i}xlq{rw{khq}oehuxh`hqn`QThz}rlr}tc_k~u}~}ztqnlkoxzqf\Y\ektw}~xlb]_ehkqx{ttx}}wux{}~z{xqoqttttwzzxtttttuwxzztniilliefinnkilqtokir}}wrxxnlqoi]Y`luqhcfkkcYZequtqu}~xqr{{}}}}wwwwttwwzwtokikkkkikottqnortollr{}zx{}zwx{}wtttwwwwwwtqnqtwwwwwwroorwz{zzzzwutttwwwxzz}}}zzz}~}}zwtqtwwutttttqqtuwwwwwwtttwwwwwwttuwzzxwwxzzzzzzzzzzzzz{}z{}}{~}{{~~{zx{}zwwwzwutttutttwwwuttttqnoqttttuwwtttwxzz{}}}{zz}}}}~}}}}~~~~~}}}}}zzzzwwtrrttrqrttwtuwwwwwwwwwttuwwttttuwz}}zwwwz{}~~}zzzzwttttwwxz{}zzzzzzzxzzzwwuwxzzzz{}}}}~}~~}}zzwwwutttrtttwwwwwwwwwwwwwwwwwxxzz{}}}{zz}}{zxwwwxzzzxwwwwwwzzzzzzzz}}}{zzwwwxzzwwwwwwwwwwwwwwwxzzzzxwwwwwwwwwwwwwwwwwxxzz{}}}}{zzzzzzzzzzzzwwwwwwwwwwwwwwwwwwxzzzzxxxxxzxxxxxxzxwwwwwxzz{}}}}}}}{zzzwwxzzzzwwwwwzzzzzwwwwwuttttttuuwwwxzz{{{zzxxxxzzzzzzzxxxzzwwxzzzzzzzzxxxxzzzzxwwwwwwwwwwwwwwxzzzzzzzzzzzzzzzzzzxxxxwwwwwwwwzxxxxzzzwwxzzwwwwwxzzzzzzzxzzzzxzzzzzzzz{zwttxxqrz}unoz~trwuleixxkchu}z}~unio{wruz}xqouz{wqoqof_`l{~qnwl_cr{wkflwtf]cr}qlrzzuxuieiur]NN\lz}k]]irrnr~zqt~wu~zx}xoox~{rnnqlc\]fqurotuehu~uik~}tb`qi`k}qt~oZT_u}qtocktltn\\nrfk}qkw{oqt`\lzw~}n\Ve{}oq}zhbk~u{}qoxnkqqbSQbx{ti]PMVkzqkhho~q`Z`rr_Wbuwkirxn\S\o}wkfq~}ochz~tz}khw~}tiq{khtziix{fW\n}wf`k~wbZexthhz{kkxqktrorww{o]Wbu}q]Wcu~}kbfqz}q_W]iuqb\Z`iuxi\VV]ixxuwzz}}x{}wqrzrhhoxwolu}qou~zux{nilw~~uqquzxtqrttqqrx}zxzzzzz{}}~}xwxz~}wqonnkilrurkfefhheflrzzwttttttu{}{}}xwtokhinqqnkkkkhknrtqlheeeehlrwzzxzzzwwx~}~~~~~}{}}wttuwtttuwuqooqqkhhknnkknqttqrwzzzzxxzwwwz}~~}~}{~}wttwzzwuwz{wtruzxttuzzuqqtzzxwwzzwwtwz}}}}}}zwtqrtwwwzzzzwwwwwwwz{~}{z{}~}}zzzwwttttwwwwwwwwtttwwtttttttwxzwwwz{}}}}~~}zzxwwwxxxzzzzwwwzzzxzzzzwwuwwwwwwwwwwxzzzzwwwwwttwwwwwwwxzzzxwwwwxzzzzzzzz}}zzxwwwwwxzz{}}}{zzxwwwwxzzwwttwwxzzwwwttttttwwwwwwxzzzz}}}}}}}}{zz{{{{zzzzwwwwwwwwwwwwwwwwwwwwwwwwwwwwxxevil-2.02r2.orig/win32/res/FROG0.BMP0100644000175000017500000000232606604100416016212 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/FROG2.BMP0100644000175000017500000000276606604044316016232 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/FROG4.BMP0100644000175000017500000000275606604044316016233 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/FROG5.BMP0100644000175000017500000000237606604044316016232 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/FROGDETH.WAV0100644000175000017500000000273606430260052016623 0ustar aaronlaaronlRIFFWAVEfmt ++factdata~{~~~tusq}R{mvx|dvuR}a_b\Zk`yox}S`lhWbW$V`KYB9fvh}yn_dc9v3QIO`LtʫfeQ"7*   A=$MdfbwzxtxfbXoh\lkiycqvdkfb_XTYXPSJVNGFOOHOL\`^[jrtyȾ̷}~~nu~zmyqpskmroewonohnuirympssr{urvupvroukupjgflhagdce\Z`d\^_Z^f]aabhhlllvuy|y|}}yzwwwurtqoqippholjpokmomopmpuqrsqttrpttrtrrtttutuwvwwxyzzz|~~~~vv{}x~{y~|}z}~~}}}|||z{z{|{z{{{||||}}}}}}~~~}~~}~~~~~~}}}}}}}}}}~~~~~}}}}|||||{|{{{{{{{{{{|||||}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~xevil-2.02r2.orig/win32/res/FROGGUN.BMP0100644000175000017500000000276606604161602016520 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,VVVV,,,,,,,,,,,,,,,,,,,,,,,,VV,,,,,,,,,,,,,,,,,,,,,,,VVV,,,,,,,,,,,,,,,,,,,,,,VVVV,,,,,,,,,,,,,,,,,,,VVVVVV,,,VVVV,,,,,,,,,,VVVVV,,VVVVVVV,,,,,VV,VVVVVV,,,VVVVV,,,VV,,,VVVVV,,,,VVVVVV,,,,,VVVVVVVVV,VVVVVV,,,,,,,,,,,,,,,,,,,VVVV,,,,,,,,,,,,,,,,,,,,,,VVVVV,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/FROGGUN.WAV0100644000175000017500000002262206430176702016534 0ustar aaronlaaronlRIFF%WAVEfmt ++fact."data."~~~~~~~~}}~~~}}}}}}~}}|}}~~~}}}}~~}||{|}~~~~~~}{{}}~~}|~~~}{|}~~~~{|}|}~~}||~~~}~|~}|z{}~}}|y~|y{yx|~yx~zy||{|{y|{wxvxvy|{u}{v|}pqwwv~qtt|slsrq}vot{qcsrszqu}uwcmntyoyv|hfon{uq}zffplwoswz\howtrix~`lptvnkwp_spwqkvq^xtwohxnbtxqoo|aqx}rj{ysltysm|~slw|tn~zirx{npytb{yokqR|urhywT{zrlsi^|wnk~|[hxxgxqoZyynj}`wyhmdwonz~hr|xoxmxv~z}sxtz~r|wzs~vsnyzyznwsytsv~muvto}|l|rxxurn}unlp}x|jz{iz|o}qztuswzvpytvxt||v}}tsw{vsxt}}|{~~zy||~tt}{{yzzv||x~}~wxxztr}zz}nvzu{~}|px|{wy{zxo}|wk{{~t~z|ww|ywqytsy}vxs}|zl|}qv|}yuzx~yzzvvzublrygZo~}qu~vuplpo}otyz{ozvwovsnawsvrjquqk`rlz{t}~gUy}qzo|Yilevzsrisuhymo~zvqovr}x~{p|||qypqsb[fexppwmkyqnm~~kgqbbuiYb{pwuakoogwugq|~vytj}xu{~ys|z{^ht{q{twf{wstsosutdxtzptpz~vym`csvkf`eblxvbis}zb^Zw|[}mz{|x^~Ue~~tMyhFt}mLQt{irw~bu}bvf}exvx~{oyr\{wmagxTjpdwvgyy}gt|_pgSh[ZYetu~|j_|t|b|XV|la]C|cw|blxzps{hZklUxoj|p{^~_`^ksrbvzp|k}wfkm\rvymEq~uf{znIpYgzy}qybdteoW~RefBdlyr^zypumw|rf}_is}\{4muXVh^w~bzvdRozyyceopzmo{{ltscxL\RUOW^MxWaopUccwoxs{rzs|Ka}pp}}zw~|uj_ovgzzypzmqwcpy~xbu{xwrzvpzolcwufdt}tuhz}syrTykvzztum~vjdmx~smwe}xewz~xwfum~vf}rilu[{}Vo|{zt~pmn~rpamotsmrrxxxgp|vl~|\yt}fqo}vzwumzloqlsn}}sou}r|}ftlxlgyzYz{{}wtw~k{{hpqkwxw~pmqzwcyzvvhyybt|wsj~ysm{uzsj|s{l{u|prxypximzweyuzppn|uev|}ok{xyj|{zatvh{|m|~thp~tesvmo~y~x|j}y~{c|tyjr}~~{dxz}fovfz{{ts_zxyf||bvzxgt~zjuwwrgu}ycv}y`r|}_zuue{r|yd{||x{ikwz|s]~v|ves{~ygt}ygs}ze{xyjtu~fqzvetz~cx~bwxyexw{e|xxviz|ylr~yy{kyv}zf~uyfr{yhzz}uqn{{vymsz{axsc|xs|d{umytz|]{||eu}zsowxi}twdxxuq}|{e}x{ylx{xs}yh~zu{iur{pwjvyumz~{krtvm}yxurtwj~w|xh|xhssumyzxi}yxyf{ui|vs{fz{x{d|ustkv{xesyyi{{xbuvwrzzrhrwzhz{{xi||tj~zvnwqvwlwygzf~xzumx{xjy}wpx|xgxxpxr}ymyzwxk}umo}{i{wrwtp|wk|{hwypzrszrq{|oxgxym}nvpj~{pxy|~zzn{{ym}ylw~{j}wwtyoz}iqtorturywltvwn~~ulrxsvurvx}uwxx}yxz~}xwz{w~w|u}{~zz|}~yvtr}|~~~~~x~|}~{|~|y}w}{z~~~~w{y|{y{xqz~}}}}yzx{zwz}x{{~}~qvv~~}z~z~}ztt~|z~}p{{}|w}u~y~~~}{|{|{|}}t}|w{}~{~{t~~|z}{yz}}wrt{zzmu}w{}~zz{t{|q}|y{|z{mv|~xfzv|w{{|wozxvy{||wu}vwtt{~{}vnWpfn|hnRz}h\|X|ur}b~iXTvqNz}^kYTrnp[vpe}zua~n{Mx^{]|jnbji^zSxkY_{jMixw||au`x|XXjqzraad~m[cybov|pzTqt]cpW~vtk~z}zhtpnYqkrcum}tOmqy|vejnqp_npSXUjKsv~}t`dSXue`qxwbW/zaZcSwϖ jWYr{WuB9ōbX^AmEXZ؅h~gxԮ,Rm\_Y\PovZb}BKeuzamd`]rBNS>w{quwoOSP*kydKkqYq~}^aebThpd`SJIS]QIlQcVCxpŹy|mPN>.'++"';NOYtriy⭎ɛbWUNJbsqyuû~hID>+.+ $>53>UћǼ~reZQE=611,*,0669BGOW[dq|̭yb\MJ@BNSUTI[b`vŸ|fPDB?CD'0G`|βz~ʩ¢eWJ9Zm°vok`]M<9*!&9K<4@?I^pʵpkkcU6>:FUes|wsptkcifoofvxt{xvtR2('7BCW~sdbaW\pvsaX?1/9Ted|xmg[`paj~ll\VTMLFGT\_cgnqp~}s{uxuq{pnxy}rrm``QCNHHTLITZ\\Zanrwwwiehhstp~nee`fhTTe`TTMKVNOcchy}zvlnh`a`acjqu~pprlmeVYUP]_]fnlca^\agt~zrqibjngjicmpmtw|zstibeddlmpxxmppjx|w~{zwtqrsonljpnmsts|||~{}~~|{{}z}zzwrrssszzx~{x|yx~}{~}}z{}y|y{z{~{~||{}~~}~}|z~}z}{z|}~~yx{yx{{y}}xxxvuuxyy|{z{{z{y{}||}}{y}~z{~}}}{|}|}}~~~}~~~~~~~~~~~}}~}|}||}{||z{|zzzyyyyyxxwxxxwxwxxxxxxxxxxxxxxxxxyyyyyyzzyzzyyzzz{zz{z|{z{{|{{{{|||{{{{|{z{{{|{{{|{{||{{|}|{{{{{{||||}}||||}}|~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}|||||||{|{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyzyyzzzzzzzzzzzzzz{{{{{{{{{{{||||||||||||||}}}}}}}}~~~~~~~~~~~~~~~~~~}}}}}}}|||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}||||||||||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|||||||||||||||}}}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}||||||||||||||||||||||||||||||||{{|||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}|||||||||||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{||||||||||||||||||}}}}}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~DISPl(     ff` f `˻ `뻰 f  f ˶`kfkf `` `f`˻ff  DISP(Wahee poof)LISTINFOISBJSound effect. 1992 Hanna-Barbera Productions, Inc. All Rights Reserved. 1992 Turner Broadcasting System, Inc. All Rights Reserved.xevil-2.02r2.orig/win32/res/FROG_DEA.BMP0100644000175000017500000000242606604100416016604 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U/,,,//,,////,,,,,/,,,//,,,,,,/,,,,/,,,/,,,,,,,//,,,,,,,,/,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/FROG_SHE.BMP0100644000175000017500000000225606604044316016641 0ustar aaronlaaronlBM6( xhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/GARROW_R.BMP0100644000175000017500000000242606620147176016674 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,~~~~,,,,,,,,,,~~~~~,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/GRENADE1.BMP0100644000175000017500000000246606604100416016530 0ustar aaronlaaronlBM66(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//, ,~,~~~~,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/GRENADE2.BMP0100644000175000017500000000216606604044316016534 0ustar aaronlaaronlBMv6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,/,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/GRENADE3.BMP0100644000175000017500000000246606604044316016540 0ustar aaronlaaronlBM66(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,~,,~~~~,~, ,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/GRENADE4.BMP0100644000175000017500000000246606604044316016541 0ustar aaronlaaronlBM66(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,/~,,,,,,,,,,,,/ ~,,,,,,,,,,,~~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/GRENADES.BMP0100644000175000017500000000260606604125474016601 0ustar aaronlaaronlBM6( PhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,~~~,~~~,,~,~,~,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HANDTOHA.BMP0100644000175000017500000000451206604044316016570 0ustar aaronlaaronlBMJ 6(1hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HELL_1.BMP0100644000175000017500000002550606604100416016346 0ustar aaronlaaronlBMF+6(dd'hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U™⽹™¾ƙ睘⽏⹸~⹸~繽Ɲơݏơޏ޸~~罘ƝơƝƝƝƝƝƝ™™Ɲ羽Ɲ띝Ɲ띝¾Ƙ™˜¡˜˜™˜Ɲ™™™睘˜ơ¾띘Ɲ˜™™똙Ɲ˜™뙘™iii™뾽Ƙi뙘i™¾ii™޹Ɲi˜Ɲi™ơƝơƝ˜™ƙ˜iƙ¾mmƝơƾ˜ƝƝ띝¡™immm띝™mmiiimƝimmiBminiơƝƘimmiimiimmi™ƝƝݎ™ƙmmmmBiiBBiB=iƝ؆T™immmmiBBBmmi™mơ[똾mmmmmiBiiBmmimiim띝Ɲ¾™mmmmiBBimmimmi™miiBimmmiimƙƝimnmiiimmiơ½ƝmimmmƝơmmin™ơƝƝ¾™nmmmmmimmiƝ˜ƙ¾mimmmiimmƝ™¡˜mmmmmiBimmƝ½~™miimimmimm˜Ɲ¾mmminmmm½i¾mnmiiƝ½Ɲ™˜¾ƝƝ罸™½Ɲ½½iơ½™ƙ½½Ɲ½™™nƝ™ƝƝƝƝ¡Ɲơ¾ƝơơƝƽ罽ƾơƝƝơƾ縏⹸ƝƾُƝơƝ⸏繸ơƝƝ޹繏珏ơơ~ơƝơ¡珸ƽݏ¾޴Ɲơxevil-2.02r2.orig/win32/res/HERO0.BMP0100644000175000017500000000546606604044316016230 0ustar aaronlaaronlBM6 6( 8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,||,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,|,,,潽,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ff潽,,,,,,,,,,,,,,,,,,ff潽,,,,,,,,,,,,,,,,ffff,潽,,,,,,,,,,,,,,fff,,潽,,,,,,,,,,,,,,ffff,,,潽,,,,,,,,,,,,,,fffff,f,,,,,,,,,,,,,fffffff,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,,,fff,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmmmmm,,,,,,,,,,,,,,,,,,,,,ffmmm,,,,,,,,,,,,,,,,,,mffmmm,,,,,,,,,,,,,,mmffmm,,,,,,,,,,,,mfffmmm,,,,,,,,,,mfffmmmmmm,,,,,,,,,,fffmm,mm,,,,,,,,,,,mfffmmm,,mmm,,,,,,,,,,,,,mfffmm,,,,,,,,,,,,,,,,,,,mfffmm,,,,,,,,,,,,,,,,,,,,mffmm,,,,,,,,,,,,,,,,,,,,,mfffmmm,,,,,,,,,,,,,,,,,,,,,,mfmmmm,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,m?mmm,,,,,,,,,,,,,,,,,,,,,,,,??mmm,,,,,,,,,,,,,,,,,,,,,,,?????m,,,,,,,,,,,,,,,,,,,,,,,? ? ??,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ?? ,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,?? ? ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HERO0B.BMP0100644000175000017500000000546606604044316016332 0ustar aaronlaaronlBM6 6( 8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,潽,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,|||||f,,,,,潽,,,,,,ff,,,,,潽,,,,,,,,,,,,fff,,,,潽,,,,,,,,,,,,,ffff,,,,,,,,,,,,,,,,,ff,,,,,,,,,,,,,,,ffff,,,,,,,,,,,,,fffffff,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,fffffff,,,,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,ffffmm,,,,,,,,,,,,,,,,,,mfffffmm,,,,,,,,,,,,,,,,mffffmm,,,,,,,,,,,,,,mfffmm,,,,,,,,,,,,mfffmmmmm,,,,,,,,,,mffmmmmmm,,,,,,,,,,mffmm,,mm,,,,,,,,,,,mffmm,,,mm,,,,,,,,,,,mfffmm,,,mmm,,,,,,,,,,,,,mffffmmm,,,,,,,,,,,,,,,,,,,,mmffffmm,,,,,,,,,,,,,,,,,,,,,,mmffff,,,,,,,,,,,,,,,,,,,,,,,,mfmm,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,m?mmm,,,,,,,,,,,,,,,,,,,,,,,,??mmm,,,,,,,,,,,,,,,,,,,,,,,?????m,,,,,,,,,,,,,,,,,,,,,,,? ? ??,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ?? ,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,?? ? ,,,,,,xevil-2.02r2.orig/win32/res/HERO0C.BMP0100644000175000017500000000546606604044316016333 0ustar aaronlaaronlBM6 6( 8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,潽,潽,,,,,,,,,,潽||潽,,,,,,潽||f,,,,,,||ff,,,,,,,|||fff,,,,,,,,|ffffff,,,,,,,,,,fffff,,,,,,,,,,,,fffff,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,fffffff,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,fffffff,,,,,,,,,,,,,,,,,,,,fffffff,,,,,,,,,,,,,,,,,,,,,ffffmm,,,,,,,,,,,,,,,,,,,,ffffmmm,,,,,,,,,,,,,,,,,,,fmmmm,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,mmf,,,,,,,,,,,,,,,,,,,,,mmmmf,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,mmmmf,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,mfmm,,,,,,,,,,,,,,,,,,,,,,fmm,,,,,,,,,,,,,,,,,,,,,,ffmm,,,,,,,,,,,,,,,,,,,,,,,ffmmmm,,,,,,,,,,,,,,,,,,,,,,,ffffm,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,m?mmm,,,,,,,,,,,,,,,,,,,,,,,,??mmm,,,,,,,,,,,,,,,,,,,,,,,?????m,,,,,,,,,,,,,,,,,,,,,,,? ? ??,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ?? ,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,?? ? ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HERO0D.BMP0100644000175000017500000000546606604044316016334 0ustar aaronlaaronlBM6 6( 8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,潽潽,,,,,,,,,,,,,,,,,,,,,,潽||,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,,,,f|,,,,,,,,,,,,,,,,,,,,,f|,,,,,,,,,,,,,,,,,,,f|,,,,,,,,,,,,,,,,,,ff,,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,fffffff,,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,fffffff,,,,,,,,,,,,,,,,,fffffffffff,,,,,,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,,,fffffff,,,,,,,,,,,,,,,,,,,,,,,ffff,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,mmmmmm,,,,,,,,,,,,,,,,,mmmmm,,,,,,,,,,,,,,mmffffmmm,,,,,,,,,,,mmfffffmm,,,,,,,,,,mfffffmmmm,,,,,,,,,mmmffffmmmm,,,,,,,,,mmmmmmffff,,mmmm,,,,,,,,,,mmmf,,,,,,,,,,,,,,,,,mmmmff,,,,,,,,,,,,,,,,,,mmmff,,,,,,,,,,,,,,,,,,,mmmff,,,,,,,,,,,,,,,,,,,,mmmmff,,,,,,,,,,,,,,,,,,,,,mmmmmf,,,,,,,,,,,,,,,,,,,,,,,mmmmm,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,m?mmm,,,,,,,,,,,,,,,,,,,,,,,,??mmm,,,,,,,,,,,,,,,,,,,,,,,?????m,,,,,,,,,,,,,,,,,,,,,,,? ? ??,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ?? ,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,?? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HERO0E.BMP0100644000175000017500000000546606604044316016335 0ustar aaronlaaronlBM6 6( 8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,,||,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,|,,,,,,,,潽,,,,,,|,,,,,,,,,,,,,|,,,,,,,潽,,,,,,,,,,,,,,,,|,,,,,,,,,,,|,,,,,,,,,,,,,,,,,潽|,,,,,,,,,,,,,ff,,,,,,,,,,,,,,,,,ff,f,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,ffffffffff,,,,,,,,,,,,,,fffffffffff,,,,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,,ffff,,,,,,,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,mmmfff,,,,,,,,,,,,,,,,,,,mmmfffff,mm,,,,,,,,,,,,,,,mmfffffmm,,,,,,,,,,,,,mmfffffm,,,,,,,,,,,mmmfffffmm,,,,,,,,,mmmffffmmmm,,,,,,,,mmmmmfffmmm,,,,,,,mmmmmffffm,mmmm,,,,,,,,mmmfff,,mm,,,,,,,,,mmmfffm,,mm,,,,,,,,,,mmmffm,,,mmmm,,,,,,,,,,,,,mmmmf,,,,,,,,,,,,,,,,,,,,,,,mmmmmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,m?mmm,,,,,,,,,,,,,,,,,,,,,,,,??mmm,,,,,,,,,,,,,,,,,,,,,,,?????m,,,,,,,,,,,,,,,,,,,,,,,? ? ??,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ?? ,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,?? ? ,,,,,,xevil-2.02r2.orig/win32/res/HERO0F.BMP0100644000175000017500000000546606604044316016336 0ustar aaronlaaronlBM6 6( 8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|||,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,潽f|,,,,,,,,,,,,,潽|,,,,,,,,,潽,,,,,,,,,潽f,,,,,,,,,,fff,,,,,,,,,,,潽ff,,,,,,,,,,,,,ffff,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,,,,,,,fffffff,,,,,,,,,,,,,,,,,,,,,,,ffmmm,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,mmmmmm,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,mmmmfm,,,,,,,,,,,,,,,,mmmffmm,,,,,,,,,,,,,,,mmmffff,,,,,,,,,,,,,,,,,,mmmmff,,,,,,,,,,,,,,,,,,mmmfff,,,,,,,,,,,,,,,,,,,mmmfff,,,,,,,,,,,,,,,,,,,mmmff,,,,,,,,,,,,,,,,,,,,mmff,,,,,,,,,,,,,,,,,,,,,mmmff,,,,,,,,,,,,,,,,,,,,,,mmf,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,m?mmm,,,,,,,,,,,,,,,,,,,,,,,,??mmm,,,,,,,,,,,,,,,,,,,,,,,?????m,,,,,,,,,,,,,,,,,,,,,,,? ? ??,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ?? ,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,?? ? ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HERO0_AT.BMP0100644000175000017500000000602606604044316016605 0ustar aaronlaaronlBM 6("8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|潽,,,,,,,,,,,,,,,|||,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,潽,,,,,,,,,,,,,,,,,,,潽,,,,潽,,,,,,,,,,,,,,,,,,,|,,,,潽,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,|,,,潽,,,,,,,,,,,,,,,,,,,,|,潽,,,,,,,,,,,,,,,,,,,|,潽,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,f,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,ffffffffff,,,,,,,,,,,,,,,,,,,,fffffffffff,,,,,,,,,,,,,,,,,,,,ffffffffff,,,,,,,,,,,,,,,,,,,,,ffffffffff,,,,,,,,,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,mmmfff,,,,,,,,,,,,,,,,,,,,mmmmfffffmm,,,,,,,,,,,,,,,,,,mmfffffmm,,,,,,,,,,,,,,,,mmfffffmmm,,,,,,,,,,,,,,,mmmmffffmmm,,,,,,,,,,,,,,mmffffmmm,,,,,,,,,,,,,,mmmfmm,,,,,,,,,,,,,,,mmmmffmm,,,,,,,,,,,,,,,,mmmffmmmm,,,,,,,,,,,,,,,,,,mmmff,,,,,,,,,,,,,,,,,,,,,,,mmmff,,,,,,,,,,,,,,,,,,,,,,,,mmmmf,,,,,,,,,,,,,,,,,,,,,,,,,mmmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,m?mmm,,,,,,,,,,,,,,,,,,,,,,,,,,??mmm,,,,,,,,,,,,,,,,,,,,,,,,,?????m,,,,,,,,,,,,,,,,,,,,,,,,,? ? ??,,,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?? ? ,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HERO10.BMP0100644000175000017500000000431606604044320016275 0ustar aaronlaaronlBM6(*hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,|e,,,||ee,,|fe,,,|eee,,,,,eeee,,|,,,,,,eeeee,,,,,,,,,,eeeee,,,|,,,,,,,,eeee,,,,,,,,eeeeeeeeeee,,,,,,,,,eeeeeeeeeeee,,,,,,,,eeeeeeeeeeeeeee,,,,,,,,eeeeeeeeeeeeeeeee,,,,,,,,eeeeeeeeeeeeeeeee,,,,,,,,eeeeeeeeeeee,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,f,,,,,,,,,,,,,,,,,mmmmffffff,,,,,,,,,,,,,,,,mmmfffff,,,,,,,,,,,,,,,mmmfffffm,,,,,,,,,,,,,mmfffffmmm,,,,,,,,,,mmffffffm,,,,,,,,mmmffffffm,,,,,,mmmfffffffm,,,,,mmmmmfffffffffm,,,,mmmmmfffffffmmmm,,,mmfffffffmmm,,,mmmfff,mmm,,,,mmmmffff,,,,mm,,,,,,mmmmfmmmmm,,,,mmm,,,,,,,,mmmmfmmm,,,,,mm,,,,,,,,,,,fmmm,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,m?mmm,,,,,,,,,,,,,,,,,,,,??mmm,,,,,,,,,,,,,,,,,,,?????m,,,,,,,,,,,,,,,,,,,? ? ??,,,,,,,,,,,,,,,,,,,,? ? ?? ?? ,,,,,,,,,,,,,,,,,,,? ? ?? ,,,,,,,,,,,,,,,,,,,,,,,?? ? ,,,,,,,xevil-2.02r2.orig/win32/res/HERO10B.BMP0100644000175000017500000000431606604044320016377 0ustar aaronlaaronlBM6(*hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,ffffff,,,,,,,,,,fffffff,,,,,,,,,ffffffffffffff,,,,,,,,,fffffeefffffff,,,,,,,,,fefeefffffffffff,,,,,,,,,feeeffffffff,,,,,,,,,,eeffffeeeee,,,,,,,,,,,,,eeemm~ee,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,mmmff,,,,,,,,,,,,,,mmmmfff,,,,,,,,,,,,,mmmmfffff,,,,,,,,,,,,mmfffffffmm,,,,,,,,,,,mmmffffffffmmmm,,,,,,,,,mmffffffmm,,,,,,,,mmffffffmm,,,,,,,,mmmffffffmm,,,,,,,,,mmmfffff,mm,,,,,,,,,,mmffff,mmm,,,,,,,,,,,mmfff,,,,,,,,,,,,,,,,mmmmmm,,,,,,,,,,,,,,,,,,mmmmmmmmm,,,,,,,,,,,,,,,,,,mmmmm,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,m?mmm,,,,,,,,,,,,,,,,,,,,??mmm,,,,,,,,,,,,,,,,,,,?????m,,,,,,,,,,,,,,,,,,,? ? ??,,,,,,,,,,,,,,,,,,,,? ? ?? ?? ,,,,,,,,,,,,,,,,,,,? ? ?? ,,,,,,,,,,,,,,,,,,,,,,,?? ? ,,,,,,,,xevil-2.02r2.orig/win32/res/HEROATT.WAV0100644000175000017500000000556006430176714016540 0ustar aaronlaaronlRIFFh WAVEfmt ++fact6 data6 }tt~|}yxz~{|nlxv{qs~r`fqlo}|sou||y|{upnrxxss{{uzhblfXKkwjiz|srohqwti`dppic`ccdjpv{tmxmxiPN_njlzyhVQkzpjw|gHAPXX\[X\ZWZYX`u̡¢HH`2/Cax`yzpp($PlknP(dTUmN,HŲ:'lEIc0$(.>TlE9hqP_ϧgxo6\hA !=`p>L͸L=\YT[]`mY#j\,^t\>EY(0T[H96H`wCVwA0nQ'bH:X]YM?CVvuQ`F64PX4+1BTVN7Gke)`p<.j}t[LXpwb\PBCPVE/%0Kf||x~DRv{kG>hzh_e|}X<885:@9!3Lcsxpfnx~^FgoP.2]|kj}ή|G'$6@04Qjy|spsy}ݸ\\`QE@,4I\q~mD(;DFC8*1Phv{wz~truuv~ѸmTC@A?;:>HV`flyvh^YSH??CFMWXX`ktx}||xrnonnptxvuz༒bQcja\P:'$0>Layqmonh^O3%m m,,, m |=zz |ʽʽ|`||mlm ,,, m" |z Sʽ||9=m ,,,  mn&!=|m/zSS;|l==fm ,,,  m.""&Rn ;nʾn|qRl:? ,,,  m&""&yɴ y9z;f;|JRze ,,,  ;G"""&zzzz`zdzSz;S|ʽJRzf ,,,  m!Jzz|{zz{mSz;;n|ʽJSze ,,,  m y zm=z;nr;|ʽJz:? ,,,, , n y z|df;'S;|||||=lf, ,,,,,,, ?FF 1=mxq z9zSSz| ||=1 =e,,,,,,,,, mrpllm,q |z{m |d|mlmm>;,,,,,,,,, E #n,yz スz |½| :,,,,,,,,,, , #,= =q||ʽx#n ,,,,,,,,,,,,,, , | |,#|||,,,,,,,,,,,,,,#n| | #n | #n,,,,,,,,,,,,,# | |##::K#n { #,,,,,,,,,,,,,, | # ## ,,,,,,,,,,,,,,, || || #n | ,,,,,,,,,#n, #n| | |#n|# ,,,,,,,,,# # | #| |m %,,,,,,,,,, ql U| | =| | | =<#n,,,,, m #n  mq qzq #,,,,, qzz| | # | m| z|,,,,,,, =zzm |q ||||9m m| qzzz  ,#n, zzzT q m #nU |m =zzzq ,# FzSq | mm # |=zzm zzSz ,,,, SSzSz= ,#n ,, ,,mzqmzz= mSzSq#n =SSSzSzzF #, ,#n zq , zzzzz=,,SSSS # qSSSSSzzzzmm ,#=zrU , zzzzzz9#n, SSS=,,,, FSSSSSSzzzz=,,,<=zzzq,,,mzzzzSU#,=SF ,,,#n =SSSSSSSSz #n,mzzzq #n,FzSSzS ,, = , ,,,#, FSSSSSSS #,qzzzz ##n SSSSS ,, ,#n,,,,,,,,,  FmqJm,,, SSzSS ,,#SSSSS #n,,,#,,,,,,,,, ,#n ,, SSSSq ,, === #,,,,,,,,,,,,,,,,,#, ,#n, =SSSq , ,#n, ,,,,,,,,,,,,,,,,,,,,,, ,#,,,,,,, ,#, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#n, ,#n,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#, ,#,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIBOMB0.BMP0100644000175000017500000000341606604044320016417 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,~~~~~~~~~~~~~~,,~~~~,~~~~~~~~~~~~~~~~~~~~~~~~~~~////////~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~  ~~~~  ~~~~~~~  ~~~~~  ~~~~ ~~~~~~~~,~~~~,,~~~~,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIBOMB1.BMP0100644000175000017500000000341606604044320016420 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,~~~~~~~~~~~~~~,,~~~~,~~~~~~~~~~~~~~~~~~~~~~~~~~~///////~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~ ~~~~~ ~~~~ ~~~~~~~~,~~~~,,~~~~,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIBOMB2.BMP0100644000175000017500000000341606604044320016421 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,~~~~~~~~~~~~~~,,~~~~,~~~~~~~~~~~~~~~~~~~~~~~~~~~//////~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~ ~~~~~  ~~~~ ~~~~~~~~,~~~~,,~~~~,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIBOMB3.BMP0100644000175000017500000000341606604044320016422 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,~~~~~~~~~~~~~~,,~~~~,~~~~~~~~~~~~~~~~~~~~~~~~~~~////~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~  ~~~~ ~~~~~~~ ~~~~~ ~~~~ ~~~~~~~~,~~~~,,~~~~,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIBOMB4.BMP0100644000175000017500000000341606604044320016423 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,~~~~~~~~~~~~~~,,~~~~,~~~~~~~~~~~~~~~~~~~~~~~~~~~///~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~  ~~~~~ ~~~~ ~~~~~~~~,~~~~,,~~~~,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIBOMB5.BMP0100644000175000017500000000341606604044320016424 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,~~~~~~~~~~~~~~,,~~~~,~~~~~~~~~~~~~~~~~~~~~~~~~~~/~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ ~~~~ ~~~~~~~ ~~~~~ ~~~~ ~~~~~~~~,~~~~,,~~~~,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIBOMB6.BMP0100644000175000017500000000341606604044320016425 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,~~~~,,,,,,,,,,,,~~~~,,,,,,,,,,,~~~~,,,,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,~~~~~~~~,,,,,,,,,,~~~~,,,,,,,,,,,~~~~,,,,,,,,,,,,~~~~,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIBOMBBL.BMP0100644000175000017500000000341606604044320016555 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,~~~~~~~~~~~~~~,,~~~~,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,~~~~,,~~~~,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIDOG0.BMP0100644000175000017500000000302606604044316016313 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U|,,,,,,,,,,,,,|,,,,,,, |,|,,,,,,,,,| ,|,,,,,, |,,,,,,,,, ,,,,,,, |,,,,,,,| |,,,,,,, |,,,,,,| ,,,,,,,,, ||,,,|| |,,,!,,,, |,,,,!,,,,, |,,| !,,,,, | | !,,,,,, | !,,,,,, | !q,,,,,, , , ,, ,,,,,,,, |qq ,, ,,,,,,,,,, | , ,,,,,,,,,, | | ,,|,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,,, |, |,,,,,,,,,,,,,,,,,,,, ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIDOG2.BMP0100644000175000017500000000274606604044320016320 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,|, |,,,,,,,,,,,,,,,|,,| |,,,,,,,,,,, ,,| |,,,,,,,,,,, |,,,|| |,,,,,,,,,,,, |,,| |,,,,!,,,,, ||,| |,,,,!,,,,,, |,,| !,,,,,, | | !,,,,,,, | !,,,,,, | !q,,,,,, , ,, ,,,, |qq ,, ,,,,,,,,,, | ,,,,,,,,,,,, | | ,,|,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,,, |, |,,,,,,,,,,,,,,,,,,,, ,, ,,,,,,,,xevil-2.02r2.orig/win32/res/HIDOG21.BMP0100644000175000017500000000302606604044320016371 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,, |,,,,, ,,,,,, |,,,,,,,, ,,, |,,,,,,,,,, ||,,,,,,,, |,,,,,,,,,, |,,,,,,,,,,, |,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,, |,,,,,,,,,,,, |,,,,,,, |,,,,, | | |,,,,,,| | |,,, | | | ||| |, | | q | ,,|,,,,,| | q! |,,,,|,,,, q! |,,,,,|,,,, ,! ,,,,,,,,,,,,, ,,!!!,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIDOG21B.BMP0100644000175000017500000000302606604044320016473 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,, ,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,, |,,,,,,,,,,,,, |,,,,,,,,,,,, |,,,,,,,,, |,,,,,,,, ,, |,,,,,,,,, ,,,,, |,,,,,,,, ,,,,,,,,,,,,,,, ,,,,,,,,, ,,,,,,, | | ||,,,,,,| | |,,, | | | ||,,,, | | q | ,|,,,,| | q! |,,,,,,,,,,, q! |,,,,,,,,,,, ,! ,,,,,,,,,,,,, ,,!!!,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,|,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIVE.MID0100644000175000017500000011530406624662062016140 0ustar aaronlaaronlMThdMTrk.YT`All HiveQX/MTrk !HH(42),Snr(38),Tom(43/7/8,50&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*r&k*kI&*M&f*fa&*5&f*fb&*R&q*qf&*z&k*kI&*M&f*fa&*5&f*fb&*R&q*qf&*z&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*r&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*r&k*kI&*M&f*fa&*5&f*fb&*R&q*qf&*z&k*kI&*M&f*fa&*5&f*fb&*R&q*qf&*z&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*r&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*iZ&*&k*kn&*&i*iZ&*&k*kn&*T2kn20kn0/kn/+kn+B&i*i&*Z*f&f *&c*k&k*&Z*k&k**&F&i*i&*Z*f&f *&c*k&k*&Z*k&k**&F&i*i&*Z*f&f *&c*k&k*&Z*k&k**&F&i*i&*Z*f&f *&c*k&k*&Z*k&k**&>&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*i,&*4*f&fg*&y*k&k*&R*k&kf*&z&i*i&*Z*f&f *&c*k&k*&Z*k&k**&F&i*i&*Z*f&f *&c*k&k*&Z*k&k**&F&i*i&*Z*f&f *&c*k&k*&Z*k&k**&F&i*i&*Z*f&f *&c*k&k*&Z*k&k**&>&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*i,&*4*f&fg*&y*k&k*&R*k&kf*&z&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*r&k*kI&*M&f*fa&*5&f*fb&*R&q*qf&*z&k*kI&*M&f*fa&*5&f*fb&*R&q*qf&*z&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*r&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*r&k*kI&*M&f*fa&*5&f*fb&*R&q*qf&*z&k*kI&*M&f*fa&*5&f*fb&*R&q*qf&*z&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*r&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*iZ&*&k*kn&*&i*iZ&*&k*kn&*T2kn20kn0/kn/+kn+B&i*i&*Z*f&f *&c*k&k*&Z*k&k**&F&i*i&*Z*f&f *&c*k&k*&Z*k&k**&F&i*i&*Z*f&f *&c*k&k*&Z*k&k**&F&i*i&*Z*f&f *&c*k&k*&Z*k&k**&>&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*T&i*i,&*4*f&fg*&y*k&k*&R*k&kf*&z&i*iZ&*<&f*fQ&*E&k*kZ&*Z&k*kn&*r&k*kI&*M&f*fa&*5&f*fb&*R&q*qf&*z&k*kI&*M&f*fa&*5&f*fb&*R&q*qf&*X&k*kI&*M&f*fa&*5&f*fb&*R&q*qf&*z&k*kI&*M&f*fa&*5&f*fb&*R&q*qf&*L&f*fa&*&f*fb&**q&qf*&/MTrkb! Windbells& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t@& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t@& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t@& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t@& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]L@2VZ_t& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t@& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t@& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t@& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t@& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t@& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t@& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]L@& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t@& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_&VZ_t& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]L@2VZ_t& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t@& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_t& r-E<;h9(`i:u b@5hEa|~J_>/N*Ukdyk (6j>e R$xv+df!"Y~@G3H.B>T'+6 kd_v L+%y6_hE hV;@[r-Dn]K/: *UEu@b+[3~J3UN|@f/\hWc;FoIps_Ru]]XE.@_w@pC}cU*I|`G@/)Tk;FV>T.ROV_P/i/iI -d>Cyo:mD9D9TXI}-tq8X&@p=0_RAsr-Kwz+:%c?%#LON! <;@95 -!".4)=0hz -D9#Ljo2E.>e@Z>oM,;@"W@yk{`B&hE~'2S>E*U@hE2J-tCD@=W@ZD#Lr-]~VZ_/MTrk! High Strings0@PbWb/RDZDePW1SR[RIRZ(S[P_W_;RJZJUPWSL[LPRZFS[-`xR`P]W]JRJZJVSY[YPWJRZAS[ PfWfORUZU@PWSR[RRZ4S[&`|K``|R``|J`*`|A`:PiWiLRHZHQS[[[PWLRZS[PbWb/RDZDePW1SR[RIRZ(S[P_W_;RJZJUPWSL[LPRZFS[-`xR`P]W]JRJZJVSY[YPWJRZAS[ PfWfORUZU@PWSR[RRZ4S[&`|K``|R``|J`*`|A`:PiWiLRHZHQS[[[PWLRZS[?GiSiZGSf2fo>2D+k7k+7E6f*fo6*%*i6iZ*6<*f6fQ*6E*k6kZ*6Z*k6kn*6r*i6iZ*6<*f6fQ*6E*k6kZ*6Z*k6kn*6r*k6kI*6M*f6fa*65*f6fb*6R*q6qf*6z*k6kI*6M*f6fa*65*f6fb*6R*q6qf*6 *k6k*657f+fo7+D*k6k*657f+fo7+D1k=k1=5>f2fo>2D+k7k+7E6f*fo6*%*i6iZ*6<*f6fQ*6E*k6kZ*6Z*k6kn*6r7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cr7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cr7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cr7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cr8iDiZ8D<8fDfQ8DE8kDkZ8DZ8kDkn8Dr8iDiZ8D<8fDfQ8DE8kDkZ8DZ8kDkn8Dr8iDiZ8D<8fDfQ8DE8kDkZ8DZ8kDkn8Dr8iDiZ8D<8fDfQ8DE8kDkZ8DZ8kDkn8Dr9iEiZ9E<9fEfQ9EE9kEkZ9EZ9kEkn9Er9iEiZ9E<9fEfQ9EE9kEkZ9EZ9kEkn9Er9iEi9ER9kFk"9F>5iAi5AR4k@k"4@>3k?kn3?2k>kn2>1k=kn1=0kk2k>2Z=k1k*=1F*i6i*6Z7f+f 7+c>k2k>2Z=k1k*=1F*i6i*6Z7f+f 7+c:k.k:.Z;k/k*;/F1i=i1=Z>f2f >2cAk5kA5ZBk6k*B6>7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cz7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cr7iCi,7C4Df8fgD8y?k3k?3R>k2kf>2z*i6i*6Z7f+f 7+c>k2k>2Z=k1k*=1F*i6i*6Z7f+f 7+c>k2k>2Z=k1k*=1F*i6i*6Z7f+f 7+c:k.k:.Z;k/k*;/F1i=i1=Z>f2f >2cAk5kA5ZBk6k*B6>7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cz7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cr7iCi,7C4Df8fgD8y?k3k?3R>k2kf>2z*i6iZ*6<*f6fQ*6E*k6kZ*6Z*k6kn*6r*k6kI*6M*f6fa*65*f6fb*6R*q6qf*6z*k6kI*6M*f6fa*65*f6fb*6R*q6qf*6 *k6k*657f+fo7+D*k6k*657f+fo7+D1k=k1=5>f2fo>2D+k7k+7E6f*fo6*%*i6iZ*6<*f6fQ*6E*k6kZ*6Z*k6kn*6r*i6iZ*6<*f6fQ*6E*k6kZ*6Z*k6kn*6r*k6kI*6M*f6fa*65*f6fb*6R*q6qf*6z*k6kI*6M*f6fa*65*f6fb*6R*q6qf*6 *k6k*657f+fo7+D*k6k*657f+fo7+D1k=k1=5>f2fo>2D+k7k+7E6f*fo6*%*i6iZ*6<*f6fQ*6E*k6kZ*6Z*k6kn*6r7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cr7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cr7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cr7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cr8iDiZ8D<8fDfQ8DE8kDkZ8DZ8kDkn8Dr8iDiZ8D<8fDfQ8DE8kDkZ8DZ8kDkn8Dr8iDiZ8D<8fDfQ8DE8kDkZ8DZ8kDkn8Dr8iDiZ8D<8fDfQ8DE8kDkZ8DZ8kDkn8Dr7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cr7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cr8iDiZ8D<8fDfQ8DE8kDkZ8DZ8kDkn8Dr8iDiZ8D<8fDfQ8DE8kDkZ8DZ8kDkn8Dr9iEiZ9E<9fEfQ9EE9kEkZ9EZ9kEkn9Er9iEiZ9E<9fEfQ9EE9kEkZ9EZ9kEkn9Er9iEi9ER9kFk"9F>5iAi5AR4k@k"4@>3k?kn3?2k>kn2>1k=kn1=0kk2k>2Z=k1k*=1F*i6i*6Z7f+f 7+c>k2k>2Z=k1k*=1F*i6i*6Z7f+f 7+c:k.k:.Z;k/k*;/F1i=i1=Z>f2f >2cAk5kA5ZBk6k*B6>7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cz7iCiZ7C<7fCfQ7CE7kCkZ7CZ7kCkn7Cr7iCi,7C4Df8fgD8y?k3k?3R>k2kf>2z*i6iZ*6<*f6fQ*6E*k6kZ*6Z*k6kn*6r*k6kI*6M*f6fa*65*f6fb*6R*q6qf*6z*k6kI*6M*f6fa*65*f6fb*6R*q6qf*6 *k6k*657f+fo7+D*k6k*657f+fo7+D1k=k1=5>f2fo>2D5kAk5AEBf6foB6%CiOifCO/MTrk! Low Strings06*I*6C7+I+7=1=+10 <]<0O6Bc6B5A55AK=k 1i=1?6*I*6C7+I+7=1=+10 <]<0O6Bc6B5A55AK=k 1i=1?=1I1=C=1I1==1=+18>2I2>C>2I2>>2>+28?3I3?C?3I3??3"?+38?353?>29-K2>O-98,~6*,8*6C7+I+7=1=+10 <]<0O6Bc6B5A55AK=k 1i=1?6*I*6C7+I+7=1=+10 <]<0O6Bc6B5A55AK=k 1i=1?6*I*6C7+I+7=1=+10 <]<0O6Bc6B5A55AK=k 1i=1?6*I*6C7+I+7=1=+10 <]<0O6Bc6B5A55AK=k 1i=1?=1I1=C=1I1==1=+18>2I2>C>2I2>>2>+28=1I1=C=1I1=q>2I2>C>2I2>q?3I3?C?3I3??3"?+38?353?>29-K2>O-98,~6*,8*6C7+I+7=1=+10 <]<0O6Bc6B5A55AK=k 1i=1?6*I*6C7+I+7=1=+10 <]<0O6B6B 7C|C7o:F|F:oG;|G;oI=|I=/MTrk! Crash 1 (57)T9"9^9"9^9"9^9"99"99"9 9"99"929"99"9 9"99"929"99"9 9"9<9"99R99R99R99R9b9"9^9"9^9"9^9"9^9"9^9"9^9"9^9"99"99"9 9"99"929"99"9 9"99"929"99"99"99"99"99"9 9"9<9"99R99R99R99R9b9"9^9"9^9"9^9"9^9"9/MTrk! Tubular BellsPRO9{P N<O(RJ"NbQD?R]P<QTUPS[T)RRS"R VdV9TRS9{T R<S(QJ"RbPD?Q]O<P)O;PRO9{P N<O(RJ"NbQD?R]P<QTUPS[T)RRS"R VdV9TRS9{T R<S(QJ"RbPD?Q]O<P)O/xevil-2.02r2.orig/win32/res/HIDOG22.BMP0100644000175000017500000000302606604044320016372 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,|,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,, ,,!!!,,,,,,,,, ,! ,,,,,,,,,, q! |,,,,,|,,,| | q! |,,,,|,, | | q | ,,|,,,, | | | ||| |,,,| | |,, | | |,,,,, |,,,,,,,,,,, |,,,,,,,,,,,,, |,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,, |,,,,,,,,,,,,,, |,,,,,,,,,,, |,,,,,,,,, ||,,,,,,, ,,, |,,,,,,, ,,,,,, |,,,,,,,,,,,,,,,,,,, |xevil-2.02r2.orig/win32/res/HIDOG22B.BMP0100644000175000017500000000302606604044320016474 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,|,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,, ,,!!!,,,,,,,,, ,! ,,,,,,,,,, q! |,,,,,,,,,,| | q! |,,,,,,,,, | | q | ,|,,, | | | ||,,,,,,| | |,, | | ||,,,,, ,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,,, ,,,,, |,,,,,,,, ,, |,,,,,,,,, |,,,,,,,,, |,,,,,,,,,, |,,,,,,,,,,,, |,,,,,,,,,,,, ,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIDOG2_A.BMP0100644000175000017500000000274606604044320016560 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,|, |,,,,,,,,,,,,,,,|,,| |,,,,,,,,,,, ,,| |,,,,,,,,,,, |,,,|| |,,,,,,,,,,,, |,,| |,,,,,,,,,,, ||,| || ,,,,,, | ,,,,,,, | , ,,,,,,, |!q,,,,,,,, |q,,,,,,, |q,,,,,,, ,,,, q , , , ,,,,,,,,,, | ,,,,,,,,,,,,, ,,,,,,,,,,,, ||| |,,,,,,,,,,,, | | ,,,,,,,,,,,,,,, | ,,,,,,,,,,,,, ,|| ,,,,,xevil-2.02r2.orig/win32/res/HIDOGDEA.BMP0100644000175000017500000000260606604044320016543 0ustar aaronlaaronlBM6(PhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U ,,////// | |,,,,,,, , // | |,,,,,,,, / |/ | ,,|,,, / / // ,,, / / /|qq ! ,,,, / / // !, ,,, / |,!!,,,,,, / ||,,,|| |,,,,,,,, |,,,,,,| /| |,,,,,,, |,,,,,,,| |,,| ,,,,, |,,,,,,,,, ,,,,,, |,|,,,,,,,,,| ,|,,,,,|,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIDOOR2.BMP0100644000175000017500000000406606604044320016447 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U||| |||||||||||||||||||||||||||| | |||||||||||||||||||||||||||| | |||||||||||||||||||||||||||| | |||| |||||| | | ||||||||||||||||||| ||||| | ||||||||||||||||||||| ||||| | ||||||||||||||||||||||||||| ||||| | ||||||||||||||||| |||| | | || | | | | | | | ||| | |||||||||||||||| ||||| | ||||||||||||||| |||| | | || | ||| | |||||||||||||||||| ||||| | | | | | | | ||| | ||||||||||||||||||||| ||||| | ||||||||||||||||||||| ||||| | |||||||||||||||||||| ||||| | | ||||||||||||||||||| ||||| | ||||||||||||||||||||| ||||| | ||||||||||||||||||||| ||||| | ||||||||||||||||||||| ||||| | ||||||||||||||||||||| ||||| | ||||||||||||||||||||||||||| | |||||||||||||||||||| | |||| |||||| | |||||||||||||||||||| || | || | || | | || | | |||||||||||||||||||| || | || | || | xevil-2.02r2.orig/win32/res/HIFIREDE.BMP0100644000175000017500000002406606604044320016562 0ustar aaronlaaronlBM6(6(^`$hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// //,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,// ///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,/ //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /,,,,,,,,,,,,,,,,,,,,,// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /,,,,,,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///// //,,,,,,,,,,,,,,,,,,,,/// /,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// //,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// //,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// //,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ///////,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// /////,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// // ////,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// /// ////,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// ////,,,,,,,,,,,,,,,,,,,,,,/////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////// ///,,,,,,,,,,,,,,,,,,,,,,,,//////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,//// //////////////,,,,,,,,,,,,,,,,,,,,,////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// // ////////////,,,,,,,,,,,,,,,,,,//////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// /////////////,,,,,,,,,,,/////////// ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////// ///////////////,,,,,,,////////////// /////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////////// ////////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,//////////////////// //////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////// ////////// ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,////////// //////// ////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,/ ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,/ /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,///// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,//// /,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,///// //,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,//////////,,,,,,,,,,,,,,,,,,,,,,,,,,///// //,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,/// /////,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,/// ////,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,,/////// ////,,,,,,,,,,,,,,,,,,,,,,,/////// /,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,,/////// ///,,,,,,,,,,,,,,,,,,,,,,,,///// //,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,,,,,,,//// ///,,,,,,,,,,,,,,,,,,,,,,,,,//// //,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,//// ///,,,,,,,,,,,,,,,,,,,,,,,,/// ///,,,,,,,,,,,,,,,,/// //,,,,,,,,,,,,,,,,,,,,,/////// /////,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,//// //,,,,,,,,,,,,,,,,,,,,//////// //////,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,//// ///,,,,,,,,,,,,,,,,,,//////// /////////,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,//// ///,,,,,,,,,,,,,,,,///////// ////////,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,/////////////// / ////// /,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,////////,,,,,,,,,,,,,,,/////////////// / // ///,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,///////////,,,,,,,,,////////////// //////////,,,,,,,,,,,,,,,,/// // ///,,,,,,,,,,,,////////////,,,,,,,,,///////// /// //////////,,,,,,,,,,,,//// //// ////,,,,,,,,,,,,// ///////////////////////// ///////,,,,,,,///////////////////,,,,,,,,,,,,,// //////////////////////// //////,,////////////////////////,,,,,,,,,,,,,/////// ///// ////////// ////// ///////////////////////////,,,,,,,,,,,,,,,,,/////// //// /////// /////// ////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,//////// ////////// ////////// ////////// ///////////,,,,,,,,,,,,,,,,,,,,,,,,,,/////// //////////// ////////// //////// /////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////// /////// //////////// //////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////// ////// ////////////// ////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,////////////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,//////////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////// ////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// ////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// ////// /////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// /////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,// /////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/// //////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIFLAG.BMP0100644000175000017500000000324606604044320016332 0ustar aaronlaaronlBM6(phUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U~~~~~~~~~,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,~/,,,,,,,,,,,,,,,,,~///,,,,,,,,,,,,,,,~/////,,,,,,,,,,,,,~///////,,,,,,,,,,~//////////,,,,,,,,~////////////,,,,,,~////////////,,,,,,~/////////,,,,,,,,~///////,,,,,,,,,,,~////,,,,,,,,,,,,,~///,,,,,,,,,,,,,,,,~/,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIHERO22.BMP0100644000175000017500000000402606604044320016517 0ustar aaronlaaronlBM6(>hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,mmm,,,,,,,,,,mm,,,,,,,,,mm,,,,,,,,mm,,,,,,,,mmm,,,,,,,,mmm,,,,,,,,,mm,,,,,,,,,mmm,,,,,,,,mmm,,,,,,, mm,,,,, ,?mm,,,,, ??mmmm,,,?? mm,,, ??mmm,,? ?mmmm,,?? mmmm,,, ?mmm,,,? mm,,,,?mmmm,,,,mmm,,,,mmmf,,,mmff,,,fmmmff,,,ffmmmffff,,,fffmmfff,,,fffff,,,fffffff,,,fffff,,,ffffffm,,,fffffff,,,,fffffff,,,,,,,,m,,,,,,,,,,,,,,,ffff,,,,,,fffff,,,,,,,fffff,,,,,,,fffff,,,,,,,fffff,,,,,,,fffff,,,,,,,,fffff,,,,,,,ffff,,,,,,,fff,,,,,,,f,,,,,,,f,,,,,,,,f,,,,,,,,f,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIHERO4.BMP0100644000175000017500000000546606604044320016450 0ustar aaronlaaronlBM6 6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,潽,,,,,,,潽,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,潽,,,,,,,,,潽,,,,,潽,,,,,,,,,潽,,,,,潽,,,,,,,,,,,,,,,,,,,,,,ff,,,fff,,,,,,,,,,fff,,,fffff,,,,,,,,,ffff,,,fffff,,,,,,,,,fffff,ffffff,,,,,,,,,fffff,ffffff,,,,,,,,,fffff,ffffff,,,,,,,,,,ffff,ffffff,,,,,,,,,,ffff,fffff,,,,,,,,,,,ffff,ffff,,,,,,,,,,,fffffffff,,,,,,,,,,,ffffffffff,,,,,,,,,,,fffffffff,,,,,,,,,,,ffffffffff,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,feffff,,,,,,,,,,,,,,,efff,,,,,,,,,,,,,,ffe,,,,,,,,,,,,,,ffff,,,,,,,,,,,,,meff,,,,,,,,,,,,mffffff,,,,,,,,,,,,mfeee,,,,,,,,,,,,mefeeef,,,,,,,,,,,meeeemm,,,,,,,,,mefeeeeeem,,,,,,,,meeeem,,,,,,,,mm,,,,,,,mmmmffmm,,,,,,mmmmmmmmm,,,,,mm,mmmm,mm,,,,mm,mmmmmm,m,,,,mm,mmmm,m,,,,mm,mmm,m,,,,mm,mmmmmmm,mm,,,mmmm,mmmmmm,mmmm,,mmm,,,mm,,,mmm,,mm,,,m???m,,,mm,mm,, ?? ? ???,,,mmmm,,,, ?? ?,,,mmmm,,,, ? ???,,,mmmmm,,,,,,,,,,,,,,,,mmmmm,,,,,,,,,,,,,,,,,,mmmmm,,,,,,,,,,,,,,,,mmmmmm,,,,,,,,,,,,,,mmmmmm,,,,,,,,,,,,,,,,mmm,mmm,,,,,,,,,,,,,,,,mmm,xevil-2.02r2.orig/win32/res/HIHERO5.BMP0100644000175000017500000000602606604044320016442 0ustar aaronlaaronlBM 6("8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,潽,,,,,,,,,,,,,,,潽,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,潽,,,,,,,,,,,,,,,,,潽,,,,,潽,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ff,,,ffff,,,,,,,,,,,,,,,,ffff,,,fffff,,,,,,,,,,,,,,,fffff,,,ffffff,,,,,,,,,,,,,,,ffffff,fffffff,,,,,,,,,,,,,,,ffffff,fffffff,,,,,,,,,,,,,,,,fffff,fffffff,,,,,,,,,,,,,,,,fffff,ffffff,,,,,,,,,,,,,,,,,fffff,fffff,,,,,,,,,,,,,,m,,fffffffffff,m,,,,,,,,,,mmm,ffffffffffffmmm,,,,,,,mmm,fffffffffffmmm,,,,,,mmmfffffffffffmm,,,,,,mmm,fffffffffffmmm,,,,,,mm,,,mm,,,,,,mmm,mmm,,,,,,mm,mm,,,,,,mm,mm,,,,,,mm,,ffffff,,mm,,,,,,,mm,,,feffff,,mm,,,,,,,,mmm,,,efff,,mmm,,,,,,,,mmmm,ffe,mmmm,,,,,,,,,mm,ffff,mm,,,,,,,,,,mmeffm,,,,,,,,,,mmffffffm,,,,,,,,,,mmfeeem,,,,,,,,,,mmefeeefmm,,,,,,,,,,,mmmeeeemmm,,,,,,,,,,,,mmfeeeeemm,,,,,,,,,,,,,meeeem,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,mmmffm,,,,,,,,,,,,,,,mmmmmmmmmm,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,mmmmmm,,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,mmmmmmm,,,,,,,,,,,,,,,,,,,,,,,,mmmmmm,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,m???m,,,,,,,,,,,,,,,,,,,,,,,,, ?? ? ???,,,,,,,,,,,,,,,,,,,,,,,,,,, ?? ?,,,,,,,,,,,,,,,,,,,,,,,,,, ? ???,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIHERO_D.BMP0100644000175000017500000000332606604044320016620 0ustar aaronlaaronlBM6(8 hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,///mmmfmmmmmmmmmmmmmmmm///////,,,????mmm/mmmm/m/mfffffff,? ???//fm/////mfffffff/f, ?/?mmf/mm//mmffffff/f/?? /?mmm//m///mmmmmm//mmfffffffff? ???/fmm//mmmffff/////ffffff,,,,,,,,, ?/m//////ffffff/ff///,,,,,,,,,,,,,,,,??///////fff///ff///,,,,,,,,,,,,,,,,,,, ??mmmmm,,,,,/m////,,,,,,,,,,,,,,,,,,,,,,,, ,?,mm,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIHOME.BMP0100644000175000017500000000676606604044320016363 0ustar aaronlaaronlBM 6(04 hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,~~~~~~~~~~~,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,~~~~~~,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,, /// ,,,,,,,,,,,,,,,,,,,, // // ,,,,,,,,,,,,,,,,,,,, / / ,,,,,,,,,,,,,,,,,,,, / ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIHUGGER.BMP0100644000175000017500000000263606604044320016604 0ustar aaronlaaronlBM6(hhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,//,,,,,,,,,,,/,,,,,,//,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HILAUNCH.BMP0100644000175000017500000000412606604044320016571 0ustar aaronlaaronlBMV6(* hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~//~~~~~~~~~~//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// ~,,,,,,,,,,,,,,,~,,~~~~~~// ,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,~,,,,,,,,~~~~~~// ,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIMEDKIT.BMP0100644000175000017500000000242606604044320016575 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Uհⰰ///q/SSS/SSS#&&/&&/q//&#ⰰxevil-2.02r2.orig/win32/res/HININJA1.BMP0100644000175000017500000000466606604044320016550 0ustar aaronlaaronlBM 6(>hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,mm,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIPISTOL.BMP0100644000175000017500000000263606604044320016635 0ustar aaronlaaronlBM6(hhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,~,~~,,~~~~~~~~~~,~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HITEXTBL.BMP0100644000175000017500000000406606604044320016624 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xevil-2.02r2.orig/win32/res/HIWALK18.BMP0100644000175000017500000000526606604100420016526 0ustar aaronlaaronlBM 6( 4hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,~,,,,,,,,~,,,,,,,,,,,,,,,,,,~,,,,,,,,~,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~,,,,,,~~~~~~,,,,,,~~~~,,,,,,~~~~,,,,~~~~,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,~~~~~~~~,,,~~~~~~~~~~,,,,~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIWALK2B.BMP0100644000175000017500000000643606604044320016547 0ustar aaronlaaronlBM 6(JhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,~~~ ~~///~~~~~,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIWALK4.BMP0100644000175000017500000000410606604044320016437 0ustar aaronlaaronlBMF6((hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,,,,,~~~~~~~~~~,,~~~~~~~~~~~~~~,,,~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIWALK4B.BMP0100644000175000017500000000410606604044320016541 0ustar aaronlaaronlBMF6((hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,,,,,~~~~~~~~~~,,~~~~~~~~~~~~~~,,,~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIWALK4C.BMP0100644000175000017500000000410606604044320016542 0ustar aaronlaaronlBMF6((hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,,,,,~~~~~~~~~~,,~~~~~~~~~~~~~~,,,~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIWALK4D.BMP0100644000175000017500000000410606604044320016543 0ustar aaronlaaronlBMF6((hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,,,,,~~~~~~~~~~,,~~~~~~~~~~~~~~,,,~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIWALK5.BMP0100644000175000017500000000612606604044320016444 0ustar aaronlaaronlBMV 6((4 hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIWALK5B.BMP0100644000175000017500000000612606604044320016546 0ustar aaronlaaronlBMV 6((4 hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIWALK5C.BMP0100644000175000017500000000612606604044322016551 0ustar aaronlaaronlBMV 6((4 hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIWALK5D.BMP0100644000175000017500000000612606604044320016550 0ustar aaronlaaronlBMV 6((4 hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIWALK_0.BMP0100644000175000017500000000762606604044320016604 0ustar aaronlaaronlBM6(84` hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,~~~~~~,,,,,,,,,,,,,,,,,,,,,,,~~~,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,~~,,,,,,,,,,,~~,,,,,,,,~,,,,,,,,,,,,,,,,~~~~~~,,,,,,,,,,,,,~,,~~~~,,,,,,,,,,,,~~,,~~~~,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,~~~~~,,,,~~~,~~~~~~~~~~~~,~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIWALK_2.BMP0100644000175000017500000000643606604044320016604 0ustar aaronlaaronlBM 6(JhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,////,,,,,,, // /,,~, ///~~,,,,   /////~~~~~~~~~~~~,,,,  ///~~~~~~~~~~~~~~~~~~, /  //~~~ ~~///~~~~~,   ///////~~~~~~~~~~~~~~~~~~~,,  //// //~~~~~~~~,,,, // ////,,,,,,,,  //,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIWALK_D.BMP0100644000175000017500000000512606604044320016621 0ustar aaronlaaronlBMV 6(6 hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,~~~~~~~~~~~~~~~,~~~~~~~~~~~~~~~~~~~,,~~~~~~~~~~~~~~~~~~~~~~~,,,~~~~~~~~~~~~~~~~~~~~~~,,,~~~~~~~~~~~~~~~~~~,,,,,,~~~~~~~~~~~~,,,,,,,,,~~,,~~~~~~,,,,,~~,,,,,,,,,~~,,,,,,,,,,,~~,,,,,,,,,,,,,,~~~~,,,,,,,,,,~,,,~~~,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HIWLK18B.BMP0100644000175000017500000000526606604044320016535 0ustar aaronlaaronlBM 6( 4hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,~,,,,,,,,,,,,,,,,,,~,,,,,,,,~,,,,,,,,,,,,,,,,,,~,,,,,,,,~,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~,,,,,,~~~~~~,,,,,,~~~~,,,,,,~~~~,,,,~~~~,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,~~~~~~~~,,,~~~~~~~~~~,,,,~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/HTRACK.BMP0100644000175000017500000000406606624427520016366 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~潽潽潽~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~潽潽潽~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xevil-2.02r2.orig/win32/res/ICO00001.ICO0100644000175000017500000001135606501171530016370 0ustar aaronlaaronl 6(00F( @xxwxwpwwxpwxqxpqxqwqppp{qpwpwqqwpqqxpwxq;q0131qx;xwq0pxpqwx??( wpppwppppppppww(0` ʦ """)))UUUMMMBBB999|PP3f3333f333ff3fffff3f3f̙f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___www>??xevil-2.02r2.orig/win32/res/ICON1.ICO0100644000175000017500000000137606430314160016206 0ustar aaronlaaronl ( @xevil-2.02r2.orig/win32/res/IDR_XEVI.ICO0100644000175000017500000001135606430314200016640 0ustar aaronlaaronl 6(00F( @xxwxwpwwxpwxqxpqxqwqppp{qpwpwqqwpqqxpwxq;q0131qx;xwq0pxpqwx??( wpppwppppppppww(0` ʦ """)))UUUMMMBBB999|PP3f3333f333ff3fffff3f3f̙f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙33333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffff3fffffff3f̙ffff3ff333f3ff33fff33f3ff̙3f3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3ffffffffff!___www>??xevil-2.02r2.orig/win32/res/IND1.BMP0100644000175000017500000002550606604100420016070 0ustar aaronlaaronlBMF+6(dd'hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U弼彼彼d|漼ldl潼弼彼ld漼彼潽潽dl彼弼ἴᴴټᴼᴴ|m弽meef澾fnnfnfnnnnfnfffnnnfnfnfnnfnnfffn¾nnnffnnfn漾nnnffffnnnfnnffnnnfffff漼nnnnnffff漼nnffnfffnd羾fn潼xevil-2.02r2.orig/win32/res/INDT2.BMP0100644000175000017500000002550606604044316016230 0ustar aaronlaaronlBMF+6(dd'hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Uxevil-2.02r2.orig/win32/res/KKKILL.MID0100644000175000017500000003115006624662062016362 0ustar aaronlaaronlMThdMTrk7YT`All KKK No PatcheQRX/MTrk8! Pick Bass"kV8@q<<kDi8@fD,q9?nG q4Dn<<nJ.nJi=;nE+n5CnAt:>k9?kMk;=iJ&k8@w9Vyq4Dn<<nJ.nJi=;nE+n5CnAVk8@q<<kDi8@fD,q9?nG q4Dn<<nJ.nJi=;nE+n5CnAt:>k9?kMk;=iJ&k8@w9Vyq4Dn<<nJ.nJi=;nE+n5CnAVk8@q<<kDi8@fD,q9?nG q4Dn<<nJ.nJi=;nE+n5CnAt:>k9?kMk;=iJ&k8@w9Vyq4Dn<<nJ.nJi=;nE+n5CnAVk8@q<<kDi8@fD,q9?nG q4Dn<<nJ.nJi=;nE+n5CnAt:>k9?kMk;=iJ&k8@w9Vyq4Dn<<nJ.nJi=;nE+n5CnAVk8@q<<kDi8@fD,q9?nG q4Dn<<nJ.nJi=;nE+n5CnAt:>k9?kMk;=iJ&k8@w9Vyq4Dn<<nJ.nJi=;nE+n5CnAVk8@q<<kDi8@fD,q9?nG q4Dn<<nJ.nJi=;nE+n5CnAt:>k9?kMk;=iJ&k8@w9Vyq4Dn<<nJ.nJi=;nE+n5CnAVk8@q<<kDi8@fD,q9?nG q4Dn<<nJ.nJi=;nE+n5CnAt:>k9?kMk;=iJ&k8@w9Vyq4Dn<<nJ.nJi=;nE+n5CnAVk8@q<<kDi8@fD,q9?nG q4Dn<<nJ.nJi=;nE+n5CnAt:>k9?kMk;=iJ&k8@w9V/MTrk! Hells Bells{ .R,N>,./P*F .F,@$.,/ */P*D .H,H5.,/*/N*P.J,P;.,/*/H.J*H,N3./*,/P*F .F,@$.,/ */P*D .H,H5.,/*/N*P.J,P;.,/*/H.J*H,N3./*,/P*F .F,@$.,/ */P*D .H,H5.,/*/N*P.J,P;.,/*/H.J*H,N3./*,/P*F .F,@$.,/ */P*D .H,H5.,/*/N*P.J,P;.,/*/H.J*H,N3./*,/P*F .F,@$.,/ */P*D .H,H5.,/*/N*P.J,P;.,/*/H.J,N3./ ,/P*F .F,@$.,/ */P*D .H,H5.,/*/N*P.J,P;.,/*/H.J*H,N3./*,/P*F .F,@$.,/ */P*D .H,H5.,/*/N*P.J,P;.,/*/H.J*H,N3./*,/P*F .F,@$.,/ */P*D .H,H5.,/*/N*P.J,P;.,/*/H.J*H,N3./*,/P*F .F,@$.,/ */P*D .H,H5.,/*/N*P.J,P;.,/*.R,N>,./P*F .F,@$.,/ */P*D .H,H5.,/*/N*P.J,P;.,/*.R,N>,./P*F .F,@$.,/ */P*D .H,H5.,/*/N*P.J,P;.,/*.R,N>,./P*F .F,@$.,/ */P*D .H,H5.,/*/N*P.J,P;.,/*/MTrkA! Symphonic3*W* ** *g* *l*7*W* ** *g* *l*7*W* ***W* ***W* ** *g* *l*7*W* ** *g* *l*7*W* ***W* ** *g* *l*7*W* ** *g* *l*7*W* ** *g* *l*7*W* ** *g*/MTrk!Pole 25K2029F2117J1.6>.!/:9/+:/+I,9I,.-5O-)-5O-*6U*\25K2029F2117J1.6>.!/:9/+:/+I,9I,.-5O-)-5O-*6U*\25K2029F2117J1.6>.!/:9/+:/+I,9I,.-5O-)-5O-*6U*\25K2029F2117J1.6>.!/:9/+:/+I,9I,.-5O-)-5O-*6U*\25K2029F2117J1.6>.!/:9/+:/+I,9I,.-5O-)-5O-*6U*\25K2029F2117J1.6>.!/:9/+:+:.++I,9I,.-5O-*6U*/MTrk!HammersS2xR/S^P*ReN.PfL++NMK-LeI(K\G)$ITF1"GVD"FsB,=D;@)9B??+@Y= (?P;+3=E:.;Y8+:p8f;)i;?4!?OB,BnF2xG1F]I0GvK47IAL4'KQN*%LkN`S(xR/S^P*ReN.PfL++NMK-LeI(K\G)$ITF1"GVD"FsB,=D;@)9B??+@Y= (?P;+3=E:.;Y8+:p8f;)i;?4!?OB,BnF2xG1F]I0GvK47IAL4'KQN3%LSP1NlPlS(xS2S^R/S^P*ReN.PfL++NMK-LeI(K\G)$ITF1"GVD"FsB,=D;@)9B??+@Y= (?P;+3=E:.;Y8+:p8f;)i;?4!?OB,BnF2xG1F]I0GvK47IAL4'KQN*%LkN`S(xR/S^P*ReN.PfL++NMK-LeI(K\G)$ITF1"GVD"FsB,=D;@)9B??+@Y= (?P;+3=E:.;Y8+:p8f;)i;?4!?OB,BnF2xG1F]I0GvK47IAL4'KQN3%LSP1NlPlS(SfSxRRS^PPRReNNPPfLL+NNMKKLLeIIKK\GG$IITFF"GGVDDFFsBB=DD;@@9BB???@@Y==(??P;;3==E::;;Y88::^:88f;;:Y;;=x??3=E@)??OBB,@LD BBnFF,DLGGFF]IIGGvKK7IIALL'KKQNN%LLSPNN`SRqPRSSR^PRRS]NPPRaLNPNMKLLNIIKLK\GIKITFG"G IMDFFG\BDF%D;@B8DB??@@BX=?(?@M;=#?=E:;;=X8:: ;U88 :];:8N;;:e?=;j?)?OB@= ?]B B@YFDBsGFFDCIGG FiKIG0IALKI KQNL%LKNPNNLJP PNNSR PlSSR\RRS^PPRReNNPPfLL+NNMKKLLeIIKK\GG$IITFF"GGVDDFFsBB=DD;@@9BB???@@Y==(??P;;3==E::;;Y88::^:88f;;:Y;;=x??3=E@)??OBB,@LD BBnFF,DLGGFF]IIGGvKK7IIALL'KKQNN%LLSPNN`SRqPRSSR^PRRS]NPPRaLNPNMKLLNIIKLK\GIKITFG"G IMDFFG\BDF%D;@B8DB??@@BX=?(?@M;=#?=E:;;=X8:: ;U88 :];:8N;;:e?=;j?)?OB@= ?]B B@YFDBsGFFDCIGG FiKIG0IALKI KQNL%LKNPNNLJP PNNSR PlS2SR\R/S^P*ReN.PfL++NMK-LeI(K\G)$ITF1"GVD"FsB,=D;@)9B??+@Y= (?P;+3=E:.;Y8+:p8f;)i;?4!?OB,BnF2xG1F]I0GvK47IAL4'KQN*%LkN`S(xR/S^P*ReN.PfL++NMK-LeI(K\G)$ITF1"GVD"FsB,=D;@)9B??+@Y= (?P;+3=E:.;Y8+:p8f;)i;?4!?OB,BnF2xG1F]I0GvK47IAL4'KQN3%LSP1NlPlS(SfSSxRRSS^PPRReNNPPfLL+NNMKKLLeIIKK\GG$IITFF"GGVDDFFsBB=DD;@@9BB???@@Y==(??P;;3==E::;;Y88::^:88f;;:Y;;=x??3=E@)??OBB,@LD BBnFF,DLGGFF]IIGGvKK7IIALL'KKQNN%LLSPNN`SRqPRSSR^PRRS]NPPRaLNPNMKLLNIIKLK\GIKITFG"G IMDFFG\BDF%D;@B8DB??@@BX=?(?@M;=#?=E:;;=X8:: ;U88 :];:8N;;:e?=;j?)?OB@= ?]B B@YFDBsGFFDCIGG FiKIG0IALKI KQNL%LKNPNNLJP PNNSR PlSSSR\RRSS^PPRReNNPPfLL+NNMKKLLeIIKK\GG$IITFF"GGVDDFFsBB=DD;@@9BB???@@Y==(??P;;3==E::;;Y88::^:88f;;:Y;;=x??3=E@)??OBB,@LD BBnFF,DLGGFF]IIGGvKK7IIALL'KKQNN%LLSPNN`SRqPRSSR^PRRS]NPPRaLNPNMKLLNIIKLK\GIKITFG"G IMDFFG\BDF%D;@B8DB??@@BX=?(?@M;=#?=E:;;=X8:: ;g8 :/MTrk! Synth Brass=+L+m1H`1-Hx-x1Nd1 -9-a1Rf1 -L-m1Rl1+L+m1Ff1 -Hv-z19^1-B-o1Dn1-F -g1Ph1+L+m1Lm1-Dk-1LX1-<|-t1Rt1|-N|-t1Us1}+L+m1Rr1~-?j-1Pn1-D{-u1Rl1-H-l1Y1h+L+m1H`1-Hx-x1Nd1 -9-a1Rf1 -L-m1Rl1+L+m1Ff1 -Hv-z19^1-B-o1Dn1-F -g1Ph1+L+m1H`1-Hx-x1Nd1 -9-a1Rf1 -L-m1Rl1+L+m1Ff1 -Hv-z19^1-B-o1Dn1-F -g1Ph1/MTrk!HH42,Rd59,PHt44,Kk35,Snr38*G9*?*QP*(*NH**G9*?*QP*(*NH*0*EX* *G9*?*QP*(;VH;0,EX, *G*G9**?*Q*QP**(*N*NH***G9*?*QP*(*NH*0*EX* *UX* *Q<*<;K+;M;Z$;*]7**G9*?*QP*(*NH**G9*?*QP*(*NH*0*EX* *G9*?*QP*(;VH;0,EX, *G*G9**?*Q*QP**(*N*NH***G9*?*QP*(*NH*0*EX* *UX* *Q<*<;K+;M;Z$;*]7*#k`##wK##nR##kR#*G#c-# *?*QP*(#^*ND#*0*EX* *G&t**+&*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G&z#*.&*QP*(;VH;0,EX, #c*G*G4#**?#`*Q*Q<#**(#`*N*NH**#.#`*E*EJ#** *G &z.*%&*QP*(#\*N=# *0#`*EE#* *G9*?#`*Q5#*(#`*NA#*0*EX* *U &zK* &*Q<*<;K+;M;Z$;*]7**G#c-# *?*QP*(#^*ND#*0*EX* *G&t4*&$*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G &n,*0&*QP*(;VH;0,EX, #c*G*G4#**?#`*Q*Q<#**(#`*N*NH**#.#`*E*EJ#**&z*G9*&$*QP*(#\*N=# *0#`*EE#* *G9*?#`*Q5#*(#`*NA#*0*EX* *U&wB* &*Q<*<;K+;M;Z$;*]7**G#c-# *?*QP*(#^*ND#*0*EX* *G&t**+&*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G&z#*.&*QP*(;VH;0,EX, #c*G*G4#**?#`*Q*Q<#**(#`*N*NH**#.#`*E*EJ#** *G &z.*%&*QP*(#\*N=# *0#`*EE#* *G9*?#`*Q5#*(#`*NA#*0*EX* *U &zK* &*Q<*<;K+;M;Z$;*]7**G#c-# *?*QP*(#^*ND#*0*EX* *G&t4*&$*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G &n,*0&*QP*(;VH;0,EX, #c*G*G4#**?#`*Q*Q<#**(#`*N*NH**#.#`*E*EJ#**&z*G9*&$*QP*(#\*N=# *0#`*EE#* *G9*?#`*Q5#*(#`*NA#*0*EX* *U&wB* &*Q<*<;K+;M;Z$;*]7*E*G9*?*QP*(*NH*0*EX* *UX* *Q<*<;K+;M;Z$;T*G#c-# *?*QP*(#^*ND#*0*EX* *G&t**+&*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G&z#*.&*QP*(;VH;0,EX, #c*G*G4#**?#`*Q*Q<#**(#`*N*NH**#.#`*E*EJ#** *G &z.*%&*QP*(#\*N=# *0#`*EE#* *G9*?#`*Q5#*(#`*NA#*0*EX* *U &zK* &*Q<*<;K+;M;Z$;*]7**G#c-# *?*QP*(#^*ND#*0*EX* *G&t4*&$*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G &n,*0&*QP*(;VH;0,EX, #c*G*G4#**?#`*Q*Q<#**(#`*N*NH**#.#`*E*EJ#**&z*G9*&$*QP*(#\*N=# *0#`*EE#* *G9*?#`*Q5#*(#`*NA#*0*EX* *U&wB* &*Q<*<;K+;M;Z$;*]7**G#c-# *?*QP*(#^*ND#*0*EX* *G&t**+&*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G&z#*.&*QP*(;VH;0,EX, #c*G*G4#**?#`*Q*Q<#**(#`*N*NH**#.#`*E*EJ#** *G &z.*%&*QP*(#\*N=# *0#`*EE#* *G9*?#`*Q5#*(#`*NA#*0*EX* *U &zK* &*Q<*<;K+;M;Z$;*]7**G#c-# *?*QP*(#^*ND#*0*EX* *G&t4*&$*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G &n,*0&*QP*(;VH;0,EX, #c*G*G4#**?#`*Q*Q<#**(#`*N*NH**#.#`*E*EJ#**&z*G9*&$*QP*(#\*N=# *0#`*EE#* *G9*?#`*Q5#*(#`*NA#*0*EX* *U&wB* &*Q<*<;K+;M;Z$;*]7**G#c-# *?*QP*(#^*ND#*0*EX* *G&t**+&*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G&z#*.&*QP*(;VH;0,EX, #c*G*G4#**?#`*Q*Q<#**(#`*N*NH**#.#`*E*EJ#** *G &z.*%&*QP*(#\*N=# *0#`*EE#* *G9*?#`*Q5#*(#`*NA#*0*EX* *U &zK* &*Q<*<;K+;M;Z$;*]7**G#c-# *?*QP*(#^*ND#*0*EX* *G&t4*&$*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G &n,*0&*QP*(;VH;0,EX, #c*G*G4#**?#`*Q*Q<#**(#`*N*NH**#.#`*E*EJ#**&z*G9*&$*QP*(#\*N=# *0#`*EE#* *G9*?#`*Q5#*(#`*NA#*0*EX* *U&wB* &*Q<*<;K+;M;Z$;*]7**G9*?*QP*(*NH*0*EX* *G9*?*QP*(*NH*0*EX* *G9*?*QP*(*NH*0*EX* *G9*?*QP*(;VH;0,EX, *G#c-# *?*QP*(#^*ND#*0*EX* *G9*?*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G9*?*QP*(;VH;0,EX, *G#c-# *?*QP*(#^*ND#*0*EX* *G&t**+&*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G&z#*.&*QP*(;VH;0,EX, #c*G*G4#**?#`*Q*Q<#**(#`*N*NH**#.#`*E*EJ#** *G &z.*%&*QP*(#\*N=# *0#`*EE#* *G9*?#`*Q5#*(#`*NA#*0*EX* *U &zK* &*Q<*<;K+;M;Z$;*]7**G#c-# *?*QP*(#^*ND#*0*EX* *G&t4*&$*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G &n,*0&*QP*(;VH;0,EX, #c*G*G4#**?#`*Q*Q<#**(#`*N*NH**#.#`*E*EJ#**&z*G9*&$*QP*(#\*N=# *0#`*EE#* *G9*?#`*Q5#*(#`*NA#*0*EX* *U&wB* &*Q<*<;K+;M;Z$;*]7**G#c-# *?*QP*(#^*ND#*0*EX* *G&t**+&*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G&z#*.&*QP*(;VH;0,EX, #c*G*G4#**?#`*Q*Q<#**(#`*N*NH**#.#`*E*EJ#** *G &z.*%&*QP*(#\*N=# *0#`*EE#* *G9*?#`*Q5#*(#`*NA#*0*EX* *U &zK* &*Q<*<;K+;M;Z$;*]7**G#c-# *?*QP*(#^*ND#*0*EX* *G&t4*&$*QP*(#\*N8#*0#Y*ED#* *G9*?#c*Q9#*(#`*NG#*0*EX* *G &n,*0&*QP*(;VH;0,EX,/xevil-2.02r2.orig/win32/res/LADDER.BMP0100644000175000017500000000406606624472634016353 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Unn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnxevil-2.02r2.orig/win32/res/LANCER.WAV0100644000175000017500000001640706430314142016365 0ustar aaronlaaronlRIFFWAVEfmt ++dataz{xyzpup`c~}vYW\hx{yrwoghqw|xpdSlsz{xyn\vxuvwgyo|xmrnvqriaw|supx|vule~~}q}ozvw_cojozz{}y|{txoxz~|~pzw}{vx~||yma_so~z{xvp~txw~m{}mgebfr}oXFizYC[~k|gcqĨq-*;h`449AXzɭqb>!0JVfs}usqyqxtz{{wowomxpxx|wexv~}yyln_dpi{w{i{t{qvdykiy|zxppuufg}}qrt~~moxs~kprdsqyvsiwqgfhtbzw}~yks|rnny~rvyrzx{~totqglmsyzjn|s|EhzvʧzkoH1hYe\pa8Zggdve]bdgwl_ZgXh\h{*`g_yumfoyXpWnY~qkWevz_O_ql{VzviXnyOnZ\OJIUnevuH}CJ^\MbRY[D{WsdSeli{`w]uVYs]cKQbKp_I|qHlT^rRRiOZ>ZtupgysyVjL5_5rPe_~Çe]^xWIimPve`\mttxc^f{u|Ir~waYwcp^gNj_TmHemyxuuČyka_U|N\{^Zyrvpsprlzojir{~_qtqZmheq\x^|Ym~bt[KnXzun^waw]o_mP̠p(vNVĦnykOcT.tyɰť~kDFQC6T>/8i\Ⱥ¤~aKd5 H& "ncb~ɫϣ|tFB0J(f<3Ytуy~pt?LQ?[>eQSGoiזsnrs:P[iaHt[M_lJ}xgcvQ}Q`˱enTHThd~WzYkpmCSSH~PuCqqG[YaG-uUcSb}VyISmċLk7aPIY,]AnY_Ïsnj|0S`ru7Zs]Vo`Xyha?NTLSIqbdZMVLcrm|yfjygt^}yuw{lz|ztpdvakgqv{vwk~}rqjlm|}y|wgK]mfo]~ğio}~{]Zeh[Vcgu{qou|}vca\H<Fj}{~xstgmt{bFOOHJGGAUPNcckmx|}ľĶg\d_upV3,"'Uux|u?8W{{xL%G_jB8MeZ<%&/Ffnmmtex{r{~iyydc|YXX60 &%?[tӼ~gN8)(@Visȹpz`F;HG?G2206XETB|ԍwytcMFLNTan{{utonhjd_^]^XSarzrʹsWMF‹ܸHA{MZcɗ|Tg ja9w{ygunymTjj]G|cmt[}q}g[txg~ɫʝuqe@v:eCv|v~yJqzaT`^cN?-oeμŸijpezwP^J|}~udLjT>\Uf]2rvl`6o`ykk5D.MUoqTs͙qrE)M:Uпmw}tU1_ϵzp~zSHpwpusrƷo:@I~{|aCcvyXLZh}{{om~rzmgj~qekgszwQ`fQVQN\^s»sK=0D[hqwsxgkm{qsm_p^kWYYfr~pfgu~~ly{~z}vd{hzuyyys]cScZ_nnidxkak}qwvy{qbUS[g}»jabSREIGCR~tp~wypa]oj~{yi[jrz~s{xvlftvtwkxoyrpktKpxxwf|{zit{o^__\filoĻ}dhek\L;=Yr^nvlTbkM!0pȱaRXWgl|ֽtiXhmb\PJ9(9J^{ŢsQKA 2II[lnx~LYUmIG?YQ2htr{w~i_~sxnW\`Zgmoz|p^Dk[ƺ|ZW=J9I0 `fFBᐔ׿߫s_lrNa7+zV[hUn8]xƐXHD~_~^u|;wZDq@djIrX|mCxkjYr\aðhmCYLo|Mx`z[kb\Y[K~j{z]]Ňtw}ٕk~pevkWvcE"wYSviRXytRUwwz:rx]>pB{gÂ˧jdtʿvpcY>9?LSzTl>y{QwsJ~rOwQa^w>pu}3pEnvR4xWHb}&=kǜcN^?\y`t^IKjdvX?uv:_wh䏰ٶeVC>a^ocZbzN:>^J>j~JBr|JFxxHL~tHPrHTnHXjH^fHbbJf^Ll\LpXNtVNxXPvZNp`NldNhjPbpR^tRZzVX~XV|\Tx^TrdTnhRhlRdxXZ^VrjTfvX^^XvhXjtX`^ZxfXlrZb~`^zfZnpZd`\vpZdb\vp\fd^tp\fd^tr^fd^tt`ff`tt`ff`txbb|p`hh`p|dbxvbhnbln<$XpTV^zt\XjdTLdbBDdnXX`~nZZnbRNfjHD\~bZZlhX\r~bRPjhLJ`~dZZlhZ^r|`RRlhNNdj^Zfr^Zf~r\PXvfPPdl^\hr^Zh~r\R\xfRRfl^\jvb\dx~dVVh`TZnn`^hp4:b$$`L&"J|dJ8HnlTTZrz|jTvl4,hbTl||bXr0(b\\||fNd~@<^dTXdjXZrx^LLnP>JtdXXffX^vtXJRxxNBV|~fZZlbV`vpXJTz~VFRpt`Z`xx^XdxnVJX~|VJVrtbX`zv^ZdxnTL\zVLZrzfZ^rfZ^lfRRfvXP\rzf\`rfZ^ndRThvZR^tzf\`tj\^j~pZR\xpZVbx|h^brN $b~<Dd6$8jrTB@bz|ZTZlzxTb|H&HvTdxrXrH&HlXz~|pNTX8V~d^`6B^Zt|^f^0@z|\n|~fXlzD@j`dbBPfTh~~l`zH6\r\r|n`rl>Fr`j|dJ`bPhjdxN@`~bj~~hfV@V|bn~~lXfhN\zzbndHRlbn~xdrlHLrld~~~jbp^N`~|fnnTXzzdbv~ph|bJV|nfz~~rhp^P`~~hnrZ\z~f`tthvpTRnjl~tjr`TbnlxdB*8FTlv\. 8^z|~jP2*Fx~hVPFLxb22X~ZJTd^T^dPD\R6>nzXPXnxXTf~^LJj|H8L~rVT\vvZVfdNF^`@BbnXV^|pZXj`LJhX@Hjn\XbjXZl~^LLjbHJb|dXXldX\pz\JNnbJNf~fZZndX^pz\LRrbLRfl\Zhp\ZdzpXNZ|bPThl\Zhn\Zf|nVP\~bRVjl\\jt`Zdv|bRVlz^RZnn^\hl2 <^"&bJ$"H|bJ6Fl~lVTZpx|hTzf0.pbVnx|b\l.,f\bz|bPhz>f~ZPVhbV^|pXJRxxJFile created by GoldWave. GoldWave copyright (C) Chris Craigxevil-2.02r2.orig/win32/res/LASERS.BMP0100644000175000017500000000376606604100420016372 0ustar aaronlaaronlBM6(/hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,~~,,,,,,,~~~,,,~~~    ~~~~,,,~~~,,~~~,,,,,~~~~~~~~~,,,,,,,,,,,,,,,,,~~~~~~~~~,,,,,,,,,,,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/LEMDETH.WAV0100644000175000017500000000537406430260054016506 0ustar aaronlaaronlRIFF WAVEfmt ++fact data u{zy~~xmnxz}xwdostvlrq}vlrv|vqiqxzittrqyzyxols{v_ipbeonip}rkpwt~soo_\Tkqrxi~z{vz|{|{{xzrjtyxn~mv|utvss}}ysqjcex~|qpuv_eegRph~`xijp^W~z¢x\xuiKjwfJi|_velNB[}ifzNWu~cb{sixm\QzTϛw~{>F`oXunnTzPP`p|{~bO_tƛxgmUKs]SldWi{a@O|vi{ef{d\Zbr gssD\vhac}iZgxxuT=py]ko|YQzkWJwjppcUHUq}Ş}X]CJYye:VOeh`c5M]~P^?`a}h\ek}nnohxq{~mrbm~duvq[Rj{s{zhkcZzxŘo}pg]XhbUovtunN^Qq\_JlqmOG`m[[JpscbpMtnbsbraTsZ}Zo`jn}eQQpwn\X>x\aKijrÝdrN\`{mnQpps{qdcRwŏ|'XkßO2Oijy̺]iWYIxtdDbgyom`^t~]hbveruQ6byhhSfViѹ},aԳxuNuӖwz2ZkVZDlWOc^ɠMVai`Iq|npsyejvleXh`vfkrkx|ۺ9l]hsў\op`kygxRofxN{Yan`xpdm|qbw~yhevoe}fqnx\cpw_T[k`u~7m|mP[`{WtcAd~٩Hai}}Tc_ai~[onqǂkYqAo߼DFgQ0@qtes|UOxl{~MeimZAmN~PgW^bBwrnNes5LpܹaZ VQӈjBGBmsow~y[c~~fZo{in]okOhqpQfriRoqZpqx~]qn}mrxtnLaxbpÖlzGkuep^gz}~v{gqesrjprxz~{pdoyjthXZffb_}imƅX|NvdaMphW_V_auwoRX=\xJ}Ċ\{WmbG0NjW7gynvwakvfwzgbaʡa9XwL>Pm~F@etwO_{CuV[xjcqWVG||Xp^6>~~s>xqqMGz}l}S?}K*`˛X3?oΚW:R|zWBK\fq{pahqHEnϰɼm?5`pzzgjͷur<+GtƩw?'DfR>ieL;:Ig¿{O0=c˸vg\TPNKA$@cifyæ}iqUQu|A/DfՉLKqqm}sZA3,3KcwqcrU:E\mHTuyskQUfq˫pL`|gK`іS;G_zw|sN,&-1138EU`Y:$$Eszwtq_=-EejQ$ \XPvwDGR2Gq՟gak31aQ:U{pXHRa^Wbk[D>Jq踉Ȱ{IEnea{zO3Kz~F )Uţs^pt\H<;UͿwrro\.FjuܴdFSuȶMDl\LarzlolPWls34Tr–['!IgU&.VvǪspX6Ep˿gPQVXYR5AixstzoG;aȿy}wECPZdkh`YO4/('Q¹N;XrhY`pxzP%3Y|˳G6MmSRxyt{xH8O_gjowuhcR20TfL6OɏZYѲcC=:!J乍IcsE.Y{zM',\nO=^w}ylK 5kۛjoH /T|vmh`Y^gqkbuѴpctJ3V}i1,MR,#^ǵxF8Sz保}woha\WK4 W||{S4JyˍWLT[ch]B07@1-,#6cĽseUN^t}~qrrU57X}ɶO%&-3Roz{zdS[vtNEb̝X)))R̬xlj{igs}eGKmʻqcXQLE5.:FXgmhS73Mgs£[,'J`O-&CazƵwpytQG^yxsppkT3&:OZmxy|jZlȞvdoTG\|P6>GGTrƹf= !Au|\`wƪmWPT]goojicG.[}]CGd˽lB'5Vmvw}u[[od:%/Ji}qurgjxq[I=54CZjiUFFGRwrg\QG7 .C_ʹ|A 9Vw{ojX]ppƶykYE-+9CLQYjri}ʮ|oj_F 0^pQFWn{ǤrkcZWZ\[TH;563+$ J~ȼnH3-*-7??Ka|~iOEQboz{n_TYvԭzF-2EU`rhV[aYQ\puibc^[gs{{p{ĻxgbZHCZǿziZ\hnjbT?*,Pzƿujhouo^Vbwwo~vdRGFJKOYbhq~ε}f\WUX[XSNJJQbs{w{rli`QECHLOYk{r]GATlur{ļլ{UEGQ_ktvtjP-%16405AGHQi}wvy}{sr}r\GDYq{u|wg[QKQ\fqx{ybN@@N[^cvsqvzĸ{qf\TQV\agosv~|{qS8#"3DQ^fb\`onYH<8?DBBMZhx}{skdbchxȾnN4,25/&"*B`rw}~ufUIK\rkZ\gt~o\PNPWepv{pgZKFTlzx|xv~}{}yninzzpifnw{|yv{tib^am~}plpzqaZ\ds{|iYQNNS\ep|~xtu}ulioʼnd^VPPXfvxi_ao}~wxz~zqmoqqs|x[E:?SkudX[j}y|tko{xnpy{qiihegpuuv{{tlfa\[_cfjt~qosuqkhjmqvyz{{tg\[_]TNS_pwuz}~½}uqsvtmgeehmnigluyrbUSYaegd`]]cn|snu~maXI>=><>GWlsor{}pjd_cmw}}ytz~tg]YVQMPW^ba^\YZcnokltz{zz{}~xrpopqi]]lwz{|vpjinstsu{~~~wqgYRTZbmx~voorrovxhYSUVW\_adfd`blu{zwyzvpjc_eoxujc`afy~wja^`dm||{}}xaN?67BRbrxjcaeoz~~|z|{qg`YSSW[ahhb[VTUV[blw|wm[NLRX`ilfchnpld^\\^`emqrw}}~}|ustnc`c\TX\RHKOKKWcjotutx}}womr|}wme_YVUROMIGNX[WSSTVauzwx~~óribZNC:33:ACB?715ALWdort{yn`USUTQRX\\_jw}qhaYOGDCDN`nw~zy¸tomkibSGBA>nn>nn>nn>rnn>rnn>nn>nn>~rnnrnn>Crnn>Crrnn>Crrnn>Crrnn>Crrnn>Crrnn>Crrnn>Crrnn>Crrnn>Crrrr>Crn>~rnnrnCCnn>nn>nn>nn>nn>nn>rrrr>nnrrrC>>CnnnrrrCC>Cnxevil-2.02r2.orig/win32/res/MD2DOOR2.BMP0100644000175000017500000000406606604044320016531 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**UC>>CnrrC>Cnnnrrnn>nnrrrnn>rrnn>nn>nn>nn>rr>n>Cn>nCnrrnnCCCnCnn>nCnn>nCnn>nCnn>nCnn>nCnn>nCnn>nCnn>nCnn>nCnn>nCnn>nCnn>nCnn>nCnn>nCnn>nCnn>nCnn>nCnn>Cnnn>>Cnnrrrxevil-2.02r2.orig/win32/res/MD2LADDE.BMP0100644000175000017500000000406606624436540016530 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Unn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnnn,,,,,,,,,,,,,,,,,,,,,,nnnxevil-2.02r2.orig/win32/res/MD2UPDOW.BMP0100644000175000017500000000406606604100422016576 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**UnrnnnnCrnnnnnrnnnnrnCnnnrnnnnnnnrCrnnnnnrnnnnrrCnnnrnnnrrnnrCrrrnrnrrrrrCnnrrnnrrrrrr>>>>>r>>>>>>>>>>r>>>>>CCC>>CCr>CC>>CCCC>>>CCrCnn>>CCC>>CCCCr>>>CCCC>>>>CCCrn>>CCCCnnnrnnnnrnnnrCnnnrnnnrnnnnCrnnrnnnnrnnrCnnnrnnnnnnrCrnrrrnnrrCnnrrrnnrrnnrCrrrrrrrrr>>>>>>>>>>r>>>>>>>>>rCnn>>CCCCC>>CCrCnnC>CC>CCCCCrn>>CCCCC>>CCCCrnC>>CC>CCCCCCCƽ潽~潽~~~~~~~~~~~~~~~~~~~~~~~@潽~~~~~~~~潽@潽~~~~~~~~@潽@潽~~~~~~~~@뽽@潽~~~~~~~~@潽@潽@@潽@@@@~~~~~~~~~~~@~~~~~~~~~~~~~~~~~~~~xevil-2.02r2.orig/win32/res/MD4DOOR1.BMP0100644000175000017500000000406606615656076016555 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**UC>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>nC潽~~C>>n~~nCrnnCCrrnn潽nCCr潽nrnC>>>CCnnnrrrnrrnC>>rnrrnC>>rnrrnC>>rnrrnC>>>CCnnnrrrnrnC>>>CCCnnrrrnCnrC>>>CCCnnrrrnCnrxevil-2.02r2.orig/win32/res/MD4DOOR2.BMP0100644000175000017500000000406606615712200016534 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U@@@C>潽nCCr潽C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>潽~~C>>n~~C>C>~~~~~~~C>>n~~~~~~~C>C>潽C>>nC>C>뽽~~~C>>n~~~C>C>~뽽~~~C>>n~~~~C>C>뽽~~~C>>n~~~C>C>뽽~~~C>>n~~~C>C>~~~~~C>>n~~~~~C>C>潽C>>nC>xevil-2.02r2.orig/win32/res/MD4HORIZ.BMP0100644000175000017500000000406606624463624016617 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U@@,,@@@@,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,llllll@lllll@lllll@lllll@lll@l@@@@@l@@@@@l@@@@@l@@@@@lllll@lllll@lllll@lllll,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@,,@@@@,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@xevil-2.02r2.orig/win32/res/MD4LADDE.BMP0100644000175000017500000000406606624472642016535 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@@@nn@@@@@@@@@@@@@@@@@@@@@nn@@@@nn@@@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@@@nn@@@@@@@@@@@@@@@@@@@@@nn@@@@nn@@@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@@@nn@@@@@@@@@@@@@@@@@@@@@nn@@@@nn@@@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nn@@,,,,,,,,,,,,,,,,,,,,@@nnxevil-2.02r2.orig/win32/res/MD4UPDOW.BMP0100644000175000017500000000406606615712174016617 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U~r~~Cr~CrCr>CCCCCCCCCnnCnCnrrrnCCCnrrr>CCCCnCCCrnCCnrnCCCCCnrrnC>CCnrCCCnCCCrCCCCCCCrnCCC>CCrnCCCCCCnrCnCCCCrCCCCn>CnCCCCCCCnrrrCCCCnCCCCnC>CCCCCCCnCrnnCCCCCCC>nCCCCCnCnrrnCnnCCCCCCnC>rCCCCnrnCnCCnrCCCCCCrCC>rCCCnrnCCnCCrrCCCCCCrCCCrrrnCCCCCCnCrnCCCC>CnCCCCrrrrrnnnrrrrnCCCCC>CCCCCCnr>>>>>>>>>>>>>>>>>>>>>>>>CrCxevil-2.02r2.orig/win32/res/MD4VERTM.BMP0100644000175000017500000000406606624472644016623 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,@,,,,,,,,,ll,,,,,,,,,@@,,,,,,,,,ll,,,,,,,,,@@,,,,,,,,,l,,,,,,,,,@,,,,,,,,,,,,,,,,,,@,,,,,,,,,ɠ,,,,,,,,,@,,,,,,,,,,,,,,,,,,@,,,,,,,,,ll,,,,,,,,,@,,,,,,,,,,ll,,,,,,,,,@,,,,,,,,,,l,,,,,,,,,@,,,,,,,,,,,,,,,,,,@,,,,,,,,,ɠ,,,,,,,,,@,,,,,,,,,,,,,,,,,,@,,,,,,,,,ll,,,,,,,,,@@,,,,,,,,,ll,,,,,,,,,@,,,,,,,,,l,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ɠ,,,,,,,,,@,,,,,,,,,,,,,,,,,,@@,,,,,,,,,ll,,,,,,,,,@,,,,,,,,,ll,,,,,,,,,@,,,,,,,,,l,,,,,,,,,@,,,,,,,,,,,,,,,,,,@,,,,,,,,,ɠ,,,,,,,,,@,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,ll,,,,,,,,,@,,,,,,,,,ll,,,,,,,,,@,,,,,,,,,l,,,,,,,,,@,,,,,,,,,,,,,,,,,,@,,,,,,,,,ɠ,,,,,,,,,@@,,,,,,,,,,,,,,,,,,@@,,,,,,,,,ll,,,,,,,,,@,,,,,,,,,lxevil-2.02r2.orig/win32/res/MD4WALL.BMP0100644000175000017500000000406606615656072016464 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**UCrCrnrrrnCCCnrrrrr>CCCnrrnrnCrrnCCCCnrrrnCnr>CCCrrrCrCCnnCCCCCCrnCCCnCn>CCnrnCnCCCrCCCCCCnCCCnrCCC>CnnCCnCCCnCCCCCCCCCCnnCCC>nrnCCCCCCnCCCCCnCCCCCrnCCCn>nnCCCCCCCCCCCCrCCC>CnCCCCnr>rCCCCCCCCCCCnrCCC>CCCCCCCrC>rCCCCCCCCCCCrCCC>CCCCCCCnCC>rCCCCnCCCCCnnCC>>C>CCCCCCCCrCCnrCCCCCnrCC>>C>CCCCCCCCCrrnrrnnCCnrrn>>>>>>>>>>>>Cr>>>>>>>>>>CCrCr>CCCCCCCCCnnCCCCnrrrnCCCnrrr>CCCCnCCCrnCCCCCrnCCCCCnrrnC>CCnrCCCnCCCCnCnCCCCCCCrnCCC>CCrnCCCCCCnrCnCCnCCCCrCCCCn>CnCCCCCCCnnCCCrCCCCnCCCCnC>CCCCCCCnrrCCCnCCCCnCCCCCCC>nCCCCCnrCCCCCCCCnCCCCCCnC>rCCCCnrnCCCCCCCnrCCCCCCrCC>rCCCnrnCCCCCCnrrrCCCCCCrCCCrrrnCCCCCCnnrrrnCCCC>CnCCCCrrrrrnnnrrrrrnCCCCC>CCCCCCnr>>>>>>>>>>>>>>>>>>>>>>>>CrCxevil-2.02r2.orig/win32/res/MD5DOOR1.BMP0100644000175000017500000000406606624431300016533 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U>nr>CCCCCnCCCnnCCCCCCn>nr>nr>CCCCCnCCCCnnnCCCCn>nr>nr>nCCCCnnCCCnCCCCCCn>nr>nr>nCCCCCrrCCC>>>>>Cn>nrCr>nnCCCCnnCC>>>nCr>nnCCC>CrrC>>C>nCr>nnnCC>CCnC>>CCnCrCrr>CnnnC>CCnnC>CCCC>nCrrCnCCCnnrCCCCnCCCCCC>nCC>CCCnCCCCnCnnCCCCnCCn>CCCrCCCCCCrrCCCCCrr>CCCCrCCrCrrCCCrrCrn>CCCCCrCCCCCCrrCrrC>CCrCrrCn>CCCCrCCCCCCrrrrCCnnn>CCrCCrCrrCCCCnCnnCCCCCCCrrCCCCCn>CCnn>CCCCC>CCnCCCnCrrCn>CCCnnCCCCC>CCCnnCnrrCrCn>CCCCnCCCC>CCCCnnrrCn>CCCCnrCCCC>CCCC>nrCrrCCCCCCCrCCC>CCCC>nrCr>nrCCCCC>CCnCCCCCCC>>>nr>nrCCCCC>CCCCCnCCCC>>nr>nrrCCCC>CCnCCCnnCCCn>nr>nrrCCC>>CCnnn>nnCr>nrCrrn>>CCn>rCrnnrCCCrCCrCCCrnnn>CnrrCrrCrrn>Cnn>nCrrCrrCrrCn>nnnCCrCCCCrCCnnxevil-2.02r2.orig/win32/res/MD5DOOR2.BMP0100644000175000017500000000406606624431304016540 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**UCrCr>>nr>CCCnn>>CCCC>>CCCCCn>>nr>nr>CCCCn>CCCCC>CCCCCCn>nr>nrCnCCCC>CCCrC>CCCCCCn>nr>nrCnCCCC>nCCCn>CnCCCCn>nr>nr>nnCCC>CnCCC>CCnnCCn>nr>nr>CnnCCCCCCCC>nCCnnnr>nr>nr>CnnnCCCCCCCCrrCCC>nr>nr>CCnnnCCrCCrCrrCC>nr>nr>CCCnnCCrCCCCCCrr>nr>nr>CCCCn>nr>nr>CCCCCCCrCCCCCCrr>nrCr>CCCCCCrCCrCrrCCCr>CCCCCCCCCCCrrCCCCr>CCCCC>CCCCCC>>CCCnCrrC>CCCCC>CCCCC>CCCCnrCrrC>CnCCCCCCCCr>CCCCCnrrCC>CCnnC>CCCC>CCCCCCnCC>CCCnn>>CCCr>CCCCCCnCC>CCCnnC>CCC>CnCCCCnCrrC>CnnnrrC>>CC>CCnCCCnrrCrCnrnrnCC>C>CCCnnCnrCCr@rnnnCCCCCCCnnrCrCrrCCnnCCC>CCCnrCrrC@@>CCnCCCC>>CnrCC>CCCCCCCC>>CrCC@rCCCCCCCCC>>rCCrrnrCC>CCCCCCCCCnCrrCr>@rCCCCCCCCCCCCnCr>CnnnnCCn>CCCCCCC>nCr>CCCnnCCCn>CCCCCCCnCr>nr>CCCCnCCCnnCCCCCCCn>nrxevil-2.02r2.orig/win32/res/MD5HORIZ.BMP0100644000175000017500000000406606624470706016617 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rrrrrrrrrrrrrrnnrrrnrrnCCnrrrrrrrrrrrrrnCCCnrrrrrrrrrrrrr,,,,,,,,,,,,,,,,,,,,,,,,,,,,nrrr,,,,,nCr,,,,,,,,rnr,,,rrCCr,,,,,,,,,,rrr,rrCCr,,,,,,,,,,,,rrrrrrnnn,,,,,,,,,,,,,,rrrCC,,,,,,,,,,,,,,,,rnrCCr,,,,,,,,,,,,,,,,,,CnnCrr,,,,,,,,,,,,,,,,,,,,CCnnrn,,,,,,,,,,,,,,,,,,,,,CCrrr,,,,,,,,,,,,,,,,,,,,nCrrrr,,,,,,,,,,,,,,,,,,rnrr,,,,,,,,,,,,,,,,rnr,,,,,,,,,,,,,,rnnn,,,,,,,,,,,,rr,rrnnnr,,,,,,,,,,rr,,,rnnn,,,,,,,,rrr,,,,,rr,,,,,,rrrrr,,,,,,,r,,,,,,,,,,,,,,rrrrrrrrrrrrnCCCnrrrrrrnCCCCnrrrrrrrnCCCCnrrrnrrrrnnCCCn,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/MD5LADDE.BMP0100644000175000017500000000406606624464062016533 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,~rn,,,~r潽nƽ~,,,r~~~~~r~,,,~,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,ƽ,,,,,~潽rrr~,,,~~r,,,,,,,r~~,,,~,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,r,,,,,,,,,,~,,~潽r½r~,,,~~~~~~~~~~~r,,,,~,,,,,,,,,,,r,,~,,,,~,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/MD5OUTSI.BMP0100644000175000017500000004206606624431300016614 0ustar aaronlaaronlBM6D6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**UrrrrrrrrrrrrrrrrrrrrrrrrnnnrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrnnnnrrrrrrrrrrrrrrrnnrrnrrnrrnrrCnrCnrrrCnrrrCnrnrrCCrrrrrCnrrrrnrrnrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrnnnrrrnrrrrnnnrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrnnnrrrrrrrrrrrrrrnrnnnrrrrnrrrrrrrnrnrrrrrrnrrrCnrrnCnrrnrCnrrnrCnrnrnrCCrrrrrrCnrrrnrrrnrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrnnnnrrrrrrrrxevil-2.02r2.orig/win32/res/MD5UPDOW.BMP0100644000175000017500000000406606624431302016607 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U潽潽潽潽潽潽~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~潽潽潽潽潽潽~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~rrrnrn>rnrnC>rrrrnCrnCC>>rCCnrrCC>>CnCCCC>nCCnrnCC>>C>rCCCnCC>>>CC>CnCrCCCCrCC>nnnnnCnCC>C>nCnnnrnCr>C>rrnrrrrnCCC>nnnrrnnrC>>rrrrrrrCCC>nrrrrnrCC>rrCCCnrrrCC>CCCCC>>>CCC>>>>>>C>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>xevil-2.02r2.orig/win32/res/MD5VERTM.BMP0100644000175000017500000000406606624470710016614 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,rr,,,,,,,,,,,,,,,,,,,,r,,rr,,,,,,,,,,,,,,,,,,,,r,,rrr,,,,,,,,,,,,,,,,,,r,,rnr,,,,,,,,,,,,,,,,r,,nn,,,,,,,,,,,,,,rrr,,rr,,,,,,,,,,,,rrrr,,rrr,,,,,,,,,,rrrn,,rrrnr,,,,,,,,rrrr,,nrrr,,,,,,rrr,,rrrr,,,,rr,,rr,,rrr,,rrrrrrr,,,r,r,,,,nr,,r,,,,,CCr,,,nr,,,,,,rCC,,,,C,,,,,,,rrrCC,,,,,C,,rr,,,,rrrnnr,,,,C,,rrr,,,rrnrnrrnrr,,,Cr,,rrr,,rCnnrrnnr,,rrnn,,rnr,CCCrrnn,rrrn,,rCrnnCCrnrnnnrnC,,CrrCnCr,,rrnnrCC,,nrrCr,,,,rrnrrCnC,,rnC,,,,,,rrCCn,,rCr,,,,,,,,nC,,rrCrr,,,,,,,,,,C,,rCrr,,,,,,,,,,,,C,,rnr,,,,,,,,,,,,,,n,,rr,,,,,,,,,,,,,,,,r,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r,xevil-2.02r2.orig/win32/res/MD5WALL.BMP0100644000175000017500000000406606624431276016462 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U潽潽潽潽潽潽~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~潽潽潽潽潽潽~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Crn>CrrnCCCCnrn>CnCCCCCCCnCCCCnrrnCCCnC>>nnCnCCCrnCCCCCCCCCCCCnrrrCCC>CnrCCCnCCCCnCnCCnnCCCrnCC>rCCC>nnnnnnCCnrCnCCnrrnCrCCCCC>CCC>nrrrrrrrrrrnCrnnnrnnnrrrr>CCC>rrrnnnnnnnrrCCC>CnrrrrnnnrrrrrC>>>>>>>>>>nrrrn>>>n>>>>>>>>>>>>>>>nn>>>>>>C>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>C>>>>>>>>>>>>>>>>>>>>>>>>>Cnn>Cnxevil-2.02r2.orig/win32/res/MGUN1.BMP0100644000175000017500000000327606604044320016232 0ustar aaronlaaronlBM6("hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~//~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/MISSILE.WAV0100644000175000017500000004041006430260070016515 0ustar aaronlaaronlRIFFAWAVEfmt ++8fact@data@}tlvz^Th~wythhnteIF;/5H]p~ptsmnɿ}ollfhttidqűaTXdfWXuuemo]S_stjuzoql[Viysumv}) IY bn?B@(4xVƝ`/AIUwg+ -3[yĔO`ڸtZWM[ȸdM`nh~ʭcXUUV[T@;Ncj˾xV=7JwŞyq]=@SST^XJ;HivǶ~gF/+.\{}\]wycEETPPoę}K/fϰsIJW\ktwwx~ienbzĵnL#@Tsպq@"\yٶƿϿwg<#+Yw`*+WzL@zÙf_uqL:Uݾm|̏S@WdI3ErwmveLYu~]92)$CdxֱdNZ`\a[O]qs{pfoпX66,$4@79iͻ{rc[_J1?\^jqWX{бg=%6VrmO]o]AG^[Wnw\H^ѷn{wtxw_NBGKOViĿϲvB+@]\B9>IBJqqiVYt}³wxo~ӵ~~TB6'!(/`yZRgy~}{gLF>4Jntt˩_08szz_MQK.S}߳{U4=WZ]wmwtYJ\°{K%'95($7j̢h?9Wİ}zdPTks]Snʵz]9'5BY|bSeȤzqm`bYOg|hNT^YB 8SYrڶtY6/Vͨ|a=2Jkx|VJczr~fZM(4RKDgºǚdUk~nXL[o{pntynuh\mpB0^wlUTUC?XfdzǫvUSsvgwϠfP\heOBJ@9W[HOOZ~rXA2D_^ZrgtxmILXD+/[ŹWQmwmʿM6CVfpeH@WsrH1:@A[vw~^) =Sajb^cVRoծƟsmaJYtoclzk>"2Vjqds~ugD1F_ZN]йWE7(-Gc_]~yyμt:Hd]dֶzA'=ucWn{bO`}Z@/%Q|ζpŷOHefq{mT99ZyȖaMA3%%QrriqbF6;TwѭhY8!GUUbgljUZǨ|}|q͒P"+\yƴb3."B̾f[ƸͱgS`ildemotqeC0DHBQK49]wunkg^DFUB/Ioxy|ʺ|qhM"6YjaRKRwլzrqL*2JE6?ZqyH#>ZȗyvgilaFXhI1+ $XoO1 0=46Sеk<Dg|qmswuǭָpyrl^W`YKD@!>JU~T7Krg\y~pixԶn{t`h~mD;\wnp«qcZ7'FrK,5_ǹ_# #>Q]_Z_Z?'&Gݩ|kѸrmbADH@M|Į~`io[Yʶ|m}j3(5/AqravƥuN7;SlƫrQ'&7amfjȱ~\ʤ_>9-'0#:kmkvdV[SY{tRU̿ykJVobHImȵ_^os]1&FgrZRr}dtmrrK)#9h˰~ebS1(AOL_ŠzF1=6 Oz~ymdJDQY]amd>Cذ¦|p}zX5;etomRZwoX::Zpn上~wF'/:1Dte?7\ZIMECXUK_r~h|]C\YW{rgE$=zȭ{V_wv^[oo__ZGQ}qpv{V+-LP?Mz}LGjveٶZ7@uΰpM%&85En~sPSruuk<*CvӵhmmifopWb֣p\[KIknv|oiy~ysG3JwuPJm~ucBJylkzo}vsbRob:6Xzqn{htbj_85Qfh3HehwR&7sl\p۴~O/sվiWA,1Urs⹝X]skA-^{jP`_OmI?XckڥnfM-BB`z}_Zku\=GPKOGFgԏR.LmuSLmֱijsS0Rչίp:(+g؛T7IcyoW`eWAEnثߣ_KbqY<<5!G~ͺHGĠnUILoiI@Qg괄xiC0CH1,FO>?bӜf\mqxy|aCLt͵~G(/??Uڦl@3Ly˿`3 ,gO(#SQ:GoӿA/KLDSU;;buXPoȫU3:NMY~H(.XӷM&@zd,5fͿtC!Rڻ= /ilS`|uƲ}E 2dɳrK" FºϻG ",J̱]RiؿM3ksK8E]kɥ|v`+#2)+T}lz}asowe8.VgefmvКN1IWNGZpsY4-]۵cOJO[ktPPY`a]XTRNC,Vϳa=2PsbZd߶u:)=ZomTNbu|\:&%@jホsO-%H{߰x[QCNt_E68R߲`Sc͟kH?VzjILiv]f~wZE;;@KWkӵ_W_^L5&"(5Hfĩ~P# 8h}|{mf^fžyjK& -Vrѧj7(<_}`KCGScuzG"*ACLmsm|qM..Gb{pey濋llxV/?o`Scwf\oykchӷeI737DgtVPcsAYfxZ>4CfŬ}sU9&!3Vഅ^E?Rywl}xjP32OqncoqfrwYXbZE?Qr}k[D3,/;T~վi= 6ex]SctSGZxdF4/3BaпyZ1!5RovgRAOautX;'$:i¬ά_I?=BTs˻sA>jxh^W^ek{ʷ}tjP.Dyrb[\cvѨuZ_mztR12`Ժ~fQGFLYsƢyR5+:[}vbW^`R@79EYpͷX" -BUch\F1&%.A_޻}u|rX>,%(9YßtP9./hzshemŠpE'&Gp¹X:)$)7PzԹiI6:Q_`q}Y5#,NyŴlJ75Isð|^=>PevygH,0Xҿ{s[66Hrţwomsý|W, +Yl`UQ`zzR-2M[gruvjams`JPluldbrΪ]F<@YشaSe|yh\Zfɳ]8! ?i]=(#1WܼkSIIP[fq~cD$?oĹpK2&.Pίŧlbn~slm|yfa_XH. I͸xl{x¯]8 &EgƠz`OFGNZoIJY5$>h޷{f[WZdzҶL19Qixu^P_v{lWHCFUxỐmSFLfy`>&5`Ƿ{dH7BV\bˣfYUW]fwɿpJ"4`ȯrWHFVyůlJ3''5Sw֭h\G?Skh^d}ßlB8QpwbLNjoZOUclt~œgIKU]\J2%6LlϳYAEJA=ANj̼k[ZjoE'%9VźmM2!";eđk\h~dho]=(,Jq~cMEQnȾ]A0*.=YǢ}lss`T_bYbx}~}ucYN;3eȵɶ[1-Rp]ci_K=9?K\o̜qUN\u}yo\I7#6gЫubW\wlRXryYA8CajK813>U|ά]=?Zost}s\Tj}ursyĒqlpmryuY9!/FaبxSETt¿]E87DdЯeRKTld=;[fyǩ_8%Kt_C8Hlì[?7Myteanxe^M3!0D[~ϠrO;KhthYQVj{snlli_N?8;FWkӰdB6?KXbilhZD3,.7EXtջtbWWf~zhO8**>cĶvWQVM;,'+5CRapƧzSHKG?7@avppszsf]WO>*'Jn~ۺ|dC''8Rr\<7Mnk\Yj­ȝr_dnuvd/8Qgto^NEERbn|›kE*'=W]c{kK?HZ{ؼ~vrmgZQOB1'&/HqͼqM7,,4AQcuӾxwo]F5/9FP^oɶwhZG-&=RjΣ~{hZap}rU;,)0?Qexըw`ixvdRIEGRl®{`OHIO]ozukc[J2!2F[rǠv]RVNABFFN\gq|ʩ{WCGbkXOMQZdptYZpyz~}}~tcSKMWfvѹdZ_X=%"#(K_^ZY[aqҷpWKHN_¾z[4 :^~wsodnvmixƬaI;8;1+-6AO_q˼~^?," 2SzǵiYPPW`lwǼiB('3758?K\nw{ǿkM<>BAFP^m|¨^@-$$0MqsYE;;BN^rõqF07Mah_QGDGP\iyƽeI;>GVn˶iNIZnv|y`OFFRlod`bgo{s]?1;K\kwzre[Y_jxײpc\ZZ\]__`eqCvkb\UME;106BSmɱy`NC6/2>Vjoxykm}yprtmkuveYTWf~uinx{wnjjpysgaXPGA>=;1"#6U~««{iYRT`vqXRWRLKQZjˮsQ7'%6TsqQI[nsi^XY_jw­}wrleVA/(Hnǽ}}ĥzS5" )5Fa}iH33Klwlffjr~ȴs]KMSJ;?Xv}tueA! .Fiư~vmfccc]PD?AJZk~ӿ^H8) #*5Gb{rortm]NKWdkuзnQ?9:@IS`t}cO:+'+4AO]jzı}tcL;328E]˾sYG@BKXgvǾqbb\I3#".DcDZt`USXbpx]LID5'!")6Moӿk`fzoQ;3JS\gu̾p|ulZ?$:^||qnpw];!-Jizvppusnyz{ΨfTKHIR`soL1"!*7FWfr|üxbL=57@Ob}ŷiE+&?Yhu}ulghg]L?;=FVpǸmVB639DSdtȷuSE@6-.=Zrxy}ɱgG1)-3?[vh\YawrQ>?TplPHVop[OMR]lzƵqbL4#):NcwоiK2!)8HYjĵrO2&4G^ynTDGQ\a\M@:AXxuw|`IDIOTY\YLCM`rƵ{cW[dd`^\ZYWV]o}iSC;BSdpvwuqk]I6+)0B`طxsmV?0+0=N[\NCGTbnxsmnu۽zxucM<7BWccdfhjlnwzjjqvvkWD87KqƷ¿wpjdYG6,,3?O_s~|nREEA?EQ[`\SR\fo~DZscM8+(-9HZk{yk]M7!!4H^u;|lb_`cfjlmoswwn_SOR\hxŵmRA!1GcüuN61110.,'" /BXnŬbE;E^wxopojjowɼxpi^L;/0?R`it¾tlru[JHVhw|wusj[MFEKTczĵwY@2-09ES_kw~nU;*"#+8IYizȽoRBEXq}snnt}rdb_N8#)7H`||oaR>$ *?Sg{ʻ|tuy|]8  '7ESaq~}qcYV\nгzvwzzfK/!/AWrȿ~xqjf`TLKWsŹziZPOYil`UMKRbrsqx{vspooqtw}eB /BTfvİkUJRlpednypfXE2'%*5CSbp|z~toqqnmnoomf[LI[xûraYY]eox~zrh\L2 ?e࿨}hXPS]envwieb``___acfkosqjeegoyrP/>dudZZjʾhSGBEN\m~xi[I3$&-6@KWcmuvohksyǹoX<' !Hjy}nc_duƽqfXE7106Fa\LB=@IUcr˾iH/,;Qi{}stvpy~zzĹ}_K>9:AJS\ckwxohaUC715?Nau̻xYOJ=1+,4HftS;08AMi|p\MGIRas¿~l[LA:773(0Siot{q_G. -Dc¾}scQE?>DO_qvld^ZWXap~rkjloqsuvxz|Ǿ{wwumjrrbN@61//259BVottz}skjrоucYUW[dvrrugL7.1>P`kqspeSHKWcpyxoknpvĹeI2#,Gitiivyspmh`WLFFMYhwƷ|k\PIFED=3*(-:J]qxevil-2.02r2.orig/win32/res/MISSLE25.BMP0100644000175000017500000000225606604100420016535 0ustar aaronlaaronlBM6(xhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,||,,,,,,||||||||~~,,,,,,~~~~##,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/MISSLE39.BMP0100644000175000017500000000242606604044320016547 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,||,,,,,,,,||,,,,,,潽||,,,,,,潽|||,,,,,,潽~||,,,,,,,潽~~,,,,,,,,~,,,,,,,,,xevil-2.02r2.orig/win32/res/MISSLE40.BMP0100644000175000017500000000244606604044320016541 0ustar aaronlaaronlBM&6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,|||~,,,,,,,,,,,|||~~~,,,,,,,,,,,,||~~,,,,,,,,,,,,,,,,|,~,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/MOVER.BMP0100644000175000017500000000606606624436530016305 0ustar aaronlaaronlBM6 6(@ hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,|,, ,,,,,, ,,,,| ||||||||| |||| ||||||||||||| || ||||| |||||||| |||||||||||| || |,|||| |||||||,,,,,, ||||||||||, ||, |, ||| || ||||| || |||| ||| |||||, |,| |, | | || ||||||||||||| ||||||| |||| |, | |, || || | ||||| | ||||| ||| |, || |, || || |||||||||| |||||||| ||| |, ||, |, ||||| | || |~~~~~~~~| | ||||| |, |,| |~~ || | | |||| ||||| | | ||||||||||||| | , | ||,,,,,,||| , | ||||||||||||| |||||||||||||| | ||~,,,,,,|| | |||||||||||||| | , ||||~|| |||||| , || || | ||||~,,,,,, || || ||||||||,, || || , ||||~,,,,,,|, || |||,, |||||||| ,,, || | | ||||~|| |||||| | | |||,,, | |, |,,,, | , |||~,,,,,,||| , | |,,,, |, | |, |,,,,,| | | |||~,,,,,,||| | | |,,,,, |, || |, |,,,,, | ||, |~| ||| |, | | ,,,,, |, ||, |, |,,,,,|| | | ||||||||~||||| ||,,,,, |, |,| |, |,,,,, | ,| |||| |~||,|||| ,,,,, |, | |, |,,,,,| || |||| |~| |||||,,,,, |, || |, |,,,,,|| |||||||~ ||||||,,,,, |, ||,|,|,,,,||| |||||||||||||||~ |||||||||||,,,,|,|,|||||||||,,,||| |||||||    |||||||||,,,|||||||||,,| ||||| ||,,,,,, |||| ||||,, ||||||| |||||||| |||||||||||||| || ||||||||||| | |||||||||||||||||||| |||||||||||||| ||||||| ||||||||||||||||||||| ||| ||| | | | | xevil-2.02r2.orig/win32/res/MOVERSQ.BMP0100644000175000017500000000406606624472636016556 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U@@,,,,,,,,,,,,,,,,,,,,@@@,,,,,,,,,,,,,,,,,,,,@@@@@,,,,,,,,,,,,,,,,,,,,@@,@,,,,,,,,,,,,,,,,,,,,@,,@,,,,,,,,,,,,,,,,,,@,,@,,,,,,,,,,,,,,,,@,,@,,,,,,,,,,,,,,@,,@,@,,,,,,,,,,,,@@,,,@,@,,,,,,,,,,@@,,,@,@,,,,,,,,@,@,,@,,@,,,,,,@,,,@,,@,,,@,,,,@,,,@,,@,,,,@,,,,,,@,@@,,,,,@,,,,,@@@,,,,,,,,,,,,@,,,,,,,,@,,,,,,,,,,,,,,,,@,,,,,,,,@,,,,,,,,,,,,@@@,,,,,,,,,,@@,@,,,,@,,@,,,,@,,@,,,@,,,,@,,,@,,@,,@,,,,,,@,,@,,@,,,,,,,,,@,@,,@,,,,,,,,,,,@@,,,@,,,,,,,,,,,,,@,,,@,,,,,,,,,,,,,,@,,@,,,,,,,,,,,,,,,,@,,@,,,,,,,,,,,,,,,,,,@,,@,,,,,,,,,,,,,,,,,,,,@,@@,,,,,,,,,,,,,,,,,,,,@@@@,,,,,,,,,,,,,,,,,,,,@@,@,,,,,,,,,,,,,,,,,,,,@xevil-2.02r2.orig/win32/res/MOVERSQU.BMP0100644000175000017500000000406606624472630016675 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U, || ,,,,,,,,,,,,,,,, || ,, ,,,,,,,,,,,,,,,, ,, || ,,,,,,,,,,,,,,,, || ,, ,,,,,,,,,,,,,,,, ,, || ,,,,,,,,,,,,,,,, || ,, ,,,,,,,,,,,,,,,, ,| || ,,,,,,,,,,,,,, || | ,,,,,,,,,,,,| || |,,,,,,,,,,| || | |,,,,,,,,|| | || ||,,,,,,|| || , , ||,,,,|| , ,, || ,, ||,,|| ,, || ,, ,,, |||| ,,, ,, || ,,,, |||| ,,,, || ,, ,,,,, ||| ,,,,, ,, || ,,,,, ,,,,, || ,, ,,,,||||,,,, ,, || ,,,|| ||,,, || ,, ,,|| ,, ||,, ,, || ,|| ,,,, ||, || ,| || ,,,,,, || | || | ,,,,,,,, || || | ,,,,,,,,,, | | || ,,,,,,,,,,,, | || | ,,,,,,,,,,,,,, , || ,,,,,,,,,,,,,,,, || ,, ,,,,,,,,,,,,,,,, ,, || ,,,,,,,,,,,,,,,, || ,, ,,,,,,,,,,,,,,,, ,, || ,,,,,,,,,,,,,,,, || ,, ,,,,,,,,,,,,,,,, ,xevil-2.02r2.orig/win32/res/NAPALM1.BMP0100644000175000017500000000246606604107440016437 0ustar aaronlaaronlBM66(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,~~,,,,,,,,,,,~ /,,,,,,,,,,,,~/,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/NAPALM2.BMP0100644000175000017500000000246606604044320016435 0ustar aaronlaaronlBM66(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,~,,~~~~,~, ,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/NAPALM3.BMP0100644000175000017500000000246606604044320016436 0ustar aaronlaaronlBM66(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,/~,,,,,,,,,,,,/ ~,,,,,,,,,,,~~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/NAPALM4.BMP0100644000175000017500000000246606604044320016437 0ustar aaronlaaronlBM66(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//, ,~,~~~~,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/NAPALMS.BMP0100644000175000017500000000260606604044320016472 0ustar aaronlaaronlBM6( PhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,~~~,~~~,,~,~,~,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/NEWPISTO.BMP0100644000175000017500000000224206604044320016643 0ustar aaronlaaronlBM6( lhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,|V,,,,,,,,,,,,,,,,V,,,,,,,|,,,,,,,,,~~~~,,,,|V,,,,,,,,xevil-2.02r2.orig/win32/res/NEWSONG.MID0100644000175000017500000011642506630123700016516 0ustar aaronlaaronlMThdMTrkNewSongQR 3 @  @ $ @ @-Z+-^U-R9-@G-W-]|4_54]K4U\4W$4]y4M0NK0[50O0Oq0R0W|7W7]j7H7[o6]6g6UH6Q8-_2-bN-GN-T2-R-W~4Z$4^\4RC4T=4WR4N.0U70^I0H$0P\0Oi0W7U7cz7N7`r6_6d}6R6Wh-Z#0_15RW-^u0K`-RN8N5SY-@[?Z?]'7Kw?Z8F%?^[0`*-W7OB5W/-]|4_0_>6U5MK4]K4Ua7Hi6O4WM7T?_*5Z)?`<0_H4]5V08E,4Mr8U0N0_J5U0[50O/8N;5X%0O?j7E 8K!?dR0^B7I 0RN5]60Wd0b7W76U,5J37]j7H67J[7[6E\7R 6]?e5_U6gg?Tv0b5T 6U08K6Qg8UQ-_#0_15R^-bN-GN8N5Sn-Tc?]'7K~8F%?^[0`*-R7OB5W--W~4Z0_>6U5M:4^\4Ra7Hb4T6O_7T?_*5Z)?`<0_H4W5V08E4N8U0U0_J5Um0^I0H/8N;5X:0P}?j7E 8K!?dR0^B7I 0ON5]0W0b7U76U,5J#7cz7N67JX7` 6E\7R 6_?e5_W6de?Tv0b5T 6R08Kh6W8UQ  @-Z#0_15RW-^U-RN8N5SY-@x?]'7K~8F%?^[0`*-W7OB5W/-]|4_0_>6U5MK4]K4Ua7Hi6O4WM7T?_*5Z)?`<0_H4]5V08E,4Mr8U0N0_J5U0[50O/8N;5X%0O?j7E 8K!?dR0^B7I 0RN5]60Wd0b7W76U,5J37]j7H67J[7[6E\7R 6]?e5_U6gg?Tv0b5T 6U08K6Qg8UQ-_#0_15R^-bN-GN8N5Sn-Tc?]'7K~8F%?^[0`*-R7OB5W--W~4Z0_>6U5M:4^\4Ra7Hb4T6O_7T?_*5Z)?`<0_H4W5V08E4N8U0U0_J5Um0^I0H/8N;5X:0P}?j7E 8K!?dR0^B7I 0ON5]0W0b7U76U,5J#7cz7N67JX7` 6E\7R 6_?e5_W6de?Tv0b5T 6R08Kh6W8UQ  @-Z#Hg0_ 5R# 4-^XH_.-R>8N5S_.. -@" VEe?]7K@, 8F?^E\,0`*-W 7OB5W  -]|4_0_>6U5M14],0/!Eb4UC7Hi6O E\4W,^C7T?_*5ZN[?`2 0_H4]5V08E,4Mr8U0N0_6Eb5U090[PE^a0O,8N)5XOV0O7[?j7E 8K?dR0^B7I 0RNEb5],\.0W6U5M:4^ME_4Ra7Hb4T6O8EZ'7T?_*5Z%,X?`50_H4W5V08EP.4N) 1,8U0U0_Eb &5U+0/"0^ 2_1E\+,%0H/!8N. 5X"!0$\! 0P%X?j ! 7E"&,*0-8K!?d/--%0^ %17I 0O.5]#Eb - 00W ,10b7U76U EN5J#7cI17N67JX7` 6E\7R 6_?e5_EZCN$6de?T=C(EY0b5T 6R08Kh6W8UQ  @-Z#0_H_5R-*-^01%Hb0-RG8N5SG-@X Ee?]7K1 . 8F$?^0E^0`'-W 7O$ 5W10,-]\4_0_ 6U 5M +4]0, 1!04U$Eg 7HP6O4W1!E` 0 . 7T?_"5ZV/$?` .0_-4]5V& 8E$ 1,+4M]8U0N0_ (5UEg .10[*"0%7E\$0O!)8N%5X$1 0 0O= 0%?j 7E%0, 8K!?d. 0^#0&7I 0R!(*Ee5] +'(/&.#(0W.EZ0b7W 6U 5J 7] , 10,!7H'7J(%7[6E1 , 017R 6] ?e5_E]& 6g 0%?T Ei?0b5T 6U,8K 6Qg8UH -_#Lb0_#5R0(.-b,.0#L_ 2p-G.,'8N5S0,1 0 -T 1Eb?]7K1#0$8F%?^!EZ')0`)"-R + 7O',5WB(0$1! -WR#,(4Z0_#,6U0 5M%34^608.9_54R)1., Ee7H').( 4T6O'sEd*1,7T?_%/5Z+205,6"?`7-0_6,.4W%5V+8E'1-4N ]0 8U0U0_- 5UEg%!,&0^+/../(EZ00H (&8N ",5X)_.0P}?j7E(0!,$ 8K!?d'1*0^-0.7I 0O&-(5])Eg$1, 0W&1 (0b 7UEV 6U5J7cS, 1 0 7N$7J; 7` 6E1..17REb 6_ ?e5_ 06d.E\?T!/#.! 0b5T 6R(8K006W$1B8UK  @-Z#0_ "@b 5R ')/%-^ 3,506(@_74-R -.(8N5S"0 -@#/((E_ ,?]07K2.338F!E\?^ 4R0` 2-W.7O*(5W"0,1 -]# 0 )4_ 0_%6U5M*!4] 1\1Eg4U.,7H* 06O4W E`\07T?_*5Z^/?` *0_ B4]5V. 8E[ Q4M .18U0N0_, 5UEg ",&-0[(]'0&E^ 0O "#8N*5X/,00O,P?j7E*108K!?d:0^B7I 0REg %5] ,100WE\@0b7W6U,5J37]F$7H7JK7[6E ap7R 6]Eg?e5_@6g , ?T E_(, 0b5T 6U *8K (006QX8U .-_#0_ '5R6U5M- 4^$ ,0\4R1. 7H, Eg4T6O" . 1 \ 7T?_EY5Z (01?`'0_ 14W5V /8E1,(4N 0,1#8U0U0_(,,5U-Ee2,10^-1'0,E]0H!8N+5X _.,0P32?j7E/!/$/8K(!?d,//0^2'7I40O+6#5]:Eg4,+10W$,,Ed#0b 7U"6U,5J 7c)0 1&,+0.7N/7J*1#7` 6E,10=7R 6_9b?e5_. 6d%.(?T9`*0+20b5T 6R -'8K /10,16W8U$0-  @-Z#0_.80b37U9T 0 6U,5J#7c134,80<1?,A7N67J@,>7` 6E;08-50377R 9_6_?e5_508 6d";C?T9c <,=,0b5T 6R>8Kh6W8UQ  @-Z@g0_15R@0A-^H@e>,7,01$-R08N5S-0 \ -@,!9b ?]&#7K+'0)#8F*9`?^,0-0`/-W7O 085WU,0(*-]%.$J4_0_ %*$ 6U5M #0 4]1.. #4U9j H7H ,,6O4W9[ 0a!7T?_ 5Z 10, ?`<0_,4]5V"8E . 014M0'8U0N0_!#9e5U ) /0[.&9^ 0 0O 8N"5X,01 0O" 0 1 ?j7Ek "8K ?d10^$7I 0R09e5].0 , 0W 9b'0b7W/6U,5J( 7]&.. _ 7H%7J/ 7[6Ea\7R 6]9b?e5_  06g'1?T! 9e*"'0b#5T 6U"8K 01%6Q008UQ-_#0_6U5M -4^"/%1'0(L4R'1! 7H:9j4T6O0^9\"7T?_*5Z/^ ?`%!0_(//4W5V4 8E7.8.54N.,(0$$8U !0U0_& $5U-9e#,(0^**\)1(0H!8N9O 5X0, 10P,1 ?j7E,1 8K ?d00^)7I 0O 05].9e0!0W /00b7U +6U'9S5J#7c90,e7N(7J"17` 6E 0 1 \ 7R 6_9]?e5_06d,, ?T9c #0'"0b +5T 6R-8K0.2#6W5.6.8-8U9M  @-Z#0_Ee85R9,;-^!<:Eh#:03'-R-1"8N5S,1\-@0(9b #?]'7K)%,,-8F9^ ?^[0` , -W7O),&5W."./$-] .B4_0_=6U5M1" 4]#&.)_#4U$9_ 7HX6O 4W!'9b |7T?_*5ZC1"0&?`')0_H4] #5V8E0,1 4MQ!8U0N0_+5U9bR0[0X9W0O!8N 5X 01,0O, .. ?j7E\8K!?d00^B7I 0R59b5]!,i0W$9^0b7W76U,5J27]+10, 17H- 7J%17[6E# .1.,7R 6]9]?e5_  -6g0,9e?T'00b  5T 6U8K|6QV8UK-_Eb0_ 5R!,#-b3Eh ,0$-G , 8N5S 1,0 0 (-T5$9_?]'7K ,$.)8F, 9\?^".00 0`*-R7O-+5W+,(1&,$-W"0!, 4Z0_>6U $5M'(4^ (0*](0#4R19_7HL4T6O 1, 9e#17T?_ 5Z /.0 ?`,0_)4W5V8E0 .4N1.8U 0U0_. 9j5U.-0^00*9U, 0H$ 8N&5XG 0,0P03?j7EG,8K ?d&,0^#1(7I 0O).* 9e5]#+/-..0WD-%9\ * 0b7U('&6U,5J%7c@&/(0*[7N2'7J(#07` 6E(,7R6_9Z?e5_-*6d$.*1/?T9g&4.70b5T 6R08K6056W8U 617  @-Z90_Eg ;5R"=.?-^'@]E[<,6!-R+. 8N5S 0,10-@1+?] 7K "/&0)8F+ ?^%.000`&3-W7O5)5W7\31/-]*0&1# 4_0_!)6UEg $5M#/&4]+).*/)E_("4U.7H0 6O 4W+. . 17T?_5Z1,/?` <0_"&4] 5V8E10, 4M+0 8U 0N0_15UEg,1 0[O%EW / 0O' 8N(5X,0+0O.0 .?j7Es8K?dR0^0 7I 0R , 5]60W. , 0bEb7W )6U$5J+7]1,!EY0(7H , 7J/ ,7[6EY . 1$7R 6]?e5_0%6g .0?Tv0b5T 6U08K6Q0 8U E-_Ee0_15R%0 -bSE]#,-G <8N5Sp,0"-T,(?]Eg 7Kn8F?^FE_0`*-R7O&5W ..1 -WG14Z0_Ej 6U 5M4^0Ein4R :E] 7H 0 4T6O1 #E` , 17T?_*5ZP1(?`00_'!4W 5V08EHgi4NHc8U0U0_J5UJ#0^ 1,a0H*8N8Le5X!,0#1' 0P )LaW?j( 7E%0#@8K!?d,%&0^ &,' 7I 0OHU%0$5])%1'Hh(*0W-1/30b7U7Le6U,5J (7c#0/Lb0%7N/7J '&7`6E.\R7R 6_ ?e5_HRG] "%6d &,(-?TGLHc',$0b5T# 6R)"8K% 06W\8U"-&  @LM-ZHNEJHg0_ 5R" /-^'1H_+-R0 8N5S .0+. -@! VEe?]7K@, 8F?^E\+0`*-W 7OB5W  -]|4_0_>6U5M14],0/!Eb4UC7Hi6O E\4W,^C7T?_*5ZN[?`2 0_H4]5V08E,4Mr8U0N0_6Eb5U090[PE^a0O,8N)5XOV0O7[?j7E 8K?dR0^B7I 0RNEb5],\.0W6U5M:4^ME_4Ra7Hb4T6O8EZ'7T?_*5Z%,X?`50_H4W5V08EP.4N) 1,8U0U0_Eb &5U+0/"0^ 2_1E\+,%0H/!8N. 5X"!0$\! 0P%X?j ! 7E"&,*0-8K!?d/--%0^ %17I 0O.5]#Eb - 00W ,10b7U76U EN5J#7cI17N67JX7` 6E\7R 6_?e5_EZCN$6de?T=C(EY0b5T 6R08Kh6W8UQ  @-Z#0_H_5R-*-^01%Hb0-RG8N5SG-@X Ee?]7K1 . 8F$?^0E^0`'-W 7O$ 5W10,-]\4_0_ 6U 5M +4]0, 1!04U$Eg 7HP6O4W1!E` 0 . 7T?_"5ZV/$?` .0_-4]5V& 8E$ 1,+4M]8U0N0_ (5UEg .10[*"0%7E\$0O!)8N%5X$1 0 0O= 0%?j 7E%0, 8K!?d. 0^#0&7I 0R!(*Ee5] +'(/&.#(0W.EZ0b7W 6U 5J 7] , 10,!7H'7J(%7[6E1 , 017R 6] ?e5_E]& 6g 0%?T Ei?0b5T 6U,8K 6Qg8UH -_#Lb0_#5R0(.-b,.0#L_ 2p-G.,'8N5S0,1 0 -T 1Eb?]7K1#0$8F%?^!EZ')0`)"-R + 7O',5WB(0$1! -WR#,(4Z0_#,6U0 5M%34^608.9_54R)1., Ee7H').( 4T6O'sEd*1,7T?_%/5Z+205,6"?`7-0_6,.4W%5V+8E'1-4N ]0 8U0U0_- 5UEg%!,&0^+/../(EZ00H (&8N ",5X)_.0P}?j7E(0!,$ 8K!?d'1*0^-0.7I 0O&-(5])Eg$1, 0W&1 (0b 7UEV 6U5J7cS, 1 0 7N$7J; 7` 6E1..17REb 6_ ?e5_ 06d.E\?T!/#.! 0b5T 6R(8K006W$1B8UK  @-Z#0_ "@b 5R ')/%-^ 3,506(@_74-R -.(8N5S"0 -@#/((E_ ,?]07K2.338F!E\?^ 4R0` 2-W.7O*(5W"0,1 -]# 0 )4_ 0_%6U5M*!4] 1\1Eg4U.,7H* 06O4W E`\07T?_*5Z^/?` *0_ B4]5V. 8E[ Q4M .18U0N0_, 5UEg ",&-0[(]'0&E^ 0O "#8N*5X/,00O,P?j7E*108K!?d:0^B7I 0REg %5] ,100WE\@0b7W6U,5J37]F$7H7JK7[6E ap7R 6]Eg?e5_@6g , ?T E_(, 0b5T 6U *8K (006QX8U .-_#0_ '5R6U5M- 4^$ ,0\4R1. 7H, Eg4T6O" . 1 \ 7T?_EY5Z (0.?`'0_ .4W5V /8E/,(4N .,1#8U0U0_(,,5U-Ee2,10^-1'0,E]0H!8N +5X _.,0P32?j7E-!.$/8K( !?d ,./0^2'7I40O+6#5] /Eg4,+.0W$,,Ed#0b  7U!6U5J 7c)0 1&++0.7N/7J*0#7` 6E,10=7R 6_ 9b?e5_. 6d%+(?T9`*0+,0b5T 6R-'8K /(0,16WZ0 8U! 0,  @-Z#0_  .80b37U9T 0 6U,5J#7c134,80<1?,A7N67J@,>7` 6E;08-50377R 9_6_?e5_508 6d";C?T9c <,=,0b5T 6R>8Kh6W8UQ  @-Z@g0_15R@0A-^H@e>,7,01$-R08N5S-0 \ -@,!9b ?]&#7K+'0)#8F*9`?^,0-0`/-W7O 085WU,0(*-]%.$J4_0_ %*$ 6U5M #0 4]1.. #4U9j H7H ,,6O4W9[ 0a!7T?_ 5Z 10, ?`<0_,4]5V"8E . 014M0'8U0N0_!#9e5U ) /0[.&9^ 0 0O 8N"5X,01 0O" 0 1 ?j7Ek "8K ?d10^$7I 0R09e5].0 , 0W 9b'0b7W/6U,5J( 7]&.. _ 7H%7J/ 7[6Ea\7R 6]9b?e5_  06g'1?T! 9e*"'0b#5T 6U"8K 01%6Q008UQ-_#0_6U5M -4^"/%1'0(L4R'1! 7H:9j4T6O0^9\"7T?_*5Z/^ ?`%!0_(//4W5V4 8E7.8.54N.,(0$$8U !0U0_& $5U-9e#,(0^**\)1(0H!8N9O 5X0, 10P,1 ?j7E,1 8K ?d00^)7I 0O 05].9e0!0W /00b7U +6U'9S5J#7c90,e7N(7J"17` 6E 0 1 \ 7R 6_9]?e5_06d,, ?T9c #0'"0b +5T 6R-8K0.2#6W5.6.8-8U9J96U $5M'(4^ (0*](0#4R19_7HL4T6O 1, 9e#17T?_ 5Z /.0 ?`,0_)4W5V8E0 .4N1.8U 0U0_. 9j5U.-0^00*9U, 0H$ 8N&5XG 0,0P03?j7EG,8K ?d&,0^#1(7I 0O).* 9e5]#+/-..0W,-%9\* 0b7U('& 6U,5J %7c,&.(0*,/7N * '7J'#07` 6E%+0X7R6_9Z?e5_-*6d$.*1/?T9g&4.70b5T 6R08K6+56W0, (8U 607 EO LR  @HU-Z90_Eg ; 5R! =+?-^8N5S_.. -@" VEe?]7K@, 8F?^E\,0`*-W 7OB5W  -]|4_0_>6U5M14],0/!Eb4UC7Hi6O E\4W,^C7T?_*5ZN[?`2 0_H4]5V08E,4Mr8U0N0_6Eb5U090[PE^a0O,8N)5XOV0O7[?j7E 8K?dR0^B7I 0RNEb5],\.0W6U5M:4^ME_4Ra7Hb4T6O8EZ'7T?_*5Z%,X?`50_H4W5V08EP.4N) 1,8U0U0_Eb &5U+0/"0^ 2_1E\+,%0H/!8N. 5X"!0$\! 0P%X?j ! 7E"&,*0-8K!?d/--%0^ %17I 0O.5]#Eb - 00W ,10b7U76U EN5J#7cI17N67JX7` 6ELOH[7R 6_ ?e5_EZCN6d.&?T 4C(EY0b5T 6R08Kh6W#,08UM_ JZ  @-Z#0_H_5R-*-^01%Hb0-RG8N5SG-@X Ee?]7K1 . 8F$?^0E^0`'-W 7O$ 5W10,-]\4_0_ 6U 5M +4]0, 1!04U$Eg 7HP6O4W1!E` 0 . 7T?_"5ZV/$?` .0_-4]5V& 8E$ 1,+4M]8U0N0_ (5UEg .10[*"0%7E\$0O!)8N%5X$1 0 0O= 0%?j 7E%0, 8K!?d. 0^#0&7I 0R!(*Ee5] +'(/&.#(0W.EZ0b7W 6U 5J 7] , 10,!7H'7J(%7[6E1 , 017R 6] ?e5_E]& 6g 0%?T Ei?0b5T 6U,8K 6Qg8UH -_#Lb0_#5R0(.-b,.0#L_ 2p-G.,'8N5S0,1 0 -T 1Eb?]7K1#0$8F%?^!EZ')0`)"-R + 7O',5WB(0$1! -WR#,(4Z0_#,6U0 5M%34^608.9_54R)1., Ee7H').( 4T6O'sEd*1,7T?_%/5Z+205,6"?`7-0_6,.4W%5V+8E'1-4N ]0 8U0U0_- 5UEg%!,&0^+/../(EZ00H (&8N ",5X)_.0P}?j7E(0!,$ 8K!?d'1*0^-0.7I 0O&-(5])Eg$1, 0W&1 (0b 7UEV 6U5J7cS, 1 0 7N$7J; 7` 6E1..M!17REb 6_ ?e5_ JI'6d.E\?T!/#.! 0b5T 6R(8K006W$1B8UK  @-Z#0_ "@b 5R ')/%-^ 3,506(@_74-R -.(8N5S"0 -@#/((E_ ,?]07K2.338F!E\?^ 4R0` 2-W.7O*(5W"0,1 -]# 0 )4_ 0_%6U5M*!4] 1\1Eg4U.,7H* 06O4W E`\07T?_*5Z^/?` *0_ B4]5V. 8E[ Q4M .18U0N0_, 5UEg ",&-0[(]'0&E^ 0O "#8N*5X/,00O,P?j7E*108K!?d:0^B7I 0REg %5] ,100WE\@0b7W6U,5J37]F$7H7JK7[6E ap7R 6]Eg?e5_@6g , ?T E_(, 0b5T 6U *8K (006QX8U .-_#0_ '5R6U5M- 4^$ ,0\4R1. 7H, Eg4T6O" . 1 \ 7T?_EY5Z (01?`'0_ 14W5V /8E1,(4N 0,1#8U0U0_(,,5U-Ee2,10^-1'0,E]0H!8N+5X _.,0P32?j7E/!/$/8K(!?d,//0^2'7I40O+6#5]:Eg4,+10W$,,Ed#0b 7U"6U,5J 7c)0 1&,+0.7N/7J*1#7` 6E,10=7R 6_9b?e5_. 6d%.(EJ?T9`*0+20b5T 6R -'8K /10,16W8U$0-  @-Z#0_.80b37U9T 0 6U,5J#7c134,80<1?,A7N67J@,>7` 6E;08-50377R 9_6_?e5_508 6d";C?T9c <,=,0b5T 6R>8Kh6W8UQ  @-Z@g0_15R@0A-^H@e>,7,01$-R08N5S-0 \ -@,!9b ?]&#7K+'0)#8F*9`?^,0-0`/-W7O 085WU,0(*-]%.$J4_0_ %*$ 6U5M #0 4]1.. #4U9j H7H ,,6O4W9[ 0a!7T?_ 5Z 10, ?`<0_,4]5V"8E . 014M0'8U0N0_!#9e5U ) /0[.&9^ 0 0O 8N"5X,01 0O" 0 1 ?j7Ek "8K ?d10^$7I 0R09e5].0 , 0W 9b'0b7W/6U,5J( 7]&.. _ 7H%7J/ 7[6Ea\7R 6]9b?e5_  06g'1?T! 9e*"'0b#5T 6U"8K 01%6Q008UQ-_#0_6U5M -4^"/%1'0(L4R'1! 7H:9j4T6O0^9\"7T?_*5Z/^ ?`%!0_(//4W5V4 8E7.8.54N.,(0$$8U !0U0_& $5U-9e#,(0^**\)1(0H!8N9O 5X0, 10P,1 ?j7E,1 8K ?d00^)7I 0O 05].9e0!0W /00b7U +6U'9S5J#7c90,e7N(7J"17` 6E 0 1 \ 7R 6_9]?e5_06d,, ?T9c #0'"0b +5T 6R-8K0.2#6W5.6.8-8U9M  @-Z#0_Ee85R9,;-^!<:Eh#:03'-R-1"8N5S,1\-@0(9b #?]'7K)%,,-8F9^ ?^[0` , -W7O),&5W."./$-] .B4_0_=6U5M1" 4]#&.)_#4U$9_ 7HX6O 4W!'9b |7T?_*5ZC1"0&?`')0_H4] #5V8E0,1 4MQ!8U0N0_+5U9bR0[0X9W0O!8N 5X 01,0O, .. ?j7E\8K!?d00^B7I 0R59b5]!,i0W$9^0b7W76U,5J27]+10, 17H- 7J%17[6E# .1.,7R 6]9]?e5_  -6g0,9e?T'00b  5T 6U8K|6QV8UK-_Eb0_ 5R!,#-b3Eh ,0$-G , 8N5S 1,0 0 (-T5$9_?]'7K ,$.)8F, 9\?^".00 0`*-R7O-+5W+,(1&,$-W"0!, 4Z0_>6U $5M'(4^ (0*](0#4R19_7HL4T6O 1, 9e#17T?_ 5Z /.0 ?`,0_)4W5V8E0 .4N1.8U 0U0_. 9j5U.-0^00*9U, 0H$ 8N&5XG 0,0P03?j7EG,8K ?d&,0^#1(7I 0O).* 9e5]#+/-..0WD-%9\ * 0b7U('&6U,5J%7c@&/(0*[7N2'7J(#07` 6E(,7R6_9Z?e5_-*6d$.*1/?T9g&4.70b5T 6R08K6056W8U 617  @-Z90_Eg ;5R"=.?-^'@]E[<,6!-R+. 8N5S 0,10-@1+?] 7K "/&0)8F+ ?^%.000`&3-W7O5)5W7\31/-]*0&1# 4_0_!)6UEg $5M#/&4]+).*/)E_("4U.7H0 6O 4W+. . 17T?_5Z1,/?` <0_"&4] 5V8E10, 4M+0 8U 0N0_15UEg,1 0[O%EW / 0O' 8N(5X,0+0O.0 .?j7Es8K?dR0^0 7I 0R , 5]60W. , 0bEb7W )6U$5J+7]1,!EY0(7H , 7J/ ,7[6EY . 1$7R 6]?e5_0%6g .0?Tv0b5T 6U08K6Q0 8U E-_Ee0_15R%0 -bSE]#,-G <8N5Sp,0"-T,(?]Eg 7Kn8F?^FE_0`*-R7O&5W ..1 -WG14Z0_Ej 6U 5M4^0Ein4R :E] 7H 0 4T6O1 #E` , 17T?_*5ZP1(?`00_'!4W 5V08EHgi4NHc8U0U0_J5UJ#0^ 1,a0H*8N8Le5X!,0#1' 0P )LaW?j( 7E%0#@8K!?d,%&0^ &,' 7I 0OHU%0$5])%1'Hh(*0W-1/30b7U7Le6U,5J (7c#0/Lb0%7N/7J '&7`6E.\R7R 6_ ?e5_HRG] "%6d &,(-?TGLHc',$0b5T# 6R)"8K% 06W\8U"-&  @E_-Z#Hg0_ 5R# 4-^HgLeCH_.-R>8N5S_.. -@" VEe?]7K@, 8F?^E\,0`*-W 7OB5W  -]|4_0_>6U5M14],0/!Eb4UC7Hi6O E\4W,^C7T?_*5ZN[?`2 0_H4]5V08E,4Mr8U0N0_6Eb5U090[PE^a0O,8N)5XOV0O7[?j7E 8K?dR0^B7I 0RNEb5],\.0W6U5M:4^ME_4Ra7Hb4T6O8EZ'7T?_*5Z%,X?`50_H4W5V08EP.4N) 1,8U0U0_Eb &5U+0/"0^ 2_1E\+,%0H/!8N. 5X"!0$\! 0P%X?j ! 7E"&,*0-8K!?d/--%0^ %17I 0O.5]#Eb - 00W ,10b7U76U EN5J#7cI17N67JX7` 6E\7R 6_?e5_EZCN$6de?T=C(EY0b5T 6R08Kh6W8UQ  @-Z#0_H_5R-*-^01%Hb0-RG8N5SG-@X Ee?]7K1 . 8F$?^0E^0`'-W 7O$ 5W10,-]\4_0_ 6U 5M +4]0, 1!04U$Eg 7HP6O4W1!E` 0 . 7T?_"5ZV/$?` .0_-4]5V& 8E$ 1,+4M]8U0N0_ (5UEg .10[*"0%7E\$0O!)8N%5X$1 0 0O= 0%?j 7E%0, 8K!?d. 0^#0&7I 0R!(*Ee5] +'(/&.#(0W.EZ0b7W 6U 5J 7] , 10,!7H'7J(%7[6E1 , 017R 6] ?e5_E]& 6g 0%?T Ei?0b5T 6U,8K 6Qg8UH -_#Lb0_#5R0(.-b,.0#L_ 2p-G.,'8N5S0,1 0 -T 1Eb?]7K1#0$8F%?^!EZ')0`)"-R + 7O',5WB(0$1! -WR#,(4Z0_#,6U0 5M%34^608.9_54R)1., Ee7H').( 4T6O'sEd*1,7T?_%/5Z+205,6"?`7-0_6,.4W%5V+8E'1-4N ]0 8U0U0_- 5UEg%!,&0^+/../(EZ00H (&8N ",5X)_.0P}?j7E(0!,$ 8K!?d'1*0^-0.7I 0O&-(5])Eg$1, 0W&1 (0b 7UEV 6U5J7cS, 1 0 7N$7J; 7` 6E1..17REb 6_ ?e5_ 06d.E\?T!/#.! 0b5T 6R(8K006W$1B8UK  @-Z#0_ "@b 5R ')/%-^ 3,506(@_74-R -.(8N5S"0 -@#/((E_ ,?]07K2.338F!E\?^ 4R0` 2-W.7O*(5W"0,1 -]# 0 )4_ 0_%6U5M*!4] 1\1Eg4U.,7H* 06O4W E`\07T?_*5Z^/?` *0_ B4]5V. 8E[ Q4M .18U0N0_, 5UEg ",&-0[(]'0&E^ 0O "#8N*5X/,00O,P?j7E*108K!?d:0^B7I 0REg %5] ,100WE\@0b7W6U,5J37]F$7H7JK7[6E ap7R 6]Eg?e5_@6g , ?T E_(, 0b5T 6U *8K (006QX8U .-_#0_ '5R6U5M- 4^$ ,0\4R1. 7H, Eg4T6O" . 1 \ 7T?_EY5Z (01?`'0_ 14W5V /8E1,(4N 0,1#8U0U0_(,,5U-Ee2,10^-1'0,E]0H!8N+5X _.,0P32?j7E/!/$/8K(!?d,//0^2'7I40O+6#5]:Eg4,+10W$,,Ed#0b 7U"6U,5J 7c)0 1&,+0.7N/7J*1#7` 6E,10=7R 6_9b?e5_. 6d%.(?T9`*0+20b5T 6R -'8K /10,16W8U$0-  @-Z#0_.80b37U9T 0 6U,5J#7c134,80<1?,A7N67J@,>7` 6E;08-50377R 9_6_?e5_508 6d";C?T9c <,=,0b5T 6R>8Kh6W8UHdL`EW#  @-Z@g0_15R@0A-^H@e>,7,01$-R08N5S-0 \ -@,!9b ?]&#7K+'0)#8F*9`?^,0-0`/-W7O 085WU,0(*-]%.$J4_0_ %*$ 6U5M #0 4]1.. #4U9j H7H ,,6O4W9[ 0a!7T?_ 5Z 10, ?`<0_,4]5V"8E . 014M0'8U0N0_!#9e5U ) /0[.&9^ 0 0O 8N"5X,01 0O" 0 1 ?j7Ek "8K ?d10^$7I 0R09e5].0 , 0W 9b'0b7W/6U,5J( 7]&.. _ 7H%7J/ 7[6Ea\7R 6]9b?e5_  06g'1?T! 9e*"'0b#5T 6U"8K 01%6Q008UQ-_#0_6U5M -4^"/%1'0(L4R'1! 7H:9j4T6O0^9\"7T?_*5Z/^ ?`%!0_(//4W5V4 8E7.8.54N.,(0$$8U !0U0_& $5U-9e#,(0^**\)1(0H!8N9O 5X0, 10P,1 ?j7E,1 8K ?d00^)7I 0O 05].9e0!0W /00b7U +6U'9S5J#7c90,e7N(7J"17` 6E 0 1 \ 7R 6_9]?e5_06d,, ?T9c #0'"0b +5T 6R-8K0.2#6W5.6.8-8U9M  @-Z#0_Ee85R9,;-^!<:Eh#:03'-R-1"8N5S,1\-@0(9b #?]'7K)%,,-8F9^ ?^[0` , -W7O),&5W."./$-] .B4_0_=6U5M1" 4]#&.)_#4U$9_ 7HX6O 4W!'9b |7T?_*5ZC1"0&?`')0_H4] #5V8E0,1 4MQ!8U0N0_+5U9bR0[0X9W0O!8N 5X 01,0O, .. ?j7E\8K!?d00^B7I 0R59b5]!,i0W$9^0b7W76U,5J27]+10, 17H- 7J%17[6E# .1.,7R 6]9]?e5_  -6g0,9e?T'00b  5T 6U8K|6QV8UK-_Eb0_ 5R!,#-b3Eh ,0$-G , 8N5S 1,0 0 (-T5$9_?]'7K ,$.)8F, 9\?^".00 0`*-R7O-+5W+,(1&,$-W"0!, 4Z0_>6U $5M'(4^ (0*](0#4R19_7HL4T6O 1, 9e#17T?_ 5Z /.0 ?`,0_)4W5V8E0 .4N1.8U 0U0_. 9j5U.-0^00*9U, 0H$ 8N&5XG 0,0P03?j7EG,8K ?d&,0^#1(7I 0O).* 9e5]#+/-..0WD-%9\ * 0b7U('&6U,5J%7c@&/(0*[7N2'7J(#07` 6E(,7R6_9Z?e5_-*6d$.*1/?T9g&4.70b5T 6R08K6056W8U 617  @-Z90_Eg ;5R"=.?-^'@]E[<,6!-R+. 8N5S 0,10-@1+?] 7K "/&0)8F+ ?^%.000`&3-W7O5)5W7\31/-]*0&1# 4_0_!)6UEg $5M#/&4]+).*/)E_("4U.7H0 6O 4W+. . 17T?_5Z1,/?` <0_"&4] 5V8E10, 4M+0 8U 0N0_15UEg,1 0[O%EW / 0O' 8N(5X,0+0O.0 .?j7Es8K?dR0^0 7I 0R , 5]60W. , 0bEb7W )6U$5J+7]1,!EY0(7H , 7J/ ,7[6EY . 1$7R 6]?e5_0%6g .0?Tv0b5T 6U08K6Q0 8U E-_Ee0_15R%0 -bSE]#,-G <8N5Sp,0"-T,(?]Eg 7Kn8F?^FE_0`*-R7O&5W ..1 -WG14Z0_Ej 6U 5M4^0Ein4R :E] 7H 0 4T6O1 #E` , 17T?_*5ZP1(?`00_'!4W 5V08EHgi4NHc8U0U0_J5UJ#0^ 1,a0H*8N8Le5X!,0#1' 0P )LaW?j( 7E%0#@8K!?d,%&0^ &,' 7I 0OHU%0$5])%1'Hh(*0W-1/30b7U7Le6U,5J (7c#0/Lb0%7N/7J '&7`6E.\R7R 6_ ?e5_HRG] "%6d &,(-?TGLHc',$0b5T# 6R)"8K% 06W\8U"-&  @EUH]LZ-Z#Hg0_ 5R# 4-^XH_.-R>8N5S_.. -@" VEe?]7K@, 8F?^E\,0`*-W 7OB5W  -]|4_0_>6U5M14],0/!Eb4UC7Hi6O E\4W,^C7T?_*5ZN[?`2 0_H4]5V08E,4Mr8U0N0_6Eb5U090[PE^a0O,8N)5XOV0O7[?j7E 8K?dR0^B7I 0RNEb5],\.0W6U5M:4^ME_4Ra7Hb4T6O8EZ'7T?_*5Z%,X?`50_H4W5V08EP.4N) 1,8U0U0_Eb &5U+0/"0^ 2_1E\+,%0H/!8N. 5X"!0$\! 0P%X?j ! 7E"&,*0-8K!?d/--%0^ %17I 0O.5]#Eb - 00W ,10b7U76U EN5J#7cI17N67JX7` 6E\7R 6_?e5_EZCN$6de?T=C(EY0b5T 6R08Kh6W8UQ  @-Z#0_H_5R-*-^01%Hb0-RG8N5SG-@X Ee?]7K1 . 8F$?^0E^0`'-W 7O$ 5W10,-]\4_0_ 6U 5M +4]0, 1!04U$Eg 7HP6O4W1!E` 0 . 7T?_"5ZV/$?` .0_-4]5V& 8E$ 1,+4M]8U0N0_ (5UEg .10[*"0%7E\$0O!)8N%5X$1 0 0O= 0%?j 7E%0, 8K!?d. 0^#0&7I 0R!(*Ee5] +'(/&.#(0W.EZ0b7W 6U 5J 7] , 10,!7H'7J(%7[6E1 , 017R 6] ?e5_E]& 6g 0%?T Ei?0b5T 6U,8K 6Qg8UH -_#Lb0_#5R0(.-b,.0#L_ 2p-G.,'8N5S0,1 0 -T 1Eb?]7K1#0$8F%?^!EZ')0`)"-R + 7O',5WB(0$1! -WR#,(4Z0_#,6U0 5M%34^608.9_54R)1., Ee7H').( 4T6O'sEd*1,7T?_%/5Z+205,6"?`7-0_6,.4W%5V+8E'1-4N ]0 8U0U0_- 5UEg%!,&0^+/../(EZ00H (&8N ",5X)_.0P}?j7E(0!,$ 8K!?d'1*0^-0.7I 0O&-(5])Eg$1, 0W&1 (0b 7UEV 6U5J7cS, 1 0 7N$7J; 7` 6E1..17REb 6_ ?e5_ 06d.E\?T!/#.! 0b5T 6R(8K006W$1B8UK  @-Z#0_ "@b 5R ')/%-^ 3,506(@_74-R -.(8N5S"0 -@#/((E_ ,?]07K2.338F!E\?^ 4R0` 2-W.7O*(5W"0,1 -]# 0 )4_ 0_%6U5M*!4] 1\1Eg4U.,7H* 06O4W E`\07T?_*5Z^/?` *0_ B4]5V. 8E[ Q4M .18U0N0_, 5UEg ",&-0[(]'0&E^ 0O "#8N*5X/,00O,P?j7E*108K!?d:0^B7I 0REg %5] ,100WE\@0b7W6U,5J37]F$7H7JK7[6E ap7R 6]Eg?e5_@6g , ?T E_(, 0b5T 6U *8K (006QX8U .-_#0_ '5R6U5M- 4^$ ,0\4R1. 7H, Eg4T6O" . 1 \ 7T?_EY5Z (01?`'0_ 14W5V /8E1,(4N 0,1#8U0U0_(,,5U-Ee2,10^-1'0,E]0H!8N+5X _.,0P32?j7E/!/$/8K(!?d,//0^2'7I40O+6#5]:Eg4,+10W$,,Ed#0b 7U"6U,5J 7c)0 1&,+0.7N/7J*1#7` 6E,10=7R 6_9b?e5_. 6d%.(?T9`*0+20b5T 6R -'8K /10,16W8U$0-  @-Z#0_.80b37U9T 0 6U,5J#7c134,80<1?,A7N67J@,>7` 6E;08-50377R 9_6_?e5_508 6d";C?T9c <,=,0b5T 6R>8Kh6W8U*L[He Ea/xevil-2.02r2.orig/win32/res/NIGHTSKY.MID0100644000175000017500000002143006630123700016625 0ustar aaronlaaronlMThdMTrk#NIGHTSKYQ  @  @ [ @ 6 @ B @A>A R>R?b?b$CECEDGDG CXCXwCKCK1DKDKIC]C]A;A;RAPAP.GEGEHJHJ G\G\UH\H\ DKDKD`D`GNGNC=C=GYGYtCPCPDODOAEAE%D]D][?Z?ZA\A\e>W>WS?[?[->\ [ @\j>A R?b$CEDG CXwCK1DKIC]A;RAP.GEHJ G\UH\ DKD`GNC=GYtCPDOAE%D][?ZA\e>WS?[->\C@ [ @0eA R?b$CEDG CXwCK1DKIC]A;RAP.8eGE80dHHJ G\UH\ DKD`GNC=7eGY  8bR83no CPDOkAE%D][?ZA\e>WS?[->\ [ @0e0_A R?b$CEDG0W CX0]g0]CK1DK 0S=C]A;RAP.8eGE0aqHJ0W G\7Po#0[{H\ 0_DKW0P)D`GNC=7_8\GYtCP0eDOOePT.0Y$0_AE%D]"0Q9WS?[->\ [ @0j0_AR?b$CEDG0b CXe0a0eCK1DK3l$30TBC]A;RAP0]8jGEHJ0b G\F\eR0b=H\ 0_DKzHW0QgD`GNC=7eGYj8\s[gCP0eDO(\U0^>0ZAE%D]y0Ub?ZA\e>WS?[Tm>\ [ @7i0e0]A RP6 8l 5 9{?b$CE)36nX0RDG CX0]]0bCK1DK50VC]A;RAP.8eGE80dHHJ0] G\Pj0]3TNH\ 0eDKa0\D`GNC=7eGY  8bR83no CP0eDOOOe 8P[!$6&0]&$6"n#6)8-6/Z0bAE-D]%+5)l*8+b0S *6(6'&(]?Z'A\1%.$6"86959566 6;)>W??[956 q 6 ! 1>\ [ @0e0ewA Rb{?b$eCE'{DG0e CX*0dM0eCK1DKI0TC]]A;=^AP.8eGE0aqHJU0ew G\"\eH3.HV 340`8 39838MH\ 0eDK$kTM0^OD`_GNab7_C=e8\GY'O[b&CP0eDO\T0_b0gAE%D]0X>WS?[->\ [ @U0jIN0ewARbpIY ?b$INeCE'WIU$DGIK0e CXgIUC0dMIK0eCK1DKrI[W0TC]IU]A;=^RIUCAP0]8jINGEIYkPjUIO0ewHJ G\j38)IT 40`8 39838MH\ IK0eDK$\IYTM0^OD`IK_GNabMIUR7eC=IMeGYj8\'IV>ObCPIR0eDOp66 8 IZ0_ T=! 36n6 8 6 6 IU0gAE%D]6861IT30X;$_IR]?ZA\"^RIXqIW>WS?[IUHo>\ [ @U7i0eIN0ewA RbpIY ?b$INeCE'WIU$DGIK0e CXgIUC0dMIK0eCK1DKrI[W0TC]IU]A;=^RIUCAP.8eINGE80d\IYlHJUIO0ew G\Doj38)IT 40`8 39838MH\ IK0eDKH4\IYTM0^OD`IK_GNabMIUR7eC=IMeGY  8b1'!83IV\o CPIR0eDOCjO=Dfv0_IZbIU0gAE%D]eIT80X>IR]?ZA\"^RIXqIW>WS?[IU>\ [ @U0eIN0ewA RbpIY ?b$INeCE'WIU$DGIK0e CXgIUC0dMIK0eCK1DKrI[W0TC]IU]A;=^RIUCAP.8eINGE0aIYlHJUIO0ew G\PjM38)IT 40`WS?[IUHo >\ [ @U0jIN0ewARbpIY]59 5 ?b$INeCE+6').IU=$CIK0eDG CXgIUC0dMIK0eCK1DKrI[W0TC]IU]A;=^RIUCAP0]8jINGEIYd8eUIO0ewHJ G\j38)IT 40`)H_ 39838MH\ IK0eDK$\IYTM0^OD`IK_GNabMIUR7eC=IMeGYj8\'IVWCPIR0eDO7b8d36n)0_IZU IU0gAE%D]eIT80X>IR]?ZA\"^RIXqIW>WS?[IU>\ [ @U7i0eIN0ewA RbpIY ?b$INeCE'WIU$DGIK0e CXgIUC0dMIK0eCK1DKrI[W0TC]IU]A;=^RIUCAP.8eINGE80d\IYlHJUIO0ew G\Dej380N IT 40`8 39838MH\ IK0eDK$\IYTM0^OD`IK_GNabMIUR7eC=IMeGY  8b1'!83IV\o CPIR0eDOCbOfDYM0_IZbIU0gAE%D]eIT80X>IR]?ZA\"^RIXqIW>WS?[IU>\ [ @U0eIN0ewA RbpIY ?b$INeCE'WIU$DGIK0e CXgIUC0dMIK0eCK1DKrI[W0TC]IU]A;=^RIUCAP.8eINGE0aIYZP_UIO0ewHJ G\HWS?[IU>\ [ @U0jIN0ewARbpIY ?b$INeCE'WIU$DGIK0e CXgIUC0dMIK0eCK1DKrI[W0TC]IU]A;=^RIUCAP0]8jINGEIYlHJUIO0ew G\7H_Do,38)IT 40`8 39838MH\ IK0eDK$\IYTM0^OD`IK_GNabMIUR7eC=IMeGYj8\'IVWCPIR0eDO5Cg3DY60_IZbIU0gAE%D]eIT80X>IR]?ZA\"^RIXqIW>WS?[IUE0] \0<CU7i0eIN0ew 3.IT 3/0^ 8 39838XID0]$8I]3TM0[OIO_abpIY/INe'WIU$IK0epIUC0dMIK0e#I[W0TIU]=^RIUq8eIN80d\IYlUIO0ew 38)IT 40`8 39838XIK0e$\IYTM0^OIK_abMIUR7eIMe  8b1'!83IV\oIR0ek30_IZbIU0g IT80X>IR]=^RIXqIWkIUU0eIN0ew_7e+3.IT 3/0^ 8 39838XID0]$8I]3TM0[OIO_abpIY/INe'WIU$IK0epIUC0dMIK0e#I[W0TIU]=^RIUq8eIN0aIYlUIO0ew 38)IT 40`8 39838XIK0e$\IYTM0^OIK_abMIUR7_IMe8\'IV]IR0e0_IZbIU0g IT80X>82bc`P4<! E FQ'7sv *=ñX Gۘ=FY.S>HyM`1ml eDj;f938AV3Ebr0 i`c¹O5)dC&:*7hV},JDS O` \bb` Z(܌o)qۋ!?f8b<{d;wP* X "Ld-$}< Mru: L:^0Lq&FW:= Z8HFG~|@uQOjV- ]5 c!7J pl^nlFf"Ut0!Mo5* !7-^V:0Q=<GLD'7@E7Eddfi])`BqF n9Wnߗ*S2tjbETyb=_ta0^'eL{fomr_K'ci5/(Xa=VH^\~D(m`4{x9mq9 9g>RVe-`!tIHpt.IKuov.#46V sA@s6 =qu!r?q+mCP;@ J-S9hu%:T|RDw3 'Q]0mJ6dfH{]x+X 7kx$oOKAu<3;4<CC:\$ӵrpocz'KtY#yMY(>\&\Rm!]xb@\N쪗M4,vBR٘t<6MkҲt\Y}-*]乐ymospu8K33uӷ{G14UȦg1=xyfX`f_eȩ}e]cP_p6kοyyՖ@aG0x伌__|>xيlL25PZN\iqߟ`:3Oj#_9/Bpxz{z}/T}Ƶ}ifgfirszƽƑ[AutVXspR/ "=s̫oVZsȹi5\-'Zuq}ߓ+A'ĊjYfŠnK;/% /fh cdEAeEDd uޓ]B>Pty1U7&yڥrZkQlçiF-$Z\6=er7y XǖlVUfy}B+NR5;R˜X .lͱ9,H٤~iLB`|}ѤwM,sRyH/Jl,PÌU" MޒP.1ZP-ѡovmh{}m_]yr)p©`7&(dj7!;sep}=.6gΑN20KE}nG$lvw˝uB.HwnkD?3GmR[c_8tԺpAo}}pffx"`giP6i;J.0^LK?.{YAk5YΠR6*2Z`/xJ`k`QV౓u_iw3,&JpX5ey/'a1XݔLtgU5-]ʰwB1FBLN+%.MǸ&3SNWSeP@4|NM=~itdѵtT_cM 8|AGlrQ;aZ@civ >'%y{l?S̒N#X`:/=O7uaxͮߍC18L>Digj.=gi1$'e4аy/>r{fD/_ْZ'6}5 ;η2Es`uReѧx`::Z'6YaqZ@=ʓX8GmjWVlB{^spGLmyѦmXPUz8> 0JT{sxlʚ|iPb^ L+'Nl\ݱm@Anl XtbǠf=8QUXN4=krϤiNdtK& ,5pծWQ{owOyuhۺl=3GuQ!8٪">U8h|ykɜsTfwT |  fpѵ}^g~l5:H#9=p~ʪhTdk(@v#534kteRVjֱ\O[wL^.5/n|xZ<4O|Œ]CIl\j+5^tJ/8]}PBN] -D'+{r<*7S€\HP^ f*>>mz= ,ExӎdMEn@&?H1y~x]$(D潉_NUvI&;J֯l,f\P^W@$Jlͧ{dfrQ6QMѮЌFutUVSJ(7^uή~xӃUA4GMydfY~iGMC4Noɺь[I42ۂ\rF7f]KbXAS`e߫eNgɺܣWbV8WlVUT63KYyzt{ɮrS= ,̱؊rvLHdYT]OFTbt{`H&{VHkj_ncLVerg_e~ؿcVcȌ~T4KWWik\\`fzm`^mºN;b|Y=T\R^^KN\dzwZMPbǴhK& 1♀j;@VSaqf^eemp`[\uɾ½gIRӘlJ\d_puffjk{raZ`Ǽ}U<!n򼘐aM_ZZnnekmn{neaiƝ\5<̖~X`dW`g^akpy|f]Z`z‘T0Kƞ|^`a\emknx~~nkpxǁA2ڧqktffnilyrhjva. 5Yз˾{~_hzkipc_mxjZYf}ϥ`4'=ǴЎ~{RQd[`okiqv|rc]euϸC#".jҧ}eSdd`kjeks}uc\`oÇE!"2vݮnanfepmnx{ljqӇ>,?ڠmeyohohakxyd]_pb-&Sپz]ii^ee_eozl^Yavy:<Œcelbbgaalv{ngepړX>¹ƐkvwwwjfmxzstV quq_|zbbiq~njr\7+ھؒqmgpqcQUdsma`iٔV+,}Ҝiaujend]goxpjgrڥn>*bвucotoutnqxwtz迉b*%SÛpv}z~zx|}x{oF+Fŝ[i{e~^PU_tvvhQWVG4haD>@VdTPeˊS0#|Лnixpjk^VZapzjdjw԰t+>ܿl[W^m}}|xifoh)FsWNMVj}WӶuvnBdycRRTgiXUhwF#Rάŭgmwd~ymN;BQji\Xh԰w5EќlZOWtsfgtvc_h}˳o?@w̽qh^blpx|y{ϕcVĦshzvtjYV_ko`Zbx}O(Ouot_pytnUJQ\q|eWR`xʰV+k}VA/FkwknuhfsrT/0Itykdku{zxx|}zzťa&'fħf`dfnvvuvwxwuxb?/ͿbVHTsu_SOXqvaU\oƓjA 3Ν__qns}rjllrqjmyи^2uԸv][\fwyzΒa5/Yssh^t~zzjgkpxy婃F7nS;*+?^xjeipyý_4&Bot^UZdr|z{pQ5&*:W{k^Z^hud<$7DYrpb[[cp~uZA1-4HhuaVSYgvxaG759Mmyf[Y`n~t\F;=Hawf_al}k[TR\qwnkoyoXD=AMgrf`bkxnVD??Kc{{h]Y]gtnYD79BVsrb[Zbo~p_OJLVkrifjtp\IBGSlxlgisp_USXg||oiiozvaPCBKZtxh`_dp~xjZMKMWj|xkcbfnzyfUE@GRi}mdaeo{seXSV]nxpmpwzj\TW_ouqrwsf]\al|}toosz|l_SMS\k~|rjhjowzodYRRXbp}voihjou|zmbXSW`kz~wrqsv||riccis}~{y{vmgioz}|~~unjjpx{vtuy~xnfbbhqz~vpnnrw|~ujd``fox}vqopsx}~xrommqw~|wuwz~xutv{{z{}wsqsy{wwy}~wroorw}ytqqtx}~xrnkknsy~ztommptz{wrooptz~{vsrsw|zwvwz|z{~}{{|~{z{~}zxwxz}|yvtuwy|~~~|zwusrstvxz{zywtrpprux{}~~}|zzzz{}}|{yvxevil-2.02r2.orig/win32/res/NIN_LO0.BMP0100644000175000017500000000466606604100420016477 0ustar aaronlaaronlBM 6(>hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,mm,,,,,,,,,,,,,,,,,,,,mm,,,,,,m,,,,,,,,,,,,,,,,,,,m,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/NIN_LO0B.BMP0100644000175000017500000000466606604044320016607 0ustar aaronlaaronlBM 6(>hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,F  ,,,,,,,,,,,,,,,,,,,,,,,,,,,mmmme >,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/NIN_LO0C.BMP0100644000175000017500000000466606604044320016610 0ustar aaronlaaronlBM 6(>hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Fe m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, emmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/NIN_LO0D.BMP0100644000175000017500000000466606604044320016611 0ustar aaronlaaronlBM 6(>hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,mm,,,,,,,,,,,,,,,,,,,,mm,,,,,,m,,,,,,,,,,,,,,,,,,,m,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/NIN_LO0E.BMP0100644000175000017500000000466606604044320016612 0ustar aaronlaaronlBM 6(>hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,emm,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/NIN_LO0F.BMP0100644000175000017500000000466606604044320016613 0ustar aaronlaaronlBM 6(>hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm>m,,,,,,,,,,,,,,,,,,,,,,,m>  ,,,,,,,,,,,,,,,,,F,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/NLIFT.BMP0100644000175000017500000000606606624427522016272 0ustar aaronlaaronlBM6 6(@ hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,攽,,,,,,,,,,,,,,,,潽潽,,,,,潽潽潽,,,潽潽,潽潽攽攽攽攽潔l@@@@@@lll@@@@@@lll@ll@ll@l@@@@@@l@ll@l@l@l攽@潽@潔潽@潽潽@潽潽旗潽潽潽攽攽攽攽攽攽潽攔xevil-2.02r2.orig/win32/res/NONE.BMP0100644000175000017500000000451206604100420016126 0ustar aaronlaaronlBMJ 6(1hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/NONE1.BMP0100644000175000017500000000451206604044320016215 0ustar aaronlaaronlBMJ 6(1hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,, ,,,,,,, ,,, ,,, ,, ,, , ,,, ,,,,,,, ,,,,, , , ,, ,,,,,,, ,,,,, , , ,,,,,, ,,,,, , , , , ,,,,,, , , ,,, ,, ,,,,, , , , ,,,,, ,, ,,,, ,, , ,, ,,,, ,, , ,,, , , ,,,, ,,,,, ,,,, ,,,,,,, ,,, ,,,,,,,,,,,,, ,,,,, ,,,,,,, ,,, ,,,,,,,,,,,,,, ,,,,,,, ,,,,,,,,, ,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/PAL.OLD0100644000175000017500000000203006430260100015773 0ustar aaronlaaronlRIFFPAL datah̻f3̙f3f3ffffff3f3333f333f3f3̙f3̙̙̙̙f̙3̙ffffff3f3333f333f3f3̙f3f3ffffff3f3333f333f3ffffff3ffff̙fff3fffffff3ffffffffffff3fff3f3f3f3ff33f3ffffff3f3333f333333̙3f3333333f3333f3f3f3ff3f33f33333333f333333333f333f3̙f3f3ffffff3f3333f333f33f3ffffffffff!___wwwxevil-2.02r2.orig/win32/res/PEPPER1.BMP0100644000175000017500000000247606604044320016460 0ustar aaronlaaronlBM>6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,~~,~~~~ /  ~     ~ / ~   ~  ~ ~       / ,,xevil-2.02r2.orig/win32/res/PILLS.BMP0100644000175000017500000000252606604044320016263 0ustar aaronlaaronlBMV6(  hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,, ,, ,,, , ,, , ,,,, , ,,,,,,, ,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/PISTOL.BMP0100644000175000017500000000215606604125474016423 0ustar aaronlaaronlBMn6(8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,~,,,~,,,,/~~,xevil-2.02r2.orig/win32/res/PISTOL.WAV0100644000175000017500000002662006430176712016442 0ustar aaronlaaronlRIFF-WAVEfmt ++8factV-dataV-j1З]wb[Ou^Dgj^A?V= g~Q/ta]>EȪn0&_ykegyiM0 (." =Źo40S|٢yjU.zůw^YsРdL@Itƫӷumx{ɲtasriaZPGHID5&-OšxoVZ{YgW;9]p\]nY6,+!=U[]WL@JU`nqxƮұͶ\XXUfoK68Uyz\bḩiPZbw~yL.5/M/ BYD +IZs|fqzjbw\?:Nsb[wwow~SDr÷ŤdKwtm[_a:= /=bi~ip_dkuñcS~j^\~vWZ{ºz[Uj}ojмƤt~I5?HKE'6TjbS?, (J²ܿھzhwUKR<;l]]ynYO93l_U~zڏSLdD88('OkIGJ_x~yrmQPeD=Vwӳmh{zcvUgrȧku|l?"""0%0B&$MQT|}a}ÝΩٿiN8Pv|x~dqf3Uyh^vcWzkSmcW_A)QnSdm]QX͵Üp?Ag~ɰriqz`\LZhR]uIOd3-_winodii̦~LFPmnjr[KKkylZnp_x|8CQ6RpyDmdrungWTcܦmsu@`aP"hPotcF6T]^NZa~ykQXqrnE?wwγlw{u~^]_vkyooMOZ}ޱz}zk;6'"Wq\oZGTSZ__q}ZFahy?I{zmȕޱqs[[thؤmlKTiM8tuktuyM3Oz|xqmmQ]hK.TY.#Nr_gi_ov\x̩zfE{~̶l)KrQN04?ůƺCโ{v~fABTGDjbtpILKQJP:;Vqz~{qpPFk¼wzsSE,&G}۽oe^YAETQ~ɫݽo?ty^f_bceht}{W3-,WuŶdf`;!'F?2BKWfүirwtVK9Jߥse?NXR|twukxyX55H;[woyᩡ_bW[ksÊhsZ6AkwW|rSQ; Vnwi|mlGFD3CD^opzgR_贰lG 2^ͭتycs^btp^XUH&?.Gcֳm`^p`E5/*$)Njhu̴~cg}u|ypaN]ȵ~jvffxqE;L@bvVoqvsjn}pt][]a}\ro`ns|jON]WUoҸ{|g9553gZ_qvm~ݯkWUALWewp_rzpcO)1/Q`gizznpQC\̽rJ;`xv潆OO[QH_B&.7LenuUjvhu"pFNluv_k{dy{YFLfeg~}{ejxZF9Gji\ziTYoj^qɳī}c]b`CGȿpaWyoSVes|{surllmey|d~Zq~yN]iba\ktwlt]PqzlS@ax}}wr{?SW7Bg{|Ȳ}v{wv~~p}p~}{}ysgad[FTmyȱzXA:Sska~uy\USD=^idS1#9NJM^ٷzz|ckqlfbztph`hUN^g{giij{}~vtsWXn]ajzp]i}zz~koin}~r`=Tj[DRweWg`asxszxTg{z{j`[L[zz{~x}fszn~~wWabRYj\m|ƭouylW_cZbwwgH2?PPizϪgITc`qzs\T^nwοnsacw^]aa}l_TG2-7Usx|wyvaSN`tg~yoov{t`\g~cH^`=8Qns\bjuzfbXOJMN^hrtpb\nwq{jWKXqwǭ]Qb^_d^WSpzkolbk}ypmvxv_^ywrz}}a[sskkz}xxfQMD3?cǮuj]`lq~qjrpgcntvk{k]n}p_YY{zl`^_PEUds{jpmtxw~}|~tdu|q{ebmtwz{tSdryyyacwsqwoZUVly}hZsvir}splq}mRCDPVTO_t{vpbaUQ\mogXU_t||{rslixruzqkj~}~sn^LVROwzt~|WU\ZYpuiTGKDI_tva_bp~~ty}zsuvw|rnv{vzklzzgei{|nkqwtrp`ggh}{qssl~}wv~{}um{f]q~v`[hmipx|pgd_h{wty}rijddzxr{y~z|ogja\nwyyqpxujnvvxr{~{vqgZR\pss~svte\gpoqv}~yxnel}{vrdRNQ\sz}ljma\cywyzmoxxqr}{}g_gsw{rq~uvp}{vppust|}rimlkfosg``lrolvpuy}|wv{qd|ss{v|uhinpz|siouvw||y|jcgvsuzzy|mda_chs~vmqzvp}}yrrlhjw}y}oq~yw~thqoltz{rjmow|sv}z|}wqszzvvsux{~}sehuupopvwwjjm||skt~xx}yoz}z~{~uvz{tptwy~y}~{usiqtsx~vwwyzpopu|u|zusmemtxxnt{mdhjmgiy}|vtyshmwxz|~}{vqqqungs|vpp}zuvz{xy|rvwspu|{{zwxx~~{vz|~z|wv|~|yrloutu}{{|~}y|}~|}v}|uywojp}vrwsqw|zwvvuyxxzliqxw{~}~{yv~~{{vrru}wt}vqrwppoy~|{w{wzuaat|~~zxwy{~yyxxtpx|{}yw{{vwzz~qptwtrrlo}wy{xsv{ytw|{}wy~}wvz~{y~}~zw{vqqsv{}}xpolgo}{pf`gqstux{{pp{{zw}ukwz}|ysq|yqnssy~|wokpy}y{~~~{urv~ystwx|~z~~wofekr~}{zz~x{vuw~yww|{xy|}yurrx{z{zwwuz{yxz|z~xwzurw}}{zxssx{yw}~}}~usv}}~}|~yywwy~}qsvoliegp||x~{xx|yppx}{~zrrsy~}vppxzvsqqrtz~}|zrr|~xwxz~z{~z{}{}~}~~w{~}~}|~{xuy~~xvwxx{~|{zrklq{|{{z{}~~}}{z{xs{}}~vt{{x{z}~x||zxw{~{}~{vqpsurw{}{|}|}xxxwy~z|}{umilpv|yxwz~~|||}||yrsy~~}wpsuz~~{}|yzz{ztotz~xvxxwwvy~~~|y{{z|~{wtvwvvvyxwuqoqu}yuw{}}xsuz~zyz}|z|}|}ywuvz{z}~|tqpqwwtqqsux|{torssuy}}z|}zwvv{~~~~}~}}|sjksvuv}}wstw~~zy{zz|~|ytmkp|zxz}~}zwzzwwxyz||vx}}}{xvz}{yzz{{~|}~}|~}zxwuvz{}~xz}z{{z{|~z|{xwwwy{urstuw{~}xwwx~ztuzxsw~~ztrty{|}|{~~zx{zz~~xvtuy{~~yv{}{~}{wtuwx{z|}|{{}~{z|}|~~~~~{{~yz{~|zxvvz||}}||}~~{{~~{z{{~|xxyz}}~~|yz}~~~|yy}||}wtssv{~||~|zyz~~}|}}|{}~|||~|y}}|~~|~}{{|~~~~||}~ysoos{|z|~ywwxz||~{ywux{~{z}|vu|~~|~}~yvwz}}zz{}~}|z}~|}~{wv{~||{z~}xtuy}|xwz~}|zz~}}~}~}wrtwx|}}{xz|{vqmjnu}~zyz{zxxz}~}}yz}}~{yxz{~{zz}}z|}}yuwy{zxvvvz~~{{~zxxy}~{{}}z}~~zyz~}}{|}yxyzyz~~~}}~|ywxvtv{~|{~}||~~~}zwvwxwwz{|}{yzwrqux~}yz{}~}}{{}wuvw{~~|zyyz{|~~~~}|}{|~~{yxy{~||}}|~{|}~|~~|}}}|zy{}}~|z{{|~~~~}||{}~~~}||||yx|}|zy|}||}~|wuw|~~}|~~~{z{{}ywxz|}~}|}~~~~}|}~}|~}yvy}||{{|~~|xwvstw{~|y{~~~}~~}}}}}|||zy|}|{zwtux}|y{}~~~~~~~~}|z{~~{zyxwz~}}~}~||}}|{{zyz~|zxwz~~~}}}{{|}~}~|{|}~~}|{{{~~~~}}{{|||~~|{{zzz|~}|{{}}~~~~|{zz{}~~~|}}~}~}~~}|}}}}}}~~}~}|}~~~}}~zwy}~}~~~~}~}{z{|}}~~}{||}~|~~}}{|~~~~~~~||~}|}~}zy{~}}||}}}~|~~}|}}||}~~~}|}~}|~~}||~~~}~}~}|}~~~}|{|}||}~~~~~|zyz|}~}zy|~|{|}~~~~|zz}~||}|{~~}{yxz}~}{{|~~~}~~|}~~~~{yy{~~}~||~||~}|}|zz{}~~~}~~~~~}}~~~}}~{z{||{z{}~}||}}~~~~}|}~~~}||}~~}~{zz|~}|}~~~}}~~~~~}}}~}{{|~~~}~~}|}~{yz||~~}}}}~{zzzy{~~||}~}}~~~~~}}~}yxz||}}{{{{||}~~}~}|{{|}}}}~~~}~~}~~~~~~}|~}{{|~~}~~}{yyy|~}~~~~~}}}~~~}~}}~~~}~~}}|}~~}~~~~}{zz{}}}~~~~}}}xevil-2.02r2.orig/win32/res/RARROW_R.BMP0100644000175000017500000000242606620147176016707 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U//,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,/~///,,,,,,,,,,,/~~~~//,,,,,,,,,,/~~~~~//,,,,,,,,/~~~~~~~///,,,,,,////////////,,,,////////////,,,////,,,,,///,,,,,,,///,,,,,,,,,////,,,,,,,,,,///,,,,,,,,,,,,//,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/ROCKHI.BMP0100644000175000017500000000341606604100420016350 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,~~~~~~~~~~~~~,,,,,,,,,,,~~~~~~~~~~~~~,,,,,,,~~~~~~~~~~~~~,,,,,,~~~~~~~,,,,~~~~~~~~~~~,,,,~~~~~~~~~~~~~~~~~,,,~~~~~~~~~~~~~~~~~~,,~~~~~~~~~~~~~~~~~~~~,,~~~~~~~~~~~~,,~~~~~~~~~~,,~~~~~~~~~~~~~~,,~~~~~~~~~~~~~,,~~~~~~~~~~~,,~~~~~~~~~~,,~~~~~~~~,,,~~~~~~,,,~~~~~~,,,,~~~~~~~~,,,,~~~~~~~~~~,,,,,,~~~~~~~~~,,,,,,,~~~~~~~~~~,,,,,,,,,~~~~~~~~~~~,,,,,,,,,,,~~~~~~~~~~~~~,,,,,,,,,,,,,~~~~~~~~~~~,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/SEAL0.BMP0100644000175000017500000000323606604044320016203 0ustar aaronlaaronlBM6(hhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U, ~~~,,,,,,,,,,,,,,, ~ ,, ~,,,, ~~ ~ ~,,,, ~ ~ ,,,,, ~ ,,,,,,  ~ ,,,,,,,,  ,,,,,,,,,  ,,,,,,,,,,,  ,,,,,,,,,,,,,  ,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,, ~ ,,,,,,,,,,,,,,,,,,,, ~ ,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,, ~~ ,,,,,,,,,,,,,,,,,,, ~ ,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/SEAL0B.BMP0100644000175000017500000000323606604044320016305 0ustar aaronlaaronlBM6(hhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,~~~~,,,,,,,,,,,,,,,,,,,, ~~,,,,,,,,,,,,,,,,,, ~~,,,,,,,,,,,,,,,,,,  ,,,,,,,~,,,,,,,,  ,,, ~,,,,,,,,, ~ ,,,,,,,,,  ~,,,,,,,,,, ~~ ,,,,,,,,,,,   ,,,,,,,,,,,   ,,,,,,,,,,,,   ,,,,,,,,,,,,,   ,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,, ~ ,,,,,,,,,,,,,,,,,,,, ~ ,,,,,,,,,,,,,,,,,,,, ~ ,,,,,,,,,,,,,,,,,,,,, ,xevil-2.02r2.orig/win32/res/SEALDEAD.BMP0100644000175000017500000000256606604044320016546 0ustar aaronlaaronlBMv6(&@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U ~~ ~~~~ ~~~ ~~ ~ ~ ,,   ~ / / ,,,, ~ / ,,,,,,,,  / /,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/SHELL.BMP0100644000175000017500000000230606604044320016243 0ustar aaronlaaronlBM6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,, ,,,,,,,,,,,,,,,,,, ,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/SHIELD.WAV0100644000175000017500000003361606430260072016374 0ustar aaronlaaronlRIFF7WAVEfmt ++fact7data7}}|}}~~}~~~}}~~}}~}}}}}~~~}zy{}}~{yxxz}zyz{~}zyy{}}||}}{zyyz{{{zz}}z{}~~~}}}}}}}~}xtqsv{}zwww{}zz{~~~~|zz{~}zwwz|zwv|}}}{ywxz}}~}|zzz|}{wont|}{{}}zy{{ywuvy~}|z}{wvuwz|~xttw~{xwy~~}|{|}}~~zwtrrstz~}}}}}z||{{{{|~ztoorw}|~zvttsuw|}|yz}|}}ywwz{}|}~xrons|}zxxy}}zzz|{zz~{qkglpx}|zzzxx|{voihl~yx{~}zwv{|wvz~wojhjppw~yuvz~~zzzzvsqqrtuy}}}xz}zwwx}{xvy~zy}smhhhmr||tlhffjpx~}zwwy||wtqrw~~}tpqwzz|yttpv}~{yvvwzzrkhkrw~~upqy}ussqsxz||}zywwtstvyy}}ywussqqw}wttqppttttw{{~wstzvvnhfm{~||~}}~yqkimvv|}{{yvtz}xuuyywy}~~~zwtpijrxu{vvnklnqrv}}yzzxtpns}|w~~}}zrrha]`q}unnijpttqu{~~~wt{{|zzzwqpuwqsx}}wwtw}}zwwwyyz~}qe``gwzxz}~zxz}{{}}|ywy}}wqsszzxz|y}xpd^_ht}}}}zwtt}|rrq{}}uqjimqpqxx}zz}zphccfntzzzwtlkqzzhbkzx}~~vohmtwz~{ttggiqwz|wqkr}}zpfqrknwwonmlntx}wqzwrtzzuk_j}wy}z{}||~zx{}qinzxwtyytx|rgcbm{xowukehz}qlwxsswz~~}wvx|ywqh^_juzxwy~||cbksx~~{wx~zzwqken}tw~wd_w~qlx|}urtukit|rnt|zv`\f}rib`q~vttsqr}~}xuw{wb]jvkel}vw~tq{|ue^dpyuv}}u]ID`}tefwne_bsz}}}xqkmrzswvqxzy]\p{z}sz|rxyqnvt^Vcrgq}zwphtwwtutjflsbcqwkkqsqv|qou}zzwpx{stmx{igrjhmwtbW\y~}sluwv}}reg}xqqw}m|}v~mey~ntonxzzzwx|}z|zu~stzwle{wyzqUg}y|wuqtkb`ptw~tqw}ukvvtjjztv|tt~zqlxwkfemto{xsncizygm{wljkpy__qjkxwvnqvpb^o}wtqqt~~}trpbupnkkqphxpmyvg^bsxt}||}l^Us~|}zzqnvt\\Ofttnqqox{fns^bzkekkq{hhagz||vohfnyqv||zzt`PYwzwhh}g^__es~unnz}sb]]quorr~t~t~~|bUa}zzzYbwuutqhnpwyvyy}zhYZZmnqkY\}edwwtgnz}}www}{ssnx|{|rhnnnYe~nYiqqzoqvxxzzzkTTS[qq{qbnurv|zzm^atiZg}{qppwwwkmot~m``dzqS__miwwusqy~|vutwtvvzxykVVO^|aTetjkuuumfus_\etfKGGq{qissmm|ubg{{hduxiq}y|zwwqkknogjvvmWI\z|{uqowz|[R_wzcc_fN]www}tpuyzb_qqzjkvq{}}x}zz|tcchh\Wrxcbp~kctm[akaasfn{qwyykq~}}~}ufh}tijuuSRv}uPPS{uv}tppuzz}jjZX__\qgGCVvqXQyiYY\z{UMaay{vuuyeeiwh[elRXqkb{fFM}~|tw\KSkhPLkwhrQTptnriUfz}wronYBUqTZx{_eht~tlswxrs~|eS_vtzVItUOl_wq`euoSYwwqz|qeahn[SUvppkETuhntffrwz`dn~dTZukhtthn{bisbVavUE\wt|vTeeLa~SIfzy_GSrbywcv}oSI]|wz}wqWLX}wk=WwbZgvzkotfÚkPH_qfVnz^DlS^w{qz{YNj_Zotu}}hYcizzyxggqYMUwqy}tcr_oŶnvkf}jT]}nP\npts}jVqojf_nhl{YDewj}SgdEEujsvtfMVngn|}lbmyyqxqrwi]W[նksbOuSJb}V9>lƿz_Tino~iltYStkdPBmokKk`tyvhcVRV^nQeww_Yphtymqzq_;{x{}xxse_\syxoz\N{zzfzykheylza8-Gҭw|Yzqo~}qon|zi`YZhzopqfwS?nz_vi`~t}zxÏTF`re^vnmztgehz{X@Lsthv|owk~z]ivo_bb~bdkx~ynhhhrrLOfftssƽb_Svvtkͯx^]frhhnxhltuuzYOfFMqqyjjpourtVPz{f\g}hPezzrw{{rmtVbxjdggwťwRPzzn\Yc̠obzwgnxxq]v~jzukswGIIbntȲgg22kn__moPFt̽sguyv}q]]auun\ejmjzzo_av_iWWhzL1TʹVYruqqpob|~}teVOVvvoWc~eZʬy^QQh{jekkl_jf{ơkOG]]q|~tttw^i}zgmk]||dYj_Ymd~nh}}}}_Pezyurpp}nMDwѢrSOonnfqqebrzz}}}^\g`JJ]_bkŶwoJH`}~f\_uka}tmqoaq{TF]]ox}jUwmmndqv||rW`zutj\\bfk}}mhlQQS}_fee`osn¶hZmSKccvvw}fwuYJPezjPPVmf\\\rvmetcqnllwwkv}krtYPOmwtMMGƥqYSSRYktoznlYY|pntzzzM3kͱp57qte}ii8QkkuJTѾguDD\bDEjkzwZIXOPR|[:St89~bHzŤ}tprvSszvkKpl|ܞ4Lk_yLOV˭qs2VwaMG}kb۹NSt}[?&^TmHGb{m||RhtO_tgmthY=U}awN-BerM/A`rtvR}}Gzz]aeqhiq/k佁k\?CwnwzgPYъO.8xlmS}wRRvqnkv\VekzwحHeb[Lf/hĘjGL֨p~{E M{M1IXhzP1_zzeiڽ}@l~yod|ttpt}q\gPu_YmͭU8>O{}nZ6qcUBJdtˏ_S`k]ltxyw\wtż|nwVB67_߻vssW`kkhxpdgtG=-GչxpfYPe]ek0AƜlV=TXKi龒wneqv\V\oveY]zkDrqA'˶|nYcx{MkzVw§vscGHn}qbdnaykmw{wwl2.r[ggl~ư~wwwX?G[v~{tq}lT//&9YᓓN:Yye--KVbsF:99Nyw\Ig}|tui|~~kfwe>>_mde|{]__{_;Ių_SrlWz†jee\MLXbtpuT88CqwBP}}cAǿȳWPYBRRr˸h`pzkn|P8lʧheuZA\}{onwwxgC;b~Pll{ǭ{kPBBVqhODUб_PwwwTpuSII@X{jRC;;File created by GoldWave. GoldWave copyright (C) Chris Craigxevil-2.02r2.orig/win32/res/SIDER.BMP0100644000175000017500000000406606624472636016270 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U@@,,@@@@,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,@,,,,,,,,@,,,,,,,,,,,,,,,@,,,,,,@,,,,,,,,,,,,,,,,,@,,,,@,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,@,,@,,,,,,,,,,,,,,,,,,,@,,,,@,,,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,,,@,,,@@,,@@@@,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@xevil-2.02r2.orig/win32/res/SMALL.ICO0100644000175000017500000000047606430260062016246 0ustar aaronlaaronl(( xevil-2.02r2.orig/win32/res/STAR.BMP0100644000175000017500000000242606604044320016150 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,~,,,,,,,,~~,,,~~,,,,,,,~,,,,~~~,,,,~~~~,,,~~,,,,,,~~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/STARB.BMP0100644000175000017500000000242606604044320016252 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,~,,,,,,,,,~~,,,,,,,,~~,,,,,,~~,,~~~,,~~~,,~~,,,,,,~~,,,,,,,,,~~,,,,,,,,,,~,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/STARS.BMP0100644000175000017500000000362606604125474016310 0ustar aaronlaaronlBM6($`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,~~,,,,,,,,,,,,,,,~~,~~,,,,,,~~,,,,,,,~~,,,~~~,,,,,~~~~,,,~~~~,,,,~~~~~,,,~~~,,,,~~~~,,,,~,,,,,~,,,~~~,,,,,~~~,,~~~~,,,,,,,,,,,,,~~~,,,,,,~~,,,,,,,,,,,,,,~,,,,,~,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/STOP.BMP0100644000175000017500000000406606604044322016170 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xevil-2.02r2.orig/win32/res/STOP.ICO0100644000175000017500000000137606500340124016157 0ustar aaronlaaronl ( @??xevil-2.02r2.orig/win32/res/SUICIDEB.BMP0100644000175000017500000000511606604100422016561 0ustar aaronlaaronlBMN 6(4hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/SWAPPER.BMP0100644000175000017500000000276606604125474016541 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,, ,,,,,,  ,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/SWAPPER.WAV0100644000175000017500000000741206430176716016553 0ustar aaronlaaronlRIFFWAVEfmt ++factdata~|xz|yx~}}||wpq{}z|||vptwrxywx{zvwywyztq|vs~ogp||shl~l_f|rp{~p]chXats~~xuywxq|txsvROiwad|lavx]Zw|[^|~wrmkZin[j~iMXjSdxZLfyYaeP`pqJNxp`htqtry_j^MN|ώhY[f||h\lmhhd_Lly:,W̉pSmXGdyf`zz`^R{hcLa[NdےX#7|ҜpL_|tw}tQbpbr}exbR}ڟhbHnyIJyЁS>ae((Yܿ`aLlwtp|xgsenu^NptQL(Mox}tLZ{ڱaUKxO\Zc\Ș|0U~yP+G`@Sg|{^t69K֣PRsmnVN@DpxX,rd``d_wHHSrE}p49@ο\?s{vqcd>Qx|q*^r٫,Dpdbg[v}C`r{-7kzoePXkH}g$\ȁp\;zŀdwhhd{Eh|\XFb](wSGlozptNx^w|N˚\H8;{RdŃFz|k|L̷O_0Hp_?lғ[eOp6baKd]n:GokyN`(h:ouH~tZ|PohCl|k[e%Ńoys\RS.dT?Z˘5%gzAg_A}plyy5gS_ngfZ@Q0`t+{&dPRojv|l1BΆDqO@JRFi3j`b sx\L}}TX`\w|Z_\嘡TAnmzvZRhvrtetDNirh>|x=tE`P|\u|8_-P|x@<|}kD9ql|ĉ\v sR{Uktʝm`39lrvwltqhHj@G02y;pvWxo]W(P4rPb~cl8tTb[y`HՆ|3cdymٺLvXXc{`xlMq0SxhLYr\UqDv_:<8jEY0z`xKb|uhCtbdhLkWd,Δm9܍bh4?mY;v8MqHں80,amxb8MwH5nt5gv`Xr0||rDrl\ĕ:|;N|A}ƶF`ufIZ(eBi_*w#0mMjyi}O}Äoyqjlq@ˀhCXLvPtl7TȢYvhOwDJ6AnXgX6xk}]nDgbpeklQ{M\`nRHRDDR]x]sx@a|mFhH._zx{Xl;TVh\pbwJhwtXTYftp{nvkyQHhKghYZkG|,[piho^^`ug|\x\rSYiaqn|[pwGklH}Yk{fmEh{\Tsx|sdoddbA~|J`TOnTXdEhXxluTdhghoslpupytRthoittdSptpxXxSvtsebRt^J|lmt{JtuugpkhpYz~o|fhdnah`spymzDOfojoz\ghWj`x|szpd~m}_`|qhhlugh|uogPajynbnn|Wjnlxt|vi{xrx|\gk\{bwrt\p|orpt}ghmzw|u|x|n_leytlo\mx|wo}xguslx|omnr~}mwvlt|qwlws_qtpmm|t}cpv{~xrfmlj}uwgr~usjyphu{}eiw|~||{t|txzj|o}vxvy}lzdjrrk~gx~_r|mq}xxycxis|{qqz|{tzhvx|upxt||}twnsviwrspzsly}{~{|oxuxx}lpvfpztltjiryy{xt{vpzz}vpt|vurxoupptxpv|}u||x{zvyz|~||||tytjcvoowzytrtuxx|xwtttqzyxuxqqu~v{tyzqq}|yx|}tptLISTJINFOISFT>File created by GoldWave. GoldWave copyright (C) Chris Craigxevil-2.02r2.orig/win32/res/SWEETDAR.MID0100644000175000017500000016524706630123700016622 0ustar aaronlaaronlMThdMTrksweet darknessQ S @v   @ G @ Av @ -v @ O @ * @-Q!JQBWT)T:6V!X% V1sTaX;V!,T!TSIVD1S(T'VT3 SQFS :+O%-; QMjS)OJS#$T'!S%T1{Q)VS9*S$Q?\Q-"SC^S5>QE!T3S1mST;}))MABSJ+8BQ):MU%S#6Q,kT! VX\VZ$VXK~T8VI'S1hTLT;]SQ#(7L;@)QTV`S5LR*T/S6 V'%T)[Q7VERQ^L%S7LR(T% S$S# TMwQ7uSGB()(QT   @97-/Q!JQBWT)T:9&E5VsE. 91!X% V1+9.'9/!TaX;L92E/DE]V!,T!391@9)aSIVDE/E$m97S(T' 97JT3 S9-9/aQE3FS 6E071+1O%7QMr-Ca7BS)OJS#$C?T'tC; 7+!S%T1f7/t7'!Q)VS9G7&BC=C/S$Q?;7%t7C-Q-"SC=C9iC27%!S5>QEF78[T3S1m7#Y73'C7ST;NCC/515AMABSJg+Ew5?Q):MU%A!S#6Q,7A+5'!T! V-512A7DA)]X\VZ29928hVXK]>7~>/2/!T8VI2F2HS1*5U>TL2325q>?T;]SQD>7_494JL;ATV2T;4FS5LR*@;T/S6@6~41!V'%T)/48 4/!Q7VEV4=u@B@4vQ^L%_490No4LR4M`S7LR(@BT% S$@4o4=!S# TMT4BS!/Z40\?CB@"45!Q7BSGs4IY@Am@?QT   @/[ G @0M95-Q!t0E%961QBWT)T:6E9VE*d9/!X% V1Y99y9!TaX; 93rE9/E*rV!,T!39/9=SIVDE-E3z93S(T'9!GT3 S95>9BBQE3FS _E.[0O<-+O%-; QM;<%!Q)VS9E<,DH9H%"S$Q?;<+<, Q-"SC=H+H'l<'!S5>QEP<%QT3S1m<'0<-P0MH1ST;uH; 0H{0J5B))MABSJ0R +8:52Q):MU%A5S#6Q,A7+55!T! VD5>A#yA"(X\VZ5/5>VXK]A%A/5-!T8VIN5'Y0KS1hTL.0Ej53I5'70KA-T;]SQA00L0K4'(7L;@)QTV70L44%S5LR*@)T/S6p@14)!V'%T)>46|4-!Q7VE#4 (0J@30I@#dQ^L%_4D4+<0G!S7LR90Fo@1T% S$~@,u4#!S# TMt4=b0E0J4!!Q7uSG`4? @Av@?b()(QT   @0]B_95-/Q!Bk*0\l961QB6BZ!TfBfCT:69bBeE9VBi9cE*dBW9/!X%bBf+V1Y99yB_0ZBi0[mB]9!TaX;Be93r9ZBeE9Bg(9^E*QBR!V!,T!0Bc0]B_9/Bk*0\[9=xBZ!SIVDBfy9bBeE-Bi9clE3zBW93S(T'bBf-9!GT3 B_0ZSBi0[mB]95Be69BB9ZBeQE3FS B_0ZBi0[mB]<%!Q)VS9Be4<,D9ZBeH9Bg(9^UH%BR!S$Q?8Bc0]B_<+Bk*0\i<,jBZ!Q-"SCDBfy9bBeH+Bi9czH'lBW<'!S5>QE$Bf,<%QB_0ZT3S1qBi0[mB]<'Be(<-P9ZBeH1ST;Bg(9^NH;BR}Bc0]B_5B5AMABSJABk&+E0\l52gBZ!Q):MU,Bfy9bBeA5S#6Q,NBi9c;A7+BW55!T!bBfZS35DB_0ZBi0[mB]5;T> VgBe]5>9ZBeA#Bg(9^OA"BR!X\VZBc0]B_5/Bk*0\W5>|BZ!VfBfXK]9bBeA%Bi9cgA/BW5-!T8VI*Bf$5'YB_0Z2HS1*5U>TLBi0[mB]53BeA5'79ZBeA-T;]SQ%Bg(9^FA0BR}Bc0]B_4'4JL;ATV2T3Bk*0\O44BZ!S5LR1Bfy9bBe@)T/S6Bi9cW@1BW4)!V'bBfCT)>46|B_0ZBi0[mB]4-!Q7VESBeP4 (9ZBe@3Bg(9^y@#]BRQ^L%\Bc0]B_40No4LBk*0\4+QE$Bf"78[B_0ZT3S1qBi0[mB]7#BeQ73'9ZBeC7ST;Bg(9^'CC/BR}Bc0]B_51))MABSJABk*0\2+8A5?`BZ!Q):MU,Bfy9bBeA!S#6Q,NBi9cSA+BW5'!T!bBfZS3E5/^B_0ZBi0[mB]5%T> VgBeF5129ZBeA7Bg(9^A)7Bi9cd>/BW2/!T8VI*Bfu2FB_0ZS1hTLBi0[mB]23Be25q9ZBe>?T;]SQ%Bg(9^w>7_BR}Bc0]B_49(7L;@)QTVBBk*0\^4FuBZ!S5LR1Bfy9bBe@;T/S6Bi9ch@6~BW41!V'bBfCT)/48 B_0ZBi0[mB]4/!Q7VESBe4=u9ZBe@BBg(9^g@4oBRQ^L%\Bc0]B_49Bk*0\4M?BZ!S7LR/Bfy9bBe@BT% S$wBi9cw@4oBW4=!S#bBf'TMT4BB_0ZBi0[mB]45!Q7gBeSGs4Iw9ZBe@ABg(9^C@?BR}Bc[()(QT   @JeVe95-/Q!rVf'961QB6VN!TAVe^Te T: T_HZWjE9VZJ\GWg{E*dGeVN9/!X%HUFVbAV1T]G99yVjVg8TZ,HeVR9!T8G^V_X;>T]N93rW_E9Wh(E*=T`JbWW!V!,T!H]WfPTbV_XT]~9BBEeW_QE3FS G\%WhE.GT`WWpWfPTb@T`J_Ve<-+1O%7QM/ ElVf-C&V=VjVg8TZ,H]VR<%!Q)+GaV_S9IT]|<,DW_H9WhxH%mT`JbWWHbS$Q?+WfPTb@T`Ve<+rVf$<,jHbVN!Q-"SCVeJ`NTe*T_WjH+!WgsH'lMbVN<'HX S5>QEVbST]o<%QL_VjT3S1JM^?VgJ]4TZ,VR<'6LX2V_XT]p<-PLeW_H1ST;JTnWhqH;tT`WWpWfPTb@T`HeVe5B5AMA# L[ SJ%Vf7+E& & 52&% VNQ):MUVeXTe@jT_JWWjA5S#*Ha Q,kWg4A7+LeVN55!T!BJY VbST]S35DVjVg8TZ,HWVR5;T> LNVGV_XT]%5>W_A#WhrA"sT`GbWW!X H_/Wf VZCTb@T`Ve5/rVf5>|HZVN!VGN1VeAXKTe*T_WjA%!Wg`A/EUVN5-!T8VIHMVbST]g5'YGgVj2HS1*5U>TLES"Vg8TZ,VR53hV_XT] 5'7H_W_A-T;SG_ SQ*WhiA0|T`WWpWfPTb@T`CbVe4'4JL;ATV2THNVf 44VN!S5LR Ve^Te*T_GZWj@)T/S67CRiWgP@1H]VN4)V'# GaVbJ T]T)>46%WVjVgJZ4TZ,VR4-HRQ7VE3V_XT]4 (W_@3WhH_@#IT`WWQ^JW L%OWfPTb@T`Ve40No4LVfR4+T]N93rW_E9Wh(E*=T`HZWW!V!G`(T!#WfPTb@T`Ve9/rVf9=xGWVN!S=HZVeVDVTe*T_WjE-!WgeE3ER`VN93 GcS(T'LVbST]p9!GT3 GbVjSEXVg8TZ,VR95hV_XT]~9BBHRW_QE3FS G6%WhFM E.GT`WWpWf5Tb@T`J_Ve<-+O%-;QM HY Vf %')&-&.VjVgHZ4TZ,VR<%GRQ)GV_S9IT]|<,DW_H9WhxH%mT`J]WWHTS$Q? % Wf$&Tb(K.T`Ve<+SVf$<,VH]VN!Q-"SCVeJXETe*T_WjH+!WgsH'lGZVN<'!S5>QEHU VbST]o<%QL]VjT3S1VGd3Vg8TZ,VR<'hV_XT]p<-PJbW_H1ST;^LZ&WhqH;tT`WWpWfPTb@T`Ve5B))MABSJJ^HbVf'&+8:52MVN!Q):MUVe^Te3wT_LWWjA5S#6Q,2Hc9Wg4A7+MZVN55!T!6LaVb&T] S35D %&'Vj IHVg+ TZ,OWVR5;T> V M\ V_( !T]5>&'&#W_A#*]Wh^A"sT`QZWW!XOn#Wf VZCTb@T`Ve5/rVf5>|OeVN!VAVe.QTXKTe*T_WjA%!Wg`A/MOVN5-!T"OSVIVbST]g5'YL_VjS1hTLMaVg8TZ,VR53hV_XT] 5'7MNW_A-T;SL` SQ*WhiA0|T`LZWWDMW,WfPTb@T`Ve4'(7L;@)QTVJ_VfLas44VN!S5LR Ve^Te*T_LOWj@)T/S6}JW#WgP@1J_VN4)!V'5L[VbST]T)>46|VjVgHW4TZ,VR4-JYQ7VE3V_XT]4 (W_@3WhG_@#>HZ T`WWQ^L%OWfPTb@T`Ve4rVfR4+QE$Bf"78[B_0ZT3S1qBi0[mB]7#BeQ73'9ZBeC7ST;Bg(9^'CC/BR}BcEZ0]B_515AMABSJ GV7Bk&+E0\s5?`BZ!Q):MU,Bfy9bBeA!S#6Q,NBi9cSA+BW5'!T!CBf%.S3&5/'7B_0ZJ"Bi0[mB]5%T> VgBeF5129ZBeA7Bg(9^A)7Bi9cd>/BW2/!T8VI*Bfu2FB_0Z2HS1*5U>TLBi0[mB]23Be25q9ZBe>?T;]SQ%Bg(9^w>7_BR}BcGW0]B_494JL;ATVE_2T3Bk*0\M4FqBZ!S5LR1Bfy9bBe@;T/S6Bi9ch@6~BW41!V'bBfCT)/48 B_0ZBi0[mB]4/!Q7VESBe4=u9ZBe@BBg(9^g@4oBRQ^L%\Bc0]B_490No4LBk*0\4M?BZ!S7LR/Bfy9bBe@BT% S$wBi9cw@4oBW4=!S#bBf'TMT4BS!B_0Z/Z40\/Bi0[CB@"B]45!Q7B BeSGs4IY9ZBe@ABg(9^C@?BR}BcQT   @/[ G @XZ0]B_95-Q!Gi{BkXX&0\TZY961QBT]YNBZ!TfBf$YWVZ T:V^XZ9bBeE9VBiX]9c&VW\E*NV][ZBW9/!X%bBf+V1[WXZG99NX_+YUB_0ZBi0[Y[%X]Xd8[ZB]9!TaX;Be[ZVWN93\V]YW9ZBeE9BgYU 9^VWoE*3VQXWBR!V!,T!0BcX_'TNT\"YO0]B_9/Bk(YY0\T]H9=jTWXRBZ!SIVDBf%XWTZ"T_VU9bBeE-Bi9cV[ T]FE3QTc)XUBW93S(T'bBf4X[ SZp9!0SWT3 VUB_0ZSBi0[ V["SWS`(TZB]95BeTb2Sb~9B#SaVU9ZBeQE3FS [Ta8YOB_0ZBiYZ 0[-T]!T`XWB]<%!Q)VS9BeXZVW|<,.V]YW9ZBeH9BgYU 9^T]?H%^Ta#XWBR!S$Q?8BcX^*VWV[![]0]B_<+Bk0\VZV<,CV`'YWBZ!Q-"SCDBfYYT]T`.XZ9bBeH+%LBi9c X[TZTH'LT\ VWBW<'!S5>QE$Bf V_3S]o<%&S^ XWB_0ZT3S1qBi0[X]S]S`$VWB]<'BeVWQ]p<-PQWT_9ZBeH1ST;BgT` 9^Q]8H;dQa$V]BR}Bc&V^QeQi)XZ0]B_5B))MABSJABkXX&0\TZ+8:52MT]YNBZ!Q):MU,Bf$YWVZ(V^XZ9bBeA5S#6Q,NBiX]9c&VWA7V][ZBW55!T!bBf<[WXZS35DpX_+YUB_0ZBi0[Y[%X]Xd8[ZB]5;T> VgBe[ZVW%5>V]YW9ZBeA#BgYU 9^VW9A"iVQXWBR!X\VZBcX_'TNT\"YO0]B_5/Bk(YY0\T]D5>nTWXRBZ!VfBfXK XWTZ"T_VU9bBeA%Bi9cV[ T]AA/VTc)XUBW5-!T8VI*Bf4X[ SZg5'9SW VUB_0ZS1hTLBi0[ V["SWS`(TZB]53BeTb2Sb 5'SaVU9ZBeA-T;]SQ%BgV[9^S]0A0fSb*XWBR}Bc,X\T_!TbVW0]B_4'(7L;@)QTVBBkV]0\T_<44gTaXWBZ!S5LR1Bf$XYVWV[!YW9bBe@)T/S6Bi9c YZV_1@1lV^#X]BW4)!V'aXZBf=T_T)>46DTa8YOB_0ZBiYZ 0[-T]!T`XWB]4-!Q7VESBeXZVW4 V]YW9ZBe@3BgYU 9^T]c@#:Ta#XWBRQ^L%\BcX^*VWV[![]0]B_4Bk0\VZ4+V`'YWBZ!S7LR/BfYYT]T`.XZ9bBe@1T% S$%LBi9c X[TZK@,UT\ VWBW4#!S#bBf V_TMS]^4=7S^ XWB_0ZBi0[X]S]S`$VWB]4!!Q7gBeSGVWQ]64? QWT_9ZBe@ABgT` 9^Q]6@?fQa$V]BR}Bc&V^QeQi()(QT   @XZ0]B_95-/Q!BkXX&0\TZY961QBT]YNBZ!TfBf$YWVZ T:V^XZ9bBeE9VBiX]9c&VW\E*NV][ZBW9/!X%bBf+V1[WXZG99NX_+YUB_0ZBi0[Y[%X]Xd8[ZB]9!TaX;Be[ZVWN93\V]YW9ZBeE9BgYU 9^VWoE*3VQXWBR!V!,T!0BcX_'TNT\"YO0]B_9/Bk(YY0\T]H9=jTWXRBZ!SIVDBf%XWTZ"T_VU9bBeE-Bi9cV[ T]FE3QTc)XUBW93S(T'bBf4X[ SZp9!0SWT3 VUB_0ZSBi0[ V["SWS`(TZB]95BeTb2Sb~9B#SaVU9ZBeQE3FS [Ta8YOB_0ZBiYZ 0[-T]!T`XWB]<%!Q)VS9BeXZVW|<,.V]YW9ZBeH9BgYU 9^T]?H%^Ta#XWBR!S$Q?8BcX^*VWV[![]0]B_<+Bk0\VZV<,CV`'YWBZ!Q-"SCDBfYYT]T`.XZ9bBeH+%LBi9c X[TZTH'LT\ VWBW<'!S5>QE$Bf V_3S]o<%&S^ XWB_0ZT3S1qBi0[X]S]S`$VWB]<'BeVWQ]p<-PQWT_9ZBeH1ST;BgT` 9^Q]8H;dQa$V]BR}Bc&V^QeQi)XZ0]B_5B5AMABSJABkXX"+E0\TZY52MT]YNBZ!Q):MU,Bf$YWVZ(V^XZ9bBeA5S#6Q,NBiX]9c&VWA7V][ZBW55!T!bBf<[WXZS35DpX_+YUB_0ZBi0[Y[%X]Xd8[ZB]5;T> VgBe[ZVW%5>V]YW9ZBeA#BgYU 9^VW9A"iVQXWBR!X\VZBcX_'TNT\"YO0]B_5/Bk(YY0\T]D5>nTWXRBZ!VfBfXK XWTZ"T_VU9bBeA%Bi9cV[ T]AA/VTc)XUBW5-!T8VI*Bf4X[ SZg5'9SW VUB_0Z2HS1*5U>TLBi0[ V["SWS`(TZB]53BeTb2Sb 5'SaVU9ZBeA-T;]SQ%BgV[9^S]0A0fSb*XWBR}Bc,X\T_!TbVW0]B_4'4JL;ATV2T3BkV]0\T_<44gTaXWBZ!S5LR1Bf$XYVWV[!YW9bBe@)T/S6Bi9c YZV_1@1lV^#X]BW4)!V'aXZBf=T_T)>46DTa8YOB_0ZBiYZ 0[-T]!T`XWB]4-!Q7VESBeXZVW4 V]YW9ZBe@3BgYU 9^T]c@#:Ta#XWBRQ^L%\BcX^*VWV[![]0]B_40No4LBk0\VZ4+V`'YWBZ!S7LR/BfYYT]T`.XZ9bBe@1T% S$%LBi9c X[TZK@,UT\ VWBW4#!S#bBf V_TMS]^4=3S^ XWB_0Z/Z40\/Bi0[X]S]B@S`VWB]4!!Q7B BeSGVWQ]64?lQWT_9ZBe@ABgT` 9^Q]6@?fQa$V]BR}Bc&V^QeQi)QT   @/[ G @XZ0]B_97-Q!BkXX&0\TZ QBT]YNBZ!TfBf$YWVZ T:9&V^XZ9bBeE5VBiX]9c&VW*V] E. [ZBW91!X%bBf+V1[WXZX_9.'YUB_0ZBi0[Y[%X]Xd8[ZB]9/!TaX;Be[ZVW9V]YW9ZBeE/BgYU 9^VWEVQXWBR!V!,T!0BcX_'TNT\"YO0]B_91Bk(YY0\T]9)2TWXRBZ!SIVDBf%XWTZ"T_VU9bBeE/Bi9cV[ T]SE$DTc)XUBW97S(T'bBf4X[ SZm973SWT3 VUB_0ZSBi0[ V["SWS`(TZB]9-BeTb2Sb_9/BSaVU9ZBeQE3FS QE$Bf V_3S]e780S^ XWB_0ZT3S1qBi0[X]S]S`$VWB]7#BeVWQ]73'QWT_9ZBeC7ST;BgT` 9^Q]CC Qa$V]BR}Bc&V^QeQi)XZ0]B_51))MABSJABkXX&0\TZ+8A5?FT]YNBZ!Q):MU,Bf$YWVZ(V^XZ9bBeA!S#6Q,NBiX]9c&VW-A+}V][ZBW5'!T!bBf<[WXZS3E5/3X_+YUB_0ZBi0[Y[%X]Xd8[ZB]5%T> VgBe[ZVW51V]YW9ZBeA7BgYU 9^VWA)VQXWBR!X\VZBcX_'TNT\"YO0]B_29Bk(YY0\T]y289TWXRBZ!VfBfXK XWTZ"T_VU9bBe>7Bi9cV[ T]>>/YTc)XUBW2/!T8VI*Bf4X[ SZ82FhSW VUB_0ZS1hTLBi0[ V["SWS`(TZB]23BeTb2SbO25RSaVU9ZBe>?T;]SQ%BgV[9^S]a>75Sb*XWBR}Bc,X\T_!TbVW0]B_49(7L;@)QTVBBkV]0\T_K4FXTaXWBZ!S5LR1Bf$XYVWV[!YW9bBe@;T/S6Bi9c YZV_B@6[V^#X]BW41!V'aXZBf=T_T)/48STa8YOB_0ZBiYZ 0[-T]!T`XWB]4/!Q7VESBeXZVWK4=_V]YW9ZBe@BBgYU 9^T]Q@4LTa#XWBRQ^L%\BcX^*VWV[![]0]B_49Bk0\VZ4MV`'YWBZ!S7LR/BfYYT]T`.XZ9bBe@BT% S$%LBi9c X[TZQ@4OT\ VWBW4=!S#bBf V_TMS]>4BWS^ XWB_0ZBi0[X]S]S`$VWB]45!Q7gBeSGVWQ]I4IwQWT_9ZBe@ABgT` 9^Q]-@?oQa$V]BR}Bc&V^QeQi()(QT   @XZVe0]B_95-/Q!rVfBkXX&0\TZY961QBT]YNVNBZ!TAVe%Bf$YWVZTe T:V^T_XZWj9bBeE9VBiX]9cWgVW\E*NV][ZVNBW9/!X%LVbBf+V1[WXZT]G99NX_+YUVjB_0ZBi0[Y[Vg$X]Xd TZ,[ZVRB]9!TGV_X;Be[ZVWT]N93\V]YWW_9ZBeE9BgWhYU 9^VWoE*3VQ T`XWWWBR!V!,T!#Wf BcX_'TNTbT\"T`YOVe0]B_9/rVfBk(YY0\T]H9=jTWXRVNBZ!SAVeVDBf%XWTZTe"T_T_VUWj9bBeE-Bi9cV[WgT]FE3QTc)XUVNBW93S(T'LVbBf4X[ SZT]p9!0SWT3 VUVjB_0ZSBi0[ VgV["SWTZS`(TZVRB]95hV_ BeTb2SbT]~9B#SaVUW_9ZBeQE3FS [Ta8YOVjB_0ZBiYZ 0[ Vg$T]TZ T`XWVRB]<%!Q)GV_S9BeXZVWT]|<,.V]YWW_9ZBeH9BgWhYU 9^T]?H%^TaT`XWWWBR!S$Q?+Wf BcX^*VWTbV[!T`[]Ve0]B_<+rVfBk0\VZV<,CV`'YWVNBZ!Q-"SCVe%BfYYT]TeT`T_XZWj9bBeH+%LBi9cWgX[TZTH'LT\ VWVNBW<'!S5>QEVbBf V_3S]T]o<%&S^ XWVjB_0ZT3S1qBi0[ VgX]S]TZS`$VWVRB]<'hV_ BeVWQ]T]p<-PQWT_W_9ZBeH1ST;BgWhT` 9^Q]8H;dQaT`V]WWBRpWf Bc&V^QeTbQi)T`XZVe0]B_5B5AMABSJ0VfBkXX"+E0\TZY52MT]YNVNBZ!Q):MUVe%Bf$YWVZTe(V^T_XZWj9bBeA5S#6Q,NBiX]9cWgVWA7V][ZVNBW55!T!LVbBf<[WXZT]S35DpX_+YUVjB_0ZBi0[Y[Vg$X]Xd TZ,[ZVRB]5;T> VGV_ Be[ZVWT]%5>V]YWW_9ZBeA#BgWhYU 9^VW9A"iVQ T`XWWWBR!XOWf VZBcX_'TNTbT\"T`YOVe0]B_5/rVfBk(YY0\T]D5>nTWXRVNBZ!VAVe%BfXK XWTZTe"T_T_VUWj9bBeA%Bi9cV[WgT]AA/VTc)XUVNBW5-!T8VIVbBf4X[ SZT]g5'9SW VUVjB_0Z2HS1*5U>TLBi0[ VgV["SWTZS`(TZVRB]53hV_ BeTb2SbT] 5'SaVUW_9ZBeA-T;]SQ%BgWh V[9^S]0A0fSbT`XWWWBRpWf Bc,X\T_Tb!TbT`VWVe0]B_4'4JL;ATV2T"VfBkV]0\T_<44gTaXWVNBZ!S5LR Ve%Bf$XYVWTeV[ T_YWWj9bBe@)T/S6Bi9cWgYZV_1@1lV^#X]VNBW4)!V'LVbXZBf=T_T]T)>46DTa8YOVjB_0ZBiYZ 0[ Vg$T]TZ T`XWVRB]4-!Q7VE3V_ BeXZVWT]4 V]YWW_9ZBe@3BgWhYU 9^T]c@#:TaT`XWWWBRQ^L%OWf BcX^*VWTbV[!T`[]Ve0]B_40No4LVfBk0\VZ4+V`'YWVNBZ!S7LR Ve%BfYYT]TeT`T_XZWj9bBe@1T% S$%LBi9cWgX[TZK@,UT\ VWVNBW4#!S#LVbBf V_TMS]T]^4=3S^ XWVjB_0Z/Z40\/Bi0[VgX]S]B;TZS`VWVRB]4!!Q7-V_ BeSGVWQ]T]64?lQWT_W_9ZBe@ABgWhT` 9^Q]6@?fQaT`V]WWBRpWf Bc&V^QeTbQi)QT   @/[ G @T`J_VeYj0]B_95-Q!7;VfBk 0\J\YcW96EU*QB6HbVNBZ!T1E\Ve%Bf3H\TeQEW*T: T_G]Wj9bBeE9VLE]8Bi9cG_Wg{E*EW`HWVNBW9/!X% E],VbBfH_V1EUT]G99vEYJbVjB_0ZJ[Bi0[ Vg$EUTZE]L]VRB]9 T V_X;BeLa EWT]G93mE_MjW_9ZBeE9BgWh M[9^ERoE*=T` E]LeWWBR!V!,T!#Wf Bc0L[EUTb0EbT`J_Ve0]B_9/rVfBk*0\J\T9=EU`HbVNBZ!S1E\VeVDBf3H\Te`EWJT_G]Wj9bBeE-LE]8Bi9cG_WgeE3EW`HWVNBW93S(T' E],VbBfH_!EUT]p9!GT3EYJbVjB_0ZSJ[Bi0[ Vg$EUTZE]L]VRB]95 V_ BeLa EWT]G79B=E_MjW_9ZBeQE3FS EYJbVjB_0ZJ[Bi0[ Vg$EUTZE]L]VRB]<% Q) V_S9 BeLa EWT]G5<,?E_MjW_9ZBeH9BgWh M[9^ER?H%mT` E]LeWWBR!S$Q?+Wf Bc0L[EUTb0EbT`J_Ve0]B_<+rVfBk*0\J\b<, EU`HbVNBZ!Q-"SCE\Ve%Bf3H\Te`EWJT_G]Wj9bBeH+LE]8Bi9cG_WgsH' EW`HWVNBW<'!S5 E]QEVbBfH_!EUT]o<%NEYJbVjB_0ZT3S1pJ[Bi0[ Vg$EUTZE]L]VRB]<' V_ BeLa EWT]G)<-KE_MjW_9ZBeH1ST;BgWh M[9^ER8H;tT` E]LeWWBRpWf Bc0L[EUTb0EbT`J_VeYj0]B_5B))MA7 SJ0VfBk 0\J\Yc+8:52EU`HbVNBZ!Q)1E\ MUVe%Bf3H\TeQEWJT_G]Wj9bBeA5S#6Q,E]8Bi9cG_Wg4A7KEW`HWVNBW55!T! E],VbBfH_!EUT]S35DEYJbVjB_0ZJ[Bi0[ Vg$EUTZE]L]VRB]5;T> V V_ BeLa EWT]%5>"tE_MjW_9ZBeA#BgWh M[9^ER9A"sT` E]LeWWBR!XOWf VZBc0L[EUTb0EbT`J_Ve0]B_5/rVfBk*0\J\P5>EU`HbVNBZ!V1E\Ve%BfXKH\Te`EWJT_G]Wj9bBeA%LE]8Bi9cG_Wg`A/EW`HWVNBW5-!T E]VIVbBfH_!EUT]g5'VEYJbVjB_0ZS1hTLJ[Bi0[ Vg$EUTZE]L]VRB]53 V_ BeLa EWT]GB5'2E_MjW_9ZBeA-T;]SQ%BgWh M[9^ER0A0|T` E]LeWWBRpWf Bc0L[EUTb0EbT`J_Ve0]B_4'(7L;@)QTV1VfBk*0\J\H44$EU`HbVNBZ!S1E\LR Ve%Bf3H\Te`EWJT_G]Wj9bBe@)T/S6KE]8Bi9cG_WgP@1/EW`HWVNBW4)!V' E],VbBfH_!EUT]T)>46yEYJbVjB_0ZJ[Bi0[ Vg$EUTZE]L]VRB]4- Q7  VEV_ BeLa EWT]GQ4 #E_MjW_9ZBe@3BgWh M[9^ERc@#IT` E]LeWWBRQ^L%OWf Bc0L[EUTb0EbT`J_Ve0]B_B]4aBZBZVf;0\J\ B]`EUBb4+Bf Bf9BNS#BX9bBeBWC?T'mBiBi9c&BO4C;kBa!BWBW7+!S%MBfBf#T1BNL7/PBY$BNB_0ZBiBi0[-BNBZ!BJB]7'!Q)VS9Be Be/BW~7&B].BR9ZBeC=BgBg(9^BW\C/6B`.BUBR!S$Q?7B` B`8B]Bb*0]B_BZ7%dBkBk*0\BM47CbB\*BZBW!Q-"SC:Bf Bf9BN*BX9bBeBWC9mBiBi9c&BO)C2vBa!BWBW7%!S5>QEBfBf=BNe787BY$BNB_0ZT3S1qBiBi0[-BNBZ!BJB]7#Be Be/BWB]73'BR9ZBeC7ST;BgBg(9^BWCCB`.BUBR|B` B`8B]Bb*0]B_BZ515AMABSJ"BkBk&+E0\BM`5?6B\*BZBW!Q):MU"Bf Bf9BN*BX9bBeBWA!S#6Q,7BiBi9c&BO-A+rBa!BWBW5'!T!MBfBf=BNS3E5/:BY$BNB_0ZBiBi0[-BNBZ!BJB]5%T> VgBe Be/BW51B].BR9ZBeA7BgBg(9^BWA)B`.BUBR!X[B`VZ B`8B]Bb*0]B_BZ29dBkBk*0\BMy28B\*BZBW!V\Bf BfXKBN*BX9bBeBW>7mBiBi9c&BO>>/aBa!BWBW2/!T8VIBfBf=BN82FdBY$BNB_0Z2HS1*5U>TLBiBi0[-BNBZ!BJB]23Be Be/BWO25CB].BR9ZBe>?T;]SQ%BgBg(9^BWa>71B`.BUBR|B` B`8B]Bb*0]B_BZ494JL;ATV2TBkBk*0\BMK4FKB\*BZBW!S5LR'Bf Bf9BN*BX9bBeBW@;T/S6lBiBi9c&BOB@6]Ba!BWBW41!V'MBfBf=BNT)/48gBY$BNB_0ZBiBi0[-BNBZ!BJB]4/!Q7VESBe Be/BWK4=GB].BR9ZBe@BBgBg(9^BWQ@4AB`.BUBRQ^L%[B` B`8B]Bb*0]B_BZ490NdBk 4LBk*0\BM4MB\*BZBW!S7LR%Bf Bf9BN*BX9bBeBW@BT% S$`BiBi9c&BOQ@4NBa!BWBW4=!S#MBfBf'TMBN>4BS BYBNB_0Z/Z40\/BiBi0[,BNB@BZBJB]45!Q7B Be BeSG*BWI4IIB]BR9ZBe@ABgBg(9^BW-@?eB`.BUBR|B` B`8B]Bb*QT   @/[ G @E]0]B_BZ95-Q!dBkBk*0\BMY961QB B\*BZBW!T\Bf Bf9BN T: BXH]9bBeBWE9VEX^BiBi9c&BO\E*CBa!E]BWBW9/HaX%MBfBfV1  BN%99#2BY BNB_0ZjBiBi0[-BNBZ!LeBJB]9TE^% X;Be Be# BW&93&B].EZBR9ZBeE9#LX'BgBg 9^BWM E*#B`.BUBR V!,T!/B` B`8B]Bb*Me0]B_BZ9/bBkE^Bk %0\BM( 9=&B\*EZBZBWM_ SIVDBf Bf&BN*BX9bBeBWE-mBiBi9c&BOFE3YBa!JbBWBW93S(T'0EZ BfBf% BN & '9!BY T3 EWBNB_0ZS JY6'BiBi0[-BN BZ!BJB]95Be Be/BW~9BB]Ea*HbBR9ZBeQE3FS Bf Bf9BNHaS#BXE_9bBeBWH7T'mBiBi9c&BO9H0fBa!BWBW<3!S%MBfBf#T1BN-<>oBY$L_BNB_0ZQE_3BiBi0[-BNBZ!ENBJB]<%!Q)L[PS9Be Be/BW|<,B].BR9ZBeH9BgBg(9^BW?H%SB`&M]BUBR Ea S"Q?$B` B` ' B]%(%Bb*E]0]B_BZ<+!CBkMYBk*0\BMV<,@B\*BZBW!Q-"SC:Bf Bf9BN*BXJ_9bBeBWH+!E^& BiBi9cBO<H'KBa!EZBWBW<'JUS5#QEBfBf=BNo<%-BY$BNB_0ZT3S1qBiBi0[-BNBZEcL_BJB]<'7&'Be Be/BW' & <-B]EZBR9ZBeH1ST; L\&'BgBg'9^BW8H;ZB`BUBR|B` B`8B]Bb*Hb0]B_BZ5B))MA'E] SJ BkBk*0\BM+8)52=B\*EUBZBWHaQ):MU"Bf Bf9BN*BX9bBeBWA5S#6Q,7BiBi9c&BOA7 BaE_LNBWBW55!T!MBfBf=BNS35DwBY$E]BNB_0ZIL];BiBi0[-BNBZ!BJB]5;T> VgBe Be/BW%5>mB].M]BR9ZBeA#E]26BgBg(9^BW9A"HB`.EWBUBRMT X[B`VZ B`8B]Bb*0]B_BZ5/dBkBk*0\BMD5>RB\*L_BZBW!VEZUBf BfXKBNsLY7BXE]9bBeBWA%mBiBi9c&BOAA/^Ba!BWBW5-!T8VIBfBf=BNg5'5BY$J]BNB_0ZS18E\0TLBiBi0[-BNBZ!EZBJB]53JXsBe Be/BW 5' B].BR9ZBeA-T;]SQ%BgBg(9^BW0A0bB`EZ'H_BUBR|B` B`8B]Bb*E]0]B_BZ4'(7L; H[6)QTV#BkBk*0\BM<44ZB\*BZBW!S5LR'Bf Bf9BNyE[1BXGe9bBeBW@)T/S6%BiBi9c BO1@1&HBa!EWBWBW4) G[V'MBfBf=BNT)>46XBY$BNB_0ZBiBi0[-BNBZ!HeBJB]4-Q7 VE EP# Be Be!BW&%&B]4 (EOBR9ZBe@3"H]0BgBg 9^BWH@#/B` #BUBRQ^L%[B` B`%B]Bb*Ge0]B_BZ4LE_BkBk*0\BMM74+B\*E]BZBWG]S7LR%Bf Bf9BN*BX9bBeBW@1T% S$`BiBi9c&BOK@,TBa!HZBWBW4#E_ S#MBfBf'TMBN^4=>BY$E_BNB_0ZH\^BiBi 0[-BNK6BZ!BJB]4!!Q7HBe BeSG*BW64?GE^B].G_BR9ZBe@ABgBg(9^BW6@?\B`%G` @eBUBR|B` B`8B]Bb()(QT   @0]B_BZ95-/Q!dBkBk*0\BMY961QB B\@bC]BZBW!T\Bf Bf9BN T:CWBX@b9bBeBWE9VmBiBi9c&BO\E*CBa!BWBW9/!X%MBfBf+V1BNG99UBY$G_BNB_0Z@]jBiBi0[-BNBZ!@UBJB]9!T GTXX;Be Be/BWN93DB].BR9ZBeE9BgBg(9^BWoE*#B`!@` EZBUBR!V!,T!/B` B`8B]Bb*@W0]B_BZ9/ EVXBkBk*0\BMH9=NB\*BZBW!SIVDBf Bf9BN*BXGZ9bBeBWE-&@`GBiBi9c&BOFE3YBa!@UBWBW93GUS(T'MBfBf=BNp9!,BYT3 BNB_0ZSBiBi0[-BNBZ@aCWBJB]95Be Be/BW~9BB].@]BR9ZBeQE3CR1S Bf Bf9BNS#BXG]9bBeBWH7T'F@c'BiBi9c&BO9H0fBaGP@ZBWBW<3!S%MBfBf#T1BN-<>oBY$BNB_0ZBiBi0[-BNBZ!ERBJB]<% @`Q)VS9Be Be/BW|<,B]%ET @bBR9ZBeH9BgBg(9^BW?H%SB`.BUBR!S$Q?7B` B`8B]Bb*GZ0]B_BZ<+H@]BkBk*0\BMV<,@B\*@UBZBWGQQ-"SC:Bf Bf9BN*BX9bBeBWH+mBiBi9c&BOTH'5@bBa!CRBWBW<'!S5>QEBfBf=BNo<%-BY$@WBNB_0ZT3 CTS1qBiBi0[-BNBZ!COBJB]<' @[hBe Be/BWp<-CLB].@WBR9ZBeH1ST;BgBg(9^BW8H;ZB`.GWBUBR|B` B`@^B]Bb*@]0]B_BZ5B5AMAGT-SJ"BkBk&+E0\BMY52=B\*BZBW!Q):MU"Bf Bf9BN@aBXE7GD9bBeBWA5S#6Q,7BiBi9c&BOA7GBa!@bBWBW55EQ T!! 'BfBf & BNS35DB5BY BNB_0ZBiBi0[-BNBZ!G_BJB]5;T> VgBe Be/BW%5>mB])GQBR9ZBeA#BgBg(9^BW9A"YB`.HbBUBR!X[B`VZ B`8B]Bb*0]B_BZ5/dBkBk*0\BMD5>RB\*BZBW!V\Bf BfXKBN*BX9bBeBWA%mBiBi9c&BOAA/^Ba!BWBW5-!T8VIBfBf=BNg5'5BY$BNB_0Z2HS1*5U>TLBiBi0[-BNBZ!BJB]53Be Be/BW 5' B].JRBR9ZBeA-T;]SQ H`BgBg(9^BW@0)A0bB`.HRBUBRWJb%B` B`8B]Bb*G]0]B_BZ4'4JL;ATV2TBkBkHL"0\BM<44ZB\*BZBW!S5LR'Bf Bf9BN*BXHE9bBeBW@)T/S6'G_EBiBi9c&BO1@1nBa!EWBWBW4)!V'MBfHWBf=BNT)>46XBY$BNB_0ZBiBi0[-BNBZ!GWBJB]4-E^Q7VESBe Be/BWB]4 (BR9ZBe@3BgBg(9^BWc@#/B`.C_BUBRQ^L%[B` B`GJ B]Bb*0]B_BZ40NdBk 4LBk*0\BM4+B\*BZBW!S7LR%Bf Bf9BN*BX9bBeBW@1T% S$`BiBi9c&BOK@,TBa!BWBW4#!S#MBfBf'TMBN^4=3 BYBNB_0Z/Z40\/BiBi0[,BNB@BZBJB]4!!Q7B Be BeSG*BW64?\B]BR9ZBe@ABgBg(9^BW6@?\B`.BUBR|B` B`8B]Bb*QT   @/[ G @CZEb0]B_BZ97-Q!dBkBk*0\BM QB B\*BZBW!T\Bf Bf9BN T:9&BX9bBeBWE5VmBiBi9c&BOBaE. BWBW91!X%MBfBf+V1BN9.BY$BNB_0ZBiBi0[-BNBZ!BJB]9/!TaX;Be Be/BW9B].BR9ZBeE/BgBg(9^BWEB`.BUBR!V!,T!/B` B`8B]Bb*0]B_BZ91dBkBk*0\BM9)B\*JZBZBW!SIVDBf Bf9BN*BXL_9bBeBWE/8JY5BiBi9c&BOSE$LBa!MWBWBW97S(T'#LT*BfBf=BNm97/BYT3 LjBNB_0ZS1%&BiBi0[MTBN KKBZBJB]9-Be Be/BW_9/3B].JgBR9ZBeQE3FS !La BgBg 9^BW,E0AB` #BUBR|B` B`$B]Bb*Mj0]B_BZ71+O%-;JR QM-Bk Bk0\BM' #7B%$B\%BZBW!S)OJ3 Bf Bf9BN%wS#BX9bBeBWC?T'mBiBi9c&BO4C;kBaLeBWBW7+MW S%)$BfBfT1BN &7/G BY$BNB_0ZF>BiBi0[-BNBZ!BJB]7'!Q)VS9Be Be/BW~7&B].JeBR9ZBeC=KLU7BgBg(9^BW\C/6B`.BUBR!S$Q?7B` B`8B]Bb*0]B_BZ7%dBkBk*0\BM47CbB\*LbBZBW!Q-JSSC:Bf Bf9BN*BX9bBeBWC9mBiBi9c&BO)C2vBa!BWBW7%!S5>QEBfBf=BNe787BY$JeBNB_0ZT3S1WLYBiBi0[-BNBZ!BJB]7#Be Be/BWB]73'HeBR9ZBeC7ST;W% JTBgBg#9^BW CCEe ( %B`BUBR" &%B` B`B].MBb Eb0]B_BZ51))MA$Hd SJBkBk 0\BM+84 5?6B\*BZBWQ):MU"Bf Bf9BN*BX9bBeBWA!S#6Q,7BiBi9c&BO-A+rBa!BWBW5'!T!MBfBf=BNS3E5/:BY$BNB_0ZBiBi0[-BNBZ!G_BJB]5%T> V4E`3Be Be/BW51B].H_BR9ZBeA7@G\BBgBg(9^BWA)B`.EbBUBR!X&Ha5B`VZ B`8B]Bb*0]B_BZ29dBkBk*0\BMy28B\*BZBW!V\Bf BfXKBN*BX9bBeBW>7mBiBi9c&BO>>/aBa!BWBW2/!T8VIBfBf=BN82FdBY$BNB_0ZS1hTLBiBi0[-BNBZ!G_BJB]23?T;VGZSQ%BgBg(9^BWa>71B`.E]BUBRHfwB` B`8B]Bb*J_0]B_BZ49(7L;@)QTV#BkBk*0\ EaBMK4FKB\*BZBW!S5LR'Bf Bf9BN*BXHZ9bBeBW@;T/S6MJPBiBi9c&BOB@6]Ba!EUBWBW41 HZV'MBfBf=BNT)/48gBY$BNB_0ZBiBi0[-BNBZ!LUBJB]4/!Q7VEEdSBe Be/BWK4=GB].BR9ZBe@BBgBg(9^BWQ@4AB`.JgBUBRQ^L%,Lg$ B` B` & B]'$%&Bb'0]B_BZ49KBkBk*0\BM4MB\*BZBW!S7LR%Bf Bf9BNBX Hg9bBeBW@BT% S$Je ! $BiBi  9cBOF @4@Ba!BWBW4=!S#MBfBf'TM BN>4B^BY$BNB_0ZBiBi0[-BNBZ MgBJB]45Q7Ha="Be BeSGBWI4IIB]BR9ZBe@ABgBg(9^BW-@?eB`.BUBR|B` B`8B]Bb()(QT   @Le0]B_BZ95-/Q!dBkMVBk*0\BMY961QB B\*BZBW!T\Bf Bf9BN T: BX9bBeBWE9VmBiBi9c&BO\E*CBa!HeBWBW9/!X% L`DBfBf+V1BNG99UBY$BNB_0ZBiBi0[-BNBZ!BJB]9!TaX;Be Be/BWN93DB].BR9ZBeE9BgBg(9^BWoE*#B`.BUBR!V!,T!/B` B`8B]Bb*0]B_BZ9/dBkBk*0\BMH9=NB\*BZBW!SIVDBf Bf9BN*BX9bBeBWE-mBiBi9c&BOFE3YBa!BWBW93S(T'MBfBf=BNp9!,BYT3 BNB_0ZSBiBi0[-BNBZ!BJB]95Be Be/BW~9BB].M_BR9ZBeQE3HcES Bf Bf9BNS#BX9bBeBWH7T'mBiBi9c&BO9H0fBa!EUBWBW<3!S%+Le"BfBf#T1BN-<>oBY$BNB_0ZBiBi0[-BNBZ!BJB]<%!Q)VS9Be Be/BW|<,B].BR9ZBeH9BgBg(9^BW?H%SB`.BUBR!S$Q?7B` B`8B]Bb*0]B_BZ<+dBkBk*0\BMV<,@B\*BZBW!Q-"SC:Bf Bf9BN*BX9bBeBWH+mBiBi9c&BOTH'KBa!BWBW<'!S5>QEBfBf=BNo<%-BY$BNB_0ZT3S1qBiBi0[-BNBZ!BJB]<'Be Be/BWp<-"B].MgBR9ZBeH1ST;E[dBgBg(9^BW8H;ZB`.BUBR|B` B`8B]Bb*Lg0]B_BZ0]B_5B5AMABSJ"BkMcBkBk&+E0\0\BMY52=B\*BZBWBZ!Q):MU"Bf BfBf9BN*BX9bBeBW9bBeA5S#6Q,7BiBiBi9c9c&BOA7 Ba!H]BWBWBW55!T!.LdBfBfBf=BNS35DwBY$BNB_0ZB_0ZBiBiBi0[0[-BNBZ!BJB]B]5;T> VgBeBe Be/BW%5>mB].BR9ZBe9ZBeA#BgBgBg(9^9^BW9A"YB`.BUBRBR!X[B`VZBc B`8B]Bb*0]B_BZ0]B_5/dBkBkBk*0\0\BMD5>RB\*BZBWBZ!V\Bf BfBfXKBN*BX9bBeBW9bBeA%mBiBiBi9c9c&BOAA/^Ba!BWBWBW5-!T8VIBfBfBf=BNg5'5BY$BNB_0ZB_0Z2HS1*5U>TLBiBiBi0[0[-BNBZ!BJB]B]53BeBe Be/BW 5' B].MjBR9ZBe9ZBeA-T;;Hb SQ%BgBgBg9^9^BW' A0bB`.BUBRBRM/B`Bc B`8B]Bb*Lm0]B_BZ0]B_4'4JL;ATV2TM[BkBkBk*0\0\BM<44ZB\*BZBWBZ!S5LR'Bf BfBf9BN*BX9bBeBW9bBe@)T/S6lBiBiBi9c9c&BO1@1nBa!HbBWBWBW4)!V'Lb&BfBfBf.BNT)&46XBY BNB_0ZB_0ZBiBiBi0[0[-BNBZ!BJB]B]4-!Q7VESBeBe Be/BWB]4 (MgBR9ZBe9ZBe@3*HTXBgBgBg(9^9^BWc@#/B`.BUBRBRQ^L%[B`Bc B`8B]Bb*Lb0]B_BZ0]B_40NdBk 4LMRBkBk*0\0\BM4+B\*BZBWBZ!S7LR%Bf BfBf9BN*BX9bBeBW9bBe@1T% S$`BiBiBi9c9c&BOK@,TBa!H_BWBWBW4#!S#LY#)#BY#BNB_0ZB_0Z3QBiBiBi0[0[%BNBZ!JeBJB]B]<%HSBeBe Be/BW|<,B].BR9ZBe9ZBeH9BgBgBg(9^9^BW?H%SB`.EbBUBRBRwJbB`Bc B`8B]Bb*0]B_BZ0]B_<+dBkBkBk*0\0\BMV<,@B\*LgBZBWBZ E^'Bf BfBf0 BNDfBX9bBeBW9bBeH+mBiBiBi9c9c&BOTH'KBa!JeBWBWBW<'nBf LT BfBf=BNo<%-BY$HeBNB_0ZB_0ZJJ`:BiBiBi0[0[-BNBZ!J_BJB]B]<''HZaBeBe Be/BWp<-"B] J]%EZBR9ZBe9ZBeH1BgBgBg(9^9^BW8H;ZB`.GgBUBRBR,E_PB`Bc B`8B]Bb*Cb0]B_BZ0]B_5B))MGaBkBkBk*0\0\BM+8:52=B\*BZBWBZ}Bf BfBf9BNgC[CBXH_9bBeBW9bBeA5mBiBiBi9c9c&BOA7 Ba!EeBWBWBW55FHa(BfBfBf=BN%5DwBY$BNB_0ZB_0ZBiBiBi0[0[-BNBZ!JbBJB]B]5;DEUDBeBe Be/BW%5>mB].BR9ZBe9ZBeA#BgBgBg(9^9^BW9A"YB`.E]BUBRBRJ[^B`Bc B`8B]Bb*0]B_BZ0]B_5/dBkBkBk*0\0\BMD5>RB\*LgBZBWBZ[EU"Bf BfBf9BN*BX9bBeBW9bBeA%mBiBiBi9c9c&BOAA/^Ba!JgBWBWBW5-.LY?BfBfBf(BNI5'1BYGbBNB_0ZB_0ZJb/=BiBiBi0[0[-BNBZ!BJB]B]53BeBe Be/BWG^5' B].MeBR9ZBe9ZBeA-BgBgBg(9^9^BW0A0bB`.BUBRBR|B`Bc B`8B]BbLj0]B_BZ0]B_4'(7@)Q M\BkBkBk $0\0\BM#44%5B\BZBWBZ;BBf BfBf9BN9qBXJ]9bBeBW9bBe@)]LdBiBiBi9c9c&BO1@1nBa!LeBWBWBW4)J\`BfBfBf=BND46XBY$BNB_0ZB_0ZBiBiBi0[0[-BNBZ!HbBJB]B]4-4L^ & BeBe Be/BW & %(B]4 BR9ZBe9ZBe@30'+BgBgBg"9^9^BWc@#/B`LbBUBRBR|B`Bc B`H]B]Bb*0]B_BZ0]B_4dBkBkBk*0\0\BM4+B\*GgBZBWBZ1Lb( Bf BfBf #BN "$&' BX9bBeBW9bBe@11BiBiBi9c9c&BOK@,QBa!LgBWBWBW4#`GaBfBfBf=BN^4=>BY$BNB_0ZB_0ZBiBiBi0[0[-BNBZ!E]BJB]B]4!3La% BeBe Be *BW! 4?&$B])BR9ZBe9ZBe@A/?BgBgBg(9^9^BW@?\B`.BUBRBR|B`Bc B`8B]Bb()(0]B_BZ0]B_97-/dBkBkBk*0\0\BMB\*BZBWBZ}Bf BfBf9BN&9&BXJb9bBeBW9bBeE5?E].BiBiBi9c9c&BOBaE. LbBWBWBW91JS`BfBfBf=BN9.BY$JbBNB_0ZB_0Z\LU(BiBiBi0[0[-BNBZJHHeBJB]B]9/BeBe Be/BW9B].BR9ZBe9ZBeE/BgBgBg(9^9^BWEB`.JbBUBRBRUH]'B`Bc B`8B]Bb*0]B_BZ0]B_91dBkBkBk*0\0\BM9)B\*LbBZBWBZ1JSLBf BfBf9BN*BX9bBeBW9bBeE/mBiBiBi9c9c&BOSE$LBa LTHbBWBWBW97nBfBfBf=BNm97/BY$BNB_0ZB_0ZBiBiBi0[0[-BNBZ!JWBJB]B]9-THS4BeBe Be/BW_9/3B].LRBR9ZBe9ZBeE3NJ[4BgBgBg(9^9^BW7mBiBi9c&BO>>/aBa!H]BWBW2/EG_)BfBf=BN82FdBY$BNB_0Z2H*5UZBiBi0[-BNBZ!JOBJB]236H\ &Be Be/BW C250B].HZBR9ZBe>?BgBg(9^BWPJC>71B`.GKBUBR|B` HUB`8B]Bb*EZ0]B_BZ494JP2TBkGX Bk*0\BMK4FKB\*BZBW}Bf Bf9BN*BXG_9bBeBW@;,ETABiBi9c&BOB@6]Ba!BWBW41nBfBf=BN548gBY$@bBNB_0Z0GeTBiBi0[-BNBZ!BJB]4/Be Be/BWK4=GB].BR9ZBe@BBgBg(9^BWQ@4AB`.CbBUBRd@jB` B`8B]Bb*0]B_BZ490NdBk 4LBk*0\BM4MB\*BZBW}Bf Bf9BN*BXE_9bBeBW@B;Ce%BiBi9c BOA@4NBaBWBW4=nBfBf=BN>4BS BYBNB_0Z/Z40\/BiBi0[,BNB@BZ GWBJB]45& EK Be BeBW;4IIB] BR9ZBe@A9IBgBg$9^BW@? & 'B`BUBR$GB`B`8B]7_Bb*/@/[/@H]0]B_BZ95/ Gd  BkBk#0\BM &&96'B\*BZBW}Bf Bf9BN*BXJU9bBeBWE9HX\BiBi9c&BO\E*CBa!HZBWBW9/.JU Bf BfBN$99GBY"BNB_0Z,XBiBi0[-BNBZ!L_BJB]9 HShBe Be/BWN93DB].HZBR9ZBeE9. LUBgBg9^BW'%#E*#B`'BUBRL0B` B`8B]Bb*Mb0]B_BZ9/JH\ Bk Bk 0\BM"&9='&B\*HWBZBW"6MW%Bf Bf ,BN*BX9bBeBWE-mBiBi9c&BOFE3YBaHVL]BWBW93nBfBf=BNp9!,BY$H]BNB_0ZB& BiBi 0[ LX BN%)$BZ!BJB]95nBeBe/BW~9BB].MgBR9ZBeE3,HPVBgBg(9^BWeE.-B`.HZBUBR' MW B` B`& B] '&'Bb0]B_BZ<-"  +BkBk &0\BMoBY$QgBNB_0Z&HY^BiBi0[-BNBZ!HUBJB]<%/( "QV Be BeBW &&'<,B]SbBR9ZBeH9T.BgBg(9^BW?H%SB`.BUBRHYbB` B`S_&B]Bb*HZ0]B_BZ<+! $ Bk Bk0\BM"(<,!B\*BZBW rBf Bf9BN&BXTb9bBeBWH+BHZ+BiBi9c&BOTH'KBa!H_BWBW<'%TW %BfBf& BN# &%<%)BY BNB_0Z% #&BiBi0[( BN! %(' BZV]BJB]<'HXKBe Be/BWp<-!B]% HWBR9ZBeH1[VZBgBg(9^BWH;ZB`.VZBUBRmH[B` B`8B]Bb*H]0]B_BZ5B?VX BkBk*0\ BMY523 B\*TeBZBW>HW?Bf Bf9BN*BXHZ9bBeBWA5 TX0& BiBi9cBOA7%MBa!S_BWBW55?H\/BfBf,BN%5DwBY$HZBNB_0ZS[BiBi0[BNMBBZ!T]BJB]5;H\qBe Be/BW%5>mB].HOBR9ZBeA#.TUTBgBg(9^BW9A"YB`.V_BUBR)H[SB` B`8B]Bb*HO0]B_BZ5/VROBkBk*0\BMD5>RB\*T]BZBWHZxBf Bf9BN*BXHR9bBeBWA%TQhBiBi9c&BOAA/]HUBa!SZBWBW5-nBfBf=BNg5'5BY$HRBNB_0Z' S\%BiBi0[%BNMPBZHU Q_BJB]53Be Be,BW 5' B].HMBR9ZBeA- Q[vBgBg(9^BW0A0bB`.O]BUBRHYiB` B`8B]Bb*HR0]B_BZ4'"OZBBkBk*0\BM<44ZB\"M_BZBWH^^Bf Bf1BN*BXHW9bBeBW@)4MZ9BiBi9c&BO1@1nBa LbBWBW4)H\.BfBf 4BN>46XBY$HZBNB_0Z9LZKBiBi0[-BNBZH`J_BJB]4-<KBe Be/BWB]4 (HZBR9ZBe@3J[|BgBg(9^BWc@#/B`.LbBUBR!H^[B` B`8B]Bb*HZ0]B_BZ4)L];BkBk*0\BM4+B\ H] JZBZBW}Bf Bf9BN*BX JW HZ9bBeBW@1mBiBi9c&BOK@,TBaH\ JUBWBW4#nBfBf=BN^4=>BY!JWH]BNB_0Z&1BiBi0[  BNSJH_BZ!JUBJB]4!Be Be/BW64?\B]JXH]BR9ZBe@ABgBg(9^BW6@?7H`%B`.JZBUBR|B` B`8B]Bb J\ E]0]B_BZ95dBkBk*0\BMY96=B\*BZBW}Bf Bf9BN*BXH]9bBeBWE9EX^BiBi9c&BO\E*CBa!E]BWBW9/HaUBfBf% BN%99#2BY BNB_0ZjBiBi0[-BNBZ!LeBJB]9E^% !Be Be# BW&93&B].EZBR9ZBeE9#LX'BgBg 9^BWM E*#B`.BUBRdB` B`8B]Bb*Me0]B_BZ9/bBkE^Bk %0\BM( 9=&B\*EZBZBWM_hBf Bf&BN*BX9bBeBWE-mBiBi9c&BOFE3YBa!JbBWBW93QEZ BfBf% BN & '9!BY EWBNB_0Z JY6'BiBi0[-BN BZ!BJB]95Be Be/BW~9BB]Ea*HbBR9ZBeE3BgBg(9^BWeE.-B`.EbBUBR9H[CB` B`8B]Bb*0]B_BZ<-dBkBk*0\BM2oBY$L_BNB_0ZQE_3BiBi0[-BNBZ!ENBJB]<%'L[aBe Be/BW|<,B].BR9ZBeH9BgBg(9^BW?H%SB`&M]BUBR Ea %&B` B` ' B]%(%Bb*E]0]B_BZ<+!CBkMYBk*0\BMV<,@B\*BZBW}Bf Bf9BN*BXJ_9bBeBWH+!E^& BiBi9cBO<H'KBa!EZBWBW<'JU2BfBf=BNo<%-BY$BNB_0ZBiBi0[-BNBZEcL_BJB]<'7&'Be Be/BW' & <-B]EZBR9ZBeH1 L\&'BgBg'9^BW8H;ZB`BUBR|B` B`8B]Bb*Hb0]B_BZ5B'E] & BkBk*0\BM0)52=B\*EUBZBWHamBf Bf9BN*BX9bBeBWA5mBiBi9c&BOA7 BaE_LNBWBW55nBfBf=BN%5DwBY$E]BNB_0ZIL];BiBi0[-BNBZ!BJB]5;Be Be/BW%5>mB].M]BR9ZBeA#E]26BgBg(9^BW9A"HB`.EWBUBRMTdB` B`8B]Bb*0]B_BZ5/dBkBk*0\BMD5>RB\*L_BZBW(EZUBf Bf9BNsLY7BXE]9bBeBWA%mBiBi9c&BOAA/^Ba!BWBW5-nBfBf=BNg5'5BY$J]BNB_0Z8E\LBiBi0[-BNBZ!EZBJB]53JXsBe Be/BW 5' B].BR9ZBeA-BgBg(9^BW0A0bB`EZ'H_BUBR|B` B`8B]Bb*E]0]B_BZ4' H[ZBkBk*0\BM<44ZB\*BZBW}Bf Bf9BNyE[1BXGe9bBeBW@)%BiBi9c BO1@1&HBa!EWBWBW4) G[bBfBf=BND46XBY$BNB_0ZBiBi0[-BNBZ!HeBJB]4- % EP# Be Be!BW&%&B]4 (EOBR9ZBe@3"H]0BgBg 9^BWH@#/B` #BUBR|B` B`%B]Bb*Ge0]B_BZ4LE_BkBk*0\BMM74+B\*E]BZBWG]aBf Bf9BN*BX9bBeBW@1mBiBi9c&BOK@,TBa!HZBWBW4#E_VBfBf=BN^4=>BY$E_BNB_0ZH\^BiBi 0[-BNK6BZ!BJB]4!iBe Be/BW64?GE^B].G_BR9ZBe@ABgBg(9^BW6@?\B`%G` @eBUBR|B` B`8B]Bb*   @ G @-Q!97JQB#@bC]!T)T:9&CW@bVE5sE. 91!X% V1+9.'G_@]f@U9/!T GTXX;L92E/DE/@` EZ!V!,T!3@W91 EV49)aSIVDGZE/&@`mE$m@U97GUS(T' 97JT3 S}@aCW9-9/a@]QE3CR1S 6E0CW@aVCS@_+O%71-;QM % (%&& 7BDMS)OJS#$G]T'C?F@c.C;GP@Z7+!S%T1f7/tER7' @`Q)VS9G7&9ET @bC=C/S$Q?;GZ7%H@],7C @UGQQ-"SC=C9iC2`@b7CR7%!S5>QEF78[@WT3 CTS1mCO7# @[/CL 73'@WSC7T;NCC/GW&@^Z@]))MA51GT-SJ+8A5?Q):MU~@a'E7GDS#A!6Q,!GA+@b5'EQ T!! '&&%S3E5/OsG_5%T> V-51-GQA7DA)7~>/2/!T8VI2FS1hTL2325qJRT;>?]SQ H`]@0Z>7_HRWJb)G](7L;49@)QTVJHL4FS5LR*HET/@;S6'G_Z@6~EW41!V'SHWRT)/48 GW4/E^Q7VEV4=u@B@4oC_Q^L%GJ`49A4M`S7LR(T%@B S$@4o4=!S# TMT4B45!Q7uSGs4Iw@Am@?k()(QT   @Je-/Q!95961QBWT)T:6HZVE9WCZJ\BE*dGe9/!X%HUV1Y99yHe9!T8G^)X; 93rE9/E*QJb!V!,T!H]q<9/9=xHe!SJWVD&Ms(E-E3G]`93H]S(T'9!GT3HbS G^=0G_95*H_9BBEeQE3FS G\CE.[J_+1O%<-7QM/ El-C&V=H]<%!Q)+Ga+S9E<,DH9H%JbHbS$Q?;<+<,jHb!Q-"SC/J`H+H'lMb<'HX S5>QEP<%QL_T3S1JM^CJ]`<'6LXz<-PLeSH1T;JT_H;He5AMA5B# L[ SJ%?+E& & 52&%(Q):MU JWS#A5*Ha Q,A7+Le55!T!BJYzS35DHW5;T> LNVD5>A#yA"Gb!X H_|HZ!VGNrXK]A%A/EU5-!T8VIHM<5'YGg2HS1*5U>TLES53I5'7H_T;A-SG_ SQA0Cb4JL;4'ATV2THN'44%S5LR*GZT/@)S67CR9@1H]4)V'# GaNT)>46%wJZ`4-HRQ7VE#4 (@3 H_@#dQ^JW L%_0N4o4LU4+9BBHRQE3FS G6%NM E.[J_+O%<--;QM HY%')&-&.3HZ`<%GRQ)VS9E<,DH9H%}J]HTS$Q? % &&%(K.<+w<,VH]!Q-"SC8JXH+H'lGZ<'!S5>QEHUN<%QL]T3S1VGd<'0<-PJbSH1T;^LZH;))MA5BBSJJ^Hb!'&+8:52M;Q):MU LWS#A56Q,2HcmA7+MZ55!T!6La%&% S35D %&'*Is9OW5;T> V M\ %( '5>&'&#A#*q^A"QZ!XOn0VZC@5/5>|Oe!VoQTXK]A%A/MO5-!T"OSVIN5'YL_S1hTLMay53I5'7MNT;A-SL` SQA0LZDMW<(7L;4'@)QTVJ_)Las44%S5LR*LOT/@)S6}JWs@1J_4)!V'5L[pT)>46HW`4-JYQ7VE#4 (@3 G_@#>HZ&Q^L%_4D4+G^'$'&MQBWT;L'&%(T:9&VE5&&'KE. 91!X%M& V1 '&%9. 6=r89/!TaX;L92E/DE]V!,T!391@9)aSIVDE/E$m97S(T' 97JT3 S9-9/aQE3FS 6E0GW+O%71-; H_QM $&r 7BS)OJ$%& ' &&'S#$T'C?DC; 7+S%T1f7/t7'!Q)VS9G7&BC=C/S$Q?;7%t7C-Q-"SC=C9iC27%!S5>QEF78[T3S1m7#Y73'SC7T;NCC/EZ))MA51BSJ GV+8A5?Q):MU%S#A!6Q,7A+5'!T!C&%.S3&5/'OJ5%T> V-512A7DA)]X\VZ29928hVXK]>7~>/2/!T8VI2FS1hTL2325qT;>?]SQD>7_GW(7L;49@)QTVE_rM4Fq%S5LR*T/@;S6@6~41!V'%T)/48 4/!Q7VEV4=u@B@4vQ^L%_49A4M`S7LR(T%@B S$@4o4=!S# TMT4B45!Q7uSGs4Iw@Am@?k()(QT   @GiVW-/Q!95V]'T_Y961QBTaXW!T XYVW T:V[!YWVE9&YZV_\E*AV^#X]9/!X%aXZ,V1T_G99ATa8YOYZ9T]!T`XW9!TaX;"XZVWN93\V]YWE9YU!T]oE*.Ta#XW!V!,T!IX^*VWV[![]9/[X"VZH9=QV`'YW!SIVD;YYT]T`.XZE-%oX[TZFE3ZT\ VW93S(T'lV_3S]p9!%S^ T3 XWS#X]S]S`$VW95$VWQ]~9BBQWT_QE3FS WT`#Q]eE.7Qa$V]#V^QeQi)XZ+1O%<-7QMPXX"-CTZ2hX_+YUY[%X]Xd8[Z<%!Q)VS9+[ZVW|<,.V]YWH9YU"VW?H%cVQXW!S$Q?TX_'TNT\"YO<++YYT]V<,\TWXR!Q-"SCiXWTZ"T_VUH+ V[ T]TH'CTc)XU<'!S5>QEXX[ SZo<%1SW VUT3S1 V["SWS`(TZ<'Tb2Sbp<-1SaVUSH1T; V[0S]8H;^Sb*XW)X\T_!TbVW5AMA5BBSJWV]+ET_Y52JTaXW!Q):MUPXYVWV[!YWS#A56Q,pYZV_A7V^#X]55!T!aXZ>T_S35DcTa8YOYZ9T]!T`XW5;T> VXZVW%5>V]YWA#YU!T]9A"dTa#XW!X\VZX^*VWV[![]5/[X"VZD5>UV`'YW!VXKYYT]T`.XZA%%oX[TZAA/_T\ VW5-!T8VI4V_3S]g5'.S^ XW2HS1*5U>TL;X]S]S`$VW53$VWQ] 5'7QWT_T;A-]SQ@T`#Q]0A0lQa$V]#V^QeQi)XZ4JL;4'ATV2T7XX9TZ<44jT]YN!S5LRUYWVZ(V^XZT/@)S6X]46QX_+YUY[%X]Xd8[Z4-!Q7VEm[ZVW4 V]YW@3YU"VWc@#?VQXWQ^L%xX_'TNT\"YO0N4o4LhX_+YUY[%X]Xd8[Z<%!Q)VS9+[ZVW|<,.V]YWH9YU"VW?H%cVQXW!S$Q?TX_'TNT\"YO<++YYT]V<,\TWXR!Q-"SCiXWTZ"T_VUH+ V[ T]TH'CTc)XU<'!S5>QEXX[ SZo<%1SW VUT3S1 V["SWS`(TZ<'Tb2Sbp<-1SaVUSH1T; V[0S]8H;^Sb*XW)X\T_!TbVW))MA5BBSJWV]'T_+8:52JTaXW!Q):MUPXYVWV[!YWS#A56Q,pYZV_A7V^#X]55!T!aXZ>T_S35DcTa8YOYZ9T]!T`XW5;T> VXZVW%5>V]YWA#YU!T]9A"dTa#XW!X\VZX^*VWV[![]5/[X"VZD5>UV`'YW!VXKYYT]T`.XZA%%oX[TZAA/_T\ VW5-!T8VI4V_3S]g5'.S^ XWS1hTL;X]S]S`$VW53$VWQ] 5'7QWT_T;A-]SQ@T`#Q]0A0lQa$V]#V^QeQi)XZ(7L;4'@)QTVFXX9TZ<44jT]YN!S5LRUYWVZ(V^XZT/@)S6X]46QX_+YUY[%X]Xd8[Z4-!Q7VEm[ZVW4 V]YW@3YU"VWc@#?VQXWQ^L%xX_'TNT\"YO4+YYT]4+.TWXR!S7LRTXWTZ"T_VUT%@1 S$V[ T]K@,LTc)XU4#!S# TM X[ SZ^4=BSW VUV["SWS`(TZ4!!Q7mTbSG*Sb64?kSaVU@AV[0S]6@?`Sb*XW)X\T_() TbQTVWV]'T_#TaXW+XYVWV[!YW&YZV_V^#X]XZ>T_Ta8YOYZ9T]!T`XW$XZVW*V]YWYU!T]Ta#XWX^*VWV[![][X"VZV`'YW%YYT]T`.XZ%oX[TZ T\ VW V_3S]S^ XW#X]S]S`$VW$VWQ]@QWT_T`#Q]Qa$V]#V^QeQi)XZXX9TZ&T]YN+YWVZ(V^XZX]T_Ta8YOYZ9T]!T`XW$XZVW*V]YWYU!T]Ta#XWX^*VWV[![][X"VZV`'YW%YYT]T`.XZ%oX[TZ T\ VW V_3S]S^ XW#X]S]S`$VW$VWQ]@QWT_T`#Q]Qa$V]#V^QeQi)XZXX9TZ&T]YN+YWVZ(V^XZX])JG4S94A)Rc(O74UI4D(]l&Z>4W=4A&&]Z$gW4WB&?{$Q4B6Sw  @4\  @-GT!E#/AT&!/6I/J/EpT)T<:EN4EG:W :Js4DTE-VmTDN)RG/e4W /C EFH!TEA/M7GCE/LT"H5WT/HTD /AuEHqED:Rx:BTT?e4E)Ty(RN4X EM&TEG/K /KT)JG/G4SEK/< HTED/HHGA=/LT:-H%7/D/FxTtT'EGmEE:R~:64A)Rc(OT74U1EGeT3EA/?x/CT/B/ATB!EITEH:O:T,:"44D(]l&ZT/)>4WEJT /G'ED:KTT/I:4A/H&&]z/F`$gW4W EDT!EN:Oq:@`T#H&?{$Q4B JEE-T#rTD  @4\  @-GJOTVE#/dT&!/6I/J/EpT)T<:EN4EG:W :Js4DTE-VmTDN)R/e4W /C EFTEA/M|/LT"qJ,zT/HTD /AuEHqED:Rx:BTT?e4E)Ty(RN4X EM&TEG/K /KT)J/G4SEK/< TED/H/LT:d/D/FxTtT'EGmEE:R~:64A)Rc(OG T74U1EGeT3HEA/?6G6B/C*H%^T/B/ATcEITEH:O:T,:" 9])4D(]%$('%%&"'&&'&ZT/)4WEJ% & !T /G&MEDS-Tw"T/g4A/H&&]z/F`$gW4W EDT!EN:Oq:@`T#H&?{$Q4B 3EE- 6 @4\  @-GT!E#/AT&!/6I/J/EpT)T<:EN0%(% EG:W M,:J ( %&'&MK|4DT7-VmTDN)R/e4W /C EFTEA/M|/LT"kT/HTD /AuEHqED:Rx:BTT?&'&r4E)T'&KO(RN4X EM/M&TEG/K"'D/KT<eM&&./G/G*VTLEHT?*M~EG:R s :: (V;4AT qT9?&'&&/M/K(EK4W/L!'%&(&+'-&/%2EB5%8&;'>&A&DMEb/FME/= D&B'@&>%;(7%34;T/E0/GT=/C/E^0 +N4TEC.M-s,EJ:WW+:(*((%%&"'&&T &%( T@&'LF4B,#+Sh I-Z4WrEK M $E]TEB/HO&/LT=&%&'M%&&'&(T/A% iT9 /? & % (&%(=EI'&& ' K -ED:N &'&&":- %&(%*(,%.T/s0 TB1r5&9 4?='?&@%?&>-Ke?Y)J/G4SEK/<@'A&BMA&B%ETED/HH%F&E!/LCT:A&?'>&=M<>;Q/D::N/F%9%8(6%4&2'0T/&-4WEJ&%(T /G&'&&ED(%&'L'K TT/& % ( %& 4A/H &] & :/F % (K5$gW4W EDO(% &(%T!EN:O"&:@"&##T#&%/&7%>(A%B DB&C F(I&L $Q4BO$U%^&f"l&qEE$u'w&y%{T#|%}&{TDt&n&h'e&g%m&r QW  @4\  @-GT!E#/A+u w$y'{T&|/6}M~N/J|}/E{'w&t&q'm&iT)b([%R&HT<?%8EN!3%.('%!!EG:W%&:JN%(%&' &"&#'$&%%&('%(&)%4DT*+-V -'.&0TD2(4%7&9':&)RG/&8%64W /C3 EF1&.',&*&)''&&H!TEA/M7GCE/LT"'%mH5x&'$&!&'&%sT/H!%&#TD/A %!(#&$%%&&r%&EH#(!% (K1ED:RB%":B(%-&1'5&6&5'3 T1'0&.4T?-q.'/44E)T0K2f/%*(R%'!4X&'&EM &'9TEG/Km/KT<,M M%M/G]#/GMK& ' T%(EH  T?s%(EG:R % &::'&M%&@%(% (V4ATKT90&M&!/M/K#EK4W/L@$'&IEB &(&%,&3'6&5%4(2$/ 12(4/=75'7&8&:';&<&4;T/EL:&6 T=/C/E2'/&,%+()%&&#+N4T! EC &%MEJ:Wv:(j'&&'T %(T@s4B$! +S"K %(%(& -Z4W(%EK % (K (% TEB/H%&/LT==%(% & ' &'&&%&'&&T/A!"$%%&&T9/? (s'&"%(%&EI&& & '&%(ED:N7M<:-@T\@TK4?"(%&-K0)JG/,4SEK/< HTED/H GA (/LT:,H%L&M% ( % & M&%&"/D+M/FxTP$T'EGmEE:Rs :6&%(%(#N%( % &%(&%4A)R9K $I-T( (OT!"4U#!EG$&#&!T&%(,EA/?'& /CA&%&' & M & %&MM1T/BB% /AT '&&'KM*EI TEH:O:T,:"44D(]l&ZT/)>4WEJT /G]REDN2:KTT/3:4A/H&&]z/F`$gW4W EDT!EN:Oq:@`T#H&?{$Q4B JEE-T#rTD|XN  @4\  @-GJOTVE#/d.d ' $T& e/6 dA e & '&%(Kd +/Jeda/Ee%d &T)e dLT< eEN&M/EG:WCJ:J6d%eA%&'3d@ ee4DT(-Vd?&TDe)R/e4W /C EFL7TEA/M|/LT"qJ,3dGT/HTDe /AuEHqED:Rx:BF)T %(%T?(%&M d4E)TO Ye? M E(RN4X EM&TEG/KL/KT<df% 4e f /G' Y/GsdMe@T d REHe T?Y &%(%EG:R$K'::L d(% e ( K r f(V54ATEMT9` /M/KC EK4W /L d&'& e' EB@( d eM2dN/I/=OeN4;T/E}T=/C/Esd@&+N4T e EC&% 4d & ( e :EJ:W"=:(5dUTCe'T@&K 4BO+S&KA-Z 4WrEKzdTEB/H1L/LT=2eI0Pd#*eT/Ad  %(eT9/?$Ms&d"EI% e" ' & d"'eED:N(p:-(MKTd$%(% T$ &%(e#d$4?%&&%( -K! & '&&)J/#$4SEK/< %&'&e"d# TED/Hn/L T:(e#&'d$% ( &%&' & % ( &e/D&'/F,sM TA3T'EGGr&EE:R &:6& %"(#d#%&&''edre(d"(%*4A+)R,Q-"-K.e(d(OG T-#4U(, EG+&)"T'&&e)L_"%9HEA/?6G6&EN2/C 'H%F(Od$'&$%"e$%&'@T/BdEe&d/AT KMve&dEI:*e#LdATEH:OV%&T, :"H>QeG4D d(] M"M#!$&ZT/)+ 4WEJ '&e"T /GED H_&!%#(%%&*dre%Tp%'$T/<%+4A/H$&&]&dMe/F%M$M#+$gG%4W ED &&'M(M)OdT!EN:Ok+:@,(-T# .*eI-&+#*$)(QdE'eI(%)$Q4B*$,%-#.%/ EE-0s1dI0eE] 6 @4\  @:j-GT!E#/A?2$7&9 T&7/66(5K499O :+3d29Ye6Z/J92d"1'0 /E/%-&,'*('$%e8eT)6R#&!% *d T<:ENMe$d!8 7_EG:WL :J&e7Y5M =d:e4DT%5Q -V<e#TDcM9b)R/@:4W /C EF#(%&' &9Z 6_TEA/Md  (%/LT"0&&e$&d8]6[#eGMd8+47_T/HTD /A''&e#&7]5U& iEH M&%(d%ED:R$O:BD(% & ' & :UT"'& 5PT?%9)G'!:2 9( 9E734E)T $%(%&e7 'd9H+e5_69(R/4X6#nEMdH+5+8]TEG/K" &!e /K"T<#%%(&%'d"(37W)68*edJ)7Xe.2]/G/G2*2P18_:77)T( 7J&&$EH"T?d$ %&&: 61eEG:Re 8Z %& ::!&"dI#K$ 1T 8e8#&!)$e"'&%(V&d7G5J4AT$89b)J/@:4SEK/<9Z 6_TED/Hdm/LT:xeNd8]6[+ed8+47_/D/F eQ7]5UTtT'EGHd%EE:R~:6:Uy5PG9):29(9E734A)RFe74d9H:e5_69(OT74U1EG6#0' Td&' 5 $8]EA/? %e/C#!&$'&Cd $%!&7W&&8e.&%d.7Xe&2]T/B&!$#%&/AT(%*&-'1&5 2P6'48_:77)"37J,EI2d1N0[:C1eTEH:Oe 1 8Z?5%9(T,<:" d>&@%B(C$1TF8eH(I%K&LeN&PsOdN 7G5J4D(]L I8D&>':&8%;e A5CF 7OI 0]&ZT/)#L4WOEJ R U &T T/G R Q P (8UED0M!hS dU&W'Z&[Ee\ 0WT# 8T] ^T/` a c e )$8e4A/H&&]"d0S9 /F+e%d fsi7W$gj 88le4WmED%o%p&q&r'sb3jT!EN:O7X\:@^tT#dSu?:W v 3]w%xGe8yF:/$Q9]4BWzdJEE9a 2]T#y3TD0x  wF  @4\  @2W:j-GT!E#/A4vu s&qT& n/6k&i%g&fH9O d:+c)bI`(^%]&\d29YYe6Z/JVQdM&J/E E&?%;(7%/&&e8eT) 6R&'d T< % EN%ed!8 7_EG:W'f:J 9e7Y5Mhd:e4DT%5Q -V<e1TDN9b)RG/@:4W /C EFsM$9Z 6_H!TEA/MdGC2/LT"eH59d8]6[+ed8+47_T/HTD /AxeQ7]5UEH;d%ED:Rx:B:UTy5P"T?%9):29(9E734E)TV( %&eL,7!d9H'e5_69(R54X6#%& EMd( & 5LW8]TEG/K( 8e /KT<&'H3 $d((,7W /&081eKE628d<17Xe.2]/G/.&-'*/G#'&#%(%2P8_:77)T7J "EH T?d%&&+:"!1eEG:Re8Zh::Ad1T 8ex7e(V*d7G5J4ATZ8"T9se5C$7O$ 0]/M/K'&EK4W /L &%&'&ON8UEB0M!)LI $%d:(%9e/0W" 8T/= ($ & '&)# 8e4;T/E'd0ST=/C/E#e%dK07W+N4T EC 88e 3jEJ:W7Xa:(xd:WT.3]WT@Ae:/!9]4BO+S'dq9a 2]-Z4WK$EK)MLU2W:jTEB/H}/LT=d9O :+d29Ye6ZT/A=dQT9/?Me8e6RREI(de(d8 7_ED:N"$ %(:- ew7Y5MT!%GT,d:e4?! 5Q#&$&%e&"-K'M(m9b)JG/"):4SEK/ 7]<5UT$;K:T'EG9&7&5'1&.%+d!(EE:R!'&%7:6V$%!:UM 5P> 9)j%:29(9E734A)RFe74d9H2e5_69(OT 4U &EG6##>T dE&58]EA/?Qe /C:&'& d&7W%8esdL7Xe.2]T/B/AT(!2P8_:77)=7J,EI#d(%&:!&#1eTEH:Oe$ 8ZU%7T,:" dE#'!& 1T 8e(%& & e&%(% d7G5J4D(]E8Ee5C$7O$ 0]&ZT/)!4WEJ &' &T /G &'Hb(8UED0M '&d ( %&'e0W:KT 8T (T/ & '&) :8e4A/H&&]"d0S9 /F+e%d7W$g88e4W ED3jT!EN:O7X\:@`T#d:W3]e8a:/$Q9]4BvdJEE9a 2]T#KTD=Q  @4\  @2W:j-GJOTVE#/dT&!/6I9O :+d29Ye6Z/J=dS/E^e8eT)6Rzd T<:ENRe(d48 7_EG:W :JDe7Y5Mhd:e4DT%5Q -V<e1TDN9b)R/@:%4W /C EFx9Z 6_TEA/Mdd/LT"eNd8]6[J,)ed8+47_T/HTD /AxeQ7]5UEHLd%ED:Rx:B:UTy5P"T?%9):29(9E734E)T\e74d9H:e5_69(RN4X6#nEMds5+8]TEG/Kme /KT<dU7WP8edL7Xe.2]/G/GO2P18_:77)T=7J9EHT?d1:C1eEG:Re8Zh::Ad1T 8e/e(V*d7G5J4ATZ89b)J/@:4SEK/<9Z 6_TED/Hdm/LT:xeNd8]6[+ed8+47_/D/F eQ7]5UTtT'EGHd%EE:R~:6:Uy5PG9):29(9E734A)RFe74d9H:e5_69(OG T74U1EG6#aTds5+8]HEA/?6G67e /C*H% dU7WP8edL7Xe.2]T/B/ATI2P18_:77)=7J,EI#d1:C1eTEH:Oe8Z T,:" d1T 8e/e@d7G5J4D(]F8Ee5C$7O$ 0]&ZT/)'4WEJ &' &T /G &'&(8UED0M!ud@e0WT# 8T&(T/" & '&)$8e4A/H&&]"d0S9 /F+e%d7W$g88e4W ED3jT!EN:O7X\:@`T#d:W3]e8a:/$Q9]4BvdJEE9a 2]KMc-"9L 6 @4\  @2WQG-GT!E#/AT&!/6IX1cVA/J/E XgXAT)0V:bT<:EN4TEEG:WWXK6:JsXETHkSA4DTE-VXCPTDSW>X7)R/e4W /C EFT9TEA/M\XK /LT"kX?TAmV5T/H}XMTD /AfX?VMEHqV5ED:R+XGM:BwVKX?TL=O.T?\H@ TD4E)T]XQ TMX;(RN4X EM&V5TEG/KXN/KTTS!X=`EI SAED:NX@1:-SR1XTTdT34?&XP-K>XG)J/ TE=4SEK/< V;TED/H:XNK/LT:dXDVK{TD/DLXM4WEJT /G'S=ED XGvTX? S\T/gTB4A/H&&]XXP"/F8TS(X)$gW4W EDSHT!EN:O0XOA:@`T#!SXX1&TJ/k{$QTA4B XLFEE-X1T#TUoTD L;  @4\  @SE-GT!E#/AKXMKT&!/6sSXVX/T7/JTXLV5-Z4WSPMEKLQN"L@QDTEB/HVFG/LT=dXK2K([T)T/AXP(TR2T9/?_XM`EI TMED:NHXU o:-M&DTMXGT TrM%TD4?&RXT!)-K$ & % TG # XM)JG/$ #4SEK/4WEJT /G'XGEDBT[ &:KTT/I:4A/H&&]z/F`$gW4W EDYHT!EN:O@X[1:@`T#H&?{$Q4B JEE-T#rTD  @4\  @QVYSQG:j-GJOTVE#/dA%0T&/6mKX19O :+0Nd29YeVA6Z/Jd%./E XUeXA8eT)6R"V:/)d T<:ENRe(d48 TE7_EG:WWXK6:JDeLJ7YXE5MTHF dSA:e4DT%5Q -VXCe1TDSW>X79b)R/@:%4W /C EFx9Z T96_TEA/MdDXK /LT"eNdX?8]6[J, TAed8+4V57_T/H}XMTD /AxeQ7]X?5UVMEHLd%V5ED:R+XGM:BwVKX?:UTy5P"T?%9):29(TD9E734E)T]XQe74d9H+TMeX;5_69(RN4X6#nEMds5+V58]TEG/KmeXN/KT<dUXA7W(VL(8edL7Xe.TB2]/GkXR/GO2PTPXA8_:77)T=7J9EHT?d1:CV-1eEG:Re8ZTXR::Ad1T XD8e'VRe(V*dT?7G5J4ATZ8XQ+T9 e5C$7O!TN XD0]/M/K'&EK4W /L &%& SH8UEB0M &!XKd-G&& SU1eX/0W  8T/= (     T38e4;T/E1d0S#T=/C/E XLe%dXE7W+N TP 4T EC 88e9E+V93jEJ:W7X=XO$:(xdXE:WT VD!3]WT@Ae:/!T=9]4BO+SXNdq9a~TR X?2]-Z4WJZ EVM^*$EK)Q2WV3:jTEB/H}/L XRT=dXD9O :+5VRbd29YeT=6ZT/A=dXRTSeX=8e6RREI(de(d48 SA7_ED:NX@1:-e~SR7YX5MTTLdT3:e4?%5Q\e%XP-K>XG9b)J/ TE6:4SEK/<9Z V;6_TED/Hd"XNK/LT:xeNdXD8]6[VK*ed8+4TD7_/DLXMX79b)RG/@:%4W /C EFx9Z T96_H!TEA/MdGC%XK /LT"eH59dX?8]6[TAed8+4V57_T/H}XMTD /AxeQ7]X?5UVMEHLd%V5ED:R+XGM:BwVKX?:UTy5P"T?%9):29(TD9E734E)T]XQe74d9H+TMeX;5_69(RN4X6#nEMdJ-B)5+V58]TEG/KmeXN/KT<dUXA7W(VL(8edL7Xe.TB2]/GkXR/GO2PTPXA8_:77)T=7J9EHT?d1:CV-1eEG:Re8ZTXR::Ad1T XD8e'VRe(V*dT?7G5J4ATZ8XQ+T9 e5C$7O!TN XD0]/M/K'&EK4W /L &%&'&(SH8UEB0M!XXKdSU2eX/0W# 8T/= (% & '&)$T38e4;T/EHd0S#T=/C/EXLe%dXE7W+N TP 4T EC 88e*V93jEJ:W7X=XO$:(xdXE:WT VD!3]WT@Ae:/!T=9]4BO+SXNdq9a~TR X?2]-Z4WK$EK)Q2WV3:jTEB/H}/L XRT=dXD9O :+5VRbd29YeT=6ZT/A=dXRTSeX=8e6RREI(de(d48 SA7_ED:NX@1:-e~SR7YX5MTTLdT3:e4?%5Q\e%XP-K>XG9b)JG/ TE6:4SEK/<9Z V;6_HTED/Hd"XNGA=/LT:-H%KeNdXD8]6[VK*ed8+4TD7_/DLXMVG)J/G4STEEK/< XZTED/HyVS /LT:d/D/FxTtT'EGmEE:R~:6YW4A)RXZGX](OT-Y` 4UEG7&T,EA/?x/C7k0T/B/ATcEITEH:O:T,:"44D(]XaTg QY7EZ&ZT/)>4WEJWOU V?SZ THT /G T.M!EDjTT/g4A/H&&]z/F`$gW4W EDT!EN:Oq:@`T#H&?{$Q4B JEE-T#rTD  @4\  @XdQkEkQm-GT!E#/A*  T&/67?/J/EpT)T<:EN4EG:W :Js4DTE-VmTDN)RG/e4W /C EFH!TEA/M7GCE/LT"H5WV_T/HTD /A[VV YWEHqXbED:RLYU,:B}XH YUTT?eVZ4E)TAY\8XZ(R0VE4X EM&TbTEG/KRXZ;/KTVG)JG/G4STEEK/< XZHTED/HHGA1VS /LT:-H%7/D/FxTtT'EGmEE:R~:6YW4A)RXZGX](OT-Y` 4UEG7&T,EA/?x/C7k0T/B/ATcEITEH:O:T,:"44D(]lEZ&ZT/)>4WEJT /G'ED:KTT/I:4A/H&&]z/F`$gW4W EDT!EN:Oq:@`T#H&?{$Q4B JEE-T#rTDbTH,  @4\  @XdQkEkQm:j-GJOTVE#/d*X/   T&/67C9O :+J&'d29Ye6Z/J Y?dV&/E% M&'e8eT) 6RE5d T< .ENRe(d48 7_EG:Ww:JDe7Y5M'sNd:e4DT%5Q -V<e1TD39b)R/@:%4W /C EFx9Z 6_TEA/Mdd/LT"eNd8]6[J,)eiQA/dWQ7.8+& V_7_T/H&%%TD/Aie&7] VV YW5U &%'EH&ML d%XbED:RLYU,:BuXH YU:UTy5P"T?%9):29(VZ9E734E)TAY\e74d9H:eXZ5_69(R0VE4X6#nEMds5+Tb8]TEG/KRXZe /KT<dU7WP8edL7Xe.VR2]/G%T9[/GO2P1TZ8_:77)T=7JVV5EHT?d1:C1eEG:Re8Zh::Ad1T 8e-M5ed2(V*dVR7G5J4ATZ8TT5T9 e5C$7O$ Tb0]/M/K'VU EK4W /L &%&'&(8UEB0M!ud@e0W/# 8T/= (% & '&)$VW8e4;T/EVG9b)J/@:4STEEK/<y9Z XZ6_TED/HdaVS /LT:xeNd8]6[+e*QNnd,QED8+ "7_/D %(/FM)e#.7]5UTtT'EGGd%EE:R~:6:Uy5PG9):29(YW9E734A)RXZ*e74d9H:eX]5_69(OG T-Y` 4UEG6#7&Td\5+8]HEA/?6G67e /CH% d77WP8edL7Xe.2]T/B/ATI2P18_:77)=7J,EI#d1:C1eTEH:Oe8Z T,:" d1T 8e/e@d7G5J4D(]F8Ee5C$7O$ EZ0]&ZT/)'4WEJ &' &T /G &'&(8UED0M!ud@e0WT# 8T&(T/" & '&)$8e4A/H&&]"d0S9 /F+e%d7W$g88e4W ED3jT!EN:O7X\:@`T#d:W3]e8a:/$Q9]4BvdJEE9a 2]KMQ4\4@  @2WXdQkEk:j-G9O :+d29Ye6Z=d1e8e6Rzde(d48 7_Qe7Y5Mhd4D:e%5Q -V<e9b)R@:%4W9Z 6_d|eNd8]6[+ed8+47_eQ7]5U[d%:Uy5PG9):29(9E734E)T\e74d9H:e5_69(RN4X6#vds5+8]me>dU7WP8edL7Xe.2]O2P18_:77)=7JOd1:C1ee8Z)d1T 8e/e(V*d7G5J4AZ8Ee5C$7O$/M 0]'&4W ' &%&'&(8U0M!ud@e0W# 8T&(% & '&)$8e4;Hd0S9/E6e%d7W+N4T 88e*3j7XYd:W.3]e:/!9]4BO+S'dq9a 2]-Z4WKMQ2W4?B-K>)JG4S94A)Rc(O74UI4D(]l&Z>4WB4A&&]Z$gW4WB&?{$Q4B w4\  @-GE-VTTTQ8X[Q@T@X@/xevil-2.02r2.orig/win32/res/TRANSMOG.WAV0100644000175000017500000016011406430260064016651 0ustar aaronlaaronlRIFFDWAVEfmt DXfactodata- k}ai}  NbW$Z*9 k+&#(h "'%|0\)H!Yصn(!fc xm(! 3֥ ] rX #' rTWgy%$*!P[j۬"ܐRD!)%BUrnvWߚ- !$*,-&-,>,+6)U#8 'WL+!!:1ޝG|8- f nZ#Y),.d..-o,8*&"k =,}rU~W%) +v)H%Mw   K * 35w"$&E'i'C'&&%$"gOW3ٲ.н k6Zמ޼~ wDy#LC}"mVi k(;>hdBl &?+-".q-,+*x*z*****b)'+%"a F"?r!#b%%{$! n"T  3nl ];ԡ}rۙ-&2ܭ0ٞi؈هڴ-~A9 ߾/!d m"#U$$ #K!\x  X'e!%'(-'$ h7l   !"#""! j  Yyq8׭չniL֎ tLq]FIߜ\ځ>WSe<"9{Fn.YK od #`')*+*s*)t)b)/)(r('&i% $"Q!  !"#8$k#)!M  .s]=UmJr4bؐگۿ_ݶ݁ݞb+&۶|[ݗݐއEQs  Tncy>]k  E ? ; < !}!:$%&$9# EZU{ wX>B RUR߸ڥفoٓڒ[+qs(oPC6ިܴۅ۫ޢ8yZi:)=E 7yZ2z  #%+''(''"'&&0&g%$-$Y#"!)! )!!)"2"! >G X}E&At}Gov ڸit[-RI?ݰC+(14 M!ZZl:hM +Z_()!"##"!#KPIZu7| NU:ޢ(*/5E߬ݢ*w(K5MnpF?== x &u P"#8$$$$e$:$$##"="!! L O n _ "\2dQJGS0Y 3+oQN݃]ߺ $YLsfo% J9) 3I-_zd1rZD +!;! p{,eDc|G>! {5hX-8$ /]x ߤS| .B)^F) 2%T $ + !w!!!!g!'! Q Oe_ 8vApHrZ';';|@&("*o6`kX3G;Gm _a ,tD@hn#x@;T>p1ow [ ^Q;yj*Zu-j1Tf~Gj%MO4Sx rN / g{Su.gHr7 M~K Y sE}0-+ p) ymKmI(/?B8RWT@)H;N sK  h~(#7%rj.4?{K<wR fDWBh@%Vf]vm>FHwBBwZ0f^ o 7sL Z{j\X?ZP,(/3 Ud}6)`!,F^Gku,,|4sA(/VmG n X:& V @ -RXw1G-5#lj5hrP( \zt _ ^4`X3Ty|^rnXp3dWV  I0W  .* ~s14Dc([6J  n}i@t@uMU gz' _P0 x>;:_˻gq7ρPn-umw[$*( # v6=u @b2B2&*& 8X ,AeB2F Y;W.:k5؎g  .!J?.įYDz3 [)wÄϾ=vs][WN 5|̵ʪ+͠xtӥדߍ/(^7>M>7~.$)x.")/2:ADDA|As<6;2/./~258b:396^0%ajި10 ϯŚ̹ե8'kh ^Ʊf׸nŨ̐ P"&܏ؙ_T͐Jȶ ϻҳԠ׎4 a#L- .5-;r>@FAAWBBB;BCA?7=R94K0C,([&%%r&'*]/4 9<(?>;165-$ $6L %22F{{a c_˻4{sֻ{pUwHɭ Svҩ^ݕfp XN #%<%F$""K{5%x ec xEU="*2X:?pCDC;A==d95M310]/e///90./.&-+)'%B$"<"! cLu܊Ԃ?ƶۖ%,?ȋˆBԩ؏x&zש9z4ʓ˟߰?)e9{b[Q tn"ai~ S2%-4:>@BBBBQA~@Q?=;963/d+'$D#* \ A"#$0#x" rU 9z#3N"^{R7'M1%֞Вnɶǩǩ!gs̔tόqfՏܒ D`m5JdN  #'&'(*'%",sOMw x A'K#&('t('X&#!AkXR & ipd<8ׯ4ҕԏ*!-HK;`D|ODYn!)W1YK AKk%Y7 OO q$&(&'&%K$p"z ; ` ~ { > 4%-/" \v;'>LPw q , p  "`]+ 9ah>%>TB'L GT^J B 1  ,e%^ < ~>5>_OZ`sgz|R7W K$O8dlE 5;Z}]wXr& v }}ߤ߬~"}a'l^Qx HIvSKq o ; D A  f .fC#/ V1Za s`B+ "K vS[ mp*|܇ޢ {kj+>cecjF |ak 8!!"(""##.$$%&=''f(( )~)))%)'k('^& $! ]}DMKzOPOLF;*uJ$6A  *`pW~q8W$P S  ;U9L'3 n ]y' X?z[Rocņ1<ߤ-T_#H ]!%A(v'#% DD 5` ,27[@DG6JIGuFC@W>6BDF_FEDB?:3*  1rq$aHPێء7ߝf߂tԡUakڷvj 0eC t  to,}{h3`e{iyoyXsCi %_+D/1231\/,S(#H4[P"v&(*)'$ 4yg; R=Ŀ4ğLYʶȶ+Ľ]ŀ؋,x$n]S 't2#'+-/]12O45;576W789: <<>>>=;n83:.("Pf}, 9ERgܯs}ٶՃӶ:| Ԥ$>]XV#+@-EU  ! u,R3 ( . & v z P vB[5N A8 [_f _ b:cj 4  H  ~x P#0%j&''K'&&`&+%$" rs;?? 7/xRVVk/K|g|K3oiTX8˳y!9NT C7.c I,v!v^!"$W'+.1H57;89h987'653q210/?/..?-,:*'Y%Q"y<Y K,? 1ס.EXm~|A3ߘ;`> zfN < J ! ( 1 ( E ~6o a Q o1hwg_6Q/Mq? R \` `^n5"E l W[kjh]GZ=- @gqKHccҸ948wܖ<.& 8 IO"&(+.02q3g45C5y555/54474P3210.,*?($!-: W \ { D_<Rs֩֍ֽ="!Հ$ثC!jnh:x q \ Y' @ K'%2W -4$ pRW ,atYB/( N   q0 /1tMP=M X+ #4^ f}WnG\]x!26`(r|uѠ0t=הՑ3ٍ"8R\Wu]P%*.135777827B64203/-,C,+&,-.0256876D410- (#I% ' Ge?;9a zݡӾɥAÎ\Žbpƿ}$4wsܛ^S&pE ~A`{D~D>Vs~P# !##"s!#HAR0S" F ;   s(Be-Hnq} e e  W[kIIDۀچL؈HBgۨ~]50e&Uj&J s@Z#%(*X++#,w,,(--//81T2345e666655453]1/+'#Cax urBim*0)oC5 'WӸvͲoDz!qΰ9Ӳ;0)!r)H~5cl* ,d2J y# &'g)*+,-...---,H,+v*)s)( ('^&%j#!KaFf  2G@J/MJ,=tfnNJ!3=Ms?"hw)Vb-A`6JVl2O P%m$[ <IO3+EYuq  wx #a ja8zj|;FޣܵTؤQ5]ԑT (lg1Qn\t  .*w !`"u"!_ 3icl^~q,c& / tk,2g`$J,&@YC4j7Iv!"=e-Z#? L P EcV.kR FKO_T5b:o@\@ ` >P@xV { M4M[V5CISOhV3I,\Bt/F&b-| 5 3  6Y f  l  9    <|qZp(9Jt =<>=Ki Z ? $ [! e 4 { #Va //ʈє-|5y`]s PǿeׅXz)"/-OF[["V)U(MF]DA-&2-74+Px B!3p=9K4k3)o$oxM:+ڢm #l df V -{VOzJRn  B 6Әι̟ݕ e e<=:y {Q: \1dC N#S+*.U00 0.,B*%% w  w ~}!$$$$e Kg"|*M _ Z(WψѡLϥ Gճgص1ևVЁnVFU0 . u|{!F mC!*2033F20/./0F2446e899::W::;8<;1964,,#5 'X [B#Y1d֊nW΍[Wֽq=b"ķ;ʿ)ۺ(j 7GP%s*#{(e-26827q3"..$)#c="&**.O122c1.*$* e3=2JܡF8Bآ[2HλFD T(\w4Cqz  !! !!"$$%&N(=)@*****U*O)&'?#0`W&Xbmq 2`Na}ݦS<QI+9W+R aL #i%&'''&u%#! } +""b"F!I9sm s[ V-j !bڻڳ#K Vv>BҒҤԖAQP #݆fVm7R ZZGg"&,1M5|78876I53s1i/-+)#(&%" !0vu { G_ՖXՌA;. $=Ι̖ˤ]`nrI7#O%Ii% qj &"+.?1235432210/.--...]/g.Z.-&,)%!, G lOO%Lli7ub ӯ>Ѳ&kxCӪ)ֱjTG_lWcC Y '_Bea"$4&&-'&r&&3%c$#O#"U"!!! RE Cp"`~4H%7o߂߮LN$`>=9j5\/(`!$()+(""4w[`S\yUQ̧Kqơre؎:,_漑> usfF(;NXPZTK_EWA?y?=O>#CJ9TGZXL9&QC hn1 HZ0ܚّ؁ؗ@x'ȸ&Y&"3g Z`+  Y)3_:==:;73.)[! k &G2 EuC w2xQYݛ`ִړe v . zD[g*vy׍+ dXnܵNӽՂ۹X\+7Y75!)06;=>o=h=^:62-**'j&&V(*T.//.+(%1#`!Td9 ۛղUұ !"dP޷݃Ee&hQi, \ #$%A&r&&%#!S?Q ^ ,;)f`J9.֌/GȗɻΑV) M޹ r6@| u! 0X j!"3$&g*.w388;̙ȽŘoŸiƹhʳ ιarazغt-xT ;5#&*-e02\45{6~6b66m6G66"77:9 :{:~:Q964/*$e  IVkk XѤDFBϝ۶$s} %h*Nc+)7Q y`YWo%ߞߊ-d0r_:tK  1y.RMB-c( ! \c= XEIb  "k:~@*uRtt N3{?5oX99~Bڢ)1Ex`xU#-U $%P& i7$,45P-2"BB#+25+4.%#'>2-6/#uo~IܰG>ѨǾLۼ*lÃɔ,WڰX^ܻ\eTKvRS_ c  '.409:<='=;9H50&*5#}u 3 $X8p%J4f+nH = c 93z~]>z/~}v uPWz+ D E ,Vd#K^ 4/ T K &Bh!LH]o>"` _ wo*(q E!##s#"!0 I@1]JbnECz;FՀMӂIϨ̑sĖT“#ʠVӿa Iq<>  %m*.(1246e8:< >,?@@@@@@>.=;9u50+;&1"4k@ Y mtQr=n՚l }ȆƄƥƬnbqʯ>6RӄևE޲6cg o e *7+7[ ]"#"" XX<D  ? &&V% ?/BmYwxEY  W G  " ~B `.t7+ah TbqiO&Ym:V>0S\i:f~a#ue{8vZ**D.4Q. nRe5*n<8 Z `^F!/3 Y^9݂DٮawӆLԍd ܶޜuWxo u6*hod 7!"$$m%&&&L&Z%#!Z\y  4  +J.u>'em68`!0m,z4'=y<Y.F_`6Ef^VNeS!Ik+d-R | / !'` !Q"Y"D"V!) 1 #eq`H ]dUI3XOv15 ue"ߏKBplLe# o oeDw3 :6  AYP'OK2K})F]4VT N V ;;6 E (SqnJ3C`) |Rhdv_T_ Yv[2g=s;+#5~-OI 5 ( 5  >hc E 8 /f  ! _ )z dc lh ) xm)[O]y֍IE]:ރfQhwlx  #$c#y!#h !!o!! Q!Y"r####!i >(N 9!wC h%*Xsڊهڿ[NR * q E#MO.c>3 . :ey5bQ_j0pKSb|tn^w&dl/ 2M gg W qnV|4"1 L-$[0 Iٸw#% [x߽ .*xWd,,sݼuz&(b! (ܢnr"k) 'ڛA++64(3:3*4/ AI>߱n1i+4>-t, 2=Nc  ## S'e VިTU7,%;[9@.}[ еݓp+=َٔHف B i,,t5j9:::97P1)l! 8h%&& yP ?`/b~aԶu<4q>1| 5!'%)'l#SN <y V$ : d \ Me-/FX 9]5."d@ʒΓ۠]Cm 48J8-0 !n-6,L48E:e97$5E1,&?!pp eM!D` 2 (fީC֤Ն֪ysZ'ڎܳۗ'9تK7H e| TGvgF@Ps(+{R % <P  [|-~0|}S}V:HBI ;:B3F@DQt ZLJV z6YJq ]R=]]i )ҵӟԝz֘Mڼ۸ܮT= 71"[ 9 ,  I$+,2677`6/5H4333 433210.,q)# $Y3I`dȘ9ȏS(H.bҎ.I]n9. X~h7!"H%')=*.*(_&)" `lyDT.c95+VT!R%KGd\Y >A$L'()'&$$#3".! J  T VxTDo]܎Z9E̓v(QPB⩹/zH#zoJ׸)}IWöo }),g'P^B4X7V83((w+P BFcWLZ?}?GH7?#6+:/-Yպ]8oD`{ί5rQk2mP({G%|њѩ׼ۤ:qu`8$j/o1+ y".2`/.)2%#c$#>M7 `FSyŗ†Sέjfχҁ$4t:2z(iZC"R0=7D@363*!0$(}+-,*&i*,Nc!ͫѢ,ŽζƾlB #lֶ_ƽV ɒխg$')++r+W,*&G$'%)N/Z2D/%n Ul E'/32A-"#I$Q! w 0P do_z ;Ao . v֜͜U˂O' Q7` n Im  %60*55a44q32,1C.$+8)())R& -6i4=ؾ̼´ÓʭT %ʿϒ ۃ 5!j!`,!,K6`;:)60,+#.145642,#zNm0b _פ,GWS3`ѾoVA; P@5Md- [U> ! J a~{$/!!@^! k y; ,$fs! p]j {j*Sw݉ۆcg"Ҭηe۸z9V $3-{7?HIaF?71Y,(&}$#L$%C(n)R($HHsLU?9x#ӭ#GE̞ ڐ@c~? m )n/\1.(%PM#'*,P+&WkHH{$]TyklYEu,p >,r=aR 4x:R*pP 6x>$H S> C 8" N%V ?  ( :E {78Ю־1"5c+P gfo#,06?PEHqHEA=9953I210.+_&$ L@ 1bPV ߠABR "/^f#ܘ;n\>"&((}((L'q'=())*,*))W'R$ l#m [<{~ w  x%q^UAU<~D.>4)zT,  F0 Zf'1"q6Xd@EknP 06XlpJ z J xx0!4#$%%E%$$$#"y!3>C'OShZZ+Dz3u9;' AK65[J T7DJ2N\9RQ4%CnFTXYU [&Y&@ ?D4~=v+ [TFR]gt Nu\dE?7A=L-BO2 9  {]"$#&&& &$#!t;M v>;w.1kݨ7"߃ eo ?kb ! H 56b1_.Q 8 Ip n!FHt 6]3*Q/ H <} j!;u$ T S o)9|gJ9 ag$1{/o L \ t > h j  H B`yRJvYB+Xp-y Y1a l s_C$~k2(y U E6b%w S h X q13Z_. I B JNuXxkx@qߨ3P2w 7 w  $fT[  1 Z[ 3_8j<  - c V K BZ]3{_ iO*^2n 2)rhq@  I gW]F3'KEG'K9U}f`N F= Zqx_ U{y$rE3 e% # *8 >Z1~3::2 _*-v+i*s; NM˼1Eg Ҹ׸ ],A+G24 :,J44G#ON E+ +K*N1+8/ޫDӇ͑مGhOJCs; j wG ^ C_} )V!F%%&#tLi+چfڌ~8 r` ڴ9  r #hl' ,'`!<"K!G&',/(/.-\/ 1F1?."fhz 9_)!ߤ-ANҘԸ wQ&=--//./,&yI'/ /.%- ; H !VȻƼ}m ̃  Sf& 25G63.@,,/23^403v&!TC@!x  X+ח92ڿ ʓ r"{XVĈC6I,2QK2ITzG,E 8h!7JG9**hgG()g Q2lwklį]ҏhJ ]%,Z5->}DDv:P4,%4$'.9G!SYWNC7_+ 1 qIg=ũb|&.ј1XQJ !*34/&K] N:z3",079_6f1^-,+/!59:70'/'$H `lBOăȕ yJ%,T,$h:{VJ Sޢ(g~,/F)Py"0D}8xWH k W D ")%T#oMP($-+%[\E%(\ѰVƻaˍ?!BV)rn BA)%/7>BD EC@;>;W609*:"  */OŊ“Gr˟ DZĶ rĤ3s! O= -&{-5=CF#F9C=6/'"T# H|^ ӊfшũ?~ɲɴca,- ['-!123211p258D<@KCEuFD?Ax;Z483N-(>%##"" 3cx $Ơ̲TtڱpfĕܤN8<O8u $X/)9AGLrPORdS&TTTTSQ?OJIC^<94F,$, )\- Wەc،͉Z:Լyɬ!*mz 6$)+-y,3)$ -!*% )o+,<*$)S >trOn ܺ;ePSY{?s m s F ( XG  ja z5l^sJQA#f dw MhWki(,; yp eFzrDNWku.4  2 T S 6"X [ ) i>S M҉>ޅ҂ۭM >] I WQ!z$Q),-)[%"P"!aLYd&-/+M*Z$xE? D07) Y%>xFf؍ߝP, [S)Y]!j$M$&)G**Q**1-x1 7<;>o?=93*,"\j  i&/ЭȗÞ¹Ɔ̖-mNcX[ n>"#%'T(d*,{.. ,'p$"!"w!/#$$W"BSQ ܹl׫و GІТҮy4`YK 58, qv"$o(),T/1 1.'*6$ n Nkf^] XՍoҤFأ|WuHa  Zg'JT ."% % ,%"nB'3(~gTQ6!B @Rqvl!>G Kx`[v &z  ($qQF=! QB;1 kf.Y 9}`mh ?]R x 7ck  @xXs\9TkRte7fS_-4I Ma8 z/Ox|^َx5س ]ߦpb(m& = J*N T *6@E{GFjDA >9340-q,<,e+()R#]Ng{Zfܳ`ݻv[N߳K   Z#%z(,/49Z?2AB*A=965^5C5@41*%t K&] лECҫ҂&]"J hO'H ";$]%#":!D 2!@"!<  m@@c0#\ 165U ?_C2  0.BO&f*+dFV5hzz#t '9$?Kq4/  k:1#iv.ڟ xhnu-!dbYjm +!!"1 Z $sGA]E8_F0b1QmKlk7u/ .^XW&P_. UD }:]< N)Da'p24E x W' -x>E9L `  R}4lY/VHC>NA !Edx W Z9$EE(L/HD 3:[6ޣi6N"v,ӛD{K  %G*-55M0n1S;; ~>{`yqU!(#m#O$$H%%%%$y#!2[S =: 'qܬFBm/; l,6V!!"wY!!; c L Q?b>SHr?}T*1i d:)CX IR'+ 2 ` : F w 2  )m6X344Q;}'v09{/T x2a-X+" f O   W (UK emj'H]P AFXt 6 k' h=etQ`\vT!#klFGGWqA?]An< v?[of+Z ky6!#Q'())(A%'" S5/s 3 # 5DM,sڸޥwwmR" fHbL\Uc> .\02\#3E80h OGf8oFky x!6pE+\QGD . u`DGV-[8{rk)/ [o&Jkײӻ܄H$$q 6P,٣s + رǩB9uxɈŦڎt*7p*RU* .#+)N s }#}6D F7'u :cT< )漚xɋfx#껰Zd0UGv.a?YJP~SROLHBL;95R/) 'b%$%#( 07q=>;6-%/ g wToл:| xkrvaQ{x.3 %.5897c3-'Gw ueLzQBL*~ $@ ^GE%oH-% d E,I5 % .4J8984/x( BV4<7ގ‰3}ڰ>`n2$H+01/ .+*+/]4);BPINRU?USeR>PFMHBA%8 - RZ՞ЬʙrPϴϰΗ˹^'3) ݑXׄ''"K.7O?DGPIIJJLGMLYKH2E@!<8$6v4\210~.#*;#PfHq/ݛ[%;oʯ/@%oՅXܠެݻ9!d }$*.13320;-)0$v* z AHXH ,7u6_pC|Ttb`f \. mm",$['vBG   $1=OR!a 1 !:"!7sO,I1:Ҋb~‚Q߮;h a !w#,6&0:1BsP:i -kk/ J\2 c7e0FWh߄Zםp|)Objzoi&U~ yZ &*G,,('x&p'a*/5<AB@.=;r:85 2-)%="i wuf2=7"GRù½U-ھosR|  !!!";$'+/36i852-T(>$""!!! O; u>E ]^v`HpV?r6GDSA} x !'#$f-6P+2(,$y g d-u29 XD5 ?x hIeBh,'y*.Id;8 _ 'WyCmKtQ&=RDf+dtN. Q%" -6<@'AS@=&:-6?2H0y0259=?)>7.#Cs} ] z\D̳ùGϮaNڷ289֪Pؐ~SթԎcB" $-2?^ o"$'z*,,:-d->.,,+_++ +!*('%"]C_,unR8w{Zxۯ{i Sb*'I :M u  M"GR`h(`aO nK =  >u,K_`b K wUi*n @R6HK <3 c^ G f V  Y V O!rOk bm  Na{9R.Hn>tw:o YTxy'Uq[6}j: Qr.8Xc`Z 0yC+f,z~'"ߎ=lAhthD ESr-!Y0 / xOk`KtxtG {y oi;0Q6 j N z  N fJ } *.^9Sff\37VEv 1 @irbr,? l7ZN;3@]Xfqw 0r J^mhFv`FGN/0 C=F$:! j4 e QJzU#Eމݥ. vUZF &,1 A 7mCG2/2'! 5-I.L ^ '*C( I0̯*EٗZD 8 u܇C).:;;92'a?& "2::B45&t"!$:).2,42/,)'*+-s-U) TM5%0۽E99)P\1>)Y&֔ r}I 8,^78W86v41-r("_ql $;!&<'$tn mP _ "~" ,= '4_8P|;ٍZ  t n^53&h۠x ;"gx!$'.+6.024"66 76t2,$_>z=: ޹Y(&(Ev؀GX D$D&'''%0#% # [:] &S1^U(U\i)~bZ $ ntN yEDO !3#5$%&(l(j'$7   ( [ pإZbOST =S%'(((l&n$A"Bg ^!`!I 0OUZDR VP ݮްdgcu"s m  x hd& #K*!!'gS < >J.N/ofO_crnHhnpnj 6:9K> (5& K#TBJ=(lewX%8*HNhC( "w()&hnX1q4+# _` Ouȹuտ 3UfHwB}\6_+)=J'SVmXYYXfXVS,K>.) 3 ZT7 _ ɾ~,E4_ (ǹ1xԹƑ֕  + ] 5, /!)13=FNyTWNVSNIC0?:q7421L11$2b/01B22}2721/-+%:F cH4c|ʧS=:Ô!χC=ݦ߱Y|ߎ܃34P{  $&'&E%"|o Q xW [ $"-).C231-(G#)6 * {80(.w#65Vf kT'05 8874'1,*% iT3Km|ܬ'XH)D0wJ܊Rq1M i [2  ;P 1 W#2:F;j3<'yd (u1\6;750%=$4BBHJaL$NNK9/'C# (ңlpϊO)՛]ҿZQ4>ȧ˴͘KUc- iX mQ &@-&4:>@@? <<2<=?w@?Q<*7L1"+" ! F#p IQ| ֗ӇV-Kץߌ lg! Qln9E?CH>"hq׵Շ֨نE6 -:3S\*lx"'*--/-A+>)'', /134M4631(112a7 ;>fAwCDVC@f<5u,!KMUlؤ91HͰ1iȩƐƌʜ*ָk2ʆ =S ȫ?Zo^`5MX)0\H "E$*G/2d32P0-+*Z*,-$-,*(($U!T| d z"" ULD S82jhr5/. ҘԞ֔إڷ܍3})eg2q aj"$%%#I!'0 %qlks)Y' jYhU "# % '(&** /H//D.+($/_ 5r(l ۏة՜ 7^պDsŜ˔kхҒd2בڷ kp t8%"+&1u6;@|EIK]OlO@OkNAMIL KI.H-FDA|? =:7,4@0*,8'F"_3E ~arڜөiBصێ{2ܼFU"ڴڹ<_I03r l)} A h m k D j PZ@W>aPc. F rUev !#%&(`*-/~023431.*T&!! 7IxnsIsڇvާ\SZ"^rրV΁ږ֡)ɰ?.ܝӽ[iS3|i(/+]%e/#G+=374P.R&%h%-2q3.$x>@| 3 hB" , %Z3Hy%-M۞PEeAØ (( ,ɎEfQ Nfin !<#$"&j(*,/ 234555K43r1/(,\(<#}|W]f+^0 ,>~;#'~x` k `;!2 B\ bM,  I t\4kݧc; f?qۿ]<* mPֳ֭ٚu; w]J!! o)3*06KAFF2@HA<7AqA_=4+-0y(g1%aC1 Ss@*!z k'ǩĕfՃ֏Wݩ۞Rߡ}D; J+  G 7Kn#'R(s'&&*%# hG ""!(jk[ R"& z V | V9ku9cHZL d(fr1 BkK(&L<>H~m>I ` CTvi> = 3 u Y { I) G ' p ]mg 2]h V B t # ; ! - Le݉"O$^բӟ1eҋ6'k (o (4!H^Ph3< S"tqoM ! y  +O 7[0S*I- w$Rtv8$54?cI-0o5[ {}U{R6S< c<Lk#'E*=-C//0u/--,,@----,*}(X&$") `\ :P`>]D9uҦͼT)ǂ51(υJ9TrB0(D= ^;*&!t4tc   x  7)hs)U6]MVPi]XQb2Y~=H jY&WXOKh/R9M&FR  .Eix za;o7\f$kwA Q m +obmz6{N wh;]ʃQɘ˂΀װڝSTj $|,),'t,6,73 2-37=>W7x4:=Y93/W. .0/*!- ( z\gSVeu`ؓz *xt8u yAY,K ? <(fS5C& 3A 4   TWTa'<;|5i gDK'HW-w׏>a€ɢ<7܆ "QٴWk ( [G awZ,*/ ~A'>I}?"e Y4@GJ KE:**kYs0R)7A@CD/B9 ! (< ~ٺ93݁L@~[4ٻC]+yE%s- "$S% %$$j$>$ q3)a WR *1Y2d .bCY6p&!#%&&s%"8  ffEmP-RSw y + ֨Ց֪8O -"$F&U(**.+*(&%6%}$_$$%=$ gbZ݀؋ӯ5iF|8v" !"C܍K> Z)u# 92B"[*0o5; <;:863/@,'"| 5 V ~  x 3 '$Jݐ{r;X$yGH6HEO3NJTj7X)o;+/I!U>; '= =""l" !  vw^ s9 z#$$P$" yze h@.j`a HCiА2ӥ2`@FC`K@.jaY"0:OJ { "!6&(&+,,[+*&)'[&$"Z!.YNav "$%A''%,kRp g%\2D5p/w'MOa:zfeʼ-ͥМ3ճEزr؅ ۞)~SS { h3)6 %gp"['F,04F8$==q=r<:8!7 53}2`1/}.>-+h*('%#!@N_ Oi(ֆk՝tNC޼B2 g{y҉>ܥ|o ߕ/ފ[ޒޖ"$a1& 8#'*-/13l4566555`5Y5\5\5'6)79u:;<_;9W73.4*v%P o Q ;u n&<^:i͐ɛ8QT¼qƒC30Q!8EܛvBo C|e[/ s8!#%(C)),7+(((~%B"$5#d <^?Ewpk P^hNRߓ܌[\ڻيNGؙ.< 02!nzV2i` "-S% #$H:O=*;+1a24,O&0c$%16 # $* < b(*=݉k5}ӝn2v"ύ8ٙq+.YLH1  } :I !#!(*.2K576 4.'P!QDZUD|!#Z%%$!Ov &y+lAB rM$% 7M9:v~;;M۟6~\Jui7 @ U 7! / $}[uqNZh7 H#%i(*)*(%"BE Up3 ( \H bv3,v*Gu";j0P)(g?082[X v"'/N1l2322Q2e1/-^+f)'&'`'((('%" /' +a]s VJ9ݯ܆Kۉ3ۧۼے5^mCd -H# !!E"8"!! ,7wKa6 5 i 5 ! h  F4zh4nt;F ~ %RNeSn3u;Ge/W8@H # 8`VX:CG3Q I~B+@i*Wi#_T&(ߛފހ~dWKq tWJP;lf#{1  u1!#&'((v)x**H+j+(+*V)('&b%#" p"7s Z  u M|J*؝גa4.% rbԞUӀԴ~ز;![RZ& #v<}!#`&)1+E-e/2222920.,*-'r$zTyY bYrKVa 0۲3ݝ6yOnjPj i.}cODo  f M  2w8eU  t = TUZ L , ?  . S ,z-O!<,C nJX;h"\-<0%-V Ty  9c #$%:&&&&I'b')'L' '2' '&F&%#"+!l 9Wy"_~oݙ ?ΦݤPoK׺ZqWݞք߁Iz;sw ` pb&p5H!5"%|&%2 = 6 O G ( 0"$* l SHN 9l7pyrytsgCp\1|T  P0tPQ >z( HP@Br0 .@+-aU `(co-y<,ԫEr;b=<ѹо2#rXEs|kju l9&V%*/35<6v5442e0/.~..\.'.C-+)"'#gqd_ O AdwAC߸>ޭ$ߠ i/8- J7gdF<" k^>OZ M!=$%j&g&%~$K#!r~zE^F p I F}"tpoVm2~B6?(PߣPGyXnp?qSYUF  >  y oLYQ?oz 9+im1U!{ # ? Y i 1  R5Nsp,5P5L|_kvc>B{h z j D a(oX!# &'_){*+*)&R%'# ``   sX+zmpA&(zO I<(*6 3 _Xr W dn/{\[)u084m^Im o~ pE4X l/;S 2 CN NP>&%!WGLv,,~^jIT: 1{19MczRH"># (7OUm![OH = i s,*"BW> k" c/eDk; LE> fhUP]g[K,L* Y *LOml=&n`e P fQii!2U6`'#y_U3r' * > . 2%  b gw= ;h }  W (F f r]8    K5 < + p % *  a0@)r H/UC+ ;89B,stsV|?A 4SwHYhd / 4= qbh .  CSFKh-1Q V -$7M ALV1Jhdqd NVj8U)v[uF .%B^ # H o z X x W e @s/ _ : '  Eaa{Hav}[lYc]W+jQk6gDq] nMTE~uy4#Mg L #^G1Cs/7 Q  Qo*jQ _wuBq.9B3<CL03e Kn { S \ } = ~ 8 T RQE7Y#Q\p4E>h{(s3A^i"vXnL&YGZb[%S{sBXH q. H"\y1`2m kD G .  Ht/.K(HpZNhrC J ?r) ^s}] Gk3RL  t . uf g :| +evh 0[f(0Ba+[o f `Fq} 'G\ irMm3@ G /MP.=2!n_}n7N'~|u6 O hYn\u8 EekW3,V!yhg_JK?rm;e7 l. p ?qqH{ 8x$  Bj% \P)qZ; 6H\,_Ea -RQ&/ 4 M+0&yt\i GN2+e M&r$Dcj1 UXM};Ig[IDT8rla{}BhQ* HWj D s "  y "1 p  ={~n 6&r[,%? / C D|AET\=x(i8gB*4@U=-P6%mK8*Hw4Z=NR \ x=^\-Q8>$N3pQc o8SQ0  j)F    Y`_qw2 Vexn ARH56.2 h}g_5H B T;+ X?IPp''  $m~6 ErI^6F>+f$[xYAQXZdLKqV&vy.  6 'n05iy<[ucg: {0f%bOl^Q (Z)0=yqT[B*KG2N!O . J T7: [SY / X 'sqX}wO_:<@VgR`P#(tAH$ kf& .iBc8k7n@ } : RK_/d c>KF -  /-wB +#[4AxN}jXg=`o<%Y% {tQWeb[, Vx3 ]  VoZ\?)|^ h1YI#yG"a y7&^k5"D ;;q>hL.J3M^p=E !>RR  yl  mLTp%IsxC9tP6c JbDn:8"}W ^v0v[Z ' [B{~p6Ag2OJ<=?iK9~PK^ep ~ !\Iarr\<2A ;Z m6File created by GoldWave. GoldWave copyright (C) Chris Craigxevil-2.02r2.orig/win32/res/TRAPOPEN.BMP0100644000175000017500000000547606605103364016644 0ustar aaronlaaronlBM> 6(<hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xevil-2.02r2.orig/win32/res/TROLL0.BMP0100644000175000017500000000662606624340372016371 0ustar aaronlaaronlBM 6(02` hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|||||~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,````|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~```|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~|~,,,,,,,,,,,,,,,,,,,,,,~~,,,|`~|~,,,,,,,,,,,,,,,,,,,,,d``d|~|``dd~,,,,,,,,,,,,,,,,,,,,|```ddd``|~`````|,,,,,,,,,,,,,,,,,,,~d```|~d`dd`d|,,,,,,,,,,,,,,,,,,|d~|`d|`~~~,,,,,,,,,,,,,,,,,,,,d``~|`,,,,,,,,,,,,,,,,,,,,,,d|``~d|~~||,,,,,,,,,,,,,,,,,,,,,,,|d`~`d~,,,,,,,,,,,,,,,,,,,,,,,,|~,~`d~~,,,,,,,,,,,,,,,,,,,,,,,,,,|`~~``,,,,,,,,,,,,,,,,,,,,,,,,,,~`~d``|||d~,,,,,,,,,,,,,,,,,,,,,|``````~``~,,,,,,,,,,,,,,,,~d``|~|~|`||,dd|,,,,,,,,,,,```````d~~d|d```d~,,,,,,,,~`````|~`````|ddd````|,,,,,,``````d~~````~~|`d````ddd~,,,,,~d```````d~~d``|~||~`~``|~||```,,,,,,|d``````````~~d~d``~d```~,,,,,,,,~d````````d|d``||`~|,d``~~~,,,,,,,,,,~d````````````|,,,d`,,,,,,,,,,,,~d````````d,,,,,,,,,,,,,,,,,,~d`````|,,,,,,,,,,,,,,,,,,,,,~````d꽽,,,,,,,,,,,,,,,,,,,,,,,,,,````꽽,,,,,,,,,,,,,,,,,,,,,,,|d```d뽽,,,,,,,,,,,,,,,,,,,,,,|```````||~,,,,,,,,,,,,,,,,~d``````````|~d,,,,,,,,,,,,,,,,~d``````````````~~|~,,,,,,,,,,,,,,,,,,~d``````````````````d,,,,,,,,,,,,,,,,,,,~|dd`````dd````dqq,,,,,,,,,,,,,,,,,,,|```~````~qqq,,,,,,,,,,,,,,,,,,,,,,,~```|````qq~,,,,,,,,,,,,,,,,,,,,,,,,,d``|d|~~,,,,,,,,,,,,,,,,,,,,,,,,d```d~~~d~~|,,,,,,,,,,,,,,,,,,,,,,,,|``````````||~,,,,,,,,,,,,,,,,,,,,,,,|````````ddd`dd||d,,,,,,,,,,,,,,,,,,,,,,|````d```dd```~,,,,,,,,,,,,,,,,,,,,,~````d|``~~`|,,,,,,,,,,,,,,,,,,,,,~~~~`d,,~,,,,,,,,,,,,,,,,,,,,,,,|~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/TROLL0B.BMP0100644000175000017500000000662606624374470016501 0ustar aaronlaaronlBM 6(02` hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,||d||dd,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~`````|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~|d`~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,d`d~뽽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,````d|~,,,,,,,,,,,,,,,,,,,,,,,,,,~````````d|~,,,,,,,,,,,,,,,,,,,,,,,,~|`````````dd|,,,,,,,,,,,,,,,,,,,,,,,,d````````d,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,d``````d~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~d||dd|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~|```d~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~``````d~```,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~````````````||,,,,,,,,,,,,,,,,,,,,,,,,,,,,d``d~~|||~d|,,,,,,,,,,,,,,,,,,,,,,,,,,,,```~||,,,,,,,,,,,,,,,,,,,,,,,,,,,|```~,,,,,,,,,,,,,,,,,,,,,,,,,,|```~|~,,,,,,,,,,,,,,,,,,,,,,,,,,d```~d|||,,,,,,,,,,,,,,,,,,,,,,,,,,|```~~dd,,,,,,,,,,,,,,,,,,,,,,,,,,~```|`d`~,,,,,,,,,,,,,,,,,,,,,,,,,,,,d`|d``d~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~`|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~`~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,d|`|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,d```|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~````潽,,,,,,,,,,,,,,,,,,,,,,,,~````d,,,,,,,,,,,,,,,,~d``````~~,,,,,,,,,,,,,,,,~|d```````````d~dd,,,,,,,,,,,,,,,,|```````````````~~|dd,,,,,,,,,,,,,,,,,,|d``````````````d```~,,,,,,,,,,,,,,,,,,,뽘~~|```````````dq,,,,,,,,,,,,,,,,,,,,|```d````d,,,,,,,,,,,,,,,,,,,,,,,,,|````````~,,,,,,,,,,,,,,,,,,,,,,,,,```d`d|d`,,,,,,,,,,,,,,,,,,,,,,,,,d````|`~~,,,,,,,,,,,,,,,,,,,,,,,,|````````````~d~,,,,,,,,,,,,,,,,,,,,,,,|````````|~d``d|d|,,,,,,,,,,,,,,,,,,,,,,,|```|~d```~d``,,,,,,,,,,,,,,,,,,,,,,~``d|``d~d,,,,,,,,,,,,,,,,,,,,,~~~|`,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/TROLL0C.BMP0100644000175000017500000000662606624374470016502 0ustar aaronlaaronlBM 6(02` hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~``d``d,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,d````|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~````|,,,,,,,,,,,,,,,,,,,,,,,,,,,d`|,,,,,,,,,,,,,,,,,,,,,,~|~,,,|``~|~,,,,,,,,,,,,,,,,,,,,,d```d|~```dd~,,,,,,,,,,,,,,,,,,,,~d```````|~|```d~,,,,,,,,,,,,,,,,,,,,|`````d|d````d~d~,,,,,,,,,,,,,,,,,,,~ddd`|~````d,,,,,,,,,,,,,,,,,,,,|``d|~|,,,,,,,,,,,,,,,,,,,,,,~`|`,~dd|,,,,,,,,,,,,,,,,,,,,``,,~d````d,,,,,,,,,,,,,,,,,,,~,,,~`|````d~~,,,,,,,,,,,,,,,,,,,,,|`|``d|d``d~,,,,,,,,,,,,,,,,,,,,,d`~`d~```````d~,,,,,,,,,,,,,,,,,|`|`|``````````d~,,,,,,,,,,,,,,~~`~|```````d|d``````|,,,,,,,,,,,|``~|d~```````~``````,,,,,,,,,,,d```d`~``````d~```|d,,,,,,,,,,d`````~`|`d|``d,,,``~,,,,,,,,,,d``````~|ddd`~,,,|,,,,,,,,,,,``````ddd~```~,,,,,,,,,,,,,,,~d````||`d||`d~~|,,,,,,,,,,,,,,,,,,~d`````~|~,,,,,,,,,,,,,,,,,,,,,,,|````|,,,,,,,,,,,,,,,,,,,,,,,,~```|~~,,,,,,,,,,,,,,,,,,,,,,,,,,,d````d,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|````~뽽,,,,,,,,,,,,,,,,,,,,,,,,,,,d````,,,,,,,,,,,,,,,,,,,,,,,,d`````dd~,,,,,,,,,,,,,,,,,~``````````~~d~,,,,,,,,,,,,,,,,~|d```````````d~d|,,,,,,,,,,,,,,,,,~|dd```````````ddd`d,,,,,,,,,,,,,,,,,,,~|````dd`````dq,,,,,,,,,,,,,,,,,,,,,~```~````dq,,,,,,,,,,,,,,,,,,,,,,,,```d````,,,,,,,,,,,,,,,,,,,,,,,,d``d|~~d|,,,,,,,,,,,,,,,,,,,,,,,,|````~d`~|,,,,,,,,,,,,,,,,,,,,,,,,~```````````d|||,,,,,,,,,,,,,,,,,,,,,,,~````````ddd``|~d~,,,,,,,,,,,,,,,,,,,,,,,|```d~~``d~|d~,,,,,,,,,,,,,,,,,,,,,,~````|d`|,,,,,,,,,,,,,,,,,,,,~dd`d||`,,,,,,,,,,,,,,,,,,,,,,,,,,,d,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/WOOB.WAV0100644000175000017500000001257406430214712016172 0ustar aaronlaaronlRIFFtWAVEfmt +"Vfact dataD K -?I+<`@, YoFܫA0 F1z5#m;c9JIBK5fLD?qſP%Sg3Z=:S X"1O* zP$͉O&Q zܸ+5T9B 3(h"(7HA52CNA r)){nsSz,}p N&F'%iq0ߐW<ђ=8w'>mߺ֒.7#w@XfE5C+ZV(N=;~seR`rEE3*QQ"*!" Ljڥɗr-]w˙~2$<ǹou|GKM4ݤ{1[ܣMI ! } m&9)h#<$~HblrzA{{+T<6$$"UwsԣŒ> W ڦЉCBt6S\Ly8qO[ZYC1CzJZLiXZ[ed `H9,&/4OROB8( L0էKIVHȟ [BFrC6&`O+*8x9* zA -EGF1@/( '&f:,&(r5:;/0%#0-Xn W 1  sn u0>1z5pB*tʚAKԟa}X_ړզ@3c̀+9,-8SPC K ;2 :c$*F)iK-GDP)<+%{,h+: <(q^$C]_KDש'n+ uy y{ @G {%Z}S% ^Ѥخ^ġ Pu" E]i X`  .3  0 :$lS'3:2"2Y5/)%$g%-)i9#8*77P9jBB+EEB+?v/@. 47]>I][erbPxm+dY\YkSmHi[NFKLNE~3T1:6 2%J 7! Hru?ùFW.)F34߅/LK.6 ¿͔wF, uB7 X<" %Z%  ##%?(-P0'z4 F1USF2"Z V(Xyv2&  +{6;.## $&++$.=6A IHE4KKC6u+!h] ЬcȪ!׆'|AMP> q Eq RF1 BvS.=R\vY$] +vZ 3{{ oxX5[|8UO*} f.zo#P<-E W$Sb $%*)Y# Fj)  ngP'tmR'*g`m;Ba[vA+(! #)5(- GSt'$; S9XF> zk6$259"<">'_1bb#tv_0 t|.EV+tY"}%7&t"y f{U{ jdXJ!:)u,tg  TA t6 :`? gI ?9M $: YeO wz 3p@X 6&L<ded;Bo Z F^OB 6Qn4J>XH o \U_C% ` G.p*3?KId.]xIRe4%rz?B/{/3j5btM`1)G^xot o )" $|9;PU!-VmLOM " U 4}h7#yI sYGV*p.Y+Tw{T|lcxu5W'(i4c%g "#, C5E;eKEe!WZ 2Z(tt`[WwjppTy)K/? ^662zk{4&I{ (d\bYGBEEyG>HG>ZA95n*v}*u"~Hw)wG[cCOP7Ns 2BpnZT1iy]N>`Q.pc4b:cQ;sGlWlZtlnI 5-[L2_#3QaK2W98kB9(3Y2)BWG%(QY%`I)!GtxQ9dBjX2>>>>r>>>>>>>>>>r>>>>>CCC>>CCr>CC>>CCCC>>>CCrCnn>>CCC>>CCCCr>>>CCCC>>>>CCCrn>>CCCCnnnrnnnnrnnnrCnnnrnnnrnnnnCrnnrnnnnrnnrCnnnrnnnnnnrCrnrrrnnrrCnnrrrnnrrnnrCrrrrrrrrr>>>>>>>>>>r>>>>>>>>>rCnn>>CCCCC>>CCrCnnC>CC>CCCCCrn>>CCCCC>>CCCCrnC>>CC>CCCCCCCƽ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~潽~~~~~~~~潽~~~~~~~~潽~~~~~~~~潽~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xevil-2.02r2.orig/win32/res/WS_FTP.LOG0100644000175000017500000022164406430260102016444 0ustar aaronlaaronl96.12.31 13:48 B D:\xevil20e\win32\res\XEvil.ico --> shellx.best.com /webx/web2/hardts/public_html/xevil XEvil.ico 97.03.26 00:13 B C:\xevil20h\win32\res\xevilpal.bmp --> super-grover /games xevilpal.bmp 97.04.02 12:00 B C:\xevil20h\win32\res\alien0.bmp --> super-grover /xevil/win32/res alien0.bmp 97.04.02 12:00 B C:\xevil20h\win32\res\alien0_m.bmp --> super-grover /xevil/win32/res alien0_m.bmp 97.04.02 12:00 B C:\xevil20h\win32\res\alien0b.bmp --> super-grover /xevil/win32/res alien0b.bmp 97.04.02 12:00 B C:\xevil20h\win32\res\alien0b1.bmp --> super-grover /xevil/win32/res alien0b1.bmp 97.04.02 12:00 B C:\xevil20h\win32\res\alien0b_.bmp --> super-grover /xevil/win32/res alien0b_.bmp 97.04.02 12:00 B C:\xevil20h\win32\res\alien10.bmp --> super-grover /xevil/win32/res alien10.bmp 97.04.02 12:00 B C:\xevil20h\win32\res\alien10_.bmp --> super-grover /xevil/win32/res alien10_.bmp 97.04.02 12:00 B C:\xevil20h\win32\res\alien10b.bmp --> super-grover /xevil/win32/res alien10b.bmp 97.04.02 12:00 B C:\xevil20h\win32\res\alien11.bmp --> super-grover /xevil/win32/res alien11.bmp 97.04.02 12:00 B C:\xevil20h\win32\res\alien11_.bmp --> super-grover /xevil/win32/res alien11_.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien11b.bmp --> super-grover /xevil/win32/res alien11b.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien12.bmp --> super-grover /xevil/win32/res alien12.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien13_.bmp --> super-grover /xevil/win32/res alien13_.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien13b.bmp --> super-grover /xevil/win32/res alien13b.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien14.bmp --> super-grover /xevil/win32/res alien14.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien14_.bmp --> super-grover /xevil/win32/res alien14_.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien14b.bmp --> super-grover /xevil/win32/res alien14b.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien15.bmp --> super-grover /xevil/win32/res alien15.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien16.bmp --> super-grover /xevil/win32/res alien16.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien16_.bmp --> super-grover /xevil/win32/res alien16_.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien16b.bmp --> super-grover /xevil/win32/res alien16b.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien17.bmp --> super-grover /xevil/win32/res alien17.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien17_.bmp --> super-grover /xevil/win32/res alien17_.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien17b.bmp --> super-grover /xevil/win32/res alien17b.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien18.bmp --> super-grover /xevil/win32/res alien18.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien18_.bmp --> super-grover /xevil/win32/res alien18_.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien18b.bmp --> super-grover /xevil/win32/res alien18b.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien19.bmp --> super-grover /xevil/win32/res alien19.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien1_m.bmp --> super-grover /xevil/win32/res alien1_m.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien1b1.bmp --> super-grover /xevil/win32/res alien1b1.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien1b_.bmp --> super-grover /xevil/win32/res alien1b_.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien2.bmp --> super-grover /xevil/win32/res alien2.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien2_m.bmp --> super-grover /xevil/win32/res alien2_m.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien3.bmp --> super-grover /xevil/win32/res alien3.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien3_m.bmp --> super-grover /xevil/win32/res alien3_m.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien4.bmp --> super-grover /xevil/win32/res alien4.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien4_m.bmp --> super-grover /xevil/win32/res alien4_m.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien5.bmp --> super-grover /xevil/win32/res alien5.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien5_m.bmp --> super-grover /xevil/win32/res alien5_m.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien7.bmp --> super-grover /xevil/win32/res alien7.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien7_m.bmp --> super-grover /xevil/win32/res alien7_m.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien7b_.bmp --> super-grover /xevil/win32/res alien7b_.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien8.bmp --> super-grover /xevil/win32/res alien8.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien8_m.bmp --> super-grover /xevil/win32/res alien8_m.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien8b_.bmp --> super-grover /xevil/win32/res alien8b_.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\alien9.bmp --> super-grover /xevil/win32/res alien9.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\aliendea.bmp --> super-grover /xevil/win32/res aliendea.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\altar0_m.bmp --> super-grover /xevil/win32/res altar0_m.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\altar1.bmp --> super-grover /xevil/win32/res altar1.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\altar1_m.bmp --> super-grover /xevil/win32/res altar1_m.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\altar_of.bmp --> super-grover /xevil/win32/res altar_of.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\arrow.cur --> super-grover /xevil/win32/res arrow.cur 97.04.02 12:01 B C:\xevil20h\win32\res\bang.wav --> super-grover /xevil/win32/res bang.wav 97.04.02 12:01 B C:\xevil20h\win32\res\bangbang.wav --> super-grover /xevil/win32/res bangbang.wav 97.04.02 12:01 B C:\xevil20h\win32\res\bceagle.bmp --> super-grover /xevil/win32/res bceagle.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\beat_dog.bmp --> super-grover /xevil/win32/res beat_dog.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bitmap1.bmp --> super-grover /xevil/win32/res bitmap1.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood12.bmp --> super-grover /xevil/win32/res blood12.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood13.bmp --> super-grover /xevil/win32/res blood13.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood15.bmp --> super-grover /xevil/win32/res blood15.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood25.bmp --> super-grover /xevil/win32/res blood25.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood26.bmp --> super-grover /xevil/win32/res blood26.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood27.bmp --> super-grover /xevil/win32/res blood27.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood28.bmp --> super-grover /xevil/win32/res blood28.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood29.bmp --> super-grover /xevil/win32/res blood29.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood30.bmp --> super-grover /xevil/win32/res blood30.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood31.bmp --> super-grover /xevil/win32/res blood31.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood32.bmp --> super-grover /xevil/win32/res blood32.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood33.bmp --> super-grover /xevil/win32/res blood33.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood34.bmp --> super-grover /xevil/win32/res blood34.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood35.bmp --> super-grover /xevil/win32/res blood35.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood36.bmp --> super-grover /xevil/win32/res blood36.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood37.bmp --> super-grover /xevil/win32/res blood37.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood38.bmp --> super-grover /xevil/win32/res blood38.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood40.bmp --> super-grover /xevil/win32/res blood40.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood6.bmp --> super-grover /xevil/win32/res blood6.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\blood9.bmp --> super-grover /xevil/win32/res blood9.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg12.bmp --> super-grover /xevil/win32/res bloodg12.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg15.bmp --> super-grover /xevil/win32/res bloodg15.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg25.bmp --> super-grover /xevil/win32/res bloodg25.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg26.bmp --> super-grover /xevil/win32/res bloodg26.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg27.bmp --> super-grover /xevil/win32/res bloodg27.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg28.bmp --> super-grover /xevil/win32/res bloodg28.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg29.bmp --> super-grover /xevil/win32/res bloodg29.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg30.bmp --> super-grover /xevil/win32/res bloodg30.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg31.bmp --> super-grover /xevil/win32/res bloodg31.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg32.bmp --> super-grover /xevil/win32/res bloodg32.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg33.bmp --> super-grover /xevil/win32/res bloodg33.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg34.bmp --> super-grover /xevil/win32/res bloodg34.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg35.bmp --> super-grover /xevil/win32/res bloodg35.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg36.bmp --> super-grover /xevil/win32/res bloodg36.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg37.bmp --> super-grover /xevil/win32/res bloodg37.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg38.bmp --> super-grover /xevil/win32/res bloodg38.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg39.bmp --> super-grover /xevil/win32/res bloodg39.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg4.bmp --> super-grover /xevil/win32/res bloodg4.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg40.bmp --> super-grover /xevil/win32/res bloodg40.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg6.bmp --> super-grover /xevil/win32/res bloodg6.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bloodg9.bmp --> super-grover /xevil/win32/res bloodg9.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00001.bmp --> super-grover /xevil/win32/res bmp00001.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00002.bmp --> super-grover /xevil/win32/res bmp00002.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00003.bmp --> super-grover /xevil/win32/res bmp00003.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00004.bmp --> super-grover /xevil/win32/res bmp00004.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00005.bmp --> super-grover /xevil/win32/res bmp00005.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00006.bmp --> super-grover /xevil/win32/res bmp00006.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00007.bmp --> super-grover /xevil/win32/res bmp00007.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00008.bmp --> super-grover /xevil/win32/res bmp00008.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00009.bmp --> super-grover /xevil/win32/res bmp00009.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00010.bmp --> super-grover /xevil/win32/res bmp00010.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00011.bmp --> super-grover /xevil/win32/res bmp00011.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00012.bmp --> super-grover /xevil/win32/res bmp00012.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00013.bmp --> super-grover /xevil/win32/res bmp00013.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00014.bmp --> super-grover /xevil/win32/res bmp00014.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00015.bmp --> super-grover /xevil/win32/res bmp00015.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00016.bmp --> super-grover /xevil/win32/res bmp00016.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00017.bmp --> super-grover /xevil/win32/res bmp00017.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00018.bmp --> super-grover /xevil/win32/res bmp00018.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00019.bmp --> super-grover /xevil/win32/res bmp00019.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00020.bmp --> super-grover /xevil/win32/res bmp00020.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00021.bmp --> super-grover /xevil/win32/res bmp00021.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00022.bmp --> super-grover /xevil/win32/res bmp00022.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00023.bmp --> super-grover /xevil/win32/res bmp00023.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00024.bmp --> super-grover /xevil/win32/res bmp00024.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00025.bmp --> super-grover /xevil/win32/res bmp00025.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00026.bmp --> super-grover /xevil/win32/res bmp00026.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00027.bmp --> super-grover /xevil/win32/res bmp00027.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00028.bmp --> super-grover /xevil/win32/res bmp00028.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00029.bmp --> super-grover /xevil/win32/res bmp00029.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00030.bmp --> super-grover /xevil/win32/res bmp00030.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00031.bmp --> super-grover /xevil/win32/res bmp00031.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00032.bmp --> super-grover /xevil/win32/res bmp00032.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00033.bmp --> super-grover /xevil/win32/res bmp00033.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00034.bmp --> super-grover /xevil/win32/res bmp00034.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00035.bmp --> super-grover /xevil/win32/res bmp00035.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00036.bmp --> super-grover /xevil/win32/res bmp00036.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00037.bmp --> super-grover /xevil/win32/res bmp00037.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00038.bmp --> super-grover /xevil/win32/res bmp00038.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00039.bmp --> super-grover /xevil/win32/res bmp00039.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00040.bmp --> super-grover /xevil/win32/res bmp00040.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00041.bmp --> super-grover /xevil/win32/res bmp00041.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00042.bmp --> super-grover /xevil/win32/res bmp00042.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00043.bmp --> super-grover /xevil/win32/res bmp00043.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00044.bmp --> super-grover /xevil/win32/res bmp00044.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00045.bmp --> super-grover /xevil/win32/res bmp00045.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00046.bmp --> super-grover /xevil/win32/res bmp00046.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00047.bmp --> super-grover /xevil/win32/res bmp00047.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00048.bmp --> super-grover /xevil/win32/res bmp00048.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00049.bmp --> super-grover /xevil/win32/res bmp00049.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00050.bmp --> super-grover /xevil/win32/res bmp00050.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00051.bmp --> super-grover /xevil/win32/res bmp00051.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00052.bmp --> super-grover /xevil/win32/res bmp00052.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00053.bmp --> super-grover /xevil/win32/res bmp00053.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00054.bmp --> super-grover /xevil/win32/res bmp00054.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00055.bmp --> super-grover /xevil/win32/res bmp00055.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00056.bmp --> super-grover /xevil/win32/res bmp00056.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00057.bmp --> super-grover /xevil/win32/res bmp00057.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00058.bmp --> super-grover /xevil/win32/res bmp00058.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00059.bmp --> super-grover /xevil/win32/res bmp00059.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00060.bmp --> super-grover /xevil/win32/res bmp00060.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00061.bmp --> super-grover /xevil/win32/res bmp00061.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00062.bmp --> super-grover /xevil/win32/res bmp00062.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00063.bmp --> super-grover /xevil/win32/res bmp00063.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00064.bmp --> super-grover /xevil/win32/res bmp00064.bmp 97.04.02 12:01 B C:\xevil20h\win32\res\bmp00065.bmp --> super-grover /xevil/win32/res bmp00065.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00066.bmp --> super-grover /xevil/win32/res bmp00066.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00067.bmp --> super-grover /xevil/win32/res bmp00067.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00068.bmp --> super-grover /xevil/win32/res bmp00068.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00069.bmp --> super-grover /xevil/win32/res bmp00069.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00070.bmp --> super-grover /xevil/win32/res bmp00070.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00071.bmp --> super-grover /xevil/win32/res bmp00071.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00072.bmp --> super-grover /xevil/win32/res bmp00072.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00073.bmp --> super-grover /xevil/win32/res bmp00073.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00074.bmp --> super-grover /xevil/win32/res bmp00074.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00075.bmp --> super-grover /xevil/win32/res bmp00075.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00076.bmp --> super-grover /xevil/win32/res bmp00076.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00077.bmp --> super-grover /xevil/win32/res bmp00077.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00078.bmp --> super-grover /xevil/win32/res bmp00078.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00079.bmp --> super-grover /xevil/win32/res bmp00079.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00080.bmp --> super-grover /xevil/win32/res bmp00080.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00081.bmp --> super-grover /xevil/win32/res bmp00081.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00082.bmp --> super-grover /xevil/win32/res bmp00082.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00083.bmp --> super-grover /xevil/win32/res bmp00083.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00084.bmp --> super-grover /xevil/win32/res bmp00084.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00085.bmp --> super-grover /xevil/win32/res bmp00085.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00086.bmp --> super-grover /xevil/win32/res bmp00086.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00087.bmp --> super-grover /xevil/win32/res bmp00087.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00088.bmp --> super-grover /xevil/win32/res bmp00088.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00089.bmp --> super-grover /xevil/win32/res bmp00089.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00090.bmp --> super-grover /xevil/win32/res bmp00090.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00091.bmp --> super-grover /xevil/win32/res bmp00091.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00092.bmp --> super-grover /xevil/win32/res bmp00092.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00093.bmp --> super-grover /xevil/win32/res bmp00093.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00094.bmp --> super-grover /xevil/win32/res bmp00094.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00095.bmp --> super-grover /xevil/win32/res bmp00095.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00096.bmp --> super-grover /xevil/win32/res bmp00096.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00097.bmp --> super-grover /xevil/win32/res bmp00097.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00098.bmp --> super-grover /xevil/win32/res bmp00098.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00099.bmp --> super-grover /xevil/win32/res bmp00099.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00100.bmp --> super-grover /xevil/win32/res bmp00100.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00101.bmp --> super-grover /xevil/win32/res bmp00101.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00102.bmp --> super-grover /xevil/win32/res bmp00102.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00103.bmp --> super-grover /xevil/win32/res bmp00103.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00104.bmp --> super-grover /xevil/win32/res bmp00104.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00105.bmp --> super-grover /xevil/win32/res bmp00105.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00106.bmp --> super-grover /xevil/win32/res bmp00106.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00107.bmp --> super-grover /xevil/win32/res bmp00107.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00108.bmp --> super-grover /xevil/win32/res bmp00108.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00109.bmp --> super-grover /xevil/win32/res bmp00109.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00110.bmp --> super-grover /xevil/win32/res bmp00110.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00111.bmp --> super-grover /xevil/win32/res bmp00111.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00112.bmp --> super-grover /xevil/win32/res bmp00112.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00113.bmp --> super-grover /xevil/win32/res bmp00113.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00114.bmp --> super-grover /xevil/win32/res bmp00114.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00115.bmp --> super-grover /xevil/win32/res bmp00115.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00116.bmp --> super-grover /xevil/win32/res bmp00116.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00117.bmp --> super-grover /xevil/win32/res bmp00117.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00118.bmp --> super-grover /xevil/win32/res bmp00118.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00119.bmp --> super-grover /xevil/win32/res bmp00119.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00120.bmp --> super-grover /xevil/win32/res bmp00120.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00121.bmp --> super-grover /xevil/win32/res bmp00121.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00122.bmp --> super-grover /xevil/win32/res bmp00122.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00123.bmp --> super-grover /xevil/win32/res bmp00123.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00124.bmp --> super-grover /xevil/win32/res bmp00124.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00125.bmp --> super-grover /xevil/win32/res bmp00125.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00126.bmp --> super-grover /xevil/win32/res bmp00126.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00127.bmp --> super-grover /xevil/win32/res bmp00127.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00128.bmp --> super-grover /xevil/win32/res bmp00128.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00129.bmp --> super-grover /xevil/win32/res bmp00129.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00130.bmp --> super-grover /xevil/win32/res bmp00130.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00131.bmp --> super-grover /xevil/win32/res bmp00131.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00132.bmp --> super-grover /xevil/win32/res bmp00132.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00133.bmp --> super-grover /xevil/win32/res bmp00133.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00134.bmp --> super-grover /xevil/win32/res bmp00134.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00135.bmp --> super-grover /xevil/win32/res bmp00135.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00136.bmp --> super-grover /xevil/win32/res bmp00136.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00137.bmp --> super-grover /xevil/win32/res bmp00137.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00138.bmp --> super-grover /xevil/win32/res bmp00138.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00139.bmp --> super-grover /xevil/win32/res bmp00139.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00140.bmp --> super-grover /xevil/win32/res bmp00140.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00141.bmp --> super-grover /xevil/win32/res bmp00141.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00142.bmp --> super-grover /xevil/win32/res bmp00142.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00143.bmp --> super-grover /xevil/win32/res bmp00143.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00144.bmp --> super-grover /xevil/win32/res bmp00144.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00145.bmp --> super-grover /xevil/win32/res bmp00145.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00146.bmp --> super-grover /xevil/win32/res bmp00146.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00147.bmp --> super-grover /xevil/win32/res bmp00147.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00148.bmp --> super-grover /xevil/win32/res bmp00148.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00149.bmp --> super-grover /xevil/win32/res bmp00149.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00150.bmp --> super-grover /xevil/win32/res bmp00150.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00151.bmp --> super-grover /xevil/win32/res bmp00151.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00152.bmp --> super-grover /xevil/win32/res bmp00152.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00153.bmp --> super-grover /xevil/win32/res bmp00153.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00154.bmp --> super-grover /xevil/win32/res bmp00154.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00155.bmp --> super-grover /xevil/win32/res bmp00155.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00156.bmp --> super-grover /xevil/win32/res bmp00156.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00157.bmp --> super-grover /xevil/win32/res bmp00157.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00158.bmp --> super-grover /xevil/win32/res bmp00158.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00159.bmp --> super-grover /xevil/win32/res bmp00159.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00160.bmp --> super-grover /xevil/win32/res bmp00160.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00161.bmp --> super-grover /xevil/win32/res bmp00161.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00162.bmp --> super-grover /xevil/win32/res bmp00162.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00163.bmp --> super-grover /xevil/win32/res bmp00163.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00164.bmp --> super-grover /xevil/win32/res bmp00164.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00165.bmp --> super-grover /xevil/win32/res bmp00165.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00166.bmp --> super-grover /xevil/win32/res bmp00166.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00167.bmp --> super-grover /xevil/win32/res bmp00167.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00168.bmp --> super-grover /xevil/win32/res bmp00168.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00169.bmp --> super-grover /xevil/win32/res bmp00169.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00170.bmp --> super-grover /xevil/win32/res bmp00170.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00171.bmp --> super-grover /xevil/win32/res bmp00171.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00172.bmp --> super-grover /xevil/win32/res bmp00172.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00173.bmp --> super-grover /xevil/win32/res bmp00173.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00174.bmp --> super-grover /xevil/win32/res bmp00174.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00175.bmp --> super-grover /xevil/win32/res bmp00175.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00176.bmp --> super-grover /xevil/win32/res bmp00176.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00177.bmp --> super-grover /xevil/win32/res bmp00177.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00178.bmp --> super-grover /xevil/win32/res bmp00178.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00179.bmp --> super-grover /xevil/win32/res bmp00179.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00180.bmp --> super-grover /xevil/win32/res bmp00180.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00181.bmp --> super-grover /xevil/win32/res bmp00181.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00182.bmp --> super-grover /xevil/win32/res bmp00182.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00183.bmp --> super-grover /xevil/win32/res bmp00183.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00184.bmp --> super-grover /xevil/win32/res bmp00184.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00185.bmp --> super-grover /xevil/win32/res bmp00185.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00186.bmp --> super-grover /xevil/win32/res bmp00186.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00187.bmp --> super-grover /xevil/win32/res bmp00187.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00188.bmp --> super-grover /xevil/win32/res bmp00188.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00189.bmp --> super-grover /xevil/win32/res bmp00189.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00190.bmp --> super-grover /xevil/win32/res bmp00190.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00191.bmp --> super-grover /xevil/win32/res bmp00191.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00192.bmp --> super-grover /xevil/win32/res bmp00192.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00193.bmp --> super-grover /xevil/win32/res bmp00193.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00194.bmp --> super-grover /xevil/win32/res bmp00194.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00195.bmp --> super-grover /xevil/win32/res bmp00195.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00196.bmp --> super-grover /xevil/win32/res bmp00196.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00197.bmp --> super-grover /xevil/win32/res bmp00197.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00198.bmp --> super-grover /xevil/win32/res bmp00198.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00199.bmp --> super-grover /xevil/win32/res bmp00199.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00200.bmp --> super-grover /xevil/win32/res bmp00200.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00201.bmp --> super-grover /xevil/win32/res bmp00201.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00202.bmp --> super-grover /xevil/win32/res bmp00202.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00203.bmp --> super-grover /xevil/win32/res bmp00203.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00204.bmp --> super-grover /xevil/win32/res bmp00204.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00205.bmp --> super-grover /xevil/win32/res bmp00205.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00206.bmp --> super-grover /xevil/win32/res bmp00206.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00207.bmp --> super-grover /xevil/win32/res bmp00207.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00208.bmp --> super-grover /xevil/win32/res bmp00208.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00209.bmp --> super-grover /xevil/win32/res bmp00209.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00210.bmp --> super-grover /xevil/win32/res bmp00210.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00211.bmp --> super-grover /xevil/win32/res bmp00211.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00212.bmp --> super-grover /xevil/win32/res bmp00212.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00213.bmp --> super-grover /xevil/win32/res bmp00213.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00214.bmp --> super-grover /xevil/win32/res bmp00214.bmp 97.04.02 12:02 B C:\xevil20h\win32\res\bmp00215.bmp --> super-grover /xevil/win32/res bmp00215.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bmp00216.bmp --> super-grover /xevil/win32/res bmp00216.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb0.bmp --> super-grover /xevil/win32/res bomb0.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb0_ma.bmp --> super-grover /xevil/win32/res bomb0_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb1.bmp --> super-grover /xevil/win32/res bomb1.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb1_ma.bmp --> super-grover /xevil/win32/res bomb1_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb1b_m.bmp --> super-grover /xevil/win32/res bomb1b_m.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb2.bmp --> super-grover /xevil/win32/res bomb2.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb2_ma.bmp --> super-grover /xevil/win32/res bomb2_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb2b_m.bmp --> super-grover /xevil/win32/res bomb2b_m.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb3.bmp --> super-grover /xevil/win32/res bomb3.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb3_ma.bmp --> super-grover /xevil/win32/res bomb3_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb3b_m.bmp --> super-grover /xevil/win32/res bomb3b_m.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb4.bmp --> super-grover /xevil/win32/res bomb4.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb4_ma.bmp --> super-grover /xevil/win32/res bomb4_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb4b_m.bmp --> super-grover /xevil/win32/res bomb4b_m.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb5.bmp --> super-grover /xevil/win32/res bomb5.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb5_ma.bmp --> super-grover /xevil/win32/res bomb5_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb5b_m.bmp --> super-grover /xevil/win32/res bomb5b_m.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb6.bmp --> super-grover /xevil/win32/res bomb6.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\bomb6_ma.bmp --> super-grover /xevil/win32/res bomb6_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\breakdwn.wav --> super-grover /xevil/win32/res breakdwn.wav 97.04.02 12:03 B C:\xevil20h\win32\res\cat.bmp --> super-grover /xevil/win32/res cat.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\chainsaw.bmp --> super-grover /xevil/win32/res chainsaw.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\chainsw.wav --> super-grover /xevil/win32/res chainsw.wav 97.04.02 12:03 B C:\xevil20h\win32\res\chopperb.bmp --> super-grover /xevil/win32/res chopperb.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\chpdeath.wav --> super-grover /xevil/win32/res chpdeath.wav 97.04.02 12:03 B C:\xevil20h\win32\res\cloak.bmp --> super-grover /xevil/win32/res cloak.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\cloak.wav --> super-grover /xevil/win32/res cloak.wav 97.04.02 12:03 B C:\xevil20h\win32\res\cloak1.bmp --> super-grover /xevil/win32/res cloak1.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\cloak_ma.bmp --> super-grover /xevil/win32/res cloak_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\death.wav --> super-grover /xevil/win32/res death.wav 97.04.02 12:03 B C:\xevil20h\win32\res\dog0.bmp --> super-grover /xevil/win32/res dog0.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog0_att.bmp --> super-grover /xevil/win32/res dog0_att.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog0b.bmp --> super-grover /xevil/win32/res dog0b.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog1.bmp --> super-grover /xevil/win32/res dog1.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog10.bmp --> super-grover /xevil/win32/res dog10.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog10_at.bmp --> super-grover /xevil/win32/res dog10_at.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog10b.bmp --> super-grover /xevil/win32/res dog10b.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog11.bmp --> super-grover /xevil/win32/res dog11.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog11_at.bmp --> super-grover /xevil/win32/res dog11_at.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog11b.bmp --> super-grover /xevil/win32/res dog11b.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog18.bmp --> super-grover /xevil/win32/res dog18.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog1_att.bmp --> super-grover /xevil/win32/res dog1_att.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog1b.bmp --> super-grover /xevil/win32/res dog1b.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog2.bmp --> super-grover /xevil/win32/res dog2.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog20.bmp --> super-grover /xevil/win32/res dog20.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog20b.bmp --> super-grover /xevil/win32/res dog20b.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog21_at.bmp --> super-grover /xevil/win32/res dog21_at.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog22_at.bmp --> super-grover /xevil/win32/res dog22_at.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog2_att.bmp --> super-grover /xevil/win32/res dog2_att.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog3.bmp --> super-grover /xevil/win32/res dog3.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog3_att.bmp --> super-grover /xevil/win32/res dog3_att.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog4.bmp --> super-grover /xevil/win32/res dog4.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog5.bmp --> super-grover /xevil/win32/res dog5.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog9.bmp --> super-grover /xevil/win32/res dog9.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog_21.bmp --> super-grover /xevil/win32/res dog_21.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dog_dead.bmp --> super-grover /xevil/win32/res dog_dead.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dogatt.wav --> super-grover /xevil/win32/res dogatt.wav 97.04.02 12:03 B C:\xevil20h\win32\res\dogdeath.wav --> super-grover /xevil/win32/res dogdeath.wav 97.04.02 12:03 B C:\xevil20h\win32\res\door12.bmp --> super-grover /xevil/win32/res door12.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\door2.bmp --> super-grover /xevil/win32/res door2.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\door22.bmp --> super-grover /xevil/win32/res door22.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\doppel.bmp --> super-grover /xevil/win32/res doppel.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\doppel.wav --> super-grover /xevil/win32/res doppel.wav 97.04.02 12:03 B C:\xevil20h\win32\res\doppel1.bmp --> super-grover /xevil/win32/res doppel1.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\doppel_m.bmp --> super-grover /xevil/win32/res doppel_m.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\drop_sch.bmp --> super-grover /xevil/win32/res drop_sch.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\drugs.bmp --> super-grover /xevil/win32/res drugs.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\dwhistle.bmp --> super-grover /xevil/win32/res dwhistle.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\egg.bmp --> super-grover /xevil/win32/res egg.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\egg_mask.bmp --> super-grover /xevil/win32/res egg_mask.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\egg_open.bmp --> super-grover /xevil/win32/res egg_open.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\empty.bmp --> super-grover /xevil/win32/res empty.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\empty1.bmp --> super-grover /xevil/win32/res empty1.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\enforcer.bmp --> super-grover /xevil/win32/res enforcer.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\explosion.wav --> super-grover /xevil/win32/res explosion.wav 97.04.02 12:03 B C:\xevil20h\win32\res\fireball.wav --> super-grover /xevil/win32/res fireball.wav 97.04.02 12:03 B C:\xevil20h\win32\res\firedead.bmp --> super-grover /xevil/win32/res firedead.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\firedemo.bmp --> super-grover /xevil/win32/res firedemo.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\fist.bmp --> super-grover /xevil/win32/res fist.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\flag.bmp --> super-grover /xevil/win32/res flag.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\flag_mas.bmp --> super-grover /xevil/win32/res flag_mas.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\flame_ma.bmp --> super-grover /xevil/win32/res flame_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\flamethr.bmp --> super-grover /xevil/win32/res flamethr.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frog.wav --> super-grover /xevil/win32/res frog.wav 97.04.02 12:03 B C:\xevil20h\win32\res\frog0.bmp --> super-grover /xevil/win32/res frog0.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frog0_ma.bmp --> super-grover /xevil/win32/res frog0_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frog1.bmp --> super-grover /xevil/win32/res frog1.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frog1_ma.bmp --> super-grover /xevil/win32/res frog1_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frog2.bmp --> super-grover /xevil/win32/res frog2.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frog2_ma.bmp --> super-grover /xevil/win32/res frog2_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frog3.bmp --> super-grover /xevil/win32/res frog3.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frog3_ma.bmp --> super-grover /xevil/win32/res frog3_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frog4.bmp --> super-grover /xevil/win32/res frog4.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frog4_ma.bmp --> super-grover /xevil/win32/res frog4_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frog5.bmp --> super-grover /xevil/win32/res frog5.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frog5_ma.bmp --> super-grover /xevil/win32/res frog5_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frog_dea.bmp --> super-grover /xevil/win32/res frog_dea.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frog_she.bmp --> super-grover /xevil/win32/res frog_she.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\frogdeth.wav --> super-grover /xevil/win32/res frogdeth.wav 97.04.02 12:03 B C:\xevil20h\win32\res\froggun.bmp --> super-grover /xevil/win32/res froggun.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\froggun.wav --> super-grover /xevil/win32/res froggun.wav 97.04.02 12:03 B C:\xevil20h\win32\res\froggun1.bmp --> super-grover /xevil/win32/res froggun1.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\grass.bmp --> super-grover /xevil/win32/res grass.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\grenade1.bmp --> super-grover /xevil/win32/res grenade1.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\grenade2.bmp --> super-grover /xevil/win32/res grenade2.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\grenade3.bmp --> super-grover /xevil/win32/res grenade3.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\grenade4.bmp --> super-grover /xevil/win32/res grenade4.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\grenades.bmp --> super-grover /xevil/win32/res grenades.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\happy.bmp --> super-grover /xevil/win32/res happy.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero0.bmp --> super-grover /xevil/win32/res hero0.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero0_at.bmp --> super-grover /xevil/win32/res hero0_at.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero0_ma.bmp --> super-grover /xevil/win32/res hero0_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero0b.bmp --> super-grover /xevil/win32/res hero0b.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero0b_m.bmp --> super-grover /xevil/win32/res hero0b_m.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero0c.bmp --> super-grover /xevil/win32/res hero0c.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero0c_m.bmp --> super-grover /xevil/win32/res hero0c_m.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero1.bmp --> super-grover /xevil/win32/res hero1.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero10.bmp --> super-grover /xevil/win32/res hero10.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero10_a.bmp --> super-grover /xevil/win32/res hero10_a.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero10_m.bmp --> super-grover /xevil/win32/res hero10_m.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero10b.bmp --> super-grover /xevil/win32/res hero10b.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero10b_.bmp --> super-grover /xevil/win32/res hero10b_.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero11.bmp --> super-grover /xevil/win32/res hero11.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero11_a.bmp --> super-grover /xevil/win32/res hero11_a.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero11_m.bmp --> super-grover /xevil/win32/res hero11_m.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero11b.bmp --> super-grover /xevil/win32/res hero11b.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero11b_.bmp --> super-grover /xevil/win32/res hero11b_.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero18.bmp --> super-grover /xevil/win32/res hero18.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero18_m.bmp --> super-grover /xevil/win32/res hero18_m.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero1_at.bmp --> super-grover /xevil/win32/res hero1_at.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero1_ma.bmp --> super-grover /xevil/win32/res hero1_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero1b.bmp --> super-grover /xevil/win32/res hero1b.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero1b_m.bmp --> super-grover /xevil/win32/res hero1b_m.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero1c.bmp --> super-grover /xevil/win32/res hero1c.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero1c_m.bmp --> super-grover /xevil/win32/res hero1c_m.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero2.bmp --> super-grover /xevil/win32/res hero2.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero20.bmp --> super-grover /xevil/win32/res hero20.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero20_m.bmp --> super-grover /xevil/win32/res hero20_m.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero20b.bmp --> super-grover /xevil/win32/res hero20b.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero20b_.bmp --> super-grover /xevil/win32/res hero20b_.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero21_a.bmp --> super-grover /xevil/win32/res hero21_a.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero22_a.bmp --> super-grover /xevil/win32/res hero22_a.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero2_at.bmp --> super-grover /xevil/win32/res hero2_at.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero2_ma.bmp --> super-grover /xevil/win32/res hero2_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero3.bmp --> super-grover /xevil/win32/res hero3.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero3_at.bmp --> super-grover /xevil/win32/res hero3_at.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero3_ma.bmp --> super-grover /xevil/win32/res hero3_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero4.bmp --> super-grover /xevil/win32/res hero4.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero4_ma.bmp --> super-grover /xevil/win32/res hero4_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero5.bmp --> super-grover /xevil/win32/res hero5.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero5_ma.bmp --> super-grover /xevil/win32/res hero5_ma.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero6.bmp --> super-grover /xevil/win32/res hero6.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hero_dea.bmp --> super-grover /xevil/win32/res hero_dea.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\heroatt.wav --> super-grover /xevil/win32/res heroatt.wav 97.04.02 12:03 B C:\xevil20h\win32\res\home_mas.bmp --> super-grover /xevil/win32/res home_mas.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hugger0.bmp --> super-grover /xevil/win32/res hugger0.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hugger0_.bmp --> super-grover /xevil/win32/res hugger0_.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hugger0b.bmp --> super-grover /xevil/win32/res hugger0b.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hugger1.bmp --> super-grover /xevil/win32/res hugger1.bmp 97.04.02 12:03 B C:\xevil20h\win32\res\hugger12.bmp --> super-grover /xevil/win32/res hugger12.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger15.bmp --> super-grover /xevil/win32/res hugger15.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger16.bmp --> super-grover /xevil/win32/res hugger16.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger17.bmp --> super-grover /xevil/win32/res hugger17.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger1_.bmp --> super-grover /xevil/win32/res hugger1_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger1b.bmp --> super-grover /xevil/win32/res hugger1b.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger2.bmp --> super-grover /xevil/win32/res hugger2.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger2_.bmp --> super-grover /xevil/win32/res hugger2_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger3.bmp --> super-grover /xevil/win32/res hugger3.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger3_.bmp --> super-grover /xevil/win32/res hugger3_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger4.bmp --> super-grover /xevil/win32/res hugger4.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger4_.bmp --> super-grover /xevil/win32/res hugger4_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger4b.bmp --> super-grover /xevil/win32/res hugger4b.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger5.bmp --> super-grover /xevil/win32/res hugger5.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger5_.bmp --> super-grover /xevil/win32/res hugger5_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger6.bmp --> super-grover /xevil/win32/res hugger6.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger6_.bmp --> super-grover /xevil/win32/res hugger6_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger6b.bmp --> super-grover /xevil/win32/res hugger6b.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger_d.bmp --> super-grover /xevil/win32/res hugger_d.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\hugger_r.bmp --> super-grover /xevil/win32/res hugger_r.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ico00001.ico --> super-grover /xevil/win32/res ico00001.ico 97.04.02 12:04 B C:\xevil20h\win32\res\idr_xevi.ico --> super-grover /xevil/win32/res idr_xevi.ico 97.04.02 12:04 B C:\xevil20h\win32\res\ladder1.bmp --> super-grover /xevil/win32/res ladder1.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\lance_ho.bmp --> super-grover /xevil/win32/res lance_ho.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\lance_ve.bmp --> super-grover /xevil/win32/res lance_ve.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\lancer.bmp --> super-grover /xevil/win32/res lancer.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\lancer.wav --> super-grover /xevil/win32/res lancer.wav 97.04.02 12:04 B C:\xevil20h\win32\res\lancer_m.bmp --> super-grover /xevil/win32/res lancer_m.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\laser.wav --> super-grover /xevil/win32/res laser.wav 97.04.02 12:04 B C:\xevil20h\win32\res\laser_ho.bmp --> super-grover /xevil/win32/res laser_ho.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\laser_ve.bmp --> super-grover /xevil/win32/res laser_ve.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\launcher.bmp --> super-grover /xevil/win32/res launcher.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\lem_trak.wav --> super-grover /xevil/win32/res lem_trak.wav 97.04.02 12:04 B C:\xevil20h\win32\res\lemdeth.wav --> super-grover /xevil/win32/res lemdeth.wav 97.04.02 12:04 B C:\xevil20h\win32\res\lemming0.bmp --> super-grover /xevil/win32/res lemming0.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\lemming1.bmp --> super-grover /xevil/win32/res lemming1.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\lemming5.bmp --> super-grover /xevil/win32/res lemming5.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\lemming_.bmp --> super-grover /xevil/win32/res lemming_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\machgun.wav --> super-grover /xevil/win32/res machgun.wav 97.04.02 12:04 B C:\xevil20h\win32\res\medkit.bmp --> super-grover /xevil/win32/res medkit.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\medkit1.bmp --> super-grover /xevil/win32/res medkit1.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\mgun.bmp --> super-grover /xevil/win32/res mgun.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\mgun_mas.bmp --> super-grover /xevil/win32/res mgun_mas.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missile.wav --> super-grover /xevil/win32/res missile.wav 97.04.02 12:04 B C:\xevil20h\win32\res\missle25.bmp --> super-grover /xevil/win32/res missle25.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle26.bmp --> super-grover /xevil/win32/res missle26.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle27.bmp --> super-grover /xevil/win32/res missle27.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle28.bmp --> super-grover /xevil/win32/res missle28.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle29.bmp --> super-grover /xevil/win32/res missle29.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle30.bmp --> super-grover /xevil/win32/res missle30.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle31.bmp --> super-grover /xevil/win32/res missle31.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle32.bmp --> super-grover /xevil/win32/res missle32.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle33.bmp --> super-grover /xevil/win32/res missle33.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle34.bmp --> super-grover /xevil/win32/res missle34.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle35.bmp --> super-grover /xevil/win32/res missle35.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle36.bmp --> super-grover /xevil/win32/res missle36.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle37.bmp --> super-grover /xevil/win32/res missle37.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle38.bmp --> super-grover /xevil/win32/res missle38.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle39.bmp --> super-grover /xevil/win32/res missle39.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\missle40.bmp --> super-grover /xevil/win32/res missle40.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\mover.bmp --> super-grover /xevil/win32/res mover.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\moversqu.bmp --> super-grover /xevil/win32/res moversqu.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\niinja4_.bmp --> super-grover /xevil/win32/res niinja4_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\niinja6.bmp --> super-grover /xevil/win32/res niinja6.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj0_a.bmp --> super-grover /xevil/win32/res ninj0_a.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj0_m.bmp --> super-grover /xevil/win32/res ninj0_m.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj0b1.bmp --> super-grover /xevil/win32/res ninj0b1.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj0b_.bmp --> super-grover /xevil/win32/res ninj0b_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj0c1.bmp --> super-grover /xevil/win32/res ninj0c1.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj0c_.bmp --> super-grover /xevil/win32/res ninj0c_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj0d_.bmp --> super-grover /xevil/win32/res ninj0d_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj1.bmp --> super-grover /xevil/win32/res ninj1.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj10.bmp --> super-grover /xevil/win32/res ninj10.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj10_.bmp --> super-grover /xevil/win32/res ninj10_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj10b.bmp --> super-grover /xevil/win32/res ninj10b.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj11.bmp --> super-grover /xevil/win32/res ninj11.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj11_.bmp --> super-grover /xevil/win32/res ninj11_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj11b.bmp --> super-grover /xevil/win32/res ninj11b.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj12.bmp --> super-grover /xevil/win32/res ninj12.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj12_.bmp --> super-grover /xevil/win32/res ninj12_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj12b.bmp --> super-grover /xevil/win32/res ninj12b.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj13.bmp --> super-grover /xevil/win32/res ninj13.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj13_.bmp --> super-grover /xevil/win32/res ninj13_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj14.bmp --> super-grover /xevil/win32/res ninj14.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj14_.bmp --> super-grover /xevil/win32/res ninj14_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj16.bmp --> super-grover /xevil/win32/res ninj16.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj16_.bmp --> super-grover /xevil/win32/res ninj16_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj16b.bmp --> super-grover /xevil/win32/res ninj16b.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj17.bmp --> super-grover /xevil/win32/res ninj17.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj17_.bmp --> super-grover /xevil/win32/res ninj17_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj17b.bmp --> super-grover /xevil/win32/res ninj17b.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj18.bmp --> super-grover /xevil/win32/res ninj18.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj18_.bmp --> super-grover /xevil/win32/res ninj18_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj18b.bmp --> super-grover /xevil/win32/res ninj18b.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj19.bmp --> super-grover /xevil/win32/res ninj19.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj19_.bmp --> super-grover /xevil/win32/res ninj19_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj1_a.bmp --> super-grover /xevil/win32/res ninj1_a.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj1_m.bmp --> super-grover /xevil/win32/res ninj1_m.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj1b.bmp --> super-grover /xevil/win32/res ninj1b.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj1b_.bmp --> super-grover /xevil/win32/res ninj1b_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj1c.bmp --> super-grover /xevil/win32/res ninj1c.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj1c_.bmp --> super-grover /xevil/win32/res ninj1c_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj1d.bmp --> super-grover /xevil/win32/res ninj1d.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj1d_.bmp --> super-grover /xevil/win32/res ninj1d_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj21_.bmp --> super-grover /xevil/win32/res ninj21_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj22_.bmp --> super-grover /xevil/win32/res ninj22_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj2_a.bmp --> super-grover /xevil/win32/res ninj2_a.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj2_m.bmp --> super-grover /xevil/win32/res ninj2_m.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj2b_.bmp --> super-grover /xevil/win32/res ninj2b_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj2c_.bmp --> super-grover /xevil/win32/res ninj2c_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj2d_.bmp --> super-grover /xevil/win32/res ninj2d_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj3.bmp --> super-grover /xevil/win32/res ninj3.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj3_a.bmp --> super-grover /xevil/win32/res ninj3_a.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj3_m.bmp --> super-grover /xevil/win32/res ninj3_m.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj3b.bmp --> super-grover /xevil/win32/res ninj3b.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj3b_.bmp --> super-grover /xevil/win32/res ninj3b_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj3c.bmp --> super-grover /xevil/win32/res ninj3c.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj3c_.bmp --> super-grover /xevil/win32/res ninj3c_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj3d.bmp --> super-grover /xevil/win32/res ninj3d.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj3d_.bmp --> super-grover /xevil/win32/res ninj3d_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj4_.bmp --> super-grover /xevil/win32/res ninj4_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj5_m.bmp --> super-grover /xevil/win32/res ninj5_m.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj6_.bmp --> super-grover /xevil/win32/res ninj6_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj6_m.bmp --> super-grover /xevil/win32/res ninj6_m.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj6b.bmp --> super-grover /xevil/win32/res ninj6b.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj6b_.bmp --> super-grover /xevil/win32/res ninj6b_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj7_a.bmp --> super-grover /xevil/win32/res ninj7_a.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj8.bmp --> super-grover /xevil/win32/res ninj8.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj8_a.bmp --> super-grover /xevil/win32/res ninj8_a.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj_0.bmp --> super-grover /xevil/win32/res ninj_0.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj_0b.bmp --> super-grover /xevil/win32/res ninj_0b.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj_2.bmp --> super-grover /xevil/win32/res ninj_2.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj_2b.bmp --> super-grover /xevil/win32/res ninj_2b.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj_2c.bmp --> super-grover /xevil/win32/res ninj_2c.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj_2d.bmp --> super-grover /xevil/win32/res ninj_2d.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninj_4.bmp --> super-grover /xevil/win32/res ninj_4.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\NINJ_5.BMP --> super-grover /xevil/win32/res NINJ_5.BMP 97.04.02 12:04 B C:\xevil20h\win32\res\NINJ_7.BMP --> super-grover /xevil/win32/res NINJ_7.BMP 97.04.02 12:04 B C:\xevil20h\win32\res\ninj_de.bmp --> super-grover /xevil/win32/res ninj_de.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninja0_a.bmp --> super-grover /xevil/win32/res ninja0_a.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninja0_m.bmp --> super-grover /xevil/win32/res ninja0_m.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninja0b1.bmp --> super-grover /xevil/win32/res ninja0b1.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninja0b_.bmp --> super-grover /xevil/win32/res ninja0b_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninja0c1.bmp --> super-grover /xevil/win32/res ninja0c1.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninja0c_.bmp --> super-grover /xevil/win32/res ninja0c_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninja0d_.bmp --> super-grover /xevil/win32/res ninja0d_.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninja1.bmp --> super-grover /xevil/win32/res ninja1.bmp 97.04.02 12:04 B C:\xevil20h\win32\res\ninja10.bmp --> super-grover /xevil/win32/res ninja10.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja10_.bmp --> super-grover /xevil/win32/res ninja10_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja10b.bmp --> super-grover /xevil/win32/res ninja10b.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja11.bmp --> super-grover /xevil/win32/res ninja11.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja11_.bmp --> super-grover /xevil/win32/res ninja11_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja11b.bmp --> super-grover /xevil/win32/res ninja11b.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja12.bmp --> super-grover /xevil/win32/res ninja12.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja12_.bmp --> super-grover /xevil/win32/res ninja12_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja12b.bmp --> super-grover /xevil/win32/res ninja12b.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja13.bmp --> super-grover /xevil/win32/res ninja13.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja13_.bmp --> super-grover /xevil/win32/res ninja13_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja14.bmp --> super-grover /xevil/win32/res ninja14.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja14_.bmp --> super-grover /xevil/win32/res ninja14_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja16.bmp --> super-grover /xevil/win32/res ninja16.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja16_.bmp --> super-grover /xevil/win32/res ninja16_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja16b.bmp --> super-grover /xevil/win32/res ninja16b.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja17.bmp --> super-grover /xevil/win32/res ninja17.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja17_.bmp --> super-grover /xevil/win32/res ninja17_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja17b.bmp --> super-grover /xevil/win32/res ninja17b.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja18.bmp --> super-grover /xevil/win32/res ninja18.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja18_.bmp --> super-grover /xevil/win32/res ninja18_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja18b.bmp --> super-grover /xevil/win32/res ninja18b.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja19.bmp --> super-grover /xevil/win32/res ninja19.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja19_.bmp --> super-grover /xevil/win32/res ninja19_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja1_a.bmp --> super-grover /xevil/win32/res ninja1_a.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja1_m.bmp --> super-grover /xevil/win32/res ninja1_m.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja1b.bmp --> super-grover /xevil/win32/res ninja1b.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja1b_.bmp --> super-grover /xevil/win32/res ninja1b_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja1c.bmp --> super-grover /xevil/win32/res ninja1c.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja1c_.bmp --> super-grover /xevil/win32/res ninja1c_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja1d.bmp --> super-grover /xevil/win32/res ninja1d.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja1d_.bmp --> super-grover /xevil/win32/res ninja1d_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja21_.bmp --> super-grover /xevil/win32/res ninja21_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja22_.bmp --> super-grover /xevil/win32/res ninja22_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja2_a.bmp --> super-grover /xevil/win32/res ninja2_a.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja2_m.bmp --> super-grover /xevil/win32/res ninja2_m.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja2b_.bmp --> super-grover /xevil/win32/res ninja2b_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja2c_.bmp --> super-grover /xevil/win32/res ninja2c_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja2d_.bmp --> super-grover /xevil/win32/res ninja2d_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja3.bmp --> super-grover /xevil/win32/res ninja3.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja3_a.bmp --> super-grover /xevil/win32/res ninja3_a.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja3_m.bmp --> super-grover /xevil/win32/res ninja3_m.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja3b.bmp --> super-grover /xevil/win32/res ninja3b.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja3b_.bmp --> super-grover /xevil/win32/res ninja3b_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja3c.bmp --> super-grover /xevil/win32/res ninja3c.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja3c_.bmp --> super-grover /xevil/win32/res ninja3c_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja3d.bmp --> super-grover /xevil/win32/res ninja3d.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja3d_.bmp --> super-grover /xevil/win32/res ninja3d_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja5_m.bmp --> super-grover /xevil/win32/res ninja5_m.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja6_m.bmp --> super-grover /xevil/win32/res ninja6_m.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja6b.bmp --> super-grover /xevil/win32/res ninja6b.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja6b_.bmp --> super-grover /xevil/win32/res ninja6b_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja7_a.bmp --> super-grover /xevil/win32/res ninja7_a.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja8.bmp --> super-grover /xevil/win32/res ninja8.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninja8_a.bmp --> super-grover /xevil/win32/res ninja8_a.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\NINJA_0.BMP --> super-grover /xevil/win32/res NINJA_0.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\NINJA_0B.BMP --> super-grover /xevil/win32/res NINJA_0B.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\NINJA_1.BMP --> super-grover /xevil/win32/res NINJA_1.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\NINJA_1B.BMP --> super-grover /xevil/win32/res NINJA_1B.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\NINJA_2.BMP --> super-grover /xevil/win32/res NINJA_2.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\NINJA_2B.BMP --> super-grover /xevil/win32/res NINJA_2B.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\NINJA_2C.BMP --> super-grover /xevil/win32/res NINJA_2C.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\NINJA_2D.BMP --> super-grover /xevil/win32/res NINJA_2D.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\NINJA_4.BMP --> super-grover /xevil/win32/res NINJA_4.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\NINJA_5.BMP --> super-grover /xevil/win32/res NINJA_5.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\NINJA_7.BMP --> super-grover /xevil/win32/res NINJA_7.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\ninja_de.bmp --> super-grover /xevil/win32/res ninja_de.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ninjaatt.wav --> super-grover /xevil/win32/res ninjaatt.wav 97.04.02 12:05 B C:\xevil20h\win32\res\ninjadth.wav --> super-grover /xevil/win32/res ninjadth.wav 97.04.02 12:05 B C:\xevil20h\win32\res\NSHIELD_.BMP --> super-grover /xevil/win32/res NSHIELD_.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\parents.bmp --> super-grover /xevil/win32/res parents.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\pent.bmp --> super-grover /xevil/win32/res pent.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\PISTOL.BMP --> super-grover /xevil/win32/res PISTOL.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\pistol.wav --> super-grover /xevil/win32/res pistol.wav 97.04.02 12:05 B C:\xevil20h\win32\res\pistol1.bmp --> super-grover /xevil/win32/res pistol1.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\PISTOL_M.BMP --> super-grover /xevil/win32/res PISTOL_M.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\pyramid.bmp --> super-grover /xevil/win32/res pyramid.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\ROCK1.BMP --> super-grover /xevil/win32/res ROCK1.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\shell.bmp --> super-grover /xevil/win32/res shell.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\SHELL1.BMP --> super-grover /xevil/win32/res SHELL1.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\SHELL_MA.BMP --> super-grover /xevil/win32/res SHELL_MA.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\shield.wav --> super-grover /xevil/win32/res shield.wav 97.04.02 12:05 B C:\xevil20h\win32\res\SHIT.BMP --> super-grover /xevil/win32/res SHIT.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\SHOTGUN.BMP --> super-grover /xevil/win32/res SHOTGUN.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\SHOTGUN_.BMP --> super-grover /xevil/win32/res SHOTGUN_.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\skull.bmp --> super-grover /xevil/win32/res skull.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\SMALL.ICO --> super-grover /xevil/win32/res SMALL.ICO 97.04.02 12:05 B C:\xevil20h\win32\res\sndtrak.wav --> super-grover /xevil/win32/res sndtrak.wav 97.04.02 12:05 B C:\xevil20h\win32\res\sndtrk2.wav --> super-grover /xevil/win32/res sndtrk2.wav 97.04.02 12:05 B C:\xevil20h\win32\res\SOLID1.BMP --> super-grover /xevil/win32/res SOLID1.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\squanch1.bmp --> super-grover /xevil/win32/res squanch1.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\squanch_.bmp --> super-grover /xevil/win32/res squanch_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\star.bmp --> super-grover /xevil/win32/res star.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\STAR_MAS.BMP --> super-grover /xevil/win32/res STAR_MAS.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\starb.bmp --> super-grover /xevil/win32/res starb.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\STARB_MA.BMP --> super-grover /xevil/win32/res STARB_MA.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\STARS.BMP --> super-grover /xevil/win32/res STARS.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\STARS_MA.BMP --> super-grover /xevil/win32/res STARS_MA.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\strangle.bmp --> super-grover /xevil/win32/res strangle.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\SWAP_SHE.BMP --> super-grover /xevil/win32/res SWAP_SHE.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\SWAPPER.BMP --> super-grover /xevil/win32/res SWAPPER.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\swapper.wav --> super-grover /xevil/win32/res swapper.wav 97.04.02 12:05 B C:\xevil20h\win32\res\SWAPPER_.BMP --> super-grover /xevil/win32/res SWAPPER_.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\take_can.bmp --> super-grover /xevil/win32/res take_can.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\Track.wav --> super-grover /xevil/win32/res Track.wav 97.04.02 12:05 B C:\xevil20h\win32\res\TRANSMOG.BMP --> super-grover /xevil/win32/res TRANSMOG.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\transmog.wav --> super-grover /xevil/win32/res transmog.wav 97.04.02 12:05 B C:\xevil20h\win32\res\trapdoor.bmp --> super-grover /xevil/win32/res trapdoor.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\TSHIELD1.BMP --> super-grover /xevil/win32/res TSHIELD1.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\updown1.bmp --> super-grover /xevil/win32/res updown1.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\vegetabl.bmp --> super-grover /xevil/win32/res vegetabl.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\WALKER0.BMP --> super-grover /xevil/win32/res WALKER0.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\walker0_.bmp --> super-grover /xevil/win32/res walker0_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\WALKER0B.BMP --> super-grover /xevil/win32/res WALKER0B.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\WALKER0C.BMP --> super-grover /xevil/win32/res WALKER0C.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\WALKER0D.BMP --> super-grover /xevil/win32/res WALKER0D.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\WALKER1.BMP --> super-grover /xevil/win32/res WALKER1.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\walker10.bmp --> super-grover /xevil/win32/res walker10.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker11.bmp --> super-grover /xevil/win32/res walker11.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker18.bmp --> super-grover /xevil/win32/res walker18.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker19.bmp --> super-grover /xevil/win32/res walker19.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker1_.bmp --> super-grover /xevil/win32/res walker1_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\WALKER1B.BMP --> super-grover /xevil/win32/res WALKER1B.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\WALKER1C.BMP --> super-grover /xevil/win32/res WALKER1C.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\walker1d.bmp --> super-grover /xevil/win32/res walker1d.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker2.bmp --> super-grover /xevil/win32/res walker2.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker2_.bmp --> super-grover /xevil/win32/res walker2_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker2b.bmp --> super-grover /xevil/win32/res walker2b.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker3.bmp --> super-grover /xevil/win32/res walker3.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker3_.bmp --> super-grover /xevil/win32/res walker3_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker3b.bmp --> super-grover /xevil/win32/res walker3b.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker4.bmp --> super-grover /xevil/win32/res walker4.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker4_.bmp --> super-grover /xevil/win32/res walker4_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker5.bmp --> super-grover /xevil/win32/res walker5.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker5_.bmp --> super-grover /xevil/win32/res walker5_.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker6.bmp --> super-grover /xevil/win32/res walker6.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\walker_d.bmp --> super-grover /xevil/win32/res walker_d.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\wall.bmp --> super-grover /xevil/win32/res wall.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\wall1.bmp --> super-grover /xevil/win32/res wall1.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\wallold.bmp --> super-grover /xevil/win32/res wallold.bmp 97.04.02 12:05 B C:\xevil20h\win32\res\WEIGHT_M.BMP --> super-grover /xevil/win32/res WEIGHT_M.BMP 97.04.02 12:05 B C:\xevil20h\win32\res\woob.wav --> super-grover /xevil/win32/res woob.wav xevil-2.02r2.orig/win32/res/XEvil.ico0100644000175000017500000000137606430314164016570 0ustar aaronlaaronl ( @#4D2$B2#"C$334#"22B 2C""# 11222"#!22SS33C2@SCE#142 C!#D2!"S2! 31SE4S C3CE4SS1%131C! "232B "!2!"43DD43 $!BC4DC!#DD "#D3!Bafu!1pqwP0WQ10q`!#2auW#"CA!2Wp2 31#VaP322V423B !C$0A"1#C33C40??xevil-2.02r2.orig/win32/res/XEVIL.PAL0100644000175000017500000000203006430314176016261 0ustar aaronlaaronlRIFFPAL datah̻UߪUUUU___U_???U?UUUߪUԿԿԿUԿԟԟԟUԟU___U_???U?UUUߪUUUU___U_???U?UUUߪUUUU___U_???U?UUfUUUUUUUߪUUUUUUUUUUUUUUUUUUU_U_U_UU_U?U?U?UU?UUUUUUUUUU3***U***ߪ*U****U****U****U**_*_*_U*_*?*?*?U*?***U****U*Uߪxevil-2.02r2.orig/win32/res/XEvil.rc20100644000175000017500000000060006430314164016471 0ustar aaronlaaronl// // XEVIL.RC2 - resources Microsoft Visual C++ does not edit directly // #ifdef APSTUDIO_INVOKED #error this file is not editable by Microsoft Visual C++ #endif //APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // Add manually edited resources here... ///////////////////////////////////////////////////////////////////////////// xevil-2.02r2.orig/win32/res/XEVIL1.BMP0100644000175000017500000000406606604161602016354 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xevil-2.02r2.orig/win32/res/XEVIL1.CUR0100644000175000017500000000050606501111350016351 0ustar aaronlaaronl 0( @`??xevil-2.02r2.orig/win32/res/XEvilDoc.ico0100644000175000017500000000206606430314150017206 0ustar aaronlaaronl &(( @( wppwp`wwww`pwwwww?xevil-2.02r2.orig/win32/res/XEVILPAL.BMP0100644000175000017500000000246606604100422016623 0ustar aaronlaaronlBM66(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~xevil-2.02r2.orig/win32/res/XEVILSM.ICO0100644000175000017500000000206606430260032016517 0ustar aaronlaaronl &(( @????????#C@`?x?????(  `'??_xevil-2.02r2.orig/win32/res/YARROW_R.BMP0100644000175000017500000000242606620075036016711 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U ,,,,,,,,,,,,,,, ,,,,,,,,,,,,,, ~ ,,,,,,,,,,, ~~~~ ,,,,,,,,,, ~~~~~ ,,,,,,,, ~~~~~~~ ,,,,,, ,,,, ,,,  ,,,,,  ,,,,,,,  ,,,,,,,,,  ,,,,,,,,,, ,,,,,,,,,,,, ,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/ZEEPEEG.MID0100644000175000017500000010132306630123700016451 0ustar aaronlaaronlMThdMTrkzeepeegQ 5 @ Q @ 7 @ B @ S @-5070M-4c55/c8MJ8 6.G3=f0Ow. #73x7:8Ma8-5753E-4c55/a7]8M0DJ8 6.G]. #73x7:3G8ME0T8-5-4c55/c8M7B.3P8 6.G[7P. !AO735Dx7:8Ma8-5-4c8E5p5R-5/c8MJ8 6.G]. 8F733:K28 6.GY>M. #7373x7:8Ma88MJ8 6:#.G 7[Q. #73x7:8Ma8.W>'A:@.6,5EKA]$>MCd5Q -55=-4c55/c8MJ8 68+.Gq5Vl. #73x7:8Ma8.W<'.8C&.6,5Ew5Q LGMEJHHZ*E0g-H)-(A55+)P<;M#-0$*LUc(\{`z]MON)O"J HN# 0THMk5^ .e,e/_0g-Z+E89&+\V--+kO3p01"/:<-OKOMNL7H , .L2+HP8>M8-'!Om.)%(7++-=/H:.W;K-_(7)8 S @-5070HDJ D\-400;35DD5/3DK08M8ODRD^)8S 8 6.G3=0WDNf0O8DWJ0Uu. #73D3SDN%7:8MDDPDK8-5758ODR3E{D^)8S`-4c50WDN5/DWJ0U7]8M0DD3SDNw8 6.GDDPDK . #738ODRD^)8S;7:8M3G0WDNE0TYDWJ0Uy8-5D3SDNJ-4c5DD5/3DK08M7B8ODR.3PfD^)8S 8 6.G0WDNDWJ0Us7P. #735DAUD323DR8N:KlD\8U38 6.GDN8RDR8R3>M. #73730BDM)D_O7:(0F`8MDK DGA88MDK8U"8HD\&8 6.G:#0=DR 7[DXu0)C. #73D+nD8 7:8MDU0-,DR50G8.W>'DN8OA:@JD[8SB.6 0J"5EDN8O(8NDQF>M0DM8-'"D^)8SVOm.)%(7++-=/H0WDN:.W;K-)DWJ0U(7)8 S @-5070MD3SDNJ-4c5DD5/3DK08M?Z7:8M3G7P. !AO735D0HDUD]b7:80)P8MDADLQ8-5DZA=HHDR8WMAL HVDc9D`8Ph-4c58EDZAGHG0=DN\D[HQAJ 5R-5/DY30T*8MDKDGF8 6.G0UDW D\B0T. 8F73DR8R;3J;FZCBH=8ODR:K HP FSCVJTLD^)8S 8 6.GFZJECA0WDNCCTJXF`@DWJ0Uq>M. #7373D3SDN%7:8MDDPDK88MFZJJCG8ODR;CX FgJ^HD^)8S 8 6.G:#FWCKJG0WDN 7[8FcCPJTQDWJ0Uu. #73D3SDN%7:8MDDPDK8.W>'FZCJJA8ODR1J]:@ FeCMHD^)8S.6,5EJMCMFW0WDNFg CWEJV.DWJ0UcA]$>MCd5Q -55=D3SDNJ-4c5DD5/3DK08MD]ADHM8ODR?DiHdAJJD^)8S 8 6.G8+D_HMAA0WDN'AO)DgH_ 5V-DWJ0Uu. #73D3SDN%7:8M0MDO!D\P0Np8.W<'DWA?HK8NDO.8CH^DgAJ@D\78F.6,5EDZHNAADR:AJDfH]dDYJ5Q LGMEJHHZ*E0g-H)-(A550MDR+)P<;M#-0$*LUD^`DE"0=E(!DJ;{`z]MON)ODZA;HJDO8U"J HN# 0TAMH^Dc;M%D_ 8G=5^ .e,e/_0g-Z+E89D]HMAGDR0B$De+\AKHZN-0D[-0S'-+DMuDQ 0NDRDY60UO3p01"/:OKOMNL7H <-DZHHADR8N, .ASL2+HPHbDe8>M8-'D_8NkOm.)%(7++-=/HD_HKAEDU+HaAC.W'DbK-(D\7(7)8 S @-5070HDUD]-40)P5DADL 5/c8M?Z3FWCEJ/8NDO:KJY!CMFh:D\78F 8 6.GFZJMCMDR:CPF_JTRDY,>M. #73730MDR D^X7:8MDE"0=fDJY88MF]JJCADO8U@CU J]F`cD_ 8G8 6.G:#FZCEJGDR0B 7[?JWCMF\\D[-0S. #73DMuDQ7:8M0NDRDY60U8.W>'FWJKCBDR8NA:@CQ J[ F^5D_8N,.6 0J"5EF]JMC?DUICLJWF]4D\R>M0DM8-'D[8SOm.)%(7++-=/H?ZCN(7)8 S @-5070M0HDJ D\-400;35DD5/3DK08M?Z3DR8N:KlD\8U38 6.GDN8RDR8R3>M. #73730BDM)D_O7:(0F`8MDK DGA88MDK8U"8HD\&8 6.G:#0=DR 7[DXu0)C. #73D+nD8 7:8MDU0-,DR50G8.W>'DN8OA:@JD[8SB.6,5EDN8O(8NDQ"A]$>MCd5Q -55=0HDJ D\-400;35DD5/3DK08M8ODRD^)8S 8 6.G8+0WDNq5V-DWJ0Uu. #73D3SDN%7:8MDDPDK8.W<'8ODR.8CfD^)8S.6,5E0WDNDWJ0U5Q LGMEJHHZ*E0g-H)-(A55D3+)P<;DNM#-0$*LU|DDg(\{ DKSz]MON)O8ODR"J HN# 0THMD^)8S:5^ .e,e/_0g-Z+E890WDN&+\V-"DWJ0U-+D3SDN-DDPDKO3p01"/:OKOMNL7H <-8ODR, .L2+HP8>M8-'"D^)8SVOm.)%(7++-=/H0WDN:.W;K-)DWJ0Ul(7)8 S @-507D3SDNJ-4c5DD5/3DK08M8ODRD^)8S 8 6.G3=0WDNf0O8DWJ0Uu. #73D3SDN%7:8M0MDO!D\P0Np8-5758NDO3EpD\78F]-4c5DR5/DYQ7]8M0D0MDR D^*8 6.GDE"0=fDJU. #73DO8U1D_ 8G>7:8M3GDR0BE0TgD[-0S8-5DMuDQ(-4c50NDRDY5/00U38M7BDR8N.3PbD_8N"8 6.GDUD\>7P. #735DAU0HDU238ODR:K|D^)8S 8 6.G0WDNDWJ0Uq>M. #7373D3SDN%7:8MDDPDK88M8ODRD^)8S 8 6.G:#0WDN 7[DWJ0Uu. #73D3SDN%7:8MDDPDK8.W>'8ODRA:@SD^)8S.6 0J"5E0WDNDWJ0U>M0DM8-'D_8NkOm.)%(7++-=/HDU:.W;K-(D\J(7)8 S @-5070M0HDUD]-40)P5DADL 5/c8MDR8WD`8P8 6.G3=0=DNf0O=DY30T. #73DKDGt7:8M0UDW D\B0T8-575DR8N3EkD\8U-4c5DN8R5/DR8RX7]8M0D0BDM)D_w0F*8 6.GDK DG=. #73DK8U"8HD\T7:8M3G0=DRE0T`DXu0)G8-5D+nD8/-4c5DU0-5/DR50G8M7BDN8O.3P]D[8S88 6.GDN8O(8NDQ27P. !AO735D0HDJ D\k7:U0;38MDDPDK8-58ODRD^)8S`-4c58E0WDNp5R-5/DWJ0U8MD3SDNw8 6.GDDPDK . 8F7338NDO:KqD\78F 8 6.GDR-DY,>M. #73730MDR D^X7:8MDE"0=fDJY88MDO8U1D_ 8G8 6.G:#DR0B 7[ D[-0S. #73DMuDQ7:8M0NDRDY60U8.W>'DR8NA:@OD_8N,.6,5EDUD\.A]$>MCd5Q -55=0HDUD]-40)P5DADL 5/c8MDR8WD`8P8 6.G8+0=DNq5V2DY30T. #73DKDGt7:8M0UDW D\B0T8.W<'DR8N.8CVD\8U=.6,5EDN8RDR8RQ5Q LGMEJHHZ*E0g-H)-(A550BDM+)P<;M#-0$*LU%D_w0F`DKg(9DG#{`z]MON)ODK8U"J HN# 0THM8HD\S5^ .e,e/_0g-Z+E890=DR&+\V-)DXu0)f-+D+nD8DU0-,DR50G O3p01"/:OKOMNL7H <-DN8O, .L2+HP8>M8-'D[8SOm.)%(7++-=/HDN8O:.W;K-38NDQ+(7)8 S @-5070HDJ D\-400;35DD5/3DK08M8ODRD^)8S 8 6.G3=0WDNf0O8DWJ0Uu. #73D3SDN%7:8MDDPDK8-5758ODR3E{D^)8S`-4c50WDN5/DWJ0U7]8M0DD3SDNw8 6.GDDPDK . #738ODRD^)8S;7:8M3G0WDNE0TYDWJ0Uy8-5D3SDNJ-4c5DD5/3DK08M7B8ODR.3PfD^)8S 8 6.G0WDNDWJ0Us7P. #735DAUD323DR8N:KlD\8U38 6.GDN8RDR8R3>M. #73730BDM)D_O7:(0F`8MDK DGA88MDK8U"8HD\&8 6.G:#0=DR 7[DXu0)C. #73D+nD8 7:8MDU0-,DR50G8.W>'DN8OA:@JD[8SB.6 0J"5EDN8O(8NDQF>M0DM8-'"D^)8SVOm.)%(7++-=/H0WDN:.W;K-)DWJ0U(7)8 S @-5070MD3SDNJ-4c5DD5/3DK08M8ODRD^)8S 8 6.G3=0WDNf0O8DWJ0Uu. #73D3SDN%7:8M0MDO!D\P0Np8-5758NDO3EpD\78F]-4c5DR5/DYQ7]8M0D0MDR D^*8 6.GDE"0=fDJU. #73DO8U1D_ 8G>7:8M3GDR0BE0TgD[-0S8-5DMuDQ(-4c50NDRDY5/00U38M7BDR8N.3PbD_8N"8 6.GDUD\>7P. !AO735D0HDUD]b7:80)P8MDADLQ8-5DR8WD`8Ph-4c58E0=DNp5R-5/DY30T*8MDKDGF8 6.G0UDW D\B0T. 8F7338ODR:K|D^)8S 8 6.G0WDNDWJ0Uq>M. #7373D3SDN%7:8MDDPDK88M8ODRD^)8S 8 6.G:#0WDN 7[DWJ0Uu. #73D3SDN%7:8MDDPDK8.W>'8ODRA:@SD^)8S.6,5E0WDNDWJ0UcA]$>MCd5Q -55=D3SDNJ-4c5DD5/3DK08M8ODRD^)8S 8 6.G8+0WDNq5V-DWJ0Uu. #73D3SDN%7:8M0MDO!D\P0Np8.W<'8NDO.8C[D\78F.6,5EDR-DYJ5Q LGMEJHHZ*E0g-H)-(A550MDR+)P<;M#-0$*LUD^`DE"0=E(!DJ;{`z]MON)ODO8U"J HN# 0THM%D_ 8G=5^ .e,e/_0g-Z+E89DR0B&+\V-0D[-0S'-+DMuDQ 0NDRDY60UO3p01"/:OKOMNL7H <-DR8N, .L2+HP8>M8-'D_8NkOm.)%(7++-=/HDU:.W;K-(D\7(7)8 S @-5070HDUD]-40)P5DADL 5/c8MDR8WD`8P8 6.G3=0=DNf0O=DY30T. #73DKDGt7:8M0UDW D\B0T8-575DR8N3EkD\8U-4c5DN8R5/DR8RX7]8M0D0BDM)D_w0F*8 6.GDK DG=. #73DK8U"8HD\T7:8M3G0=DRE0T`DXu0)G8-5D+nD8/-4c5DU0-5/DR50G8M7BDN8O.3P]D[8S88 6.GDN8O(8NDQ27P. #735DAU0HDJ238NDO:KqD\78F 8 6.GDR-DY,>M. #73730MDR D^X7:8MDE"0=fDJY88MDO8U1D_ 8G8 6.G:#DR0B 7[ D[-0S. #73DMuDQ7:8M0NDRDY60U8.W>'DR8NA:@OD_8N,.6 0J"5EDUD\R>M0DM8-'D[8SOm.)%(7++-=/HDN8O:.W;K-38NDQ>(7)8 S @-5070M0HDJ D\-400;35DD5/3DK08M8ODRD^)8S 8 6.G3=0WDNf0O8DWJ0Uu. #73D3SDN%7:8MDDPDK8-5758ODR3E{D^)8S`-4c50WDN5/DWJ0U7]8M0DD3SDNw8 6.GDDPDK . #738ODRD^)8S;7:8M3G0WDNE0TYDWJ0Uy8-5D3SDNJ-4c5DD5/3DK08M7B8ODR.3PfD^)8S 8 6.G0WDNDWJ0Us7P. !AO735DD3SDN%7:8MDDPDK8-58ODRD^)8S`-4c58E0WDNp5R-5/DWJ0U8MD3SDNw8 6.G0MDO!D\P0Nl. 8F733DR8N:KlD\8U38 6.GDN8RDR8R3>M. #73730BDM)D_O7:(0F`8MDK DGA88MDK8U"8HD\&8 6.G:#0=DR 7[DXu0)C. #73D+nD8 7:8MDU0-,DR50G8.W>'DN8OA:@JD[8SB.6,5EDN8O(8NDQ"A]$>MCd5Q -55=0HDJ D\-400;35DD5/3DK08M8ODRD^)8S 8 6.G8+0WDNq5V-DWJ0Uu. #73D3SDN%7:8MDDPDK8.W<'8ODR.8CfD^)8S.6,5E0WDNDWJ0U5Q LGMEJHHZ*E0g-H)-(A55D3+)P<;DNM#-0$*LU|DDg(\{ DKSz]MON)O8ODR"J HN# 0THMD^)8S:5^ .e,e/_0g-Z+E890WDN&+\V-"DWJ0U-+D3SDN-DDPDKO3p01"/:OKOMNL7H <-8ODR, .L2+HP8>M8-'"D^)8SVOm.)%(7++-=/H0WDN:.W;K-)DWJ0Ul(7)8 S @-507D3SDNJ-4c5DD5/3DK08M8ODRD^)8S 8 6.G3=0WDNf0O8DWJ0Uu. #73D3SDN%7:8M0MDO!D\P0Np8-5758NDO3EpD\78F]-4c5DR5/DYQ7]8M0D0MDR D^*8 6.GDE"0=fDJU. #73DO8U1D_ 8G>7:8M3GDR0BE0TgD[-0S8-5DMuDQ(-4c50NDRDY5/00U38M7BDR8N.3PbD_8N"8 6.GDUD\>7P. #735DAU0HDU238ODR:K|D^)8S 8 6.G0WDNDWJ0Uq>M. #7373D3SDN%7:8MDDPDK88M8ODRD^)8S 8 6.G:#0WDN 7[DWJ0Uu. #73D3SDN%7:8MDDPDK8.W>'8ODRA:@SD^)8S.6 0J"5E0WDNDWJ0U>M0DM8-'D_8NkOm.)%(7++-=/HDU:.W;K-(D\J(7)8 S @-5070M0HDUD]-40)P5DADL 5/c8MDR8WD`8P8 6.G3=0=DNf0O=DY30T. #73DKDGt7:8M0UDW D\B0T8-575DR8N3EkD\8U-4c5DN8R5/DR8RX7]8M0D0BDM)D_w0F*8 6.GDK DG=. #73DK8U"8HD\T7:8M3G0=DRE0T`DXu0)G8-5D+nD8/-4c5DU0-5/DR50G8M7BDN8O.3P]D[8S88 6.GDN8O(8NDQ27P. !AO735D0HDJ D\k7:U0;38MDDPDK8-58ODRD^)8S`-4c58E0WDNp5R-5/DWJ0U8MD3SDNw8 6.GDDPDK . 8F7338NDO:KqD\78F 8 6.GDR-DY,>M. #73730MDR D^X7:8MDE"0=fDJY88MDO8U1D_ 8G8 6.G:#DR0B 7[ D[-0S. #73DMuDQ7:8M0NDRDY60U8.W>'DR8NA:@OD_8N,.6,5EDUD\.A]$>MCd5Q -55=0HDUD]-40)P5DADL 5/c8MDR8WD`8P8 6.G8+0=DNq5V2DY30T. #73DKDGt7:8M0UDW D\B0T8.W<'DR8N.8CVD\8U=.6,5EDN8RDR8RQ5Q LGMEJHHZ*E0g-H)-(A550BDM+)P<;M#-0$*LU%D_w0F`DKg(9DG#{`z]MON)ODK8U"J HN# 0THM8HD\S5^ .e,e/_0g-Z+E890=DR&+\V-)DXu0)f-+D+nD8DU0-,DR50G O3p01"/:OKOMNL7H <-DN8O, .L2+HP8>M8-'D[8SOm.)%(7++-=/HDN8O:.W;K-38NDQ+(7)8 S @-5070HDJ D\-400;35DD5/3DK08M8ODRD^)8S 8 6.G3=0WDNf0O8DWJ0Uu. #73D3SDN%7:8MDDPDK8-5758ODR3E{D^)8S`-4c50WDN5/DWJ0U7]8M0DD3SDNw8 6.GDDPDK . #738ODRD^)8S;7:8M3G0WDNE0TYDWJ0Uy8-5D3SDNJ-4c5DD5/3DK08M7B8ODR.3PfD^)8S 8 6.G0WDNDWJ0Us7P. #735DAUD323DR8N:KlD\8U38 6.GDN8RDR8R3>M. #73730BDM)D_O7:(0F`8MDK DGA88MDK8U"8HD\&8 6.G:#0=DR 7[DXu0)C. #73D+nD8 7:8MDU0-,DR50G8.W>'DN8OA:@JD[8SB.6 0J"5EDN8O(8NDQF>M0DM8-'"D^)8SVOm.)%(7++-=/H0WDN:.W;K-)DWJ0U(7)8 S @-5070MD3SDNJ-4c5DD5/3DK08M8ODRD^)8S 8 6.G3=0WDNf0O8DWJ0Uu. #73D3SDN%7:8M0MDO!D\P0Np8-5758NDO3EpD\78F]-4c5DR5/DYQ7]8M0D0MDR D^*8 6.GDE"0=fDJU. #73DO8U1D_ 8G>7:8M3GDR0BE0TgD[-0S8-5DMuDQ(-4c50NDRDY5/00U38M7BDR8N.3PbD_8N"8 6.GDUD\>7P. !AO735D0HDUD]b7:80)P8MDADLQ8-5DR8WD`8Ph-4c58E0=DNp5R-5/DY30T*8MDKDGF8 6.G0UDW D\B0T. 8F7338ODR:K|D^)8S 8 6.G0WDNDWJ0Uq>M. #7373D3SDN%7:8MDDPDK88M8ODRD^)8S 8 6.G:#0WDN 7[DWJ0Uu. #73D3SDN%7:8MDDPDK8.W>'8ODRA:@SD^)8S.6,5E0WDNDWJ0UcA]$>MCd5Q -55=D3SDNJ-4c5DD5/3DK08M8ODRD^)8S 8 6.G8+0WDNq5V-DWJ0Uu. #73D3SDN%7:8M0MDO!D\P0Np8.W<'8NDO.8C[D\78F.6,5EDR-DYJ5Q LGMEJHHZ*E0g-H)-(A550MDR+)P<;M#-0$*LUD^`DE"0=E(!DJ;{`z]MON)ODO8U"J HN# 0THM%D_ 8G=5^ .e,e/_0g-Z+E89DR0B&+\V-0D[-0S'-+DMuDQ 0NDRDY60UO3p01"/:OKOMNL7H <-DR8N, .L2+HP8>M8-'D_8NkOm.)%(7++-=/HDU:.W;K-(D\7(7)8 S @-5070HDUD]-40)P5DADL 5/c8MDR8WD`8P8 6.G3=0=DNf0O=DY30T. #73DKDGt7:8M0UDW D\B0T8-575DR8N3EkD\8U-4c5DN8R5/DR8RX7]8M0D0BDM)D_w0F*8 6.GDK DG=. #73DK8U"8HD\T7:8M3G0=DRE0T`DXu0)G8-5D+nD8/-4c5DU0-5/DR50G8M7BDN8O.3P]D[8S88 6.GDN8O(8NDQ27P. #735DAU0HDJ238NDO:KqD\78F 8 6.GDR-DY,>M. #73730MDR D^X7:8MDE"0=fDJY88MDO8U1D_ 8G8 6.G:#DR0B 7[ D[-0S. #73DMuDQ7:8M0NDRDY60U8.W>'DR8NA:@OD_8N,.6 0J"5EDUD\R>M0DM8-'D[8SOm.)%(7++-=/HDN8O:.W;K-38NDQ>(7)8 S @-5070HDJ D\-400;35DD5/3DK08M8ODRD^)8S 8 6.G3=0WDNf0O8DWJ0Uu. #73D3SDN%7:8MDDPDK8-5758ODR3E{D^)8S`-4c50WDN5/DWJ0U7]8M0DD3SDNw8 6.GDDPDK . #738ODRD^)8S;7:8M3G0WDNE0TYDWJ0Uy8-5D3SDNJ-4c5DD5/3DK08M7B8ODR.3PfD^)8S 8 6.G0WDNDWJ0Us7P. #735DD3SDN%7:8MDDPDK8-58ODRD^)8S`-4c58E0WDNp5R-5/DWJ0U8MD3SDNw8 6.G0MDO!D\P0Nl. 8F733DR8N:KlD\8U38 6.GDN8RDR8R3>M. #73730BDM)D_O7:(0F`8MDK DGA88MDK8U"8HD\&8 6.G:#0=DR 7[DXu0)C. #73D+nD8 7:8MDU0-,DR50G8.W>'DN8OA:@JD[8SB.6,5EDN8O(8NDQF>M5Q -55=0HDJ D\-400;35DD5/3DK08M8ODRD^)8S 8 6.G8+0WDNq5V-DWJ0Uu. #73D3SDN%7:8MDDPDK8.W<'8ODR.8CfD^)8S.6,5E0WDNDWJ0U5Q LGMEJHHZ*E0g-H)-(A55D3+)P<;DNM#-0$*LU|DDg(\{ DKSz]MON)O8ODR"J HN# 0THMD^)8S:5^ .e,e/_0g-Z+E890WDN&+\V-"DWJ0U-+D3SDN-DDPDKO3p01"/:OKOMNL7H <-8ODR, .L2+HP8>M8-'"D^)8SVOm.)%(7++-=/H:.W;K-r(7)8 S @-507-4c55/c8MJ8 63=.Gf0Ow. #73x7:8Ma8-5753E-4c55/a7]8M0DJ8 6.G]. #73x7:3G8ME0T8-5-4c55/c8M7B.3P8 6.G[7P. #735Dx7:8Ma8-5-4c8E5p5R-5/c8MJ8 6.G]. 8F733:K28 6.GY>M. #7373x7:8Ma88MJ8 6:#.G 7[Q. #73x7:8Ma8.W>'A:@.6,5Eo>M5Q -55=-4c55/c8MJ8 68+.Gq5Vl. #73x7:8Ma8.W<'.8C&.6,5Ew5Q LGMEJHHZ*E0g-H)-(A55+)P<;M#-0$*LUc(\{`z]MON)O"J HN# 0THMk5^ .e,e/_0g-Z+E89&+\V--+kO3p01"/:<-OKOMNL7H , .L2+HP8>M8-'!Om.)%(7++-=/H:.W;K-r(7)8 S @-507-4c55/c8MJ8 63=.Gf0Ow. #73x7:8Ma8-5753E-4c55/a7]8M0DJ8 6.G]. #73x7:3G8ME0T8-5-4c55/c8M7B.3P8 6.G[7P. #735Dx7:8Ma8-5-4c8E5p5R-5/c8MJ8 6.G]. 8F733:K28 6.GY>M. #7373x7:8Ma88MJ8 6:#.G 7[Q. #73x7:8Ma8.W>'A:@.6,5Eo>M5Q -55=-4c55/c8MJ8 68+.Gq5Vl. #73x7:8Ma8.W<'.8C&.6,5Ew5Q LGMEJHHZ*E0g-H)-(A55+)P<;M#-0$*LUc(\{`z]MON)O"J HN# 0THMk5^ .e,e/_0g-Z+E89&+\V--+kO3p01"/:<-OKOMNL7H , .L2+HP8>M8-'!Om.)%(7++-=/H:.W;K-r(7)8 S @-507-4c55/c8MJ8 63=.Gf0Ow. #73x7:8Ma8-5753E-4c55/a7]8M0DJ8 6.G]. #73x7:3G8ME0T8-5-4c55/c8M7B.3P8 6.G[7P. #735Dx7:8Ma8-5-4c8E5p5R-5/c8MJ8 6.G]. 8F733:K28 6.GY>M. #7373x7:8Ma88MJ8 6:#.G 7[Q. #73x7:8Ma8.W>'A:@.6,5Eo>M5Q -55=-4c55/c8MJ8 68+.Gq5Vl. #73x7:8Ma8.W<'.8C&.6,5Ew5Q LGMEJHHZ*E0g-H)-(A55+)P<;M#-0$*LUc(\{`z]MON)O"J HN# 0THMk5^ .e,e/_0g-Z+E89&+\V--+kO3p01"/:<-OKOMNL7H , .L2+HP8>M8-'!Om.)%(7++-=/H:.W;K-r(7)8(@)@+@-@/@/xevil-2.02r2.orig/win32/res/blood25.bmp0100644000175000017500000000216606647433212017017 0ustar aaronlaaronlBMv6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,///,,,6/////////////,,,////////////,,,,,,,//////,΁xevil-2.02r2.orig/win32/res/aaanew.bmp0100644000175000017500000000207606647435024017010 0ustar aaronlaaronlBM>6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,ρ,,΁xevil-2.02r2.orig/win32/res/bloodg25.bmp0100644000175000017500000000216606647433212017166 0ustar aaronlaaronlBMv6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,6,,,,,,,,,,,΁xevil-2.02r2.orig/win32/res/Drop_sch.bmp0100644000175000017500000002406606647443026017321 0ustar aaronlaaronlBM6(6(``$hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,/////,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,///////////////,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,//////////////,,//,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,////////////,//,/////////,//////,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,///,,//////,//,//////////////,,,,/////,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,//,,//////////,,/////////,,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,///////////,//////,//,,,///////,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,//,////////////////////,//,,,//,//,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,/////////////,//////,//,,,//,,//,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,//////////,,///////,,,//,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,///////,,,,////////,,,//,///,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,////////,,,,,//////,,,/////,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,//////////,,,,,//////////////,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,////////,,,,,,,/////////////////,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,//,,,,,,,,///////////,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,////////////,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,/////////////,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,////,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,////////,,,/////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,//////////,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,///////,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,//,,,//,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,//,,,,//,,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,,,,,,,,,///,,,////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////////,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,///////,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,//////////,,////////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,///////,,////////////////////,,,,,,,,,,,,,,,,,,,,,,,////,,,/////////,,,,,,//,,,//,,/////////////////,,,,,,,,,,,,,,,,,,,,,,,/////////////,,///////////,,,,,,//,,,,//,,//,///////,,,,,,,,,,,,,,,,,,,,////////////////,//////////,,,,,,//,,,,//,,//,//////,,,,,,,,,,,,,,,,,,////,,///////////,//////,,//,,,,,,//,,,,//,,//,///,//,,,,,,,,,,,,///////,//,,///,,//,,///,,///,,,,,,//,,,,//,,//,,//,//,,,,,,,,,,/////////////,//,,,////,//,,////,////,,,,,,//,,,///,,//,,//,//,,,,,,,,,,///////////////,,///////,,///,///,,,,,,,//,,///,,///,//,//,,,,,,,,,///////////////,,,///////////,//,,,,,,,,//////////,//,//,,,,,,,,,///,//////,//,///,,,//////////////////,,,,,,,,/////////////////,//,//,,,,,,,,,//,,,/////,//,///,,,,///////////////////,,,,,,,,,////////////////,,//,,,,,,,,,//,,,,////,///,///,,,,/////////,,,,,,,,,,/////,,,,,,//,,,,,,,,,//,,,,////,///////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,//,,////,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////,,,///////////,////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,//////////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////////,,,,/////////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////////,,,,,,,,,////,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/////////,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//////,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Lance_ve.bmp0100644000175000017500000000256606647433634017301 0ustar aaronlaaronlBMv6(P@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U/,΁/,Ё/,////////I////////////////////////Y////&//////]//////// / / / / //////////////////////////////////////////A////ρ//ρ//,/N,/,/xevil-2.02r2.orig/win32/res/bloodg39.bmp0100644000175000017500000000225606647433214017175 0ustar aaronlaaronlBM6( xhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,h,,,,Y,,,,,,,,,|,,,,,΁,,,,,,,,,,,,ρxevil-2.02r2.orig/win32/res/bloodg4.bmp0100644000175000017500000000212606647433214017101 0ustar aaronlaaronlBMV6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,xevil-2.02r2.orig/win32/res/Pent.bmp0100644000175000017500000000406606647442766016476 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,/,,,,,,,,,,,,,,,,,,,,,,///,,,,,,,,,,,,,,,,////,,,,,,,,/,,,,,,/,,,,,,,,,,,//,,,,,,,,,,,/,,,,,,,,/,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,////,,,/,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,/,,,,,,/,,,,,,,,,/,,,,,,,//,,,,,,,,,/,,,,,,,,//,,,,,,,,,/,,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/,,,,/,,,,,,,,,/,,,,/,,,,,,,,,,/,,,//,,,/,,/,,/,,,//,,,/,,,,,,//,,,,,,//,,//,,,,,,//,,,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00018.bmp0100644000175000017500000000302606644612412016712 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,|,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,, ,,!!!,,,,,,,,, ,! ,,,,,,,,,, q! |,,,,,|,,,| | q! |,,,,|,, | | q | ,,|,,,, | | | ||| |,,,| | |,, | | |,,,,, |,,,,,,,,,,, |,,,,,,,,,,,,, |,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,, |,,,,,,,,,,,,,, |,,,,,,,,,,, |,,,,,,,,, ||,,,,,,, ,,, |,,,,,,, ,,,,,, |,,,,,,,,,,,,,,,,,,, |xevil-2.02r2.orig/win32/res/hiddog2.bmp0100644000175000017500000000274606644612410017071 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,|, |,,,,,,,,,,,,,,,|,,| |,,,,,,,,,,, ,,| |,,,,,,,,,,, |,,,|| |,,,,,,,,,,,, |,,| |,,,,!,,,,, ||,| |,,,,!,,,,,, |,,| !,,,,,, | | !,,,,,,, | !,,,,,, | !q,,,,,, , ,, ,,,, |qq ,, ,,,,,,,,,, | ,,,,,,,,,,,, | | ,,|,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,,, |, |,,,,,,,,,,,,,,,,,,,, ,, ,,,,,,,,xevil-2.02r2.orig/win32/res/hiddog22.bmp0100644000175000017500000000302606644612410017143 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,|,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,, , ,,,,, ,,,,,,,, ,,,, ,,,,,,, | ,,,, ,,,,,| | q,,, ,,,,,, | | | qqq| ,,,,,,,| | ! |,,,,, || |||| ||,,,,|,, | ||,,,, |,,, ,,, |,, ,,,,, | ,,,,,,,, | ,,,,,,,, ||,,,,,,,,, ,,,|,,,,,,,, |,,,|,,,,,,,,, |,,,|,,,,,,,,, |,,,,,,,,,, ||,|,,,,,,, ,,, ,,,,,,,,,, ,,,,, ,,|,,,,,, ,,,,,,, ,, |xevil-2.02r2.orig/win32/res/hiddog5.bmp0100644000175000017500000000244606644612412017073 0ustar aaronlaaronlBM&6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U|,,,,,,|v|,,,,,,| |,,|  |,,| > || ` ||||  2 ~~ |!| 2 | ! | 7, | ! | ,~,| q!!q |,e, q ,, ,~,| |,),| | |,,, ,,,, || ,,΁,, |,,| ,,΁,,, ,, ,,,xevil-2.02r2.orig/win32/res/hiddogde.bmp0100644000175000017500000000260606644612412017315 0ustar aaronlaaronlBM6(PhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U ,,////// | |,,,,,,, , // | |,,,,,,,, / |/ | ,,|,,, / / // ,,, / / /|qq ! ,,,, / / // !, ,,, / |,!!,,,,,, / ||,,,|| |,,,,,,,, |,,,,,,| /| |,,,,,,, |,,,,,,,| |,,| ,,,,, |,,,,,,,,, ,,,,,, |,|,,,,,,,,,| ,|,,,,,|,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/27b.bmp0100644000175000017500000000525606635113514016143 0ustar aaronlaaronlBM 6($.xhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,|||,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,潽潽,,,,,,,,,,,,,,,,,潽潽|,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,潽潽|,,,,,,,,,,,,,,,潽|,,,,,,,,,,,,,,,,,潽|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,f,,,,,,,,,,,,,,,,,,fffffffffffff,,,,,,,,,,,,,,,,,fffffffffff,,,,,,,,,,,,,,,,,fffffffffffffff,,,,,,,,,,,,,,,,,ffffffffffffffff,,,,,,,,,,,,,,,,,fffffffffffff,,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ff,,,,,,,,,,,,,,,,,,,,,,,,,,fffffff,,,,,,,,,,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,,,,,,,,,mffffff,,,,,,,,,,,,,,,,,,,,,,mmffffff,,,,,,,,,,,,,,,,,,,,,mffffffff,,,,,,,,,,,,,,,,,,,,,mfffff,,,,,,,,,,,,,,,,,,,,,mfffmmmmmmmmmm,,,,,,,,,,,,,,,,,mffffmmmmmmm,,mmm,,,,,,,mffffmmmmmmm,,,,,,,mffffmmm,,,,,,,mfffmm,,,,,,,,mfffmmmmm,,,,,,,,,mmmmmmmmm,,mmmmmmmmmm,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,m?mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,??mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,?????m,,,,,,,,,,,,,,,,,,,,,,,,,,,? ? ??,,,,,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,? ? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?? ? ,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bloodg40.bmp0100644000175000017500000000222606647433216017164 0ustar aaronlaaronlBM6( `hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/aaanew1.bmp0100644000175000017500000000616606635115412017066 0ustar aaronlaaronlBMv 6(B@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,f,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,ffffff,,,,,,,,,潽,,,,,,,,ffffff,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,fffff,,,,,,,,,潽,,,,,,,,,fffff,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,ffffff,,,,,,, ,,fffffff,,,,,,,,,fffffffffff,,,,,,,,,,fffffffffffff,,,,,,,,,,fffffffffffffffff,,,,,,,,,,,fffffffffffffff,,,,,,,,,,,,fffffffffffff,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,m,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,mm,,,ff,,,,,,,,,,,,mm,,mfffffff,,,,,,,,,,,mf|fffff,,,,,,,,,,,mmmff~mmffff,,,,,,,,,,,mmmfff|ffff,m,,,,,,,,,mmfffmmmfffffm,,,,,,,,,mmffffm~ffffffm,,,,,,,,,mmmfffff~mffffm,,,,,,,mmmmfffffm|fffm,,,,,,mm,,mfffmf~mfffm,,,,,mm,,mfm|mmm,,,,mmmm,,,,,mm? ??m,,mm,,,,m,,,,,,,,m????? m,,mm,,,,,,,,,,,,,m? ?? ??,,,mm,,,,,,,,,,,,,?? ?? ?,,,,,mm,,,,,,,,,,,,,m? ? ?m,,,,mmm,,,,,,,,,,,,m? ?? ??,,,,mmm,,,,,,,,,,,, ? ? ?m,,,,mmm,,,,,,,,,,, ?? ? ???,,,,qm,,,,,,,,,,,,, ?? ?,,,,mm,,,,,,,,,,,, ? ???,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmmmm,,,,,,,,,,,,,,,,,,,,,,,,m,m,m,,xevil-2.02r2.orig/win32/res/Aliennu.bmp0100644000175000017500000002550606603663714017153 0ustar aaronlaaronlBMF+6(dd'hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U潽潽潽潽潽潽⽽꽽⽽⽽潽뽽罽罽⽽뽽꽽뽽潽뽽罽뽽潽꽽xevil-2.02r2.orig/win32/res/Blok2.bmp0100644000175000017500000000406606604044314016515 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U||||| ||||| || ||||| ||||||||||| |||||||||| |||| || |||||||| |||| || |||||||| || |||||| |||| || ||||| ||||||||| |||||||| ||||||||||||||| || ||| |||| ||| | || ||||| | | | ||||||||||| || | | || | | | | || | || | | ||||||||||| | | | || | || | | || | | | | ||||||||||| || | | || | | | | || | || | | ||||||||||| | | ||| |||||||||||||| |||||| ||||||| ||||||||||||||||||||| || ||||||| || ||||| ||| ||||||||||||| ||||| ||| |||||||| ||| | |||||||| || |||||| || || ||||| || ||||||| |||||||||||||||||||| xevil-2.02r2.orig/win32/res/bmp00002.bmp0100644000175000017500000000606606625411520016706 0ustar aaronlaaronlBM6 6(> hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,~~,,,,~~,,,,~~,~~~~~,~~~,,,~~,,~~,,,,,,,,,,,,~~,,,~~,,,~~~~~~~~~~~,,,,,,,,,,~~,,~~,,~~,,,,,,,,,~~~~~~~,~ɤ~~,,,,,,,,~ɤ~~~~~~~~~~~~~~~,U,,,,,,,,~PxQ~~~~~,,~~~~~~,,,,~~,,,,,,,,,,,~QxxxQ~x~~,,~ɤ~,,,,,,,,,,,,,,,,,,,,,,~xxɤP~x~~,~~,,,,,,,,,,,,,,,UU,,,,,,,~~P~P~~x~~~,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~x~~~,,~~~,,,,,,,,,,,,UU,,,,,,,~~~~~~~~x~,~~,,,,,,,,,,,,,,,,,~~~~Qɣ~,~~,,,,,,,,,,,,,,,~~xɤQ~,~~~,,,,,,,,,,,,,,~ɤP~~~,,,,,,,,,,,,~PP~~,,,,,,,,,,~~~~ɤ~,,,,,,,,,*~~~~,~~,~,~~~~,,,,,,,,,~~~~~,,~,,,,,,,,,,~~x~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,~~~ɤxx~~,,,,,,,,,U~~,,,,,,,,,,,,,,,,,,~~~~~~~xxx~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~~~~~~,~~~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,~~,~,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,*,,,,,,~~~~~~~,,,,,,,,,,,,~~~~~~,,,,,,,,,,,,,,,,,,,,,*,,,,,,,~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*xevil-2.02r2.orig/win32/res/bmp00011.bmp0100644000175000017500000000606606625411046016711 0ustar aaronlaaronlBM6 6(> hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,~~~,,,~~,,,,,,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,,,,~~~,~~,,~,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~~~,~~,,,,,,~x~,,,,,,,,,,,,,,,,,~~~~~,,,,,~~~~,,,,,,,,,,,,,,,,,~~,,,,,~~~~~~,,~~~~~~~,,,,,,,,,,,,,,,,,~x~,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~xx~,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~xxxxx~,,,,~x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~xQx~~~~~~x~,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,~P~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,~ɣxx~,,~~,,,,,,,,,,,,,,,,,,~~~~~~Qx~,~~,,,,,,,,,,,,,,,,~~xQ~~~~~~,,,,,,,,,,,,,,~~~~,,,,,,,,,,U,,~~~,,,,,,,,,,~~~~~,,,,,,,,,~~~~,~~,~,~~~~,,,,,,,,,~~~~~,,~,,,,,,,,,,~~x~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,~~~ɤxx~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,~~~~~~~xxx~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~~~~~~,~~~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,*,,,,~~~,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,~~,~,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00014.bmp0100644000175000017500000000606606625411522016713 0ustar aaronlaaronlBM6 6(> hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,~~~,,,,,,,~~,,,,,~~~~~~~~~~~,,,~,,~~,,,,,,,,,,,~~,,,,,~~,,,~~~~~~~,,,,,,,,,,~~,,,,~~,,,~ɤ~,,,,,,,,~~,,~~~~,~~~,,,,,,,,~~~~~~~~~~~~~~~~,U,,,,,,,~~xQ~~~~,,~~~~~~,,,,~~~~~,,,,,,,,,~x~~xx~~,~~,,,,,,,,,,,,,,,,,,,,,,~xx~~x~x~~~,,,,,,,,,,,,,,,,UU,,,,,,~~~Q~~~~~,,,,,,,,,,,,,,,,,,,,,,,~~~Pxx~~~,,,,,,,,,,,,,UU,,,,,,~~~~~~~ɤxQ~~~,,,,,,,,,,,,,,,,,,,~~~Qx~~~,,,,,,,,,,,,,,,,,~~ɤx~~,~~,,,,,,,,,,,,,,~ɤxx~~~,,,,,,,,,,,,~xQxxxx~~~,,,,,,,,,,~~~~xx~,,,,,,,,,*~~~~,~~,~,~~~~,,,,,,,,,~~~~~,,~,,,,,,,,,,~~x~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,~~~ɤxx~,,,,,,,,,,U~~,,,,,,,,,,,,,,,,,,~~~~~~~xxx~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~~~~~~,~~~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,~~,~,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,*,,,,,,~~~~~~~,,,,,,,,,,,,~~~~~~,,,,,,,,,,,,,,,,,,,,,*,,,,,,,~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*xevil-2.02r2.orig/win32/res/bmp00019.bmp0100644000175000017500000000427606625341256016727 0ustar aaronlaaronlBM6(:hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,~~~,,,,,,,, ,,,,,,~~,,,,,,,,,,,,,~~,,,,,,,,,,,,~~,,,,,,,,,,,~~,,,,,,,,,,,~~,,,,,,-,,,,,~~,,,,,,G,,,,,~~,,,,,,,,,,,~~~~,,,,,,,,~~,,v,,,~~~~,,,~~,2,~~,,~~,,~~,~~~~~~~~~~~~,.,~~,,~~,,,~~,,,,~~,,,,~~,,,=,,~,~,,,2,,,~~,,,2,,,~~,,,ԁ,,~~,,,,~~,,/,~~,,~~,,~~,,~~,~~~~~~,~~,,~~ ,~~,,~~P~,,,~~Q~,,,,~~~,,,,,~~,,-,,~~,,,G,,~~,,,,,~~,,,,~~,,,v,~~,,,,~~,,,,~~~~~~,,,,,~~,,~~~~,,,,,~~,,,,~~,,,ԁ,,,~~,,,,,~~,,,,,,,,,,,,,,~~,,,,,/,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00023.bmp0100644000175000017500000000427606625341256016722 0ustar aaronlaaronlBM6(:hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,~~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,~~,,,,,,,,,,~~~~,,,,,,-,,~~,,,,,,G,~~,,,,,,,~~,,,,,,,~~,,,,,,,~~,,,,,~~,,,,,d~~,,,,,,~~,,,,,,j~~,,,,,,2~~~,,,,,2,~~~,,,,,,e,,~~~~,,,,,~~~~,,,,~x~,,-,,~~,,G,,~~,,,~~,,,~~,Lo,,~~,2,,,~~,Ӂ,,,,~~,,,,~~,/,,,~~,,,~~,,~~,,~~,~~,~~,d,~~,,~~,~~=~~~~,~~,,~~,~~,~~P~~,,~~Q~,,,~~~,,-,,~~,,G,~~,,,~~,,,,~~,,,v,~~~,,,,~~~,,,2,~~~,,,,,,~~,~~~,,,,,,~,,,~~~,,,,,,,,,,,~~~~,,,,,,,,,,,,,~~,,,,,,,,,,,,,~~,,,,.,,,,,,,,,~~,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,=xevil-2.02r2.orig/win32/res/bmp00026.bmp0100644000175000017500000000606606625411522016716 0ustar aaronlaaronlBM6 6(> hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,~~~,,,,~~~,,,,,,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,~~~,,,~~,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,~~,,,,,,,,,~x~,,,,,,,,,,,,,,~~~~~,,,,,,,~~~~,,,,,,,,,,,,,,,~~,,,,,,,~~~~~~,,~~~~~~~,,,,,U,,,,,,,,,,~xx~,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~xQxQ~,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~xQɤP~,,,,,,~x~,,,,,,,,,,,,,,,,,,,UU,,,,,,,,,,~~~~~~~~x~,,,,~,,,,,,,,,,,,,,,,,,,,,,,,~xx~,,,~~,,,,,,,,,,,,,UU,,,,,,,,,,,~~~xx~,,~~,,,,,,,,,,,,,,,,,,~~~~~~~~Qx~,~~,,,,,,,,,,,,,,,,~~xQ~,~~~~,,,,,,,,,,,,,,~ɤ~~~,,,,,,,,,,,,~~~,,,,,,,,,,~~~~~,,,,,,,,,*~~~~,~~,~,~~~~,,,,,,,,,~~~~~,,~,,,,,,,,,,~~x~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,~~~ɤxx~,,,,,,,,,,U~~,,,,,,,,,,,,,,,,,,~~~~~~~xx~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~~~~~~,~~~~,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,~~,~,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,*,,,,,,~~~~~~~,,,,,,,,,,,,~~~~~~,,,,,,,,,,,,,,,,,,,,,*,,,,,,,~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*xevil-2.02r2.orig/win32/res/bmp00035.bmp0100644000175000017500000004206606631174602016720 0ustar aaronlaaronlBM6D6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U潽潽潽潽꽽昽潽潽潽꘽꽘昽潽潽潽潽潽潽潽潽潽潽潽潽뽽뽽潽꽽꽽꽽xevil-2.02r2.orig/win32/res/bmp00038.bmp0100644000175000017500000000453606625411520016717 0ustar aaronlaaronlBM^ 6(<(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,~~~~~~,,,~,,,,,,,,,,,,,~x~,,,,,,,,,,,~x~,,,,,,,,,,,~~~~~~~~~~~~~~~xx~,,,,,,,,,,~~,,,,,,~~,~~x~,,,,,,,,,,~~,,,,,,~~,~xQ~,,,,,,,,,~~,,,,,,~~,~Qxɤ~~,,,,,,,,,~~,,,,,,~~~~ɣxx~~~~,,,,,,,,,~~,,,,,,~~P~,,~~,,,,,,,,,,,~~,,,,,~xQx~~~~~x~,,,~~,,,,,,,,,,,,,~~,,,,,~~xxxxx~,,,~x~,,,,,,,,,,,,,,,,,,,~~,,,,,~~xx~,,,,~~,,,,,,,,,,,,,,,,,,,,~~,,,,~x~,,,,~~,,,,,,,,,,,,,,,,,,,,~~~,,,,~~,,,,,~~~~~~,,~~~~,,,,,,,~~,~,,~~~~~,,,,,~~~~,,,,,,,~~~~~~~~~,~~~~~,,,~x~,,,,,,,~~~~~~~~~~~,,,~~,,,,,,,,,~~,,,,,~~~~~~~~,,,,,,,,,,,~~~~~~~~~~~~~~~~~,,,,,,,,,,~~~~~~~~~,,~~,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00039.bmp0100644000175000017500000004206606631174604016726 0ustar aaronlaaronlBM6D6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Uxevil-2.02r2.orig/win32/res/bmp00041.bmp0100644000175000017500000000742606625352672016726 0ustar aaronlaaronlBM6(0: hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~Q~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,~xx~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,~x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~ɤɤ~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~xQ~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~x~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~P~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~Qx~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~Q~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~Q~,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,~~~~,,,~~~~,,,,,,,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,,,,~~~~,,~~~,,,,,,,,,,,,,,,,,,,~~~,,,,~~,,,,,,,,,,,,,,,,,,~~,,,,~Q~,,,,,,,,,,,,,,,,,,~~~,,,,~~~~~~x~,,,,,,,,,,,,,,,,,~~,,,,,,,~~~~~~,,,,,,,,,,,,,,,,~~,,,,,,,,~ɣ~,,~,,,,,,,,,,,,~~,,,,,,,,~~,~~~,,,,,,,,,,,~~,,,,,,,,~~~~~~~~~,,,,,,,,,,~~,,,,,,,,,,~~~~~~~~Q~~,,,,,,,,,~~,,,,,,,,,,~~,~,,,,,,,,,,~~,,,,,,,,~~~~~~~~~~,,,,,,,,,~~,,,,,,,,,,~~~,,,,,,,~~~,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~x~,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~P~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00042.bmp0100644000175000017500000000742606625406772016730 0ustar aaronlaaronlBM6(0: hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~x~ɤ~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~xx~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~ɤQ~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,~~xPx~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~xx~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~P~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~ɤQ~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~xx~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~Q~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~x~,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~x~,,,,,,,~,,,,,,,,,,,,,,,,~~~,,,,,~~~~,,,,,,,,,,,,,~~~,,,,,~~,,,,,,,,,,,,~~~~~~~~~,,,,,,,,,~~~,,,,,,,~~~~~~~~,,,,,,,~~~,~,~~~~~~~~~,,,,,,~~~,,,~~~,,,,,~~~~,,,,,,,~~~,,,~~,,,,,,~~~,,,,,,,,,~~,,,,,~~~~x~,,,,,,,,,,,,,,,,,,~~~,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,~~,,,,,,,,~~~,,~,,,,,,,,,,,,,~~,,,,,,,,~~~~~,,,,,,,,,,,~~,,,,,,,,~~~~x~~,,,,,,,,,,~~,,,,,,,,,~~~~~~~~x~,,,,,,,,,,,~~,,,,,,,,,,~~~~~,,,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,,,~~~~~~~~~~~~,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~Qx~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~x~,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00044.bmp0100644000175000017500000004206606631174604016722 0ustar aaronlaaronlBM6D6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U뽽뽽潽潘罽~~~潽~罽~~~~~~~~潽~~潽~~~~~~~~~~~~~~~~~ꘔ~~~~~xevil-2.02r2.orig/win32/res/bmp00045.bmp0100644000175000017500000000536606633316606016727 0ustar aaronlaaronlBM 6(HhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00046.bmp0100644000175000017500000000546606634672670016740 0ustar aaronlaaronlBM6 6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,m,,,,,,,,m,,,,,,,,,,,m,,,,,,,,,,,m,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00047.bmp0100644000175000017500000000742606625406774016737 0ustar aaronlaaronlBM6(0: hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,~~,,,,,,,,,,,,,,,~ɤ~,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~x~~~~~~,,,,,,,,,,,,,,~~,,,,,,,,,~~,,,,,~~,,,,~,,,,,,,,,,,,,,,~~,,,,,,,,~~,,,~x~,,,,,,,,,,,,,,,,,,,,~~,,,~~~~~~,,,~Q~,,,,,,,,,,,,,,,,,,,,~~~~~,,,,~xQ~,,,,,,,,,,,,,,,,,,,,~~,,,~x~,,,,,,,,,,,,,,,,,,,,~xxQx~~~~,,,,,,,,,,,,,,,,,,,,,,~x~~,,,,,,,,,,,,,,,,,,,,,,~P~,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~x~,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,~xxɤ~,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,~x~~~,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,~xx~,~,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,~~~~~,,,,~~~~,,,,,,,,~~~~~~~~~~,,,,,,~~~,~,~~~,,,,,,~~~,,,~~ɤ~~~ɤ~,,,,~~~,,,~x~,,,~~~~,,,~~~,,,,,~~~~,,,,,,~~~,,,~~,,,,,,,,~~~~~~Q~,,,,,,,~~~,,,~~,,,,,,,,~~x~~~~,,,,~,~~~,,,,~~,,,,,,,,~x~~~,,,,,,,,,,,~~,,,,,,,,~~~~~,~,,,,,,,,,,,~~,,,,,,,,,~~~~~~~~Q~~,,,,,,,,,,,,~~~,,,,,,,,,,~~~~,,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,~~~~~~~~~~~~,,,,,,,,,~~,,,,,,,,,,~,,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~xx~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~x~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00048.bmp0100644000175000017500000000742606625406774016740 0ustar aaronlaaronlBM6(0: hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,~ɤ~,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,~x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,~x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~Q~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~ɤxQ~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,~~P~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,~xQ~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~QQ~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~xx~,,,,,,~,,,,,,,,,,,,,,,,,,,,~~~~~~~~~x~~,,,,,~~~,,,,,,,,,,,,,,,,~~~~,,,~~,,,,,,,,,,,,,,~~~~~~~~~~~~~,,,,,,,,,,,,~~~~,,,,,,,,,~~~~,,,,,,,,,~~~,,,,,,,~~~~~~~~~~~~~~~~~~,,,,,,,~~~,,~~~,,,,,~~,,,,,,,,,~~~,,,~~,,,,,,~~,,,,,,,,,,~~~,,,,~~~~,,,,,,,,,,,,,,,,,~~,,,,,,,~~~~~~~x~,,,,,,,,,,,,,,,,,~~,,,,,,,,~~~x,,,,,,,,,,,,,,,,,~~,,,,,,,~x~,,~~,,,,,,,,,,,,~~~,,,,,,,,~x~~~,,,,,,,,,,,~~,,,,,,,,,~~~~~~~~x~~,,,,,,,,,,~~~,,,,,,,,,,~~~~,,,,,,,,,,~~,,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,~~~~~~~~~~~,,,,,,,,,~~,,,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~Qx~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~ɤQ~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00049.bmp0100644000175000017500000000546606634602470016732 0ustar aaronlaaronlBM6 6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,m,,,,,,,,,m,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,mm,,xevil-2.02r2.orig/win32/res/bmp00050.bmp0100644000175000017500000000742606625406776016733 0ustar aaronlaaronlBM6(0: hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~x,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~xxx~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~xQ~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,~,x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,~x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~x~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~ɤ~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~PxxP~~,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~xxx~~,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,~~~~~~~~,,~~,,,,,,,,,,,,~~~~,,~~~,,,~~~,,,,,,,,,,,,,~~~,,,,~ɤ~,,,,,,,,,,,,,,,,,,~~,,,,~P~,,,,,,,,,,,,,,,,,,~~~,,,,~~~~~~x~,,,,,,,,,,,,,,,,,~~,,,,,,,~~~~~~,,,,,,,,,,,,,,,,~~,,,,,,,,~~,~~,,,,,,,,,,,,~~,,,,,,,,~~~~~,,,,,,,,,,,~~,,,,,,,,~~~~~~~~,,,,,,,,,,~~,,,,,,,,,,~~~~~~~~,~,,,,,,,,,,~~,,,,,,,,,,~~~~~,,,,,,,,,,~~,,,,,,,,,~~~~~~~~~~,,,,,,,,,~~,,,,,,,,,,~~~,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~ɤQ~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00051.bmp0100644000175000017500000000546606634704634016730 0ustar aaronlaaronlBM6 6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,m,,,,,,,,,,,,m,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00052.bmp0100644000175000017500000000546606634672672016737 0ustar aaronlaaronlBM6 6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,m,,mm,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00053.bmp0100644000175000017500000000546606634672674016742 0ustar aaronlaaronlBM6 6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,m,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00058.bmp0100644000175000017500000000546606634672674016747 0ustar aaronlaaronlBM6 6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,m,,,,,,,,,,,,m,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Bshield.bmp0100644000175000017500000000252606604100416017111 0ustar aaronlaaronlBMV6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,{,,,,,,,,,,{{,,,,,,,,{{{,,,,,,ỻ,,,,,,,,,{,,ỳ,ỳʳ,{y#yy#y{廳,{y'.y{ỳ,{{y.'yỳ,{{y#yy#ʳ廳,{{y{yس,{{س,{ỻ,{{ػػ,{ػس,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr0.bmp0100644000175000017500000000422606604100416017051 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,, {{{{,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,{,,,,,,,,,,,,,,,{{{{,,,,,,,,,|,,,,,,,,,,,,,,,,,,,{::e,,,,,,,,,,,{{:,,,,,,,,,,,,,{{{,,,,,,,,,,,,{{|س,,,,,,,,,,,{,, ,,,,,,,,,,,,,,{,,::::,,,,,,,,,,,,,羶:::::2::,,,,,,,,,,,,q:::2:2:,,,,,,,,,,,,Kq::,,,,,,,,,,,,RRKqKqR,,,,,,,,,,,,,SSR&Rq: ,,,,,,,,,,,,,R/KK/z 2,,,,,,,,,,,,,S/RR&qq:2,,,,,,,,,,,,,,R/R&/qz,,,,,,,,,,,,,,,R&&J,,,,,,,,,,,,,,,,R&|,,,,,,,,,,,,,,,罽|:1,,,,,,,,,,,,,罽|:|:m,,,,,,,,,,,,,|ee|:d,,,,,,,,,,,,::,,,,,,,,,,,羼,,,,,,,,,,,,,|||{,,,,,,,,,,,,,,  |,,,,,,,,,,,,,,,,,ad,,,,,,,,,,,,,,,,,f2 : aaf,,,,,,,,,,,,,,,,,ee  :2 ,,,,,,,,,,,,,,,,, 3  ,,,,,,,,,,,,,,,,,,,:, ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr0b.bmp0100644000175000017500000000422606604044316017221 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,{{{{,,,,,,,,,,,,,,,,,,,{{,,,,,,,,,,,,,,,,,{{{,,,,,,,,,,,,{{{{,,,,,,,,,,,,{,,,,,,,,,,,,,{{,,,,,,,,,,,,,,e:ee,,,,,,,,,,,,,,,,ee,,,,,,,,,,,,,,,,,ee::::,,,,,,,,,,,,,,,,,e9:2e,,,,,,,,,,,,,,,,2ee,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::::,,,,,,,,,,,,,,,:::::2::,,,,,,,,,,,,,,,:::2:2:,,,,,,,,,,,,,,,,::RKqK:,,,,,,,,,,,,,,SS&&SSz:f,,,,,,,,,,,,R/KKS.: f,,,,,,,,,,,,S/&&&SS&.2 : ,,,,,,,,,,,,R/&&/qS&.:2 2,,,,,,,,,,,R&&Jz,,:2,,,,,,,,,,,,&S|,,,,,,,,,,,,,,,罽|:1,,,,,,,,,,,,,罽|:|:m,,,,,,,,,,,,,|ee|:d,,,,,,,,,,,,::,,,,,,,,,,,羼,,,,,,,,,,,,,|||{,,,,,,,,,,,,,,  |,,,,,,,,,,,,,,,,,ad,,,,,,,,,,,,,,,,,2 :3 af ,,,,,,,,,,,,,,,,,,>  3 : ,,,,,,,,,,,,,,,,, :,: ,,,,,,,,,,,,,,,, ,22,f, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr0c.bmp0100644000175000017500000000422606604044316017222 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,$,,,,,,,,,,,,,,,,,,,,,,,,{{{,,,,,,,,,,,,,,,,,,,,,,{,,,,,,,,,,,,,,,,,{,,,{,,,,,,,,{,,,{,,,,{{ {,{|l:,,,,,d{,,22:,,:{{,,,{:2:29,,,,,,:9,,,,,,,,,,,{{,,س,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::/,,,,,,,,,,,,,,,:::::2::/R,,,,,,,,,,,,ʾ:::2:2::/Rff,,,,,,,,,,qq::SSʶ::/::ff,,,,,,,,,S/qq/qSSq/&22:f,,,,,,,,,&/S//SS&q&RqR,: f,,,,,,,,,&/SSS/qq/q,,2 : ,,,,,,,,q&SqqQ,,,:2 2,,,,,,,,|,,,,:2,,,,,,,,,|:1,,,,,,,,,,,,,罽|:|:m,,,,,,,,,,,,,|ee|:d,,,,,,,,,,,,::,,,,,,,,,,,羼,,,,,,,,,,,,,|||{,,,,,,,,,,,,,,  |,,,,,,,,,,,,,,,,,ad,,,,,,,,,,,,,,,,,2 : aaf ,,,,,,,,,,,,,,,,,,  :2: ,,,,,,,,,,,,,,,,, ,3 ,, ,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr0d.bmp0100644000175000017500000000422606604044316017223 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,, {{{{,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,{,,,,,,,,,,,,,,,{{{{,,,,,,,,,|,,,,,,,,,,,,,,,,,,,{::e,,,,,,,,,,,{{:,,,,,,,,,,,,,{{{,,,,,,,,,,,,{{|س,,,,,,,,,,,{,, ,,,,,,,,,,,,,,,,,{,,::,,,,,,,,,,,,,,,,::::::,,,,,,,,,,,,,,:::22:::,,,,,,,,,,,,,K2:::,,,,,,,,,,,,,RRKqK2:,,,,,,,,,,,,,SS&f,,,,,,,,,,,,,R/KKRq: ,,,,,,,,,,,,,S/&&&R: 2,,,,,,,,,,,,,R/&&/qzz:2,,,,,,,,,,,,,R&&Jq,,,,,,,,,,,,,,,,R&|,,,,,,,,,,,,,,,潽|:1,,,,,,,,,,,,,罽|:|:m,,,,,,,,,,,,,|ee|:d,,,,,,,,,,,,::,,,,,,,,,,,羼,,,,,,,,,,,,,|||{,,,,,,,,,,,,,,  |,,,,,,,,,,,,,,,,,ad,,,,,,,,,,,,,,,,,f2 : aaf,,,,,,,,,,,,,,,,,ee  :2 ,,,,,,,,,,,,,,,,, ,3  ,,,,,,,,,,,,,,,,,,,:,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr0e.bmp0100644000175000017500000000422606604044316017224 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,{{{{,,,,,,,,,,,,,,,,,{{{,,,,,,,,,,,,,,,,,,{{{,,,,,,,,,,,,{{{,,,,,,,,,,,,{,,,,,,,,,,,,,{{{{,,,,,,,,,,,,,,ee{,,,,,,,,,,,,,,,,ee,,,,,,,,,,,,,,,,,ee::::,,,,,,,,,,,,,,,,,e9:2e,,,,,,,,,,,,,,,,2ee,,,,,,,,,,,,,,,ش,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,SS,,,,,,,,,,,,,,/S/z,,,,,,,,,,,,,,SRSʾ,,,,,,,,,,,.RSR/RSʾ999,,,,,,,,,,S/SSS/SSK2299:,,,,,,,,,,SSS&&K&KK9:2,,,,,,,,,,&&&&&&K,,::,,,,,,,,,SqK,,991,,,,,,,,,|,,2999,,,,,,,,,|:1,,:292,,,,,,,罽|:|:m,,92,,,,,,,,|ee|:d,,,,,,,,,,,,::,,,,,,,,,,,羼,,,,,,,,,,,,,|||{,,,,,,,,,,,,,,  |,,,,,,,,,,,,,,,,,ad,,,,,,,,,,,,,,,,,2 :3 af ,,,,,,,,,,,,,,,,,,>  3 : ,,,,,,,,,,,,,,,,, :,: ,,,,,,,,,,,,,,,, ,22,f, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr0f.bmp0100644000175000017500000000422606604044316017225 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,$,,,,,,,,,,,,,,,,,,,,,,,,{{{,,,,,,,,,,,,,,,,,,,,,,{,,,,,,,,,,,,,,,,,{,,,{,,,,,,,,,,,,{,,,,,, {,{|l:,,,,,d{,,22:,,:{{,,{{:2:29,,,{,,: ,,,,,,,,,,,{{,,,,,,,,,,,,,,,,,,,ش,,,,,,,,,,,,,,س,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,/RKSK,,,,,,,,,,,,,/Rff,,,,,,,,,,q.RSR/RSR:: e,,,,,,,,,SS/&SS/SRK22:::,,,,,,,,,,SSS&&K&KK,: 2,,,,,,,,,&&&&&&K,,2 : ,,,,,,,,SqK,,,:2 2,,,,,,,,|,,,:2,,,,,,,,,|:1,,,,,,,,,,,,,罽|:|:m,,,,,,,,,,,,,|ee|:d,,,,,,,,,,,,::,,,,,,,,,,,羼,,,,,,,,,,,,,|||{,,,,,,,,,,,,,,  |,,,,,,,,,,,,,,,,,aad,,,,,,,,,,,,,,,,,2 :aaaf ,,,,,,,,,,,,,,,,,,  :2: ,,,,,,,,,,,,,,,,,a ,3aaa,,,,,,,,,,,,,,,,,,,a,,,a,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr2.bmp0100644000175000017500000000376606604044316017071 0ustar aaronlaaronlBM6((hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,{{{{,{{,,,,,,,,,,{{,,,,,,,,,,,,,,,,,,{{{{{{,,,,,,,,{{,,,,,,,,,,{,,,,,,,,,,,,e:ee,,,,,,,,,,,,,,ee,,,,,,,,,,,,,ee::::,,,,,,,,,,,,,2e,,,,,,,,,,,,e,,,,,,,,,,,,,ش,,,,,,,,,,,,,,,,,,,,,,,S,,,,,,,,,,,S/R,,,,,,,,,,,qR,,,,,,,,,,,,q&&zzz,,,,,,,,,,,S&S&SJ,,,,,,,,,,,&S&&/K,,,,,,,,,,&S/JJ&299,,,,,,,,,q/&&&J9299,,,,,,,&SJJ92,,,,,,,|:1|:2,,,,,,,罽|:|:|22,,,,,,,,|ee|2:9,,,,,,,::9219,,,,,,,,羼29999,,,,,,,,292,,,,,,,,,,92,,,,,,,,,,,,,,,,,,,,,,,,,,,,e> 22:,,,,,,,,,,,,,,,  : ,,,,,,,,,,,,,,, : ,, ,,,,,,,,,,,,,,,, ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr25.bmp0100644000175000017500000000340606604044316017145 0ustar aaronlaaronlBM6(&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U{{{{,,,99/2229/,,,,,,,,,,{,,,2/1/2///9,,,,,,,,/,2992229//,,a,,,,{{{,929/92/a2 ,,,, 2:1|&&JJ/| ,a,,,,,/ / R/S&JKJ/::3,,,,,, :/&J/S//://a,,,,,,,{//:/&q/&&|/| aa:a,,,,,,,,,2/:S///&/|:/|a2a,,,,,,,,22/eS///S&1/| f/a,,,,,,,,,,:::eسR////&S,:|| ,,,,,,,,,,,/::9,z////,,,,,,d{d,,,,,,,,,,,,,,22/,,,,,,,,,,,,,,,,,,,,,,,,,,,,:2e,,,,,,,,,,,,,,,,,,,,,,,,,e,,,,,,/////,,,,,,,,,,,,,,,,,,,//,,,/////,,,,,,,,,,,,,/,,,,,,,,,,//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr2b.bmp0100644000175000017500000000376606604044316017233 0ustar aaronlaaronlBM6((hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,{{{{,{{,,,,,,,,,,{{,,,,,,,,,,,,,,,,,,{{{{{,,,,,,,,,{,{,,,,,,,,,{,,,,,,,,,,,,e:ee,,,,,,,,,,,,,,ee,,,,,,,,,,,,,ee::::,,,,,,,,,,,,,e9:2e,,,,,,,,,,,,ഴ:e,,,,,,,,,,,,,ഴe,,,,,,,,,,,,,,,,,,,,,,S,,,,,,,,,,,S/R,,,,,,,,,,,qR,,,,,,,,,,,,q&&z,,,,,,,,,,,,S&S&SJJ,,,,,,,,,,,&SS&/KJ,,,,,,,,,,qS/JJ2299,,,,,,,,,q/q&&9299,,,,,,,&|92,,,,,,,|:1|:2,,,,,,,罽|:|:|22,,,,,,,,|ee|2:9,,,,,,,::9219,,,,,,,,羼29999,,,,,,,,292,,,,,,,,,,92,,,,,,,,,,,,,,,,,,,,,,,,,,,,e> | 22:,,,,,,,,,,,,,,,  :, ,,,,,,,,,,,,,,, , ,3,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr2c.bmp0100644000175000017500000000376606604044316017234 0ustar aaronlaaronlBM6((hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,{{{{,{{,,,,,,,,,,{{,,,,,,,,,,,,,,,,,,{{{{{,,,,,,,,,{{,,,,,,,,,,{,,,,,,,,,,,,e:ee,,,,,,,,,,,,,,ee,,,,,,,,,,,,,ee::::,,,,,,,,,,,,,9:2e,,,,,,,,,,,,e,,,,,,,,,,,,,ش,,,,,,,,,,,,,,,,,,,,,,Sz,,,,,,,,,,S/Rz,,,,,,,,,,,qR,,,,,,,,,,,,q&&qzz,,,,,,,,,,,,SS/&SJJ,,,,,,,,,,,&&&&/K&,,,,,,,,,,&&/JJ&999,,,,,,,,,q/&&&JJ299,,,,,,,&SJ92,,,,,,,|:1|:2,,,,,,,罽|:|:|22,,,,,,,,|ee|2:9,,,,,,,::9219,,,,,,,,羼29999,,,,,,,,292,,,,,,,,,,92,,,,,,,,,,,,,,,,,,,,,,,,,,,,e  :2:,,,,,,,,,,,,,, ,3 ,, ,,,,,,,,,,,,,,,,:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr2d.bmp0100644000175000017500000000376606604044316017235 0ustar aaronlaaronlBM6((hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,{{{{,{{,,,,,,,,,,{{,,,,,,,,,,,,,,,,,,{{{{{{,,,,,,,,{,,,,,,,,,,,{,,,,,,,,,,,,e:ee,,,,,,,,,,,,,,ee,,,,,,,,,,,,,ee::::,,,,,,,,,,,,,e9:2e,,,,,,,,,,,,ഴe,,,,,,,,,,,,,ش,,,,,,,,,,,,,,,,,,,,,,,S,,,,,,,,,,,S/Rz,,,,,,,,,,,qR,,,,,,,,,,,,q&&z,,,,,,,,,,,,S&/&SJJ,,,,,,,,,,,&S&&/KJ,,,,,,,,,,///JJ&299,,,,,,,,,//q&&&9299,,,,,,,&S|92,,,,,,,|:1|:2,,,,,,,罽|:|:|22,,,,,,,,|ee|2:9,,,,,,,::9219,,,,,,,,羼29999,,,,,,,,292,,,,,,,,,,92,,,,,,,,,,,,,,,,,,,,,,,,,,,,e>  3 :,,,,,,,,,,,,,,, :, ,,,,,,,,,,,,,, ,2 ,3,,,,,,,,,,,,,,,,,::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr4.bmp0100644000175000017500000000422606604044316017063 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,  ,,,,,,, ,,,,,,{,,,,,{{,,,,{{,,,,,{ ,, {{{,,,,,{{,,{{,,,,,,,2 ,, {{,,,,,,,mm,,,潽m:,,,,,,,,::,,,:22,,,,,,,,::,|::,,,,,,,,,嶶,,,,,,,,,ش,,,,,,,,,cc,,,,,,,,,,,س,,,,,,,,,,,,,SS'q/SS,,,,,,,,,,,,,,zSSS'q/SSz,,,,,,,,,,,,,ڵ,,,,,,,,,,,qq,,,,,,,,,,S/"'zz//,,,,,,,,zSRyzzzR,,,,,,,,z/zzz29zJS,,,,,JS&qf22zS,,,,::K/&Sm||zJr,22JJz1m;2zSq:::9rzRSedRrz 2:1:2:,,ڴJJz,2:::,,zr,,,921, ||||{,,m2::2,=|  |,2,22:,,:,:29,2:92:f2 : aaf:2:2,,2:2,,,e  :2:,:2:,,,,,,,,,, ,3 ,, ,,罾,,,,,,,,,,,,,,:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr4b.bmp0100644000175000017500000000422606604044316017225 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,  ,,,,,,, ,,,,,,{,,,,,{{,,,,{,{,,,,{ ,, {{{,,,,,{{,,{{,,,,,,,2 ,, {{,,,,,,,mm,,,潽m:,,,,,,,,::,,,:22,,,,,,,,::,:,,,,,,,,,嶶ش,,,,,,,,,ش,,,,,,,,,cc,,,,,,,,,,,,SS,,,,,,,,,,,,,zSSS''q/SS,,,,,,,,,,,,,,zSSS'q/SSz,,,,,,,,,,,,,ڵ,,,,,,,,,,,qq,,,,,,,,,,S/""z/SS,,,,,,,,zSRyzzzS,,,,,,,,z/zzz29zJS,,,,,JS&qf22zS,,,,::K/&Sm||zJr,22JJ&z1m;2zSq:::9zJedRrz 2:1:2:,,JSS,2:::,,,,,921, ||||{,,m2::2,=|  |,2,22:,,::,:29,2:92:f2 :3 af:2:2,,2:2,,,e>  3 :,:2:,,,,,,,,,,, :, ,,罾,,,,,,,,,,,, ,2 ,3,,,,,,,,,,,,,,,,,,,,,::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr4c.bmp0100644000175000017500000000422606604044316017226 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,  ,,,,,,, ,,,,,,,{,,,,{{,,,,{,{,,,,{ ,, {{{,,,,,{{,,{{,,,,,,,2 ,, {{,,,,,,,mm,,,潽m:,,,,,,,,::,,,|:22,,,,,,,,::,::,,,,,,,,,ⶶض,,,,,,,,,ش,,,,,,,,,,cc,,,,,,,,,,,,س,,,,,,,,,,,,,zS/SS,,,,,,,,,,,,,,zSSSS'qSSz,,,,,,,,,,,,,ڵ,,,,,,,,,,,q,,,,,,,,,,S"///S,,,,,,,,zSyzzzRS,,,,,,,,z/zzz29zJS,,,,,JS&qf22zS,,,,::K/&Sm||zJr,22JJ/&1m;2zSq:::9JzrJedRrz 2:1:2:,,rSrr,2:::,,,,,921, ||||{,,m2::2,=|  |,2,22:,,,:29,2:92:f2 :2 af::2:2,,2:2,,,e> 22:,:2:,,,,,,,,,,,  :, ,,罾,,,,,,,,,,,,,  ,, ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr4d.bmp0100644000175000017500000000422606604044316017227 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,  ,,,,,,, ,,,,,,,{,,,,{{,,,,{{,,,,,{ ,, {{{,,,,,{{,,{{,,,,,,,2 ,, {{,,,,,,,mm,,,潽m:,,,,,,,,::,,,|:22,,,,,,,,::,::,,,,,,,,,ⶶض,,,,,,,,,cش,,,,,,,,,cc,,,,,,,,,,,س,,,,,,,,,,,,zSSS'q,,,,,,,,,,,,,,zSSS'q//SS,,,,,,,,,,,,,ڵ,,,,,,,,,,,qq,,,,,,,,,,S/z///S,,,,,,,,zSRyzzRSS,,,,,,,,z/zzz29zJS,,,,,JS&qf22zS,,,,::K/&Sm||zJr,22JJz1m;2zSq:::9JzredRSz 2:1:2:,,Srz,2:::,,,,,921, ||||{,,m2::2,=|  |,2,22:,,,:29,2:92:2 :2aaff:2:2,,2:2,,e> | 22:::2:,,,,,,,,,,  :, ,,罾,,,,,,,,,,,, , ,3,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppr5.bmp0100644000175000017500000000422606604044316017064 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,{{{{{{,,,,{{{{{{,{{,,,,,{,,,{,,,,{,,,,{{,,,,{{,,,,,|,,,,|,,,,,,,,,,,,,,,,,,,,,,mm,,mm,,,,,,,,,,::,,::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,سس,,,,,,,,,,,cc,,,,,,,,,,eeSSee,,,,,,,e999zSSS'q/SSz999e,,,,,,229||ڵ||922,,,,,9922qq2299e,,,,e9S/"'zz//e9e,,,,29ezS/""z/SSze92,,,,2:JJSRyzzzSJJ:2,,,,,2K/&Sz29zJ&/K2,,,,,,,zJS&f22z&SJz,,,,,,,,,Kzzm||zzK,,,,,,,,,,z1m;2zK,,,,,,,,,,,ed,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ||||{,,,,,,,,,=|  |,,,,,:::,,,,,,,:f2 :3 afڽ:,,,,:,,,e>  3 :,:,,,,,,,,,,,, :, ,,罾,,,,,,,,,,,, ,2 ,3,,,,,,,,,,,,,,,,,,,,,::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Chopprd.bmp0100644000175000017500000000422606604044316017143 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,  ,,,,,,, ,,,,,,{,,,,,{{,,,,{{,,,,,{ ,, {{{,,,,,{{,,{{,,,,,,,2 ,, {{,,,,,,,mm,,,潽m:,,,,,,,,::,,,:22,,,,,,,,::,|::,,,,,,,,,嶶,,,,,,,,,ش,,,,,,,,,cc,,,,,,,,,,,س,,,,,,,,,,,,,SS'q/SS,,,,,,,,,,,,,,zSSS'q/SSz,,,,,,,,,,,,,ڵ,,,,,,,,,,,qq,,,,,,,,,,S/"'zz//,,,,,,,,zSRyzzzR,,,,,,,,z/zzz29zJS,,,,,JS&qm||S,,,,::K/&S1m;2zJr,22JJzedzSq:::9rzRSRrz 2:1:2:,,ڴJJz,2:::,, ||||{zr,,,921,=|  |,,m2::2,:,2,22:,,f22::aaf,:29,2:92:f2 : 2af:2:2,,2:2,,,e  :2:,:2:,,,,,,,,,, ,3 ,, ,,罾,,,,,,,,,,,,,,:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Chopprdb.bmp0100644000175000017500000000422606604044316017305 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,  ,,,,,,, ,,,,,,{,,,,,{{,,,,{,{,,,,{ ,, {{{,,,,,{{,,{{,,,,,,,2 ,, {{,,,,,,,mm,,,潽m:,,,,,,,,::,,,:22,,,,,,,,::,:,,,,,,,,,嶶ش,,,,,,,,,ش,,,,,,,,,cc,,,,,,,,,,,,SS,,,,,,,,,,,,,zSSS''q/SS,,,,,,,,,,,,,,zSSS'q/SSz,,,,,,,,,,,,,ڵ,,,,,,,,,,,qq,,,,,,,,,,S/""z/SS,,,,,,,,zSRyzzzS,,,,,,,,z/zzz29zJS,,,,,JS&qm||S,,,,::K/&S1m;2zJr,22JJ&zedzSq:::9zJRrz 2:1:2:,,JSS,2:::,, ||||{,,,921,=|  |,,m2::2,:,2,22:,,f2 ::a f:,:29,2:92:22 :3 af:2:2,,2:2,,,e>  3 :,:2:,,,,,,,,,,, :, ,,罾,,,,,,,,,,,, ,2 ,3,,,,,,,,,,,,,,,,,,,,,::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Chopprdc.bmp0100644000175000017500000000422606604044316017306 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,  ,,,,,,, ,,,,,,,{,,,,{{,,,,{,{,,,,{ ,, {{{,,,,,{{,,{{,,,,,,,2 ,, {{,,,,,,,mm,,,潽m:,,,,,,,,::,,,|:22,,,,,,,,::,::,,,,,,,,,ⶶض,,,,,,,,,ش,,,,,,,,,,cc,,,,,,,,,,,,س,,,,,,,,,,,,,zS/SS,,,,,,,,,,,,,,zSSSS'qSSz,,,,,,,,,,,,,ڵ,,,,,,,,,,,q,,,,,,,,,,S"///S,,,,,,,,zSyzzzRS,,,,,,,,z/zzz29zJS,,,,,JS&qm||S,,,,::K/&S1m;2zJr,22JJ/&edzSq:::9JzrJRrz 2:1:2:,,rSrr,2:::,, ||||{,,,921,=|  |,,m2::2,,2,22:,,f22:2aaf,:29,2:92:f2 :2 af::2:2,,2:2,,,e> 22:,:2:,,,,,,,,,,,  :, ,,罾,,,,,,,,,,,,,  ,, ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Chopprdd.bmp0100644000175000017500000000422606604044316017307 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,  ,,,,,,, ,,,,,,,{,,,,{{,,,,{{,,,,,{ ,, {{{,,,,,{{,,{{,,,,,,,2 ,, {{,,,,,,,mm,,,潽m:,,,,,,,,::,,,|:22,,,,,,,,::,::,,,,,,,,,ⶶض,,,,,,,,,cش,,,,,,,,,cc,,,,,,,,,,,س,,,,,,,,,,,,zSSS'q,,,,,,,,,,,,,,zSSS'q//SS,,,,,,,,,,,,,ڵ,,,,,,,,,,,qq,,,,,,,,,,S/z///S,,,,,,,,zSRyzzRSS,,,,,,,,z/zzz29zJS,,,,,JS&qm||S,,,,::K/&S1m;2zJr,22JJzedzSq:::9JzrRSz 2:1:2:,,Srz,2:::,, ||||{,,,921,=|  |,,m2::2,,2,22:,,2: 2aaff,:29,2:92:2 :22aaf:2:2,,2:2,,e> | 22:::2:,,,,,,,,,,  :, ,,罾,,,,,,,,,,,, , ,3,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppru.bmp0100644000175000017500000000422606604044316017164 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,  ,,,,,,, ,,,,,,{,,,,,{{,,,,{{,,,,,{ ,, {{{,,,,,{{,,{{,,,,,,,2 ,, {{,,,,,,,mm,,,潽m:,,,,,,,,::,,,:22,,,,,,,,::,|::,,,,,,,,,嶶,,,,,,,,,ش,,,,,,,,,cc,,,,,,,,,,,س,,,,,,,,,,,,,SS'q/SS,,,,,,,,,,,,,,zSSS'q/SSz,,,,,,,,,,,,,ڵ,,,,,,,,,,,qq,,,,,,,,,,S/"'zz//,,,,,,,,zSyzzzRS,,,,,,,,z/zzz||zJS,,,,,JS&qスzS,,,,::K/&Sf22ezJr,22JJzm;;zSq:::9rzRS1m;2Rrz 2:1:2:,,edJJz,2:::,,zr,,,921,,,m2::2, ||||{,2,22:,,=|  |,:29,2:92:::2:2,,2:2,,,e  :2:,:2:,,,,,,,,,, ,3 ,, ,,罾,,,,,,,,,,,,,,:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Chopprub.bmp0100644000175000017500000000422606604044316017326 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,  ,,,,,,, ,,,,,,{,,,,,{{,,,,{,{,,,,{ ,, {{{,,,,,{{,,{{,,,,,,,2 ,, {{,,,,,,,mm,,,潽m:,,,,,,,,::,,,:22,,,,,,,,::,:,,,,,,,,,嶶ش,,,,,,,,,ش,,,,,,,,,cc,,,,,,,,,,,,SS,,,,,,,,,,,,,zSSS''q/SS,,,,,,,,,,,,,,zSSS'q/SSz,,,,,,,,,,,,,ڵ,,,,,,,,,,,qq,,,,,,,,,,S/""z/SS,,,,,,,,zSyzzzRS,,,,,,,,z/zzz||zJS,,,,,JS&qスzS,,,,::K/&Sf22ezJr,22JJ&zm;;zSq:::9zJ1m;2Rrz 2:1:2:,,JedSS,2:::,,,,,921,,,m2::2, ||||{,2,22:,,=|  |:,:29,2:92:::2:2,,2:2,,,e>  3 :,:2:,,,,,,,,,,, :, ,,罾,,,,,,,,,,,, ,2 ,3,,,,,,,,,,,,,,,,,,,,,::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Choppruc.bmp0100644000175000017500000000422606604044316017327 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,  ,,,,,,, ,,,,,,,{,,,,{{,,,,{,{,,,,{ ,, {{{,,,,,{{,,{{,,,,,,,2 ,, {{,,,,,,,mm,,,潽m:,,,,,,,,::,,,|:22,,,,,,,,::,::,,,,,,,,,ⶶض,,,,,,,,,ش,,,,,,,,,,cc,,,,,,,,,,,,س,,,,,,,,,,,,,zS/SS,,,,,,,,,,,,,,zSSSS'qSSz,,,,,,,,,,,,,ڵ,,,,,,,,,,,q,,,,,,,,,,S"///S,,,,,,,,zSyzzzRS,,,,,,,,z/zzz||zJS,,,,,JS&qスzS,,,,::K/&Sf22ezJr,22JJ/&m;;zSq:::9JzrJ1m;2Rrz 2:1:2:,,edrSrr,2:::,,,,,921,,,m2::2, ||||{,2,22:,,=|  |,:29,2:92:::2:2,,2:2,,,e> 22:,:2:,,,,,,,,,,,  :, ,,罾,,,,,,,,,,,,,  ,, ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Chopprud.bmp0100644000175000017500000000422606604044316017330 0ustar aaronlaaronlBM6((`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,  ,,,,,,, ,,,,,,,{,,,,{{,,,,{{,,,,,{ ,, {{{,,,,,{{,,{{,,,,,,,2 ,, {{,,,,,,,mm,,,潽m:,,,,,,,,::,,,|:22,,,,,,,,::,::,,,,,,,,,ⶶض,,,,,,,,,cش,,,,,,,,,cc,,,,,,,,,,,س,,,,,,,,,,,,zSSS'q,,,,,,,,,,,,,,zSSS'q//SS,,,,,,,,,,,,,ڵ,,,,,,,,,,,qq,,,,,,,,,,S/z///S,,,,,,,,zSyzzzRS,,,,,,,,z/zzz||zJS,,,,,JS&qスzS,,,,::K/&Sf22ezJr,22JJzm;;zSq:::9Jzr1m;2RSz 2:1:2:,,edSrz,2:::,,,,,921,,,m2::2, ||||{,2,22:,,=|  |,:29,2:92::2:2,,2:2,,e> | 22:::2:,,,,,,,,,,  :, ,,罾,,,,,,,,,,,, , ,3,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/crawl-forward.bmp0100644000175000017500000000504606624340400020312 0ustar aaronlaaronlBM& 6((&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,뽽,,,,,~|dd```|,,,,,,,,,,,,~ddd|,,,,d`````~,,,,,,,,,,,d``d,,,|```d|,,,,,,,,,,,,~```d,,,~``d~,,,,,,,,,,,,,|d````~,,d`d,,,,,,,,,,,,,d````~,~`d||,,,,,,,d```~~d|`~,,,,,d``~~|d,,,~~,`|~~`~,,,,~`d,,|||`|,,|,,,,,~`d~,,潽~|||~,,,|,,,,,|dd|~,,,d,,,,,,,,~|`|,,,,,,~d```d,,,,,~~```d~,,,,,||~dd|,,,,,,~,,,,,,,,,,,,,~~~,,,,,,,,|d|,,,,,,,,,,뽽~~,,,,,,,,,,,,||,,,,,,,,,,,,,,뽽,,,,,,,,,,,,,,,,,~|||~,,,,,,,,,,,,,,,,,,,~`d~~~d```~,,,,,,,,,,,,,,,~d```~~dd````d~~|```d~d````d|~,~|d`````q`d`````d|,,,||d````||``d~~~|dd~,,,,,,~|||~~`~~d~|`|,,,,,,,,,|`dddd,,,,,,,,,,,,,|`~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/crawl-right-1.bmp0100644000175000017500000000575606624374504020145 0ustar aaronlaaronlBM 6(2&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|d|||,,,,,,,,,,,,,,~|~,,,,,,,,,,,,,,,,,,,,,,|d~d,,,,,,,,,,,d`|,,,,,,,,,d`,,,|`||,,,,,,,,,|``d,,,,,d|,,|`|,,,,,,,,|d`````|d,,,,d|||ddd,,,,,,,~d```````~d``~,,,,```d~|```d,,,,,,~``d~~|d~dd|``~,,,,`d``d|d``|~,,,,,,~``d~d``d~,,,,,,```d``~,,,,,,|`|~`|~,,,,,,~|`~~`d,,,,,,,d`~,~~,,,,|`|,,,,,,,,d`d,潽,,,,,|``~,,,,,,,,d``|,,,,,,,~```~,,,,,,,,||d~,,,,,,,,,~````~,,,,,,,,|~~dd潽,,,,,,,,,,d````~,,,~||``|,,,,,,,,,,d````~d``|```|,,,,,,,``,,d````~潽|`d~d````|,,,,,,,|````d~|dd|~`|~`````d,,,,,,d````~|d`d|~|```~d`|,,,,,~````||`d`~d``d``d~,,,|```dd~~`||``d```````~,,,,,,,~d``~d||d~~|````|`````dq,,,,,,,,,|`d||``||`|~ddd`````~d````,,,,,,,,,,~|d```||```dd```d|~|``|````|~,,,,,,,,,,,,~|d````````dd``||``d|`|,,,,,,,,,,,,,,,~~~~~~~d`d~`d||`|,,,,,,,,,,,,,,,,,,~``~d~~d~,,,,d`,,,,,,,,,,,,,,,,,,|d~~|,,,``,,,,,,,,,,,,,,,,,,,,,,,,,,~|~~,,,``,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,d`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/crawl-right-2.bmp0100644000175000017500000000575606624374502020144 0ustar aaronlaaronlBM 6(2&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|d|||,,,,,,,,,,,,,~d,,,,,,,,,,,,,,,,,,|||d,,,,,,,,,,,d`|,,,,,,,,,d`,,~~|`~d,,,,,,,,,~|``d,,,,,d|,d~|dd,,,,,,,,~|d````dd|,,,,,d|,|`~dddd,,,,,,,|```````d~d``,,,,``,~`~d```d,,,,,,|``d~~~d|~`~d``,,,,`d,~d`d|,,,,,,|``d~~````,,,,,,,,~``~,,,,,d`|~`~|d|,,,,,,,,,,|`|,,,,``~,|,,,,,,,,,,d`~~d~,,,,d`|,,,,,,,,|``d``,,,```~뽽,,,,,,,|``````,,,d||~~,,,,,,,,|````d`|,,,,||d|,,,,,,,,,,`````~~|~~|``~뽽,,,,,,,,,````d~``d~~d```~,,,,,,,``,,````dd`d``````|,,,,,,,,|````ddd~`~~`|``````d,,,,,,~`````dd~`||````~``|,,,,,,|````~|d`d~``d```|,,,,d```|~`|`~d``|```````,,,,,,,~d`d~`|dd~|```dd`````~q,,,,,,,,,~d`d|d``~d`|~`dd``````````,,,,,,,,,,~||d```|d```d````d~~|``|````~,,,,,,,,,,,,~|dd````````|~```||``||d|,,,,,,,,,,,,,,,~~~~~~~~``||`d||`|,,,,,,,,,,,,,,,,,,~```~d,,,,d`,,,,,,,,,,,,,,,,,,dd~|~|,,,``,,,,,,,,,,,,,,,,,,,,,,,,,,||,,,``,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,d`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/crawl-right-3.bmp0100644000175000017500000000575606624374502020145 0ustar aaronlaaronlBM 6(2&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|d|||,,,,,,,,,,,,,~d,,,,,,,,,,,,,,,,,,|||d,,,,,,,,,,,d`|,,,,,,,,,d`,,~|`~d,,,,,,,,~|``d,,,,,d|,,,|dd,,,,,,~|d````dd|,,,,,d|,,,,dddd,,,,|```````d~d``,,,,``,,,,,d```d,,|``d~~~d|~`~d``,,,,`d,,,,,d`d||~,,|``d~~````,,,,,,,,,,,~``~dd,,d`|~`~|d|,,,,,,,,,,,,|`|d`d,,``~,|,,,,,,,,,,d`~|``~,,d`|,,,,,,,,|``d`d,,```~潽,,,,,,,|```|``|,,,d||~,,,,,,,,|````d`d,,,||d~,,,,,,,,,,`````~~|~~|``潽,,,,,,,,,````d~``d~d```~,,,,,,,``,,````dd`d~`````|,,,,,,,,|````ddd~`~~`|``````d,,,,,,~`````dd~`|||```~``|,,,,,,|````~|d`d~``d```|,,,,d```|~`|`~d``|```````,,,,,,,~d`d~`|dd~|```dd`````~q,,,,,,,,,~d`d|d``~d`|~`dd``````````,,,,,,,,,,~||d```|d```d````d~~|``|````~,,,,,,,,,,,,~|dd````````|~```||``||d|,,,,,,,,,,,,,,,~~~~~~~~``||`d||`|,,,,,,,,,,,,,,,,,,~```~d,,,,d`,,,,,,,,,,,,,,,,,,dd~|~|,,,``,,,,,,,,,,,,,,,,,,,,,,,,,,||,,,``,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,d`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/crawl-right-4.bmp0100644000175000017500000000575606624374502020146 0ustar aaronlaaronlBM 6(2&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|d|||,,,,,,,,,,~d,,,,,,,,,,,,,,,,,,,,,,|||d,,,,,,,,d`|,,,,,,,,,d`,,,,,,|`~d,,,,,,~|``d,,,,,d|,,,,,,|dd~,,,,,~|d````dd|,,,,,d|,,,,,,dddd~,,,,|```````d~d``,,,,``,,,,,,d```d~,,,|``d~~~d|~`~d``,,,,`d,,,,,d`d|~,,,|``d~~````,,,,,,,,,,,~``~,,,d`|~`~|dd,,,,,,,,,,,,|`|,,,,``~,|뽽,,,,,,,,,,,d`~,,,,,d`|,,,,,,,,,|``,,,,,,```~,,,,,,,|```,,,,,,,d||~뽽,,,,,,,,|````,,,,,,,||d|,,,,,,,,,`````,,|~~|``潽,,,,,,,,,````d~``d~d```,,,,,,,``,,````dd`d``````|,,,,,,,,|````ddd~`~~`|``````d,,,,,,~`````dd~`||````~``|,,,,,,|````~|d`d~``d```|,,,,d```|~`|`~d``|```````,,,,,,,~d`d~`|dd~|```dd`````~q,,,,,,,,,~d`d|d``~d`|~`dd``````````,,,,,,,,,,~||d```|d```d````d~~|``|````~,,,,,,,,,,,,~|dd````````|~```||``||d|,,,,,,,,,,,,,,,~~~~~~~~``||`d||`|,,,,,,,,,,,,,,,,,,~```~d,,,,d`,,,,,,,,,,,,,,,,,,dd~|~|,,,``,,,,,,,,,,,,,,,,,,,,,,,,,,||,,,``,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,d`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/crawl-right-5.bmp0100644000175000017500000000575606624374504020151 0ustar aaronlaaronlBM 6(2&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,뽽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|dd||~,,,,,,,,,,뽽,,,,,,,,,,,,,,,,,,,,,,,,,~d``,,,,,,,,,~d|,,,,,,,,,,,,,,d`,,,,,,,|`d,,,,,,,d``,,,,,,,,,d|,,,,,,~`d,,,,,,~|d```~~,,,,,,d|,,,,~~`d,,,,~d``````~d`~,,,,,,``,,,~d``|,,,,|``ddd``d~|||``|,,,,,,`d,,~d```~,,,|``d~~~dd~``|,,,,,,,,,,d``dd,,,,~``|~d~d``|,,,,,,,,,,,|``|~~,,,,|`|d~||~,,,,,,,,,,,|``~~,,,,|`|,~,,,,,,,,,,,|``,,,,,|``~,,,,,,,,,|``,,,,,,|``d,,,,,,,,,|``,,,,,,,~d~|~꽽,,,,,,,,,,,|``,,,,,,~~|``꽽,,,,,,,,,,,|`d`~~~d``d,,,,,,,,,``,,,d`d|``~|d```d,,,,,,,,,,,d``~~|~~```````d,,,,,,,,,,d``~~`~dd|d``````~,,,,,,,,d``~~`~d`|``d~``~,,,,,,,|``d`~|`|d``````|||,,,,,,,~```~d|dd|```|``````q,,,,,,,,,~``|d`~|`||~~|`````````|q,,,,,,,,,,~|ddd``d~d``||d````dd``|````,,,,,,,,,,,~~|d``d````````d~d``````d~~,,,,,,,,,,,,,~~|ddddddd|d``|~|``dd`d,,,,,,,,,,,,,,,d`d`d|d,,,,,,d`,,,,,,,,,,,,,,d`~|~||,,,,,``,,,,,,,,,,,,,,,,,,,,,,,,,|d~~~,,,,,``,,,,,,,,,,,,,,,,,,,,,,,,~~,~,,,,,d`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/crawl-right-6.bmp0100644000175000017500000000575606624374500020146 0ustar aaronlaaronlBM 6(2&hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~d||ddd,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,``````,,,,,,,,,,,,,,,,,,,,,,,,d`,,,,,,,d`````,,,,,,,,,~`|,,,,,,,,,,,d|,,,,,,,|`````,,,,,,d`d,,,,,,,,d|,,,,,,,,|`````,,,,,~|d```~~,,,,,``,,,,,,,|`````,,,~d``````~d`~,,,,`d,,,,,,,~|````~,,,d``ddd``d|d``~,,,,,,|```,,|``d~~d~|``~,,,,,,d`|,,,|`d|d```~,,,,,,ddd||~~~d|,,,d`|~d|`,,,,,,d```````|~,,,,d`|,~,,,,,,,d`ddd```~,,,,,d``~,,,,,|~d``~,,,,,,d``|,,,,|``~,,,,,,,||~|,,,,|``~,,,,,,,~d`|뽽,,,,,``,,,,,d``~~`~~d``|,,,,,,,,,,,d``~d``|d```|,,,,,,,,,,,d``~|~|`d~`````d,,,,,,,,,,d``|``|d|~``````~,,,,,,,,d``~|d`d~|``|d`d~,,,,,,,,,|``|~`~d`~~``d~```d|~|,,,,,,,,``dd|~ddd``d```````Ɯ,,,,,,,,,~``|~dd|`~|~~d`````````~,,,,,,,,,,~dddd``d~~d`d||`````dd`dd````,,,,,,,,,,,~|d``dd````````|~d``````|~~~,,,,,,,,,,,~||ddddddd|d`d~~d``d``|,,,,d`,,,,,,,,,,,,d`|~`|~dd,,,,``,,,,,,,,,,,,,,,~`dd||,,,``,,,,,,,,,,,,,,,,,,,,,,,,,,,dd~~~,,,d`,,,,,,,,,,,,,,,,,,,,,,,,,,|~,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Dg5_a.bmp0100644000175000017500000000244606604100416016457 0ustar aaronlaaronlBM&6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U|,,,,,,||,,,,,,| |,,| |,,| || |||| ~~ |!| | ! | , | ! | ,,| q!!q |,, q ,, ,,| |,,| | |,,, ,,,, || ,,,, |,,| ,,,,, ,, ,,,xevil-2.02r2.orig/win32/res/Dg5_b.bmp0100644000175000017500000000244606604044316016466 0ustar aaronlaaronlBM&6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U|,,,,,,||,,,,,,| |,,| |,,| || |||| ! ! |!| | ! | , | ! | ,,| q!!q |,, q ,, ,,| |,,| | |,,, ,,,, || ,,,, |,,| ,,,,, ,, ,,,xevil-2.02r2.orig/win32/res/Dg_atd.bmp0100644000175000017500000000302606604044316016723 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,|,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,, , ,,,,, ,,,,,, ,,,, ,,,,, | ,,,, ,,,,, | q,,, ,,,,, | | | qqq| ,,,,,| | ! |,,,,,| |||| ||,,,,, | ||,, |, ,,, | ,,,,, | ,,,,,, | ,,,,,, ||,,,,,,, ,,,|,,,,,, |,,,|,,,,,,, |,,,|,,,,,,, |,,,,,,,,, ||,,,,,,,, ,,, ,,,,,,,, ,,,,, ,,,,,,, ,,,,,,, ,,xevil-2.02r2.orig/win32/res/Dog_att0.bmp0100644000175000017500000000302606604044316017202 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U|,,,,,,,,,,,,,| ,,|,,, |,|,,,,,,,,| ,|,,,,, |,,,,,,,| |,,,,,, |,,,,,| |,,,,,,, |,,,|| ||,,,,,,,,, ||,| |,,,,,,,,, || ,,,,,, | ,,,,,,, | , ,,,,, |!q,,,,,,, |q,,,,,,, ,,,, |q,,,,,,, ,,,,,,,,,, q , , ,,,,,,,,,,,, | ,,,,,,,,,,,,, ,,,,,,,,,,,, ||| |,,,,,,,,,,,, | | ,,,,,,,,,,,,,,, | ,,,,,,,,,,,,, ,|| ,,,,,,,,,,,,,,,,,, ,,,,,,,,xevil-2.02r2.orig/win32/res/Door1.bmp0100644000175000017500000000406606604044316016532 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U| || | | |||||||||||||||||||| || | || | | | | | | |||||||||||||||||||| || | | ||||| | |||||| | ||||||||||||||||||| | | ||||||||||||||||||||| ||||| | ||||||||||||||||||||| ||||| | ||||||||||||||||||||| ||||| | ||||||||||||||||||||| ||||| | |||||||||||||||||||| ||||| | | ||||||||||||||||||| ||||| | ||||||||||||||||||||| ||||| | ||||||||||||||||||||||||||| ||||| | ||||||||||||||||| |||| | | || | | | | | | | ||| | |||||||||||||||| ||||| | ||||||||||||||| |||| | | || | ||| | |||||||||||||||||| ||||| | | | | | | | ||| | ||||||||||||||||||||| ||||| | ||||||||||||||||||||| ||||| | |||||||||||||||||||| ||||| | | ||||||||| | |||||||||||||||||||||||||||| | |||||||||||||||||||||||||||| | |||||||||||||||||||||||||||| | |||||||||||||||||||||||||||||||xevil-2.02r2.orig/win32/res/Endblok.bmp0100644000175000017500000000406606604044316017124 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U||||| ||||| || ||||| ||||||||||| |||||||||| |||| || |||||||| |||| || |||||||| || |||||| |||| || ||||| |||||||||| |||||||| ||||| |||||| || ||| |||| ||| ||| | || || || | | | |||| ||| || | | ||| || | | | || | || | | |||||||| | | | |||| ||| || | | |||| ||| | | | |||||||| || | | || | | | | ||| || || | | |||| ||| | | ||| ||| ||||||||| |||||||||| ||||||| ||||||||||||||||| || ||||||| || ||||| ||| ||||||||||||| ||||| ||| |||||||| ||| | |||||||| || |||||| || || ||||| || ||||||| |||||||||||||||||||| xevil-2.02r2.orig/win32/res/Enf_0a.bmp0100644000175000017500000000566606604044316016645 0ustar aaronlaaronlBM 6( <hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,, , , , , , , , , , , , ,, ,,, ,|||||zzzzzzzzz|,,,,, yRRRRRzR  |, ,| zzzzRR"yy || , | yyyzRR | || | |,,| || ||||RRRyR || | | yyy"R | | |,,| y""""RRz | |||| ,,, yyRRRRRRR"Rz || |, , ,|||RRRRRR"RRR"R ||| ,,,,,,, , ,JR||R""" ||| ,,,,,,,,,,,""""""ٴ,, || ,,,,,,,,,,, | ,, ,,,, ||| ,,,,,,,,,,, | ,,, , || ,,,,,,,,,,,, ||, , || ,,,,,,,,,,,, ,,,,,,,,,,,,,,,|}, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ٽٽٽ},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,ڴدᴴ,,,,,,,,,,,,,,, 潱潴,,,,,,,,,,,,,,,,||},,,,,,,,,z, | 絴}},,,,,,,z,,,z,||統,,,,,,,,|k,z潱| 絵,,,,,,,,,,| ,kz||絵,,,,,,,,,,,,,, k潽統,,,,,,,,,,,,, , ,, , } , , , || 洴|||| | || | }ώ | , | || ᴴ | , | | ᴴٴ|||| || | |||| | 洯 | , || } | , |潴||||,,||nn}} , , ,TT | |nnn , , ,,,,,|| ,,,,,,,,,,,, |n ,,,,,,,,,,,TT}} ;;,,,,,,,,,,,,,,|}ش n ;;,,,,,,,,,,,,,,شٯ n n,,,,,,,,,,,,,TT }ش{}T,,,,,,,,,,,,,,,,|潽|||,,,,,,,,,,,,,,,|ٽ| |,,,,,,,,,,,,,,||{{| ,,,,,,,,,,,,,,| } T,,,,,,,,,,,,,,,,,,Tڽ TT,,,,,,,,,,,,,,,,,,,z,|TTT,,,,,,,,,,,,,,,,z,,ڽT T ,,,,,,,,,,,,,,,,z,k ||,,,,,,,,,,,,,,,,zk,,ڽ/&,,,,,,,,,,,,,,,,kzz,/ || ,,,,,,,,,,,,,,,,kk ||,,,,,,,,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,,, | ,,,,,,,,,,,,,,,,,,,,, , ,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Enf_0b.bmp0100644000175000017500000000566606604044316016646 0ustar aaronlaaronlBM 6( <hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,, ,, , , , , , , , , , , , ,,,,,,,||||zzzzzzzzz||, , ,| qRRRRRzR  ,,, zzzzRR"yy || |,,| | yyyzRR | || | || ||||RRRyR || | |,,| | yyy"R | | , y""""RRz | |||| |, ,| yyRRRRRRR"Rz || ,,,,,||yRRRRRR"RRR"R ||| , ,,, ,, , RR||R""" ||| ,,,,,,,,,,,""""""ٴ,, || ,,,,,,,,,,, | ,, ,,,, ||| ,,,,,,,,,,, | ,,, , || ,,,,,,,,,,,, ||, , || ,,,,,,,,,,,, ,,,,,,,,,,,,,,,|}, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ٽٽٽ},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,ڴدᴴ,,,,,,,,,,,,,,, 潱潴,,,,,,,,,,,,,,,,||},,,,,,,,,z, | 絴}},,,,,,,z,,,z,||統,,,,,,,,|k,z潱| 絵,,,,,,,,,,| ,kz||絵,,,,,,,,,,,,,, k潽統,,,,,,,,,,,, , , ,, }, , , , || 洴||||| , | || | }ώ |, | || ᴴ | | | | ᴴٴ|||| || |||| | 洯 | | ,, || } |潴||||| ||nn}}n , , ,,TT | |nn , ,,,,,,,|| ,,,,,,,,,,,, |n ,,,,,,,,,,,TT}} ;;,,,,,,,,,,,,,,|}ش n ;;,,,,,,,,,,,,,,شٯ n n,,,,,,,,,,,,,TT }ش{}T,,,,,,,,,,,,,,,,|| |,,,,,,,,,,,,,,|| ,,,,,,,,,,,,,,||{{,,,,,,,,,,,,,,,,| } TTT,,,,,,,,,,,,,,,,,,,Tڽ ,,,,,,,,,,,,,,,,,,,,,,,z,|TTT,,,,,,,,,,,,,,,,z,,ڽT T ,,,,,,,,,,,,,,,,z,k ||,,,,,,,,,,,,,,,,zk,,ڽ"",,,,,,,,,,,,,,,,kzz,"R || ,,,,,,,,,,,,,,,,kkR ||,,,,,,,,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,,, | ,,,,,,,,,,,,,,,,,,,,, , ,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Enf_0c.bmp0100644000175000017500000000566606604044316016647 0ustar aaronlaaronlBM 6( <hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,, , , , , , , , , , , , ,, ,,, ,|||||zzzzzzzzz|,,,,, yRRRRRzR  |, ,| zzzzRR"yy || , | yyyzRR | || | |,,| || ||||RRRyR || | | yyy"R | | |,,| y""""RRz | |||| ,,, yyRRRRRRR"Rz || |, , ,|||RRRRRR"RRR"R ||| ,,,,,,, , ,JR||R""" ||| ,,,,,,,,,,,""""""ٴ,, || ,,,,,,,,,,, | ,, ,,,, ||| ,,,,,,,,,,, | ,,, , || ,,,,,,,,,,,, ||, , || ,,,,,,,,,,,, ,,,,,,,,,,,,,,,|}, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ٽٽٽ},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,ڴدᴴ,,,,,,,,,,,,,,, 潱潴,,,,,,,,,,,,,,,,||},,,,,,,,,z, | 絴}},,,,,,,z,,,z,||統,,,,,,,,|k,z潱| 絵,,,,,,,,,,| ,kz||絵,,,,,,,,,,,,,, k潽統,,,,,,,,,,,, , , ,, }ٽ , ,, || 洴|||| | || | }ώ | | || ᴴ | , | | ᴴٴ|||| || |, |||| | 洯 | , || } | |潴|||| ,||nn}}ٽ , ,,,,TT | |nn , ,,,,,,|| ,,,,,,,,,,,, |n ,,,,,,,,,,,TT}} ;;,,,,,,,,,,,,,,|}ش n ;;,,,,,,,,,,,,,,شٯ n n,,,,,,,,,,,,,TT }ش{}T,,,,,,,,,,,,,,,,|| |,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,||{{ٯTT,,,,,,,,,,,,,,,,,| } T,,,,,,,,,,,,,,,,,,,,,,,Tڽ ,,,,,,,,,,,,,,,,,,,,,,,z,|TTT,,,,,,,,,,,,,,,,z,,ڽT T ,,,,,,,,,,,,,,,,z,k ||,,,,,,,,,,,,,,,,zk,,ڽ,,,,,,,,,,,,,,,,kzz,' || ,,,,,,,,,,,,,,,,kk' ||,,,,,,,,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,,, | ,,,,,,,,,,,,,,,,,,,,, , ,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Enf_0d.bmp0100644000175000017500000000566606604044316016650 0ustar aaronlaaronlBM 6( <hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,, ,, , , , , , , , , , , , ,,,,,,,||||zzzzzzzzz||, , ,| qRRRRRzR  ,,, zzzzRR"yy || |,,| | yyyzRR | || | || ||||RRRyR || | |,,| | yyy"R | | , y""""RRz | |||| |, ,| yyRRRRRRR"Rz || ,,,,,||yRRRRRR"RRR"R ||| , ,,, ,, , RR||R""" ||| ,,,,,,,,,,,""""""ٴ,, || ,,,,,,,,,,, | ,, ,,,, ||| ,,,,,,,,,,, | ,,, , || ,,,,,,,,,,,, ||, , || ,,,,,,,,,,,, ,,,,,,,,,,,,,,,|}, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ٽٽٽ},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,ڴدᴴ,,,,,,,,,,,,,,, 潱潴,,,,,,,,,,,,,,,,||},,,,,,,,,z, | 絴}},,,,,,,z,,,z,||統,,,,,,,,|k,z潱| 絵,,,,,,,,,,| ,kz||絵,,,,,,,,,,,,,, k潽統,,,,,,,,,,,, , , ,,, }ٽ , , , || 洴||||| | || | }ώ | | || ᴴ | | , | | ᴴٴ|||| || , |||| | 洯 | | , || } |潴||||| ,||nn}}ٽ , ,,,TT | |nn , , ,,,,,|| ,,,,,,,,,,,, |n ,,,,,,,,,,,TT}} ;;,,,,,,,,,,,,,,|}ش n ;;,,,,,,,,,,,,,,شٯ n n,,,,,,,,,,,,,TT }ش{}T,,,,,,,,,,,,,,,,|| |,,,,,,,,,,,,,,|| ,,,,,,,,,,,,,,||{{,,,,,,,,,,,,,,,,| } TTT,,,,,,,,,,,,,,,,,,,Tڽ ,,,,,,,,,,,,,,,,,,,,,,,z,|TTT,,,,,,,,,,,,,,,,z,,ڽT T ,,,,,,,,,,,,,,,,z,k ||,,,,,,,,,,,,,,,,zk,,ڽ"",,,,,,,,,,,,,,,,kzz,"R || ,,,,,,,,,,,,,,,,kkR ||,,,,,,,,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,,, | ,,,,,,,,,,,,,,,,,,,,, , ,,,,,,,,,,,,,,,,,,,,,,,,,,, , ,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Enf_5.bmp0100644000175000017500000000566606604044316016511 0ustar aaronlaaronlBM 6( <hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,||||||||||||,,,,|||||||||||,,, | | || |||||||||| || |||||||||| | | |||||||||| |||||||||| | || | || | ,, | |||| , |||| ,,, |||ώ||| ,,,,,, ||| ||| ,,,,,,,,,,, |||| |||| ,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,}},,,,,,,,,,,,,,,,洴潽ᴴ,,,,,,,,,,,,,,,,}ᴴᴴ},,,,,,,,,,,,,,,,ᴴ,,,,,,,,,,,,,,,}},,,,,,,,,,,,,,|ش|,,,,,,,,,,,,,| }}د |,,,,,,,,,,,,|,,|,,,,,,,,,,,,| 籵 |,,,,,,,,,,,,,絵,,,,,,,,,,,,,,潽nn,,,,,,,,,|,,,,nᵵn,,,,|,,, ,nnnnnn, , ,nnnnn nn nnnnn, |||nn n;;n nn||| n ;;n | |   | | n ;; n ||||  ;;  ᴯ||||n ;; n , ; ; , ,||nn;;;;nn||,,, ;; ;; ,,,n;; ;;n,,}}د; ;}},,洴} ; ; }ش,,洴nn nn nnشٯ,T}洴}}ش}T,,ཽ||||||,,,,,ٯ| |,,,,,,{{| |{{,,,,,,T,,,}||},,,T,,,,,,,,,,, TTTT ,,,,,,,,,,,,,,,,|TTTT|,,,,,,,,,,,,,,,,,|  TT  |,,,,,,,,,,,,,,,,,, |潽| ,,,,,,,,,,,,,,,,,,,/&&/潽,,,,,,,,,,,,,,,,,,,/ /,,,,,,,,,,,,,,,,,,, || ,,,,,,,,,,,,,,,,,,,||| |||,,,,,,,,,,,,,,,,,, || || || ,,,,,,,,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Squanch_.bmp0100644000175000017500000004006606647455212017317 0ustar aaronlaaronlBM6@6(`<hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,                ////    /////     /////      /////      ///      /                                                                                                                                                                                                                ,,,,,,,,xevil-2.02r2.orig/win32/res/fwbackgr.bmp0100644000175000017500000004206606631174602017340 0ustar aaronlaaronlBM6D6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**UơʥơʥʥʥʥʥʡʥʥʥƝ便ʥʥʥʥʥƙ便ʥʥʥʥʥƝʥʥ¡ʥʥʥʥʥʥ¡ʥʥʥʥʥʥʥʥơʥʥʥʥʥʥơ便ʥʥƝʥƝ롡便ʥʥʥƝʥơʥʥʡʥƝʥơƝʥʥʡʥʥơơʥʥʡʥʥơʥʥƝơʥơʥʥʥơʥʥʥʡʥ便ʥʥʥʥʥʥʡʥʥʡƝʥʡ¡Ɲʥʡ¡ʥʡ¡ʥʥʡʥʥʥʝʥʝʥʥʝʥƝ¡ʥơƝ便ʥƙʡʥʥ¡Ɲʡƥʥ¡ơʡʡʥʥ¡ʥ¡ơʥʥʥơƝơʥʥʥʡ¡ʥ¡ơʥʥʥʥ¡ʥ¡ơʥʥʥơʥ¡便ʥʥʥ¡便ʥʡʥ¡便ʥʥ¡ʥ¡ʥʥƝʥ¡ƥ¡ƥʥʥʥ¡ƥ¡ʥʥʡƥ¡ʥʥƥ¡ʥ便ť¡ơ便ʥťơʥʥ便¡便ʥʥʥ便¡ʥ便ʥ便¡ʥʥ便¡ʥʥ便¡ʥƥʥ¡ƥʥ便ʥ¡ʥʥʥ¡ʥʥ¡ʥʥơʥʡʥƥʥʡ便¡ťʥʡʥťʥʥ便ʥʥơʥʥ¡ʥƥʥơ롥ʥʥơ¡ƥʥƥơʥ便ʥƥʥʥƥ¡ʥ便ƥơʥťʥ便ʥƥʥ便ʥ¡ƥʥ便ʥơʥ便Šƥʥʥʥʥšơʥ便ťʥʥʥʥ便ƥʥʥʥƥơʥ롥ʥʥƥơʥʥʥʥʡʥƥƥʥƥʥʥ력ƥ便ƥʥʥ롥륥ʥʥʥʥʥʥʥʥʥʡơʥʥʥ력ʥʥʥʥƥƝʥƥʥơʥʥʥ便렡ʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥƥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥ便ʥʥ率ʥƝʥƝʥʥšƥšʥʥʥʥťʥʥơʥʥơƥʥʥʥƥʥơʥơʥʥƥʥƥʥʥơʥʥ륥ʥƥƥƥʥʥʥʥʥʥ륥ƥƥʥʥʥ롥ʥƝ便ʥʡʥƝʥʥƥʥʥʥơʥťʥʥʥxevil-2.02r2.orig/win32/res/Hblok.bmp0100644000175000017500000000406606604044316016605 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Ummm>99999999999999999999999999>>mmFm>m>m>9>>mm9999999999999Fmmmmm9m>Fm9mmm>FmqF9>m999>9m99q9mq99q9q9>m>q99m999m9m99q9m9q9>q9q99m9mmq9m99>9>>>>m9>q>99m99m9mmmmmmqmqmmqm9m9m9mmmmmmq9m>>mmmm9mmmmm9m9mmmmmmq9m>>>>m>9mmmmm9m>mmmmmFqmmmqmmmq>9mmmmm9m9mmmqmmmmmmmmmmmmq99>mmm9m9mmqq>>mmmm>>99mmmm9>mm9m>mm9>mmmmmmqm>mmmmmm9mm9m9mm9mm>>>mmm>mmm>>mmm>mm9m>mm9>>mmm>9Fmmm>mm9>m9mm9m>mm9mqmm9mmqm>9>mm9m>mm>mmmm9>mm>mmm9q9mm9m>mm99mmmmq>mmFmmmm>9mm9m>mm>9>mmmq9m>>mmmm99mm9m>mm>m9>mmmm>mm9>mmmm>9mm9m>mm9mm999mmmmq999mm>Fmm9m>mmm9mmmmmmq>mmm9m>mmm99mmmmmmmmmmmmmmmq>mmmm9m>mmm9=mmmmmmmmmmmmmmmm>>>m>m>m9>9q99mmmmmmmmmmmmmmm>m999mmqm9mm>9>mmmmmmm>Fmmm9>mq>9m9mmmq999>9>9>mqm9>m99mm9>mFmmmmmmm>mqm>mmmm>>9>99999999999>9>>mm9>m>mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmxevil-2.02r2.orig/win32/res/Heir2.bmp0100644000175000017500000002550606604044316016521 0ustar aaronlaaronlBMF+6(dd'hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U¾¾™™¾¾ƾ¾¾ƾ뾙™™¾¾¾뙾¾뙙¾ƾ¾¾뙙¾™ƙ¾뙾™ƙ뙾뙾™¾¾™™ƾƾ¾¾¾™™¾™ƾ¾™¾™™ƾ™™뙙ƾ™ƾ™™ƙ¾ƾ뙙뾙™¾¾™뙙뙙¾¾™™™뙙뙙ƙ¾¾ƙ™™™™뙙™¾¾뾾¾™™ƙ¾™ƾ™¾¾뾾¾¾™™™™¾™™ƾ¾™¾뾾¾¾™뙙ƙƾ뾾™ƙ™뙙¾¾¾™¾¾™™¾™™™¾ƾ¾™뙙™¾뾾뾾뾾뙾¾뾙뾙™™¾ƾ¾¾뾾뙙¾™¾뙙™™뙙™™뙾ƾ™™™™ƾƾ¾™¾™¾™¾¾™¾¾™™™¾ƾ¾¾뙙™¾™™™¾™™ƙ¾™™™뙾¾¾뙙™™™™ƙ™™™™¾¾™™뾾¾뾾¾™™™™™¾¾¾¾¾™™¾¾¾¾¾뾙¾™ƾ¾¾¾™¾ƾƾ¾™¾ƾ¾¾¾™ƾ뙙¾¾¾¾ƾ¾¾¾ƙ¾뾾¾¾¾¾¾¾¾¾ƾ¾¾¾¾¾ƾ뾾™ƾ¾¾뙾™¾¾¾¾¾¾¾뾾¾뾾¾¾¾¾¾¾¾¾ƾ뾾¾¾¾¾¾ƾ¾¾¾¾¾¾¾¾¾ƾ¾ᄒ¾ƾ¾¾¾ƾ¾¾¾뾾¾¾¾¾¾¾¾¾¾¾ƾ¾¾¾뾾¾¾¾¾¾¾¾¾¾¾¾ᄒ¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾¾뾾¾¾ƾ¾¾¾¾¾¾¾¾¾ƾ뾾¾¾™¾¾¾ƾ뾾¾¾¾¾¾¾¾¾¾¾뾾¾¾¾¾ƾxevil-2.02r2.orig/win32/res/Hell5.bmp0100644000175000017500000002550606604044316016521 0ustar aaronlaaronlBMF+6(dd'hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Uʝʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥ率ʥʥʥʥʥʥʥʥʥʥʥ率ʥʥʥʥʥʡ便ʥʥ諾ʥʥʥʥʥʥʥʥʡʥʥʡʥʥʝʥʥ陵ʥʥʥʡʡʡʥʥʥʥʝʥʡʥʥʡʥʥʥʥʥʥ率ʡʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʡ便ʥʥʥʥʡʥʥʥʥʥʥʝƥʥʥʥʥʝʥʥʥʥʥʥʥʥʥʡʥʡ便ʝʥʥʥʥʥʥʥ諾ʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʝʥʥʥʥʥʥʥ便ʥʥʥʥ便諾ʥʥʥʥʥ便ʥʥʥʥʡʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥ率ʥʥ便ʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʝʥʥʥʥ便ʥʥʡʥʥʔʥʥʥʥʥʥʥʥʥʥʡʥ凜便ʥʥʥʥ諾ʡʙ便ʝʥʡʥʝʥʝ便ʥʝʡ凌ʥʡʥơʥ率ʥʥʥʙʥʥʙʥ陵ʙʥʥʥ便ʥʝʥ便ʡʥʥʡʥʥʙʥʥʥʥʥʥʥʥʥʥʥʥ便ʥʥʥʥʥʡʥʥʥʝ便ʥʥʥʥ便ʥʥʥ諾ʥʥʥʥʥʥʥʝʥʥʥʥʡʥʥʥʥʡ便率陵率ʕʥʥ率諾ʥʡʥʔʡʥʥʥʝʥʥʔʝʥʥʙʥʥʥʥʙʥʥʥ陵ʔ諾ʥʥʡ諾ʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʥʝʡ諾ʥʥʥʝʝʙ諾ʥʡʡʥʥʥʡʥʥʥʥʡʙʙʥʥʡʥʝʙʥʥʥʥʥ便ʡ陵ʥʡʥʝ陵ʥʡʝʥʙʥʥ諾諾ʥʕʡʥʝʝʙ便ʥ陵ʡʡʥʥʙ諾凜ʥʥʥʡʥ諾ʥʝʥʥʡʥʥʝʡʡ諾諾ʥʥʥʝʥ率便ʡʥʥʥʥʝʥʡʥʙʡʥʥʥʥʝʥʡʥʥʥʥʡ率ʥʥʥʥ凌便ʥʥʥ便ʥ陵ʥʝʥʡ便ʡʡʥʡʡʥʥʥʥʥʥʥʥʥʥʥʥ率ʥʡ率率ʥʝʝʥʥʥʡʥʥʥ率ʥʡʥʥʥʥʥʥʥʥʥʥ便ʥʥʥ諾ʥʥxevil-2.02r2.orig/win32/res/Henblok.bmp0100644000175000017500000000406606604044316017130 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Ummm>99999999999999999999999999>>mmFm>m>m>9>>mmmmmmmmmmmmmmmmmmmmm9m>Fm9mmmmmmmmmmmmmmmmmm999>9m99q9mmmmmmmm9>mmmmmmmq99m999m9mmmmmmm99>mmmmmmq9q99m9mmmmmmm99>mmmmm99m99m9mmmmmmmmmm9FF9>mmmmm9m9mmmmmmmmm9mmmm9>mmmmmmmm9m9mmmmmmmm9mmmmmF9>mmmmmmm9m>mmmmmmm9mmmmmmmm9>mmmmmm9m9mmmmmm9mmmmmmmmmF9>mmmmm9m9mmmm9mmmmmmmmmmm9mmmmm9m>mmmm>999mmmmmmmm999>mmmmm9m9mmmmm9mm99>m9mmmmmm9m>mmmmmmmm9mmm9m9mmmmmmmmm9m>mmmmm9mmm9m9mmmmmmmmm9m>mmmm>999mmm999>mmmmm9m>mmmm9>mmmmmmmm9mmmmm9m>mmmm9>mmmmmmmmmmF9mmmmm9m>mmmmF9>mmmmmmmmmm9mmmmmm9m>mmmmmm9>mmmmmmmm9mmmmmmm9m>mmmmmmF9>mmmmmm9mmmmmmmm9m>mmmmmmmF9>mmmm9mmmmmmmmm9m>mmmmmmmmF9>mm9mmmmmm>>>m>m>m9>9mmmmmF9>9mmmmmmm>m999mmqm9mmmmmF9mmmmmmm9>mq>9m9mmmmmmmmmmmmmm9>m99mm9>mFmmmmmmmmmmmmmmmm>mqm>mmmm>>9>99999999999>9>>mm9>m>mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmxevil-2.02r2.orig/win32/res/herion001.bmp0100644000175000017500000000266606604044316017257 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)L,,,,,,,,,,,,,,,,,,LE>~I,,,,,,,,,,,,,,,Dhe|d(,,,,,,,,,,,,,,@h a|d(,,,,,,,,,,,,,,,,$ 6~I,,,,,,,,,,,,,,,,,,,,(%L,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hhero18c.bmp0100644000175000017500000000616606635115412017172 0ustar aaronlaaronlBMv 6(B@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,f,,,,,,,,,,,,,,,,,,ff,,,,,,,,,,,,,,,,,,fff,,,,,,,,,,,,,,,,,,ffff,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,ffffff,,,,,,,, ,,ffffff,,,,,,,,,,fffffffffff,,,,,,,,,,,fffffffffff,,,,,,,,,,,fffffffffff,,,,,,,,,,,,fffffffffffffd,,,,,,,,,,,,ffffffffffff,,,,,,,,,,,,ffffffffff,,,,,,,,,,,,ffff,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ffff,,,,,,,,,,,,,,mm,,,,mffffff,,,,,,,,,,,,mm,,,,|ffff,,,,,,,,,,,mmm~mmfffff,,,,,,,,,,,mBffff|ffff,m,,,,,,,,,mffffmmfffffm,,,,,,,,,mmfffff~ffffffm,,,,,,,,mmmfffff~mfffffm,,,,,,,mmmmmfffffm|ffffm,,,,,,mm,mmffmf~mfffm,,,,,mm,,mfm|mm,,,,,mm,,,,,mm? ??m,,mm,,,,mm,,,,,m????? m,,,mm,,,mm,,,,,m? ?? ??,,,,mm,,,mmmm,,,,,?? ?? ?,,,,,mm,,,,m,m,m,,,,m? ? ?m,,,,mm,,,,,,,,,,,,m? ?? ??,,,,mmm,,,,,,,,,,,, ? ? ?m,,,,,mm,,,,,,,,,,, ?? ? ???,,,,,mmm,,,,,,,,,,,,, ?? ?,,,,,mmm,,,,,,,,,,,, ? ???,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,xevil-2.02r2.orig/win32/res/hhero18d.bmp0100644000175000017500000000555606634702550017201 0ustar aaronlaaronlBMn 6(B8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,f,,,,,,,,,,,,,,,,fff,,,,,,,,,,,,,,ffff,,,,,,,,,,,,,,,ffff,,,,,,,,,,,,,,,ffff,,,,,,,,,,,,,,,fff,,,,,,,,,,,,,,,ffffmff,,,,,,,,,,,f,fmfff,,,,,,,,,f,ffffffmf,,,,,,,,,ffffffff,,,,,,,,,,ffffmf,,,,,,,,,,fffffffff,,,,,,,,,,,ffmfmfmfmfd,,,,,,,,,,,ffffffffdddf,,,,,,,,,,,ffffffffff|||mdmf,,,,,,,,,,,ff|||mmmm|m,,,,,,,,,,,,,fffmmmmffffm,,,,,,,,,,,,,,,,,,fmffffm,,,,,,,,,,,,,,,,,,fmfffff,,,,,,,,,,,,,,,,,,|fffmf,,,,,,,,,,,,,,,,,f~mmfffff,,,,,,,,,,,,,,,,,ff|ff,m,,,,,,,,,,,,,,ffmmmmfffffmm,,,,,,,,,,,mfffm~fffm,,,,,,,mmmffmf~mfffm,,,,,mmfffm|mm,,,,mmfmf~mff,,mmmmmfmfm|mmmmm,,mm,,,,,mmmmm,,,mm,,m,,,,,mm? ??m,,,,,mmmm,mm,,,,,m????? m,,,,mmm,m,,,,,m? ?? ??,,,,mm,mI,,,,,?? ?? ?,,,,,mmm,mmm,,,,,m? ? ?m,,,,mmm,,,,,,m? ?? ??,,,,Immmm,,,,,, ? ? ?m,,,,,mmm,,,, ?? ? ???,,,,,mmmmm,,,,,, ?? ?,,,,mmmmmmm,,,,, ? ???,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hhero18e.bmp0100644000175000017500000000616606635115036017176 0ustar aaronlaaronlBMv 6(B@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,?*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,f,,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,fffff,,,,,,h,,,,,,,,,,ffffff,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,fffffff,,,,,,,,,f,,ffffff,,,,,,,,,,ff澶ffffff,,,,,,,,,,,ffffffffffff,,,,,,,,,,,ffffffffffff,,,,,,,,,,,,fffffffffffffff,,,,,,,,,,,,,ffffffffffffff,,,,,,,,,,,,,ffffffffffffdff,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,f,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ffff,,,,,,,,,,,,,,,,,,,,mfffff,,,,,,,,,,,,,,,,,,,|fffff,,,,,,,,,,,,,,,,,,,~mmfffff,,,,,,,,,,,,,,,,,,fff|ffff,m,,,,,,,,,,,,,,,ffffmmffffffmm,,,,,,,,,,,,mmffffm~ffffffm,,,,,,,,,,mfffff~mffffm,,,,,,,,mffffffm|ffmmm,,,,,,mffffff~mffmmm,,,,mmmmfm|mmmmm,,,,mm,,,mm? ??m,,,,mmm,,,mmmm,,,m????? m,,,,,mm,,,mmm,,,m? ?? ??,,,,,mmm,,mmm,,,,,?? ?? ?,,,,,,mm,,mm,,,,,m? ? ?m,,,,,mmm,,mm,,,,,m? ?? ??,,,,,mm,,5mm,,,,, ? ? ?m,,,,,mmm,,mm,,,, ?? ? ???,,,,,mmm,,,~mm,,,,,,, ?? ?,,,,mm,,,mm,,,,,, ? ???,,,,mmm,,,mmmm,,,,,,,,,,,,,,,,mmm,,,5,mm,,,,,,,,,,,,,,,,mmm,,,,mm,,,,,,,,,,,,,,,,mmmmm,,,~,mmm,,,,,,,,,,,,,,,,,,,m,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,5,,m,m,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hhero18f.bmp0100644000175000017500000000616606635115414017177 0ustar aaronlaaronlBMv 6(B@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,ff,,,,,,,,,,,,,,,,,,,ffff,,,,,,,潽,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,,,,fffffff,f,,,,,, ,,,,,,,fffffffff,,,,,,,,,,,,,ffffffffff,,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,fffffffffff,,,,,,,,,,,,,,ffffffffff,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,fff,,,,,,,,,,,,,~fff,,,,,,,,,,,,,mfffffffff,,,,,,,,,,,,,,mfffffffffmm,,,,,,,,,,,,|ffff,m,,,,,,,,,,,~mmfff,,mm,,,,,,,,,,fff|ffff,mm,,,,,,mmmffffmmffffffmm,,,,mmmffffm~ffffffmm,,mmmmfffff~mffffmm,,mmffffm|ffmmmm,,mmffmf~mffmmmm,,mmmmfm|mmm,,mm,,mmmmm,,mm? ??m,,,,,mmm,,mm,,,,,m????? m,,,,mm,,,mm,,,,,,m? ?? ??,,,,mmm,,,mm,,,,,,?? ?? ?,,,,mm,,,mm,,,,,,m? ? ?m,,,mmm,,,mm,,,,,,m? ?? ??,,,mmmm,,,mmm,,,,, ? ? ?m,,,mmm,m,,,,mm,,,, ?? ? ???,,,,,,,,,,,,mm,,,,,, ?? ?,,,,,,,,,,,,mm,,,,,, ? ???,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hhero18g.bmp0100644000175000017500000000616606635115040017173 0ustar aaronlaaronlBMv 6(B@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,?*,,,,,,,,,,,,,潽,,,,,,,,,,,,f,,,,,,潽,,,,,,,,,,,,ffff,,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,fffff,,,,,,潽,,,,h,,,,,,,,,fffff,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,,ffffff,,,,,,,,,,,,,,fffffffffff,,,,,,,,,,,,fffffffffffff,,,,,,,,,,,fffffffffffffff,,,,,,,,,,,ffffffffffffffff,,,,,,,,,,,dfffffffffffffff,,,,,,,,,,,,ffffffffffff,,,,,,,,,,,,ff|fffff,,,,,,,,,,,,,,,,,,,,,,,,,,,~m,,,,,,,,,,,,,,,,,,mfffff,,,,,,,,,,,,,,,,,,,mfffff,,,,,,,,,,,,,,,,,,,,|fffff,,,,,,,,,,,,,,,,,,,f~mmfffff,,,,,,,,,,,,,,,,,,mfff|ffff,,,,,,,,,,,,,,mmmffffmmfffff,,,,,,,,,,,,mmfffff~fffff,,,,,,,,,,,mmfffff~mffffm,,,,,,,,,,,mffffm|ffmm,,,,,,,,,mmfffmf~mffm,,,,,,,,mmmmfm|mm,,,,,,,mmmm,,,,mm? ??mmmm,,,,,,mm,,,,,m????? m,mmm,,,,,mm,,,,,,m? ?? ??,mmm,,,,mm,,,,,,?? ?? ?,,,mm,,,,mmm,,,,,,m? ? ?m,,,mm,,,mm,,,,,,m? ?? ??,,,,mm,5,,mm,,,,, ? ? ?m,,,,mm,,mmmm,,,, ?? ? ???,,,,,mm~,,,mm,,,,,, ?? ?,,,,,mm,,,mm,,,,, ? ???,,,,,mm,,,mm,,,,,,,,,,,,,,,,,mmm5,,,mm,,,,,,,,,,,,,,,,,mm,,,,mmmm,,,,,,,,,,,,,,,,,mmm~,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,mmmm5,,,,,,,,,,,,,,,,,,,,,,,,m,m,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hhero21_.bmp0100644000175000017500000000536606633307532017165 0ustar aaronlaaronlBM 6(HhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,潽,,,,,,,,,潽,,,,,,,,,,,,,潽,,,,ff,,,,,,,,,,,,fff,,,,,,,,,,,,,fffff,,,,,,,潽,,,,fffff,,,,,,,潽,,,ffffff,,,,,,,潽,,,ffffff,,,,,,,,,ffffff,,,,,,,fffffff,,,,,,fffffffff,,,,,,,ffffffffff,,,,,,,fffffffffff,,,,,,,fffffffffff,,,,,,,,fffffffffff,,,,,,,,,ffffffffffff,,,,,,,,,,fffffff,,,,,,,,,,ffff,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,mmm,ffffff,,,,,,,mmm,,feffff,,,,,,mmmm,efff,,,,,,mmffe,,,,,,mmfff,,,,,,mmff,,,,,mmffff,,,,,mmee,,,,,,mfeeee,,,,,,meeeee,,,,,,mmmfeeeeeef,,,,,,mmmeeeeemm,,,,,mmmem,,,,mmmmfm,,,,mmmmmm,,,,m,mmmmfmm,,,mm,mmmmmmmmm,,,,mmmmm,mmmmmmm,,,,,,,,,,mmmm,,,,,,,,,mmmm,,,,,,,,, mmmm,,,,,,,,,,mmmmmm,,,,,,,,,,mmmmmmmm,,,,,,,,, ???mmmm,,,,,,,,,,, ????,,mmm,,,,,,,,,, ? ? ,,m,,,,,,,,,,,,, ,, ,,m,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,mmmm,,,,,xevil-2.02r2.orig/win32/res/hialien0.bmp0100644000175000017500000000742606625407374017254 0ustar aaronlaaronlBM6(0: hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,~~,,,,,,,,,,,,,,,~ɤ~,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~x~~~~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,~x~,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,~~~,,,,~Q~,,,,,,,,,,,,,,,,,,,,~~,,,,,,,~~,,,~x~,,,,,,,,,,,,,,,,,,,,~~~~~~~~~,,,~ɤ~,,,,,,,,,,,,,,,,,,,,~~,,,~~,,,,,,,,,,,,,,,,,,,,,~xx~~~~,,,,,,,,,,,,,,,,,,,,,~xx~,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,~~~~~x~,,,,,,,,,,,,,,,,,,,,,,,,~~,,~~~P~~,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,~Qx~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,~ɤxx~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,~~~~,,,,~~~~,,,,,,,,~~xx~~~~~,,,,,,~~~~~~~x~,,,,~~~,,~~~~~~~,,,,~~~,,,~~,,,~~~~,,,~~~,,,,~~x~,,,,,,~~~,,,~~,,,,,,,~~~~~~x~,,,,,,~~~,,,~~,,,,,,,,~~~x~~~,,,,~~,~~~,,,,~~,,,,,,,~xx~~~,,,,,,,,,,,,~~~,,,,,,,,~xQ~,,,,,,,,,,,~~,,,,,,,,,~~~~~~~~xQ~,,,,,,,,,,,,~~~,,,,,,,,,,~~~~~~~,,,,,,,,,,~~,,,,,,,,,,~~~,,,,,,,,,~~,,,,,,,,,,~~~~~~~~~~~,,,,,,,,,~~,,,,,,,,,,,,~,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~x~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~Q~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hialien1.bmp0100644000175000017500000000427606625375354017257 0ustar aaronlaaronlBM6(:hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,~~~,,,,,,,,,,,,,,~~~~~~,,,,,,,,,~~~,,,,,,,~~,,-,,,,,~~,G,,,,,~~,,,,,,~~,,,,,,~~,,,,,,~~,,,,,~~,,,,,~~,,,,,~~,,,,,~~~,,,,,~~~,ԁ,,,,,~~,,,,,~~~~,,,,~~~,,,,~~,,,,~~,,,~~,,,~~,,,~~,,,~~,,,~~,,,.,~~,,,,,~~,,,~~,,,=~~,,,2~~,,2~~,,ԁ~~,,~~,/,~~,,~~,~~~~~ɽɤ~,~~,f,~~,,,~~,,~~P~,=,,~~Q~~,,,,~~~,,,,,~~,,,,,~~,,,,,~~,,,,,~~,,,,,~~,,,,,~~,,,-,,,~~,,,G,,~~~,,,,,,~~~~~~~,,,,,,,~~,,,,,,,,,v,,~~,,,,,,,,,,,,~~~,,,,,,,,,,,2,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hialien2.bmp0100644000175000017500000000762606625353272017255 0ustar aaronlaaronlBM6(48` hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,~ɤ~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~x~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~xQ~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~x~,~x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,~~Q~~Q~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~ɤP~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~P~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~Q~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~x~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~x~~,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,~~~,,~~~,,,,,,,,,,,,,,,,,,,,,,~~~,,,~~,,,,,,,,,,,,,,,,,,,,,,~~~,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,~~~~~~~~,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,~~~~~~,,,,,,,,,,,,,,,,,,~~,,,,,,,~~~~,,,,,,,,,,,,,,,,~~~,,,,,,,,~~,,,,,,,,,,,,,,,~~,,,,,,,,,~~~~~~~~~~~,,,,,,,,,,,,,,~~~,,,,,,,,,,~~~QQx~~,,,,,,,,,,,~~,,,,,,,,,,~Qxt~,,,,,,,,,,~~,,,,,,,,,~~~~~~~~~~Q~,,,,,,,,,~~,,,,,,,,,,,~~,,,,,,,,,~ɤ~,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,~xɤ~,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,~x~~~~~~,,~~,,,,,,,,,,,,,,,,,,,,,~~~~,,~~,,,,,,,,,,,,,,,,,,,,,,~~,~~~,~~,,,,,,,,,,,,,,,,,,,,,,~~~,,,~~~~,,,~~,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,~~,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,~,~~,,,,,,,,,,,,,,,~~~~,,,,,,,,,~~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~~~~~~~~~~~,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hialien4.bmp0100644000175000017500000000521606625407374017253 0ustar aaronlaaronlBM 6(:XhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,~~~,,,,~~~~,,,,,,,,,,,,,,~~,,~~,,,,,,,,,,,,~~~~,,,,,,,,,,,,~~~~,,,,,,,,,,,,~~~~,,,,,,,,,,,,~~,~~,,,,,,,,,,,,~~,~~,,,,,,,,,,,,~~,,~~,,,,,,,,,,,,,,~~,,~~,,,,,,,,,,,,,,~~,,~~,,,,,,,,,,,,,,~~,,~~,,,,,,,,,,,,,,~~,,~~,,,,,,,,,,,,,,~~,,~~,,,,,,,,,,,,,~~,,~~,,,,,,,,,,,,,~~,,~~,,,,,,,,,,,,,~~,,~x~,,,,,,,,,,,,,~~,,~~,,,,,,,,,,,,,~~,~ɤ~,,,,,,,,,,,,,~ɤ~~~,,,,,,,,,,,,,~~~~,,,,,,,,,,,,~~~~,,,,,,,,,,,,~~,,,,,,,,,,,,~~,,,,,,,,,,,,~~,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,~~,,,,,,,,,,,,,~~,,,,,,,,,,,,~~,,,,,,,,,,,~~,,,,,,,,,~~~~,,,,,,,~~,,,,~~~~,~QxxxQ~MO~xxPPxx~MO~ɤŜ~MO~~~~~ɤ~MO~~,~~,~~MO~~,,~~~~~,,~~MO,~~,,,~~,,,,~~,MO,~~,,,~~,,,,~~,MO,~~,,,,~~,,,,,~~,MO,,~~,,,,,~~,,,,,~~,,KO,,~~,,,,~~,,,,~~,,KO,,~~,,,~~,,,~~,,KO,,~~,,~~,,~~,,KO,~~,,,~~,,,~~,KO,~~,,~~,,~~,KO,~~~,,~~,,~~,KO,~~~~,,~~,,~~~~,KO,,~,~~~,,,~~,,,~~~,~,,KO,,,,,~,,,,,~~,,,,,~,,,,,KO,,,,,,,,,,,~~,,,,,,,,,,,GO,,,,,,,,,,,~~,,,,,,,,,,,KO,,,,,,,,,,,,~~,,,,,,,,,,,,KOxevil-2.02r2.orig/win32/res/hialien5.bmp0100644000175000017500000000415606625407376017260 0ustar aaronlaaronlBMn6(68hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,~~,,,,~~,,,,~~~,,,,,~~,~~,,,,,,~~,~~,,,,,,~~,,~~,,,,,,,,~~,,~~,,,,,,,,~~,,~~,,,,,,,,~~,,~~,,,,,,,,~~,,~~,,,,,,,,~~,,~~,,,,,,,~~,,~~,,,,,,,~~,,~~,,,,,,,~~,,~x~,,,,,,,~~,,~~,,,,,,,~~,~ɤ~,,,,,,,~ɤ~~~,,,,,,,~~~~,,,,,,~~~~,,,,,,~~,,,,,~~~,,,~~~,~~~~~~~~~~~~~~,,~~,,~~,,~~,,,~~,,,,~~,,,,~~,,,,~~,,,,~~,,,,~xPPx~,,,,,,~Ŝ~,,,,,,,~~,,,,,,~~,,,,,,,~~~~~,,,,,,,,,~~,,,,,,,,,,,,~~,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,~~,,,,,,,,,xevil-2.02r2.orig/win32/res/hihero19.bmp0100644000175000017500000000616606635115034017201 0ustar aaronlaaronlBMv 6(B@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,潽,,,,,?*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,f,,,,,,,,,,,,,,,,,,ff,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,fffff,,,,,,h,,,,,,,,,,,fff,,,,,,,,,,,,,,,,fff,,,,,,,,,,,,,,,,,fffff,,,,,,,,,f,,fffff,,,,,,,,,fffffffff,,,,,,,,,ffffffffffffff,,,,,,,,,,ffffffffffffffff,,,,,,,,,,,ffffffffffffff,,,,,,,,,,,,,涶ffffffffffd,,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,,,,mfffffff,,,,,,,,,,,,m,,,,,,,|ffff,,,,,,,,,,,mmmmm,,f~mmffff,,,,,,,,,,mmmff|ffff,,,,,,,,,,mffmmmmfffff,,,,,,,,,mmffffm~fffff,,,,,,,,,,mmfffff~mffff,,,,,,,,,,mmmmfffffm|ffffmm,,,,,,,,m,,mmfffff~mffffm,,,,,,,mM,,,mfm|mfm,,,,,,mm,,,,,mm? ??m~?m,,,,,,mm,,,,,m????? m,m?mm,,,,mmm,,,,,,m? ?? ??,m??m,,,mm,,,,,?? ?? ?,,,mm,,mm,,,,,m? ? ?m,,,m?m,,mmmm,,,,,m? ?? ??,,,,mmm5,,,m,,,,,,,, ? ? ?m,,,,mm,,,,,,,,,,, ?? ? ???,,,,mmm~,,,,,,,,,,,,, ?? ?,,,,mm,,,,,,,,,,,, ? ???,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,mm5,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,mmm~,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,mmmm5,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,m,m,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hihero21.bmp0100644000175000017500000000402606633304516017166 0ustar aaronlaaronlBM6(>hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,6,,,,,,,,,,,,,,,,,,,,,,,΁,,,,,,,,,,,,,,,,,,,,,,,,,,,s,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,f,,,,,Q,,,f,,,,,E,,,f,,,,,\,,,f,,,,,,,fff,,,,,,,ffff,,,,,,,,fffff,,,,,,,fffff,,,,,,,fffff,,,,x,,,fffff,,,,,,,fffff,,,,,,,fffff,,,,,,,ffff,,,,,,,,,,,,,,,m,,,,,,*,,fffffff,,,,fffffff,,$,,ffffffm,,,fffff,,,fffffff,,,fffff,,,fffmmfff,,,ffmmmffff,,,fmmmff,,,mmff,,,mmmf,/,,,mmm,,,,?mmmm,,? mm,,/, ?mmm,,/?? mmmm,,? ?mmmm,, ??mmm,,?? mm,,,/ ??mmmm,,, ,?mm,,,,,,, mm,,,,,,,,mmm,,,,,,,,mmm,,,,,F,,,mm,,,,,,,,,mmm,,,,,,,,,mmm,,,,,,,,mm,,,,,,,,mm,,,,,,,,mm,,,,,,,,,,mmm,,,,,,,%xevil-2.02r2.orig/win32/res/hininja_.bmp0100644000175000017500000000310606634673550017332 0ustar aaronlaaronlBMF6(, hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**USSS,,,,SmSSSSzzS,SS,,,SSmmSSS,,,,,mmSS,,,,,SSS,,,,,,zzSzz,,,,,,,SzzzzzzSS,,,,,,,zSSSSSSzzzzzzSm,,,,,,,,,zzSzSS,,,,,SSSSSSS,m,,,,,,,,,zzzz,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,SzS,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,SzzS,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,SS,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hiwalk_0b.bmp0100644000175000017500000000762606604100420017400 0ustar aaronlaaronlBM6(84` hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~,,,,,,,~~~~~~~~~~~~~~~~~~~~~,,,,, ~~~~~~~~~~~~~~~~,,~~~,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,~~~~~~,,,,,,,,,,,,~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,~~~,~~~~~~~~~~~~,~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hiwalk_0c.bmp0100644000175000017500000000762606604044320017407 0ustar aaronlaaronlBM6(84` hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,~,,,,,,,~~,,,,,~,,,,,,,,,,~~,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,,,,,,,~~~,,,,,,,,,,,,,,,,~~,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,~~~~~~~~,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~~~,,,,~~~,~~~~~~~~~~~~,~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hiwalk_0d.bmp0100644000175000017500000000762606604044320017410 0ustar aaronlaaronlBM6(84` hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~,,,~~~~~~~~~~~~~~~,,,~~~~,,,~~~~,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~,~,,,,,,,~~,,~~,,,,,~~,,,,,,~~,,~,,,,~~~~~~,,,,,,,,~~,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,~~~~~~,,,,~~~,~~~~~~~~~~~~,~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Jump0.bmp0100644000175000017500000000516606604044320016536 0ustar aaronlaaronlBMv 6(2@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,||,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,,,,,,,,,,,,,,潽,,,,,,,,,,|,,,,,,,,,,|,,,,,,,,,,,,,,|,,,,,,,,,,,,,ff|,,,,,,,,,,,,ff,f,,,,,,,,,,,,,ffffff,,,,,,,,,,,,ffffffffff,,,,,,,,,,,,ffff,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,fffffffffff,,,,,,,,,,,,,,ffffffffff,,,,,,,,,,,,,,,fffffffff,,,,,,,,,,,,,,,,,ffffffff,,,,,,,,,,,,,,,,,,,,fffff,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,mmm,mm,,,,,,,,,,,,,mmmffmm,,,,,,,,,,,mmffm,,,,,,,,,mmmmmffffmm,,,,,,,mmmfffmmm,,,,,,mmmmmfffmmmm,,,,,mmmmmmffffm,mmmmm,,,,,,mmmfff,mmm,,,,,,,mmmfffm,,mmm,,,,,,,,mmmffm,,,mmm,,,,,,,,,,,mmmmf,,,,,mm,,,,,,,,,,,,,,mmmmmmmm,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,m?mmm,,,,,,,,,,,,,,,,,,,,,,??mmm,,,,,,,,,,,,,,,,,,,,,?????m,,,,,,,,,,,,,,,,,,,,,? ? ??,,,,,,,,,,,,,,,,,,,,,,? ? ?? ? ,,,,,,,,,,,,,,,,,,,,,? ? ?? ,,,,,,,,,,,,,,,,,,,,,,,,,?? ? ,,,,,xevil-2.02r2.orig/win32/res/Ladder2.bmp0100644000175000017500000000406606624427512017030 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U, |,,,,,,,,,,|,,,,,,,,,,| , |||||,,,,,,,,,,,,,,,,,,||||| ,| || |, | | , |,,,,,,,,,,|,,,,,,,,,,| , |||||,,,,,,,,,,,,,,,,,,||||| ,| || |, | | , |,,,,,,,,,,|,,,,,,,,,,| , |||||,,,,,,,,,,,,,,,,,,||||| ,| || |, | | , |,,,,,,,,,,|,,,,,,,,,,| , |||||,,,,,,,,,,,,,,,,,,||||| ,| || |, | | , |,,,,,,,,,,|,,,,,,,,,,| , |||||,,,,,,,,,,,,,,,,,,||||| ,| || |, | | , |,,,,,,,,,,|,,,,,,,,,,| , |||||,,,,,,,,,,,,,,,,,,||||| ,| || |, | | , |,,,,,,,,,,|,,,,,,,,,,| , |||||,,,,,,,,,,,,,,,,,,||||| ,| || |, | | , |,,,,,,,,,,|,,,,,,,,,,| , |||||,,,,,,,,,,,,,,,,,,||||| ,| || |, | | xevil-2.02r2.orig/win32/res/aaanew2.bmp0100644000175000017500000002206606647455362017102 0ustar aaronlaaronlBM6$6(@ hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,, ,,,,,,,,,,,,,,,,,,,,,, ,,,,,, ,, ,,, ,,,,,,,,,,, ,,,,,, ,,,,, ,, ,,,,,,,,, ,,,,,,, ,,, ,, ,,,,,,,,,,,,,,,,,, ,,, , ,,, ,,,,,,,,,, ,,,, ,,, ,, ,,,,,,,,, ,,,, ,, , ,,,,,,,,,,,,,,,,,, ,, ,, ,,,, , ,, ,,,,,,,,,,,, ,,,, , ,, , ,, ,,,,,,,,, ,, ,,, , ,, ,,, ,,,,,,,,,,,,,,,,,,, ,,, ,, ,, ,, ,,,,,,,,,,,, ,,,, , ,, , ,, ,,,,,,,,, ,,,, ,, , , ,, ,,,,,,,,,,,,,,,,,,,,,,, ,, ,,, ,,,, ,, ,,,,,,,,,,, ,,,,, , ,,, ,,,,,,,, ,,, ,,, , ,, ,,, ,,,,,,,,,,,,,,,,,,, ,,, , ,,,, ,, ,,,,,,,,,,, ,,,, ,, , ,, ,,,,,,,,, ,,,, ,, , ,,, , ,,,,,,,,,,,,,,,,,, ,,,,, ,, , ,,,,,,,,, ,,,, ,, , ,, ,,,,,, ,,,, ,,, ,, ,, , ,,,,,,,,,,,,,,,,,, ,, ,,,,, ,,, ,, ,,,,,,,, ,,,, ,,,, ,, ,, , ,,,,,, ,,, ,,,, ,,,, ,,,,, ,,,,,,,,,,,,,,,,,,, ,, ,,,,,,,,,,,,,,,,,,, ,,,,,,,,,, , ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,, ,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,, ,,,,,,,,, ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/md4backg.bmp0100644000175000017500000004206606625075310017225 0ustar aaronlaaronlBM6D6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Uxevil-2.02r2.orig/win32/res/md4outsi.bmp0100644000175000017500000004206606631177664017335 0ustar aaronlaaronlBM6D6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**UrrrrrrrrrrrrrrrrrrrrrrrrnrrrnrrrnrrrnrnrrnnrrnnrrnnrrnrrnnrrnnrrnnrrnrrrnrrrnrrrnrrnrrrnrrrnrrrnrrCnrrnCnrrnCnrrnCnrrCnrrrnrCnrrrnrCnrrrnrCnrrrCnrrrnrCnrrrnrCnrrrnrCnrrrnCnrnrrnrCnrnrrrnrCnrnrrnrCnrnrrrnCCrrrrCCrrrrrrrCCrrrrCCrrrrrrrCnrrrCnrrnrrrCnrrrCnrrnrrrnrrrnrrnrrrnrrrnrrnrrrnrnCnrrnrnCnrrCnrrrCnrrrrrCnrrrrrrCnrrCnrnrrCnrnrrrrCCrrrrrrrCCrrrrnnnCnrrrnnnCnrrrnnnnrrrnnnnrrrrrrnrrrrnrrrrrrrnnnnnnnnnrnrnrnnrnrnrnnrnrnrnnrnrnrnnrnrnrnnrnrnrnrrrrrrrrrrrrrrrrrrrrrrrrrrrrnrrrrrrrnrrrrrrrnrrrrrrnrrrrrrnrrrnrrrnrrrrrrnrrrrrrrrrrrrrrrrrrrrnrrnrrrnrrnrrrnrrnnrrrrnrrnnrrrrnrrrnnrrrrnrrrnnrrrnrrrrnrrrnrrrrnrrrnrrrrnrrrnrrrrnrrrCnrrnCnrrnCnrrnCnrrnCnrrrnrCnrrrnCnrrrnrCnrrrnCnrrrnrCnrrrnCnrrrnrCnrrrnCnrnrrnrCnrnrrnCnrnrrnrCnrnrrnCCrrrrCCrrrrCCrrrrCCrrrrCnrrrCnrrrCnrrrCnrrrnrrrnrrrnrrrnrrrnrnrnrnrrrrrrrrrrrrrrrnnnrnnrnnnrnnrrrrrrrrrrrrrrrnnnnnnnnrnrnrnnrnrnnrnrnrnnnrnrnnrrnrnrnnnrnrnrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrnrrnrrrrnrrnrrnnrrrnnnrrrnrrnnrrrnnnrrrnrrrnrrrrrnrrrnrrrnrrrrrnrrrCnrrnCnrrnnnCnrrnCnrrrnrCnrrrnnrnrCnrrrnCnrrrnrCnrrrnnrnrCnrrrnCnrnrrnrCnrnrrrnnrnrCnrnrrrnCCrrrrCCrrrrrrrrrCCrrrrrrrCnrrrCnrrnrrrrrCnrrnrrrnrrrnrrnrrrrrnrrnrrrnrnCnrrrrnCnrrCnrrCnrrrrrCnrrrrrCnrrCnrnrCnrnrrrrCCrrrrrrrCCrrrrnnnCnrrrnnnCnrrrnnnnrrrnnnnrrrrrrnrrrrnrrrrrrrnnnnnnnnnrnrnrnnrnrnrnnrnrnrnnrnrnrnnrnrnrnnrnrnrnrrrrrrrrrrrrrrrrrrrrrrrrrrrrnrrrrrrrnrrrrrrrnrrrrrrnrrrrrrnrrrnrrrnrrrrrrnrrrrrrrrrrrrrrrrrrrnrrnrrrnrrnrrrnrrnnrrrrnrrnnrrrrnrrrnnrrrrnrrrnnrrrnrrrrnrrrnrrrrnrrrnrrrrnrrrnrrrrnrrrCnrrnCnrrnCnrrnCnrrnCnrrrnrCnrrrnCnrrrnrCnrrrnCnrrrnrCnrrrnCnrrrnrCnrrrnCnrnrrnrCnrnrrnCnrnrrnrCnrnrrnCCrrrrCCrrrrCCrrrrCCrrrrCnrrrCnrrrCnrrrCnrrrnrrrnrrrnrrrnrrrnrnrnrnrrrrrrrrrrrrrrrnnnrnnnrnnnrnnnrrrrrrrrrrrrrrrrrnnnnnnnnnrnrnrnnrnrnrnnrnrnrnnrnrnrnnrrnrnrrnnrrnrnrrnrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrxevil-2.02r2.orig/win32/res/Nin0.bmp0100644000175000017500000000546606604026260016355 0ustar aaronlaaronlBM6 6( 8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,m,,,,,,,,,,mm,,,,,,,,,,,mm,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/md5backg.bmp0100644000175000017500000002406606631171156017230 0ustar aaronlaaronlBM6(6(``$hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Urrrrrrrrr~r~r~r~rrrr~~~rrrr~~~rrrrrrrrrrrrrrrrrrr~r~rrrr~~~~~rrrr~~~rrrr~~rrr~~~rrrrrrrrrrrrrrrrrrrrrr~r~rrrr~~~rrrrrr~~~~~~~~~~~~~~~~~~~~rrrrrrr~rrrrr~rrrrrrrrrrr~~~rrrrrrrrrrrrrrrrrrrrrxevil-2.02r2.orig/win32/res/md5mover.bmp0100644000175000017500000000606606626172352017314 0ustar aaronlaaronlBM6 6(@ hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,rrr,,,,,,,,,,,,,,,rCrr,,,,,,,,,,,,,,rrr,,,,,,,,,,,,,,r>nnrCrrn,,,,,,,,,,,,,,rrrr,,,,,,,,,,,,,,>r>rr>nrrrn>rrn,,,,,,,,,,,,,,rrnr,,,,,,,,,,,,,,nrr>Crrrnrrn,,,,,,,,,,,,,,rrrnr,,,,,,,,,,,,,,nCrnrrrnrrr,,,,,,,,,,,,,,rr,,,,,,,,,,,,,,rrrnnrrnCrnCC,,,,,,,,,,,,,,,,,,,,,,,,,,,,r>rrCrrn>rr>rnC>r>,,,,,,,,,,,,,,,,,,,,,,,,,,,,rrCnC>rrr>Cnnr,,,,,,,,,,,,,,,,,,,,,,,,,,rrCnn>rrn>nnr,,,,,,,,,,,,,,,,,,,,,,,,nnCrCrnn>n>r>rr>rnr,,,,,,,,,,,,,,,,,,,,,,r>r>rr>rnnnC>Crnn>nC,,,,,,,,,,,,,,,,,,,,Crn>nnrrrCnnrrCC,,,,,,,,,,,,,,,,,,CCrrCnnrrCnC>rCCn,,,,,,,,,,,,,,,,nCC>r>rnC>r>r>rrCrrnCnn,,,,,,,,,,,,,,nnCCrnCCrrrnnrrn,rrrC,,,,,,,,,,,,Crrr,rrrnrnrnCrn,,nrrC,,,,,,,,,,Crrn,,rrrrnnrr>Crrrn,,,nrCCn,,,,,,,,nCCrn,,,rrrn>n>r>rr>n,,,,nrCC,,,,,,CCrn,,,,rCrrrnrr>nnr,,,,,nCn,,,,nCn,,,,,rrCrrC>nCC>Cn,,,,,,rn,,nr,,,,,,nCCnCCnnnrn>rrCrrnnrrn>rrCrnnrrCrrnnrr>rCrrrnrnCrCrrnrCrrrnrn>rnrnCrCrnCrnrnCrCCrrCCCrrrrCrrCCCrrCrCnCnrrrnCrCnCnrrCrrrrrrC>rrCrrnrn>nnrC>rrCrrnrC>rrCrrnrn>nnrCCnC>rr>CnnrCCnC>rrCCnC>rr>CnnrCCrCCrC>rC>C>rCCC>C>rCCrCCrC>rC>CCCrCCrC>rC>C>rCCC>C>rxevil-2.02r2.orig/win32/res/mdoutsid.bmp0100644000175000017500000004206606631177666017417 0ustar aaronlaaronlBM6D6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**Ur潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽nrrrrrrrr~~~~~~~~~~~~~~~~~~CrrrrrrrrrrrCnCnrrrrr~~~~~~~~~~~~~~~~~~~~~CrrrCnCnrrrrrnnrrnCCnnnrnnnnr~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CnnCCCnnnrnCCnrnCnn>CnnnCnCCnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CnC>CnnnCnCCnnnCnC>>CnnCCCCnnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>C>>CnnCCCCnnnCC>CCCCnCCCCCCnnn~~~~~~~~~~>CCCCnCCCCCCCnCCCnCCnCCC>CCnnnn>nCCnCCC>CCnnCC>CCCCCC>>CnnnCCnƽ潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽>CCCCC>>CnnnCCCCCCCC>>>CnnCCCCn~~~~~~~~~~~~~~~~~~>CCC>>>CnCCCCCCnCCC>CCCCCCCCC>nƽ~~~~~~~~~~~~~~~~~~~~~>CC>CCnCCCCCC>CCCCCCCCCCCCCC>Cn~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CCCCnCCCCCC>CCC>CCCCCCCC>>>CCnƽ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CC>CCCCC>>>CCCC>CCCCCC>>>>CCCC~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>>>CCCC>>>>CCCC>>>C>C>>>>>>>CCn~~~~~~>>>>C>>>>>>>C>>>nrr潽潽潽潽潽潽潽潽潽潽潽潽nrrCrrrrrrrrrrrrrr~~~~~~~~~~~~CrrrrrrrrrrrrrrCrrrCnCnrrrrrnrrrrCnCnrrrrr~~~~~~~~~~~~~CrrrCnCnrrrrrnrrrrCnCnrrrrrCnnCCCnnnrnCCnrnnrrnCCnnnrnnnnr~~~~~~~~~~~~~~~~~~~~~~~~~~CnnCCCnnnrnCCnrnnrrnCCnnnrnnnnrCnC>CnnnCnCCnnnCCnn>CnnnCnCCnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~CnC>CnnnCnCCnnnCCnn>CnnnCnCCnnn>C>>CnnCCCCnnnCCnC>>CnnCCCCnnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~>C>>CnnCCCCnnnCCnC>>CnnCCCCnnnn>CCCCnCCCCCCCnCC>CCCCnCCCCCCnnn~~~~~~>CCCCnCCCCCCCnCC>CCCCnCCCCCCnnn>nCCnCCC>CCnnCC>CnCCnCCC>CCnnnn>nCCnCCC>CCnnCC>CnCCnCCC>CCnnnn>CCCCC>>CnnnCCCCCCCCCC>>CnnnCCnƽ潽潽潽潽潽潽潽潽潽潽潽>CCCCC>>CnnnCCCCCCCCCC>>CnnnCCn>CCC>>>CnCCCCCCnCCCC>>>CnnCCCCn~~~~~~~~~~~~>CCC>>>CnCCCCCCnCCCC>>>CnnCCCCn>CC>CCnCCCCCC>CCCCC>CCCCCCCCC>n~~~~~~~~~~~~~~~~>CC>CCnCCCCCC>CCCCC>CCCCCCCCC>n>CCCCnCCCCCC>CCCCCCCCCCCCCCC>Cnƽ~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CCCCnCCCCCC>CCCCCCCCCCCCCCC>Cn>CC>CCCCC>>>CCCC>CCCCCCCC>>>CCnƽ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CC>CCCCC>>>CCCC>CCCCCCCC>>>CCn>>>CCCC>>>>CCCC>>CCCCCC>>>>CCCC~~~~~~~~~~~~~~~~~~~~~~~~~>>>CCCC>>>>CCCC>>CCCCCC>>>>CCCC>>>>C>>>>>>>C>>>>>C>C>>>>>>>CCn~~~~~~>>>>C>>>>>>>C>>>>>C>C>>>>>>>CCnr潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽nrrrrrrrr~~~~~~~~~~~~~~~~~~CrrrrrrrrrrrCnCnrrrrr~~~~~~~~~~~~~~~~~~~~~CrrrCnCnrrrrrnnrrnCCnnnrnnnnr~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CnnCCCnnnrnCCnrnCnn>CnnnCnCCnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CnC>CnnnCnCCnnnCnC>>CnnCCCCnnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>C>>CnnCCCCnnnCC>CCCCnCCCCCCnnn~~~~~~~~~~>CCCCnCCCCCCCnCCCnCCnCCC>CCnnnn>nCCnCCC>CCnnCC>CCCCCC>>CnnnCCnƽ潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽>CCCCC>>CnnnCCCCCCCC>>>CnnCCCCn~~~~~~~~~~~~~~~~~~>CCC>>>CnCCCCCCnCCC>CCCCCCCCC>nƽ~~~~~~~~~~~~~~~~~~~~~>CC>CCnCCCCCC>CCCCCCCCCCCCCC>Cn~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CCCCnCCCCCC>CCC>CCCCCCCC>>>CCnƽ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CC>CCCCC>>>CCCC>CCCCCC>>>>CCCC~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>>>CCCC>>>>CCCC>>>C>C>>>>>>>CCn~~~~~~>>>>C>>>>>>>C>>>nrr潽潽潽潽潽潽潽潽潽潽潽潽nrrCrrrrrrrrrrrrrr~~~~~~~~~~~~CrrrrrrrrrrrrrrCrrrCnCnrrrrrnrrrrCnCnrrrrr~~~~~~~~~~~~~CrrrCnCnrrrrrnrrrrCnCnrrrrrCnnCCCnnnrnCCnrnnrrnCCnnnrnnnnr~~~~~~~~~~~~~~~~~~~~~~~~~~CnnCCCnnnrnCCnrnnrrnCCnnnrnnnnrCnC>CnnnCnCCnnnCCnn>CnnnCnCCnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~CnC>CnnnCnCCnnnCCnn>CnnnCnCCnnn>C>>CnnCCCCnnnCCnC>>CnnCCCCnnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~>C>>CnnCCCCnnnCCnC>>CnnCCCCnnnn>CCCCnCCCCCCCnCC>CCCCnCCCCCCnnn~~~~~~>CCCCnCCCCCCCnCC>CCCCnCCCCCCnnn>nCCnCCC>CCnnCC>CnCCnCCC>CCnnnn>nCCnCCC>CCnnCC>CnCCnCCC>CCnnnn>CCCCC>>CnnnCCCCCCCCCC>>CnnnCCnƽ潽潽潽潽潽潽潽潽潽潽潽>CCCCC>>CnnnCCCCCCCCCC>>CnnnCCn>CCC>>>CnCCCCCCnCCCC>>>CnnCCCCn~~~~~~~~~~~~>CCC>>>CnCCCCCCnCCCC>>>CnnCCCCn>CC>CCnCCCCCC>CCCCC>CCCCCCCCC>n~~~~~~~~~~~~~~~~>CC>CCnCCCCCC>CCCCC>CCCCCCCCC>n>CCCCnCCCCCC>CCCCCCCCCCCCCCC>Cnƽ~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CCCCnCCCCCC>CCCCCCCCCCCCCCC>Cn>CC>CCCCC>>>CCCC>CCCCCCCC>>>CCnƽ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CC>CCCCC>>>CCCC>CCCCCCCC>>>CCn>>>CCCC>>>>CCCC>>CCCCCC>>>>CCCC~~~~~~~~~~~~~~~~~~~~~~~~~>>>CCCC>>>>CCCC>>CCCCCC>>>>CCCC>>>>C>>>>>>>C>>>>>C>C>>>>>>>CCn~~~~~~>>>>C>>>>>>>C>>>>>C>C>>>>>>>CCnr潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽nrrrrrrrr~~~~~~~~~~~~~~~~~~CrrrrrrrrrrrCnCnrrrrr~~~~~~~~~~~~~~~~~~~~~CrrrCnCnrrrrrnnrrnCCnnnrnnnnr~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CnnCCCnnnrnCCnrnCnn>CnnnCnCCnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CnC>CnnnCnCCnnnCnC>>CnnCCCCnnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>C>>CnnCCCCnnnCC>CCCCnCCCCCCnnn~~~~~~~~~~>CCCCnCCCCCCCnCCCnCCnCCC>CCnnnn>nCCnCCC>CCnnCC>CCCCCC>>CnnnCCnƽ潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽>CCCCC>>CnnnCCCCCCCC>>>CnnCCCCn~~~~~~~~~~~~~~~~~~>CCC>>>CnCCCCCCnCCC>CCCCCCCCC>nƽ~~~~~~~~~~~~~~~~~~~~~>CC>CCnCCCCCC>CCCCCCCCCCCCCC>Cn~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CCCCnCCCCCC>CCC>CCCCCCCC>>>CCnƽ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CC>CCCCC>>>CCCC>CCCCCC>>>>CCCC~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>>>CCCC>>>>CCCC>>>C>C>>>>>>>CCn~~~~~~>>>>C>>>>>>>C>>>nrr潽潽潽潽潽潽潽潽潽潽潽潽nrrCrrrrrrrrrrrrrr~~~~~~~~~~~~CrrrrrrrrrrrrrrCrrrCnCnrrrrrnrrrrCnCnrrrrr~~~~~~~~~~~~~CrrrCnCnrrrrrnrrrrCnCnrrrrrCnnCCCnnnrnCCnrnnrrnCCnnnrnnnnr~~~~~~~~~~~~~~~~~~~~~~~~~~CnnCCCnnnrnCCnrnnrrnCCnnnrnnnnrCnC>CnnnCnCCnnnCCnn>CnnnCnCCnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~CnC>CnnnCnCCnnnCCnn>CnnnCnCCnnn>C>>CnnCCCCnnnCCnC>>CnnCCCCnnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~>C>>CnnCCCCnnnCCnC>>CnnCCCCnnnn>CCCCnCCCCCCCnCC>CCCCnCCCCCCnnn~~~~~~>CCCCnCCCCCCCnCC>CCCCnCCCCCCnnn>nCCnCCC>CCnnCC>CnCCnCCC>CCnnnn>nCCnCCC>CCnnCC>CnCCnCCC>CCnnnn>CCCCC>>CnnnCCCCCCCCCC>>CnnnCCnƽ潽潽潽潽潽潽潽潽潽潽潽>CCCCC>>CnnnCCCCCCCCCC>>CnnnCCn>CCC>>>CnCCCCCCnCCCC>>>CnnCCCCn~~~~~~~~~~~~>CCC>>>CnCCCCCCnCCCC>>>CnnCCCCn>CC>CCnCCCCCC>CCCCC>CCCCCCCCC>n~~~~~~~~~~~~~~~~>CC>CCnCCCCCC>CCCCC>CCCCCCCCC>n>CCCCnCCCCCC>CCCCCCCCCCCCCCC>Cnƽ~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CCCCnCCCCCC>CCCCCCCCCCCCCCC>Cn>CC>CCCCC>>>CCCC>CCCCCCCC>>>CCnƽ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CC>CCCCC>>>CCCC>CCCCCCCC>>>CCn>>>CCCC>>>>CCCC>>CCCCCC>>>>CCCC~~~~~~~~~~~~~~~~~~~~~~~~~>>>CCCC>>>>CCCC>>CCCCCC>>>>CCCC>>>>C>>>>>>>C>>>>>C>C>>>>>>>CCn~~~~~~>>>>C>>>>>>>C>>>>>C>C>>>>>>>CCnr潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽nrrrrrrrr~~~~~~~~~~~~~~~~~~CrrrrrrrrrrrCnCnrrrrr~~~~~~~~~~~~~~~~~~~~~CrrrCnCnrrrrrnnrrnCCnnnrnnnnr~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CnnCCCnnnrnCCnrnCnn>CnnnCnCCnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~CnC>CnnnCnCCnnnCnC>>CnnCCCCnnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>C>>CnnCCCCnnnCC>CCCCnCCCCCCnnn~~~~~~~~~~>CCCCnCCCCCCCnCCCnCCnCCC>CCnnnn>nCCnCCC>CCnnCC>CCCCCC>>CnnnCCnƽ潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽潽>CCCCC>>CnnnCCCCCCCC>>>CnnCCCCn~~~~~~~~~~~~~~~~~~>CCC>>>CnCCCCCCnCCC>CCCCCCCCC>nƽ~~~~~~~~~~~~~~~~~~~~~>CC>CCnCCCCCC>CCCCCCCCCCCCCC>Cn~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CCCCnCCCCCC>CCC>CCCCCCCC>>>CCnƽ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CC>CCCCC>>>CCCC>CCCCCC>>>>CCCC~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>>>CCCC>>>>CCCC>>>C>C>>>>>>>CCn~~~~~~>>>>C>>>>>>>C>>>nrr潽潽潽潽潽潽潽潽潽潽潽潽nrrCrrrrrrrrrrrrrr~~~~~~~~~~~~CrrrrrrrrrrrrrrCrrrCnCnrrrrrnrrrrCnCnrrrrr~~~~~~~~~~~~~CrrrCnCnrrrrrnrrrrCnCnrrrrrCnnCCCnnnrnCCnrnnrrnCCnnnrnnnnr~~~~~~~~~~~~~~~~~~~~~~~~~~CnnCCCnnnrnCCnrnnrrnCCnnnrnnnnrCnC>CnnnCnCCnnnCCnn>CnnnCnCCnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~CnC>CnnnCnCCnnnCCnn>CnnnCnCCnnn>C>>CnnCCCCnnnCCnC>>CnnCCCCnnnn~~~~~~~~~~~~~~~~~~~~~~~~~~~>C>>CnnCCCCnnnCCnC>>CnnCCCCnnnn>CCCCnCCCCCCCnCC>CCCCnCCCCCCnnn~~~~~~>CCCCnCCCCCCCnCC>CCCCnCCCCCCnnn>nCCnCCC>CCnnCC>CnCCnCCC>CCnnnn>nCCnCCC>CCnnCC>CnCCnCCC>CCnnnn>CCCCC>>CnnnCCCCCCCCCC>>CnnnCCnƽ潽潽潽潽潽潽潽潽潽潽潽>CCCCC>>CnnnCCCCCCCCCC>>CnnnCCn>CCC>>>CnCCCCCCnCCCC>>>CnnCCCCn~~~~~~~~~~~~>CCC>>>CnCCCCCCnCCCC>>>CnnCCCCn>CC>CCnCCCCCC>CCCCC>CCCCCCCCC>n~~~~~~~~~~~~~~~~>CC>CCnCCCCCC>CCCCC>CCCCCCCCC>n>CCCCnCCCCCC>CCCCCCCCCCCCCCC>Cnƽ~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CCCCnCCCCCC>CCCCCCCCCCCCCCC>Cn>CC>CCCCC>>>CCCC>CCCCCCCC>>>CCnƽ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>CC>CCCCC>>>CCCC>CCCCCCCC>>>CCn>>>CCCC>>>>CCCC>>CCCCCC>>>>CCCC~~~~~~~~~~~~~~~~~~~~~~~~~>>>CCCC>>>>CCCC>>CCCCCC>>>>CCCC>>>>C>>>>>>>C>>>>>C>C>>>>>>>CCn~~~~~~>>>>C>>>>>>>C>>>>>C>C>>>>>>>CCnxevil-2.02r2.orig/win32/res/Nin0b.bmp0100644000175000017500000000546606604053340016516 0ustar aaronlaaronlBM6 6( 8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,mm,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Nin0c.bmp0100644000175000017500000000546606604044320016515 0ustar aaronlaaronlBM6 6( 8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Nin0d.bmp0100644000175000017500000000546606617625320016527 0ustar aaronlaaronlBM6 6( 8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,mmmm,,,,,,,,,,,m,,,,,,,,,,,m,,,,,,,,,,,,mm,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Nin0e.bmp0100644000175000017500000000546606604125500016517 0ustar aaronlaaronlBM6 6( 8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,mm,,,,,,,mm,,,,,,,,,m,,,,,,,,,,,mm,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Nin0f.bmp0100644000175000017500000000546606604044320016520 0ustar aaronlaaronlBM6 6( 8hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Nin5.bmp0100644000175000017500000000512606604044320016350 0ustar aaronlaaronlBMV 6(8 hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,mm,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/ninatt_down.bmp0100644000175000017500000000530606604044320020063 0ustar aaronlaaronlBM 6(<hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,mm,,,,,,,,,,,mmmm,,,,,,,,,,mmm,,,,,,,,,,mm,,,,,,,,,mmm,,,,,,mmmm,,,,,mmm,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Ninj0a.bmp0100644000175000017500000000450606604044320016657 0ustar aaronlaaronlBMF 6($$hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Ninj0b.bmp0100644000175000017500000000450606604044320016660 0ustar aaronlaaronlBMF 6($$hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Ninj0c.bmp0100644000175000017500000000450606604044320016661 0ustar aaronlaaronlBMF 6($$hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Ninj0d.bmp0100644000175000017500000000450606604044320016662 0ustar aaronlaaronlBMF 6($$hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/ninjump_down1.bmp0100644000175000017500000000530606604044320020327 0ustar aaronlaaronlBM 6(<hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,m,,,,mm,,mm,,,,mm,,mm,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/ninjump_down2.bmp0100644000175000017500000000530606604044320020330 0ustar aaronlaaronlBM 6(<hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,m,,,,mm,,mm,,,,mm,,mm,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/ninjump_up.bmp0100644000175000017500000000530606604044320017723 0ustar aaronlaaronlBM 6(<hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,m,,,,m,,,,mm,,mm,,,,mm,,mm,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/nin_kick0jmp.bmp0100644000175000017500000000552606604044320020117 0ustar aaronlaaronlBMV 6(0& hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/nin_kick0low.bmp0100644000175000017500000000646606604044320020136 0ustar aaronlaaronlBM6 6(00 hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mmmm,,,,,,,,,,,,,,,,,,,,,,,,,,,mmm,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,mm,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Outa.bmp0100644000175000017500000002550606604044320016453 0ustar aaronlaaronlBMF+6(dd'hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U潽罽潽潽罽xevil-2.02r2.orig/win32/res/Outb.bmp0100644000175000017500000002550606604044320016454 0ustar aaronlaaronlBMF+6(dd'hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U뽽뽽뽽뽽xevil-2.02r2.orig/win32/res/Outside.bmp0100644000175000017500000002550606604044320017157 0ustar aaronlaaronlBMF+6(dd'hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U瘽瘽潽뽽뽽뽘罘罽뽽뽘똽罽뽽罽뽘뽽½뽽罽罽½뽽½뽘뽽뽽xevil-2.02r2.orig/win32/res/sealcenter.bmp0100644000175000017500000000310606604044320017660 0ustar aaronlaaronlBMF6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U, ~,,,,~~~ ~~~,,,,~ , ~ ,,,~~~ ~~~,,,~ ~ , ~~,, ~ ~ ,, ~ ,, ~ ~ ~ ,,, ~ ~~ ,,, ,,,, ,,,,, ,,,,, ,,,,,, ,,,,,,, ,,,,,,,, ~~ ,,,,,,,,, ~ ~ ,,,,,,,,, ~ ~ ,,,,,,,,,, ,,,,,,,,,,, ,,,,,,,,,,, ~ ~ ,,,,,,,,,,,, ~ ~ ,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/troll18.bmp0100644000175000017500000000516606626360750017064 0ustar aaronlaaronlBMv 6( 2@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,昘,,,,,,,,,,,,,,,,,,,,,,,,d`d,,,,,,,,,,,,,,,|`|,|~~,,,,,,,,,,,,,,~`~,````~,,,,,,,,,,,,,,~d,|dd|,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,d,,,,,,,,,,,,,,,,,,dd|,,~,,,,,,,,,,,,d`|,,~`|,,,,,,,d`|,~d`|,,,,,,,~~dd~d``|,,,,,,,~``|d```|,,,,,,,d``d~``~,,,,,,,d``~~~d`|~|d,,,,,,,,```,~ddd````d|dd,,,,,,,,d`|,,~``````````d,,,,,,,,|`~,,~``````````d,,,,,,,,dd,,~``````````d,,,,,,,,dd,~``````````d,,,,,,,,d`d,~``````````d,,,,,,,,|``d~``````````d,,,,,,,,|```d~``````````d,,,,,,,,|````|~``````````d,,,,,,,,~``d||~``````````d,,,,,,,,~``~~``````````d,,,,,,,,|`|``````````d,,,,,,,|||d``````````d,,,,|`````````````d~,,,,,```````````````|,,,,,,|`````````````d,,,,,~d`````````dd`~,,,~~~````````d~,~d~d````````d,,d`d`````````d~,,,|```````````d~,,,~```````````d~~,,,|```````````ddd,,,,d````````````~,,,,d````````````~~,,,,~|`````````````|~|,,,,,|````````````````d~,,,,,d`````````````d~~,,,,,,,|`````d|`d|~|d|d,,,,,,,|```d~~||`d,,,,,,,,d``~|``,,,,,,,,|ddd|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/troll18b.bmp0100644000175000017500000000516606626360750017226 0ustar aaronlaaronlBMv 6( 2@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,뽘,,,,,,,,,,,,,|``|,,,,,,,,,,,,,~~d,d`~,,,,,,,,,,,,,~````~,,|`,,,,,,,,,,,,,|dd|d,,,,,,,,,,,,,,,|,,,,,,,,,,,,,,,,,~|,,,,,,,,,,,,,,,~,,dd|,,,,,,,,,,,,,,,|`|,``|,,,,,,,,,,,,|``~,``|,,,,,,|``d|`|~~,,,,,,|```~d``d,,,,,,~``~|```~,,,,,,d||d`||d``|,,,,,,,d`||`````dd`,|``|,,,,,,,d```````````,,~``|,,,,,,,d```````````,,d`~,,,,,,d```````````,,|`~,,,,,,d```````````,,|`~,,,,,,d```````````,|``~,,,,,,d``````````````~,,,,,,d```````````|``d~,,,,,,d```````````~```d,,,,,,,d```````````|```d,,,,,,d``````````dd```|,,,,,d``````````d~d```,,,,d```````````d||d``d,,,,~``````````````````,,,d``````````````d|~,,,~`````````````|,,,~|````````````~,,,~~|```````````d~,,d|```````````d,|d~~d``````````d,~`````````````|,d````````````~~,|````````````|~|d````````````d`~~~`````````````d,~~`````````````d~,~|~~d``````````````|~|,,~~d`````````````````|,,,~d~~``````````````d~,,,,~`||`````||dd~~d~,,,,,|``|```||,,,,,,~|d|d`d~~,,,,,,,,|~,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/updn.bmp0100644000175000017500000000406606625044256016522 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**UnnrrnCCnnC>>CrnC>>CrrCC>>CrrrrrC>>CrrrCrCCrnnrrnCn>>nnnnrCC>>>>>>CnCnr>>rnCC>Cn>>nC>CCnn>>>>CCn>>nCC>C>nnn>>nnn>nn>>nnCCn>CCn>>nCC>n>>>>CnC>Cn>>nC>Cn>nr>>rnCCnC>>>>>>Cn>CCCnn>>n>CCCnCCnCCnn>CC>CrC>>Cr>C>CCCCCnC>>CnCn>CCCCnC>>Cr>>CCC>CCCnnC>>CnnCCn>CC>CrnCCn>CCCC>CCCCCnnnn>CCCC>>>CCCnnrnCCCC>>>C>C>>>>>>>CCn>>>>C>>>>>>>C>>>nrrCrrrrrrrrrrrrrrCrrrCnCnrrC>>rCnCnrrrrrCnnCCCnnnrr>n>rnCCrnnnnrCnC>CnnrCC>>>>rn>nCCnnn>C>>CnnrCC>n>>rC>CCnnnn>CCCCnCC>C>>r>>>CCnnn>nCCnCrC>>>rC>>Cnnnn>CCCCrCrrC>C>n>rrCnnnCCn>CCCn>>rn>>nrC>nCCCCn>CC>CCnrC>>>>r>>CCCC>n>CCCCnCCC>>>>>>>C>>CCC>Cn>CC>CCCCnnC>>>nn>>C>>>CCn>>>CCCC>>nrrnCC>>>>CCCC>>>>C>>>>>>>C>>>>>C>C>>>>>>>CCnxevil-2.02r2.orig/win32/res/Wall.bmp0100644000175000017500000000406606625100356016445 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**UrnrrrrrrrrCrrrrrrrrrrrCnCnrrrrrCrrrCnCnrrrrrnnrrnCCnnnrnnnnrCnnCCCnnnrnCCnrnCnn>CnnnCnCCnnnCnC>CnnnCnCCnnnCnC>>CnnCCCCnnnn>C>>CnnCCCCnnnCC>CCCCnCCCCCCnnn>CCCCnCCCCCCCnCCCnCCnCCC>CCnnnn>nCCnCCC>CCnnCC>CCCCCC>>CnnnCCn>CCCCC>>CnnnCCCCCCCC>>>CnnCCCCn>CCC>>>CnCCCCCCnCCC>CCCCCCCCC>n>CC>CCnCCCCCC>CCCCCCCCCCCCCC>Cn>CCCCnCCCCCC>CCC>CCCCCCCC>>>CCn>CC>CCCCC>>>CCCC>CCCCCC>>>>CCCC>>>CCCC>>>>CCCC>>>C>C>>>>>>>CCn>>>>C>>>>>>>C>>>nrrCrrrrrrrrrrrrrrCrrrCnCnrrrrrnrrrrCnCnrrrrrCnnCCCnnnrnCCnrnnrrnCCnnnrnnnnrCnC>CnnnCnCCnnnCCnn>CnnnCnCCnnn>C>>CnnCCCCnnnCCnC>>CnnCCCCnnnn>CCCCnCCCCCCCnCC>CCCCnCCCCCCnnn>nCCnCCC>CCnnCC>CnCCnCCC>CCnnnn>CCCCC>>CnnnCCCCCCCCCC>>CnnnCCn>CCC>>>CnCCCCCCnCCCC>>>CnnCCCCn>CC>CCnCCCCCC>CCCCC>CCCCCCCCC>n>CCCCnCCCCCC>CCCCCCCCCCCCCCC>Cn>CC>CCCCC>>>CCCC>CCCCCCCC>>>CCn>>>CCCC>>>>CCCC>>CCCCCC>>>>CCCC>>>>C>>>>>>>C>>>>>C>C>>>>>>>CCnxevil-2.02r2.orig/win32/res/Weight2.bmp0100644000175000017500000000357606604100422017053 0ustar aaronlaaronlBM~6(HhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,{{d{ {{{{d,{d{{{ ,d{ {|d,,{dd{{|{,,,{{{{{{{{dd,,,,,,,,,,,,dd|,,, ,,,,{U,,,,{ ,,,,, U,,,,,{ ,,,,, U,,,,,{ ,,,,, U,,,,,,{ ,,,,,,,d ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Yshield.bmp0100644000175000017500000000252606604044322017143 0ustar aaronlaaronlBMV6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,, >,,,,,,,,,, ?F,,,,,,,, >?F,,,,,,F>F??,,,,,mm>FmmF,,,, mmmmmmF,,mmr>>mmF,mr>n>>mF,r;y#yy#y;F,m y'.y;rmF, m;y.'ynm>, n y#yy#>>, m yn;y>m,Gm mG, FmnmmFmF>,  ??F, ?FFFFFFF?,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hiddog0.bmp0100644000175000017500000000302606644612410017057 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U|,,,,,,,,,,,,,|,,,,,,, |,|,,,,,,,,,| ,|,,,,,, |,,,,,,,,, ,,,,,,, |,,,,,,,| |,,,,,,, |,,,,,,| ,,,,,,,,, ||,,,|| |,,,!,,,, |,,,,!,,,,, |,,| !,,,,, | | !,,,,,, | !,,,,,, | !q,,,,,, , , ,, ,,,,,,,, |qq ,, ,,,,,,,,,, | , ,,,,,,,,,, | | ,,|,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,,, |, |,,,,,,,,,,,,,,,,,,,, ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hiddog0_.bmp0100644000175000017500000000302606644612410017216 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U|,,,,,,,,,,,,,| ,,|,,, |,|,,,,,,,,| ,|,,,,, |,,,,,,,| |,,,,,, |,,,,,| |,,,,,,, |,,,|| ||,,,,,,,,, ||,| |,,,,,,,,, || ,,,,,, | ,,,,,,, | , ,,,,, |!q,,,,,,, |q,,,,,,, ,,,, |q,,,,,,, ,,,,,,,,,, q , , ,,,,,,,,,,,, | ,,,,,,,,,,,,, ,,,,,,,,,,,, ||| |,,,,,,,,,,,, | | ,,,,,,,,,,,,,,, | ,,,,,,,,,,,,, ,|| ,,,,,,,,,,,,,,,,,, ,,,,,,,,xevil-2.02r2.orig/win32/res/hiddog0b.bmp0100644000175000017500000000302606644611244017225 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,|,,,,|,,,,,,,,,,,,,,| ,,,, ,,,,,,,,,,,,,,| ,,,,| ,,,,,,,,,,,,| ,,,,| ,,,,,,,,,,,| ,,,,, ,,,!,,,,,,| ,,,, |,,,!,,,,,, ,, |,,| !,,,,,, | | !,,,,,,, | !,,,,,,, | !q,,,,,,, , ,, ,,, |qq , ,,,,,,,,,, | ,,,,,,,,,,, | | ,,|,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,, | | ,,,,,,,,,,,,,,,,, |, |,,,,,,,,,,,,,,,,,,,, ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hiddog21.bmp0100644000175000017500000000302606644612410017142 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,, ,,,,,,, ,,,,,,,,,, ,,,,, ,,,,,,,,,,, ,,, ,,,,,,,,,,, ||,,,,,,,,,, |,,,,,,,,,,, |,,,||,,,,,, |,,,|,,,,,,, ,,,|,,,,,,,, ||, |,,,,,, | |, ,,,,, | ,, ,,, |,, |,,,, | ||,,,,| |||| ||,,,,,,| | ! |,,,,,,, | | | qqq| ,,,,,,, | q,,, ,,,,,,, | ,,,, ,,,,,,,, ,,,, ,,,,,,, , ,,,,, ,,,,,|,,, ,,,,,,,,,,,,,,,,, ,,,,,,,,,,,|,,,,|,,,,,,,,,,,,, |xevil-2.02r2.orig/win32/res/hiddog2_.bmp0100644000175000017500000000274606644612410017230 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,|, |,,,,,,,,,,,,,,,|,,| |,,,,,,,,,,, ,,| |,,,,,,,,,,, |,,,|| |,,,,,,,,,,,, |,,| |,,,,,,,,,,, ||,| || ,,,,,, | ,,,,,,, | , ,,,,,,, |!q,,,,,,,, |q,,,,,,, |q,,,,,,, ,,,, q , , , ,,,,,,,,,, | ,,,,,,,,,,,,, ,,,,,,,,,,,, ||| |,,,,,,,,,,,, | | ,,,,,,,,,,,,,,, | ,,,,,,,,,,,,, ,|| ,,,,,xevil-2.02r2.orig/win32/res/bmp00015.bmp0100644000175000017500000000302606644612410016705 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,, |,,,,, ,,,,,, |,,,,,,,, ,,, |,,,,,,,,,, ||,,,,,,,, |,,,,,,,,,, |,,,,,,,,,,, |,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,, |,,,,,,,,,,,, |,,,,,,, |,,,,, | | |,,,,,,| | |,,, | | | ||| |, | | q | ,,|,,,,,| | q! |,,,,|,,,, q! |,,,,,|,,,, ,! ,,,,,,,,,,,,, ,,!!!,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,|,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00017.bmp0100644000175000017500000000302606644612412016711 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,, ,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,, |,,,,,,,,,,,,, |,,,,,,,,,,,, |,,,,,,,,, |,,,,,,,, ,, |,,,,,,,,, ,,,,, |,,,,,,,, ,,,,,,,,,,,,,,, ,,,,,,,,, ,,,,,,, | | ||,,,,,,| | |,,, | | | ||,,,, | | q | ,|,,,,| | q! |,,,,,,,,,,, q! |,,,,,,,,,,, ,! ,,,,,,,,,,,,, ,,!!!,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,|,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00022.bmp0100644000175000017500000000302606644612412016705 0ustar aaronlaaronlBM6(hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,|,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,, ,,!!!,,,,,,,,, ,! ,,,,,,,,,, q! |,,,,,,,,,,| | q! |,,,,,,,,, | | q | ,|,,, | | | ||,,,,,,| | |,, | | ||,,,,, ,,,,,,,,,,,,, ,,,,,,,,,,,,,, ,,,,,,,,,,,,,,, ,,,,, |,,,,,,,, ,, |,,,,,,,,, |,,,,,,,,, |,,,,,,,,,, |,,,,,,,,,,,, |,,,,,,,,,,,, ,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/hiddog5b.bmp0100644000175000017500000000244606644612412017235 0ustar aaronlaaronlBM&6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U|,,,,,,|v|,,,,,,| |,,|  |,,| > || ` ||||  ! 2 ! |!| 2 | ! | 7, | ! | ,~,| q!!q |,e, q ,, ,~,| |,),| | |,,, ,,,, || ,,΁,, |,,| ,,΁,,, ,, ,,,xevil-2.02r2.orig/win32/res/xit.bmp0100644000175000017500000001110606647301654016353 0ustar aaronlaaronlBMF6(<<hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xevil-2.02r2.orig/win32/res/blood39.bmp0100644000175000017500000000225606647431516017031 0ustar aaronlaaronlBM6( xhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U//,,,,,,,,///,,,,,,,,////,,,,,,,////,,,,~,,//////,,B,,,,/////,,,,,//////ρ,,,,,/////,,,,,/////,,,,,,///,xevil-2.02r2.orig/win32/res/blood4.bmp0100644000175000017500000000212606647431520016730 0ustar aaronlaaronlBMV6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,//,////////////////////////,//,xevil-2.02r2.orig/win32/res/blood40.bmp0100644000175000017500000000222606647431520017011 0ustar aaronlaaronlBM6( `hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U///,,,,,,,,,////,,,,,,,,,,/////,,,,,,,////////,,,,,,////////,,,,,///////,,,,,,,/////,,,,,,,,////xevil-2.02r2.orig/win32/res/blood9.bmp0100644000175000017500000000212606647431522016737 0ustar aaronlaaronlBMV6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U////////////////,,,,,,/////,,,ρxevil-2.02r2.orig/win32/res/bloodg9.bmp0100644000175000017500000000212606647433220017103 0ustar aaronlaaronlBMV6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,xevil-2.02r2.orig/win32/res/oil25.bmp0100644000175000017500000000216606647433220016502 0ustar aaronlaaronlBMv6(@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,6,,,,,,,,,,,΁xevil-2.02r2.orig/win32/res/oil39.bmp0100644000175000017500000000225606647433222016511 0ustar aaronlaaronlBM6( xhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,v,,,,,,,,,,,,,,,,,,, ,,,,1,,,,,,,,,,,,,,,,,,,ρ,,,,,,,ρxevil-2.02r2.orig/win32/res/oil4.bmp0100644000175000017500000000212606647433224016417 0ustar aaronlaaronlBMV6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,xevil-2.02r2.orig/win32/res/oil40.bmp0100644000175000017500000000222606647433224016500 0ustar aaronlaaronlBM6( `hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/oil9.bmp0100644000175000017500000000212606647433226016426 0ustar aaronlaaronlBMV6( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,ρxevil-2.02r2.orig/win32/res/bmp00040.bmp0100644000175000017500000000244606647435732016725 0ustar aaronlaaronlBM&6(<hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,ρ,΁,ρ΁΁΁v6*7*>**6*7c*V*fJ*nJ΁сA΁΁Z fp,y,,xevil-2.02r2.orig/win32/res/bmp00020.bmp0100644000175000017500000000225606647435732016722 0ustar aaronlaaronlBM6(<xhUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,xevil-2.02r2.orig/win32/res/take_can.bmp0100644000175000017500000002206606647446332017326 0ustar aaronlaaronlBM6$6(@ hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,nnnrnnnnrnnnrCnnnrnnnrnnnnCnnnrnnnnrnnnrCnnnrnnnrnnnrnnnnrnnnrCnnnrnnnrnnnnC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rnnrnnnnrnnrCnnnrnnnnnnrCrnnrnnnnrnnrCnnnrnnnnnrrnnrnnnnrnnrCnnnrnnnnnnrC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rnrrrnnrrCnnrrrnnrrnnrCrnrrrnnrrCnnrrrnnrrnnrrnrrrnnrrCnnrrrnnrrnnrC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rrrrrrrrrrrrrrrrrrrrrrr,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r>>>>>>>>>>r>>>>>>>>>>>>>r>>>>>>>>>>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rCnn>>CCCCC>>CCrCnnC>>CCCnn>>CCCnnrCn>CCC>>CCrCnnCC>CCCCC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rn>>CCCCC>>CCCCrnC>CCCCC>>CCCCC>C>CCCrn>CCCCCCCCrCC>CCCCCCC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rnnnnnrnnnnrnCnnnrnnnnrnnnrrnnnnnrnnnCnnCrnnnnnnCnrnrnnnnnrnrnC,,,,,,,,,,,,,,,,rnnnnnrnnnnrrCnnnrnnnnnnrnrnnnnnrnnnnnrnnnnnnnrCnnnrnnnnrrCnnnnnnnnrnnnnnrnnrC,,,,,,,,,,,,,,,,rrrnrnrrrrrCnnrrnnrrrCrrrnrnrrrrrCnrnrrrnrCrrrnrnrrrrrCnnrrnnrrnnrCrrrnrnrrrrrC,,,,,,,,,,,,,,,,rrrrnrrrrrrrrrrrrrrr,,,,,,,,,,,,,,,,r>>>>>>>>>r>>>>>>Cn>r>>>>>>>>>>r>>>>>C>>nnr>>>>>>>>>>r>>>>>>>>>>r>>>>>>>>>>,,,,,,,,,,,,,,,,r>CC>>CCCC>>>CrCnn>>C>CCr>CC>>CCCC>>>CCrCnn>>CCnn>nnr>CC>>CCCC>>>CCrCnn>>CCCCC>>CCr>CC>>CCCC>>>CC,,,,,,,,,,,,,,,,r>>>CCCC>>>>Crn>CCCCr>>>CCCC>>>>CCCrn>>CCCCCnnnr>>>CCCC>>>>CCCrn>>CCCCC>>CCCCr>>>CCCC>>>>CCC,,,,,,,,,,,,,,,,,,,,,,,,nnnrnnrnCCnCnnrnnnnrnrCnnnrnnnrnnnnCnnnrnnnnrnnnrCnnnrnnnrnnnnCnnnrnnnnrnnnrCnnnrnnnrnnnnCrnnrnnnnCnnnrnnnnnrCnnnrnnnnnnrCrnnrnnnnrnnrCnnnrnnnnnnrCrnnrnnnnrnnrCnnnrnnnnnnrCrnrrrnnrCnrrrnnrrCnnrrrnnrrnnrCrnrrrnnrrCnnrrrnnrrnnrCrnrrrnnrrCnnrrrnnrrnnrCrrrrrrrrrrrrrrrrrrrrrrrrrrrrr>>>>>>>>>CnC>>>>>>>>r>>>>>r>>>>>>>>>r>>>>>>>>>>r>>>>>>>>>rCnn>>CCCCC>>nn>>CCCC>CCnnC>C>CCrCC>>CCrCnnC>CC>CCCCCrCnn>>CCCCC>>CCrCnnC>CC>CCCCCrn>>CCCCC>>CCCnn>>CCCCC>CCCC>>CCCCCnC>>CCCCrnC>>CC>CCCCCCCrn>>CCCCC>>CCCCrnC>>CC>CCCCCCC,,,,,,,,rnnnnnrnCnCrCnnnrnnnnCrrnCnrnnnnrnnnnnrnnnnrnCnnnrnnnnrnnnnCrnnnnnrnnnnrnC,,,,,,,,,,,,,,,,rnnnnnrnnCrrCCnnnnnnrCrnnnrnCrnnnrrnnnnnrnnnnrrCnnnrnnnnnnnrCrnnnnnrnnnnrrC,,,,,,,,,,,,,,,,rrrnrnrrrrrCnrCnrrnnrCrrrnrrrrrCnnrrnnrrnnrCrrrnrnrrrrrCnnrrnnrrnnrCrrrnrnrrrrrC,,,,,,,,,,,,,,,,rrrrrrrrrrrrrrrrrrrr,,,,,,,,,,,,,,,,r>>>>>>>>>>r>>>>>>>>>r>>>>>>>>>r>>>>>>>>>>r>>>>>>>>>>r>>>>>>>>>>r>>>>>>>>>>,,,,,,,,,,,,,,,,r>CC>>CCCC>>>CCrCnn>nr>CCC>>CCr>CCCC>>>CCrCnn>>CCCCC>>CCr>CC>>CCCC>>>CCrCnn>>CCCCC>>CCr>CC>>CCCC>>>CC,,,,,,,,,,,,,,,,r>>>CCCC>>>>CCCrn>>CCnn>CCCCCCr>>>CCCC>>>>CCCrn>>CCCCC>>CCCCr>>>CCCC>>>>CCCrn>>CCCCC>>CCCCr>>>CCCC>>>>CCC,,,,,,,,,,,,,,,,,,,,,,,,nnnrnnnnrnnnrCnnnrnnnrnnnnCnnnrnnnnrnnnrCnnnrnnnrnnnnCnnnrnnnnrnnnrCnnnrnnnrnnnnCnrnnrnnnrCnnnrnnnrnnnnCrnnrnnnnrnnrCnnnrnnnnnnrCrnnrnnnnrnnrCnnnrnnnnnnrCrnnrnnnnrnnrCnnnrnnnnnnrCnrnnrnnrCnnnrnnnnnnrCrnrrrnnrrCnnrrrnnrrnnrCrnrrrnnrrCnnrrrnnrrnnrCrnrrrnnrrCnnrrrnnrrnnrCrrrnrCnnrrrnnrrnnrCrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr>>>>>>>>>>r>>>>>>>>>r>>>>>>>>>>r>>>>>>>>>>>>r>>>>>r>>>>r>>>>>>>>>rCnn>>CCCCC>>CCrCnnC>CC>CCCCCrCnn>>CCCCC>>CCnnCC>CCCCCC>>>CCnCCrnCCC>>CCrCnnC>CC>CCCCCrn>>CCCCC>>CCCCrnC>>CC>CCCCCrCCCCCCCCCCCCCn>CCCCCC>Cr>C>>CCCCrnC>>CC>CCCCCCC,,,,,,,,nn,,,,,,,,,,,,,,,,rnnnnnrnnnnrnCnrnnnnnnnnnnnCnnnrnnnnnnnrrnnrrnnnnnnnnCrnnnnnrnnnnrnC,,,,,,,,,,,,,,,,rnnnnnrnnnnrrCnrnnnnnnnnnnnnnnrnnnnnnnrCnrnnnnnrrnnnnnnrCrnnnnnrnnnnrrC,,,,,,,,,,,,,,,,rrrnrnrrrrrCnrnnrnnrnrrrnnrrnnrrnnrCnrrrrrnnrrnnnnrnrrnnrCrrrnrnrrrrrC,,,,,,,,,,,,,,,,rrrrrrrrrCnrrrrrrrr,,,,,,,,,,,,,,,,r>>>>>>>>>>>>>r>>>>>>>>r>>>>>>>>>>>>>>>>>>Cr>>>>>>>>>>r>>>>>>>>>>,,,,,,,,,,,,,,,,r>CC>>CCCC>>>CCrCnn>>CCCCC>>CCrC>>CCCC>>>CCrCnn>>CCCCC>>CC>CCC>CC>CC>nnrCnn>>CCCCC>>CCr>CC>>CCCC>>>CC,,,,,,,,,,,,,,,,r>>>CCCC>>>>CCCrn>>CCCCC>>CCCCr>>>CCCC>>>>CCCrn>>CCCCC>>CCCC>>>CC>C>CCCnnrn>>CCCCC>>CCCCr>>>CCCC>>>>CCC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,nnnrnnnrnnnnCnnnrnnnnrnnnrCnnnrnnnrnnnnCnnnrnnnnrnnnrCnnnrnnnrnnnnC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,nnnrnnnnnnrCrnnrnnnnrnnrCnnnrnnnnnnrCrnnrnnnnrnnrCnnnrnnnnnnrC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,nnrrrnnrrnnrCrnrrrnnrrCnnrrrnnrrnnrCrnrrrnnrrCnnrrrnnrrnnrC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rrrrrrrrrrrrrrrrrrrr,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r>>>>>>>>>r>>>>>>>>>>r>>>>>>>>>r>>>>>>>>>>r>>>>>>>>>,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rCnnC>CC>CCCCCrCnn>>CCCCC>>CCrCnnC>CC>CCCCCrCnn>>CCCCC>>CCrCnnC>CC>CCCCC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,rnC>>CC>CCCCCCCrn>>CCCCC>>CCCCrnC>>CC>CCCCCCCrn>>CCCCC>>CCCCrnC>>CC>CCCCCCC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/logob5.bmp0100644000175000017500000016006607041453046016740 0ustar aaronlaaronlBM66(`hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~潓~~~~~~~~~~~~~~~~潓~~~,,,,,,,,,,,,湏⋏⹹`~~⸹~ⴹ⏏揹⏴⸋`~~~⏴洹~~⏏湏~潋湏⋏⹹`~~⸹~ⴹ⏏揹⏴⸋`~~~⏴洹,,,,,,,,,,,,⸏湸깋~~湸⸏湸깋~,,,,,,,,,,,,~~洴ޏ~~縹~洴ޏޓ,,,,,,,,,,,,湸,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,洏~⏹~~޹洏~⏹,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,븽,,,,,,,,,,,,~,,,,,,,,,,,,////,,,,,,,,,,,,/////////////////////,,,,,,,,,,,,///////////////////////////////,,,,,,,,,,,,/////////////////////////,,,,,,,,,,,,//////////////,,,,,,,,,,,,////////////,,,,,,,,,,,,渹////////////,,,,,,,,,,,,//////////,,,,,,,,,,,,////////////,,,,,,,,,,,,////////////~,,,,,,,,,,,,////////////////,,,,,,,,,,,,//////////////////,,,,,,,,,,,,////////////////////,,,,,,,,,,,,/////////////////////,,,,,,,,,,,,/////////////////,,,,,,,,,,,,////////,,,,,,,,,,,,޸,,,,,,,,,,,,~,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,׺,,,,,,,,,,,,۹,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ߕFm߽⽹,,,,,,,,,,,,mmmFm癘F߾,,,,,,,,,,,,׺mqmii朽m,,,,,,,,,,,,瘘q۔iFmFmm,,,,,,,,,,,,m漏~qFmFFinq,,,,,,,,,,,,J潋~~qF",,,,,,,,,,,,m昡½朝m"朠,,,,,,,,,,,,FqFm"|"Fr,,,,,,,,,,,,F朜"qFJqJ""",,,,,,,,,,,,mm"mmٴٴٴٴٴmm"FJ"Fq",,,,,,,,,,,,~~FJ׺mqF"VVVV"~F""F"mFVmFF洹~,,,,,,,,,,,,~ۺF~mFq׺F"Vm"i99`eie|""Fq׺hqߘ朜",,,,,,,,,,,,mFmmBFJV朜Ӻi昝",,,,,,,,,,,,~m~F癘qV"i4miVqmJ,,,,,,,,,,,,F`q㘜~F׵"BVFא昝J~,,,,,,,,,,,,m{"J9V""4qqm~,,,,,,,,,,,,F|aV朜mqFmאFF潋F׺Jm,,,,,,,,,,,,m"i׵{"mm"""FFۘ|JF"朜,,,,,,,,,,,,~V""אm"݋"FiFF朜FqV"~,,,,,,,,,,,,ט=F"9F׺=""F繘"FnmFVFFVrאF,,,,,,,,,,,,nm"J9999qF""ߺF"Fmmەlm׺AqV昝,,,,,,,,,,,,im""۲V`q|F""߲ߺFF癘BFdVVJו4""FJ,,,,,,,,,,,,mnme朜dF""߲mqmJFV"iVFV~"FFJ,,,,,,,,,,,,׺ 揋m""i~m׺Fm"׵朜eV"Fq,,,,,,,,,,,,潋ⴋ""ߔVqmd"J9朜B"F"J,,,,,,,,,,,,~⏴`V""e9|m"V"V"=m""",,,,,,,,,,,,~Ӻ4F"q`q׺mV"F׹F9"9",,,,,,,,,,,,ӵV"F9V 4VFrmd"`朝m9J~,,,,,,,,,,,,׵V""eVٴٴً{9"""iӲ` VF""`F"VFq9J⏽,,,,,,,,,,,,׵4F"אVVVV9>BBe99|{Vm""F׾mV"אFF9{映,,,,,,,,,,,,׵"F aa݋""FF~F"54mmeVF,,,,,,,,,,,,~V""~|~"F"F`"q׺VVVqVJא[",,,,,,,,,,,,FVF9VFe`FFBFmm"א49FFiVm"",,,,,,,,,,,,FVJאqF~"J߱q`V"eVm"",,,,,,,,,,,,FVm mm`"朜אm"eVFF,,,,,,,,,,,,mqqFmmF&5rV{V{"FBF,,,,,,,,,,,,"昝9VJוm|"9朘eV{~"""=F,,,,,,,,,,,,׺qVُ朜א"m潴m"9"""mn4V"""m,,,,,,,,,,,,F`9朜qFF"q|""޲ai,,,,,,,,,,,,~۾F|""F9VB~"׵"""q,,,,,,,,,,,,纽ۘ{""qא4mqmnmmm9",,,,,,,,,,,,㙽F~q""qӵ~m""""FmVmiimm`"Jm,,,,,,,,,,,,㘘mVm""q| V=demF"""jmmF9ٴFFF׺F,,,,,,,,,,,,qm~~F"ӵ׶mFm朜昜mߐ~|=iF ",,,,,,,,,,,,י~~`F9 {qۘ׺F"|lBFV昽,,,,,,,,,,,,ݽFe=Jm9""אmB"F朝א4r,,,,,,,,,,,,깴i~F׶=FmVm"BFFFqFq,,,,,,,,,,,,׺=ٸ"׵FFFVFq׺뾽F"q,,,,,,,,,,,,~m|޴FF׵~""FqFq~ٴFqm9",,,,,,,,,,,,FF~"q`"""""Fm|{VVVVV"۹F~J ",,,,,,,,,,,,ߺFV`޸m""ە"F""ABe""mFFq,,,,,,,,,,,,׶א{|"""mie4""~||FF~,,,,,,,,,,,,e`""Fߺ׵VVV`F"eae 朝F"⹸,,,,,,,,,,,,|""i׌a9:`9mm"9mqmV"~,,,,,,,,,,,,Ӳ׺mJ`0"FV",,,,,,,,,,,,mqӵ9{~""""qF,,,,,,,,,,,,"FFn=9=aimqFJ,,,,,,,,,,,,~׺FFFqו=q,,,,,,,,,,,,4F,,,,,,,,,,,,VF,,,,,,,,,,,,e`V`V~m"",,,,,,,,,,,,e=~=~""F~,,,,,,,,,,,,הBFBײ,,,,,,,,,,,,mmn,,,,,,,,,,,,,,,,,,,,,,,,~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,깴,,,,,,,,,,,,~~,,,,,,,,,,,,~,,,,,,,,,,,,봹,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,돸,,,,,,,,,,,,~~,,,,,,,,,,,,~,,,,,,,,,,,,~޸,,,,,,,,,,,,,,,,,,,,,,,,~,,,,,,,,,,,,~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~揸⹹|~~揸,,,,,,,,,,,,~珏⋏~`渏~뽸빏`描~珏⋏~`渏~,,,,,,,,,,,,~潏ⴏ~縋~~~~湋~湸`~~拏⹏~縏~⸏~~潴~ⴏ~縋~~~~湋~湸`~~,,,,,,,,,,,,⹽⽽~~~⽽潹~⽽~~~~⹹潽~~~~~⽽~~⽽~~~⽽潹~⽽~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/vege2.bmp0100644000175000017500000001206606647440422016562 0ustar aaronlaaronlBM66(@@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333,,,,,,3333333333333,,,,,,,,,,,,,,3333333333333,,,,,,,,,,,,,,33333333333,,,,,,,,,,,,,,333333333333,,,,,,,,,,,,,,33333333333333333,,,,,,,,,,,,,,3333333333333,,,,,,,,,,,,,,,,,,,,,,333333333333333333333333333333333333333333333333333333333333333333333,,,,,,,3333333333333333333333,,,,,,,333333333333333333333333,,,,,,,33333333333333333333333333333,,,,,,,333333333333333333333333,,,,,,,33333333,,,,,,,3333333333,,,,,,,33333333333,,,,,,,,,,,,,,,,33,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00057.bmp0100644000175000017500000001206606647441264016731 0ustar aaronlaaronlBM66(@@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333,,,,,,3333333333333,,,,,,,,,,,,,,3333333333333,,,,,,,,,,,,,,33333333333,,,,,,,,,,,,,,333333333333,,,,,,,,,,,,,,33333333333333333,,,,,,,,,,,,,,3333333333333,,,,,,,,,,,,,,,,,,,,,,333333333333333333333333333333333333333333333333333333333333333333333,,,,,,,3333333333333333333333,,,,,,,333333333333333333333333,,,,,,,33333333333333333333333333333,,,,,,,333333333333333333333333,,,,,,,33333333,,,,,,,3333333333,,,,,,,33333333333,,,,,,,,,,,,,,,,33,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Skull.bmp0100644000175000017500000001206606647443112016643 0ustar aaronlaaronlBM66(@@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Pyramid.bmp0100644000175000017500000001206606647443132017160 0ustar aaronlaaronlBM66(@@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Happy.bmp0100644000175000017500000000406606647443146016642 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,, ,,,,,,,,,,,,, ,,,,,,,,,,, ,,,,,,,,, ,,,,,,, ,,,,, ,,,, ,,, ,, ,, ,        , ,, ,, ,,, ,,,, ,,,,, ,,,,,,, ,,,,,,,,, ,,,,,,,,,,, ,,,,,,,,,,,,, ,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Cat.bmp0100644000175000017500000002406606647443170016267 0ustar aaronlaaronlBM6(6(``$hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/kill_par.bmp0100644000175000017500000001206606647455364017362 0ustar aaronlaaronlBM66(@@hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,潽潽潽潽潽潽潽潽潽潽潽潽~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// ~~~~~~~~~~~~~~~~~~~~~//   ~   ,,,,,,,// ////// // /////// // //////// ,,,,,,,// 潽// // // // // // //  // ,,,,,,,// ~~/////// ~////// // ~// ~// ////~,,,,,,,// ~~~ // // // //// //~// // ~,,,,,,,~~// ~~~////~~/////~/////////~////////~~~,,,,,,,,// ~~~~~~~~~~~~~~~// ~~,,,,,,,,,~////// ~~~~~~~~~~~~//~~,,,,,,,,,,,,,,,// // ~~~~,,,,,,,,// // ,潽潽// ////潽潽潽潽潽潽潽潽,~~~/////~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~// ~~~~~// ,,,,,,,潽潽潽// 潽////// ////// // 潽,,,,,,,,,,,,,,,~~~// ~// ~// // // // ~,,,,,,,,,,,,,,,~~~~// ~// ~~// // // ~// ~~,,,,,,,,,,,,,,,~~~~~~~// ~~~// //// ~// ~// ,,,,,,,,,,,,,,,~~~~~~~~//// ~~~/////////~/////~,,,,,,,,,,,,,,,~~~~~~///// ~~~~~~~~~~~~~,,,,,,,,,,,,,,,~~//// ~~~~,,,,,,,,,,,,,,,,//// ,,,,,,,,,,,,,,,// 潽// 潽潽潽潽潽潽,,,,,,,,,,,,,,,///~~~//~~~~~~,,,,,,,,,,,,,,,~~~~~~~~~~~~,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,~~~~~~~,,,,,,,,,,,,,,,,,潽潽潽 潽 潽潽潽潽,,,,,,,,,,,,,,,~~~// ~///~~~~,,,,,,,,,,,,,,,~~~~// //~~~ ~~~~,,,,,,,,,,,,,,,~~~~~~~// ~~///~~// // ~// ~~~~,,,,,,,,,,,,,,,~~~~~~~~// //~~~~~// // // ~~~~~~,,,,,,,,,,,,,,,~~~~~~~// //~~~// // // ~~~~~,,,,,,,,,,,,,,,~~/// ~// // // ~~,,,,,,,,,,,,,,,//// //// // ,,,,,,,,,,,,,,,潽// // 潽// // 潽潽潽,,,,,,,,,,,,,,,~// ~//  // ~// ~~~,,,,,,,,,,,,,,,~// ~// //~// ~// ~~~~,,,,,,,,,,,,,,,~~~~// ~// ~~~~// ~// ~~~~~~~,,,,,,,,,,,,,,,~~//~~~~//~~// ~// ~~~~~~~~,,,,,,,,,,,,,,,~~~~~~~~~//~//~~~~~~~~,,,,,,,,,,,,,,,~~~~~~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/Bceagle.bmp0100644000175000017500000000406606647443252017101 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,   ,,,,,,,,,,,,,,,,  ,,,,,,,,, ,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,,,,   ,,,,,,,,,,,,,,,,  ,,  ,,,, ,,,,,,,,,,   ,,  ,,, ,,,,,,,,,,   ,,  ,,  ,,,,,,,,,,   ,  ,  ,,,,,,,,,,  ,    ,,,,,,,,,,  ,,,  ,,,,,,,,,,   ,,, ,,,,,,,,,,  ,,,,,,,,,,,,,,,,,,,,   ,,,,,,,,,,,,,,,,,,,  ,,,,,  ,,,,,,,,,,,,,,,,,  ,,,,,,  ,,,,,,,,,,,,,,,,  ,,,,,,  ,,,,,,,,,,,,,,,,  ,,,,,,  ,,,,,,,,,,,,,,,,  ,,,,,,  ,,,,,,,,,,,,,,,,  ,,,,,,  ,,,,,,,,,,,,,,,,   ,,,,,,,,,,,,,,,,  ,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,xevil-2.02r2.orig/win32/res/bmp00059.bmp0100644000175000017500000000606606647446706016744 0ustar aaronlaaronlBM6 6(@ hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,,,, ,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~ ~~~~~~~ ~ ~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,xevil-2.02r2.orig/win32/res/beat_dog.bmp0100644000175000017500000001206606647455364017331 0ustar aaronlaaronlBM66( hUUUUU__U__??U??UUUUUUU__U__??U??UUUߪߪUߪߪUUU__U__??U??UUʦUUUUU__U__??U??UUfUUUUUUUUUUUUUUUUUUUUUUUUU_U_UU_U_U?U?UU?U?UUUUUUUUUUU3**U****U****U****U****U**_*_*U_*_*?*?*U?*?***U****U**U,,,,,,                                                      ,,,,,,xevil-2.02r2.orig/win32/aboutdialog.cpp0100644000175000017500000001012707041454220017241 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // AboutDialog.cpp : implementation file // #include "stdafx.h" #include "XEvil.h" #include "AboutDialog.h" #include "l_agreement.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // AboutDialog dialog AboutDialog::AboutDialog(CWnd* pParent /*=NULL*/) : CDialog(AboutDialog::IDD, pParent) { //{{AFX_DATA_INIT(AboutDialog) m_fullscreenvalue = FALSE; m_versionvalue = _T(""); m_licensetextvalue = _T(""); m_drawbackgroundvalue = FALSE; //}}AFX_DATA_INIT m_Dfullscreenmode=FALSE; m_Denablefullscreen=FALSE; m_Ddrawbackground=TRUE; m_Denabledrawbackground=FALSE; m_Denablereject = TRUE; } void AboutDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(AboutDialog) DDX_Control(pDX, IDC_DRAWBACKGROUND, m_drawbackgroundcontrol); DDX_Control(pDX, IDCANCEL, m_rejectcontrol); DDX_Control(pDX, IDC_LICENSETEXT, m_licensetextcontrol); DDX_Control(pDX, IDC_FULLSCREEN, m_fullscreencontrol); DDX_Check(pDX, IDC_FULLSCREEN, m_fullscreenvalue); DDX_Text(pDX, IDC_VERSION, m_versionvalue); DDX_Text(pDX, IDC_LICENSETEXT, m_licensetextvalue); DDX_Check(pDX, IDC_DRAWBACKGROUND, m_drawbackgroundvalue); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(AboutDialog, CDialog) //{{AFX_MSG_MAP(AboutDialog) ON_EN_SETFOCUS(IDC_LICENSETEXT, OnSetfocusLicensetext) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // AboutDialog message handlers BOOL AboutDialog::OnInitDialog() { CDialog::OnInitDialog(); CenterWindow(); m_fullscreencontrol.EnableWindow(m_Denablefullscreen); m_fullscreenvalue=m_Dfullscreenmode; m_drawbackgroundcontrol.EnableWindow(m_Denabledrawbackground); m_drawbackgroundvalue=m_Ddrawbackground; m_rejectcontrol.EnableWindow(m_Denablereject); UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void AboutDialog::OnOK() { UpdateData(TRUE); m_Dfullscreenmode=m_fullscreenvalue; m_Ddrawbackground=m_drawbackgroundvalue; #ifdef MODELESS_DIALOGS if (!m_Denablefullscreen) PostMessage(WM_COMMAND,IDOK,0); #else CDialog::OnOK(); #endif } void AboutDialog::OnCancel() { m_licensetextcontrol.SetSel(-1,0,TRUE); CDialog::OnCancel(); } void AboutDialog::setVersionString(const char* version) { m_versionvalue = "XEvil(TM) "; m_versionvalue += version; // m_versionvalue += " (Shareware)"; } void AboutDialog::setLicenseText(const char* text) { m_licensetextvalue = ""; // Parse the text into fixed width columns of lines of text. // 80 column. Line::set_text_columns(75); // Do the parse. Page thePage(NULL,text); // Recreate the license text from the parsed text. const PtrList& lines = thePage.get_lines(); for (int n = 0; n < lines.length(); n++) { int length; const char* txt = ((Line*)lines.get(n))->get_text(length); CString cstr(txt,length); m_licensetextvalue += cstr; if (n < lines.length() - 1) { m_licensetextvalue += "\r\n"; } } } void AboutDialog::OnSetfocusLicensetext() { m_licensetextcontrol.SetSel(-1,0); } xevil-2.02r2.orig/win32/connectdlg.cpp0100644000175000017500000000423507041422206017071 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // ConnectDlg.cpp : implementation file // #include "stdafx.h" #include "xevil.h" #include "ConnectDlg.h" #include "role.h" #include "xetp.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CConnectDlg dialog CConnectDlg::CConnectDlg(CWnd* pParent /*=NULL*/) : CDialog(CConnectDlg::IDD, pParent) { //{{AFX_DATA_INIT(CConnectDlg) m_hostname = _T(""); m_port = XETP::DEFAULT_PORT; m_name = _T(""); //}}AFX_DATA_INIT } void CConnectDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CConnectDlg) DDX_Text(pDX, IDC_EDIT1, m_hostname); DDX_Text(pDX, IDC_EDIT2, m_port); DDV_MinMaxUInt(pDX, m_port, 1, 65535); DDX_Text(pDX, IDC_EDIT3, m_name); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CConnectDlg, CDialog) //{{AFX_MSG_MAP(CConnectDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CConnectDlg message handlers void CConnectDlg::OnOK() { #ifdef MODELESS_DIALOGS PostMessage(WM_COMMAND,IDOK,0); #else CDialog::OnOK(); #endif } void CConnectDlg::OnCancel() { #ifdef MODELESS_DIALOGS PostMessage(WM_COMMAND,IDCANCEL,0); #else CDialog::OnCancel(); #endif } xevil-2.02r2.orig/win32/difficulty.cpp0100644000175000017500000000547407041422206017121 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // Difficulty.cpp : implementation file // #include "stdafx.h" #include "xevil.h" #include "Difficulty.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDifficulty dialog CDifficulty::CDifficulty(CWnd* pParent /*=NULL*/) : CDialog(CDifficulty::IDD, pParent) { //{{AFX_DATA_INIT(CDifficulty) m_difficulty = -1; //}}AFX_DATA_INIT m_Ddifficulty=DIFF_NORMAL; } void CDifficulty::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDifficulty) DDX_Radio(pDX, IDC_DIFFICULTY1, m_difficulty); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDifficulty, CDialog) //{{AFX_MSG_MAP(CDifficulty) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDifficulty message handlers void CDifficulty::OnOK() { UpdateData(TRUE); switch (m_difficulty) { case 0:m_Ddifficulty=DIFF_TRIVIAL; break; case 1:m_Ddifficulty=DIFF_NORMAL; break; case 2:m_Ddifficulty=DIFF_HARD; break; case 3:m_Ddifficulty=DIFF_BEND_OVER; break; default: m_Ddifficulty=DIFF_NORMAL;assert(0);break; } #ifdef MODELESS_DIALOGS PostMessage(WM_COMMAND,IDOK,0); #else CDialog::OnOK(); #endif } void CDifficulty::OnCancel() { #ifdef MODELESS_DIALOGS PostMessage(WM_COMMAND,IDCANCEL,0); #else CDialog::OnCancel(); #endif } BOOL CDifficulty::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here switch (m_Ddifficulty) { case DIFF_TRIVIAL: m_difficulty=0; break; case DIFF_NORMAL: m_difficulty=1; break; case DIFF_HARD: m_difficulty=2; break; case DIFF_BEND_OVER: m_difficulty=3; break; default: m_difficulty=0;assert(0);break; } UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } xevil-2.02r2.orig/win32/draw.cpp0100644000175000017500000011374207041422204015710 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "stdafx.h" #include "coord.h" #include "utils.h" #include "xdata.h" #include "ui.h" #include "physical.h" #include "actual.h" #include "resource.h" #include "world.h" // Key for the Locator scratch buffer in the SurfaceManager. #define OL_SCRATCH_KEY ((void*)(S_MAN_OL_NONCE << 24)) void Explosion::draw(CMN_DRAWABLE buffer,Xvars &xvars,int, const Area &bufArea) { // TODO Change with Explsions animated in their own space Pos pos; Size size; area.get_rect(pos,size); Size offset = area - bufArea; HDC t_temphdc; HRESULT t_result; if (!xvars.GetDC(buffer, &t_temphdc)){ return; } CDC *t_dc=CDC::FromHandle(t_temphdc); CBrush *t_brush=t_dc->SelectObject(&xvars.m_brushes[Xvars::BLACK]); CPen *t_pen=t_dc->SelectObject(&xvars.m_pens[Xvars::BLACK]); t_dc->Ellipse(xvars.stretch_x(offset.width),xvars.stretch_y(offset.height), xvars.stretch_x(offset.width+size.width), xvars.stretch_y(offset.height+size.height)); t_dc->SelectObject(t_brush); t_dc->SelectObject(t_pen); t_result=buffer->ReleaseDC(t_temphdc); if (!xvars.hresultSuccess(t_result)) { return; } } void Fire::draw(CMN_DRAWABLE buffer,Xvars &xvars,int,const Area &bufArea) { if (!xvars.is_valid(xdata.valid)) { init_x(xvars,IX_INIT,NULL); } // Location of bitmap on surf. Pos surfPos; LPDIRECTDRAWSURFACE surf = xvars.m_surfaceManager->lookup(surfPos,(void*)fireBits); const Area &area = get_area(); Pos pos; Size size; area.get_rect(pos,size); Size offset = area - bufArea; Size sizeMax = Fire::get_size_max(); HRESULT t_result; // Grab a random part of the source bitmap. Pos srcUL(Utils::choose(sizeMax.width - size.width + 1), Utils::choose(sizeMax.height - size.height + 1)); CRect t_sourcerect(surfPos.x + xvars.stretch_x(srcUL.x), surfPos.y + xvars.stretch_y(srcUL.y), surfPos.x + xvars.stretch_x(srcUL.x + size.width), surfPos.y + xvars.stretch_y(srcUL.y + size.height)); t_result = xvars.Blt(buffer,xvars.stretch_x(offset.width), xvars.stretch_y(offset.height), surf,t_sourcerect,True); DHRESULT(t_result,return); } void Fire::init_x(Xvars &xvars,IXCommand command,void* arg) { Size sizeMax = Fire::get_size_max(); // Add request for surface. if (command == IX_ADD) { xvars.m_surfaceManager->add((void*)fireBits,xvars.stretch_size(sizeMax), &xvars.XVARS_COLORKEY); return; } if (command == IX_LIST) { // For IX_LIST, the argument is a PtrList. PtrList* ptrList = (PtrList*)arg; IXPixmapInfo* pInfo = new IXPixmapInfo; assert(pInfo); pInfo->key = (void*)fireBits; pInfo->dir = CO_air; pInfo->animNum = 0; ptrList->add((void*)pInfo); } // If IX_LIST, still do initialization. if (xvars.is_valid(xdata.valid)) { return; } // Load bitmap onto surface. Pos pos; LPDIRECTDRAWSURFACE surf = xvars.m_surfaceManager->lookup(pos,(void*)fireBits); if (!xvars.load_surface(surf,CPoint(pos.x,pos.y),fireBits)) { COUTRESULT("Couldn't load Fire surface"); return; } xvars.mark_valid(xdata.valid); } void World::draw_outside_offset(LPDIRECTDRAWSURFACE dest, Xvars &xvars,int,Size sourceOffset, const Area &destArea) { CMN_BITS_ID srcBits = outsides[outsideIndex].id; // Offset into the surface in the SurfaceManager. Size smOffset; LPDIRECTDRAWSURFACE source = xvars.m_surfaceManager->lookup(smOffset,(void*)srcBits); sourceOffset += smOffset; // In destination coords. Pos destPos = destArea.get_pos(); Size destSize = destArea.get_size(); CRect t_srcrect(sourceOffset.width,sourceOffset.height, sourceOffset.width + destSize.width,sourceOffset.height + destSize.height); HRESULT t_result = xvars.Blt(dest,destPos.x,destPos.y,source,t_srcrect); DHRESULT(t_result,return); } void World::draw_background(LPDIRECTDRAWSURFACE buffer,Xvars &xvars,int, Area area,Boolean background3D) { // Always true on Windows. assert(background3D); if (!xvars.is_valid(xValid)) { init_x(xvars,IX_INIT,NULL); } area = xvars.stretch_area(area); CRect t_destrect; CRect t_srcrect; int offsetx = 0; int offsety = 0; int srcoffsettop; int t_int; if (area.get_pos().x < 0) { t_int = (area.get_pos().x/W_BACKGROUNDRATE)* -1; t_int %= backgrounds[backgroundIndex].size.width; t_int *= -1; t_int += backgrounds[backgroundIndex].size.width; t_srcrect.left = t_int; } else { t_srcrect.left = (area.get_pos().x / W_BACKGROUNDRATE) % backgrounds[backgroundIndex].size.width; //important } if (area.get_pos().y < 0) { t_int = (area.get_pos().y / W_BACKGROUNDRATE) * -1; t_int %= backgrounds[backgroundIndex].size.height; t_int *= -1; t_int += backgrounds[backgroundIndex].size.height; srcoffsettop = t_int; } else { srcoffsettop = (area.get_pos().y / W_BACKGROUNDRATE) % backgrounds[backgroundIndex].size.height; //important } t_srcrect.top = srcoffsettop; t_srcrect.right = backgrounds[backgroundIndex].size.width; t_srcrect.bottom = backgrounds[backgroundIndex].size.height; HRESULT t_result; for(;offsetx < area.get_size().width;) { for(;offsety < area.get_size().height;) { t_destrect.SetRect(offsetx,offsety,min(offsetx + t_srcrect.Width(),area.get_size().width), min(offsety+t_srcrect.Height(),area.get_size().height)); t_srcrect.right = min(backgrounds[backgroundIndex].size.width,t_srcrect.left + t_destrect.Width()); t_srcrect.bottom = min(backgrounds[backgroundIndex].size.height,t_srcrect.top + t_destrect.Height()); if (t_srcrect.Width() && t_srcrect.Height()) { // Now, lookup surface in SurfaceManger. t_surfrect is t_srcrect adjusted for the // SurfaceManager surface offset. Pos t_surfpos; LPDIRECTDRAWSURFACE t_surf = xvars.m_surfaceManager->lookup(t_surfpos,(void*)backgrounds[backgroundIndex].id); CRect t_surfrect(t_srcrect); t_surfrect.OffsetRect(t_surfpos.x,t_surfpos.y); t_result = xvars.Blt(buffer,offsetx,offsety,t_surf,t_surfrect); DHRESULT(t_result,;) } offsety += t_srcrect.Height(); t_srcrect.top = 0; t_srcrect.right = backgrounds[backgroundIndex].size.width; } offsety = 0; offsetx += t_srcrect.Width(); t_srcrect.left = 0; t_srcrect.top = srcoffsettop; t_srcrect.bottom = backgrounds[backgroundIndex].size.height; } } void World::draw_square(LPDIRECTDRAWSURFACE buffer,Xvars &xvars,int, const Loc &l,int x,int y,Boolean reduceDraw) { if (!inside(l) || map[l.r][l.c] == Woutside) { return; } Size t_blocksize; t_blocksize.set(xvars.stretch_x(WSQUARE_WIDTH),xvars.stretch_y(WSQUARE_HEIGHT)); if (unionSquares[l.r][l.c]) { if (unionSquares[l.r][l.c]->type != UN_MOVER) { assert(map[l.r][l.c] == Wempty); } // Draw poster. if (unionSquares[l.r][l.c]->type == UN_POSTER) { // No posters in reduced-drawing mode. if (!reduceDraw) { HRESULT t_result; CRect t_srcrect(unionSquares[l.r][l.c]->pSquare.loc.c * WSQUARE_WIDTH, unionSquares[l.r][l.c]->pSquare.loc.r * WSQUARE_HEIGHT, (unionSquares[l.r][l.c]->pSquare.loc.c + 1) * WSQUARE_WIDTH, (unionSquares[l.r][l.c]->pSquare.loc.r + 1) * WSQUARE_HEIGHT); CRect t_surfrect = xvars.stretch_rect(t_srcrect); int t_index = unionSquares[l.r][l.c]->pSquare.poster; Pos t_surfpos; LPDIRECTDRAWSURFACE t_surf = xvars.m_surfaceManager->lookup(t_surfpos, (void*)posters[t_index].id); // Adjust t_srcrect for SurfaceManager offset. t_surfrect.OffsetRect(t_surfpos.x,t_surfpos.y); t_result = xvars.Blt(buffer,xvars.stretch_x(x),xvars.stretch_y(y), t_surf,t_surfrect,True); DHRESULT(t_result,return); } } // Draw door. else if (unionSquares[l.r][l.c]->type == UN_DOOR) { int topBottom = unionSquares[l.r][l.c]->dSquare.topBottom; HRESULT t_result; int t_doorIndex = themes[themeIndex].doorBase + topBottom; Pos t_surfpos; LPDIRECTDRAWSURFACE t_surf = xvars.m_surfaceManager->lookup(t_surfpos,(void*)doorPixmapBits[t_doorIndex]); t_result = xvars.Blt(buffer, Pos(xvars.stretch_x(x), xvars.stretch_y(y)), t_surf,t_surfpos,t_blocksize); if (!xvars.hresultSuccess(t_result)) { return; } } // Draw mover square. else if (unionSquares[l.r][l.c]->type == UN_MOVER) { // Special case for bottom of ladders, just draw the bg wall first. if (map[l.r][l.c] == Wwall) { // Hack, rip out union square and draw just wall. UnionSquare *tmp = unionSquares[l.r][l.c]; unionSquares[l.r][l.c] = NULL; // go recursive draw_square(buffer,xvars,0,l,x,y,reduceDraw); unionSquares[l.r][l.c] = tmp; } // Draw moverSquare background HRESULT t_result; int t_index = themes[themeIndex].moverSquareBase + unionSquares[l.r][l.c]->mSquare.orientation; Pos t_surfpos; LPDIRECTDRAWSURFACE t_surf = xvars.m_surfaceManager->lookup(t_surfpos, (void*)moverSquarePixmapBits[t_index]); // No trans blt if reduceDraw. t_result = xvars.Blt(buffer, Pos(xvars.stretch_x(x), xvars.stretch_y(y)), t_surf,t_surfpos,t_blocksize, !reduceDraw); DHRESULT(t_result,return); } else { assert(0); } } else if (map[l.r][l.c] == Wempty) { ; //nothing to do! } // Not unionSquare, draw regular square. else { HRESULT t_result; int t_index = themes[themeIndex].blockIndices[map[l.r][l.c]]; Pos t_surfpos; LPDIRECTDRAWSURFACE t_surf = xvars.m_surfaceManager->lookup(t_surfpos,(void*)blocksBits[t_index]); // Never use transparent BLT for reduceDraw. Boolean useTransparent = reduceDraw ? False : blockUseTransparent[t_index]; t_result = xvars.Blt(buffer, Pos(xvars.stretch_x(x), xvars.stretch_y(y)), t_surf,t_surfpos,t_blocksize, useTransparent); DHRESULT(t_result,return); } } void World::draw_mover(LPDIRECTDRAWSURFACE buffer,Xvars &xvars,int, MoverP,int x,int y) { int t_index = themes[themeIndex].moverIndex; Pos t_surfpos; LPDIRECTDRAWSURFACE t_surf = xvars.m_surfaceManager->lookup(t_surfpos,(void*)moverPixmapBits[t_index]); HRESULT t_result = xvars.Blt(buffer, Pos(xvars.stretch_x(x),xvars.stretch_y(y)), t_surf,t_surfpos,xvars.stretch_size(moverSize),True); DHRESULT(t_result,return); } // Helper to both add surfaces to the surface manager and load bitmaps // onto the surfaces. static void World_init_x_helper(Xvars& xvars,BitmapSpec* specs,int bitsNum, const char* errorMsg,IXCommand command,void*, Boolean srcBlt = False) { for (int n = 0; n < bitsNum; n++) { // Just add to surface Manager. if (command == IX_ADD) { DDCOLORKEY* cKey = srcBlt ? &xvars.XVARS_COLORKEY : NULL; xvars.m_surfaceManager->add((void*)specs[n].id,specs[n].size,cKey); continue; } // Do initialization if IX_INIT or IX_LIST. assert(command == IX_INIT || command == IX_LIST); Pos surfPos; LPDIRECTDRAWSURFACE surf = xvars.m_surfaceManager->lookup(surfPos,(void*)specs[n].id); if (!xvars.load_surface(surf,CPoint(surfPos.x,surfPos.y),specs[n].id)) { ostrstream str; str << "World::init_x: Couldn't load " << errorMsg << ends; COUTRESULT(str.str()); delete str.str(); return; } } } // Wrapper for the other World_init_x_helper. static void World_init_x_helper(Xvars& xvars,CMN_BITS_ID* bits,Size size,int bitsNum, const char* errorMsg,IXCommand command,void* arg, Boolean srcBlt = False) { // Allocating and destroying some extra memory, but fuck it. // Worth it to avoid duplicate code. BitmapSpec* specs = new BitmapSpec[bitsNum]; assert(specs); for (int n = 0; n < bitsNum; n++) { specs[n].id = bits[n]; specs[n].size = size; } World_init_x_helper(xvars,specs,bitsNum,errorMsg,command,arg,srcBlt); delete [] specs; } /* EFFECTS: Replace the transparent portions of all the pixmaps pointed to by bits with the given color. Only do anything for the entries for which doIt[] is True. All pixmaps must be of the given (stretched) size. */ void World_fill_background(Xvars& xvars,CMN_BITS_ID* bits, const Size& size,int bitsNum, DWORD color) { LPDIRECTDRAWSURFACE scratch = xvars.create_surface(size.width,size.height,NULL); if (!scratch) { return; } CRect blockRect(0,0,size.width,size.height); for (int n = 0; n < bitsNum; n++) { // Fill scratch with color. xvars.color_fill(scratch,blockRect,False); // Copy bits[n] onto scratch using trans Blt. Pos surfPos; LPDIRECTDRAWSURFACE surf = xvars.m_surfaceManager->lookup(surfPos,(void*)bits[n]); xvars.Blt(scratch,0,0,surf, CRect(surfPos.x,surfPos.y,surfPos.x + size.width,surfPos.y + size.height), True); // Now copy scratch back onto surf without trans Blt. xvars.Blt(surf,surfPos.x,surfPos.y,scratch, blockRect, False); } scratch->Release(); } void World::init_x(Xvars &xvars,IXCommand command,void* arg) { // IX_LIST also does initialization. if ((command == IX_INIT || command == IX_LIST) && xvars.is_valid(xValid)) { return; } // Blocks Size blockSize; blockSize.set(xvars.stretch_x(WSQUARE_WIDTH), xvars.stretch_y(WSQUARE_HEIGHT)); // Don't really need to store all the world blocks with key-src blitting, only // certain ones. World_init_x_helper(xvars,blocksBits,blockSize,W_ALL_BLOCKS_NUM, "world block",command,arg,True); // Want block backgrounds to be black if (xvars.get_reduce_draw() && command == IX_INIT) { World_fill_background(xvars,blocksBits,blockSize,W_ALL_BLOCKS_NUM, xvars.m_black); } // Door blocks World_init_x_helper(xvars,doorPixmapBits,blockSize,W_ALL_DOORS_NUM, "door block",command,arg); // Mover square World_init_x_helper(xvars,moverSquarePixmapBits,blockSize, W_ALL_MOVER_SQUARES_NUM, "mover square",command,arg,True); // Want mover square backgrounds to be black if (xvars.get_reduce_draw() && command == IX_INIT) { World_fill_background(xvars,moverSquarePixmapBits,blockSize, W_ALL_MOVER_SQUARES_NUM, xvars.m_black); } // Mover World_init_x_helper(xvars,moverPixmapBits,xvars.stretch_size(moverSize), W_ALL_MOVERS_NUM, "mover",command,arg,True); // Don't allocate any of the following, since we don't draw them in // reduceDraw mode. if (!xvars.get_reduce_draw()) { // Posters, uses key src blitting World_init_x_helper(xvars,posters,W_ALL_POSTERS_NUM, "poster",command,arg,True); // Outsides World_init_x_helper(xvars,outsides,W_ALL_OUTSIDES_NUM, "outside bitmap",command,arg); // Backgrounds World_init_x_helper(xvars,backgrounds,W_ALL_BACKGROUNDS_NUM, "background bitmap",command,arg); } if (command == IX_INIT || command == IX_LIST) { xvars.mark_valid(xValid); } } // Helper function to generate an XPM image for a bitmap in the World. // if animNum == -1, don't add suffix numbering the bitmap. Boolean World_generate_xpm_helper(Xvars& xvars,CMN_BITS_ID bits,int animNum, const char* xpmDir,const char* varRoot, Boolean halfSize) { // Find the pixmap in the SurfaceManager. Area area; const DDCOLORKEY* cKey; LPDIRECTDRAWSURFACE surf = xvars.m_surfaceManager->lookup(area,cKey,(void*)bits); // Name of variable, e.g. "block_1". ostrstream varName; varName << varRoot; if (animNum != -1) { varName << '_' << animNum; } varName << ends; // Name of file. CString fullName(xpmDir); fullName += varName.str(); fullName += ".xpm"; // Finally. Write the bastard. Boolean ret = xvars.write_xpm_file(fullName,varName.str(), surf,area,cKey,halfSize); delete varName.str(); return ret; } Boolean World::generate_xpm(Xvars& xvars,const char* genDir,Boolean halfSize) { if (!xvars.is_valid(xValid)) { init_x(xvars,IX_INIT,NULL); } CString dir(genDir); dir += "world/"; if (!Utils::is_dir(dir)) { Boolean ret = Utils::mkdir(dir); if (!ret) { return False; } } // The blocks in the world. int n; for (n = 0; n < W_ALL_BLOCKS_NUM; n++) { if (!World_generate_xpm_helper(xvars,blocksBits[n], n,dir,"block",halfSize)) { return False; } } // Backgrounds. for (n = 0; n < W_ALL_BACKGROUNDS_NUM; n++) { if (!World_generate_xpm_helper(xvars,backgrounds[n].id, n,dir,"background",halfSize)) { return False; } } // Outsides. for (n = 0; n < W_ALL_OUTSIDES_NUM; n++) { if (!World_generate_xpm_helper(xvars,outsides[n].id, n,dir,"outside",halfSize)) { return False; } } // Door. for (n = 0; n < W_ALL_DOORS_NUM; n++) { if (!World_generate_xpm_helper(xvars,doorPixmapBits[n], n,dir,"door",halfSize)) { return False; } } // Mover square. for (n = 0; n < W_ALL_MOVER_SQUARES_NUM; n++) { if (!World_generate_xpm_helper(xvars,moverSquarePixmapBits[n], n,dir,"mover_square",halfSize)) { return False; } } // Mover. for (n = 0; n < W_ALL_MOVERS_NUM; n++) { if (!World_generate_xpm_helper(xvars,moverPixmapBits[n], n,dir,"mover",halfSize)) { return False; } } // Posters. for (n = 0; n < W_ALL_POSTERS_NUM; n++) { if (!World_generate_xpm_helper(xvars,posters[n].id, n,dir,"poster",halfSize)) { return False; } } return True; } Boolean Locator::generate_xpm(Xvars& xvars,const char* genDir, Boolean halfSize) { if (!xvars.is_valid(xValid)) { init_x(xvars,IX_INIT,NULL); } CString xpmDir(genDir); xpmDir += "locator/"; if (!Utils::is_dir(xpmDir)) { Boolean ret = Utils::mkdir(xpmDir); if (!ret) { return False; } } // Tick marks. for (TickType tt = 0; tt < TICK_MAX; tt++) { for (int hp = 0; hp < CO_DIR_HALF_PURE; hp++) { // Only write out the bases, X11 will auto-generate the rest. Dir dir = Coord::half_pure_to_pure(hp); if (!Transform2D::is_base(dir,NULL)) { continue; } // Some of this code lifted from World_generate_xpm_helper, maybe merge // the two. // Find the pixmap in the SurfaceManager. void* key = compute_tick_key(tt,dir); Area area; const DDCOLORKEY* cKey; LPDIRECTDRAWSURFACE surf = xvars.m_surfaceManager->lookup(area,cKey,key); // Name of variable, e.g. "tick_0_7". ostrstream varName; varName << "tick_" << tt << '_' << hp << ends; // Name of file. CString fullName(xpmDir); fullName += varName.str(); fullName += ".xpm"; // Finally. Write the bastard. Boolean val = xvars.write_xpm_file(fullName,varName.str(), surf,area,cKey,halfSize); delete varName.str(); if (!val) { ostrstream err; err << "Failed to write tick tt=" << tt << " hp=" << hp << " fullName=" << fullName << ends; COUTRESULT(err.str()); delete err.str(); return False; } } } return True; } void* Locator::compute_tick_key(int tickType,Dir dir) { assert(tickType < TICK_MAX); assert(dir >= CO_R && dir < CO_DIR_MAX); assert((dir - CO_R) % 2 == 0); // Must be convertable to a "half-pure" direction. u_int ret = (S_MAN_OL_NONCE << 24); ret |= (u_char)tickType << 8; ret |= (u_char)dir; return (void*)ret; } // Returns whether successful. Boolean Locator::draw_tick(TickType tt,LPDIRECTDRAWSURFACE window, Xvars &xvars,int, const Size &windowSize, Dir tickDir,int offset) { int n = Coord::pure_to_half_pure(tickDir); HRESULT t_result; CRect t_destrect; // Lookup tick bitmap in SurfaceManager. Pos srcPos; LPDIRECTDRAWSURFACE surf = xvars.m_surfaceManager->lookup(srcPos,compute_tick_key(tt,tickDir)); CRect t_srcrect; t_srcrect.SetRect(srcPos.x,srcPos.y, srcPos.x + xvars.stretch_x(tickSizes[n].width), srcPos.y + xvars.stretch_y(tickSizes[n].height)); int offset2; // Takes width/height of tick into account. switch (tickDir) { case CO_R: offset2 = offset - (xvars.stretch_y(tickSizes[n].height) >> 1); t_destrect.SetRect(windowSize.width - xvars.stretch_x(tickSizes[n].width),offset2, windowSize.width,offset2 + xvars.stretch_y(tickSizes[n].height)); break; case CO_DN_R: t_destrect.SetRect(windowSize.width - xvars.stretch_x(tickSizes[n].width), windowSize.height - xvars.stretch_y(tickSizes[n].height), windowSize.width,windowSize.height); break; case CO_DN: offset2 = offset - (xvars.stretch_x(tickSizes[n].width) >> 1); t_destrect.SetRect(offset2,windowSize.height - xvars.stretch_y(tickSizes[n].height), offset2 + xvars.stretch_x(tickSizes[n].width), windowSize.height); break; case CO_DN_L: t_destrect.SetRect(0,windowSize.height - xvars.stretch_y(tickSizes[n].height), xvars.stretch_x(tickSizes[n].width), windowSize.height); break; case CO_L: offset2 = offset - (xvars.stretch_y(tickSizes[n].height) >> 1); t_destrect.SetRect(0,offset2, xvars.stretch_x(tickSizes[n].width), offset2 + xvars.stretch_y(tickSizes[n].height)); break; case CO_UP_L: t_destrect.SetRect(0,0,xvars.stretch_x(tickSizes[n].width), xvars.stretch_y(tickSizes[n].height)); break; case CO_UP: offset2 = offset - (xvars.stretch_x(tickSizes[n].width) >> 1); t_destrect.SetRect(offset2,0, offset2 + xvars.stretch_x(tickSizes[n].width), xvars.stretch_y(tickSizes[n].height)); break; case CO_UP_R: t_destrect.SetRect(windowSize.width - xvars.stretch_x(tickSizes[n].width),0, windowSize.width, xvars.stretch_y(tickSizes[n].height)); break; default: assert(0); } t_result = xvars.Blt(window,t_destrect.left,t_destrect.top, surf,t_srcrect,True); DHRESULT(t_result,return False); return True; } void Locator::init_x(Xvars &xvars,IXCommand command,void* arg) { int hp; // The "half-pure" direction. TickType tt; if (command == IX_ADD) { // Tick marks. for (tt = 0; tt < TICK_MAX; tt++) { for (hp = 0; hp < CO_DIR_HALF_PURE; hp++) { Dir dir = Coord::half_pure_to_pure(hp); void* key = compute_tick_key(tt,dir); xvars.m_surfaceManager->add(key,xvars.stretch_size(tickSizes[hp]), &xvars.XVARS_COLORKEY); } } // Scratch buffer. Size scratchSize; scratchSize.set(xvars.stretch_x(OL_GRID_COL_MAX * WSQUARE_WIDTH), xvars.stretch_y(OL_GRID_ROW_MAX * WSQUARE_HEIGHT)); xvars.m_surfaceManager->add(OL_SCRATCH_KEY,scratchSize, &xvars.XVARS_COLORKEY); return; } // Ok to call multiple times. if (xvars.is_valid(xValid)) { return; } // Never called with IX_LIST, at least not for now. assert(command == IX_INIT); // Load base tick bitmaps onto surface. // Also compute max tick size while we're doing a loop anyway. Size tickMax; // stretched coordinates. tickMax.set_zero(); for (hp = 0; hp < CO_DIR_HALF_PURE; hp++) { tickMax.width = Utils::maximum(tickMax.width,xvars.stretch_x(tickSizes[hp].width)); tickMax.height = Utils::maximum(tickMax.height,xvars.stretch_y(tickSizes[hp].height)); for (tt = 0; tt < TICK_MAX; tt++) { Dir dir = Coord::half_pure_to_pure(hp); if (Transform2D::is_base(dir,NULL)) { assert(tickPixmapBits[tt][hp] != PH_AUTO_GEN); void* key = compute_tick_key(tt,dir); Pos pos; LPDIRECTDRAWSURFACE surf = xvars.m_surfaceManager->lookup(pos,key); xvars.load_surface(surf,CPoint(pos.x,pos.y),tickPixmapBits[tt][hp]); } } } // Load auto-generated ticks. LPDIRECTDRAWSURFACE scratch = xvars.create_surface(tickMax.width,tickMax.height,NULL); for (tt = 0; tt < TICK_MAX; tt++) { for (hp = 0; hp < CO_DIR_HALF_PURE; hp++) { // Need "pure" dire for Transform2D, not Dir dir = Coord::half_pure_to_pure(hp); if (!Transform2D::is_base(dir,NULL)) { assert(tickPixmapBits[tt][hp] == PH_AUTO_GEN); Dir base = Transform2D::get_base(dir,NULL); int baseHP = Coord::pure_to_half_pure(base); int tNum; const TransformType* transforms = Transform2D::get_transforms(tNum,dir,NULL); void* srcKey = compute_tick_key(tt,base); void* destKey = compute_tick_key(tt,dir); Pos srcPos, destPos; LPDIRECTDRAWSURFACE srcSurf = xvars.m_surfaceManager->lookup(srcPos,srcKey); LPDIRECTDRAWSURFACE destSurf = xvars.m_surfaceManager->lookup(destPos,destKey); xvars.generate_pixmap_from_transform(destSurf,destPos, srcSurf,srcPos, xvars.stretch_size(tickSizes[baseHP]), scratch, transforms,tNum); } } } scratch->Release(); // Don't need to do anything to initialize scratch buffer. xvars.mark_valid(xValid); } LPDIRECTDRAWSURFACE Locator::get_scratch_buffer(Pos& pos,Xvars& xvars,int) { return xvars.m_surfaceManager->lookup(pos,OL_SCRATCH_KEY); } void Protection::init_x(Xvars &xvars,IXCommand command,void* arg, const ProtectionContext &prc,ProtectionXdata &pXdata) { if (command == IX_ADD) { return; } if (xvars.is_valid(pXdata.valid)) { return; } assert(command == IX_INIT || command == IX_LIST); if (!pXdata.color.m_hObject) { pXdata.color.CreatePen(PS_SOLID,1,prc.colorName); } xvars.mark_valid(pXdata.valid); } void Protection::draw(LPDIRECTDRAWSURFACE window,Xvars &xvars,int, const Area &bufArea) { if (!xvars.is_valid(pXdata->valid)) { init_x(xvars,IX_INIT,NULL,*prc,*pXdata); } Pos pos; Size size; area.get_rect(pos,size); Size offset = area - bufArea; HDC t_temphdc; if (!xvars.GetDC(window,&t_temphdc)){ return; } CDC *t_dc=CDC::FromHandle(t_temphdc); t_dc->SelectStockObject(NULL_BRUSH);//clear CPen *t_oldpen; t_oldpen=t_dc->SelectObject(&pXdata->color); t_dc->Rectangle(xvars.stretch_x(offset.width),xvars.stretch_y(offset.height),xvars.stretch_x(offset.width+size.width),xvars.stretch_y(offset.height+size.height)); t_dc->SelectObject(t_oldpen); HRESULT t_result=window->ReleaseDC(t_temphdc); if (!xvars.hresultSuccess(t_result)) return; } void Moving::get_pixmap_mask(Xvars &xvars,int,CMN_IMAGEDATA &pixmap, Dir dir,int animNum) { void* key = compute_key(dir,animNum,False,mc,movingXdata); // Look up surfaces in the SurfaceManager. pixmap.pixmap = xvars.m_surfaceManager->lookup(pixmap.pixmapOffset,key); if (mc->invisibility) { void* maskKey = compute_key(dir,animNum,True,mc,movingXdata); pixmap.mask = xvars.m_surfaceManager->lookup(pixmap.maskOffset,maskKey); } else { pixmap.mask = NULL; pixmap.maskOffset.set_zero(); } } void Moving::init_x(Xvars &xvars,IXCommand command,void* arg, const MovingContext &mc,MovingXdata &movingXdata) { check_auto_generated(mc); int m,n; // Just add the surfaces to the SurfaceManager. if (command == IX_ADD) { // Sanity check. assert(xvars.m_surfaceManager && !xvars.m_surfaceManager->is_add_completed()); // Compute hash key and add surface request to SurfaceManager for each // anim frame and mask. for (n = 0; n < CO_DIR_MAX; n++) { for (m = 0; m < mc.animMax[n]; m++) { void* key = compute_key(n,m,False,&mc,&movingXdata); xvars.m_surfaceManager->add(key,xvars.stretch_size(mc.sizes[n]), &xvars.XVARS_COLORKEY); // Only generate masks if this object supports invisibility. if (mc.invisibility) { void* maskKey = compute_key(n,m,True,&mc,&movingXdata); xvars.m_surfaceManager->add(maskKey,xvars.stretch_size(mc.sizes[n]), &xvars.XVARS_COLORKEY_MASKS); } } } // Done adding surfaces. return; } // List all pixmaps in the SurfaceManager. // This code is before the xvars.is_valid() check so that it is always // run, even if the graphics have been initialized. But, we fall through // to the IX_INIT code so that graphics are always initialized by the // time IX_LIST returns. if (command == IX_LIST) { // For IX_LIST, the argument is a PtrList. PtrList* ptrList = (PtrList*)arg; // Loop over all dirs. for (n = 0; n < CO_DIR_MAX; n++) { // Don't add auto-generated pixmaps. if (mc.pixmapBits[n][0] == PH_AUTO_GEN) { continue; } // Loop over all animation frames. for (m = 0; m < mc.animMax[n]; m++) { // Create IXPixmapInfo for this pixmap. void* key = compute_key(n,m,False,&mc,&movingXdata); IXPixmapInfo* pInfo = new IXPixmapInfo; assert(pInfo); pInfo->key = key; pInfo->dir = n; pInfo->animNum = m; ptrList->add((void*)pInfo); // Don't add masks. } // for m } // for n } // if IX_LIST if (xvars.is_valid(movingXdata.valid)) { return; } assert(command == IX_INIT || command == IX_LIST); assert(xvars.m_surfaceManager->is_add_completed()); // Load all non-autogenerated bitmaps onto surfaces, possibly stretching. // This should load ALL the base bitmaps. for (n = 0; n < CO_DIR_MAX; n++) { if (mc.animMax[n] > 0 && mc.pixmapBits[n][0] != PH_AUTO_GEN) { for (m = 0; m < mc.animMax[n]; m++) { void* key = compute_key(n,m,False,&mc,&movingXdata); Pos pos; LPDIRECTDRAWSURFACE surf = xvars.m_surfaceManager->lookup(pos,key); CPoint point(pos.x,pos.y); // Don't stretch if already hiRes bitmaps. if (mc.hiRes) { xvars.load_surface(surf,point,mc.pixmapBits[n][m]); } else { // Shouldn't be any of these left. assert(0); xvars.load_stretch_surface(surf,point,mc.pixmapBits[n][m]); } } } } // For efficiency, only create one scratch surface for doing the // transformations. Pass it into generate_pixmap_from_transform(). LPDIRECTDRAWSURFACE t_scratch = xvars.create_surface(xvars.stretch_x(mc.physicalContext.sizeMax.width), xvars.stretch_y(mc.physicalContext.sizeMax.height), NULL); // Auto generate the PH_AUTO_GEN bitmaps. for (n = 0; n < CO_DIR_MAX; n++) { if (mc.animMax[n] > 0 && mc.pixmapBits[n][0] == PH_AUTO_GEN) { Dir base = Transform2D::get_base(n,mc.transformOverride); int tNum; const TransformType* transforms = Transform2D::get_transforms(tNum,n,mc.transformOverride); for (m = 0; m < mc.animMax[n]; m++) { void* srcKey = compute_key(base,m,False,&mc,&movingXdata); void* destKey = compute_key(n,m,False,&mc,&movingXdata); Area srcArea, destArea; const DDCOLORKEY* dummy; LPDIRECTDRAWSURFACE srcSurf = xvars.m_surfaceManager->lookup(srcArea,dummy,srcKey); LPDIRECTDRAWSURFACE destSurf = xvars.m_surfaceManager->lookup(destArea,dummy,destKey); xvars.generate_pixmap_from_transform(destSurf,destArea.get_pos(), srcSurf,srcArea.get_pos(), srcArea.get_size(), t_scratch, transforms,tNum); } } } t_scratch->Release(); // Create masks by copying color-key data from the pixmaps // // Only generate masks if this object supports invisibility. if (mc.invisibility) { for (n = 0; n < CO_DIR_MAX; n++) { for (m = 0; m < mc.animMax[n]; m++) { void* key = compute_key(n,m,False,&mc,&movingXdata); void* maskKey = compute_key(n,m,True,&mc,&movingXdata); Area area, maskArea; const DDCOLORKEY* dummy; LPDIRECTDRAWSURFACE surf = xvars.m_surfaceManager->lookup(area,dummy,key); LPDIRECTDRAWSURFACE maskSurf = xvars.m_surfaceManager->lookup(maskArea,dummy,maskKey); assert(area.get_size() == maskArea.get_size()); xvars.generate_mask_from_pixmap(maskSurf,maskArea.get_pos(), surf,area.get_pos(), area.get_size()); } // for m } // for n } // invisibility // Mark Xdata as valid for this version. xvars.mark_valid(movingXdata.valid); } void Moving::draw(LPDIRECTDRAWSURFACE window,Xvars &xvars,int, const Area &bufArea) { // Initialize graphics if necessary. if (!xvars.is_valid(movingXdata->valid)) { init_x(xvars,IX_INIT,NULL,*mc,*movingXdata); } Pos pos; Size size; area.get_rect(pos,size); Size offset = area - bufArea; LPDIRECTDRAWSURFACE t_surface(NULL); Pos t_offset; CRect t_destrect; // Fills pixmap and mask CMN_IMAGEDATA imagedata; get_pixmap_mask(xvars,0,imagedata,dir,movingAnimNum); HRESULT t_result; // BUG?: This looks like it will fail if size.height <= 3. if (is_invisible()) { // We should never have been made invisible if we don't support it. assert(mc->invisibility); LocatorP locator = get_locator(); t_surface = locator->get_scratch_buffer(t_offset,xvars,0); if (!t_surface) { assert(FALSE); return; } // Which way to distort the image. // We will draw the image twice to get the wrap-around. // Copy portion of area into scratch buffer. // Draw top 3 pixel rows of window into bottom 3 of t_surface. Area stretchedArea; //bufArea CRect bltRect(offset.width, offset.height, offset.width + size.width, offset.height + 3); bltRect = xvars.contain_rect(bltRect,bufArea.get_size().width,bufArea.get_size().height); if (bltRect.Height() && bltRect.Width()){ t_result = xvars.Blt(t_surface, t_offset.x, t_offset.y + xvars.stretch_y(size.height - 3) , window,xvars.stretch_rect(bltRect)); DHRESULT(t_result,return); } // Draw all but top 3 rows of window into t_surface bltRect.SetRect(offset.width,offset.height + 3, offset.width + size.width,offset.height + size.height); bltRect = xvars.contain_rect(bltRect,bufArea.get_size().width,bufArea.get_size().height); if (bltRect.Height() && bltRect.Width()){ t_result = xvars.Blt(t_surface,t_offset.x,t_offset.y,window, xvars.stretch_rect(bltRect)); DHRESULT(t_result,return); } // Whack the mask on t_surface to draw the outside portion pink. t_result = xvars.Blt(t_surface,t_offset, imagedata.mask,imagedata.maskOffset, xvars.stretch_size(size), True); DHRESULT(t_result,return); } else { t_surface = imagedata.pixmap; t_offset = imagedata.pixmapOffset; } // Copy appropriate bitmap onto window. Pos destPos(xvars.stretch_x(offset.width),xvars.stretch_y(offset.height)); t_result = xvars.Blt(window,destPos, t_surface, t_offset,xvars.stretch_size(size), True); DHRESULT(t_result,return); } xevil-2.02r2.orig/win32/fileman.cpp0100644000175000017500000001034207041422204016356 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "stdafx.h" #include "fileman.h" #define TEMP_DEFAULT_PREPEND "~xtmp" #define DELTA_SIZE 5 #define MAX_TEMP_FILES_DIGITS 3 #define MAX_TEMP_FILES 100 TempFileManager::TempFileManager() :directoryname(NULL),tempfiles(NULL), numtempfiles(0),buffersize(0) { } TempFileManager::~TempFileManager() { cleanup(); if (directoryname) free(directoryname); } /************************** public methods **************************/ /* windows specific implementations */ void TempFileManager::attachDirectory(const char *dirname) { if (!dirname) return; if (directoryname) { cleanup(); free(directoryname); } directoryname = strdup(dirname); CString t_string=directoryname; t_string += TEMP_DEFAULT_PREPEND; t_string += '*'; WIN32_FIND_DATA c_file; /* find first .c file in current directory */ HANDLE t_handle; if (INVALID_HANDLE_VALUE != (t_handle=FindFirstFile( t_string.GetBuffer(0), &c_file)) ) { CString t_newfile; if (c_file.cFileName) { t_newfile = directoryname; t_newfile += c_file.cFileName; } addName(strdup(t_newfile.GetBuffer(0))); t_newfile.ReleaseBuffer(); /* Find the rest of the xtm files */ while( FindNextFile( t_handle,&c_file ) ) { if (c_file.cFileName) { t_newfile= directoryname; t_newfile += '\\'; t_newfile+= c_file.cFileName; } addName(strdup(t_newfile.GetBuffer(0))); t_newfile.ReleaseBuffer(); } } } const char * TempFileManager::getTempFileByIndex( int index ) { if ((index < numtempfiles) && (index >=0)) { return tempfiles[index]; } return NULL; } /* delete all files in tempfiles list leave directory name alone. */ void TempFileManager::cleanup() { for (int i=0;i < numtempfiles; i++) { try { CFile::Remove(tempfiles[i]); } catch (CFileException*) { // assert(0); commented hardts } free (tempfiles[i]); } if (tempfiles) free (tempfiles); tempfiles = NULL; numtempfiles = 0; buffersize = 0; } const char * TempFileManager::newTempFileName(const char *ext) { if (!directoryname || !ext) return NULL; CString buffer; UINT t_result = GetTempFileName(directoryname,TEMP_DEFAULT_PREPEND, TRUE, buffer.GetBuffer(MAX_PATH)); buffer.ReleaseBuffer(); buffer = buffer.Left(buffer.ReverseFind('.')+1); buffer += ext; if (!t_result) return NULL; addName(strdup(buffer.GetBuffer(0))); return tempfiles[numtempfiles-1]; } /************************** helper methods **************************/ void TempFileManager::addName( char *name ) { if (!tempfiles) { tempfiles = (char **) malloc(DELTA_SIZE * (sizeof (char *))); if (!tempfiles) return; buffersize = DELTA_SIZE; } else if (numtempfiles >= buffersize) { char **t_tempfiles = (char **) realloc(tempfiles,(buffersize+DELTA_SIZE) * (sizeof (char *))); if (!t_tempfiles) return; tempfiles = t_tempfiles; buffersize += DELTA_SIZE; } if (numtempfiles > MAX_TEMP_FILES) { cleanup(); return; } tempfiles[numtempfiles ++] = name; } xevil-2.02r2.orig/win32/firepal.cpp0100644000175000017500000000564107041422204016373 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "stdafx.h" #include "firepal.h" #define FIRE_MOD 1.3 FirePalette::FirePalette(ColorPalette &p_palette) :PaletteModifier(p_palette) { int t_int=0; m_amount=0; m_dir=-1*FIRE_AMOUNT; for (int i=0;iFIRE_UPPERLIMIT) { m_amount=FIRE_UPPERLIMIT; m_dir=-1*FIRE_AMOUNT; } if (m_amount255) m_palette.palentries[i].peRed=255; else if (((int)m_palette.palentries[i].peRed+m_amount)<0) m_palette.palentries[i].peRed=0; else m_palette.palentries[i].peRed+=m_amount; if (((int)m_palette.palentries[i].peGreen-m_amount)>255) m_palette.palentries[i].peGreen=255; else if (((int)m_palette.palentries[i].peGreen-m_amount)<0) m_palette.palentries[i].peGreen=0; else m_palette.palentries[i].peGreen-=m_amount; if (((int)m_palette.palentries[i].peBlue-m_amount)>255) m_palette.palentries[i].peBlue=255; else if (((int)m_palette.palentries[i].peBlue-m_amount)<0) m_palette.palentries[i].peBlue=0; else m_palette.palentries[i].peBlue-=m_amount; } m_ddpalette->SetEntries(0,0,255,m_palette.palentries); } xevil-2.02r2.orig/win32/fogpal.cpp0100644000175000017500000000555507041422204016225 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "stdafx.h" #include "fogpal.h" FogPalette::FogPalette(ColorPalette &p_palette) :PaletteModifier(p_palette) { int t_int=0; m_amount=0; m_dir=-1*FOG_AMOUNT; for (int i=0;iFOG_UPPERLIMIT) { m_amount=FOG_UPPERLIMIT; m_dir=-1*FOG_AMOUNT; } if (m_amount255) m_palette.palentries[i].peRed=255; else if (((int)m_palette.palentries[i].peRed+m_amount)<0) m_palette.palentries[i].peRed=0; else m_palette.palentries[i].peRed+=m_amount; if (((int)m_palette.palentries[i].peGreen+m_amount)>255) m_palette.palentries[i].peGreen=255; else if (((int)m_palette.palentries[i].peGreen+m_amount)<0) m_palette.palentries[i].peGreen=0; else m_palette.palentries[i].peGreen+=m_amount; if (((int)m_palette.palentries[i].peBlue+m_amount)>255) m_palette.palentries[i].peBlue=255; else if (((int)m_palette.palentries[i].peBlue+m_amount)<0) m_palette.palentries[i].peBlue=0; else m_palette.palentries[i].peBlue+=m_amount; } m_ddpalette->SetEntries(0,0,255,m_palette.palentries); } xevil-2.02r2.orig/win32/fsstatus.cpp0100644000175000017500000003767107041422202016633 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "stdafx.h" #include "XEvil.h"//for resources #include "XViewPort.h" #include "xdata.h" //hresult stuff #include "coord.h" #include "wheel.h" #include "fsstatus.h" // Two rows of buttons are same height as the wheel. #define BUTTON_HEIGHT (Wheel::WHEEL_ITEM_HEIGHT >> 1) // Size of the area for displaying level-specific information. #define LEVEL_WIDTH 215 ///////////////////////////////////////// //HEALTHBAR BOOL XEvilFSHealthBar::update(Xvars &xvars, LPDIRECTDRAWSURFACE p_buffer,CRect &p_clientarea,BOOL p_forceredraw) { if ((m_pos!=m_postedpos)||(m_maxpos!=m_postedmaxpos)||(p_forceredraw)) { m_pos=m_postedpos; m_maxpos=m_postedmaxpos; DrawItem(xvars, p_buffer); return TRUE; } return FALSE; } void XEvilFSHealthBar::DrawItem(Xvars &xvars, LPDIRECTDRAWSURFACE p_buffer) { if (m_maxpos<=1) return; HDC t_pixhdc; if (!xvars.GetDC(p_buffer,&t_pixhdc)){ return; } // Erasing just text part??? CDC *t_dc=CDC::FromHandle(t_pixhdc); CRect t_rect(m_clientpos); t_rect.right=t_rect.left+TEXTINDENT; CBrush *t_oldbrush=(CBrush *)t_dc->SelectStockObject(LTGRAY_BRUSH); t_dc->PatBlt(t_rect.left,t_rect.top,t_rect.Width(),t_rect .Height(),PATCOPY); t_dc->SelectObject(t_oldbrush); t_rect.OffsetRect(TEXTINDENT,0); //draw a square char t_char[IT_STRING_LENGTH]; t_rect.right=(int)(t_rect.left+((float)m_pos/(float)m_maxpos)*(m_clientpos.Width()-TEXTINDENT)); CBrush t_solidbrush; float r=(float)m_pos/(float)m_maxpos; t_solidbrush.CreateSolidBrush(RGB(255*min(2-2*r,1),255*min(2*r,1),0)); t_dc->SelectObject(&t_solidbrush); t_dc->PatBlt(t_rect.left,t_rect.top,t_rect.Width(),t_rect.Height(),PATCOPY); t_rect.left=t_rect.right+1; t_rect.right=m_clientpos.left+m_clientpos.right; if (t_rect.leftSelectStockObject(LTGRAY_BRUSH); t_dc->PatBlt(t_rect.left,t_rect.top,t_rect.Width(),t_rect .Height(),PATCOPY); } t_dc->SelectObject(t_oldbrush); t_dc->SelectStockObject(BLACK_PEN); t_dc->SelectStockObject(ANSI_VAR_FONT); t_dc->SetBkMode(OPAQUE); t_dc->SetBkColor(RGB(192,192,192)); CString t_string("Health: "); t_string+=itoa(m_health,t_char,10); t_rect=m_clientpos; // t_rect.OffsetRect(m_clientpos.left,m_clientpos.top); t_rect.left+=5; t_dc->DrawText(t_string,t_string.GetLength(),t_rect,DT_LEFT|DT_VCENTER|DT_SINGLELINE); t_rect.left-=5; CPen *t_oldpen=(CPen *)t_dc->SelectStockObject(WHITE_PEN); t_dc->MoveTo(t_rect.right-1,t_rect.top); t_dc->LineTo(t_rect.left,t_rect.top); t_dc->LineTo(t_rect.left,t_rect.bottom-1); // t_rect=m_clientpos; // t_rect.OffsetRect(m_clientpos.left,m_clientpos.top); CPen t_newpen(PS_SOLID,1,RGB(96,96,96)); t_dc->SelectObject(&t_newpen); t_dc->MoveTo(t_rect.right-1,t_rect.top); t_dc->LineTo(t_rect.right-1,t_rect.bottom-1); t_dc->LineTo(t_rect.left,t_rect.bottom-1); t_dc->SelectObject(t_oldpen);//put it back p_buffer->ReleaseDC(t_pixhdc); } ///////////////////////////////////////// //XEvilFSButton BOOL XEvilFSButton::update(Xvars &xvars, LPDIRECTDRAWSURFACE p_buffer,CRect &p_clientarea,BOOL p_forceredraw) { if ((m_postedmessage!=m_message)||(p_forceredraw)) { m_message=m_postedmessage; DrawItem(xvars, p_buffer,p_clientarea); return TRUE;//dirty } return FALSE; //not dirty } void XEvilFSButton::DrawItem(Xvars &xvars, LPDIRECTDRAWSURFACE p_buffer,CRect &p_clientarea) { HDC t_pixhdc; if (!xvars.GetDC(p_buffer,&t_pixhdc)){ return; } CDC *t_dc=CDC::FromHandle(t_pixhdc); CRect t_rect(m_clientpos); t_rect.OffsetRect(p_clientarea.left,p_clientarea.top); CBrush *t_oldbrush=(CBrush *)t_dc->SelectStockObject(LTGRAY_BRUSH); t_dc->PatBlt(t_rect.left,t_rect.top,t_rect.Width(),t_rect .Height(),PATCOPY); t_dc->SelectObject(t_oldbrush); CPen *t_oldpen=(CPen *)t_dc->SelectStockObject(WHITE_PEN); t_dc->MoveTo(t_rect.right-1,t_rect.top); t_dc->LineTo(t_rect.left,t_rect.top); t_dc->LineTo(t_rect.left,t_rect.bottom-1); CPen t_newpen(PS_SOLID,1,RGB(96,96,96)); t_dc->SelectObject(&t_newpen); t_dc->MoveTo(t_rect.right-1,t_rect.top); t_dc->LineTo(t_rect.right-1,t_rect.bottom-1); t_dc->LineTo(t_rect.left,t_rect.bottom-1); t_dc->SelectObject(t_oldpen);//put it back t_dc->SelectStockObject(BLACK_PEN); t_dc->SelectStockObject(ANSI_VAR_FONT); t_rect.left+=5; t_dc->SetBkMode(OPAQUE); t_dc->SetBkColor(RGB(192,192,192)); t_dc->DrawText(m_message,m_message.GetLength(),t_rect,DT_LEFT|DT_VCENTER|DT_SINGLELINE); p_buffer->ReleaseDC(t_pixhdc); } ///////////////////////////////////////// //XEvilFSStatusMessage BOOL XEvilFSStatusMessage::update(Xvars &xvars, LPDIRECTDRAWSURFACE p_buffer,CRect &p_clientarea, BOOL p_forceredraw) { if ((m_postedmessage!=m_message)||(p_forceredraw)) { m_message=m_postedmessage; DrawItem(xvars, p_buffer,p_clientarea); return TRUE;//dirty } return FALSE; //not dirty } void XEvilFSStatusMessage::DrawItem(Xvars &xvars, LPDIRECTDRAWSURFACE p_buffer,CRect &p_clientarea) { // We should really get rid of the p_clientarea parameter all together. // The upper-left is always (0,0) anyway. const int textXIndent = 4; const int textYIndent = 0; const int lineHeight = m_clientpos.Height() >> 1; // Create string for each line. int t_index = m_message.Find('\n'); CString t_string1; CString t_string2; if (t_index != -1) { // We have two lines. t_string1 += m_message.Mid(0,t_index); t_string2 += m_message.Mid(t_index + 1); } else { // Only one line, t_string2 stays empty. t_string1 += m_message; } // Rect for each line. CRect t_rect1(textXIndent,textYIndent,m_clientpos.Width() - textXIndent,lineHeight); t_rect1.OffsetRect(m_clientpos.left,m_clientpos.top); t_rect1.OffsetRect(p_clientarea.left,p_clientarea.top); CRect t_rect2(textXIndent,textYIndent + lineHeight,m_clientpos.Width() - textXIndent,2 * lineHeight); t_rect2.OffsetRect(m_clientpos.left,m_clientpos.top); t_rect2.OffsetRect(p_clientarea.left,p_clientarea.top); CRect t_rectboth = m_clientpos; t_rectboth.OffsetRect(p_clientarea.left,p_clientarea.top); // Get DC for p_buffer. HDC t_pixhdc; if (!xvars.GetDC(p_buffer,&t_pixhdc)){ return; } CDC *t_dc = CDC::FromHandle(t_pixhdc); // Clear background. CBrush *t_oldbrush=(CBrush *)t_dc->SelectStockObject(LTGRAY_BRUSH); t_dc->PatBlt(t_rectboth.left,t_rectboth.top,t_rectboth.right,t_rectboth.bottom,PATCOPY); t_dc->SelectObject(t_oldbrush); // Draw 3d outline. CPen *t_oldpen=(CPen *)t_dc->SelectStockObject(WHITE_PEN); t_dc->MoveTo(t_rectboth.right-1,t_rectboth.top); t_dc->LineTo(t_rectboth.right-1,t_rectboth.bottom-1); t_dc->LineTo(t_rectboth.left,t_rectboth.bottom-1); CPen t_newpen(PS_SOLID,1,RGB(96,96,96)); t_dc->SelectObject(&t_newpen); t_dc->LineTo(t_rectboth.left,t_rectboth.top); t_dc->LineTo(t_rectboth.right-1,t_rectboth.top); t_dc->SelectObject(t_oldpen);//put it back // Draw strings t_dc->SelectStockObject(ANSI_FIXED_FONT); t_dc->SetBkMode(TRANSPARENT); t_dc->SetTextColor(RGB(0,0,0)); t_dc->DrawText(t_string1,t_string1.GetLength(),t_rect1,DT_LEFT|DT_VCENTER|DT_SINGLELINE); if (t_index != -1) { t_dc->DrawText(t_string2,t_string2.GetLength(),t_rect2,DT_LEFT|DT_VCENTER|DT_SINGLELINE); } p_buffer->ReleaseDC(t_pixhdc); } ///////////////////////////////////////////////// //STATUS WINDOW ///////////////////////////////////////////////// StatusWnd::StatusWnd(LocatorP l,Xvars *xvars) :m_weaponwheel(l),m_itemwheel(l) { m_plocator = l; m_pxvars = xvars; m_lpDD = m_pxvars->m_lpDD; m_buffer = NULL; } void StatusWnd::updateHealth(Health p_stat,Health p_maxstat) { m_healthbar.setMaxPos(p_maxstat); m_healthbar.setPos(p_stat); m_healthbar.setHealth(p_stat); // Probably redundant. m_dirty = TRUE; } void StatusWnd::updateMass(Mass p_stat) { // Don't bother showing it. } void StatusWnd::updateWeapon(const char p_stat[IT_STRING_LENGTH],ClassId weaponClassId,int p_ammo,BOOL p_ready) { // Weapon m_weaponwheel.setIndexByClassId(weaponClassId); // Ammo m_weaponwheel.setValueAtIndex(p_ammo,m_weaponwheel.getIndex()); // Ready m_weaponwheel.setReadyAtIndex(p_ready ? Wheel::READY_YES : Wheel::READY_NO, m_weaponwheel.getIndex()); // Probably redundant. m_dirty = TRUE; return; } void StatusWnd::updateItem(const char p_stat[IT_STRING_LENGTH],ClassId itemClassId,int p_count) { m_itemwheel.setIndexByClassId(itemClassId); m_itemwheel.setValueAtIndex(p_count,m_itemwheel.getIndex()); // Probably redundant. m_dirty = TRUE; } void StatusWnd::updateCharacterName(const char p_name[IT_STRING_LENGTH]) { CString t_string = "Name: "; t_string += p_name; m_charactername.setMessage(t_string); // Probably redundant. m_dirty = TRUE; } void StatusWnd::updateCharacterClass(const char p_class[IT_STRING_LENGTH]) { CString t_string = "Class: "; t_string += p_class; m_characterclass.setMessage(t_string); // Probably redundant. m_dirty = TRUE; } void StatusWnd::updateXtraLivesHumanKills(int p_stat,BOOL p_xtraLives) { char t_char[IT_STRING_LENGTH]; CString t_string; if (p_xtraLives) { t_string += "Extra Lives: "; if (p_stat == IT_INFINITE_LIVES) { t_string += "unlimited"; } else { t_string += itoa(p_stat,t_char,10); } } else { t_string += "Human Kills: "; t_string += itoa(p_stat,t_char,10); } m_liveshumankills.setMessage(t_string); // Probably redundant. m_dirty = TRUE; } void StatusWnd::updateKillsEnemyKills(int p_stat,BOOL p_kills) { char t_char[IT_STRING_LENGTH]; CString t_string; if (p_kills) { t_string += "Kills: "; } else { t_string += "Machine Kills: "; } t_string+=itoa(p_stat,t_char,10); m_killsenemykills.setMessage(t_string); // Probably redundant. m_dirty = TRUE; } void StatusWnd::updateHumansNum(int p_stat) { char t_char[IT_STRING_LENGTH]; // Used to be "Humans Playing" but font didn't fit on some displays CString t_string("Humans: "); t_string+=itoa(p_stat,t_char,10); m_humansnum.setMessage(t_string); // Probably redundant. m_dirty = TRUE; } void StatusWnd::updateEnemiesNum(int p_stat) { char t_char[IT_STRING_LENGTH]; // Used to be "Enemies Remaining" but font didn't fit on some displays CString t_string("Enemies: "); t_string+=itoa(p_stat,t_char,10); m_enemiesnum.setMessage(t_string); // Probably redundant. m_dirty = TRUE; } void StatusWnd::updateLevel(const char* p_level) { m_level.setMessage(CString(p_level)); // Probably redundant. m_dirty = TRUE; } void StatusWnd::updateStatus(const char* p_message) { m_status.setMessage(CString(p_message)); // Probably redundant. m_dirty = TRUE; } void StatusWnd::setRects(const CRect &p_status) { m_statusrect = p_status; m_bufferrect.SetRect(0,0,m_statusrect.Width(),m_statusrect.Height()); const int nameClassWidth = m_statusrect.Width() / 6; const int healthWidth = m_statusrect.Width() - nameClassWidth - 2 * Wheel::WHEEL_ITEM_WIDTH; const int otherButtonWidth = healthWidth / 4; // Weapon wheel Pos t_point; t_point.x = 0; t_point.y = 0; m_weaponwheel.set_pos(t_point); // Item wheel t_point.x += Wheel::WHEEL_ITEM_WIDTH; m_itemwheel.set_pos(t_point); // Character name. CRect t_rect; t_rect.left = t_point.x + Wheel::WHEEL_ITEM_WIDTH; t_rect.top = 0; t_rect.right = t_rect.left + nameClassWidth; t_rect.bottom = BUTTON_HEIGHT; m_charactername.setClientPos(t_rect); // Character class. t_rect.OffsetRect(0,BUTTON_HEIGHT); m_characterclass.setClientPos(t_rect); t_rect.left += nameClassWidth; // Health bar t_rect.right = t_rect.left + healthWidth; t_rect.top = 0; t_rect.bottom = BUTTON_HEIGHT; m_healthbar.setClientPos(t_rect); // Lives/Human kills t_rect.right = t_rect.left + otherButtonWidth; t_rect.OffsetRect(0,BUTTON_HEIGHT); m_liveshumankills.setClientPos(t_rect); // Kills/Enemy kills t_rect.OffsetRect(otherButtonWidth,0); m_killsenemykills.setClientPos(t_rect); // Humans playing t_rect.OffsetRect(otherButtonWidth,0); m_humansnum.setClientPos(t_rect); // Enemies playing t_rect.OffsetRect(otherButtonWidth,0); // Make sure last one is flush against right edge. t_rect.right = m_statusrect.Width(); m_enemiesnum.setClientPos(t_rect); // Status bar t_rect.SetRect(0,2 * BUTTON_HEIGHT, m_statusrect.Width() - LEVEL_WIDTH,m_statusrect.Height()); m_status.setClientPos(t_rect); // Level-information bar. t_rect.SetRect(m_statusrect.Width() - LEVEL_WIDTH,2 * BUTTON_HEIGHT, m_statusrect.Width(),m_statusrect.Height()); m_level.setClientPos(t_rect); // Just to be sure. m_dirty = TRUE; } BOOL StatusWnd::Create(CRect &p_statusrect) { m_buffer = m_pxvars->create_surface(p_statusrect.Width(),p_statusrect.Height(),NULL); if (m_buffer == NULL) { return FALSE; } // Fill status window with black to start out with. m_pxvars->color_fill(m_buffer,CRect(0,0,p_statusrect.Width(),p_statusrect.Height()), m_pxvars->m_black); setRects(p_statusrect); // Just put some initial value in. updateCharacterName("None"); updateCharacterClass("None"); updateHealth(0,100); updateMass(0); updateWeapon("None",A_None,0,FALSE); updateItem("None",A_None,0); updateXtraLivesHumanKills(0,TRUE); updateKillsEnemyKills(0,TRUE); updateHumansNum(0); updateEnemiesNum(0); m_dirty = TRUE; return TRUE; } void StatusWnd::update(LPDIRECTDRAWSURFACE p_buffer,CWnd *p_parent,BOOL p_forceredraw) { if (!m_pxvars) return; m_dirty |= m_charactername.update(*m_pxvars, m_buffer,m_bufferrect,p_forceredraw); m_dirty |= m_characterclass.update(*m_pxvars, m_buffer,m_bufferrect,p_forceredraw); m_dirty |= m_liveshumankills.update(*m_pxvars, m_buffer,m_bufferrect,p_forceredraw); m_dirty |= m_killsenemykills.update(*m_pxvars, m_buffer,m_bufferrect,p_forceredraw); m_dirty |= m_humansnum.update(*m_pxvars, m_buffer,m_bufferrect,p_forceredraw); m_dirty |= m_enemiesnum.update(*m_pxvars, m_buffer,m_bufferrect,p_forceredraw); m_dirty |= m_healthbar.update(*m_pxvars, m_buffer,m_bufferrect,p_forceredraw); m_dirty |= m_weaponwheel.update(m_buffer,m_plocator,*m_pxvars,p_forceredraw); m_dirty |= m_itemwheel.update( m_buffer,m_plocator,*m_pxvars,p_forceredraw); m_dirty |= m_status.update(*m_pxvars, m_buffer,m_bufferrect,p_forceredraw); m_dirty |= m_level.update(*m_pxvars, m_buffer,m_bufferrect,p_forceredraw); if ((p_forceredraw) || (m_dirty)) { // Get dest rect in screen coordinates. // m_statusrect is in client coordinates CPoint t_topLeft = m_statusrect.TopLeft(); CPoint t_bottomRight = m_statusrect.BottomRight(); p_parent->ClientToScreen(&t_topLeft); p_parent->ClientToScreen(&t_bottomRight); CRect t_screenstatusrect(t_topLeft,t_bottomRight); // Actually do the blt to the screen. // Used to be a DHCHECKLOST. m_pxvars->Blt(p_buffer,t_screenstatusrect.left,t_screenstatusrect.top,m_buffer,m_bufferrect); m_dirty = FALSE; } } StatusWnd::~StatusWnd() { } void StatusWnd::clock() { m_weaponwheel.clock(); m_itemwheel.clock(); } void StatusWnd::init_x(LocatorP l,Xvars& xvars,IXCommand command,void* arg) { Wheel::init_x(l,xvars,command,arg); } xevil-2.02r2.orig/win32/glowpal.cpp0100644000175000017500000000525407041422202016414 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "stdafx.h" #include "glowpal.h" GlowPalette::GlowPalette(ColorPalette &p_palette) :PaletteModifier(p_palette) { int t_int=0; m_amount=0; m_dir=-1*GLOW_AMOUNT; for (int i=0;iGLOW_UPPERLIMIT) { m_amount=GLOW_UPPERLIMIT; m_dir=-1*GLOW_AMOUNT; } if (m_amount255) m_palette.palentries[i].peRed=255; else if (((int)m_palette.palentries[i].peRed+m_amount)<0) m_palette.palentries[i].peRed=0; else m_palette.palentries[i].peRed+=m_amount; if (((int)m_palette.palentries[i].peGreen+m_amount)>255) m_palette.palentries[i].peGreen=255; else if (((int)m_palette.palentries[i].peGreen+m_amount)<0) m_palette.palentries[i].peGreen=0; else m_palette.palentries[i].peGreen+=m_amount; if (((int)m_palette.palentries[i].peBlue+m_amount)>255) m_palette.palentries[i].peBlue=255; else if (((int)m_palette.palentries[i].peBlue+m_amount)<0) m_palette.palentries[i].peBlue=0; else m_palette.palentries[i].peBlue+=m_amount; } m_ddpalette->SetEntries(0,0,255,m_palette.palentries); } xevil-2.02r2.orig/win32/keyhitdlg.cpp0100644000175000017500000000611707041422202016732 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // KeyHitDlg.cpp : implementation file #include "stdafx.h" #include "xevil.h" #include "KeyHitDlg.h" /*#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif*/ HHOOK KeyHitDlg::m_hhk; KeyHitDlg * KeyHitDlg::m_hack; ///////////////////////////////////////////////////////////////////////////// // KeyHitDlg dialog KeyHitDlg::KeyHitDlg(CWnd* pParent /*=NULL*/) : CDialog(KeyHitDlg::IDD, pParent) { //{{AFX_DATA_INIT(KeyHitDlg) //}}AFX_DATA_INIT } void KeyHitDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(KeyHitDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(KeyHitDlg, CDialog) //{{AFX_MSG_MAP(KeyHitDlg) ON_WM_KEYUP() ON_WM_KEYDOWN() ON_WM_CHAR() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // KeyHitDlg message handlers void KeyHitDlg::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default m_Dchar=nChar; CDialog::OnKeyUp(nChar, nRepCnt, nFlags); EndDialog(IDOK); } void KeyHitDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default m_Dchar=nChar; EndDialog(IDOK); CDialog::OnKeyDown(nChar, nRepCnt, nFlags); } BOOL KeyHitDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here SetFocus(); SetCapture(); m_hack=this; m_hhk=SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyhitKeyboardProc, AfxGetInstanceHandle(),AfxGetThread()->m_nThreadID); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void KeyHitDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default m_Dchar=nChar; EndDialog(IDOK); CDialog::OnChar(nChar, nRepCnt, nFlags); } void KeyHitDlg::keyHit(WPARAM wParam, LPARAM lParam) { m_Dchar=(unsigned char)wParam; EndDialog(IDOK); } LRESULT CALLBACK KeyHitDlg::KeyhitKeyboardProc(int code, WPARAM wParam, LPARAM lParam) { UnhookWindowsHookEx(m_hhk); m_hack->keyHit(wParam,lParam); return ::CallNextHookEx(m_hhk,code, wParam,lParam); } xevil-2.02r2.orig/win32/keysets.cpp0100644000175000017500000003141507041422202016434 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // KeySets.cpp : implementation file // #include "stdafx.h" #include "xevil.h" #include "KeySets.h" #include "KeyHitDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CKeySets dialog CKeySets::CKeySets(CWnd* pParent /*=NULL*/) : CDialog(CKeySets::IDD, pParent) { //{{AFX_DATA_INIT(CKeySets) m_playerstaticvalue = _T(""); //}}AFX_DATA_INIT m_pbutton=NULL; m_pchar=NULL; } void CKeySets::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CKeySets) DDX_Control(pDX, IDC_CHAT, m_chatbutton); DDX_Control(pDX, IDC_WEAPONUSE, m_weaponusebutton); DDX_Control(pDX, IDC_WEAPONDROP, m_weapondropbutton); DDX_Control(pDX, IDC_WEAPONCHANGE, m_weaponchangebutton); DDX_Control(pDX, IDC_UR, m_upperrightbutton); DDX_Control(pDX, IDC_UP, m_upperbutton); DDX_Control(pDX, IDC_UL, m_upperleftbutton); DDX_Control(pDX, IDC_R, m_rightbutton); DDX_Control(pDX, IDC_LR, m_lowerrightbutton); DDX_Control(pDX, IDC_LL, m_lowerleftbutton); DDX_Control(pDX, IDC_L, m_leftbutton); DDX_Control(pDX, IDC_ITEMUSE, m_itemusebutton); DDX_Control(pDX, IDC_ITEMDROP, m_itemdropbutton); DDX_Control(pDX, IDC_ITEMCHANGE, m_itemchangebutton); DDX_Control(pDX, IDC_DOWN, m_downbutton); DDX_Control(pDX, IDC_CENTER, m_centerbutton); DDX_Text(pDX, IDC_PLAYERSTATIC, m_playerstaticvalue); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CKeySets, CDialog) //{{AFX_MSG_MAP(CKeySets) ON_BN_CLICKED(IDC_UP, OnUp) ON_BN_CLICKED(IDC_UR, OnUr) ON_BN_CLICKED(IDC_WEAPONCHANGE, OnWeaponchange) ON_BN_CLICKED(IDC_WEAPONUSE, OnWeaponuse) ON_BN_CLICKED(IDC_WEAPONDROP, OnWeapondrop) ON_BN_CLICKED(IDC_CENTER, OnCenter) ON_BN_CLICKED(IDC_DOWN, OnDown) ON_BN_CLICKED(IDC_ITEMCHANGE, OnItemchange) ON_BN_CLICKED(IDC_ITEMDROP, OnItemdrop) ON_BN_CLICKED(IDC_ITEMUSE, OnItemuse) ON_BN_CLICKED(IDC_L, OnL) ON_BN_CLICKED(IDC_LL, OnLl) ON_BN_CLICKED(IDC_LR, OnLr) ON_BN_CLICKED(IDC_R, OnR) ON_BN_CLICKED(IDC_UL, OnUl) ON_BN_CLICKED(IDC_CHAT, OnChat) ON_WM_KEYDOWN() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CKeySets message handlers BOOL CKeySets::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_weaponusebutton.SetWindowText(translateChar(m_Dweaponusechar)); m_weapondropbutton.SetWindowText(translateChar(m_Dweapondropchar)); m_weaponchangebutton.SetWindowText(translateChar(m_Dweaponchangechar)); m_upperrightbutton.SetWindowText(translateChar(m_Dupperrightchar)); m_upperbutton.SetWindowText(translateChar(m_Dupperchar)); m_upperleftbutton.SetWindowText(translateChar(m_Dupperleftchar)); m_rightbutton.SetWindowText(translateChar(m_Drightchar)); m_lowerrightbutton.SetWindowText(translateChar(m_Dlowerrightchar)); m_lowerleftbutton.SetWindowText(translateChar(m_Dlowerleftchar)); m_leftbutton.SetWindowText(translateChar(m_Dleftchar)); m_itemusebutton.SetWindowText(translateChar(m_Ditemusechar)); m_itemdropbutton.SetWindowText(translateChar(m_Ditemdropchar)); m_itemchangebutton.SetWindowText(translateChar(m_Ditemchangechar)); m_downbutton.SetWindowText(translateChar(m_Ddownchar)); m_centerbutton.SetWindowText(translateChar(m_Dcenterchar)); m_chatbutton.SetWindowText(translateChar(m_Dchatchar)); m_playerstaticvalue="";//m_Dplayerstaticvalue; SetWindowText(m_Dplayerstaticvalue); UpdateData(FALSE); m_changed=FALSE; return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CKeySets::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { #if 0 // TODO: Add your message handler code here and/or call default if (m_pchar) { *m_pchar=nChar; m_pbutton->SetWindowText(translateChar(*m_pchar)); m_pchar=NULL; m_pbutton=NULL; } #endif CDialog::OnKeyDown(nChar, nRepCnt, nFlags); } void CKeySets::OnOK() { #ifdef MODELESS_DIALOGS PostMessage(WM_COMMAND,IDOK,0); #else CDialog::OnOK(); #endif } void CKeySets::OnCancel() { #ifdef MODELESS_DIALOGS PostMessage(WM_COMMAND,IDCANCEL,0); #else CDialog::OnCancel(); #endif } void CKeySets::OnUp() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Dupperchar=t_dlg.getChar(); m_upperbutton.SetWindowText(translateChar(m_Dupperchar)); m_changed=TRUE; } void CKeySets::OnUr() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Dupperrightchar=t_dlg.getChar(); m_upperrightbutton.SetWindowText(translateChar(m_Dupperrightchar)); m_changed=TRUE; } void CKeySets::OnWeaponchange() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Dweaponchangechar=t_dlg.getChar(); m_weaponchangebutton.SetWindowText(translateChar(m_Dweaponchangechar)); } void CKeySets::OnWeaponuse() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Dweaponusechar=t_dlg.getChar(); m_weaponusebutton.SetWindowText(translateChar(m_Dweaponusechar)); m_changed=TRUE; } void CKeySets::OnWeapondrop() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Dweapondropchar=t_dlg.getChar(); m_weapondropbutton.SetWindowText(translateChar(m_Dweapondropchar)); m_changed=TRUE; } void CKeySets::OnCenter() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Dcenterchar=t_dlg.getChar(); m_centerbutton.SetWindowText(translateChar(m_Dcenterchar)); m_changed=TRUE; } void CKeySets::OnDown() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Ddownchar=t_dlg.getChar(); m_downbutton.SetWindowText(translateChar(m_Ddownchar)); m_changed=TRUE; } void CKeySets::OnItemchange() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Ditemchangechar=t_dlg.getChar(); m_itemchangebutton.SetWindowText(translateChar(m_Ditemchangechar)); m_changed=TRUE; } void CKeySets::OnItemdrop() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Ditemdropchar=t_dlg.getChar(); m_itemdropbutton.SetWindowText(translateChar(m_Ditemdropchar)); m_changed=TRUE; } void CKeySets::OnItemuse() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Ditemusechar=t_dlg.getChar(); m_itemusebutton.SetWindowText(translateChar(m_Ditemusechar)); m_changed=TRUE; } void CKeySets::OnL() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Dleftchar=t_dlg.getChar(); m_leftbutton.SetWindowText(translateChar(m_Dleftchar)); m_changed=TRUE; } void CKeySets::OnLl() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Dlowerleftchar=t_dlg.getChar(); m_lowerleftbutton.SetWindowText(translateChar(m_Dlowerleftchar)); m_changed=TRUE; } void CKeySets::OnLr() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Dlowerrightchar=t_dlg.getChar(); m_lowerrightbutton.SetWindowText(translateChar(m_Dlowerrightchar)); m_changed=TRUE; } void CKeySets::OnR() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Drightchar=t_dlg.getChar(); m_rightbutton.SetWindowText(translateChar(m_Drightchar)); m_changed=TRUE; } void CKeySets::OnUl() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Dupperleftchar=t_dlg.getChar(); m_upperleftbutton.SetWindowText(translateChar(m_Dupperleftchar)); m_changed=TRUE; } void CKeySets::OnChat() { // TODO: Add your control notification handler code here KeyHitDlg t_dlg; t_dlg.DoModal(); m_Dchatchar=t_dlg.getChar(); m_chatbutton.SetWindowText(translateChar(m_Dchatchar)); m_changed=TRUE; } CString CKeySets::translateChar(unsigned char p_char) { /* if (IsCharAlphaNumeric(p_char)) { return CString(p_char); }*/ switch (p_char) { case 8: return "BK SPACE"; case 9: return "TAB"; case 13: return "Enter"; case 16: return "SHIFT"; case 17: return "CNTRL"; case 27: return "ESC"; case 32: return "SPACE"; case 33: return "PgUp"; case 34: return "PgDn"; case 35: return "End"; case 36: return "Home"; case 37: return "Lt Arrow"; case 38: return "Up Arrow"; case 39: return "Rt Arrow"; case 40: return "Dn Arrow"; case 45: return "Insert"; case 46: return "Del"; case 96: return "Num 0"; case 97: return "Num 1"; case 98: return "Num 2"; case 99: return "Num 3"; case 100: return "Num 4"; case 101: return "Num 5"; case 102: return "Num 6"; case 103: return "Num 7"; case 104: return "Num 8"; case 105: return "Num 9"; case 107: return "Num +"; case 109: return "Num -"; case 110: return "Num ."; case 111: return "Num /"; case 112: return "F1"; case 113: return "F2"; case 114: return "F3"; case 115: return "F4"; case 116: return "F5"; case 117: return "F6"; case 118: return "F7"; case 119: return "F8"; case 120: return "F9"; case 121: return "F10"; case 122: return "F11"; case 123: return "F12"; case 170: return '.'; //'.' is NOT 190! case 186: return "'"; case 187: return "="; case 188: return ","; case 189: return "-"; case 190: return "."; case 191: return "/"; case 192: return "~"; case 220: return "\\"; case 221: return "]"; case 222: return "["; case 18:case 44:case 145: case 19: return "Invalid"; } return CString(p_char); } void CKeySets::setUpChar(char p_char) { m_Dupperchar=p_char; } void CKeySets::setUpLeftChar(char p_char) { m_Dupperleftchar=p_char; } void CKeySets::setUpRightChar(char p_char) { m_Dupperrightchar=p_char; } void CKeySets::setLeftChar(char p_char) { m_Dleftchar=p_char; } void CKeySets::setRightChar(char p_char) { m_Drightchar=p_char; } void CKeySets::setCenterChar(char p_char) { m_Dcenterchar=p_char; } void CKeySets::setDownChar(char p_char) { m_Ddownchar=p_char; } void CKeySets::setDownLeftChar(char p_char) { m_Dlowerleftchar=p_char; } void CKeySets::setDownRightChar(char p_char) { m_Dlowerrightchar=p_char; } void CKeySets::setWeaponUse(char p_char) { m_Dweaponusechar=p_char; } void CKeySets::setWeaponChange(char p_char) { m_Dweaponchangechar=p_char; } void CKeySets::setWeaponDrop(char p_char) { m_Dweapondropchar=p_char; } void CKeySets::setItemUse(char p_char) { m_Ditemusechar=p_char; } void CKeySets::setItemChange(char p_char) { m_Ditemchangechar=p_char; } void CKeySets::setItemDrop(char p_char) { m_Ditemdropchar=p_char; } void CKeySets::setChat(char p_char) { m_Dchatchar=p_char; } char CKeySets::getUpChar() { return m_Dupperchar; } char CKeySets::getUpLeftChar() { return m_Dupperleftchar; } char CKeySets::getUpRightChar() { return m_Dupperrightchar; } char CKeySets::getLeftChar() { return m_Dleftchar; } char CKeySets::getRightChar() { return m_Drightchar; } char CKeySets::getCenterChar() { return m_Dcenterchar; } char CKeySets::getDownChar() { return m_Ddownchar; } char CKeySets::getDownLeftChar() { return m_Dlowerleftchar; } char CKeySets::getDownRightChar() { return m_Dlowerrightchar; } char CKeySets::getWeaponUse() { return m_Dweaponusechar; } char CKeySets::getWeaponChange() { return m_Dweaponchangechar; } char CKeySets::getWeaponDrop() { return m_Dweapondropchar; } char CKeySets::getItemUse() { return m_Ditemusechar; } char CKeySets::getItemChange() { return m_Ditemchangechar; } char CKeySets::getItemDrop() { return m_Ditemdropchar; } char CKeySets::getChat() { return m_Dchatchar; } xevil-2.02r2.orig/win32/optionsdlg.cpp0100644000175000017500000001670207041422202017131 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // OptionsDlg.cpp : implementation file // #include "stdafx.h" #include "XEvil.h" #include "OptionsDlg.h" #include "locator.h" #include "game_style.h" #include "role.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // OptionsDlg dialog OptionsDlg::OptionsDlg(CWnd* pParent /*=NULL*/) : CDialog(OptionsDlg::IDD, pParent) { //{{AFX_DATA_INIT(OptionsDlg) m_gamestyle = 0; m_nummachines = 0; m_roomshigh = 0; m_roomswide = 0; m_musictype = 2; m_soundonoff = FALSE; m_cooperative = FALSE; m_refillmachines = FALSE; m_human = FALSE; //}}AFX_DATA_INIT } void OptionsDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(OptionsDlg) DDX_Control(pDX, IDC_SOUNDTRACKVOL, m_soundtrackslider); DDX_Control(pDX, IDC_GAMESPEED, m_gamespeedslider); DDX_Control(pDX, IDC_EFFECTVOL, m_effectsslider); DDX_Radio(pDX, IDC_GAMESTYLE2, m_gamestyle); DDX_Text(pDX, IDC_NUMMACHINES, m_nummachines); DDV_MinMaxInt(pDX, m_nummachines, 0, 500); DDX_Text(pDX, IDC_ROOMHEIGHT, m_roomshigh); DDV_MinMaxInt(pDX, m_roomshigh, 0, 10); DDX_Text(pDX, IDC_ROOMWIDTH, m_roomswide); DDV_MinMaxInt(pDX, m_roomswide, 0, 10); DDX_Radio(pDX, IDC_SOUNDTYPE, m_musictype); DDX_Check(pDX, IDC_SOUNDONOFF, m_soundonoff); DDX_Check(pDX, IDC_COOPERATIVE, m_cooperative); DDX_Check(pDX, IDC_REFILLMACHINES, m_refillmachines); DDX_Check(pDX, IDC_HUMAN, m_human); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(OptionsDlg, CDialog) //{{AFX_MSG_MAP(OptionsDlg) ON_BN_CLICKED(IDC_STYLEDUEL, OnStyleChanged) ON_BN_CLICKED(IDC_STYLEEXTENDED, OnStyleChanged) ON_BN_CLICKED(IDC_STYLEKILL, OnStyleChanged) ON_BN_CLICKED(IDC_STYLELEVELS, OnStyleChanged) ON_BN_CLICKED(IDC_STYLESCENARIOS, OnStyleChanged) ON_BN_CLICKED(IDC_STYLETRAINING, OnStyleChanged) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // OptionsDlg message handlers BOOL OptionsDlg::OnInitDialog() { CDialog::OnInitDialog(); CenterWindow(); m_gamestyle = styleToIndex(m_Dstyle); m_nummachines=m_Dnummachines; m_refillmachines=m_Drefillmachines; #if 0 // Make sure the number is within the range for the UI, or // we won't be able to quit the dialog if humansNum is disabled. if (m_Dnumhumans >= 0 && m_Dnumhumans < 2) { m_numhumans=m_Dnumhumans; } else { m_numhumans=1; } #endif m_human = m_Dhuman; m_musictype=m_Dmusictype; m_soundonoff=m_Dsoundonoff; m_cooperative=m_Dcooperative; m_roomshigh=m_Droomshigh; m_roomswide=m_Droomswide; m_effectsslider.SetRange(0,20); m_effectsslider.SetLineSize(1); m_effectsslider.SetPageSize(2); m_effectsslider.SetPos((5000+m_Deffectsvolume)/250); m_soundtrackslider.SetRange(0,20); m_soundtrackslider.SetLineSize(1); m_soundtrackslider.SetPageSize(2); m_soundtrackslider.SetPos((5000+m_Dsndtrkvolume)/250); m_gamespeedslider.SetRange(0,10); m_gamespeedslider.SetLineSize(1); m_gamespeedslider.SetPageSize(2); m_gamespeedslider.SetPos((100-m_Dgamespeed)/10); UpdateData(FALSE); SetEnabledByStyleAndRole(m_Dstyle,m_Droletype); return TRUE; // return TRUE unless you set the focus to a control } void OptionsDlg::OnOK() { UpdateData(TRUE); m_Dstyle = indexToStyle(m_gamestyle); m_Dnummachines=m_nummachines; m_Drefillmachines=m_refillmachines; m_Dhuman=m_human; m_Droomswide=m_roomswide; m_Droomshigh=m_roomshigh; m_Dmusictype=(UIsettings::SOUNDTRACKTYPE)m_musictype; m_Dsoundonoff=m_soundonoff; m_Dcooperative=m_cooperative; m_Dgamespeed=100-10*m_gamespeedslider.GetPos(); m_Deffectsvolume=250*m_effectsslider.GetPos()-5000; if (m_Deffectsvolume== -5000) m_Deffectsvolume= -10000; m_Dsndtrkvolume=250*m_soundtrackslider.GetPos()-5000; if (m_Dsndtrkvolume== -5000) m_Dsndtrkvolume= -10000; #ifdef MODELESS_DIALOGS PostMessage(WM_COMMAND,IDOK,0); #else CDialog::OnOK(); #endif } void OptionsDlg::OnCancel() { #ifdef MODELESS_DIALOGS PostMessage(WM_COMMAND,IDCANCEL,0); #else CDialog::OnCancel(); #endif } void OptionsDlg::OnStyleChanged() { UpdateData(TRUE); GameStyleType style = indexToStyle(m_gamestyle); SetEnabledByStyleAndRole(style,m_Droletype); } void OptionsDlg::SetEnabledByStyleAndRole(GameStyleType style,RoleType roleType) { // Ask the GameStyle and Role if the various UI items are used for this // this game style/role combination. Boolean enabled; // EnemiesNum CWnd* enemiesNum = GetDlgItem(IDC_NUMMACHINES); ASSERT(enemiesNum); enabled = Role::uses_enemies_num(roleType) && GameStyle::uses_enemies_num(style); enemiesNum->EnableWindow(enabled); // EnemiesRefill CWnd* enemiesRefill = GetDlgItem(IDC_REFILLMACHINES); ASSERT(enemiesRefill); enabled = Role::uses_enemies_refill(roleType) && GameStyle::uses_enemies_refill(style); enemiesRefill->EnableWindow(enabled); // GameStyle CWnd* levels = GetDlgItem(IDC_STYLELEVELS); CWnd* scenarios = GetDlgItem(IDC_STYLESCENARIOS); CWnd* kill = GetDlgItem(IDC_STYLEKILL); CWnd* duel = GetDlgItem(IDC_STYLEDUEL); CWnd* extended = GetDlgItem(IDC_STYLEEXTENDED); CWnd* training = GetDlgItem(IDC_STYLETRAINING); ASSERT(levels && scenarios && kill && duel && extended && training); enabled = Role::uses_game_style(roleType); levels->EnableWindow(enabled); scenarios->EnableWindow(enabled); kill->EnableWindow(enabled); duel->EnableWindow(enabled); extended->EnableWindow(enabled); training->EnableWindow(enabled); // HumansNum CWnd* humansNum = GetDlgItem(IDC_HUMAN); ASSERT(humansNum); humansNum->EnableWindow(Role::uses_humans_num(roleType)); // Cooperative CWnd* cooperative = GetDlgItem(IDC_COOPERATIVE); ASSERT(cooperative); cooperative->EnableWindow(Role::uses_cooperative(roleType)); } void OptionsDlg::setNumHumans(int p_int) { m_Dhuman = (p_int != 0); } int OptionsDlg::getNumHumans(){ if (m_Dhuman) { return 1; } return 0; } GameStyleType OptionsDlg::indexToStyle(int index) { switch (index) { case 0: return LEVELS; case 1: return SCENARIOS; case 2: return KILL; case 3: return DUEL; case 4: return EXTENDED; case 5: return TRAINING; default: assert(FALSE); return LEVELS; } } int OptionsDlg::styleToIndex(GameStyleType style) { switch (style) { case LEVELS : return 0; case SCENARIOS: return 1; case KILL : return 2; case DUEL : return 3; case EXTENDED : return 4; case TRAINING : return 5; default: assert(FALSE); return 0; } } xevil-2.02r2.orig/win32/palmod.cpp0100644000175000017500000000507707041422200016224 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "stdafx.h" #include "palmod.h" #include "xdata.h" /*passed a palette, does some modification on it and makes a lpdirectdrawpalette keeps pointer to old palette to return it to normal.*/ PaletteModifier::PaletteModifier(ColorPalette &p_palette) { m_applied=FALSE; m_ddpalette=NULL; m_oldpalette=NULL; m_surface=NULL; m_hpal=NULL; } PaletteModifier::PaletteModifier() { m_applied=FALSE; m_ddpalette=NULL; m_oldpalette=NULL; m_surface=NULL; m_hpal=NULL; } PaletteModifier::~PaletteModifier() { HRESULT t_result; if (m_applied) t_result=m_surface->SetPalette( m_oldpalette); if (m_ddpalette) m_ddpalette->Release(); if (m_hpal) ::DeleteObject(m_hpal); } HRESULT PaletteModifier::applyPalette(HDC p_hdc,LPDIRECTDRAWSURFACE p_surface, LPDIRECTDRAW p_lpDD) { if (m_applied) return DD_OK; /* ::SelectPalette(p_hdc,m_hpal,FALSE);//false is to force us to use our own palette! UINT t_uint=::RealizePalette(p_hdc); t_uint=::GetSystemPaletteEntries(p_hdc,0,PALENTRIES,m_palette.palentries);*/ HRESULT t_result=p_lpDD->CreatePalette( DDPCAPS_ALLOW256|DDPCAPS_8BIT, m_palette.palentries, &m_ddpalette,NULL); DHRESULT(t_result,return t_result); m_surface=p_surface; t_result=m_surface->GetPalette( &m_oldpalette); DHRESULT(t_result,return t_result); t_result=m_surface->SetPalette( m_ddpalette); DHRESULT(t_result,return t_result); m_applied=TRUE; return DD_OK; } HRESULT PaletteModifier::removePalette() { if (!m_applied) return DD_OK; HRESULT t_result=DD_OK; if (m_applied) t_result=m_surface->SetPalette( m_oldpalette); m_applied=FALSE; return t_result; } xevil-2.02r2.orig/win32/runserverdlg.cpp0100644000175000017500000000527407041422200017471 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // RunServerDlg.cpp : implementation file // #include "stdafx.h" #include "xevil.h" #include "RunServerDlg.h" #include "role.h" #include "xetp.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CRunServerDlg dialog CRunServerDlg::CRunServerDlg(CWnd* pParent /*=NULL*/) : CDialog(CRunServerDlg::IDD, pParent) { //{{AFX_DATA_INIT(CRunServerDlg) m_port = XETP::DEFAULT_PORT; m_playerObserver = -1; m_name = _T(""); //}}AFX_DATA_INIT } Boolean CRunServerDlg::get_local_human() { return m_playerObserver == 0; } void CRunServerDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRunServerDlg) DDX_Control(pDX, IDC_EDIT3, m_nameControl); DDX_Text(pDX, IDC_EDIT1, m_port); DDV_MinMaxUInt(pDX, m_port, 1, 65535); DDX_Radio(pDX, IDC_PLAYER, m_playerObserver); DDX_Text(pDX, IDC_EDIT3, m_name); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CRunServerDlg, CDialog) //{{AFX_MSG_MAP(CRunServerDlg) ON_BN_CLICKED(IDC_PLAYER, OnPlayer) ON_BN_CLICKED(IDC_OBSERVER, OnPlayer) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CRunServerDlg message handlers BOOL CRunServerDlg::OnInitDialog() { CDialog::OnInitDialog(); // Default is player. m_playerObserver = 0; m_name = ""; UpdateEnabled(); UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CRunServerDlg::OnPlayer() { UpdateData(TRUE); UpdateEnabled(); } void CRunServerDlg::UpdateEnabled() { // Only enable the name field if in "Player" mode. BOOL enabled = (m_playerObserver == 0); m_nameControl.EnableWindow(enabled); } xevil-2.02r2.orig/win32/s_man.cpp0100644000175000017500000003750407041422200016045 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "stdafx.h" #include "utils.h" #include "s_man.h" #include "xdata.h" // Manages a set of surfaces that all share the same DirectDraw properties. class SurfaceSet { public: SurfaceSet(DDCOLORKEY* colorKey,int colHeightMax); /* EFFECTS: Create a SurfaceManager to manage surfaces with the given colorKey. NULL means don't use a colorKey. Makes copy of colorKey. */ ~SurfaceSet(); void add(void* key,const Size& size); /* REQUIRES: size.width > 0 && size.height > 0 */ /* EFFECTS: Add a request for a rectangle of a given size. size is in stretched coordinates. The rectangle will be associated with "key". You may add() the same (key,size) pair multiple times, it will only be allocated one rectangle. */ const DDCOLORKEY* get_color_key() {return colorKey;} /* EFFECTS: Return a pointer to the color key associated with this SurfaceSet or NULL if no color key. */ LPDIRECTDRAWSURFACE lookup(Area& area,void* key); /* MODIFIES: area */ /* EFFECTS: Lookup the surface area for "key". Return the DirectDrawSurface for that key and set area to be the rectangle on that surface reserved for that key. Return NULL if not in this set. */ HRESULT add_complete(Xvars& xvars,int& pixAllc,int& pixUsed); /* MODIFIES: pixAllc, pixUsed */ /* EFFECTS: All rectangle requests have been submitted, generate the surfaces. Set pixAllc and pixUsed to the number of pixels allocated and used, respectively. */ int debug_pages_num(const Size& size); /* EFFECTS: Computes how many debugging pages will be needed to display all the surfaces in this SurfaceSet. */ void draw_debug_page(Xvars&,LPDIRECTDRAWSURFACE surf,const Size& size,int pageNum); /* REQUIRES: 0 <= pageNum < debug_pages_num() */ /* EFFECTS: Draw one debugging page onto surf. surf has the given size. */ private: enum { // Don't use powers of 2 or 10 with our crappy hash function. HASHTABLE_ENTRIES = 297, }; // Data for each column. The surface and the size of the surface. struct ColData { Size size; LPDIRECTDRAWSURFACE surf; }; // The rectangular region associated with a key. struct KeyData { Size size; int tableIndex; int colNum; int yOffset; }; // Maximum height of each of the columns in an entry in table. int colHeightMax; // Has add_complete() been called. // Redundant data, could have pointer back to containing SurfaceManager. Boolean addCompleted; // The colorkey for the SurfaceManager. DDCOLORKEY *colorKey; // Each entry in table has a list of (ColData*). // // table[n] is a list of columns of rectangles where // (2^n <= rectangle.width < 2^(n+1) // // Before add_complete(), it keeps a running total of the rectangles // added so far. // // After add_complete(), the surfaces are filled in. PtrList table; // HashTable from key->KeyData IDictionary* hash; }; SurfaceSet::SurfaceSet(DDCOLORKEY *cKey,int cHeightMax) { addCompleted = False; colHeightMax = cHeightMax; // Make a copy of the colorKey. if (cKey) { colorKey = new DDCOLORKEY; assert(colorKey); *colorKey = *cKey; } else { colorKey = NULL; } hash = HashTable_factory(HASHTABLE_ENTRIES); } SurfaceSet::~SurfaceSet() { delete colorKey; // Wipe out hash table and everything in it. IDictIterator* iter = hash->iterate(); void* key; KeyData* kData; while (kData = (KeyData*)iter->next(key)) { delete kData; } delete iter; delete hash; // Kill everything inside table. for (int n = 0; n < table.length(); n++) { PtrList* cols = (PtrList*)table.get(n); if (cols) { for (int m = 0; m < cols->length(); m++) { ColData* cData = (ColData*)cols->get(m); assert(cData); delete cData; if (addCompleted) { // Let the surface get released when the IDirectDraw object is killed. // assert(cData->surf); // cData->surf->Release(); } } delete cols; } } } void SurfaceSet::add(void* key,const Size& size) { assert(size.width > 0 && size.height > 0); assert(size.height <= colHeightMax); // If request has already been added, do nothing. KeyData* existingKData = (KeyData*)hash->get(key); if (existingKData) { assert(size == existingKData->size); return; } unsigned int width = size.width; // Poor man's base-2 logarithm int lgWidth = 0; while ((width >>= 1) > 0) { lgWidth++; } // The log of width gives the index into table. PtrList* cols = NULL; if (lgWidth < table.length()) { cols = (PtrList*)table.get(lgWidth); } // else it is definitely not in the table. // If no list of columns has been created for this range of widths, // create the list now. if (!cols) { // Make guess that that we will only need one column in cols. cols = new PtrList(1); assert(cols); // Create one empty column in cols. ColData* newData = new ColData; assert(newData); newData->size.set_zero(); newData->surf = NULL; cols->add(newData); // Store the new column list at lgWidth. table.set_and_fill(lgWidth,(void*)cols); } // cols guaranteed to have length() >= 1 at this point. // The data for the newly allocated rectangle. KeyData* kData = new KeyData; assert(kData); kData->size = size; kData->tableIndex = lgWidth; // Try to add rectangle to the end of the last column. ColData* colData = (ColData*)cols->get(cols->length() - 1); if (colData->size.height + size.height < colHeightMax) { kData->yOffset = colData->size.height; colData->size.height += size.height; colData->size.width = Utils::maximum(colData->size.width,size.width); } // Can't fit this rectangle, start a new column in cols. else { ColData* newData = new ColData; assert(newData); newData->size = size; newData->surf = NULL; cols->add(newData); kData->yOffset = 0; } kData->colNum = cols->length() - 1; existingKData = (KeyData*)hash->put(key,(void*)kData); assert(!existingKData); } LPDIRECTDRAWSURFACE SurfaceSet::lookup(Area& area,void* key) { KeyData* kData = (KeyData*)hash->get(key); if (!kData) { // Not in this SurfaceSet. return NULL; } Area areaRet(Pos(0,kData->yOffset),kData->size); area = areaRet; PtrList* cols = (PtrList*)table.get(kData->tableIndex); ColData* cData = (ColData*)cols->get(kData->colNum); if (cData->surf == NULL) { // Special case where SurfaceManager is calling SurfaceSet::lookup for // its own use, not in response to an external call to // SurfaceManager::lookup(). assert(!addCompleted); // Return anything non-NULL. return (LPDIRECTDRAWSURFACE)0x1; } return cData->surf; } HRESULT SurfaceSet::add_complete(Xvars& xvars,int& pixAllc,int& pixUsed) { // Number of pixels allocated for the surfaces. pixAllc = 0; // Number of pixels actually used in the allocated surfaces. pixUsed = 0; for (int n = 0; n < table.length(); n++) { PtrList* cols = (PtrList*)table.get(n); if (cols == NULL) { continue; } // Create a DirectDraw surface for each column. for (int m = 0; m < cols->length(); m++) { ColData* cData = (ColData*)cols->get(m); assert(cData->size.height > 0 && cData->size.width > 0); cData->surf = xvars.create_surface(cData->size.width,cData->size.height,colorKey); // Fill with red to indicate the wasted pixels for debug drawing. HRESULT result = xvars.color_fill(cData->surf, CRect(0,0,cData->size.width,cData->size.height), xvars.m_red); if (result != DD_OK) { return result; } pixAllc += cData->size.width * cData->size.height; } } // Compute number of pixels actually used. IDictIterator* iter = hash->iterate(); KeyData* kData; void* key; while (kData = (KeyData*)iter->next(key)) { pixUsed += kData->size.width * kData->size.height; } delete iter; addCompleted = True; return DD_OK; } int SurfaceSet::debug_pages_num(const Size& pageSize) { assert(addCompleted); // Pages needed so far. int ret = 0; // width used up on the current page. // Start at pageSize.width so it is as if we have just finished the // -1th page. int widthUsed = pageSize.width; for (int n = 0; n < table.length(); n++) { PtrList* cols = (PtrList*)table.get(n); if (cols == NULL) { continue; } for (int m = 0; m < cols->length(); m++) { ColData* cData = (ColData*)cols->get(m); assert(cData->size.width <= pageSize.width); // Start new page. if (widthUsed + cData->size.width > pageSize.width) { ret++; widthUsed = 0; } // Add column width to current page. widthUsed += cData->size.width; } } return ret; } void SurfaceSet::draw_debug_page(Xvars& xvars,LPDIRECTDRAWSURFACE surf, const Size& pageSize,int pageNum) { assert(addCompleted); // Current page number, count until we get to "pageNum". int pCount = 0; // width used up on the current page. int widthUsed = 0; // Some code duplication from SurfaceSet::debug_pages_num(), uggh. for (int n = 0; n < table.length(); n++) { PtrList* cols = (PtrList*)table.get(n); if (cols == NULL) { continue; } for (int m = 0; m < cols->length(); m++) { ColData* cData = (ColData*)cols->get(m); assert(cData->size.width <= pageSize.width); // Start new page. if (widthUsed + cData->size.width > pageSize.width) { if (pCount == pageNum) { // We're done drawing all the columns on the target page. return; } pCount++; widthUsed = 0; } // We are on the target page, so draw the column. if (pCount == pageNum) { // Draw without colorkey even if the surface has one. xvars.Blt(surf,Pos(widthUsed,0), cData->surf,Pos(0,0),cData->size, False); } // Add column width to current page. widthUsed += cData->size.width; } // for m } // for n } SurfaceManager::SurfaceManager(int hMax) { addCompleted = False; heightMax = hMax; } SurfaceManager::~SurfaceManager() { for (int n = 0; n < sets.length(); n++) { delete (SurfaceSet*)sets.get(n); } } void SurfaceManager::add(void* key,const Size& size,DDCOLORKEY *colorKey) { assert(!addCompleted); // See if request has already been added. // Assert that it was added in exactly the same way to try and detect // key collisions errors by the user of SurfaceManager. int n; for (n = 0; n < sets.length(); n++) { Area area; SurfaceSet* set = (SurfaceSet*)sets.get(n); LPDIRECTDRAWSURFACE surf = set->lookup(area,key); if (surf) { // Special flag to return before surfaces are generated. assert(surf == (LPDIRECTDRAWSURFACE)0x1); if (area.get_size() == size && color_key_equals(set->get_color_key(),colorKey)) { // Key was added before in the exact same way, don't // need to do anything. return; } // Error: Key was added before, but with a different size and/or // color key. assert(0); } } int which = -1; // Add to existing SurfaceSet if we have one with the right color key. for (n = 0; n < sets.length(); n++) { SurfaceSet* set = (SurfaceSet*)sets.get(n); if (color_key_equals(set->get_color_key(),colorKey)) { which = n; break; } } // Create new SurfaceSet with the never-before seen color key. if (which == -1) { SurfaceSet* set = new SurfaceSet(colorKey,heightMax); assert(set); sets.add((void*)set); which = sets.length() - 1; } SurfaceSet* s = (SurfaceSet*)sets.get(which); s->add(key,size); } LPDIRECTDRAWSURFACE SurfaceManager::_lookup(Area& area,const DDCOLORKEY*& colorKey, void* key) { // Do not assert addCompleted, this is the internal version of lookup() that // may be called before add_complete(). for (int n = 0; n < sets.length(); n++) { SurfaceSet* set = (SurfaceSet*)sets.get(n); LPDIRECTDRAWSURFACE ret = set->lookup(area,key); if (ret) { colorKey = set->get_color_key(); return ret; } } assert(0); return NULL; } LPDIRECTDRAWSURFACE SurfaceManager::lookup(Area& area,const DDCOLORKEY*& colorKey,void* key) { assert(addCompleted); return _lookup(area,colorKey,key); } LPDIRECTDRAWSURFACE SurfaceManager::lookup(Pos& pos,void* key) { Area area; const DDCOLORKEY* cKey; LPDIRECTDRAWSURFACE ret = lookup(area,cKey,key); pos = area.get_pos(); return ret; } LPDIRECTDRAWSURFACE SurfaceManager::lookup(Size& size,void* key) { Pos pos; LPDIRECTDRAWSURFACE ret = lookup(pos,key); size.width = pos.x; size.height = pos.y; return ret; } HRESULT SurfaceManager::add_complete(Xvars& xvars) { pixAllc = 0; pixUsed = 0; for (int n = 0; n < sets.length(); n++) { int pAllc, pUsed; SurfaceSet* set = (SurfaceSet*)sets.get(n); HRESULT result = set->add_complete(xvars,pAllc,pUsed); if (result != DD_OK) { return result; } pixAllc += pAllc; pixUsed += pUsed; // Print stats. strstream str; str << "SurfaceSet: used " << pUsed << " out of " << pAllc << " allocated." << ends; DebugInfo::print(str.str()); delete str.str(); } addCompleted = True; // Print stats. strstream str; str << "SurfaceManager: used " << pixUsed << " out of " << pixAllc << " allocated." << ends; DebugInfo::print(str.str()); delete str.str(); return DD_OK; } Boolean SurfaceManager::color_key_equals(const DDCOLORKEY* cKey1,const DDCOLORKEY* cKey2) { if (cKey1 == NULL || cKey2 == NULL) { return (cKey1 == NULL && cKey2 == NULL); } // Safe to dereference both cKey1 and cKey2. if (cKey1->dwColorSpaceLowValue == cKey2->dwColorSpaceLowValue && cKey1->dwColorSpaceHighValue == cKey2->dwColorSpaceHighValue) { return True; } return False; } int SurfaceManager::debug_pages_num(const Size& size) { assert(addCompleted); int ret = 0; for (int s = 0; s < sets.length(); s++) { SurfaceSet* set = (SurfaceSet*)sets.get(s); ret += set->debug_pages_num(size); } return ret; } void SurfaceManager::draw_debug_page(Xvars& xvars,LPDIRECTDRAWSURFACE surf, const Size& size,int pageNum) { // Fill background with green to indicate pixels that do not correspond to // a SurfaceSet. xvars.color_fill(surf,CRect(0,0,size.width,size.height),xvars.m_green); // Not necessarily the most efficient in terms of counting pages multiple // times, but who cares. Worth it for simplicity. for (int s = 0; s < sets.length(); s++) { SurfaceSet* set = (SurfaceSet*)sets.get(s); int pNum = set->debug_pages_num(size); if (pageNum < pNum) { // The page is on this set, draw it. set->draw_debug_page(xvars,surf,size,pageNum); return; } else { // Count pageNum down by the number of pages in this set. pageNum -= pNum; } } } xevil-2.02r2.orig/win32/sound.cpp0100644000175000017500000007517407041422200016105 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "stdafx.h" #include "sound_cmn.h" #include "sound.h" #include "locator.h" #include "physical.h" #define SOUND_TRACK_VOLUME_DEF 0 #define SOUND_EFFECT_VOLUME_DEF 0 #ifdef _GRDEBUG #define DSRESULT(hresult,action) if (hresult!=DS_OK) \ { interpretDSHresult(hresult);\ action;} #else #define DSRESULT(hresult,action) if (hresult!=DS_OK) action; #endif // Only those that can be chosen randomly. unsigned int SoundManager::MIDI_SOUNDTRACK_IDS[MAX_MIDI_SOUNDTRACK]={ SoundNames::FIRE_SOUNDTRACK, SoundNames::HIVE_SOUNDTRACK, SoundNames::KILL_SOUNDTRACK, SoundNames::ZEEPEEG_SOUNDTRACK, SoundNames::NIGHTSKY_SOUNDTRACK, SoundNames::SWEETDARK_SOUNDTRACK, // SoundNames::TERRAEXM_SOUNDTRACK, SoundNames::NEWSONG_SOUNDTRACK, }; class CMCIObject { public: CMCIObject(HWND p_nofity); ~CMCIObject(); BOOL OpenFile(const char* pszFileName); void Close(); void Play(); void Stop(); void setEffectsVolume(DWORD p_vol); DWORD GetPosition(); DWORD GetLength(); // Implementation protected: private: void MCIError(DWORD dwErr); HWND m_HwndNotify; MCI_OPEN_PARMS m_OpenParams; }; BOOL SoundManager::disable( void ) { if (m_lpDS == NULL) { return TRUE; } m_lpDS->Release(); m_lpDS = NULL; return TRUE; } /* DSDisable */ void SoundManager::loadRandomFilenames(const CString &p_directory) { CString t_string=p_directory; t_string+="\\*.mid"; WIN32_FIND_DATA c_file; /* find first .c file in current directory */ HANDLE t_handle; for (int i=0;it_guids; if (DirectSoundEnumerate((int (__stdcall *)(struct _GUID *,char *,char *,void *))&dsEnumCallback,&t_guids)) return FALSE; //WE MIGHT WANT TO ASK THEM WHICH SOUND CARD TO USE if (!t_guids.GetSize()) return FALSE; t_result=DirectSoundCreate(t_guids[0],&m_lpDS,NULL);//for now we use 0 = primary device DSRESULT(t_result,return FALSE); t_result=m_lpDS->SetCooperativeLevel(hwndOwner,DSSCL_EXCLUSIVE); DSRESULT(t_result,return FALSE); /* * get the primary buffer and start it playing * * by playing the primary buffer, DirectSound knows to keep the * mixer active, even though we are not making any noise. */ ZeroMemory( &dsBD, sizeof(DSBUFFERDESC) ); dsBD.dwSize = sizeof(dsBD); dsBD.dwFlags = DSBCAPS_PRIMARYBUFFER; if (SUCCEEDED(t_result=m_lpDS->CreateSoundBuffer(&dsBD, &lpPrimary, NULL))) { t_result=lpPrimary->Play(0, 0, DSBPLAY_LOOPING);//play silence DSRESULT(t_result,;); lpPrimary->Release(); } else { DSRESULT(t_result,return FALSE); } m_init=TRUE; m_windowowner=hwndOwner; m_basicsound=NULL; // m_midiloop=FALSE; Was in xevil20t. hardts return TRUE; } /* InitSound */ BOOL //callback used for enumeration of sound devices. SoundManager::dsEnumCallback(const GUID * lpguid,LPSTR desc,LPSTR Module, LPVOID context)//call back, the context will be a CTypedPtrArrar of GUIDs * { CTypedPtrArray *t_guids=(CTypedPtrArray *)context; assert(t_guids); t_guids->Add((GUID *)lpguid); return TRUE; } /* * DestroySound * * Undoes everything that was done in a InitSound call */ BOOL SoundManager::destroyAllSound( void ) { int idxKill; for( idxKill = m_soundbuffers.GetUpperBound(); idxKill >=0 ; idxKill-- ) removeSoundbyIndex( idxKill ); m_available.RemoveAll(); disable(); //WHY THIS DONT WORK I DONT NO for (int i=0;i=0;i--) { if (m_soundbuffers[i]->getId()==p_resourceid) return removeSoundbyIndex(i); } return FALSE; } /* SoundDestryEffect */ BOOL SoundManager::removeSoundbyIndex(int p_index) { if (!m_init) return FALSE; if ((p_index<0)||(p_index>m_soundbuffers.GetUpperBound())) return FALSE; if (!m_soundbuffers[p_index]) return TRUE; IDirectSoundBuffer *t_buf=NULL; for (int i=0;igetNext())) { t_buf->Stop(); t_buf->Release(); } } m_available.Add(p_index); delete m_soundbuffers[p_index]; m_soundbuffers[p_index]=0; return TRUE; } int SoundManager::addSound( UINT p_resourceid,BOOL p_overridedup) { IDirectSoundBuffer *t_soundbuffer=NULL; if (!m_init) return -1; if (!MAKEINTRESOURCE(p_resourceid)) return -1; int t_index; if (m_available.GetSize()) { t_index=m_available[m_available.GetUpperBound()]; m_available.RemoveAt(m_available.GetUpperBound(),1); } else t_index=m_soundbuffers.GetSize(); SoundBuffer *t_sb=new SoundBuffer(p_resourceid); for (int i=0;isetAt(i,NULL); m_soundbuffers.SetAtGrow(t_index,t_sb); if (!loadSound(t_index,MAKEINTRESOURCE(p_resourceid),p_overridedup)) return -1; return t_index; } /* SoundLoadEffect */ BOOL SoundManager::loadSound(int p_index,LPSTR p_str,BOOL p_overridedup) { if ((p_index<0)||(p_index>m_soundbuffers.GetUpperBound())) { assert(FALSE); return FALSE; } if (p_overridedup) { m_soundbuffers[p_index]->reset(); m_soundbuffers[p_index]->setAt(0,DSLoadSoundBuffer(m_lpDS, p_str)); for (int i=1;isetAt(i,m_soundbuffers[p_index]->getNext()); return (BOOL)m_soundbuffers[p_index]->getNext(); } for (int i=0;isetAt(i,DSLoadSoundBuffer(m_lpDS, p_str)); return (BOOL)m_soundbuffers[p_index]->getNext(); } // Lookup cross-platform sound name. BOOL SoundManager::playSound(SoundName name,int p_pan,int p_volume, BOOL p_soundtrack,BOOL p_overridedup) { UINT soundid = SoundNames::lookup(name); if (soundid) { return playSoundById(soundid,p_pan,p_volume,p_soundtrack,p_overridedup); } return FALSE; } // Lookup cross-platform sound name. void SoundManager::playMidi(SoundName name, BOOL loop, int delay) { if (name == SoundNames::SOUND_RANDOM) { name = MIDI_SOUNDTRACK_IDS[Utils::choose(MAX_MIDI_SOUNDTRACK)]; } UINT soundid = SoundNames::lookup(name); if (soundid) { requestMIDItrack(soundid,loop, delay); } return; } /* * SoundPlayEffect * * Plays the sound effect specified. * Returns TRUE if succeeded. */ BOOL SoundManager::playSoundById( UINT p_resourceid ,int p_pan,int p_volume,BOOL p_soundtrack,BOOL p_overridedup)//p_soundtrack, loops the sound { if ((!m_soundon)||(p_volume<= -10000))//volume of -10000= no sound return FALSE; if (p_soundtrack&&(m_trackvol<= -10000)) return FALSE; if (!p_soundtrack&&(m_effectsvol<= -10000)) return FALSE; if ((!m_init)||(!p_resourceid)) return FALSE; HRESULT dsrval; IDirectSoundBuffer *pdsb = NULL; for (int i=0;igetId()==p_resourceid) { pdsb=m_soundbuffers[i]->getNext(); break; } } if (!pdsb) { int t_index=addSound(p_resourceid,p_overridedup); assert(t_index>=0); pdsb=m_soundbuffers[t_index]->getNext();; } if( !m_lpDS || !pdsb ) { return FALSE; } /* * Rewind the play cursor to the start of the effect, and play */ pdsb->SetCurrentPosition(0); pdsb->SetPan(p_pan); if (p_soundtrack) pdsb->SetVolume(p_volume+m_trackvol); else pdsb->SetVolume(p_volume+m_effectsvol); dsrval = pdsb->Play( 0, 0, p_soundtrack);//p_soundtrack, loops the sound if (dsrval == DSERR_BUFFERLOST) { dsrval = pdsb->Restore(); if (dsrval == DS_OK) { if (DSReloadSoundBuffer(pdsb, MAKEINTRESOURCE(p_resourceid))) { pdsb->SetCurrentPosition( 0); dsrval = pdsb->Play(0, 0, p_soundtrack); //p_soundtrack, loops the sound } else { dsrval = E_FAIL; } } } DSRESULT(dsrval,return FALSE); return (dsrval == DS_OK); } /* playSound */ /* * stopSound * * Stops the sound effect specified. * Returns TRUE if succeeded. */ BOOL SoundManager::stopSound(SoundName p_name) { if (!m_init) { return FALSE; } // Lookup the SoundName to get resource. UINT resourceid = SoundNames::lookup(p_name); if (!resourceid) { return FALSE; } HRESULT dsrval; int t_index; for (int i=0;igetId() == resourceid) { t_index = i; break; } } if (i==m_soundbuffers.GetSize()) {//failed ok just return false return FALSE; } if( !m_lpDS || !m_soundbuffers[t_index] ) { return FALSE; } for (i=0;igetNext()->Stop(); DSRESULT(dsrval,return FALSE); } return TRUE; } /* SoundStopEffect */ #ifdef _GRDEBUG void interpretDSHresult(HRESULT p_result) { CString t_string; switch (p_result) { case DS_OK: t_string="DS_OK" ; case DSERR_ALLOCATED: t_string= "DSERR_ALLOCATED"; case DSERR_CONTROLUNAVAIL: t_string= "DSERR_CONTROLUNAVAIL"; case DSERR_INVALIDPARAM: t_string= "DSERR_INVALIDPARAM"; case DSERR_INVALIDCALL: t_string= "DSERR_INVALIDCALL"; case DSERR_GENERIC: t_string= "DSERR_GENERIC"; case DSERR_PRIOLEVELNEEDED: t_string= "DSERR_PRIOLEVELNEEDED"; case DSERR_OUTOFMEMORY: t_string= "DSERR_OUTOFMEMORY"; case DSERR_BADFORMAT: t_string= "DSERR_BADFORMAT"; case DSERR_UNSUPPORTED: t_string= "DSERR_UNSUPPORTED"; case DSERR_NODRIVER: t_string= "DSERR_NODRIVER"; case DSERR_ALREADYINITIALIZED: t_string= "DSERR_ALREADYINITIALIZED"; case DSERR_NOAGGREGATION: t_string= "DSERR_NOAGGREGATION"; case DSERR_BUFFERLOST: t_string= "DSERR_BUFFERLOST"; case DSERR_OTHERAPPHASPRIO: t_string= "DSERR_OTHERAPPHASPRIO"; case DSERR_UNINITIALIZED: t_string= "DSERR_UNINITIALIZED"; default: t_string="UNKNOWN DSERR"; break; } COUTRESULT(t_string); } #endif //_GRDEBUG BOOL SoundManager::submitRequest(SoundRequest p_req) { //search all viewports for Pos unsigned int soundid = SoundNames::lookup(p_req.get_sound_name()); if (!soundid) { return False; } Pos t_pos = p_req.get_pos(); int t_distance=m_keypositions[0].distance_2(t_pos); for (int i=1;iMAX_CHANNELS_OVERLAY)) return t_event; return m_soundevents[p_index]; } SoundManager::SoundManager(BOOL p_onoff,LocatorP locator) { m_numloopingsounds=0; m_soundon=p_onoff; m_lpGUID=NULL; m_lpDS=NULL; m_init=FALSE; clearRegisteredSounds(); m_numkeypositions=1; m_locator=locator; m_effectsvol=SOUND_EFFECT_VOLUME_DEF; m_trackvol=SOUND_TRACK_VOLUME_DEF; m_cdinitialized=FALSE; m_basicsound=NULL; m_midiinitialized=FALSE; m_mediapresent=FALSE; m_randomdirectory=""; m_nummidifiles=0; m_pausedflag=FALSE; tempfilemanager=NULL; tempmidifilename=NULL; } IDirectSoundBuffer * SoundBuffer::getNext() { BYTE t_index=m_index%MAX_CHANNELS_OVERLAY; m_index++; return m_array[t_index]; } void SoundBuffer::setAt(BYTE p_index,IDirectSoundBuffer *p_buff) { if ((p_index<0)||(p_index>MAX_CHANNELS_OVERLAY)) { assert(FALSE); return; } m_array[p_index]=p_buff; } int SoundManager::getTrackCount() { if (!m_cdinitialized) if (!init_cd(m_windowowner)) return 0; if (!m_mediapresent) if (!media_check()) return 0; return m_nTrackCount; } Boolean SoundManager::media_check() { m_mediapresent=FALSE; m_nTrackCount=0; // // Determine whether there is a CD in the drive. // MCIStatus.dwItem = MCI_STATUS_MEDIA_PRESENT; mciSendCommand (MCIOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_WAIT, (DWORD) (LPVOID) &MCIStatus); if (MCIStatus.dwReturn) { MCIStatus.dwItem = MCI_STATUS_NUMBER_OF_TRACKS; if (mciSendCommand (MCIOpen.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM | MCI_WAIT, (DWORD) (LPVOID) &MCIStatus)) return FALSE; m_nTrackCount = min ((int) MCIStatus.dwReturn, 99); } if (m_nTrackCount>0) m_mediapresent=TRUE; return m_mediapresent; } Boolean SoundManager::init_cd(HWND p_wnd) { MCIOpen.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_CD_AUDIO; if (mciSendCommand (NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD) (LPVOID) &MCIOpen)) if (mciSendCommand (NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE, (DWORD) (LPVOID) &MCIOpen)) { MessageBeep (MB_ICONEXCLAMATION); return FALSE; } MCISet.dwTimeFormat = MCI_FORMAT_TMSF; if (mciSendCommand (MCIOpen.wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD) (LPVOID) &MCISet)) return FALSE; m_cdinitialized=TRUE; return m_cdinitialized; } void SoundManager::requestCDtrack(BYTE p_byTrackNumber,int p_delay) { ::KillTimer(m_windowowner,Ui::SOUNDTRACKTIMER_CD); byTrackNumber=p_byTrackNumber; ::SetTimer(m_windowowner,Ui::SOUNDTRACKTIMER_CD,p_delay*1000,NULL); } int //time in miliseconds SoundManager::playCDtrack () { ::KillTimer(m_windowowner,Ui::SOUNDTRACKTIMER_CD); if (!m_cdinitialized) if (!init_cd(m_windowowner)) return -1; if (!m_mediapresent) if (!media_check()) return -1; if (byTrackNumber<=0) return -1; // // Send an MCI_PLAY command to the CD Audio driver. // MCIPlay.dwCallback = (DWORD) m_windowowner; MCIPlay.dwFrom =MCI_MAKE_TMSF (byTrackNumber, 0, 0, 0); MCIPlay.dwTo= MCI_MAKE_TMSF (byTrackNumber+1, 0, 0, 0); if (MMSYSERR_NOERROR!=mciSendCommand (MCIOpen.wDeviceID, MCI_PLAY, MCI_FROM|MCI_TO, (DWORD) (LPVOID) &MCIPlay)) { m_mediapresent=FALSE; return -1; } MCIStatus.dwItem = MCI_STATUS_LENGTH; MCIStatus.dwTrack = (DWORD) byTrackNumber; if (MMSYSERR_NOERROR!=mciSendCommand (MCIOpen.wDeviceID, MCI_STATUS, MCI_TRACK | MCI_STATUS_ITEM | MCI_WAIT, (DWORD) (LPVOID) &MCIStatus)) { m_mediapresent=FALSE; return -1; } int t_milis=1000*( ((int) MCI_MSF_MINUTE (MCIStatus.dwReturn) * 60) + (int) MCI_MSF_SECOND (MCIStatus.dwReturn)); ::SetTimer(m_windowowner,Ui::SOUNDTRACKTIMER_CD,t_milis,NULL); return t_milis; } void SoundManager::stopCD() { if (!m_cdinitialized) return; ::KillTimer(m_windowowner,Ui::SOUNDTRACKTIMER_CD); // added hardts if (MMSYSERR_NOERROR!=mciSendCommand (MCIOpen.wDeviceID, MCI_STOP, NULL, NULL)) m_mediapresent=FALSE; } Boolean SoundManager::init_midi(HWND p_wnd) { #if 0 //dont need to open the out, the open file will do that! MMRESULT t_result=midiOutOpen(&m_hmidiout,0, (DWORD)p_wnd,NULL, CALLBACK_WINDOW); if (MMSYSERR_NOERROR==t_result) { m_midiinitialized=TRUE; return TRUE; } return FALSE; #endif return TRUE; } void SoundManager::requestRandomMIDItrack(const CString &p_directory,BOOL p_loop,int p_delay) { if (!m_midiinitialized) { assert(FALSE); return; } if (p_directory!= m_randomdirectory) loadRandomFilenames(p_directory); if (!m_nummidifiles) return; int t_choose=Utils::choose(m_nummidifiles); m_midifilename=*m_midifilenames[t_choose]; if (!m_midifilename.GetLength()) { assert(FALSE); return; } m_midiloop=p_loop; playMIDItrack(); } void SoundManager::requestMIDItrack(const CString &p_filename,BOOL p_loop,int p_delay) { stopMIDI(); m_midifilename=p_filename; if (!m_midifilename.GetLength()){ assert(FALSE); return; } m_midiloop=p_loop; playMIDItrack(); } /* whole basis of this function is to play a midi track that is located in our resource file. HACK: we will make a "temporary file" to play the midi track since I am too stupid to find out how to play a midi track from a resource id. they are small and we will clean up when we leave. */ void SoundManager::requestMIDItrack(UINT p_trackresourceid,BOOL p_loop,int p_delay) { if (!p_trackresourceid || !tempfilemanager) return; HRSRC hResInfo; HGLOBAL hResData; void *pvRes; if (!tempmidifilename) tempmidifilename = tempfilemanager->newTempFileName("mid"); LPSTR t_ptr = MAKEINTRESOURCE(p_trackresourceid); //make int into string for find resource hResInfo=FindResource(NULL, t_ptr, "MIDI"); //null module to default to main app if (( hResInfo != NULL) && ((hResData = LoadResource(NULL, hResInfo)) != NULL) && ((pvRes = LockResource(hResData)) != NULL) ) { DWORD t_size = SizeofResource(NULL,hResInfo); try { CFile t_file(tempmidifilename,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); t_file.Write(pvRes, t_size); t_file.Close(); } catch (CFileException *) { assert(0); return; } } else return; CString t_string(tempmidifilename); requestMIDItrack(t_string,p_loop,p_delay); } void SoundManager::playMIDItrack() { if (!m_midifilename.GetLength()) { assert(FALSE); return; } stopMIDI(); playMIDItrack(m_midifilename,m_midiloop); } void SoundManager::playMIDItrack(const CString &p_filename,BOOL p_loop)//plays imediately { if (!m_midiinitialized || !p_filename.GetLength()) if (!init_midi(m_windowowner)) return; try { stopMIDI(); m_basicsound=new CMCIObject(m_windowowner); m_basicsound->OpenFile(CString(p_filename)); m_basicsound->Play(); m_basicsound->setEffectsVolume((m_trackvol/-10000)*0xFFFF); } catch ( CFileException e) { } } void SoundManager::pauseMIDI() { if (m_basicsound) { stopMIDI(); m_pausedflag=TRUE; } } void SoundManager::resumeMIDI() { if (m_pausedflag) { playMIDItrack(); m_pausedflag=FALSE; } } void SoundManager::stopMIDI() { if (m_basicsound){ m_basicsound->Stop(); delete m_basicsound; m_basicsound=NULL; } } //////////////////////////////// /////TECHIE SOUND CRAP /////////////////////////////////////////////////////////////////////////////// // // DSLoadSoundBuffer Loads an IDirectSoundBuffer from a Win32 resource in // the current application. // // Params: // pDS -- Pointer to an IDirectSound that will be used to create // the buffer. // // lpName -- Name of WAV resource to load the data from. Can be a // resource id specified using the MAKEINTRESOURCE macro. // // Returns an IDirectSoundBuffer containing the wave data or NULL on error. // // example: // in the application's resource script (.RC file) // Turtle WAV turtle.wav // // some code in the application: // IDirectSoundBuffer *pDSB = DSLoadSoundBuffer(pDS, "Turtle"); // // if (pDSB) // { // IDirectSoundBuffer_Play(pDSB, 0, 0, DSBPLAY_TOEND); // /* ... */ // /////////////////////////////////////////////////////////////////////////////// IDirectSoundBuffer * SoundManager::DSLoadSoundBuffer(IDirectSound *pDS, LPCTSTR lpName) { IDirectSoundBuffer *pDSB = NULL; DSBUFFERDESC dsBD = {0}; BYTE *pbWaveData; HRESULT t_result; if (DSGetWaveResource(AfxGetInstanceHandle(), lpName, &dsBD.lpwfxFormat, &pbWaveData, &dsBD.dwBufferBytes)) { dsBD.dwSize = sizeof(dsBD); dsBD.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLDEFAULT; if (SUCCEEDED(t_result=pDS->CreateSoundBuffer(&dsBD, &pDSB, NULL))) { if (!DSFillSoundBuffer(pDSB, pbWaveData, dsBD.dwBufferBytes)) { pDSB->Release(); pDSB = NULL; } } else { DSRESULT(t_result,return NULL); } } return pDSB; } /////////////////////////////////////////////////////////////////////////////// // // DSReloadSoundBuffer // /////////////////////////////////////////////////////////////////////////////// BOOL SoundManager::DSReloadSoundBuffer(IDirectSoundBuffer *pDSB, LPCTSTR lpName) { BOOL result=FALSE; BYTE *pbWaveData; DWORD cbWaveSize; HRESULT t_result(NULL); if (DSGetWaveResource(AfxGetInstanceHandle(), lpName, NULL, &pbWaveData, &cbWaveSize)) { if (SUCCEEDED(t_result=pDSB->Restore()) && DSFillSoundBuffer(pDSB, pbWaveData, cbWaveSize)) { result = TRUE; } else { DSRESULT(t_result,return FALSE); } } return TRUE; } /////////////////////////////////////////////////////////////////////////////// // // DSGetWaveResource // /////////////////////////////////////////////////////////////////////////////// BOOL SoundManager::DSGetWaveResource(HMODULE hModule, LPCTSTR lpName, WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData, DWORD *pcbWaveSize) { HRSRC hResInfo; HGLOBAL hResData; void *pvRes; hResInfo=FindResource(hModule, lpName, "WAVE"); if (( hResInfo != NULL) && ((hResData = LoadResource(hModule, hResInfo)) != NULL) && ((pvRes = LockResource(hResData)) != NULL) && DSParseWaveResource(pvRes, ppWaveHeader, ppbWaveData, pcbWaveSize)) { return TRUE; } return FALSE; } BOOL SoundManager::DSFillSoundBuffer(IDirectSoundBuffer *pDSB, BYTE *pbWaveData, DWORD cbWaveSize) { if (pDSB && pbWaveData && cbWaveSize) { LPVOID pMem1, pMem2; DWORD dwSize1, dwSize2; HRESULT t_result; if (SUCCEEDED(t_result=pDSB->Lock( 0, cbWaveSize, &pMem1, &dwSize1, &pMem2, &dwSize2, 0))) { CopyMemory(pMem1, pbWaveData, dwSize1); if ( 0 != dwSize2 ) CopyMemory(pMem2, pbWaveData+dwSize1, dwSize2); pDSB->Unlock( pMem1, dwSize1, pMem2, dwSize2); return TRUE; } else { DSRESULT(t_result,return FALSE); } } return FALSE; } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// BOOL SoundManager::DSParseWaveResource(void *pvRes, WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData,DWORD *pcbWaveSize) { DWORD *pdw; DWORD *pdwEnd; DWORD dwRiff; DWORD dwType; DWORD dwLength; if (ppWaveHeader) *ppWaveHeader = NULL; if (ppbWaveData) *ppbWaveData = NULL; if (pcbWaveSize) *pcbWaveSize = 0; pdw = (DWORD *)pvRes; dwRiff = *pdw++; dwLength = *pdw++; dwType = *pdw++; if (dwRiff != mmioFOURCC('R', 'I', 'F', 'F')) goto exit; // not even RIFF if (dwType != mmioFOURCC('W', 'A', 'V', 'E')) goto exit; // not a WAV pdwEnd = (DWORD *)((BYTE *)pdw + dwLength-4); while (pdw < pdwEnd) { dwType = *pdw++; dwLength = *pdw++; switch (dwType) { case mmioFOURCC('f', 'm', 't', ' '): if (ppWaveHeader && !*ppWaveHeader) { if (dwLength < sizeof(WAVEFORMAT)) goto exit; // not a WAV *ppWaveHeader = (WAVEFORMATEX *)pdw; if ((!ppbWaveData || *ppbWaveData) && (!pcbWaveSize || *pcbWaveSize)) { return TRUE; } } break; case mmioFOURCC('d', 'a', 't', 'a'): if ((ppbWaveData && !*ppbWaveData) || (pcbWaveSize && !*pcbWaveSize)) { if (ppbWaveData) *ppbWaveData = (LPBYTE)pdw; if (pcbWaveSize) *pcbWaveSize = dwLength; if (!ppWaveHeader || *ppWaveHeader) return TRUE; } break; } pdw = (DWORD *)((BYTE *)pdw + ((dwLength+1)&~1)); } exit: return FALSE; } CMCIObject::CMCIObject(HWND p_hwndnotify) { m_OpenParams.dwCallback = 0; m_OpenParams.wDeviceID = 0; m_OpenParams.lpstrDeviceType = NULL; m_OpenParams.lpstrElementName = NULL; m_OpenParams.lpstrAlias = NULL; m_HwndNotify= p_hwndnotify; } CMCIObject::~CMCIObject() { // Make sure the object is not in use. if (m_OpenParams.wDeviceID != 0) { Close(); } ASSERT(m_OpenParams.wDeviceID == 0); } BOOL CMCIObject::OpenFile(const char* pszFileName) { DWORD dwResult; if (m_OpenParams.wDeviceID != 0) { Close(); } ASSERT(m_OpenParams.wDeviceID == 0); m_OpenParams.lpstrDeviceType = NULL; m_OpenParams.lpstrElementName = pszFileName; dwResult = mciSendCommand(0, MCI_OPEN, MCI_WAIT | MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&m_OpenParams); if (dwResult != 0) { COUTRESULT("CMCIObject::OpenFile1"); return FALSE; } // Set the time format to milliseconds. MCI_SET_PARMS set; set.dwTimeFormat = MCI_FORMAT_MILLISECONDS; dwResult = mciSendCommand(m_OpenParams.wDeviceID, MCI_SET, MCI_WAIT | MCI_SET_TIME_FORMAT, (DWORD)(LPVOID)&set); if (dwResult != 0) { COUTRESULT("CMCIObject::OpenFile2"); return FALSE; } return TRUE; } void CMCIObject::Close() { MCI_GENERIC_PARMS gp; DWORD dwResult; if (m_OpenParams.wDeviceID == 0) return; // Already closed Stop(); // Just in case dwResult = mciSendCommand(m_OpenParams.wDeviceID, MCI_CLOSE, MCI_WAIT, (DWORD)(LPVOID)&gp); if (dwResult != 0) { COUTRESULT("CMCIObject::close"); } m_OpenParams.wDeviceID = 0; } void CMCIObject::Play() { MCI_PLAY_PARMS play; DWORD dwResult; memset(&play, 0, sizeof(play)); //initialize play to 0 dwResult = mciSendCommand(m_OpenParams.wDeviceID, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START, 0); if (dwResult != 0) { CString t_string; mciGetErrorString(dwResult,t_string.GetBuffer(100), 100); t_string.ReleaseBuffer(); COUTRESULT("CMCIObject::Play error"); COUTRESULT(t_string.GetBuffer(0)); } play.dwCallback = (DWORD) m_HwndNotify; dwResult = mciSendCommand(m_OpenParams.wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID)&play); if (dwResult != 0) { CString t_string; mciGetErrorString(dwResult,t_string.GetBuffer(100), 100); t_string.ReleaseBuffer(); COUTRESULT("CMCIObject::Play error"); COUTRESULT(t_string.GetBuffer(0)); } } void CMCIObject::Stop() { DWORD dwResult; MCI_GENERIC_PARMS t_genparms; dwResult = mciSendCommand(m_OpenParams.wDeviceID, MCI_STOP, MCI_WAIT, (DWORD)(LPVOID)NULL); if (dwResult != 0) { COUTRESULT("CMCIObject::Stop"); } dwResult = mciSendCommand(m_OpenParams.wDeviceID, MCI_CLOSE, NULL, (DWORD) (LPMCI_GENERIC_PARMS) &t_genparms); if (dwResult != 0) { COUTRESULT("CMCIObject::Stop"); } } DWORD CMCIObject::GetPosition() { MCI_STATUS_PARMS status; status.dwItem = MCI_STATUS_POSITION; if (mciSendCommand(m_OpenParams.wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&status) != 0) { return 0; // Some error } return status.dwReturn; } DWORD CMCIObject::GetLength() { MCI_STATUS_PARMS status; status.dwItem = MCI_STATUS_LENGTH; if (mciSendCommand(m_OpenParams.wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID)&status) != 0) { return 0; // Some error } return status.dwReturn; } void CMCIObject::setEffectsVolume(DWORD p_vol) { // Set the time format to milliseconds. MCI_SET_PARMS set; set.dwAudio=p_vol; mciSendCommand(m_OpenParams.wDeviceID, MCI_SET, MCI_WAIT | MCI_SET_AUDIO_ALL, (DWORD)(LPVOID)&set); } xevil-2.02r2.orig/win32/specialcontrols.cpp0100644000175000017500000001230607041422176020161 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "stdafx.h" #include "specialcontrols.h" /***************************************/ //SpecialEdit IMPLEMENT_DYNAMIC( CSpecialEdit, CEdit) /***************************************/ //CSpecialButton IMPLEMENT_DYNAMIC( CSpecialButton, CButton) BEGIN_MESSAGE_MAP(CSpecialButton, CButton) //{{AFX_MSG_MAP(CPicturePushButton) ON_WM_LBUTTONDOWN( ) ON_WM_LBUTTONUP( ) ON_WM_MOUSEMOVE( ) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CSpecialButton::OnMouseMove( UINT p_uint, CPoint p_point) { } void CSpecialButton::OnLButtonDown( UINT nFlags, CPoint point ) { m_state=TRUE; CButton::OnLButtonDown( nFlags, point ); Invalidate(); SetCapture(); } CSpecialButton::CSpecialButton() { m_state=FALSE; } void CSpecialButton::OnLButtonUp( UINT nFlags, CPoint point ) { CRect t_rect; GetClientRect(t_rect); if (t_rect.PtInRect(point)) { if (m_state) { if (GetCheck()== 0) SetCheck(1); else SetCheck(0); m_state=0; Invalidate(); CButton::OnLButtonUp( nFlags, point ); GetOwner()->PostMessage(WM_COMMAND,GetDlgCtrlID( )); } } ReleaseCapture(); } /********************************************/ //CPicturePushButton //CPicturePushButton //CPicturePushButton //CPicturePushButton BEGIN_MESSAGE_MAP(CPicturePushButton, CSpecialButton) //{{AFX_MSG_MAP(CPicturePushButton) ON_WM_LBUTTONDOWN( ) ON_WM_LBUTTONUP( ) ON_WM_MOUSEMOVE( ) //}}AFX_MSG_MAP END_MESSAGE_MAP() void CPicturePushButton::OnMouseMove( UINT p_uint, CPoint p_point) { CRect t_rect; BOOL t_state; GetClientRect(t_rect); if (p_uint==MK_LBUTTON) { if (!t_rect.PtInRect(p_point)) t_state=0; else t_state=TRUE; if (t_state!=m_state) { m_state=t_state; Invalidate(); } } } void CPicturePushButton::OnLButtonDown( UINT nFlags, CPoint point ) { m_state=TRUE; CButton::OnLButtonDown( nFlags, point ); Invalidate(); SetCapture(); } CPicturePushButton::CPicturePushButton() { m_init=FALSE; } void CPicturePushButton::OnLButtonUp( UINT nFlags, CPoint point ) { if (m_state) { CRect t_rect; m_state=0; GetClientRect(t_rect); if (t_rect.PtInRect(point)) { Invalidate(); CButton::OnLButtonUp( nFlags, point ); GetOwner()->PostMessage(WM_COMMAND,GetDlgCtrlID( )); } } ReleaseCapture(); } void CPicturePushButton::DrawItem(LPDRAWITEMSTRUCT p_struct) { CDC *t_dc=CDC::FromHandle(p_struct->hDC); CBrush *t_oldbrush=(CBrush *)t_dc->SelectStockObject(LTGRAY_BRUSH); CRect t_rect(p_struct->rcItem); t_dc->PatBlt(t_rect.left,t_rect.top,t_rect.Width(),t_rect .Height(),PATCOPY); t_dc->SelectObject(t_oldbrush); CPen *t_oldpen; if (m_state==TRUE) t_oldpen=(CPen *)t_dc->SelectStockObject(BLACK_PEN); else t_oldpen=(CPen *)t_dc->SelectStockObject(WHITE_PEN); t_dc->MoveTo(t_rect.right-1,0); t_dc->LineTo(0,0); t_dc->LineTo(0,t_rect.bottom-1); CPen t_newpen; if (m_state==TRUE) t_newpen.CreateStockObject(WHITE_PEN); else t_newpen.CreatePen(PS_SOLID,1,RGB(96,96,96)); t_dc->SelectObject(&t_newpen); t_dc->MoveTo(t_rect.right-1,0); t_dc->LineTo(t_rect.right-1,t_rect.bottom-1); t_dc->LineTo(0,t_rect.bottom-1); t_dc->SelectObject(t_oldpen);//put it back CString t_string; GetWindowText(t_string.GetBuffer(255),255); t_string.ReleaseBuffer(); t_dc->SelectStockObject(BLACK_PEN); t_dc->SelectStockObject(ANSI_VAR_FONT); t_rect.left+=5; t_dc->SetBkMode(OPAQUE); t_dc->SetBkColor(RGB(192,192,192)); t_dc->DrawText(t_string,t_string.GetLength(),t_rect,DT_LEFT|DT_VCENTER|DT_SINGLELINE); if (!m_init) { if (!m_bitmap.LoadBitmap(m_pictureid)) { TRACE("failed to load bitmap for CPicturePushButton continuing"); } m_init=TRUE; } CDC dcImage; if (!dcImage.CreateCompatibleDC(t_dc)) return; BITMAP bm; m_bitmap.GetBitmap(&bm); // Paint the image. CBitmap* pOldBitmap = dcImage.SelectObject(&m_bitmap); t_dc->BitBlt(2, 2, __min(bm.bmWidth,t_rect.Width()), __min(bm.bmHeight,t_rect.Height()), &dcImage, 0, 0, SRCCOPY); dcImage.SelectObject(pOldBitmap); } xevil-2.02r2.orig/win32/stdafx.cpp0100644000175000017500000000207507041422176016250 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // stdafx.cpp : source file that includes just the standard includes // XEvil.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information #include "stdafx.h" xevil-2.02r2.orig/win32/storydlg.cpp0100644000175000017500000000347507041422176016633 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // StoryDlg.cpp : implementation file // #include "stdafx.h" #include "xevil.h" #include "StoryDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CStoryDlg dialog CStoryDlg::CStoryDlg(CWnd* pParent /*=NULL*/) : CDialog(CStoryDlg::IDD, pParent) { //{{AFX_DATA_INIT(CStoryDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void CStoryDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CStoryDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CStoryDlg, CDialog) //{{AFX_MSG_MAP(CStoryDlg) // NOTE: the ClassWizard will add message map macros here //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CStoryDlg message handlers xevil-2.02r2.orig/win32/timedlg.cpp0100644000175000017500000000373007041422174016401 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // TimeDlg.cpp : implementation file // #include "stdafx.h" #include "XEvil.h" #include "TimeDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // TimeStampFailedDlg dialog TimeStampFailedDlg::TimeStampFailedDlg(CWnd* pParent /*=NULL*/) : CDialog(TimeStampFailedDlg::IDD, pParent) { //{{AFX_DATA_INIT(TimeStampFailedDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void TimeStampFailedDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(TimeStampFailedDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(TimeStampFailedDlg, CDialog) //{{AFX_MSG_MAP(TimeStampFailedDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // TimeStampFailedDlg message handlers void TimeStampFailedDlg::OnCancel() { // TODO: Add extra cleanup here MessageBox("Yeah, right."); CDialog::OnCancel(); } xevil-2.02r2.orig/win32/ui.cpp0100644000175000017500000000736207041422174015376 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "ui.C" // TAG: UI // Also has class Panel. #include "stdafx.h" // Include Files #include "utils.h" #include #include #include "xdata.h" #include "coord.h" #include "world.h" #include "locator.h" #include "id.h" #include "physical.h" #include "ui.h" #include "uiplayer.h" Ui::Ui() { settingsChanges = UInone; } Ui::~Ui() { } int Ui::getWindowList(CTypedPtrList&p_windowlist) { return 0; } int Ui::get_viewports_num() { return 0; } int Ui::get_dpy_max(){ return 0; } UImask Ui::get_settings(UIsettings &s) { s = settings; UImask tmp = settingsChanges; settingsChanges = UInone; return tmp; } void Ui::set_humans_num(int val) { settings.humansNum=val; } void Ui::set_enemies_num(int val) { settings.enemiesNum = val; } void Ui::set_enemies_refill(BOOL val) { settings.enemiesRefill = val; } void Ui::set_sound_onoff(BOOL val) { settings.sound=val; } void Ui::set_sound_volume(int val) { settings.soundvol=val; } void Ui::set_track_volume(int val) { settings.trackvol=val; } void Ui::set_world_rooms(const Rooms &r) { settings.worldRooms=r; } void Ui::set_style(GameStyleType style) { settings.style = style; } void Ui::set_quanta(Quanta quanta) { settings.quanta = quanta; } void Ui::set_humans_playing(int val) { } void Ui::set_cooperative(Boolean p_bool) { settings.cooperative=p_bool; } void Ui::set_musictype(UIsettings::SOUNDTRACKTYPE val) { settings.musictype=val; } void Ui::set_pause(BOOL val) { } void Ui::set_enemies_playing(int){} void Ui::set_level(const char *){} void Ui::set_screen_mode(Xvars::SCREENMODE p_mode){} Boolean Ui::other_input(){return FALSE;} void Ui::set_input(int vNum,UIinput input){} void Ui::set_keyset(int dpyNum,UIkeyset keyset){} void Ui::set_keyset(int dpyNum,UIkeyset basis, char right[UI_KEYS_MAX][2], char left[UI_KEYS_MAX][2]){} void Ui::set_prompt_difficulty(){} // This needs to be fixed. int Ui::get_difficulty(){return 0;} void Ui::set_difficulty(int){} int Ui::add_viewport(){return 0;} void Ui::del_viewport(){} void Ui::register_intel(int n, IntelP intel){} void Ui::unregister_intel(int n){} IntelP Ui::get_intel(int n){return NULL;} void Ui::demo_reset(){} void Ui::reset(){} void Ui::reset_graphics(Xvars::SCREENMODE p_newmode){} void Ui::set_redraw_arena(){} Boolean Ui::process_event(int dpyNum,CMN_EVENTDATA eventdata){return FALSE;} void Ui::set_role_type(RoleType){} IViewportInfo* Ui::get_viewport_info() { return UiPlayer::get_viewport_info(); } void Ui::check_num_lock() { // Ask user to turn on num lock. SHORT val = GetKeyState(VK_NUMLOCK); if (!(LOBYTE(val) & 0x1)) { AfxMessageBox("Turn on \"Num Lock\" if you want to use the numeric keypad."); } } void Ui::set_reduce_draw(Boolean val) { Xvars::set_reduce_draw(val); } Boolean Ui::initGraphics = TRUE; xevil-2.02r2.orig/win32/uiplayer.cpp0100644000175000017500000022710107041422174016606 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "uiplayer.cpp" #include "stdafx.h" #include "utils.h" #include #include #include #include #include "xdata.h" #include "coord.h" #include "world.h" #include "locator.h" #include "id.h" #include "physical.h" #include "ui.h" #include "uiplayer.h" #include "sound.h" #include "role.h" #include "resource.h"//windows resources #include "xviewport.h"//viewport class declaration #include "wheel.h" #include "fsstatus.h"//fsstatus class declaration #include "aboutdialog.h" #include "optionsdlg.h" #include "keysets.h" #include "difficulty.h" #include "runserverdlg.h" #include "connectdlg.h" #include "StoryDlg.h" #include "s_man.h" //for bitmap loading and writing #include #include "l_agreement.h" #define mciNotifySuccessful 1 // Defines // Shifting a viewport when no Intel is associated with it. In pixels. #define SHIFT_NO_INTEL (5 * WSQUARE_WIDTH) #define ARENA_FONT_NAME "Arial" // Make it customizable someday. #define ARENA_FONT_POINT_SIZE 18 #define FONT_3D_OFFSET 4 #define MESSAGE_TIME 13 #define STATUS_WINDOW_INDENT 20 #define SCREENDIMX_FULLSCREEN 800 #define SCREENDIMY_FULLSCREEN 600 #define SCREENDIMX_WINDOWED SCREENDIMX_FULLSCREEN #define SCREENDIMY_WINDOWED SCREENDIMY_FULLSCREEN // window coords, size of the viewport #define VIEW_SIZE_WIDTH 800 #define VIEW_SIZE_HEIGHT 512 #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) // Arena message will be displayed this distance above // the center of the screen. This is so the text is not // right on top of the player. #define ARENA_MESSAGE_OFF_CENTER 25 // 40 ViewportInfo VInfoProvider::get_info() { // HACK, should use Xvars.unstretch*() instead of bit shift to divide by 2. Size visible; visible.set((VIEW_SIZE_WIDTH) >> 1, (VIEW_SIZE_HEIGHT) >> 1); // Smooth-scrolling ViewportInfo. ViewportInfo ret(IT_VISION_RANGE,visible); return ret; } int UiPlayer::getWindowList(CTypedPtrList&p_windowlist) { p_windowlist.RemoveAll(); for (int i=0;iget_room_dim(); deactivated = FALSE; intelsSet[0] = FALSE; m_numenemiesplaying=0; inputsSet[0] = FALSE; m_gameversion = gameVersion; viewSize.width = VIEW_SIZE_WIDTH; viewSize.height = VIEW_SIZE_HEIGHT; // Means don't display a debugging page for the SurfaceManager. m_surfMgrPage = -1; m_chatOn = False; // No errors. m_recoveryState = RS_OK; // Moved -bmptransfer parsing to Game::parse_args(), changed it to // -bmp_match_colormap settingsChanges = UInone; otherInput = FALSE; // init_x(); this is now done in add_viewport(0) // UiPlayer::world must be valid. viewportsNum = 0; neverReset = TRUE; Timer nTimer(MESSAGE_TIME); messageTimer = nTimer; redrawAll[0] = DRAW_ALL; arenaMessage[0] = NULL; m_pabout=NULL; m_pkeys=NULL; m_poptions=NULL; m_pdifficulty=NULL; m_pconnect=NULL; m_prunserver=NULL; m_pstory=NULL; // Read in user-specified key controls. CWinApp* pApp = AfxGetApp(); keycodes[0][IT_CENTER]=(char)pApp->GetProfileInt("Player1","Center",101); keycodes[0][IT_R]=(char)pApp->GetProfileInt("Player1","Right",102); keycodes[0][IT_DN_R]=(char)pApp->GetProfileInt("Player1","DownRight",99); keycodes[0][IT_DN]=(char)pApp->GetProfileInt("Player1","Down",98); keycodes[0][IT_DN_L]=(char)pApp->GetProfileInt("Player1","DownLeft",97); keycodes[0][IT_L]=(char)pApp->GetProfileInt("Player1","Left",100); keycodes[0][IT_UP_L]=(char)pApp->GetProfileInt("Player1","UpLeft",103); keycodes[0][IT_UP]=(char)pApp->GetProfileInt("Player1","Up",104); keycodes[0][IT_UP_R]=(char)pApp->GetProfileInt("Player1","UpRight",105); keycodes[0][IT_WEAPON_CHANGE]=(char)pApp->GetProfileInt("Player1","WeaponChange",36); keycodes[0][IT_WEAPON_DROP]=(char)pApp->GetProfileInt("Player1","WeaponDrop",33); keycodes[0][IT_ITEM_USE]=(char)pApp->GetProfileInt("Player1","ItemUse",46); keycodes[0][IT_ITEM_CHANGE]=(char)pApp->GetProfileInt("Player1","ItemChange",35); keycodes[0][IT_ITEM_DROP]=(char)pApp->GetProfileInt("Player1","ItemDrop",34); keycodes[0][IT_WEAPON_CENTER]=(char)pApp->GetProfileInt("Player1","WeaponFire",45); keycodes[0][IT_CHAT]=(char)pApp->GetProfileInt("Player1","Chat",VK_SPACE); keycodes[1][IT_CENTER]=(char)pApp->GetProfileInt("Player2","Center",'L'); keycodes[1][IT_R]=(char)pApp->GetProfileInt("Player2","Right",186); keycodes[1][IT_DN_R]=(char)pApp->GetProfileInt("Player2","DownRight",191); keycodes[1][IT_DN]=(char)pApp->GetProfileInt("Player2","Down",190); keycodes[1][IT_DN_L]=(char)pApp->GetProfileInt("Player2","DownLeft",188); keycodes[1][IT_L]=(char)pApp->GetProfileInt("Player2","Left",'K'); keycodes[1][IT_UP_L]=(char)pApp->GetProfileInt("Player2","UpLeft",'I'); keycodes[1][IT_UP]=(char)pApp->GetProfileInt("Player2","Up",'O'); keycodes[1][IT_UP_R]=(char)pApp->GetProfileInt("Player2","UpRight",'P'); keycodes[1][IT_WEAPON_CHANGE]=(char)pApp->GetProfileInt("Player2","WeaponChange",'S'); keycodes[1][IT_WEAPON_DROP]=(char)pApp->GetProfileInt("Player2","WeaponDrop",'D'); keycodes[1][IT_ITEM_USE]=(char)pApp->GetProfileInt("Player2","ItemUse",'Z'); keycodes[1][IT_ITEM_CHANGE]=(char)pApp->GetProfileInt("Player2","ItemChange",'X'); keycodes[1][IT_ITEM_DROP]=(char)pApp->GetProfileInt("Player2","ItemDrop",'C'); keycodes[1][IT_WEAPON_CENTER]=(char)pApp->GetProfileInt("Player2","WeaponFire",'A'); keycodes[1][IT_CHAT]=(char)pApp->GetProfileInt("Player2","Chat",VK_SPACE); // Not used. keyStyle = UI_NINE_KEY; xvars.valid = 0; difficulty = DIFF_NONE; m_roletype = R_NONE; m_numhumansplaying = 0; m_numenemiesplaying = 0; check_num_lock(); add_viewport(); // Tool for generating XPM images for the UNIX build. if (genXPMDir) { generate_xpm(); } CString t_pathstring; if (GetTempPath(MAX_PATH,t_pathstring.GetBuffer(MAX_PATH))){ t_pathstring.ReleaseBuffer(); tempfilemanager.attachDirectory(t_pathstring); tempfilemanager.cleanup(); } t_pathstring.ReleaseBuffer(); if (soundmanager){ soundmanager->setTempFileManager(&tempfilemanager); } } int UiPlayer::get_dpy_max() { return 1; } UiPlayer::~UiPlayer() { int i; xvars.m_lpDD->SetCooperativeLevel(*m_windowarray[0],DDSCL_NORMAL); // Should use del_viewport() instead of doing directly. if (xvars.screenmode==Xvars::FULL_SCREEN_MODE) { delete m_windowarray[0]; } else { for(i=0;istopMIDI(); } void UiPlayer::reset_graphics(Xvars::SCREENMODE p_newmode){ COUTRESULT("entering reset_graphics"); //stop midi sound before destroying windows! soundmanager->pauseMIDI(); // We could destroy xvars and create a new one. // Make the lifetime of Xvars correspond to graphics being // initialized and destroyed. delete xvars.m_surfaceManager; xvars.m_surfaceManager = NULL; // Free up all the existing graphics. if (xvars.m_lpDD) { xvars.m_lpDD->Release(); } // Should use del_viewport() instead of doing directly. for(int i = 0;i < m_windowarray.GetSize();i++) { delete m_windowarray[i]; } for(i = 0;i < m_windowstatsarray.GetSize();i++) { if (m_windowstatsarray[i]) { delete m_windowstatsarray[i]; } } int t_viewportsNum = viewportsNum; BOOL* t_intelsSet = NULL; if (t_viewportsNum) { t_intelsSet = new BOOL[t_viewportsNum]; for (int i = 0;i < t_viewportsNum;i++) { t_intelsSet[i] = intelsSet[i]; } } viewportsNum = 0; set_screen_mode(p_newmode); KeyDispatcher* kDis = (KeyDispatcher*)keyDispatchers.get(viewportsNum); delete kDis; keyDispatchers.del(viewportsNum); // Has side-effect of calling init_x(). add_viewport(); // Ick, force menus to reinitialize themselves for the current role type. RoleType roleType = m_roletype; // Sent to R_NONE, or set_role_type will do nothing. m_roletype = R_NONE; set_role_type(roleType); for (int vn = 0; vn < t_viewportsNum; vn++) { assert(vn <= get_viewports_num()); if (vn == get_viewports_num()) { int vNum = add_viewport(); assert(vn == vNum); } intelsSet[vn] = t_intelsSet[vn]; update_statuses(vn,TRUE); } set_input(0,UI_KEYS_RIGHT); if (viewportsNum > 1) { set_input(1,UI_KEYS_LEFT); } if (t_intelsSet) { delete t_intelsSet; } } int UiPlayer::add_viewport() { if (viewportsNum==0) { // Hack, should really be in init_x, but need to call Xvars::stretch* functions. xvars.m_stretch = 2; } KeyDispatcher* kDis = new KeyDispatcher(); assert(kDis); assert(keyDispatchers.length() == viewportsNum); keyDispatchers.add(kDis); assert(viewportsNum < UI_VIEWPORTS_MAX); inputsSet[viewportsNum] = FALSE; Pos tPos(0,0); Size t_size; t_size.width = viewSize.width; t_size.height = viewSize.height; Area tArea(AR_RECT,tPos,t_size); if (xvars.screenmode==Xvars::FULL_SCREEN_MODE) { switch(viewportsNum) { case 0: { } break; case 1: { // Fix when we redo 2 viewport mode assert(0); #if 0 Size t_tempsize=viewdrawAreas[0].get_size(); t_tempsize.width/=2; viewdrawAreas[1]=viewdrawAreas[0]; viewdrawAreas[1].set_size(t_tempsize); viewdrawAreas[0]=Area(AR_RECT,Pos(viewsize.width/2,0),t_tempsize); t_size.width/=2; drawAreas[0]=Area(AR_RECT,Pos(0,0),t_size); drawAreas[1]=Area(AR_RECT,Pos(0,0),t_size); Pos t_middle=viewportAreas[0].get_middle(); viewportAreas[0].set_size(xvars.unStretchSize(t_size)); viewport_to_pos(0,t_middle); tArea.set_size(t_size); #endif } break; default: assert(0); return viewportsNum; break; } } // Windowed mode else { } //now in world coordinates viewportAreas[viewportsNum] = xvars.un_stretch_area(tArea); redrawAll[viewportsNum] = DRAW_ALL; //MAIN GAME VIEWPORT CXEvilWnd *t_wnd; CRect t_windowsizerect; if (xvars.screenmode==Xvars::WINDOW_SCREEN_MODE) { t_windowsizerect.SetRect(0,0,SCREENDIMX_WINDOWED,SCREENDIMY_WINDOWED); t_wnd=new CXEvilWnd; t_wnd->Create(t_windowsizerect,NULL/*parent*/,viewportsNum,FALSE); } // full screen else { if (viewportsNum==1) t_wnd=m_windowarray[0]; else { // Why aren't these SCREENDIMX_FULLSCREEN,SCREENDIMY_FULLSCREEN t_windowsizerect.SetRect(0,0,SCREENDIMX_WINDOWED,SCREENDIMY_WINDOWED); t_wnd=new CXEvilWnd; t_wnd->Create(t_windowsizerect,NULL/*parent*/,viewportsNum,TRUE); } } // Remove the debug menu if we are not debugging. // And remove the full-screen/window mode button // Perhaps this should be in XEvilViewport if (viewportsNum == 0) { CMenu* t_menu = t_wnd->GetMenu(); assert(t_menu); if (!DebugInfo::on()) { t_menu->RemoveMenu(4,MF_BYPOSITION); if (xvars.screenmode==Xvars::WINDOW_SCREEN_MODE) { t_menu->RemoveMenu(ID_FULLSCREEN,MF_BYCOMMAND); } else { t_menu->RemoveMenu(ID_WINDOWSCREEN,MF_BYCOMMAND); } } } //t_windowsizerect will be increased by create to attach necessary room for controls t_wnd->setActivated(CXEvilWnd::WMNONE); m_windowarray.SetAtGrow(viewportsNum,t_wnd); // Call init_x(). if (viewportsNum==0) { init_x(t_wnd->GetSafeHwnd()); t_wnd->setActivated(CXEvilWnd::WMNONE); } StatusWnd *t_statswnd = NULL; if (xvars.screenmode==Xvars::WINDOW_SCREEN_MODE) { //moving window to center it! assert(t_wnd->m_hWnd); CRect t_clientarea;//this is the important part. t_wnd->GetClientRect(t_clientarea); int t_dx = t_windowsizerect.Width() - t_clientarea.Width(); int t_dy = t_windowsizerect.Height() - t_clientarea.Height(); t_windowsizerect.OffsetRect(t_dx,t_dy);//increase size because of border and menu SetWindowPos(NULL,0,0,t_windowsizerect.Width(),t_windowsizerect.Height(), SWP_NOZORDER,SWP_NOMOVE|SWP_NOREDRAW); t_wnd->ShowWindow(SW_SHOWNORMAL); //must find the center of the screen to offset the play area CDC *t_dc=t_wnd->GetDC(); CPoint t_position; t_position.x = (int)t_dc->GetDeviceCaps(HORZRES)/2; t_position.y = (int)t_dc->GetDeviceCaps(VERTRES)/3; t_wnd->ReleaseDC(t_dc); t_windowsizerect.OffsetRect(t_position.x-(t_windowsizerect.Width()/2), t_position.y-(t_windowsizerect.Height()/2) ); if (t_windowsizerect.top<0) t_windowsizerect.OffsetRect(0,-1 * t_windowsizerect.top); if (t_windowsizerect.left<0) t_windowsizerect.OffsetRect(-1 * t_windowsizerect.left,0); t_wnd->SetWindowPos(NULL,t_windowsizerect.left,t_windowsizerect.top,0,0, SWP_NOZORDER|SWP_NOSIZE); // Putting FSStatusWnd in the windowed mode. t_wnd->GetClientRect(t_clientarea); t_statswnd = new StatusWnd(locator,&xvars); assert(t_statswnd); // In client coordinates CRect t_statusrect(0,viewSize.height, t_clientarea.right,t_clientarea.bottom); if (!t_statswnd->Create(t_statusrect)) { COUTRESULT("failed to create status window!"); } } else //FULL SCREEN { CRect t_clientarea; t_wnd->GetClientRect(t_clientarea); // In client coordinates. CRect t_statusrect; t_statusrect.left = 0; t_statusrect.top = viewSize.height; t_statusrect.right = t_clientarea.right; t_statusrect.bottom = t_clientarea.bottom; t_statswnd = new StatusWnd(locator,&xvars); assert(t_statswnd); if (viewportsNum==1) { // Fix me ASSERT(0); t_clientarea.left=t_clientarea.right/2; t_clientarea.right=SCREENDIMX_FULLSCREEN; if (m_windowstatsarray[0]) m_windowstatsarray[0]->setRects(t_statusrect); t_clientarea.right=t_clientarea.left; t_clientarea.left=0; } if (t_statswnd) { if (!t_statswnd->Create(t_statusrect)) { COUTRESULT("failed to create status window!"); } } COUTRESULT("left init_x, in add_viewport after creating statuswnd check backbuffer"); } m_windowstatsarray.SetAtGrow(viewportsNum,t_statswnd); update_statuses(viewportsNum,TRUE); // // now create a DirectDrawClipper object. // //used to be only for windowed, not anymore?.. // // We should try taking away the clipper for FS mode. // Was only there to protect from crashing on Win95 if // we drew outside the window. // if (xvars.screenmode==Xvars::WINDOW_SCREEN_MODE) { HRESULT t_result; m_clipperarray.SetAtGrow(viewportsNum,NULL); t_result = xvars.m_lpDD->CreateClipper(0, &m_clipperarray[viewportsNum], NULL); if( t_result != DD_OK ) { AfxMessageBox("Cant create clipper"); return FALSE; } t_result = m_clipperarray[viewportsNum]->SetHWnd(0, t_wnd->GetSafeHwnd()); if( t_result != DD_OK ) { AfxMessageBox("Cant set clipper window handle"); return FALSE; } } //activate proper window t_wnd->SetActiveWindow(); Utils::freeif(arenaMessage[viewportsNum]); //needs to be incremented first to allow ::clock to draw the screen for init_x_all viewportsNum++; // Call at the end because it needs to be able to call UiPlayer::clock to draw. // Disable with the -no_init_graphics command line. // // Only init_x_all() for the first viewport, viewportNum has already been incremented. if (viewportsNum == 1) { if (initGraphics) { init_x_all(); } } return viewportsNum - 1; } void UiPlayer::set_screen_mode(Xvars::SCREENMODE p_mode) { xvars.screenmode=p_mode; } void UiPlayer::del_viewport() { viewportsNum--; KeyDispatcher* kDis = (KeyDispatcher*)keyDispatchers.get(viewportsNum); delete kDis; keyDispatchers.del(viewportsNum); if (xvars.screenmode==Xvars::WINDOW_SCREEN_MODE) { m_windowarray[viewportsNum]->DestroyWindow(); if (m_windowstatsarray[viewportsNum]) m_windowstatsarray[viewportsNum]->DestroyWindow(); } else { // Not fixed up for two-viewport mode. assert(False); #if 0 if (viewportsNum!=1) { assert(FALSE); return; } Area t_viewarea(AR_RECT,Pos(0,0),viewsize); viewdrawAreas[0]=t_viewarea; drawAreas[0]=Area(AR_RECT,Pos(0,0),drawsize); CRect t_clientarea(0,0,0,0); // m_windowarray[0]->GetClientRect(t_clientarea); m_windowarray[0]->ClientToScreen(t_clientarea); t_clientarea.bottom=SCREENDIMY_FULLSCREEN; t_clientarea.right=SCREENDIMX_FULLSCREEN; t_clientarea.left=0; t_clientarea.top+=viewsize.height; CRect t_statusrect; t_statusrect.top=0; t_statusrect.bottom=drawsize.height; t_statusrect.right=drawsize.width; t_statusrect.left=100; if (m_windowstatsarray[0]) m_windowstatsarray[0]->setRects(t_statusrect); // viewportAreas[0]=Area(AR_RECT,Pos(0,0),drawsize); viewportAreas[0].set_size(xvars.unStretchSize(viewsize)); Pos t_middle=viewportAreas[0].get_middle(); viewport_to_pos(0,t_middle); #endif } } void UiPlayer::set_humans_playing(int val) { for (int i=0;iupdateHumansNum(val); m_numhumansplaying=val; } } } void UiPlayer::set_enemies_playing(int val) { for (int i = 0;i < viewportsNum;i++) { StatusWnd *t_wnd = m_windowstatsarray[i]; if (t_wnd) { assert(t_wnd); t_wnd->updateEnemiesNum(val); m_numenemiesplaying=val; } } } void UiPlayer::set_level(const char* val) { for (int i = 0;i < viewportsNum;i++) { StatusWnd *t_wnd = m_windowstatsarray[i]; if (t_wnd) { assert(t_wnd); t_wnd->updateLevel(val); m_level = val; } } } Boolean UiPlayer::other_input() { return otherInput; } void UiPlayer::set_input(int n,UIinput input) { assert(n >= 0 && n < viewportsNum); inputs[n] = input; inputsSet[n] = TRUE; } void UiPlayer::set_difficulty(int d) { difficulty = d; } void UiPlayer::set_role_type(RoleType roleType) { if (roleType == m_roletype) { // Nothing to do. return; } assert(roleType != R_NONE); m_roletype = roleType; // Update the menus for client and server. for (int n = 0; n < m_windowarray.GetSize(); n++) { if (!m_windowarray[n] || !m_windowarray[n]->GetMenu()) { continue; } CMenu *t_menu = m_windowarray[n]->GetMenu(); assert(t_menu); // Change the "Network" item to "Network", "Client", or "Server". const char* menuTitle; switch (roleType) { case R_STAND_ALONE: menuTitle = "Network"; break; case R_CLIENT: menuTitle = "Client"; break; case R_SERVER: menuTitle = "Server"; break; default: assert(0); } t_menu->ModifyMenu(2,MF_BYPOSITION | MF_STRING,0,menuTitle); // Enable/Disable difficulty menu. if (Role::uses_difficulty(roleType)) { t_menu->EnableMenuItem(ID_DIFFICULTY,MF_BYCOMMAND|MF_ENABLED); } else { t_menu->EnableMenuItem(ID_DIFFICULTY,MF_BYCOMMAND|MF_GRAYED); } // CONNECTSERVER / DISCONNECTSERVER Boolean connServerExists = (t_menu->GetMenuState(ID_CONNECTSERVER,MF_BYCOMMAND) != -1); if (roleType == R_STAND_ALONE || roleType == R_SERVER) { // Change ID_DISCONNECTSERVER to ID_CONNECTSERVER if (!connServerExists) { t_menu->ModifyMenu(ID_DISCONNECTSERVER,MF_BYCOMMAND|MF_STRING, ID_CONNECTSERVER,"&Connect to Server"); } if (roleType == R_SERVER) { t_menu->EnableMenuItem(ID_CONNECTSERVER,MF_BYCOMMAND|MF_GRAYED); } else { t_menu->EnableMenuItem(ID_CONNECTSERVER,MF_BYCOMMAND|MF_ENABLED); } } else { assert(roleType == R_CLIENT); // Change ID_CONNECTSERVER to ID_DISCONNECTSERVER if (connServerExists) { t_menu->ModifyMenu(ID_CONNECTSERVER,MF_BYCOMMAND|MF_STRING, ID_DISCONNECTSERVER,"&Disconnect Server"); } t_menu->EnableMenuItem(ID_DISCONNECTSERVER,MF_BYCOMMAND|MF_ENABLED); } // RUNSERVER / STOPSERVER Boolean runServerExists = (t_menu->GetMenuState(ID_RUNSERVER,MF_BYCOMMAND) != -1); if (roleType == R_STAND_ALONE || roleType == R_CLIENT) { // Change ID_STOPSERVER to ID_RUNSERVER if (!runServerExists) { t_menu->ModifyMenu(ID_STOPSERVER,MF_BYCOMMAND|MF_STRING, ID_RUNSERVER,"&Run as Server"); } if (roleType == R_CLIENT) { t_menu->EnableMenuItem(ID_RUNSERVER,MF_BYCOMMAND|MF_GRAYED); } else { t_menu->EnableMenuItem(ID_RUNSERVER,MF_BYCOMMAND|MF_ENABLED); } } else { assert(roleType == R_SERVER); // Change ID_RUNSERVER to ID_STOPSERVER if (runServerExists) { t_menu->ModifyMenu(ID_RUNSERVER,MF_BYCOMMAND|MF_STRING, ID_STOPSERVER,"&Stop Server"); } t_menu->EnableMenuItem(ID_STOPSERVER,MF_BYCOMMAND|MF_ENABLED); } // This might not be the best way to force menu to redraw. m_windowarray[n]->SetMenu(t_menu); } } void UiPlayer::register_intel(int n, IntelP intel) { assert(n >= 0 && n < viewportsNum); intelsSet[n] = TRUE; intels[n] = intel; } void UiPlayer::unregister_intel(int n) { assert((n >= 0) && (n < UI_VIEWPORTS_MAX)); intelsSet[n] = FALSE; } IntelP UiPlayer::get_intel(int n) { assert((n >= 0) && (n < UI_VIEWPORTS_MAX)); return intels[n]; } void UiPlayer::demo_reset() { for (int n = 0; n < viewportsNum; n++) { intelsSet[n] = FALSE; redrawAll[n] = DRAW_ALL; Utils::freeif(arenaMessage[n]); // Actual message being displayed. Pos tPos(0,0); viewportAreas[n].set_pos(tPos); update_statuses(n,TRUE); } // In case the user was in the middle of sending a message. m_chatOn = False; } void UiPlayer::reset() { demo_reset(); neverReset = FALSE; } void UiPlayer::set_redraw_arena() { for (int n = 0; n < viewportsNum; n++) { redrawAll[n] = DRAW_ALL; } } CWnd * UiPlayer::findModalessWindow(HWND p_hwnd) { if (m_pabout && m_pabout->m_hWnd == p_hwnd) return m_pabout; if (m_pkeys && m_pkeys->m_hWnd == p_hwnd) return m_pkeys; if (m_poptions && m_poptions->m_hWnd == p_hwnd) return m_poptions; if (m_pdifficulty && m_pdifficulty->m_hWnd == p_hwnd) return m_pdifficulty; if (m_pconnect && m_pconnect->m_hWnd == p_hwnd) return m_pconnect; if (m_prunserver && m_prunserver->m_hWnd == p_hwnd) return m_prunserver; return NULL; } void UiPlayer::deleteModalessWnd(CWnd *t_wnd) { if (m_pabout && m_pabout->m_hWnd == t_wnd->m_hWnd) { delete m_pabout; m_pabout=NULL; } if (m_pkeys && m_pkeys->m_hWnd == t_wnd->m_hWnd) { delete m_pkeys; m_pkeys=NULL; } if (m_poptions && m_poptions->m_hWnd == t_wnd->m_hWnd) { delete m_poptions; m_poptions=NULL; } if (m_pdifficulty && m_pdifficulty->m_hWnd == t_wnd->m_hWnd) { delete m_pdifficulty; m_pdifficulty=NULL; } if (m_pconnect && m_pconnect->m_hWnd == t_wnd->m_hWnd) { delete m_pconnect; m_pconnect=NULL; } if (m_prunserver && m_prunserver->m_hWnd == t_wnd->m_hWnd) { delete m_prunserver; m_prunserver=NULL; } } // break in event handling. False == stop checking Boolean UiPlayer::process_event(int,CMN_EVENTDATA eventdata) { int vNum = get_viewport_num(eventdata.m_parent); CWnd *t_paintwnd; CPaintDC *t_dc; CRect t_updaterect; Boolean t_returnvalue=TRUE; CWnd *t_wnd; t_wnd= findModalessWindow(eventdata.m_parent); if (t_wnd) { switch(eventdata.m_event.message) { case WM_DESTROY: case WM_CLOSE: deleteModalessWnd(t_wnd); m_windowarray[0]->SetFocus(); break; case WM_KEYDOWN:case WM_KEYUP: case 0x118: ::SendMessage(eventdata.m_event.hwnd,eventdata.m_event.message,eventdata.m_event.wParam,eventdata.m_event.lParam); break; case WM_COMMAND: switch (LOWORD(eventdata.m_event.wParam)) { case IDOK: if (m_pkeys && t_wnd->m_hWnd==m_pkeys->m_hWnd) retrieveKeys(); if (m_poptions && t_wnd->m_hWnd==m_poptions->m_hWnd) retrieveOptions(); if (m_pdifficulty && t_wnd->m_hWnd==m_pdifficulty->m_hWnd) retrieveDifficulty(); if (m_pconnect && t_wnd->m_hWnd==m_pconnect->m_hWnd) retrieveConnect(); if (m_prunserver && t_wnd->m_hWnd==m_prunserver->m_hWnd) retrieveRunServer(); case IDCANCEL: m_windowarray[0]->SetFocus(); deleteModalessWnd(t_wnd); break; } break; default: if (eventdata.m_parent==t_wnd->m_hWnd) ::SendMessage(eventdata.m_event.hwnd,eventdata.m_event.message,eventdata.m_event.wParam,eventdata.m_event.lParam); else // ::SendMessage(eventdata.m_event.hwnd,eventdata.m_event.message,eventdata.m_event.wParam,eventdata.m_event.lParam); ::DefWindowProc(eventdata.m_event.hwnd, eventdata.m_event.message, eventdata.m_event.wParam, eventdata.m_event.lParam); } return TRUE; } if (-1 != vNum) //check main window { switch(eventdata.m_event.message) { case WM_TIMER: if (eventdata.m_event.wParam==Ui::SOUNDTRACKTIMER_CD) soundmanager->playCDtrack(); if (eventdata.m_event.wParam==Ui::SOUNDTRACKTIMER_MIDI) soundmanager->playMIDItrack(); break; case MM_MCINOTIFY: if (eventdata.m_event.wParam == mciNotifySuccessful) soundmanager->playMIDItrack(); return TRUE; break; case WM_PAINT: if (IsIconic(eventdata.m_parent)) { SendMessage(eventdata.m_parent,WM_PAINT,NULL,NULL); return TRUE; } t_paintwnd=CWnd::FromHandle(eventdata.m_event.hwnd); assert(t_paintwnd); if (eventdata.m_event.hwnd==eventdata.m_parent) { t_dc=new CPaintDC(t_paintwnd); assert(t_dc); delete t_dc; } else t_paintwnd->SendMessage(WM_PAINT,eventdata.m_event.wParam,eventdata.m_event.lParam); break; viewport_expose(vNum); break; case WM_SETFOCUS: { if (viewportsNum)//if we have a viewport { CXEvilWnd *t_wnd=m_windowarray[0]; assert(t_wnd); m_windowarray[viewportsNum]->SetFocus(); } } break; case WM_ACTIVATEAPP: { WORD fActive = (BOOL)eventdata.m_event.wParam; if (fActive == TRUE) { COUTRESULT("WM_ACTIVATEAPP"); doActivate(WA_ACTIVE); } break; } case WM_DESTROY: settingsChanges |= UIquit; break; case WM_CHAR: // Quit chat mode. if (m_chatOn) { chat_process_char((char)eventdata.m_event.wParam); } // Confirm exiting program. else { if ((char)eventdata.m_event.wParam == VK_ESCAPE) { int val = AfxMessageBox("Quit XEvil?",MB_OKCANCEL); if (val == IDOK) { settingsChanges |= UIquit; } } } break; case WM_COMMAND: switch (LOWORD(eventdata.m_event.wParam)) { case ID_NEWGAME: settingsChanges |= UInewGame; break; case ID_OPTIONS: { doOptions(); break; } case ID_CONNECTSERVER : { doConnect(); } break; case ID_DISCONNECTSERVER : { settingsChanges |= UIdisconnectServer; } break; case ID_STOPSERVER : { settingsChanges |= UIstopServer; } break; case ID_RUNSERVER : { doRunServer(); } break; case ID_STORY : { doStory(); } break; case ID_DIFFICULTY : { doDifficulty(); break; } case ID_APP_EXIT : settingsChanges |= UIquit; break; case ID_APP_ABOUT : { #ifdef MODELESS_DIALOGS m_pabout=new AboutDialog; m_pabout->Create(AboutDialog::IDD,m_windowarray[0]); m_pabout->ShowWindow(SW_NORMAL); m_pabout->SetFocus(); #else AboutDialog t_dlg; t_dlg.setLicenseText(LAgreement::get_text()); t_dlg.setVersionString(m_gameversion); t_dlg.setReject(FALSE); t_dlg.DoModal(); #endif break; } case ID_KEYS : case ID_KEYS2 : { doKeys(LOWORD(eventdata.m_event.wParam)); break; } case ID_RESETGFX: { int val = AfxMessageBox("Reset Graphics?\n\n" "Use this to attempt recovery from DirectDraw errors.\n" "May cause unpredictable behavior on some machines.", MB_OKCANCEL); if (val == IDOK) { reset_graphics(xvars.screenmode); } break; } case ID_FULLSCREEN: { if (xvars.screenmode!=Xvars::FULL_SCREEN_MODE) { settings.screenmode=Xvars::FULL_SCREEN_MODE; settingsChanges |= UIscreenmode; } break; } case ID_WINDOWSCREEN: { if (xvars.screenmode!=Xvars::WINDOW_SCREEN_MODE) { settings.screenmode=Xvars::WINDOW_SCREEN_MODE; settingsChanges |= UIscreenmode; } break; } case ID_NETHELP: { int val = AfxMessageBox("This will exit XEvil and run a web browser.", MB_OKCANCEL); if (val == IDOK) { CString t_string; t_string.LoadString(IDS_NETHELPURL); CXEvilWnd *t_wnd = get_viewport_wnd(vNum); if (t_wnd && xvars.screenmode!=Xvars::FULL_SCREEN_MODE) { t_wnd->SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0); } ShellExecute(NULL,"open",t_string,"","",SW_SHOWDEFAULT); settingsChanges |= UIquit; } break; } case ID_SURFACEMGR: { int numPages = xvars.m_surfaceManager->debug_pages_num(viewSize); // -1 becomes 0 which is what we want. m_surfMgrPage++; if (m_surfMgrPage == numPages) { // All pages have been displayed revert to normal viewing. m_surfMgrPage = -1; float prcnt = 100.0f * (float)xvars.m_surfaceManager->pixels_used() / (float)xvars.m_surfaceManager->pixels_allocated(); strstream str; str << setprecision(4) << "Used " << xvars.m_surfaceManager->pixels_used() << " pixels out of " << xvars.m_surfaceManager->pixels_allocated() << " (" << prcnt << "%)" << ends; locator->message_enq(Utils::strdup(str.str())); locator->arena_message_enq(str.str(),NULL,250,False); } break; } default : assert(FALSE); return t_returnvalue; } default: ::DefWindowProc(eventdata.m_event.hwnd, eventdata.m_event.message, eventdata.m_event.wParam, eventdata.m_event.lParam); break; } } return TRUE; } void UiPlayer::update_statuses(int viewportNum,BOOL forcestatuschanged) { StatusWnd *t_wnd = m_windowstatsarray[viewportNum]; if (intelsSet[viewportNum]) { if (forcestatuschanged || intels[viewportNum]->intel_status_changed()) { if (t_wnd) { assert(t_wnd); const IntelStatus *status = intels[viewportNum]->get_intel_status(); t_wnd->updateCharacterName(status->name); t_wnd->updateCharacterClass(status->className); t_wnd->updateHealth(status->health,status->healthmax); t_wnd->updateMass(status->mass); t_wnd->updateWeapon(status->weapon,status->weaponClassId,status->ammo,status->weaponReady); t_wnd->updateItem(status->item,status->itemClassId,status->itemCount); t_wnd->updateHumansNum(m_numhumansplaying); t_wnd->updateEnemiesNum(m_numenemiesplaying); t_wnd->updateLevel(m_level); // Display different messages in the same fields for EXTENDED vs. other // GameStyles. This logic is duplicated in the front ends, should be in // XP code. if (settings.style == EXTENDED) { // Use humanKills t_wnd->updateXtraLivesHumanKills(status->humanKills - status->soups,FALSE); // Use machineKills t_wnd->updateKillsEnemyKills(status->enemyKills,FALSE); } else { // Use Extra Lives t_wnd->updateXtraLivesHumanKills(status->lives,TRUE); // Use Kills t_wnd->updateKillsEnemyKills(status->humanKills + status->enemyKills,TRUE); } } } } // Clock viewports for animation. // Right now we are clocking right before the draw, so // we always have the current state drawn. // Want to clock after all the update* calls are made. StatusWnd *t_stats = m_windowstatsarray[viewportNum]; ASSERT(t_stats); t_stats->clock(); // This does its own dirty logic, and will only actually draw if necessary. t_wnd->update(xvars.m_lpprimarysurface,m_windowarray[0],forcestatuschanged); } void UiPlayer::interpret_key_state() { // We now do the key repeat check inside Human // If the user is typing in a chat message, don't dispatch key events. if (m_chatOn) { return; } // Space bar will start a new game. // This should probably be triggered by any key press like on // UNIX. if (KEY_DOWN(VK_SPACE)) { otherInput = TRUE; } // ignore all keypress that is the same // check all previous keypress to see if it is up now. for (int viewportNum = 0; viewportNum < viewportsNum; viewportNum++) { if (!inputsSet[viewportNum]) { continue; } KeyDispatcher* kDis = (KeyDispatcher*)keyDispatchers.get(viewportNum); assert(kDis); kDis->clock(this,this,(void*)viewportNum); } } // Glue method. Boolean UiPlayer::key_down(int key,void* closure) { int viewportNum = (int)closure; return KEY_DOWN(keycodes[viewportNum][key]); } // Glue method. void UiPlayer::dispatch(ITcommand command,void* closure) { int viewportNum = (int)closure; dispatch(viewportNum,command); } void UiPlayer::pre_clock() { // Make attempt to recover from error condition. if (m_recoveryState == RS_MUST_RECOVER) { COUTRESULT("Attempting error recovery, reset graphics."); m_recoveryState = RS_IN_RECOVERY; // Set screenmode to current mode. reset_graphics(xvars.screenmode); } otherInput = False; interpret_key_state(); // Display new arena messages. char *arenaMsg; Boolean exclusive; // Loop, empty the queue. do { IntelId msgTarget; Quanta time; Boolean propagate; // not used here exclusive = locator->arena_message_deq(&arenaMsg,msgTarget,time,propagate); if (arenaMsg) { // Go through all viewports, setting message on appropriate ones. for (int n = 0; n < viewportsNum; n++) { if ((exclusive && intelsSet[n] && intels[n]->get_intel_id() == msgTarget) || !exclusive) { // Either this is the target for the exclusive message or // the message goes to all viewports. Utils::freeif(arenaMessage[n]); arenaMessage[n] = Utils::strdup(arenaMsg); if (time == -1) { // default value. time = UI_ARENA_MESSAGE_TIME; } arenaMessageTimer[n].set(time); redrawAll[n] = DRAW_ALL; // This correct? hardts // Dont' need to redraw all, because we'll redraw the message // every turn. if (exclusive) { break; } } } delete arenaMsg; } } while(arenaMsg); // end arena messages // Make soundmanager follow middle of viewportarea for (short i = 0; i < viewportsNum; i++) { soundmanager->setKeyPosition(i,viewportAreas[i].get_middle()); } // Follow intel and draw. for (int n = 0; n < viewportsNum; n++) { // Before check for death. CXEvilWnd *t_wnd = get_viewport_wnd(n); assert(t_wnd); update_statuses(n); switch (t_wnd->getActivated()) { case CXEvilWnd::WMACTIVATED : doActivate(WA_ACTIVE); t_wnd->setActivated(CXEvilWnd::WMNONE); break; case CXEvilWnd::WMINACTIVE : doActivate(WA_INACTIVE); t_wnd->setActivated(CXEvilWnd::WMNONE); break; case CXEvilWnd::WMNONE : default: break; } if (!deactivated && t_wnd->getQueryNewPalette() && (xvars.uses_palette())) {//resetpalette! t_wnd->setQueryNewPalette(FALSE); HRESULT t_result=xvars.m_lpprimarysurface->SetPalette( xvars.m_ddpalette ); DHRESULT(t_result,"aftersetpalette"); } if (t_wnd->getTimerId()==UiPlayer::SOUNDTRACKTIMER_CD) { t_wnd->setTimerId(-1); soundmanager->playCDtrack(); } if (t_wnd->getTimerId()==UiPlayer::SOUNDTRACKTIMER_MIDI) { t_wnd->setTimerId(-1); soundmanager->playMIDItrack(); } if (xvars.screenmode==Xvars::WINDOW_SCREEN_MODE) { StatusWnd *t_statswnd=get_stats_wnd(n); assert(t_statswnd); if (t_statswnd->needRedraw()) { t_statswnd->setRedraw(FALSE); t_statswnd->SendMessage(WM_PAINT,0,0); } } // Follow intel. if (intelsSet[n] && intels[n]->is_playing()) { PhysicalP p; if (p = locator->lookup(intels[n]->get_id())) { Area a = p->get_area(); if (viewport_to_pos(n,a.get_middle())) { redrawAll[n] = DRAW_ALL; } } #if 0 else if (!intels[n]->alive() && intels[n]->get_lives() == 0) { unregister_intel(n); } #endif } if (!deactivated) { draw(n,redrawAll[n]); } arenaMessageTimer[n].clock(); // Clear arenaMessage being displayed if time is up. if (arenaMessage[n] && arenaMessageTimer[n].ready()) { Utils::freeif(arenaMessage[n]); // Clean up the message. redrawAll[n] = DRAW_ALL; // This correct? hardts } } // Clock message bar. if (messageTimer.ready()) { char *msg; if (msg = locator->message_deq()) { set_message(msg); delete msg; messageTimer.set(); } } messageTimer.clock(); } void UiPlayer::post_clock() { // Does nothing on Windows, only for compatibility with UNIX. } void UiPlayer::set_message(const char *message) { // Ignore all status messages while the status area is used for chat input. if (m_chatOn) { return; } // BUG. Won't work when we have two Viewports. // Should move status message outside of the Viewport if we want it to be // shared between the two viewports. if (m_windowstatsarray[0]) { m_windowstatsarray[0]->updateStatus(message); } } void translate_bitmaps(Xvars &xvars,CString &p_src,CString &p_dest) { FILE *t_src; FILE *t_dest; _chdir(p_src); CFileFind finder; BOOL bWorking = finder.FindFile("*.bmp"); CString t_newfilename; CString t_oldfilename; while (bWorking) { bWorking = finder.FindNextFile(); t_newfilename = p_dest + "\\" + finder.GetFileName(); t_oldfilename = finder.GetFilePath(); t_src=fopen(t_oldfilename.GetBuffer(0),"rb"); t_dest=fopen(t_newfilename.GetBuffer(0),"wb"); xvars.read_bitmap_write_file(t_src,t_dest); fclose(t_src); fclose(t_dest); } } void UiPlayer::draw(int viewportNum,DRAWTYPE changedOnly) { assert((viewportNum >= 0) && (viewportNum < viewportsNum)); CXEvilWnd *t_wnd = (CXEvilWnd *)m_windowarray[viewportNum]; assert(t_wnd); if (!t_wnd->isValid()) { settingsChanges |= UIquit; return; } if (t_wnd->IsIconic()) { CPaintDC t_dc(t_wnd); CWinApp *t_app=AfxGetApp(); assert(t_app); t_dc.DrawIcon(0,0,t_app->LoadIcon(IDR_XEVIL)); return; } PAINTSTRUCT t_paintstruct; if (xvars.screenmode == Xvars::WINDOW_SCREEN_MODE) { if (DRAW_EXPOSE == changedOnly) { // Don't need the returned DC. ::BeginPaint(t_wnd->m_hWnd, &t_paintstruct); } } // Refresh status window. if (DRAW_ALL==changedOnly) { StatusWnd *t_wnd = m_windowstatsarray[viewportNum]; ASSERT(t_wnd); t_wnd->update(xvars.m_lpprimarysurface,m_windowarray[0]); } // Normal drawing. if (m_surfMgrPage == -1) { draw_backbuffer(viewportNum); } // Draw debug page for SurfaceManager. else { xvars.m_surfaceManager->draw_debug_page(xvars,xvars.m_lpbackbuffer, viewSize,m_surfMgrPage); } CRect t_clientrect; HRESULT t_result = DD_OK; Size t_size = viewSize; Pos t_pos; // Merged this section of code for windowed and full-screen modes. t_clientrect.SetRect(0,0,viewSize.width,viewSize.height); CRect t_offset(t_pos.x,t_pos.y,t_pos.x+t_size.width,t_pos.y+t_size.height); t_wnd->ClientToScreen(&t_offset); // Only clipper for window mode. LPDIRECTDRAWCLIPPER t_lpclipper = NULL; if (xvars.screenmode==Xvars::WINDOW_SCREEN_MODE) { t_lpclipper = m_clipperarray[viewportNum]; } t_result = xvars.Blt(xvars.m_lpprimarysurface,t_offset.left,t_offset.top,xvars.m_lpbackbuffer, t_clientrect,False,t_lpclipper); DHRESULT(t_result,;); // What does this mean? hardts if (DRAW_NOTALL!=changedOnly) { redrawAll[viewportNum] = DRAW_NOTALL; } // Shouldn't this be just for window mode? hardts if (xvars.screenmode == Xvars::WINDOW_SCREEN_MODE) { if (DRAW_EXPOSE==changedOnly) { ::EndPaint(t_wnd->m_hWnd,&t_paintstruct); } } // Tool used for matching palettes. if (bmpSrcDir && bmpDestDir) { translate_bitmaps(xvars,CString(bmpSrcDir),CString(bmpDestDir)); exit(0); } // Successful recovery from an error, yea! // We got through an entire cycle of graphics with out blowing up, so // mark things as ok. if (m_recoveryState == RS_IN_RECOVERY) { m_recoveryState = RS_OK; COUTRESULT("Successful error recovery."); } } void UiPlayer::draw_backbuffer(int viewportNum) { // Need to clear the screen for reduced drawing. if (Xvars::get_reduce_draw()) { // Make sure to use fast (hardware) color filling here. xvars.color_fill(xvars.m_lpbackbuffer, CRect(0,0,viewSize.width,viewSize.height), xvars.m_black,True); } // Draw World. // World::draw() now takes care of background and outside. // We always use background3D on Windows, i.e. background scrolls slower // than foreground. world->draw(xvars.m_lpbackbuffer,xvars,0, viewportAreas[viewportNum],Xvars::get_reduce_draw(),True); // Draw all objects in the game. locator->draw_directly(xvars.m_lpbackbuffer,xvars,0, viewportAreas[viewportNum]); // Draw tick marks on edge of screen. if (intelsSet[viewportNum]) { assert(intels[viewportNum]); locator->draw_ticks(xvars.m_lpbackbuffer,xvars,0, viewportAreas[viewportNum], intels[viewportNum]->get_id(), locator); } // Draw arena Message. if (arenaMessage[viewportNum]) { // Draw in center of screen. Size vSize = viewportAreas[viewportNum].get_size(); if (vSize.height > 2 * ARENA_MESSAGE_OFF_CENTER) { CRect t_rect(0,0,vSize.width,vSize.height - 2 * ARENA_MESSAGE_OFF_CENTER); HDC t_temphdc; if (!xvars.GetDC(xvars.m_lpbackbuffer,&t_temphdc)){ return; } CDC *t_dc=CDC::FromHandle(t_temphdc); t_dc->SelectStockObject(BLACK_PEN); CFont *t_oldFont = xvars.select_arena_font(t_dc); t_dc->SetBkMode(TRANSPARENT); t_dc->SetBkColor(RGB(192,192,192)); CRect t_winrect = xvars.stretch_rect(t_rect); t_dc->SetTextColor(RGB(0,0,0)); t_dc->DrawText(arenaMessage[viewportNum],-1,t_winrect,DT_CENTER|DT_VCENTER|DT_SINGLELINE); // Shift to up and left t_winrect.right -= FONT_3D_OFFSET; t_winrect.bottom -= FONT_3D_OFFSET; t_dc->SetTextColor(RGB(255,0,50)); t_dc->DrawText(arenaMessage[viewportNum],-1,t_winrect,DT_CENTER|DT_VCENTER|DT_SINGLELINE); t_dc->SelectObject(t_oldFont); // So we can free t_temphdc xvars.m_lpbackbuffer->ReleaseDC(t_temphdc); } } } void UiPlayer::full_screen_init_x(HWND p_primarywindow) { COUTRESULT("full_screen2"); HRESULT t_result=xvars.m_lpDD->SetCooperativeLevel(p_primarywindow,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_ALLOWMODEX); DHRESULT(t_result,;); COUTRESULT("after set cooperative"); t_result=xvars.m_lpDD->SetDisplayMode(SCREENDIMX_FULLSCREEN,SCREENDIMY_FULLSCREEN,8); COUTRESULT("after set display mode"); //dont know why I have to do this twice but it was necessary due to lost surface t_result=xvars.m_lpDD->SetCooperativeLevel(p_primarywindow,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_ALLOWMODEX); COUTRESULT("after set cooperative2"); DHRESULT(t_result,;); // Create the primary surface with 1 back buffer DDSURFACEDESC t_ddsd; t_ddsd.dwSize = sizeof( t_ddsd ); t_ddsd.dwFlags = DDSD_CAPS ; t_ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; COUTRESULT("full_screen: about to create surface"); t_result = xvars.m_lpDD->CreateSurface( &t_ddsd, &(xvars.m_lpprimarysurface), NULL ); COUTRESULT("full_screen created surface?\n"); DHRESULT(t_result,return); COUTRESULT("full_screen created not failed\n"); // Create back buffer xvars.m_lpbackbuffer = xvars.create_surface(viewSize.width,viewSize.height,NULL); t_result=xvars.m_lpDD->CreatePalette( DDPCAPS_ALLOW256|DDPCAPS_8BIT, xvars.m_palette.palentries,&xvars.m_ddpalette,NULL); t_result=xvars.m_lpprimarysurface->SetPalette( xvars.m_ddpalette ); xvars.m_bpp = 8; ::ShowWindow(p_primarywindow,SW_MAXIMIZE); ::SendMessage(p_primarywindow,WM_SETFOCUS,0,0); } void UiPlayer::window_screen_init_x(HWND p_primarywindow) { HRESULT t_result=xvars.m_lpDD->SetCooperativeLevel(p_primarywindow,DDSCL_NORMAL ); // Create the primary surface with 1 back buffer // Create the primary surface with 1 back buffer DDSURFACEDESC t_ddsd; t_ddsd.dwSize = sizeof( t_ddsd ); t_ddsd.dwFlags = DDSD_CAPS ; t_ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; t_result = xvars.m_lpDD->CreateSurface( &t_ddsd, &(xvars.m_lpprimarysurface), NULL ); DHRESULT(t_result,_exit(33);); DDSURFACEDESC t_describedesc; t_describedesc.dwSize = sizeof( t_ddsd ); t_result = xvars.m_lpDD->GetDisplayMode( &t_describedesc); DHRESULT(t_result,_exit(33);); xvars.m_bpp = t_describedesc.ddpfPixelFormat.dwRGBBitCount; xvars.m_lpbackbuffer = xvars.create_surface(viewSize.width,viewSize.height,NULL); if (xvars.uses_palette()) { t_result=xvars.m_lpDD->CreatePalette( DDPCAPS_ALLOW256|DDPCAPS_8BIT, xvars.m_palette.palentries,&xvars.m_ddpalette,NULL); DHRESULT(t_result,_exit(33);); t_result=xvars.m_lpprimarysurface->SetPalette( xvars.m_ddpalette ); DHRESULT(t_result,_exit(33);); } } void UiPlayer::init_x(HWND p_primarywindow) { COUTRESULT("entering init_x"); // Only really needs to be set once, but who cares. xvars.errorRecovery = this; // Call at the beginning of init_x(), so we can use the Xvars methods. xvars.graphicsEnabled = True; xvars.m_lpDD = NULL; Xvars::read_palette_from_id(IDR_XEVILPAL,xvars.m_palette.palentries); // Create some useful pens. if (!xvars.m_pens[Xvars::BLACK].m_hObject) { xvars.m_pens[Xvars::BLACK].CreatePen(PS_SOLID,1,RGB(0,0,0)); } if (!xvars.m_pens[Xvars::RED].m_hObject) { xvars.m_pens[Xvars::RED].CreatePen(PS_SOLID,1,RGB(255,0,0)); } if (!xvars.m_pens[Xvars::WHITE].m_hObject) { xvars.m_pens[Xvars::WHITE].CreatePen(PS_SOLID,1,RGB(255,255,255)); } // Create some useful brushes. if (!xvars.m_brushes[Xvars::BLACK].m_hObject) { xvars.m_brushes[Xvars::BLACK].CreateSolidBrush(RGB(0,0,0)); } if (!xvars.m_brushes[Xvars::RED].m_hObject) { xvars.m_brushes[Xvars::RED].CreateSolidBrush(RGB(255,0,0)); } if (!xvars.m_brushes[Xvars::WHITE].m_hObject) { xvars.m_brushes[Xvars::WHITE].CreateSolidBrush(RGB(255,255,255)); } HRESULT t_result = DirectDrawCreate(NULL,&xvars.m_lpDD,NULL); DHRESULT(t_result,_exit(33);); xvars.m_palette.palversion = 0x300; //default of windows xvars.m_palette.numentries = PALENTRIES;//256 HDC t_hdc=::GetDC(p_primarywindow); if (xvars.screenmode != Xvars::FULL_SCREEN_MODE ) { xvars.m_hpalette= ::CreatePalette((LOGPALETTE *)&xvars.m_palette);//create a global palette ::SelectPalette(t_hdc,xvars.m_hpalette,FALSE);//false is to force us to use our own palette! UINT t_uint=::RealizePalette(t_hdc); t_uint=::GetSystemPaletteEntries(t_hdc,0,PALENTRIES,xvars.m_palette.palentries); } // Will be used below, compute now while we have a DC to play with. CDC* t_cdc = CDC::FromHandle(t_hdc); int t_arenaFontHeight = -((t_cdc->GetDeviceCaps(LOGPIXELSY) * ARENA_FONT_POINT_SIZE) / 72); ::ReleaseDC(p_primarywindow,t_hdc); if (xvars.screenmode==Xvars::FULL_SCREEN_MODE ) { full_screen_init_x(p_primarywindow); } else { window_screen_init_x(p_primarywindow); } // Set up the color keys. xvars.XVARS_COLORKEY.dwColorSpaceLowValue = xvars.color_match(Xvars::COLORKEY_DEF); xvars.XVARS_COLORKEY.dwColorSpaceHighValue = xvars.XVARS_COLORKEY.dwColorSpaceLowValue; xvars.XVARS_COLORKEY_MASKS.dwColorSpaceLowValue = xvars.color_match(Xvars::MASKCOLORKEY_DEF); xvars.XVARS_COLORKEY_MASKS.dwColorSpaceHighValue = xvars.XVARS_COLORKEY_MASKS.dwColorSpaceLowValue; // Stock colors. xvars.m_black = xvars.color_match(RGB(0x0,0x0,0x0)); xvars.m_white = xvars.color_match(RGB(0x255,0x255,0x255)); xvars.m_red = xvars.color_match(RGB(0x0,0x0,0x255)); xvars.m_green = xvars.color_match(RGB(0x0,0x255,0x0)); // Set up fonts. if (xvars.m_arenaFont) { delete xvars.m_arenaFont; } xvars.m_arenaFont = new CFont(); if (!xvars.m_arenaFont->CreateFont(t_arenaFontHeight,0,0,0,FW_BOLD,0,0,0, DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH | FF_DONTCARE,ARENA_FONT_NAME)) { delete xvars.m_arenaFont; xvars.m_arenaFont = NULL; // Means use default font } // Clipper. xvars.m_rgndata.rdh.dwSize=sizeof(xvars.m_rgndata.rdh); xvars.m_rgndata.rdh.iType=RDH_RECTANGLES; xvars.m_rgndata.rdh.nCount=1; xvars.m_rgndata.rdh.nRgnSize=sizeof(RECT); xvars.m_rgndata.rdh.rcBound.left=0; xvars.m_rgndata.rdh.rcBound.right=viewSize.width; xvars.m_rgndata.rdh.rcBound.top=0; xvars.m_rgndata.rdh.rcBound.bottom=viewSize.height; xvars.m_rgndata.rect.left=0; xvars.m_rgndata.rect.right=viewSize.width; xvars.m_rgndata.rect.top=0; xvars.m_rgndata.rect.bottom=viewSize.height; t_result = xvars.m_lpDD->CreateClipper(0, &xvars.m_backclipper, NULL); DHRESULT(t_result,return); t_result = xvars.m_backclipper->SetClipList((LPRGNDATA)&xvars.m_rgndata,0); DHRESULT(t_result,return); t_result = xvars.m_lpbackbuffer->SetClipper(xvars.m_backclipper); DHRESULT(t_result,return); // Initialize sound. soundmanager->init(p_primarywindow); // Gets incremented when things mess up, then incremented again when the // graphics are reinitialized. xvars.valid++; // Create new SurfaceManager. // Add all surfaces to the surface manager regardless of whether we will call init_x_all(). assert(!xvars.m_surfaceManager); xvars.m_surfaceManager = new SurfaceManager(viewSize.height); assert(xvars.m_surfaceManager); // Reserve space on the SurfaceManager for all surfaces immediately. We will actully fill the // rectangles later. add_surfaces_all(); t_result = xvars.m_surfaceManager->add_complete(xvars); DHRESULT(t_result,return); COUTRESULT("leaving init_x"); } BOOL UiPlayer::viewport_to_pos(int n,const Pos &p) { Pos posOld = viewportAreas[n].get_pos(); Pos posNew = p - 0.5f * viewportAreas[n].get_size(); // posNew.x = (posNew.x / WSQUARE_WIDTH) * WSQUARE_WIDTH; // posNew.y = (posNew.y / WSQUARE_HEIGHT) * WSQUARE_HEIGHT; viewportAreas[n].set_pos(posNew); return !(posOld == posNew); } void UiPlayer::dispatch(int viewportNum,ITcommand command) { if (neverReset) { return; } // Can chat even if no associated human. For Server in observer mode. if (command == IT_CHAT) { // Only enable Chat mode if the current Role supports it. if (Role::uses_chat(m_roletype)) { m_chatMessage = ""; m_chatOn = True; update_chat_message(); } return; } // Normal game-play command. if (intelsSet[viewportNum] && intels[viewportNum]->is_playing()) { // Only give the command to a human. if (intels[viewportNum]->is_human()) { HumanP human = (HumanP)intels[viewportNum]; human->set_command(command); } return; } // No associated intel, so scroll with the keyset. Size size = Intel::command_to_size(command,SHIFT_NO_INTEL); Area areaNew = viewportAreas[viewportNum] + size; if (size.abs_2() != 0 && // size != 0 // Still covering the world a bit world->overlap(areaNew.get_box())) { viewportAreas[viewportNum] = areaNew; redrawAll[viewportNum] = DRAW_ALL; } } int UiPlayer::get_viewport_num(HWND window) { for (int i=0;im_hWnd)) return i; } return -1; } int UiPlayer::get_statsviewport_num(HWND window) { #if 0 if (xvars.screenmode==Xvars::WINDOW_SCREEN_MODE) { for (int i=0;im_hWnd))) return i; } } #endif return -1; } CXEvilWnd * UiPlayer::get_viewport_wnd(int p_viewport) { if ((p_viewport<0)||(p_viewport>=m_windowarray.GetSize())) { assert(FALSE); return NULL; } return m_windowarray[p_viewport]; } StatusWnd * UiPlayer::get_stats_wnd(int p_statsport) { if ((p_statsport<0)||(p_statsport>=m_windowstatsarray.GetSize())) { assert(FALSE); return NULL; } return m_windowstatsarray[p_statsport]; } void UiPlayer::viewport_expose(int viewportNum) { ASSERT(xvars.screenmode == Xvars::WINDOW_SCREEN_MODE); // Redraw arena. draw(viewportNum,DRAW_EXPOSE); } void UiPlayer::set_prompt_difficulty() { // Not used in Windows. ASSERT(0); } void UiPlayer::doOptions() { m_poptions= new OptionsDlg; m_poptions->setStyle(settings.style); m_poptions->setRoleType(m_roletype); m_poptions->setNumHumans(settings.humansNum); m_poptions->setNumMachines(settings.enemiesNum); m_poptions->setRefillMachines(settings.enemiesRefill); m_poptions->setRoomsWide(settings.worldRooms.acrossMax); m_poptions->setRoomsHigh(settings.worldRooms.downMax); m_poptions->setCooperative(settings.cooperative); if (settings.quanta>100) { settings.quanta=100; } m_poptions->setSndTrkVolume(settings.trackvol); m_poptions->setEffectsVolume(settings.soundvol); m_poptions->setGameSpeed(settings.quanta); m_poptions->setMusicType(settings.musictype); m_poptions->setSoundOnOff(settings.sound); #ifdef MODELESS_DIALOGS m_poptions->Create(OptionsDlg::IDD,m_windowarray[0]); m_poptions->ShowWindow(SW_NORMAL); m_poptions->SetFocus(); #else if (m_poptions->DoModal() == IDOK) { retrieveOptions(); } delete m_poptions; m_poptions = NULL; #endif } void UiPlayer::retrieveOptions() { if (!m_poptions) return; if (m_poptions->getStyle()!= settings.style) settingsChanges |= UIstyle; if (m_poptions->getNumMachines()!= settings.enemiesNum) settingsChanges |= UIenemiesNum; if (m_poptions->getRefillMachines()!= settings.enemiesRefill) settingsChanges |= UIenemiesRefill; if (m_poptions->getNumHumans()!= settings.humansNum) settingsChanges |= UIhumansNum; if (m_poptions->getRoomsWide()!= settings.worldRooms.acrossMax) settingsChanges |= UIrooms; if (m_poptions->getRoomsHigh()!= settings.worldRooms.downMax) settingsChanges |= UIrooms; if (m_poptions->getGameSpeed()!= settings.quanta) settingsChanges |= UIquanta; if (m_poptions->getEffectsVolume()!= settings.soundvol) settingsChanges |= UIsoundvol; if (m_poptions->getSndTrkVolume()!= settings.trackvol) settingsChanges |= UItrackvol; if (m_poptions->getMusicType()!= settings.musictype) settingsChanges |= UImusictype; if (m_poptions->getSoundOnOff() != settings.sound) settingsChanges |= UIsound; if (m_poptions->getCooperative() != settings.cooperative) settingsChanges |= UIcooperative; settings.sound = m_poptions->getSoundOnOff(); settings.style = m_poptions->getStyle(); settings.humansNum=m_poptions->getNumHumans(); settings.enemiesNum=m_poptions->getNumMachines(); settings.enemiesRefill=m_poptions->getRefillMachines(); settings.worldRooms.acrossMax=m_poptions->getRoomsWide(); settings.worldRooms.downMax=m_poptions->getRoomsHigh(); settings.quanta=m_poptions->getGameSpeed();/*0-100*/ settings.soundvol=m_poptions->getEffectsVolume(); settings.trackvol=m_poptions->getSndTrkVolume(); settings.musictype=m_poptions->getMusicType(); settings.cooperative=m_poptions->getCooperative(); } void UiPlayer::retrieveKeys() { if (!m_pkeys) { return; } if (m_pkeys->getChanged()) { int t_index=m_pkeys->getIndex(); keycodes[t_index][IT_UP]=m_pkeys->getUpChar(); keycodes[t_index][IT_UP_L]=m_pkeys->getUpLeftChar(); keycodes[t_index][IT_UP_R]=m_pkeys->getUpRightChar(); keycodes[t_index][IT_L]=m_pkeys->getLeftChar(); keycodes[t_index][IT_R]=m_pkeys->getRightChar(); keycodes[t_index][IT_DN]=m_pkeys->getDownChar(); keycodes[t_index][IT_CENTER]=m_pkeys->getCenterChar(); keycodes[t_index][IT_DN_L]=m_pkeys->getDownLeftChar(); keycodes[t_index][IT_DN_R]=m_pkeys->getDownRightChar(); keycodes[t_index][IT_WEAPON_CENTER]=m_pkeys->getWeaponUse(); keycodes[t_index][IT_WEAPON_CHANGE]=m_pkeys->getWeaponChange(); keycodes[t_index][IT_WEAPON_DROP]=m_pkeys->getWeaponDrop(); keycodes[t_index][IT_ITEM_USE]=m_pkeys->getItemUse(); keycodes[t_index][IT_ITEM_CHANGE]=m_pkeys->getItemChange(); keycodes[t_index][IT_ITEM_DROP]=m_pkeys->getItemDrop(); keycodes[t_index][IT_CHAT]=m_pkeys->getChat(); CString t_plstring("Player1"); if (t_index==1) { t_plstring="Player2"; } CWinApp* pApp = AfxGetApp(); pApp->WriteProfileInt(t_plstring,"Center",(char)keycodes[t_index][IT_CENTER]); pApp->WriteProfileInt(t_plstring,"Right",(char)keycodes[t_index][IT_R]); pApp->WriteProfileInt(t_plstring,"DownRight",(char)keycodes[t_index][IT_DN_R]); pApp->WriteProfileInt(t_plstring,"Down",(char)keycodes[t_index][IT_DN]); pApp->WriteProfileInt(t_plstring,"DownLeft",(char)keycodes[t_index][IT_DN_L]); pApp->WriteProfileInt(t_plstring,"Left",(char)keycodes[t_index][IT_L]); pApp->WriteProfileInt(t_plstring,"UpLeft",(char)keycodes[t_index][IT_UP_L]); pApp->WriteProfileInt(t_plstring,"Up",(char)keycodes[t_index][IT_UP]); pApp->WriteProfileInt(t_plstring,"UpRight",(char)keycodes[t_index][IT_UP_R]); pApp->WriteProfileInt(t_plstring,"WeaponFire",(char)keycodes[t_index][IT_WEAPON_CENTER]); pApp->WriteProfileInt(t_plstring,"WeaponChange",(char)keycodes[t_index][IT_WEAPON_CHANGE]); pApp->WriteProfileInt(t_plstring,"WeaponDrop",(char)keycodes[t_index][IT_WEAPON_DROP]); pApp->WriteProfileInt(t_plstring,"ItemUse",(char)keycodes[t_index][IT_ITEM_USE]); pApp->WriteProfileInt(t_plstring,"ItemChange",(char)keycodes[t_index][IT_ITEM_CHANGE]); pApp->WriteProfileInt(t_plstring,"ItemDrop",(char)keycodes[t_index][IT_ITEM_DROP]); pApp->WriteProfileInt(t_plstring,"Chat",(char)keycodes[t_index][IT_CHAT]); } } void UiPlayer::doKeys(UINT p_commandid) { if (m_pkeys) return; m_pkeys=new CKeySets; int t_index; if (p_commandid==ID_KEYS) { m_pkeys->setText(CString("Player 1 keys:")); m_pkeys->setIndex(0); t_index=0; } else { m_pkeys->setText(CString("Player 2 keys:")); m_pkeys->setIndex(1); t_index=1; } m_pkeys->setUpChar(keycodes[t_index][IT_UP]); m_pkeys->setUpLeftChar(keycodes[t_index][IT_UP_L]); m_pkeys->setUpRightChar(keycodes[t_index][IT_UP_R]); m_pkeys->setLeftChar(keycodes[t_index][IT_L]); m_pkeys->setRightChar(keycodes[t_index][IT_R]); m_pkeys->setCenterChar(keycodes[t_index][IT_CENTER]); m_pkeys->setDownChar(keycodes[t_index][IT_DN]); m_pkeys->setDownLeftChar(keycodes[t_index][IT_DN_L]); m_pkeys->setDownRightChar(keycodes[t_index][IT_DN_R]); m_pkeys->setWeaponUse(keycodes[t_index][IT_WEAPON_CENTER]); m_pkeys->setWeaponChange(keycodes[t_index][IT_WEAPON_CHANGE]); m_pkeys->setWeaponDrop(keycodes[t_index][IT_WEAPON_DROP]); m_pkeys->setItemUse(keycodes[t_index][IT_ITEM_USE]); m_pkeys->setItemChange(keycodes[t_index][IT_ITEM_CHANGE]); m_pkeys->setItemDrop(keycodes[t_index][IT_ITEM_DROP]); m_pkeys->setChat(keycodes[t_index][IT_CHAT]); #ifdef MODELESS_DIALOGS m_pkeys->Create(CKeySets::IDD,m_windowarray[0]); m_pkeys->ShowWindow(SW_NORMAL); m_pkeys->SetFocus(); #else if (m_pkeys->DoModal() == IDOK) { retrieveKeys(); } delete m_pkeys; m_pkeys = NULL; #endif } void UiPlayer::doDifficulty() { if (m_pdifficulty) return; m_pdifficulty = new CDifficulty; // Default to NORMAL if none specified yet. if (DIFF_NONE== difficulty) { difficulty = DIFF_NORMAL; } m_pdifficulty->setDifficulty(difficulty); #ifdef MODELESS_DIALOGS m_pdifficulty->Create(CDifficulty::IDD,m_windowarray[0]); m_pdifficulty->ShowWindow(SW_NORMAL); m_pdifficulty->SetFocus(); #else if (m_pdifficulty->DoModal() == IDOK) { retrieveDifficulty(); } delete m_pdifficulty; m_pdifficulty = NULL; #endif } void UiPlayer::retrieveDifficulty() { if (!m_pdifficulty) return; // Tell Game the new difficulty. settingsChanges |= UIdifficulty; settings.difficulty = m_pdifficulty->getDifficulty(); difficulty = m_pdifficulty->getDifficulty(); // redundant, Game will set it. } void UiPlayer::doConnect() { m_pconnect=new CConnectDlg; #ifdef MODELESS_DIALOGS // Running as modeless dialog doesn't fill in the getHostname() and getName() fields. m_pconnect->Create(CConnectDlg::IDD,m_windowarray[0]); m_pconnect->ShowWindow(SW_NORMAL); m_pconnect->SetFocus(); #else if (m_pconnect->DoModal() == IDOK) { retrieveConnect(); } delete m_pconnect; m_pconnect = NULL; #endif } void UiPlayer::doStory() { m_pstory = new CStoryDlg; m_pstory->DoModal(); delete m_pstory; m_pstory = NULL; } void UiPlayer::retrieveConnect() { settingsChanges |= UIconnectServer; strncpy(settings.connectHostname,m_pconnect->getHostname(),R_NAME_MAX - 1); settings.connectHostname[R_NAME_MAX - 1] = '\0'; settings.connectPort = m_pconnect->getPort(); strncpy(settings.humanName,m_pconnect->getName(),IT_STRING_LENGTH - 1); settings.humanName[IT_STRING_LENGTH - 1] = '\0'; } void UiPlayer::doRunServer() { m_prunserver=new CRunServerDlg; // m_prunserver->Create(CRunServerDlg::IDD,m_windowarray[0]); // m_prunserver->ShowWindow(SW_NORMAL); // m_prunserver->SetFocus(); if (m_prunserver->DoModal() == IDOK) { retrieveRunServer(); } delete m_prunserver; m_prunserver = NULL; } void UiPlayer::retrieveRunServer() { settingsChanges |= UIrunServer; settings.serverPort = m_prunserver->get_port(); settings.localHuman = m_prunserver->get_local_human(); // Unspecified name. strncpy(settings.humanName,m_prunserver->get_name(),IT_STRING_LENGTH - 1); settings.humanName[IT_STRING_LENGTH - 1] = '\0'; } void UiPlayer::doActivate(WORD p_fActive) { if (p_fActive==WA_ACTIVE) { COUTRESULT("entering doActivate, check backbuffer (WA_ACTIVE)"); if (deactivated&&(xvars.screenmode==Xvars::FULL_SCREEN_MODE)) { reset_graphics(xvars.screenmode); deactivated=FALSE; } } else if (p_fActive==WA_INACTIVE) { COUTRESULT("entering doActivate, check backbuffer (WA_INACTIVE)"); if (xvars.screenmode==Xvars::FULL_SCREEN_MODE) { deactivated=TRUE; } } } void UiPlayer::add_surfaces_all() { world->init_x(xvars,IX_ADD,NULL); locator->init_x(xvars,IX_ADD,NULL); StatusWnd::init_x(locator,xvars,IX_ADD,NULL); ClassId cId; for (cId = 0; cId < A_CLASSES_NUM; cId++) { const PhysicalContext *pc = locator->get_context(cId); if (pc) { assert(pc->init_x); // Call init_x() with addOnly set to True. // This means just add the surface requests to the SurfaceManager. pc->init_x(xvars,IX_ADD,NULL); } } } // Initialize world, locator, StatusWnd (WeaponWheel), and all objects. void UiPlayer::init_x_all() { world->init_x(xvars,IX_INIT,NULL); locator->init_x(xvars,IX_INIT,NULL); StatusWnd::init_x(locator,xvars,IX_INIT,NULL); ClassId cId; for (cId = 0; cId < A_CLASSES_NUM; cId++) { const PhysicalContext *pc = locator->get_context(cId); if (pc) { ostrstream str; str << pc->className << " graphics loading " << " (" << (cId + 1) << " of " << (int)A_CLASSES_NUM << ")" << ends; // Redraw the screen while we go. display_arena_message_sync(str.str()); COUTRESULT(str.str()); delete str.str(); assert(pc->init_x); pc->init_x(xvars,IX_INIT,NULL); } } } // e.g. <2,3> ---> "2c" static CString dir_anim_num_suffix(int dir,int animNum) { CString ret; // Suffix for the direction number. ostrstream dirStr; dirStr << dir << ends; ret += dirStr.str(); delete dirStr.str(); // Suffix indicating the animation frame, no suffix for the // first frame. if (animNum > 0) { ret += (char)('a' + animNum); } return ret; } void UiPlayer::generate_xpm() { // Might be nice to implement this w/o using CString. Increase future // portability. assert(genXPMDir); if (!xvars.uses_palette()) { AfxMessageBox("Must be in palette mode to generate XPM images."); genXPMDir = NULL; return; } if (!*genXPMDir) { AfxMessageBox("Empty dest directory name for XPM images."); genXPMDir = NULL; return; } // Create CString for easier string manipulation. CString genDir(genXPMDir); // So we don't go reentrant when we call clock() to print debug info. genXPMDir = NULL; // Make sure ends in '\'. if (genDir[genDir.GetLength() - 1] != '\\') { genDir += '\\'; } // E.g. genDir = "c:\somedir\" // Make sure top-level destination directory for creating bitmaps exists. if (!Utils::is_dir(genDir)) { Boolean ret = Utils::mkdir(genDir); if (!ret) { AfxMessageBox("Could not create top-level directory for XPM images."); genXPMDir = NULL; return; } } const Boolean halfSize = False; // Ask the world to output all its bitmaps. display_arena_message_sync("Writing XPM images for World"); if (!world->generate_xpm(xvars,genDir,halfSize)) { AfxMessageBox("Failed to write XPM images for world."); return; } // Ask the Locator to output all its bitmaps. display_arena_message_sync("Writing XPM images for Locator"); if (!locator->generate_xpm(xvars,genDir,halfSize)) { AfxMessageBox("Failed to write XPM images for locator."); return; } // Loop over all Physical objects registered with the Locator. for (int cNum = 0; cNum < A_CLASSES_NUM; cNum++) { const PhysicalContext* cx = locator->get_context(cNum); if (!cx) { continue; } ostrstream str; str << "Writing XPM images for " << cx->className << ends; COUTRESULT(str.str()); display_arena_message_sync(str.str()); delete str.str(); // Replace dashes with underscores for filenames. // E.g. "chopper_boy" CString fName = cx->className; int n; for (n = 0; n < fName.GetLength(); n++) { if (fName[n] == '-') { fName.SetAt(n,'_'); } } // E.g. "c:\somedir\chopper_boy\" CString classDir = genDir + fName + '\\'; // Make sure class-specific destination bitmap directory exists. if (!Utils::is_dir(classDir)) { Boolean ret = Utils::mkdir(classDir); if (!ret) { AfxMessageBox("Could not create class-specfic directory for XPM images."); genXPMDir = NULL; return; } } // E.g. "c:\somedir\chopper_boy\chopper_boy_" CString fullNameRoot = classDir + fName; // Ask PhysicalContext for the list of pixmaps. assert(cx->init_x); PtrList infoList; cx->init_x(xvars,IX_LIST,(void*)&infoList); // Look for duplicate pixmaps in infoList. // Stores the keys that are used for the SurfaceManager. IDictionary* dups = HashTable_factory(); // Go through list of all pixmaps, writing each to an XPM file. // Don't write the same pixmap twice, instead write a warning message. for (n = 0; n < infoList.length(); n++) { IXPixmapInfo* pInfo = (IXPixmapInfo*)infoList.get(n); assert(pInfo); // See if we already wrote out this pixmap. void* prevEntry = dups->get(pInfo->key); if (prevEntry != NULL) { // Write file with name describing the duplication to aid developer // making the .bitmaps files. IXPixmapInfo* pOriginal = (IXPixmapInfo*)prevEntry; // E.g. "23_duplicate_of_18" CString filename(classDir); filename += dir_anim_num_suffix(pInfo->dir,pInfo->animNum) + "_duplicate_of_" + dir_anim_num_suffix(pOriginal->dir,pOriginal->animNum); // Touch the file. FILE* fp = fopen(filename,"w"); fclose(fp); // Go to next pixmap in infoList. continue; } // Store association between SurfaceManger key and pInfo. // The IXPixmapInfo will later tell us what the original // frame when we run into a duplicate. // Safe to alias pInfo here because we don't delete the list // of IXPixmapInfo until after dups is gone. dups->put(pInfo->key,pInfo); // The suffix for direction and animation frame number. CString dirANum = dir_anim_num_suffix(pInfo->dir,pInfo->animNum); // The complete filename, e.g. "c:\somedir\chopper_boy\chopper_boy_1c" CString ffName = fullNameRoot + '_' + dirANum + ".xpm"; // The variable name to store in the XPM file, e.g. "chopper_boy_1c" CString varName = fName + '_' + dirANum; Area area; const DDCOLORKEY* cKey; LPDIRECTDRAWSURFACE surf = xvars.m_surfaceManager->lookup(area,cKey,pInfo->key); // Finally. Write the bastard. Boolean val = xvars.write_xpm_file(ffName,varName,surf,area,cKey,halfSize); // If error, abort writing all XPM files. if (!val) { AfxMessageBox("Could not write XPM image."); // To end the outer loop. cNum = (A_CLASSES_NUM - 1); // To end the inner loop. break; } } // for n delete dups; // Delete contents of list, even if we abort. for (n = 0; n < infoList.length(); n++) { IXPixmapInfo* pInfo = (IXPixmapInfo*)infoList.get(n); delete pInfo; } } // for cNum genXPMDir = NULL; exit(0); } void UiPlayer::display_arena_message_sync(const char* message) { for (int n = 0; n < viewportsNum; n++) { Utils::freeif(arenaMessage[n]); arenaMessage[n] = Utils::strdup(message); redrawAll[n] = DRAW_ALL; } pre_clock(); post_clock(); } void UiPlayer::update_chat_message() { // Will clear the message if chat is not turned on. CString message; if (m_chatOn) { message += "CHAT <<"; message += m_chatMessage; message += "\nEnter to send, Esc to cancel."; } get_stats_wnd(0)->updateStatus(message); } void UiPlayer::chat_process_char(char charPressed) { assert(m_chatOn); // Commit the chat message. if (charPressed == VK_RETURN) { // Don't bother sending empty messages. if (!m_chatMessage.IsEmpty()) { settingsChanges |= UIchatRequest; // No UI for specifying the receiver yet. settings.chatReceiver[0] = '\0'; // Copy over the message. Utils::strncpy(settings.chatMessage,m_chatMessage,UI_CHAT_MESSAGE_MAX); settings.chatMessage[UI_CHAT_MESSAGE_MAX] = '\0'; } // Turn off chat mode. m_chatOn = False; update_chat_message(); } // Abort the chat message. else if (charPressed == VK_ESCAPE) { m_chatOn = False; update_chat_message(); } // Delete prev char. else if (charPressed == VK_BACK) { // VK_DELETE doesn't seem to come in a WM_CHAR message. if (!m_chatMessage.IsEmpty()) { // There must be a better way to remove the last character. m_chatMessage = m_chatMessage.Left(m_chatMessage.GetLength() - 1); } update_chat_message(); } // Only add printable characters to the chat message. else if (isprint(charPressed)) { // Don't add white space to the beginning of the message. if (!m_chatMessage.IsEmpty() || !isspace(charPressed)) { m_chatMessage += charPressed; update_chat_message(); } } } Boolean UiPlayer::attemptRecovery() { switch (m_recoveryState) { case RS_OK: // Attempt recovery at the soonest possible time. m_recoveryState = RS_MUST_RECOVER; COUTRESULT("Graphics Error: Disabling graphics and setting the error-recovery flag."); // Disable graphics to avoid more errors before we attempt the recovery. return False; break; case RS_MUST_RECOVER: // Flag already set, do nothing. Keep graphics disabled until error // recovery time. return False; break; // Don't attempt recovery again unless we are sure the last recovery // attempt was successful. Don't get into an infinite loop trying to // recover over and over. // // MS DirectDraw fucks us again. Application will probably crash soon. case RS_IN_RECOVERY: m_recoveryState = RS_RECOVERY_FAILED; COUTRESULT("Error while trying to recover from error, give up error recovery."); // Keep graphics enabled. We're screwed, but might as well keep trying // to draw. return True; break; // Things are messed up. We will never leave this state. As before, we // might as well keep trying to draw. Can't make it worse. case RS_RECOVERY_FAILED: return True; default: assert(0); return False; } } const char* UiPlayer::genXPMDir = NULL; const char* UiPlayer::bmpSrcDir = NULL; const char* UiPlayer::bmpDestDir = NULL; VInfoProvider UiPlayer::viewInfo; xevil-2.02r2.orig/win32/uiserver.cpp0100644000175000017500000002622407041422174016623 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "stdafx.h" #include "ui.h" #include "uiserver.h" #include "resource.h" #include "optionsdlg.h" #include "aboutdialog.h" UiServer::UiServer(LocatorP p_locator) { locator=p_locator; if (!m_serverwnd.Create(CRect(10,10,0,0),NULL)) m_serverwnd.setClose(TRUE); else { CRect t_clientrect; CRect t_windowrect; int t_ydiff; int t_xdiff; m_serverwnd.GetClientRect(t_clientrect); m_serverwnd.GetWindowRect(t_windowrect); t_ydiff=CXEvilServerStatus::SERVER_VIEW_HEIGHT-t_clientrect.Height(); t_xdiff=CXEvilServerStatus::SERVER_VIEW_WIDTH-t_clientrect.Width(); m_serverwnd.SetWindowPos(NULL,0,0,t_windowrect.Width()+t_xdiff,t_windowrect.Height()+t_ydiff,SWP_NOZORDER|SWP_NOMOVE|SWP_NOREDRAW); m_serverwnd.ShowWindow(SW_SHOWNORMAL); // settingsChanges = UIpause; // settings.pause=TRUE; } m_starttime=CTime::GetCurrentTime(); m_serverwnd.SetTimer(ID_TIMER,1000,NULL); } UiServer::~UiServer() { } void UiServer::pre_clock() { if (m_serverwnd.getClose()) settingsChanges |= UIquit; char *arenaMsg; Boolean exclusive; do { CString t_output; IntelId msgTarget; IntelP inteltarget; Quanta time; Boolean propagate; exclusive = locator->arena_message_deq(&arenaMsg,msgTarget,time,propagate); if (arenaMsg) { // Go through all viewports, setting message on appropriate ones. if (exclusive) { inteltarget=locator->lookup(msgTarget); if (inteltarget) { t_output+="("; t_output+=inteltarget->get_name(); t_output+=") "; } } t_output+=arenaMsg; m_serverwnd.addLog(t_output); delete arenaMsg; } } while(arenaMsg); } void UiServer::post_clock() { } int UiServer::getWindowList(CTypedPtrList&p_windowlist) { p_windowlist.RemoveAll(); p_windowlist.AddTail(&m_serverwnd); return p_windowlist.GetCount(); } Boolean ///break in event handling. False== stop checking UiServer::process_event(int dpyNum,CMN_EVENTDATA eventdata)//change dpynum to vnum test for WM_ messages { CRect t_updaterect; CWnd *t_wnd=CWnd::FromHandle(eventdata.m_event.hwnd); switch(eventdata.m_event.message) { case WM_LBUTTONDOWN: if (t_wnd->IsKindOf( RUNTIME_CLASS( CSpecialButton ) ) ) { CPoint t_point(LOWORD(eventdata.m_event.lParam),HIWORD(eventdata.m_event.lParam)); ((CSpecialButton *)t_wnd)->SpecialOnLButtonDown( eventdata.m_event.wParam, t_point ); t_wnd->SetFocus(); } else if (t_wnd->IsKindOf( RUNTIME_CLASS( CSpecialEdit ) ) ) { t_wnd->SendMessage(eventdata.m_event.message, eventdata.m_event.wParam, eventdata.m_event.lParam); } else ::DefWindowProc(eventdata.m_event.hwnd,eventdata.m_event.message, eventdata.m_event.wParam, eventdata.m_event.lParam); break; case WM_LBUTTONUP: if (t_wnd->IsKindOf( RUNTIME_CLASS( CSpecialButton ) ) ) { CPoint t_point(LOWORD(eventdata.m_event.lParam),HIWORD(eventdata.m_event.lParam)); ((CSpecialButton *)t_wnd)->SpecialOnLButtonUp( eventdata.m_event.wParam, t_point ); } else if (t_wnd->IsKindOf( RUNTIME_CLASS( CSpecialEdit ) ) ) { t_wnd->SendMessage(eventdata.m_event.message, eventdata.m_event.wParam, eventdata.m_event.lParam); /* CPoint t_point(LOWORD(eventdata.m_event.lParam),HIWORD(eventdata.m_event.lParam)); ((CSpecialEdit *)t_wnd)->SpecialOnLButtonUp( eventdata.m_event.wParam, t_point );*/ } else ::DefWindowProc(eventdata.m_event.hwnd,eventdata.m_event.message, eventdata.m_event.wParam, eventdata.m_event.lParam); break; case WM_MOUSEMOVE: if (t_wnd->IsKindOf( RUNTIME_CLASS( CSpecialButton ) ) ) { CPoint t_point(LOWORD(eventdata.m_event.lParam),HIWORD(eventdata.m_event.lParam)); ((CSpecialButton *)t_wnd)->SpecialOnMouseMove( eventdata.m_event.wParam, t_point ); } else if (t_wnd->IsKindOf( RUNTIME_CLASS( CSpecialEdit ) ) ) { t_wnd->SendMessage(eventdata.m_event.message, eventdata.m_event.wParam, eventdata.m_event.lParam); } else ::DefWindowProc(eventdata.m_event.hwnd,eventdata.m_event.message, eventdata.m_event.wParam, eventdata.m_event.lParam); break; case WM_KEYDOWN: if (TranslateMessage(&eventdata.m_event)) break; case WM_CHAR: if (t_wnd->IsKindOf( RUNTIME_CLASS( CSpecialEdit ) ) ) { if ((TCHAR)eventdata.m_event.wParam=='\r') { if (t_wnd->GetOwner()) t_wnd->GetOwner()->PostMessage(WM_COMMAND,t_wnd->GetDlgCtrlID()); break; } } case WM_KEYUP: case WM_SETCURSOR: t_wnd->SendMessage(eventdata.m_event.message,eventdata.m_event.wParam, eventdata.m_event.lParam); case WM_TIMER: { CTime t_time=CTime::GetCurrentTime(); CTimeSpan t_timespan=t_time-m_starttime; CString t_formattedstring=t_timespan.Format("%D:%H:%M:%S"); m_serverwnd.setTimeSpan(t_formattedstring); m_serverwnd.setNumPlayers(locator->humans_playing()); } break; case WM_PAINT: if (IsIconic(eventdata.m_parent)) { SendMessage(eventdata.m_parent,WM_PAINT,NULL,NULL); return TRUE; } t_wnd->SendMessage(WM_PAINT,eventdata.m_event.wParam,eventdata.m_event.lParam); break; case WM_SETFOCUS: t_wnd->SetFocus(); break; /* case WM_ACTIVATE: ::SendMessage(eventdata.m_parent,WM_ACTIVATE,eventdata.m_event.wParam,eventdata.m_event.lParam); break;*/ case WM_CLOSE: case WM_DESTROY: settingsChanges |= UIquit; break; case WM_COMMAND: switch (LOWORD(eventdata.m_event.wParam)) { case IDC_SETTINGS: { OptionsDlg t_options; t_options.setStyle(settings.style); // Will always be R_SERVER. t_options.setRoleType(R_SERVER); t_options.setNumHumans(settings.humansNum); t_options.setNumMachines(settings.enemiesNum); t_options.setRefillMachines(settings.enemiesRefill); t_options.setRoomsWide(settings.worldRooms.acrossMax); t_options.setRoomsHigh(settings.worldRooms.downMax); t_options.setCooperative(settings.cooperative); if (settings.quanta>100) settings.quanta=100; t_options.setSndTrkVolume(settings.trackvol); t_options.setEffectsVolume(settings.soundvol); t_options.setGameSpeed(settings.quanta); t_options.setMusicType(settings.musictype); t_options.setSoundOnOff(settings.sound); if (t_options.DoModal()==IDOK) { if (t_options.getStyle()!= settings.style) settingsChanges |= UIstyle; if (t_options.getNumMachines()!= settings.enemiesNum) settingsChanges |= UIenemiesNum; if (t_options.getRefillMachines()!= settings.enemiesRefill) settingsChanges |= UIenemiesRefill; if (t_options.getNumHumans()!= settings.humansNum) settingsChanges |= UIhumansNum; if (t_options.getRoomsWide()!= settings.worldRooms.acrossMax) settingsChanges |= UIrooms; if (t_options.getRoomsHigh()!= settings.worldRooms.downMax) settingsChanges |= UIrooms; if (t_options.getGameSpeed()!= settings.quanta) settingsChanges |= UIquanta; if (t_options.getEffectsVolume()!= settings.soundvol) settingsChanges |= UIsoundvol; if (t_options.getSndTrkVolume()!= settings.trackvol) settingsChanges |= UItrackvol; if (t_options.getMusicType()!= settings.musictype) settingsChanges |= UImusictype; if (t_options.getSoundOnOff() != settings.sound) settingsChanges |= UIsound; if (t_options.getCooperative() != settings.cooperative) settingsChanges |= UIcooperative; settings.sound = t_options.getSoundOnOff(); settings.style = t_options.getStyle(); settings.humansNum=t_options.getNumHumans(); settings.enemiesNum=t_options.getNumMachines(); settings.enemiesRefill=t_options.getRefillMachines(); settings.worldRooms.acrossMax=t_options.getRoomsWide(); settings.worldRooms.downMax=t_options.getRoomsHigh(); settings.quanta=t_options.getGameSpeed();/*0-100*/ settings.soundvol=t_options.getEffectsVolume(); settings.trackvol=t_options.getSndTrkVolume(); settings.musictype=t_options.getMusicType(); settings.cooperative=t_options.getCooperative(); } SendMessage(eventdata.m_event.hwnd,WM_PAINT,0,0); m_serverwnd.SetFocus(); break; } case ID_APP_EXIT : settingsChanges |= UIquit; break; case ID_APP_ABOUT : { AboutDialog t_about; t_about.DoModal(); m_serverwnd.SetFocus(); break; } case IDC_STARTSERVER: settingsChanges |= UInewGame; // settingsChanges |= UIpause; // settings.pause=FALSE; break; case IDC_STOPSERVER: #if 0 // We probably don't want to pause, // really want a UIendGame that ends the game // without starting a new one. settingsChanges |= UIpause; settings.pause=TRUE; #endif settingsChanges |= UIquit; break; case IDC_DISPLAY: m_serverwnd.toggleDisplay(); break; case IDC_MESSAGEDISPLAY: { //send another message... CString t_string; m_serverwnd.getMessage(t_string); m_serverwnd.addLog(t_string); m_serverwnd.clearMessage(); } break; default : assert(FALSE); return FALSE; } default: // if (t_wnd->IsKindOf( RUNTIME_CLASS( CSpecialEdit ) ) ) // { // t_wnd->SendMessage(eventdata.m_event.message, eventdata.m_event.wParam, eventdata.m_event.lParam); // } // else ::DefWindowProc(eventdata.m_event.hwnd,eventdata.m_event.message, eventdata.m_event.wParam, eventdata.m_event.lParam); break; } return TRUE; } void UiServer::set_level(const char *p_levelname) { #if 0 CString t_string("### NEW LEVEL ###\r\n"); m_serverwnd.addLog(t_string); #endif } xevil-2.02r2.orig/win32/wheel.cpp0100644000175000017500000002750107041422174016062 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "stdafx.h" #include "coord.h" #include "xdata.h" #include "wheel.h" #include "resource.h" #define INDENT_WHEEL 3 // How much alpha is incremented each turn, for the // wheel animation. #define WHEEL_ALPHA_INCR 0.3f Wheel::Wheel(LocatorP l) : m_surfacearea(0,0,0,0) { // First do static initialization if it hasn't been done already. if (numbitmaps == -1) { gather_bitmaps(l); } // Initialize m_values and m_ready. m_values = new int[numbitmaps]; m_ready = new ReadyState[numbitmaps]; assert(m_values && m_ready); for (int i = 0;i < numbitmaps;i ++) { m_values[i] = 0; m_ready[i] = READY_UNDEFINED; } m_item = 0; m_itemPrev = -1; // no previous value m_alpha = 1.0f; m_dirty = TRUE; } Wheel::~Wheel() { if (m_values) { delete [] m_values; } if (m_ready) { delete [] m_ready; } } void Wheel::init_x(LocatorP l,Xvars &xvars,IXCommand command,void*) { // General static initialization. if (numbitmaps == -1) { gather_bitmaps(l); } if (command == IX_ADD) { // Add each of the wheel items with no color key. for (int n = 0; n < numbitmaps; n++) { xvars.m_surfaceManager->add(compute_key(bitmapids[n]),wheelSize,NULL); } return; } assert(command == IX_INIT || command == IX_LIST); if (xvars.is_valid(valid)) { return; } // background, always has the wheel background image LPDIRECTDRAWSURFACE bgSurf = xvars.create_surface(WHEEL_ITEM_WIDTH,WHEEL_ITEM_HEIGHT,NULL); if (!bgSurf) { DHRESULT(DDERR_GENERIC,return); } if (!xvars.load_surface(bgSurf,CPoint(0,0),backgroundBits)) { COUTRESULT("load wheel background failed"); DHRESULT(DDERR_GENERIC,return); } // Surface for loading each item in turn. LPDIRECTDRAWSURFACE itemSurf = xvars.create_surface(WHEEL_ITEM_WIDTH,WHEEL_ITEM_HEIGHT, &xvars.XVARS_COLORKEY); if (!itemSurf) { DHRESULT(DDERR_GENERIC,return); } // Offset the source rect a bit because the dest rect // is offset from the upper-left. CRect indentRect(0,0, WHEEL_ITEM_WIDTH - INDENT_WHEEL, WHEEL_ITEM_HEIGHT - INDENT_WHEEL); for (int i = 0; i < numbitmaps; i++) { Pos destPos; LPDIRECTDRAWSURFACE destSurf = xvars.m_surfaceManager->lookup(destPos,compute_key(bitmapids[i])); // Copy bg onto destination. HRESULT t_result = xvars.Blt(destSurf,destPos,bgSurf,Pos(0,0),wheelSize); DHRESULT(t_result,return); // Clear bg of itemSurf to colorkey value. t_result = xvars.color_fill(itemSurf,CRect(0,0,WHEEL_ITEM_WIDTH,WHEEL_ITEM_HEIGHT), xvars.XVARS_COLORKEY.dwColorSpaceLowValue); DHRESULT(t_result,return); // Load in item, will probably be smaller than wheelSize, which is fine // since we just filled in the surface with the colorkey value. if (!xvars.load_surface(itemSurf,CPoint(0,0),bitmapids[i])) { ostrstream dbg; dbg << "load_ssurface fails on " << i << " which has ID " << bitmapids[i] << ends; COUTRESULT(dbg.str()); delete dbg.str(); DHRESULT(DDERR_GENERIC,return); } // Copy t_surfaceitem to m_drawsurface, indented by INDENT_WHEEL from upper-left // corner. t_result = xvars.Blt(destSurf, destPos.x + INDENT_WHEEL,destPos.y + INDENT_WHEEL, itemSurf,indentRect,True); DHRESULT(t_result,return); } itemSurf->Release(); bgSurf->Release(); xvars.mark_valid(valid); } void Wheel::setIndex(int p_item) { if (p_item < 0 || p_item >= numbitmaps) { ASSERT(0); ostrstream dbg; dbg << "Wheel::setIndex invalid index " << p_item << ends; COUTRESULT(dbg.str()); delete dbg.str(); m_item = 0; } // Only set m_dirty if changed. else if (m_item != p_item) { // If we are not animating, start a new animation. if (m_itemPrev == -1) { m_itemPrev = m_item; m_alpha = 0.0f; m_item = p_item; } // We were already animating, replace current, // leave prev alone. else { ASSERT(m_alpha < 1.0f); m_item = p_item; // Don't start the animation over, keep // m_alpha the same. } m_dirty = TRUE; } } void Wheel::setIndexByClassId(ClassId p_cid) { if (!(p_cid >= 0 && p_cid <= A_None)) { ostrstream dbg; dbg << "Wheel::setIndexByClassId, invalid cid " << p_cid << ends; COUTRESULT(dbg.str()); delete dbg.str(); setIndex(bitmapIndex[A_None]); } else { setIndex(bitmapIndex[p_cid]); } } void Wheel::setValueAtIndex(int p_value, int p_index) { if ((p_index < numbitmaps) && (p_index > -1)) { if (p_value != m_values[p_index]) { m_values[p_index]= p_value; } } m_dirty = TRUE; } void Wheel::setReadyAtIndex(Wheel::ReadyState p_state,int p_index) { if (p_index < numbitmaps && p_index > -1) { m_ready[p_index] = p_state; } else { ostrstream dbg; dbg << "setReadyAtIndex to " << p_index << " when max value is " << numbitmaps << ends; COUTRESULT(dbg.str()); delete dbg.str(); ASSERT(0); } m_dirty = TRUE; } int Wheel::getValueAtIndex(int p_index) { if ((p_index < numbitmaps) && (p_index > -1)) { return m_values[p_index]; } return -1; } BOOL Wheel::update(LPDIRECTDRAWSURFACE p_buffer,LocatorP l,Xvars &xvars, BOOL p_forceredraw) { if (m_dirty || p_forceredraw) { draw(p_buffer,l,xvars); m_dirty = FALSE; return TRUE; } return FALSE; } void Wheel::clock() { // If we are in the middle of an animation. if (m_itemPrev != -1) { ASSERT(m_alpha < 1.0f); m_alpha += WHEEL_ALPHA_INCR; // Completely onto the next animation frame. // m_itemPrev is now meaningless. if (m_alpha >= 1.0f) { m_alpha = 1.0f; m_itemPrev = -1; } m_dirty = TRUE; } } void* Wheel::compute_key(CMN_BITS_ID id) { // Make sure id fits in 16 bits. assert((0xffff0000 & id) == 0x0); return (void*)((S_MAN_WHEEL_NONCE << 24) | id); } void Wheel::gather_bitmaps(LocatorP l) { // Not really part of gather_bitmaps(), but part of general static // class-initialization. wheelSize.set(WHEEL_ITEM_WIDTH,WHEEL_ITEM_HEIGHT); // bitmapsids is now static sized array. #if 0 // First, just count the number of bitmaps. numbitmaps = 1; // Always have a slot for none. for (cId = 0; cId < A_None; cId++) { Boolean isItem; Boolean isWeapon; UINT bitmapId; l->get_item_info(isItem,isWeapon,bitmapId,cId); if (isWeapon || isItem) { numbitmaps++; } } bitmapids = new CMN_BITS_ID[numbitmaps]; assert(bitmapids); #endif // Now make bitmapIndex, the map from ClassId to bitmapids, // and fill bitmapids with the appropriate bitmap IDs. numbitmaps = 1; // Always have a slot for none. bitmapIndex[A_None] = 0; // "None" is always the first one. bitmapids[0] = IDB_NONE; // Loop over all the classIds. ClassId cId; for (cId = 0; cId < A_None; cId++) { bitmapIndex[cId] = -1; // means not there. Boolean isItem; Boolean isWeapon; UINT bitmapId; l->get_item_info(isItem,isWeapon,bitmapId,cId); if (isWeapon || isItem) { // Store this one. bitmapids[numbitmaps] = bitmapId; bitmapIndex[cId] = numbitmaps; numbitmaps++; } } // numbitmaps is now equal to the number of bitmaps found } HRESULT Wheel::draw(LPDIRECTDRAWSURFACE p_buffer,LocatorP l,Xvars &xvars) { if (!xvars.is_valid(valid)) { init_x(l,xvars,IX_INIT,NULL); } ASSERT(m_item >= 0 && m_item < numbitmaps); // No animation, just draw current item if (m_itemPrev == -1) { Pos surfPos; LPDIRECTDRAWSURFACE surf = xvars.m_surfaceManager->lookup(surfPos,compute_key(bitmapids[m_item])); HRESULT t_result = xvars.Blt(p_buffer,m_pos,surf,surfPos,wheelSize); DHRESULT(t_result,return t_result); t_result = drawText(p_buffer,xvars); return t_result; } // Draw some of the current item and some of the previous item. else { ASSERT(m_alpha < 1.0f && m_alpha >= 0.0f); // Convert [0,1] to pixels. int pixAlpha = (int)(m_alpha * WHEEL_ITEM_HEIGHT); // Draw current item in top of weapon wheel. if (pixAlpha > 0) { Pos surfPos; LPDIRECTDRAWSURFACE surf = xvars.m_surfaceManager->lookup(surfPos,compute_key(bitmapids[m_item])); // Draw rect of height pixAlpha. Size size; size.set(WHEEL_ITEM_WIDTH,pixAlpha); HRESULT t_result = xvars.Blt(p_buffer,m_pos, surf,Pos(surfPos.x,surfPos.y + WHEEL_ITEM_HEIGHT - pixAlpha), size); DHRESULT(t_result,return t_result); } // Draw previous item in bottom of weapon wheel. if (pixAlpha < WHEEL_ITEM_HEIGHT) { Pos surfPos; LPDIRECTDRAWSURFACE surf = xvars.m_surfaceManager->lookup(surfPos,compute_key(bitmapids[m_itemPrev])); // Draw rect of height (WHEEL_ITEM_HEIGHT - pixAlpha). Size size; size.set(WHEEL_ITEM_WIDTH,WHEEL_ITEM_HEIGHT - pixAlpha); HRESULT t_result = xvars.Blt(p_buffer,Pos(m_pos.x,m_pos.y + pixAlpha), surf,surfPos, size); DHRESULT(t_result,return t_result); } // Don't draw text if we are animating. } return DD_OK; } HRESULT Wheel::drawText(LPDIRECTDRAWSURFACE p_buffer,Xvars &xvars) { // Draw m_value in upper-right of wheel. // HDC t_pixhdc; if (!xvars.GetDC(p_buffer,&t_pixhdc)){ return DD_OK; //nothing to see here.. } CDC *t_dc = CDC::FromHandle(t_pixhdc); COLORREF t_cref; switch(m_ready[m_item]) { case READY_YES: // Green, weapon ready to shoot t_cref = RGB(0x00,0x7f,0x00); break; case READY_NO: // Red, weapon is not ready t_cref = RGB(0xff,0x00,0x00); break; case READY_UNDEFINED: // Black, for items t_cref = RGB(0x00,0x00,0x00); break; default: ASSERT(0); } CPen t_pen; COLORREF t_prevcolor = t_dc->SetTextColor(t_cref); t_dc->SelectStockObject(ANSI_VAR_FONT); t_dc->SelectStockObject(WHITE_PEN); t_dc->SetBkMode(TRANSPARENT); CString t_string; if (m_values[m_item] == PH_AMMO_UNLIMITED) { t_string = "*"; } else if (m_values[m_item] >= 0) { itoa(m_values[m_item],t_string.GetBuffer(25),10); t_string.ReleaseBuffer(); } else { ASSERT(0); } RECT t_textrect; SetRect(&t_textrect, m_pos.x,m_pos.y, m_pos.x + WHEEL_ITEM_WIDTH - 2,m_pos.y + WHEEL_ITEM_HEIGHT); t_dc->DrawText( t_string, // pointer to string to draw t_string.GetLength(), // string length, in characters &t_textrect, // pointer to structure with formatting dimensions DT_RIGHT // text-drawing flags ); t_dc->SetTextColor(t_prevcolor); HRESULT t_result = p_buffer->ReleaseDC(t_pixhdc); return t_result; } Size Wheel::wheelSize; XvarsValid Wheel::valid = XVARS_VALID_INIT; // Means not yet initialized. int Wheel::numbitmaps = -1; CMN_BITS_ID Wheel::bitmapids[A_CLASSES_NUM]; int Wheel::bitmapIndex[A_None + 1]; const CMN_BITS_ID Wheel::backgroundBits = IDB_WHEELBACKGROUND; xevil-2.02r2.orig/win32/xdata.cpp0100644000175000017500000012371307041422172016057 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "stdafx.h" #include "xdata.h" #include #include #include "ui.h" struct XEvilBitmapFileStruct { DWORD biSize; //size of structure LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; PALETTEENTRY m_palette[PALENTRIES]; }; //used to load bitmaps from resource class XPMSymbols { public: XPMSymbols(u_int valuesNeeded); void* newSymbols(); /* EFFECTS: Generate an encoding of a new set of symbols for an XPM color. Return value will never be NULL. */ void getSymbols(u_char ret[3],void* key); /* MODIFIES: ret */ /* EFFECTS: Make ret into a NULL-terminated string of length get_symbols_num() containing the symbols for the encoded XPM color. */ int get_symbols_num() {assert(symbolsNum < 3); return symbolsNum;} /* EFFECTS: Return the number of symbols used to represent the range of values passed in to the constructor. Always 1 or 2. */ static void* DUMMY; /* This is a special non-NULL value that is guaranteed never to be returned by newSymbols(). */ private: void generate_potential_symbols(); /* EFFECTS: Generate the list of potential symbols used for creating the XPM Colors. */ // Either 1 or 2. int symbolsNum; // The next set of symbols to use, index into potentialSymbols int gen[2]; // +1 is just to make debug printing easy. static u_char potSymbols[256 + 1]; static int potSymbolsNum; }; XPMSymbols::XPMSymbols(u_int valuesNeeded) { if (potSymbolsNum == -1) { generate_potential_symbols(); } assert(valuesNeeded > 0 && (int)valuesNeeded <= potSymbolsNum * potSymbolsNum); // Can do it with only one symbol. if ((int)valuesNeeded <= potSymbolsNum) { symbolsNum = 1; } // We'll need two of them. else { symbolsNum = 2; } // Initialize symbol generator. gen[0] = gen[1] = 0; } void* XPMSymbols::newSymbols() { // Doesn't assert if you ask for too many symbols. u_int ret = 0x0; if (symbolsNum == 1) { ret = (u_int)potSymbols[gen[0]]; gen[0]++; } else if (symbolsNum == 2) { ret = (u_int)potSymbols[gen[1]] << 8 | (u_int)potSymbols[gen[0]]; // Do two-digit counting. if (gen[0] == 255) { gen[0] = 0; gen[1]++; } else { gen[0]++; } } else { assert(0); } assert(ret); return (void*)ret; } void XPMSymbols::getSymbols(u_char ret[3],void* key) { u_int kkey = (u_int)key; ret[0] = (u_char)(kkey & 0xff); if (symbolsNum == 1) { ret[1] = '\0'; } else if (symbolsNum == 2) { ret[1] = (u_char)(kkey & 0xff00); ret[2] = '\0'; } else { assert(0); } // This wil never return XPMSymbols::DUMMY, which is 0xffffffff. } void XPMSymbols::generate_potential_symbols() { assert(potSymbolsNum == -1); potSymbolsNum = 0; int sym; for (sym = 0; sym < 256; sym++) { // Use all graphical symbols. if (isgraph(sym) && sym != '\"' && sym != '\\') { potSymbols[potSymbolsNum] = (u_char)sym; potSymbolsNum++; } } potSymbols[potSymbolsNum] = '\0'; COUTRESULT("XPM Symbols list is"); COUTRESULT((char*)potSymbols); } u_char XPMSymbols::potSymbols[256 + 1]; // Means not set yet. int XPMSymbols::potSymbolsNum = -1; void* XPMSymbols::DUMMY = (void*)0xffffffff; Xvars::Xvars() { m_arenaFont = NULL; m_lpDD = NULL; m_surfaceManager = NULL; m_pWinPalette = NULL; } Xvars::~Xvars() { for(int i=0;iRelease(); delete m_surfaceManager; if (m_pWinPalette){ delete []m_pWinPalette; } } LPDIRECTDRAWSURFACE Xvars::create_surface(DWORD width,DWORD height,DDCOLORKEY *colorkey) { if (!graphicsEnabled) { return NULL; } DDSURFACEDESC ddsd; HRESULT ddrval; LPDIRECTDRAWSURFACE psurf; /* * fill in surface desc */ memset( &ddsd, 0, sizeof( ddsd ) ); ddsd.dwSize = sizeof( ddsd ); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd.dwHeight = height; ddsd.dwWidth = width; ddrval = m_lpDD->CreateSurface( &ddsd, &psurf, NULL ); DHRESULT(ddrval,return NULL); // Set color key if specified. if (colorkey) { ddrval = psurf->SetColorKey(DDCKEY_SRCBLT,colorkey); DHRESULT(ddrval,return NULL); } return psurf; } // Use GDI SetPixel to do the color match. DWORD Xvars::write_read_color_match(IDirectDrawSurface *pdds, COLORREF rgb) { if (!graphicsEnabled) { return 0; } COLORREF rgbT; HDC hdc; DWORD dw = CLR_INVALID; DDSURFACEDESC ddsd; HRESULT hres; // // use GDI SetPixel to color match for us // if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK) { rgbT = GetPixel(hdc, 0, 0); // save current pixel value SetPixel(hdc, 0, 0, rgb); // set our value pdds->ReleaseDC(hdc); } // // now lock the surface so we can read back the converted color // ddsd.dwSize = sizeof(ddsd); while ((hres = pdds->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING) ; if (hres == DD_OK) { dw = *(DWORD *)ddsd.lpSurface; // get DWORD // For "True Color" we get an overflow with the // following logic, but in this case we don't want // to mask out any bits anyway. hardts if (ddsd.ddpfPixelFormat.dwRGBBitCount < 32) { dw &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount)-1; // mask it to bpp } pdds->Unlock(NULL); } // // now put the color that was there back. // if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK) { SetPixel(hdc, 0, 0, rgbT); pdds->ReleaseDC(hdc); } return dw; } int Xvars::single_color_match(PALETTEENTRY rgb, PALETTEENTRY *p_palette, int p_numentries) { if (!graphicsEnabled) { return 0; } int ret = -1; LONG minSum; for (int j = 0; j < p_numentries; j++) { LONG diff; LONG sumSquare = 0; // Switching components, Red <-> Blue. diff = abs(p_palette[j].peRed - rgb.peBlue); sumSquare += diff * diff; diff = abs(p_palette[j].peGreen - rgb.peGreen); sumSquare += diff * diff; diff = abs(p_palette[j].peBlue - rgb.peRed); sumSquare += diff * diff; // Found better match than existing one. if (ret == -1 || sumSquare < minSum) { ret = j; minSum = sumSquare; } // Perfect match. if (sumSquare == 0) { break; } } return ret; } DWORD Xvars::color_match(COLORREF rgb) { if (!graphicsEnabled) { return 0; } if (uses_palette()) { PALETTEENTRY t_entry; t_entry.peRed = GetRValue(rgb); t_entry.peGreen = GetGValue(rgb); t_entry.peBlue = GetBValue(rgb); return (DWORD)single_color_match(t_entry,m_palette.palentries,PALENTRIES); } // not color matched with palette, ignore palette else { // Changed from using m_lpprimarysurface to using m_lpbackbuffer because // of problems locking primary surface on some win95 machines. return write_read_color_match(m_lpbackbuffer,rgb); } } BOOL Xvars::color_match_palette(PALETTEENTRY *p_source, PALETTEENTRY *p_dest, int p_numentries) { for (int i = 0;i < p_numentries;i++) { BYTE t_index = single_color_match(p_dest[i],p_source,p_numentries); p_dest[i].peRed = t_index; } return TRUE; } Boolean Xvars::load_surface(LPDIRECTDRAWSURFACE p_surface,const CPoint &p_dest,UINT p_bitmapid) { if (!p_bitmapid || !p_surface) { return False; } if (uses_palette()) { return load_surface_palette(p_surface,p_dest,p_bitmapid); } else { return load_surface_no_palette(p_surface,p_dest,p_bitmapid,False); } } Boolean Xvars::load_surface_no_palette(LPDIRECTDRAWSURFACE p_surface,const CPoint &p_dest, UINT p_bitmapid,Boolean p_stretch) { if (!graphicsEnabled) { return False; } // Get DC to draw to p_surface HDC t_surfacedc; if (!GetDC(p_surface, &t_surfacedc)) return False; // Load bitmap and select it into t_dc CDC t_dc; t_dc.CreateCompatibleDC(CDC::FromHandle(t_surfacedc)); CBitmap t_bittemp; if (!t_bittemp.LoadBitmap(p_bitmapid)) { COUTRESULT("Xvars::load_surface_no_palette, LoadBitmap fails"); // should free t_pixmapdc p_surface->ReleaseDC(t_surfacedc); return False; } BITMAP t_bitmapInfo; t_bittemp.GetBitmap(&t_bitmapInfo); CSize t_size(t_bitmapInfo.bmWidth,t_bitmapInfo.bmHeight); t_dc.SelectObject(&t_bittemp); // Copy bitmap onto t_surfacedc if (p_stretch) { CDC::FromHandle(t_surfacedc)->StretchBlt( p_dest.x,p_dest.y, stretch_x(t_size.cx),stretch_y(t_size.cy), &t_dc, 0,0, t_size.cx,t_size.cy, SRCCOPY); } else { CDC::FromHandle(t_surfacedc)->BitBlt( p_dest.x,p_dest.y, t_size.cx,t_size.cy, &t_dc,0,0,SRCCOPY); } t_bittemp.DeleteObject(); // Free DC for surface p_surface->ReleaseDC(t_surfacedc); return TRUE; } Boolean Xvars::load_surface_palette(LPDIRECTDRAWSURFACE p_surface,const CPoint &p_dest, UINT p_bitmapid) { if (!graphicsEnabled) { return False; } // get a pointer to the bitmap resource. // then lock the surface using the destrect. HRSRC h = FindResource(NULL, MAKEINTRESOURCE(p_bitmapid), RT_BITMAP); if (!h) { return False; } // Load bitmap XEvilBitmapFileStruct *lpbi = (XEvilBitmapFileStruct *)LockResource(LoadResource(NULL, h)); BYTE *t_bitmapbits = ((BYTE *)lpbi) + sizeof(XEvilBitmapFileStruct); if (!m_pWinPalette && screenmode != Xvars::FULL_SCREEN_MODE) { m_pWinPalette = new PALETTEENTRY[PALENTRIES]; memcpy(m_pWinPalette,lpbi->m_palette,PALENTRIES * sizeof(PALETTEENTRY)); // match palette and shove results into the t_palette[x].pRed Xvars::color_match_palette(m_palette.palentries,m_pWinPalette,PALENTRIES); } else if (m_pWinPalette && screenmode == Xvars::FULL_SCREEN_MODE){ //must have switched modes. clean up old palette delete []m_pWinPalette; m_pWinPalette = NULL; } // each row is DWORD aligned. 32bit int t_widthbytes = lpbi->biWidth; while ((t_widthbytes & 3) != 0) { t_widthbytes++; } // Loop over all rows, from bottom to top. for (int y = lpbi->biHeight - 1; y >= 0; y--) { // The destination rect on p_surface corresponding to // one scan line. CRect t_destrect(p_dest.x, p_dest.y + y, p_dest.x + lpbi->biWidth, p_dest.y + y + 1); // Lock the destination row on the surface DDSURFACEDESC t_sdesc; t_sdesc.dwSize = sizeof(t_sdesc); HRESULT t_result; t_result = p_surface->Lock(t_destrect,&t_sdesc, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT|DDLOCK_WRITEONLY,NULL); // t_result = p_surface->Lock(NULL,&t_sdesc,0,NULL); DHRESULT(t_result,return False); // Copy bits from t_bitmapbits to t_surfacemem. BYTE* t_surfacemem = (BYTE *)t_sdesc.lpSurface; if (screenmode == Xvars::FULL_SCREEN_MODE) { memcpy(t_surfacemem,t_bitmapbits,lpbi->biWidth); } else { for (int x = 0; x < lpbi->biWidth; x++) { t_surfacemem[x] = m_pWinPalette[*(t_bitmapbits + x)].peRed; } } // Unlock the destination row. t_result = p_surface->Unlock(NULL); DHRESULT(t_result,return False); // Advance to the next row. t_bitmapbits += t_widthbytes; } return TRUE; } Boolean Xvars::read_bitmap_write_file(FILE *p_input, FILE *p_output) { if (!graphicsEnabled) { return False; } BITMAPFILEHEADER bmpfileheader_struct; unsigned char *bmpfileheader=(unsigned char *)&bmpfileheader_struct; BITMAPINFOHEADER bmpinfoheader_struct; unsigned char *bmpinfoheader=(unsigned char *)&bmpinfoheader_struct; #define GET_2B(array,offset) ((unsigned short) (unsigned char)(array[offset]) + \ (((unsigned short) (unsigned char)(array[offset+1])) << 8)) #define GET_4B(array,offset) ((long) (unsigned char)(array[offset]) + \ (((long) (unsigned char)(array[offset+1])) << 8) + \ (((long) (unsigned char)(array[offset+2])) << 16) + \ (((long) (unsigned char)(array[offset+3])) << 24)) long biWidth = 0; /* initialize to avoid compiler warning */ int bPad; DWORD t_index=0;/*index to stream*/ if (!read_param(p_input,bmpfileheader,14)) { return False;/*cant read fileheader*/ } //write new file fwrite(bmpfileheader,sizeof(BITMAPFILEHEADER),1,p_output); /* Read and verify the bitmap file header */ if (GET_2B(bmpfileheader,0) != 0x4D42) {/* 'BM' */ return False; } if (! read_param(p_input, bmpinfoheader, 4)) { return False;//cant read 4 bytes } if (bmpinfoheader_struct.biSize < 12 || bmpinfoheader_struct.biSize > 64) { return False; } if (! read_param( p_input, bmpinfoheader+4, (short)(bmpinfoheader_struct.biSize-4))) {/*casting here is ok beacause of check for >64 above*/ return False; } fwrite(bmpinfoheader, 1 ,bmpinfoheader_struct.biSize ,p_output); RGBQUAD t_rgbquad[PALENTRIES]; for (int i=0;i= 0; y--) { if (!read_param(p_input,t_row,(unsigned short)biWidth)) { /*cant read fileheader*/ delete [] t_row; return False; } for (int x = 0; x < bmpinfoheader_struct.biWidth; x++) { t_row[x] = t_palette[t_row[x]].peRed; } fwrite(t_row,1,biWidth,p_output); } delete [] t_row; return TRUE; } short Xvars::read_param(FILE *p_file,void *p_dest,unsigned short p_bytecount) { assert(p_file && p_dest); return fread(p_dest,1,p_bytecount,p_file); } Boolean Xvars::load_stretch_surface(LPDIRECTDRAWSURFACE p_surface, const CPoint &p_dest,UINT p_bitmapid) { // Does this fail for palettized stretched surfaces? return load_surface_no_palette(p_surface,p_dest,p_bitmapid,TRUE); } void Xvars::read_palette_from_id( UINT p_palid, PALETTEENTRY ppe[PALETTENTRIES] ) { // Don't to graphicsEnabled check, since no DirectDraw calls in here. WORD i; RGBQUAD pRgb; HRSRC hResInfo; HGLOBAL hResData; BYTE *pvRes; hResInfo = FindResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(p_palid), "PALETTE"); if (( hResInfo != NULL) && ((hResData = LoadResource(AfxGetInstanceHandle(), hResInfo)) != NULL) && ((pvRes = (BYTE *)LockResource(hResData)) != NULL)) { pvRes = pvRes+24; //we're heeeere! for( i=0; i < 256; i++ ) { memcpy(&pRgb,pvRes+i*4,4); ppe[i].peRed = pRgb.rgbBlue; ppe[i].peGreen = pRgb.rgbGreen; ppe[i].peBlue = pRgb.rgbRed; } } else { assert(False); } } Area Xvars::un_stretch_area(const Area &area) { Pos p = area.get_pos(); Size s = area.get_size(); Size newSize; newSize.set(s.width/m_stretch,s.height/m_stretch); Area ret(AR_RECT,Pos(p.x/m_stretch,p.y/m_stretch),newSize); return ret; } Area Xvars::stretch_area(const Area &area) { Pos p = area.get_pos(); Size s = area.get_size(); Size newSize; newSize.set(s.width * m_stretch,s.height * m_stretch); Area ret(AR_RECT,Pos(p.x * m_stretch,p.y * m_stretch),newSize); return ret; } void Xvars::generate_mask_from_pixmap(LPDIRECTDRAWSURFACE maskSurf,const Pos& maskoffset, LPDIRECTDRAWSURFACE pixmapSurf,const Pos& pixmapoffset, const Size& size) { if (!graphicsEnabled) { return; } // Lock mask surface DDSURFACEDESC maskDesc; maskDesc.dwSize = sizeof(maskDesc); HRESULT hres; hres = maskSurf->Lock(NULL,&maskDesc,0,NULL); // Lock pixmap surface DDSURFACEDESC pixmapDesc; pixmapDesc.dwSize = sizeof(pixmapDesc); if (hres == DD_OK) { hres = pixmapSurf->Lock(NULL,&pixmapDesc,0,NULL); if (hres != DD_OK) { // Still want to unlock the mask maskSurf->Unlock(NULL); COUTRESULT("failed to lock pixmap"); } } else { COUTRESULT("failed to lock mask"); } DHRESULT(hres,return); // Start at top of rectangle. BYTE *maskBits = (BYTE*)maskDesc.lpSurface + maskDesc.lPitch * maskoffset.y + maskoffset.x * bytes_per_pixel(); BYTE *pixmapBits = (BYTE*)pixmapDesc.lpSurface + pixmapDesc.lPitch * pixmapoffset.y + pixmapoffset.x * bytes_per_pixel(); for (int y = 0; y < size.height; y++) { // Start at beginning of this row. BYTE *maskP = maskBits; BYTE *pixmapP = pixmapBits; for (int x = 0; x < size.width; x++) { // Copy pink as pink. if (pixel_equals(pixmapP,(BYTE*)&XVARS_COLORKEY.dwColorSpaceLowValue, bytes_per_pixel())) { pixel_set(maskP,(BYTE*)&XVARS_COLORKEY.dwColorSpaceLowValue,bytes_per_pixel()); } // Copy all other real data as white. else { pixel_set(maskP,(BYTE*)&XVARS_COLORKEY_MASKS.dwColorSpaceLowValue,bytes_per_pixel()); } maskP += bytes_per_pixel(); pixmapP += bytes_per_pixel(); } maskBits += maskDesc.lPitch; pixmapBits += pixmapDesc.lPitch; } maskSurf->Unlock(NULL); pixmapSurf->Unlock(NULL); } void Xvars::generate_pixmap_from_transform(LPDIRECTDRAWSURFACE dest,const Pos& destOffset, LPDIRECTDRAWSURFACE src,const Pos& srcOffset, const Size& srcSize, LPDIRECTDRAWSURFACE scratch, const TransformType* transforms,int tNum) { if (!graphicsEnabled) { return; } assert(tNum <= 2); switch(tNum) { // Just copy pixels src to dest. case 0: Blt(dest,destOffset, src,srcOffset, srcSize); break; // Transform from src to dest. case 1: gen_pix_from_trans(dest,destOffset,src,srcOffset,srcSize,transforms[0]); break; // Transform from src to scratch, then scratch to dest. case 2: gen_pix_from_trans(scratch,Pos(0,0),src,srcOffset,srcSize,transforms[0]); Size scratchSize = Transform2D::apply(transforms[0],srcSize); gen_pix_from_trans(dest,destOffset,scratch,Pos(0,0),scratchSize,transforms[1]); break; default: assert(0); } } void Xvars::gen_pix_from_trans(LPDIRECTDRAWSURFACE dest,const Pos& destOffset, LPDIRECTDRAWSURFACE src,const Pos& srcOffset, const Size& srcSize, TransformType transform) { if (!graphicsEnabled) { return; } HRESULT hres; // Lock source surface. DDSURFACEDESC srcDesc; srcDesc.dwSize = sizeof(srcDesc); hres = src->Lock(NULL, &srcDesc, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL); DHRESULT(hres,return); // Lock dest surface if different than source, else reuse source pointer. BYTE *destRoot = NULL; LONG destlPitch = 0; if (src != dest) { DDSURFACEDESC destDesc; destDesc.dwSize = sizeof(destDesc); hres = dest->Lock(NULL, &destDesc, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL); // Careful to free src if dest lock fails. DHRESULT(hres,src->Unlock(NULL); return); destRoot = (BYTE*)destDesc.lpSurface; destlPitch = destDesc.lPitch; } else { destRoot = (BYTE*)srcDesc.lpSurface; destlPitch = srcDesc.lPitch; } // Stretched coordinates. We really should use a different type than "Pos". Pos srcPos; for (srcPos.y = 0; srcPos.y < srcSize.height; srcPos.y++) { // Start at beginning of this row. BYTE* srcPix = (BYTE*)srcDesc.lpSurface + srcDesc.lPitch * (srcOffset.y + srcPos.y) + bytes_per_pixel() * srcOffset.x; for (srcPos.x = 0; srcPos.x < srcSize.width; srcPos.x++) { Pos destPos = Transform2D::apply(transform,srcPos,srcSize); BYTE* destPix = destRoot + destlPitch * (destOffset.y + destPos.y) + bytes_per_pixel() * (destOffset.x + destPos.x); pixel_set(destPix,srcPix,bytes_per_pixel()); srcPix += bytes_per_pixel(); } } // Unlock surfaces. src->Unlock(NULL); if (src != dest) { dest->Unlock(NULL); } } BYTE Xvars::xpm_map_pixels(BYTE* srcPix,int srcPixNum,Boolean) { // Just sample upper-left corner. assert(srcPixNum > 0); return srcPix[0]; } CFont* Xvars::select_arena_font(CDC *p_cdc) { if (m_arenaFont) { return p_cdc->SelectObject(m_arenaFont); } else { return (CFont*)p_cdc->SelectStockObject(ANSI_VAR_FONT); } } HRESULT Xvars::color_fill(LPDIRECTDRAWSURFACE surface,const CRect &rect, DWORD color,Boolean fast) { if (!graphicsEnabled) { return DD_OK; } // Use DDBLT_COLORFILL if (fast) { DDBLTFX t_DDBltFx; memset(&t_DDBltFx,0,sizeof(DDBLTFX)); t_DDBltFx.dwSize = sizeof(DDBLTFX); t_DDBltFx.dwFillColor = color; HRESULT t_result = m_lpbackbuffer->Blt((RECT*)(const RECT*)rect,NULL,NULL,DDBLT_COLORFILL,&t_DDBltFx); DHRESULT(t_result,;); return t_result; } // else do it ourselves because DDBLT_COLORFILL doesn't work on some machines. DDSURFACEDESC surfDesc; surfDesc.dwSize = sizeof(surfDesc); // Lock entire surface, could just lock rect. HRESULT t_result; t_result = surface->Lock(NULL,&surfDesc, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT|DDLOCK_WRITEONLY, NULL); DHRESULT(t_result,return t_result); int bytesPerPixel = bytes_per_pixel(); for (int y = rect.top; y < rect.bottom; y++) { int x = rect.left; BYTE *p = (BYTE*)surfDesc.lpSurface + y * surfDesc.lPitch + x * bytesPerPixel; for (; x < rect.right; x++, p += bytesPerPixel) { pixel_set(p,(BYTE*)&color,bytesPerPixel); } } surface->Unlock(NULL); return DD_OK; } HRESULT Xvars::Blt(LPDIRECTDRAWSURFACE dest, DWORD destX,DWORD destY, LPDIRECTDRAWSURFACE src, LPRECT srcRect, Boolean requestSrcColorKey, LPDIRECTDRAWCLIPPER clipper) { if (!graphicsEnabled) { return DD_OK; } Boolean doSrcColorKey = requestSrcColorKey; // Renenable this code to turn off src key bltting in reduceDraw mode. #if 0 if (get_reduce_draw()) { doSrcColorKey = False; } #endif // Some bounds checking. // Only checking dest, and only checking for negative numbers. // DirectDraw seems to work ok for going too far off to the // right or bottom on the dest surfaces. // (We should probably check this as well.) if (destX < 0) { srcRect->left -= destX; if (srcRect->left >= srcRect->right) { // Rectangle completely clipped. return DD_OK; } destX = 0; } if (destY < 0) { srcRect->top -= destY; if (srcRect->top >= srcRect->bottom) { // Rectangle completely clipped. return DD_OK; } destY = 0; } // Set clipper if supplied. if (clipper) { HRESULT result = dest->SetClipper(clipper); if (result != DD_OK) { return result; } } // Call IDirectDrawSurface::Blt, perhaps we should use BltFast instead. HRESULT t_result = dest->Blt(CRect(destX,destY, destX + srcRect->right - srcRect->left, destY + srcRect->bottom - srcRect->top), src,srcRect, doSrcColorKey ? DDBLT_KEYSRC : NULL, NULL); if (t_result != DD_OK) { return t_result; } return t_result; } HRESULT Xvars::Blt(LPDIRECTDRAWSURFACE dest, const Pos &destPos, LPDIRECTDRAWSURFACE src, const Pos &srcPos, const Size &size, Boolean srcColorKey, LPDIRECTDRAWCLIPPER clipper) { return Blt(dest,destPos.x,destPos.y,src, CRect(srcPos.x,srcPos.y,srcPos.x + size.width,srcPos.y + size.height), srcColorKey,clipper); } Boolean Xvars::GetDC(LPDIRECTDRAWSURFACE surf, HDC *dc) { if (!surf || !dc || !graphicsEnabled) return False; HRESULT t_result = surf->GetDC(dc); DHRESULT(t_result,return False); return True; } // This method is huge. Cut it into smaller pieces, e.g. write_xpm_header, // write_xpm_pixels, etc. Boolean Xvars::write_xpm_file(const char* filename,const char* varName, LPDIRECTDRAWSURFACE surf, const Area& area,const DDCOLORKEY* cKey, Boolean halfSize) { if (!graphicsEnabled) { return False; } // Check that we are in 8-bit, indexed color mode. assert(uses_palette()); // Only handle one transparent color. if (cKey) { assert(cKey->dwColorSpaceLowValue == cKey->dwColorSpaceHighValue); } Boolean ret = True; IDictIterator* iter = NULL; const int srcPixMax = 2 * 2; // Lock source DirectDraw surface. Pos offset = area.get_pos(); Size size = area.get_size(); CRect srcRect(offset.x,offset.y,offset.x + size.width,offset.y + size.height); DDSURFACEDESC sDesc; memset(&sDesc,0,sizeof(sDesc)); sDesc.dwSize = sizeof(sDesc); HRESULT result = surf->Lock(NULL,&sDesc,0,NULL); DHRESULT(result,return False); // Hash from (color index in DirectDraw surface) --> // (void* generated from XPMSymbols::newSymbols()) IDictionary* hash = HashTable_factory(); // First walk over the rectangle and get a list of all the colors used, put // a dummy entry in the hash table for each color. Can't put a real // XPMSymbols symbol encoding as the value yet, since we don't know whether // we need 1 or 2 symbols per color yet. Pos srcPos; // If we have a color key, make sure the XPM file has a color entry for the // transparent color ("None"), even if the transparent color is never // actually used in the pixmap, e.g. blood_4. This is necessary on X11 to // make sure the mask can be generated. if (cKey) { hash->put((void*)cKey->dwColorSpaceLowValue,XPMSymbols::DUMMY); } // Code duplication, should make some sort of iterator for walking over the // pixels of a rectangle in a DirectDraw surface. for (srcPos.y = 0; srcPos.y < size.height; srcPos.y++) { // Start at beginning of this row. BYTE* srcPix = (BYTE*)sDesc.lpSurface + sDesc.lPitch * (offset.y + srcPos.y) + bytes_per_pixel() * offset.x; for (srcPos.x = 0; srcPos.x < size.width; srcPos.x++) { void* key = (void*)*srcPix; // Ok to put value over existing value, see IDictionary::put(). // The hash table will take care of duplicates for us. hash->put(key,XPMSymbols::DUMMY); srcPix += bytes_per_pixel(); // Will always be 1. } } // Count number of distinct colors actually used. // This lets us know how many symbols needed per color in the XPM file. int numColors = hash->length(); // Keeps track of all the symbols used in the XPM image we are creating. XPMSymbols symbols(numColors); // Open output text file. FILE* fp = fopen(filename,"w"); if (fp == NULL) { ret = False; goto writeXpmCleanup; } // We are being real cheap here, only checking that fprintf works for the // first and last lines written. Not too bad a hack since nothing bad // really happens with the extra calls to fprintf. // Write header info. if (fprintf(fp,"/* XPM */\n") < 0) { ret = False; goto writeXpmCleanup; } fprintf(fp,"static char *%s[] = {\n",varName); fprintf(fp," /* width height ncolors chars_per_pixel */\n"); // Write half the size if halfSize is True. fprintf(fp," \"%d %d %d %d 0 0\",\n", halfSize ? (size.width >> 1) : size.width, halfSize ? (size.height >> 1) : size.height, numColors,symbols.get_symbols_num()); // TODO: If halfSize is True, we might not be using all the colors, // could optimize. // Write out all the colors. fprintf(fp," /* colors */\n"); iter = hash->iterate(); void* key; void* value; while (value = iter->next(key)) { // The index into the palette. BYTE index = (BYTE)key; // Create a unique set of symbols for the color if it doesn't already // have one. A little funny to modify the hash table while we are // iterating its entries, but we're safe because we are just modifying // an existing association. if (value == XPMSymbols::DUMMY) { value = symbols.newSymbols(); void* oldValue = hash->put(key,value); assert(oldValue == XPMSymbols::DUMMY); } // Get the symbols for the color. u_char syms[3]; symbols.getSymbols(syms,value); // Write the line for one color in the XPM file. // // Transparent color. if (cKey && index == cKey->dwColorSpaceLowValue) { fprintf(fp," \"%s c None\",\n",syms); } // Normal color, write RGB triplet. else { PALETTEENTRY* pEntry = &m_palette.palentries[index]; fprintf(fp," \"%s c #%02x%02x%02x\",\n",syms, pEntry->peRed,pEntry->peGreen,pEntry->peBlue); } } delete iter; // If writing bitmap of half the size, jump by a 2x2 square at a time. Size delta; if (halfSize) { assert(size.width % 2 == 0 && size.height % 2 == 0); delta.set(2,2); } else { delta.set(1,1); } // Write out the pixel data. fprintf(fp," /* pixels */\n"); // Code duplication, should make some sort of iterator for walking over the // pixels of a rectangle in a DirectDraw surface. for (srcPos.y = 0; srcPos.y < size.height; srcPos.y += delta.height) { fprintf(fp," \""); // Start at beginning of this row. BYTE* srcPix = (BYTE*)sDesc.lpSurface + sDesc.lPitch * (offset.y + srcPos.y) + bytes_per_pixel() * offset.x; for (srcPos.x = 0; srcPos.x < size.width; srcPos.x += delta.width) { // Gather all the pixels in a square of size delta into srcPixels. BYTE srcPixels[srcPixMax]; int srcPixNum = 0; Size seekPos; for (seekPos.height = 0; seekPos.height < delta.height; seekPos.height++) { BYTE* seekPix = srcPix + sDesc.lPitch * seekPos.height; for (seekPos.width = 0; seekPos.width < delta.width; seekPos.width++) { srcPixels[srcPixNum] = *seekPix; srcPixNum++; seekPix += bytes_per_pixel(); } } // Possibly reduce the pixels BYTE mappedPix = xpm_map_pixels(srcPixels,srcPixNum,halfSize); // Lookup the symbols for the destination pixel. void* value = hash->get((void*)mappedPix); assert(value); // Write out one pixel. u_char syms[3]; symbols.getSymbols(syms,value); fprintf(fp,"%s",syms); srcPix += delta.width * bytes_per_pixel(); } // Done with this row of pixels. fprintf(fp,"\",\n"); } // Finish up writing XPM file. if (fprintf(fp,"};\n") < 0) { ret = False; goto writeXpmCleanup; } fclose(fp); // Clean up. // Using goto as poor-man's exception handling. writeXpmCleanup: delete hash; surf->Unlock(NULL); return ret; } // if fails, increments valid and returns False BOOL Xvars::hresultSuccess(HRESULT p_result) { interpretDHresult(p_result); if (DD_OK == p_result) { return TRUE; } if (DDERR_SURFACELOST == p_result) { valid++; } return False; } void Xvars::DHresultRecover(HRESULT p_result) { if (!graphicsEnabled) { COUTRESULT("Warning: DHRESULT called when graphics are disabled."); } if (p_result == DD_OK) { return; } // Print out the error. interpretDHresult(p_result); // Should have been set by now. assert(errorRecovery); // Error recovery logic disabled. #if 0 // Attempt to recover, ask the errorRecovery object if we should disable // graphics or force it to be enabled. graphicsEnabled = errorRecovery->attemptRecovery(); #endif } void Xvars::interpretDHresult(HRESULT p_result) { if (!DebugInfo::on()) { return; } CString t_string; switch (p_result) { case DD_OK: return; case DDERR_ALREADYINITIALIZED: t_string="DDERR_ALREADYINITIALIZED"; break; case DDERR_CANNOTDETACHSURFACE: t_string="DDERR_CANNOTDETACHSURFACE"; break; case DDERR_CURRENTLYNOTAVAIL: t_string="DDERR_CURRENTLYNOTAVAIL"; break; case DDERR_EXCEPTION: t_string="DDERR_EXCEPTION"; break; case DDERR_GENERIC: t_string="DDERR_GENERIC"; break; case DDERR_HEIGHTALIGN : t_string="DDERR_HEIGHTALIGN "; break; case DDERR_INCOMPATIBLEPRIMARY : t_string="DDERR_INCOMPATIBLEPRIMARY "; break; case DDERR_INVALIDCAPS : t_string="DDERR_INVALIDCAPS "; break; case DDERR_INVALIDCLIPLIST : t_string="DDERR_INVALIDCLIPLIST "; break; case DDERR_INVALIDMODE : t_string="DDERR_INVALIDMODE "; break; case DDERR_INVALIDOBJECT : t_string="DDERR_INVALIDOBJECT "; break; case DDERR_INVALIDPARAMS : t_string="DDERR_INVALIDPARAMS "; break; case DDERR_INVALIDPIXELFORMAT : t_string="DDERR_INVALIDPIXELFORMAT "; break; case DDERR_INVALIDRECT : t_string="DDERR_INVALIDRECT "; break; case DDERR_LOCKEDSURFACES : t_string="DDERR_LOCKEDSURFACES "; break; case DDERR_NO3D : t_string="DDERR_NO3D "; break; case DDERR_NOALPHAHW : t_string="DDERR_NOALPHAHW "; break; case DDERR_NOCLIPLIST : t_string="DDERR_NOCLIPLIST "; break; case DDERR_NOCOLORCONVHW : t_string="DDERR_NOCOLORCONVHW "; break; case DDERR_NOCOOPERATIVELEVELSET : t_string="DDERR_NOCOOPERATIVELEVELSET "; break; case DDERR_NOCOLORKEY : t_string="DDERR_NOCOLORKEY "; break; case DDERR_NOCOLORKEYHW : t_string="DDERR_NOCOLORKEYHW "; break; case DDERR_NODIRECTDRAWSUPPORT : t_string="DDERR_NODIRECTDRAWSUPPORT "; break; case DDERR_NOEXCLUSIVEMODE : t_string="DDERR_NOEXCLUSIVEMODE "; break; case DDERR_NOFLIPHW : t_string="DDERR_NOFLIPHW "; break; case DDERR_NOGDI : t_string="DDERR_NOGDI "; break; case DDERR_NOMIRRORHW : t_string="DDERR_NOMIRRORHW "; break; case DDERR_NOTFOUND : t_string="DDERR_NOTFOUND "; break; case DDERR_NOOVERLAYHW : t_string="DDERR_NOOVERLAYHW "; break; case DDERR_NORASTEROPHW : t_string="DDERR_NORASTEROPHW "; break; case DDERR_NOROTATIONHW : t_string="DDERR_NOROTATIONHW "; break; case DDERR_NOSTRETCHHW : t_string="DDERR_NOSTRETCHHW "; break; case DDERR_NOT4BITCOLOR : t_string="DDERR_NOT4BITCOLOR "; break; case DDERR_NOT4BITCOLORINDEX : t_string="DDERR_NOT4BITCOLORINDEX "; break; case DDERR_NOT8BITCOLOR : t_string="DDERR_NOT8BITCOLOR "; break; case DDERR_NOTEXTUREHW : t_string="DDERR_NOTEXTUREHW "; break; case DDERR_NOVSYNCHW : t_string="DDERR_NOVSYNCHW "; break; case DDERR_NOZBUFFERHW : t_string="DDERR_NOZBUFFERHW "; break; case DDERR_NOZOVERLAYHW : t_string="DDERR_NOZOVERLAYHW "; break; case DDERR_OUTOFCAPS : t_string="DDERR_OUTOFCAPS "; break; case DDERR_OUTOFMEMORY : t_string="DDERR_OUTOFMEMORY "; break; case DDERR_OUTOFVIDEOMEMORY : t_string="DDERR_OUTOFVIDEOMEMORY "; break; case DDERR_OVERLAYCANTCLIP : t_string="DDERR_OVERLAYCANTCLIP "; break; case DDERR_OVERLAYCOLORKEYONLYONEACTIVE : t_string="DDERR_OVERLAYCOLORKEYONLYONEACTIVE "; break; case DDERR_PALETTEBUSY : t_string="DDERR_PALETTEBUSY "; break; case DDERR_COLORKEYNOTSET : t_string="DDERR_COLORKEYNOTSET "; break; case DDERR_SURFACEALREADYATTACHED : t_string="DDERR_SURFACEALREADYATTACHED "; break; case DDERR_SURFACEALREADYDEPENDENT : t_string="DDERR_SURFACEALREADYDEPENDENT "; break; case DDERR_SURFACEBUSY : t_string="DDERR_SURFACEBUSY "; break; case DDERR_CANTLOCKSURFACE : t_string="DDERR_CANTLOCKSURFACE "; break; case DDERR_SURFACEISOBSCURED : t_string="DDERR_SURFACEISOBSCURED "; break; case DDERR_SURFACELOST : t_string="DDERR_SURFACELOST "; break; case DDERR_SURFACENOTATTACHED : t_string="DDERR_SURFACENOTATTACHED "; break; case DDERR_TOOBIGHEIGHT : t_string="DDERR_TOOBIGHEIGHT "; break; case DDERR_TOOBIGSIZE : t_string="DDERR_TOOBIGSIZE "; break; case DDERR_TOOBIGWIDTH : t_string="DDERR_TOOBIGWIDTH "; break; case DDERR_UNSUPPORTED : t_string="DDERR_UNSUPPORTED "; break; case DDERR_UNSUPPORTEDFORMAT : t_string="DDERR_UNSUPPORTEDFORMAT "; break; case DDERR_UNSUPPORTEDMASK : t_string="DDERR_UNSUPPORTEDMASK "; break; case DDERR_VERTICALBLANKINPROGRESS : t_string="DDERR_VERTICALBLANKINPROGRESS "; break; case DDERR_WASSTILLDRAWING : t_string="DDERR_WASSTILLDRAWING "; break; case DDERR_XALIGN : t_string="DDERR_XALIGN "; break; case DDERR_INVALIDDIRECTDRAWGUID : t_string="DDERR_INVALIDDIRECTDRAWGUID "; break; case DDERR_DIRECTDRAWALREADYCREATED : t_string="DDERR_DIRECTDRAWALREADYCREATED "; break; case DDERR_NODIRECTDRAWHW : t_string="DDERR_NODIRECTDRAWHW "; break; case DDERR_PRIMARYSURFACEALREADYEXISTS : t_string="DDERR_PRIMARYSURFACEALREADYEXISTS "; break; case DDERR_NOEMULATION : t_string="DDERR_NOEMULATION "; break; case DDERR_REGIONTOOSMALL : t_string="DDERR_REGIONTOOSMALL "; break; case DDERR_CLIPPERISUSINGHWND : t_string="DDERR_CLIPPERISUSINGHWND "; break; case DDERR_NOCLIPPERATTACHED : t_string="DDERR_NOCLIPPERATTACHED "; break; case DDERR_NOHWND : t_string="DDERR_NOHWND "; break; case DDERR_HWNDSUBCLASSED : t_string="DDERR_HWNDSUBCLASSED "; break; case DDERR_HWNDALREADYSET : t_string="DDERR_HWNDALREADYSET "; break; case DDERR_NOPALETTEATTACHED : t_string="DDERR_NOPALETTEATTACHED "; break; case DDERR_NOPALETTEHW : t_string="DDERR_NOPALETTEHW "; break; case DDERR_BLTFASTCANTCLIP : t_string="DDERR_BLTFASTCANTCLIP "; break; case DDERR_NOBLTHW : t_string="DDERR_NOBLTHW "; break; case DDERR_NODDROPSHW : t_string="DDERR_NODDROPSHW "; break; case DDERR_OVERLAYNOTVISIBLE : t_string="DDERR_OVERLAYNOTVISIBLE "; break; case DDERR_NOOVERLAYDEST : t_string="DDERR_NOOVERLAYDEST "; break; case DDERR_INVALIDPOSITION : t_string="DDERR_INVALIDPOSITION "; break; case DDERR_NOTAOVERLAYSURFACE : t_string="DDERR_NOTAOVERLAYSURFACE "; break; case DDERR_EXCLUSIVEMODEALREADYSET : t_string="DDERR_EXCLUSIVEMODEALREADYSET "; break; case DDERR_NOTFLIPPABLE : t_string="DDERR_NOTFLIPPABLE "; break; case DDERR_CANTDUPLICATE : t_string="DDERR_CANTDUPLICATE "; break; case DDERR_NOTLOCKED : t_string="DDERR_NOTLOCKED "; break; case DDERR_CANTCREATEDC : t_string="DDERR_CANTCREATEDC "; break; case DDERR_NODC : t_string="DDERR_NODC "; break; case DDERR_WRONGMODE : t_string="DDERR_WRONGMODE "; break; case DDERR_IMPLICITLYCREATED : t_string="DDERR_IMPLICITLYCREATED "; break; case DDERR_NOTPALETTIZED : t_string="DDERR_NOTPALETTIZED "; break; case DDERR_UNSUPPORTEDMODE : t_string="DDERR_UNSUPPORTEDMODE "; break; case DDERR_NOMIPMAPHW : t_string="DDERR_NOMIPMAPHW "; break; case DDERR_INVALIDSURFACETYPE : t_string="DDERR_INVALIDSURFACETYPE "; break; case DDERR_DCALREADYCREATED : t_string="DDERR_DCALREADYCREATED "; break; case DDERR_CANTPAGELOCK : t_string="DDERR_CANTPAGELOCK "; break; case DDERR_CANTPAGEUNLOCK : t_string="DDERR_CANTPAGEUNLOCK "; break; case DDERR_NOTPAGELOCKED : t_string="DDERR_NOTPAGELOCKED "; break; } DebugInfo::print(t_string); } Boolean Xvars::reduceDraw = False; IErrorRecovery* Xvars::errorRecovery = NULL; Boolean Xvars::graphicsEnabled = False; xevil-2.02r2.orig/win32/xevil.cpp0100644000175000017500000002002507041512136016075 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // XEvil.cpp : Defines the class behaviors for the application. // #include "stdafx.h" #include "XEvil.h" #include "game.h" #include "mmsystem.h" /* #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif */ #include "aboutdialog.h" #include "timedlg.h" #include "l_agreement.h" ///////////////////////////////////////////////////////////////////////////// // CXEvilApp BEGIN_MESSAGE_MAP(CXEvilApp, CWinApp) //{{AFX_MSG_MAP(CXEvilApp) //}}AFX_MSG_MAP // Standard file based document commands // ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) // ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CXEvilApp construction CXEvilApp::CXEvilApp() :m_game(NULL) { // TODO: add construction code here, // Place all significant initialization in InitInstance } CXEvilApp::~CXEvilApp() { if (m_game) delete m_game; } ///////////////////////////////////////////////////////////////////////////// // The one and only CXEvilApp object CXEvilApp theApp; ///////////////////////////////////////////////////////////////////////////// // CXEvilApp initialization #define MAX_COMMANDLINEPARAMETERS 50 void CXEvilApp::prepareCommandLine(const CString &p_commandline,int &p_argc, char **&p_argv) { p_argv=new char *[MAX_COMMANDLINEPARAMETERS]; p_argc=1; p_argv[0]="";//leave first one empty int t_index; CString t_string; for (t_index=0;t_index= latest) { return FALSE; } #endif return TRUE; } class TurnStarter: public ITurnStarter { public: TurnStarter(int &timer) : m_timer(timer) { } /* EFFECTS: Set timer to be the start time for the turn when startTurn() is called. */ virtual void start_turn() { m_timer = timeGetTime(); } private: int &m_timer; }; BOOL CXEvilApp::InitInstance() { // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. int t_argc; char **t_argv; prepareCommandLine(m_lpCmdLine,t_argc,t_argv); int t_fullscreencmdlineindex=-1; BOOL t_fullscreenmode=TRUE; int t_reducedrawindex=-1; if (FAILED(CoInitialize(NULL))) { AfxMessageBox("Error loading COM"); return FALSE; } for (int i=0;i t_wndlist; srand((unsigned int)time(NULL)); WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2, 0); err = WSAStartup(wVersionRequested, &wsaData); m_game = new Game(&t_argc,t_argv); m_game->getWindowList(t_wndlist); if (clock()== -1) assert (FALSE); long total = 0; long events = 0; CMN_EVENTDATA t_event;//for messasge reception int t_timer; BOOL t_gameover=FALSE; // TurnStarter exists so Game::yield() can decide when to start timing the next turn. TurnStarter turnStarter(t_timer); // Start the first turn. turnStarter.start_turn(); // Main loop while (!t_gameover) { // wait till it's time to wake up int t_wndCount = m_game->getWindowList(t_wndlist); Quanta quanta = m_game->get_quanta(); // Clock the game total++; POSITION t_pos; m_game->pre_clock(); // If there is no UI at all, don't check for events. if (t_wndCount != -1) { for( t_pos = t_wndlist.GetHeadPosition(); t_pos != NULL; ) { CWnd *t_wnd=t_wndlist.GetNext(t_pos); assert(t_wnd); t_event.m_parent=t_wnd->m_hWnd; while (PeekMessage(&t_event.m_event,t_wnd->m_hWnd,NULL,NULL,PM_REMOVE)) { if (TranslateMessage(&t_event.m_event)) break; if (!m_game->process_event(0,t_event)) break; } } } m_game->post_clock(); if (m_game->show_stats() && !(total % Game::REPORT_TIME)) { cout << "total:" << total << " events:" << events << " percent:" << ((float)events / (float) total) << endl; } if (m_game->quit_game()) { t_gameover = TRUE; break; } m_game->yield(t_timer,quanta,&turnStarter); } for (i=1;i #include "XEvilServerStatus.h" ATOM CXEvilServerStatus::atom; CXEvilServerStatus::CXEvilServerStatus() { m_close=FALSE; m_togglestate=SMALL; } IMPLEMENT_DYNAMIC( CXEvilServerStatus, CWnd) BEGIN_MESSAGE_MAP(CXEvilServerStatus, CWnd) //{{AFX_MSG_MAP(CXEvilServerStatus) ON_BN_CLICKED(IDC_DISPLAY, OnDisplay) ON_BN_CLICKED(IDC_STARTSERVER, OnStartserver) ON_BN_CLICKED(IDC_STOPSERVER, OnStopserver) ON_BN_CLICKED(IDC_XEVIL3, OnSettings) ON_WM_CLOSE() ON_WM_PAINT() ON_WM_SETCURSOR( ) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CXEvilServerStatus message handlers void CXEvilServerStatus::OnLButtonDown( UINT nFlags, CPoint point ) { } void CXEvilServerStatus::OnLButtonUp( UINT nFlags, CPoint point ) { } void CXEvilServerStatus::OnDisplay() { // TODO: Add your control notification handler code here } void CXEvilServerStatus::OnStartserver() { // TODO: Add your control notification handler code here } void CXEvilServerStatus::OnStopserver() { // TODO: Add your control notification handler code here } void CXEvilServerStatus::OnSettings() { // TODO: Add your control notification handler code here } void CXEvilServerStatus::OnClose( ) { m_close=TRUE; CWnd::OnClose(); } BOOL CXEvilServerStatus::Create(CRect &p_rect,CWnd *p_parent) { HWND t_hwnd(NULL); if (p_parent) t_hwnd=p_parent->m_hWnd; WNDCLASSEX wndClass; m_cursor=theApp.LoadCursor(IDC_XEVIL_SERVER); if (!CXEvilServerStatus::atom) { wndClass.cbSize=sizeof(WNDCLASSEX); wndClass.style=CS_BYTEALIGNCLIENT|CS_VREDRAW | CS_HREDRAW; wndClass.lpfnWndProc=::DefWindowProc; wndClass.cbClsExtra=0; wndClass.cbWndExtra=0; wndClass.hInstance=AfxGetInstanceHandle(); wndClass.hIcon=theApp.LoadIcon(IDR_XEVIL); wndClass.hCursor=m_cursor; wndClass.hbrBackground=NULL; wndClass.lpszMenuName=NULL; wndClass.lpszClassName="XEvilServerViewPortClass"; wndClass.hIconSm=theApp.LoadIcon(IDR_XEVIL_SMALL); CXEvilServerStatus::atom=::RegisterClassEx(&wndClass); if (!CXEvilServerStatus::atom) { assert(FALSE); AfxMessageBox("Failed to register window class, XEvilServerViewPort"); return FALSE; } } BOOL t_return; t_return= CWnd::CreateEx( WS_EX_WINDOWEDGE, "XEvilServerViewPortClass", "XEvil Server", WS_MINIMIZEBOX | // so we dont have to call ShowWindow WS_SYSMENU | // so we get a icon in in our tray button WS_CAPTION| WS_EX_CLIENTEDGE| WS_THICKFRAME| WS_POPUPWINDOW, p_rect.left, p_rect.top, SERVER_VIEW_WIDTH, SERVER_VIEW_HEIGHT, t_hwnd/*parent*/, NULL/*DorHMenu*/, NULL/*lpParam*/); m_startserver.setPictureId(IDB_XEVIL); m_stopserver.setPictureId(IDB_STOP); m_settings.setPictureId(IDB_SERVEROPTIONS); m_font.CreateFont(-10,0,0,0,FW_THIN,0,0,0,0,OUT_TT_PRECIS,0,DEFAULT_QUALITY,DEFAULT_PITCH,NULL); CRect t_rect(0,0,36,36); m_startserver.Create("",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_OWNERDRAW,t_rect,this,IDC_STARTSERVER); t_rect.OffsetRect(36,0); m_stopserver.Create("",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_OWNERDRAW,t_rect,this,IDC_STOPSERVER); t_rect.OffsetRect(36,0); m_settings.Create("",WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_OWNERDRAW,t_rect,this,IDC_SETTINGS); m_startserver.SetCursor(NULL); m_stopserver.SetCursor(NULL); m_settings.SetCursor(NULL); t_rect.OffsetRect(2+36,0); t_rect.bottom=t_rect.top+16; t_rect.right=t_rect.left+50; t_return|=m_static1.Create("# Players:",WS_VISIBLE|WS_CHILD|SS_SIMPLE,t_rect,this,IDC_STATIC); CRect t_rect2=t_rect; t_rect.OffsetRect(0,2+16); t_rect.right=t_rect.left+30; t_return|=m_static2.Create("Time:",WS_VISIBLE|WS_CHILD|SS_SIMPLE,t_rect,this,IDC_STATIC); t_rect.OffsetRect(32,0); t_rect.right=t_rect.left+63; t_return|=m_timeconnected.Create("365:24:60:99",WS_VISIBLE|WS_CHILD|SS_RIGHT,t_rect,this,IDC_STATIC); t_rect2.left=t_rect.right-32; t_rect2.right=t_rect2.left+32; t_return|=m_numberofplayers.Create("99",WS_VISIBLE|WS_CHILD|SS_RIGHT,t_rect2,this,IDC_STATIC); m_static1.SetFont(&m_font); m_static2.SetFont(&m_font); m_timeconnected.SetFont(&m_font); m_numberofplayers.SetFont(&m_font); //CHECKBOX t_rect.SetRect(0,0,10,12); t_rect.OffsetRect(SERVER_VIEW_WIDTH-12,SERVER_VIEW_HEIGHT-14); t_return|=m_moredisplaycontrol.Create("",WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,t_rect,this,IDC_DISPLAY); m_moredisplaycontrol.SetCheck(0); //EDITBOX t_rect.SetRect(0,44,SERVER_VIEW_WIDTH,SERVER_VIEW_HEIGHT_BIG-24); t_return|=m_editcontrol.Create(WS_BORDER|WS_CHILD|WS_VISIBLE|ES_READONLY|ES_AUTOVSCROLL|ES_MULTILINE|ES_WANTRETURN|ES_AUTOHSCROLL|WS_HSCROLL|WS_VSCROLL ,t_rect,this,IDC_MESSAGEDISPLAY); m_editcontrol.SetFont(&m_font); m_editcontrol.SetWindowText(""); t_rect.top=t_rect.bottom+2; t_rect.bottom=t_rect.top+20; t_return|=m_messagecontrol.Create(WS_BORDER|WS_CHILD|WS_VISIBLE|ES_AUTOVSCROLL|ES_LEFT ,t_rect,this,IDC_MESSAGEDISPLAY); m_messagecontrol.SetFont(&m_font); return t_return; } int CXEvilServerStatus::getWindowList(CTypedPtrList&p_windowlist) { p_windowlist.AddTail(&m_startserver); p_windowlist.AddTail(&m_stopserver); p_windowlist.AddTail(&m_settings); /* p_windowlist.AddTail(&m_numberofplayers); p_windowlist.AddTail(&m_timeconnected); p_windowlist.AddTail(&m_moredisplaycontrol); p_windowlist.AddTail(&m_editcontrol); p_windowlist.AddTail(&m_messagecontrol);*/ return p_windowlist.GetCount(); } void CXEvilServerStatus::OnPaint() { CDC *t_dc; BOOL t_beginpaint=FALSE; PAINTSTRUCT t_struct; if (GetUpdateRect(NULL)) { t_beginpaint=TRUE; t_dc=BeginPaint(&t_struct); } else t_dc=GetDC(); CBrush *t_oldbrush=(CBrush *)t_dc->SelectStockObject(LTGRAY_BRUSH); CRect t_rect(t_struct.rcPaint); t_dc->PatBlt(t_rect.left,t_rect.top,t_rect.Width(),t_rect .Height(),PATCOPY); t_dc->SelectObject(t_oldbrush); if (t_beginpaint) EndPaint(&t_struct); } BOOL CXEvilServerStatus::OnSetCursor( CWnd *p_wnd, UINT, UINT ) { POINT t_point; CRect t_rect; ::GetCursorPos(&t_point); GetWindowRect(t_rect); if (t_rect.PtInRect(t_point)) { if (::GetCursor()!=m_cursor) m_oldcursor=::SetCursor(m_cursor); } else { if (::GetCursor()==m_cursor) ::SetCursor(m_oldcursor); } return TRUE; } void CXEvilServerStatus::toggleDisplay() { CRect t_crect; CRect t_wrect; int t_ydiff; int t_xdiff; GetClientRect(t_crect); GetWindowRect(t_wrect); t_xdiff=t_wrect.Width()-SERVER_VIEW_WIDTH; switch(m_togglestate) { case SMALL: m_togglestate=BIG; t_ydiff=t_wrect.Height()-SERVER_VIEW_HEIGHT; t_wrect.SetRect(t_wrect.left,t_wrect.top,t_wrect.left+SERVER_VIEW_WIDTH+t_xdiff,t_wrect.top+SERVER_VIEW_HEIGHT_BIG+t_ydiff); break; case BIG: m_togglestate=SMALL; t_ydiff=t_wrect.Height()-SERVER_VIEW_HEIGHT_BIG; t_wrect.SetRect(t_wrect.left,t_wrect.top,t_wrect.left+SERVER_VIEW_WIDTH+t_xdiff,t_wrect.top+SERVER_VIEW_HEIGHT+t_ydiff); break; default: assert(0); } MoveWindow(t_wrect,TRUE); Invalidate(); } void CXEvilServerStatus::getMessage(CString &p_string) { m_messagecontrol.GetWindowText(p_string); } void CXEvilServerStatus::clearMessage() { m_messagecontrol.SetWindowText(""); } void CXEvilServerStatus::addLog(const CString &p_string) { CString t_string; m_editcontrol.GetWindowText(t_string); t_string+=p_string; if (t_string.GetLength()>12000) t_string=t_string.Right(6000); t_string+="\r\n"; m_editcontrol.SetWindowText(t_string); int t_int=m_editcontrol.GetLineCount(); int t_int2=m_editcontrol.GetFirstVisibleLine(); m_editcontrol.LineScroll(t_int-t_int2); } void CXEvilServerStatus::clearLog() { m_editcontrol.SetWindowText(""); int t_int2=m_editcontrol.GetFirstVisibleLine(); m_editcontrol.LineScroll(-1*t_int2); } void CXEvilServerStatus::setTimeSpan(CString &p_string) { m_timeconnected.SetWindowText(p_string); } void CXEvilServerStatus::setNumPlayers(int p_numplayers) { CString t_string; itoa(p_numplayers,t_string.GetBuffer(255),10); t_string.ReleaseBuffer(); m_numberofplayers.SetWindowText(t_string); } xevil-2.02r2.orig/win32/xviewport.cpp0100644000175000017500000002303307041422172017017 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ //XViewPort.cpp #include "stdafx.h" #include "XEvil.h"//for resources #include "XViewPort.h" #include "xdata.h" #include "coord.h" #define STATUSBAR_HEIGHT 36 BEGIN_MESSAGE_MAP( CXEvilWnd, CWnd ) //{{AFX_MSG_MAP( CXEvilWnd ) ON_WM_PAINT() ON_WM_CLOSE() ON_WM_DESTROY() ON_WM_TIMER() ON_WM_ACTIVATEAPP() ON_WM_SETFOCUS() ON_WM_QUERYNEWPALETTE() //}}AFX_MSG_MAP END_MESSAGE_MAP( ) ATOM CXEvilWnd::atom; void CXEvilWnd::OnDestroy( ) { m_valid=FALSE; } void CXEvilWnd::OnClose( ) { m_valid=FALSE; } void CXEvilWnd::OnPaint( ) { CPaintDC t_dc(this); if (IsIconic()) { CWinApp *t_app=AfxGetApp(); assert(t_app); t_dc.DrawIcon(0,0,t_app->LoadIcon(IDR_XEVIL)); } } void CXEvilWnd::OnTimer( UINT p_id) { m_timerid=p_id; } CXEvilWnd::~CXEvilWnd() { } void CXEvilWnd::OnSetFocus(CWnd *p_oldwnd) { HDC t_hdc=::GetDC(HWND_DESKTOP); UINT t_nummapped=::RealizePalette(t_hdc); ::ReleaseDC(HWND_DESKTOP,t_hdc); if (m_fullscreen) m_querynewpalette=TRUE; COUTRESULT("setfocus"); } BOOL CXEvilWnd::OnQueryNewPalette() { m_querynewpalette=TRUE; //return true; return CWnd::OnQueryNewPalette(); } void CXEvilWnd::OnActivateApp( BOOL bActive, HTASK hTask ) { if (bActive) { COUTRESULT("ACTIVE"); m_activated=WMACTIVATED; if (m_fullscreen) { Xvars::enable_graphics(True); } } else { COUTRESULT("INACTIVE"); m_activated=WMINACTIVE; if (m_fullscreen) { Xvars::enable_graphics(False); } } if (m_fullscreen) m_querynewpalette=TRUE; } BOOL CXEvilWnd::Create(CRect &p_rect,CWnd *p_parent,unsigned char p_viewportnum,BOOL p_fullscreenmode) { HWND t_hwnd(NULL); m_fullscreen=p_fullscreenmode; if (p_parent) t_hwnd=p_parent->m_hWnd; CMenu t_menu; VERIFY(t_menu.LoadMenu(IDR_XEVILMENU)); if (p_fullscreenmode) t_menu.ModifyMenu(ID_FULLSCREEN,MF_BYCOMMAND|MF_STRING,ID_WINDOWSCREEN,"&Window Mode"); //add on status bar size p_rect.bottom+=STATUSBAR_HEIGHT; WNDCLASSEX wndClass; if (!CXEvilWnd::atom) { wndClass.cbSize=sizeof(WNDCLASSEX); wndClass.style=CS_BYTEALIGNCLIENT|CS_VREDRAW | CS_HREDRAW; wndClass.lpfnWndProc=::DefWindowProc; wndClass.cbClsExtra=0; wndClass.cbWndExtra=0; wndClass.hInstance=AfxGetInstanceHandle(); wndClass.hIcon=theApp.LoadIcon(IDR_XEVIL); wndClass.hCursor=theApp.LoadCursor(IDC_XEVIL); wndClass.hbrBackground=NULL; wndClass.lpszMenuName=NULL; wndClass.lpszClassName="XEvilViewPortClass"; wndClass.hIconSm=theApp.LoadIcon(IDR_XEVIL_SMALL); #if 0 OSVERSIONINFO versionInfo; versionInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); VERIFY(GetVersionEx(&versionInfo)); /* char crap[255]; ltoa(crap,versionInfo.dwMajorVersion*/ if (VER_PLATFORM_WIN32_WINDOWS != versionInfo.dwPlatformId) { AfxMessageBox("Not Windows 95"); wndClass.hIconSm=theApp.LoadIcon(IDR_XEVIL_SMALL); } else wndClass.hIconSm=NULL; #endif //looking for solution to win95 problem, it was the hInstance CXEvilWnd::atom=::RegisterClassEx(&wndClass); if (!CXEvilWnd::atom) { assert(FALSE); AfxMessageBox("Failed to register window class, XEvilViewPort"); return FALSE; } // s_classname=AfxRegisterWndClass(CS_BYTEALIGNCLIENT|CS_VREDRAW | CS_HREDRAW,theApp.LoadCursor(IDC_XEVIL),0,theApp.LoadIcon(IDR_XEVIL)); } BOOL t_return; // Window mode if (! p_fullscreenmode) { t_return= CWnd::CreateEx( WS_EX_WINDOWEDGE, "XEvilViewPortClass", "XEvil", WS_MINIMIZEBOX | // so we dont have to call ShowWindow WS_SYSMENU | // so we get a icon in in our tray button WS_CAPTION| WS_POPUPWINDOW, p_rect.left, p_rect.top, p_rect.Width(), p_rect.Height(), t_hwnd/*parent*/, NULL/*DorHMenu*/, NULL/*lpParam*/); SetMenu(&t_menu); t_menu.Detach(); CRect t_rect; GetClientRect(t_rect); t_rect.top=t_rect.bottom-STATUSBAR_HEIGHT; // m_statusbar.Create("status",WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,t_rect,this,ID_STATUSBAR); } // Full screen mode. else { OSVERSIONINFO versionInfo; versionInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); VERIFY(GetVersionEx(&versionInfo)); if (VER_PLATFORM_WIN32_WINDOWS != versionInfo.dwPlatformId) { t_return= CWnd::CreateEx(WS_EX_APPWINDOW|WS_EX_TOPMOST,"XEvilViewPortClass","XEvil",WS_POPUP|WS_VISIBLE //WS_SYSMENU|WS_MINIMIZEBOX|WS_CAPTION|WS_POPUPWINDOW ,p_rect.left,p_rect.top,p_rect.Width(),p_rect.Height(), t_hwnd/*parent*/,NULL/*DorHMenu*/,NULL/*lpParam*/); } else { t_return= CWnd::CreateEx(WS_EX_APPWINDOW|WS_VISIBLE,"XEvilViewPortClass","XEvil",WS_POPUP //WS_SYSMENU|WS_MINIMIZEBOX|WS_CAPTION|WS_POPUPWINDOW ,p_rect.left,p_rect.top,p_rect.Width(),p_rect.Height(), t_hwnd/*parent*/,NULL/*DorHMenu*/,NULL/*lpParam*/); } SetMenu(&t_menu); t_menu.Detach(); #if 0 // Clear screen CRect t_rect; GetClientRect(t_rect); CDC *t_dc = GetDC(); if (t_dc) { t_dc->FillSolidRect(t_rect,RGB(0,255,0)); ReleaseDC(t_dc); } else { COUTRESULT("COULDNT GET DC"); } #endif } m_valid=t_return; return t_return; } void CXEvilButton::DrawItem(LPDRAWITEMSTRUCT p_struct) { if (!p_struct->itemAction==ODA_DRAWENTIRE) return; CDC *t_dc=CDC::FromHandle(p_struct->hDC); CBrush *t_oldbrush=(CBrush *)t_dc->SelectStockObject(LTGRAY_BRUSH); CRect t_rect(p_struct->rcItem); t_dc->PatBlt(t_rect.left,t_rect.top,t_rect.Width(),t_rect .Height(),PATCOPY); t_dc->SelectObject(t_oldbrush); CPen *t_oldpen=(CPen *)t_dc->SelectStockObject(WHITE_PEN); t_dc->MoveTo(t_rect.right-1,0); t_dc->LineTo(0,0); t_dc->LineTo(0,t_rect.bottom-1); CPen t_newpen(PS_SOLID,1,RGB(96,96,96)); t_dc->SelectObject(&t_newpen); t_dc->MoveTo(t_rect.right-1,0); t_dc->LineTo(t_rect.right-1,t_rect.bottom-1); t_dc->LineTo(0,t_rect.bottom-1); t_dc->SelectObject(t_oldpen);//put it back CString t_string; GetWindowText(t_string.GetBuffer(255),255); t_string.ReleaseBuffer(); t_dc->SelectStockObject(BLACK_PEN); t_dc->SelectStockObject(ANSI_VAR_FONT); t_rect.left+=5; t_dc->SetBkMode(OPAQUE); t_dc->SetBkColor(RGB(192,192,192)); t_dc->DrawText(t_string,t_string.GetLength(),t_rect,DT_LEFT|DT_VCENTER|DT_SINGLELINE); } //note! there may be a '\n' in the string, find it and put the text on the next line! void CXEvilIndentedButton::DrawItem(LPDRAWITEMSTRUCT p_struct) { if (!p_struct->itemAction==ODA_DRAWENTIRE) return; CPen t_newpen(PS_SOLID,1,RGB(96,96,96)); CDC *t_dc=CDC::FromHandle(p_struct->hDC); CBrush *t_oldbrush=(CBrush *)t_dc->SelectStockObject(LTGRAY_BRUSH); CRect t_rect(p_struct->rcItem); t_dc->PatBlt(t_rect.left,t_rect.top,t_rect.Width(),t_rect .Height(),PATCOPY); t_dc->SelectObject(t_oldbrush); t_dc->SelectObject(&t_newpen); t_dc->MoveTo(t_rect.right-2,2); t_dc->LineTo(1,2); t_dc->LineTo(1,t_rect.bottom-2); CPen *t_oldpen=(CPen *)t_dc->SelectStockObject(WHITE_PEN); t_dc->MoveTo(t_rect.right-2,2); t_dc->LineTo(t_rect.right-2,t_rect.bottom-2); t_dc->LineTo(1,t_rect.bottom-2); t_dc->SelectObject(t_oldpen);//put it back CString t_string; CString t_string2; GetWindowText(t_string.GetBuffer(255),255); t_string.ReleaseBuffer(); //find the /n int t_index=t_string.Find('\n'); if (-1!=t_index) { t_string2=t_string.Mid(t_index+1); t_string=t_string.Mid(0,t_index); } t_dc->SelectStockObject(BLACK_PEN); t_rect.left+=3; if (t_string2.GetLength()) { t_rect.bottom=t_rect.bottom/2; t_rect.top+=3; t_rect.OffsetRect(0,1); } t_dc->SelectStockObject(ANSI_VAR_FONT); t_dc->SetBkMode(OPAQUE); t_dc->SetBkColor(RGB(192,192,192)); t_dc->DrawText(t_string,t_string.GetLength(),t_rect,DT_LEFT|DT_VCENTER|DT_SINGLELINE); t_rect.OffsetRect(0,t_rect.bottom-3); t_rect.top-=3; t_rect.bottom-=1; if (t_string2.GetLength()) t_dc->DrawText(t_string2,t_string2.GetLength(),t_rect,DT_LEFT|DT_VCENTER|DT_SINGLELINE); } xevil-2.02r2.orig/win32/aboutdialog.h0100644000175000017500000000520007041422154016703 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // AboutDialog.h : header file // ///////////////////////////////////////////////////////////////////////////// // AboutDialog dialog class AboutDialog : public CDialog { // Construction public: AboutDialog(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(AboutDialog) enum { IDD = IDD_ABOUTBOX }; CButton m_drawbackgroundcontrol; CButton m_rejectcontrol; CEdit m_licensetextcontrol; CButton m_fullscreencontrol; BOOL m_fullscreenvalue; CString m_versionvalue; CString m_licensetextvalue; BOOL m_drawbackgroundvalue; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(AboutDialog) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(AboutDialog) virtual BOOL OnInitDialog(); virtual void OnOK(); virtual void OnCancel(); afx_msg void OnSetfocusLicensetext(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: BOOL m_Dfullscreenmode; BOOL m_Denablefullscreen; BOOL m_Ddrawbackground; BOOL m_Denabledrawbackground; BOOL m_Denablereject; public: void enableFullScreenButton(BOOL p_bool){m_Denablefullscreen=p_bool;} void setFullScreenMode(BOOL p_fullscreenon){m_Dfullscreenmode=p_fullscreenon;} BOOL getFullScreenMode(){return m_Dfullscreenmode;} void enableReduceDraw(BOOL p_bool){m_Denabledrawbackground=p_bool;} void setReduceDraw(BOOL p_val){m_Ddrawbackground = !p_val;} BOOL getReduceDraw(){return !m_Ddrawbackground;} /* NOTE: Negate the value to convert to/from reduceDraw from/to drawBackground. */ void setVersionString(const char*); void setLicenseText(const char*); void setReject(BOOL p_bool = TRUE){m_Denablereject = p_bool;} }; xevil-2.02r2.orig/win32/connectdlg.h0100644000175000017500000000344007041422154016535 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // ConnectDlg.h : header file // #include "utils.h" ///////////////////////////////////////////////////////////////////////////// // CConnectDlg dialog class CConnectDlg : public CDialog { // Construction public: CConnectDlg(CWnd* pParent = NULL); // standard constructor const CString &getHostname() {return m_hostname;} CMN_PORT getPort() {return m_port;} const CString &getName() {return m_name;} // Dialog Data //{{AFX_DATA(CConnectDlg) enum { IDD = IDD_CONNECTSERVER }; CString m_hostname; UINT m_port; CString m_name; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CConnectDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(CConnectDlg) virtual void OnCancel(); virtual void OnOK(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; xevil-2.02r2.orig/win32/difficulty.h0100644000175000017500000000343707041422152016563 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "coord.h" // Difficulty.h : header file // ///////////////////////////////////////////////////////////////////////////// // CDifficulty dialog class CDifficulty : public CDialog { // Construction public: CDifficulty(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CDifficulty) enum { IDD = IDD_DIFFICULTY }; int m_difficulty; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CDifficulty) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(CDifficulty) virtual void OnOK(); virtual BOOL OnInitDialog(); virtual void OnCancel(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: int m_Ddifficulty; public: void setDifficulty(int p_diff){m_Ddifficulty=p_diff;} int getDifficulty(){return m_Ddifficulty;} }; xevil-2.02r2.orig/win32/fileman.h0100644000175000017500000000352607041422150016031 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #ifndef _FILEMAN_H #define _FILEMAN_H class TempFileManager { char *directoryname; //stores the temp directory name char **tempfiles; //array of temporary files int numtempfiles; //number of temporary files int buffersize; //size of buffer for temp file array void addName(char *);//private method that adds a name to the temp file array public: TempFileManager(); ~TempFileManager(); const char *newTempFileName(const char *ext); //returns a new name prepended with ~xtmp int getNumTempFiles(){return numtempfiles;} //returns number of temporary files const char *getTempFileByIndex(int index); //returns filename from the index into the array void cleanup(); //deletes the files from the temp file list. /*attachDirecetory goes through passed in directory and adds all appropriate files to the temp file array */ void attachDirectory(const char *dirname); }; #endif //_FILEMAN_H xevil-2.02r2.orig/win32/firepal.h0100644000175000017500000000226407041422146016043 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "palmod.h" #include "utils.h" class FirePalette: public PaletteModifier { public: enum {FIRE_UPPERLIMIT=50, FIRE_LOWERLIMIT=0, FIRE_AMOUNT=4}; FirePalette(ColorPalette &p_palette); virtual ~FirePalette(){} virtual void clock(); ColorPalette m_fireholdingpalette; int m_amount; char m_dir; }; xevil-2.02r2.orig/win32/fogpal.h0100644000175000017500000000227207041422146015670 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "palmod.h" #include "utils.h" class FogPalette: public PaletteModifier { public: enum {FOG_UPPERLIMIT=50,FOG_LOWERLIMIT=-50, FOG_AMOUNT=5}; FogPalette::FogPalette(ColorPalette &p_palette); virtual ~FogPalette(){} virtual void clock(); ColorPalette m_fogholdingpalette; int m_amount; char m_dir; }; xevil-2.02r2.orig/win32/fsstatus.h0100644000175000017500000001172207041422146016274 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #ifndef _FSSTATUSH #define _FSSTATUSH #include "locator.h" #include "intel.h" class XEvilFSButton { private: CRect m_clientpos; CString m_message; CString m_postedmessage; void DrawItem(Xvars &xvars, LPDIRECTDRAWSURFACE p_buffer,CRect &p_clientarea); public: XEvilFSButton(){m_message="default";} XEvilFSButton(CRect p_pos){m_clientpos=p_pos;} ~XEvilFSButton(){} void setMessage(CString &p_string){m_postedmessage=p_string;} BOOL update(Xvars &xvars, LPDIRECTDRAWSURFACE p_buffer,CRect &p_clientarea,BOOL p_forceredraw=FALSE); // returns TRUE if it drew something. void setClientPos(const CRect &p_rect){m_clientpos=p_rect;} }; class XEvilFSStatusMessage { private: CRect m_clientpos; CString m_message; // Being displayed CString m_postedmessage; // Recently set void DrawItem(Xvars &xvars, LPDIRECTDRAWSURFACE p_buffer,CRect &p_clientarea); public: XEvilFSStatusMessage() {} ~XEvilFSStatusMessage() {} void setMessage(CString &p_string){m_postedmessage=p_string;} void setClientPos(const CRect &p_rect){m_clientpos = p_rect;} BOOL update(Xvars &xvars, LPDIRECTDRAWSURFACE p_buffer,CRect &p_clientarea,BOOL p_forceredraw=FALSE); }; class XEvilFSHealthBar { private: CRect m_clientpos; int m_pos; int m_maxpos; int m_postedpos; int m_postedmaxpos; int m_health; void DrawItem(Xvars &xvars, LPDIRECTDRAWSURFACE p_buffer); enum {BORDER=2,TEXTINDENT=100}; public: XEvilFSHealthBar(){m_pos=1;m_maxpos=1;m_postedpos=0;m_postedmaxpos=2;m_health=0;} XEvilFSHealthBar(CRect p_pos){m_clientpos=p_pos;} ~XEvilFSHealthBar(){} void setPos(int p_int){m_postedpos=p_int;} void setMaxPos(int p_int){m_postedmaxpos=p_int;} void setHealth(int p_int){m_health=p_int;} BOOL update(Xvars &xvars, LPDIRECTDRAWSURFACE p_buffer,CRect &p_clientarea,BOOL p_forceredraw=FALSE); //return true if actually drawn void setClientPos(const CRect &p_rect){m_clientpos=p_rect;} }; class StatusWnd { private: void drawStatusMessage(); // The rectangle of the statusWnd in the coordinates // of its parent. CRect m_statusrect; // Same size as status rect. Upper-left is always (0,0). CRect m_bufferrect; XEvilFSHealthBar m_healthbar; Wheel m_weaponwheel; Wheel m_itemwheel; XEvilFSButton m_charactername; XEvilFSButton m_characterclass; XEvilFSButton m_liveshumankills; XEvilFSButton m_killsenemykills; XEvilFSButton m_humansnum; XEvilFSButton m_enemiesnum; XEvilFSStatusMessage m_status; XEvilFSStatusMessage m_level; LPDIRECTDRAWSURFACE m_buffer; LPDIRECTDRAW m_lpDD; BOOL m_dirty; Xvars *m_pxvars; Locator *m_plocator; public: StatusWnd(LocatorP,Xvars *xvars); ~StatusWnd(); BOOL Create(CRect &p_statusrect); BOOL DestroyWindow(){return TRUE;} LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam){return NULL;} LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 ){return NULL;} BOOL needRedraw(){return FALSE;} void setRedraw(BOOL p_bool){} // Can we just kill all these methods? void updateCharacterName(const char p_stat[IT_STRING_LENGTH]); void updateCharacterClass(const char p_stat[IT_STRING_LENGTH]); void updateHealth(Health p_stat,Health p_maxstat); void updateMass(Mass p_stat); void updateWeapon(const char p_stat[IT_STRING_LENGTH],ClassId weaponClassId,int p_ammo,BOOL p_ready); void updateItem(const char p_stat[IT_STRING_LENGTH],ClassId itemClassId,int p_count); void updateXtraLivesHumanKills(int p_stat,BOOL p_xtraLives); void updateKillsEnemyKills(int p_stat,BOOL p_kills); void updateHumansNum(int p_stat); void updateEnemiesNum(int p_stat); void updateLevel(const char*); void updateStatus(const char*); void update(LPDIRECTDRAWSURFACE p_buffer,CWnd *p_parent,BOOL p_forceredraw = FALSE); /* EFFECTS: Draw the StatusWnd to p_buffer if dirty. */ void setRects(const CRect &p_status); static void init_x(LocatorP,Xvars &,IXCommand,void*); void clock(); /* NOTE: Needed for animation. */ }; #endif //_FSSTATUSH xevil-2.02r2.orig/win32/glowpal.h0100644000175000017500000000226507041422146016067 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #include "palmod.h" #include "utils.h" class GlowPalette: public PaletteModifier { public: enum {GLOW_UPPERLIMIT=50, GLOW_LOWERLIMIT=-50, GLOW_AMOUNT=5}; GlowPalette(ColorPalette &p_palette); virtual ~GlowPalette(){} virtual void clock(); ColorPalette m_fogholdingpalette; int m_amount; char m_dir; }; xevil-2.02r2.orig/win32/keyhitdlg.h0100644000175000017500000000376307041422144016410 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // KeyHitDlg.h : header file // ///////////////////////////////////////////////////////////////////////////// // KeyHitDlg dialog class KeyHitDlg : public CDialog { // Construction public: KeyHitDlg(CWnd* pParent = NULL); // standard constructor unsigned char getChar(){return m_Dchar;} // Dialog Data //{{AFX_DATA(KeyHitDlg) enum { IDD = IDD_KEYHIT }; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(KeyHitDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(KeyHitDlg) afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); virtual BOOL OnInitDialog(); afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: unsigned char m_Dchar; static LRESULT CALLBACK KeyhitKeyboardProc(int code, WPARAM wParam, LPARAM lParam); void keyHit(WPARAM wParam, LPARAM lParam); static HHOOK m_hhk; static KeyHitDlg *m_hack; }; xevil-2.02r2.orig/win32/keysets.h0100644000175000017500000001022607041422144016103 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // KeySets.h : header file // ///////////////////////////////////////////////////////////////////////////// // CKeySets dialog class CKeySets : public CDialog { // Construction public: CKeySets(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CKeySets) enum { IDD = IDD_KEYSETS }; CButton m_weaponusebutton; CButton m_weapondropbutton; CButton m_weaponchangebutton; CButton m_upperrightbutton; CButton m_upperbutton; CButton m_upperleftbutton; CButton m_rightbutton; CButton m_lowerrightbutton; CButton m_lowerleftbutton; CButton m_leftbutton; CButton m_itemusebutton; CButton m_itemdropbutton; CButton m_itemchangebutton; CButton m_downbutton; CButton m_centerbutton; CButton m_chatbutton; CString m_playerstaticvalue; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CKeySets) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL private: char m_Dweaponusechar; char m_Dweapondropchar; char m_Dweaponchangechar; char m_Dupperrightchar; char m_Dupperchar; char m_Dupperleftchar; char m_Drightchar; char m_Dlowerrightchar; char m_Dlowerleftchar; char m_Dleftchar; char m_Ditemusechar; char m_Ditemdropchar; char m_Ditemchangechar; char m_Ddownchar; char m_Dcenterchar; char m_Dchatchar; CString m_Dplayerstaticvalue; CString translateChar(unsigned char p_char); // Implementation protected: // Generated message map functions //{{AFX_MSG(CKeySets) afx_msg void OnUp(); afx_msg void OnUr(); afx_msg void OnWeaponchange(); afx_msg void OnWeaponuse(); afx_msg void OnWeapondrop(); virtual void OnOK(); afx_msg void OnCenter(); afx_msg void OnDown(); afx_msg void OnItemchange(); afx_msg void OnItemdrop(); afx_msg void OnItemuse(); afx_msg void OnL(); afx_msg void OnLl(); afx_msg void OnLr(); afx_msg void OnR(); afx_msg void OnUl(); afx_msg void OnChat(); virtual BOOL OnInitDialog(); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); virtual void OnCancel(); //}}AFX_MSG DECLARE_MESSAGE_MAP() public: void setUpChar(char p_char); void setUpLeftChar(char p_char); void setUpRightChar(char p_char); void setLeftChar(char p_char); void setRightChar(char p_char); void setCenterChar(char p_char); void setDownChar(char p_char); void setDownLeftChar(char p_char); void setDownRightChar(char p_char); void setWeaponUse(char p_char); void setWeaponChange(char p_char); void setWeaponDrop(char p_char); void setItemUse(char p_char); void setItemChange(char p_char); void setItemDrop(char p_char); void setChat(char p_char); void setIndex(int p_index){m_index=p_index;} int getIndex(){return m_index;} char getUpChar(); char getUpLeftChar(); char getUpRightChar(); char getLeftChar(); char getRightChar(); char getCenterChar(); char getDownChar(); char getDownLeftChar(); char getDownRightChar(); char getWeaponUse(); char getWeaponChange(); char getWeaponDrop(); char getItemUse(); char getItemChange(); char getItemDrop(); char getChat(); void setText(CString &p_string){m_Dplayerstaticvalue=p_string;} BOOL getChanged(){return m_changed;}; private: CButton *m_pbutton; char *m_pchar; BOOL m_changed; int m_index;//used for player 0,1 needed for modaless input, trust me }; xevil-2.02r2.orig/win32/optionsdlg.h0100644000175000017500000000757307041422144016611 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // OptionsDlg.h : header file // ///////////////////////////////////////////////////////////////////////////// // OptionsDlg dialog #include "ui.h" class OptionsDlg : public CDialog { // Construction public: OptionsDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(OptionsDlg) enum { IDD = IDD_OPTIONS }; CSliderCtrl m_soundtrackslider; CSliderCtrl m_gamespeedslider; CSliderCtrl m_effectsslider; int m_gamestyle; int m_nummachines; int m_roomshigh; int m_roomswide; int m_musictype; BOOL m_soundonoff; BOOL m_cooperative; BOOL m_refillmachines; BOOL m_human; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(OptionsDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(OptionsDlg) virtual BOOL OnInitDialog(); virtual void OnOK(); virtual void OnCancel(); afx_msg void OnStyleChanged(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: // To convert between GameStyleType and the index used for the // dialog's game style radio boxes. GameStyleType indexToStyle(int index); int styleToIndex(GameStyleType); // Set fields to be enabled/disabled according to the game style. void SetEnabledByStyleAndRole(GameStyleType,RoleType); BOOL m_Dhuman; int m_Dnummachines; BOOL m_Drefillmachines; GameStyleType m_Dstyle; RoleType m_Droletype; int m_Droomshigh; int m_Droomswide; BOOL m_Dsoundonoff; BOOL m_Dcooperative; int m_Deffectsvolume; int m_Dsndtrkvolume; long m_Dgamespeed; UIsettings::SOUNDTRACKTYPE m_Dmusictype; public: //accessmethods void setNumHumans(int p_int); void setNumMachines(int p_int){m_Dnummachines=p_int;} void setRefillMachines(BOOL p_bool){m_Drefillmachines=p_bool;} void setSndTrkVolume(int p_uint){m_Dsndtrkvolume=p_uint;} void setEffectsVolume(int p_uint){m_Deffectsvolume=p_uint;} void setStyle(GameStyleType p_style){m_Dstyle=p_style;} void setRoleType(RoleType p_roletype){m_Droletype=p_roletype;} void setRoomsWide(int p_int){m_Droomswide=p_int;} void setRoomsHigh(int p_int){m_Droomshigh=p_int;} void setGameSpeed(long p_short){m_Dgamespeed=p_short;} void setMusicType(UIsettings::SOUNDTRACKTYPE p_type){m_Dmusictype=p_type;} void setSoundOnOff(BOOL p_bool){m_Dsoundonoff=p_bool;} void setCooperative(BOOL p_bool){m_Dcooperative=p_bool;} int getSoundOnOff(){return m_Dsoundonoff;} int getNumHumans(); int getNumMachines(){return m_Dnummachines;} BOOL getRefillMachines(){return m_Drefillmachines;} GameStyleType getStyle(){return m_Dstyle;} int getRoomsWide(){return m_Droomswide;} int getRoomsHigh(){return m_Droomshigh;} int getSndTrkVolume(){return m_Dsndtrkvolume;} int getEffectsVolume(){return m_Deffectsvolume;} long getGameSpeed(){return m_Dgamespeed;} BOOL getCooperative(){return m_Dcooperative;} UIsettings::SOUNDTRACKTYPE getMusicType(){return m_Dmusictype;} }; xevil-2.02r2.orig/win32/palmod.h0100644000175000017500000000354407041422144015675 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #ifndef PALMOD_H #define PALMOD_H #include "xdata.h" class PaletteModifier { public: PaletteModifier(ColorPalette &p_palette); PaletteModifier(); virtual ~PaletteModifier(); virtual HRESULT applyPalette(HDC p_hdc, LPDIRECTDRAWSURFACE p_suface, LPDIRECTDRAW p_lpDD); virtual HRESULT removePalette(); virtual void clock()=0; protected: LPDIRECTDRAWPALETTE m_ddpalette; LPDIRECTDRAWPALETTE m_oldpalette; LPDIRECTDRAWSURFACE m_surface; HPALETTE m_hpal; ColorPalette m_palette; BOOL m_applied; }; /*passed a palette, does some modification on it and makes a lpdirectdrawpalette keeps pointer to old palette to return it to normal.*/ class DefaultModifier:public PaletteModifier { public: DefaultModifier(){} virtual ~DefaultModifier(){} virtual HRESULT applyPalette(HDC p_hdc, LPDIRECTDRAWSURFACE p_suface, LPDIRECTDRAW p_lpDD){return DD_OK;} virtual HRESULT removePalette(){return DD_OK;} virtual void clock(){} }; #endif //PALMOD_H xevil-2.02r2.orig/win32/resource.h0100644000175000017500000013732506667037676016306 0ustar aaronlaaronl//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by xevil.rc // #define IDS_NETHELPURL 1 #define IDD_ABOUTBOX 100 #define IDB_CHOPPERBOY0 101 #define IDB_CHOPPERBOY0B 102 #define IDB_CHOPPERBOY1B 103 #define IDB_CHOPPERBOY1 104 #define IDB_CHOPPERBOY2 105 #define IDB_CHOPPERBOY3 108 #define IDB_CHOPPERBOY4 109 #define IDB_CHOPPERBOY5 110 #define IDB_CHOPPERBOY_DEAD 111 #define ID_STATUSBAR 111 #define IDB_NINJA3B 124 #define IDB_NINJA3 125 #define IDR_MAINFRAME 128 #define IDR_XEVILTYPE 129 #define IDB_WALL 130 #define IDB_UNKNOWN 132 #define IDB_DOOR1 133 #define IDB_DOOR2 134 #define IDB_LADDER 135 #define IDB_EMPTY 136 #define IDB_SQUANCH 137 #define IDB_HISQUANCH 137 #define IDB_UPDOWN 138 #define IDB_OUTSIDE 139 #define IDB_TEXTSQUARE 140 #define IDB_ALIEN0 141 #define IDB_ALIEN0B 142 #define IDB_ALIEN1 143 #define IDB_ALIEN1B 144 #define IDB_ALIEN2 145 #define IDB_ALIEN3 146 #define IDB_ALIEN4 147 #define IDB_ALIEN5 148 #define IDB_ALIEN8 149 #define IDB_ALIEN7 150 #define IDB_ALIEN10 151 #define IDB_ALIEN11 152 #define IDB_ALIEN14 153 #define IDB_ALIEN13 154 #define IDB_ALIEN16 155 #define IDB_ALIEN17 156 #define IDB_ALIEN18 157 #define IDB_ALIEN7B 158 #define IDB_ALIEN8B 159 #define IDB_ALIEN10B 160 #define IDB_ALIEN11B 161 #define IDB_ALIEN13B 162 #define IDB_ALIEN14B 163 #define IDB_ALIEN16B 164 #define IDB_ALIEN17B 165 #define IDB_ALIEN18B 166 #define IDB_ALIENDEAD 167 #define ID_TIMER 169 #define ID_DISCONNECTSERVER 170 #define ID_STOPSERVER 171 #define IDC_SETTINGS 172 #define IDR_XEVIL 173 #define IDC_STARTSERVER 173 #define IDC_XEVIL 174 #define IDR_XEVIL_SMALL 174 #define IDC_STOPSERVER 174 #define IDC_XEVIL_SERVER 175 #define IDC_DISPLAY 175 #define IDC_MESSAGEDISPLAY 176 #define IDC_XEVIL3 177 #define ID_MIDI1 178 #define IDB_FTHROWER 214 #define IDB_FROGGUN 254 #define IDB_GRENADES 256 #define IDB_LANCER 258 #define IDB_LAUNCHER 260 #define IDB_MGUN 262 #define IDB_PISTOL 264 #define IDB_SHOTGUN 266 #define IDB_STARS 268 #define IDB_SWAPPER 270 #define IDB_WALKER0 272 #define IDB_WALKER0B 273 #define IDB_WALKER2 274 #define IDB_WALKER2B 275 #define IDB_WALKER3B 276 #define IDB_WALKER3 277 #define IDB_WALKER4 278 #define IDB_WALKER5 279 #define IDB_WALKER11 280 #define IDB_WALKER10 281 #define IDB_WALKER1D 289 #define IDB_WALKER1C 291 #define IDB_WALKER1B 293 #define IDB_WALKER1 297 #define IDB_WALKER0D 299 #define IDB_WALKER0C 301 #define IDB_WALKER_DEAD 309 #define IDB_LASER_VERT 311 #define IDB_SHELL 314 #define IDB_LANCE_HORZ 316 #define IDB_LANCE_VERT 318 #define IDB_HOME 320 #define IDB_ALTAR0 322 #define IDB_ALTAR1 323 #define IDB_BOMB5 327 #define IDB_BOMB4 330 #define IDB_BOMB3 333 #define IDB_BOMB2 336 #define IDB_BOMB1 339 #define IDB_BOMB0 342 #define IDB_BOMB6 344 #define IDB_CLOAK 345 #define IDB_DOPPEL 347 #define IDB_EGG 349 #define IDB_EGG_OPEN 352 #define IDB_ENFORCER_DEAD 354 #define IDB_ENFORCER5 356 #define IDB_ENFORCER1B 358 #define IDB_ENFORCER1 360 #define IDB_ENFORCER1D 360 #define IDB_ENFORCER0B 362 #define IDB_ENFORCER0 364 #define IDB_ENFORCER0D 364 #define IDB_FIREDEMON5B 366 #define IDB_FIREDEMON5 368 #define IDB_FIREDEMON4 370 #define IDB_FIREDEMON3 372 #define IDB_FIREDEMON22 375 #define IDB_FIREDEMON21 377 #define IDB_FIREDEMON2 378 #define IDB_FIREDEMON1B 380 #define IDB_FIREDEMON1 382 #define IDB_FIREDEMON0B 384 #define IDB_FIREDEMON0 386 #define IDB_TRANSMOGIFIER 388 #define IDB_FIREDEMON_DEAD 390 #define IDR_XEVILMENU 390 #define IDD_OPTIONS 392 #define IDB_SWAP_SHELL 473 #define IDB_SWAP_SHELLB 475 #define IDB_WEIGHT 477 #define IDB_TRAPDOOR 479 #define IDB_TSHIELD 482 #define IDB_STAR 484 #define IDB_ROCK 486 #define IDB_NSHIELD 489 #define IDB_MISSLE40 491 #define IDB_MISSLE39 493 #define IDB_MISSLE38 495 #define IDB_MISSLE37 497 #define IDB_MISSLE36 499 #define IDB_MISSLE35 501 #define IDB_MISSLE34 503 #define IDB_MISSLE33 505 #define IDB_MISSLE32 507 #define IDB_MISSLE31 509 #define IDB_MISSLE30 511 #define IDB_MISSLE29 513 #define IDB_MISSLE28 515 #define IDB_MISSLE27 517 #define IDB_MISSLE26 519 #define IDB_MISSLE25 521 #define IDB_HUGGER6B 525 #define IDB_HUGGER6 527 #define IDB_HUGGER5 529 #define IDB_HUGGER4B 531 #define IDB_HUGGER4 533 #define IDB_HUGGER3 535 #define IDB_HUGGER2 537 #define IDB_HUGGER1B 539 #define IDB_HUGGER17B 542 #define IDB_HUGGER17 544 #define IDB_HUGGER16B 546 #define IDB_HUGGER16 548 #define IDB_HUGGER15 550 #define IDB_HUGGER12B 552 #define IDB_HUGGER12 554 #define IDB_HUGGER1 555 #define IDB_HUGGER0B 557 #define IDB_HUGGER0 559 #define IDB_GRENADE1 560 #define IDB_GRENADE2 561 #define IDB_GRENADE3 562 #define IDB_GRENADE4 563 #define IDB_FROG_SHELL 568 #define IDB_FROG_SHELLB 569 #define IDB_FROG3 572 #define IDB_FROG4 573 #define IDB_FROG5 574 #define IDB_FROG_DEAD 575 #define IDB_FROG2 581 #define IDB_FROG1 583 #define IDB_FROG0 585 #define IDB_STARB 588 #define IDB_HERO10B 628 #define IDB_HERO10 632 #define IDB_HHERO0_ATTACK 640 #define IDB_HUGGER_DEAD 643 #define IDB_CHAINSAW5B 645 #define IDB_CHAINSAW5 647 #define IDB_CHAINSAW37B 649 #define IDB_CHAINSAW37 651 #define IDB_CHAINSAW33B 653 #define IDB_CHAINSAW33 655 #define IDB_CHAINSAW29B 657 #define IDB_CHAINSAW29 659 #define IDB_CHAINSAW25B 661 #define IDB_CHAINSAW25 663 #define IDB_WALKER18B 665 #define ID_XEVIL 666 #define IDB_WALKER18 667 #define IDB_HUGGER_RED_DEAD 669 #define ID_STATBACKDROP 669 #define ID_HEALTHBAR 670 #define IDB_HUGGER_RED6B 671 #define ID_MASSBAR 671 #define ID_AMMOBAR 672 #define IDB_HUGGER_RED6 673 #define ID_WEAPONBAR 673 #define ID_ITEMBAR 674 #define IDB_HUGGER_RED5 675 #define ID_MACHKILLSBAR 675 #define ID_HUMANKILLSBAR 676 #define IDB_HUGGER_RED4B 677 #define ID_XTRALIVESBAR 677 #define IDB_HUGGER_RED4 679 #define IDB_HUGGER_RED3 681 #define IDB_HUGGER_RED2 683 #define IDB_HUGGER_RED1B 685 #define IDB_HUGGER_RED17B 688 #define IDB_HUGGER_RED17 690 #define IDB_HUGGER_RED16B 692 #define IDB_HUGGER_RED16 694 #define IDB_HUGGER_RED15 696 #define IDB_HUGGER_RED12B 698 #define IDB_HUGGER_RED12 700 #define IDB_HUGGER_RED1 701 #define IDB_HUGGER_RED0B 703 #define IDB_HUGGER_RED0 705 #define IDB_FLAME 706 #define IDB_FIREBALL 706 #define IDB_NINJA_DEAD 709 #define IDB_NINJA8_ATTACK 710 #define IDB_NINJA7_ATTACK 711 #define IDB_NINJA6B 713 #define IDB_NINJA6 715 #define IDB_NINJA5 716 #define IDB_NINJA4 718 #define IDB_NINJA3D 719 #define IDB_NINJA3C 721 #define IDB_NINJA3_ATTACK 724 #define IDB_NINJA2D 726 #define IDB_NINJA2C 728 #define IDB_NINJA2B 730 #define IDB_NINJA2_ATTACK 733 #define IDB_NINJA22_ATTACK 735 #define IDB_NINJA21_ATTACK 737 #define IDB_NINJA2 738 #define IDB_NINJA1D 740 #define IDB_NINJA1C 742 #define IDB_NINJA1B 744 #define IDB_NINJA1_ATTACK 747 #define IDB_NINJA19 749 #define IDB_NINJA18B 751 #define IDB_NINJA18 753 #define IDB_NINJA17B 755 #define IDB_NINJA17_ATTACK 758 #define IDB_NINJA17 759 #define IDB_NINJA16B 761 #define IDB_NINJA16_ATTACK 764 #define IDB_NINJA16 765 #define IDB_NINJA14_ATTACK 767 #define IDB_NINJA13_ATTACK 769 #define IDB_NINJA12B 771 #define IDB_NINJA12 773 #define IDB_NINJA11B 775 #define IDB_NINJA11_ATTACK 778 #define IDB_NINJA11 779 #define IDB_NINJA10B 781 #define IDB_NINJA10_ATTACK 784 #define IDB_NINJA10 785 #define IDB_NINJA1 786 #define IDB_NINJA0D 788 #define IDB_NINJA0C 790 #define IDB_NINJA0B 792 #define IDB_NINJA0_ATTACK 795 #define IDB_NINJA0 796 #define IDB_MISSLE40B 797 #define IDB_MISSLE39B 798 #define IDB_MISSLE38B 799 #define IDB_MISSLE37B 800 #define IDB_MISSLE36B 801 #define IDB_MISSLE35B 802 #define IDB_MISSLE34B 803 #define IDB_MISSLE33B 804 #define IDB_MISSLE32B 805 #define IDB_MISSLE31B 806 #define IDB_MISSLE30B 807 #define IDB_MISSLE29B 808 #define IDB_MISSLE28B 809 #define IDB_MISSLE27B 810 #define IDB_MISSLE26B 811 #define IDB_MISSLE25B 812 #define IDD_SNDDRIVER 815 #define IDW_CHAINSAW_SOUND 818 #define IDW_FLAMETHROWER 819 #define IDW_DEATH 820 #define IDW_SEAL_DEATH 821 #define IDW_HUGGER_DEATH 822 #define IDW_FROG_DEATH 823 #define IDW_SOUNDTRACK 824 #define IDW_BREAKDOWN 826 #define IDW_BANG 827 #define IDP_XEVILPALETTE 828 #define IDB_CHOPPERBOY3B 829 #define IDB_CHOPPERBOY2B 830 #define IDW_SOUNDTRACK_SEAL 830 #define IDW_SOUNDTRACK_LEVELS 831 #define IDB_DOPPEL2 831 #define IDW_PISTOL 832 #define IDB_CLOAK2 832 #define IDB_CLOAKC 832 #define IDW_MGUN 833 #define IDB_MAGICBLOCK 833 #define IDW_LAUNCHER 834 #define IDB_WINNERS_DRUGS 834 #define IDW_EXPLOSION 835 #define IDB_TAKE_CANDY 836 #define IDB_STRANGLE_CAT 837 #define IDD_TIMESTAMPFAILED 837 #define IDB_SQUANCH_BIG 838 #define IDB_SKULL 839 #define IDD_KEYS 839 #define IDB_PYRAMID 840 #define IDB_PENT 841 #define IDB_NICE_DAY 842 #define IDB_KILL_PARENTS 843 #define IDB_FIST 844 #define IDB_DROP_SCHOOL 845 #define IDB_BEAT_DOG 846 #define IDB_BCEAGLE 847 #define IDB_CHOPPERBOY4B 848 #define IDB_DOG_DEAD 849 #define IDB_DOG9 850 #define IDB_DOG5 851 #define IDB_DOG4 852 #define IDB_DOG22 852 #define IDB_DOG3_ATTACK 853 #define IDB_DOG3 854 #define IDB_DOG2_ATTACK 855 #define IDB_DOG22_ATTACK 856 #define IDB_DOG21_ATTACK 857 #define IDB_DOG20B 858 #define IDB_DOG20 859 #define IDB_DOG2 860 #define IDB_DOG1B 861 #define IDB_DOG1_ATTACK 862 #define IDB_DOG18 863 #define IDB_DOG11B 864 #define IDB_DOG11_ATTACK 865 #define IDB_DOG11 866 #define IDB_DOG10B 867 #define IDB_DOG10_ATTACK 868 #define IDB_DOG10 869 #define IDB_DOG1 870 #define IDB_DOG0B 871 #define IDB_DOG0_ATTACK 872 #define IDB_DOG0 873 #define IDB_DOGWHISTLE 874 #define IDD_WEAPONLIST 875 #define IDB_MOVER 876 #define IDB_MOVERSQUARE 877 #define IDW_DOG_DEATH 877 #define IDB_VERTMOVERSQUARE 877 #define IDW_LASER 878 #define IDW_HERO_ATTACK 879 #define IDW_NINJA_ATTACK 880 #define IDW_DOG_ATTACK 881 #define IDW_CHOP_DEATH 882 #define IDW_DOPPEL_USE 883 #define IDW_CLOAK_USE 884 #define IDW_TRANS_USE 885 #define IDW_SHIELD_USE 886 #define IDW_NINJA_DEATH 887 #define IDW_FROGGUN 888 #define IDW_LANCER 889 #define IDW_SWAPPER 890 #define IDB_DOG21 893 #define IDB_CRACKPIPE 894 #define IDB_BLOODG6 939 #define IDB_BLOODG9 940 #define IDB_BACKGROUND 953 #define IDB_BACKGROUND2 954 #define IDB_BACKGROUND3 955 #define IDB_LAUNCHER1 958 #define IDB_LAUNCHER2 959 #define IDB_LAUNCHER3 960 #define IDB_LAUNCHER4 961 #define IDB_LAUNCHER5 962 #define IDB_LAUNCHER6 963 #define IDB_LAUNCHER7 964 #define IDB_LAUNCHER8 965 #define IDB_LAUNCHER9 966 #define IDB_LAUNCHER10 967 #define IDB_LAUNCHER11 968 #define IDB_LAUNCHER12 969 #define IDB_BACKGROUND4 972 #define IDB_BACKGROUND5 973 #define IDB_WALL1 975 #define IDB_WALL2 975 #define IDB_OUTSIDE3 978 #define IDB_PISTOL1 979 #define IDB_OUTSIDE4 980 #define IDB_UPDOWN2 981 #define IDB_LADDER2 982 #define IDB_MOVERSQUARE2 983 #define IDB_MOVER2 984 #define IDB_OIL12 985 #define IDB_OIL15 986 #define IDB_OIL25 987 #define IDB_OIL26 988 #define IDB_OIL27 989 #define IDB_OIL28 990 #define IDB_OIL29 991 #define IDB_OIL30 992 #define IDB_OIL31 993 #define IDB_OIL32 994 #define IDB_OIL33 995 #define IDB_OIL34 996 #define IDB_OIL35 997 #define IDB_OIL36 998 #define IDB_OIL37 999 #define IDB_OIL38 1000 #define IDB_OIL39 1001 #define IDB_OIL4 1002 #define IDB_OIL40 1003 #define IDB_OIL6 1004 #define IDB_OIL9 1005 #define IDB_PISTOL9 1006 #define IDB_PISTOL8 1007 #define IDC_GAMESTYLE 1008 #define IDB_PISTOL7 1008 #define IDC_STYLESCENARIOS 1008 #define IDC_RADIO2 1009 #define IDB_PISTOL6 1009 #define IDC_GAMESTYLE2 1009 #define IDC_OBSERVER 1009 #define IDC_STYLELEVELS 1009 #define IDC_NINEKEY 1009 #define IDC_RADIO3 1010 #define IDB_PISTOL5 1010 #define IDC_RADIO4 1011 #define IDB_PISTOL4 1011 #define IDC_RADIO5 1012 #define IDB_PISTOL3 1012 #define IDC_STYLEDUEL 1012 #define IDB_PISTOL2 1013 #define IDB_PISTOL12 1014 #define IDB_PISTOL11 1015 #define IDB_PISTOL10 1016 #define IDB_ROCKHI 1017 #define IDC_NUMMACHINES 1019 #define IDC_NUMHUMANS 1020 #define IDC_RADIO1 1021 #define IDC_STYLETRAINING 1021 #define IDC_FOURKEY 1021 #define IDC_ROOMWIDTH 1022 #define IDC_ROOMHEIGHT 1023 #define IDC_TAB 1024 #define IDC_COMBO1 1025 #define IDC_SOUNDONOFF 1026 #define IDB_BGALIEN 1026 #define IDB_BGHELL2OLD 1027 #define IDC_GAMESPEED 1028 #define IDB_BGHELL3 1028 #define IDB_BGINDUSTRIAL 1028 #define IDC_SOUNDTRACKVOL 1029 #define IDC_EFFECTVOL 1030 #define IDB_ARROW_R 1030 #define IDB_RARROW_R 1030 #define IDB_BGHELL4 1031 #define IDB_BGIND1 1032 #define IDB_BGJESUS 1033 #define IDC_FULLSCREEN 1035 #define IDC_F5BUTTON 1036 #define IDB_ARROW_UP 1036 #define IDB_ARROW_L 1037 #define IDB_ARROW_DN_R 1038 #define IDB_ARROW_UP_R 1039 #define IDB_RARROW_UP_R 1039 #define IDB_ARROW_DN_L 1040 #define IDC_DIFFICULTY1 1040 #define IDB_ARROW_UP_L 1041 #define IDC_DIFFICULTY2 1041 #define IDC_SOUNDTYPE 1044 #define IDC_RADIO8 1046 #define IDC_RADIO9 1047 #define IDC_RADIO10 1048 #define IDC_UL 1051 #define IDC_PLAYERSTATIC 1052 #define IDC_WEAPONUSE 1053 #define IDC_COOPERATIVE 1054 #define IDC_MYSTATIC 1056 #define IDC_BUTTON1 1058 #define IDC_EDIT1 1059 #define IDC_EDIT2 1060 #define IDC_EDIT3 1061 #define IDC_PLAYER 1062 #define IDB_BGHELL1 1063 #define IDC_UP 1066 #define IDC_UR 1067 #define IDC_L 1068 #define IDC_CENTER 1069 #define IDC_R 1070 #define IDB_ARROW_DN 1071 #define IDC_LL 1071 #define IDB_PEPPERORIG 1072 #define IDC_DOWN 1072 #define IDB_PILLS 1073 #define IDC_LR 1073 #define IDC_REFILLMACHINES 1073 #define IDC_WEAPONCHANGE 1074 #define IDC_STYLEKILL 1074 #define IDB_HICHOPPERBOY0 1075 #define IDC_WEAPONDROP 1075 #define IDC_STYLEEXTENDED 1075 #define IDB_HICHOPPERBOY0B 1076 #define IDC_ITEMUSE 1076 #define IDC_DRAWBACKGROUND 1076 #define IDB_HICHOPPERBOY0C 1077 #define IDC_ITEMCHANGE 1077 #define IDB_HICHOPPERBOY0D 1078 #define IDC_ITEMDROP 1078 #define IDC_CHAT 1079 #define IDB_HICHOPPERBOY0E 1080 #define IDC_VERSION 1081 #define IDB_HICHOPPERBOY0F 1082 #define IDC_LICENSETEXT 1082 #define IDB_HICHOPPERBOY1 1083 #define IDC_HUMAN 1083 #define IDB_HICHOPPERBOY1B 1084 #define IDB_HICHOPPERBOY1C 1085 #define IDB_HICHOPPERBOY1D 1086 #define IDB_HICHOPPERBOY1E 1087 #define IDB_HICHOPPERBOY1F 1088 #define IDB_HICHOPPERBOY2 1089 #define IDB_HICHOPPERBOY2B 1090 #define IDB_HICHOPPERBOY2C 1091 #define IDB_HICHOPPERBOY2D 1092 #define IDB_HICHOPPERBOY3 1093 #define IDB_HICHOPPERBOY3B 1094 #define IDB_HICHOPPERBOY3C 1095 #define IDB_HICHOPPERBOY3D 1096 #define IDB_HICHOPPERBOY25 1097 #define IDB_HICHOPPERBOY4 1098 #define IDB_HICHOPPERBOY4B 1099 #define IDB_HICHOPPERBOY4C 1100 #define IDB_HICHOPPERBOY4D 1101 #define IDB_HICHOPPERBOY5 1102 #define IDB_WALL3 1103 #define IDB_NEWPISTOL0 1106 #define IDB_NEWPISTOL1 1107 #define IDB_NEWPISTOL2 1108 #define IDB_NEWPISTOL3 1109 #define IDB_NEWPISTOL4 1110 #define IDB_NEWPISTOL5 1111 #define IDB_NEWPISTOL6 1112 #define IDB_NEWPISTOL7 1113 #define IDB_NEWPISTOL8 1114 #define IDB_NEWPISTOL9 1115 #define IDB_NEWPISTOL10 1116 #define IDB_NEWPISTOL11 1117 #define IDB_NEWLAUNCHER0 1118 #define IDB_NEWLAUNCHER1 1119 #define IDB_NEWLAUNCHER2 1120 #define IDB_NEWLAUNCHER3 1121 #define IDB_NEWLAUNCHER4 1122 #define IDB_NEWLAUNCHER5 1123 #define IDB_NEWLAUNCHER6 1124 #define IDB_NEWLAUNCHER7 1125 #define IDB_NEWLAUNCHER8 1126 #define IDB_NEWLAUNCHER9 1127 #define IDB_NEWLAUNCHER10 1128 #define IDB_NEWLAUNCHER11 1129 #define IDB_CAFFINE 1130 #define IDB_HIWALL 1132 #define IDB_HORIZMOVERSQUARE 1133 #define IDB_HIWALL2 1135 #define IDB_HILADDER2 1136 #define IDB_HIUPDOWN 1137 #define IDB_HIDOOR1 1138 #define IDB_HIDOOR2 1139 #define IDB_HIOUTSIDE 1140 #define IDB_BGALIENNU 1141 #define IDB_BGHELL2 1142 #define IDB_HICHOPPERBOY22 1143 #define IDB_HICHOPPERBOY22B 1144 #define IDB_HICHOPPERBOY22C 1145 #define IDB_HICHOPPERBOY22D 1146 #define IDD_DIFFICULTY 1147 #define IDB_HIER1 1148 #define IDB_HIERBLOK 1149 #define IDB_BITMAP1 1150 #define IDB_HIOUTSIDE1 1151 #define IDB_HIOUTSIDE2 1152 #define IDB_HILADDER 1153 #define IDB_BITMAP2 1154 #define IDB_HIHERO0 1155 #define IDB_HIHERO0F 1156 #define IDB_HIHERO0C 1157 #define IDB_HIHERO0D 1158 #define IDB_HIHERO0E 1159 #define IDB_HIHERO0B 1160 #define IDB_HIHERO5 1161 #define IDB_HHERO5 1161 #define IDB_HIHERO1 1162 #define IDB_HIHERO1B 1163 #define IDB_HIHERO1C 1164 #define IDB_HIHERO1D 1165 #define IDB_HIHERO1E 1166 #define IDB_HIHERO1F 1167 #define IDD_KEYSETS 1168 #define IDB_YARROW_UP_R 1197 #define IDB_YARROW_UP_L 1198 #define IDB_YARROW_UP 1199 #define IDB_YARROW_R 1200 #define IDB_YARROW_L 1201 #define IDB_YARROW_DN_R 1202 #define IDB_YARROW_DN_L 1203 #define IDB_YARROW_DN 1204 #define IDB_GARROW_UP_R 1205 #define IDB_GARROW_UP_L 1206 #define IDB_GARROW_UP 1207 #define IDB_GARROW_R 1208 #define IDB_GARROW_L 1209 #define IDB_GARROW_DN_R 1210 #define IDB_GARROW_DN_L 1211 #define IDB_GARROW_DN 1212 #define IDB_HIALTAR 1216 #define IDB_HIALTARB 1217 #define IDB_HHERO0 1218 #define IDB_HHERO0F 1219 #define IDB_HHERO0C 1220 #define IDB_HHERO0D 1221 #define IDB_HHERO0E 1222 #define IDB_HHERO0B 1223 #define IDI_ICON1 1230 #define IDB_BARROW_UP_R 1230 #define IDB_BARROW_UP_L 1231 #define IDB_BARROW_UP 1232 #define IDB_BARROW_R 1233 #define IDB_BARROW_L 1234 #define IDB_BARROW_DN_R 1235 #define IDB_BARROW_DN_L 1236 #define IDB_BARROW_DN 1237 #define IDB_HITSHIELD 1239 #define IDB_HINSHIELD 1240 #define IDB_HIWEIGHT 1241 #define IDB_HIERUPDOWN 1242 #define IDB_HIERBLOK2 1243 #define IDB_HICHOPPERBOY21D 1244 #define IDB_HICHOPPERBOY21B 1245 #define IDB_HICHOPPERBOY21C 1246 #define IDB_HICHOPPERBOY21 1247 #define IDB_HIMEDKIT 1266 #define IDB_HIALTARC 1269 #define IDR_XEVILPAL 1270 #define IDB_TEST 1271 #define IDD_KEYHIT 1272 #define IDB_LOGOB4 1273 #define IDB_DISPLAYBITMAP 1274 #define IDB_WHEELBACKGROUND 1274 #define IDB_NAPALMS 1275 #define IDB_NAPALM1 1276 #define IDB_NAPALM2 1277 #define IDB_NAPALM3 1278 #define IDB_NAPALM4 1279 #define IDB_HHERO0B_ATTACK 1282 #define IDB_HHERO10_ATTACK 1288 #define IDB_HHERO10B_ATTACK 1289 #define IDB_HHERO2 1290 #define IDB_HIDOG0B 1292 #define IDB_HIDOG0 1293 #define IDB_HIDOG0_ATTACK 1296 #define IDB_HIDOG1_ATTACK 1297 #define IDB_HIDOG0_TONGUE 1298 #define IDB_HININJA5 1301 #define IDB_HININJA1F 1302 #define IDB_HININJA0B 1303 #define IDB_HININJA0C 1304 #define IDB_HININJA0D 1305 #define IDB_HININJA0E 1306 #define IDB_HININJA0F 1307 #define IDB_HININJA1 1308 #define IDB_HININJA1B 1309 #define IDB_HININJA1C 1310 #define IDB_HININJA1D 1311 #define IDB_HININJA1E 1312 #define IDB_HININJA0 1313 #define IDB_HIENFORCER1B 1314 #define IDB_HIENFORCER0B 1315 #define IDB_HIENFORCER1 1316 #define IDB_HIENFORCER0 1317 #define IDB_SEALDEAD 1318 #define IDB_HIHOMEB 1319 #define IDB_HIHOMEC 1320 #define IDB_HITRAPDOOR 1321 #define IDB_SEAL0 1322 #define IDB_SEAL0B 1323 #define IDB_SEAL1 1324 #define IDB_SEAL1B 1325 #define IDB_SEAL5 1326 #define IDB_HIHOME 1327 #define IDB_HIDOG22_ATTACK 1328 #define IDB_HIDOG21_ATTACK 1329 #define IDB_HIDOG2_ATTACK 1330 #define IDB_HIDOG3_ATTACK 1331 #define IDB_HIDOG5B 1332 #define IDB_HIDOG5 1333 #define IDB_HIDOG21 1334 #define IDB_HIDOG22 1335 #define IDB_HIDOGDEAD 1336 #define IDB_HIDOG21B 1337 #define IDB_HIDOG22B 1338 #define IDB_HIDOG2 1339 #define IDB_HIDOG3 1340 #define IDB_LOGOB5 1341 #define IDB_TITLE 1341 #define IDB_HITEXTSQUARE 1342 #define IDB_LANCER1 1343 #define IDB_HIBOMB0 1344 #define IDB_HIBOMB1 1345 #define IDB_HIBOMB2 1346 #define IDB_HIBOMB3 1347 #define IDB_HIBOMB4 1348 #define IDB_HIBOMB5 1349 #define IDB_HIBOMB6 1350 #define IDB_HIBOMBBLK 1351 #define IDB_HIPISTOL 1352 #define IDB_HILAUNCHER 1353 #define IDB_MGUN1 1354 #define IDB_NONE 1355 #define IDB_LASERS 1356 #define IDB_CLOAK1 1357 #define IDB_CLOAKB 1357 #define IDB_CLOAK3 1358 #define IDB_CLOAKD 1358 #define IDB_CLOAK4 1359 #define IDB_CLOAKE 1359 #define IDB_CLOAK5 1360 #define IDB_CLOAKF 1360 #define IDB_FLAME2 1361 #define IDB_FIREBALLB 1361 #define IDB_FLAME3 1362 #define IDB_FIREBALLC 1362 #define IDB_ENFORCER0C 1365 #define IDB_ENFORCER0A 1366 #define IDB_ENFORCER1C 1370 #define IDB_ENFORCER1A 1371 #define IDB_HIHERO4 1372 #define IDB_HHERO4 1372 #define IDB_HIHERO2_ATTACK 1373 #define IDB_HHERO2_ATTACK 1373 #define IDB_HIHERO3_ATTACK 1374 #define IDB_HIHERO10 1375 #define IDB_HIHERO10B 1376 #define IDB_CHAINSAW25C 1377 #define IDB_CHAINSAW33C 1378 #define IDB_HIHERO22_ATTACK 1379 #define IDB_HHERO22_ATTACK 1379 #define IDB_HIHERO21_ATTACK 1380 #define IDB_HININJA3D 1381 #define IDB_HIHERO20 1382 #define IDB_HIHERO20B 1385 #define IDB_HIHERO19 1386 #define IDB_HHERO18 1386 #define IDB_HININJA_DEAD 1399 #define IDB_HININJA2 1400 #define IDB_HININJA2B 1401 #define IDB_HININJA2C 1402 #define IDB_HININJA2D 1403 #define IDB_HININJA3 1404 #define IDB_HININJA3B 1405 #define IDB_HININJA3C 1406 #define IDB_HIHERO_DEAD 1407 #define IDB_HHERO_DEAD 1407 #define IDB_HIENFORCER_DEAD 1408 #define IDB_HIWALKER18B 1410 #define IDB_HIWALKER0B 1411 #define IDB_HIWALKER0C 1412 #define IDB_DRAGONBODY 1413 #define IDB_HIWALKER0D 1414 #define IDB_DRAGONHEAD 1415 #define IDB_DRAGONDEAD 1416 #define IDB_HIWALKER2 1417 #define IDB_HIWALKER_DEAD 1418 #define IDB_HIWALKER18 1419 #define IDB_HIWALKER2B 1420 #define IDB_HIWALKER4 1421 #define IDB_HIWALKER4B 1422 #define IDB_HIWALKER4C 1423 #define IDB_HIWALKER4D 1424 #define IDB_HIWALKER5 1425 #define IDB_HIWALKER5B 1426 #define IDB_HIWALKER5C 1427 #define IDB_HIWALKER5D 1428 #define IDB_HIWALKER0 1429 #define IDB_HIWALKER3 1430 #define IDB_HIWALKER3B 1431 #define IDB_HIWALKER1 1432 #define IDB_HIWALKER1B 1433 #define IDB_HIWALKER1C 1434 #define IDB_HIWALKER1D 1435 #define IDD_CONNECTSERVER 1436 #define IDB_HIFIREDEMON5B 1436 #define IDD_RUNSERVER 1437 #define IDB_HIFIREDEMON5 1437 #define IDB_XEVIL 1438 #define IDB_STOP 1439 #define IDB_HIFIREDEMON22 1440 #define IDB_HANDTOHAND 1441 #define IDB_HIFIREDEMON0 1442 #define IDB_HIFIREDEMON0B 1443 #define IDB_HIFIREDEMON1 1444 #define IDB_HIFIREDEMON1B 1445 #define IDB_HIFIREDEMON_DEAD 1446 #define IDB_HIFIREDEMON4 1447 #define IDB_HIFIREDEMON3 1448 #define IDB_HIFIREDEMON2 1449 #define IDB_HININJA22_ATTACK 1454 #define IDB_HININJA0_ATTACK 1455 #define IDB_HININJA3_ATTACK 1456 #define IDB_HININJA1_ATTACK 1457 #define IDB_HININJA2_ATTACK 1458 #define IDB_HININJA22 1459 #define IDB_HININJA22B 1460 #define IDB_HININJA21 1461 #define IDB_HIFLAG 1462 #define IDB_DROPLIFTABLE 1463 #define IDB_SUICIDEBUTTON 1464 #define IDB_FIREBALLICON 1465 #define IDB_FIRE 1466 #define IDD_STORY 1466 #define IDB_HIHUGGER_RED0 1470 #define IDB_HIHUGGER_RED0B 1472 #define IDB_HIHUGGER_RED5 1474 #define IDB_HIHUGGER_RED4 1476 #define IDB_HININJA10B 1478 #define IDB_HININJA10 1480 #define IDB_HININJA11F 1482 #define IDB_HININJA10C 1484 #define IDB_HIHUGGER_RED_DEAD 1485 #define IDB_HININJA10D 1486 #define IDB_HININJA10F 1487 #define IDB_HININJA11C 1490 #define IDB_HIHUGGER_RED1 1491 #define IDB_HIHUGGER_RED1B 1492 #define IDB_HIHUGGER_RED12 1493 #define IDB_HIHUGGER_RED12B 1494 #define IDB_HIHUGGER_RED15 1495 #define IDB_HIHUGGER_RED16 1496 #define IDB_HIHUGGER_RED16B 1497 #define IDB_HIHUGGER_RED17 1498 #define IDB_HIHUGGER_RED17B 1499 #define IDB_HIHUGGER_RED6 1500 #define IDB_HIHUGGER_RED6B 1501 #define IDB_HIHUGGER_RED4B 1502 #define IDB_PRICKLY 1503 #define IDB_HININJA11B 1505 #define IDB_UNUSEDBLOCK 1506 #define IDB_HININJA11D 1507 #define IDB_HININJA11E 1508 #define IDB_HININJA10E 1510 #define IDB_HININJA10_ATTACK 1511 #define IDB_HININJA11_ATTACK 1512 #define IDB_HININJA21_ATTACK 1513 #define IDB_HIHUGGER_GREEN0 1514 #define IDB_HIHUGGER_GREEN0B 1515 #define IDB_HIHUGGER_GREEN4 1516 #define IDB_HIHUGGER_GREEN4B 1517 #define IDB_HIHUGGER_GREEN5 1518 #define IDB_HIHUGGER_GREEN6 1519 #define IDB_HIHUGGER_GREEN6B 1520 #define IDB_HIHUGGER_GREEN_DEAD 1521 #define IDB_MDWALL 1522 #define IDB_MD1WALL 1522 #define IDB_MDDOOR1 1523 #define IDB_MD1DOOR1 1523 #define IDB_MDLADDER 1524 #define IDB_MD1LADDER 1524 #define IDB_MDMOVER 1525 #define IDB_MD1MOVER 1525 #define IDB_MDVERTMOVERSQUARE 1526 #define IDB_MD1VERTMOVERSQUARE 1526 #define IDB_MDOUTSIDE 1527 #define IDB_MD1OUTSIDE 1527 #define IDB_MDUPDOWN 1528 #define IDB_MD1UPDOWN 1528 #define IDB_MDDOOR2 1529 #define IDB_MD1DOOR2 1529 #define IDB_MDHORIZMOVERSQUARE 1530 #define IDB_MD1HORIZMOVERSQUARE 1530 #define IDB_BLACK 1531 #define IDB_MDBACKGROUND 1532 #define IDB_MD1BACKGROUND 1532 #define IDB_HININJA18 1533 #define IDB_MD2WALL 1534 #define IDB_MD2DOOR2 1535 #define IDB_MD2DOOR1 1536 #define IDB_MD2HORIZMOVERSQUARE 1537 #define IDB_HININJA18B 1538 #define IDB_AUTOLANCER 1539 #define IDB_DEMONSUMMONER 1540 #define IDB_MD2LADDER 1541 #define IDB_HIDDOG0 1542 #define IDB_HIDDOG0_ATTACK 1543 #define IDB_HIDDOG21_ATTACK 1544 #define IDB_HIDDOG22_ATTACK 1545 #define IDB_HIDDOG2_ATTACK 1546 #define IDB_HIDDOG0B 1547 #define IDB_HIDDOG2 1548 #define IDB_HIDDOG21 1549 #define IDB_HIDDOG21B 1550 #define IDB_HIDDOG22 1551 #define IDB_HIDDOG22B 1552 #define IDB_HIDDOG5 1553 #define IDB_HIDDOG5B 1554 #define IDB_HIDDOGDEAD 1555 #define IDB_MDBACKGROUND1 1556 #define IDB_MD2MOVER 1557 #define IDB_MD2OUTSIDE1 1558 #define IDB_MD2OUTSIDE2 1559 #define IDB_MD2UPDOWN 1560 #define IDB_MD2VERTMOVERSQUARE 1561 #define IDB_MD2BACKGROUND 1562 #define IDB_SERVEROPTIONS 1563 #define IDB_MENUNEWGAME 1565 #define IDB_DRAGONHEADC 1568 #define IDB_DRAGONHEADB 1569 #define IDB_DRAGONHEADD 1572 #define IDB_MD3OUTSIDE 1578 #define IDB_MD3MOVER 1579 #define IDB_MD3BACKGROUND 1580 #define IDB_HIALIEN0I 1582 #define IDB_HIALIEN10B 1583 #define IDB_HIALIEN10C 1584 #define IDB_HIALIEN10D 1585 #define IDB_HIALIEN0 1586 #define IDB_HIALIEN0B 1587 #define IDB_HIALIEN0C 1588 #define IDB_HIALIEN0G 1592 #define IDB_HIALIEN0H 1593 #define IDB_HIALIEN10 1594 #define IDB_TROLL5 1595 #define IDB_YETI5 1595 #define IDB_TROLL0B 1596 #define IDB_YETI0B 1596 #define IDB_TROLL0C 1597 #define IDB_YETI0C 1597 #define IDB_TROLL0D 1598 #define IDB_YETI0D 1598 #define IDB_TROLL2 1599 #define IDB_YETI2 1599 #define IDB_TROLL0 1600 #define IDB_YETI0 1600 #define IDB_TROLL1 1601 #define IDB_TROLL25 1601 #define IDB_YETI25 1601 #define IDB_TROLL18 1602 #define IDB_YETI18 1602 #define IDB_TROLL18B 1603 #define IDB_YETI18B 1603 #define IDB_HIALIEN2 1604 #define IDB_HIALIEN5 1605 #define IDB_HIALIEN18 1606 #define IDB_HIALIEN18B 1607 #define IDB_HIALIEN18C 1608 #define IDB_HIALIEN18D 1609 #define IDB_HIALIEN25 1610 #define IDB_TROLL4 1611 #define IDB_YETI4 1611 #define IDB_AAANEW 1612 #define IDB_MD3WALL 1613 #define IDB_MD3LADDER 1614 #define IDB_MD3UPDOWN 1615 #define IDB_MD3DOOR1 1618 #define IDB_MD3DOOR2 1619 #define IDB_MD3HORIZMOVERSQUARE 1620 #define IDB_MD3VERTMOVERSQUARE 1621 #define IDB_TROLL9 1623 #define IDB_YETI9 1623 #define IDB_TROLL10F 1624 #define IDB_YETI10F 1624 #define IDB_TROLL10B 1625 #define IDB_YETI10B 1625 #define IDB_TROLL10C 1626 #define IDB_YETI10C 1626 #define IDB_TROLL10D 1627 #define IDB_YETI10D 1627 #define IDB_TROLL10E 1628 #define IDB_YETI10E 1628 #define IDB_TROLL10 1629 #define IDB_YETI10 1629 #define IDB_MD2OUTSIDE 1630 #define IDM_SEALSOUNDTRACK 1630 #define IDB_MD5WALL 1631 #define IDM_DEATHMARCHSOUNDTRACK 1631 #define IDB_MD4WALL 1631 #define IDB_MD5BACKGROUND 1632 #define IDM_FIRESOUNDTRACK 1632 #define IDB_MD4BACKGROUND 1632 #define IDB_MD5DOOR1 1633 #define IDM_HIVESOUNDTRACK 1633 #define IDB_MD4DOOR1 1633 #define IDB_MD5HORIZMOVERSQUARE 1634 #define IDM_KKKSOUNDTRACK 1634 #define IDM_KILLSOUNDTRACK 1634 #define IDB_MD4HORIZMOVERSQUARE 1634 #define IDB_MD5OUTSIDE 1635 #define IDM_ZEEPEEGSOUNDTRACK 1635 #define IDB_MD4OUTSIDE 1635 #define IDB_MD5UPDOWN 1636 #define IDM_NIGHTSKYSOUNDTRACK 1636 #define IDB_MD4UPDOWN 1636 #define IDB_MD5LADDER 1637 #define IDM_SWEETDARKSOUNDTRACK 1637 #define IDB_MD4LADDER 1637 #define IDB_MD5DOOR2 1638 #define IDM_TERRAEXMSOUNDTRACK 1638 #define IDB_MD4DOOR2 1638 #define IDB_MD5VERTMOVERSQUARE 1639 #define IDM_NEWSONGSOUNDTRACK 1639 #define IDB_MD4VERTMOVERSQUARE 1639 #define IDB_MD5MOVER 1640 #define IDB_MD4MOVER 1640 #define IDB_HIALIEN0D 1647 #define IDB_HIALIEN0E 1648 #define IDB_HIALIEN0F 1650 #define IDB_HIALIEN4 1651 #define IDB_FWBACKGROUND1 1652 #define IDB_FWBACKGROUND2 1653 #define IDB_FWBACKGROUND3 1654 #define IDB_FWBACKGROUND4 1655 #define IDB_HININJA21_ATTACK2 1656 #define IDB_HHERO21_ATTACK2 1657 #define IDB_HININJA_18 1658 #define IDB_HININJA_18B 1659 #define IDB_HININJA_18C 1660 #define IDB_HININJA_18D 1661 #define IDB_HININJA_18E 1662 #define IDB_HININJA_18F 1663 #define IDB_HHERO18B 1664 #define IDB_HHERO18C 1665 #define IDB_HHERO18D 1667 #define IDB_HHERO18E 1668 #define IDB_HHERO18F 1669 #define IDB_XIT 1670 #define IDB_BLOOD25 1671 #define IDB_BLOOD39 1672 #define IDB_BLOOD4 1673 #define IDB_BLOOD40 1674 #define IDB_BLOOD9 1675 #define IDB_BLOODG25 1676 #define IDB_BLOODG39 1677 #define IDB_BLOODG4 1678 #define IDB_BLOODG40 1679 #define IDB_LASER_HORIZ 1680 #define IDB_VEGETABLES 1682 #define IDB_AAANEW2 1684 #define ID_GAME_KILL 32771 #define ID_GAME_SCENARIO 32772 #define ID_NEWGAME 32777 #define ID_OPTIONS 32778 #define ID_KEYS 32779 #define ID_FULLSCREEN 32780 #define ID_WINDOWSCREEN 32781 #define ID_KEYS2 32783 #define ID_FOG 32784 #define ID_GLOW 32785 #define ID_DIFFICULTY 32786 #define ID_CONNECTSERVER 32787 #define ID_RUNSERVER 32788 #define ID_STORY 32789 #define ID_NETHELP 32790 #define ID_SURFACEMGR 32791 #define ID_RESETGFX 32792 #define IDC_NAMELABEL 65535 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 1640 #define _APS_NEXT_COMMAND_VALUE 32793 #define _APS_NEXT_CONTROL_VALUE 1085 #define _APS_NEXT_SYMED_VALUE 179 #endif #endif xevil-2.02r2.orig/win32/runserverdlg.h0100644000175000017500000000351107041422140017131 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // RunServerDlg.h : header file // #include "utils.h" ///////////////////////////////////////////////////////////////////////////// // CRunServerDlg dialog class CRunServerDlg : public CDialog { // Construction public: CRunServerDlg(CWnd* pParent = NULL); // standard constructor Boolean get_local_human(); CMN_PORT get_port() {return m_port;} const char* get_name() {return m_name;} // Dialog Data //{{AFX_DATA(CRunServerDlg) enum { IDD = IDD_RUNSERVER }; CEdit m_nameControl; UINT m_port; int m_playerObserver; CString m_name; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CRunServerDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation private: // Generated message map functions //{{AFX_MSG(CRunServerDlg) virtual BOOL OnInitDialog(); afx_msg void OnPlayer(); //}}AFX_MSG DECLARE_MESSAGE_MAP() void UpdateEnabled(); }; xevil-2.02r2.orig/win32/s_man.h0100644000175000017500000001201007041422136015503 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #ifndef S_MAN_H #define S_MAN_H #include "utils.h" #include "coord.h" #include "area.h" class Xvars; // Should have more general way of generating unique keys. // // Keys that use bitmap ids as the last 16 bits and 0x00 as the hightest // byte don't need to use these values, they are already guaranteed unique, // e.g. Moving::init_x() and Fire::init_x(). // But, if you want to use any other scheme to generate keys, use a unique // highest order byte for the scheme. #define S_MAN_OL_NONCE 0xBB // Object Locator #define S_MAN_WHEEL_NONCE 0xCC // Weapon Wheel // Manages rectangular regions of DirectDraw surfaces. Each region is // associated with an externally supplied void* key. // 1) Create the SurfaceManager // 2) Call add() for all desired rectangles // 3) Call add_complete() to generate the DirectDraw surfaces. You may not // add more rectangles after calling add_complete(). // 4) Call lookup() as desired to get the allocated for rectangle for a key. class SurfaceManager { public: SurfaceManager(int heightMax); /* EFFECTS: Create a SurfaceManager. heightMax is the maximum allowed height for any surface. */ ~SurfaceManager(); Boolean is_add_completed() {return addCompleted;} /* EFFECTS: Have all the rectangle requests been added and add_complete() called. */ void add(void* key,const Size& size,DDCOLORKEY* colorKey); /* REQUIRES: size.width > 0 && size.height > 0 size.height <= heightMax passed into the constructor. Don't add same key twice with a different size or colorKey. */ /* EFFECTS: Add a request for a rectangle of a given size. size is in stretched coordinates. The rectangle will be associated with "key". You may add() the same (key,size,colorKey) triple multiple times, it will only be allocated one rectangle. Set colorKey=NULL for no colorKey. */ LPDIRECTDRAWSURFACE lookup(Area& area,const DDCOLORKEY*& colorKey,void* key); /* REQUIRES: key was added in the add phase. */ /* MODIFIES: area, colorKey */ /* EFFECTS: Lookup the surface area for "key". Return the DirectDrawSurface for that key and set area to be the rectangle on that surface reserved for that key. */ LPDIRECTDRAWSURFACE lookup(Pos& pos,void* key); /* MODIFIES: pos */ /* EFFECTS: Convenience method. Same as other lookup(), except returns less data. */ LPDIRECTDRAWSURFACE lookup(Size& size,void* key); /* MODIFIES: size */ /* EFFECTS: Convenience method. Same as other lookup(), except the offset is returned as a Size instead of as a Pos. */ HRESULT add_complete(Xvars& xvars); /* EFFECTS: All rectangle requests have been submitted, generate the surfaces. DD_OK if success, else an error code. */ int pixels_allocated() {assert(addCompleted); return pixAllc;} int pixels_used() {assert(addCompleted); return pixUsed;} /* EFFECTS: Statistics about the layout of the surfaces. Number of pixels allocated in all the direct draw surfaces and the number actually used in the surface requests. */ int debug_pages_num(const Size& size); /* REQUIRES: size.height >= heightMax passed into the constructor. size.width >= max width of all surfaces added to the SurfaceManager. add_complete() must have been called. */ /* EFFECTS: Computes how many debugging pages will be needed to display all the surfaces in the SurfaceManager. */ void draw_debug_page(Xvars&,LPDIRECTDRAWSURFACE surf, const Size& size,int pageNum); /* REQUIRES: Requirements of debug_pages_num() plus 0 <= pageNum < debug_pages_num() */ /* EFFECTS: Draw one debugging page onto surf. surf has the given size. */ private: LPDIRECTDRAWSURFACE _lookup(Area& area,const DDCOLORKEY*& colorKey,void* key); /* EFFECTS: Internal version of lookup(). Can be called before add_complete(). */ Boolean color_key_equals(const DDCOLORKEY*,const DDCOLORKEY*); /* EFFECTS: Are the two color keys the same. Values may be NULL. */ // Has add_complete() been called. Boolean addCompleted; // The list of SurfaceSets. PtrList sets; // Passed on to SurfaceSet constructor. int heightMax; // Statistics. int pixAllc; int pixUsed; }; #endif xevil-2.02r2.orig/win32/sound.h0100644000175000017500000001451407041422136015551 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #ifndef _SOUND_H #define _SOUND_H #include #include "mmsystem.h" #include "dsound.h" #include "coord.h" #include "ui.h" #include "fileman.h" #define MAX_CHANNELS 10 //CANNOT BE 0 #define MAX_CHANNELS_OVERLAY 4 //CANNOT BE 0 struct SoundEvent { // Id locatorid; Pos position; //because the item may have just died! UINT soundid; Boolean m_init; int m_distance; }; class CMCIObject; class SoundBuffer { UINT m_soundid; IDirectSoundBuffer *m_array[MAX_CHANNELS_OVERLAY]; BYTE m_index; public: SoundBuffer(UINT p_soundid){m_index=0;m_soundid=p_soundid;} UINT getId(){return m_soundid;} void reset(){m_index=0;} IDirectSoundBuffer *getNext(); void setAt(BYTE p_index,IDirectSoundBuffer *p_buf); }; class Locator; class SoundManager { Boolean m_soundon; int m_effectsvol; int m_trackvol; Pos m_keypositions[UI_VIEWPORTS_MAX]; short m_numkeypositions; LPDIRECTSOUND m_lpDS; GUID *m_lpGUID; CTypedPtrArraym_soundbuffers; HWND m_windowowner; CWordArray m_available; Boolean m_init; SoundEvent m_soundevents[MAX_CHANNELS]; SoundEvent m_loopingsounds[MAX_CHANNELS]; int m_numloopingsounds; Locator *m_locator; MCI_OPEN_PARMS MCIOpen; // MCI_OPEN structure MCI_PLAY_PARMS MCIPlay; // MCI_PLAY structure MCI_SET_PARMS MCISet; // MCI_SET structure MCI_STATUS_PARMS MCIStatus; // MCI_STATUS structure Boolean m_cdinitialized; Boolean m_mediapresent; Boolean m_midiinitialized; int m_nTrackCount; int byTrackNumber; BOOL m_midiloop; CString m_midifilename; HMIDIOUT m_hmidiout; CString m_randomdirectory; int m_nummidifiles; BOOL m_pausedflag; //was the midi file paused?? CTypedPtrArraym_midifilenames; CMCIObject *m_basicsound; TempFileManager *tempfilemanager; const char *tempmidifilename; public: SoundManager(Boolean p_onoff,Locator *locator); ~SoundManager(){destroyAllSound();} Boolean isSoundOn(){return m_soundon;} void turnOnoff(Boolean p_bool){m_soundon=p_bool;} void setTrackVolume(int p_int){m_trackvol=p_int;} void setEffectsVolume(int p_int){m_effectsvol=p_int;} int getTrackVolume(){return m_trackvol;} int getEffectsVolume(){return m_effectsvol;} Boolean init(HWND hwndOwner);//initializes SoundManager with the HWND as owner Boolean removeSound(UINT p_index);//removes sound at index p_index Boolean playSound(SoundName p_resourceid,int p_pan,int p_volume,Boolean p_loop,Boolean p_overridedup=False); /* Play sound using cross platform SoundName. */ void playMidi(SoundName name, BOOL loop, int delay); /* Play midi using cross platform SoundName. */ Boolean playSoundById(UINT p_resourceid,int p_pan,int p_volume,Boolean p_loop,Boolean p_overridedup=False); /* Play sound using platform-specific resource id. */ Boolean stopSound(SoundName p_resourceid); Boolean destroyAllSound(); Boolean submitRequest(SoundRequest p_req); SoundEvent getEvent(int p_index); void clearRegisteredSounds(); void requestCDtrack(BYTE p_byTrackNumber,int p_delay);//plays CD track,delay=seconds int playCDtrack ();//restarts current tracknumber void stopCD(); int getTrackCount(); void requestMIDItrack(const CString &p_request,BOOL p_loop,int p_delay); void requestMIDItrack(UINT p_id,BOOL p_loop,int p_delay);//-1 == random void requestRandomMIDItrack(const CString &p_directory,BOOL p_loop,int p_delay); void playMIDItrack(); void playMIDItrack(const CString & p_filename, BOOL p_loop); void stopMIDI(); void pauseMIDI(); void resumeMIDI(); void setTempFileManager(TempFileManager *tfm){tempfilemanager = tfm;} Boolean init_cd(HWND p_wnd); Boolean media_check(); Boolean init_midi(HWND p_wnd); void setKeyPosition(short p_index,Pos p_pos){m_keypositions[p_index]=p_pos;} Pos getKeyPosition(short p_index){return m_keypositions[p_index];} void setNumKeyPositions(short p_index){m_numkeypositions=p_index;} short getNumKeyPositions(){return m_numkeypositions;} private://private methods Boolean removeSoundbyIndex(int p_index); int addSound(UINT p_resourceid,Boolean p_overridedup);//gets resource id and returns sound index used for later playing //override dup tells manager not to make MAX_CHANNELS_OVERLAY many DSBUFS Boolean DSParseWaveResource(void *pvRes,WAVEFORMATEX **ppWaveHeader,BYTE **ppbWaveData,DWORD *pcbWaveSize); IDirectSoundBuffer * DSLoadSoundBuffer(IDirectSound *pDS, LPCTSTR lpName); Boolean DSReloadSoundBuffer(IDirectSoundBuffer *pDSB, LPCTSTR lpName); Boolean DSGetWaveResource(HMODULE hModule, LPCTSTR lpName, WAVEFORMATEX **ppWaveHeader, BYTE **ppbWaveData, DWORD *pcbWaveSize);//from an id get the wave data Boolean DSFillSoundBuffer(IDirectSoundBuffer *pDSB, BYTE *pbWaveData, DWORD cbWaveSize);//loads wave data into a direct sound buffer Boolean disable();//Releases the DirectSound device Boolean loadSound(int p_index,LPSTR p_str,Boolean p_overridedup);//loads m_soundbuffers[p_index] from m_soundstringarray[p_index] void loadRandomFilenames(const CString &p_directory);//used to load midi files from a firectory static Boolean __stdcall dsEnumCallback(const GUID * lpguid,LPSTR desc,LPSTR Module, LPVOID context);//call back, the context will be a CTypedPtrArrar of GUIDs * enum { MAX_MIDI_SOUNDTRACK = 7 }; static unsigned int MIDI_SOUNDTRACK_IDS[MAX_MIDI_SOUNDTRACK]; }; #ifdef _GRDEBUG void interpretDSHresult(HRESULT p_result); #endif typedef SoundManager * SoundManagerP; #endif //_SOUND_H xevil-2.02r2.orig/win32/specialcontrols.h0100644000175000017500000000606107041422136017623 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #ifndef _SPECIALCONTROLS_H #define _SPECIALCONTROLS_H class CSpecialEdit:public CEdit { DECLARE_DYNAMIC( CSpecialEdit ) public: CSpecialEdit(){}; virtual void SpecialOnLButtonDown( UINT nFlags, CPoint &point ){CEdit::OnLButtonDown(nFlags,point);} virtual void SpecialOnLButtonUp( UINT nFlags, CPoint &point ){CEdit::OnLButtonUp(nFlags,point);} virtual void SpecialOnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags ){CEdit::OnKeyDown(nChar,nRepCnt,nFlags );} virtual void SpecialOnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags ){CEdit::OnKeyUp(nChar,nRepCnt,nFlags );} virtual void SpecialOnChar( UINT nChar, UINT nRepCnt, UINT nFlags ){CEdit::OnChar(nChar,nRepCnt,nFlags );} protected: }; class CSpecialButton :public CButton { DECLARE_DYNAMIC( CSpecialButton ) public: CSpecialButton(); //{{AFX_MSG(CPicturePushButton) afx_msg void OnLButtonDown( UINT nFlags, CPoint point ); afx_msg void OnLButtonUp( UINT nFlags, CPoint point ); afx_msg void OnMouseMove( UINT nFlags, CPoint point ); //}}AFX_MSG virtual void SpecialOnLButtonDown( UINT nFlags, CPoint &point ){OnLButtonDown(nFlags,point);} virtual void SpecialOnLButtonUp( UINT nFlags, CPoint &point ){OnLButtonUp(nFlags,point);} virtual void SpecialOnMouseMove( UINT nFlags, CPoint &point ){OnMouseMove(nFlags,point);} protected: BOOL m_state; DECLARE_MESSAGE_MAP( ) }; class CPicturePushButton :public CSpecialButton { public: CPicturePushButton(); void setPictureId(UINT p_resourceid){m_pictureid=p_resourceid;} //{{AFX_MSG(CPicturePushButton) afx_msg void OnLButtonDown( UINT nFlags, CPoint point ); afx_msg void OnLButtonUp( UINT nFlags, CPoint point ); afx_msg void OnMouseMove( UINT nFlags, CPoint point ); //}}AFX_MSG virtual void SpecialOnLButtonDown( UINT nFlags, CPoint &point ){OnLButtonDown(nFlags,point);} virtual void SpecialOnLButtonUp( UINT nFlags, CPoint &point ){OnLButtonUp(nFlags,point);} virtual void SpecialOnMouseMove( UINT nFlags, CPoint &point ){OnMouseMove(nFlags,point);} private: virtual void DrawItem(LPDRAWITEMSTRUCT); UINT m_pictureid; CBitmap m_bitmap; BOOL m_init; DECLARE_MESSAGE_MAP( ) }; #endif //_SPECIALCONTROLS_H xevil-2.02r2.orig/win32/stdafx.h0100644000175000017500000000267407041422134015714 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers #include // MFC core and standard components #include // MFC extensions #ifndef _AFX_NO_AFXCMN_SUPPORT #include // MFC support for Windows 95 Common Controls #endif // _AFX_NO_AFXCMN_SUPPORT #include #include //DIRECT DRAW #include "ddraw.h" #define new DEBUG_NEW xevil-2.02r2.orig/win32/storydlg.h0100644000175000017500000000317307041422134016265 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // StoryDlg.h : header file // ///////////////////////////////////////////////////////////////////////////// // CStoryDlg dialog class CStoryDlg : public CDialog { // Construction public: CStoryDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CStoryDlg) enum { IDD = IDD_STORY }; // NOTE: the ClassWizard will add data members here //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CStoryDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(CStoryDlg) // NOTE: the ClassWizard will add member functions here //}}AFX_MSG DECLARE_MESSAGE_MAP() }; xevil-2.02r2.orig/win32/timedlg.h0100644000175000017500000000323207041422134016037 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // TimeDlg.h : header file // ///////////////////////////////////////////////////////////////////////////// // TimeStampFailedDlg dialog class TimeStampFailedDlg : public CDialog { // Construction public: TimeStampFailedDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(TimeStampFailedDlg) enum { IDD = IDD_TIMESTAMPFAILED }; // NOTE: the ClassWizard will add data members here //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(TimeStampFailedDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(TimeStampFailedDlg) virtual void OnCancel(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; xevil-2.02r2.orig/win32/ui.h0100644000175000017500000002040707041422134015032 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "ui.h" Header for user interface module. /* Overview: Draws the world. Manages viewports. Holds x variables. Follows an intel if one is registered. Sends commands to the intel if it is human. For weapon commands, tapping key gives most recently pressed direction or IT_CENTER if there is none. */ /* NOTE: A Ui is never destroyed. Allocates memory for transfering to callbacks and event handlers. */ #ifndef UI_H #define UI_H #define UI_VIEWPORTS_MAX 2 // Include Files #include #include "utils.h" #include "coord.h" #include "world.h" #include "locator.h" #include "id.h" #include "intel.h" #include "game_style.h" #include "ui_cmn.h" #include "glowpal.h" #include "fogpal.h" #include "palmod.h" #include "firepal.h" // Data Structures enum UIinput {UI_KEYS_RIGHT,UI_KEYS_LEFT}; enum UIkeyset {UIsun3, UIdecmips, UIiris, UIncd, UItektronix, UIsun4, UIrsaix, UIsun4_sparc,UImac,UIalpha,UIpc,UIunspecifiedKeyset}; class Ui; typedef Ui *UiP; class Intel; typedef Intel *IntelP; class CXEvilWnd; typedef CXEvilWnd *CXEvilWndP; class XEvilWindowStatsWnd; typedef XEvilWindowStatsWnd *XEvilWindowStatsWndP; class StatusWnd; typedef StatusWnd *StatusWndP; class FKeysDlg; class SoundManager; typedef SoundManager *SoundManagerP; // First index is an IT_COMMAND, sedond is one of two. typedef char UIkeymap[UI_KEYS_MAX][2]; // Should move this into ui_cmn.h class UIsettings { public: enum SOUNDTRACKTYPE{NONE=0,CD=1,WAV=2,MIDI=3}; int humansNum; int enemiesNum; Boolean enemiesRefill; Boolean pause; GameStyleType style; Quanta quanta; Boolean monoaural; Boolean sound; Boolean cooperative; SOUNDTRACKTYPE musictype; Rooms worldRooms; int soundvol;//-10000 <-> 0 int trackvol;//-10000 <-> 0 int screenmode; int difficulty; char connectHostname[R_NAME_MAX]; // UIconnectServer CMN_PORT connectPort; // UIconnectServer // empty string playerName means unspecified. char humanName[IT_STRING_LENGTH]; // UIconnectServer, UIrunServer CMN_PORT serverPort; // UIrunServer Boolean localHuman; // UIrunServer char chatReceiver[IT_STRING_LENGTH]; // UIchatRequest char chatMessage[UI_CHAT_MESSAGE_MAX + 1]; // UIchatRequest }; // Class Declarations class Ui { public: enum {SOUNDTRACKTIMER_CD=666,SOUNDTRACKTIMER_MIDI=667}; Ui(); //no display names! /* EFFECTS: Create user interface with one viewport (number 0) with world w and locator l. The memory pointed to by displayNames becomes the property of the Ui. */ virtual ~Ui(); /* NOTE: Must set_keyset on all displays before first clock. Must manually set_* all desired parameters before first reset. */ virtual int getWindowList(CTypedPtrList&p_windowlist); virtual int get_viewports_num(); /* EFFECTS: Total number of viewports in the Ui. */ // virtual int get_viewports_num_on_dpy(int dpyNum); /* EFFECTS: Get viewports and number of viewports on a single display. The viewports on a display, dpyNum, range from 0 to get_viewports_num_on(dpyNum) - 1. */ virtual int get_dpy_max(); virtual UImask get_settings(UIsettings &s); /* MODIFIES: s */ /* EFFECTS: Get all of the settings that are stored in the Ui. Mostly the menubar stuff. settingsChanges gives the fields in s that have changed since the last call of get_settings. Other fields are not guaranteed to be meaningful. Initially, nothing is changed. */ Boolean settings_changed() {return settingsChanges != UInone;} /* EFFECTS: Tells whether the the settings have changed since the last call of get_settings(). Initially is False. */ virtual void set_humans_num(int); virtual void set_enemies_num(int); virtual void set_enemies_refill(Boolean); virtual void set_style(GameStyleType); virtual void set_quanta(Quanta); virtual void set_track_volume(int); virtual void set_sound_volume(int); virtual void set_musictype(UIsettings::SOUNDTRACKTYPE); virtual void set_sound_onoff(int); virtual void set_world_rooms(const Rooms&); virtual void set_humans_playing(int); virtual void set_enemies_playing(int); virtual void set_level(const char *); virtual void set_screen_mode(Xvars::SCREENMODE p_mode); virtual Boolean other_input(); /* EFFECTS: Tells whether there has been any keyboard or mouse press other than a valid control since the last clock. */ virtual void set_input(int vNum,UIinput input); /* EFFECTS: Set the input device for viewport num. */ virtual void set_difficulty(int d); virtual void set_keyset(int dpyNum,UIkeyset keyset); virtual void set_keyset(int dpyNum,UIkeyset basis,char right[UI_KEYS_MAX][2], char left[UI_KEYS_MAX][2]); /* REQUIRES: Must be called at least once before the first clock. */ /* IMPLEMENTATION NOTE: Sets keycodes[0 and 1] */ virtual void set_pause(Boolean); /* EFFECTS: Pause/unpause. */ virtual void set_prompt_difficulty(); virtual void set_cooperative(Boolean); /* EFFECTS: Sets the cooperative flag for joint play.*/ virtual void set_role_type(RoleType); void unset_prompt_difficulty() {} virtual int get_difficulty(); /* EFFECTS: Similar to set_level_title. Prompts user for difficulty level. get_difficulty() returns user entered difficulty since last call to set_prompt_difficulty() or, DIFF_NONE if none set. */ virtual int add_viewport(); /* EFFECTS: Add another viewport and return its number. */ virtual void del_viewport(); /* EFFECTS: Delete the highest numbered viewport. */ virtual void register_intel(int n, IntelP intel); /* REQUIRES: intel is not already registered with a different viewport. */ /* EFFECTS: Registers the intel on viewport n. The viewport will now follow the object represented by intel->get_id() and send commands to it if it is human. */ virtual void unregister_intel(int n); /* REQUIRES: n is a valid viewport */ /* EFFECTS: Unregister the intel associated with viewport n, if any. Otherwise do nothing. */ virtual IntelP get_intel(int n); /* REQUIRES: n is a valid viewport */ /* EFFECTS: none, just returns intel[n] */ virtual void demo_reset(); /* EFFECTS: Like reset() but does not effect whether viewport can be scrolled. */ virtual void reset(); /* EFFECTS: Clear out all registered intels. Does NOT remove viewports. */ virtual void reset_graphics(Xvars::SCREENMODE p_newmode); /* USED when ui allready displaying. destroys windows and creates new ones.*/ virtual void set_redraw_arena(); /* EFFECTS: Next turn, the Ui must redraw everything. */ virtual Boolean process_event(int dpyNum,CMN_EVENTDATA eventdata); //return True if handled /* NOTE: Call callback last so that callback can make changes to self. */ virtual void pre_clock() = 0; /* EFFECTS: Follows the object of the registered intel if any and redraws the world and locator. */ virtual void post_clock() = 0; /* Must use static functions for callbacks because of problems with pointers to member functions in some compilers. */ static IViewportInfo* get_viewport_info(); /* EFFECTS: Return structure in static memory with info necessary to figure out the viewport around a given point. */ static void no_init_graphics() {initGraphics = FALSE;} /* EFFECTS: If called, don't initialize all graphics at startup. */ static void check_num_lock(); // static Boolean get_reduce_draw(); static void set_reduce_draw(Boolean); protected: UIsettings settings; UImask settingsChanges; static BOOL initGraphics; }; #endif xevil-2.02r2.orig/win32/uiplayer.h0100644000175000017500000002661407041422134016255 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #ifndef _UI_PLAYER_H #define _UI_PLAYER_H #include "area.h" #include "ui_cmn.h" #include "fileman.h" // Class Prototypes class AboutDialog; class CKeySets; class OptionsDlg; class CDifficulty; class CConnectDlg; class CRunServerDlg; class CStoryDlg; enum KeyStyle {UI_NINE_KEY,UI_FOUR_KEY}; class VInfoProvider: public IViewportInfo { public: virtual ViewportInfo get_info(); }; enum RecoveryState { // No errors, or after a successful recovery. RS_OK, // Attempt error recovery at the soonest possible time. RS_MUST_RECOVER, // In the process of attempting to recover, or after recovery but before we // know if recovery worked or not. RS_IN_RECOVERY, // Error recovery failed, just keep drawing and hope for the best. RS_RECOVERY_FAILED, }; // Class Declarations class UiPlayer: public Ui, public IKeyState, public IDispatcher, public IErrorRecovery { public: enum {SOUNDTRACKTIMER_CD=666,SOUNDTRACKTIMER_MIDI=667}; UiPlayer(int *argc,char **argv,WorldP w,LocatorP l, char **,char *,SoundManagerP s,DifficultyLevel dLevels[DIFFICULTY_LEVELS_NUM], Xvars::SCREENMODE mode,const char* gameVersion); ~UiPlayer(); /* EFFECTS: Create user interface with one viewport (number 0) with world w and locator l. The memory pointed to by displayNames becomes the property of the Ui. */ /* NOTE: Must set_keyset on all displays before first clock. Must manually set_* all desired parameters before first reset. */ int getWindowList(CTypedPtrList&p_windowlist); int get_viewports_num() {return viewportsNum;} /* EFFECTS: Total number of viewports in the Ui. */ int get_dpy_max(); void set_humans_playing(int); void set_enemies_playing(int); void set_level(const char *); void set_screen_mode(Xvars::SCREENMODE p_mode); Boolean other_input(); /* EFFECTS: Tells whether there has been any keyboard or mouse press other than a valid control since the last clock. */ void set_input(int vNum,UIinput input); /* EFFECTS: Set the input device for viewport num. */ void set_difficulty(int d); void set_role_type(RoleType); void set_prompt_difficulty(); int get_difficulty() {return difficulty;} /* EFFECTS: Similar to set_level_title. Prompts user for difficulty level. get_difficulty() returns user entered difficulty since last call to set_prompt_difficulty() or, DIFF_NONE if none set. */ int add_viewport(); /* EFFECTS: Add another viewport and return its number. */ void del_viewport(); /* EFFECTS: Delete the highest numbered viewport. */ void register_intel(int n, IntelP intel); /* REQUIRES: intel is not already registered with a different viewport. */ /* EFFECTS: Registers the intel on viewport n. The viewport will now follow the object represented by intel->get_id() and send commands to it if it is human. */ void unregister_intel(int n); /* REQUIRES: n is a valid viewport */ /* EFFECTS: Unregister the intel associated with viewport n, if any. Otherwise do nothing. */ IntelP get_intel(int n); /* REQUIRES: n is a valid viewport */ /* EFFECTS: none, just returns intel[n] */ void demo_reset(); /* EFFECTS: Like reset() but does not effect whether viewport can be scrolled. */ void reset(); /* EFFECTS: Clear out all registered intels. Does NOT remove viewports. */ void reset_graphics(Xvars::SCREENMODE p_newmode); /* USED when ui allready displaying. destroys windows and creates new ones.*/ void set_redraw_arena(); /* EFFECTS: Next turn, the Ui must redraw everything. */ Boolean process_event(int,CMN_EVENTDATA eventdata);//return if handled /* NOTE: Call callback last so that callback can make changes to self. */ void pre_clock(); /* EFFECTS: Follows the object of the registered intel if any and redraws the world and locator. */ void post_clock(); virtual Boolean key_down(int key,void*); /* NOTE: For implementing IKeyState. */ virtual void dispatch(ITcommand,void*); /* NOTE: For implementing IDispatcher. */ static void set_generate_xpm(const char* val) {genXPMDir = val;} /* REQUIRES: val is in static memory, never deleted */ /* EFFECTS: Set UiPlayer to auto-generate UNIX XPM images from the windows bitmaps when graphics are initialized. */ static void bmp_match_palette(const char* srcDir,const char* destDir) {bmpSrcDir = srcDir; bmpDestDir = destDir;} /* REQUIRES: srcDir and destDir are static memory, never deleted */ /* EFFECTS: Set UiPlayer to copy the bitmaps in srcDir to destDir matching the palette to the XEvil palette. */ static IViewportInfo* get_viewport_info() {return &viewInfo;} //--------------------- For IErrorRecovery -------------------// virtual Boolean attemptRecovery(); //--------------------- End IErrorRecovery -------------------// private: void set_message(const char *message); /* EFECTS: Places message on all the viewports' message bars. */ enum DRAWTYPE{ DRAW_NOTALL, // objects only DRAW_ALL, // internal redraw all DRAW_EXPOSE, // from expose event }; void full_screen_init_x(HWND p_primarywnd); //set up for fullscreen mode void window_screen_init_x(HWND p_primarywnd); //set up for windowed mode void draw(int viewportNum, DRAWTYPE changedOnly); /* REQUIRES: viewportNum is valid. */ /* EFFECTS: Draw everything in viewport number num. */ void draw_backbuffer(int viewportNum); /* NOTE: Helper for draw(). */ void interpret_key_state(); void init_x(HWND); /* EFFECTS: Initialize the X Window variables in the Ui. */ /* NOTE: Also sets vIndex,vIndexMax,meunusNum,dpyIndex. */ Boolean viewport_to_pos(int n,const Pos &pos); /* REQUIRES: n is a valid viewport num. pos is a Pos in the world. */ /* EFFECTS: Moves viewport n so that it is centered on pos. Returns whether the viewport has moved. */ void dispatch(int v,ITcommand command); /* EFFECTS: Let viewport v deal with the given command. I.e. Send it to a intel or move the viewport around. */ int get_viewport_num(HWND window); /* EFFECTS: If window is one of the arenas, returns the viewport num. Otherwise, returns -1. */ CXEvilWndP get_viewport_wnd(int p_viewport); //return the HWND associated with viewport p_viewport CWnd *findModalessWindow(HWND p_hwnd); /*searches through m_pabout,m_pkeys ect..*/ void deleteModalessWnd(CWnd *t_wnd); //delete the modalless window m_pabout,m_pkeys and NULLS them*/ int get_statsviewport_num(HWND window); /* EFFECTS: If window is one of the stats windows, returns the stats num. Otherwise, returns -1. */ StatusWndP get_stats_wnd(int p_statsport); /* EFFECTS: Return the HWND associated with statsport p_statsport. */ void update_statuses(int viewportNum,BOOL forcestatuschange=FALSE); void viewport_expose(int viewportNum); void add_surfaces_all(); /* EFFECTS: Add all surface requests to the SurfaceManager. */ void init_x_all(); /* EFFECTS: Explicitly initialize graphics for World, Locator, all objects, and status window. */ void generate_xpm(); /* EFFECTS: Generate UNIX XPM images from the windows bitmaps. */ void display_arena_message_sync(const char* message); /* EFFECTS: Synchronously display message as the arena message in all viewports. */ void update_chat_message(); /* EFFECTS: Reflect the current value of m_chatMessage into the status bar. */ void chat_process_char(char); /* EFFECTS: Deal with a key press when in chat mode. Possibly committing or aborting the chat message. */ Xvars xvars; int viewportsNum; // Total number of viewports on all displays. WorldP world; LocatorP locator; SoundManagerP soundmanager; Area viewportAreas[UI_VIEWPORTS_MAX]; // world coords, unstretched Size viewSize; // window coords, stretched Boolean intelsSet[UI_VIEWPORTS_MAX]; IntelP intels[UI_VIEWPORTS_MAX]; // Removed DISPLAYS_MAX dimension, only meaningful on X11. // Also removed the 2-keys-per command dimension, we weren't // using it on Windows anyway. unsigned char keycodes[2][UI_KEYS_MAX]; KeyStyle keyStyle; PtrList keyDispatchers; // List of KeyDispatcher UIinput inputs[UI_VIEWPORTS_MAX]; // Meaningful iff inputsSet[]. Boolean inputsSet[UI_VIEWPORTS_MAX]; Dim roomDim; Boolean otherInput; Boolean neverReset; /* So can't scroll with title screen. */ Timer arenaMessageTimer[UI_VIEWPORTS_MAX]; char *arenaMessage[UI_VIEWPORTS_MAX]; // a message or NULL. // Only need one window. CTypedPtrArraym_windowarray; CTypedPtrArraym_windowstatsarray; CTypedPtrArraym_fkeysarray; // Only need one clipper. CTypedPtrArraym_clipperarray; Timer messageTimer; int difficulty; // may be DIFF_NONE DRAWTYPE redrawAll[UI_VIEWPORTS_MAX]; Boolean deactivated; void doOptions(); void doKeys(UINT p_commandid); void retrieveKeys();//retrievs keys from m_pkeys void retrieveOptions();//retrieves options from m_poptions void retrieveDifficulty();//retrievs keys from m_pkeys void doDifficulty(); void doActivate(WORD p_fActive); void doConnect(); void doStory(); void retrieveConnect(); void doRunServer(); void retrieveRunServer(); AboutDialog *m_pabout; CKeySets *m_pkeys; CDifficulty *m_pdifficulty; OptionsDlg *m_poptions; CConnectDlg *m_pconnect; CStoryDlg *m_pstory; CRunServerDlg *m_prunserver; //used to update the window after another ::init_x int m_numhumansplaying; int m_numenemiesplaying; CString m_level; // Used to recreate menus properly. E.g. when switching from window to FS mode. RoleType m_roletype; const char* m_gameversion; // -1 means normal display, else gives the index of the SurfaceManager // debugging page we are currently displaying. int m_surfMgrPage; static LRESULT CALLBACK ViewPortProc(HWND, UINT, WPARAM,LPARAM); // The filename of the dest directory for generating XPM images. // NULL means don't generate XPM images. static const char* genXPMDir; // What's the hungarian notation for static members? Also m_? hardts. static const char* bmpSrcDir; static const char* bmpDestDir; TempFileManager tempfilemanager; // For providing information about the viewport. static VInfoProvider viewInfo; // Where we are in the process of error recovery. RecoveryState m_recoveryState; // Is the Ui currently in chat mode, the user is typing in a chat message. Boolean m_chatOn; // The chat message currently being typed in, may be empty. CString m_chatMessage; }; #endif //_UI_PLAYER_H xevil-2.02r2.orig/win32/uiserver.h0100644000175000017500000000304107041422132016252 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #ifndef _UISERVER_H #define _UISERVER_H #include "xevilserverstatus.h" // Class Declarations class UiServer: public Ui { public: enum {SOUNDTRACKTIMER_CD=666,SOUNDTRACKTIMER_MIDI=667}; UiServer(LocatorP); ~UiServer(); void pre_clock(); /* EFFECTS: Follows the object of the registered intel if any and redraws the world and locator. */ void post_clock(); int getWindowList(CTypedPtrList&p_windowlist); Boolean process_event(int dpyNum,CMN_EVENTDATA eventdata);//return if handled void set_level(const char *p_levelname); private: CXEvilServerStatus m_serverwnd; LocatorP locator; CTime m_starttime; }; #endif //_UISERVER_H xevil-2.02r2.orig/win32/wheel.h0100644000175000017500000000725307041422132015523 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #ifndef WHEEL_H #define WHEEL_H #include "utils.h" #include "coord.h" #include "locator.h" #include "xdata.h" class Wheel { public: // To indicate when a weapon is ready to fire. // Will be READY_UNDEFINED for items. enum ReadyState { READY_YES, READY_NO, READY_UNDEFINED }; enum { WHEEL_ITEM_WIDTH = 64, WHEEL_ITEM_HEIGHT = 36, }; Wheel(LocatorP); ~Wheel(); static void init_x(LocatorP,Xvars &xvars,IXCommand,void*); void setIndexByClassId(ClassId cId); /* EFFECTS: Sets index to the bitmap corresponding to the ClassId. */ /* REQUIRES: cId is the ClassId of a weapon or item or one of the special "non-existent" classes, see coord.h. */ int getIndex(){return m_item;} void setValueAtIndex(int p_value,int p_item); int getValueAtIndex(int p_item); void setReadyAtIndex(ReadyState,int p_item); void set_pos(const Pos& p_pos) {m_pos = p_pos;} // returns TRUE if actually updated BOOL update(LPDIRECTDRAWSURFACE p_buffer,LocatorP,Xvars &xvars,BOOL p_forceredraw=FALSE); // for animation void clock(); private: static void* compute_key(CMN_BITS_ID id); /* EFFECTS: Compute the key to store the wheel item for the given bitmap. Can't just use id as the key because id is very likely to be a bitmap used somewhere else in the game. E.g. the weapon wheel item for IDB_DOPPEL is different than the bitmap for the doppelganer itself. */ static void gather_bitmaps(LocatorP); /* EFFECTS: Create the list of all item/weapon bitmaps that can be in the Wheel. */ HRESULT draw(LPDIRECTDRAWSURFACE p_buffer,LocatorP,Xvars &xvars); HRESULT drawText(LPDIRECTDRAWSURFACE p_buffer,Xvars &xvars); void setIndex(int p_index); /* EFFECTS: Set current item by the index into m_bitmapids. */ // (0,0,WHEEL_ITEM_WIDTH,WHEEL_ITEM_HEIGHT*m_numbitmaps) CRect m_surfacearea; // m_alpha is how far we are from displaying previous to displaying current // m_alpha == 0 means completely showing m_itemPrev // m_alpha == 1.0 means completely showing m_item. float m_alpha; // The most recently set item. int m_item; int m_itemPrev; // Previous item. -1 means not set. // Arrays of length numbitmaps. int *m_values; ReadyState *m_ready; // Location of upper-left of wheel. Pos m_pos; // Changed since last draw. BOOL m_dirty; // Convenience. Equals (WHEEL_ITEM_WIDTH,WHEEL_ITEM_HEIGHT). static Size wheelSize; static XvarsValid valid; // The bitmap IDs for everything in the wheel. static int numbitmaps; static CMN_BITS_ID bitmapids[A_CLASSES_NUM]; // Could be smaller array. // Maps from ClassId to index into bitmapids. // Extra one for A_None itself. static int bitmapIndex[A_None + 1]; // Name of the bitmap for the Wheel background. const static CMN_BITS_ID backgroundBits; }; #endif //WHEEL_H xevil-2.02r2.orig/win32/xdata.h0100644000175000017500000003323507041421770015526 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #ifndef _XVARS_H #define _XVARS_H #include #include #include "ddraw.h" #include "utils.h" #include "coord.h" #include "s_man.h" // Methinks we could get rid of one of these. #define PALETTENTRIES 256 #define PALENTRIES 256 #define Xvars_BACKGROUND RGB(192,192,192) typedef LPDIRECTDRAWSURFACE CMN_DRAWABLE; typedef UINT CMN_BITS_ID; typedef COLORREF CMN_COLOR; typedef UINT XvarsValid; #define XVARS_VALID_INIT 0 enum IXCommand { /* Add all surfaces to the SurfaceManager. */ IX_ADD, /* Initialize all graphics if they aren't already valid. */ IX_INIT, /* List all bitmaps used by the class. Argument is a pointer to a PtrList. Fill the PtrList with newly allocated IXPixmapInfo structures. Caller must free the IXPixmapInfo structs with delete. */ IX_LIST, }; struct IXPixmapInfo { void* key; // Key into the SurfaceManager. Dir dir; // Direction corresponding to bitmap. int animNum; // Number of this bitmap in animation sequence for dir. }; struct CMN_IMAGEDATA { LPDIRECTDRAWSURFACE pixmap; LPDIRECTDRAWSURFACE mask; // offsets are stretched coordinates. Pos pixmapOffset; Pos maskOffset; }; struct CMN_EVENTDATA { HWND m_parent; MSG m_event; }; class FireXdata { public: FireXdata() {valid = XVARS_VALID_INIT;} XvarsValid valid; }; struct XEVIL_RGNDATA { RGNDATAHEADER rdh; RECT rect; }; struct ColorPalette { WORD palversion; WORD numentries; PALETTEENTRY palentries[PALENTRIES]; }; // An object that knows how to try and recover from DirectDraw errors. class IErrorRecovery { public: virtual Boolean attemptRecovery() = 0; /* EFFECTS: Try to recover from a DirectDraw error. Return whether graphics should still be enabled. */ }; // This class has become sufficiently complicated that we should really // encapsulate all the data in it. Way too many public fields. class Xvars { // Kill this fucker. Need to separate Xvars and UiPlayer. friend class UiPlayer; public: Xvars(); ~Xvars(); Boolean is_valid(XvarsValid check) {return check == valid;} /* EFFECTS: Check whether some graphics-user is valid against the current Xvars. */ void mark_valid(XvarsValid& val) {val = valid;} /* MODIFIES: val */ /* EFFECTS: Set val to be valid with the current Xvars. */ enum SCREENMODE { WINDOW_SCREEN_MODE=0, FULL_SCREEN_MODE=1 }; enum { DISPLAY_NAME_LENGTH = 80, HUMAN_COLORS_NUM = 6 }; enum { BLACK = 0, RED, WHITE, MAXCOLORS }; COLORREF backgroundColor; COLORREF humanColors[HUMAN_COLORS_NUM]; CPen m_pens[MAXCOLORS]; CBrush m_brushes[MAXCOLORS]; LPDIRECTDRAW m_lpDD; LPDIRECTDRAWPALETTE m_ddpalette; ColorPalette m_palette; HPALETTE m_hpalette; SCREENMODE screenmode; int m_bpp; // Bits per pixel // Some stock colors color matched to the primary surface. // Should probably put this in an array of MAXCOLORS. DWORD m_black; DWORD m_white; DWORD m_red; DWORD m_green; SurfaceManager* m_surfaceManager; // The global error recovery object. static IErrorRecovery* errorRecovery; int bytes_per_pixel() {return m_bpp >> 3;} BOOL uses_palette() {return m_bpp == 8;} LPDIRECTDRAWSURFACE create_surface(DWORD width,DWORD height,DDCOLORKEY *colorkey); /* EFFECTS: Create an offscreen surface of given dimensions. Stretched coordinates. Will set source colorkey if colorkey is non-NULL. */ DWORD color_match(COLORREF rgb); /* EFFECTS: Match a colorref to a value in the primary surface/backbuffer. Works in both palette and non-palette modes. */ static void read_palette_from_id(UINT p_palid, PALETTEENTRY ppe[PALETTENTRIES]); /* EFFECTS: Read in a palette resource. */ // Color Key DDCOLORKEY XVARS_COLORKEY; DDCOLORKEY XVARS_COLORKEY_MASKS ; enum { COLORKEY_DEF = RGB(255,0,255), MASKCOLORKEY_DEF = RGB(255,255,255) }; // This now loads surfaces for all bit depths. // p_dest should be in stretched coordinates. Boolean load_surface(LPDIRECTDRAWSURFACE p_surface,const CPoint &p_dest,UINT p_bitmapid); // Similar to load_surface. But, will stretch p_bitmapid to double size. // p_dest is still in stretched coordinates on p_surface. Boolean load_stretch_surface(LPDIRECTDRAWSURFACE p_surface,const CPoint &p_dest,UINT p_bitmapid); //used to translate bitmaps with one resource //read a FILE and write the correct palette Boolean read_bitmap_write_file(FILE *p_input, FILE *p_output); // Stretch methods. int stretch_x(int x) {return x * m_stretch;} int stretch_y(int y) {return y * m_stretch;} Area stretch_area(const Area &); CRect stretch_rect(const CRect &rect) {return CRect(rect.left*m_stretch,rect.top*m_stretch,rect.right*m_stretch,rect.bottom*m_stretch);} Size stretch_size(const Size &s) {Size ret; ret.set(s.width*m_stretch,s.height*m_stretch); return ret;} CPoint stretch_point(const CPoint &point) {return CPoint(point.x * m_stretch,point.y * m_stretch);} Pos stretch_pos(const Pos &pos) {return Pos(pos.x * m_stretch,pos.y * m_stretch);} //contain methods CRect contain_rect(const CRect &rect, int maxwidth, int maxheight, int minwidth =0, int minheight =0) {return CRect(min(max(minwidth,rect.left),maxwidth),min(max(minheight,rect.top),maxheight) ,min(max(minwidth,rect.right),maxwidth),min(max(minheight,rect.bottom),maxheight));} static BOOL color_match_palette(PALETTEENTRY *p_source, PALETTEENTRY *p_dest, int p_numentries); BOOL hresultSuccess(HRESULT); // if fails, increments idnum and returns False static void interpretDHresult(HRESULT p_result); // If DebugInfo is on, print a message appropriate for p_result. Return whether static void DHresultRecover(HRESULT p_result); // Print out error message and try to recover from the error, if not DD_OK. // Really need some way of returning an error. void generate_mask_from_pixmap(LPDIRECTDRAWSURFACE mask,const Pos& maskoffset, LPDIRECTDRAWSURFACE pixmap,const Pos& pixmapoffset, const Size& size); /* EFFECTS: Generate mask from pixmap. All values are stretched coordinates. */ void generate_pixmap_from_transform(LPDIRECTDRAWSURFACE dest,const Pos& destOffset, LPDIRECTDRAWSURFACE src,const Pos& srcOffset, const Size& srcSize, LPDIRECTDRAWSURFACE scratch, const TransformType* transforms,int tNum); /* REQUIRES: scratch is at least as big as the max of src and dest */ /* EFFECTS: Generate one pixmap from another based on some transformations. All values are stretched coordinates. */ CFont* select_arena_font(CDC *); /* EFFECTS: Select the font appropriate for drawing in the arena into the CDC. return prev selected object. */ /* NOTE: Perhaps we'll need a version that takes a HDC. */ HRESULT color_fill(LPDIRECTDRAWSURFACE,const CRect &,DWORD color,Boolean fast = False); /* EFFECTS: Fill the specified rect on the surface in the given color. Basically the same as DDBLT_COLORFILL. If fast is True, use directdraw to fill even if we aren't sure whether it works on the current machine. */ HRESULT Blt(LPDIRECTDRAWSURFACE dest, DWORD destX,DWORD destY, LPDIRECTDRAWSURFACE src, LPRECT srcRect, Boolean srcColorKey = False, LPDIRECTDRAWCLIPPER = NULL); HRESULT Blt(LPDIRECTDRAWSURFACE dest, const Pos &destPos, LPDIRECTDRAWSURFACE src, const Pos &srcPos, const Size &size, Boolean srcColorKey = False, LPDIRECTDRAWCLIPPER = NULL); /* EFFECTS: Copy a rectangular region from one surface to another. Stretched coordinates. */ /* NOTE: Xvars::Blt now does clipping against negative numbers for dest position. That's the only clipping it does, however. */ Boolean GetDC(LPDIRECTDRAWSURFACE surf, HDC *dc); /* EFFECTS: Gets the device context of the passed in surface are returns is in *dc. will return False if null surf or surface GetDC gives error. */ Boolean write_xpm_file(const char* filename,const char* varName, LPDIRECTDRAWSURFACE surf, const Area& area,const DDCOLORKEY* cKey, Boolean halfSize); /* REQUIRES: The directory for filename exists and is writable. */ /* EFFECTS: Write a directdraw surface to a file in the XPM format. Return whether successful. area gives, in stretched coordinates, the rectangular area of the source pixmap on surf. varName gives the name to use as the C/C++ static variable defined by the XPM file. If ckey is non-NULL it gives the color key for surf, to generate transparent pixels in the XPM file. If halfSize, write out an XPM file that is half the size of the source bitmap. */ static Boolean get_reduce_draw() {return reduceDraw;} static void set_reduce_draw(Boolean val) {reduceDraw = val;} static void enable_graphics(Boolean val){graphicsEnabled = val;} private: static DWORD write_read_color_match(IDirectDrawSurface *pdds, COLORREF rgb); static int single_color_match(PALETTEENTRY rgb, PALETTEENTRY *p_palette, int p_numentries); // Only uiplayer uses this. Area un_stretch_area(const Area &area); inline BOOL pixel_equals(BYTE*,BYTE*,int bytesPerPixel); inline void pixel_set(BYTE*dest,BYTE*src,int bytesPerPixel); // The guts of load_surface(). Boolean load_surface_palette(LPDIRECTDRAWSURFACE p_surface,const CPoint &p_destrect,UINT p_bitmapid); Boolean load_surface_no_palette(LPDIRECTDRAWSURFACE p_surface,const CPoint &p_destrect,UINT p_bitmapid,BOOL p_stretch = False); void gen_pix_from_trans(LPDIRECTDRAWSURFACE dest,const Pos& destOffset, LPDIRECTDRAWSURFACE src,const Pos& srcOffset, const Size& srcSize, TransformType transform); /* REQUIRES: dest is large enough for the transformed version of src. */ /* EFFECTS: Helper for generate_pixmap_from_transform. Do one transformation, from source to dest. Coords are stretched. */ BYTE xpm_map_pixels(BYTE* srcPix,int srcPixNum,Boolean halfSize); short read_param(FILE *p_file,void *p_dest,unsigned short p_bytecount); // Stretching methods/data int m_stretch; inline Size unStretchSize(const Size &size){Size ret; ret.set(size.width/m_stretch,size.height/m_stretch); return ret;} // Use select_arena_font to use arenaFont. CFont *m_arenaFont; // Font for drawing in the middle of the screen LPDIRECTDRAWSURFACE m_lpprimarysurface; LPDIRECTDRAWSURFACE m_lpbackbuffer; XEVIL_RGNDATA m_rgndata; LPDIRECTDRAWCLIPPER m_backclipper; static Boolean reduceDraw; //this keeps the windowed pallete fresh in xdata for the next //bitmap. Only one color_matching is necessary PALETTEENTRY *m_pWinPalette; // Use this to tell if specific Xdata's are valid or not. // increment it to mark everything invalid. XvarsValid valid; // If False, disable all graphics operations. // Ick, making this static. static Boolean graphicsEnabled; }; inline BOOL Xvars::pixel_equals(BYTE*p1,BYTE*p2,int bytesPerPixel) { for (int n = 0; n < bytesPerPixel; n++) { if (p1[n] != p2[n]) { return False; } } return TRUE; } inline void Xvars::pixel_set(BYTE*dest,BYTE*src,int bytesPerPixel) { for (int n = 0; n < bytesPerPixel; n++) { dest[n] = src[n]; } } // Debugging macros. #define COUTRESULT(x) DebugInfo::print(x); // Attempt error recovery if not DD_OK. #define DHRESULT(hresult,action) if (hresult!=DD_OK) \ { Xvars::DHresultRecover(hresult);\ action;} struct Wxdata { // LPDIRECTDRAWSURFACE blocksSurface; // In unstretch coords. // CRect blocks[W_ALL_BLOCKS_NUM]; // CRect doors[W_ALL_DOORS_NUM]; // CRect moverSquare[W_ALL_MOVER_SQUARES_NUM]; // CRect movers[W_ALL_MOVERS_NUM]; // LPDIRECTDRAWSURFACE backgroundSurfaces[W_ALL_BACKGROUNDS_NUM]; // LPDIRECTDRAWSURFACE outsideSurfaces[W_ALL_OUTSIDES_NUM]; // LPDIRECTDRAWSURFACE posterSurfaces[W_ALL_POSTERS_NUM]; }; struct OLxdata { // LPDIRECTDRAWSURFACE buffer; // LPDIRECTDRAWSURFACE scratchBuffer; // LPDIRECTDRAWSURFACE ticks; // int tickOffsets[TICK_MAX][CO_DIR_HALF_PURE]; // in window coords. }; class ProtectionXdata { public: ProtectionXdata() {valid = XVARS_VALID_INIT;} CPen color; XvarsValid valid; }; class MovingXdata { public: MovingXdata() {valid = XVARS_VALID_INIT; offsetsValid = False;} XvarsValid valid; // Ripped everything out, now in SurfaceManager, only thing left is the flag // that says whether we've been initialized or not. // Could keep a copy of the hash keys here. // Hack, This snippet of data is completely independent of init_x(), etc. Size offsets[CO_DIR_MAX]; Boolean offsetsValid; }; #endif xevil-2.02r2.orig/win32/xevil.h0100644000175000017500000000343707041422132015546 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // XEvil.h : main header file for the XEVIL application // #ifndef __AFXWIN_H__ #error include 'stdafx.h' before including this file for PCH #endif #include "resource.h" // main symbols ///////////////////////////////////////////////////////////////////////////// // CXEvilApp: // See XEvil.cpp for the implementation of this class // class Game; class CXEvilApp : public CWinApp { public: CXEvilApp(); virtual ~CXEvilApp(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CXEvilApp) public: virtual BOOL InitInstance(); virtual int ExitInstance(); //}}AFX_VIRTUAL // Implementation //{{AFX_MSG(CXEvilApp) //}}AFX_MSG DECLARE_MESSAGE_MAP() BOOL timeStampcheck(); void prepareCommandLine(const CString &p_commandline,int &p_argc, char **&p_argv); Game *m_game; }; ///////////////////////////////////////////////////////////////////////////// extern CXEvilApp theApp; xevil-2.02r2.orig/win32/xevilserverstatus.h0100644000175000017500000000605707041422130020240 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // XEvilServerStatus.h : header file // ///////////////////////////////////////////////////////////////////////////// // CXEvilServerStatus dialog #include "specialcontrols.h" class CXEvilServerStatus : public CWnd { DECLARE_DYNAMIC( CXEvilServerStatus ) // Construction static ATOM atom; public: enum {SERVER_VIEW_WIDTH=230,SERVER_VIEW_HEIGHT=36,SERVER_VIEW_HEIGHT_BIG=300}; CXEvilServerStatus(); // standard constructor BOOL Create(CRect &p_rect,CWnd *p_parent); LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam){return CWnd::DefWindowProc(message,wParam,lParam);} BOOL getClose(){return m_close;} void setClose(BOOL p_close){m_close=p_close;} int getWindowList(CTypedPtrList&p_windowlist); void toggleDisplay(); void getMessage(CString &p_string); void clearMessage(); void addLog(const CString &p_string); void clearLog(); void setTimeSpan(CString &p_string); void setNumPlayers(int t_numplayers); //superwndinterface LRESULT SuperWindowProc( UINT message, WPARAM wParam, LPARAM lParam ){return CWnd::WindowProc(message,wParam,lParam);} // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CXEvilServerStatus) protected: //}}AFX_VIRTUAL // Implementation protected: CPicturePushButton m_startserver; CPicturePushButton m_stopserver; CPicturePushButton m_settings; CStatic m_numberofplayers; CStatic m_timeconnected; CSpecialButton m_moredisplaycontrol; CSpecialEdit m_editcontrol; CSpecialEdit m_messagecontrol; CFont m_font; BOOL m_close; HCURSOR m_cursor; HCURSOR m_oldcursor; CStatic m_static1; CStatic m_static2; enum TOGGLE_STATE{SMALL=0,BIG=1} m_togglestate; // Generated message map functions //{{AFX_MSG(CXEvilServerStatus) afx_msg void OnDisplay(); afx_msg void OnStartserver(); afx_msg void OnStopserver(); afx_msg void OnSettings(); afx_msg void OnClose( ); afx_msg void OnLButtonDown( UINT nFlags, CPoint point ); afx_msg void OnLButtonUp( UINT nFlags, CPoint point ); afx_msg void OnPaint(); afx_msg BOOL OnSetCursor( CWnd*, UINT, UINT ); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; xevil-2.02r2.orig/win32/xviewport.h0100644000175000017500000000535707041422130016467 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ //XViewPort.h #ifndef _XEVILPORTH #define _XEVILPORTH #include //for status bar #include "intel.h" class CXEvilButton :public CButton { public: CXEvilButton(){} private: virtual void DrawItem(LPDRAWITEMSTRUCT); }; class CXEvilIndentedButton :public CButton { public: CXEvilIndentedButton(){} private: virtual void DrawItem(LPDRAWITEMSTRUCT); }; // Used for both full-screen and windowed mode. class CXEvilWnd:public CWnd { BOOL m_redrawflag; BOOL m_valid; int m_timerid; static ATOM atom; BOOL m_fullscreen; int m_activated; BOOL m_querynewpalette; public: enum {WMNONE=0,WMACTIVATED,WMINACTIVE}; CXEvilWnd(){m_activated=WMNONE;m_redrawflag=FALSE;m_valid=FALSE;m_timerid=-1;} virtual ~CXEvilWnd(); BOOL needRedraw(){return m_redrawflag;} void setRedraw(BOOL p_bool){m_redrawflag=p_bool;} BOOL isValid(){return m_valid;} int getTimerId(){return m_timerid;} void setTimerId(int p_id){m_timerid=p_id;} int getActivated(){return m_activated;} void setActivated(int p_activated){m_activated=p_activated;} void setQueryNewPalette(BOOL p_bool){m_querynewpalette=p_bool;} BOOL getQueryNewPalette(){return m_querynewpalette;} BOOL Create(CRect &p_rect,CWnd *p_parent,unsigned char p_viewportnum, BOOL p_fullscreen); LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam){return CWnd::DefWindowProc(message,wParam,lParam);} // void draw_level_string(const char *,HDC hdc); //message maps afx_msg void OnDestroy( ); afx_msg void OnClose( ); afx_msg void OnPaint( ); afx_msg void OnTimer( UINT ); afx_msg void OnSetFocus( CWnd * ); afx_msg void OnActivateApp( BOOL bActive, HTASK hTask ); afx_msg BOOL OnQueryNewPalette( ); //end message maps DECLARE_MESSAGE_MAP( ) }; // There is only one StatusWnd now. So I removed the abstract interface // to avoid having to change it all the time. #endif xevil-2.02r2.orig/win32/xevil.mak0100644000175000017500000017676606611246452016122 0ustar aaronlaaronl# Microsoft Developer Studio Generated NMAKE File, Based on xevil.dsp !IF "$(CFG)" == "" CFG=xevil - Win32 Debug !MESSAGE No configuration specified. Defaulting to xevil - Win32 Debug. !ENDIF !IF "$(CFG)" != "xevil - Win32 Release" && "$(CFG)" != "xevil - Win32 Debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "xevil.mak" CFG="xevil - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "xevil - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "xevil - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF !IF "$(CFG)" == "xevil - Win32 Release" OUTDIR=.\Release INTDIR=.\Release # Begin Custom Macros OutDir=.\Release # End Custom Macros !IF "$(RECURSE)" == "0" ALL : "$(OUTDIR)\xevil.exe" !ELSE ALL : "$(OUTDIR)\xevil.exe" !ENDIF CLEAN : -@erase "$(INTDIR)\aboutdialog.obj" -@erase "$(INTDIR)\actual.obj" -@erase "$(INTDIR)\area.obj" -@erase "$(INTDIR)\connectdlg.obj" -@erase "$(INTDIR)\coord.obj" -@erase "$(INTDIR)\Difficulty.obj" -@erase "$(INTDIR)\draw.obj" -@erase "$(INTDIR)\firepal.obj" -@erase "$(INTDIR)\fogpal.obj" -@erase "$(INTDIR)\fsstatus.obj" -@erase "$(INTDIR)\functionkeysdlg.obj" -@erase "$(INTDIR)\game.obj" -@erase "$(INTDIR)\game_style.obj" -@erase "$(INTDIR)\glowpal.obj" -@erase "$(INTDIR)\id.obj" -@erase "$(INTDIR)\intel.obj" -@erase "$(INTDIR)\KeyHitDlg.obj" -@erase "$(INTDIR)\keysdlg.obj" -@erase "$(INTDIR)\KeySets.obj" -@erase "$(INTDIR)\l_agreement.obj" -@erase "$(INTDIR)\locator.obj" -@erase "$(INTDIR)\OptionsDlg.obj" -@erase "$(INTDIR)\palmod.obj" -@erase "$(INTDIR)\physical.obj" -@erase "$(INTDIR)\role.obj" -@erase "$(INTDIR)\RunServerDlg.obj" -@erase "$(INTDIR)\s_man.obj" -@erase "$(INTDIR)\sound.obj" -@erase "$(INTDIR)\sound_cmn.obj" -@erase "$(INTDIR)\specialcontrols.obj" -@erase "$(INTDIR)\stdafx.obj" -@erase "$(INTDIR)\StoryDlg.obj" -@erase "$(INTDIR)\streams.obj" -@erase "$(INTDIR)\template.obj" -@erase "$(INTDIR)\timedlg.obj" -@erase "$(INTDIR)\ui.obj" -@erase "$(INTDIR)\ui_cmn.obj" -@erase "$(INTDIR)\Uiplayer.obj" -@erase "$(INTDIR)\uiserver.obj" -@erase "$(INTDIR)\utils.obj" -@erase "$(INTDIR)\vc50.idb" -@erase "$(INTDIR)\wheel.obj" -@erase "$(INTDIR)\world.obj" -@erase "$(INTDIR)\xdata.obj" -@erase "$(INTDIR)\xetp.obj" -@erase "$(INTDIR)\Xevil.obj" -@erase "$(INTDIR)\xevil.res" -@erase "$(INTDIR)\XEvilServerStatus.obj" -@erase "$(INTDIR)\xviewport.obj" -@erase "$(OUTDIR)\xevil.exe" "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS"\ /Fp"$(INTDIR)\xevil.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c CPP_OBJS=.\Release/ CPP_SBRS=. .c{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << MTL=midl.exe MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 RSC=rc.exe RSC_PROJ=/l 0x409 /fo"$(INTDIR)\xevil.res" /d "NDEBUG" BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\xevil.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=winmm.lib ole32.lib /nologo /subsystem:windows /incremental:no\ /pdb:"$(OUTDIR)\xevil.pdb" /machine:I386 /out:"$(OUTDIR)\xevil.exe" LINK32_OBJS= \ "$(INTDIR)\aboutdialog.obj" \ "$(INTDIR)\actual.obj" \ "$(INTDIR)\area.obj" \ "$(INTDIR)\connectdlg.obj" \ "$(INTDIR)\coord.obj" \ "$(INTDIR)\Difficulty.obj" \ "$(INTDIR)\draw.obj" \ "$(INTDIR)\firepal.obj" \ "$(INTDIR)\fogpal.obj" \ "$(INTDIR)\fsstatus.obj" \ "$(INTDIR)\functionkeysdlg.obj" \ "$(INTDIR)\game.obj" \ "$(INTDIR)\game_style.obj" \ "$(INTDIR)\glowpal.obj" \ "$(INTDIR)\id.obj" \ "$(INTDIR)\intel.obj" \ "$(INTDIR)\KeyHitDlg.obj" \ "$(INTDIR)\keysdlg.obj" \ "$(INTDIR)\KeySets.obj" \ "$(INTDIR)\l_agreement.obj" \ "$(INTDIR)\locator.obj" \ "$(INTDIR)\OptionsDlg.obj" \ "$(INTDIR)\palmod.obj" \ "$(INTDIR)\physical.obj" \ "$(INTDIR)\role.obj" \ "$(INTDIR)\RunServerDlg.obj" \ "$(INTDIR)\s_man.obj" \ "$(INTDIR)\sound.obj" \ "$(INTDIR)\sound_cmn.obj" \ "$(INTDIR)\specialcontrols.obj" \ "$(INTDIR)\stdafx.obj" \ "$(INTDIR)\StoryDlg.obj" \ "$(INTDIR)\streams.obj" \ "$(INTDIR)\template.obj" \ "$(INTDIR)\timedlg.obj" \ "$(INTDIR)\ui.obj" \ "$(INTDIR)\ui_cmn.obj" \ "$(INTDIR)\Uiplayer.obj" \ "$(INTDIR)\uiserver.obj" \ "$(INTDIR)\utils.obj" \ "$(INTDIR)\wheel.obj" \ "$(INTDIR)\world.obj" \ "$(INTDIR)\xdata.obj" \ "$(INTDIR)\xetp.obj" \ "$(INTDIR)\Xevil.obj" \ "$(INTDIR)\xevil.res" \ "$(INTDIR)\XEvilServerStatus.obj" \ "$(INTDIR)\xviewport.obj" \ ".\ddraw.lib" \ ".\dsound.lib" "$(OUTDIR)\xevil.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << !ELSEIF "$(CFG)" == "xevil - Win32 Debug" OUTDIR=.\Debug INTDIR=.\Debug # Begin Custom Macros OutDir=.\Debug # End Custom Macros !IF "$(RECURSE)" == "0" ALL : "$(OUTDIR)\xevil.exe" !ELSE ALL : "$(OUTDIR)\xevil.exe" !ENDIF CLEAN : -@erase "$(INTDIR)\aboutdialog.obj" -@erase "$(INTDIR)\actual.obj" -@erase "$(INTDIR)\area.obj" -@erase "$(INTDIR)\connectdlg.obj" -@erase "$(INTDIR)\coord.obj" -@erase "$(INTDIR)\Difficulty.obj" -@erase "$(INTDIR)\draw.obj" -@erase "$(INTDIR)\firepal.obj" -@erase "$(INTDIR)\fogpal.obj" -@erase "$(INTDIR)\fsstatus.obj" -@erase "$(INTDIR)\functionkeysdlg.obj" -@erase "$(INTDIR)\game.obj" -@erase "$(INTDIR)\game_style.obj" -@erase "$(INTDIR)\glowpal.obj" -@erase "$(INTDIR)\id.obj" -@erase "$(INTDIR)\intel.obj" -@erase "$(INTDIR)\KeyHitDlg.obj" -@erase "$(INTDIR)\keysdlg.obj" -@erase "$(INTDIR)\KeySets.obj" -@erase "$(INTDIR)\l_agreement.obj" -@erase "$(INTDIR)\locator.obj" -@erase "$(INTDIR)\OptionsDlg.obj" -@erase "$(INTDIR)\palmod.obj" -@erase "$(INTDIR)\physical.obj" -@erase "$(INTDIR)\role.obj" -@erase "$(INTDIR)\RunServerDlg.obj" -@erase "$(INTDIR)\s_man.obj" -@erase "$(INTDIR)\sound.obj" -@erase "$(INTDIR)\sound_cmn.obj" -@erase "$(INTDIR)\specialcontrols.obj" -@erase "$(INTDIR)\stdafx.obj" -@erase "$(INTDIR)\StoryDlg.obj" -@erase "$(INTDIR)\streams.obj" -@erase "$(INTDIR)\template.obj" -@erase "$(INTDIR)\timedlg.obj" -@erase "$(INTDIR)\ui.obj" -@erase "$(INTDIR)\ui_cmn.obj" -@erase "$(INTDIR)\Uiplayer.obj" -@erase "$(INTDIR)\uiserver.obj" -@erase "$(INTDIR)\utils.obj" -@erase "$(INTDIR)\vc50.idb" -@erase "$(INTDIR)\vc50.pdb" -@erase "$(INTDIR)\wheel.obj" -@erase "$(INTDIR)\world.obj" -@erase "$(INTDIR)\xdata.obj" -@erase "$(INTDIR)\xetp.obj" -@erase "$(INTDIR)\Xevil.obj" -@erase "$(INTDIR)\xevil.res" -@erase "$(INTDIR)\XEvilServerStatus.obj" -@erase "$(INTDIR)\xviewport.obj" -@erase "$(OUTDIR)\xevil.exe" -@erase "$(OUTDIR)\xevil.ilk" -@erase "$(OUTDIR)\xevil.pdb" "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP=cl.exe CPP_PROJ=/nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS"\ /Fp"$(INTDIR)\xevil.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c CPP_OBJS=.\Debug/ CPP_SBRS=. .c{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(CPP_OBJS)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .c{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << .cxx{$(CPP_SBRS)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << MTL=midl.exe MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 RSC=rc.exe RSC_PROJ=/l 0x409 /fo"$(INTDIR)\xevil.res" /d "_DEBUG" BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\xevil.bsc" BSC32_SBRS= \ LINK32=link.exe LINK32_FLAGS=winmm.lib ole32.lib /nologo /subsystem:windows /incremental:yes\ /pdb:"$(OUTDIR)\xevil.pdb" /debug /machine:I386 /out:"$(OUTDIR)\xevil.exe"\ /pdbtype:sept LINK32_OBJS= \ "$(INTDIR)\aboutdialog.obj" \ "$(INTDIR)\actual.obj" \ "$(INTDIR)\area.obj" \ "$(INTDIR)\connectdlg.obj" \ "$(INTDIR)\coord.obj" \ "$(INTDIR)\Difficulty.obj" \ "$(INTDIR)\draw.obj" \ "$(INTDIR)\firepal.obj" \ "$(INTDIR)\fogpal.obj" \ "$(INTDIR)\fsstatus.obj" \ "$(INTDIR)\functionkeysdlg.obj" \ "$(INTDIR)\game.obj" \ "$(INTDIR)\game_style.obj" \ "$(INTDIR)\glowpal.obj" \ "$(INTDIR)\id.obj" \ "$(INTDIR)\intel.obj" \ "$(INTDIR)\KeyHitDlg.obj" \ "$(INTDIR)\keysdlg.obj" \ "$(INTDIR)\KeySets.obj" \ "$(INTDIR)\l_agreement.obj" \ "$(INTDIR)\locator.obj" \ "$(INTDIR)\OptionsDlg.obj" \ "$(INTDIR)\palmod.obj" \ "$(INTDIR)\physical.obj" \ "$(INTDIR)\role.obj" \ "$(INTDIR)\RunServerDlg.obj" \ "$(INTDIR)\s_man.obj" \ "$(INTDIR)\sound.obj" \ "$(INTDIR)\sound_cmn.obj" \ "$(INTDIR)\specialcontrols.obj" \ "$(INTDIR)\stdafx.obj" \ "$(INTDIR)\StoryDlg.obj" \ "$(INTDIR)\streams.obj" \ "$(INTDIR)\template.obj" \ "$(INTDIR)\timedlg.obj" \ "$(INTDIR)\ui.obj" \ "$(INTDIR)\ui_cmn.obj" \ "$(INTDIR)\Uiplayer.obj" \ "$(INTDIR)\uiserver.obj" \ "$(INTDIR)\utils.obj" \ "$(INTDIR)\wheel.obj" \ "$(INTDIR)\world.obj" \ "$(INTDIR)\xdata.obj" \ "$(INTDIR)\xetp.obj" \ "$(INTDIR)\Xevil.obj" \ "$(INTDIR)\xevil.res" \ "$(INTDIR)\XEvilServerStatus.obj" \ "$(INTDIR)\xviewport.obj" \ ".\ddraw.lib" \ ".\dsound.lib" "$(OUTDIR)\xevil.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << !ENDIF !IF "$(CFG)" == "xevil - Win32 Release" || "$(CFG)" == "xevil - Win32 Debug" SOURCE=.\aboutdialog.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_ABOUT=\ ".\aboutdialog.h"\ ".\stdafx.h"\ ".\xevil.h"\ {$(INCLUDE)}"l_agreement.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\aboutdialog.obj" : $(SOURCE) $(DEP_CPP_ABOUT) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_ABOUT=\ ".\aboutdialog.h"\ ".\stdafx.h"\ ".\xevil.h"\ {$(INCLUDE)}"l_agreement.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\aboutdialog.obj" : $(SOURCE) $(DEP_CPP_ABOUT) "$(INTDIR)" !ENDIF SOURCE=..\cmn\actual.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_ACTUA=\ "..\cmn\actual.h"\ "..\cmn\bitmaps\alien\alien.bitmaps"\ "..\cmn\bitmaps\altar_of_sin\altar_of_sin.bitmaps"\ "..\cmn\bitmaps\auto_lancer\auto_lancer.bitmaps"\ "..\cmn\bitmaps\blood\blood.bitmaps"\ "..\cmn\bitmaps\bomb\bomb.bitmaps"\ "..\cmn\bitmaps\caffine\caffine.bitmaps"\ "..\cmn\bitmaps\chainsaw\chainsaw.bitmaps"\ "..\cmn\bitmaps\chopper_boy\chopper_boy.bitmaps"\ "..\cmn\bitmaps\cloak\cloak.bitmaps"\ "..\cmn\bitmaps\crack_pipe\crack_pipe.bitmaps"\ "..\cmn\bitmaps\demon_summoner\demon_summoner.bitmaps"\ "..\cmn\bitmaps\dog\dog.bitmaps"\ "..\cmn\bitmaps\dog_whistle\dog_whistle.bitmaps"\ "..\cmn\bitmaps\doppel\doppel.bitmaps"\ "..\cmn\bitmaps\dragon\dragon.bitmaps"\ "..\cmn\bitmaps\egg\egg.bitmaps"\ "..\cmn\bitmaps\enforcer\enforcer.bitmaps"\ "..\cmn\bitmaps\explosion\explosion.bitmaps"\ "..\cmn\bitmaps\f_thrower\f_thrower.bitmaps"\ "..\cmn\bitmaps\fire\fire.bitmaps"\ "..\cmn\bitmaps\fire_demon\fire_demon.bitmaps"\ "..\cmn\bitmaps\fire_explosion\fire_explosion.bitmaps"\ "..\cmn\bitmaps\fireball\fireball.bitmaps"\ "..\cmn\bitmaps\flag\flag.bitmaps"\ "..\cmn\bitmaps\frog\frog.bitmaps"\ "..\cmn\bitmaps\frog_gun\frog_gun.bitmaps"\ "..\cmn\bitmaps\frog_shell\frog_shell.bitmaps"\ "..\cmn\bitmaps\green_blood\green_blood.bitmaps"\ "..\cmn\bitmaps\grenade\grenade.bitmaps"\ "..\cmn\bitmaps\grenades\grenades.bitmaps"\ "..\cmn\bitmaps\hero\hero.bitmaps"\ "..\cmn\bitmaps\home\home.bitmaps"\ "..\cmn\bitmaps\hugger\hugger.bitmaps"\ "..\cmn\bitmaps\lance\lance.bitmaps"\ "..\cmn\bitmaps\lancer\lancer.bitmaps"\ "..\cmn\bitmaps\laser\laser.bitmaps"\ "..\cmn\bitmaps\launcher\launcher.bitmaps"\ "..\cmn\bitmaps\m_gun\m_gun.bitmaps"\ "..\cmn\bitmaps\med_kit\med_kit.bitmaps"\ "..\cmn\bitmaps\missile\missile.bitmaps"\ "..\cmn\bitmaps\n_protection\n_protection.bitmaps"\ "..\cmn\bitmaps\n_shield\n_shield.bitmaps"\ "..\cmn\bitmaps\napalm\napalm.bitmaps"\ "..\cmn\bitmaps\napalms\napalms.bitmaps"\ "..\cmn\bitmaps\ninja\ninja.bitmaps"\ "..\cmn\bitmaps\oil_droplet\oil_droplet.bitmaps"\ "..\cmn\bitmaps\p_c_p\p_c_p.bitmaps"\ "..\cmn\bitmaps\phys_mover\phys_mover.bitmaps"\ "..\cmn\bitmaps\pistol\pistol.bitmaps"\ "..\cmn\bitmaps\rock\rock.bitmaps"\ "..\cmn\bitmaps\seal\seal.bitmaps"\ "..\cmn\bitmaps\shell\shell.bitmaps"\ "..\cmn\bitmaps\star\star.bitmaps"\ "..\cmn\bitmaps\stars\stars.bitmaps"\ "..\cmn\bitmaps\swap_shell\swap_shell.bitmaps"\ "..\cmn\bitmaps\swapper\swapper.bitmaps"\ "..\cmn\bitmaps\t_protection\t_protection.bitmaps"\ "..\cmn\bitmaps\t_shield\t_shield.bitmaps"\ "..\cmn\bitmaps\transmogifier\transmogifier.bitmaps"\ "..\cmn\bitmaps\trapdoor\trapdoor.bitmaps"\ "..\cmn\bitmaps\troll\troll.bitmaps"\ "..\cmn\bitmaps\walker\walker.bitmaps"\ "..\cmn\bitmaps\weight\weight.bitmaps"\ "..\cmn\bitmaps\x_protection\x_protection.bitmaps"\ "..\cmn\bitmaps\xit\xit.bitmaps"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\actual.obj" : $(SOURCE) $(DEP_CPP_ACTUA) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_ACTUA=\ "..\cmn\actual.h"\ "..\cmn\bitmaps\alien\alien.bitmaps"\ "..\cmn\bitmaps\altar_of_sin\altar_of_sin.bitmaps"\ "..\cmn\bitmaps\auto_lancer\auto_lancer.bitmaps"\ "..\cmn\bitmaps\blood\blood.bitmaps"\ "..\cmn\bitmaps\bomb\bomb.bitmaps"\ "..\cmn\bitmaps\caffine\caffine.bitmaps"\ "..\cmn\bitmaps\chainsaw\chainsaw.bitmaps"\ "..\cmn\bitmaps\chopper_boy\chopper_boy.bitmaps"\ "..\cmn\bitmaps\cloak\cloak.bitmaps"\ "..\cmn\bitmaps\crack_pipe\crack_pipe.bitmaps"\ "..\cmn\bitmaps\demon_summoner\demon_summoner.bitmaps"\ "..\cmn\bitmaps\dog\dog.bitmaps"\ "..\cmn\bitmaps\dog_whistle\dog_whistle.bitmaps"\ "..\cmn\bitmaps\doppel\doppel.bitmaps"\ "..\cmn\bitmaps\dragon\dragon.bitmaps"\ "..\cmn\bitmaps\egg\egg.bitmaps"\ "..\cmn\bitmaps\enforcer\enforcer.bitmaps"\ "..\cmn\bitmaps\explosion\explosion.bitmaps"\ "..\cmn\bitmaps\f_thrower\f_thrower.bitmaps"\ "..\cmn\bitmaps\fire\fire.bitmaps"\ "..\cmn\bitmaps\fire_demon\fire_demon.bitmaps"\ "..\cmn\bitmaps\fire_explosion\fire_explosion.bitmaps"\ "..\cmn\bitmaps\fireball\fireball.bitmaps"\ "..\cmn\bitmaps\flag\flag.bitmaps"\ "..\cmn\bitmaps\frog\frog.bitmaps"\ "..\cmn\bitmaps\frog_gun\frog_gun.bitmaps"\ "..\cmn\bitmaps\frog_shell\frog_shell.bitmaps"\ "..\cmn\bitmaps\green_blood\green_blood.bitmaps"\ "..\cmn\bitmaps\grenade\grenade.bitmaps"\ "..\cmn\bitmaps\grenades\grenades.bitmaps"\ "..\cmn\bitmaps\hero\hero.bitmaps"\ "..\cmn\bitmaps\home\home.bitmaps"\ "..\cmn\bitmaps\hugger\hugger.bitmaps"\ "..\cmn\bitmaps\lance\lance.bitmaps"\ "..\cmn\bitmaps\lancer\lancer.bitmaps"\ "..\cmn\bitmaps\laser\laser.bitmaps"\ "..\cmn\bitmaps\launcher\launcher.bitmaps"\ "..\cmn\bitmaps\m_gun\m_gun.bitmaps"\ "..\cmn\bitmaps\med_kit\med_kit.bitmaps"\ "..\cmn\bitmaps\missile\missile.bitmaps"\ "..\cmn\bitmaps\n_protection\n_protection.bitmaps"\ "..\cmn\bitmaps\n_shield\n_shield.bitmaps"\ "..\cmn\bitmaps\napalm\napalm.bitmaps"\ "..\cmn\bitmaps\napalms\napalms.bitmaps"\ "..\cmn\bitmaps\ninja\ninja.bitmaps"\ "..\cmn\bitmaps\oil_droplet\oil_droplet.bitmaps"\ "..\cmn\bitmaps\p_c_p\p_c_p.bitmaps"\ "..\cmn\bitmaps\phys_mover\phys_mover.bitmaps"\ "..\cmn\bitmaps\pistol\pistol.bitmaps"\ "..\cmn\bitmaps\rock\rock.bitmaps"\ "..\cmn\bitmaps\seal\seal.bitmaps"\ "..\cmn\bitmaps\shell\shell.bitmaps"\ "..\cmn\bitmaps\star\star.bitmaps"\ "..\cmn\bitmaps\stars\stars.bitmaps"\ "..\cmn\bitmaps\swap_shell\swap_shell.bitmaps"\ "..\cmn\bitmaps\swapper\swapper.bitmaps"\ "..\cmn\bitmaps\t_protection\t_protection.bitmaps"\ "..\cmn\bitmaps\t_shield\t_shield.bitmaps"\ "..\cmn\bitmaps\transmogifier\transmogifier.bitmaps"\ "..\cmn\bitmaps\trapdoor\trapdoor.bitmaps"\ "..\cmn\bitmaps\troll\troll.bitmaps"\ "..\cmn\bitmaps\walker\walker.bitmaps"\ "..\cmn\bitmaps\weight\weight.bitmaps"\ "..\cmn\bitmaps\x_protection\x_protection.bitmaps"\ "..\cmn\bitmaps\xit\xit.bitmaps"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\actual.obj" : $(SOURCE) $(DEP_CPP_ACTUA) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=..\cmn\area.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_AREA_=\ "..\cmn\streams.h"\ ".\stdafx.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\area.obj" : $(SOURCE) $(DEP_CPP_AREA_) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_AREA_=\ "..\cmn\streams.h"\ ".\stdafx.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\area.obj" : $(SOURCE) $(DEP_CPP_AREA_) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=.\connectdlg.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_CONNE=\ "..\cmn\streams.h"\ ".\connectdlg.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ ".\xevil.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"role.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\connectdlg.obj" : $(SOURCE) $(DEP_CPP_CONNE) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_CONNE=\ "..\cmn\streams.h"\ ".\connectdlg.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ ".\xevil.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"role.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\connectdlg.obj" : $(SOURCE) $(DEP_CPP_CONNE) "$(INTDIR)" !ENDIF SOURCE=..\cmn\coord.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_COORD=\ "..\cmn\streams.h"\ ".\stdafx.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\coord.obj" : $(SOURCE) $(DEP_CPP_COORD) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_COORD=\ "..\cmn\streams.h"\ ".\stdafx.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\coord.obj" : $(SOURCE) $(DEP_CPP_COORD) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=.\Difficulty.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_DIFFI=\ "..\cmn\streams.h"\ ".\difficulty.h"\ ".\stdafx.h"\ ".\xevil.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\Difficulty.obj" : $(SOURCE) $(DEP_CPP_DIFFI) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_DIFFI=\ "..\cmn\streams.h"\ ".\difficulty.h"\ ".\stdafx.h"\ ".\xevil.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\Difficulty.obj" : $(SOURCE) $(DEP_CPP_DIFFI) "$(INTDIR)" !ENDIF SOURCE=.\draw.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_DRAW_=\ "..\cmn\actual.h"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\draw.obj" : $(SOURCE) $(DEP_CPP_DRAW_) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_DRAW_=\ "..\cmn\actual.h"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\draw.obj" : $(SOURCE) $(DEP_CPP_DRAW_) "$(INTDIR)" !ENDIF SOURCE=.\firepal.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_FIREP=\ "..\cmn\streams.h"\ ".\firepal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\firepal.obj" : $(SOURCE) $(DEP_CPP_FIREP) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_FIREP=\ "..\cmn\streams.h"\ ".\firepal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\firepal.obj" : $(SOURCE) $(DEP_CPP_FIREP) "$(INTDIR)" !ENDIF SOURCE=.\fogpal.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_FOGPA=\ "..\cmn\streams.h"\ ".\fogpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\fogpal.obj" : $(SOURCE) $(DEP_CPP_FOGPA) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_FOGPA=\ "..\cmn\streams.h"\ ".\fogpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\fogpal.obj" : $(SOURCE) $(DEP_CPP_FOGPA) "$(INTDIR)" !ENDIF SOURCE=.\fsstatus.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_FSSTA=\ "..\cmn\streams.h"\ ".\fsstatus.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\wheel.h"\ ".\xdata.h"\ ".\xevil.h"\ ".\xviewport.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\fsstatus.obj" : $(SOURCE) $(DEP_CPP_FSSTA) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_FSSTA=\ "..\cmn\streams.h"\ ".\fsstatus.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\wheel.h"\ ".\xdata.h"\ ".\xevil.h"\ ".\xviewport.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\fsstatus.obj" : $(SOURCE) $(DEP_CPP_FSSTA) "$(INTDIR)" !ENDIF SOURCE=.\functionkeysdlg.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_FUNCT=\ ".\fkeysdlg.h"\ ".\stdafx.h"\ ".\xevil.h"\ "$(INTDIR)\functionkeysdlg.obj" : $(SOURCE) $(DEP_CPP_FUNCT) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_FUNCT=\ ".\fkeysdlg.h"\ ".\stdafx.h"\ ".\xevil.h"\ "$(INTDIR)\functionkeysdlg.obj" : $(SOURCE) $(DEP_CPP_FUNCT) "$(INTDIR)" !ENDIF SOURCE=..\cmn\game.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_GAME_=\ "..\cmn\actual.h"\ "..\cmn\game.h"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ "..\cmn\xetp.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\specialcontrols.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\uiplayer.h"\ ".\uiserver.h"\ ".\xdata.h"\ ".\xevilserverstatus.h"\ ".\xviewport.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"l_agreement.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"role.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\game.obj" : $(SOURCE) $(DEP_CPP_GAME_) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_GAME_=\ "..\cmn\actual.h"\ "..\cmn\game.h"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ "..\cmn\xetp.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\specialcontrols.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\uiplayer.h"\ ".\uiserver.h"\ ".\xdata.h"\ ".\xevilserverstatus.h"\ ".\xviewport.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"l_agreement.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"role.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\game.obj" : $(SOURCE) $(DEP_CPP_GAME_) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=..\cmn\game_style.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_GAME_S=\ "..\cmn\actual.h"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\game_style.obj" : $(SOURCE) $(DEP_CPP_GAME_S) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_GAME_S=\ "..\cmn\actual.h"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\game_style.obj" : $(SOURCE) $(DEP_CPP_GAME_S) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=.\glowpal.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_GLOWP=\ "..\cmn\streams.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\glowpal.obj" : $(SOURCE) $(DEP_CPP_GLOWP) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_GLOWP=\ "..\cmn\streams.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\glowpal.obj" : $(SOURCE) $(DEP_CPP_GLOWP) "$(INTDIR)" !ENDIF SOURCE=..\cmn\id.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_ID_CP=\ "..\cmn\streams.h"\ ".\stdafx.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\id.obj" : $(SOURCE) $(DEP_CPP_ID_CP) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_ID_CP=\ "..\cmn\streams.h"\ ".\stdafx.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\id.obj" : $(SOURCE) $(DEP_CPP_ID_CP) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=..\cmn\intel.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_INTEL=\ "..\cmn\actual.h"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ "..\cmn\xetp.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\intel.obj" : $(SOURCE) $(DEP_CPP_INTEL) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_INTEL=\ "..\cmn\actual.h"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ "..\cmn\xetp.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\intel.obj" : $(SOURCE) $(DEP_CPP_INTEL) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=.\KeyHitDlg.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_KEYHI=\ ".\keyhitdlg.h"\ ".\stdafx.h"\ ".\xevil.h"\ "$(INTDIR)\KeyHitDlg.obj" : $(SOURCE) $(DEP_CPP_KEYHI) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_KEYHI=\ ".\keyhitdlg.h"\ ".\stdafx.h"\ ".\xevil.h"\ "$(INTDIR)\KeyHitDlg.obj" : $(SOURCE) $(DEP_CPP_KEYHI) "$(INTDIR)" !ENDIF SOURCE=.\keysdlg.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_KEYSD=\ ".\keysdlg.h"\ ".\stdafx.h"\ ".\xevil.h"\ "$(INTDIR)\keysdlg.obj" : $(SOURCE) $(DEP_CPP_KEYSD) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_KEYSD=\ ".\keysdlg.h"\ ".\stdafx.h"\ ".\xevil.h"\ "$(INTDIR)\keysdlg.obj" : $(SOURCE) $(DEP_CPP_KEYSD) "$(INTDIR)" !ENDIF SOURCE=.\KeySets.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_KEYSE=\ ".\keyhitdlg.h"\ ".\keysets.h"\ ".\stdafx.h"\ ".\xevil.h"\ "$(INTDIR)\KeySets.obj" : $(SOURCE) $(DEP_CPP_KEYSE) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_KEYSE=\ ".\keyhitdlg.h"\ ".\keysets.h"\ ".\stdafx.h"\ ".\xevil.h"\ "$(INTDIR)\KeySets.obj" : $(SOURCE) $(DEP_CPP_KEYSE) "$(INTDIR)" !ENDIF SOURCE=..\cmn\l_agreement.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_L_AGR=\ ".\stdafx.h"\ {$(INCLUDE)}"l_agreement.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\l_agreement.obj" : $(SOURCE) $(DEP_CPP_L_AGR) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_L_AGR=\ ".\stdafx.h"\ {$(INCLUDE)}"l_agreement.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\l_agreement.obj" : $(SOURCE) $(DEP_CPP_L_AGR) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=..\cmn\locator.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_LOCAT=\ "..\cmn\actual.h"\ "..\cmn\bitmaps\locator\locator.bitmaps"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ "..\cmn\template.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\locator.obj" : $(SOURCE) $(DEP_CPP_LOCAT) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_LOCAT=\ "..\cmn\actual.h"\ "..\cmn\bitmaps\locator\locator.bitmaps"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ "..\cmn\template.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\locator.obj" : $(SOURCE) $(DEP_CPP_LOCAT) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=.\OptionsDlg.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_OPTIO=\ "..\cmn\streams.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\optionsdlg.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ ".\xevil.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\OptionsDlg.obj" : $(SOURCE) $(DEP_CPP_OPTIO) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_OPTIO=\ "..\cmn\streams.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\optionsdlg.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ ".\xevil.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\OptionsDlg.obj" : $(SOURCE) $(DEP_CPP_OPTIO) "$(INTDIR)" !ENDIF SOURCE=.\palmod.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_PALMO=\ "..\cmn\streams.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\palmod.obj" : $(SOURCE) $(DEP_CPP_PALMO) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_PALMO=\ "..\cmn\streams.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\palmod.obj" : $(SOURCE) $(DEP_CPP_PALMO) "$(INTDIR)" !ENDIF SOURCE=..\cmn\physical.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_PHYSI=\ "..\cmn\actual.h"\ "..\cmn\bitmaps\transform\transform.bitmaps"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\physical.obj" : $(SOURCE) $(DEP_CPP_PHYSI) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_PHYSI=\ "..\cmn\actual.h"\ "..\cmn\bitmaps\transform\transform.bitmaps"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\physical.obj" : $(SOURCE) $(DEP_CPP_PHYSI) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=..\cmn\role.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_ROLE_=\ "..\cmn\neth.h"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ "..\cmn\xetp.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"role.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"sys\types.h"\ {$(INCLUDE)}"sys\utime.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\role.obj" : $(SOURCE) $(DEP_CPP_ROLE_) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_ROLE_=\ "..\cmn\neth.h"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ "..\cmn\xetp.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"role.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\role.obj" : $(SOURCE) $(DEP_CPP_ROLE_) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=.\RunServerDlg.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_RUNSE=\ "..\cmn\streams.h"\ ".\runserverdlg.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ ".\xevil.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"role.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\RunServerDlg.obj" : $(SOURCE) $(DEP_CPP_RUNSE) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_RUNSE=\ "..\cmn\streams.h"\ ".\runserverdlg.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ ".\xevil.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"role.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\RunServerDlg.obj" : $(SOURCE) $(DEP_CPP_RUNSE) "$(INTDIR)" !ENDIF SOURCE=.\s_man.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_S_MAN=\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\s_man.obj" : $(SOURCE) $(DEP_CPP_S_MAN) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_S_MAN=\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\s_man.obj" : $(SOURCE) $(DEP_CPP_S_MAN) "$(INTDIR)" !ENDIF SOURCE=.\sound.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_SOUND=\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\sound.obj" : $(SOURCE) $(DEP_CPP_SOUND) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_SOUND=\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\sound.obj" : $(SOURCE) $(DEP_CPP_SOUND) "$(INTDIR)" !ENDIF SOURCE=..\cmn\sound_cmn.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_SOUND_=\ "..\cmn\bitmaps\sound_cmn\sound_cmn.bitmaps"\ "..\cmn\streams.h"\ ".\stdafx.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\sound_cmn.obj" : $(SOURCE) $(DEP_CPP_SOUND_) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_SOUND_=\ "..\cmn\bitmaps\sound_cmn\sound_cmn.bitmaps"\ "..\cmn\streams.h"\ ".\stdafx.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\sound_cmn.obj" : $(SOURCE) $(DEP_CPP_SOUND_) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=.\specialcontrols.cpp DEP_CPP_SPECI=\ ".\specialcontrols.h"\ ".\stdafx.h"\ "$(INTDIR)\specialcontrols.obj" : $(SOURCE) $(DEP_CPP_SPECI) "$(INTDIR)" SOURCE=.\stdafx.cpp DEP_CPP_STDAF=\ ".\stdafx.h"\ "$(INTDIR)\stdafx.obj" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)" SOURCE=.\StoryDlg.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_STORY=\ ".\stdafx.h"\ ".\storydlg.h"\ ".\xevil.h"\ "$(INTDIR)\StoryDlg.obj" : $(SOURCE) $(DEP_CPP_STORY) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_STORY=\ ".\stdafx.h"\ ".\storydlg.h"\ ".\xevil.h"\ "$(INTDIR)\StoryDlg.obj" : $(SOURCE) $(DEP_CPP_STORY) "$(INTDIR)" !ENDIF SOURCE=..\cmn\streams.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_STREA=\ "..\cmn\neth.h"\ "..\cmn\streams.h"\ "..\cmn\xetp.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\streams.obj" : $(SOURCE) $(DEP_CPP_STREA) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_STREA=\ "..\cmn\neth.h"\ "..\cmn\streams.h"\ "..\cmn\xetp.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\streams.obj" : $(SOURCE) $(DEP_CPP_STREA) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=..\cmn\template.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_TEMPL=\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ "..\cmn\template.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\template.obj" : $(SOURCE) $(DEP_CPP_TEMPL) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_TEMPL=\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ "..\cmn\template.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\template.obj" : $(SOURCE) $(DEP_CPP_TEMPL) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=.\timedlg.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_TIMED=\ ".\stdafx.h"\ ".\timedlg.h"\ ".\xevil.h"\ "$(INTDIR)\timedlg.obj" : $(SOURCE) $(DEP_CPP_TIMED) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_TIMED=\ ".\stdafx.h"\ ".\timedlg.h"\ ".\xevil.h"\ "$(INTDIR)\timedlg.obj" : $(SOURCE) $(DEP_CPP_TIMED) "$(INTDIR)" !ENDIF SOURCE=.\ui.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_UI_CP=\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\ui.obj" : $(SOURCE) $(DEP_CPP_UI_CP) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_UI_CP=\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\ui.obj" : $(SOURCE) $(DEP_CPP_UI_CP) "$(INTDIR)" !ENDIF SOURCE=..\cmn\ui_cmn.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_UI_CM=\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\ui_cmn.obj" : $(SOURCE) $(DEP_CPP_UI_CM) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_UI_CM=\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\ui_cmn.obj" : $(SOURCE) $(DEP_CPP_UI_CM) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=.\Uiplayer.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_UIPLA=\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\aboutdialog.h"\ ".\connectdlg.h"\ ".\difficulty.h"\ ".\firepal.h"\ ".\fkeysdlg.h"\ ".\fogpal.h"\ ".\fsstatus.h"\ ".\glowpal.h"\ ".\keysets.h"\ ".\optionsdlg.h"\ ".\palmod.h"\ ".\runserverdlg.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\storydlg.h"\ ".\ui.h"\ ".\uiplayer.h"\ ".\wheel.h"\ ".\xdata.h"\ ".\xviewport.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\Uiplayer.obj" : $(SOURCE) $(DEP_CPP_UIPLA) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_UIPLA=\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\aboutdialog.h"\ ".\connectdlg.h"\ ".\difficulty.h"\ ".\firepal.h"\ ".\fkeysdlg.h"\ ".\fogpal.h"\ ".\fsstatus.h"\ ".\glowpal.h"\ ".\keysets.h"\ ".\optionsdlg.h"\ ".\palmod.h"\ ".\runserverdlg.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\storydlg.h"\ ".\ui.h"\ ".\uiplayer.h"\ ".\wheel.h"\ ".\xdata.h"\ ".\xviewport.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\Uiplayer.obj" : $(SOURCE) $(DEP_CPP_UIPLA) "$(INTDIR)" !ENDIF SOURCE=.\uiserver.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_UISER=\ "..\cmn\streams.h"\ ".\aboutdialog.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\optionsdlg.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\specialcontrols.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\uiserver.h"\ ".\xdata.h"\ ".\xevilserverstatus.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\uiserver.obj" : $(SOURCE) $(DEP_CPP_UISER) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_UISER=\ "..\cmn\streams.h"\ ".\aboutdialog.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\optionsdlg.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\specialcontrols.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\uiserver.h"\ ".\xdata.h"\ ".\xevilserverstatus.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\uiserver.obj" : $(SOURCE) $(DEP_CPP_UISER) "$(INTDIR)" !ENDIF SOURCE=..\cmn\utils.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_UTILS=\ "..\cmn\streams.h"\ ".\stdafx.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\utils.obj" : $(SOURCE) $(DEP_CPP_UTILS) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_UTILS=\ "..\cmn\streams.h"\ ".\stdafx.h"\ {$(INCLUDE)}"utils.h"\ "$(INTDIR)\utils.obj" : $(SOURCE) $(DEP_CPP_UTILS) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=.\wheel.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_WHEEL=\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\wheel.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\wheel.obj" : $(SOURCE) $(DEP_CPP_WHEEL) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_WHEEL=\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\wheel.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\wheel.obj" : $(SOURCE) $(DEP_CPP_WHEEL) "$(INTDIR)" !ENDIF SOURCE=..\cmn\world.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_WORLD=\ "..\cmn\actual.h"\ "..\cmn\bitmaps\world\world.bitmaps"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\world.obj" : $(SOURCE) $(DEP_CPP_WORLD) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_WORLD=\ "..\cmn\actual.h"\ "..\cmn\bitmaps\world\world.bitmaps"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\world.obj" : $(SOURCE) $(DEP_CPP_WORLD) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=.\xdata.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_XDATA=\ "..\cmn\streams.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\xdata.obj" : $(SOURCE) $(DEP_CPP_XDATA) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_XDATA=\ "..\cmn\streams.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\xdata.obj" : $(SOURCE) $(DEP_CPP_XDATA) "$(INTDIR)" !ENDIF SOURCE=..\cmn\xetp.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_XETP_=\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ "..\cmn\xetp.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\xetp.obj" : $(SOURCE) $(DEP_CPP_XETP_) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_XETP_=\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ "..\cmn\xetp.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\ui.h"\ ".\xdata.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\xetp.obj" : $(SOURCE) $(DEP_CPP_XETP_) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) !ENDIF SOURCE=.\Xevil.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_XEVIL=\ "..\cmn\actual.h"\ "..\cmn\game.h"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\aboutdialog.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\timedlg.h"\ ".\ui.h"\ ".\xdata.h"\ ".\xevil.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"l_agreement.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"role.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\Xevil.obj" : $(SOURCE) $(DEP_CPP_XEVIL) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_XEVIL=\ "..\cmn\actual.h"\ "..\cmn\game.h"\ "..\cmn\physical.h"\ "..\cmn\streams.h"\ ".\aboutdialog.h"\ ".\firepal.h"\ ".\fogpal.h"\ ".\glowpal.h"\ ".\palmod.h"\ ".\s_man.h"\ ".\sound.h"\ ".\stdafx.h"\ ".\timedlg.h"\ ".\ui.h"\ ".\xdata.h"\ ".\xevil.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"game_style.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"l_agreement.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"role.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"ui_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\Xevil.obj" : $(SOURCE) $(DEP_CPP_XEVIL) "$(INTDIR)" !ENDIF SOURCE=.\xevil.rc DEP_RSC_XEVIL_=\ ".\res\!dog0_ru.bmp"\ ".\res\27a.bmp"\ ".\res\27b.bmp"\ ".\res\39a.bmp"\ ".\res\alien0.bmp"\ ".\res\alien0b.bmp"\ ".\res\alien10.bmp"\ ".\res\alien12.bmp"\ ".\res\alien18.bmp"\ ".\res\alien1b1.bmp"\ ".\res\Alien4.bmp"\ ".\res\alien5.bmp"\ ".\res\aliendea.bmp"\ ".\res\Aliennu.bmp"\ ".\res\altar2.bmp"\ ".\res\altar3.bmp"\ ".\res\arrow.cur"\ ".\res\arrow_l.bmp"\ ".\res\Arrow_up.bmp"\ ".\res\autolanc.bmp"\ ".\res\Back.bmp"\ ".\res\backg.BMP"\ ".\res\bangbang.wav"\ ".\res\Barrow_d.bmp"\ ".\res\barrow_l.bmp"\ ".\res\barrow_r.bmp"\ ".\res\barrow_u.bmp"\ ".\res\bceagle.bmp"\ ".\res\beat_dog.bmp"\ ".\res\bitmap2.bmp"\ ".\res\bitmap3.bmp"\ ".\res\Bitmap6.bmp"\ ".\res\bitmap7.bmp"\ ".\res\Bitmap8.bmp"\ ".\res\Blok2.bmp"\ ".\res\blood13.bmp"\ ".\res\blood25.bmp"\ ".\res\blood40.bmp"\ ".\res\blood9.bmp"\ ".\res\bloodg25.bmp"\ ".\res\bloodg39.bmp"\ ".\res\bloodg4.bmp"\ ".\res\bloodg40.bmp"\ ".\res\bloodg9.bmp"\ ".\res\bmp00001.bmp"\ ".\res\bmp00002.bmp"\ ".\res\bmp00003.bmp"\ ".\res\bmp00004.bmp"\ ".\res\bmp00005.bmp"\ ".\res\bmp00006.bmp"\ ".\res\bmp00007.bmp"\ ".\res\bmp00008.bmp"\ ".\res\bmp00009.bmp"\ ".\res\bmp00010.bmp"\ ".\res\bmp00011.bmp"\ ".\res\bmp00012.bmp"\ ".\res\bmp00013.bmp"\ ".\res\bmp00014.bmp"\ ".\res\bmp00015.bmp"\ ".\res\bmp00016.bmp"\ ".\res\bmp00017.bmp"\ ".\res\bmp00018.bmp"\ ".\res\bmp00019.bmp"\ ".\res\bmp00020.bmp"\ ".\res\bmp00022.bmp"\ ".\res\Bmp00024.bmp"\ ".\res\bmp00025.bmp"\ ".\res\bmp00026.bmp"\ ".\res\bmp00027.bmp"\ ".\res\bmp00028.bmp"\ ".\res\bmp00029.bmp"\ ".\res\bmp00030.bmp"\ ".\res\bmp00031.bmp"\ ".\res\bmp00032.bmp"\ ".\res\bmp00033.bmp"\ ".\res\bmp00034.bmp"\ ".\res\bmp00036.bmp"\ ".\res\bmp00037.bmp"\ ".\res\bmp00040.bmp"\ ".\res\bmp00041.bmp"\ ".\res\Bmp00042.bmp"\ ".\res\bmp00043.bmp"\ ".\res\bmp00054.bmp"\ ".\res\bmp00055.bmp"\ ".\res\bmp00056.bmp"\ ".\res\bmp00057.bmp"\ ".\res\bmp00061.bmp"\ ".\res\bmp00065.bmp"\ ".\res\bmp00074.bmp"\ ".\res\bmp00075.bmp"\ ".\res\bmp00078.bmp"\ ".\res\bmp00081.bmp"\ ".\res\bmp00084.bmp"\ ".\res\bmp00085.bmp"\ ".\res\bmp00091.bmp"\ ".\res\bmp00092.bmp"\ ".\res\bmp00093.bmp"\ ".\res\bmp00094.bmp"\ ".\res\bmp00096.bmp"\ ".\res\bmp00099.bmp"\ ".\res\bmp00101.bmp"\ ".\res\bmp00103.bmp"\ ".\res\bmp00105.bmp"\ ".\res\bmp00107.bmp"\ ".\res\bmp00109.bmp"\ ".\res\bmp00111.bmp"\ ".\res\bmp00113.bmp"\ ".\res\bmp00123.bmp"\ ".\res\bmp00125.bmp"\ ".\res\bmp00127.bmp"\ ".\res\bmp00129.bmp"\ ".\res\bmp00131.bmp"\ ".\res\bmp00132.bmp"\ ".\res\bmp00134.bmp"\ ".\res\bmp00136.bmp"\ ".\res\bmp00138.bmp"\ ".\res\bmp00140.bmp"\ ".\res\bmp00151.bmp"\ ".\res\bmp00154.bmp"\ ".\res\breakdwn.wav"\ ".\res\Bshield.bmp"\ ".\res\c0.bmp"\ ".\res\c1.bmp"\ ".\res\c2.bmp"\ ".\res\c3.bmp"\ ".\res\cat.bmp"\ ".\res\chainsaw.bmp"\ ".\res\chainsw.wav"\ ".\res\Choppr0.bmp"\ ".\res\Choppr0b.bmp"\ ".\res\Choppr0c.bmp"\ ".\res\Choppr0d.bmp"\ ".\res\Choppr0e.bmp"\ ".\res\Choppr0f.bmp"\ ".\res\Choppr2.bmp"\ ".\res\Choppr25.bmp"\ ".\res\Choppr2b.bmp"\ ".\res\Choppr2c.bmp"\ ".\res\Choppr2d.bmp"\ ".\res\Choppr4.bmp"\ ".\res\Choppr4b.bmp"\ ".\res\Choppr4c.bmp"\ ".\res\Choppr4d.bmp"\ ".\res\Choppr5.bmp"\ ".\res\Chopprd.bmp"\ ".\res\Chopprdb.bmp"\ ".\res\Chopprdc.bmp"\ ".\res\Chopprdd.bmp"\ ".\res\Choppru.bmp"\ ".\res\Chopprub.bmp"\ ".\res\Choppruc.bmp"\ ".\res\Chopprud.bmp"\ ".\res\chpdeath.wav"\ ".\res\cloak.bmp"\ ".\res\cloak.wav"\ ".\res\cloak1.bmp"\ ".\res\cloak3.bmp"\ ".\res\cloak4.bmp"\ ".\res\cloak5.bmp"\ ".\res\death.wav"\ ".\res\demonsum.bmp"\ ".\res\Dg5_a.bmp"\ ".\res\Dg5_b.bmp"\ ".\res\Dg_atd.bmp"\ ".\res\dg_atu.bmp"\ ".\res\displayb.bmp"\ ".\res\Dog_att0.bmp"\ ".\res\dogatt.wav"\ ".\res\dogdeath.wav"\ ".\res\Door1.bmp"\ ".\res\doorbot.bmp"\ ".\res\Doortop.bmp"\ ".\res\doppel.bmp"\ ".\res\doppel.wav"\ ".\res\doppel1.bmp"\ ".\res\dragonde.bmp"\ ".\res\drg_1.bmp"\ ".\res\drg_2.bmp"\ ".\res\drg_bdy.bmp"\ ".\res\drg_head.bmp"\ ".\res\drgbite.bmp"\ ".\res\drop_sch.bmp"\ ".\res\droplift.bmp"\ ".\res\drugs.bmp"\ ".\res\dwhistle.bmp"\ ".\res\egg.bmp"\ ".\res\egg_open.bmp"\ ".\res\empty.bmp"\ ".\res\Endblok.bmp"\ ".\res\Enf_0a.bmp"\ ".\res\Enf_0b.bmp"\ ".\res\Enf_0c.bmp"\ ".\res\Enf_0d.bmp"\ ".\res\Enf_5.bmp"\ ".\res\explosion.wav"\ ".\res\fire.bmp"\ ".\res\fireball.bmp"\ ".\res\fireball.wav"\ ".\res\fist.bmp"\ ".\res\flame2.bmp"\ ".\res\flame3.bmp"\ ".\res\frog0.bmp"\ ".\res\frog2.bmp"\ ".\res\frog4.bmp"\ ".\res\frog5.bmp"\ ".\res\frog_dea.bmp"\ ".\res\frog_she.bmp"\ ".\res\frogdeth.wav"\ ".\res\FROGGUN.BMP"\ ".\res\froggun.wav"\ ".\res\garrow_d.bmp"\ ".\res\garrow_l.bmp"\ ".\res\garrow_r.bmp"\ ".\res\garrow_u.bmp"\ ".\res\grenade1.bmp"\ ".\res\grenade3.bmp"\ ".\res\grenade4.bmp"\ ".\res\GRENADES.BMP"\ ".\res\Handtoha.bmp"\ ".\res\happy.bmp"\ ".\res\Hblok.bmp"\ ".\res\Heir2.bmp"\ ".\res\Hell5.bmp"\ ".\res\hell_1.bmp"\ ".\res\Henblok.bmp"\ ".\res\hero0.bmp"\ ".\res\Hero0_at.bmp"\ ".\res\Hero0b.bmp"\ ".\res\hero0c.bmp"\ ".\res\hero0d.bmp"\ ".\res\hero0e.bmp"\ ".\res\hero0f.bmp"\ ".\res\hero10.bmp"\ ".\res\hero10b.bmp"\ ".\res\heroatt.wav"\ ".\res\Hialtar.bmp"\ ".\res\hibomb0.bmp"\ ".\res\hibomb1.bmp"\ ".\res\hibomb2.bmp"\ ".\res\hibomb3.bmp"\ ".\res\hibomb4.bmp"\ ".\res\hibomb5.bmp"\ ".\res\hibomb6.bmp"\ ".\res\hibombbl.bmp"\ ".\res\hiddog0.bmp"\ ".\res\hiddog0_.bmp"\ ".\res\hiddog0b.bmp"\ ".\res\hiddog2.bmp"\ ".\res\hiddog21.bmp"\ ".\res\hiddog22.bmp"\ ".\res\hiddog2_.bmp"\ ".\res\Hiddog5.bmp"\ ".\res\hiddog5b.bmp"\ ".\res\hiddogde.bmp"\ ".\res\hidog0.bmp"\ ".\res\hidog2.bmp"\ ".\res\hidog21.bmp"\ ".\res\hidog21b.bmp"\ ".\res\hidog22.bmp"\ ".\res\hidog22b.bmp"\ ".\res\hidog2_a.bmp"\ ".\res\hidogdea.bmp"\ ".\res\hidoor2.bmp"\ ".\res\hifirede.bmp"\ ".\res\hiflag.bmp"\ ".\res\hihero19.bmp"\ ".\res\hihero21.bmp"\ ".\res\hihero22.bmp"\ ".\res\Hihero4.bmp"\ ".\res\Hihero5.bmp"\ ".\res\Hihero_d.bmp"\ ".\res\hihome.bmp"\ ".\res\hihugger.bmp"\ ".\res\hilaunch.bmp"\ ".\res\himedkit.bmp"\ ".\res\hininja1.bmp"\ ".\res\hininja2.bmp"\ ".\res\hininja_.bmp"\ ".\res\hipistol.bmp"\ ".\res\hitextbl.bmp"\ ".\res\hiwalk18.bmp"\ ".\res\hiwalk2b.bmp"\ ".\res\hiwalk4.bmp"\ ".\res\hiwalk4b.bmp"\ ".\res\hiwalk4c.bmp"\ ".\res\hiwalk4d.bmp"\ ".\res\hiwalk5.bmp"\ ".\res\hiwalk5b.bmp"\ ".\res\Hiwalk5c.bmp"\ ".\res\Hiwalk5d.bmp"\ ".\res\hiwalk_0.bmp"\ ".\res\hiwalk_0b.bmp"\ ".\res\hiwalk_0c.bmp"\ ".\res\hiwalk_0d.bmp"\ ".\res\hiwalk_2.bmp"\ ".\res\hiwalk_d.bmp"\ ".\res\hiwlk18b.bmp"\ ".\res\Htrack.bmp"\ ".\res\idr_xevi.ico"\ ".\res\Ind1.bmp"\ ".\res\Indt2.bmp"\ ".\res\Jump0.bmp"\ ".\res\Ladder.bmp"\ ".\res\Ladder2.bmp"\ ".\res\Lance_ho.bmp"\ ".\res\lance_ve.bmp"\ ".\res\lancer.wav"\ ".\res\lancer1.bmp"\ ".\res\laser.wav"\ ".\res\laser_ho.bmp"\ ".\res\lasers.bmp"\ ".\res\lem_trak.wav"\ ".\res\lemdeth.wav"\ ".\res\logob5.bmp"\ ".\res\machgun.wav"\ ".\res\Md2door1.bmp"\ ".\res\Md2door2.bmp"\ ".\res\Md2ladde.bmp"\ ".\res\Md2mover.bmp"\ ".\res\Md2updow.bmp"\ ".\res\Menunewg.bmp"\ ".\res\mgun1.bmp"\ ".\res\missile.wav"\ ".\res\missle25.bmp"\ ".\res\missle39.bmp"\ ".\res\missle40.bmp"\ ".\res\mover.bmp"\ ".\res\Moversq.bmp"\ ".\res\moversqu.bmp"\ ".\res\napalm1.bmp"\ ".\res\napalm2.bmp"\ ".\res\napalm3.bmp"\ ".\res\napalm4.bmp"\ ".\res\napalms.bmp"\ ".\res\Nin0.bmp"\ ".\res\Nin0b.bmp"\ ".\res\Nin0c.bmp"\ ".\res\Nin0d.bmp"\ ".\res\Nin0e.bmp"\ ".\res\Nin0f.bmp"\ ".\res\Nin5.bmp"\ ".\res\nin_kick0jmp.bmp"\ ".\res\nin_kick0low.bmp"\ ".\res\nin_lo0.bmp"\ ".\res\nin_lo0b.bmp"\ ".\res\nin_lo0c.bmp"\ ".\res\nin_lo0d.bmp"\ ".\res\nin_lo0e.bmp"\ ".\res\nin_lo0f.bmp"\ ".\res\ninatt_down.bmp"\ ".\res\Ninj0a.bmp"\ ".\res\Ninj0b.bmp"\ ".\res\Ninj0c.bmp"\ ".\res\Ninj0d.bmp"\ ".\res\ninjaatt.wav"\ ".\res\ninjadth.wav"\ ".\res\ninjump_down1.bmp"\ ".\res\ninjump_down2.bmp"\ ".\res\ninjump_up.bmp"\ ".\res\nlift.BMP"\ ".\res\none.bmp"\ ".\res\none1.bmp"\ ".\res\oil25.bmp"\ ".\res\oil39.bmp"\ ".\res\oil4.bmp"\ ".\res\oil40.bmp"\ ".\res\oil9.bmp"\ ".\res\Outa.bmp"\ ".\res\Outb.bmp"\ ".\res\outs.BMP"\ ".\res\Outside.bmp"\ ".\res\Parents.bmp"\ ".\res\pent.bmp"\ ".\res\pepper1.bmp"\ ".\res\pills.bmp"\ ".\res\pistol.wav"\ ".\res\pyramid.bmp"\ ".\res\r0.bmp"\ ".\res\r1.bmp"\ ".\res\r2.bmp"\ ".\res\r3.bmp"\ ".\res\r4.bmp"\ ".\res\r5.bmp"\ ".\res\r6.bmp"\ ".\res\r7.bmp"\ ".\res\r8.bmp"\ ".\res\rockhi.bmp"\ ".\res\seal0.bmp"\ ".\res\seal0b.bmp"\ ".\res\sealcenter.bmp"\ ".\res\sealdead.bmp"\ ".\res\shell.bmp"\ ".\res\shield.wav"\ ".\res\Sider.bmp"\ ".\res\skull.bmp"\ ".\res\Small.ico"\ ".\res\sndtrak.wav"\ ".\res\squanch_.bmp"\ ".\res\star.bmp"\ ".\res\starb.bmp"\ ".\res\STARS.BMP"\ ".\res\stop.bmp"\ ".\res\suicideb.bmp"\ ".\res\SWAPPER.BMP"\ ".\res\swapper.wav"\ ".\res\take_can.bmp"\ ".\res\Track.wav"\ ".\res\transmog.wav"\ ".\res\trapopen.bmp"\ ".\res\troll0.bmp"\ ".\res\troll0b.bmp"\ ".\res\troll0c.bmp"\ ".\res\troll0d.bmp"\ ".\res\troll1.bmp"\ ".\res\troll5.bmp"\ ".\res\Updn.bmp"\ ".\res\vegetabl.bmp"\ ".\res\vertmove.bmp"\ ".\res\Vtrack.bmp"\ ".\res\Wall.bmp"\ ".\res\Weight2.bmp"\ ".\res\Wsqaure.bmp"\ ".\res\xevil.pal"\ ".\res\XEvil.rc2"\ ".\res\xevil1.bmp"\ ".\res\xevil1.cur"\ ".\res\yarrow_d.bmp"\ ".\res\yarrow_l.bmp"\ ".\res\yarrow_r.bmp"\ ".\res\yarrow_u.bmp"\ ".\res\Yshield.bmp"\ "$(INTDIR)\xevil.res" : $(SOURCE) $(DEP_RSC_XEVIL_) "$(INTDIR)" $(RSC) $(RSC_PROJ) $(SOURCE) SOURCE=.\XEvilServerStatus.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_XEVILS=\ ".\specialcontrols.h"\ ".\stdafx.h"\ ".\xevil.h"\ ".\xevilserverstatus.h"\ "$(INTDIR)\XEvilServerStatus.obj" : $(SOURCE) $(DEP_CPP_XEVILS) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_XEVILS=\ ".\specialcontrols.h"\ ".\stdafx.h"\ ".\xevil.h"\ ".\xevilserverstatus.h"\ "$(INTDIR)\XEvilServerStatus.obj" : $(SOURCE) $(DEP_CPP_XEVILS) "$(INTDIR)" !ENDIF SOURCE=.\xviewport.cpp !IF "$(CFG)" == "xevil - Win32 Release" DEP_CPP_XVIEW=\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ ".\xevil.h"\ ".\xviewport.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\xviewport.obj" : $(SOURCE) $(DEP_CPP_XVIEW) "$(INTDIR)" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" DEP_CPP_XVIEW=\ "..\cmn\streams.h"\ ".\s_man.h"\ ".\stdafx.h"\ ".\xdata.h"\ ".\xevil.h"\ ".\xviewport.h"\ {$(INCLUDE)}"area.h"\ {$(INCLUDE)}"coord.h"\ {$(INCLUDE)}"id.h"\ {$(INCLUDE)}"intel.h"\ {$(INCLUDE)}"locator.h"\ {$(INCLUDE)}"sound_cmn.h"\ {$(INCLUDE)}"utils.h"\ {$(INCLUDE)}"world.h"\ "$(INTDIR)\xviewport.obj" : $(SOURCE) $(DEP_CPP_XVIEW) "$(INTDIR)" !ENDIF !ENDIF xevil-2.02r2.orig/win32/xevil.dsp0100644000175000017500000011544607041513754016124 0ustar aaronlaaronl# Microsoft Developer Studio Project File - Name="xevil" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 5.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=xevil - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "xevil.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "xevil.mak" CFG="xevil - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "xevil - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "xevil - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "xevil - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "xevil___" # PROP BASE Intermediate_Dir "xevil___" # PROP BASE Target_Dir "" # PROP Use_MFC 1 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 winmm.lib ole32.lib /nologo /subsystem:windows /machine:I386 !ELSEIF "$(CFG)" == "xevil - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "xevil__0" # PROP BASE Intermediate_Dir "xevil__0" # PROP BASE Target_Dir "" # PROP Use_MFC 1 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 winmm.lib ole32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "xevil - Win32 Release" # Name "xevil - Win32 Debug" # Begin Source File SOURCE=".\res\!dog0_ru.bmp" # End Source File # Begin Source File SOURCE=.\res\27a.bmp # End Source File # Begin Source File SOURCE=.\res\27b.bmp # End Source File # Begin Source File SOURCE=.\res\39a.bmp # End Source File # Begin Source File SOURCE=.\res\aaanew.bmp # End Source File # Begin Source File SOURCE=.\res\aaanew1.bmp # End Source File # Begin Source File SOURCE=.\res\aaanew2.bmp # End Source File # Begin Source File SOURCE=.\res\Aaanew7.bmp # End Source File # Begin Source File SOURCE=.\aboutdialog.cpp # End Source File # Begin Source File SOURCE=..\cmn\actual.cpp # End Source File # Begin Source File SOURCE=.\res\Aliennu.bmp # End Source File # Begin Source File SOURCE=..\cmn\area.cpp # End Source File # Begin Source File SOURCE=.\res\arrow.cur # End Source File # Begin Source File SOURCE=.\res\arrow_dn.bmp # End Source File # Begin Source File SOURCE=.\res\Arrow_l.bmp # End Source File # Begin Source File SOURCE=.\res\Arrow_up.bmp # End Source File # Begin Source File SOURCE=.\res\Autolanc.bmp # End Source File # Begin Source File SOURCE=.\res\babyseal.mid # End Source File # Begin Source File SOURCE=.\res\Back.bmp # End Source File # Begin Source File SOURCE=.\res\backg.BMP # End Source File # Begin Source File SOURCE=.\res\bangbang.wav # End Source File # Begin Source File SOURCE=.\res\Barrow_d.bmp # End Source File # Begin Source File SOURCE=.\res\Barrow_l.bmp # End Source File # Begin Source File SOURCE=.\res\Barrow_r.bmp # End Source File # Begin Source File SOURCE=.\res\Barrow_u.bmp # End Source File # Begin Source File SOURCE=.\res\Bceagle.bmp # End Source File # Begin Source File SOURCE=.\res\Beat_dog.bmp # End Source File # Begin Source File SOURCE=.\res\Bitmap2.bmp # End Source File # Begin Source File SOURCE=.\res\Bitmap6.bmp # End Source File # Begin Source File SOURCE=.\res\Bitmap7.bmp # End Source File # Begin Source File SOURCE=.\res\Bitmap8.bmp # End Source File # Begin Source File SOURCE=.\res\Blok2.bmp # End Source File # Begin Source File SOURCE=.\res\Blood13.bmp # End Source File # Begin Source File SOURCE=.\res\Blood25.bmp # End Source File # Begin Source File SOURCE=.\res\blood39.bmp # End Source File # Begin Source File SOURCE=.\res\blood4.bmp # End Source File # Begin Source File SOURCE=.\res\Blood40.bmp # End Source File # Begin Source File SOURCE=.\res\Blood9.bmp # End Source File # Begin Source File SOURCE=.\res\Bloodg25.bmp # End Source File # Begin Source File SOURCE=.\res\Bloodg39.bmp # End Source File # Begin Source File SOURCE=.\res\Bloodg4.bmp # End Source File # Begin Source File SOURCE=.\res\Bloodg40.bmp # End Source File # Begin Source File SOURCE=.\res\Bloodg9.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00002.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00003.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00004.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00006.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00007.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00009.bmp # End Source File # Begin Source File SOURCE=.\Res\Bmp00010.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00011.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00012.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00013.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00014.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00015.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00016.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00017.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00018.bmp # End Source File # Begin Source File SOURCE=.\Res\Bmp00019.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00020.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00021.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00022.bmp # End Source File # Begin Source File SOURCE=.\Res\Bmp00023.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00024.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00026.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00027.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00028.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00030.bmp # End Source File # Begin Source File SOURCE=.\Res\Bmp00032.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00034.bmp # End Source File # Begin Source File SOURCE=.\Res\Bmp00035.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00038.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00039.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00040.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00041.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00042.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00043.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00044.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00045.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00046.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00047.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00048.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00049.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00050.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00051.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00052.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00053.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00054.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00055.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00056.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00057.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00058.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00059.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00060.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00061.bmp # End Source File # Begin Source File SOURCE=.\res\bmp00062.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00074.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00075.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00081.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00084.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00085.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00091.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00092.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00093.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00094.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00096.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00099.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00101.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00103.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00105.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00107.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00109.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00111.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00113.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00123.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00125.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00127.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00129.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00131.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00132.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00134.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00136.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00138.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00140.bmp # End Source File # Begin Source File SOURCE=.\res\Bmp00151.bmp # End Source File # Begin Source File SOURCE=.\res\breakdwn.wav # End Source File # Begin Source File SOURCE=.\res\Bshield.bmp # End Source File # Begin Source File SOURCE=.\res\c0.bmp # End Source File # Begin Source File SOURCE=.\res\c1.bmp # End Source File # Begin Source File SOURCE=.\res\c2.bmp # End Source File # Begin Source File SOURCE=.\res\c3.bmp # End Source File # Begin Source File SOURCE=.\res\Cat.bmp # End Source File # Begin Source File SOURCE=.\res\Chainsaw.bmp # End Source File # Begin Source File SOURCE=.\res\chainsw.wav # End Source File # Begin Source File SOURCE=.\res\Choppr0.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr0b.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr0c.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr0d.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr0e.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr0f.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr2.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr25.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr2b.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr2c.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr2d.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr4.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr4b.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr4c.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr4d.bmp # End Source File # Begin Source File SOURCE=.\res\Choppr5.bmp # End Source File # Begin Source File SOURCE=.\res\Chopprd.bmp # End Source File # Begin Source File SOURCE=.\res\Chopprdb.bmp # End Source File # Begin Source File SOURCE=.\res\Chopprdc.bmp # End Source File # Begin Source File SOURCE=.\res\Chopprdd.bmp # End Source File # Begin Source File SOURCE=.\res\Choppru.bmp # End Source File # Begin Source File SOURCE=.\res\Chopprub.bmp # End Source File # Begin Source File SOURCE=.\res\Choppruc.bmp # End Source File # Begin Source File SOURCE=.\res\Chopprud.bmp # End Source File # Begin Source File SOURCE=.\res\chpdeath.wav # End Source File # Begin Source File SOURCE=.\res\cloak.wav # End Source File # Begin Source File SOURCE=.\connectdlg.cpp # End Source File # Begin Source File SOURCE=..\cmn\coord.cpp # End Source File # Begin Source File SOURCE=".\res\crawl-forward.bmp" # End Source File # Begin Source File SOURCE=".\res\crawl-right-1.bmp" # End Source File # Begin Source File SOURCE=".\res\crawl-right-2.bmp" # End Source File # Begin Source File SOURCE=".\res\crawl-right-3.bmp" # End Source File # Begin Source File SOURCE=".\res\crawl-right-4.bmp" # End Source File # Begin Source File SOURCE=".\res\crawl-right-5.bmp" # End Source File # Begin Source File SOURCE=".\res\crawl-right-6.bmp" # End Source File # Begin Source File SOURCE=.\ddraw.lib # End Source File # Begin Source File SOURCE=.\res\death.wav # End Source File # Begin Source File SOURCE=.\res\Demonsum.bmp # End Source File # Begin Source File SOURCE=.\res\dethmrch.mid # End Source File # Begin Source File SOURCE=.\res\Dg5_a.bmp # End Source File # Begin Source File SOURCE=.\res\Dg5_b.bmp # End Source File # Begin Source File SOURCE=.\res\Dg_atd.bmp # End Source File # Begin Source File SOURCE=.\res\Dg_atu.bmp # End Source File # Begin Source File SOURCE=.\difficulty.cpp # End Source File # Begin Source File SOURCE=.\res\Displayb.bmp # End Source File # Begin Source File SOURCE=.\res\Dog_att0.bmp # End Source File # Begin Source File SOURCE=.\res\dogatt.wav # End Source File # Begin Source File SOURCE=.\res\dogdeath.wav # End Source File # Begin Source File SOURCE=.\res\Door1.bmp # End Source File # Begin Source File SOURCE=.\res\Doorbot.bmp # End Source File # Begin Source File SOURCE=.\res\Doortop.bmp # End Source File # Begin Source File SOURCE=.\res\doppel.wav # End Source File # Begin Source File SOURCE=.\res\Dragonde.bmp # End Source File # Begin Source File SOURCE=.\draw.cpp # End Source File # Begin Source File SOURCE=.\res\Drg_1.bmp # End Source File # Begin Source File SOURCE=.\res\Drg_2.bmp # End Source File # Begin Source File SOURCE=.\res\Drg_bdy.bmp # End Source File # Begin Source File SOURCE=.\res\Drg_head.bmp # End Source File # Begin Source File SOURCE=.\res\Drgbite.bmp # End Source File # Begin Source File SOURCE=.\res\Drop_sch.bmp # End Source File # Begin Source File SOURCE=.\res\Droplift.bmp # End Source File # Begin Source File SOURCE=.\Res\Drugs.bmp # End Source File # Begin Source File SOURCE=.\dsound.lib # End Source File # Begin Source File SOURCE=.\res\Egg.bmp # End Source File # Begin Source File SOURCE=.\res\Egg_open.bmp # End Source File # Begin Source File SOURCE=.\res\Empty.bmp # End Source File # Begin Source File SOURCE=.\res\Endblok.bmp # End Source File # Begin Source File SOURCE=.\res\explosion.wav # End Source File # Begin Source File SOURCE=.\fileman.cpp # End Source File # Begin Source File SOURCE=.\res\Fire.bmp # End Source File # Begin Source File SOURCE=.\res\fire.mid # End Source File # Begin Source File SOURCE=.\res\Fireball.bmp # End Source File # Begin Source File SOURCE=.\res\fireball.wav # End Source File # Begin Source File SOURCE=.\firepal.cpp # End Source File # Begin Source File SOURCE=.\res\Fist.bmp # End Source File # Begin Source File SOURCE=.\res\Flame2.bmp # End Source File # Begin Source File SOURCE=.\res\Flame3.bmp # End Source File # Begin Source File SOURCE=.\fogpal.cpp # End Source File # Begin Source File SOURCE=.\res\Frog0.bmp # End Source File # Begin Source File SOURCE=.\res\Frog2.bmp # End Source File # Begin Source File SOURCE=.\res\Frog4.bmp # End Source File # Begin Source File SOURCE=.\res\Frog5.bmp # End Source File # Begin Source File SOURCE=.\res\Frog_dea.bmp # End Source File # Begin Source File SOURCE=.\res\frogdeth.wav # End Source File # Begin Source File SOURCE=.\res\Froggun.bmp # End Source File # Begin Source File SOURCE=.\res\froggun.wav # End Source File # Begin Source File SOURCE=.\fsstatus.cpp # End Source File # Begin Source File SOURCE=.\res\fwbackgr.bmp # End Source File # Begin Source File SOURCE=..\cmn\game.cpp # End Source File # Begin Source File SOURCE=..\cmn\game_style.cpp # End Source File # Begin Source File SOURCE=.\res\Garrow_d.bmp # End Source File # Begin Source File SOURCE=.\res\Garrow_l.bmp # End Source File # Begin Source File SOURCE=.\res\Garrow_r.bmp # End Source File # Begin Source File SOURCE=.\res\Garrow_u.bmp # End Source File # Begin Source File SOURCE=.\glowpal.cpp # End Source File # Begin Source File SOURCE=.\res\Handtoha.bmp # End Source File # Begin Source File SOURCE=.\res\Happy.bmp # End Source File # Begin Source File SOURCE=.\res\Hell5.bmp # End Source File # Begin Source File SOURCE=.\res\Hell_1.bmp # End Source File # Begin Source File SOURCE=.\res\Henblok.bmp # End Source File # Begin Source File SOURCE=.\res\Hero0.bmp # End Source File # Begin Source File SOURCE=.\res\Hero0_at.bmp # End Source File # Begin Source File SOURCE=.\res\Hero0b.bmp # End Source File # Begin Source File SOURCE=.\res\Hero0c.bmp # End Source File # Begin Source File SOURCE=.\res\Hero0d.bmp # End Source File # Begin Source File SOURCE=.\res\Hero0e.bmp # End Source File # Begin Source File SOURCE=.\res\Hero0f.bmp # End Source File # Begin Source File SOURCE=.\res\Hero10.bmp # End Source File # Begin Source File SOURCE=.\res\Hero10b.bmp # End Source File # Begin Source File SOURCE=.\res\heroatt.wav # End Source File # Begin Source File SOURCE=.\res\hhero18c.bmp # End Source File # Begin Source File SOURCE=.\res\hhero18d.bmp # End Source File # Begin Source File SOURCE=.\res\hhero18e.bmp # End Source File # Begin Source File SOURCE=.\res\hhero18f.bmp # End Source File # Begin Source File SOURCE=.\res\hhero18g.bmp # End Source File # Begin Source File SOURCE=.\res\hhero21_.bmp # End Source File # Begin Source File SOURCE=.\res\hhero_18.bmp # End Source File # Begin Source File SOURCE=.\res\hi_alien.bmp # End Source File # Begin Source File SOURCE=.\res\hialien0.bmp # End Source File # Begin Source File SOURCE=.\Res\Hialien1.bmp # End Source File # Begin Source File SOURCE=.\res\hialien2.bmp # End Source File # Begin Source File SOURCE=.\Res\hialien4.bmp # End Source File # Begin Source File SOURCE=.\res\hialien5.bmp # End Source File # Begin Source File SOURCE=.\res\hialien6.bmp # End Source File # Begin Source File SOURCE=.\Res\Hialtar.bmp # End Source File # Begin Source File SOURCE=.\res\Hiddog0.bmp # End Source File # Begin Source File SOURCE=.\res\Hiddog0_.bmp # End Source File # Begin Source File SOURCE=.\res\Hiddog0b.bmp # End Source File # Begin Source File SOURCE=.\res\Hiddog2.bmp # End Source File # Begin Source File SOURCE=.\res\Hiddog21.bmp # End Source File # Begin Source File SOURCE=.\res\Hiddog22.bmp # End Source File # Begin Source File SOURCE=.\res\Hiddog2_.bmp # End Source File # Begin Source File SOURCE=.\res\Hiddog5.bmp # End Source File # Begin Source File SOURCE=.\res\Hiddog5b.bmp # End Source File # Begin Source File SOURCE=.\res\Hiddogde.bmp # End Source File # Begin Source File SOURCE=.\res\Hidog0.bmp # End Source File # Begin Source File SOURCE=.\res\Hidog2.bmp # End Source File # Begin Source File SOURCE=.\res\Hidog21.bmp # End Source File # Begin Source File SOURCE=.\res\Hidog21b.bmp # End Source File # Begin Source File SOURCE=.\res\Hidog22.bmp # End Source File # Begin Source File SOURCE=.\res\Hidog22b.bmp # End Source File # Begin Source File SOURCE=.\res\Hidog2_a.bmp # End Source File # Begin Source File SOURCE=.\res\Hidogdea.bmp # End Source File # Begin Source File SOURCE=.\res\Hidoor2.bmp # End Source File # Begin Source File SOURCE=.\res\Hiflag.bmp # End Source File # Begin Source File SOURCE=.\res\Hihero19.bmp # End Source File # Begin Source File SOURCE=.\res\Hihero21.bmp # End Source File # Begin Source File SOURCE=.\res\Hihero22.bmp # End Source File # Begin Source File SOURCE=.\res\Hihero5.bmp # End Source File # Begin Source File SOURCE=.\res\Hihero_d.bmp # End Source File # Begin Source File SOURCE=.\res\Hihome.bmp # End Source File # Begin Source File SOURCE=.\res\Hilaunch.bmp # End Source File # Begin Source File SOURCE=.\res\Himedkit.bmp # End Source File # Begin Source File SOURCE=.\res\Hininja1.bmp # End Source File # Begin Source File SOURCE=.\res\Hininja2.bmp # End Source File # Begin Source File SOURCE=.\res\Hininja_.bmp # End Source File # Begin Source File SOURCE=.\res\Hipistol.bmp # End Source File # Begin Source File SOURCE=.\res\Hitextbl.bmp # End Source File # Begin Source File SOURCE=.\res\hive.mid # End Source File # Begin Source File SOURCE=.\res\Hiwalk18.bmp # End Source File # Begin Source File SOURCE=.\res\Hiwalk2b.bmp # End Source File # Begin Source File SOURCE=.\res\Hiwalk4.bmp # End Source File # Begin Source File SOURCE=.\res\Hiwalk4b.bmp # End Source File # Begin Source File SOURCE=.\res\Hiwalk4c.bmp # End Source File # Begin Source File SOURCE=.\res\Hiwalk4d.bmp # End Source File # Begin Source File SOURCE=.\res\Hiwalk5.bmp # End Source File # Begin Source File SOURCE=.\res\Hiwalk5b.bmp # End Source File # Begin Source File SOURCE=.\res\Hiwalk5c.bmp # End Source File # Begin Source File SOURCE=.\res\Hiwalk5d.bmp # End Source File # Begin Source File SOURCE=.\res\Hiwalk_0.bmp # End Source File # Begin Source File SOURCE=.\res\hiwalk_0b.bmp # End Source File # Begin Source File SOURCE=.\res\hiwalk_0c.bmp # End Source File # Begin Source File SOURCE=.\res\hiwalk_0d.bmp # End Source File # Begin Source File SOURCE=.\res\Hiwalk_2.bmp # End Source File # Begin Source File SOURCE=.\res\Hiwalk_d.bmp # End Source File # Begin Source File SOURCE=.\res\Hiwlk18b.bmp # End Source File # Begin Source File SOURCE=.\Res\Htrack.bmp # End Source File # Begin Source File SOURCE=..\cmn\id.cpp # End Source File # Begin Source File SOURCE=.\res\idr_xevi.ico # End Source File # Begin Source File SOURCE=.\res\Ind1.bmp # End Source File # Begin Source File SOURCE=.\res\Indt2.bmp # End Source File # Begin Source File SOURCE=..\cmn\intel.cpp # End Source File # Begin Source File SOURCE=.\res\Jump0.bmp # End Source File # Begin Source File SOURCE=.\keyhitdlg.cpp # End Source File # Begin Source File SOURCE=.\keysets.cpp # End Source File # Begin Source File SOURCE=.\res\kill_par.bmp # End Source File # Begin Source File SOURCE=.\res\kkkill.mid # End Source File # Begin Source File SOURCE=..\cmn\l_agreement.cpp # End Source File # Begin Source File SOURCE=.\res\Ladder.bmp # End Source File # Begin Source File SOURCE=.\res\Ladder2.bmp # End Source File # Begin Source File SOURCE=.\res\Lance_ho.bmp # End Source File # Begin Source File SOURCE=.\res\Lance_ve.bmp # End Source File # Begin Source File SOURCE=.\res\lancer.wav # End Source File # Begin Source File SOURCE=.\res\Lancer1.bmp # End Source File # Begin Source File SOURCE=.\res\laser.wav # End Source File # Begin Source File SOURCE=.\res\Laser_ho.bmp # End Source File # Begin Source File SOURCE=.\res\Lasers.bmp # End Source File # Begin Source File SOURCE=.\res\lem_trak.wav # End Source File # Begin Source File SOURCE=.\res\lemdeth.wav # End Source File # Begin Source File SOURCE=..\cmn\locator.cpp # End Source File # Begin Source File SOURCE=.\res\Logob5.bmp # End Source File # Begin Source File SOURCE=.\res\machgun.wav # End Source File # Begin Source File SOURCE=.\Res\Md2door1.bmp # End Source File # Begin Source File SOURCE=.\res\Md2door2.bmp # End Source File # Begin Source File SOURCE=.\res\Md2ladde.bmp # End Source File # Begin Source File SOURCE=.\res\Md2mover.bmp # End Source File # Begin Source File SOURCE=.\res\md2outsi.bmp # End Source File # Begin Source File SOURCE=.\Res\Md2updow.bmp # End Source File # Begin Source File SOURCE=.\res\md4backg.bmp # End Source File # Begin Source File SOURCE=.\res\md4door1.bmp # End Source File # Begin Source File SOURCE=.\res\Md4door2.bmp # End Source File # Begin Source File SOURCE=.\Res\Md4horiz.bmp # End Source File # Begin Source File SOURCE=.\res\Md4ladde.bmp # End Source File # Begin Source File SOURCE=.\res\md4outsi.bmp # End Source File # Begin Source File SOURCE=.\res\Md4updow.bmp # End Source File # Begin Source File SOURCE=.\res\Md4vertm.bmp # End Source File # Begin Source File SOURCE=.\res\md4wall.bmp # End Source File # Begin Source File SOURCE=.\res\md5backg.bmp # End Source File # Begin Source File SOURCE=.\res\md5door1.bmp # End Source File # Begin Source File SOURCE=.\res\md5door2.bmp # End Source File # Begin Source File SOURCE=.\res\md5horiz.bmp # End Source File # Begin Source File SOURCE=.\res\md5ladde.bmp # End Source File # Begin Source File SOURCE=.\res\md5mover.bmp # End Source File # Begin Source File SOURCE=.\res\md5outsi.bmp # End Source File # Begin Source File SOURCE=.\res\md5updow.bmp # End Source File # Begin Source File SOURCE=.\res\md5vertm.bmp # End Source File # Begin Source File SOURCE=.\res\md5wall.bmp # End Source File # Begin Source File SOURCE=.\res\mdoutsid.bmp # End Source File # Begin Source File SOURCE=.\res\Menunewg.bmp # End Source File # Begin Source File SOURCE=.\res\Mgun1.bmp # End Source File # Begin Source File SOURCE=.\res\missile.wav # End Source File # Begin Source File SOURCE=.\res\Missle25.bmp # End Source File # Begin Source File SOURCE=.\res\Missle39.bmp # End Source File # Begin Source File SOURCE=.\res\Missle40.bmp # End Source File # Begin Source File SOURCE=.\res\Mover.bmp # End Source File # Begin Source File SOURCE=.\res\Moversq.bmp # End Source File # Begin Source File SOURCE=.\res\Moversqu.bmp # End Source File # Begin Source File SOURCE=.\res\Napalm1.bmp # End Source File # Begin Source File SOURCE=.\res\Napalm3.bmp # End Source File # Begin Source File SOURCE=.\res\Napalm4.bmp # End Source File # Begin Source File SOURCE=.\res\Napalms.bmp # End Source File # Begin Source File SOURCE=.\res\Newsong.mid # End Source File # Begin Source File SOURCE=.\res\Nightsky.mid # End Source File # Begin Source File SOURCE=.\res\Nin0.bmp # End Source File # Begin Source File SOURCE=.\res\Nin0b.bmp # End Source File # Begin Source File SOURCE=.\res\Nin0c.bmp # End Source File # Begin Source File SOURCE=.\res\Nin0d.bmp # End Source File # Begin Source File SOURCE=.\res\Nin0e.bmp # End Source File # Begin Source File SOURCE=.\res\Nin0f.bmp # End Source File # Begin Source File SOURCE=.\res\Nin5.bmp # End Source File # Begin Source File SOURCE=.\res\nin_kick0jmp.bmp # End Source File # Begin Source File SOURCE=.\res\nin_kick0low.bmp # End Source File # Begin Source File SOURCE=.\res\Nin_lo0.bmp # End Source File # Begin Source File SOURCE=.\res\Nin_lo0b.bmp # End Source File # Begin Source File SOURCE=.\res\Nin_lo0c.bmp # End Source File # Begin Source File SOURCE=.\res\Nin_lo0d.bmp # End Source File # Begin Source File SOURCE=.\res\Nin_lo0e.bmp # End Source File # Begin Source File SOURCE=.\res\Nin_lo0f.bmp # End Source File # Begin Source File SOURCE=.\res\ninatt_down.bmp # End Source File # Begin Source File SOURCE=.\res\Ninj0a.bmp # End Source File # Begin Source File SOURCE=.\res\Ninj0b.bmp # End Source File # Begin Source File SOURCE=.\res\Ninj0c.bmp # End Source File # Begin Source File SOURCE=.\res\Ninj0d.bmp # End Source File # Begin Source File SOURCE=.\res\ninjaatt.wav # End Source File # Begin Source File SOURCE=.\res\ninjadth.wav # End Source File # Begin Source File SOURCE=.\res\ninjump_down1.bmp # End Source File # Begin Source File SOURCE=.\res\ninjump_down2.bmp # End Source File # Begin Source File SOURCE=.\res\ninjump_up.bmp # End Source File # Begin Source File SOURCE=.\res\nlift.BMP # End Source File # Begin Source File SOURCE=.\res\None.bmp # End Source File # Begin Source File SOURCE=.\res\None1.bmp # End Source File # Begin Source File SOURCE=.\res\Oil25.bmp # End Source File # Begin Source File SOURCE=.\res\Oil39.bmp # End Source File # Begin Source File SOURCE=.\res\Oil4.bmp # End Source File # Begin Source File SOURCE=.\res\oil40.bmp # End Source File # Begin Source File SOURCE=.\res\Oil9.bmp # End Source File # Begin Source File SOURCE=.\optionsdlg.cpp # End Source File # Begin Source File SOURCE=.\res\Outa.bmp # End Source File # Begin Source File SOURCE=.\res\Outb.bmp # End Source File # Begin Source File SOURCE=.\res\outs.BMP # End Source File # Begin Source File SOURCE=.\res\Outside.bmp # End Source File # Begin Source File SOURCE=.\palmod.cpp # End Source File # Begin Source File SOURCE=.\res\Parents.bmp # End Source File # Begin Source File SOURCE=.\res\Pent.bmp # End Source File # Begin Source File SOURCE=.\res\Pepper1.bmp # End Source File # Begin Source File SOURCE=..\cmn\physical.cpp # End Source File # Begin Source File SOURCE=.\res\Pills.bmp # End Source File # Begin Source File SOURCE=.\res\pistol.wav # End Source File # Begin Source File SOURCE=.\res\Pyramid.bmp # End Source File # Begin Source File SOURCE=.\res\r0.bmp # End Source File # Begin Source File SOURCE=.\res\r1.bmp # End Source File # Begin Source File SOURCE=.\res\r2.bmp # End Source File # Begin Source File SOURCE=.\res\r3.bmp # End Source File # Begin Source File SOURCE=.\res\r4.bmp # End Source File # Begin Source File SOURCE=.\res\r5.bmp # End Source File # Begin Source File SOURCE=.\res\rarrow_r.bmp # End Source File # Begin Source File SOURCE=.\res\Rockhi.bmp # End Source File # Begin Source File SOURCE=..\cmn\role.cpp # End Source File # Begin Source File SOURCE=.\runserverdlg.cpp # End Source File # Begin Source File SOURCE=.\s_man.cpp # End Source File # Begin Source File SOURCE=.\res\Seal0.bmp # End Source File # Begin Source File SOURCE=.\res\Seal0b.bmp # End Source File # Begin Source File SOURCE=.\res\Shell.bmp # End Source File # Begin Source File SOURCE=.\res\shield.wav # End Source File # Begin Source File SOURCE=.\res\Sider.bmp # End Source File # Begin Source File SOURCE=.\res\Skull.bmp # End Source File # Begin Source File SOURCE=.\res\Small.ico # End Source File # Begin Source File SOURCE=.\res\sndtrak.wav # End Source File # Begin Source File SOURCE=.\sound.cpp # End Source File # Begin Source File SOURCE=..\cmn\sound_cmn.cpp # End Source File # Begin Source File SOURCE=.\specialcontrols.cpp # End Source File # Begin Source File SOURCE=.\res\Squanch_.bmp # End Source File # Begin Source File SOURCE=.\res\Star.bmp # End Source File # Begin Source File SOURCE=.\res\Starb.bmp # End Source File # Begin Source File SOURCE=.\res\Stars.bmp # End Source File # Begin Source File SOURCE=.\stdafx.cpp # End Source File # Begin Source File SOURCE=.\storydlg.cpp # End Source File # Begin Source File SOURCE=..\cmn\streams.cpp # End Source File # Begin Source File SOURCE=.\res\Suicideb.bmp # End Source File # Begin Source File SOURCE=.\res\Swapper.bmp # End Source File # Begin Source File SOURCE=.\res\swapper.wav # End Source File # Begin Source File SOURCE=.\res\Sweetdar.mid # End Source File # Begin Source File SOURCE=.\res\Take_can.bmp # End Source File # Begin Source File SOURCE=.\res\Terraexm.mid # End Source File # Begin Source File SOURCE=.\timedlg.cpp # End Source File # Begin Source File SOURCE=.\res\Track.wav # End Source File # Begin Source File SOURCE=.\res\transmog.wav # End Source File # Begin Source File SOURCE=.\res\trapopen.bmp # End Source File # Begin Source File SOURCE=.\res\troll0.bmp # End Source File # Begin Source File SOURCE=.\res\troll0b.bmp # End Source File # Begin Source File SOURCE=.\res\troll0c.bmp # End Source File # Begin Source File SOURCE=.\res\troll0d.bmp # End Source File # Begin Source File SOURCE=.\res\troll1.bmp # End Source File # Begin Source File SOURCE=.\res\troll18.bmp # End Source File # Begin Source File SOURCE=.\res\troll18b.bmp # End Source File # Begin Source File SOURCE=.\res\troll25.bmp # End Source File # Begin Source File SOURCE=.\res\troll4.bmp # End Source File # Begin Source File SOURCE=.\res\troll5.bmp # End Source File # Begin Source File SOURCE=.\ui.cpp # End Source File # Begin Source File SOURCE=..\cmn\ui_cmn.cpp # End Source File # Begin Source File SOURCE=.\uiplayer.cpp # End Source File # Begin Source File SOURCE=.\uiserver.cpp # End Source File # Begin Source File SOURCE=.\Res\Updn.bmp # End Source File # Begin Source File SOURCE=..\cmn\utils.cpp # End Source File # Begin Source File SOURCE=.\res\vege2.bmp # End Source File # Begin Source File SOURCE=.\res\Vegetabl.bmp # End Source File # Begin Source File SOURCE=.\res\Vertmove.bmp # End Source File # Begin Source File SOURCE=.\Res\Vtrack.bmp # End Source File # Begin Source File SOURCE=.\Res\Wall.bmp # End Source File # Begin Source File SOURCE=.\res\Weight2.bmp # End Source File # Begin Source File SOURCE=.\wheel.cpp # End Source File # Begin Source File SOURCE=..\cmn\world.cpp # End Source File # Begin Source File SOURCE=.\res\Wsqaure.bmp # End Source File # Begin Source File SOURCE=.\xdata.cpp # End Source File # Begin Source File SOURCE=..\cmn\xetp.cpp # End Source File # Begin Source File SOURCE=..\cmn\xetp_basic.cpp # End Source File # Begin Source File SOURCE=.\xevil.cpp # End Source File # Begin Source File SOURCE=.\res\xevil.pal # End Source File # Begin Source File SOURCE=.\xevil.rc !IF "$(CFG)" == "xevil - Win32 Release" !ELSEIF "$(CFG)" == "xevil - Win32 Debug" !ENDIF # End Source File # Begin Source File SOURCE=.\res\Xevil1.bmp # End Source File # Begin Source File SOURCE=.\res\xevil1.cur # End Source File # Begin Source File SOURCE=.\xevilserverstatus.cpp # End Source File # Begin Source File SOURCE=.\res\xit.bmp # End Source File # Begin Source File SOURCE=.\xviewport.cpp # End Source File # Begin Source File SOURCE=.\res\Yarrow_d.bmp # End Source File # Begin Source File SOURCE=.\res\Yarrow_l.bmp # End Source File # Begin Source File SOURCE=.\res\Yarrow_r.bmp # End Source File # Begin Source File SOURCE=.\res\Yarrow_u.bmp # End Source File # Begin Source File SOURCE=.\res\Yshield.bmp # End Source File # Begin Source File SOURCE=.\res\Zeepeeg.mid # End Source File # End Target # End Project xevil-2.02r2.orig/win32/ddraw.lib0100644000175000017500000003320606210523042016033 0ustar aaronlaaronl! / 841221555 0 1094 ` ) 0dD #%8'\)+-/  0dD #%8'\)+-/2"4T2"4T Z_DDHAL32_VidMemAlloc@16_DDHAL32_VidMemFree@12_DDInternalLock@8_DDInternalUnlock@4_DSoundHelp@12_DirectDrawCreate@12_DirectDrawCreateClipper@12_DirectDrawEnumerateA@8_DirectDrawEnumerateW@8_InternalLock_InternalUnlock_VidMemAlloc@12_VidMemAmountFree@4_VidMemFini@4_VidMemFree@8_VidMemInit@20_VidMemLargestFree@4__IMPORT_DESCRIPTOR_DDRAW__NULL_IMPORT_DESCRIPTOR__imp__DDHAL32_VidMemAlloc@16__imp__DDHAL32_VidMemFree@12__imp__DDInternalLock@8__imp__DDInternalUnlock@4__imp__DSoundHelp@12__imp__DirectDrawCreate@12__imp__DirectDrawCreateClipper@12__imp__DirectDrawEnumerateA@8__imp__DirectDrawEnumerateW@8__imp__InternalLock__imp__InternalUnlock__imp__VidMemAlloc@12__imp__VidMemAmountFree@4__imp__VidMemFini@4__imp__VidMemFree@8__imp__VidMemInit@20__imp__VidMemLargestFree@4__imp__thk1632_ThunkData32__imp__thk3216_ThunkData32_thk1632_ThunkData32_thk3216_ThunkData32DDRAW_NULL_THUNK_DATA/ 841221555 0 1104 `  Z T4"2d0 -)8%+\'/D #)        _DDHAL32_VidMemAlloc@16_DDHAL32_VidMemFree@12_DDInternalLock@8_DDInternalUnlock@4_DSoundHelp@12_DirectDrawCreate@12_DirectDrawCreateClipper@12_DirectDrawEnumerateA@8_DirectDrawEnumerateW@8_InternalLock_InternalUnlock_VidMemAlloc@12_VidMemAmountFree@4_VidMemFini@4_VidMemFree@8_VidMemInit@20_VidMemLargestFree@4__IMPORT_DESCRIPTOR_DDRAW__NULL_IMPORT_DESCRIPTOR__imp__DDHAL32_VidMemAlloc@16__imp__DDHAL32_VidMemFree@12__imp__DDInternalLock@8__imp__DDInternalUnlock@4__imp__DSoundHelp@12__imp__DirectDrawCreate@12__imp__DirectDrawCreateClipper@12__imp__DirectDrawEnumerateA@8__imp__DirectDrawEnumerateW@8__imp__InternalLock__imp__InternalUnlock__imp__VidMemAlloc@12__imp__VidMemAmountFree@4__imp__VidMemFini@4__imp__VidMemFree@8__imp__VidMemInit@20__imp__VidMemLargestFree@4__imp__thk1632_ThunkData32__imp__thk3216_ThunkData32_thk1632_ThunkData32_thk3216_ThunkData32DDRAW_NULL_THUNK_DATADDRAW.dll/ 841221555 0 588 ` L$2  .idata$2DX@.idata$6 vX@ DDRAW.dll.idata$2@h.idata$6.idata$4@h.idata$5@h7N__IMPORT_DESCRIPTOR_DDRAW__NULL_IMPORT_DESCRIPTORDDRAW_NULL_THUNK_DATADDRAW.dll/ 841221555 0 127 ` L$2P.idata$3<@__NULL_IMPORT_DESCRIPTOR DDRAW.dll/ 841221555 0 153 ` L$2l.idata$5d@0.idata$4h@0DDRAW_NULL_THUNK_DATA DDRAW.dll/ 841221555 0 504 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %DDHAL32_VidMemAlloc.text$F  .idata$5$F.idata$4$F.idata$6$F"<__imp__DDHAL32_VidMemAlloc@16__IMPORT_DESCRIPTOR_DDRAWDDRAW.dll/ 841221555 0 503 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %DDHAL32_VidMemFree.text$F  .idata$5$F.idata$4$F.idata$6$F!;__imp__DDHAL32_VidMemFree@12__IMPORT_DESCRIPTOR_DDRAW DDRAW.dll/ 841221555 0 494 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %DDInternalLock.text$F  .idata$5$F.idata$4$F.idata$6$F6__imp__DDInternalLock@8__IMPORT_DESCRIPTOR_DDRAWDDRAW.dll/ 841221555 0 498 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %DDInternalUnlock.text$F  .idata$5$F.idata$4$F.idata$6$F8__imp__DDInternalUnlock@4__IMPORT_DESCRIPTOR_DDRAWDDRAW.dll/ 841221555 0 487 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %DSoundHelp.text$F  .idata$5$F.idata$4$F.idata$6$F3__imp__DSoundHelp@12__IMPORT_DESCRIPTOR_DDRAW DDRAW.dll/ 841221555 0 499 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %DirectDrawCreate.text$F  .idata$5$F.idata$4$F.idata$6$F9__imp__DirectDrawCreate@12__IMPORT_DESCRIPTOR_DDRAW DDRAW.dll/ 841221555 0 512 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %DirectDrawCreateClipper.text$F  .idata$5$F.idata$4$F.idata$6$F&@__imp__DirectDrawCreateClipper@12__IMPORT_DESCRIPTOR_DDRAWDDRAW.dll/ 841221555 0 506 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %DirectDrawEnumerateA.text$F  .idata$5$F.idata$4$F.idata$6$F"<__imp__DirectDrawEnumerateA@8__IMPORT_DESCRIPTOR_DDRAWDDRAW.dll/ 841221555 0 506 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %DirectDrawEnumerateW.text$F  .idata$5$F.idata$4$F.idata$6$F"<__imp__DirectDrawEnumerateW@8__IMPORT_DESCRIPTOR_DDRAWDDRAW.dll/ 841221555 0 488 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ % InternalLock.text$F  .idata$5$F.idata$4$F.idata$6$F2__imp__InternalLock__IMPORT_DESCRIPTOR_DDRAWDDRAW.dll/ 841221555 0 492 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ % InternalUnlock.text$F  .idata$5$F.idata$4$F.idata$6$F4__imp__InternalUnlock__IMPORT_DESCRIPTOR_DDRAWDDRAW.dll/ 841221555 0 488 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ % VidMemAlloc.text$F  .idata$5$F.idata$4$F.idata$6$F4__imp__VidMemAlloc@12__IMPORT_DESCRIPTOR_DDRAWDDRAW.dll/ 841221555 0 498 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %VidMemAmountFree.text$F  .idata$5$F.idata$4$F.idata$6$F8__imp__VidMemAmountFree@4__IMPORT_DESCRIPTOR_DDRAWDDRAW.dll/ 841221555 0 486 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %VidMemFini.text$F  .idata$5$F.idata$4$F.idata$6$F2__imp__VidMemFini@4__IMPORT_DESCRIPTOR_DDRAWDDRAW.dll/ 841221555 0 486 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %VidMemFree.text$F  .idata$5$F.idata$4$F.idata$6$F2__imp__VidMemFree@8__IMPORT_DESCRIPTOR_DDRAWDDRAW.dll/ 841221555 0 487 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %VidMemInit.text$F  .idata$5$F.idata$4$F.idata$6$F3__imp__VidMemInit@20__IMPORT_DESCRIPTOR_DDRAW DDRAW.dll/ 841221555 0 499 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %VidMemLargestFree.text$F  .idata$5$F.idata$4$F.idata$6$F9__imp__VidMemLargestFree@4__IMPORT_DESCRIPTOR_DDRAW DDRAW.dll/ 841221555 0 501 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %thk1632_ThunkData32.text$F  .idata$5$F.idata$4$F.idata$6$F9__imp__thk1632_ThunkData32__IMPORT_DESCRIPTOR_DDRAW DDRAW.dll/ 841221555 0 501 ` L$2 .text  `.idata$5@0.idata$4@0.idata$6@ %thk3216_ThunkData32.text$F  .idata$5$F.idata$4$F.idata$6$F9__imp__thk3216_ThunkData32__IMPORT_DESCRIPTOR_DDRAW xevil-2.02r2.orig/win32/dsound.lib0100644000175000017500000001126006213354020016223 0ustar aaronlaaronl! / 841955231 0 388 `  R~ R~_DirectSoundCreate@12_DirectSoundEnumerateA@8_DirectSoundEnumerateW@8_DllCanUnloadNow@0_DllGetClassObject@12__IMPORT_DESCRIPTOR_DSOUND__NULL_IMPORT_DESCRIPTOR__imp__DirectSoundCreate@12__imp__DirectSoundEnumerateA@8__imp__DirectSoundEnumerateW@8__imp__DllCanUnloadNow@0__imp__DllGetClassObject@12DSOUND_NULL_THUNK_DATA/ 841955231 0 398 `   R~ _DirectSoundCreate@12_DirectSoundEnumerateA@8_DirectSoundEnumerateW@8_DllCanUnloadNow@0_DllGetClassObject@12__IMPORT_DESCRIPTOR_DSOUND__NULL_IMPORT_DESCRIPTOR__imp__DirectSoundCreate@12__imp__DirectSoundEnumerateA@8__imp__DirectSoundEnumerateW@8__imp__DllCanUnloadNow@0__imp__DllGetClassObject@12DSOUND_NULL_THUNK_DATADSOUND.dll/ 841955231 0 592 ` L7/2  .idata$2DX@.idata$6 vX@ DSOUND.dll.idata$2@h.idata$6.idata$4@h.idata$5@h8P__IMPORT_DESCRIPTOR_DSOUND__NULL_IMPORT_DESCRIPTORDSOUND_NULL_THUNK_DATADSOUND.dll/ 841955231 0 127 ` L7/2P.idata$3<@__NULL_IMPORT_DESCRIPTOR DSOUND.dll/ 841955231 0 154 ` L7/2l.idata$5d@0.idata$4h@0DSOUND_NULL_THUNK_DATADSOUND.dll/ 841955231 0 501 ` L7/2 .text  `.idata$5@0.idata$4@0.idata$6@ %DirectSoundCreate.texth:  .idata$5h:.idata$4h:.idata$6h: ;__imp__DirectSoundCreate@12__IMPORT_DESCRIPTOR_DSOUND DSOUND.dll/ 841955231 0 508 ` L7/2 .text  `.idata$5@0.idata$4@0.idata$6@ %DirectSoundEnumerateA.texth:  .idata$5h:.idata$4h:.idata$6h:#>__imp__DirectSoundEnumerateA@8__IMPORT_DESCRIPTOR_DSOUNDDSOUND.dll/ 841955231 0 508 ` L7/2 .text  `.idata$5@0.idata$4@0.idata$6@ %DirectSoundEnumerateW.texth:  .idata$5h:.idata$4h:.idata$6h:#>__imp__DirectSoundEnumerateW@8__IMPORT_DESCRIPTOR_DSOUNDDSOUND.dll/ 841955231 0 496 ` L7/2 .text  `.idata$5@0.idata$4@0.idata$6@ %DllCanUnloadNow.texth:  .idata$5h:.idata$4h:.idata$6h:8__imp__DllCanUnloadNow@0__IMPORT_DESCRIPTOR_DSOUNDDSOUND.dll/ 841955231 0 501 ` L7/2 .text  `.idata$5@0.idata$4@0.idata$6@ %DllGetClassObject.texth:  .idata$5h:.idata$4h:.idata$6h: ;__imp__DllGetClassObject@12__IMPORT_DESCRIPTOR_DSOUND xevil-2.02r2.orig/win32/xevil.rc0100644000175000017500000013273207637443714015750 0ustar aaronlaaronl//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "#define _AFX_NO_OLE_RESOURCES\r\n" "#define _AFX_NO_TRACKER_RESOURCES\r\n" "#define _AFX_NO_PROPERTY_RESOURCES\r\n" "\r\n" "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" "#ifdef _WIN32\r\n" "LANGUAGE 9, 1\r\n" "#pragma code_page(1252)\r\n" "#endif\r\n" "#include ""res\\XEvil.rc2"" // non-Microsoft Visual C++ edited resources\r\n" "#include ""afxres.rc"" // Standard components\r\n" "#endif\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Accelerator // IDR_MAINFRAME ACCELERATORS PRELOAD MOVEABLE PURE BEGIN "N", ID_FILE_NEW, VIRTKEY, CONTROL "O", ID_FILE_OPEN, VIRTKEY, CONTROL "S", ID_FILE_SAVE, VIRTKEY, CONTROL "Z", ID_EDIT_UNDO, VIRTKEY, CONTROL "X", ID_EDIT_CUT, VIRTKEY, CONTROL "C", ID_EDIT_COPY, VIRTKEY, CONTROL "V", ID_EDIT_PASTE, VIRTKEY, CONTROL VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT VK_F6, ID_NEXT_PANE, VIRTKEY VK_F6, ID_PREV_PANE, VIRTKEY, SHIFT END ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_ABOUTBOX DIALOG DISCARDABLE 0, 0, 317, 223 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "XEvil License Agreement" FONT 8, "MS Sans Serif" BEGIN PUSHBUTTON "Accept",IDOK,116,202,34,14,WS_GROUP DEFPUSHBUTTON "Reject",IDCANCEL,166,202,34,14 CONTROL "Full Screen",IDC_FULLSCREEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,144,9,51,10 CONTROL "Draw Background",IDC_DRAWBACKGROUND,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,210,9,80,10 EDITTEXT IDC_LICENSETEXT,7,27,303,170,ES_MULTILINE | ES_READONLY | WS_VSCROLL ICON IDR_XEVIL,IDC_STATIC,95,4,20,20 CTEXT "XEvil(TM) 2.0",IDC_VERSION,38,8,53,10 ICON IDR_XEVIL,IDC_STATIC,13,4,20,20 END IDD_TIMESTAMPFAILED DIALOG DISCARDABLE 0, 0, 186, 71 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Version Expired!" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "Quit",IDOK,27,50,50,14 PUSHBUTTON "Ignore this Message",IDCANCEL,87,50,76,14 LTEXT "This version of XEvil has expired. Download the most recent version from www.xevil.com.", IDC_STATIC,15,16,149,30 END IDD_OPTIONS DIALOG DISCARDABLE 0, 0, 266, 182 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Options" FONT 8, "MS Sans Serif" BEGIN CONTROL "&Levels",IDC_STYLELEVELS,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,20,24,37,10 CONTROL "&Scenarios Only",IDC_STYLESCENARIOS,"Button", BS_AUTORADIOBUTTON,20,37,62,10 CONTROL "&Kill Kill Kill",IDC_STYLEKILL,"Button", BS_AUTORADIOBUTTON,20,50,46,10 CONTROL "&Duel",IDC_STYLEDUEL,"Button",BS_AUTORADIOBUTTON,20,63, 46,10 CONTROL "&Extended Duel",IDC_STYLEEXTENDED,"Button", BS_AUTORADIOBUTTON,20,76,62,10 CONTROL "&Training",IDC_STYLETRAINING,"Button", BS_AUTORADIOBUTTON,20,89,41,10 CONTROL "Cooperative",IDC_COOPERATIVE,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,20,104,54,10 EDITTEXT IDC_NUMMACHINES,7,124,24,14,ES_AUTOHSCROLL | ES_NUMBER CONTROL "Regenerate Enemies",IDC_REFILLMACHINES,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,7,157,82,10 CONTROL "Slider1",IDC_SOUNDTRACKVOL,"msctls_trackbar32", TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,104,39,61,18 CONTROL "Slider1",IDC_EFFECTVOL,"msctls_trackbar32", TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,104,74,61,18 CONTROL "Sound",IDC_SOUNDONOFF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,113,101,37,10 CONTROL "Slider1",IDC_GAMESPEED,"msctls_trackbar32", TBS_AUTOTICKS | TBS_TOP | WS_TABSTOP,101,143,58,18 CONTROL "None",IDC_SOUNDTYPE,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,189,92,33,10 CONTROL "CD tracks",IDC_RADIO8,"Button",BS_AUTORADIOBUTTON,189, 79,47,10 CONTROL "Wave Files",IDC_RADIO9,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,189,105,51,10 CONTROL "MIDI Files",IDC_RADIO10,"Button",BS_AUTORADIOBUTTON,189, 66,47,10 EDITTEXT IDC_ROOMWIDTH,183,146,27,14,ES_AUTOHSCROLL | WS_GROUP EDITTEXT IDC_ROOMHEIGHT,220,146,27,14,ES_AUTOHSCROLL DEFPUSHBUTTON "OK",IDOK,209,7,50,14 PUSHBUTTON "Cancel",IDCANCEL,209,24,50,14 GROUPBOX "Game Style",IDC_STATIC,7,13,81,105 GROUPBOX "Volume",IDC_STATIC,94,13,79,113 GROUPBOX "Soundtrack",IDC_STATIC,180,49,79,60 LTEXT "Enemy Player(s)",IDC_STATIC,33,127,56,8 LTEXT "Game Speed:",IDC_STATIC,108,134,49,9,NOT WS_GROUP CTEXT "Soundtrack",IDC_STATIC,115,29,38,8 CTEXT "Effects",IDC_STATIC,123,65,23,8 LTEXT "Room Dimensions",IDC_STATIC,187,133,58,8 LTEXT "x",IDC_STATIC,212,148,8,8 CONTROL "Human Player",IDC_HUMAN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,142,77,11 END IDD_DIFFICULTY DIALOG DISCARDABLE 0, 0, 130, 79 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Difficulty" FONT 8, "MS Sans Serif" BEGIN CONTROL "Trivial",IDC_DIFFICULTY1,"Button",BS_AUTORADIOBUTTON | WS_GROUP,7,7,35,10 CONTROL "Normal",IDC_DIFFICULTY2,"Button",BS_AUTORADIOBUTTON,7, 22,38,10 CONTROL "Hard",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,7,37,31,10 CONTROL "Bend Over",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,7,52, 50,10 DEFPUSHBUTTON "OK",IDOK,73,7,50,14,WS_GROUP PUSHBUTTON "Cancel",IDCANCEL,73,24,50,14 END IDD_KEYSETS DIALOG DISCARDABLE 0, 0, 299, 181 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Keys" FONT 8, "MS Sans Serif" BEGIN PUSHBUTTON "PgDn",IDC_CENTER,187,68,42,26,WS_GROUP PUSHBUTTON "PgDn",IDC_R,238,68,42,26 PUSHBUTTON "PgDn",IDC_LR,238,96,42,26 PUSHBUTTON "PgDn",IDC_DOWN,187,96,42,26 PUSHBUTTON "PgDn",IDC_LL,136,96,42,26 PUSHBUTTON "PgDn",IDC_L,136,68,42,26 PUSHBUTTON "PgDn",IDC_UL,136,40,42,26 PUSHBUTTON "PgDn",IDC_UP,187,40,42,26 PUSHBUTTON "PgDn",IDC_UR,238,40,42,26 PUSHBUTTON "Up Arrow",IDC_WEAPONUSE,73,22,42,15 PUSHBUTTON "PgDn",IDC_WEAPONCHANGE,73,39,42,15 PUSHBUTTON "PgDn",IDC_WEAPONDROP,73,56,42,15 PUSHBUTTON "PgDn",IDC_ITEMUSE,73,73,42,15 PUSHBUTTON "PgDn",IDC_ITEMCHANGE,73,90,42,15 PUSHBUTTON "PgDn",IDC_ITEMDROP,73,107,42,15 DEFPUSHBUTTON "OK",IDOK,91,157,50,14 PUSHBUTTON "Cancel",IDCANCEL,157,157,50,14 LTEXT "Weapon use:",IDC_STATIC,7,25,44,8 LTEXT "Weapon change:",IDC_STATIC,7,42,56,8 LTEXT "Weapon drop:",IDC_STATIC,7,59,46,8 LTEXT "Item use:",IDC_STATIC,7,76,30,8 LTEXT "Item change:",IDC_STATIC,7,93,42,8 LTEXT "Item drop:",IDC_STATIC,7,110,32,8 LTEXT "Player 1 keys:",IDC_PLAYERSTATIC,7,7,45,8 GROUPBOX "Movement",IDC_STATIC,126,24,166,109 LTEXT "Chat:\n(network play only)",IDC_STATIC,7,127,61,17 PUSHBUTTON "Space",IDC_CHAT,73,128,42,15 END IDD_KEYHIT DIALOGEX 0, 0, 118, 47 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU FONT 8, "MS Sans Serif", 0, 0, 0x1 BEGIN CTEXT "Hit a key.",IDC_MYSTATIC,31,17,31,8,0,WS_EX_TRANSPARENT END IDD_CONNECTSERVER DIALOG DISCARDABLE 0, 0, 186, 100 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Connect To Server" FONT 8, "MS Sans Serif" BEGIN EDITTEXT IDC_EDIT1,55,15,119,13,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,55,32,46,13,ES_AUTOHSCROLL EDITTEXT IDC_EDIT3,55,49,107,12,ES_AUTOHSCROLL DEFPUSHBUTTON "OK",IDOK,29,79,50,14 PUSHBUTTON "Cancel",IDCANCEL,105,79,50,14 LTEXT "Hostname",-1,22,18,33,8 LTEXT "Port",-1,41,35,14,8 LTEXT "Player Name (optional)",-1,14,49,41,18 END IDD_RUNSERVER DIALOG DISCARDABLE 0, 0, 188, 114 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Run Server" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,32,94,50,14 PUSHBUTTON "Cancel",IDCANCEL,105,94,50,14 EDITTEXT IDC_EDIT1,83,7,81,12,ES_AUTOHSCROLL CONTROL "Player (This machine also plays in the game)", IDC_PLAYER,"Button",BS_AUTORADIOBUTTON | WS_GROUP,13,29, 157,11 CONTROL "Observer (The server just watches the game)", IDC_OBSERVER,"Button",BS_AUTORADIOBUTTON,13,47,157,10 LTEXT "Run server on port",IDC_STATIC,17,8,64,9 GROUPBOX "",IDC_STATIC,7,19,172,45 EDITTEXT IDC_EDIT3,57,70,107,12,ES_AUTOHSCROLL LTEXT "Player Name (optional)",IDC_STATIC,14,68,43,18 END IDD_STORY DIALOG DISCARDABLE 0, 0, 155, 90 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Story of XEvil" FONT 9, "Lucida Sans Unicode" BEGIN DEFPUSHBUTTON "OK",IDOK,61,71,32,12 CTEXT "Sinners die.\nThey are judged and sent to Hell.\nA contest pits sinner against sinner,\nCompeting for rank in Hell.\nThis contest has a name,\nXEvil.", IDC_STATIC,7,7,141,56,SS_SUNKEN | WS_BORDER END #ifndef _MAC ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 2,0,0,1 PRODUCTVERSION 2,0,0,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "Comments", "Chainsaws, Ninjas, SoulSwappers= XEvil\0" VALUE "CompanyName", "XEvil Inc.\0" VALUE "FileDescription", "XEvil2.0 Beta Demo\0" VALUE "FileVersion", "2, 0, 0, 1\0" VALUE "InternalName", "XEvil2.0 Beta\0" VALUE "LegalCopyright", "Copyright 1996,1997\0" VALUE "LegalTrademarks", "XEvil\0" VALUE "OriginalFilename", "XEvil.exe\0" VALUE "ProductName", "XEvil2.0 Beta Demo\0" VALUE "ProductVersion", "2, 0, 0, 1\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endif // !_MAC ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_ABOUTBOX, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 310 TOPMARGIN, 7 BOTTOMMARGIN, 216 END IDD_TIMESTAMPFAILED, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 179 TOPMARGIN, 7 BOTTOMMARGIN, 64 END IDD_OPTIONS, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 256 TOPMARGIN, 7 BOTTOMMARGIN, 167 END IDD_DIFFICULTY, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 123 TOPMARGIN, 7 BOTTOMMARGIN, 72 END IDD_KEYSETS, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 292 TOPMARGIN, 7 BOTTOMMARGIN, 174 END IDD_KEYHIT, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 111 TOPMARGIN, 6 BOTTOMMARGIN, 40 END IDD_CONNECTSERVER, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 179 TOPMARGIN, 7 BOTTOMMARGIN, 93 END IDD_RUNSERVER, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 181 TOPMARGIN, 7 BOTTOMMARGIN, 107 END IDD_STORY, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 148 TOPMARGIN, 7 BOTTOMMARGIN, 83 END END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Bitmap // IDB_HISQUANCH BITMAP DISCARDABLE "res\\bmp00003.bmp" IDB_LASER_VERT BITMAP DISCARDABLE "res\\bmp00040.bmp" IDB_SHELL BITMAP DISCARDABLE "res\\shell.bmp" IDB_LANCE_HORZ BITMAP DISCARDABLE "res\\lance_ho.bmp" IDB_LANCE_VERT BITMAP DISCARDABLE "res\\lance_ve.bmp" IDB_FROG_DEAD BITMAP DISCARDABLE "res\\frog_dea.bmp" IDB_FROG5 BITMAP DISCARDABLE "res\\frog5.bmp" IDB_FROG4 BITMAP DISCARDABLE "res\\frog4.bmp" IDB_FROG2 BITMAP DISCARDABLE "res\\frog2.bmp" IDB_FROG0 BITMAP DISCARDABLE "res\\frog0.bmp" IDB_MISSLE40 BITMAP DISCARDABLE "res\\missle40.bmp" IDB_MISSLE39 BITMAP DISCARDABLE "res\\missle39.bmp" IDB_MISSLE25 BITMAP DISCARDABLE "res\\missle25.bmp" IDB_EMPTY BITMAP DISCARDABLE "res\\empty.bmp" IDB_HERO10 BITMAP DISCARDABLE "res\\hero10.bmp" IDB_HHERO0_ATTACK BITMAP DISCARDABLE "res\\hero0_at.bmp" IDB_BCEAGLE BITMAP DISCARDABLE "res\\bceagle.bmp" IDB_SQUANCH_BIG BITMAP DISCARDABLE "res\\squanch_.bmp" IDB_PENT BITMAP DISCARDABLE "res\\pent.bmp" IDB_SKULL BITMAP DISCARDABLE "res\\skull.bmp" IDB_PYRAMID BITMAP DISCARDABLE "res\\pyramid.bmp" IDB_NICE_DAY BITMAP DISCARDABLE "res\\happy.bmp" IDB_MOVER BITMAP DISCARDABLE "res\\mover.bmp" IDB_VERTMOVERSQUARE BITMAP DISCARDABLE "res\\moversqu.bmp" IDB_BGIND1 BITMAP DISCARDABLE "res\\ind1.bmp" IDB_RARROW_UP_R BITMAP DISCARDABLE "res\\bmp00027.bmp" IDB_BGHELL1 BITMAP DISCARDABLE "res\\hell_1.bmp" IDB_PILLS BITMAP DISCARDABLE "res\\pills.bmp" IDB_HICHOPPERBOY0 BITMAP DISCARDABLE "res\\Choppr0.bmp" IDB_HICHOPPERBOY0B BITMAP DISCARDABLE "res\\Choppr0b.bmp" IDB_HICHOPPERBOY0C BITMAP DISCARDABLE "res\\Choppr0c.bmp" IDB_HICHOPPERBOY0D BITMAP DISCARDABLE "res\\Choppr0d.bmp" IDB_HICHOPPERBOY0E BITMAP DISCARDABLE "res\\Choppr0e.bmp" IDB_HICHOPPERBOY0F BITMAP DISCARDABLE "res\\Choppr0f.bmp" IDB_HICHOPPERBOY2 BITMAP DISCARDABLE "res\\Choppr2.bmp" IDB_HICHOPPERBOY2B BITMAP DISCARDABLE "res\\Choppr2b.bmp" IDB_HICHOPPERBOY2C BITMAP DISCARDABLE "res\\Choppr2c.bmp" IDB_HICHOPPERBOY2D BITMAP DISCARDABLE "res\\Choppr2d.bmp" IDB_HICHOPPERBOY25 BITMAP DISCARDABLE "res\\Choppr25.bmp" IDB_HICHOPPERBOY4 BITMAP DISCARDABLE "res\\Choppr4.bmp" IDB_HICHOPPERBOY4B BITMAP DISCARDABLE "res\\Choppr4b.bmp" IDB_HICHOPPERBOY4C BITMAP DISCARDABLE "res\\Choppr4c.bmp" IDB_HICHOPPERBOY4D BITMAP DISCARDABLE "res\\Choppr4d.bmp" IDB_HICHOPPERBOY5 BITMAP DISCARDABLE "res\\Choppr5.bmp" IDB_CAFFINE BITMAP DISCARDABLE "res\\pepper1.bmp" IDB_HORIZMOVERSQUARE BITMAP DISCARDABLE "res\\vertmove.bmp" IDB_HIWALL2 BITMAP DISCARDABLE "res\\Blok2.bmp" IDB_HILADDER2 BITMAP DISCARDABLE "res\\Ladder2.bmp" IDB_HIUPDOWN BITMAP DISCARDABLE "res\\Endblok.bmp" IDB_HIDOOR1 BITMAP DISCARDABLE "res\\Door1.bmp" IDB_HIDOOR2 BITMAP DISCARDABLE "res\\hidoor2.bmp" IDB_HIOUTSIDE BITMAP DISCARDABLE "res\\Outside.bmp" IDB_BGALIENNU BITMAP DISCARDABLE "res\\Aliennu.bmp" IDB_BGHELL2 BITMAP DISCARDABLE "res\\Hell5.bmp" IDB_HICHOPPERBOY22 BITMAP DISCARDABLE "res\\Chopprd.bmp" IDB_HICHOPPERBOY22B BITMAP DISCARDABLE "res\\Chopprdb.bmp" IDB_HICHOPPERBOY22C BITMAP DISCARDABLE "res\\Chopprdc.bmp" IDB_HICHOPPERBOY22D BITMAP DISCARDABLE "res\\Chopprdd.bmp" IDB_HIER1 BITMAP DISCARDABLE "res\\Heir2.bmp" IDB_HIOUTSIDE1 BITMAP DISCARDABLE "res\\Outa.bmp" IDB_HIOUTSIDE2 BITMAP DISCARDABLE "res\\Outb.bmp" IDB_HILADDER BITMAP DISCARDABLE "res\\bmp00012.bmp" IDB_HHERO5 BITMAP DISCARDABLE "res\\hihero5.bmp" IDB_YARROW_UP_R BITMAP DISCARDABLE "res\\bmp00127.bmp" IDB_YARROW_R BITMAP DISCARDABLE "res\\yarrow_r.bmp" IDB_GARROW_UP_R BITMAP DISCARDABLE "res\\bmp00134.bmp" IDB_GARROW_R BITMAP DISCARDABLE "res\\garrow_r.bmp" IDB_BGINDUSTRIAL BITMAP DISCARDABLE "res\\Indt2.bmp" IDB_HHERO0 BITMAP DISCARDABLE "res\\hero0.bmp" IDB_HHERO0F BITMAP DISCARDABLE "res\\hero0f.bmp" IDB_HHERO0C BITMAP DISCARDABLE "res\\hero0c.bmp" IDB_HHERO0D BITMAP DISCARDABLE "res\\hero0d.bmp" IDB_HHERO0E BITMAP DISCARDABLE "res\\hero0e.bmp" IDB_HHERO0B BITMAP DISCARDABLE "res\\hero0b.bmp" IDB_BARROW_UP_R BITMAP DISCARDABLE "res\\bmp00138.bmp" IDB_BARROW_R BITMAP DISCARDABLE "res\\barrow_r.bmp" IDB_HITSHIELD BITMAP DISCARDABLE "res\\Yshield.bmp" IDB_HINSHIELD BITMAP DISCARDABLE "res\\Bshield.bmp" IDB_HIWEIGHT BITMAP DISCARDABLE "res\\Weight2.bmp" IDB_HIERUPDOWN BITMAP DISCARDABLE "res\\Henblok.bmp" IDB_HIERBLOK2 BITMAP DISCARDABLE "res\\Hblok.bmp" IDB_HICHOPPERBOY21D BITMAP DISCARDABLE "res\\Chopprud.bmp" IDB_HICHOPPERBOY21B BITMAP DISCARDABLE "res\\Chopprub.bmp" IDB_HICHOPPERBOY21C BITMAP DISCARDABLE "res\\Choppruc.bmp" IDB_HICHOPPERBOY21 BITMAP DISCARDABLE "res\\Choppru.bmp" IDB_HIMEDKIT BITMAP DISCARDABLE "res\\himedkit.bmp" IDB_HIALTAR BITMAP DISCARDABLE "res\\hialtar.bmp" IDB_HIALTARB BITMAP DISCARDABLE "res\\altar2.bmp" IDB_HIALTARC BITMAP DISCARDABLE "res\\altar3.bmp" IDB_HHERO0B_ATTACK BITMAP DISCARDABLE "res\\39a.bmp" IDB_HHERO10_ATTACK BITMAP DISCARDABLE "res\\27a.bmp" IDB_HHERO10B_ATTACK BITMAP DISCARDABLE "res\\27b.bmp" IDB_HHERO2 BITMAP DISCARDABLE "res\\Jump0.bmp" IDB_HIDOG0B BITMAP DISCARDABLE "res\\!dog0_ru.bmp" IDB_HIDOG0_ATTACK BITMAP DISCARDABLE "res\\Dog_att0.bmp" IDB_SEALDEAD BITMAP DISCARDABLE "res\\sealdead.bmp" IDB_SEAL0 BITMAP DISCARDABLE "res\\seal0.bmp" IDB_SEAL0B BITMAP DISCARDABLE "res\\seal0b.bmp" IDB_SEAL5 BITMAP DISCARDABLE "res\\sealcenter.bmp" IDB_HIDOG22_ATTACK BITMAP DISCARDABLE "res\\Dg_atd.bmp" IDB_HIDOG21_ATTACK BITMAP DISCARDABLE "res\\dg_atu.bmp" IDB_HIDOG2_ATTACK BITMAP DISCARDABLE "res\\hidog2_a.bmp" IDB_HIDOG5B BITMAP DISCARDABLE "res\\Dg5_b.bmp" IDB_HIDOG5 BITMAP DISCARDABLE "res\\Dg5_a.bmp" IDB_HIDOG21 BITMAP DISCARDABLE "res\\hidog21.bmp" IDB_HIDOG22 BITMAP DISCARDABLE "res\\hidog22.bmp" IDB_HIDOGDEAD BITMAP DISCARDABLE "res\\hidogdea.bmp" IDB_HIDOG21B BITMAP DISCARDABLE "res\\hidog21b.bmp" IDB_HIDOG22B BITMAP DISCARDABLE "res\\hidog22b.bmp" IDB_HIDOG2 BITMAP DISCARDABLE "res\\hidog2.bmp" IDB_TITLE BITMAP DISCARDABLE "res\\logob5.bmp" IDB_HITEXTSQUARE BITMAP DISCARDABLE "res\\hitextbl.bmp" IDB_LANCER BITMAP DISCARDABLE "res\\lancer1.bmp" IDB_HILAUNCHER BITMAP DISCARDABLE "res\\hilaunch.bmp" IDB_HIPISTOL BITMAP DISCARDABLE "res\\hipistol.bmp" IDB_MGUN1 BITMAP DISCARDABLE "res\\mgun1.bmp" IDB_NONE BITMAP DISCARDABLE "res\\none.bmp" IDB_LASERS BITMAP DISCARDABLE "res\\lasers.bmp" IDB_HIBOMB6 BITMAP DISCARDABLE "res\\hibomb6.bmp" IDB_WHEELBACKGROUND BITMAP DISCARDABLE "res\\displayb.bmp" IDB_HIBOMB0 BITMAP DISCARDABLE "res\\hibomb0.bmp" IDB_HIBOMB1 BITMAP DISCARDABLE "res\\hibomb1.bmp" IDB_HIBOMB2 BITMAP DISCARDABLE "res\\hibomb2.bmp" IDB_HIBOMB3 BITMAP DISCARDABLE "res\\hibomb3.bmp" IDB_HIBOMB4 BITMAP DISCARDABLE "res\\hibomb4.bmp" IDB_HIBOMB5 BITMAP DISCARDABLE "res\\hibomb5.bmp" IDB_CHAINSAW25 BITMAP DISCARDABLE "res\\bmp00113.bmp" IDB_CHAINSAW25B BITMAP DISCARDABLE "res\\bmp00111.bmp" IDB_CHAINSAW29 BITMAP DISCARDABLE "res\\bmp00109.bmp" IDB_CHAINSAW29B BITMAP DISCARDABLE "res\\bmp00107.bmp" IDB_CHAINSAW33 BITMAP DISCARDABLE "res\\bmp00105.bmp" IDB_CHAINSAW33B BITMAP DISCARDABLE "res\\bmp00103.bmp" IDB_CHAINSAW37 BITMAP DISCARDABLE "res\\bmp00101.bmp" IDB_CHAINSAW37B BITMAP DISCARDABLE "res\\bmp00099.bmp" IDB_CHAINSAW5 BITMAP DISCARDABLE "res\\chainsaw.bmp" IDB_CHAINSAW5B BITMAP DISCARDABLE "res\\bmp00096.bmp" IDB_CLOAK BITMAP DISCARDABLE "res\\cloak.bmp" IDB_CLOAKB BITMAP DISCARDABLE "res\\bmp00001.bmp" IDB_CLOAKC BITMAP DISCARDABLE "res\\cloak1.bmp" IDB_CLOAKD BITMAP DISCARDABLE "res\\cloak3.bmp" IDB_CLOAKE BITMAP DISCARDABLE "res\\cloak4.bmp" IDB_CLOAKF BITMAP DISCARDABLE "res\\cloak5.bmp" IDB_HIBOMBBLK BITMAP DISCARDABLE "res\\hibombbl.bmp" IDB_CRACKPIPE BITMAP DISCARDABLE "res\\bmp00016.bmp" IDB_DOGWHISTLE BITMAP DISCARDABLE "res\\dwhistle.bmp" IDB_DOPPEL BITMAP DISCARDABLE "res\\doppel.bmp" IDB_DOPPEL2 BITMAP DISCARDABLE "res\\doppel1.bmp" IDB_EGG BITMAP DISCARDABLE "res\\egg.bmp" IDB_EGG_OPEN BITMAP DISCARDABLE "res\\egg_open.bmp" IDB_FTHROWER BITMAP DISCARDABLE "res\\bmp00025.bmp" IDB_FIREBALL BITMAP DISCARDABLE "res\\bmp00151.bmp" IDB_FIREBALLB BITMAP DISCARDABLE "res\\flame2.bmp" IDB_FIREBALLC BITMAP DISCARDABLE "res\\flame3.bmp" IDB_FROGGUN BITMAP DISCARDABLE "res\\FROGGUN.BMP" IDB_FROG_SHELL BITMAP DISCARDABLE "res\\frog_she.bmp" IDB_FROG_SHELLB BITMAP DISCARDABLE "res\\bmp00081.bmp" IDB_GRENADE1 BITMAP DISCARDABLE "res\\grenade1.bmp" IDB_GRENADE2 BITMAP DISCARDABLE "res\\grenade4.bmp" IDB_GRENADE3 BITMAP DISCARDABLE "res\\grenade3.bmp" IDB_GRENADE4 BITMAP DISCARDABLE "res\\bmp00005.bmp" IDB_GRENADES BITMAP DISCARDABLE "res\\GRENADES.BMP" IDB_HIHOME BITMAP DISCARDABLE "res\\hihome.bmp" IDB_NAPALM1 BITMAP DISCARDABLE "res\\napalm1.bmp" IDB_NAPALM2 BITMAP DISCARDABLE "res\\napalm2.bmp" IDB_NAPALM3 BITMAP DISCARDABLE "res\\napalm3.bmp" IDB_NAPALM4 BITMAP DISCARDABLE "res\\napalm4.bmp" IDB_NAPALMS BITMAP DISCARDABLE "res\\napalms.bmp" IDB_STAR BITMAP DISCARDABLE "res\\star.bmp" IDB_STARB BITMAP DISCARDABLE "res\\starb.bmp" IDB_STARS BITMAP DISCARDABLE "res\\STARS.BMP" IDB_SWAP_SHELL BITMAP DISCARDABLE "res\\bmp00074.bmp" IDB_SWAP_SHELLB BITMAP DISCARDABLE "res\\bmp00084.bmp" IDB_SWAPPER BITMAP DISCARDABLE "res\\SWAPPER.BMP" IDB_TRANSMOGIFIER BITMAP DISCARDABLE "res\\bmp00078.bmp" IDB_DROP_SCHOOL BITMAP DISCARDABLE "res\\drop_sch.bmp" IDB_STRANGLE_CAT BITMAP DISCARDABLE "res\\cat.bmp" IDB_ROCKHI BITMAP DISCARDABLE "res\\rockhi.bmp" IDB_ENFORCER0D BITMAP DISCARDABLE "res\\Enf_0d.bmp" IDB_ENFORCER0B BITMAP DISCARDABLE "res\\Enf_0b.bmp" IDB_ENFORCER0C BITMAP DISCARDABLE "res\\Enf_0c.bmp" IDB_ENFORCER0A BITMAP DISCARDABLE "res\\Enf_0a.bmp" IDB_ENFORCER5 BITMAP DISCARDABLE "res\\Enf_5.bmp" IDB_HHERO4 BITMAP DISCARDABLE "res\\hihero4.bmp" IDB_HHERO2_ATTACK BITMAP DISCARDABLE "res\\bitmap3.bmp" IDB_HERO10B BITMAP DISCARDABLE "res\\hero10b.bmp" IDB_CHAINSAW25C BITMAP DISCARDABLE "res\\bmp00024.bmp" IDB_CHAINSAW33C BITMAP DISCARDABLE "res\\bmp00055.bmp" IDB_HHERO22_ATTACK BITMAP DISCARDABLE "res\\hihero22.bmp" IDB_HHERO18 BITMAP DISCARDABLE "res\\hihero19.bmp" IDB_HININJA0B BITMAP DISCARDABLE "res\\Nin0b.bmp" IDB_HININJA0C BITMAP DISCARDABLE "res\\Nin0c.bmp" IDB_HININJA0D BITMAP DISCARDABLE "res\\Nin0d.bmp" IDB_HININJA0E BITMAP DISCARDABLE "res\\Nin0e.bmp" IDB_HININJA0F BITMAP DISCARDABLE "res\\Nin0f.bmp" IDB_HININJA5 BITMAP DISCARDABLE "res\\Nin5.bmp" IDB_HININJA_DEAD BITMAP DISCARDABLE "res\\hininja_.bmp" IDB_HININJA2 BITMAP DISCARDABLE "res\\Ninj0a.bmp" IDB_HININJA2B BITMAP DISCARDABLE "res\\Ninj0b.bmp" IDB_HININJA2C BITMAP DISCARDABLE "res\\Ninj0c.bmp" IDB_HININJA2D BITMAP DISCARDABLE "res\\Ninj0d.bmp" IDB_HININJA0 BITMAP DISCARDABLE "res\\Nin0.bmp" IDB_HHERO_DEAD BITMAP DISCARDABLE "res\\hihero_d.bmp" IDB_ENFORCER_DEAD BITMAP DISCARDABLE "res\\bmp00065.bmp" IDB_HIWALKER18B BITMAP DISCARDABLE "res\\hiwlk18b.bmp" IDB_HIWALKER0B BITMAP DISCARDABLE "res\\hiwalk_0b.bmp" IDB_HIWALKER0C BITMAP DISCARDABLE "res\\hiwalk_0c.bmp" IDB_HIWALKER0D BITMAP DISCARDABLE "res\\hiwalk_0d.bmp" IDB_HIWALKER2 BITMAP DISCARDABLE "res\\hiwalk_2.bmp" IDB_HIWALKER_DEAD BITMAP DISCARDABLE "res\\hiwalk_d.bmp" IDB_HIWALKER18 BITMAP DISCARDABLE "res\\hiwalk18.bmp" IDB_HIWALKER2B BITMAP DISCARDABLE "res\\hiwalk2b.bmp" IDB_HIWALKER4 BITMAP DISCARDABLE "res\\hiwalk4.bmp" IDB_HIWALKER4B BITMAP DISCARDABLE "res\\hiwalk4b.bmp" IDB_HIWALKER4C BITMAP DISCARDABLE "res\\hiwalk4c.bmp" IDB_HIWALKER4D BITMAP DISCARDABLE "res\\hiwalk4d.bmp" IDB_HIWALKER5 BITMAP DISCARDABLE "res\\hiwalk5.bmp" IDB_HIWALKER5B BITMAP DISCARDABLE "res\\hiwalk5b.bmp" IDB_HIWALKER5C BITMAP DISCARDABLE "res\\hiwalk5c.bmp" IDB_HIWALKER5D BITMAP DISCARDABLE "res\\hiwalk5d.bmp" IDB_HIWALKER0 BITMAP DISCARDABLE "res\\hiwalk_0.bmp" IDB_XEVIL BITMAP DISCARDABLE "res\\bmp00085.bmp" IDB_STOP BITMAP DISCARDABLE "res\\stop.bmp" IDB_HANDTOHAND BITMAP DISCARDABLE "res\\handtoha.bmp" IDB_HIFIREDEMON_DEAD BITMAP DISCARDABLE "res\\bmp00154.bmp" IDB_HIFIREDEMON5B BITMAP DISCARDABLE "res\\hifirede.bmp" IDB_HIFIREDEMON5 BITMAP DISCARDABLE "res\\bmp00054.bmp" IDB_HIFIREDEMON4 BITMAP DISCARDABLE "res\\bmp00092.bmp" IDB_HIFIREDEMON22 BITMAP DISCARDABLE "res\\bmp00091.bmp" IDB_HIFIREDEMON2 BITMAP DISCARDABLE "res\\bmp00056.bmp" IDB_HIFIREDEMON0B BITMAP DISCARDABLE "res\\bmp00094.bmp" IDB_HIFIREDEMON0 BITMAP DISCARDABLE "res\\bmp00093.bmp" IDB_HININJA22_ATTACK BITMAP DISCARDABLE "res\\ninatt_down.bmp" IDB_HININJA0_ATTACK BITMAP DISCARDABLE "res\\nin_kick0low.bmp" IDB_HININJA2_ATTACK BITMAP DISCARDABLE "res\\nin_kick0jmp.bmp" IDB_HININJA22 BITMAP DISCARDABLE "res\\ninjump_down1.bmp" IDB_HININJA22B BITMAP DISCARDABLE "res\\ninjump_down2.bmp" IDB_HININJA21 BITMAP DISCARDABLE "res\\ninjump_up.bmp" IDB_HIFLAG BITMAP DISCARDABLE "res\\hiflag.bmp" IDB_DROPLIFTABLE BITMAP DISCARDABLE "res\\droplift.bmp" IDB_SUICIDEBUTTON BITMAP DISCARDABLE "res\\suicideb.bmp" IDB_FIREBALLICON BITMAP DISCARDABLE "res\\fireball.bmp" IDB_FIRE BITMAP DISCARDABLE "res\\fire.bmp" IDB_HIHUGGER_RED0 BITMAP DISCARDABLE "res\\bmp00028.bmp" IDB_HIHUGGER_RED0B BITMAP DISCARDABLE "res\\bmp00029.bmp" IDB_HIHUGGER_RED5 BITMAP DISCARDABLE "res\\hihugger.bmp" IDB_HIHUGGER_RED4 BITMAP DISCARDABLE "res\\bmp00031.bmp" IDB_HIHUGGER_RED_DEAD BITMAP DISCARDABLE "res\\bmp00043.bmp" IDB_HIHUGGER_RED6 BITMAP DISCARDABLE "res\\bmp00036.bmp" IDB_HIHUGGER_RED6B BITMAP DISCARDABLE "res\\bmp00037.bmp" IDB_HIHUGGER_RED4B BITMAP DISCARDABLE "res\\bmp00030.bmp" IDB_PRICKLY BITMAP DISCARDABLE "res\\none1.bmp" IDB_HININJA10B BITMAP DISCARDABLE "res\\nin_lo0b.bmp" IDB_HININJA10C BITMAP DISCARDABLE "res\\nin_lo0c.bmp" IDB_HININJA10D BITMAP DISCARDABLE "res\\nin_lo0d.bmp" IDB_HININJA10F BITMAP DISCARDABLE "res\\nin_lo0f.bmp" IDB_HININJA10 BITMAP DISCARDABLE "res\\nin_lo0.bmp" IDB_HININJA10E BITMAP DISCARDABLE "res\\nin_lo0e.bmp" IDB_HININJA10_ATTACK BITMAP DISCARDABLE "res\\hininja1.bmp" IDB_HIHUGGER_GREEN0 BITMAP DISCARDABLE "res\\bmp00006.bmp" IDB_HIHUGGER_GREEN0B BITMAP DISCARDABLE "res\\bmp00007.bmp" IDB_HIHUGGER_GREEN4 BITMAP DISCARDABLE "res\\bmp00008.bmp" IDB_HIHUGGER_GREEN4B BITMAP DISCARDABLE "res\\bmp00009.bmp" IDB_HIHUGGER_GREEN5 BITMAP DISCARDABLE "res\\bmp00010.bmp" IDB_HIHUGGER_GREEN6 BITMAP DISCARDABLE "res\\bmp00032.bmp" IDB_HIHUGGER_GREEN6B BITMAP DISCARDABLE "res\\bmp00033.bmp" IDB_HIHUGGER_GREEN_DEAD BITMAP DISCARDABLE "res\\bmp00034.bmp" IDB_MD1DOOR1 BITMAP DISCARDABLE "res\\doortop.bmp" IDB_MD1LADDER BITMAP DISCARDABLE "res\\ladder.bmp" IDB_MD1MOVER BITMAP DISCARDABLE "res\\bitmap6.bmp" IDB_MD1VERTMOVERSQUARE BITMAP DISCARDABLE "res\\moversq.bmp" IDB_MD1UPDOWN BITMAP DISCARDABLE "res\\updn.bmp" IDB_MD1DOOR2 BITMAP DISCARDABLE "res\\doorbot.bmp" IDB_MD1HORIZMOVERSQUARE BITMAP DISCARDABLE "res\\sider.BMP" IDB_MD1WALL BITMAP DISCARDABLE "res\\Wall.bmp" IDB_HININJA18 BITMAP DISCARDABLE "res\\bmp00004.bmp" IDB_HININJA18B BITMAP DISCARDABLE "res\\bmp00013.bmp" IDB_AUTOLANCER BITMAP DISCARDABLE "res\\autolanc.bmp" IDB_DEMONSUMMONER BITMAP DISCARDABLE "res\\demonsum.bmp" IDB_HIDOG0 BITMAP DISCARDABLE "res\\hidog0.bmp" IDB_HIDDOG0 BITMAP DISCARDABLE "res\\hiddog0.bmp" IDB_HIDDOG0_ATTACK BITMAP DISCARDABLE "res\\hiddog0_.bmp" IDB_HIDDOG21_ATTACK BITMAP DISCARDABLE "res\\hiddog21.bmp" IDB_HIDDOG22_ATTACK BITMAP DISCARDABLE "res\\hiddog22.bmp" IDB_HIDDOG2_ATTACK BITMAP DISCARDABLE "res\\hiddog2_.bmp" IDB_HIDDOG0B BITMAP DISCARDABLE "res\\hiddog0b.bmp" IDB_HIDDOG2 BITMAP DISCARDABLE "res\\hiddog2.bmp" IDB_HIDDOG21 BITMAP DISCARDABLE "res\\bmp00015.bmp" IDB_HIDDOG21B BITMAP DISCARDABLE "res\\bmp00017.bmp" IDB_HIDDOG22 BITMAP DISCARDABLE "res\\bmp00018.bmp" IDB_HIDDOG22B BITMAP DISCARDABLE "res\\bmp00022.bmp" IDB_HIDDOG5 BITMAP DISCARDABLE "res\\hiddog5.bmp" IDB_HIDDOG5B BITMAP DISCARDABLE "res\\hiddog5b.bmp" IDB_HIDDOGDEAD BITMAP DISCARDABLE "res\\hiddogde.bmp" IDB_MD2WALL BITMAP DISCARDABLE "res\\wsqaure.BMP" IDB_MD2DOOR2 BITMAP DISCARDABLE "res\\md2door2.bmp" IDB_MD2DOOR1 BITMAP DISCARDABLE "res\\md2door1.bmp" IDB_MD2HORIZMOVERSQUARE BITMAP DISCARDABLE "res\\htrack.BMP" IDB_MD2LADDER BITMAP DISCARDABLE "res\\md2ladde.bmp" IDB_MD2UPDOWN BITMAP DISCARDABLE "res\\md2updow.bmp" IDB_MD2VERTMOVERSQUARE BITMAP DISCARDABLE "res\\vtrack.BMP" IDB_MD1BACKGROUND BITMAP DISCARDABLE "res\\back.BMP" IDB_SERVEROPTIONS BITMAP DISCARDABLE "res\\xevil1.bmp" IDB_DRAGONDEAD BITMAP DISCARDABLE "res\\dragonde.bmp" IDB_DRAGONHEADC BITMAP DISCARDABLE "res\\drg_1.bmp" IDB_DRAGONHEADB BITMAP DISCARDABLE "res\\drg_2.bmp" IDB_DRAGONBODY BITMAP DISCARDABLE "res\\drg_bdy.bmp" IDB_DRAGONHEAD BITMAP DISCARDABLE "res\\drg_head.bmp" IDB_DRAGONHEADD BITMAP DISCARDABLE "res\\drgbite.bmp" IDB_HITRAPDOOR BITMAP DISCARDABLE "res\\trapopen.bmp" IDB_MD2MOVER BITMAP DISCARDABLE "res\\nlift.BMP" IDB_MD2BACKGROUND BITMAP DISCARDABLE "res\\backg.BMP" IDB_YETI5 BITMAP DISCARDABLE "res\\troll5.bmp" IDB_YETI0B BITMAP DISCARDABLE "res\\troll0b.bmp" IDB_YETI0C BITMAP DISCARDABLE "res\\troll0c.bmp" IDB_YETI2 BITMAP DISCARDABLE "res\\troll1.bmp" IDB_YETI0 BITMAP DISCARDABLE "res\\troll0.bmp" IDB_OUTSIDE BITMAP DISCARDABLE "res\\bmp00021.bmp" IDB_YETI25 BITMAP DISCARDABLE "res\\troll25.bmp" IDB_YETI0D BITMAP DISCARDABLE "res\\troll0d.bmp" IDB_YETI18 BITMAP DISCARDABLE "res\\troll18.bmp" IDB_YETI18B BITMAP DISCARDABLE "res\\troll18b.bmp" IDB_HIALIEN2 BITMAP DISCARDABLE "res\\hialien2.bmp" IDB_HIALIEN18 BITMAP DISCARDABLE "res\\hialien1.bmp" IDB_HIALIEN18B BITMAP DISCARDABLE "res\\bmp00019.bmp" IDB_HIALIEN18C BITMAP DISCARDABLE "res\\bmp00023.bmp" IDB_HIALIEN25 BITMAP DISCARDABLE "res\\bmp00038.bmp" IDB_YETI4 BITMAP DISCARDABLE "res\\troll4.bmp" IDB_AAANEW BITMAP DISCARDABLE "res\\aaanew.bmp" IDB_MD3WALL BITMAP DISCARDABLE "res\\md4wall.bmp" IDB_MD3LADDER BITMAP DISCARDABLE "res\\md4ladde.bmp" IDB_MD3UPDOWN BITMAP DISCARDABLE "res\\md4updow.bmp" IDB_MD3BACKGROUND BITMAP DISCARDABLE "res\\md4backg.bmp" IDB_MD3OUTSIDE BITMAP DISCARDABLE "res\\md4outsi.bmp" IDB_MD3DOOR1 BITMAP DISCARDABLE "res\\md4door1.bmp" IDB_MD3DOOR2 BITMAP DISCARDABLE "res\\md4door2.bmp" IDB_MD3HORIZMOVERSQUARE BITMAP DISCARDABLE "res\\md4horiz.bmp" IDB_MD3VERTMOVERSQUARE BITMAP DISCARDABLE "res\\md4vertm.bmp" IDB_MD3MOVER BITMAP DISCARDABLE "res\\aaanew7.bmp" IDB_RARROW_R BITMAP DISCARDABLE "res\\rarrow_r.bmp" IDB_YETI9 BITMAP DISCARDABLE "res\\crawl-forward.bmp" IDB_YETI10F BITMAP DISCARDABLE "res\\crawl-right-6.bmp" IDB_YETI10B BITMAP DISCARDABLE "res\\crawl-right-2.bmp" IDB_YETI10C BITMAP DISCARDABLE "res\\crawl-right-3.bmp" IDB_YETI10D BITMAP DISCARDABLE "res\\crawl-right-4.bmp" IDB_YETI10E BITMAP DISCARDABLE "res\\crawl-right-5.bmp" IDB_YETI10 BITMAP DISCARDABLE "res\\crawl-right-1.bmp" IDB_MD4WALL BITMAP DISCARDABLE "res\\md5wall.bmp" IDB_MD4BACKGROUND BITMAP DISCARDABLE "res\\md5outsi.bmp" IDB_MD4DOOR1 BITMAP DISCARDABLE "res\\md5door1.bmp" IDB_MD4HORIZMOVERSQUARE BITMAP DISCARDABLE "res\\md5horiz.bmp" IDB_MD4OUTSIDE BITMAP DISCARDABLE "res\\md5backg.bmp" IDB_MD4UPDOWN BITMAP DISCARDABLE "res\\md5updow.bmp" IDB_MD4LADDER BITMAP DISCARDABLE "res\\md5ladde.bmp" IDB_MD4DOOR2 BITMAP DISCARDABLE "res\\md5door2.bmp" IDB_MD4VERTMOVERSQUARE BITMAP DISCARDABLE "res\\md5vertm.bmp" IDB_MD4MOVER BITMAP DISCARDABLE "res\\md5mover.bmp" IDB_HIALIEN0C BITMAP DISCARDABLE "res\\bmp00042.bmp" IDB_HIALIEN0B BITMAP DISCARDABLE "res\\bmp00041.bmp" IDB_HIALIEN0 BITMAP DISCARDABLE "res\\hialien0.bmp" IDB_HIALIEN0D BITMAP DISCARDABLE "res\\bmp00047.bmp" IDB_HIALIEN0E BITMAP DISCARDABLE "res\\bmp00048.bmp" IDB_HIALIEN0F BITMAP DISCARDABLE "res\\bmp00050.bmp" IDB_HIALIEN10 BITMAP DISCARDABLE "res\\bmp00002.bmp" IDB_HIALIEN10B BITMAP DISCARDABLE "res\\bmp00011.bmp" IDB_HIALIEN10C BITMAP DISCARDABLE "res\\bmp00014.bmp" IDB_HIALIEN10D BITMAP DISCARDABLE "res\\bmp00026.bmp" IDB_HIALIEN4 BITMAP DISCARDABLE "res\\hialien4.bmp" IDB_HIALIEN5 BITMAP DISCARDABLE "res\\hialien5.bmp" IDB_FWBACKGROUND1 BITMAP DISCARDABLE "res\\fwbackgr.bmp" IDB_FWBACKGROUND2 BITMAP DISCARDABLE "res\\bmp00035.bmp" IDB_FWBACKGROUND3 BITMAP DISCARDABLE "res\\bmp00039.bmp" IDB_FWBACKGROUND4 BITMAP DISCARDABLE "res\\bmp00044.bmp" IDB_MD1OUTSIDE BITMAP DISCARDABLE "res\\mdoutsid.bmp" IDB_HININJA21_ATTACK2 BITMAP DISCARDABLE "res\\bmp00045.bmp" IDB_HHERO21_ATTACK2 BITMAP DISCARDABLE "res\\hhero21_.bmp" IDB_HININJA_18 BITMAP DISCARDABLE "res\\bmp00046.bmp" IDB_HININJA_18B BITMAP DISCARDABLE "res\\bmp00049.bmp" IDB_HININJA_18C BITMAP DISCARDABLE "res\\bmp00051.bmp" IDB_HININJA_18D BITMAP DISCARDABLE "res\\bmp00052.bmp" IDB_HININJA_18E BITMAP DISCARDABLE "res\\bmp00053.bmp" IDB_HININJA_18F BITMAP DISCARDABLE "res\\bmp00058.bmp" IDB_HHERO18B BITMAP DISCARDABLE "res\\aaanew1.bmp" IDB_HHERO18C BITMAP DISCARDABLE "res\\hhero18c.bmp" IDB_HHERO18D BITMAP DISCARDABLE "res\\hhero18e.bmp" IDB_HHERO18E BITMAP DISCARDABLE "res\\hhero18f.bmp" IDB_HHERO18F BITMAP DISCARDABLE "res\\hhero18g.bmp" IDB_XIT BITMAP DISCARDABLE "res\\xit.bmp" IDB_BLOOD25 BITMAP DISCARDABLE "res\\blood25.bmp" IDB_BLOOD39 BITMAP DISCARDABLE "res\\blood39.bmp" IDB_BLOOD4 BITMAP DISCARDABLE "res\\blood4.bmp" IDB_BLOOD40 BITMAP DISCARDABLE "res\\blood40.bmp" IDB_BLOOD9 BITMAP DISCARDABLE "res\\blood9.bmp" IDB_BLOODG25 BITMAP DISCARDABLE "res\\bloodg25.bmp" IDB_BLOODG39 BITMAP DISCARDABLE "res\\bloodg39.bmp" IDB_BLOODG4 BITMAP DISCARDABLE "res\\bloodg4.bmp" IDB_BLOODG40 BITMAP DISCARDABLE "res\\bloodg40.bmp" IDB_BLOODG9 BITMAP DISCARDABLE "res\\bloodg9.bmp" IDB_OIL25 BITMAP DISCARDABLE "res\\oil25.bmp" IDB_OIL39 BITMAP DISCARDABLE "res\\oil39.bmp" IDB_OIL4 BITMAP DISCARDABLE "res\\oil4.bmp" IDB_OIL40 BITMAP DISCARDABLE "res\\oil40.bmp" IDB_OIL9 BITMAP DISCARDABLE "res\\oil9.bmp" IDB_LASER_HORIZ BITMAP DISCARDABLE "res\\bmp00020.bmp" IDB_VEGETABLES BITMAP DISCARDABLE "res\\bmp00057.bmp" IDB_TAKE_CANDY BITMAP DISCARDABLE "res\\take_can.bmp" IDB_AAANEW2 BITMAP DISCARDABLE "res\\aaanew2.bmp" IDB_WINNERS_DRUGS BITMAP DISCARDABLE "res\\bmp00059.bmp" IDB_KILL_PARENTS BITMAP DISCARDABLE "res\\kill_par.bmp" IDB_BEAT_DOG BITMAP DISCARDABLE "res\\beat_dog.bmp" ///////////////////////////////////////////////////////////////////////////// // // Cursor // IDC_XEVIL CURSOR DISCARDABLE "res\\arrow.cur" IDC_XEVIL_SERVER CURSOR DISCARDABLE "res\\xevil1.cur" ///////////////////////////////////////////////////////////////////////////// // // WAVE // IDW_CHAINSAW_SOUND WAVE DISCARDABLE "RES\\chainsw.wav" IDW_FLAMETHROWER WAVE DISCARDABLE "RES\\fireball.wav" IDW_DEATH WAVE DISCARDABLE "RES\\death.wav" IDW_SEAL_DEATH WAVE DISCARDABLE "RES\\lemdeth.wav" IDW_HUGGER_DEATH WAVE DISCARDABLE "res\\lemdeth.wav" IDW_FROG_DEATH WAVE DISCARDABLE "RES\\frogdeth.wav" IDW_BREAKDOWN WAVE DISCARDABLE "RES\\breakdwn.wav" IDW_BANG WAVE DISCARDABLE "RES\\bangbang.wav" IDW_PISTOL WAVE DISCARDABLE "res\\pistol.wav" IDW_MGUN WAVE DISCARDABLE "res\\machgun.wav" IDW_LAUNCHER WAVE DISCARDABLE "res\\missile.wav" IDW_EXPLOSION WAVE DISCARDABLE "res\\explosion.wav" IDW_DOG_DEATH WAVE DISCARDABLE "res\\dogdeath.wav" IDW_LASER WAVE DISCARDABLE "res\\laser.wav" IDW_HERO_ATTACK WAVE DISCARDABLE "res\\heroatt.wav" IDW_NINJA_ATTACK WAVE DISCARDABLE "res\\ninjaatt.wav" IDW_DOG_ATTACK WAVE DISCARDABLE "res\\dogatt.wav" IDW_CHOP_DEATH WAVE DISCARDABLE "res\\chpdeath.wav" IDW_DOPPEL_USE WAVE DISCARDABLE "res\\doppel.wav" IDW_CLOAK_USE WAVE DISCARDABLE "res\\cloak.wav" IDW_TRANS_USE WAVE DISCARDABLE "res\\transmog.wav" IDW_SHIELD_USE WAVE DISCARDABLE "res\\shield.wav" IDW_NINJA_DEATH WAVE DISCARDABLE "res\\ninjadth.wav" IDW_FROGGUN WAVE DISCARDABLE "res\\froggun.wav" IDW_LANCER WAVE DISCARDABLE "res\\lancer.wav" IDW_SWAPPER WAVE DISCARDABLE "res\\swapper.wav" ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDR_XEVIL ICON DISCARDABLE "res\\idr_xevi.ico" IDR_XEVIL_SMALL ICON DISCARDABLE "res\\SMALL.ICO" ///////////////////////////////////////////////////////////////////////////// // // PALETTE // IDR_XEVILPAL PALETTE DISCARDABLE "res\\xevil.pal" ///////////////////////////////////////////////////////////////////////////// // // Menu // IDR_XEVILMENU MENU PRELOAD DISCARDABLE BEGIN POPUP "&Game" BEGIN MENUITEM "&New Game", ID_NEWGAME MENUITEM SEPARATOR MENUITEM "E&xit", ID_APP_EXIT END POPUP "&Settings" BEGIN MENUITEM "&Options...", ID_OPTIONS MENUITEM "&Difficulty...", ID_DIFFICULTY MENUITEM "Keyboard &Controls...", ID_KEYS MENUITEM "Reset &Graphics", ID_RESETGFX MENUITEM "&Full Screen", ID_FULLSCREEN END POPUP "&Network" BEGIN MENUITEM "&Connect to Server...", ID_CONNECTSERVER MENUITEM "&Run as Server...", ID_RUNSERVER END POPUP "&Help" BEGIN MENUITEM "&Online Instructions", ID_NETHELP MENUITEM "&Story of XEvil", ID_STORY MENUITEM "&About XEvil...", ID_APP_ABOUT END POPUP "&Debug" BEGIN MENUITEM "&Surface Manager", ID_SURFACEMGR END END ///////////////////////////////////////////////////////////////////////////// // // MIDI // IDM_SEALSOUNDTRACK MIDI DISCARDABLE "res\\babyseal.mid" IDM_FIRESOUNDTRACK MIDI DISCARDABLE "res\\fire.mid" IDM_HIVESOUNDTRACK MIDI DISCARDABLE "res\\hive.mid" IDM_KILLSOUNDTRACK MIDI DISCARDABLE "res\\kkkill.mid" IDM_ZEEPEEGSOUNDTRACK MIDI DISCARDABLE "res\\ZEEPEEG.MID" IDM_NIGHTSKYSOUNDTRACK MIDI DISCARDABLE "res\\NIGHTSKY.MID" IDM_SWEETDARKSOUNDTRACK MIDI DISCARDABLE "res\\SWEETDAR.MID" IDM_TERRAEXMSOUNDTRACK MIDI DISCARDABLE "res\\TERRAEXM.MID" IDM_NEWSONGSOUNDTRACK MIDI DISCARDABLE "res\\NEWSONG.MID" ///////////////////////////////////////////////////////////////////////////// // // String Table // STRINGTABLE DISCARDABLE BEGIN IDS_NETHELPURL "http://www.xevil.com/docs/instructions.html" END #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // #define _AFX_NO_OLE_RESOURCES #define _AFX_NO_TRACKER_RESOURCES #define _AFX_NO_PROPERTY_RESOURCES #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE 9, 1 #pragma code_page(1252) #endif #include "res\XEvil.rc2" // non-Microsoft Visual C++ edited resources #include "afxres.rc" // Standard components #endif ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED xevil-2.02r2.orig/win32/xevil.dsw0100644000175000017500000000077006575711104016124 0ustar aaronlaaronlMicrosoft Developer Studio Workspace File, Format Version 5.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "xevil"=.\xevil.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### xevil-2.02r2.orig/x11/0040755000175000017500000000000007675236133013732 5ustar aaronlaaronlxevil-2.02r2.orig/x11/bitmaps/0040755000175000017500000000000007675236133015371 5ustar aaronlaaronlxevil-2.02r2.orig/x11/bitmaps/ui/0040755000175000017500000000000007637441100015774 5ustar aaronlaaronlxevil-2.02r2.orig/x11/bitmaps/ui/insensitive0100644000175000017500000000017006612457566020271 0ustar aaronlaaronl#define insensitive_width 4 #define insensitive_height 4 static char insensitive_bits[] = { 0x01, 0x02, 0x04, 0x08}; xevil-2.02r2.orig/x11/bitmaps/ui/null_cursor0100644000175000017500000000024706612457566020305 0ustar aaronlaaronl#define null_cursor_width 1 #define null_cursor_height 1 #define null_cursor_x_hot 0 #define null_cursor_y_hot 0 static unsigned char null_cursor_bits[] = { 0x00}; xevil-2.02r2.orig/x11/bitmaps/ui/reaper.xbm0100644000175000017500000000602106612513666017767 0ustar aaronlaaronl#define reaper_width 60 #define reaper_height 60 static unsigned char reaper_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xc0, 0x57, 0x55, 0x55, 0x05, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x00, 0x50, 0x03, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xc0, 0x15, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x60, 0x05, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xb8, 0x02, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0xf8, 0xf9, 0xff, 0xf9, 0xff, 0x3f, 0x00, 0x00, 0x58, 0xfd, 0xff, 0x03, 0x00, 0x34, 0x00, 0x00, 0xf8, 0xff, 0xab, 0xce, 0xff, 0x7f, 0x00, 0x00, 0xf8, 0x5f, 0x19, 0x1d, 0x00, 0x68, 0x00, 0x00, 0xf8, 0xaf, 0x6c, 0x7a, 0xfe, 0x7f, 0x00, 0x00, 0x78, 0x55, 0xc6, 0xd0, 0x00, 0x68, 0x00, 0x00, 0xd8, 0x2a, 0x82, 0xe6, 0xfb, 0x7f, 0x00, 0x00, 0xf0, 0x01, 0xb3, 0x9c, 0x03, 0x68, 0x00, 0x00, 0xb0, 0x01, 0xb9, 0x70, 0xf7, 0xff, 0x00, 0x00, 0x60, 0x0f, 0xf9, 0x60, 0x07, 0xa0, 0x00, 0x00, 0xc0, 0x8a, 0x71, 0xe0, 0xf6, 0xff, 0x00, 0x00, 0x80, 0x9f, 0x1c, 0x60, 0x07, 0xa0, 0x00, 0x00, 0x00, 0xb6, 0x07, 0xb0, 0xf6, 0xff, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xf8, 0x07, 0xe8, 0x01, 0x00, 0x00, 0x03, 0x00, 0x6e, 0xf7, 0xff, 0x01, 0x00, 0x00, 0xd5, 0x81, 0xeb, 0x06, 0xa8, 0x03, 0x00, 0x00, 0x4f, 0xe1, 0x87, 0xf7, 0xff, 0x07, 0x00, 0x00, 0xdc, 0xe3, 0x07, 0x06, 0x50, 0x0f, 0x00, 0x00, 0xd0, 0x83, 0x0f, 0xf6, 0xff, 0x0f, 0x00, 0x00, 0x70, 0x03, 0x3f, 0x06, 0x40, 0x0d, 0x00, 0x00, 0x50, 0x00, 0x3f, 0xf7, 0xff, 0x0f, 0x00, 0x00, 0xb0, 0x00, 0x3f, 0x07, 0xa0, 0x0e, 0x00, 0x00, 0x70, 0x00, 0x3e, 0xf3, 0xff, 0x0f, 0x00, 0x00, 0xa0, 0xc0, 0xbf, 0x07, 0x50, 0x0d, 0x00, 0x00, 0x60, 0xf9, 0x9f, 0xf7, 0xff, 0x0f, 0x00, 0x00, 0xc0, 0xff, 0xcf, 0x07, 0xaa, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0xe7, 0xe7, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xf8, 0xe1, 0x8f, 0xaa, 0x0f, 0x00, 0x00, 0x00, 0x6c, 0xf0, 0xef, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xae, 0xd8, 0xaf, 0xea, 0x0f, 0x00, 0x00, 0x00, 0x6f, 0xed, 0xef, 0xff, 0x0f, 0x00, 0x00, 0x80, 0xeb, 0xd7, 0x0f, 0x50, 0x0f, 0x00, 0x00, 0xc0, 0x1f, 0xeb, 0xe7, 0xff, 0x0f, 0x00, 0x00, 0xe0, 0x42, 0xf7, 0x07, 0x40, 0x0d, 0x00, 0x00, 0xf0, 0x7f, 0xeb, 0xf3, 0xff, 0x0f, 0x00, 0x00, 0x70, 0x01, 0xd7, 0x03, 0x00, 0x05, 0x00, 0x00, 0xf0, 0xff, 0xae, 0xf8, 0xff, 0x0f, 0x00, 0x00, 0xb8, 0x02, 0xd8, 0x00, 0x00, 0x05, 0x00, 0x00, 0xfc, 0xff, 0xbf, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x5c, 0x01, 0x7c, 0x00, 0x00, 0x05, 0x00, 0x00, 0xfe, 0xff, 0x7f, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xae, 0x00, 0x3c, 0x00, 0x40, 0x05, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x57, 0x00, 0x0c, 0x00, 0x50, 0x05, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0xab, 0x00, 0x06, 0x00, 0x55, 0x05, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f}; xevil-2.02r2.orig/x11/bitmaps/ui/xevil_icon.xpm0100644000175000017500000000263406625446440020673 0ustar aaronlaaronl/* XPM */ static char *xevil_icon[] = { /* width height num_colors chars_per_pixel */ " 32 32 9 1", /* colors */ ". c #ffffff", "# c #ffff00", "a c #ff0000", "b c #c0c0c0", "c c #808080", "d c #808000", "e c #800000", "f c None", "g c #000000", /* pixels */ "ffffffffffffffgggggggfffffffffff", "fffffffffffffgbb.bb.bgggffffffff", "ffffffffffffgb.beggebbecggffffff", "ffffffffffgge..egccce.becbgfffff", "fffffffffg.cebcgggggce.bc.bgffff", "fffffffgg.bcebgeea#aeeb.bcbbgfff", "fffffggbbbbecbgd#aae#gebbbbcgfff", "ffffgb.b.ecebcee#de#dgebecbccgff", "ffffgeegcbeebcaed##degcbecccegff", "fffffgeegebebgeae#deagebeeceegff", "ffffffgc#geebgee#d#eegebeeeeegff", "ffffffggdgg.ege#deddegebeeegegff", "ffffffggaeggeggdaad#egcebeggegff", "fffffgcegg.cggggeagcgeecebegggff", "ffffgbeceeg.cceegggeecgecb..bbgf", "fffgc.ce.cgg.bb....bceeccb....cg", "fffgeccebcgcg.ceccb.bb....b.bbcg", "ffffgeeggbbcbbbceggggee..ccgcceg", "fffffgggegggggggegeeegeeccgegegf", "ffffffggc#bebbecbe.bcegecgegggff", "ffffffggbb.b.#b.#b#begggbeggffff", "ffffffgggb#b.#b.#bcgcggg.begffff", "fffffggececc#bbcegceggcgbbbegfff", "ffffgbge.bceecgccbegecee..bcegff", "fffg.gec#b.b.#cbeggebeebb.bccgff", "ffgebcgebc#b#beggebbebbb.bbcegff", "fgcbebcgeebebegebcbcbccccbcegfff", "fgbcbc.ccggggcbc.bcccceceeegffff", "fgec.bc.bbbbb.cbcceeeggggggfffff", "ffgec..cbceecbcceegggfffffffffff", "fffggecbb...bcegggffffffffffffff", "fffffggggggggggfffffffffffffffff" }; xevil-2.02r2.orig/x11/gen_xpm/0040755000175000017500000000000007675236133015367 5ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/world/0040755000175000017500000000000007637441100016504 5ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/world/block_0.xpm0100644000175000017500000000265107041513602020540 0ustar aaronlaaronl/* XPM */ static char *block_0[] = { /* width height ncolors chars_per_pixel */ "32 32 6 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #4d4d4d", "% c #333300", "& c None", "' c #330066", /* pixels */ "#$###!!'!!##!!!!!#%%#!#$###!!!%%", "#$$##!!!!#!#!!!!!%%!!%#$###!!!!%", "#$###!!!######%#######$####!!##$", "#$###!!!!!!!!!!!!!!!!!#$###!!!!!", "%$###!!!!!!!!!!!!!#!!!#$###!!!%%", "%$###!!!!!!%!!!!!!%!!!#####!!!%%", "%$$##!!!%!!%!!!!!%%##!$$###!!!%%", "%$###!!!!!!%!!!!!%%!!!$####!!!%%", "#$###!!!!!!!!!!!!!!!!!$$###!!!%%", "%$$##!!!!!!%!!!!!!%!!!#####!!!%!", "%$###!!!!!!#!!!!!!%!!!#####!!!!%", "%$###%!!!!!%!!!!!!%!!!#####!!!%%", "%$###!!!!!#%!!!!!#%%#######!!!%%", "#$###!!!!!!%!!!!!%%!!%#####!!!%%", "%$###!!!!!!%!!!!!!%%!%#####%!!%!", "%$###!!!!!!%!!!!!!%!!#######!%%%", "%$###!!!!!!%!!!!!!!!########%%%%", "$$$$$$$$$$$$$$$$$$$$############", "$$$$$$$$$$$$$$$$$$$#############", "################################", "##############################%%", "%%%%%%%%%%%%%%%%%%%%%%######%%!!", "!!!!!!!!!!!!!!!!!!!!!!#####%!!!!", "!%!!!!!!!!!%!!!!!!%!!!####%!!!!!", "!#%%!!!#%#%#!!!!!%%#%#$$##%!!!!!", "!###%!!%#%##!!!!!%#####$##%!!!!!", "!$$##!!%#%##!!!!!%##%#$####!!!%!", "!$###!!!!!%#%!!!!##!!!#$###!!%!%", "!$$##!!!!!##%!!!!##!!!$$###!!!%!", "!$###!!!!!%#%!!!!%%!!!$####!!!%%", "!$$##!!#####%!!!!%#####$###!!%!%", "!$###!!#####%!!!!%####$$###!!!%%", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_1.xpm0100644000175000017500000000263007041513602020536 0ustar aaronlaaronl/* XPM */ static char *block_1[] = { /* width height ncolors chars_per_pixel */ "32 32 5 1 0 0", /* colors */ "! c #000000", "# c #555555", "$ c #cbcbcb", "% c #a0a0a4", "& c None", /* pixels */ "#$$$$%%%%%%%%%%##%%%%%%%%%%$$$$#", "%%%%%#$$$$%%$$$$$$$$$$$$%%%%%%%#", "#$#$###$%%###########$%%###$#$##", "#%%%%!!$%%#!!######!!$%%#!!%%%%#", "%%##%!!$%%#!!!%#$%!!!$%%#!!%##%#", "%%#%%!!$%%#!%%%$$%%%!$%%#!!%#%%#", "#%%%%#%$$%%%$$$$$$$$%%%%#%#%%%%#", "#$#$###$#%%$$%%%%%%%$%%####$#$##", "%%%%%#$$$%%%%%%%%%%%%%%%#%%%%%%#", "%####$!$#$%%%######%%%$##!%####%", "!%#%%!!$$%###%%%%%%##%%%#!!%#%%!", "!$#%$!!$#%#%%%%%%%%%%$%##!!$#%$!", "!$#%$!!$$%#%#!!!!!!$%$%%#!!$#%$!", "!$#%$!!$#%#%#!!!!!!$%$%##!!$#%$!", "!$#%$!!$$%#%%%%%%%%%%$%%#!!$#%$!", "!$#%$!!$#%#%#!!!!!!$%$%##!!$#%$!", "!$#%$!!$$%#%#!!!!!!$%$%%#!!$#%$!", "!$#%$!!$#%#%%%%%%%%%%$%##!!$#%$!", "!$#%$!!$$%#%#!!!!!!$%$%%#!!$#%$!", "!$#%$!!$#%#%#!!!!!!$%$%##!!$#%$!", "!$#%$!!$$%#%%%%%%%%%%$%%#!!$#%$!", "!$#%$!!$#%%$$%%%%%$$$$%##!!$#%$!", "!%##%!!$$$%%%$$$$$%%%%$%#!!%##%!", "$$$$$$!$#%%%%%%%%%%%%%%##!%$$$$$", "%%%%%#$$%%##%%%%%%%##$%%#%%%%%%#", "#$#$###$%%#%########%$%%###$#$##", "#%%%%!!$%%###########$%%#!!%%%%#", "%%##%!!$%%#!%!%#$%!%!$%%#!!%##%#", "%%#%%!!$%%#!!%%$$%%!!$%%#!!%#%%#", "#%%%%#%$%%##%%%%%%%%%$%%###%%%%#", "#$#$###%#############%#####$#$##", "%%%%%#$$$$$$$$$$$$$$$$$$$$%%%%%#", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_2.xpm0100644000175000017500000000260707041513602020543 0ustar aaronlaaronl/* XPM */ static char *block_2[] = { /* width height ncolors chars_per_pixel */ "32 32 4 1 0 0", /* colors */ "! c #555555", "# c #cbcbcb", "$ c #a0a0a4", "% c None", /* pixels */ "#$############################$#", "%$#!!!!!!!!!!!!$$!!!!!!!!!!!!#$%", "#$$$$$%%%%%%%%%!!%%%%%%%%%$$$$$#", "%#!!$%%%%%%%%%%$!%%%%%%%%%%$!!#%", "#$############################$#", "%$#!!!!!!!!!!!!$$!!!!!!!!!!!!#$%", "#$$$$$%%%%%%%%%!!%%%%%%%%%$$$$$#", "%#!!$%%%%%%%%%%$!%%%%%%%%%%$!!#%", "#$############################$#", "%$#!!!!!!!!!!!!$$!!!!!!!!!!!!#$%", "#$$$$$%%%%%%%%%!!%%%%%%%%%$$$$$#", "%#!!$%%%%%%%%%%$!%%%%%%%%%%$!!#%", "#$############################$#", "%$#!!!!!!!!!!!!$$!!!!!!!!!!!!#$%", "#$$$$$%%%%%%%%%!!%%%%%%%%%$$$$$#", "%#!!$%%%%%%%%%%$!%%%%%%%%%%$!!#%", "#$############################$#", "%$#!!!!!!!!!!!!$$!!!!!!!!!!!!#$%", "#$$$$$%%%%%%%%%!!%%%%%%%%%$$$$$#", "%#!!$%%%%%%%%%%$!%%%%%%%%%%$!!#%", "#$############################$#", "%$#!!!!!!!!!!!!$$!!!!!!!!!!!!#$%", "#$$$$$%%%%%%%%%!!%%%%%%%%%$$$$$#", "%#!!$%%%%%%%%%%$!%%%%%%%%%%$!!#%", "#$############################$#", "%$#!!!!!!!!!!!!$$!!!!!!!!!!!!#$%", "#$$$$$%%%%%%%%%!!%%%%%%%%%$$$$$#", "%#!!$%%%%%%%%%%$!%%%%%%%%%%$!!#%", "#$############################$#", "%$#!!!!!!!!!!!!$$!!!!!!!!!!!!#$%", "#$$$$$%%%%%%%%%!!%%%%%%%%%$$$$$#", "%#!!$%%%%%%%%%%$!%%%%%%%%%%$!!#%", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_3.xpm0100644000175000017500000000265107041513602020543 0ustar aaronlaaronl/* XPM */ static char *block_3[] = { /* width height ncolors chars_per_pixel */ "32 32 6 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #555555", "% c #4d4d4d", "& c #333300", "' c None", /* pixels */ "!!&%&!!!&%%%&&&&&!!!!!!&&!!!&!&!", "!&%%!!!&&%$%&#%!!&!!!!!&&!!!!!&&", "&&&!!!!&%%$%#&&!!&!!!!!!&&!!!!&&", "&&&!!!&&%%%$%&&&!!!!!!!!&!!!!!%%", "%&!!&&&%%%%%%&&&!!!!!!!!&!!!!!&&", "&&&&&&&&%%&%%&!&!!!!!!!!!!!!!!!!", "!!&&&&#%%#&&%&!&!!!!!!!!!&!!!!!&", "!!&&&#&&$&&#&!!&!!!!&&!!!!!!&&!&", "!!&&&%%&%&&#!!&!!!!!!&!!!!!!&&!!", "!!!&%%&&&!&&!&&!!!!!!!!!!!!&&&!!", "#!!&%&&!!%&!!&!!!!!!!&!!!!&&%!!!", "#&&!&&&&&#&!!!!!!!!&&#!!!!!%&!!!", "&%&!&&&&&&&!!!&!!!!!&&!!!!!&%!!&", "&%#!!&!!&&&!!&&!!!!&%&!!!!!&&!!&", "&%%!!&&&&&!!&&&!!!!%%!!!&&&&&&!!", "#%%&&&&&&&!!&&&!!!&&&!!!&&&&&&!&", "%$%&&&!!&&!!!%&!!!&%&!!!&%&!!&&&", "&%&&&&!!&&!!&#!!!!%%&!!&%#!!!!&%", "#&&&%&!!&!!!!&!!&&&&!!!&%&!!&&%%", "&&&&%%!!!&!!!&&&%&!!!&&%%&!!!&%%", "!&&%%&&!!&!!!!&%#!!!!&&%&!!&&&&&", "!!&&&&&!&!!!!!&%&!!!!&#%#!!&&&&&", "!!!!&&&&%!!&&!&&&!!&&&&&%&&&&&&&", "!!!!&%&%%!!&&&&&!!!&&&&%%&&&&!&%", "!!!!!&&&#!!&&&&&&!!&&&&&%&!!&&&%", "!!!!!&%%&!!&%#&&&!!&!!&&%&!&&&&&", "!!!!!!%%!!!!&&&&&&&&&!&&&&&&!&&#", "!!!!!!&%&!!&&&&&&&&&&&&&&&&!!&%%", "&!!!!!&%&&!!#%&!!&&&&%&&&!!!!!%%", "!!!!!!&&&&!!&&&!!&&&%%%&&!!!!&%%", "!!!!!!&&&!!!&%&!!!&&%%%%&!!!!&&%", "!!!!!!&&!!&&%&!&&!!#%%%%&!!!&&&#", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_4.xpm0100644000175000017500000000263007041513602020541 0ustar aaronlaaronl/* XPM */ static char *block_4[] = { /* width height ncolors chars_per_pixel */ "32 32 5 1 0 0", /* colors */ "! c #008000", "# c #000080", "$ c #ff0000", "% c #ffff00", "& c None", /* pixels */ "&&&&&&&&&&&&&&&&&&&&%%%%&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&%%%%&&&&&&&&", "&&&&&&&&&&&&&&&&&&%%&&&&%%&&&&&&", "&&&&&&&&&&&&&&&&&&%%&&&&%%&&&&&&", "&&&&&&&&&&%%%%&&%%&&&&&&%%&&&&&&", "&&&&&&&&&&%%%%&&%%&&&&&&%%&&&&&&", "&&&&&&&&%%&&&&%%%%&&&&&&&&&&&&&&", "&&&&&&&&%%&&&&%%%%&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&%%%%&&&&&&&&######", "&&&&&&&&&&&&&&%%%%&&&&&&&&######", "&&&&&&&&&&&&########&&&&&&##%%##", "&&&&&&&&&&&&########&&&&&&##%%##", "$$$$&&&&&&####%%%%####&&&&######", "$$$$&&&&&&####%%%%####&&&&######", "$$$$&&&&####%%%%%%%%####&&&&##&&", "$$$$&&&&####%%%%%%%%####&&&&##&&", "&&!!&&####################&&##&&", "&&!!&&####################&&##&&", "&&############################&&", "&&############################&&", "########%%############%%########", "########%%############%%########", "&&######%%%%%%%%%%%%%%%%######&&", "&&######%%%%%%%%%%%%%%%%######&&", "&&!!########################&&&&", "&&!!########################&&&&", "&&&&&&&&&&&&########&&&&&&&&&&&&", "&&&&&&&&&&&&########&&&&&&&&&&&&", "&&&&########&&####&&########&&&&", "&&&&########&&####&&########&&&&", "&&############################&&", "&&############################&&", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_5.xpm0100644000175000017500000000263007041513602020542 0ustar aaronlaaronl/* XPM */ static char *block_5[] = { /* width height ncolors chars_per_pixel */ "32 32 5 1 0 0", /* colors */ "! c #000000", "# c #555555", "$ c #cbcbcb", "% c #a0a0a4", "& c None", /* pixels */ "#$$$$%%%%%%%%%%##%%%%%%%%%%$$$$#", "%%%%%#$$$$%%$$$$$$$$$$$$%%%%%%%#", "#$#$###$%%###########$%%###$#$##", "#%%%%!!$%%#!!######!!$%%#!!%%%%#", "%%##%!!$%%#!!!%#$%!!!$%%#!!%##%#", "%%#%%!!$%%#!%%%$$%%%!$%%#!!%#%%#", "#%%%%#%$$%%%$$$$$$$$%%%%#%#%%%%#", "#$#$###$#%%$$%%%%%%%$%%####$#$##", "%%%%%#$$$%%%%%####%%%%%%#%%%%%%#", "%####$!$#$%%%#%%%%#%%%$##!%####%", "!%#%%!!$$%###%%#$%%##%%%#!!%#%%!", "!$#%$!!$#%#%%%#!#$%%%$%##!!$#%$!", "!$#%$!!$$%#%%#!#!#$%%$%%#!!$#%$!", "!$#%$!!$#%#%#!#!#!#$%$%##!!$#%$!", "!$#%$!!$$%#%%%##!%%%%$%%#!!$#%$!", "!$#%$!!$#%#%%%#!#$%%%$%##!!$#%$!", "!$#%$!!$$%#%%%##!$%%%$%%#!!$#%$!", "!$#%$!!$#%#%%%#!#%%%%$%##!!$#%$!", "!$#%$!!$$%#%##!#!#!$%$%%#!!$#%$!", "!$#%$!!$#%#%%##!#!$%%$%##!!$#%$!", "!$#%$!!$$%#%%%##!$%%%$%%#!!$#%$!", "!$#%$!!$#%%$$%%#$%%$$$%##!!$#%$!", "!%##%!!$$$%%%$%%%%$%%%$%#!!%##%!", "$$$$$$!$#%%%%%$$$$%%%%%##!%$$$$$", "%%%%%#$$%%##%%%%%%%%#$%%#%%%%%%#", "#$#$###$%%#%########%$%%###$#$##", "#%%%%!!$%%###########$%%#!!%%%%#", "%%##%!!$%%#!%!%#$%!%!$%%#!!%##%#", "%%#%%!!$%%#!!%%$$%%!!$%%#!!%#%%#", "#%%%%#%$%%##%%%%%%%%%$%%###%%%%#", "#$#$###%#############%#####$#$##", "%%%%%#$$$$$$$$$$$$$$$$$$$$%%%%%#", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_6.xpm0100644000175000017500000000260707041513602020547 0ustar aaronlaaronl/* XPM */ static char *block_6[] = { /* width height ncolors chars_per_pixel */ "32 32 4 1 0 0", /* colors */ "! c #000000", "# c #c0c0c0", "$ c #808080", "% c None", /* pixels */ "###############################!", "##############################!!", "#############################!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "###$$$$$$$$$$$$$$$$$$$$$$$$$$!!!", "##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_7.xpm0100644000175000017500000000304107041513602020541 0ustar aaronlaaronl/* XPM */ static char *block_7[] = { /* width height ncolors chars_per_pixel */ "32 32 13 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #993366", "% c #996666", "& c #cc6666", "' c #cc9966", "( c #4d4d4d", ") c #330000", "* c #660000", "+ c #cc9999", ", c #cccc99", "- c None", ". c #330066", /* pixels */ "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", "%%#......)..).......)......))#(%", "%#%%(%'',',,,,,,,,,,,',''%(%,'%'", "%.%!,'%&%%%%#)....)#!%%%.#'%$%.'", "%.$',%!,%%%$,,,',','%($%#,'%(,),", "%.%$!#%,%%','%%%%%%%'&%%.%()!,)'", "%.'%,',$),,%%%%%%%%%%%%%%%'%,,),", "%)'%%%)!,+%%%%%%%%%%%%%%%%'''%)'", "%.'%%%),,%%%%%%%%%%%%%%%$'%%%%),", "%.'%%.%,%))))(%%%%()#)#!%$'%%%),", "%.'%%),%#%,,,%%%%()$,,,%%!'&%%),", "%)'%%)'(%,'%%%%'%)%,'%%%%'.,%%),", "%.'%%#'),'%%%$.,%)''%%%%),),%%),", "%.'%%),),%%%%#$'%.%&%%%%)'(,%%),", "%.'%%#'(%%%%(),'%%('%%%!),$,%%),", "%.'%%),%$%!.)%,(%%$%(!)#',!'%%),", "%)'%%.,''%%%',&)!%%%'%%,'%*,%%),", "%.,%%!,%%'''%%!.%'%%%''%%%)'%%),", "%.'%%.,'%%%%%%#$%('%%%%%%.),%%),", "%.,%%$$''%%%%(('',,%%%%#).,'%%),", "%.,%%%(!)$%%%%%%%%%%%%$.,,'%%%),", "%)'%%%%%&$%(%%$%)%%!$'(*,%%%%%),", "%),%%%%%%$,)%')'.''.%'(!,%%%%%),", "%),%%%%%%$,!%'.')%%)%%.*,%%%%%),", "%),%%%%%%.!#$))%.$%!(%$%,()#!%),", "%),().!%%$,%,,',''''%,'$'),,%,),", "%),),,%,%!,),$!,!%,$!,(!'$,$),),", "%.,),$#,%$,),$),$(,(!'#%'($#(,),", "%)'(&.%,%%%)'))&))%))$&,'%,,,'),", "%)'%',''%%,,,,,,,,,,,,,&%%%%%(),", "%%&!))))))))))))))))))))))))))%'", "%%%',,,,,,,,,,,,,,,,,,,,,,,,,,''", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_8.xpm0100644000175000017500000000260707041513602020551 0ustar aaronlaaronl/* XPM */ static char *block_8[] = { /* width height ncolors chars_per_pixel */ "32 32 4 1 0 0", /* colors */ "! c #555555", "# c #cbcbcb", "$ c #a0a0a4", "% c None", /* pixels */ "%#!!#%#$################$#%#!!#%", "%#$$#%%$#!!!!!!!!!!!!!!#$%%#$$#%", "%#!!#%#$$$$$%%%%%%%%$$$$$#%#!!#%", "%#$$#%%#!!$%%%%%%%%%%$!!#%%#$$#%", "%#!!#%#$################$#%#!!#%", "%#$$#%%$#!!!!!!!!!!!!!!#$%%#$$#%", "%#!!$%#$$$$$%%%%%%%%$$$$$#%$!!#%", "%#$$#%%##!$%%%%%%%%%%$!##%%#$$#%", "%#!!#$####################$#!!#%", "%#$$#$###!!!!!!!!!!!!!!###$#$$#%", "%#!!#%#$$$$$%%%%%%%%$$$$$#%#!!#%", "%#$$$%%#$!$%%%%%%%%%%$!$#%%$$$#%", "%#!!#%#$################$#%#!!#%", "%#$$#%%$#!!!!!!!!!!!!!!#$%%#$$#%", "%#!!#%#$$$$$%%%%%%%%$$$$$#%#!!#%", "%#$$#%%#!!$%%%%%%%%%%$!!#%%#$$#%", "%#!!#%#$################$#%#!!#%", "%#$$#%%$#!!!!!!!!!!!!!!#$%%#$$#%", "%#!!#%#$$$$$%%%%%%%%$$$$$#%#!!#%", "%#$$#%%#!!$%%%%%%%%%%$!!#%%#$$#%", "%#!!#%#$################$#%#!!#%", "%#$$#%%$#!!!!!!!!!!!!!!#$%%#$$#%", "%#!!$%#$$$$$%%%%%%%%$$$$$#%$!!#%", "%#$$#%%##!$%%%%%%%%%%$!##%%#$$#%", "%#!!#$####################$#!!#%", "%#$$#$###!!!!!!!!!!!!!!###$#$$#%", "$#!!#%#$$$$$%%%%%%%%$$$$$#%#!!#$", "##$$$%%#$!$%%%%%%%%%%$!$#%%$$$##", "##!!#%#$################$#%#!!##", "##$$#%%$#!!!!!!!!!!!!!!#$%%#$$##", "$#!!#%#$$$$$%%%%%%%%$$$$$#%#!!#$", "!#$$#%%#!!$%%%%%%%%%%$!!#%%#$$#!", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_9.xpm0100644000175000017500000000302007041513602020540 0ustar aaronlaaronl/* XPM */ static char *block_9[] = { /* width height ncolors chars_per_pixel */ "32 32 12 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #993366", "% c #996666", "& c #cc6666", "' c #cc9966", "( c #4d4d4d", ") c #330000", "* c #660000", "+ c #cccc99", ", c None", "- c #330066", /* pixels */ "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", "%%#------)--)-------)------))#(%", "%#%%(%''+'+++++++++++'+''%(%+'%'", "%-%!+'%&%%%%%%%%%%%%%%%%-#'%$%-'", "%-$'+%!+%%%%%%%((%%%%%%%#+'%(+)+", "%-%$!#%+%%%%%&((+(%%%%%%-%()!+)'", "%-'%+'+%%%%%&()+'+)%%%%%%%'%++)+", "%)'%%%%%%%%&()+'%%+)%%%%%%'''%)'", "%-'%%%%%%%&()+'%%%%+)%%%%%%%%%)+", "%-'%%%%%%&()+'%%%%%%+)%%%%%%%%)+", "%-'%%%%%%()+'%%%%%%%%+)%%%%%%%)+", "%)'%%%%&()+'%%%%%%%%%%+)%%%%%%)+", "%-'%%%%()+'%%%%%%%%%%&(+)%%%%%)+", "%-'%%%%)+')*%%%%%%%%(*)(+%%%%%)+", "%-'%%%%('+++*%())%%(*+++'%%%%%)+", "%-'%%%%%((((+%)%%+%*+%%%%%%%%%)+", "%)'%%%%%%%%)+%)%%+%)+%%%%%%%%%)+", "%-+%%%%%()))+%%++'%(+()(%%%%%%)+", "%-'%%%%('+++%%%%%%%%(+++'%%%%%)+", "%-+%%%%(+)%%%%%%%%%%%(*)+%%%%%)+", "%-+%%%%%%+)%%%%%%%%%&()+'%%%%%)+", "%)'%%%%%%%+)%%%%%%%%()+'%%%%%%)+", "%)+%%%%%%%%+)%%%%%&()+'%%%%%%%)+", "%)+%%%%%%%%%+)%%%%()+'%%%%%%%%)+", "%)+%%%%%%%%%%+(&&()+'%%%%()#!%)+", "%)+()-!%%%%%%%+(((+'%%%%%)++%+)+", "%)+)++%+%%%%%%%+(+'%%%%%%$+$)+)+", "%-+)+$#+%%%%%%%%+'%%%%%%%($#(+)+", "%)'(&-%+%%%%%%%%%%%%%%%%%%+++')+", "%)'%'+''%%%%%%%%%%%%%%%%%%%%%()+", "%%&!))))))))))))))))))))))))))%'", "%%%'++++++++++++++++++++++++++''", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_10.xpm0100644000175000017500000000265207041513602020622 0ustar aaronlaaronl/* XPM */ static char *block_10[] = { /* width height ncolors chars_per_pixel */ "32 32 6 1 0 0", /* colors */ "! c #cc9966", "# c #663300", "$ c #993300", "% c #996600", "& c #cc6600", "' c None", /* pixels */ "!!!!&!!!!!!!&!!!!!&!&!!!!!!!&&%#", "!!!&&&&!!!!&&&&!!&&&&&&!!!!&&&&#", "!&&!&&&&&!!!&&&&!&&&&&&&&!!!&&%#", "!&&&&%&&&&&&!&&&&&&&&&&&&&&&!&%#", "!&&!&&%&&&&&&!&&&&&!&&&&&&&&&!%#", "!&&&!!!&%&&&&&&%&&&&!!!&%%&&&&%#", "!&&&&&!!&%%%&&&&&&&&&&!!&%%%&&%#", "!%&&%&&&!&&%%&&!&%&&%&&&!&&%%%%#", "!&&&&%&&&&&&&%&&!&&&&%&&&&&&%%%#", "!&!!&%%&&&&%%%&&%&!!&%%&&&&%%%%#", "&%&!&%%%&%&&%%%&&%%!&%%%&%&&%%%#", "&%%&&&%%%$%&&%$%%$$%&&%%%$%%%%$#", "&$#$$&%&%$$#$$$%$$#$$&%&%$$#$$$#", "&###$##$$$$###$$$###$##$$$$###$#", "%########$###############$######", "################################", "!!&!&!!!!!!!&&%#!!!!&!!!!!!!&!!!", "!&&&&&&!!!!&&&&#!!!&&&&!!!!&&&&!", "!&&&&&&&&!!!&&%#!&&!&&&&&!!!&&&&", "&&&&&&&&&&&&!&%#!&&&&%&&&&&&!&&&", "&&&!&&&&&&&&&!%#!&&!&&%&&&&&&!&&", "&&&&!!!&%%&&&&%#!&&&!!!&%&&&&&&%", "&&&&&&!!&%%%&&%#!&&&&&!!&%%%&&&&", "&%&&%&&&!&&%%%%#!%&&%&&&!&&%%&&!", "!&&&&%&&&&&&%%%#!&&&&%&&&&&&&%&&", "%&!!&%%&&&&%%%%#!&!!&%%&&&&%%%&&", "&%%!&%%%&%&&%%%#&%&!&%%%&%&&%%%&", "%$$%&&%%%$%%%%$#&%%&&&%%%$%&&%$%", "$$#$$&%&%$$#$$$#&$#$$&%&%$$#$$$%", "$###$##$$$$###$#&###$##$$$$###$$", "#########$######%########$######", "################################", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_11.xpm0100644000175000017500000000261007041513602020615 0ustar aaronlaaronl/* XPM */ static char *block_11[] = { /* width height ncolors chars_per_pixel */ "32 32 4 1 0 0", /* colors */ "! c #663300", "# c #996600", "$ c #ffcc99", "% c None", /* pixels */ "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#######################$#$##", "$$#$#!!!!!!!!!!!!!!!!!!!!!!$#$##", "$$#$##$$$$$$$$$$$$$$$$$$$$$$#$##", "$$#$#!#######################$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#######################$#$##", "$$#$#!!!!!!!!!!!!!!!!!!!!!!$#$##", "$$#$##$$$$$$$$$$$$$$$$$$$$$$#$##", "$$#$#!#######################$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#######################$#$##", "$$#$#!!!!!!!!!!!!!!!!!!!!!!$#$##", "$$#$##$$$$$$$$$$$$$$$$$$$$$$#$##", "$$#$#!#######################$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", "$$#$#%%%%%%%%%%%%%%%%%%%%%%$#$##", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_12.xpm0100644000175000017500000000275707041513602020632 0ustar aaronlaaronl/* XPM */ static char *block_12[] = { /* width height ncolors chars_per_pixel */ "32 32 10 1 0 0", /* colors */ "! c #000000", "# c #cc9966", "$ c #ffcc66", "% c #ffccff", "& c #333300", "' c #663300", "( c #993300", ") c #996600", "* c #cc6600", "+ c None", /* pixels */ "####*#######*#####*#*#######**)'", "###****##)'''((''''')**####****'", "#**#****)''')*###)''')##*###**)'", "#****)**'''*#######'''*##***#*)'", "#**#**)(''*##%$$$$##''(##****#)'", "#***)##(')##%%%$%%$$)'(*#)****)'", "#****(*((*#*!'#$!!)$#'((*)))**)'", "#)**)*(''*#!!!#$'!!$#'(*##*))))'", "#****)*''*#'!*!'#'!$#'(###**)))'", "#*##*))('**#$$)'#%$#''(*#**))))'", "*)*#*))(''**##$$##''''()#)**)))'", "*))***)))''&(('#)#'''()**())))('", "*('((*)*)(''(*'#'#''(*)*)(('((('", "*'''(''(((('''((('''(''(((('''('", ")''''''''('''''''''''''''(''''''", "''''''''''''''''''''''''''''''''", "##*#*#######**)'####*#######*###", "#*****))))#****'###***))(')****#", "#***))*##*))**)'#**#*()**)'#****", "***)*#$$$$#*)*)'#****)*##*(##***", "**)*$$$$$$$$*))'#**#*(*##*(#*#**", "*)*#$$####$$#*)'#***)')##)'#***)", "*)*$#*)##)*#$*)'#)''''(##('''')*", "*)#**)'##')**#)'#''''''##''''''#", "#))')''##'')'))'#')')''##'')')'*", "))'''''##'''''''#'#**)'##')**#'*", "*)''''(##('''')'*'*$#*)##)*#$*'*", ")(()*')##)')))('*'*#$$####$$#*')", "(('(''*##*''((('*('*$$$$$$$$*'()", "('''')*##*('''('*'''*#$$$$#*''((", "'''''()**)'''''')'''''*##*''''''", "'''''&))('&'''''''''''''''''''''", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_13.xpm0100644000175000017500000000304207041513602020617 0ustar aaronlaaronl/* XPM */ static char *block_13[] = { /* width height ncolors chars_per_pixel */ "32 32 13 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #c0c0c0", "% c #555555", "& c #cc9966", "' c #ffcc66", "( c #333300", ") c #663300", "* c #993300", "+ c #996600", ", c #cc6600", "- c #808080", ". c None", /* pixels */ "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", "--------------------------------", "!!!!!!!!!!!#((((((((#!!!!!!!!!!!", "(((((((((((%########%(((((((((((", "(((((((((((%########%(((((((((((", "###########-%%%%%%%%%((#########", "###########-%%%%%%%%%((#########", "###########-%%%%%%%%%((#########", "%%%%%%%%%%%$--------%##%%%%%%%%%", "%%%%%%%%%%%$--------%##%%%%%%%%%", "%%%%%%%%%%%$--------%##%%%%%%%%%", "%%%%%%%%%%%$--------%##%%%%%%%%%", "--------------------------------", "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", "))))))))))))))))))))))))))))))))", "*+&&,,,,,&&,,,,)*+,&&,,&,,,,,,,)", "*,++&&,,,,,&&,,)*,++,&,,'&,,,,,)", "*&&&&''&&&&&''&)*&&&&''&''&&'&&)", "))))))**)*))*)))))))))**)))))**)", ")*+***++*)))*),))++***++*)*++*,)", ")*++*++++)*++*,))+++*+++))+++*,)", ")+++*++++*+++*,))+++*+++)*++++,)", "))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))", ",&&,,,,)*&&&,,,,&&&&,,,)*+&&,,,,", ",,,&&,,)*&,,&&,,,,&&&,,)*,++&&,,", "&&&&''&)*&&&''&&&&&&''&)*&&&&''&", ")))))**))))))))))))))**)))))))**", "*)*++*,))***+*+)****)*,))++*)*++", "+)+++*,))*+++++*++++**,))+++*+++", "+*++++,))*+++++*++++*+,))+++*+++", "))))))))))))))))))))))))))))))))", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_14.xpm0100644000175000017500000000261007041513602020620 0ustar aaronlaaronl/* XPM */ static char *block_14[] = { /* width height ncolors chars_per_pixel */ "32 32 4 1 0 0", /* colors */ "! c #ffcc66", "# c #663300", "$ c #996600", "% c None", /* pixels */ "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$$$$$$$$$$$$$$$$$$$$$$$!$!$$", "!!$!$######################!$!$$", "!!$!$$!!!!!!!!!!!!!!!!!!!!!!$!$$", "!!$!$#$$$$$$$$$$$$$$$$$$$$$$$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$$$$$$$$$$$$$$$$$$$$$$$!$!$$", "!!$!$######################!$!$$", "!!$!$$!!!!!!!!!!!!!!!!!!!!!!$!$$", "!!$!$#$$$$$$$$$$$$$$$$$$$$$$$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$$$$$$$$$$$$$$$$$$$$$$$!$!$$", "!!$!$######################!$!$$", "!!$!$$!!!!!!!!!!!!!!!!!!!!!!$!$$", "!!$!$#$$$$$$$$$$$$$$$$$$$$$$$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", "!!$!$%%%%%%%%%%%%%%%%%%%%%%!$!$$", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_15.xpm0100644000175000017500000000316707041513602020631 0ustar aaronlaaronl/* XPM */ static char *block_15[] = { /* width height ncolors chars_per_pixel */ "32 32 18 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #c0c0c0", "% c #cc66ff", "& c #555555", "' c #cc9966", "( c #ffcc66", ") c #ffccff", "* c #333300", "+ c #663300", ", c #993300", "- c #333399", ". c #996600", "/ c #cc6600", "0 c #663399", "1 c #808080", "2 c None", "3 c #666699", /* pixels */ "$$$$$$$$$$$)$$$$$$$$$$$$$$$$$$$$", "11111111111%11111111111111111111", "!!!!!)!!!!!#********#!!!!303!!!!", "***!))3!***&########&***!%30!***", "**!)%)33!**#########&***!%)-!***", "#*)%3)033*#&#&&&&&&&&**#*%)-*###", "*)%30)--03*&##&&&&&&&**#*%)-*###", "****3)-****&###&&&&&&****3)-****", "&&&#%)-#&&&1&1111111&*)%30)--03*", "&&&#%)-#&&&1&1111111&#*)%3)033*&", "&&&#%)-#&&&1&1111111&##*)%)33#&&", "&&&#%3-#&&&1&1111111&##&#))3#&&&", "111&3-0&111$1111111111111&)&1111", "&&&#####&&&1&&&&&&&&&&&&&&##&&&&", "++++++++++++++++++++++++++++++++", ",.''/////''////+,./''//'///////+", ",/..''/////''//+,/../'//('/////+", ",''''(('''''(('+,''''(('((''(''+", "++++++,,+,++,+++++++++,,+++++,,+", "+,.,,,..,+++,+/++..,,,..,+,..,/+", "+,..,....+,..,/++...,...++...,/+", "+...,....,...,/++...,...+,..../+", "++++++++++++++++++++++++++++++++", "++++++++++++++++++++++++++++++++", "/''////+,'''////''''///+,.''////", "///''//+,'//''////'''//+,/..''//", "''''(('+,'''((''''''(('+,''''(('", "+++++,,++++++++++++++,,+++++++,,", ",+,..,/++,,,.,.+,,,,+,/++..,+,..", ".+...,/++,.....,....,,/++...,...", ".,..../++,.....,....,./++...,...", "++++++++++++++++++++++++++++++++", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_16.xpm0100644000175000017500000000275707041513602020636 0ustar aaronlaaronl/* XPM */ static char *block_16[] = { /* width height ncolors chars_per_pixel */ "32 32 10 1 0 0", /* colors */ "! c #000000", "# c #cc9966", "$ c #ffcc66", "% c #ffccff", "& c #333300", "' c #663300", "( c #993300", ") c #996600", "* c #cc6600", "+ c None", /* pixels */ "!%$$$$$$$$$$$$$$$$$$%$$$$$$$$$$*", "!$%$$################$########*(", "!$$((((()))((((()*****#******)('", "!$$((()******))((()****#*)****''", "!$#(***)()******)(((******(***''", "!$#(****)'()*******)(******(**''", "!$#)*****)''(********)******)*''", "!$#*******)('(***)****)*******''", "!$#*)*******)')***(****)****)*''", "!$#**()******)(*)**)****(****)''", "!$#**)(***)****)*)*******()***'&", "!$#****)***()*****()*****)(()*''", "!$#*********))****)((()***)(((''", "!$*('''''&'''&&'''''&&''''''&&&'", "!*('''''''&''''&&'''''&&''''''&&", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "%%$%$$$$$$$$$$$$*!%$$$$$$$$$$$$$", "#$$#$##########*(!$%$$##########", "**##*#*********('!$$()(())**)(()", ")**##*#********''!$$(**)(*****)(", "(***#*******)**''!$#(****)*****)", ")(***#*******(*''!$#(***********", "**(***#*)****)(''!$#(***********", "***)*****()***)''!$#))**********", "*********)')***''!$#)()******)**", "******)***)(***''!$#*)')**)***)*", ")******()***)*)''!$#**)'()*)***(", "(()****)((()*)(''!$#***('((*(**)", ")((()***)((((('&'!$#***)(''()()*", "'''&'''''''''&&&'!$*(''''&&&''&'", "''''&''''''''''&&!*(''''''&&&'''", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_17.xpm0100644000175000017500000000271407041513602020630 0ustar aaronlaaronl/* XPM */ static char *block_17[] = { /* width height ncolors chars_per_pixel */ "32 32 8 1 0 0", /* colors */ "! c #000080", "# c #cc66ff", "$ c #660000", "% c #333399", "& c #663399", "' c None", "( c #666699", ") c #330066", /* pixels */ "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#%&&&&&&&&&&&&&&&&&&&#!%&#$$", "#!%&#)!%%%%%%%%%%%%%%%%%%#!%&#$$", "#!%&#&((##################!%&#$$", "#!%&#%&&(((((((((((((((((#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#%&&&&&&&&&&&&&&&&&&&#!%&#$$", "#!%&#)!%%%%%%%%%%%%%%%%%%#!%&#$$", "#!%&#&((##################!%&#$$", "#!%&#%&&(((((((((((((((((#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#%&&&&&&&&&&&&&&&&&&&#!%&#$$", "#!%&#)!%%%%%%%%%%%%%%%%%%#!%&#$$", "#!%&#&((##################!%&#$$", "#!%&#%&&(((((((((((((((((#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", "#!%&#''''''''''''''''''''#!%&#$$", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_18.xpm0100644000175000017500000000312507041513602020626 0ustar aaronlaaronl/* XPM */ static char *block_18[] = { /* width height ncolors chars_per_pixel */ "32 32 16 1 0 0", /* colors */ "! c #000000", "# c #800000", "$ c #333366", "% c #555555", "& c #cc9966", "' c #ffcc66", "( c #ffccff", ") c #660000", "* c #333300", "+ c #663300", ", c #993300", "- c #996600", ". c #cc6600", "/ c #ff6600", "0 c #808080", "1 c None", /* pixels */ "(''''''''''''''''''(''''''''''.!", "'(''&&&&&&&&&&&&&&&&'&&&&&&&&.,!", "'',,,,,---,,,,'-.....&......-,+!", "'',,,-......-''.,-....&.-....++!", "'&,...-,-..-'''..,,......,...++!", "'&,....-+,-''.'-..-,......,..++!", "'&-.....-+''.-',,-.--......-.++!", "'&.......-+++.',++++--.......++!", "'&.-.......-,'',+,....-....-.++!", "'&..,-......-'',+.-....,....-++!", "'&..-,...-...'',+.......,-...+*!", "'&....-...,-.'.-+,-.....-,,-.++!", "'&.........--.-.+-,,,-...-,,,++!", "'.,+++++*+++****+++**++++++***+!", ".,+++++++*++++**+++++**++++++**!", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", "$$$'''''$$$$''.,!(0%%%%$$'''''$$", "$$$'''''$$$$'',)!0(0%%$$$'''''$$", "**/////*****//##!%0$****/////***", "*/////*****///##!%%****/////****", "/////*****////##!%%***/////*****", "////*****/////!!!%$**/////*****/", "///*****/////*!!!$$*/////*****//", "//*****/////**!!!$$/////*****///", "/*****/////***!!!''////*****////", "*****/////****!!!''///*****/////", "****/////*****!!!''//*****/////*", "***/////******!!!''/*****/////**", "**/////*******!!!''*****/////***", "!#####!!!!!!!!*!!$%*!!!#####!!!!", "!#####!!!!!!!!!*!%*!!!!#####!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_19.xpm0100644000175000017500000000302107041513602020622 0ustar aaronlaaronl/* XPM */ static char *block_19[] = { /* width height ncolors chars_per_pixel */ "32 32 12 1 0 0", /* colors */ "! c #333366", "# c #c0c0c0", "$ c #555555", "% c #cc9966", "& c #ffcc66", "' c #333300", "( c #663300", ") c #993300", "* c #996600", "+ c #cc6600", ", c #808080", "- c None", /* pixels */ "*%&&&&&&&&&&&&&&&&&&&&&&&&&&&+*(", "%&&&&&%%%%%%%%%%%%%%%%%%%%%%%%+*", "&&&%%%%%%%%%%%%%%%%%%%%%%%%%%%%+", "&&%%%%%%%%%%%%%%%%%&&&&%%%%%%%%%", "%&%%%%%%%%%%%%%%&&&*((*&&%%%%%%+", "+%&&&%%%%%%%%%&&*(()))((*&&&%%%*", "++%+*&&&&&&&&&)()))***)))())&&&(", "+++%)(((((((((())*******))((((+(", "+++%*))))))))))*+)***)***))))%((", "+++%******++*)+*++*))*+)+++++%((", "++%+*)+++*++++*+*++**+++)*++%)((", "+%%**+*+++)*++++++++++++*)))+(((", "&%+*+++++++*++++*)('''()*+++*(((", "%+)()*++++*)(''''''(((''''''(*((", "+)(('''''''''((((((((((((((('(*(", "''''''''''''''''''''''''''''''''", "!!!!!!!'!!!!!!!!!!!!!!!'!!!!!!!!", ",$$$$!!',,$$,,,$,$$$$!!',,$$,,,$", "$$$$!!!',,,$$#$$$$,,$$$',,,$$#$$", "!$#$!!!'#$$#,,,$$,#,$$$'#,,#,,,$", "$$$!$!!'#$$$$,$$,,,$$!!'#$$$$,$$", ",,$!!!$'#$$$,$$$,,$!!!$'#$$$,$$$", "$$!!$$$'#!!$$$!$$$!!$$$'#!!$$$!$", "!!''!!!'!''!!!'!!!''!!!'!''!!!'!", "########,$,$$!!'########,$,$$!!'", "##,,###,#,,,,$!'##,,###,#,,,,$!'", "###,,#,,,,,,$$$'###,,#,,,,,,$$$'", "#,,#,,,$$,#,$$$'#,,#,,,$$,#,$$$'", "#$$$$,$$,,,$$!!'#$$$$,$$,,,$$!!'", "#$$$,$$$,,$!!!$'#$$$,$$$,,$!!!$'", "#!!$$$!$$$!!$$$'#!!$$$!$$$!!$$$'", "!''!!!'!!!''!!!'!''!!!'!!!''!!!'", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_20.xpm0100644000175000017500000000275707041513602020631 0ustar aaronlaaronl/* XPM */ static char *block_20[] = { /* width height ncolors chars_per_pixel */ "32 32 10 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #c0c0c0", "% c #555555", "& c #333300", "' c #663300", "( c #993300", ") c #996600", "* c #808080", "+ c None", /* pixels */ "++++++++#&&++++++++++#&&++++++++", "++++++++%#&++++++++++%#&++++++++", "++++++++%#&++++++++++%#&++++++++", "++++++++%#&++++++++++##&++++++++", "++*$#+++##&++++++++++##&+++#$*++", "++$*%+++'#&'++++++++''#&(++%*$++", "++#%&###%''***********(''#&&%#++", "+*$#%%%%%('%%%%%%%%%%%'(%%#&#$*+", "+$*%&+++(&&+&+++++++&'&&'++&%*$+", "+#%&++++#&&++++++++++#&&++++&%#+", "++++++++%#&++++++++++%#&++++++++", "++++++++#%&++++++++++%#&++++++++", "++++++++&%&++++++++++%#&++++++++", "++++++++&#%++++++++++%#&++++++++", "++++++++#&%++++++++++##&++++#$*+", "++*$#+++#&%++++++++++##&++++%*$+", "++$*%++'##&'++++++++'##&+'+&&%#+", "++#%&#**(%'&&+++++++&(%'*%#&#$*+", "+*$#%%%%'($$$$$$$$$$$$((%%#&%*$+", "+$*%&+&+&#'%%%%%%%%%%'#&+&++&%#+", "+#%&++++&&&&++++++++&&&&++++++++", "++++++++#&&++++++++++#&&++++++++", "++++++++%#&++++++++++%#&++++++++", "++++++++%#&++++++++++%#+++++++++", "++++++++%#&++++++++++%#+++++++++", "++++++++##&++++++++++##&+++#$*++", "++*$#+++##&++++++++++##&+++%*$++", "++$*%+++##&'++++++++&##&'++&%#++", "++#%&###(%'*****%#&&'&#('#&&#$*+", "+*$###&&&(&&&&####%%%')'%%#&%*$+", "+$*%!&##''(##########)''&&&+&%#+", "+#%&!!!&'&&'&!!!!!!&'&&&'&++++++", }; xevil-2.02r2.orig/x11/gen_xpm/world/block_21.xpm0100644000175000017500000000302107041513602020613 0ustar aaronlaaronl/* XPM */ static char *block_21[] = { /* width height ncolors chars_per_pixel */ "32 32 12 1 0 0", /* colors */ "! c #333366", "# c #c0c0c0", "$ c #555555", "% c #cc9966", "& c #ffcc66", "' c #333300", "( c #663300", ") c #993300", "* c #996600", "+ c #cc6600", ", c #808080", "- c None", /* pixels */ "%&&&&&&&&&&&&&&&%&&&&&&&&&&&&&&%", "&&&&%%%%%%%%%%&((&&&%%%%%%%%%%&(", "+&&%%%%%%%%%&&(('&&%%%%%%%%%%&('", "++&&&&&&&&&&(&(''+&&%&&%%%%%&&''", "+++&(((((((((&''(++&&((&%%%&(&'(", "+++&((((*)))(&''(++&%(((&&&((&'(", "+++%(*))))*)(&'((++%())((((((&'(", "+++%(***))**)&'((+%%()))))))(&'(", "+%+%*+***)*+)&'((%+%())*))))*&'(", "%++%+*+)++++)&'((++%(*****+*+&'(", "+++%*++*)*++(%'((%+%()+++*++%%'(", "++%%()++*))('+'((+%%(+*((''''+'(", "+%&)'(()))('(*('(+&)''''('''(*('", "%&)'''''''''''*('&)'''''((('''*(", "&)''(((((((((''*()''(((((((((''*", "&)''(((((((((('()('(((((((((((''", "!!!!!!!'!!!!!!!!'!!!!!!'!!!!!!!!", ",$$$$!!',,$$,,,$,'!!!!!',,$$,,,$", "$$$$!!!',,,$$#$$$$!$!!!',,,$$#$$", "!$#$!!!'#$$#,,,$$,#!$!!'#,,#,,,$", "$$$!$!!'#$$$$,$$,,,$!!!'#$$$$,$$", ",,$!!!$'#$$$,$$$,,$!!!$'#$$$,$$$", "$$!!$$$'#!!$$$!$$$!!$$!'#!!$$$!$", "!!''!!!'!''!!!'!!!''!!!'!''!!!'!", "########,$,$$!!'########,$,$$!!'", "##,,###,#,,,,$!'##,,###,#,,,,$!'", "###,,#,,,,,,$$$'###,,#,,,,,,$$$'", "#,,#,,,$$,#,$$$'#,,#,,,$$,#,$$$'", "#$$$$,$$,,,$$!!'#$$$$,$$,,,$$!!'", "#$$$,$$$,,$!!!$'#$$$,$$$,,$!!!$'", "#!!$$$!$$$!!$$$'#!!$$$!$$$!!$$$'", "!''!!!'!!!''!!!'!''!!!'!!!''!!!'", }; xevil-2.02r2.orig/x11/gen_xpm/world/background_0.xpm0100644000175000017500000002570107041513602021566 0ustar aaronlaaronl/* XPM */ static char *background_0[] = { /* width height ncolors chars_per_pixel */ "100 100 27 1 0 0", /* colors */ "! c #000000", "# c #800000", "$ c #333366", "% c #008080", "& c #336666", "' c #666666", "( c #996666", ") c #cc6666", "* c #3399ff", "+ c #999966", ", c #555555", "- c #6699ff", ". c #66ccff", "/ c #99ccff", "0 c #330000", "1 c #660000", "2 c #ccffff", "3 c #333300", "4 c #663300", "5 c #666600", "6 c #996600", "7 c #336699", "8 c #339999", "9 c #669999", ": c #cc9999", "; c #808080", "< c #666699", /* pixels */ "!!!!!!!!!!!3333!!!!!!!!!33!!!!3333$3!!!!!33$&&&!!!4!4444333&&33344433!!!3&$!!!&&&3!!!!!!!!33&&3333!!", "!!!!!!!!!!333333!3!!!333!33333333&33!!!!333!!33!!!444#44333$&33344443!!!!3&&!!!3&&3!!!!!!3&&&3!3!!!!", "!!!!!!!!!!3!333!!!3!33333333!333&3!!!3!!!!!!!!!!!34444443!!&&&3!34443!3!!!!&&3!!3<&!!!!!3$&$3!!3333!", "33!!!!!!!!!!3333!!!!$33333&3!333!!333333!!!!!!!3444444443!3&&33!044443!!!!!!&&3!!!'$33!!!$&3!!!33&$3", "&$3!!!!!!!!!3333!!!3,&!333&$33!!!3&3333!3!3!33444444##43!!3&&$3!044440!!!!!!!&9!!!3&333!33!!!!!3$&&&", "&&&3!!!!!!!!3333!3!!33!!3&&93!!$&3$!!3!!!!3!344444444430!!3&&&!!!44444!!!!!!!!&9&!!3&3&3!!3!!3!!3&&&", "&&&&333!!!!!333333!!33!!3&33$&!&'!!!343303,345#44444#443!!3!$&!!334444!!!!!!!!!&93!!33!%3!!!!!!!33&&", "&&&&$$$333!!!33333!!33$!!33!!!!&&!!3444444,444444444444333!!!!!!344444!!!!!3!!!!79!!!3!%%!!!!!3!!33&", "&&&&&&&&$&3!3333$!!!!&'$!$333!!$&!34444444444444444444443333!!!!344#443!3!!3&!!!39 c #660000", "? c #ccffff", "@ c #ff6666", "A c #333300", "B c #663300", "C c #993300", "D c #336600", "E c #666600", "F c #777777", "G c #996600", "H c #868686", "I c #336699", "J c #996699", "K c #cc6699", "L c #b2b2b2", "M c #339900", "N c #669900", "O c #339999", "P c #669999", "Q c #cc9999", "R c #ff9999", "S c #fffbf0", "T c #33cc00", "U c #66cc00", "V c #a0a0a4", "W c #66cc66", "X c #808080", "Y c #ff0000", "Z c #00ff00", "[ c #cccc99", "] c #ffcc99", "^ c None", "_ c #66cc99", "` c #ffffff", "a c #666699", "b c #330066", /* pixels */ "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "^^^^^^33P.555-.33-335&XP55&553-555XP35.35&5XP355-553-333-53.35&535&3.55-353-55.5-X-335&5.X&55.PX&55.35&553_X&555-553-53.55.P.55-555-353-353.55&3X-5.55-..35&555&335&XX&533-3X-53PX-553-355.P55-X-53.35-333&55.a55-XX&553.3-333&5XP55&553-555XP35.35&5XP355-553-333-53.35&535&3.55-353-55.5-X-335&5.X&55.PX&55.35&553_X&555-553-53.55.P.55-555-353-353.5533^^^^^^", "^^^^^^5&X_P-A&&&3PPa.-PP-A-X-&&A&Aa_-&&-&A&&&---.&--&X_PP.&&-A&.X----&A&&A&A&&.&&&&-X-&&&A&A&&X_-A&._P-A&&-&A&--A&AaX&&&A&.a3&.LPPX.-&A&X__P&A&A&A&_P-.PPP-A&A&A&---X-&A&&&&&A&AaP&A&-X&A&&PA&-&--aPP&&.I&A&A&A&A&X_X-&&&&3PPX.-PP-A-X-&&A&Aa_-&&-&A&&&---.&--&X_PP.&&-A&.X----&A&&A&A&&.&&&&-X-&&&A&A&&X_-A&._P-A&&-&A&--A&AaX&&&A&.a3&.LPPX.-&A&X__P&&55^^^^^^", "^^^^^^.3---&&AAAA&.A&AA.-&A-&A&&AAAX&A&-A&APP-&&&&-.AA---a-&.&A-aAA-P-&A&-A&AAa-&3--&AA3-&AA&&-_P-A&-XH-AA-&AAA&&AAA--.-AAaLaA&&A!A&&&&AA&aP&A-X-&AAAAA&A3a33-&&A&AA&3&&AAA.Pa&A-L_&AAa&AAA&A&P-AAA-.&A&PP3-.&AAA&&--&AAAAA&-&&AA.-&A-&A&&AAAX&A&-A&APP-&&&&-.AA---a-&.&A-aAA-P-&A&-A&AAa-&3--&AA3-&AA&&-_P-A&-XH-AA-&AAA&&AAA--.-AAaLaA&&A!A&&&&AA&aP-A-X^^^^^^", "^^^^^^a-&A&--&!!!!&&!!!!&!!&!!!!!!!-&!!&&!!--&A!!!-P!!!&!&&&a&!&X!!!PP!&---!!!!&&!--&!!-.&!&-!!&X-!!!&--&&Pa&&!A!!!!&&-a!!!P.!!.!A!!&!!!!!&1&!!aPA!!!!!!!!!&!&-&A!!!!!!-&!!&-..!!PP&!!P-!!!!!!.P&!!!--!!-P-aV-!!&-!!&-I&!!!!&&!!!!&!!&!!!!!!!-&!!&&!!--&A!!!-P!!!&!&&&a&!&X!!!PP!&---!!!!&&!--&!!-.&!&-!!&X-!!!&--&&Pa&&!A!!!!&&-a!!!P.!!.!A!!&!!!!!&1&&&3^^^^^^", "^^^^^^5-A!&&&&!!!!!!!&!!!!!!!!!A!!!&A!!!!!!!!!!!!!&&&!!!!!!!A!!!&!!!&-!!!!&&!!!!!!!&A!!!&!!!!!!!!!!!!!!!!&A&-&&!!!!!!!!!!!!!!!&-5!!&A!!!!!&&!!!!&&!&!&&!!!!!!!!!!!!&!!!!!!!!!!!!!&!!!!3&!!!!!!!&A!&!!&&!!!!!-!!!!!!!!&&&!!!!!!!&!!!!!!!!!A!!!&A!!!!!!!!!!!!!&&&!!!!!!!A!!!&!!!&-!!!!&&!!!!!!!&A!!!&!!!!!!!!!!!!!!!!&A&-&&!!!!!!!!!!!!!!!&-5!!&A!!!!!&&&A&5^^^^^^", "^^^^^^5&A!!!!!!!!!&!!!!!&A!&A!!!&!!!&&!!!!!!!!&!!!!!!!!!!!!!!!!!&!!!!A!!!!!A&!!A!!!!!&!!!!!!&!!!!&!!!!!!!!!!!!A&!!!!!!!&!!!!!!!!&&!!&!&!!!!&A!!!!!!!!!&&!!!!!!!&&!!!!!!!!!!!!!!!!!&!!!&&&!!!!!!!!!!&!!&!!!!!!!!!!!!!!!!!!!!!&!!!!!&A!&A!!!&!!!&&!!!!!!!!&!!!!!!!!!!!!!!!!!&!!!!A!!!!!A&!!A!!!!!&!!!!!!&!!!!&!!!!!!!!!!!!A&!!!!!!!&!!!!!!!!&&!!&!&!!!!&-&A5^^^^^^", "^^^^^^5&A&-A&!!!!!&!!!!!!&&!&-!!A!!!!&!!!!!!!!&!!!!!!!!!!!!!!!!!!&!!!!&!!!!&A&!&!!!!!!A!!!!!A!!!!&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&!!!!&!!!!!!&!!AA!!&!!!!!&&!!!!!&&!!!!!!!!!!!!!!&!!!&!!!!!!!!!!!&!!!!!!!!!!!!!&A!!!!!&!!!!!!&&!&-!!A!!!!&!!!!!!!!&!!!!!!!!!!!!!!!!!!&!!!!&!!!!&A&!&!!!!!!A!!!!!A!!!!&!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&!!!A--&5^^^^^^", "^^^^^^3&A!&&&&-!!!!&&A!!!!!!!!&!&!!!!!!!!!!!!!!-!!!!&!!!!!&!!!!!!!!!!!&!!!!!&!!!!!!!!!!&&!!!!!!!!!&!!!!!!!!!!!!!&A&&&!A&!!!!!&!!!!!!!!!!!!!!!!!!!!!&!!&&!!!!!!!!A!!&!!!A&&!!!!!!!!!!!!!!!!!!&&&!!!!!!!!!&&!!&!!!!!!!!&&--!!!!&&A!!!!!!!!&!&!!!!!!!!!!!!!!-!!!!&!!!!!&!!!!!!!!!!!&!!!!!&!!!!!!!!!!&&!!!!!!!!!&!!!!!!!!!!!!!&A&&&!A&!!!!!&!!!!!!!!!!!!!!--A5^^^^^^", "^^^^^^5A&!!!!!-55535555555555355555555535555535555555535355555555535555555535555555555555555535553555555555555535555555555555555555555335553355555355555555555555555555555555555555555553555555555555553555355355555355555553555555555535555555553555553555555553535555555553555555553555555555555555553555355555555555553555555555555555555555533!!!!&-aX^^^^^^", "^^^^^^&&A!!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!&!!-XP^^^^^^", "^^^^^^3A&A!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!A!&A&5^^^^^^", "^^^^^^Xa-!!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5&!!!-aA&^^^^^^", "^^^^^^X.P&!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!!!Pa5^^^^^^", "^^^^^^&&X-!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!!AX_.^^^^^^", "^^^^^^5&-a&!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!3!!!!!APa^^^^^^", "^^^^^^3&A-&&&!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!!!A&3^^^^^^", "^^^^^^5AA!!!A!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!&-&A&^^^^^^", "^^^^^^5&A!!!!&!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!AP.&5^^^^^^", "^^^^^^PX-A!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!!&P-5^^^^^^", "^^^^^^-a-!!!&!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!!!-XX^^^^^^", "^^^^^^5-&A!!-!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!!A&.P^^^^^^", "^^^^^^.P.!!!!--5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!&&!A&3^^^^^^", "^^^^^^5&IA!!!!&5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!!&&A5^^^^^^", "^^^^^^5&A&!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5&!!!!A&3^^^^^^", "^^^^^^..a.IA!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!&!!AA&&^^^^^^", "^^^^^^aX--.&&!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!A&!!&&5^^^^^^", "^^^^^^&&&!!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!A!!AA3^^^^^^", "^^^^^^5AAA!!&!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5&&&&-&&5^^^^^^", "^^^^^^5&&!!!!&!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!A&!-.&5^^^^^^", "^^^^^^3A-&!!&&!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!!!!!!!!!!!!!!!!!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!!AA&&^^^^^^", "^^^^^^.&-&!!!-!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!!!!!!!=!!!!!A!!!!!!!!!!!!!!!!!!!!!!!!!=!!=!!!=!!!!!!!!!!!=!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!!!A-3^^^^^^", "^^^^^^X&--!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!A!=!!!=!=!!!!!!=!A=!!!=!=!!=!!!!!!!!=!!!!!=!!!!A!!!=!!=!!!=!!!!!!!=!!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!T$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!&&&&PX^^^^^^", "^^^^^^-&&.&!!-!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!=!!!!!!!!!!!!!!!=!!!!!=!=A!!!!!!A=!=!!=!!!!!!!=!!!!!!!!!A!!!=A=!!=!!=!!!!=!!=!!!=!=!!!!!!=!!=!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!TT$A!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!-A-&.-^^^^^^", "^^^^^^3A&-&!!&&5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!!!!!=!!!=!!!!=!=!!!=!!=!!!!=A==!=!!!!!=!!!=!!!!!!!!!!!!=!!!=!=!!!=!!=!!!!=!!!!!=!!!!!!!!=!!!A!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$TD//GA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!&!!A&5^^^^^^", "^^^^^^a--!!!!A-5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!=!=!=!!!=!!!=!!!!!!=!!!!!!!=!!!A=!=!=!==!!=!!!!!=!!!!!!!!!=!=!=!===!=!!=!=!!!!!=!!!=!=!!=!!!!=!==!!!!=!=!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$TF000TUMA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!A!!&A5^^^^^^", "^^^^^^5&&-&!!!-5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!!!!!!!!!!!!!!!!!!!!!!!!=!!=!=!=!==!=!=!=!!!==!=!=!!!=!!!!!!!!=!!=!=!!!!!!!!!!!!!!!!!!!!!!!!!=!=!!!!=!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!D$2QXQX@880A!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!&&!A&X^^^^^^", "^^^^^^5A&!!!!!&5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!!!!!!!!!!!!!!!!!!!!!=!!!!!!!!!!!!!!!!!!!!!!!!A!!!!=!=!===!=!=A=A!=!!!!!!!!!!!!!=!!!=!!!!=!=!=!!!!!!!!!!!!!!!!=!!!!!!==!!=!!=!A==!=!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$T2L+L+X/88B!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!&&-A&.^^^^^^", "^^^^^^5&A!!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!=!!A!!=!=!=!!!!!!!!!!!!=!!!!!!=!!!!!!!!!!!!!!=!!!!!!!=&=!=!=!=&AA==&===!=!==AAA!!!!!!!!!A!!!=!=!!!!!!!!!!!!!!=!!!!!!!=A=!=!=!!AA==!A=!!!=!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!D$F+((((-50B!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!&-&&5^^^^^^", "^^^^^^3--A!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!!!!=!!=!!!!!!=!=!!!!=!!!!!=!!=!!!!!!!!!!A!!&A!!!!!!!!!!!A!=!&&=====!==A!==!DTTTTTD=!=!!=!=!!=!!!!!!!!!!!&=!&A!!!!!!!!!!!&!=!A&=====!==!==!=!!=!!=!!!!!!!DDMMDD!!!!!!!!!!!!!!!!!!!$M%:((((&&0'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!!!AA5^^^^^^", "^^^^^^-X-&!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!=!A=!!=!=!=!=!!!!!=!!!!!=!A!!!!!!!!!!!!&!!!!!!=!=!=!=!=!A======A==A====!==!ATTE%.000)A!!!!&!=!!=!!!!!!!&!!!!!!=!=!=!=!=!A!==!==!==A!==!==!=!!=!!!!A!!=!!=!$$$$MMDDMMM!!A!!!!!!!!!!AT%QO((((&)B!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!!AA&&^^^^^^", "^^^^^^.PP.-!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!A=!=!!!=A!=!!=!!!=!!!=!!!=!!!!!!!!!=!AD=!!!!!=!!=!=!=!A!===!!=!=&A!=!===5====!==!==D$$EF%800GB!!!!=!!=!!!=!!!=!!==!=!==!===!=!!=&A=!===A5====!=!!=!==!!=!=!!!!!$!!=!D$DQ[Q7%//)!!!!!!!=!!!!TD0_(((-&.*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!&&!!&A3^^^^^^", "^^^^^^3a.&!&A!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=A!AA!!!!!!=!!!==!=!=!=A!==!!=!!!!!!!!!!!!!TT$!=!!!!!!!!=!=!bA=!&A==!=!=!=!=!!==A====!=&=!=A!E53'&./)!!!!!=!&==!!!!!!!!!=!==&A=!&A=!==!=!==!!!====!====A=!=!=!!!!!!!!AT$!!$TT1[__,X888B!=!=!!!=!==T$8a((((&)0!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!&!!A&5^^^^^^", "^^^^^^3-I!!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!TTUNNMD!!!!!=!!==!==!=!=!=!=&=!=!&=!=!!!DTT$$A!=!=!!!!!!=!=!=A=======!=!!=!==!========AAAD$D-DMTE/.*=!!!!!=!====!=!!!!!!=!!!=A=======!=!!!!=!=!====!=!===!=!'==!!'!!AT$!$TMLS?P(((.'8'!!!!=!=!=!!D$0&+(((&58!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!A&&&A5^^^^^^", "^^^^^^3-V-!!!&&5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!!=DT$<]R88/B!!!!!==!==!=A'A====!==!!A!!5!ATTM$$A==!=!!!!5=!=!A!======!=!=!!=!!!!======!ATTTWWW7[9L[//'85!!!!!!=!=!=!=!!!5=!=!&=!======!!=!=!=!!=!===!===A'&====!=!=!A!!&M$$T$[S_(((((&&/)!!=!A!!=!!=!M%/+I((&58=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!&&PX-3^^^^^^", "^^^^^^5&P-!!!!-5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!AAA!!A!ATT2S(PLR880B!=!=!==!=!=A===!===!!==!!&$TTDEED==!=!=!==!=!&===5DM$DAA!=!!=!!!!=!=!==!=TT1SS+++L___F058&!!!&!!!===!=!!==!=!5!=!5=!=!=!==!!!!!!!!==!===!==A=======!!!=!!5T$272`P((((((-&'BA!&!!=&!=!=!AD0<(((&&8A!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!!-.aP^^^^^^", "^^^^^^&Aa&!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ATTTNUUMTTT1S,((((V888'!!!=A!=!A===A======DA!A$TTM//.EA!=!=!!!!!!!==!=!=M$%2%1UUMD$D!A=!!=====!T$]:(((((((((5&8=!!!=!&!!=!=!=!!!!!=!======&=!=5A==!!!!=!!====!=&===A=======!=!!$TD8XVV(((((((&&0B!=!==!=!=A!!!TDSO((-&0'!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!!AA-X^^^^^^", "^^^^^^5&--!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$DEE0R+]<]L(((((-a/88B!=!==!=====5!=A=!DT$TTTM%808.&B!=!==!=!!!=!=====M$.8KS<]]R021NUUTMMMMMTT-S((((((((((&&8A!!!!=!=!=!=!=!!!!=!==========!=!=&===!!=!!!===!====5!=A==!==!==D$E8/.3-_(((&&&&0A=!====A==!==AT$](((-&0)!!!!!=!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!&!A&-^^^^^^", "^^^^^^3A-&!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!DD300XPOIO(O(((((-'8)!!!=!==!==A!=AA=ATTL]888880''A!!!!!!!!!!!!=!=!==D$%./V(PP_,++S<]<]]+]+]+]S((((((((((&&8B!&!=!!!!!!!=!!!!!!=!=!==A==='===A!==!=!!!!==!!====A==AA====!==!$M.0&&&&X(((-&&&*B!!!!!=!A===&DTD`O(((&'8!=!=!!!=!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!&&&&A5^^^^^^", "^^^^^^P&X!!!&!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!!E/5V_-((a-P((((&&00=!=!!!!=====A5=ATT1]XI880)&0B!!!!=!!!!!!!!!!!=!==AE)&XP(((((((((POPPPPPPPO((((((((((-&0B!=!&=!!!!!=!!!!!A$D!!=!===!=!=!=!=!=!!!!!!!!!=!!====A5=======!=!!E)5&&&&&-&&&&5/A!=!=!===!=!=T$[S((((&'8A!!!!!!!!=!!=A!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!!!!A&5^^^^^^", "^^^^^^3-P-!!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!A!!!A!!!!DTEQP(P.Oa_((((&&'8=!!!=!!!=====AATT1R0-&&&&&0>!=!!!$D!&!!!&!!!!!=!!=AD0&+(((((((((((((((((((((((((((((&&0)!!==!=!!!!!!&!!!TTEEB!=!!==!==!=!=!='==!!!!=!!=!=====A========!=&!AE333.&&&&&0ADA!!!!!!!=!=!ATDSP(((--&8)!!!!!=!!!=!!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!&-&!A&3^^^^^^", "^^^^^^5&.P!!!A&5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!=!!!=!!!=!!!&!=!DE/P(aPX.P((((-&&0A!!!!!!=!===ADTTN]QF&&&&&0A=!!=DTTMDA!=!!!'!=!!=!!!$E/+(((((((((-&-&-&-((((((((((((((&/8B=!=!!==!!!!!!=AT$000EA=!!!=!=!!=!=!!!=!!!!!!!!=!===A=A=====!==!A=!!DT$05&&&5)B!!!&!!!=!!!=!ATDS((((&&&0)!=!!!!=!=!=!=!!!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!&&-A&3^^^^^^", "^^^^^^5A-a-!!!!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!=!!!!=!!=!!!&!$$F.----I3_(((&&0'===!!!!=!===DTT2SQP-&&&5*!=!!DTTMDDDA!=!=!!!5!!!!!=A$/[P((((((&&&&&&&&&&&-(((((((((((3'88A!!!=!=!!=!=!=AT1@/08DA=!=!!!!=!!!!==!&===!!!!=!==========!==!!!!!MT$%0&'B&A&A!!!!!5!!!!!!!!T1:((((&&&'C=!!!!!!!!=!A!=!=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5!!AAP-A-^^^^^^", "^^^^^^.&&-.!!&!5!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!A&=A!!=!=!==!=!=!TTTE.&&XX3.L(((&&0B!!!=!!!!!=!TTM[`,((-&&')!AD$TTM.%.DB>===!=!!!!!!A!!!TE====!==!=!!!D$0XP(((&08=!!=!=!AT$[:((((-&&/#!!!!=&=5!===T$]P(((((((-&&/#=!!!!=!!!!=!=$T2+((((&&&0B====BAB=A====!'&!5=====A=!=A!=!=!!!!!!!!!!!!!!!!!!!!5!!!!---5^^^^^^", "^^^^^^5&A!!!!!!5!!!!!!!!!!!!!!!!!!A!=!==!===!=A====='========!'&=!=!=!=!!!!!=!=!!=!ATT1S:((((((((((((((((&08B!!!!!!=A!=======!'&=!=!=!=!!!!!DT1S(((((P++<]+]+][400F%A=ADTTT2[[VP_,+_((I/880B=!'&=!=!!!!!TE/+(((&'8'!=!!5!TT1SP((((&&&0=!!=!!!!A====T$]O(((((((-&&0=!=!=!!DTTM$D$TM[,(((-&&.'!!!5=='======!==!=A!====&===!=!=!!A!!!!!!!!!!!!!!!!!!5!!!!&&A5^^^^^^", "^^^^^^5A&!!!!!!5!!!!!!!!!!!!!!!!!=!!A!=!==!=!A!=AA==BA=5=A====B========!=!5=!!!!5!!TT1S+(((((((((((((((((-588A!!=!=!AA=&=A====B========!=!5=DT2+(((((OPPPOPPPPO_,[888/TTUL]`+____O(((((-508'==B======!!!D$8L(((-&08=!=!!DT$S+(((((&&50!!!!!=!A==AA=T$]P(((((((-&')!!===!=!D$$$D$M[S_((((&5*A!'5=====A======!=A==AA==BA=&=A=!!=!!!!!!!!!!!!!!!!!!!5&!!!-P3-^^^^^^", "^^^^^^5&AA!!&!!5!!!!!!!!!!!!!!!!A!=!=AA=!===='=============A===55====!==!!!!=!=&!ATT1S+(((((((((((((((((((-'80=!!==========A===55====!==!!T!$M[_((((((((((((((((((P+]]<]`:+(((((((((((&&&&0C===55===!!=!A$/VP(((&'8B=!=ATTLS(((((-&&'B!!!!!!=&!====M$R_(((((((-&/E!A!!==!!!!!!!M$[_(((((&5*!=!==5AB==AB=====!'!=========!=!A!!!A!!!!!!!!!!!!!!!!!5&!!!&PXP^^^^^^", "^^^^^^X-I&!!!!-5!!!!!!!!!!!!!!!!!!!!A=!A==A=!!==A=A======A===============!=!!b=!=DTES:(((((((((((((((((((((&08)=A!A======A===============MT$DML_(((((-(-(-(((((((((IOOIOO(((((((((((-&&&&&)'==========!=!TE/+(((-&80===MT.S_(((--&&&0=!!!!==!===A=AM$[_(((((((-&'8$TA====!A!!&AT$[_(((((&58B!=A===A='=A===A=====A=A=!=!==A!=!=!!!!!!!!!!!!!!!!!!!5!!!!!A&3^^^^^^", "^^^^^^X-PP&!!&-5!!!!!!!!!!!!!!!!!!!==!=!=!===5=========A=====!=5====5A====!!=A&D=T$L+(((((-&&&&&&&a((((((((I588B=======A=====!=5====5A===T$$2[V_((((&&&&&&&&-(((((((((((((((((((((((&&&&&/#==!=5====5A==!M$8+((((&'8#=DT$]+((((&&&&58!!!=!=!=5=====D$Q_((((((((&/8MT$A====!!=ATTM<_(((((3588A!'=====BA=======5=========A=!==!!!=!!!!!!!!!!!!!!!!!5!!!!!A&3^^^^^^", "^^^^^^-&3_P!!!&5!!!!!!!!!!!!!!!!!=!!!=!===A!====A==!=!=======A==AMA'B====!==!=MAATM]_((((&&&&&&&&&&--P_(((((-'88B===!========A====='B==DA!$DF+__(((-&&&&&&&&&&-(((((((((((((((((((((&&&')====A====='B====D$/VO(((-58*AT$[SP((((&&&&''!!!!===!===A==D$0_((((((((&&8TD$====!==!DT$]S(((((((-08*!=!============!===A=!=!=!=!=!!!=!!!!!!!!!!!!!!!!!!!5!!!&!&A5^^^^^^", "^^^^^^5AA-PA!!!5!!!!!!!!!!!!!!!!!!!=!A=!!=!=!!====!=========A=5=DTE.B======!=MM$DT$`O((-&&&&&&&5&5&&&P_((((((-/88B!==!======A=5==&=5==ATAAA$/X((((((&&&55555&&&&&-((((((((((((((((((&&/#!!!=!=5==&=5====!ATE0_((((&/8UT1S_((((-&&''A=!!!!!!==!====!DT2+((((((((&&8$$A======!=&$D c #ccffff", "? c #cc0000", "@ c #993399", "A c #333300", "B c #990099", "C c #663300", "D c #ffff66", "E c #993300", "F c #cc3300", "G c #ff66ff", "H c #ff3300", "I c #666600", "J c #996600", "K c #cc6600", "L c #996699", "M c #cbcbcb", "N c #ff6600", "O c #b2b2b2", "P c #cc6699", "Q c #ff3399", "R c #669900", "S c #999900", "T c #669999", "U c #cc9900", "V c #ff9900", "W c #cc9999", "X c #ff9999", "Y c #a0a0a4", "Z c #ff0000", "[ c #cccc00", "] c #cccc99", "^ c #ffcc00", "_ c #ffff00", "` c #ffcc99", "a c None", "b c #ffffff", "c c #ccff99", "d c #ffff99", "e c #666699", "f c #ff6699", "g c #330066", /* pixels */ "aaaaaaaaaaaaaaaaaaa^NadDa^Naaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaaaaaaaaaaNJaDDaNJaaaaaaaaaaaaaaaaaaaaa", "aaaaaaaaaaadDa^Naaaa5::::5aaadDa^NadDaaaaaaaaaaa", "aaaaaaaa^NaDDaNJadDbW???(5dDaDDaNJaDDaaaaaaaaaaa", "aaaaadDaNJG555:aaDDb????(:DDaa:dWWWMb^Naaaaaaaaa", "aaaaaDD:bM-,(),:aaab??=??baa^N:?????bNJaaa^Naaaa", "aa^Na:b-???????b^Na:(====b^NNJb?????baadDaNJaaaa", "aaNJbW????????=dNJaX,===(bNJa5-=??=?daaDDbWbadDa", "aa5b-??????====Waaa4W===(5aaa:,====?9^Na5W?-bDDa", "dDb(?????====,,dDa^NW<=#MbM(<<< c #990000", "? c #ccffff", "@ c #cc0000", "A c #993399", "B c #333300", "C c #990099", "D c #663300", "E c #ffff66", "F c #993300", "G c #ff66ff", "H c #ff3300", "I c #666600", "J c #996600", "K c #cc6600", "L c #996699", "M c #cbcbcb", "N c #b2b2b2", "O c #cc6699", "P c #ff3399", "Q c #669900", "R c #999900", "S c #669999", "T c #cc9900", "U c #ff9900", "V c #cc9999", "W c #ff9999", "X c #a0a0a4", "Y c #ff0000", "Z c #cccc00", "[ c #ffcc00", "] c #cccc99", "^ c #ffff00", "_ c #ffcc99", "` c None", "a c #ffffff", "b c #ccff99", "c c #ffff99", "d c #666699", "e c #ff6699", "f c #330066", /* pixels */ "```````````````````cE`cE`cE`````````````````````", "```````````````````EE`EE`EE`````````````````````", "```````````cE`cE````5;;;;5```cE`cE`cE```````````", "````````cE`EE`EE`cEaV@@@(5cE`EE`EE`EE```````````", "`````cE`EEG555;``EEa@@@@(;EE``;cVVVMacE`````````", "`````EE;aM-,(),;```a@@>@@a``cE;@@@@@aEE```cE````", "``cE`;a-@@@@@@@acE`;(>>>>acEEEa@@@@@a``cE`EE````", "``EEaV@@@@@@@@>cEE`W,>>>(aEE`5->@@>@c``EEaVa`cE`", "``5a-@@@@@@>>>>V```4V>>>(5```;,>>>>@:cE`5V@-aEE`", "cEa(@@@@@>>>>,,cE`cEV=>=F:cE`a>>>>>>]EE`a@@@V;``", "EEV@@@>@>>-acE`EE`EEM>==(;EE`M=>>>>>V``5_@@@@acE", "``M@@>@>VcE`EE;;M5``a2==2_``;,>=(,>>VcE;,@>@(;EE", "cEa->@(_aEEXac,=,_cEM2==2McEa2==XV>>,EEa>>@>a5``", "EE`a>>>?#MaM(====aEEM2<<,MEE:===_a==X,MV>>>(acE`", "```aV>>,aX(====<>>a5EE`", "``cEa(=>>===2Xa<X;````", "``EE;_====,MaMa0#'aEEa##/EEaf#2acE,=(a(=>(acE```", "`````a(DLc:X'cEM##aX#a##dVXM##MXEEX<2a===V4EE```", "````cEMaMdcE'EEa0#XcEa'#0cEX#'a0#0M#2X<<,aP`````", "````EE`cE'EEXaMX##0EEM0#XEE0#X_#cEa#'<<=McE`````", "```````EE0MaM0###'MX'XaMMXXaMa0#EEa<###XaEE`````", "```````#MaX'###0MaM'cE'cE'cE'cE#''M0##'a````````", "``````cEM'###XaaXcE'E8#88#88#EE'cE*0##McE```````", "``````EEXa'XaacE#EE'#!!!!!!2##''EEXM00aEE```````", "```````2'MMM0`EE####2MMcMXMX!!!##`cEXXXf````````", "`````E`!cE'cE`#####2VaV=<<(XX=0!!CEE'cE'`[``````", "````E[-0EE0EE`'##$!>aa=<000>MXD0X2''0EE'8[[`````", "````E[,XXX,(=`'#(aX>*,<<<<<0=MX0XX!0X,(>/[3`````", "````ET-V_e)>=C(!aMS>]<=>@[@>=XMX0XS!O)@>/[3`````", "``E`E[,7777$2$MMMM>XXR[3`E```", "`E[9E[J777)$MaMa>,=V/=>ZJFZI<=X=0/0+!)%>6T3E[9``", "`E[3E[,&77)!>>>*,@>QZZJ=<0X=002=f)%L/[3E[3``", "`E[3ET-7eWV,2>><>N>X<>@>ZQ=@<=X==0==!LVVT[3E[3``", "`E[3E[J7_aaX,!S^<=$]<=>ZRZ==<=X===<=fMMV/Z3E[3``", "`E[3E[,_aaaV2!<R,3E[3``", "`E[3,<2__e7>2X><2<,E[3``", "`E[3,=2777F2V>0>=DMX0==<<<==0<=0XNXX02$>0=,E[3``", "`E,3,3277)!La.$bLX.<02MS>00XMXXXMXVXXX00f(,[3,<,``", "`,=,ET,7eWL2==R[3E[3``", "`E[3EZK__e7@=!/[3E[3``", "`E[3E[,777)$2<=0=,0ZXX0=<0=<#0/[3E[3``", "`E[3E[,777(2X<=MX0=D0<00X<<=0==XX.0ZT3E[3``", "`E[3EUJ&7(!M<=0ZXMXMZ0X=<<=0==SXXL+2f)%L/[3E[3``", "`E[3EZ-7A2=X0<=X0ZXTX=<<=S/!.d,X.00=fLVV/[3E[3``", "`E[3E[,-!0X=X0<==X=X=<=S0,00000002/[3E[3``", "`E[3ET,_X!=0XX0L0==0,00<=f!f'0###`__e7@>R[3E[3``", "`E[3E[,77('!=0X.XXX00/[3E[3``", "`E[3E[J777)$f!f!!!f!f!''###000###`7777%>8T3E[3``", "`E[3EU,&777%0`'###'0'###000###000`&777%LR[3E[3``", "`E[3EZ-7eWVVV`0###000###000###000`7eWVVV/[3E[3``", "`E[3E[J7_aaMV`0###000###000###000`7_aaMV8Z3E[3``", "`E[TTTTTTTTTTTTTTKTKJKJJJJJJJJJJJJJJJJJJJJJJ[3``", "`E[JFDFDFDDFDFDDDDDDFDFDFDFJJFDFDFDFDFJFDFJJ[3``", "`E[3T< c #ccffff", "? c #cc0000", "@ c #333300", "A c #990099", "B c #663300", "C c #ffff66", "D c #993300", "E c #ff66ff", "F c #ff3300", "G c #666600", "H c #996600", "I c #cc6600", "J c #996699", "K c #cbcbcb", "L c #ff6600", "M c #b2b2b2", "N c #cc6699", "O c #ff3399", "P c #669900", "Q c #999900", "R c #669999", "S c #cc9900", "T c #ff9900", "U c #cc9999", "V c #ff9999", "W c #a0a0a4", "X c #ff0000", "Y c #cccc00", "Z c #cccc99", "[ c #ffcc00", "] c #ffff00", "^ c #ffcc99", "_ c None", "` c #ffffff", "a c #ccff99", "b c #ffff99", "c c #666699", "d c #ff6699", "e c #330066", /* pixels */ "___________________bC_[L_bC_____________________", "___________________CC_LH_CC_____________________", "___________[L_bC____5::::5___[L_bC_[L___________", "________bC_LH_CC_[L`U???(5[L_LH_CC_LH___________", "_____[L_CCE555:__LH`????(:LH__:bUUUK`bC_________", "_____LH:`K-,(),:___`??=??`__bC:?????`CC___bC____", "__bC_:`-???????`bC_:(====`bCCC`?????`__[L_CC____", "__CC`U????????=bCC_V,===(`CC_5-=??=?b__LH`U`_[L_", "__5`-??????====U___4U===(5___:,====?9bC_5U?-`LH_", "[L`(?????====,,[L_bCU<=#K`K(<<<<`LHK2;;,KCC9<<<^`< c #cbcbcb", "? c #339999", "@ c #669999", "A c #ff9900", "B c #a0a0a4", "C c #66cc66", "D c #cccc00", "E c #00ff00", "F c #ffcc00", "G c #ffff00", "H c None", "I c #ffffff", "J c #ffff99", /* pixels */ "HHHHHHHHHHHHHHHHHIHIHHHHHHHHHHHH", "HHHHHHHHHH>>III&'>>>HIHHHHHHHHHH", "HHHHHHH---H>>>>@@IIB>HHHHHHHHHHH", "HHHHHH-HHH-=9@>''B>IB>IHHHHHHHHH", "HHHHH-HH,,=C.-&&&$>>BBHHHHHHHHHH", "HHHHH-H,66H*98&&21$>BBIHHHHHHHHH", "HHHHH-6,HH=C.-00&22&&0HHHHHHHHHH", "HHHHH6-H,=9880>>>B&0BHHHHHHHHHHH", "HHHHH6H-HC.-07%?%?>7>HHHHHHHHHHH", "HHHHHH6-H480B?!7!7!70HHHHHHHHHHH", "HHHHHH==7?-0>!!HHHHHHHHHHHHHHHHH", "HHHHB>>05?8&>74!7!7HHHHHHHHHHHHH", "HHHH0BB&)?&&)??%?%?%HHHHHHHHHHHH", "HHHH0B+&4&&4??B>>>>>>0HHHHHHHHHH", "HHHHHB+/&@&??&&B>>>>B0HHHHHHHHHH", "HHH77G<5/@@&&&+)57&&&HHHHHHHHHHH", "HHHH4A<&/@@@&???4AI;I;HHHHHHHHHH", "HHHHHB<*5//@@&&&I;J3DDHHHHHHHHHH", "HH77FA0<&*4/5/5+IGJD!:DHHHHHHHHH", "HHH4A>B0<*&*&*&+;GJJ:!:HHHHHHHHH", "HHHHBB0&0<<<<<B0&>B0&A;&A:;@@?>>>H>>>H>>>H", "00000&BB0&;;@@@5@5@?00!>00H>00HH", "0&>>>>0B&0@@@@@&@&@?B!B!B!B!B0>H", "H>B00B>0@@5@@444444400000>>>0!0>", ">BBBB>B>??&@4??&?&?&&&&0>&B&>B0>", ">0B>>B0>0<@@?@@0@0@0BBBB>B&B>!H>", ">0B>BB0>0<@@&B&>B>H", ">B>BB>B>0<5@@<<<<<<<00000>>B*!0>", "&>B00B>&??&@@@@@@@@?B!B!B!B!B00>", "0&>>>>&0H00>H00>H>", "00&&&&=-=<&&&&.8<&<<>H>>>H>>>HHH", "H00HHG,9-=0&0009.8.CHHHHHHHHHHHH", "B>>0H,=-60&0&0BB8..8CHHHHHHHHHHH", "HB0=,H-6E&0C-&0B>-8..9HHHHHHHHHH", "H-6HH-H6EHC-9&&0BB9.8.C/+HHHHHHH", "HH---H6HG=-9&&0&0B>8.@/5/5HHHHHH", "HHHHHHHHHE=H&0&0&0BB@5/&*&HHHHHH", "HHHHHHHHHHGE=&0C-&0@/&***>HHH", "HHHHHHHHHHH>00<&&==+&<0&!00>>HHH", "HHHHHHHHHHH>0BBH=-GH<0&!00>>BB>H", "HHHHHHHHHH>0B>HHE-HGH&!00>>B0B>H", "HHHHHHHHHH>0B>HE-HGHHHH&>>BBB>>H", "HHHHHHHHH222222?@@?HHG&>>B00B>HH>H>$$B&0B$<222>BBB0>B00BB>H>H", ">HB0>0>0>##$$$$$$$2$60>B000B>!HH", "H!00>>>0000#2222$$6J0>B>BBBB>>BH", "HB>>&B&>0&&&##$GG0>0B>>B0>0!>", ">!0>B&B>BBBB$$0$#$330>0BB>B0>>BH", "HB>>&B&>0&&&##$$A0>B>BB>B>0!>", "H!00>>>000006666$$2##&>B00B>&>BH", ">HB0>0>0>0>0($$$$$6$G3&>>>>&>!HH", "HHH!B!B!B!B!666666666AB&&&&!BH>H", "HH>HH>H>H>H>H>H>H>H>H>H>H>H>HHHH", }; xevil-2.02r2.orig/x11/gen_xpm/enforcer/enforcer_0b.xpm0100644000175000017500000000605107041513604022067 0ustar aaronlaaronl/* XPM */ static char *enforcer_0b[] = { /* width height ncolors chars_per_pixel */ "32 60 41 1 0 0", /* colors */ "! c #000000", "# c #990066", "$ c #cc0066", "% c #000080", "& c #333366", "' c #3333ff", "( c #993366", ") c #a6caf0", "* c #336666", "+ c #3366ff", ", c #9966ff", "- c #339966", ". c #669966", "/ c #3399ff", "0 c #555555", "1 c #ff9966", "2 c #ff5050", "3 c #ffcc66", "4 c #66ccff", "5 c #99ffff", "6 c #990000", "7 c #ccffff", "8 c #333300", "9 c #336600", ": c #666600", "; c #996600", "< c #336699", "= c #663399", "> c #cbcbcb", "? c #339999", "@ c #669999", "A c #ff9900", "B c #a0a0a4", "C c #66cc66", "D c #cccc00", "E c #00ff00", "F c #ffcc00", "G c #ffff00", "H c None", "I c #ffffff", "J c #ffff99", /* pixels */ "HHHHHHHHHHHHHHHHHIHIHHHHHHHHHHHH", "HHHHHHHHHH>>III&'>>>HIHHHHHHHHHH", "HHHHHHH---H>>>>@@IIB>HHHHHHHHHHH", "HHHHHH-HHH-=9@>''B>IB>IHHHHHHHHH", "HHHHH-HH,,=C.-&&&$>>BBHHHHHHHHHH", "HHHHH-H,66H*98&&21$>BBIHHHHHHHHH", "HHHHH-6,HH=C.-00&22&&0HHHHHHHHHH", "HHHHH6-H,=9880>>>B&0BHHHHHHHHHHH", "HHHHH6H-HC.-07%?%?>7>HHHHHHHHHHH", "HHHHHH6-H480B?!7!7!70HHHHHHHHHHH", "HHHHHH==7?-0>!!HHHHHHHHHHHHHHHHH", "HHHHB>>05?8&>74!7!7HHHHHHHHHHHHH", "HHHH0BB&)?&&)??%?%?%HHHHHHHHHHHH", "HHHH0B+&4&&4??B>>>>>>0HHHHHHHHHH", "HHHHHB+/&@&??&&B>>>>B0HHHHHHHHHH", "HHH77G<5/@@&&&+)57&&&HHHHHHHHHHH", "HHHH4A<&/@@@&???4AI;I;HHHHHHHHHH", "HHHHHB<*5//@@&&&I;J3DDHHHHHHHHHH", "HH77FA0<&*4/5/5+IGJD!:DHHHHHHHHH", "HHH4A>B0<*&*&*&+;GJJ:!:HHHHHHHHH", "HHHHBB0&0<<<<<B0&>B0&A;&A:;@@?>G>>>H>>>HHH", "00000&BB0&;;@@@5@5@?;>00H>00H>>H", "0&>>>>0B&0@@@@@&@&@?B!B!B!B!B00>", "H>B00B>0@@5@@444444400000>>>0!0>", ">BBBB>B>??&@4??&?&?&&&&0>&B&>B>H", ">0B>>B0>0<@@?@@0@0@0BBBB>B&B>!0>", ">0B>BB0>0<@@&B&>B0>", ">B>BB>B>0<5@@<<<<<<<00000>>B*!H>", "&>B00B>&??&@@@@@@@@?B!B!B!B!B0>H", "0&>>>>&0H00>H0>H", "00&&&&=-=<&&&&.8<&<<>>>H>>>H>>HH", "H00HHG,9-=0&0009.8.CHHHHHHHHHHHH", "B>>0H,=-60&0&0BB8..8CHHHHHHHHHHH", "HB0=,H-6E&0C-&0B>-8..9HHHHHHHHHH", "H-6HH-H6EHC-9&&0BB9.8.C/+HHHHHHH", "HH---H6HG=-9&&0&0B>8.@/5/5HHHHHH", "HHHHHHHHHE=H&0&0&0BB@5/&*&HHHHHH", "HHHHHHHHHHGE=&0C-&0@/&***>HHH", "HHHHHHHHHHH>00<&&==+&<0&!00>>HHH", "HHHHHHHHHHH>0BBH=-GH<0&!00>>BB>H", "HHHHHHHHHH>0B>HHE-HGH&!00>>B0B>H", "HHHHHHHHHH>0B>HE-HGHHHH&>>BBB>>H", "HHHHHHHHH222222?@@?HHG&>>B00B>HH>H>$$B&0B$<222>BBB0>B00BB>H>H", ">HB0>0>0>##$$$$$$$2$60>B000B>!HH", "H!00>>>0000#2222$$6J0>B>BBBB>>BH", "HB>>&B&>0&&&##$GG0>0B>>B0>0!>", ">!0>B&B>BBBB$$0$#$330>0BB>B0>>BH", "HB>>&B&>0&&&##$$A0>B>BB>B>0!>", "H!00>>>000006666$$2##&>B00B>&>BH", ">HB0>0>0>0>0($$$$$6$G3&>>>>&>!HH", "HHH!B!B!B!B!666666666AB&&&&!BH>H", "HH>HH>H>H>H>H>H>H>H>H>H>H>H>HHHH", }; xevil-2.02r2.orig/x11/gen_xpm/enforcer/enforcer_0c.xpm0100644000175000017500000000611307041513604022067 0ustar aaronlaaronl/* XPM */ static char *enforcer_0c[] = { /* width height ncolors chars_per_pixel */ "32 60 43 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #990066", "% c #cc0066", "& c #000080", "' c #333366", "( c #3333ff", ") c #cc3366", "* c #a6caf0", "+ c #336666", ", c #3366ff", "- c #9966ff", ". c #339966", "/ c #669966", "0 c #3399ff", "1 c #555555", "2 c #ff5050", "3 c #ffcc66", "4 c #66ccff", "5 c #99ffff", "6 c #990000", "7 c #ccffff", "8 c #333300", "9 c #ff3300", ": c #336600", "; c #666600", "< c #996600", "= c #336699", "> c #663399", "? c #cbcbcb", "@ c #339999", "A c #669999", "B c #ff9900", "C c #a0a0a4", "D c #66cc66", "E c #cccc00", "F c #00ff00", "G c #ffcc00", "H c #ffff00", "I c #ffcc99", "J c None", "K c #ffffff", "L c #ffff99", /* pixels */ "JJJJJJJJJJJJJJJJJKJKJJJJJJJJJJJJ", "JJJJJJJJJJ??KKK'(???JKJJJJJJJJJJ", "JJJJJJJ...J????AAKKC?JJJJJJJJJJJ", "JJJJJJ.JJJ.>:A?((C?KC?KJJJJJJJJJ", "JJJJJ.JJ-->D/.'''9??CCJJJJJJJJJJ", "JJJJJ.J-66J+:8''II9?CCKJJJJJJJJJ", "JJJJJ.6-JJ>D/.11'II''1JJJJJJJJJJ", "JJJJJ6.J->:881???C'1CJJJJJJJJJJJ", "JJJJJ6J.JD/.17&@&@?7?JJJJJJJJJJJ", "JJJJJJ6.J481C@#7#7#71JJJJJJJJJJJ", "JJJJJJ>>7@.1?##JJJJJJJJJJJJJJJJJ", "JJJJC??15@8'?7#JJJJJJJJJJJJJJJJJ", "JJJJ1CC'*@''*@4#7#7JJJJJJJJJJJJJ", "JJJJ1C,'4''4@@,&@&@&JJJJJJJJJJJJ", "JJJJJC,0'A'@@''C????C1JJJJJJJJJJ", "JJJ77H=50AA''',*57'''JJJJJJJJJJJ", "JJJJ4B='0AAA'@@@4BK.>=''''/8='==??J???J???JJ", "J11JJH-:.>1'111:/8/DJJJJJJJJJJJJ", "C??1J->.61'1'1CC8//8DJJJJJJJJJJJ", "JC1>-J.6F'1D.'1C?.8//:JJJJJJJJJJ", "J.6JJ.J6FJD.:''1CC:/8/D0,JJJJJJJ", "JJ...J6JH>.:''1'1C?8/A0505JJJJJJ", "JJJJJJJJJF>J'1'1'1CCA50'+'JJJJJJ", "JJJJJJJJJJHF>'1D.'1A0'+++=JJJJJJ", "JJJJJJJJJJJHFJD.AAA04++==AAJJJJJ", "JJJJJJJJJJJJ'>AA'@'A'+==A==JJJJJ", "JJJJJJJJJJJJ'@1@1@105==A=JJJJJJJ", "JJJJJJJJJJJJ='=='@'A'=A=1'JJJJJJ", "JJJJJJJJJJJJC=''===05A=1'#J??JJJ", "JJJJJJJJJJJ?11=''>>,'=1'#11??JJJ", "JJJJJJJJJJJ?1CCJ>.HJ=1'#11??CC?J", "JJJJJJJJJJ?1C?JJF.JHJ'#11??C1C?J", "JJJJJJJJJJ?1C?JF.JHJJJJ'??CCC??J", "JJJJJJJJJ222222@AA@JJH'??C11C?=J", "JJJJ?J?J)%C'1C%=222=B3??CCC1?=JJ", "J?JC#C#C!%%%%%%2%%%2%B?C11CC?JJJ", "JJ#?1?1?1$$%%%%%%%2%61?C111C?CJ?", "JC?1???1111$2222%%6L1?C?CCCC?1#J", "?#1?'C'?1'''$$'$2%HH1?1C??C1??CJ", "JC??C'C?CCCC%%1%$%331?1CC?C1?1#?", "?#1?'C'?1'''$$'$6%%B1?C?CC?C??CJ", "JC?1???111116666%%2$$'?C11C?'1#J", "JJ#?1?1?1?1?$%%%%%6%H3'????'1CJ?", "J?JC#C#C#C#C666666666B#''''C#JJJ", "JJJJ?J?J?J?J?J?J?J?J?J?J?J?JJ?JJ", }; xevil-2.02r2.orig/x11/gen_xpm/enforcer/0d_duplicate_of_00100644000175000017500000000000007041513604022324 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/enforcer/2_duplicate_of_00100644000175000017500000000000007041513604022162 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/enforcer/2b_duplicate_of_0b0100644000175000017500000000000007041513604022466 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/enforcer/2c_duplicate_of_0c0100644000175000017500000000000007041513604022470 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/enforcer/2d_duplicate_of_00100644000175000017500000000000007041513604022326 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/enforcer/enforcer_4.xpm0100644000175000017500000000566107041513604021737 0ustar aaronlaaronl/* XPM */ static char *enforcer_4[] = { /* width height ncolors chars_per_pixel */ "32 60 34 1 0 0", /* colors */ "! c #000000", "# c #660066", "$ c #000080", "% c #333366", "& c #3333ff", "' c #a6caf0", "( c #336666", ") c #3366ff", "* c #669966", "+ c #3399ff", ", c #555555", "- c #ff5050", ". c #ffcc66", "/ c #66ccff", "0 c #99ffff", "1 c #ccffff", "2 c #333300", "3 c #336600", "4 c #666600", "5 c #996600", "6 c #336699", "7 c #663399", "8 c #cbcbcb", "9 c #339999", ": c #669999", "; c #ff9900", "< c #a0a0a4", "= c #66cc66", "> c #cccc00", "? c #ff0000", "@ c #ffff00", "A c None", "B c #ffffff", "C c #ffff99", /* pixels */ "AAAAAAAAAAAAAAABBAAAAAAAAAAAAAAA", "AAAAAAAAAAB&<88BB88<&BAAAAAAAAAA", "AAAAAAAAA8:<@@CC@@>C6(0++::%%%A", "A)0+0+/(%6;>@@CCCC@@>;6%(/+0+0)A", "A)%(%(%(65>>!4CCCC4!>>56(%(%(%)A", "AA666666C.>!!!>CC>!!!>.C666666AA", "A6<6<,%55.>4!!4>>4!!4>.55%,<6<6A", "%686:%A:B@C@>4@!!@4>@C@B:A%:686%", "/%,%66:65@CCC@>!!>@CCC.56:66%,%/", "<<<>@CCC@.B;6:/<<<<", "8%8%6/6;;5@@CC>44>CC@@5;;6/6%8%8", "8<8<6/6%;B.@@@4!!4@@@.B;%6/6<8<8", "8%8%6/6,%5;@.>4!!4>..;5%,6/6%8%8", "<<,<6:6%55;B5.>..>.5B;55%6:6<,<<", "6%8%:6A5555;;5B55B5;;5555A6:%8%6", "A68666A5%,55%%3333%%55,%5A66686A", "AA c #cbcbcb", "? c #339999", "@ c #669999", "A c #ff9900", "B c #33cc00", "C c #a0a0a4", "D c #66cc66", "E c #cccc00", "F c #0000ff", "G c None", "H c #ffffff", "I c #ccff99", "J c #ff6699", /* pixels */ "GGGGGGGGGGGGGGGGGGGGG>GG>GG>GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG", "GGGGGGGGGGGGGGGGGGGGGG!C!C!GGGGGGGGGGGGGGGG,CGGGGGGGGGGGGGGG", "GGGGGGGGGGGGGGGGGGG>GC/>/>/CG>GGGGGGGGGGGG,5GGGGGGGGGGGGGGGG", "GGGGGGGGGGGGGGGGGGGG!//>>>//!GGGGGGGGGGGGG,GGGGGGGGGGGGGGGGG", "GGGGGGGGGGGGGGGGGGGGC>>&C&>>CGGGGGGGGGGGGG,GGGGGGGGGGGGGGGGG", "GGGGGGGGGGGGGGGGGGG>!/>C&C>/!>GGGGGGGGGGGGG,GGGGGGGGGGGGGGGG", "GGGGGGGGGGGGGGGGGGGGC>>&C&>>CGGGGGGGGGGGGG5GGGGGGGGGGGGGGGGG", "GGGGGGGGGGGGGGGGG>>>!//>>>//!>G>>>G>>GGGGGG55GGGGGGGGGGGGGGG", "GGGGGGGGGGGGGGGG>GGGC>//C//>#$>G//>//>GGGGGBBGGGGGGGGGGGGGGG", "GGGGGGGGGGGGGGGGGGGGGG/&C&/#$$/!C!C!/>GGGB=G&GG5GGGGGGGGGGGG", "GGGGGGGGGGGGGGGGGGGGC>/&C&/#$CC>>>>/CG>GG=,D/G5,5GGGGGGGGGGG", "GGGGGGGGGGGGGGGGGGG>!//&!&#$$&!//>>>!/>GBG9,D/,G,5GGGGGGGGGG", "GGGGGGGGGGGGGGGGGG>G5'5#!!1$$/CCC//C<&&B=&&9,&/GG,5GGGGGGGGG", "GGGGGGGGGGGGGGGGGGG>5$5#$!!!$C!>>C/<&?=G&/&&&//GG,GGGGGGGGGG", "GGGGGGGGGGGGGGGGGGGG5$5&/&1$$$C/>C<&5$5#$#1$1>HHH&8>>>GH", "GGGGGGGGGGGGGG<&&&&&&&&&&<$$$1@,B=&<&/&@,&/C>,,,G>>>>@@HHC>G", "GGGGGGGGGGGGG&<;;AH;;HA;;<&$$1@/,,=88C>HC>", "GGGGGGGGGGGGG),7-++=D-,&&&$>>CC", "GGGGGGGGGGG)&CC", "GGGGGGGGGGG)<;EF!:IFFI:!EE;<)A@>>C&/CG", "GGGGGGGGGGG;;2E:!!:EEF!!:E2;;>&6>G", "GGGGGGGGGGG@HJIJE:J!!FFEJIJH@>>&/!&/<@<6)&4?4,?37/C?!6!6!6/G", "GGGGGGGGGGG<;JIIIJE!!EFFII2;>//!&/<@?(&&?<&/&,/>!!GGGGGGG", "GGGGGGGGGGGAH2JFFIJEEJIFIJ2HACC>>//!&@63!6!6GGG", "GG&>>>>/GGGAA;JJIIE::EIIFJ;AAC/C>>/@@@&&??&@<&>&>&(??%?%?%GG", "G&>C//C>/GG&AH2JJJ:!!:JJF2HA&//CC>>>64*&&&@@C>3??C>>>>>>/", "&>C>CC>C>&GG&;AJ2E:!!:E22A;&>>CC/C>>@3??&@@@<&>&>??&&C>>>>C/", "&>/CC>C/>/GG;;AH;2E22E2;HA;;<<>>CC?@/&&&@@../C>>C/>/GGGGGAA;H;;H;AA;CG><<>>>?@&*4.4.3GG&>&<@&???3GGGGG", "&>C>CCCC>/GGGGG;&&9999&&;>GGGGGG>>>>>GG)@@@GG<><&&GG???GGGGG", }; xevil-2.02r2.orig/x11/gen_xpm/frog/0040755000175000017500000000000007637441100016312 5ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/frog/frog_0.xpm0100644000175000017500000000057507041513604020216 0ustar aaronlaaronl/* XPM */ static char *frog_0[] = { /* width height ncolors chars_per_pixel */ "14 10 3 1 0 0", /* colors */ "! c #008000", "# c #0000ff", "$ c None", /* pixels */ "$$$$$$$$$##$$$", "$$$$$$$$$##$$$", "$$$$$!!!!!!!!$", "$$$!!!!!!!!!!$", "$$!!!!!!!!!!$$", "$!!!!!!!!!!$$$", "!!!!!!!!!$!!$$", "!!!!!!!$$$$!!$", "!!!!!!!!$$$$!!", "$!!!!!!!!!!$$!", }; xevil-2.02r2.orig/x11/gen_xpm/frog/frog_2.xpm0100644000175000017500000000126507041513604020215 0ustar aaronlaaronl/* XPM */ static char *frog_2[] = { /* width height ncolors chars_per_pixel */ "26 16 3 1 0 0", /* colors */ "! c #008000", "# c #0000ff", "$ c None", /* pixels */ "$$$$$$$$$$$$$$$$$##$$$$$$$", "$$$$$$$$$$$$$$$$$##$$$$$$$", "$$$$$$$$$$$$$!!!!!!!!!$$$$", "$$$$$$$$$$$$!!!!!!!!!!$$$$", "$$$$$$$$$!!!!!!!!!!!!$$$$$", "$$$$$$$!!!!!!!!!!!!$$$$$$$", "$$$$$$$!!!!!!!!!!!!!$$$$$$", "$$$$$$$!!!!!!!!!!$$!!!!!$$", "$$$$!!!!!!!!!$$$$$$$$!!$$$", "$!!!!!!!$$!!!!$$$$$$$!!$$$", "$$!!!$$$$$!!!!$$$$$$$$$$$$", "$$$$!$$$$!!!!$$$$$$$$$$$$$", "$$$!!$!!!!!!$$$$$$$$$$$$$$", "$!!!!!!!!!$$$$$$$$$$$$$$$$", "$$$!!!$$$$$$$$$$$$$$$$$$$$", "$$$$!!$$$$$$$$$$$$$$$$$$$$", }; xevil-2.02r2.orig/x11/gen_xpm/frog/frog_4.xpm0100644000175000017500000000130507041513604020212 0ustar aaronlaaronl/* XPM */ static char *frog_4[] = { /* width height ncolors chars_per_pixel */ "18 22 3 1 0 0", /* colors */ "! c #008000", "# c #0000ff", "$ c None", /* pixels */ "$$!!$$$$$$$$$$!!$$", "$!!!$$$$$$$$$$!!!$", "!!!!$$##!!##$$!!!!", "!!!!!$##!!##$!!!!!", "$$$!!!!!!!!!!!!$$$", "$$$$!!!!!!!!!!$$$$", "$$$$$!!!!!!!!$$$$$", "$$$$$$!!!!!!$$$$$$", "$$$$$$!!!!!!$$$$$$", "$$$$$$!!!!!!$$$$$$", "$$$$$$!!!!!!$$$$$$", "$$$$$$!!!!!!$$$$$$", "$$$$$$!!$$!!$$$$$$", "$$$$$!!!$$!!!$$$$$", "$$$$$!!!$$!!!$$$$$", "$$$$$!!!$$!!!$$$$$", "$$$$!!!$$$$!!!$$$$", "$$$$!!$$$$$$!!$$$$", "$$$$!!$$$$$$!!$$$$", "$$$!!!!$$$$!!!!$$$", "$$!!!!!!$$!!!!!!$$", "$$!!!!!!$$!!!!!!$$", }; xevil-2.02r2.orig/x11/gen_xpm/frog/frog_5.xpm0100644000175000017500000000064507041513604020221 0ustar aaronlaaronl/* XPM */ static char *frog_5[] = { /* width height ncolors chars_per_pixel */ "18 10 3 1 0 0", /* colors */ "! c #008000", "# c #0000ff", "$ c None", /* pixels */ "$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$", "$$$$$$$$$$$$$$$$$$", "$$$$$$##$$##$$$$$$", "$$$!$!##!!##!$$!$$", "$$!!!!!!!!!!!!!!!$", "$$!!!!!!!!!!!!!!!$", "$$$!!!!!!!!!!!!!$$", "$$$$!!!!!!!!!!!$$$", "$$!!!!!$$$!!!!!!!$", }; xevil-2.02r2.orig/x11/gen_xpm/frog/18_duplicate_of_50100644000175000017500000000000007041513604021410 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/frog/20_duplicate_of_40100644000175000017500000000000007041513604021400 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/frog/23_duplicate_of_20100644000175000017500000000000007041513604021401 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/frog/frog_24.xpm0100644000175000017500000000124507041513604020277 0ustar aaronlaaronl/* XPM */ static char *frog_24[] = { /* width height ncolors chars_per_pixel */ "26 16 2 1 0 0", /* colors */ "! c #660000", "# c None", /* pixels */ "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", "!!!!!!!!!!!!!!!!!!!!!!!!!!", }; xevil-2.02r2.orig/x11/gen_xpm/frog/frog_25.xpm0100644000175000017500000000076007041513604020301 0ustar aaronlaaronl/* XPM */ static char *frog_25[] = { /* width height ncolors chars_per_pixel */ "14 14 5 1 0 0", /* colors */ "! c #800000", "# c #008000", "$ c #ff0000", "% c #0000ff", "& c None", /* pixels */ "&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&", "##&&&&&&&&&&&&", "#$&&&&&&&&&&&&", "#$&&&&&&&&#&&&", "##$$&&&&&&##&&", "&##$&&&&&&!##&", "&&&#$&&&&$##&&", "&&##$&&&$$#&&&", "&####$$$$##&&&", "###!$$!!###!#&", "###!!!!!###!#&", "&#!!#!!!#%%#!&", "!!!##$###%%!!!", }; xevil-2.02r2.orig/x11/gen_xpm/hero/0040755000175000017500000000000007637441100016312 5ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/hero/hero_0.xpm0100644000175000017500000000466007041513604020215 0ustar aaronlaaronl/* XPM */ static char *hero_0[] = { /* width height ncolors chars_per_pixel */ "32 56 13 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #555555", "& c #999966", "' c #ff9966", "( c #666600", ") c #669900", "* c #999900", "+ c #cc9900", ", c #a0a0a4", "- c #ffff00", ". c None", /* pixels */ "................................", "....................++-+--......", "..................+-+-++-.......", ".................+-+-++-++-.....", ".................+-+-+''+.......", ".................+++++'''$......", ".................++$$''''$......", ".................$+$'''$$.......", ".................$''$''''$......", ".................$''''$'$.......", ".................$''$'''$.......", "................('''$$''$.......", "..............$(*(($$$$.........", ".............$(***$''$$(........", "............$'(**$''''$(........", "...........$'(***$''''$(........", "..........$''(***$''''$(........", ".........$'''(***$'''$$(..$$$...", ".........''''(***$''''$(.$'''$..", ".........$'''(***$''''$$$$''''$.", "..........$''(***$'''$''''''''$.", "...........$$()**$'''''''''''$..", ".............$(**)$''''''''$$...", "..............(**)$''''''$$.....", "..............((((($$$$$$.......", "..............(&&&&&&((.........", "..............(&&&&&&&(.........", "..............(((((((&(.........", ".............(***))))((.........", ".............(********((........", ".............(*******(**(.......", ".............(*******()**((.....", ".............())****)()****((...", ".............(()****(())*****((.", ".............())****()))))))**)(", ".............()*****())))))****(", ".............(*****)()))))))*)*(", ".............(*****(.(((!!!)))*(", ".............()****(...##%%!!!(.", "............())***)(..!#%%%%#!!.", "............()****)(.!#%%%##!!..", "............()**))(!!#%%%#!!....", "............(**)!!%!#%%%#!......", "............!!!!%##%!#%#!.......", "...........!#%,%#!!#!!!!........", "..........!#%,%#!.!!%%%!........", ".........!#%,%#!...!#%%%!.......", ".........!%%%#!.....!#%%!.......", "........!%,%#!.......!##!.......", ".......!#%%#!.........!!!.......", "......!%!%%#!...................", "......!##!!!!...................", ".......!!%%%#!..................", "........!#,,%%!.................", ".........!####!.................", "..........!!!!!.................", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_0b.xpm0100644000175000017500000000466107041513604020360 0ustar aaronlaaronl/* XPM */ static char *hero_0b[] = { /* width height ncolors chars_per_pixel */ "32 56 13 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #555555", "& c #999966", "' c #ff9966", "( c #666600", ") c #669900", "* c #999900", "+ c #cc9900", ", c #a0a0a4", "- c #ffff00", ". c None", /* pixels */ "....................++-+--......", "..................+-+-++-.......", ".................+-+-++-++-.....", ".................+-+-+''+.......", ".................+++++'''$......", ".................++$$''''$......", ".................$+$'''$$.......", ".................$''$''''$......", ".................$''''$'$.......", ".................$''$'''$.......", "................((''$$''$.......", "...............$(*(('$$.........", ".............$$(****(((.........", "............$$(****$$)(.........", "...........$'(****$''$$(........", "..........$''(***$''''$(...$$$..", "..........$''()**$'''''$...$''$.", ".........$''''(**$''''''$..$''$.", ".........$''''(**$$'''''$$$'''$.", "..........$'''(***$$$'''$'''''$.", "...........$''(***)$'''''''''$..", "............$'(****)$'''''''$...", ".............$(*****)$'''''$....", "..............()****))$'''$.....", "..............((((((()($$$......", "..............(&&&&&&((.........", "..............(&&&&&&&(.........", "..............(((((((&(.........", "..............%*****)(%(........", ".............(******))((........", ".............(******)((*(.......", ".............()*****)(***((.....", ".............((****)())))**(....", "............())****)())))))*((..", "............()*****)%)))))***(..", "............()****))%)))))*)**(.", "............())**))((())))))**(.", "...........()))**))(.((()))!!!..", "...........()****)(....!!!!%%!..", ".........!!!(***))(....!#%%%##..", "...!!!!!!%%%%!**)(.....!#%%#!...", "..!#%!,,%%,,,%!*)(.....!#%%#!...", "..#!!#%%%%%%%%%#!......!#%#!....", "..!#%!#########!......!!%%#!....", "..!#%%!!!!!!!!!.......!#%%!.....", "..!#,%!..............!!%%%!.....", "..!#,!...............!%!%#!.....", "..!#%!..............!%#!!!%!....", "..!#!...............!#!%%%%!....", "..!!.................!!##%%%!...", ".......................!!##%%!..", ".........................!!##!..", "...........................!!...", "................................", "................................", "................................", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_0c.xpm0100644000175000017500000000464007041513604020356 0ustar aaronlaaronl/* XPM */ static char *hero_0c[] = { /* width height ncolors chars_per_pixel */ "32 56 12 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #555555", "& c #ff9966", "' c #666600", "( c #669900", ") c #999900", "* c #cc9900", "+ c #a0a0a4", ", c #ffff00", "- c None", /* pixels */ "--------------------------------", "--------------------**,*,,------", "------------------*,*,**,-------", "-----------------*,*,**,**,-----", "-----------------*,*,*&&*-------", "-----------------*****&&&$------", "-----------------**$$&&&&$------", "-----------------$*$&&&$$-------", "-----------------$&&$&&&&$------", "-----------------$&&&&$&$-------", "-----------------$&&$&&&$-------", "----------------'&&&$$&&$-------", "---------------'''''&'$---------", "--------------'))))(''$---------", "--------------'))$$$$('---------", "-------------'))$&&&&$'---------", "-------------')$&&&&&$'---------", "------------$')$&&&&&$'---------", "-----------$&'$&$&&&&$'---------", "-----------$'$$&&&&&$)'---------", "----------$&'$&&&&&$'('---------", "----------$&'$&&&&&$(('---------", "-----------$$&&&&$$(()'---------", "------------$&&&&&&$)'----------", "------------$&&&&&&$$$----------", "------------'$&&&&&&$$$---------", "------------''$$&&&&&&&$--------", "------------'((($&&&&&&&$-------", "-----------'')((($$$&&&&$-------", "-----------'))))(('$$&&$--------", "-----------'))))(((('$$---------", "-----------'))))))(')'----------", "-----------'))))))'(()'---------", "-----------'))))))'(())'--------", "-----------'))))))'(())'--------", "-----------'()))))'((())'-------", "------!!!--'(())))'(((())'------", "-----!'%%!--'(()))'(((())'------", "----!!%!%%!-'((())('((()))'-----", "---!%#!#%+%!'))))(('(()(()'-----", "--!%+%%!%++#!!)))(('(((((('-----", "-!%+%%#!#%+%%%!))((''(((!!!-----", "-!####!!!#%%++%!)((''!!!%#!-----", "-!!!!----!#%%++!((('!#%%%#!-----", "----------!##%%!(('-!#%%%#!-----", "-----------!!#%!('--!#%%%#!-----", "-------------!!'''---!#%%!------", "---------------------!#%%!------", "---------------------!#%%!------", "---------------------!#%%!------", "---------------------!#%%!------", "---------------------!#%%!!-----", "---------------------!!#!%%!!---", "---------------------!%!%%%%%!!-", "---------------------!#!#####%!-", "---------------------!!!!!!!!!!-", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_0d.xpm0100644000175000017500000000466107041513604020362 0ustar aaronlaaronl/* XPM */ static char *hero_0d[] = { /* width height ncolors chars_per_pixel */ "32 56 13 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #555555", "& c #999966", "' c #ff9966", "( c #666600", ") c #669900", "* c #999900", "+ c #cc9900", ", c #a0a0a4", "- c #ffff00", ". c None", /* pixels */ "................................", "....................++-++-......", "..................+-+-++-.......", ".................+-+-++-++-.....", ".................+-+-+''+.......", ".................+++++'''$......", ".................++$$''''$......", ".................$+$'''$$.......", ".................$''$''''$......", ".................$''''$'$.......", ".................$''$'''$.......", "................((''$$''$.......", "...............($$(('$$.........", "..............($$$$$((..........", "............$$$'''$$*)(.........", "...........$$$'''''$**(.........", "..........$'''$''''$**(.........", ".........$''''''''$$**(.........", "........$'''''''$$$(**(.........", ".......$'''''''$$)))(*(.........", ".......$'''$$$$$))****(..$$$$...", ".......$''''$$)))****)($$(''$$..", "........$''''())*****($$'$'''$..", "........$''''$()*****(''''''$$..", ".........$'''''$)****(''''$$$...", ".........$''''''$((()(''$$$.....", "..........$$''''$&&&($$$........", "...........$'''$&&&&(...........", "............$$$((((&(...........", ".............(***(*((...........", ".............(*******(..........", ".............(********((........", ".............()*********((......", ".............((***********(.....", ".............(()****))))***(....", "..............(())**))))***(....", ".............())(())*******(....", ".............(*)))((!!****)(....", ".............(*))))!#%!!*)(.....", ".............(*)))!#%,%%!!(.....", ".............(*))!#%,%##!!......", ".............(*)!#%,%#!!........", ".............((!#%,%#!..........", ".............!!!%%%#!...........", "............!!#%!#%!............", "............!!#%!!!!............", "...........!#%!!%%%!............", "...........!#%%!#%,,!...........", "..........!#%%#!!#%%!...........", ".........!#%%#!!.!##!...........", "........!!%%#!!...!!!...........", ".......!#%!#!!..................", ".......!#%%!!!!.................", "........!#!%%%%!................", ".........!!#####!...............", "...........!!!!!!...............", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_0e.xpm0100644000175000017500000000466107041513604020363 0ustar aaronlaaronl/* XPM */ static char *hero_0e[] = { /* width height ncolors chars_per_pixel */ "32 56 13 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #555555", "& c #999966", "' c #ff9966", "( c #666600", ") c #669900", "* c #999900", "+ c #cc9900", ", c #a0a0a4", "- c #ffff00", ". c None", /* pixels */ "....................++-+--......", "..................+-+-++-.......", ".................+-+-++-++-.....", ".................+-+-+''+.......", ".................+++++'''$......", ".................++$$''''$......", ".................$+$'''$$.......", ".................$''$''''$......", ".................$''''$'$.......", "................$'''$'''$.......", "...............(((''$$''$.......", ".............$$$$$(('($.........", "...........$$$''''$*((..........", ".........$$'$''''''**($...$$$$..", "........$$''''''''$***($..$'''$.", ".......$'''''''''$$***((..$'''$.", "......$'''$'''$$$)****($.$$$''$.", "......$''''$$$$)))(***('$''$''$.", "......$'''''$$))**)(**('$''$$$..", ".......$'''''$$))*****(''''$$...", "........$''''''$)*****(''''$....", ".........$''''''$*****($''$.....", "..........$$''''$*****(.$$......", "...........$'''$$)***)(.........", "............$$$$(((()(..........", ".............(&&&&&&((..........", ".............(&&&&&&&(..........", ".............(((((((&(..........", ".............%******((..........", "............()****)(((..........", "............((********((........", "............(()*********(.......", "............((()*********((.....", "...........(*)())**********(....", "...........(*))()))*********(...", "...........(*)))((*)*))))***(...", "...........(**))))(((*))***)(...", "..........(**)))))(.(((*)!!!!...", "..........(**)))))....!!!!%%!...", ".........!!(!))))(....!#%%,##...", "...!!!!!!%%%%!)))(....!#%,#!....", "..!#%!%%%%%%%%!))(....!#%,#!....", "..#!!#%%%%%%%%%#!.....!#%#!.....", "..!#%!#########!.....!!%,#!.....", "..!#%%!!!!!!!!!......!#,%!......", "..!#%%!.............!!%,%!......", "..!#%!..............!%!%#!......", "..!#%!.............!%#!!!%!.....", "..!#!..............!#!%%%%!.....", "..!!................!!##%,,!....", "......................!!##%,!...", "........................!!##!...", "..........................!!....", "................................", "................................", "................................", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_0f.xpm0100644000175000017500000000466107041513604020364 0ustar aaronlaaronl/* XPM */ static char *hero_0f[] = { /* width height ncolors chars_per_pixel */ "32 56 13 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #555555", "& c #999966", "' c #ff9966", "( c #666600", ") c #669900", "* c #999900", "+ c #cc9900", ", c #a0a0a4", "- c #ffff00", ". c None", /* pixels */ "................................", "....................++-+--......", "..................+-+-++-.......", ".................+-+-++-++-.....", ".................+-+-+''+.......", ".................+++++'''$......", ".................++$$''''$......", ".................$+$'''$$.......", ".................$''$''''$......", ".................$''''$'$.......", ".................$''$'''$.......", "................((''$$''$.......", "...............($$$(''$.........", "..............($''$$((..........", ".............$'''''$*((.........", "............$$'''''$**(.........", "...........$'''''''$**(.........", "..........$'''''$'$)**(.........", "..........$'''''$$)***(.........", ".........$'''''$$)(***(.........", ".........$''$'$$)))(**(.........", ".........$'''''$$)****(.........", "..........$'''''$$)**)('$$......", "...........$'''''$$$*('''$......", "............$''''''$$('''$......", "............($''''''$(''$.......", ".............($$''''$($$$.......", ".............(($'''$((..........", "............(*&*$$$((...........", "............(*******(...........", "............(*****))(...........", "............()*****)(...........", "............())******(..........", "............(()******(..........", ".............())******(.........", ".............(())******(........", "........!!!..((()******(........", ".......!(%%!.()()))*****(.......", "......!!#!%%!.()(())****(.......", ".....!%%!#%%%!()))())))**(......", "....!%%%%!%%%#!!))()))***(......", "...!%%%%#!#%%%%%!))())*!!!......", "...!####!!!#%%%%%!)(!!!%#!......", "...!!!!....!#%%%%!)!%%,%#!......", "............!##%%!*!#%,%#!......", ".............!!##!(!#%,%#!......", "...............!!...!#%,!.......", "....................!#%,!.......", "....................!#%,!.......", "....................!#%,!.......", "....................!#%%!.......", "....................!#%,!!......", "....................!!#!%%!!....", "....................!%!%%,,,!!..", "....................!#!#####%!..", "....................!!!!!!!!!!..", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_2.xpm0100644000175000017500000000415007041513604020211 0ustar aaronlaaronl/* XPM */ static char *hero_2[] = { /* width height ncolors chars_per_pixel */ "30 50 13 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #555555", "& c #999966", "' c #ff9966", "( c #666600", ") c #669900", "* c #999900", "+ c #cc9900", ", c #a0a0a4", "- c #ffff00", ". c None", /* pixels */ "...................++-+--.....", ".................+-+-++-......", "................+-+-++-+--....", "................+-+-+''+......", "................+++++'''$.....", "................++$$''''$.....", "................$+$'''$$......", "................$''$''''$.....", "...............$$''''$'$......", "..............(((''$'''$......", "............$$$$$(($$''$......", "..........$$$''''$*((.....$$..", "........$$'$''''''**($...$'$$.", ".......$$''''''''$***($..$''$$", "......$'''''''''$$***((.$'$''$", ".....$$''$'''$$$)****($.$$'$$$", ".....$''''$$$$)))(***('$$'''$$", ".....$'''''$$))**)(*(&'$'''$$.", "......$'''''$$$$****((''''$$..", ".......$''''''''$**(&&''''$...", "........$$'''''$**(&(($''$....", ".........$$'''''$((&((.$$.....", "..........$''''$(&&()(........", "...........$''$(((()(.........", "............$$&&&&&((.........", "............(&&&&&&&(.........", "............(((((((((.........", "............%*****)((.........", "...........()********(........", "...........((*********((......", "...........(()**********((....", "...........((()***********(...", "..........(*)())****)))****(..", "..........(*))()))*))))))**(..", "..........(*)))((**)*******(..", "..........(**))))(((!!****)(..", ".........(**)))))(.!#%!!*)(...", ".........(**)))))(!#%,%%!!(...", "........!!(!)))))!#%,%##!!....", "..!!!!!!%%%%!))(!#%,%#!!......", ".!#%!%%%%%%%%!)!#%,%#!........", ".#!!#%%%%%%%%!!!%%%#!.........", ".!#%!########!#%!#%!..........", ".!#%%!!!!!!!.!#%!!!!..........", ".!#%%!........!!%%%!..........", ".!#%!..........!#%,,!.........", ".!#%!...........!#%%!.........", ".!#!.............!##!.........", ".!!...............!!!.........", "..............................", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_4.xpm0100644000175000017500000000447607041513604020226 0ustar aaronlaaronl/* XPM */ static char *hero_4[] = { /* width height ncolors chars_per_pixel */ "26 64 11 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #999966", "& c #555555", "' c #ff9966", "( c #666600", ") c #999900", "* c #cc9900", "+ c #ffff00", ", c None", /* pixels */ ",$$'$,,,,,,,,,,,,,,,,$'$$,", "$$''$,,,,,,,,,,,,,,,,$''$$", "$''$'$,,,,,,,,,,,,,,$'$''$", "$''$$,,,,,,,,,,,,,,,,$$''$", "$''$,,,,,,,,,,,,,,,,,,$''$", "$''$$,,,,,,,,,,,,,,,,$$''$", "$'''$,,,,++*++***,,,&$'''$", "$''''$,,,,+**+++*,,,$''''$", "$''''$,,+**+*+***,,,$''''$", ",$'''$,,,$*'**''$,,,$'''$,", ",$''$$,,,$''''''$,,,$$''$,", ",$$''$$,$$''$''$$$,$$''$$,", ",,$'''$,$'$$'$$'$$,$'''$,,", ",,$''''$,$'''''$$,(''''$,,", ",,$''''$,$''$''$$,(''''$,,", ",,$''''$,$$'$$'$$,(''''$,,", ",,$''''$,$$$''$'(,($'''$,,", ",,,$''$&&('$$$$'(($$''$,,,", ",,,$$''%&(($''$())(''$$,,,", ",,,,$''&%&((((&((((''$,,,,", ",,,,$''%&%(%((%%%((''$,,,,", ",,,,$'%(%&%)%%%%%((%'$,,,,", ",,,,,$((&%%&((%%%%$$(,,,,,", ",,,,,,$%(%&%%()%%%)(,,,,,,", ",,,,,,$)%(%%&%((%%((,,,,,,", ",,,,,,$)))(&%%&))()(,,,,,,", ",,,,,,$(%()(%&%%()((,,,,,,", ",,,,,,,())))(%%&%((,,,,,,,", ",,,,,,,(())(%(&%%&(,,,,,,,", ",,,,,,,,(%)())(%&%&,,,,,,,", ",,,,,,,,()%))))((%&,,,,,,,", ",,,,,,,&%())))))(&&,,,,,,,", ",,,,,,%&%%((((((%%&,,,,,,,", ",,,,,,%&%%%%&%&%%%&%&,,,,,", ",,,,,,%((%%%&%&%%%(%%,,,,,", ",,,,,,%((((((((((((%%,,,,,", ",,,,,,%()())))))))((%,,,,,", ",,,,,,%())))))))())(%,,,,,", ",,,,,,%()))()))()))(%,,,,,", ",,,,,,())))))(())))((,,,,,", ",,,,,,()))))(((())))(,,,,,", ",,,,,,())))((,()()))(,,,,,", ",,,,,,()))()(,()))))(,,,,,", ",,,,,,())))((,())))))(,,,,", ",,,,,()))))((,())))))(,,,,", ",,,,,()))))((,())))))(,,,,", ",,,,,()))))((,())))))(,,,,", ",,,,,()()))(,,,()))))(,,,,", ",,,,,())()((,,,()))))(,,,,", ",,,,,()()(((,,,(()))(,,,,,", ",,,,,(!!!!((,,,,(!!!!(,,,,", ",,,,,!#&&#!,,,,,!#&&#!,,,,", ",,,,,!#&&#!,,,,,!#&&#!,,,,", ",,,,,!#&&#!,,,,,!#&&#!,,,,", ",,,,,!#&#!,,,,,,,!#&#!,,,,", ",,,,,!#&#!,,,,,,,!#&#!,,,,", ",,,,!#&&#!,,,,,,,!#&&#!,,,", ",,,,!#&&#!,,,,,,,!#&&#!,,,", ",,,,!!!!!!,,,,,,,!!!!!!,,,", ",,,,!#&&#!,,,,,,,!#&&#!,,,", ",,,,!&&&&!,,,,,,,!&&&&!,,,", ",,,,!&&&&!,,,,,,,!&&&&!,,,", ",,,,!###!!,,,,,,,!!###!,,,", ",,,,!!!!!!,,,,,,,!!!!!!,,,", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_5.xpm0100644000175000017500000000477607041513604020232 0ustar aaronlaaronl/* XPM */ static char *hero_5[] = { /* width height ncolors chars_per_pixel */ "34 56 11 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #999966", "& c #555555", "' c #ff9966", "( c #666600", ") c #999900", "* c #cc9900", "+ c #ffff00", ", c None", /* pixels */ ",,,,,,,,,,,,,++*++***,,,,,,,,,,,,,", ",,,,,,,,,,,,,,+**+++*,,,,,,,,,,,,,", ",,,,,,,,,,,,+**+*+***,,,,,,,,,,,,,", ",,,,,,,,,,,,,$*'**''$,,,,,,,,,,,,,", ",,,,,,,,,,,,,$''''''$,,,,,,,,,,,,,", ",,,,,,,,,,,,$$''$''$$$,,,,,,,,,,,,", ",,,,,,,,,,,,$'$$'$$'$$,,,,,,,,,,,,", ",,,,,,,,,,,,,$'''''$$,,,,,,,,,,,,,", ",,,,,,,,,,,,,$''$''$$,,,,,,,,,,,,,", ",,,,,,,,,,,,,$$'$$'$$,,,,,,,,,,,,,", ",,,,,,,,,,,,,$$$''$'(,,,,,,,,,,,,,", ",,,,,,,,$$$&&('$$$$'((($$$,,,,,,,,", ",,,,,,,$'''%&(($''$())('''$,,,,,,,", ",,,,,,,$'''&%&((((&(((('''$,,,,,,,", ",,,,,,,$'''%&%(%((%%%(('''$,,,,,,,", ",,,,,,$$'''(%&%)%%%%%(('''$$,,,,,,", ",,,,,,$''$$(&%%&((%%%%($$''$,,,,,,", ",,,,,$''''$%(%&%%()%%%)($'''$,,,,,", ",,,,,$''''$)%(%%&%((%%((''''$,,,,,", ",,,,,$''''$)))(&%%&))()(''''$,,,,,", ",,,,,$''''$(%()(%&%%()((''''$,,,,,", ",,,,,$'''$,())))(%%&%((,$'''$,,,,,", ",,,,$$''$$,(())(%(&%%&(,$$''$$,,,,", ",,,,$''$$,,,(%)())(%&%&,,$$''$,,,,", ",,,,$'''$,,,()%))))((%&,,$'''$,,,,", ",,,$''''$,,&%())))))(&&,,$''''$,,,", ",,,$''''$&%&%%((((((%%%&,$''''$,,,", ",,,$'''$,%%&%%%%&%&%%%%&%&$'''$,,,", ",,,$''$$,%%((%%%&%&%%%((%%$$''$,,,", ",,,$''$,,%%(((((((((((((%%,$''$,,,", ",,,$''$$,%())()))))))))((%$$''$,,,", ",,,$''$'$%()()))))))()))(%'$''$,,,", ",,,$$''$,%())))()))())))(%$''$$,,,", ",,,,$$'$,()))))))(()))))(($'$$,,,,", ",,,,,,$,,())))))(((()))))(,$,,,,,,", ",,,,,,,,,()))))((,()())))(,,,,,,,,", ",,,,,,,,,())))()(,())))))(,,,,,,,,", ",,,,,,,,,()))))((,()))))))(,,,,,,,", ",,,,,,,,())))))((,()))))))(,,,,,,,", ",,,,,,,,())))))((,()))))))(,,,,,,,", ",,,,,,,,()())))(,,,())))))(,,,,,,,", ",,,,,,,,())())((,,,())()))(,,,,,,,", ",,,,,,,,()()((((,,,(())))(,,,,,,,,", ",,,,,,,,,(!!!!((,,,(((!!!(,,,,,,,,", ",,,,,,,,,!#&&#!,,,,,!!&&#!,,,,,,,,", ",,,,,,,,,!#&&#!,,,,,!#&&#!,,,,,,,,", ",,,,,,,,,!#&&#!,,,,,!#&&#!,,,,,,,,", ",,,,,,,,,!#&#!,,,,,,,!#&#!,,,,,,,,", ",,,,,,,,,!#&#!,,,,,,,!#&#!,,,,,,,,", ",,,,,,,,!#&&#!,,,,,,,!#&&#!,,,,,,,", ",,,,,,,,!#&&#!,,,,,,,!#&&#!,,,,,,,", ",,,,,,,,!!!!!!,,,,,,,!#&#!!!,,,,,,", ",,,,,,,,!#&&#!,,,,,,,,!#!&&&!,,,,,", ",,,,,,,!#&&&&#!,,,,,,!#!&&&&&!,,,,", ",,,,,,,!######!,,,,,,!#!#####!,,,,", ",,,,,,,!!!!!!!!,,,,,,!!!!!!!!!,,,,", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_9.xpm0100644000175000017500000000334307041513604020223 0ustar aaronlaaronl/* XPM */ static char *hero_9[] = { /* width height ncolors chars_per_pixel */ "28 42 12 1 0 0", /* colors */ "! c #000000", "# c #996666", "$ c #555555", "% c #999966", "& c #ff9966", "' c #666600", "( c #669900", ") c #999900", "* c #cc9900", "+ c #808080", ", c #ffff00", "- c None", /* pixels */ "--------------**,*,,--------", "------------*,*,**,---------", "-----------*,*,**,**,-------", "-----------*,*,*&&*---------", "-----------*****&&&#--------", "-----------**##&&&&#--------", "-----------#*#&&&##---------", "-----------#&&#&&&&#--------", "----------'#&&&&#&#---------", "---------###&&#&&&#---------", "--------########&&#---------", "-------#&&&&#(####----------", "------#&&&&&#)))(('---------", "------#&&&&&#))))('-###-----", "-----#&#&&&&#)))))'-#&&#----", "----##&&&&&#))))))'#&&&#----", "----#&&&&&#))'))))#&&&&#----", "----#&&&&&#)))')))'&&&##----", "---#&&&&##))))))))'####-----", "---#&&&&&&#)))))))##--------", "---#&&&&&&###)))))'---------", "----#&&&&&&###)))'----------", "-----##&&&&&&&#))'----------", "-------#&&&&&&&#''----------", "--------###&&&&#%%'---------", "---------'##&&#''''---------", "--------'%%%##''+%%'''------", "-------'%%(())))'%%%%%'-----", "-------')%%(%)))'')))))''---", "-------')%)%%))))')))))))'--", "-------')))))%%)))''))))('--", "-------'))')))))))'')))))'--", "--------'''!!!!)))'')))')'--", "----------!!!!!!)'')))'))'--", "---------!!!+!!'''!''''''---", "--------!!++!!''!!!---------", "-------!$++!!!!!$!!!!-------", "-------!$+!!!!!!$!!!!!------", "-------!!!$$$!!!$$$!!!!-----", "-------!!!!+++!!!++++!!-----", "--------!!!!!!!!!!!!!!!-----", "---------!!!!!!!-!!!!!!-----", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_10.xpm0100644000175000017500000000334407041513604020274 0ustar aaronlaaronl/* XPM */ static char *hero_10[] = { /* width height ncolors chars_per_pixel */ "28 42 12 1 0 0", /* colors */ "! c #000000", "# c #996666", "$ c #555555", "% c #999966", "& c #ff9966", "' c #666600", "( c #669900", ") c #999900", "* c #cc9900", "+ c #a0a0a4", ", c #ffff00", "- c None", /* pixels */ "---------------**,*,,-------", "-------------*,*,**,--------", "------------*,*,**,**,------", "------------*,*,*&&*--------", "------------*****&&&#-------", "------------**##&&&&#-------", "------------#*#&&&##--------", "------------#&&#&&&&#-------", "------------#&&&&#&#--------", "----------)'#&&#&&&#--------", "--------####)''##&&#-----##-", "------###&&&#)#####----##&&#", "----##&#&&&&#))))('----#&&&#", "---##&&&&&&&#)())(('-##&&&&#", "--#&&&&&&&&#)))))))'##&&&&&#", "-#&&&#&&&###)))))))'#&&&###-", "-#&&&&####)))))))))'&&&&#---", "-#&&&&&##(())')))))'&&&#----", "--#&&&&&##))))''))''&&#-----", "---#&&&&&&#))))))''&&#------", "----#&&&&&&#)))))'###-------", "-----##&&&&#)))))'#---------", "------#&&&##)))))'----------", "-------####))))))'----------", "--------')''''''''----------", "--------''%%%%%%%'----------", "--------'%%%''''''''''''''--", "-------''''''%%%%%%%%%%%'%'-", "-------'%%%%%'%%%%%%%%%%%%'-", "-------'%%%%%%'%%%%%%%%%%%'-", "-------'%%%%%%'%%'%%%(%%%%'-", "--------'%%%%%'%%%'%%%%!!!!-", "---!----'%%%%%'%%%%%%(!$!!!-", "--!!!----'%%'%%'''''!!$$!!!-", "-!!!!!---'%%%%%'---!!$+$!!--", "-!!!$!!--'%%%%%'---!$$$!!---", "!!!$!!!!!!(%%%%'--!!$+$!!---", "!!$$!!+!!!!(%%%'--!!$$!!!---", "!$!!!!!+!!!!)%('--!!$!!!!!!-", "!!!!!!!!++!!!%%'--!!$$$!!!!!", "!!!--!!!!+!!!%'---!!!!$$$!!!", "!!------!!!!'''---!!!!!!!!!!", }; xevil-2.02r2.orig/x11/gen_xpm/hero/10b_duplicate_of_90100644000175000017500000000000007041513604021546 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/hero/hero_18.xpm0100644000175000017500000000535507041513604020310 0ustar aaronlaaronl/* XPM */ static char *hero_18[] = { /* width height ncolors chars_per_pixel */ "30 66 17 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #993366", "% c #996666", "& c #999966", "' c #555555", "( c #4d4d4d", ") c #ff9966", "* c #333300", "+ c #666600", ", c #669900", "- c #999900", ". c #cc9900", "/ c #a0a0a4", "0 c #808080", "1 c #ffff00", "2 c None", /* pixels */ "22222222222222222222222%2%2%22", "22222222222222222222222%%%%)%2", "222222222222222222222222%))%%2", "22222222222222222222222%))%)%2", "222222222222222222222222%%)%%2", "222222222222222222222222%)))%2", "222222222222222222222222%%)%%2", "2222222222222222222222222%)))%", "2222222222222222222222222%)))%", "22222222222211.11...22222%)))%", "22222222222221..111.2222%))))%", "222222222221..1.1...2222$))))%", "2222222222221.1.11.%2222%%)))%", "222222222222%.1..1..2222%%)))%", "222222222222%.1.11.%2222%%)))%", "222222222222..1..1.22222%)))%2", "222222222222%.1..1..222%))))%2", "222%22222222%.....1%22%)))))%2", "22%)%%%22222%%.1..%+22%)))))%2", "22%)))%22+++++%-'%/++%%))))%22", "22%)))%22+%---%-0%---)))))%222", "22%)))%%%+-----%'/---))))%2222", "222%))%)%-----'0%----)))%22222", "222%))%))----%0'------)%222222", "22%))%)))---%'%%-----+)%222222", "22%))%)))%---/'(----+2%2222222", "22%)%)))%--(0%%--,--+222222222", "22%))))))+-''/---,--+222222222", "22%))))%22+'%-------+222222222", "22%)))%222'+++++--,+2222222222", "22%%%%2222'&&&&+++++2222222222", "222%222++''+++&&&&&+2222222222", "2222+2+,------+++++++222222222", "222+,+,-------------+222222222", "22+-------------,--,+222222222", "22+-----------------+222222222", "22+,,---------,(,----+22222222", "22+!!',------,(,-----+22222222", "22!!!#!'!+++,#+-------+2222222", "22!!!'''2222+(2+------+2222222", "222!!#!'!2222222(-----+2222222", "222!!#''222222222+-----+222222", "222!!'''!22222222+-----+222222", "222!!'''!22222222+-----+222222", "2222!#''*22222222+------+22222", "2222!'''!!2222222+------+22222", "2222!'''!!22222222+-----+22222", "2222!'''#!22222222+-----+22222", "22222''!!!22222222!,,-#!!22222", "2222!!'#!!22222222!!!##!!22222", "222!##'#!!222222222#'##!!22222", "222!!!!!!2222222222!'##!!22222", "2222222222222222222!!##!!22222", "2222222222222222222!'##!!22222", "222222222222222222!!'##!222222", "222222222222222222!!!##!222222", "222222222222222222!!'##!222222", "222222222222222222!#'##!222222", "222222222222222222!#'!#!222222", "222222222222222222!!!!#!222222", "222222222222222222!!''#2222222", "2222222222222222222#'!!!222222", "222222222222222222!#!'''222222", "222222222222222222#!''''222222", "222222222222222222#!####!22222", "2222222222222222222!!!!!!22222", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_20.xpm0100644000175000017500000000541707041513604020300 0ustar aaronlaaronl/* XPM */ static char *hero_20[] = { /* width height ncolors chars_per_pixel */ "30 66 19 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #666666", "% c #996666", "& c #999966", "' c #555555", "( c #4d4d4d", ") c #ff9966", "* c #ffcc66", "+ c #333300", ", c #cc3399", "- c #666600", ". c #669900", "/ c #999900", "0 c #cc9900", "1 c #a0a0a4", "2 c #808080", "3 c #ffff00", "4 c None", /* pixels */ "444444444444444444444444444444", "44444444444444444444444444%4%4", "444444444444444444444444%%)%)%", "444444444444444444444444%)%%)%", "444444444444444444444444%)))%%", "444444444444444444444444%))%)%", "4444444444444444444444444%%))%", "444444444444444444444444%))))%", "444444444444444444444444')))%%", "444444444444330330004444%))))%", "444444444444430033304444$%)))%", "444444444443003030004444%%)))%", "444%444444443030330%4444%*)))%", "44%)%%%44444%03003004444%%)))%", "44%)))%44444%030330%444%)))0)%", "44%)))%444440030030444%))))))%", "44%%)%444444%03003004%)))00)%4", "44%)))%44444%000003%4%)0))%%44", "44%)))%44444%%0300%-2)))0%4444", "44%))),444----%/'%1%/))))%4444", "44%)))44%-%/////2%////))%44444", "44%)))%%%./////%'1////%%444444", "44%))%)))/////'2%////-44444444", "4%))%))))////%2'/////-44444444", "4%)))))).//%%'%%/////-44444444", "4%))))))%%(//1'(////-444444444", "44%)%%%%44/(2%%///./-444444444", "444%4444444''1///../-444444444", "44444444444'%///////-444444444", "4444444444'----/////-444444444", "4444444444'&&&&------444444444", "444444444''---&&&&&&-444444444", "444444---/////---&&&-444444444", "44444-/..////////----444444444", "4444-#..////////.//.1444444444", "444-//////////.////.-444444444", "44-///////////.(/////-44444444", "44-./////////.(./////-44444444", "44-././.!'-/.#-/./////-4444444", "44-!!!!(/!4---4-/////.-4444444", "444!!!'!!4444444-/////-4444444", "4444!#'##!444444-#///.-4444444", "4444!!!'!!4444444-.//./-444444", "44444!!!!!!444444-/////-444444", "44444!!'#'#444444--/////-44444", "444444!!!+(#4444444-.//.-44444", "444444!!!!!#4444444#!!!/!44444", "444444!!''#!4444444!''#!!44444", "4444444!!''#!444444#''#!!44444", "4444444!!!!!!444444#''#!!44444", "444444!!!'''!444444!#'#!!44444", "444444!!'''!!444444#'##!!44444", "444444!'''#!444444!#''#!444444", "444444!!'!44444444!!#'#!444444", "444444444444444444!#'##!444444", "444444444444444444!#''#!444444", "444444444444444444!#''#4444444", "4444444444444444444#'!!4444444", "444444444444444444!#!''4444444", "444444444444444444#!''''444444", "444444444444444444#!####!44444", "444444444444444444!!!!!!!44444", "444444444444444444444444444444", "444444444444444444444444444444", "444444444444444444444444444444", "444444444444444444444444444444", }; xevil-2.02r2.orig/x11/gen_xpm/hero/20b_duplicate_of_180100644000175000017500000000000007041513604021627 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/hero/hero_20c.xpm0100644000175000017500000000533507041513604020442 0ustar aaronlaaronl/* XPM */ static char *hero_20c[] = { /* width height ncolors chars_per_pixel */ "30 66 16 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #cc6666", "& c #999966", "' c #555555", "( c #4d4d4d", ") c #ff9966", "* c #666600", "+ c #669900", ", c #999900", "- c #cc9900", ". c #a0a0a4", "/ c #808080", "0 c #ffff00", "1 c None", /* pixels */ "111111111111111111111111$$1111", "11111111111111111111111$))$$11", "11111111111111111111111$))$$11", "11111111111111111111111$)$)$11", "11111111111111111111111$$)$$11", "11111111111111111111111$)))$11", "11111111111111111111111$$)$$11", "11111111111111111111111$)))$11", "11111111111111111111111$$))$11", "1111111111100-00---1111$)))$11", "1111111111110--000-11111$$))$1", "11111111110--0-0---11111$$))$1", "111111111110-0-00-$11111$)))$1", "11111111111$-0--0--1111$$)))$1", "11$1$1$1111$-0-00-$1111$))))$1", "1$)$$$11111--0--0-11111$)))$11", "1$)))$11111$-0--0--1111$)))$11", "1$)))$11111$-----0$111$))))$11", "11$))$11111$$-0--$*11$))))$111", "1$)))$11*****$,'$.**$)))))$111", "1$)))$1*$$+,,$,/$,,,)))))$1111", "1$$))$$$+,,,,,$'.,,,,)))$11111", "1$))$))$,,,,,'/$,,,,,))$111111", "1$)$)))),,,,,/',,,,,,)$1111111", "1$)))))),,,,'$$,,,,,*$11111111", "1$)))%)),,,,.'(,,,,*1$11111111", "1$))))$$**(/$$,,,,,*1111111111", "11$))$1111''.,,++,,*1111111111", "111$$1111*'$,,,+,,,*1111111111", "111111111'****,,,,*11111111111", "1111*1***'&&&&*****11111111111", "11*+,*,+,,***&&&&&*11111111111", "11*,,,,,,,,,,***&&&*1111111111", "11*+,,,,,,,,,,,,****1111111111", "11!,!,,,,,,,,,,+,,+.1111111111", "11!!!+,,,,,,,,,,+,+*1111111111", "11!!!!,,,,,,,+(+,,,,*111111111", "11!!!!,,,,,,+(+,,,,,*111111111", "11!!!!''***+#*,+,,,,,*11111111", "11!!!'''111*(1*,,,,,,*11111111", "11!!'''!1111111*,,,,,*11111111", "11!!!'!!11111111*,,,,,*1111111", "11!!'''!!1111111*,,,,,,*111111", "111!#'!!111111111*,,,,,,*11111", "111!!'#!!11111111*,,,,,,*11111", "111!'''!!111111111*,,,,,*11111", "111!''!!1111111111*,,,,+*11111", "111!!'!!!111111111*,,,+!*11111", "111!!'!!!111111111*,,+#!111111", "1111!!!!1111111111!,+#!!111111", "111111111111111111!#'#!!111111", "111111111111111111!!'##!111111", "111111111111111111!!'##!111111", "111111111111111111!#'##!111111", "111111111111111111!!'##!111111", "111111111111111111!!'##!111111", "111111111111111111!#'##!111111", "111111111111111111!!!!#!111111", "111111111111111111!!!##!111111", "111111111111111111!#''#1111111", "111111111111111111!#'!!!111111", "111111111111111111!#!'''111111", "111111111111111111#!''''!11111", "1111111111111111111!###!!11111", "11111111111111111111!!!!!11111", "111111111111111111111111111111", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_20d.xpm0100644000175000017500000000537707041513604020451 0ustar aaronlaaronl/* XPM */ static char *hero_20d[] = { /* width height ncolors chars_per_pixel */ "30 66 18 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #996666", "& c #999966", "' c #555555", "( c #4d4d4d", ") c #ff9966", "* c #ffcc66", "+ c #663300", ", c #666600", "- c #669900", ". c #999900", "/ c #cc9900", "0 c #a0a0a4", "1 c #808080", "2 c #ffff00", "3 c None", /* pixels */ "333333333333333333333333333333", "333333333333333333333333333333", "33%3%3%33333333333333333333333", "3%)%%%333333333333333333333333", "3%)))%333333333333333333333333", "3%))%%3333333333333333333%3333", "3%))%3333333333333333%%%%)%333", "3%))%3333333333333333%)))%%333", "%)%%%3333333333333333%))%)%333", "%))%33333322/22///3333%))%%333", "%))%33333332//222/3333%)))%333", "%)))%33332//2/2///33333%)%%333", "%)))%333332/2/22/%33333%))%%33", "%)))%33333%/2//2//33333%)))%33", "%)))%33333%/2/22/%33333%))%%33", "%%))%33333//2//2/333333%**)%33", "3%)))%%333%/2//2//33333%))%%33", "3%%))%%333%/////2%33333%)))%33", "33%)))%333%%/2//%,3333%%)))%33", "33%)))%%,,,,%.'%0,%%%%)))))%33", "333%)))-......1%..)))%))))%%33", "333%)))......%'0..%))))))%%333", "3333%)).....'1%....)))))%33333", "33333%%....%1'......)))%333333", "333333,....'%%......)%%3333333", "3333333,...0'(....,3%333333333", "33333333,(1%%.....,33333333333", "33333333,''0...-..,33333333333", "33333333,'%...--..,33333333333", "33333333',,,,....,333333333333", "333,,,,3'&&&&,,,,,333333333333", "333,-.-,',,,&&&&&,333333333333", "33,.........,,,,,,,33333333333", "33,............0..,33333333333", "33,...........-...,33333333333", "33,...............,33333333333", "33,-........-(-....,3333333333", "33###......-(-......,333333333", "33###''.,.-$,-......,333333333", "33###.'#3,,(3,-......,33333333", "33###''#333333(.......,3333333", "33##'''#3333333,......,3333333", "33#'''##33333333,......,333333", "33##''##33333333,-.....,333333", "33##''#3333333333,.....#333333", "33##''#33333333333,'-.##333333", "33##'##33333333333$'$###333333", "33##'(#!333333333$'$$###333333", "33##''##333333333$'$$###333333", "333''###333333333$'$$###333333", "33##'###333333333###$###333333", "33#'''$#33333333+$'$$##3333333", "33##'###33333333#$'$$##3333333", "33######33333333####$#33333333", "3333333333333333#$''$#33333333", "3333333333333333#$'##333333333", "3333333333333333###''333333333", "333333333333333###'''333333333", "333333333333333###$$3333333333", "33333333333333#######333333333", "33333333333333########33333333", "33333333333333########33333333", "333333333333333333333333333333", "333333333333333333333333333333", "333333333333333333333333333333", "333333333333333333333333333333", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_20e.xpm0100644000175000017500000000533507041513604020444 0ustar aaronlaaronl/* XPM */ static char *hero_20e[] = { /* width height ncolors chars_per_pixel */ "30 66 16 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #999966", "& c #555555", "' c #4d4d4d", "( c #ff9966", ") c #666600", "* c #669900", "+ c #999900", ", c #cc9900", "- c #ff9999", ". c #a0a0a4", "/ c #808080", "0 c #ffff00", "1 c None", /* pixels */ "111111111111111111111111111111", "111111111111111111111111111111", "111111111111111111111111111111", "111111111111111111111111111111", "111111111111111111111111111111", "1$1111111111111111111111111111", "$($$$1111111111111111111111111", "$($$$1111111111111111111111111", "$(($$1111111111111111111111111", "$(($11111100,00,,,111111111111", "$((($1111110,,000,111111111111", "$((($11110,,0,0,,,111111111111", "$($($111110,0,00,$111$$$1$1111", "$(($111111$,0,,0,,111$($$($111", "$(($111111$,0,00,$111$((($$111", "$(($111111,,0,,0,1111$(((($111", "$-($111111$,0,,0,,1111$(($$111", "$((($11111$,,,,,0$1111$((($111", "$((($$$$11$$,0,,$)11111$(($$11", "$((($(($))))$+&$.)$$$11$((($11", "$((((((($*++$+/$++((($$$((($11", "$$(((((((++++$&.++$(((($($($11", "$$$$(((+++++&/$++++((((($(($11", "11$$(($++++$/&++++++(((($(($11", "111$$$)++++&$$++++++((((($($11", "1111111)+++.&'++++)1$((((($111", "11111111)'/$$++**+)11$(((($111", "111111111&&.++**++)1)))((($111", "111111111&$+++++++))*++))$$111", "11111111&$+++++))))&++++)11111", "11111111&/)))))%%%%&++*+)11111", "11111111&)%%%%%%)))&+++*)11111", "11111111)%%%%)))++++++++)11111", "111111111))))+++++++++*+)11111", "111111111)*+++++++++++&&)11111", "111111111)*++++*+++++*&!!11111", "11111111)+++++'*++++*&&!!11111", "1111111)++++++*'*++++&!!111111", "1111111)+++++++)#++&&&!!111111", "111111)+++++++)1'))+&&!!111111", "111111)++++++)11111&&&!!111111", "111111)+++++)11111!&&&!!111111", "11111)+++++)1111111#&!!1111111", "11111)+++++)1111111&&!!1111111", "1111)+++++)1111111!&&&!!111111", "1111)*++++)1111111!#&&&!111111", "1111!+!!+)111111111!!&!!111111", "1111!!#&&)11111111111111111111", "1111!!#&#!11111111111111111111", "1111!!##�", "1111!!##�", "1111!!#&�", "11111!##�", "1111!!#&�", "11111!##�", "11111!##&#!1111111111111111111", "11111!#&&#!1111111111111111111", "111111#&&#!1111111111111111111", "111111!!�", "111111&&!#!1111111111111111111", "11111&&&&!#1111111111111111111", "1111!####!#1111111111111111111", "1111!!!!!!!1111111111111111111", "111111111111111111111111111111", "111111111111111111111111111111", "111111111111111111111111111111", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_20f.xpm0100644000175000017500000000537707041513604020453 0ustar aaronlaaronl/* XPM */ static char *hero_20f[] = { /* width height ncolors chars_per_pixel */ "30 66 18 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #996666", "& c #999966", "' c #555555", "( c #4d4d4d", ") c #ff9966", "* c #ffcc66", "+ c #666600", ", c #669900", "- c #999900", ". c #cc9900", "/ c #a0a0a4", "0 c #808080", "1 c #ffff00", "2 c None", "3 c #330066", /* pixels */ "222222222222222222222222222222", "222222222222222222222222222222", "222222222222222222222222%2%2%2", "2222222222222222222222222%%%)%", "222222222222222222222222%)))%%", "222222222222222222222222%))))%", "2222%%%%22222222222222222%))%%", "222%)))%22222222222222222%)))%", "222%)))%22222222222222222%))%%", "222%))%2222211.11...22222%)))%", "222%))%2222221..111.22222%)))%", "22%%)%%22221..1.1...22222%)*)%", "22%)))%222221.1.11.%2222%))))%", "22%))%222222%.1..1..2222%)))%2", "22%%*%222222%.1.11.%222%))))%2", "22%))%222222..1..1.222%))))%22", "22%))%222222%.1..1..2%)))%)%22", "22%)))%22222%.....1%2%)%))%222", "22%))%%%2222%%.1..%+%%)))%2222", "22%)))))%%++++%-'%/%))))%22222", "22%)))))))%---%-0%--)))%222222", "222%)))))))----%'/--%)%2222222", "222%%))))-----'0%----%22222222", "2222%%)))-----0'-----+22222222", "22222%%%,----'%%-----+22222222", "222222222%---/'(----+222222222", "2222222222-(0%%-----+222222222", "22222222222''/---,--+222222222", "22222222222'%---,,--+222222222", "2222222222'%-----++++'22222222", "2222222222'0%++++&&&&'22222222", "2222222222'++&&&&&+++''+++2222", "2222222222+&&&&+++--/-----+222", "22222222222++++------------+22", "2222222222+/---,------------+2", "2222222222+---,-------------+2", "2222222222+---+,------------+2", "2222222222+----+,-------(--#+2", "2222222222-------+---''##-##22", "222222222+------+2+++2##(###22", "222222222+-----+222222#$$##222", "222222222+-----+222222##$##222", "222222222+-----+22222######222", "22222222+-----+222222$''##2222", "22222222+-----+22222#####32222", "22222222+----+222222$#####2222", "2222222+####-+222222#$''##2222", "2222222###$#+222222#$''##22222", "2222222$''$##222222######22222", "222222#$'$###222222#'''###2222", "222222#$'$###222222##'''##2222", "222222#$$'$##222222##$'''#2222", "222222#$$'$##2222222###'##2222", "222222#$''$##22222222222222222", "222222!$'($##22222222222222222", "222222#$$'$#222222222222222222", "222222#$''$#222222222222222222", "2222222$''$#222222222222222222", "2222222$''$#222222222222222222", "222222###'$2222222222222222222", "2222'''#$#22222222222222222222", "2222''''#$22222222222222222222", "2222$$$$#$#2222222222222222222", "22222######2222222222222222222", "222222222222222222222222222222", "222222222222222222222222222222", }; xevil-2.02r2.orig/x11/gen_xpm/hero/23_duplicate_of_200100644000175000017500000000000007041513604021461 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/hero/23b_duplicate_of_180100644000175000017500000000000007041513604021632 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/hero/23c_duplicate_of_20c0100644000175000017500000000000007041513604021767 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/hero/23d_duplicate_of_20d0100644000175000017500000000000007041513604021771 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/hero/23e_duplicate_of_20e0100644000175000017500000000000007041513604021773 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/hero/23f_duplicate_of_20f0100644000175000017500000000000007041513604021775 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/hero/hero_25.xpm0100644000175000017500000000211107041513604020271 0ustar aaronlaaronl/* XPM */ static char *hero_25[] = { /* width height ncolors chars_per_pixel */ "56 12 13 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #555555", "& c #999966", "' c #ff9966", "( c #666600", ") c #669900", "* c #999900", "+ c #cc9900", ", c #ff0000", "- c #ffff00", ". c None", /* pixels */ "........................................................", "..-.....................................................", "-.+.$$.$..............................................!!", "--++''$$$$$.....((((,(($(,,,,........................!#!", "++,'',,,',,,(((((***,,,**&&(,,,((...................!%#!", "-+,''$',''',,,,,(******,*&&()*,,,(((................!%#!", "+-+++'''''',*$$,,$$$****,,,,,******(((((((.........!%%#!", "++-,+$'$''$,,$'','',,$$$$$$(,,$$*********)!!!!!!!!!!%%#!", ".-+,+$$''''*,''''''''''''''$$,,$$******,*)!%######,#!%#!", ".+--+++'',,*$,'''',,'''''''''',,$*******,*)!%%%%%%%%#!!#", "..++++$$$,$$$$'''',''$''''''''',$**)**))***!%%%%%%%%!%#!", ".......,,,$$$*$$$$$$$$$$$$$$$$,,,,,,,((((((!!%%%%!!!!!!.", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_26.xpm0100644000175000017500000000504107041513604020277 0ustar aaronlaaronl/* XPM */ static char *hero_26[] = { /* width height ncolors chars_per_pixel */ "34 56 13 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #999966", "& c #555555", "' c #ff9966", "( c #666600", ") c #669900", "* c #999900", "+ c #cc9900", ", c #a0a0a4", "- c #ffff00", ". c None", /* pixels */ "..................................", ".............++-+--...............", "...........+-+-++-................", "..........+-+-++-++-..............", "..........+-+-+''+................", "..........+++++'''$...............", "..........++$$''''$...............", "..........$+$'''$$................", "..........$''$''''$...............", "..........$''''$'$................", ".........$$''$'''$................", "........$('''$$''$................", ".......$()((&$$$$$$$$..$$$$$$$$$$.", "......$(***)$'''$''''$$''''''''''$", ".....$'(***$'''''''''''''''''''''$", "....$'(****$''''''''''''''''$''''$", "...$''(****$'''''''''''''$$$$$''$.", "...$''(****)$''$''''''$$$$$..$$$..", "..$'''(***))$$$$$$$$$$............", "..$'''(**))))***(.................", "..$'''(**)******(.................", "...$$'()******))(.................", ".....$((**)***)*(.................", "......((**)****(..................", "......(*****)**(..................", "......(((((((**(..................", ".....(%%%%%%%((...................", ".....(%%%%%%%%&...................", ".....$(((((((%&...................", ".....(*******((...................", ".....(********(...................", ".....(*********(..................", ".....(*******(*(..................", ".....(*******(*(..................", ".....((******(**(.................", ".....(******(***(.................", ".....(******(****(................", ".....(******(****(................", ".....(******(*****(...............", "....(*******())***(...............", "....(*******())*!!(...............", "....(*(!!!!((!!!&#!...............", "....(!!&,#!((&&&&#!...............", "....!&&,&#!.!&&&&#!...............", "....!#,&&#!.!#&&&#!...............", "....!#,&&#!.!#&&&#!...............", "....!#,&#!...!#&&!................", "....!&&&#!...!#&&!................", "...!#,&&!....!#&&!................", "...!#&&#!....!#&&!................", "...!#,&#!....!#&&!................", "...!#&#&!!...!##!&!...............", "...!!#&,,,!.!&!!&&&!!.............", "...!&!&&&&,!!#!#&&&&&!............", "...!#!#####!!!!!#####!............", "...!!!!!!!!!.!!!!!!!!!............", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_28.xpm0100644000175000017500000000241007041513604020276 0ustar aaronlaaronl/* XPM */ static char *hero_28[] = { /* width height ncolors chars_per_pixel */ "62 14 12 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #999966", "& c #555555", "' c #ff9966", "( c #666600", ") c #669900", "* c #999900", "+ c #cc9900", ", c #ffff00", "- c None", /* pixels */ "----------------------------------------------++,+,,----------", "--------------------------------------------+,+,++,-----------", "---------------------------(((((((((((((($-+,+,++,++,---------", "-!!!!!!&&&&!)(((((((-(((((((%%(*********$$$$$$$$$'+$$$$$$$$$$-", "!#&!&&&&&&&&!(*************(%%(**))****$'''$'''''$$''''''''''$", "#!!#&&&&&&&&&!))))*********(%%(*)))***$''''''''''''''''''''''$", "!#&!##########!)))*********(%%()**))*$$'''''''''''''''''$''''$", "!#&&!!!!!!!!!&#!)))*******((%%(****))$$''''''''''''''$$$$$''$-", "!#&&!---------&#((()*******(%%(*****)**$''$'''''''$$$$$--$$$--", "!#&!-------------((((((((((%%%(*****)(*$$$$$$$$$$$$-----------", "!#&!----------------------(((()*****(*****('''$$''$-----------", "!#!--------------------------$(((()******)((($$$$-------------", "!!-------------------------------$((((((((-$------------------", "--------------------------------------------------------------", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_32.xpm0100644000175000017500000000435507041513604020303 0ustar aaronlaaronl/* XPM */ static char *hero_32[] = { /* width height ncolors chars_per_pixel */ "36 46 13 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #999966", "& c #555555", "' c #ff9966", "( c #666600", ") c #669900", "* c #999900", "+ c #cc9900", ", c #a0a0a4", "- c #ffff00", ". c None", /* pixels */ "..............++-+--................", "............+-+-++-.................", "...........+-+-++-++-...............", "...........+-+-+''+.................", "...........+++++'''$................", "...........++$$''''$................", "...........$+$'''$$.................", "...........$''$''''$................", "...........$''''$'$.................", "..........$$''$'''$.................", ".........$('''$$''$.................", "........$()((&$$$$$$$$..$$$$$$$$$$..", ".......$(***)$'''$''''$$''''''''''$.", "......$'(***$'''''''''''''''''''''$.", ".....$'(****$''''''''''''''''$''''$.", "....$''(****$'''''''''''''$$$$$''$..", "....$''(****)$''$''''''$$$$$..$$$...", "...$'''(***))$$$$$$$$$$.............", "...$'''(**))))***(..................", "...$'''(**)******(..................", "....$$'()******))(..................", "......$((**)***)*(..................", ".......((**)****(...................", ".......(*****)**(...................", ".......(((((((**(...................", "......(%%%%%%%((....................", "......(%%%%%%%%&....................", "......$(((((((%&....................", "......(&******(((((((((.............", "......()****)(*********(............", "......((****************(...........", "......(()***************(...........", "......((()********))***)(...........", ".......(())*************(...........", ".......()()))))))(*)!!!!(...........", ".......())(((((((!!!&&&!............", ".!!!!...())))))(!#&&&,##............", "!&&!#!!!.(())))!#&&,&#!.............", "!!#&&&&#!!!())!#&&,&#!..............", "!&!&&&&&&&#!(!#&&&&#!...............", "!&#!#&&&&&&#!#&&,&#!................", "!&&!!###&&&&!#&&!#!.................", "!&#&!!!!##&&!!#!&&!!................", "!#&&&!..!!#&!&!&&,,,!!..............", "!!###!....!!!#!#####&!..............", ".!!!!!......!!!!!!!!!!..............", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_38.xpm0100644000175000017500000000443707041513604020312 0ustar aaronlaaronl/* XPM */ static char *hero_38[] = { /* width height ncolors chars_per_pixel */ "22 72 11 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #999966", "& c #555555", "' c #ff9966", "( c #666600", ") c #999900", "* c #cc9900", "+ c #ffff00", ", c None", /* pixels */ ",,,,,,,,,,,,,,,$$$$,,,", ",,,,,,,,,,,,,,$''''$,,", ",,,,,,,,,,,,,,$'$''$,,", ",,,,,,,,,,,,,,''$''$,,", ",,,,,,,,,,,,,,$$'''$,,", ",,,,,,,,,,,,,,,$$''$,,", ",,,,,,,,,,,,,,,,$''$,,", ",,,,,,,,,,,,,,,,$$'',,", ",,,,,,,,,,,,,,,,$$''$,", ",,,,,,,,,,,,,,,,$'''$,", ",,,,,,,,,,,,,,,,$'''$,", ",,,,,,,,,,,,,,,,$'''$,", ",,,,,,,,,,+,,+,,$'''',", ",,,,,,,,+*+*++,,$'''',", ",,,,,,,,,+****,,$$'''$", ",,,,,,,+**'''''*$$''$$", ",,,,,,,,$$$'$$'$$''''$", ",,,,,,,,$''$''$$$''''$", ",,,,,,,+$''''''$$''''$", ",,,,,,,$'''$'''$'''''$", ",,,,,,,,$'''''$$'''''$", ",,$$$$$,$'$$$'$$'''''$", ",$''''$,$$$$$$$$'''''$", ",'''''$,$$$''$'()'''$$", ",'''''$&('$$$$'(('''$,", ",'''$'$&(($''$()((''$,", ",''$$$&%&((((&((((%'$,", ",''$$$%&%(%((%%%%$$(,,", ",''$$$(%&%)%%%%%%)(,,,", ",'''$'(&%%&((%%%%%(,,,", ",'''$'((%&%%()%%%%(,,,", "$'''$''((%%&%((%%((,,,", "$''''$'()(&%%&))()(,,,", "$''''$'(()(%&%%()((,,,", "$''''$(()))(%%&%((,,,,", "$''''$(())(%(&%%&(,,,,", "$$''$$,(%)())(%&%&,,,,", ",$$'$,,()%))))((%&,,,,", ",,$$$,&%())))))(&&,,,,", ",,,$,%&%%((((((%%&,,,,", ",,,,,%&%%%%&%&%%%&,,,,", ",,,,,%((((((%&%%%(,,,,", ",,,,,%())))(((((%(,,,,", ",,,,,%()())))))((((,,,", ",,,,,())))))))))))(,,,", ",,,,()))))()))))()(%,,", ",,,(()))))))()()))((,,", ",,,()))))()((()))))(,,", ",,,())()))(((()))))(,,", ",,,()))())((((())))(,,", ",,,,()()(((((()())))(,", ",,,,(!!!!((,,())))))(,", ",,,,!#&&#!,,,())))))(,", ",,,,!#&&#!,,,())))))(,", ",,,,!#&&#!,,,,()))))(,", ",,,,!#&#!,,,,,()))))(,", ",,,,,!#&#!,,,(!)))(!,,", ",,,,,#&&#!,,,,!!))!(,,", ",,,,,#&&#!,,,,!#!!#!,,", ",,,,,&!!&!,,,,!#&&#!,,", ",,,,,!&&!!,,,,!#&&#!,,", ",,,,!&&&&!,,,,,!#&#!,,", ",,,,!&&&&!,,,,,!#&#!,,", ",,,,!&!!!!,,,,,!#&&#!,", ",,,,!!!!!,,,,,,!#&&#!,", ",,,,,,,,,,,,,,,!!&&!!,", ",,,,,,,,,,,,,,,!&!!&!,", ",,,,,,,,,,,,,,,!&&&&!,", ",,,,,,,,,,,,,,,!&&&&!,", ",,,,,,,,,,,,,,,!!###!,", ",,,,,,,,,,,,,,,!!!!!!,", ",,,,,,,,,,,,,,,,!!!!,,", }; xevil-2.02r2.orig/x11/gen_xpm/hero/hero_39.xpm0100644000175000017500000000305007041513604020301 0ustar aaronlaaronl/* XPM */ static char *hero_39[] = { /* width height ncolors chars_per_pixel */ "14 62 12 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #999966", "& c #555555", "' c #ff9966", "( c #666600", ") c #669900", "* c #999900", "+ c #cc9900", ", c #ffff00", "- c None", /* pixels */ "----!#!!!!!!!-", "---!#!######!-", "---!&!&&&&&!--", "---!!#!&&!!---", "---!&&#!!-----", "---!&&#!------", "---!&&#!------", "---&&&#!------", "---&&&#!------", "---&&&#!------", "---&&&#!------", "---!&&#!------", "---)!&#!------", "---((!#&------", "---(*)!#&-----", "---(*))!#-----", "---(*)))(-----", "---(*)))((----", "---(***)((----", "---(****)(----", "----*****(----", "---(*****(----", "---(*****(----", "---(*****(----", "---(*****(----", "---(*****(----", "---(***(*((---", "--(((((((%(---", "--(%%%%%%%(---", "--(%%%%%%%($--", "--(((((((()(--", "--(***)****(--", "--(**)*****(--", "--(*))*****($-", "--(*)))****)(-", "--(***))****(-", "--(****)))(*(-", "--(***$$*(**(-", "--(**$$$****(-", "--(*$'''$$**(-", "--($'''''$**(-", "--$$'''''$*)(-", "---$''''$$((--", "--+$$''''$'($-", "-+,$'''''$'(--", "-,+$'''''$'$--", "++,$'''''$$$--", "+,+$'''''$$$--", ",++$'''''$'$--", "++,'$''''$'---", ",,++$'''$$$---", ",-+$''''$-----", "--,$''''$-----", "---$'''$$-----", "---$'''$$-----", "---$'''$------", "---$''$$------", "---$'''$$-----", "---$''''$-----", "---$''''$-----", "---$'''$------", "----$$$-------", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/0040755000175000017500000000000007637441100016454 5ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_0.xpm0100644000175000017500000000455407041513604020523 0ustar aaronlaaronl/* XPM */ static char *ninja_0[] = { /* width height ncolors chars_per_pixel */ "32 56 9 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #3333ff", "% c #996666", "& c #333399", "' c #669900", "( c #ffcc00", ") c #ffcc99", "* c None", /* pixels */ "********************************", "********************************", "********************************", "*******************!!!!*********", "******************!&&&&!!*******", "*****************&!###&&&!******", "*************((('!&####&&!******", "*********(**((((&!#!!()))!******", "**********(((((**!#!&))%%*******", "***********(((***!##!&)))!******", "*****************!####!#!*******", "*****************!#&!###!*******", "***************!#!!!!!&!********", "*************!!!##!##!!*********", "************!##!#!####!*********", "***********!##!##!&###!*********", "**********!###!##!&##&!!********", "*********!##&#!##!####!!***%%***", "*********#&&&!!##!####!#!*%))%**", "*********!!!!#!##!&##&!!!%))))%*", "**********!&&!!##!&###!##!!##)%*", "***********!!#!##!&##!#!#!!##%**", "*************!!##&!#!#!#!#&!****", "**************#!#&!!&!&&!!!*****", "***************!!!!!!!!!********", "**************!&&&&&&!**********", "**************!&&&&&&!**********", "**************!!!!!!!!**********", "*************!###&&&&!!*********", "*************!########!!********", "*************!#######!##!*******", "*************!#######!&##!!*****", "*************!&&####&!&####!!***", "**************!&####!!&&#####!**", "**************!&####!&&&&&&&##!*", "**************!#####!!&&&&&####!", "*************!#####&!*!&&&&&#&#!", "*************!#####!***!!!!&&&#!", "*************!&####!***!#&&!!!!*", "*************!&###&!**!#!&&&!***", "*************!####&!*!!&&!#!****", "************!&##&&!!!!&!&#!*****", "************!##&!!&!#&!&!!******", "************!!!!!##&!#&!!*******", "***********!#!$&#!!#!!!!********", "***********!&$!!!*!!&&&!********", "**********!&!&#!***!#&&!********", "*********!!!&!!*****!#&&!*******", "********!&$&!!*******!##!*******", "*******!#!!#!*********!!!*******", "******!&!&&!!*******************", "******!##!!!!*******************", "*******!!&&&!*******************", "********!#$$&!******************", "*********!####!*****************", "**********!!!!!*****************", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_0b.xpm0100644000175000017500000000453407041513604020663 0ustar aaronlaaronl/* XPM */ static char *ninja_0b[] = { /* width height ncolors chars_per_pixel */ "32 56 8 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #3333ff", "% c #996666", "& c #333399", "' c #ffcc00", "( c #ffcc99", ") c None", /* pixels */ "))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))", ")))))))))))))))))))!!!!)))))))))", "))))))))))))))))))!&&&&!!)))))))", ")))))))))))))))))&!###&&&!))))))", ")))))))))))))))'&!&####&&!))))))", "))))))))))))))''&!#!!'(((!))))))", ")))))))))))))''')!#!&((%%)))))))", "))))))))))'))''')!##!&(((!))))))", ")))))))))))''''))!####!#!)))))))", "))))))))))))'')))!#&!###!)))))))", ")))))))))))))))!!#!!!!&!))))))))", ")))))))))))))!!!####!!!)))))))))", "))))))))))))!!!####!!&!)))))))))", ")))))))))))!##!###!##!!!))))))))", "))))))))))!#&#!##!####!#!)))%%))", "))))))))))!#&#!&#!####!##!)%((%)", ")))))))))!#&&!&!#!&####!#!)%((%)", ")))))))))!!!!#!!#!!&###!#!!#(##)", "))))))))))!&!!&!##!!####!!!#!##)", ")))))))))))!&!!!##&!&###!!#!#!))", "))))))))))))!&!!###&!&#!!#!!!)))", ")))))))))))))!!!####&!!#!!&!))))", ")))))))))))))))!####&&!!&!!)))))", ")))))))))))))))!!!!!!!)!!!))))))", ")))))))))))))))!&&&&&!))))))))))", "))))))))))))))!&&&&&&!))))))))))", "))))))))))))))!!!!!!!!))))))))))", ")))))))))))))!######&!!)))))))))", ")))))))))))))!######&&!!))))))))", ")))))))))))))!######&!!#!)))))))", ")))))))))))))!&#####&!###!!)))))", ")))))))))))))!!####&!&&&&##!))))", ")))))))))))))!&####&!&&&&&&#!)))", ")))))))))))))!#####&!&&&&&###!))", ")))))))))))))!####&!!!&&&&#&##!)", "))))))))))))!&&##&&!)!!&&&&&##!)", "))))))))))))!&&##&&!)))!&&&!!!))", ")))))))))))!&####&!))))!!!!&&!))", "))))))))))!!!###&&!)))))!!!&##))", ")))!!!!!!!!&!!##&!))))))!&&!!)))", "))!#&!$!&!!$!&!#&!)))))!!!&#!)))", "))#!!#&!&!&!&!&#!))))))!#&!!))))", "))!#&!#!#!#!#!#!))))))!!!&#!))))", "))!#&&!!!!!!!!!)))))))!#&!!)))))", "))!#$&!))))))))))))))!!&!!!)))))", "))!#$!)))))))))))))))!&!&#!)))))", "))!#&!))))))))))))))!&#!!!!)))))", "))!#!)))))))))))))))!#!&&&!)))))", "))!!)))))))))))))))))!!##&&!))))", ")))))))))))))))))))))))!!##&!)))", ")))))))))))))))))))))))))!!!!)))", "))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_0c.xpm0100644000175000017500000000455507041513604020667 0ustar aaronlaaronl/* XPM */ static char *ninja_0c[] = { /* width height ncolors chars_per_pixel */ "32 56 9 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #3333ff", "% c #996666", "& c #333399", "' c #669900", "( c #ffcc00", ") c #ffcc99", "* c None", /* pixels */ "********************************", "********************************", "*******************!!!!*********", "******************!&&&&!!*******", "*****************&!###&&&!******", "*********((**((('!&####&&!******", "********(*((((((&!#!!()))!******", "***********((((**!#!&))%%*******", "*****************!##!&)))!******", "*****************!####!#!*******", "*****************!#&!###!*******", "****************!##&!!&!********", "***************!!!!!#!**********", "**************!####&!!**********", "**************!##!!!!&!*********", "*************!##!####!!*********", "*************!#!#####!#!********", "************!!#!&###&!##!*******", "***********!#!!&!###&!&#!*******", "***********!!!!#####!#&#!*******", "**********!#!!#####!!&#!********", "**********!&!!####&!&&!*********", "***********!!####!!&&!**********", "************!!#!!#!#!***********", "************!&!##!#!!***********", "************!!&#!##!!*%*********", "*************!!!&#!###)%********", "************!&&&!!&#!#))%*******", "************!#&&&!!!##))%*******", "***********!####&&!!#%)%********", "***********!####&&&&!*%*********", "***********!######&!#!**********", "***********!######!&&!**********", "***********!######!&&#!*********", "***********!######!&&##!********", "************!######!&&##!*******", "******!!!***!&#####!&&&#!*******", "*****!!&&!***!&####!&&&##!******", "****!!&!!!***!&&##&!&&&###!*****", "***!&#!#&$!!*####&&!&&#&&#!*****", "**!&$&&!&!$#!!###&&!&&&&&&!*****", "*!&$&&#!!&$!&!!##&&!!&&&!!!*****", "*!##!#!!!#!&!$!!#&&!!!!!#!******", "*!!!*****!#!$!$!&&&!!#&&#!******", "**********!#!&&!&&!*!!!!!!******", "***********!!#&!&!**!#&&#!******", "*************!!!!!***!!!!!******", "*********************!#&&!******", "*********************!!!!!******", "*********************!#&&!******", "*********************!!!!!******", "*********************!#&&!!*****", "*********************!!#!&&!!***", "*********************!&!&&&&&!!*", "*********************!#!#####&!*", "*********************!!!!!!!!!!*", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_0d.xpm0100644000175000017500000000455507041513604020670 0ustar aaronlaaronl/* XPM */ static char *ninja_0d[] = { /* width height ncolors chars_per_pixel */ "32 56 9 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #3333ff", "% c #996666", "& c #333399", "' c #669900", "( c #ffcc00", ") c #ffcc99", "* c None", /* pixels */ "********************************", "********************************", "********************************", "*******************!!!!*********", "******************!&&&&!!*******", "*****************&!###&&&!******", "*************((('!&####&&!******", "*********((*((((&!#!!()))!******", "**********(((((**!#!&))%%*******", "***********(((***!##!&)))!******", "*****************!####!#!*******", "*****************!#&!###!*******", "****************!!!!!!&!********", "**************!!!!!!!!**********", "************!!!###!!#&!*********", "***********!!!&####!###!********", "**********!#######&!####!*******", "*********!#######&!!##&#!*******", "********!######&!!!!##&#!*******", "*******!####&&!!!&&&!##!********", "*******!!##!!!!#&&####!***%%%***", "*******!&!!&!*!&&####!**!%))%#**", "********!##!!*!&#####!!!#%)))#**", "********!&!##!!&####!!#!#!))%#**", "*********!##!#)%&###!#!#!#%%%***", "**********!!##))%!!!!#!#!!!*****", "**********!!##))%&&&!!!!********", "***********%%))%&&&&!***********", "*************%%!!!!&!***********", "*************!###!#!!***********", "*************!#######!**********", "*************!########!!********", "*************!##########!!******", "*************!############!*****", "**************!&####&&&&###!****", "**************!!!!##&&&&###!****", "**************!&&&!!#######!****", "**************!&&&&&!!####&!****", "**************!&&&&!#&!!#&!*****", "**************!&&&!#!$&&!!!*****", "*************!#&&!!&$!#!!*******", "*************!#&!!&!&#!*********", "*************!!!#&!&!!**********", "*************!!!!!&!!***********", "*************!#&!#&!************", "************!!#&!!!!************", "************!&!!&&&!************", "***********!#!&!#&$!************", "**********!!&&!!!#&&!***********", "*********!#&!!!!*!##!***********", "********!!!!#!!***!!!***********", "*******!#&!#!!******************", "*******!#&&!!!******************", "********!#!&&&!*****************", "*********!!####!****************", "**********!!!!!!****************", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_0e.xpm0100644000175000017500000000455507041513604020671 0ustar aaronlaaronl/* XPM */ static char *ninja_0e[] = { /* width height ncolors chars_per_pixel */ "32 56 9 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #3333ff", "% c #996666", "& c #333399", "' c #669900", "( c #ffcc00", ") c #ffcc99", "* c None", /* pixels */ "********************************", "********************************", "*******************!!!!*********", "******************!&&&&!!*******", "*****************&!###&&&!******", "***************('!&####&&!******", "**************((&!#!!()))!******", "*************(((*!#!&))%%*******", "***********(*(((*!##!&)))!******", "***********((((**!####!#!*******", "************((**!!#&!###!*******", "*************!!!!!!!!!&!********", "***********!!!####!#!!**********", "*********!!&!#####&###!****%%***", "********!!#######&!##&#!**%))%**", "*******!#######&&!!##&##!*%)))#*", "******!#!!!&#!!!!&######!!%%))#*", "******!!##!!!*!&&&#!##&#!!!%))%*", "******!&!!##!*!&##&###&!!!#%%%**", "*******!##!!#!!&&#####!#!#!!!***", "********!!##!#)%&####!#!#!#!****", "*********!#!##))%####!!!##!*****", "**********!!##))%###!*!!!!******", "***********%%))%%&##!***********", "*************%%%!!!!************", "*************!&&&&&!************", "*************!&&&&&&!***********", "*************!!!!!!!!***********", "************!#######!!**********", "************!&####&!!!**********", "************!!########!!********", "************!!&#########!*******", "************!!!&#########!!*****", "************!&!&&##########!****", "************!&&!!!&#########!***", "************!&&&&&!!#&&&&###!***", "************!#&&&&!!!#&&###&!***", "***********!#&&&&&!**!!#&!!!!***", "***********!#&&&&!****!!!!&&!***", "**********!!!&&&&!*****!!!$##***", "***!!!!!!!!&!!&&&!*****!&$!!****", "**!#&!&!&!!&!&!&!*****!!!$#!****", "**#!!#&!&!&!&!&#!*****!#&!!*****", "**!#&!#!#!#!#!#!*****!!!$#!*****", "**!#&&!!!!!!!!!******!#$!!******", "**!#&&!*************!!&!!!******", "**!#&!**************!&!&#!******", "**!#&!*************!&#!!!!******", "**!#!**************!#!&&&!******", "**!!****************!!##&$!*****", "**********************!!##&!****", "************************!!!!****", "********************************", "********************************", "********************************", "********************************", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_0f.xpm0100644000175000017500000000455507041513604020672 0ustar aaronlaaronl/* XPM */ static char *ninja_0f[] = { /* width height ncolors chars_per_pixel */ "32 56 9 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #3333ff", "% c #996666", "& c #333399", "' c #669900", "( c #ffcc00", ") c #ffcc99", "* c None", /* pixels */ "********************************", "********************************", "*******************!!!!*********", "******************!&&&&!!*******", "*********(*******&!###&&&!******", "*********((**((('!&####&&!******", "**********((((((&!#!!()))!******", "***********((((**!#!&))%%*******", "*****************!##!&)))!******", "*****************!####!#!*******", "*****************!#&!&##!*******", "****************!!#&!!&!********", "***************!!!!!##**********", "**************!!##!!!!**********", "*************!&####!#!**********", "************!!####&!##!*********", "***********!#####&&!###!********", "**********!&####!&!&####!*******", "**********!####&!!####&#!*******", "*********!##!!!!!&#!##&#!*******", "*********!!!#!!!&&&####!********", "*********!&#!#&!######!*********", "**********!!##!#!#&##!#)%*******", "***********!&!##!!!!#!#))%******", "************!&#!##)%%!#))%******", "*************!!###))%!))%*******", "*************!!%))))%!%%********", "*************!!!%))%!***********", "************!####%%!!***********", "************!#######!***********", "************!#####&&!***********", "************!&#####&!***********", "************!&&######!**********", "************!#&######!**********", "*************!&&######!*********", "*************!!!&######!********", "********!!!**!##!######!********", "*******!!&&!**!#!#&#####!*******", "******!!#!!!**!&#!&&####!*******", "*****!&&!#&&!*!&&&!&#&&##!******", "****!&&&&!&!&!!!&&!#&&###!******", "***!&&&&#!!&&!&!!&&!&&#!!!******", "***!##!#!!!#!&!&!!&!!!!#!*******", "***!!!*****!#!&!&!&!&&$#!*******", "************!#!&&!#!!!!!!*******", "*************!!##!!!#&$#!*******", "***************!!***!!!!!*******", "********************!#&$!*******", "********************!!!!!*******", "********************!#&$!*******", "********************!!!!!*******", "********************!#&$!!******", "********************!!#!&&!!****", "********************!&!&&$$$!!**", "********************!#!#####&!**", "********************!!!!!!!!!!**", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_2.xpm0100644000175000017500000000336307041513604020522 0ustar aaronlaaronl/* XPM */ static char *ninja_2[] = { /* width height ncolors chars_per_pixel */ "36 36 8 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #339966", "& c #333399", "' c #ffcc00", "( c #ffcc99", ") c None", /* pixels */ "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", ")))))))))))''%&!!!!!))))))))))))))))", ")))))))))''''%!##&&&!)))))))))))))))", "))))))))'''')!#!!##&&!))))))))))))))", "))))))))'''))!#!&'##&!))))))))))))))", ")))))))'''))!###(((#&!))))))))))))))", ")))))))')))!#&!#!($(#!!!))))))))))))", ")))))))'))!######($$!!&#!)))))))))))", "))))))))))!#&#!###(!!&###!))))))))))", ")))))))))!###&&!&!!!&###&!))))))))))", ")))))))))!###&!&!!)!&###&!!)))))))))", "))))))))!####!##&!)!####&!!)))))))))", "))))))))!####!###!!!###&$(()))))))))", "))))))))!####!###&!&##$$((()))))))))", "))))))))!&###!####!###((((()))))))))", "))))))))!####!!###!##!###($)))))))))", "))))))))!&####!!###!!#!##$!))!))))))", "))))))))!&####!&##&!#!#!!$!!!&!)))))", ")))))))))!&####!##!!#!#&!!!&&#!)))))", ")))))))))!&##&!!!#!#!#!!!&!&#!))))))", "))))))))))!&&!&&!#!#!&!#!!!!!&!)))))", "))))))))))!&!&&&!!#!&!#!!&!&&#!)))))", ")))))))))))!&&&!##!!!#&!#!&&#!))))))", "))))))))))))!&!!######&!!#!#!)))))))", ")))))))))))))!!&#####&!!##!!))))))))", "))))))))))))))!&&&##&!)!!!!)))))))))", ")))))))))))))))!!!!!!)))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_2b.xpm0100644000175000017500000000336407041513604020665 0ustar aaronlaaronl/* XPM */ static char *ninja_2b[] = { /* width height ncolors chars_per_pixel */ "36 36 8 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #339966", "& c #333399", "' c #ffcc00", "( c #ffcc99", ") c None", /* pixels */ "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))''')))))))))", "))))))))))))))!!!!!!!)))))''')))))))", "))))))))))))!!&&#&###!!)))''''))))))", "))))))))))!!&&#########!!))'''))))))", ")))))))))!&&#############!))''')))))", "))))))))!&!&###########&##!))'')))))", ")))))))!&&&!&###!!!!!&&##&#!!%%)))))", "))))))!!!&&&!#!!!####!&!#!###!&)))))", ")))))!&&!!&&!!&!#####&!####!!#!)))))", ")))))!&###!!!#######&!&##!(&!#!)))))", ")))))!&###!#######&!!!!#((('#&!)))))", ")))))!###!#!!!&#!!!!))!($$(##&!)))))", ")))))!###!!##!!!##&!!!!!$(##&&!)))))", ")))))!&##!&!!##!#####&&!!#&&&!))))))", "))))))!&##!&#!!#!######&!!!!!)))))))", ")))))))!&&#!!##!#($#####&!))))))))))", "))))))!!!!!#!&!##($&#####!))))))))))", "))))))!#!#!!!!!##(($&&&#!)))))))))))", "))))))!##!&!&!$$((((!!!!))))))))))))", "))))))!!!&!!!!!!$(((!!))))))))))))))", ")))))))!#&&!&&!)))))))))))))))))))))", "))))))))!#&!#&!)))))))))))))))))))))", ")))))))))!#&!#&!))))))))))))))))))))", "))))))))))!!)!!)))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_2c.xpm0100644000175000017500000000336407041513604020666 0ustar aaronlaaronl/* XPM */ static char *ninja_2c[] = { /* width height ncolors chars_per_pixel */ "36 36 8 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #339966", "& c #333399", "' c #ffcc00", "( c #ffcc99", ") c None", /* pixels */ "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", ")))))))))))))))!!!!!!)))))))))))))))", ")))))))))!!!!)!&##&&&!))))))))))))))", "))))))))!!##!!&#####&!!)))))))))))))", ")))))))!#!#!!&######!!&!))))))))))))", "))))))!#&&!#!&#!!!##!&&&!)))))))))))", ")))))!#&&!&!!#!&!#!!&&&!&!))))))))))", ")))))!&!!!!!#!&!#!#!&&!&&!))))))))))", "))))))!#&!&!!!#!#!#!!!&##&!)))))))))", ")))))!#&&!!!&#!#!!##!####&!)))))))))", ")))))!&!!!$!!#!#!&##&!####&!))))))))", "))))))!))!$##!#!!###!!####&!))))))))", ")))))))))$(###!##!###!!####!))))))))", ")))))))))(((((###!####!###&!))))))))", ")))))))))((($$##&!&###!####!))))))))", ")))))))))(($&###!!!###!####!))))))))", ")))))))))!!&####!)!&##!####!))))))))", ")))))))))!!&###&!)!!&!&###!)))))))))", "))))))))))!&###&!!!&!&&###!)))))))))", "))))))))))!###&!!(###!#&#!))))))))))", ")))))))))))!#&!!$$(######!))')))))))", "))))))))))))!!!#($(!#!&#!)))')))))))", "))))))))))))))!&#(((###!))''')))))))", "))))))))))))))!&##'&!#!))'''))))))))", "))))))))))))))!&&##!!#!)''''))))))))", ")))))))))))))))!&&&##!%'''')))))))))", "))))))))))))))))!!!!!&%'')))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_2d.xpm0100644000175000017500000000336407041513604020667 0ustar aaronlaaronl/* XPM */ static char *ninja_2d[] = { /* width height ncolors chars_per_pixel */ "36 36 8 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #339966", "& c #333399", "' c #ffcc00", "( c #ffcc99", ") c None", /* pixels */ "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", ")))))))))))))))))))))!!)!!))))))))))", "))))))))))))))))))))!&#!&#!)))))))))", ")))))))))))))))))))))!&#!&#!))))))))", ")))))))))))))))))))))!&&!&&#!)))))))", "))))))))))))))!!((($!!!!!!&!!!))))))", "))))))))))))!!!!(((($$!&!&!##!))))))", ")))))))))))!#&&&$((##!!!!!#!#!))))))", "))))))))))!#####&$(##!&!#!!!!!))))))", "))))))))))!&#####$(#!##!!#&&!)))))))", ")))))))!!!!!&######!#!!#&!##&!))))))", "))))))!&&&#!!&&#####!##!!&!##&!)))))", ")))))!&&##($!!!!!&##!!!##!!###!)))))", ")))))!&##($$(!))!!!!#&!!!#!###!)))))", ")))))!&#'(((#!!!!&#######!###&!)))))", ")))))!#!&(!##&!&#######!!!###&!)))))", ")))))!#!!####!&#####!&!!&&!!&&!)))))", ")))))&!###!#!&!####!!!#!&&&!!!))))))", ")))))%%!!#&##&&!!!!!###&!&&&!)))))))", ")))))''))!##&###########&!&!))))))))", ")))))'''))!#############&&!)))))))))", "))))))'''))!!#########&&!!))))))))))", "))))))'''')))!!###&#&&!!))))))))))))", ")))))))''')))))!!!!!!!))))))))))))))", ")))))))))'''))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_4.xpm0100644000175000017500000000434107041513604020521 0ustar aaronlaaronl/* XPM */ static char *ninja_4[] = { /* width height ncolors chars_per_pixel */ "28 60 6 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #ffcc99", "' c None", /* pixels */ "''''''''''''''''''''''''''''", "''''''''''''''''''''''''''''", "''''''''''''''''''''''''''''", "''''''''''''''''''''''''''''", "''''''''''''''''''''''''''''", "''''''''''''!!!!''''''''''''", "'''''''''''!%%%#!'''''''''''", "''''''''''!#%%%%#!''''''''''", "''''''''''!%%%%%%!''''''''''", "''''''''''!&&&&&&!''''''''''", "''''''''''!$$&&$$!''''''''''", "''''''''''!&&%%&&!''''''''''", "''''''''!!!%#!!%!!!!''''''''", "''''''!!#%!!%##%!!%#!!''''''", "'''''!##%#!!!%%!!!#%%%!'''''", "'''''!##%!###!!###!%%%!'''''", "''''!##%%!##%#####!%%%#!''''", "'''!#%###!########!###%!''''", "'''!####!##########!####!'''", "''!#####!%#########!#%###!''", "''!!%$#!!####%%####!!#$%!!''", "''!%&&&!'!########!'!&&&%!''", "''!&&$$#'%!!!%%!!!#'#$$&&!''", "''!&$$&&'!##%%%%##!'&&$$&!''", "''!!$&&''!##!%%!##!''&&$!!''", "'''#!!'''!##%##%##!'''!!#'''", "'''''''''!%#%##%##!'''''''''", "'''''''''!!%%##%%!!'''''''''", "'''''''''!%!!!!!!%%!''''''''", "''''''''!%%%%%%%%%%%!'''''''", "'''''''!#!%%%%%%%%%!!'''''''", "'''''''!##!!!!!!!!!#!'''''''", "'''''''!#%#%%%%%%##%!'''''''", "'''''''!#!######%!##!'''''''", "'''''''!####!#%%####!'''''''", "'''''''!#####%!#%###!'''''''", "'''''''!####%!!!#####!''''''", "'''''''!####%#!######!''''''", "'''''''!####%!!%####!'''''''", "'''''''!%##%%!!#####!'''''''", "''''''!#%%##%!!#####!'''''''", "'''''''!%####!%#!##%!'''''''", "'''''''!####!!!%%#%!''''''''", "''''''''!!!!#!!!!!!!''''''''", "''''''''!!%%!'!!%%#!''''''''", "'''''''''!##!'!!!!!!''''''''", "''''''''''!!''!#%%#!''''''''", "''''''''''''''!!!!!!''''''''", "''''''''''''''!#%%#!''''''''", "''''''''''''''!!!!!'''''''''", "''''''''''''''!#%#!'''''''''", "''''''''''''''!!!!!'''''''''", "''''''''''''''!#%%!'''''''''", "''''''''''''''!!!#!'''''''''", "''''''''''''''!!#!!'''''''''", "''''''''''''''!##%!'''''''''", "''''''''''''''!###!'''''''''", "''''''''''''''!###!'''''''''", "''''''''''''''!##!''''''''''", "'''''''''''''''!!'''''''''''", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_5.xpm0100644000175000017500000000415207041513604020522 0ustar aaronlaaronl/* XPM */ static char *ninja_5[] = { /* width height ncolors chars_per_pixel */ "28 56 7 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #ffcc00", "' c #ffcc99", "( c None", /* pixels */ "((((((((((((((((((((((((((((", "((((((((((((!!!!((((((((((((", "(((((((((((!%%%#!(((((((((((", "((((((((((!#%%%%#!((((((((((", "((((((((((!%%%%%%!((((((((((", "((((((((((!''''''!((((((((((", "((((((((((!'$$'$$!((((((((((", "((((((((((!%''%''!((((((((((", "((((((((((!%##!%!!((((((((((", "((((((((((&!%!!%!(((((((((((", "(((((((((&&!!%%!!(((((((((((", "((((((((!!!%%!!%%!!!((((((((", "((((((!!#%!!!##!!!%#!!((((((", "(((((!##%!########!%%%!(((((", "(((((!##%!##%!!###!%%%!(((((", "(((((!#%%!########!%%%!(((((", "((((!%##!##########!##%!((((", "((((!###!%#########!###!((((", "((((!###!####%%####!###!((((", "(((!###%!!########!!%###!(((", "(((!##%!(%!!!%%!!!#(!%##!(((", "(((!##%!(!##%%%%##!(!%##!(((", "(((!!#%!(!##!%%!##!(!%#!!(((", "(((!%!!!(!##%##%##!(!!!#!(((", "(((!!##!(!%#%##%##!(!##!!(((", "(((!#!!((!!%%##%%!!((!!#!(((", "(((!!#!((!%!!!!!!%%!(!#!!(((", "(((!#!!(!%%%%%%%%%%%!!!#!(((", "(((!!%!!#!%%%%%%%%%!!!%!!(((", "(((!#'$!##!!!!!!!!!#!$'#!(((", "(((!#'$!#%#%%%%%%##%!$'#!(((", "((($'''!#!######%!##!'''$(((", "(((('''!####!#%%####!'''((((", "(((('''!#####%!#%####'''((((", "((((('(!####%!!!#####!'(((((", "(((((((!####%!!######!((((((", "(((((((!####!!(!%####!((((((", "(((((((!####%!(!#####!((((((", "((((((!#%##%%!(!######!(((((", "((((((!%%!#%!((!%#!##%!(((((", "((((((!%!%!!!(((!%%#%!((((((", "(((((((!!!!!!(((!!!!!!((((((", "(((((((!#%%#!(((!!%%#!((((((", "(((((((!!!!!!(((!!!!!!((((((", "(((((((!#%%#!(((!#%%#!((((((", "(((((((!!!!!!(((!!!!!!((((((", "(((((((!#%%#!(((!#%%#!((((((", "(((((((!!!!!(((((!!!!!((((((", "(((((((!#%#!(((((!#%#!((((((", "(((((((!!!!!(((((!!!!!((((((", "(((((((!%%#!(((((!#%%!((((((", "(((((((!!!!!(((((!!!#!!(((((", "((((((!!%%!!((((((!#!%%!((((", "((((((!#%%#!(((((!#!%%%%!(((", "((((((!####!(((((!#!####!(((", "((((((!!!!!!(((((!!!!!!!!(((", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_9.xpm0100644000175000017500000000334307041513604020527 0ustar aaronlaaronl/* XPM */ static char *ninja_9[] = { /* width height ncolors chars_per_pixel */ "62 22 8 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #669900", "' c #ffcc00", "( c #ffcc99", ") c None", /* pixels */ "))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))))))''')))!!!!))))))))))))", "))))))))))))))))))))))))))))))))))))')''''''&!%%%%!!))))))))))", ")))))))))))))))))))))))))))))))))))))'!!!!'&%!###%%%!)))))))))", ")))))))))))))))))))))))))))))))))))!!#####!%!%####%%!)))))))))", "))))))))))))))))))))))))!!!!!#!!!!!#%!!!!###!#!!'(((!)))))))))", ")))))))))))))))))))))))!#####!!%%!##!####!####!%(($$))))))))))", "))))))))))))))))))))))!######!%%!##!#####!##!##!%(((!)))))))))", "))))))))))))))))))))!!!#######!%!##!%###%!%#!####!#!))))))))))", "))))))))))))))))))!!##!########!!#!%!###%!#!#!!!%##!))))))))))", "))))))))))))))))!!####!#########!#!#####!###!##!!!!)))))))))))", ")))))))))))))))!######!##########!#####!!##!##!#!)))))))))))))", "))))))))!!!!!!!!#######!########!!####%!##!!#####!))))))))))))", "))))!!!!!#!#!#!#######!#!!######!####!!##!)!######!)))))))))))", "))!!!#!#!#!#!########!!!!!!!####!!#!!#!!!)))!######!))))))))))", ")!#!#!!#!#!#!#!#####!#!#!#!#!!##!%!##!#!)))))!####!#!!))))))))", ")!##!%!!!!!!!!!!#!!!!##!%!#!##!!!!%#!##!))))))!##!##!#!!))))))", ")!!!%!!))))))))!!#))!!!%!!!!#!##!!!!%#!###)))))!!!#!##!#!!))))", "))!#%%!))))))))))))))!#%%!))!!#!#!#!!!%#!###$)))))!!#!#!###$))", ")))!#%!!))))))))))))))!#%!!)))!#####!!!!#$((($))))))!!!#$(((()", "))))!#%!)))))))))))))))!#%!))))!!!!!!)!!#$($(($)))))))!#$(($((", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/10_duplicate_of_90100644000175000017500000000000007041513604021546 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_10b.xpm0100644000175000017500000000362007041513604020737 0ustar aaronlaaronl/* XPM */ static char *ninja_10b[] = { /* width height ncolors chars_per_pixel */ "62 22 18 1 0 0", /* colors */ "! c #000000", "# c #000080", "$ c #333366", "% c #008080", "& c #996666", "' c #cc6666", "( c #999966", ") c #cc9966", "* c #330000", "+ c #333300", ", c #333399", "- c #336699", ". c #669900", "/ c #ffcc00", "0 c #ffcc99", "1 c None", "2 c #ffff99", "3 c #330066", /* pixels */ "11111111111111111111111111111111111111111111111111111111111111", "111111111111111111111111111111111111111///11111111111111111111", "11111111111111111111111111111111111/1//////.1!!!!1111111111111", "111111111111111111111111111111111111/!!!!!.,!,,,,!!11111111111", "111111111111111111111111!!!!!!!!#!!!!$$$$$$!!$$$,,,!1111111111", "1111111111111111111111!$$$$$!,,,!!$,$!!!$$$!,$$$$,,!1111111111", "111111111111111111111!$$$$$$$!,,!$$$!$$$$!$$$!!/000!1111111111", "11111111111111111111!$$$$$$$$!,,!$$$!$$$$!$!$!,00&&11111111111", "11111111111111111111!$$$$$$$$!,,!$,!!$$$$!$!$$!,000!1111111111", "11111111111111111111!$$$$$$$!,,,!$$$!$$$!!$$!$$$!$!11111111111", "11111111111111111111!$$$$$$!!!!!$$$$$!$$$!!!!!$,$$!11111111111", "111111111111111111111!$$$$$$!!!!!!!$!$$$$!%3$1!!!!111111111111", "111111111111111111111$!$$$$$$!11111!!$$$$!$-%31111111111111111", "111111#$,+!+,$#$1111!-!$$$$$$$!11111!$$$$!%$,$1111111111111111", "11111$%*%,$,$3%!!!!$$!-!$$$$$$!11111!$$$!!--%31111111111111111", "11111#$%*+$$-!!!$!$!!!!!!$$$$$!11111!!$!!$!%,-+111111111111111", "11111$%+,-!-!$!$!!$!$!$$!$!$$$$!1111!,!$$!$!,+,$!1111111111111", "1111113,-#$!!$$!,!$!$!$!$!$$$$$!11111!,$!$$$$$$!$&$!1111111111", "111111$-,$11!!!,!!!!!$$!$!$!$$$!111111!!,!,!$!$$000$!$11111111", "1111113$-!111!$,,!$3%!!$$!$$$$$!11111111!!!!$$&000&0%$(1111111", "111111$-,+1111!$,!!3$3$!!!$$$$!111111111111!!$&&&&,(020)111111", "1111111!+!11111!$,!1111111!!!!1111111111111111111+-'2(20(11111", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_10c.xpm0100644000175000017500000000362007041513604020740 0ustar aaronlaaronl/* XPM */ static char *ninja_10c[] = { /* width height ncolors chars_per_pixel */ "62 22 18 1 0 0", /* colors */ "! c #000000", "# c #000080", "$ c #333366", "% c #008080", "& c #336666", "' c #996666", "( c #cc6666", ") c #999966", "* c #330000", "+ c #333300", ", c #333399", "- c #336699", ". c #669900", "/ c #ffcc00", "0 c #ffcc99", "1 c None", "2 c #ffff99", "3 c #330066", /* pixels */ "11111111111111111111111111111111111111111111111111111111111111", "111111111111111111111111111111111111111///111!!!!1111111111111", "11111111111111111111111111111111111/1//////.!,,,,!!11111111111", "111111111111111111111111111111111111////1/.,!$$$,,,!1111111111", "111111111111111111111111!#$#!$!!!!!!!!!!!!$!,$$$$,,!1111111111", "11111111111111111111111!!!!!!$!,!!$,$$$$$$$!$!!/000!1111111111", "1111111111111111111111!$$$$$!!,,!$$,$$$$!!!$$!,00''11111111111", "111111111111111111111!$$$$$$$!,,!$$$,$$!$$$!$$!,000!1111111111", "111111111111111111111$$$$$$$$!,,!$,$,$$!$$$$!$$$!$!11111111111", "11111111111111111111!$$$$$$$$!,,!$$$$!$!$$$$!!$,$$!11111111111", "11111111111111111111!$$$$$$$!,!!!$$$$$$!$$$!$1!!!!111111111111", "11111111111111111111!$$$$$$$!!!!!!!$$$$!$$$$$!1111111111111111", "11111111111111111111!!$$$$$!$%!1111!$$$$!$$$$!1111111111111111", "1111111111111111!!!!!$$$$$!$-$-!1111!!!!$$$$$$!111111111111111", "1111111!!!!$11!$$-$!$$$$$$!$,&$$1111$$-$!!$$$$!111111111111111", "11111!!!$!$!!!!!!!!!!$$$$!$$&,%$!111$!-!$!!$$!$!!1111111111111", "1111!$!$!!$!$!$$!$!$$$$$$!$$,$$$$111!-!-,$!$!$$!$!111111111111", "1111!$$!,!$!$!$!$!!$$$$$!$3%3%%,$111$!-$+,$!!$!$$!$!1$'1111111", "1111!!!,!!!!!$$!$!$$$$$$!%!%,$-$#11111+$,-*%3!!$!$!$$000111111", "11111!$,,!111!!$$!$$$$$!!3$,$%,$11111111+!%,+$$!!!$'00''011111", "111111!$,!!1111!!!!$$$$!111#$3!1111111111+3+,)20)!$'''11111111", "1111111!$,!111111!!!!!!1111111111111111111$3%(0)02'11111111111", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_10d.xpm0100644000175000017500000000334507041513604020745 0ustar aaronlaaronl/* XPM */ static char *ninja_10d[] = { /* width height ncolors chars_per_pixel */ "62 22 8 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #669900", "' c #ffcc00", "( c #ffcc99", ") c None", /* pixels */ "))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))))))''')))!!!!))))))))))))", "))))))))))))))))))))))))))))))))))))')''''''&!%%%%!!))))))))))", ")))))))))))))))))))))))))))))))))))))'!!!!'&%!###%%%!)))))))))", ")))))))))))))))))))))))))))))))))))!!!####!%!%####%%!)))))))))", "))))))))))))))))))))))))!!!!!#!!!!!#%#######!#!!'(((!)))))))))", ")))))))))))))))))))))))!#####!!%%!###%########!%(($$))))))))))", ")))))))))))))))))))))!!######!%%!####%###%#!!!#!%(((!)))))))))", ")))))))))))))))))))!!########!%%!##%#%#%!!!###!##!#!))))))))))", ")))))))))))))))))!!##########!%%!######%%!#####!%##!))))))))))", ")))))))))))))))!!############!%%!#####%#%!%####!!!!)))))))))))", "))))))))))))))!###############!!!########!####!#!)))))))))))))", ")))))))!!!!!!!!###########!!!!##!!!!!#%%##!!#####!))))))))))))", ")))!!!!!#!#!#!##########!!#########!!!###!)!######!)))))))))))", ")!!!#!#!#!#!#########!!!!!!!########!#!!!)))!######!))))))))))", "!#!#!!#!#!#!#!#####!!#!#!#!#!!######!!#!)))))!####!#!!))))))))", "!##!%!!!!!!!!!!#!!!)!##!%!#!##!!#####!#!))))))!##!##!#!!))))))", "!!!%!!))))))))!!#)))!!!%!!!!#!##!####!!###)))))!!!#!##!#!!))))", ")!#%%!)))))))))))))))!#%%!))!!#!#!###!%#!###$)))))!!#!#!###$))", "))!#%!!)))))))))))))))!#%!!)))!######!!!#$((($))))))!!!#$(((()", ")))!#%!))))))))))))))))!#%!))))!!!!!!)!!#$($(($)))))))!#$(($((", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_10e.xpm0100644000175000017500000000355607041513604020752 0ustar aaronlaaronl/* XPM */ static char *ninja_10e[] = { /* width height ncolors chars_per_pixel */ "62 22 16 1 0 0", /* colors */ "! c #000000", "# c #000080", "$ c #333366", "% c #008080", "& c #336666", "' c #996666", "( c #999966", ") c #330000", "* c #333300", "+ c #333399", ", c #336699", "- c #669900", ". c #ffcc00", "/ c #ffcc99", "0 c None", "1 c #330066", /* pixels */ "00000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000...0000000000000000000", "000000000000000000000000000000000000.0......-0!!!!000000000000", "0000000000000000000000000000000000000!!!!!.-+!++++!!0000000000", "0000000000000000000000000$1$1$1$!!!!!$$$$$!$!!$$$+++!000000000", "000000000000000000000000!!!!!!$!+!!$+$$$$$$$!+$$$$++!000000000", "00000000000000000000000!$$$$$!!++!$$+$$$!!!!$$!!.///!000000000", "0000000000000000000000!$$$$$$$!++!$$$+$!$$$$!$!+//''0000000000", "0000000000000000000000$$$$$$$$!++!$+$+$!$$$$!$$!+///!000000000", "000000000000000000000!$$$$$$$$!++!$$$$!!$$$$!$$$$!$!0000000000", "000000000000000000000!$$$$$$$!+!!!$$$$$!!$$$!!!$+$$!0000000000", "000000000000000000000!$$$$$$$!!!!!!!$$$!$$$!!00!!!!00000000000", "000000000000000000000!!$$$$$!%$$000$!$$!$$$$$!0000000000000000", "000000!!$!!!$!!!0000!$$$$$$!%+%$$0001!!!!$$$$!0000000000000000", "00000!$!$$!$!!$!!!!!!!$$$$$!+%+%1000$,$,!$$$$!0000000000000000", "00000!$$!!!$$$!$$!$!$$$$$$!,%+%+$000$!,!!$$$$$!000000000000000", "00000!$!++!$!$!$!$!!$$$$$$!$#&+&%1001,)%,!$$$!$!!0000000000000", "000000!$+!!!!!!$!$!$$$$$$!%$&+&+$$000$+%)%!$!$$!$!!!0000000000", "000000!$+!0000$!!$!$$$$$!1+!,$+%,#0000*1%),!!$!$$!$!!!00000000", "000000!$+!000001%!!!$$$$!%%$+&$,+$0000001$)*+!!$!$!$$$'0000000", "000000!$$!000000$$,!!!!!0$1#&$,+$0000000000#*+(!!!$'///'000000", "0000000!!!0000000$$,10000000$1$$00000000000000000!$'/'//'00000", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_10f.xpm0100644000175000017500000000364107041513604020746 0ustar aaronlaaronl/* XPM */ static char *ninja_10f[] = { /* width height ncolors chars_per_pixel */ "62 22 19 1 0 0", /* colors */ "! c #000000", "# c #000080", "$ c #333366", "% c #008080", "& c #336666", "' c #996666", "( c #cc6666", ") c #999966", "* c #cc9966", "+ c #330000", ", c #333300", "- c #333399", ". c #336699", "/ c #669900", "0 c #ffcc00", "1 c #ffcc99", "2 c None", "3 c #ffff99", "4 c #330066", /* pixels */ "22222222222222222222222222222222222222222222222222222222222222", "2222222222222222222222222222222222222222000222!!!!222222222222", "22222222222222222222222222222222222202000000/!----!!2222222222", "2222222222222222222222222222222222222000020/-!$$$---!222222222", "2222222222222222222222222!!!!!!!!2!!!!!!!!!$!-$$$$--!222222222", "22222222222222222222222!$$$$$!---!!$-$!!!$$$!$!!0111!222222222", "2222222222222222222222!$$$$$$$!--!$$$!$$$$!$$$!-11''2222222222", "222222222222222222222!$$$$$$$$!--!$$$!$$$$!$!$$!-111!222222222", "222222222222222222222!$$$$$$$$!--!$-!!$$$$!$!$$$$!$!2222222222", "222222222222222222222!$$$$$$$!---!$$!$!$$$!$$!!$-$$!2222222222", "222222222222222222222!$$$$$$!!!!!$$$!$$$$!$!!22!!!!22222222222", "2222222222222222222222!$$$$$$!!!!!!!!$$$$!!-.!2222222222222222", "2222222222222222222222$!$$$$$$!22222!$$$$!%&$$2222222222222222", "2222222222222222!!!!$2!.!$$$$$$!2222!$$$$$$%-%#222222222222222", "222222222$!$!.!!!$!$!!!!!!$$$$$!2222!$$$!!$$%$,222222222222222", "2222222!$!.#.!$!$!!$!$!$$!$!$$$$!222!!$!!$!$$$-$!2222222222222", "222222$.!.,$&!$$!-!$!$!$!$!$$$$$!222!-!$$!$!+%$,-$222222222222", "222222!..!.+%!!!-!!!!!$$!$!$!$$$!222!!-$!$$!$$$-&!.!2222222222", "222222$!$.4$4$!$--!$%.!!$$!$$$$$!22222!!-$!$$$+%4%+%$%(2222222", "22222224%-%$222!$--!-$%.!!!$$$$!22222222!!-$!$$$',-*3133222222", "222222224%-$!222!$-!$%-&-$2!!!!2222222222!!!$'111'$)1)*'122222", "222222222$%-$2222!!2#$$4$22222222222222222!!$'1'11'22222222222", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_18.xpm0100644000175000017500000000461407041513604020611 0ustar aaronlaaronl/* XPM */ static char *ninja_18[] = { /* width height ncolors chars_per_pixel */ "28 64 8 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #669900", "' c #ffcc00", "( c #ffcc99", ") c None", /* pixels */ ")))))))))))))))))))))($($())", "))))))))))))))))))))))(($())", "))))))))))))))))))))))(((())", "))))))))))))))))))))))(((())", "))))))))))))))))))))))$(($))", "))))))))))))))))))))))!!!!))", "))))))))))))))))))))))!!#!))", "))))))))))))))))))))))!%!!))", ")))))))))))))))))))))))!#!))", ")))))))))))))!!!!))))))#!!))", "))))))))))))!#%%%!)))))!!#!)", ")))))))))))!#%%%%#!))))!#!!)", ")))))))))))!%%%%%%!))))!!##)", ")))))))))))!%%%%%%!))))!#!!)", ")))))))))))!%%%%%%!))))####)", ")))))))))))!%%%%%%!)))#####)", ")))))))))))!!%###%!))!####!)", "))))))))))))!%##%!!)%!####))", "))))))))!!!!!!%&!!#!#%%%#!))", "))$(()))!#####''!!!!#%%%!)))", "))(((()!#####'''!!###%%!))))", ")$((())######'''!!##%#!)))))", ")$((())#!####''####!#!))))))", ")$!!!)##!!###''#####!)))))))", "))!!!!###!####''##!#!)))))))", "))!!#!##!!#####'###!))))))))", ")))#!#!!!!####'%###!))))))))", ")))!!!!!!)!###%%%#!)))))))))", "))))!!!!))!#%##%%#!)))))))))", "))))#!!)##!#%%##%#!)))))))))", ")))))####!!#####%%!)))))))))", "))))!!!!#!########%)))))))))", "))))!!###!#########)))))))))", "))))!!#########!###!))))))))", "))))!!#####%%%%%%%%!))))))))", "))))!!!!###%%#!%%%%#))))))))", "))))!!#!!!##%%#####!))))))))", ")))))!!!!!#######!!!))))))))", ")))))!###!))!!#!!###))))))))", ")))))!!!!!)))!####%%))))))))", ")))))!%##!)))!###%#!))))))))", ")))))!!!!!)))!####!!))))))))", ")))))!%##))))!#####!))))))))", ")))))!!!!!))))!####!))))))))", ")))))!###!))))!####!!)))))))", ")))))!!!!!))))!####!!)))))))", ")))))!!!#!))))!%##!!#)))))))", "))))!!!#!!)))))!%#%!!)))))))", "))))!!!##!)))))!!!!!#)))))))", ")))))))))))))))!#%%!!)))))))", ")))))))))))))))!!!!!!)))))))", "))))))))))))))))#%%#!)))))))", "))))))))))))))))!!!!!)))))))", "))))))))))))))))!#%#!)))))))", "))))))))))))))))!!!!!)))))))", "))))))))))))))))!#%#!)))))))", "))))))))))))))))!!!!!)))))))", "))))))))))))))))!%%#!)))))))", "))))))))))))))))!#!!!)))))))", ")))))))))))))))))!#!!)))))))", "))))))))))))))))!###!)))))))", "))))))))))))))))!###!)))))))", "))))))))))))))))!!##!)))))))", "))))))))))))))))))!!))))))))", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_20.xpm0100644000175000017500000000461407041513604020602 0ustar aaronlaaronl/* XPM */ static char *ninja_20[] = { /* width height ncolors chars_per_pixel */ "28 64 8 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #669900", "' c #ffcc00", "( c #ffcc99", ") c None", /* pixels */ "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", ")))))))))))))))))))))))$$$$)", ")))))))))))))))))))))))(($()", ")))))))))))))))))))))))(((()", ")))))))))))))))))))))))(((()", ")))))))))))))))))))))))$(($)", ")))))))))))))))))))))))!!!!)", ")))))))))))))))))))))))!!#!)", ")))))))))))))!!!!))))))!%!!)", "))))))))))))!#%%%!)))))!!#!)", ")))))))))))!#%%%%#!))))!%!!)", ")))))))))))!%%%%%%!))))!!#!)", ")))))))))))!%%%%%%!))))!#!!)", "))$$$))))))!%%%%%%!))))!!#!)", "))($())))))!%%%%%%!)))!!#!!)", ")$((())))))!!%###%!))!###!!)", ")$((()))))))!%##%!!)%!##%!))", ")$((())))!!!!!%&!!)!#%%%!!))", "))$(!)))!#####''!!!!#%%%!)))", "))!!#))######'''!!###%%!))))", "))!##!)#!####'''!###%#!)))))", "))!!!!!#!####''####!#!))))))", "))!!##!##!###''#####!)))))))", "))!!!!###!####''##!!!)))))))", "))!!#!###!!####'###!))))))))", "))!!!###!)!###'%###)))))))))", "))!!!#!!))!###%%%#!)))))))))", "))!!!!!)))!#%##%%#!)))))))))", "))##!)))))!#%%##%#!)))))))))", "))))))!##!!#####%%!)))))))))", ")))))!!!#!########%)))))))))", ")))))!!##!#########)))))))))", ")))))!!!#######!%##!))))))))", ")))))!!####%%%%%%%%!))))))))", ")))))!!!!##%%#!%%%%#))))))))", ")))))!!#!###%%#####!!)))))))", ")))))!!!!!!!#######!!)))))))", "))))))!!##!!!!####!#!!))))))", "))))))!!!!!)))#!!!!%!!))))))", "))))))!#%%!))))!!!!!!!))))))", "))))))!!!!!)))))##!!!!!)))))", "))))))!#%%!))))))##!!!!)))))", "))))))!!!!!))))))!#!!!!)))))", "))))))!###!)))))))!!!!!)))))", ")))))))!!!!)))))))%#!!!)))))", ")))))))###!!))))))%#!!!)))))", "))))))!!##!!)))))!!!!!))))))", "))))))!!%!!!)))))!###!))))))", "))))))!!!#!!)))))!!!!!))))))", ")))))))!#!!))))))#%#!!))))))", ")))))))!##!))))))!!!!!))))))", "))))))))))))))))!%%#!!))))))", "))))))))))))))))!!!!!!))))))", "))))))))))))))))!%%#!)))))))", ")))))))))))))))))#!!!)))))))", ")))))))))))))))))!#!!)))))))", "))))))))))))))))!%##!)))))))", "))))))))))))))))!###!!))))))", "))))))))))))))))!###!!))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/20b_duplicate_of_180100644000175000017500000000000007041513604021771 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_20c.xpm0100644000175000017500000000461507041513604020746 0ustar aaronlaaronl/* XPM */ static char *ninja_20c[] = { /* width height ncolors chars_per_pixel */ "28 64 8 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #669900", "' c #ffcc00", "( c #ffcc99", ") c None", /* pixels */ "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", ")))))))))))))))))))))$$$$)))", ")))))))))))))))))))))(($()))", ")))))))))))))))))))))(((()))", ")))))))))))))))))))))(((()))", ")))))))))))))))))))))$(($)))", ")))))))))))))))))))))!!!!)))", ")))))))))))))))))))))!!#!)))", "))))))))))))!!!!)))))!%!!)))", ")))$$$)))))!%%%#!))))!!#!)))", ")))((())))!#%%%%#!)))!#!!)))", "))$((())))!%%%%%%!)))!!#!)))", ")$(((())))!%%%%%%!)))!#!!)))", ")$((()))))!%%%%%%!)))!!#!)))", "))$(()))))!%%%%%%!)!!!#!!)))", "))!!#)))))!%###%!!!!###!!)))", "))###!))))!!%##%!!%!##%!))))", "))!!!!)))))!!&%!!##%%%!)))))", "))!##!)))!!!!''####%%%!)))))", "))!!!!)!!##!!'''###%%!!)))))", "))!!!!!####!!'''##%#!!))))))", ")))!##!#######''#!#!!)))))))", ")))!!!##!#####''##!!#)))))))", ")))!#####!###''####!))))))))", ")))!!##!!!###'####!!))))))))", "))))!#!!)!###%'###!)))))))))", "))))!!!)))!#%%%###!)))))))))", "))))))####!#%%##%#!)))))))))", "))))))####!#####%%!)))))))))", ")))))##!#!########%)))))))))", ")))))!!##!#########)))))))))", ")))))!!!#######!%##!))))))))", ")))))!!####%%%%%%%%!))))))))", ")))))!!!!##%%#!%%%%#))))))))", ")))))!!!!###%%#####!))))))))", "))))))!%!!!!#####!!!))))))))", "))))))!!!!!!!!#!!###))))))))", "))))))!%%!)))!####%%!)))))))", "))))))!!!!)))!###%#!!)))))))", "))))))!###))))####!!!)))))))", "))))))!!!!!)))#####!!!))))))", "))))))!!%%!))))####!!!))))))", "))))))!#!!!))))###!!!!!)))))", ")))))))!##!)))))#%%#!!!)))))", "))))))!!##!)))))#%%#!!!)))))", "))))))!!##!))))))!!!!!!)))))", "))))))!!%!!))))))#%#!!!)))))", ")))))))))))))))))!!!!!!)))))", "))))))))))))))))!!%#!!))))))", "))))))))))))))))!#%##!))))))", "))))))))))))))))!#%##!))))))", "))))))))))))))))!!!!!)))))))", "))))))))))))))))!%%#!)))))))", ")))))))))))))))))#!!!)))))))", ")))))))))))))))))!#!!)))))))", "))))))))))))))))!%##!)))))))", "))))))))))))))))!###!!))))))", "))))))))))))))))!###!!))))))", ")))))))))))))))))!##!!!)))))", "))))))))))))))))))!!!!!)))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_20d.xpm0100644000175000017500000000461507041513604020747 0ustar aaronlaaronl/* XPM */ static char *ninja_20d[] = { /* width height ncolors chars_per_pixel */ "28 64 8 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #669900", "' c #ffcc00", "( c #ffcc99", ") c None", /* pixels */ "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", ")($($())))))))))))))))))))))", ")($(()))))))))))))))))))))))", ")(((()))))))))))))))))))))))", ")(((())))))))))))))))))$$$))", ")$(($))))))))))))))))))($())", ")!!!!))))))))))))))))))((($)", ")!#!!))))))!!!!))))))))((($)", ")!!%!)))))!%%%#!)))))))((($)", ")!#!!))))!#%%%%#!))))))!($))", ")!!#!))))!%%%%%%!))))))#!!))", ")!##!))))!%%%%%%!))))))!##))", ")!#!!))))!%%%%%%!))))))#!!))", ")!!#!!)))!%%%%%%!))))))###))", ")!!###!))!%###%!!)))))!!!!))", "))!%##!%)!!%##%!))))))!##!))", "))!!%%%#!)!!&%!!!!!!)!!!!!))", ")))!%%%#!!!!''#####!!!!!!!))", "))))!%%###!!'''######!##!!))", ")))))!#%###!'''####!##!!!#))", "))))))!#!####''####!####))))", ")))))))!#####''###!#!##)))))", ")))))))!!!##''####!!!)))))))", "))))))))!###'####!!)))))))))", ")))))))))###%'###!))))))))))", ")))))))))!#%%%###!))))))))))", ")))))))))!#%##%%#!))))))))))", ")))))))))!#%%##%#!))))))))))", "))))))))!!#####%%!))))))))))", ")))))))#!########%))))))))))", "))))))##!#########))))))))))", ")))))!!#######!%##!)))))))))", "))))!!####%%%%%%%%!)))))))))", "))))!!!!##%%#!%%%%#)))))))))", ")))!!!#!###%%#####!!))))))))", ")))!!!!!!!!#######!!))))))))", ")))!!!!###!!!####!#!!)))))))", "))))!!!!!))))#!!!!%!!)))))))", "))))!!!!!)))))!!!!!!!!))))))", ")))))!!##!))))###!!!!!))))))", ")))))!!!!!)))))###!!!!))))))", ")))))!###!))))))##!!!!))))))", "))))))!!!!)))))))#!!!!))))))", "))))))#!!!))))))#!!!!!))))))", "))))))###!))))))%%#!!)))))))", "))))))!##!!)))))%%#!!)))))))", "))))))!%!!!)))))!!!!!)))))))", "))))))!!#!!))))!!!#!!)))))))", ")))))!!#!!!))))#%%#!!)))))))", "))))!!!##!!))))!!!!!!)))))))", "))))))))))))))))#%#!))))))))", "))))))))))))))))!!!!))))))))", "))))))))))))))))%%#!))))))))", ")))))))))))))))!#!!!))))))))", ")))))))))))))))!!#!!!)))))))", ")))))))))))))))!%#!!!)))))))", ")))))))))))))))!!!!!!)))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_20e.xpm0100644000175000017500000000461507041513604020750 0ustar aaronlaaronl/* XPM */ static char *ninja_20e[] = { /* width height ncolors chars_per_pixel */ "28 64 8 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #669900", "' c #ffcc00", "( c #ffcc99", ") c None", /* pixels */ "))$$$$))))))))))))))))))))))", "))($(())))))))))))))))))))))", "))(((())))))))))))))))))))))", "))(((())))))))))))))))))))))", "))$(($))))))))))))))))))))))", "))!!!!))))))))))))))))))))))", "))!#!!))))))))))))))))))))))", "))!!%!))))))))))))))))))))))", "))!#!!))))))))))))))))))))))", "))!#!))))))!!!!)))))))))))))", ")!#!!)))))!%%%#!))))))))))))", ")!!#!))))!#%%%%#!)))))))))))", ")!!##))))!%%%%%%!)))))))))))", ")#!##))))!%%%%%%!)))))$$$)))", ")####))))!%%%%%%!)))))((()))", ")#####)))!%%%%%%!)))))((($))", ")!####!))!%###%!!))))))((($)", "))####!%)!!%##%!)))))))((($)", "))!#%%%#!#!!&%!!!!!!)))!!!))", ")))!%%%#!!!!''#####!)))!!#))", "))))!%%###!!'''#####!))!##))", ")))))!#%##!!'''######!!!##))", "))))))!#!####''####!#!#!##!)", ")))))))!#####''###!!###!!#!)", ")))))))!#!##''####!#######!)", "))))))))!###'#####!!!#!###!)", "))))))))!###%'####!)#!!##!!)", ")))))))))!#%%%###!)####!!!#)", ")))))))))!#%%##%#!####!!))))", ")))))))))!#%##%%#!####!!))))", ")))))))))!%%#####!!###!)))))", ")))))))))%########!#!!!)))))", ")))))))))#########!##!!)))))", "))))))))!###!#######!!!)))))", ")))))))!!%%%%%%%%#####!)))))", ")))))))!#%%%%!#%%##!!!))))))", "))))))!!######%%##!###))))))", ")))))!!%#!!#######!##!!)))))", ")))))!!%%##!!#!))!!!%!!)))))", ")))))!%%%%##!))))!!#!!!)))))", "))))!!%%!#%!))))))!!#!!)))))", "))))!!%%%#!)))))))!!#!!)))))", ")))!!!#%%%!)))))))!#!!!)))))", ")))!!!#!%!))))))))!!#!!!))))", ")))!!!##%)))))))))!##!!!))))", ")))!!!!!))))))))))))))))))))", ")))!!!!!!)))))))))))))))))))", "))))!!%%%%))))))))))))))))))", ")))))!!!!!))))))))))))))))))", ")))))!!%%%#)))))))))))))))))", "))))))!!!!!)))))))))))))))))", "))))))!!!%!)))))))))))))))))", "))))))!!%%!)))))))))))))))))", ")))))))!!!%)))))))))))))))))", ")))))))!!!!!))))))))))))))))", "))))))))#%%#))))))))))))))))", "))))))))!!!!))))))))))))))))", ")))))))!#%#!!)))))))))))))))", "))))))!!!!!!!)))))))))))))))", "))))))!!!!!!!)))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_20f.xpm0100644000175000017500000000461507041513604020751 0ustar aaronlaaronl/* XPM */ static char *ninja_20f[] = { /* width height ncolors chars_per_pixel */ "28 64 8 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #669900", "' c #ffcc00", "( c #ffcc99", ") c None", /* pixels */ "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))$$$$", "))))))))))))))))))))))))(($(", "))))))))))))))))))))))))((((", "))))))))))))))))))))))))((((", "))$$$)))))))))))))))))))$(($", "))($()))))))))))))))))))!!!!", ")$((())))))))!!!!)))))))!!#!", ")$((()))))))!#%%%!))))))!%!!", ")$((())))))!#%%%%#!)))))!!#!", "))$(!))))))!%%%%%%!)))))#!!)", "))!!#))))))!%%%%%%!))))!!#!)", "))###!)))))!%%%%%%!))))!#!!)", "))!!!!)))))!%%%%%%!))))!!#!)", "))!##!!))))!!%###%!))!#!#!!)", "))!!!!!)))))!%##%!!)!!##%!!)", "))!!!!!)!!!!!!%&!!)!#%%%!!!)", ")))!#!!!!#####''!!!!#%%%!!))", ")))!##!######'''!!###%%!!)))", ")))!!!##!####'''!###%#!!))))", ")))!####!####''####!#!))))))", ")))!!##!#!###''#####!)))))))", "))))!#!!!!####''##!!!)))))))", "))))!!!!)!!####'###!))))))))", "))))))))))!###'%###)))))))))", "))))))))))!###%%%#!)))))))))", "))))))))))!#%%##%#!)))))))))", "))))))))))!#%##%%#!)))))))))", "))))))))))!%%#####!!#)))))))", "))))))))))%########!#!))))))", "))))))))))#########!##!)))))", ")))))))))!##%!#######!!!))))", ")))))))))!%%%%%%%%####!!!)))", ")))))))))#%%%%!#%%##!!!!!)))", "))))))))!!#####%%###!#!!!)))", "))))))))!!#######!!!!!!!!)))", ")))))))!!#!####!!!###!!!!)))", ")))))))!!%!!!!#))))!!!!!))))", ")))))))!!!!!!!))))!!!!!!))))", ")))))))!!!!##!))))!###!!))))", ")))))))!!!###)))))!!!!!)))))", "))))))!!!###))))))!###!)))))", "))))))!!!!!!))))))!##!!)))))", "))))))!!###!)))))!!##!!)))))", "))))))!!!!!))))))!!!%!))))))", "))))))!!###!)))))!!##!!)))))", ")))))))!!!!!!))))!!!%!!)))))", ")))))))!%%%%#))))!!#!!!)))))", ")))))))!!!!!!))))!!!#!!!))))", ")))))))!!#%#!))))!!##!!!!)))", "))))))))!!!!!)))))))))))))))", "))))))))!#%%))))))))))))))))", "))))))))!!!#!)))))))))))))))", "))))))))!!#!!)))))))))))))))", "))))))))!!#%!)))))))))))))))", ")))))))!!!!!!)))))))))))))))", ")))))))!!!!!!)))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_22.xpm0100644000175000017500000000436307041513604020605 0ustar aaronlaaronl/* XPM */ static char *ninja_22[] = { /* width height ncolors chars_per_pixel */ "28 60 7 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #ffcc00", "' c #ffcc99", "( c None", /* pixels */ "(((((((((((((&((((((((((((((", "((((((((((((((&(((((((((((((", "((((((((((((((&(((((((((((((", "(((((((((((((&&(((((((((((((", "(((((((((((((&&(((((((((((((", "((((((((((((!!!!((((((((((((", "(((((((((((!%%%#!(((((((((((", "((((((((((!#%%%%#!((((((((((", "((((((((((!%%%%%%!((((((((((", "((((((((((!''''''!((((((((((", "((((((((((!$$''$$!((((((((((", "((((((((((!''%%''!((((((((((", "((((((((!!!%#!!%!!!!((((((((", "((((((!!#%!!%##%!!%#!!((((((", "(((((!##%#!!!%%!!!#%%%!(((((", "(((((!##%!###!!###!%%%!(((((", "((((!##%%!##%#####!%%%#!((((", "(((!#%###!########!###%!((((", "(((!####!##########!####!(((", "((!#####!%#########!#%###!((", "((!!%$#!!####%%####!!#$%!!((", "((!%'''!(!########!(!'''%!((", "((!''$$#(%!!!%%!!!#(#$$''!((", "((!'$$''(!##%%%%##!(''$$'!((", "((!!$''((!##!%%!##!((''$!!((", "(((#!!(((!##%##%##!(((!!#(((", "(((((((((!%#%##%##!(((((((((", "(((((((((!!%%##%%!!(((((((((", "(((((((((!%!!!!!!%%!((((((((", "((((((((!%%%%%%%%%%%!(((((((", "(((((((!#!%%%%%%%%%!!(((((((", "(((((((!##!!!!!!!!!#!(((((((", "(((((((!#%#%%%%%%##%!(((((((", "(((((((!#!######%!##!(((((((", "(((((((!####!#%%####!(((((((", "(((((((!#####%!#%###!(((((((", "(((((((!####%!!!#####!((((((", "(((((((!####%#!######!((((((", "(((((((!####%!!%####!(((((((", "(((((((!%##%%!!#####!(((((((", "((((((!#%%##%!!#####!(((((((", "(((((((!%####!%#!##%!(((((((", "(((((((!####!!!%%#%!((((((((", "((((((((!!!!#!!!!!!!((((((((", "((((((((!!%%!(!!%%#!((((((((", "(((((((((!##!(!!!!!!((((((((", "((((((((((!!((!#%%#!((((((((", "((((((((((((((!!!!!!((((((((", "((((((((((((((!#%%#!((((((((", "((((((((((((((!!!!!(((((((((", "((((((((((((((!#%#!(((((((((", "((((((((((((((!!!!!(((((((((", "((((((((((((((!#%%!(((((((((", "((((((((((((((!!!#!(((((((((", "((((((((((((((!!#!!(((((((((", "((((((((((((((!##%!(((((((((", "((((((((((((((!###!(((((((((", "((((((((((((((!###!(((((((((", "((((((((((((((!##!((((((((((", "(((((((((((((((!!(((((((((((", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_22b.xpm0100644000175000017500000000436407041513604020750 0ustar aaronlaaronl/* XPM */ static char *ninja_22b[] = { /* width height ncolors chars_per_pixel */ "28 60 7 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #ffcc00", "' c #ffcc99", "( c None", /* pixels */ "((((((((((((((&(((((((((((((", "(((((((((((((&((((((((((((((", "(((((((((((((&((((((((((((((", "(((((((((((((&&(((((((((((((", "(((((((((((((&&(((((((((((((", "((((((((((((!!!!((((((((((((", "(((((((((((!%%%#!(((((((((((", "((((((((((!#%%%%#!((((((((((", "((((((((((!%%%%%%!((((((((((", "((((((((((!''''''!((((((((((", "((((((((((!$$''$$!((((((((((", "((((((((((!''%%''!((((((((((", "((((((((!!!%#!!%!!!!((((((((", "((((((!!#%!!%##%!!%#!!((((((", "(((((!##%#!!!%%!!!#%%%!(((((", "(((((!##%!###!!###!%%%!(((((", "((((!##%%!##%#####!%%%#!((((", "(((!#%###!########!###%!((((", "(((!####!##########!####!(((", "((!#####!%#########!#%###!((", "((!!%$#!!####%%####!!#$%!!((", "((!%'''!(!########!(!'''%!((", "((!''$$#(%!!!%%!!!#(#$$''!((", "((!'$$''(!##%%%%##!(''$$'!((", "((!!$''((!##!%%!##!((''$!!((", "(((#!!(((!##%##%##!(((!!#(((", "(((((((((!%#%##%##!(((((((((", "(((((((((!!%%##%%!!(((((((((", "(((((((((!%!!!!!!%%!((((((((", "((((((((!%%%%%%%%%%%!(((((((", "(((((((!#!%%%%%%%%%!!(((((((", "(((((((!##!!!!!!!!!#!(((((((", "(((((((!#%#%%%%%%##%!(((((((", "(((((((!#!######%!##!(((((((", "(((((((!####!#%%####!(((((((", "(((((((!#####%!#%###!(((((((", "(((((((!####%!!!#####!((((((", "(((((((!####%#!######!((((((", "(((((((!####%!!%####!(((((((", "(((((((!%##%%!!#####!(((((((", "((((((!#%%##%!!#####!(((((((", "(((((((!%####!%#!##%!(((((((", "(((((((!####!!!%%#%!((((((((", "((((((((!!!!#!!!!!!!((((((((", "((((((((!!%%!(!!%%#!((((((((", "(((((((((!##!(!!!!!!((((((((", "((((((((((!!((!#%%#!((((((((", "((((((((((((((!!!!!!((((((((", "((((((((((((((!#%%#!((((((((", "((((((((((((((!!!!!(((((((((", "((((((((((((((!#%#!(((((((((", "((((((((((((((!!!!!(((((((((", "((((((((((((((!#%%!(((((((((", "((((((((((((((!!!#!(((((((((", "((((((((((((((!!#!!(((((((((", "((((((((((((((!##%!(((((((((", "((((((((((((((!###!(((((((((", "((((((((((((((!###!(((((((((", "((((((((((((((!##!((((((((((", "(((((((((((((((!!(((((((((((", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/23_duplicate_of_200100644000175000017500000000000007041513604021623 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/ninja/23b_duplicate_of_180100644000175000017500000000000007041513604021774 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/ninja/23c_duplicate_of_20c0100644000175000017500000000000007041513604022131 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/ninja/23d_duplicate_of_20d0100644000175000017500000000000007041513604022133 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/ninja/23e_duplicate_of_20e0100644000175000017500000000000007041513604022135 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/ninja/23f_duplicate_of_20f0100644000175000017500000000000007041513604022137 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_25.xpm0100644000175000017500000000156507041513604020611 0ustar aaronlaaronl/* XPM */ static char *ninja_25[] = { /* width height ncolors chars_per_pixel */ "44 12 9 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #990000", "& c #cc0000", "' c #333399", "( c #ffcc00", ") c #ffcc99", "* c None", /* pixels */ "***********&&#******************************", "**********&%%&!*****************************", "*********!&%'##!&***************************", "********!#%%'##!%%*******************!*!!!**", "********!#%%&###!%&&*****!&&&&&&&!*!!)$)''!*", "*******!#%&''####!!!!&&&&&%%%%%%#!!&#)$)''!*", "*******&%########!'''!%%%%%&!!!!!!'&!)))#''!", "******!%%###&#####!''!###%%'!!'#!!!##')(##'!", "*****!&###!!#####!!''!###&''!'###!!!&!'!##'!", "**!!''!##!**######!'$$'#&''!!####!!'&#!!##'!", "!!&&'''!!***&&####!$))$&&'#!'####!!##&##'!!*", "!'#&&&#!****!&####$))&&!&&!!###'!!!!!%%&!'(*", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_26.xpm0100644000175000017500000000551707041513604020613 0ustar aaronlaaronl/* XPM */ static char *ninja_26[] = { /* width height ncolors chars_per_pixel */ "48 48 10 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #3333ff", "% c #996666", "& c #333399", "' c #669900", "( c #ffcc00", ") c #ffcc99", "* c None", "+ c #330066", /* pixels */ "************************************************", "***********!!!!*********************************", "**********!&&&&!!*******************************", "*********&!###&&&!******************************", "*****((('!&####&&!******************************", "*(**((((&!#!!()))!******************************", "**(((((**!#!&))%%*******************************", "***(((***!##!&)))!******************************", "*********!####!#!*******************************", "**********!&!###!!!!****************************", "**********!##!!!!##!!!**************************", "**********!#!#&##!##!#!!************************", "*********!#&###&#!####!#!***********************", "*****%%*!#!&######!&!!###!**********************", "****%))%!##!##!!!!!!#!#!#!**********************", "***#)))%!#!##%###!#!##!#!!**********************", "***#))%%!!!#%)####!#!#!!!***********************", "***%))%!!#!#%))))%!!!!!!************************", "****%%%#!#!##%))%##!!!**************************", "*****!!!#!#!##%%#!!!#!**************************", "******!#!#!#!###!#####!*************************", "*******!##!!!!#!&##!#!!!!!!!!!******************", "********!!!!*!!#&!!##########&!!!!!!!!!!!!!!!!!*", "*************!##!#############&!!!#!#!#!#!!####!", "**************!################!&!&!&!&!&!#####!", "**************!&#####&#######!&!&!&!&!#!&#!&##!*", "*************+######&!##&#&###&!#!#!#!!!!!!!!!**", "************+#####&#&&&!!!!!#&#!!!!!!***********", "***********+###&##&#!!!*****!!!*****************", "***********+#&&&#&&!****************************", "**********+##&&&&&!*****************************", "*********+###&&&&!******************************", "*********+#&&#&&&!******************************", "*********+&&&&&&!*******************************", "*********!+!&&&!!*******************************", "**********+#!!!!********************************", "**********##$!!!********************************", "***********+!$&!********************************", "***********+#$!!!*******************************", "************+!&#!*******************************", "************!#$!!!******************************", "*************!!$#!******************************", "*************!!!&!!*****************************", "*************!#&!&!*****************************", "*************!!!!#&!****************************", "************+$&&&!#+****************************", "***********+&####!!*****************************", "***********+!!!!!*******************************", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_28.xpm0100644000175000017500000000444107041513604020610 0ustar aaronlaaronl/* XPM */ static char *ninja_28[] = { /* width height ncolors chars_per_pixel */ "48 38 9 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #669900", "' c #ffcc00", "( c #ffcc99", ") c None", "* c #330066", /* pixels */ ")))))))))))!!!!)))))))))))))))))))))))))))))))))", "))))))))))!%%%%!!)))))))))))))))))))))))))))))))", ")))))))))%!###%%%!))))))))))))))))))))))))))))))", ")))))'''&!%####%%!))))))))))))))))))))))))))))))", ")'))''''%!#!!'(((!))))))))))))))))))))))))))))))", "))'''''))!#!%(($$)))))))))))))))))))))))))))))))", ")))''')))!##!%(((!))))))))))))))))))))))))))))))", ")))))))))!####!#!)))))))))))))))))))))))))))))))", "))))))))))!%!###!!!!))))))))))))))))))))))))))))", "))))))))))!##!!!!##!!!))))))))))))))))))))))))))", "))))))))))!#!#%##!##!#!!))))))))))))))))))))))))", ")))))))))!#%###%#!####!#!)))))))))))))))))))))))", ")))))$$)!#!%######!%!!###!))))))))))))))))))))))", "))))$(($!##!##!!!!!!#!#!#!))))))))))))))))))))))", ")))#((($!#!##$###!#!##!#!!))))))))))))))))))))))", ")))#(($$!!!#$(####!#!#!!!)))))))))))))))))))))))", ")))$(($!!#!#$(((($!!!!!!))))))))))))))))))))))))", "))))$$$#!#!##$(($##!!!))))))))))))))))))))))))))", ")))))!!!#!#!##$$#!!!#!))))))))))))))))))))))))))", "))))))!#!#!#!###!#####!)))))))))))))))))))))))))", ")))))))!##!!!!#!%##!#!!!!!!!!!))))))))))))))))))", "))))))))!!!!)!!#%!!##########%!!!!!!!!!!!!!!!!!)", ")))))))))))))!##!#############%!!!#!#!#!#!!####!", "))))))))))))))!################!%!%!%!%!%!#####!", "))))))))))))))!%#####%#######!%!%!%!%!#!%#!%##!)", ")))))))))))))!######%!##%#%###%!#!#!#!!!!!!!!!))", "))))))))))))!#####!!%%%!!!!!#%#!!!!!!)))))))))))", ")))))))))))!###%##%#!!!)))))!!!)))))))))))))))))", "))))))))))!%%!#!#%%!))))))))))))))))))))))))))))", ")))))))))!#%%##%!%!)))))))))))))))))))))))))))))", ")))))))))!#%%!!!%!)))!!)))))))))))))))))))))))))", ")))))))))!%%!!%!!!!!!##!))))))))))))))))))))))))", ")))))))))!%!%!%!!%!%!%!!))))))))))))))))))))))))", ")))))))))!#%!%!%!%!%#!##!)))))))))))))))))))))))", "))))))))))!#!#!#!#!#!%###!))))))))))))))))))))))", ")))))))))))!!!!!!!!*%!####!)))))))))))))))))))))", "))))))))))))))))))))))!!###!))))))))))))))))))))", "))))))))))))))))))))))))*!!)))))))))))))))))))))", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_32.xpm0100644000175000017500000000334407041513604020604 0ustar aaronlaaronl/* XPM */ static char *ninja_32[] = { /* width height ncolors chars_per_pixel */ "62 22 8 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #669900", "' c #ffcc00", "( c #ffcc99", ") c None", /* pixels */ "))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))", "))))))))))''')))!!!!))))))))))))))))))))))))))))))))))))))))))", "))))))')''''''&!%%%%!!))))))))))))))))))))))))))))))))))))))))", ")))))))'))))'&%!###%%%!)))))))))))))))))))))))))))))))))))))))", ")))))))))))))%!%####%%!!!))))))))))))))))))))))!!!!!!!!)))))))", ")))))))))))))#!#!!'(((!###!!))))))))))))!!!!!!!!##!#!#!!!!!)))", ")))))))))))))###!%(($$!!!!%#!!!!!#!!!!!!##########!#!#!#!#!!!)", ")))))))))))))!!!#!%(((!###!##!%%!!################!#!#!#!!#!#!", "))))))))))))))##!##!#!#####!##!%%!###############!!!!!!!!%!##!", ")))))))))))))))##!%##!%###%!##!%%!############!!!!))))))!!%!!!", ")))))))))))))))!#!!!!!%###!%!#!%%!#########!!!!)))))))))!%%#!)", ")))))))))))))))!##!###!#####!#!%%!######!!!))))))))))))!!%#!))", "))))))))))))))!#!##!##!!#####!#!!!###!!!)))))))))))))))!%#!)))", ")))))))))))))!#####!!##!%####!!##!!!!)))))))))))))))))))))))))", "))))))))))))!######!)!##!!####!######!!)))))))))))))))))))))))", ")))))))))))!######!)))!!!#!!#!!####!!!!!!!))))))))))))))))))))", ")))))))))!!#!####!)))))!#!##!%!##!!#!#!#!#!)))))))))))))))))))", ")))))))!!#!##!##!))))))!##!#%!#!!##!#!%!##!)))))))))))))))))))", ")))))!!#!##!#!!!)))))###!#%!!#!##!#!!!!%!!!)))))))))))))))))))", ")))$###!#!#!!)))))$###!#%!!##!#!#!!))!%%#!))))))))))))))))))))", "))(((($#!!!))))))$((($#!!!######!)))!!%#!)))))))))))))))))))))", ")(($(($#!)))))))$(($($#!!)!!!!!!))))!%#!))))))))))))))))))))))", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_38.xpm0100644000175000017500000000453207041513604020612 0ustar aaronlaaronl/* XPM */ static char *ninja_38[] = { /* width height ncolors chars_per_pixel */ "24 72 6 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #ffcc99", "' c None", /* pixels */ "'''''''''''''''&&&''''''", "''''''''''''''$$&&&'''''", "''''''''''''''&&&&&'''''", "'''''''''''''''&&&&'''''", "''''''''''''''''&$&'''''", "'''''''''''''''!!!''''''", "'''''''''''''''!!!!'''''", "'''''''''''''''!!!!'''''", "'''''''''''''''!%%!'''''", "'''''''''''''''!!!!!''''", "'''''''''''''''!%%%!''''", "'''''''''''''''!!!!!''''", "'''''''''''''''!%%%!''''", "'''''''''''''''!!!!!''''", "'''''''''''''''!!%%!!'''", "'''''''''''!!!!#!!!!!'''", "''''''''''!&&&&!!!!!!'''", "'''''''''!%$$&$!##!!!'''", "'''''''''!&&&%&&!##!!'''", "'''''''''!%%%!%%!##!!'''", "'''''''''!%%%!%%!####'''", "'''''''''!%%%!%%!####!''", "'''''''''!%##%%!!!!##!''", "''&&&&''''!%!!%!!####!''", "''#&&&''''!!%%!!!###!!''", "''&&&&'!!!%%!!%%!###!!''", "''!&&&'!!#!!##!!!%#!!!''", "'!&&$&!#!########!%%!!''", "'!##!!##!##%#!###!%!''''", "'!!!!######!!####!%!''''", "'!##!##!##########!!''''", "!!!!!!%!###!######!'''''", "!##%!!!#####%%###!!'''''", "!!!!!!!#########!%!'''''", "!##%!!'!##!!%%!!%#''''''", "!!!!!'''!!#%%%%%#!''''''", "'!!!!'''!%%!!%!##!''''''", "'!!!''''!!!!%#%##!''''''", "''''''''!%%%#!!##!''''''", "'''''''!!!!%%%%!!!''''''", "'''''''!###!##%%%!''''''", "''''''!!%!##!##%%!''''''", "'''''!!!!!!##!##%%!'''''", "'''''!!%%%!!#!!!#%!'''''", "'''''!%%%%%!#!!!!%%'''''", "'''''!%%%%%!!!#%!##!''''", "'''''!!!!!!!!%%####!''''", "'''''!%%%%%!'!#%####''''", "'''''!%!!!!!'!!#####!'''", "'''''!!%%%%!''!#####!'''", "''''''!!!!!!''!######'''", "''''''!%%%!'''!%#!##%'''", "''''''!!!!!''''!!!!%!!''", "''''''!%%%!''''!%%#!!!''", "''''''!!!!!''''!!!!!!!''", "''''''!%%%!'''!!!%%#!!''", "''''''!!!!!'''!!!!!!''''", "'''''!!%%!!'''!!#%%#''''", "'''''!#%%!!'''!!!!!!''''", "''''!%##%!!''''!#%%#''''", "''''!%%!!!'''''!!!!'''''", "''''!!!!'''''''!%#!'''''", "'''''''''''''''!!!!'''''", "'''''''''''''''!%%!'''''", "'''''''''''''''!!#!'''''", "'''''''''''''''!#!%'''''", "''''''''''''''!#!%%!''''", "''''''''''''''!#!#%!''''", "''''''''''''''!!!#%%!'''", "'''''''''''''''!!##%!'''", "''''''''''''''''!!##!'''", "'''''''''''''''''!!!!'''", }; xevil-2.02r2.orig/x11/gen_xpm/ninja/ninja_39.xpm0100644000175000017500000000436307041513604020615 0ustar aaronlaaronl/* XPM */ static char *ninja_39[] = { /* width height ncolors chars_per_pixel */ "28 60 7 1 0 0", /* colors */ "! c #000000", "# c #333366", "$ c #996666", "% c #333399", "& c #ffcc00", "' c #ffcc99", "( c None", /* pixels */ "(((((((((((((&((((((((((((((", "((((((((((((((&(((((((((((((", "((((((((((((((&(((((((((((((", "(((((((((((((&&(((((((((((((", "(((((((((((((&&(((((((((((((", "((((((((((((!!!!((((((((((((", "(((((((((((!%%%#!(((((((((((", "((((((((((!#%%%%#!((((((((((", "((((((((((!%%%%%%!((((((((((", "((((((((((!%%%%%%!((((((((((", "((((((((((!$''''$!((((((((((", "((((((((((!'$''$'!((((((((((", "((((((((!!!%'%%'%!!!!(((((((", "((((((!!#%!!#!!%!!##!!!(((((", "(((((!##%#!!!%%!##!##!#!!(((", "(((((!##%!###!!####!###!#!((", "((((!##%%!##%####$'%%!!###!(", "(((!#%###!#######!''%#!#!#!(", "(((!##!#!#######'$$'$##!#!!(", "((!#!##!!#######$$$$'!#!!!((", "(!!#!!!!%'$##%%##$''$!!!((((", "(!#!#!#%''!#######$$((((((((", "(!!#!##$'$$'!%%!!!#(((((((((", "((!!!#!'$$$$%%%%##!(((((((((", "((((!!!$''$#!%%!##!(((((((((", "(((((((($$##%##%##!(((((((((", "(((((((((!%#%##%##!(((((((((", "(((((((((!!%%##%%!!(((((((((", "(((((((((!%!!!!!!%%!((((((((", "((((((((!%%%%%%%%%%%!(((((((", "(((((((!#!%%%%%%%%%!!(((((((", "(((((((!##!!!!!!!!!#!(((((((", "(((((((!#%#%%%%%%##%!(((((((", "(((((((!##!#####%!##!(((((((", "(((((((!#####!%%####!(((((((", "(((((((!######!#%###!(((((((", "(((((((!#####%!!####!(((((((", "(((((((!#####%!#####!(((((((", "(((((((!#####%!####!((((((((", "((((((((!%##%%!####!((((((((", "((((((((!%%##%!####!((((((((", "((((((((!%####!!##%!((((((((", "((((((((!####!!%#%!(((((((((", "(((((((((!!!!#!!!!!(((((((((", "(((((((((!!%%!!%%#!(((((((((", "((((((((((!##!!!!!!(((((((((", "(((((((((((!!!#%%#!(((((((((", "(((((((((((((!!!!!!(((((((((", "(((((((((((((!#%%#!(((((((((", "(((((((((((((!!!!!((((((((((", "(((((((((((((!#%#!((((((((((", "(((((((((((((!!!!!((((((((((", "(((((((((((((!#%%!((((((((((", "(((((((((((((!!!#!((((((((((", "(((((((((((((!!#!!((((((((((", "(((((((((((((!##%!((((((((((", "(((((((((((((!###!((((((((((", "(((((((((((((!###!((((((((((", "(((((((((((((!##!(((((((((((", "((((((((((((((!!((((((((((((", }; xevil-2.02r2.orig/x11/gen_xpm/alien/0040755000175000017500000000000007637441100016445 5ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/alien/alien_0.xpm0100644000175000017500000000667707041513606020517 0ustar aaronlaaronl/* XPM */ static char *alien_0[] = { /* width height ncolors chars_per_pixel */ "48 58 15 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #4d4d4d", "( c #330000", ") c #660000", "* c #cc00ff", "+ c #333300", ", c #990099", "- c #cc0099", ". c #808080", "/ c None", "0 c #330066", /* pixels */ "/////////////////////....///////////////////////", "/////////////////....#!##...////////////////////", "/////////////....(0((#!#(((#..//////////////////", "///////////..#0((##........#0(./////////////////", "//////////.#0((....////////...//////////////////", "/////////.((#../////////////////////////////////", "///////..(0..///////////////////////////////////", "//////.#(0#.////////////////////////////////////", "/////.(0#../////////////////////////////////////", "////.#0(#.//////////////////////////////////////", "///.(0...///////////////////////////////////////", "//.(0(.//////////////////////....///////////////", "/.#0#.//////////////////////.#(##../////////////", "/.0(.//////////////////////.#!!00(#.////////////", ".#0#./////////////////////.#!%%%%!0#.///////////", ".(0.//////////////////////.#%!!!%-!(#.//////////", ".(!#./////////////////////.!0(0!!%,!(.//////////", ".#(.////////////./////////.0%(#(0!!!0#./////////", ".(!#.//////////.#.........#((!##!((0!$./////////", ".#00.//////////.#(((((!(0($(0(0!0(.#'+./////////", "/.0(..//////////...#0##(((0!%0((00....//////////", "/.(!(#./////////........##!,-!(0#!0#.///////////", "/.#!0..////////.0(0(#####!,-0(#(#()&+.//////////", "//.0((#.///////.#(0!0!0!0,,0!(0#..##.///////////", "//.(!0#.////////...#((0)%,!(0!(0#...////../...//", "//.#0!#.///////.#.....#!,!(00(0(.//////.#!.#!#./", "///.(!0(..////.#0!0##.(,!(0(!(0#.//////.(#0!#../", "///.#0!((#..///.#(!!!0!!!0($(!0(.///...#0(((0!#.", "////.(000(##..//..#(!!%0!($!0!(0#...##0!!00(#../", "/////.(!!000##......#!,(0(+$(!0!(#(0!!0(((00(##.", "//////.#(!)!(0#####.##%%(0(0(0(!,%,!!#....#(##./", "///////..#00!!(0((0#0(0%!0#(#+##!!0#..////....//", "/////////.#(0!!00!(!0!(!%!!!(0(.#...////////////", "//////////..##(!)0!0)0!0!!00($#..///////////////", "////////////...##(#####((!!!0(##.///////////////", "///////////////........0!0!!!0!0(.//////////////", "////////////////./////.(!(0!!,,!0.//////////////", "//////////////..#.////.(00!(0!-,!#..////////////", "/////////////.#((.//...#0!(!!%!*%(.(.///////////", "////////////.#!!#...##.#!!!!!0!!,!0(.///////////", "///////////.#!%!0(0(!0(0(!00)((0!!!#.///////////", "//////////.#!0!!%%%,%!!!0,!0####!!!#.///////////", "//////////.(!!!%!%%,,%!!!%(#...(!%0(.///////////", "//////////.#%!0!#(00(0(0!(#.///.0%!0.///////////", "//////////.#!!##.......#!(.///.#!!%!#.//////////", "//////////.(!0#.///////.#(#.///.(!,!(.//////////", "//////////.#!!./////////...////.#0-!0.//////////", "//////////.#%(./////////////////.(%,0#./////////", "//////////.#!0.////////////////..#!,!(#.....////", "//////////.#(#.///////////////.#((!!!0(###(#.///", "///////////...////////////////.##!!!!00(0!%0(.//", "///////////////////////////////..(0!!!!!!!###.//", "/////////////////////////////////..#0)(###...///", "///////////////////////////////////.##....//////", "////////////////////////////////////..//////////", "////////////////////////////////////////////////", "////////////////////////////////////////////////", "////////////////////////////////////////////////", }; xevil-2.02r2.orig/x11/gen_xpm/alien/alien_0b.xpm0100644000175000017500000000672107041513606020647 0ustar aaronlaaronl/* XPM */ static char *alien_0b[] = { /* width height ncolors chars_per_pixel */ "48 58 16 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #4d4d4d", "( c #330000", ") c #660000", "* c #cc00ff", "+ c #333300", ", c #990099", "- c #cc0099", ". c #660099", "/ c #808080", "0 c None", "1 c #330066", /* pixels */ "000000000000000000000000000000000000000000000000", "000000000000000000000000000000000000000000000000", "0000000000000000000///////0000000000000000000000", "000000000000000////#(#(((1////000000000000000000", "0000000000000//#1!(##////(1(##/00000000000000000", "00000000000//(!(#////0000////#/00000000000000000", "000000000//1(#///000000000000/000000000000000000", "00000000/#((//0000000000000000000000000000000000", "0000000/#1(/000000000000000000000000000000000000", "000000/((#/0000000000000000000000000000000000000", "0000//11#/00000000000000000000000000000000000000", "000/#((#/000000000000000000000000000000000000000", "00/#!1//0000000000000000000000000000000000000000", "00/1(#/0000000000000000000000/////00000000000000", "0/((//0000000000000000000000/#(###/0000000000000", "/#11/0000000000000000000000/#!!11((/000000000000", "/((/0000000000000000000000/#!%%%%%1#/00000000000", "/(1#/000000000000000000000/#%!!!%*!1#/0000000000", "/1!#/000000000000000000000/!1(1!!!,!(#/000000000", "/#(#/0000000000///0000000//1%(##1(!!1(/000000000", "/(!(#/00000000/###////////#((!(!!((1&'/000000000", "/#11/0000000000//((1!!1!1+$(1(1##!#0+/0000000000", "0/1(#/0000000000////////#(1!-!1(/1!($+/000000000", "0/(!1#/00000000/##//////##1!%(#1#/(11#/000000000", "0/#!(#/00000000/(!1!((#((#1%!1((/0//#/0000000000", "00/(!1#/00000000/#(11!!!!(!.(!1(#/00/00000000000", "00/#!(#/0000000/////(#(11#%!1!(1#/00000000000000", "000/11(#//0000/#(##/////#(,1!11(/000000000000000", "000/#!!(##/0000/1!!1(###(1-1)!(#/000000000000000", "0000/(111#//0000/#(!!!1!1!%1!!1#/000000000000000", "0000/#(!)1((///00//#(1!!!!%(!1(#/000000000000000", "00000/#1!111#(#//////##(1(!11(1#/000000000000000", "000000//#)!!1!#(###/(#(1(!!((((#/000////00000000", "00000000/#((!!111!1(11!11!1!11#(#///#((#/0000000", "000000000//#(1)!!(!1!!1(!!1(1!1%!!(#(1###//00000", "00000000000//#(1(1((((1!1!!!(!(!1!1!!1(11(#/0000", "0000000000000//////////#(1%%1(1(!!(1(1!!(//00000", "00000000000000000000000/#(!-!!1!(11(11##((/00000", "0000000000000000000000//#1!!-%!(1((!((1#//000000", "000000000000000000000/#/#!1!!-,!1(1#(1#(#/000000", "000000000000000000000/(#/#(!!!*!!!#(//#//0000000", "00000000000000000000/#!#/(11!!,%!%###//000000000", "0000000000000000000/#!11(1!,%1!-1(#//00000000000", "0000000000000000000/(!%!%%,%!(!!!!1/000000000000", "0000000000000000000/1!!!!!1((1!!1(#/000000000000", "000000000000000000/#!!!!1#//#!%!(//0000000000000", "0000000000000000000/!!1(#/0/(!%!#/00000000000000", "0000000000000000000/(%!#/00/1!,!#/00000000000000", "00000000000000000000/!!(/00/(,,1#/00000000000000", "00000000000000000000/(%(////1,!(/000000000000000", "00000000000000000000/#!!###/!-!(/000000000000000", "000000000000000000000/1!##1(!,1#/000000000000000", "000000000000000000000/#(//!%!%!#/000000000000000", "0000000000000000000000//0/(!!!1(#////00000000000", "00000000000000000000000000/(1!!!1(1(#/0000000000", "00000000000000000000000000/#1!!1!%!!(/0000000000", "000000000000000000000000000//####(###/0000000000", "00000000000000000000000000000////////00000000000", }; xevil-2.02r2.orig/x11/gen_xpm/alien/alien_0c.xpm0100644000175000017500000000672107041513606020650 0ustar aaronlaaronl/* XPM */ static char *alien_0c[] = { /* width height ncolors chars_per_pixel */ "48 58 16 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #555555", "( c #4d4d4d", ") c #330000", "* c #660000", "+ c #cc00ff", ", c #333300", "- c #990099", ". c #cc0099", "/ c #808080", "0 c None", "1 c #330066", /* pixels */ "0000000000000000000000///00000000000000000000000", "000000000000000000/////#////00000000000000000000", "00000000000000////11)))#)!##///00000000000000000", "000000000000//#)1)#////////)#)#/0000000000000000", "0000000000//)1)#///00000000////00000000000000000", "000000000/##)#//00000000000000000000000000000000", "00000000/#1)//0000000000000000000000000000000000", "000000//#1)/000000000000000000000000000000000000", "00000/#1)//0000000000000000000000000000000000000", "0000/#)1)/00000000000000000000000000000000000000", "000/#!#//000000000000000000000000000000000000000", "00/#1)/0000000000000000000000////000000000000000", "00/!#/0000000000000000000000/#)##//0000000000000", "0/)!#/000000000000000000000/#!!11)#/000000000000", "0/1#/000000000000000000000/#!%%%%11#/00000000000", "/#!#/000000000000000000000/#%!!!%-!)#/0000000000", "/)1)/000000000000000000000/!1)1!!.-!)/0000000000", "/#!#/000000000000000000000/1%)#)1!!%1#/000000000", "/#1#/00000000000///////////))!)!1)1!!)/000000000", "0/!!#/000000000/#)####)1)1,$)11#)1##,'/000000000", "0/)1#/0000000000//))1)1)1)(11*1)#!#///0000000000", "0/)1)#/000000000////////##)!-!)1#)!1,/0000000000", "0/#!1#/00000000/#1)##///##1)-%#1)/1)&#/000000000", "00/)1)/00000000/#)1!!!!!!))1%%#)#///#/0000000000", "00/#!!)/00000000//##11!!!#)1%%11#/00/00000000000", "000/!1#//0000000///////#1#1)!%))#/00000000000000", "000/#1!)#/00000/)1)#///#1)))!-11/000000000000000", "0000/!11#)//000/#)!1!)))1)1$1!))/000000///000000", "0000/#*11)/#/000//#)!!!!!)#$*%1)/00000/#)#///000", "00000/#!!1)1#//0/0//#)11!1,&1%%#//////#1#)1)#/00", "000000/#)1!*1)#/#///#/#)1#,))1!11))1))1)1!##//00", "0000000//)!1!11))#)#)))1!!#1#)!!!1!1)1!!)11)##/0", "000000000/#)1!!1!1!1111!)%1)$#)#)#/////#1)#///00", "0000000000//#))!)!1!!!!1!1!!1,$)#/00000/#))#/000", "000000000000//##)#)#)##)1)!!))111#/00000///#/000", "00000000000000//////////)!!%1!-!*1#/0000000/0000", "0000000000000000000000/#11!-!1!!!!)#/00000000000", "0000000000000000000000/#)!!.%)!1!%%)//0000000000", "00000000000000000000000/)!1--1)!)111##/000000000", "000000000000000000000000/)!!.!1)!%!))#/000000000", "000000000000000000000000/#!!+!1!%!)#//0000000000", "000000000000000000000000/#1!-)!%-!#/000000000000", "00000000000000000/0000//#)!!-1!+-)/0000000000000", "0000000000000000/#/00/#1!!!!!)%%!)/0000000000000", "0000000000000000/#)//#!!%!%1!1-!1/00000000000000", "0000000000000000/#1##!!%.1)!)!!!#/00000000000000", "0000000000000000/!!!!--!!)1!!!1)/000000000000000", "000000000000000/#!!!-%!!#/#1!!!1/000000000000000", "000000000000000/#1!!!1#//0/)!1!)//00000000000000", "000000000000000/#!!)1#/000/#!!!1)#/0000000000000", "000000000000000/#!!!)/00000/)!!!11)/000000000000", "0000000000000000/#!11#/00000///)!!%)/00000000000", "00000000000000000/#!!)/00000000//#)1/00000000000", "000000000000000000/)!!#/000000000//#/00000000000", "0000000000000000000/1!1/00000000000/000000000000", "00000000000000000000/))/000000000000000000000000", "00000000000000000000/##/000000000000000000000000", "000000000000000000000//0000000000000000000000000", }; xevil-2.02r2.orig/x11/gen_xpm/alien/alien_0d.xpm0100644000175000017500000000670007041513606020646 0ustar aaronlaaronl/* XPM */ static char *alien_0d[] = { /* width height ncolors chars_per_pixel */ "48 58 15 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #4d4d4d", "( c #330000", ") c #660000", "* c #cc00ff", "+ c #333300", ", c #990099", "- c #cc0099", ". c #808080", "/ c None", "0 c #330066", /* pixels */ "////////////////////////////////////////////////", "//////////////////..........////////////////////", "//////////////....#!(((#(((#.../////////////////", "////////////..#(0(#.......#(#(#.////////////////", "//////////..((0#...///////...../////////////////", "/////////.#(0#..////////////////////////////////", "////////.#0#..//////////////////////////////////", "//////..#0(.////////////////////////////////////", "/////.#0(../////////////////////////////////////", "////.#(0#.//////////////////////////////////////", "///.#!#..///////////////////////////////////////", "//.#!#.//////////////////////....///////////////", "/.#0#.//////////////////////.#(##../////////////", "/.(!#./////////////////////.#!!00##.////////////", ".#0#./////////////////////.#!%%%%!(#.///////////", ".(!.//////////////////////.#%!!!%,!0#.//////////", ".(0(./////////////////////.!0(0!!,,0(.//////////", ".(0#.//////////.//////////.0%(#(!0!!0#./////////", ".#0#./////////.#..........(((!#!0(0!0(./////////", ".#!(#./////////.#(####0(0($+0(0#!(##'$./////////", "/.00..//////////.#(0(0(0(('0!0)#0(..#.//////////", "/.(0(#./////////........##(0-000#!(..///////////", "/.#!0#.////////.#0(#....##(!/%((#0!&+.//////////", "//.(0#.////////.#(!0!!0!0(00!,(0..#(#.//////////", "//.(!!#.////////..#(0)0!!#($),0(#....////./...//", "//.#!!#.////////......#(!(0(0-!(.///////.#.###./", "///.(00(../////.0!(#..#!!#((0!%(.//////.((0!#../", "///.#!)0##..///.#(0!!(0(0(0$!0,0.///...#00(#((#.", "////.(0!0(.#.///..#0!!!!!0+&(!!!#...##(!!(0!0#./", "/////.(!!0(0#.././..#0(!0($&0!0!!((0!!0#0(!(#.//", "//////.#(0!0((#.#...#0!(0(+((!(0!0!0(#....##(#./", "///////..(!!00(0(#(#(0)0!0##0#(#((#...////....//", "/////////.#(!!0!0000!00(0!00+(##.../////////////", "//////////..#((0)!!!(!!!!0)!0$+.////////////////", "////////////..#(##(#((#((0!!(0##.///////////////", "//////////////.........#!!%!0(!!#.//////////////", "////////////////./////.00!,!0,%!0#././//////////", "///////////////.#.////.((!,%(!!!0(..#.//////////", "/////////////..#(.////.#!!,,!0!!!0##(.//////////", "////////////.#!0(......#!!,%0(0!%!(!#.//////////", "///////////.#0!!0((0(0((0!*!!#((!0!(.///////////", "///////////.)0!%%%%!!!!0!%,!##.#(%0#.///////////", "//////////.#!!!!%,,-%!!!!,!#...#!%!(.///////////", "//////////.#!!0(0(0!0!0!(%(.///.0%,!#.//////////", "//////////.#!0(#...#####!(.////.(,-0(.//////////", "//////////.#!!#.///.....#0#.///.0!-!(.//////////", "//////////.#!0#.////////.##.///.#0,!0.//////////", "///////////.!!#./////////../////.(%%(.////./////", "///////////.(!.////////////////..#!,0(....#..///", "//////////.#0#.///////////////.#0(0!!0##(0!(#.//", "///////////.#./////////////////.#!!!0!!!!!!##.//", "////////////.///////////////////.(0!!!!!(0...///", "/////////////////////////////////.##!!(...//////", "//////////////////////////////////...../////////", "////////////////////////////////////////////////", "////////////////////////////////////////////////", "////////////////////////////////////////////////", "////////////////////////////////////////////////", }; xevil-2.02r2.orig/x11/gen_xpm/alien/alien_0e.xpm0100644000175000017500000000670007041513606020647 0ustar aaronlaaronl/* XPM */ static char *alien_0e[] = { /* width height ncolors chars_per_pixel */ "48 58 15 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #4d4d4d", "( c #330000", ") c #660000", "* c #cc00ff", "+ c #333300", ", c #990099", "- c #cc0099", ". c #808080", "/ c None", "0 c #330066", /* pixels */ "////////////////////////////////////////////////", "////////////////////.....///////////////////////", "/////////////////...##0(#....///////////////////", "/////////////....(0(((0.((#(#.//////////////////", "///////////..#!0(#...../...#0(./////////////////", "//////////.#0(#.../////////...//////////////////", "/////////.((#../////////////////////////////////", "///////..(0..///////////////////////////////////", "//////.#(0#.////////////////////////////////////", "/////.#!#../////////////////////////////////////", "///..(0(.///////////////////////////////////////", "//.#0(..////////////////////////////////////////", "//.(0#.//////////////////////....///////////////", "/.#0#.//////////////////////.#(##../////////////", "/.!(.//////////////////////.(0000(#.////////////", ".#0#./////////////////////.#0%%%%0(#.///////////", ".(0.//////////////////////.!!0!!!-!0#.//////////", ".(!#./////////////////////.!0(0!!-,!(.//////////", ".0(.///////////../////////.0!(#(00!!0#./////////", ".#!#./////////.##.........(((0(#!(0!(&./////////", ".#!0.//////////.#(((((0(00$+000!0(!!'+./////////", "/.0(..//////////...###(#((+0!(0(#!0##.//////////", "/.(!(#./////////........##0%,!(0.#0!&+./////////", "/.#!0..////////.(0!######((0,(#(#..##.//////////", "//.(0(#.///////.#(0!!!0!0#0(,!(0.//..///////////", "//.(!0#.////////...#(((!!#(!,!0(#///////////////", "//.#00(.///////.#......#0#(0,!0(.///////////////", "///.(!0(..////.#!!!##..#!#0(!%(#.///////////////", "///.#0!((#..///.#(0!!!!(!($&0!0#.//////..///////", "////.(000(##..//..#(0!!!!0+0(%0#./////.##.//////", "/////.(!!00!##......#((!0($(!%!(......#(.....///", "//////.#(!!(0(#####.###0!((0((%0(((###0(0(0##.//", "///////..#0!!!00(0(#0(0(00#+#00!00!!0!00(##..///", "/////////.##00)!0!0!0!0!!!!!+#(##..###(0(0((#.//", "//////////..#((00)0!(!)0(!!0($#........(0#...///", "////////////...########(0!!!0((((##.///.#(#.////", "///////////////.........#0!,!000#../////..#.////", "///////////////////////.#(!,,!)0(0#.//////./////", "///////////////////////.#!0!--!0(#(#.///////////", "////////////////////../.#(!!!,-!0!..////////////", "///////////////////.##./..#(!!*!(##.////////////", "//////////////////.#0(..#(000!%%0(##.///////////", "//////////////////.0!(0(!!!%%!!%)00#.///////////", "/////////////////.#!%!%%,%%%!!!0!(#.////////////", "////////////////.#!0!!,%-!0(#(!00#./////////////", "////////////////.#!!!!0(0(#.#0%%(.//////////////", "////////////////.#!!0(#.....#!-%!.//////////////", "/////////////////.(!(#.////.#0,%0.//////////////", "/////////////////.(!0.////..#!%!(.//////////////", "/////////////////.#!0#.//.#.#!%!#.//////////////", "/////////////////.#!!#.//.(0(!,0.///////////////", "//////////////////.(!#.///.!!%!!#.//////////////", "//////////////////.#0.////.(!!!!(....///////////", "//////////////////.#.//////.00!!00(##.//////////", "///////////////////.///////.#!!%!!!!!#./////////", "////////////////////////////.#(0((!00(./////////", "/////////////////////////////........#./////////", "/////////////////////////////////////.//////////", }; xevil-2.02r2.orig/x11/gen_xpm/alien/alien_0f.xpm0100644000175000017500000000670007041513606020650 0ustar aaronlaaronl/* XPM */ static char *alien_0f[] = { /* width height ncolors chars_per_pixel */ "48 58 15 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #4d4d4d", "( c #330000", ") c #660000", "* c #cc00ff", "+ c #990099", ", c #333300", "- c #cc0099", ". c #808080", "/ c None", "0 c #330066", /* pixels */ "////////////////////////////////////////////////", "///////////////////.......//////////////////////", "///////////////....#(#(((0....//////////////////", "/////////////..#!0((#....(0(##./////////////////", "///////////..0!##....////....#./////////////////", "/////////..0(#...////////////.//////////////////", "////////.#(#..//////////////////////////////////", "///////.#!(.////////////////////////////////////", "//////.(0#./////////////////////////////////////", "////..00#.//////////////////////////////////////", "///.#((#.///////////////////////////////////////", "//.#!0..////////////////////////////////////////", "//.0(#.//////////////////////.....//////////////", "/.((..//////////////////////.#(##../////////////", ".#00.//////////////////////.(0000(#.////////////", ".((.//////////////////////.#0%%%%00(.///////////", ".00#./////////////////////.!!0!!!-%0#.//////////", ".(!#./////////////////////.!0(0!!!%!(#./////////", ".#(#.//////////...////////.0!(#((0!!0(./////////", ".(!0./////////.###........#$(0(!!(#(&'./////////", ".#!(.//////////..(0(!!0!00$(0(0#00..,.//////////", "/.(0#.//////////........#,(!/!0(#!!##.//////////", "/.(!0#.////////.##......##0%%(#0##(0'#./////////", "/.#0(#.////////.(!!!((#((#0%!(#(...#(.//////////", "//.0!(#.////////.#(0!!!!!(!%0!0(#./..///////////", "//.(0!#.///////.....##0(0#%!!!(0#.//////////////", "///.(0(#..////.#(##.....#(+!(00(.///////////////", "///.#!!(##.////.0!0((###(0*(!!(#.///////////////", "////.0000(..////.#(!!0!0!!!0!!0#.///////////////", "////.#0)!0#(...//..#(!!!!0%(!0(#.///.../////////", "/////.(00(!0###......##(0(!00(0#.//.#(#.////////", "//////..#!!0!!#(###.(#(0(!!((((#...#0#(#.///////", "////////.#((!0!00!(000!0!!!00#(0(((0(0(##.//////", "/////////..#()0!)0!(!!0)0!0(!0(0000!(0(#.///////", "///////////..#(((00(0((00!(!0(0!((##0##(#.//////", "/////////////..........#)!%+%++%!0##(0#..///////", "///////////////////////.00!*!!++*!0#.#(#.///////", "//////////////////////.#(!(!0!!!!%%0(...////////", "//////////////////////.#0!00(!(00!!!0#./////////", "///////////////////////.#(!)!!0)!!0(#.//////////", "////////////////////////.#0!!0(!+!(..///////////", "///////////////////////...(0!!!%%!#.////////////", "//////////////////.///.##(0!%!!+!(./////////////", "/////////////////.#./.#0!!!!!!/+0(./////////////", "/////////////////.0#.(!!%+0(0!-!(.//////////////", "////////////////.(!0(0%++!(!!%+0#.//////////////", "////////////////.0!!%+/!!(#!!!!(.///////////////", "///////////////.#0!!%0(0#..0!!00.///////////////", "///////////////.(!!!!(.../.(!!((.///////////////", "///////////////.(!!0(.////.#0!!0#.//////////////", "////////////////.!!!#./////.#(!!0(./////////////", "////////////////.#!!(.//////..#(0%0.////////////", "/////////////////.(!0#.///////.#((!#.///////////", "/////////////////.#%%(.////////...##.///////////", "//////////////////.#!0.///////////..////////////", "///////////////////.((./////////////////////////", "///////////////////.#.//////////////////////////", "////////////////////.///////////////////////////", }; xevil-2.02r2.orig/x11/gen_xpm/alien/alien_2.xpm0100644000175000017500000000710407041513606020503 0ustar aaronlaaronl/* XPM */ static char *alien_2[] = { /* width height ncolors chars_per_pixel */ "52 56 16 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #330000", "( c #660000", ") c #cc00ff", "* c #993399", "+ c #333300", ", c #990099", "- c #cc0099", ". c #660099", "/ c #808080", "0 c None", "1 c #330066", /* pixels */ "000000000000000000000////000000000000000000000000000", "00000000000000000////#1'#///000000000000000000000000", "0000000000000////'1''#!##'#'//0000000000000000000000", "00000000000//#!'1#/////////#1'/00000000000000/000000", "0000000000/#1'#///000000000///00000000000000/#/00000", "000000000/''#//00000000000000000000000000/0/'#/00000", "0000000//'1//000000000000000000000000000/#/#1#'/0000", "000000/#'1#/0000000000000000000000000000/#/%#1#//000", "00000/'1#//00000000000000000000000000000/''1!'###/00", "000//#1'/0000000000000000000000000000000/11'1'1'#/00", "00/#'1//00000000000000000000000000000000/'!'1''1/#/0", "00/'1'/0000000000000000000000////000000/#!1#1#!#''/0", "0/#!#/0000000000000000000000/#'##//000/#!!/#'1!!1//0", "0/1'/0000000000000000000000/#!!11'#/0/#!!#/#!'1'#'#/", "/#1#/000000000000000000000/#!%%%%!1#/#1!#/#!!1'1'#/0", "/'1/0000000000000000000000/#%!!!%,!'#1!1/#!1'/////00", "/'1'/000000000000000000000/!1'1!!%,1!!'#'.!#/0000000", "/''/00000000000//000000000/1%'#'11!!!1'1%!#/00000000", "/#!#/000000000/##/////////'#'!##'%!%'$!-!#/000000000", "/#!1/0000000000/#'''''!'1'$11!%-,%!1&*!1#/0000000000", "0/1'//0000000000///#1##''''!--,!1!%!%1#//00000000000", "0/'!'#/000000000////////##1!%!11'!!#///0000000000000", "0/'11//00000000/'1''######+'1'#'#'1&+/00000000000000", "00/1''#/0000000/#'1!1!1!1'11!''1//#'/000000000000000", "00/'!1#/00000000///#''1!!#'&'!1'#///0000000000000000", "00/#1!#/0000000/#//////#'#'11'1'/0000000000000000000", "000/'!1'//0000/#1!!##///##1!'11#/0000000000000000000", "000/#1(1'#//000/#'1!!!!'!1+'1!''/0000000000000000000", "0000/'111'##//00//#'1!!!!'$1'!1#/0000000000000000000", "00000/'!!11!##//////#''11'$'1!'#/0000000000000000000", "000000/#'(!1'1#####/#/#'!'+1''1#/0000000000000000000", "0000000//#1(!1'1''1#1'1111#'#$##/0000000000000000000", "000000000/##!!!1!1!'!1(!(%11'+'##/000000000000000000", "0000000000//##'!'!1!1!111'!!1111'#/00000000000000000", "000000000000///##'#####''1!!''%!11#/0000000000000000", "000000000000000////////1!!,!1!!!!(1#//00000000000000", "000000000000000000000/#'1!,1'!!!!%!'##/0000000000000", "0000000000000000000000/'!!-!111'11!!1'/0000000000000", "0000000000000000000000/'1!)%''#'!%!1#/00000000000000", "0000000000000000000000/'!!)!1/#1!%'#/000000000000000", "000000000000000000000//#!%%!'/'!,%1/0000000000000000", "00000000000000//000//#'11-!'//#!-!'/0000000000000000", "0000000000000/##///''11!!,'/0/1!,!'/0000000000000000", "0000000000000/''/#'!!%%!1!#///',%1#/0000000000000000", "000000000000/#!1'1%,%-!'1!##'#1%!'/00000000000000000", "000000000000/1!!%%,%!!#/##'#!1!%1/000000000000000000", "00000000000/#'!%%!!1'#/0////1'!!!#/00000000000000000", "00000000000/#!!1!'#///00000/#!!1!'/00000000000000000", "000000000000/1!!'#/000000000/1!!1#/00000000000000000", "000000000000/#1!1#/000000000/!!!!#/00000000000000000", "0000000000000/#!!'#/000000000/1!!'/00000000000000000", "00000000000000/#!!1/0000000000/'!1'/0000000000000000", "000000000000000/#!!#/0000000000/'!%'/000000000000000", "0000000000000000/#1#/00000000000/#!1/000000000000000", "00000000000000000/#/0000000000000/##/000000000000000", "000000000000000000/000000000000000//0000000000000000", }; xevil-2.02r2.orig/x11/gen_xpm/alien/alien_4.xpm0100644000175000017500000000432407041513606020506 0ustar aaronlaaronl/* XPM */ static char *alien_4[] = { /* width height ncolors chars_per_pixel */ "26 58 16 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #4d4d4d", "( c #330000", ") c #660000", "* c #cc00ff", "+ c #333300", ", c #990099", "- c #cc0099", ". c #660099", "/ c #808080", "0 c None", "1 c #330066", /* pixels */ "000000000000//000000000000", "00000000000/##/00000000000", "00000000000/((/00000000000", "00000/00000/#1/00000/00000", "00/0/#//000/#(/000//#/0/00", "0/#/#(/#/00/##/00/#/(#/#/0", "0/(#1(/#/00/#(/00/##(1#(/0", "0/#(!#!#/00/#1/00/#!#!(#/0", "0/#!1(1/000/#(/000/1(1!#/0", "00/((1(#/00/(1/00/#(1((/00", "00/1!1(/000/#1/000/(1!1/00", "00/#!#/0000/(!/0000/#!#/00", "00/1(/00000/#1/00000/(1/00", "0/#!#/0000/#(1/00000/#!#/0", "0/(!#/000/#(1(#/0000/#!(/0", "0/11/000/#(1!11#/0000/11/0", "/#!(/00//#1!(!(#///00/(!#/", "/(1(/0/#((1!!1!##(#/0/(1(/", "/(!!#//(1#(!1!1(#1(//#!!(/", "/#1!!1((1(1&&&1#(1((1!!1#/", "/((1!,%!1(,*$*,((1!%,!1((/", "/#!!!1!-,1($(&#(,,-!1!!!#/", "0//1(!11)!1&&'(1!)11!(1//0", "000/&$((!1((1(1(!$(($&/000", "0000//(!!(#1(1#(1(1(//0000", "00000/(1(1(1(1(1((11/00000", "00000/!1!11(1(1(11!/000000", "000000/)1(!(!1(1(1/0000000", "000000/1(!!1((11!(/0000000", "0000000//1!!#1!(1#/0000000", "00000000/((1+(1((/00000000", "0000000/#111##((1#/0000000", "0000000/(!(#(##1!#/0000000", "000000/##1(1#(1(1#/0000000", "000000/(1(11#(11((/0000000", "000000/#(!!)1!1!!1#/000000", "000000/#11(1(((1(1#/000000", "000000/((11#//(11(#/000000", "000000/#1!!#//1)!1#/000000", "000000/#!!1#//#1!(/0000000", "000000/#!!(/0/#!!1/0000000", "000000/#!%1/00/(.(/0000000", "000000/#%%(/00/1,!/0000000", "000000/#(1#/00/(1(/0000000", "000000/#1((/00/1((/0000000", "0000000/1!#/00/(11/0000000", "0000000/(1(/00/(!(/0000000", "0000000/(!#/00/#1#/0000000", "0000000/11#/00/(1(/0000000", "0000000/((#/00/#1#/0000000", "000000/#11#/00/(1(/0000000", "000000/#)!1/0/#1!1#/000000", "000000/#!1(/0/#1)1#/000000", "000000/1(1((//((1(1/000000", "000000/1((11//1(1((/000000", "000000/##1#(//##(##/000000", "0000000/(((/00/((((/000000", "00000000///0000////0000000", }; xevil-2.02r2.orig/x11/gen_xpm/alien/alien_5.xpm0100644000175000017500000000337707041513606020516 0ustar aaronlaaronl/* XPM */ static char *alien_5[] = { /* width height ncolors chars_per_pixel */ "20 54 15 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #800080", "% c #333366", "& c #663366", "' c #4d4d4d", "( c #330000", ") c #660000", "* c #cc00ff", "+ c #333300", ", c #990099", "- c #660099", ". c #808080", "/ c None", "0 c #330066", /* pixels */ "/////////../////////", "////////.##.////////", "////////.#(.////////", "////////.##.////////", "////////.#(.////////", "////////.#0.////////", "////////.#(.////////", "////////.(0.////////", "////////.#0.////////", "////////.(!.////////", "////////.#0.////////", "///////.#(0.////////", "//////.#(0(#.///////", "/////.#(0!00#.//////", "////..#0!(!(#...////", "///.#((0!!0!##(#.///", "///.(0#(!0!0(#0(.///", "///.#0(0&&&0#(0.////", "//.#(0(,*%*,(0(#.///", "//.#!!0(%(&#(0!(#.//", "//.(!!!0&&'(0!$!#.//", "//.(0!0((0(0(!!0(.//", "//.0!!(#0(0#(0!!(.//", "//.(0(0(0(0(0((00.//", "/.#!0!00(0(0(00!!#./", "/.#0)0(!(!0(0(0)0#./", "/.#!0(!!0((00!(0!(./", ".(#0(#0!!#0!(0#(0(./", ".(0((.((0+(0((.#(0#.", ".#(0##000##((0##0((.", ".(0(#(!(#(##0!#.(0#.", ".##0##0(0#(0(0#.#(#.", "/.##(0(00#(00((.(#./", "//..#(!!)0!0!!0##.//", "///.#00(0(((0(0#.///", "///.((00#..(00(#.///", "///.#0!!#..0)!0#.///", "///.#!!0#..#0!(.////", "///.#!!(./.#!!0.////", "///.#!$0.//.(-(.////", "///.#$$(.//.0,!.////", "///.#(0#.//.(0(.////", "///.#0((.//.0((.////", "////.0!#.//.(00.////", "////.(0(.//.(!(.////", "////.(!#.//.#0#.////", "////.00#.//.(0(.////", "////.((#.//.#0#.////", "///.#00#.//.(0(.////", "///.#)!0./.#0!0#.///", "///.#!0(./.#0)0#.///", "//.#0(0((.#((0(0#.//", "//.(0((00#(0(0(((.//", "//.(##0#((###(###.//", }; xevil-2.02r2.orig/x11/gen_xpm/alien/alien_9.xpm0100644000175000017500000000500307041513606020506 0ustar aaronlaaronl/* XPM */ static char *alien_9[] = { /* width height ncolors chars_per_pixel */ "62 32 15 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #330000", "( c #660000", ") c #cc00ff", "* c #333300", "+ c #990099", ", c #cc0099", "- c #660099", ". c #808080", "/ c None", "0 c #330066", /* pixels */ "////////////////////.......///////////////////////////////////", "//////////..........##!0!##.......////////////////////////////", "/////////.###''0'0'0'0###'0''0'0'#..///.//////////////////////", "///////..'0!!0#''#.............##'0#...#./////////////////////", "//////.#00'.#.....////////////.....'!##'./////////////////////", "/////.'0''././///////////////.'0..#!#!0#./////////////////////", "////.#!'..///////////////////.'0..'0#.'0./////////////////////", "////.!0'.///////////////////.#!!..'!#.#!#.////////////////////", "///.'0#.////////////////////.#!!..00#.#!''.///////////////////", "//.'!'./////////////////////.'!'..!!#..!../....///////////////", "/.#00'./////////////////////.0!'..'!#..!#..####...////////////", ".#0!#.////////////////////..#!!#..0!'..0'#'0!!!!0#.///////////", ".'!'#.//////////////////..#.#!!0..0!0..'!00(%+++!0#.//////////", ".0!0#./////////////////.#00'#0!!..!!!##'0'0!0!!++''../////////", ".0(0'....//.//////////..'(!0'!!%##'0'#'#*#'0#'!!+!'.//////////", ".'!0''###..#./.././...'#!00'!0'%'#'#'#'0$0''00'0!!0#./////////", "/.'0!0'0'##0#.'#.#.'##!0!'!!0#'#0'0$0'00('#!!!0'!!'#./////////", "//.'0!0!00!'0'0''0'0!0'!!0!'#'$&00'&0'!))00!#'0.#$&#./////////", "///.#''!!'!!!!!00!0!0'0!!!!0#'&'&'0!0'0!)(0'.0(#.*$.//////////", "////..#'#''0''!'!0(0'!!+%0''*0!0!!!%!#'!,%'./#%'...///////////", "//////....'0'0##''#'0!0,!'0##'%!!'!!0'0'!-0./.#!$*.///////////", "///////.#0%!0.......'!!+%0*$'0'0'0'0'0000%!#./.''#.///////////", "///////.'!!0'#......'0!+%!###'!!0##'!!'.'%.'.//...////////////", "///////.00!!0!0'0'#.0!!)%0#.0!)!'..0+0#.#0.!#.////////////////", "///////.!!!'%++%!!!'0!!)!0'.'!+!0.#!%'./.#!%0#.///////////////", "///////.'!!0!!%,++!!'!+,0'#.'%+!#.#%!#.//.'!!'.///////////////", "////////.0!!''!!!)+!0!,!''0#0%0'..'%0...//.#%.'#....////..////", "////////.#'!0###0'00!!-0..!0!!!'..'%'###....'0!!0'##....##.../", "/////////.#!!'.....'!00./.'!!!!0#.0!!!!0'0''#!'!!!!0''#'0!!'#.", "//////////.0!!#.//.#0'.//.#!!0!!''0'00!!!!0!0'0'0#'000!0#'0!!.", "///////////.'!'.///.#'.///.#!!!!!!!%!0'#.#####.#''....#'...##.", "////////////.0#.////.#.////.##%%!0!'###./...../..#.///.#.//../", }; xevil-2.02r2.orig/x11/gen_xpm/alien/10_duplicate_of_90100644000175000017500000000000007041513606021541 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/alien/alien_10b.xpm0100644000175000017500000000500507041513606020722 0ustar aaronlaaronl/* XPM */ static char *alien_10b[] = { /* width height ncolors chars_per_pixel */ "62 32 15 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #330000", "( c #660000", ") c #cc00ff", "* c #333300", "+ c #990099", ", c #cc0099", "- c #660099", ". c #808080", "/ c None", "0 c #330066", /* pixels */ "////////////////////.......///////////////////////////////////", "//////////..........##!0!##.......////////////////////////////", "/////////.###''0'0'0'0###'0''0'0'#..///.//////////////////////", "///////..'0!!0#''#.............##'0#...#./////////////////////", "//////.#00'.#.....////////////.....'!##'./////////////////////", "/////.'0''././///////////////.'0..#!#!0#./////////////////////", "////.#!'..///////////////////.'0..'0#.'0./////////////////////", "////.!0'.///////////////////.#!!..'!#.#!#.////////////////////", "///.'0#.////////////////////.#!!..00#.#!''.///////////////////", "//.'!'./////////////////////.'!'..!!#..!../....///////////////", "/.#00'./////////////////////.0!'..'!#..!#..####...////////////", ".#0!#.////////////////////..#!!#..0!'..0'#'0!!0'##.///////////", ".'!'#.//////////////////..#.#!!0..0!0..'!00(%+++!0#.//////////", ".0!0#./////////////////.#00'#0!!..!!!##'0'0!!!!++''.//////////", ".0(0'....//.//////////..'(!0'!!%##'0'#'#*#'0!'!!+!'.//////////", ".'!0''###..#./.././...'#!00'!0'%'##'#0'$&$''00'0!!0#./////////", "/.'0!0'0'##0#.'#.#.'##0!0!!!0#'#0'0$0'00''#!#!''!!'#./////////", "//.'0!0!00!'0'0''0'0!0'!!'%#''$&00'&'0(%!00!#!#.#$&#./////////", "///.#''!!'!!!!!0!'0!0!!!%0'0#'&'$(0!0'0%!'0'#!'..*$.//////////", "////..#'#'0''00(00!'!'0%+00'*0!0!!!%!'0,!0'..!0....///////////", "//////......#'%!!!!'#0!!,!''#'%!!'!!0'!+''./.#!*#.////////////", "///////////.'0!0'!00'0(!-+!0#0'0'0'0'0!+0#.//.'0*.////////////", "///////////.0!!!!(0'!00!!)!'0'#'#####'-!0#.///.#./////////////", "///////////.'!!!%+%!!'!!!,+!'00......0+%!'.////.//////////////", "///////////.'!!'!!+++!!0!++0!%'.////.'+!!#.///////////////////", "////////////.0!0!0!!!%+!!+%!!%!.////.'%0!0.///////////////////", "////////////.#0!'!!0!!%!!+%'!0'.////.#%0%'.///////////////////", "/////////////.'!!!!'##'00%%'!#./////.#%!!!#.....//......./////", "//////////////.!!!!%'..'!0'.'#./////.#!!0!0'0'##..##'!0'#.////", "///////////////.0!#!0..#!#./.#.//////.'!%+!0!!%!0'!!0!'0''.///", "///////////////.#'.0'./.'#.//.////////.#'0!!!!00'!0!0!!###.///", "////////////////.#.#.///.#.////////////....###'''#'#..##..////", }; xevil-2.02r2.orig/x11/gen_xpm/alien/alien_10c.xpm0100644000175000017500000000500507041513606020723 0ustar aaronlaaronl/* XPM */ static char *alien_10c[] = { /* width height ncolors chars_per_pixel */ "62 32 15 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #4d4d4d", "( c #330000", ") c #660000", "* c #cc00ff", "+ c #333300", ", c #990099", "- c #cc0099", ". c #808080", "/ c None", "0 c #330066", /* pixels */ "////////////////////.......///////////////////////////////////", "//////////..........##!0!##.......////////////////////////////", "/////////.###((0(0(0(0###(0((0(0(#..///.//////////////////////", "///////..(0!!0#((#.............##(0#...#./////////////////////", "//////.#00(.#.....////////////.....(!##(./////////////////////", "/////.(0((././///////////////.(0..#!#!0#./////////////////////", "////.#!(..///////////////////.(0..(0#.(0./////////////////////", "////.!0(.///////////////////.#!!..(!#.#!#.////////////////////", "///.(0#.////////////////////.#!!..00#.#!((.///////////////////", "//.(!(./////////////////////.(!(..!!#..!../....///////////////", "/.#00(./////////////////////.0!(..(!#..!#..####...////////////", ".#0!#.////////////////////..#!!#..0!(..0(#(0!!0(##.///////////", ".(!(#.//////////////////..#.#!!0..0!0..(!00)%,,,0(#.//////////", ".0!0#./////////////////.#00(#0!!..!!!##(0(0!!!!,,((.//////////", ".0)0(....//.//////////..()!(0(!%##(0(#(#+#(0!0!!,!(.//////////", ".(!0((###..#./.././...#(00(0!!0!((#(#0+0'$((00(0!!0#./////////", "/.(0!0(0(##0#.(#.#.(##!0(00!,,%%%!0$0(00((#!#!#(!!(#./////////", "//.(0!0!00!(0(0((0(0!0(0!),-,,,,%0(&(0)!!00!(!..#$&#./////////", "///.#((!!(!!!!!0!0!0!0!!%,!%!!0!0!!0!0!,!(0((0#..+$.//////////", "////..#(#((0(00(!0!(!(!!%!!0!0!!!!!%!0,%(0(.#!(./..///////////", "//////..#0%!(.#(#(#(0!!0!!0)0(-%!0!!(!,!!!(..!0#./////////////", "//////.#!!!0#......#0!!!0(00(!,%!((00-!0!%(..#!'./////////////", "//////.(00!!00(((#..(0!*!0((0!,!0##(%,(#0%0#..##./////////////", "//////.0!!)0!!!0!0(#0!!%!(..(!-!(..0.!#.(!!(./////////////////", "//////.#%!!0!!,,%!0!(!0!!(..0%,!(.#0,(..#0!0#.////////////////", "///////.!!!((0!!!,%!0!!(0(..(,,0#.#!!#./.#%!(.////////////////", "///////.#!!(.#(0!!%!),!0##0(0-0(..(%!..//.(%!#.....////.....//", "////////.!!0#...##(!0%(#..0!!%0(..(%(##...#0%!(0(##....((0##./", "////////.#%!#.//..#0!#../.0!!!0(#.(!%%!0(###(!!0!!%!((0!!0)0(.", "/////////.(%(.////.((.///.#!0!!00(000!%%!!!00(0!!!000((0(0(##.", "/////////.#!(./////.0#.///.(!!!!!!!!!0((#(0!0(0(#(((...#..##./", "//////////...///////../////.#(!((#0(###.......#(#...///.//..//", }; xevil-2.02r2.orig/x11/gen_xpm/alien/alien_10d.xpm0100644000175000017500000000500507041513606020724 0ustar aaronlaaronl/* XPM */ static char *alien_10d[] = { /* width height ncolors chars_per_pixel */ "62 32 15 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #330000", "( c #660000", ") c #cc00ff", "* c #333300", "+ c #990099", ", c #cc0099", "- c #660099", ". c #808080", "/ c None", "0 c #330066", /* pixels */ "////////////////////.......///////////////////////////////////", "//////////..........##!0!##.......////////////////////////////", "/////////.###''0'0'0'0###'0''0'0'#..///.//////////////////////", "///////..'0!!0#''#.............##'0#...#./////////////////////", "//////.#00'.#.....////////////.....'!##'./////////////////////", "/////.'0''././///////////////.'0..#!#!0#./////////////////////", "////.#!'..///////////////////.'0..'0#.'0./////////////////////", "////.!0'.///////////////////.#!!..'!#.#!#.////////////////////", "///.'0#.////////////////////.#!!..00#.#!''.///////////////////", "//.'!'./////////////////////.'!'..!!#..!../....///////////////", "/.#00'./////////////////////.0!'..'!#..!#..####...////////////", ".#0!#.////////////////////..#!!#..0!'..0'#'0!!0'##.///////////", ".'!'#.//////////////////..#.#!!0..0!0..'!00(%++!0'#.//////////", ".0!0#./////////////////.#00'#0!!..!!!##'0'0!!!!++!0.//////////", ".0(0'....//.//////////..'(!0'!!%##'0'#'#*#'0!0!!+!'.//////////", ".'!0''###..#./.././...'#!00'!0'%'##'#0'$&$''00'0!!0#./////////", "/.'0!0'0'##0#.'#.#.'##0!0!!!0#'#0'0$0'00''#!#!''!!'#./////////", "//.'0!0!00!'0'0''0'0!0(!!'!'#'$&00'&'0(!!00!#!#.#$&#./////////", "///.#''!!'!!!!!0!0!0!!0!!!00#'&'$(0!0'0!!'0'#!'..*$.//////////", "////..#'#'0''00'!'0(0'0%+0''*0!0!!!%!'0,!0'./!0....///////////", "//////........'!0''#'0!!,!0'#'%!!'!!0'!+''./.#!*#.////////////", "///////////.#0!!!#..#0(0%+!0'0'0'0'0'0!+0#.//.'0*.////////////", "//////////.#'!!!00'##'0!!++!0##'#####'-!0#.///.#./////////////", "//////////.0!0!'0!!!!0!0!%!!'#.......0+%!'.////.//////////////", "//////////.!!!!!!%+,%!!(!!)!'.//////.'+!!#.///////////////////", "//////////.0!!!0!!+%,%+!0!,!#.//////.'%0!0.///////////////////", "//////////.#!!!!0'00!!!+!!+0#.//////.#%0%'.///////////////////", "///////////.!!'!!0''0'0'0!%!.///////.#%!!!#.....//......./////", "///////////.0!0'!!#...#!0(0#.///////.#!!0!0'0'##..##'!0'#.////", "///////////.'!0#0!!.//.#!0#./////////.'!%+!0!!%!0'!!0!'0''.///", "////////////.0%'.'0.///.'0#.//////////.#'0!!!!00'!0!0!!###.///", "////////////.#0#.##.////...////////////....###'''#'#..##..////", }; xevil-2.02r2.orig/x11/gen_xpm/alien/alien_18.xpm0100644000175000017500000000340507041513606020572 0ustar aaronlaaronl/* XPM */ static char *alien_18[] = { /* width height ncolors chars_per_pixel */ "18 58 16 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #666666", "( c #555555", ") c #4d4d4d", "* c #330000", "+ c #660000", ", c #cc00ff", "- c #333300", ". c #cc0099", "/ c #808080", "0 c None", "1 c #330066", /* pixels */ "0000//000000000000", "000/##/00000000000", "000/1*/00000000000", "00/#*//00000000000", "00/11##/0000000000", "00/!1*##/000000000", "00/*!#*//////00000", "00/*!1*/####*/0000", "000/11##1*1*#*/000", "000/*!*1*!1111/000", "000/*1**!1!**!#/00", "000/11*1!1+1*!*/00", "000/*1*1+!11*!1/00", "00/#!!#11!!1!!#/00", "00/#1*#!!!!*1*/000", "00/#!1/*1%!*1*/000", "00/*!*/1*.%1*1//00", "0/#*1*/*1,!**!*#/0", "0/#11*#**!1*#11#/0", "0/#*!!#1*1*11!*/00", "0/*11!-#11-*1*1*/0", "/#1!!*!(&$'1*!!1#/", "/*1%%*#&1-$**!%!#/", "/#*1*#1-$-$*#1!*#/", "0/#*1##-1--1#*1#/0", "0/#**$*1*1*#*1*#/0", "0/##1*#*1$#*$*##/0", "/##*11-$***$*1*#/0", "/*#***#-1$-#**1/00", "/1*11*1-&)$*1*#/00", "/#1#*##*1#*#*#/000", "/#*1*1-#1##/000", "0/1*1#*!1*1*-#/000", "0/*1!*1!1*!1#/0000", "0/#1*1*1!11*1*/000", "0/#*!1**!#*1*1#/00", "0/#1*1*11***1!#/00", "00/*!11**1*1*!*/00", "00/1!**1111!1!1#/0", "00/*!1!!!+!%*1*#/0", "00/*1#**11*!!1*/00", "00/##/#!!1!1!1#/00", "000///!!1!!****/00", "00000/*1!1*#11*/00", "00000/1*!*!#!!#//0", "00000/*1!11#*1*/#/", "00000/1*!**#1!*##/", "00000/*1!11#*1#1*/", "00000/**1***1**1#/", "00000/*1!111*1#1#/", "00000/#*1***1*1*/0", "00000/*1!*11*1**/0", "00000/#*11*11!1#/0", "00000/#1*1*****#/0", "00000/#*!*#1111/00", "000000/#1*/####/00", "000000/#*#/////000", "0000000///00000000", }; xevil-2.02r2.orig/x11/gen_xpm/alien/20_duplicate_of_180100644000175000017500000000000007041513606021622 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/alien/alien_20b.xpm0100644000175000017500000000340607041513606020726 0ustar aaronlaaronl/* XPM */ static char *alien_20b[] = { /* width height ncolors chars_per_pixel */ "18 58 16 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #666666", "( c #4d4d4d", ") c #330000", "* c #660000", "+ c #cc00ff", ", c #333300", "- c #cc0099", ". c #660099", "/ c #808080", "0 c None", "1 c #330066", /* pixels */ "000000000000000000", "000000000000000000", "00000000000/000000", "0000000000/#/00000", "000//00000/)1/0000", "00/##/0000/#!#/000", "00/)1/00///#%)/000", "0/#1#///###/!!/000", "0/)1###)1)1#!)/000", "0/#!#!)1)1!1)1/000", "0/#!)1)1!!)1)#/000", "00/)!))1)!1!))/000", "00/#1)#!1!*11#/000", "00/#11#)!1!)!1/000", "000/1)#!!!!1)1#/00", "00/#!)/1)%!)1!)/00", "00/#1)/)1-%1)!)/00", "0/#)11/)1+!)#11#/0", "0/#)!)#1)!!)#!))/0", "00/1!!#))1)#!!)1#/", "0/#1)!$#11,111))#/", "/#1%%)1'&$'1)!!1#/", "/#!%%#),1,$)).%!)/", "/#1!1)#$&,$)#1!)#/", "0/#))#,)1,,#)#)#/0", "0/#)11#,1)1#1)1#/0", "0/#1)))1)$#),1)#/0", "0/##11#,1))$1)##/0", "00/)))$)$$,#)1)/00", "00/#)1#,&(,1))#/00", "000/#)#1)#1#)#/000", "000/#)#)1&#)##/000", "00/0)1,!1)11,#/000", "00/#1#1!1)!1#1/000", "00/))1)1!11)1)#/00", "00/1!1))!)))1!)/00", "0/#))1)11#1)11)#/0", "0/#)11))1)))1)1#/0", "/#/1!)11)1!1)!1#/0", "/)#)11!!!!!11!)/#/", "/)1)))!)1)!*1)##1/", "/#1#1)11!!11)1)!)/", "0/))1)!!!1!))1#1#/", "0/11)11*!!!)1))1#/", "0/#)1)11!)11)11)/0", "0/#)!1!)!1*1)1)#/0", "00/11))1!)1)1!1#/0", "000///1)!1)1)))#/0", "00000/)1)1)111)/00", "00000/)1!)1#///000", "00000/#1)1)/000000", "00000/)1!)1/000000", "00000/#)1))/000000", "00000/#)11#/000000", "00000/#1!)#/000000", "000000/#)1/0000000", "000000/#)#/0000000", "0000000///00000000", }; xevil-2.02r2.orig/x11/gen_xpm/alien/alien_20c.xpm0100644000175000017500000000342707041513606020732 0ustar aaronlaaronl/* XPM */ static char *alien_20c[] = { /* width height ncolors chars_per_pixel */ "18 58 17 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #333366", "% c #800080", "& c #663366", "' c #666666", "( c #555555", ") c #4d4d4d", "* c #330000", "+ c #660000", ", c #cc00ff", "- c #990099", ". c #333300", "/ c #cc0099", "0 c #808080", "1 c None", "2 c #330066", /* pixels */ "111111111111111111", "111111111100011111", "1111111110#!#01111", "11111111110!201111", "11111111110!!#0111", "11111111000#%*0111", "11101110##0#!#0111", "110#0100#*##!#0111", "10#*#0#*2*2*201111", "10*2#0#2*222*#0111", "102*0#*!2!+2*#0111", "10*2#2*2+22!2*0111", "10*2*2#2!!*2!*0111", "10#2!*#+2!!*!!#011", "110*2##2!!!22!*011", "110#!#02*%!**!2011", "110#2*0*2/%2#!2#01", "10#*!#0*2,!*0*2*#0", "10#22*#**!!#*22*#0", "110*!!.2*2**2!**#0", "10#222*#22.22*2*#0", "0#!!!*2(&$'2*%%2#0", "0*2%%#*&2.$**%%2*0", "0#2!2*#.$.$*#2!*#0", "10***#$*2..2#**#01", "10#2*2#$*2*#2*2#01", "10##2****$#*.2##01", "10#**2#$2**$*2*##0", "110#2*.*$$.#**2#*0", "110#*2#.&)$*2#*2*0", "1110#*#2*#*#*2*2#0", "1110#*$#2#*2*#0", "1110##*!2*2*.2*201", "11110#2!2*!2*!2*01", "1110*2*2!22*22*#01", "110#22**!#*2*!2#01", "110#*!*22***22+#01", "110*22**2#22+22#01", "1102!*22*2!*2!*#01", "110*!2!!!!!**%2011", "110*2!!*2*2##-*011", "110#*+2!!!*00##011", "110**2!!!2!#000111", "100222!*!!20111111", "0#0#!*2!2*!#011111", "0*#*!2**!2*0111111", "0*2#2**2!*20111111", "0#2*2*2*!2*0111111", "0#**2**2*2*#011111", "102*2*22!*2#011111", "10#22*2**2*0111111", "10#*!2!*22*0111111", "10#2**2*!*20111111", "110*2*2*22#0111111", "111000#*!*#0111111", "1111110#2*01111111", "1111110#*#01111111", "111111100011111111", }; xevil-2.02r2.orig/x11/gen_xpm/alien/20d_duplicate_of_20b0100644000175000017500000000000007041513606022121 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/alien/23_duplicate_of_180100644000175000017500000000000007041513606021625 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/alien/23b_duplicate_of_20b0100644000175000017500000000000007041513606022122 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/alien/23c_duplicate_of_20c0100644000175000017500000000000007041513606022124 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/alien/23d_duplicate_of_20b0100644000175000017500000000000007041513606022124 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/alien/alien_25.xpm0100644000175000017500000000352207041513606020570 0ustar aaronlaaronl/* XPM */ static char *alien_25[] = { /* width height ncolors chars_per_pixel */ "60 22 17 1 0 0", /* colors */ "! c #660066", "# c #000000", "$ c #008000", "% c #333366", "& c #800080", "' c #663366", "( c #330000", ") c #660000", "* c #cc00ff", "+ c #333300", ", c #990099", "- c #cc0099", ". c #660099", "/ c #808080", "0 c #00ff00", "1 c None", "2 c #330066", /* pixels */ "111111111111111111111111111111111111111111111111111111111111", "11111111111111111111///////111111111111111111111111111111111", "1111111111//////////##!2!##///////1111111111/////////11//111", "111111111/###((2(2(2(2###(2((2(2(#/11111////###(((#(#//##//1", "1111111//(2!!2#((#(/2(///(#////##(2/111/#00!!!!22(!2!2!!###/", "111111/#22(/#////2!#!2//#!#/1/#////111/(!0,!2!!&!2(!!2$(2((/", "11111/(2((/1/11/!!!!&(//(!2(/(#/11111/#002!2(2(##//##(0$(#/1", "1111/#!(//1111/(!!!!(##(22&&(!#/11111/#0!!!#/////11///000/11", "1111/!2(/1111/#2!(!!2!!&!!,&(!2(/1111/002&(/1111111111111111", "111/(2#/11111/2!202!!/&,00,&!!&!/1111/(&2!2/1111111111111111", "11/(!(/11111/(!!0!/,,,!!2!,,2!&(/1101/(,!!#/1111111111111111", "1/#22(/11111/(!0!&,&!!(!!!-,!(22///0//2,&!(/111//11111111111", "/#2!#/111111/2!0!!)2(!/2!!*!(2(#(##0##(.!(#/11/+%/1111111111", "/(!(#/111111/(202(!2///)!.,!2#2(2(202(2!,!#///#%'#/111111111", "/2!2#/111111/#(0!!!!/1/!!-!(0000!!(!02(!,!!/((!!(#/111111111", "/2)2(/111111/(20$22!/1/2&,220+2!2!!!0!(2-(2002!!2#/111111111", "/(!2(/111111/!!0$!(2/1/!!&2(2#('(%)2!2(2/2!0!!,!(/1111111111", "1/(2!////////2(20(/////(!!(&#((%'22('(2)/!!0!,,((/1111111111", "1/#(2#(#(2((22)22!(!(2&2!0!!!2#(#2(2%2(22)&0&,!0#/1111111111", "11/##(!!(!!00!2!(2!2!!!&2(02(!2(&(#0(#2(%2!0,!200/1111111111", "11/2!2!22!(20$$(2(2!2(!!(&0$$(!!&##02(#(###&!2(#011111111111", "111///00##2#/0$000(##2!2!!!00000!//!00000002(##00000$$$00001", }; xevil-2.02r2.orig/x11/gen_xpm/red_hugger/0040755000175000017500000000000007637441102017472 5ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/red_hugger/red_hugger_0.xpm0100644000175000017500000000161107041513606022544 0ustar aaronlaaronl/* XPM */ static char *red_hugger_0[] = { /* width height ncolors chars_per_pixel */ "32 18 5 1 0 0", /* colors */ "! c #000000", "# c #800000", "$ c #008000", "% c #ff0000", "& c None", /* pixels */ "&&&&&&&&&&&&&&&&&&&&&&&&&$$$&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&!$$&&&&", "&&%%%%&&&&&&&&&&&&!!!!&&!&&&&&$$", "&&%!!&&&&&&&&&&&&!!!!!##&&&!!!$$", "&&%&!#&&&&&&&&&&!!#####!!!!&&&&&", "&&&&###&&&&&&&&!!####!!###&&&&&&", "&&&&&##&&&&&&&!!###########&&&&&", "&&&###&&&&&&&!!##############&&&", "&###&&&&&&&&!!##########&&#####&", "###&&&&&&&&!!######&&####&&&&###", "##&&&&&&&&!!######&&&&####&&&&##", "&##&&&&&&#!#######&&&&&&##&&&&&#", "&&############&&###&&&&&##&&&&##", "&&&##########&&&&##&&&&##&&&&&##", "&&&&&&&&&&##&&&&###&&&##&&&&&&#&", "&&&&&&&&&&#&&&&&##&&&##&&&&&&##&", "&&&&&&&&##&&&&&###&&##&&&&&&##&&", "&&&&&&%%#&&&&&%%#&&&%&&&&&&%%&&&", }; xevil-2.02r2.orig/x11/gen_xpm/red_hugger/red_hugger_0b.xpm0100644000175000017500000000161207041513606022707 0ustar aaronlaaronl/* XPM */ static char *red_hugger_0b[] = { /* width height ncolors chars_per_pixel */ "32 18 5 1 0 0", /* colors */ "! c #000000", "# c #800000", "$ c #008000", "% c #ff0000", "& c None", /* pixels */ "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&$$&&&", "&&%%%%&&&&&&&&&&&&&&&&&&&&!$$&&&", "&&%!!&&&&&&&&&&&&&!!!!!&&!&&&&&&", "&&%&!#&&&&&&&&&&&!!!!!##!&&&&&$$", "&&&&###&&&&&&&&!!!#######!!!!!$$", "&&&&&##&&&&&&&!!#####!!!!#&&&&&&", "&&&###&&&&&&!!!############&&&&&", "&###&&&&&&&!!#########&&&###&&&&", "##&&&&&&&&!!#####&####&&&&###&&&", "###&&&&&&#######&&&&&##&&&&###&&", "&#############&&&&&&&&##&&&&##&&", "&&#########&###&&&&&&&##&&&##&&&", "&&&&&&&&##&&&&##&&&&&###&&###&&&", "&&&&&&&&#&&&&&##&&&###&&&##&&&&&", "&&&&&&&&##&&&##&&###&&&&##&&&&&&", "&&&&&&&&&%%&%#&%%##&&&%%#&&&&&&&", }; xevil-2.02r2.orig/x11/gen_xpm/red_hugger/red_hugger_2.xpm0100644000175000017500000000173507041513606022555 0ustar aaronlaaronl/* XPM */ static char *red_hugger_2[] = { /* width height ncolors chars_per_pixel */ "18 32 5 1 0 0", /* colors */ "! c #000000", "# c #800000", "$ c #008000", "% c #ff0000", "& c None", /* pixels */ "&&$$&&&&&#####&&&&", "&&$$&&&&###&####&&", "&&&!&&&&##&&&&&##&", "&&&!&&&##&&&&&&&#%", "$$&!&&&##&&&&&&&&%", "$$&&!&###&&&&&&&&&", "$!&&!###&&###&&&&&", "&&!&!###&#####&&&&", "&&&#!######&&##&&&", "&&&##!#####&&&##&&", "&&!!#!####&&&&&##&", "&&!!#####&&&&&&&#%", "&&!!#####&&&&&&&&&", "&&!!######&&###&&&", "&&&!!############&", "&&&&!!#######&####", "&&&&&!!#####&&&&#%", "&&&&&&!!####&&&&&%", "&&&&&&&!!####&&&&&", "&&&&&&&&!!####&&&&", "&&&&&&&&&!!####&&&", "&&&&&&&&&&!!####&&", "&&&&&&&&&&&###&&#&", "&&&&&&&&&&&&##&&##", "&&&&&&&&&&&&##&&&%", "&&&&&##&&&&&##&&&%", "&&%&####&&&&##&&&&", "&&%!!#&#&&&&##&&&&", "&&%!&&&##&&&##&&&&", "&&%%%&&&##&##&&&&&", "&&&&&&&&####&&&&&&", "&&&&&&&&&##&&&&&&&", }; xevil-2.02r2.orig/x11/gen_xpm/red_hugger/red_hugger_4.xpm0100644000175000017500000000233507041513606022554 0ustar aaronlaaronl/* XPM */ static char *red_hugger_4[] = { /* width height ncolors chars_per_pixel */ "26 32 5 1 0 0", /* colors */ "! c #000000", "# c #800000", "$ c #008000", "% c #ff0000", "& c None", /* pixels */ "%%#&&&&$$&&&&&&&&&&&&&&&&&", "&###&&&$$&&&&&&&&&$$&&&&&&", "&&&###&&!&&&&&&&&&$$&&&&&&", "&&&&##&&&!&&&&&&&!&&&&&&&&", "&&&&#####!######!&&&&&&&&&", "&&&&&#####!#####!#&&&&&&&&", "&&&&&&&&&#!#!##!####&&&&&&", "%&&&&&&&&##!!!!##&#####&&&", "%###&&&&&###!!###&&&&####&", "&######&&###!!###&&&&&&#%%", "&&&&########!!#####&&&&&&&", "&&&&&&######!!#######&&&&&", "&&&&&&&&&###!!###&&&###&&&", "&&&&&&&&&&##!!##&&&&&###&&", "&&&&&&&&&###!!####&&&&&##&", "&&&&&&&&####!!####&&&&&##&", "&&&&&&&&##&#!!#&####&&&&##", "&&&&&&&##&&####&&&##&&&&&%", "&&&&&&##&&&####&&&##&&&&&%", "&&&&&&#&&&&&##&&&&&#&&&&&&", "&&&&&%#&&&&&##&&&&&&#%&&&&", "&&&&&%%&&&&&##&&&&&&&%&&&&", "&&&&&&&&&&&&##&&&&&&&&&&&&", "&&&&&&&&&&&&##&&&&&&&&&&&&", "&&&&&&&&&&&##&&&&&&&&&&&&&", "&&&&&&&&&&&##&&&&&&&&&&&&&", "&&&&&&&&&&&##&&&&&&&&&&&&&", "&&&&&&&&&&&##&&&&&&&&&&&&&", "&&&&&&&&&%%!!%&&&&&&&&&&&&", "&&&&&&&&&&%!%&&&&&&&&&&&&&", "&&&&&&&&&&&%%&&&&&&&&&&&&&", "&&&&&&&&&&&%&&&&&&&&&&&&&&", }; xevil-2.02r2.orig/x11/gen_xpm/red_hugger/red_hugger_4b.xpm0100644000175000017500000000233607041513606022717 0ustar aaronlaaronl/* XPM */ static char *red_hugger_4b[] = { /* width height ncolors chars_per_pixel */ "26 32 5 1 0 0", /* colors */ "! c #000000", "# c #800000", "$ c #008000", "% c #ff0000", "& c None", /* pixels */ "&&&&&&&&&&&&&&&&&$$&&&&#%%", "&&&&&&$$&&&&&&&&&$$&&&###&", "&&&&&&$$&&&&&&&&&!&&###&&&", "&&&&&&&&!&&&&&&&!&&&##&&&&", "&&&&&&&&&!######!#####&&&&", "&&&&&&&&#!#####!#####&&&&&", "&&&&&&####!##!#!#&&&&&&&&&", "&&&#####&##!!!!##&&&&&&&&%", "&####&&&&###!!###&&&&&###%", "%%#&&&&&&###!!###&&######&", "&&&&&&&#####!!########&&&&", "&&&&&#######!!######&&&&&&", "&&&###&&&###!!###&&&&&&&&&", "&&###&&&&&##!!##&&&&&&&&&&", "&##&&&&&####!!###&&&&&&&&&", "&##&&&&&####!!####&&&&&&&&", "##&&&&####&#!!#&##&&&&&&&&", "%&&&&&##&&&####&&##&&&&&&&", "%&&&&&##&&&####&&&##&&&&&&", "&&&&&&#&&&&&##&&&&&#&&&&&&", "&&&&%#&&&&&&##&&&&&#%&&&&&", "&&&&%&&&&&&&##&&&&&%%&&&&&", "&&&&&&&&&&&&##&&&&&&&&&&&&", "&&&&&&&&&&&&##&&&&&&&&&&&&", "&&&&&&&&&&&&&##&&&&&&&&&&&", "&&&&&&&&&&&&&##&&&&&&&&&&&", "&&&&&&&&&&&&&##&&&&&&&&&&&", "&&&&&&&&&&&&&##&&&&&&&&&&&", "&&&&&&&&&&&&%!!%%&&&&&&&&&", "&&&&&&&&&&&&&%!%&&&&&&&&&&", "&&&&&&&&&&&&&%%&&&&&&&&&&&", "&&&&&&&&&&&&&&%&&&&&&&&&&&", }; xevil-2.02r2.orig/x11/gen_xpm/red_hugger/red_hugger_5.xpm0100644000175000017500000000126107041513606022552 0ustar aaronlaaronl/* XPM */ static char *red_hugger_5[] = { /* width height ncolors chars_per_pixel */ "20 18 5 1 0 0", /* colors */ "! c #000000", "# c #800000", "$ c #008000", "% c #ff0000", "& c None", /* pixels */ "&&$$&&&&&&&&&&&&&&&&", "&&$$&&&&&&&&&&$$&&&&", "&&&!&&&&&&&&&&$$&&&&", "&&&&!&&&&&&&&&!&&&&&", "&&&&&!#!!!!!#!&&&&&&", "&&&&##!#!!!#!#&&&&&&", "&&&####!###!###&&&&&", "&&&#############&&&&", "&&###############&&&", "&#############&###&&", "&##&&&#######&&&##&&", "##&&&###&&&###&&&##&", "##&&###&&&&&&##&&##&", "#&&&##&&&&&&&##&&##&", "##&&#&&&&&&&&##&&##&", "&#&&##&&&&&&##&&##&&", "&##&%%&&&&&%%&&##&&&", "&&%%&&&&&&&&&&&%&&&&", }; xevil-2.02r2.orig/x11/gen_xpm/red_hugger/9_duplicate_of_50100644000175000017500000000000007041513606022510 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/red_hugger/10_duplicate_of_00100644000175000017500000000000007041513606022553 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/red_hugger/10b_duplicate_of_0b0100644000175000017500000000000007041513606023057 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/red_hugger/18_duplicate_of_40100644000175000017500000000000007041513606022567 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/red_hugger/20_duplicate_of_40100644000175000017500000000000007041513606022560 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/red_hugger/20b_duplicate_of_4b0100644000175000017500000000000007041513606023064 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/red_hugger/23_duplicate_of_40100644000175000017500000000000007041513606022563 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/red_hugger/23b_duplicate_of_4b0100644000175000017500000000000007041513606023067 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/red_hugger/red_hugger_25.xpm0100644000175000017500000000140307041513606022632 0ustar aaronlaaronl/* XPM */ static char *red_hugger_25[] = { /* width height ncolors chars_per_pixel */ "32 14 6 1 0 0", /* colors */ "! c #000000", "# c #800000", "$ c #008000", "% c #ff0000", "& c #00ff00", "' c None", /* pixels */ "''''''''''''''%%#'''''''''''''''", "'''''%%#'''''''###''''''''''''''", "'''''''####'''''##''%'''''''''''", "'''''''''###''''#&#'%%#''''%%'''", "'''#####&&&&#''''&#''####''%%###", "''######&##&##''#&#''''###''''##", "'##''''''#!######&''''''##'$$''#", "##''''''''!!####&#''''####!$$'##", "###''''''''#!######''####!!''###", "'#&#''''''''!&###&######!!#####'", "'''###'''''''&!##&'####!#####'''", "''%%'##''''''&&!########&&&'''''", "''%!!##''''''&&!&&&&&#&&&&&&&&''", "&&&&%'''&&&&&&&&&&&&&&&&&&&&&&&'", }; xevil-2.02r2.orig/x11/gen_xpm/green_hugger/0040755000175000017500000000000007637441102020020 5ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/green_hugger/green_hugger_0.xpm0100644000175000017500000000163407041513606023425 0ustar aaronlaaronl/* XPM */ static char *green_hugger_0[] = { /* width height ncolors chars_per_pixel */ "32 18 6 1 0 0", /* colors */ "! c #000000", "# c #800000", "$ c #008000", "% c #808000", "& c #ff0000", "' c None", /* pixels */ "'''''''''''''''''''''''''$$$''''", "'''''''''''''''''''''''''!$$''''", "''&&&&''''''''''''!!!!''!'''''$$", "''&!!''''''''''''!!!!!%%'''!!!$$", "''&'!%''''''''''!!%%%%%!!!!'''''", "''''%%%''''''''!!%%%%!!%%%''''''", "'''''%%'''''''!!%%%%%%%%%%%'''''", "'''%%%'''''''!!%%%%%%%%%%%%%%'''", "'%%%''''''''!!%%%%%%%%%%''%%%%%'", "%%%''''''''!!%%%%%%''%%%%''''%%%", "%%''''''''!!%%%%%%''''%%%%''''%%", "'%%''''''%!%%%%%%%''''''%%'''''%", "''%%%%%%%%%%%%''%%%'''''%%''''%%", "'''%%%%%%%%%%''''%%''''%%'''''%%", "''''''''''%%''''%%%'''%%''''''%'", "''''''''''%'''''%%'''%%''''''%%'", "''''''''##'''''%%%''%%''''''%%''", "''''''&&#'''''&&%'''&''''''&&'''", }; xevil-2.02r2.orig/x11/gen_xpm/green_hugger/green_hugger_0b.xpm0100644000175000017500000000161407041513606023565 0ustar aaronlaaronl/* XPM */ static char *green_hugger_0b[] = { /* width height ncolors chars_per_pixel */ "32 18 5 1 0 0", /* colors */ "! c #000000", "# c #008000", "$ c #808000", "% c #ff0000", "& c None", /* pixels */ "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&##&&&", "&&%%%%&&&&&&&&&&&&&&&&&&&&!##&&&", "&&%!!&&&&&&&&&&&&&!!!!!&&!&&&&&&", "&&%&!$&&&&&&&&&&&!!!!!$$!&&&&&##", "&&&&$$$&&&&&&&&!!!$$$$$$$!!!!!##", "&&&&&$$&&&&&&&!!$$$$$!!!!$&&&&&&", "&&&$$$&&&&&&!!!$$$$$$$$$$$$&&&&&", "&$$$&&&&&&&!!$$$$$$$$$&&&$$$&&&&", "$$&&&&&&&&!!$$$$$&$$$$&&&&$$$&&&", "$$$&&&&&&$$$$$$$&&&&&$$&&&&$$$&&", "&$$$$$$$$$$$$$&&&&&&&&$$&&&&$$&&", "&&$$$$$$$$$&$$$&&&&&&&$$&&&$$&&&", "&&&&&&&&$$&&&&$$&&&&&$$$&&$$$&&&", "&&&&&&&&$&&&&&$$&&&$$$&&&$$&&&&&", "&&&&&&&&$$&&&$$&&$$$&&&&$$&&&&&&", "&&&&&&&&&%%&%$&%%$$&&&%%$&&&&&&&", }; xevil-2.02r2.orig/x11/gen_xpm/green_hugger/green_hugger_2.xpm0100644000175000017500000000176007041513606023427 0ustar aaronlaaronl/* XPM */ static char *green_hugger_2[] = { /* width height ncolors chars_per_pixel */ "18 32 6 1 0 0", /* colors */ "! c #000000", "# c #800000", "$ c #008000", "% c #808000", "& c #ff0000", "' c None", /* pixels */ "''$$'''''%%%%%''''", "''$$''''%%%'%%%%''", "'''!''''%%'''''%%'", "'''!'''%%'''''''%&", "$$'!'''%%''''''''&", "$$''!'%%%'''''''''", "$!''!%%%''%%%'''''", "''!'!%%%'%%%%%''''", "'''%!%%%%%%''%%'''", "'''%%!%%%%%'''%%''", "''!!%!%%%%'''''%%'", "''!!%%%%%'''''''%&", "''!!%%%%%'''''''''", "''!!%%%%%%''%%%'''", "'''!!%%%%%%%%%%%%'", "''''!!%%%%%%%'%%%%", "'''''!!%%%%%''''%&", "''''''!!%%%%'''''&", "'''''''!!%%%%'''''", "''''''''!!%%%%''''", "'''''''''!!%%%%'''", "''''''''''!!%%%%''", "'''''''''''%%%''#'", "''''''''''''%%''##", "''''''''''''%%'''&", "'''''%%'''''%%'''&", "''&'%%%%''''%%''''", "''&!!%'%''''%%''''", "''&!'''%%'''%%''''", "''&&&'''%%'%%'''''", "''''''''%%%%''''''", "'''''''''%%'''''''", }; xevil-2.02r2.orig/x11/gen_xpm/green_hugger/green_hugger_4.xpm0100644000175000017500000000236007041513606023426 0ustar aaronlaaronl/* XPM */ static char *green_hugger_4[] = { /* width height ncolors chars_per_pixel */ "26 32 6 1 0 0", /* colors */ "! c #000000", "# c #800000", "$ c #008000", "% c #808000", "& c #ff0000", "' c None", /* pixels */ "&&%''''$$'''''''''''''''''", "'%%%'''$$'''''''''$$''''''", "'''%%%''!'''''''''$$''''''", "''''%%'''!'''''''!''''''''", "''''%%%%%!%%%%%%!'''''''''", "'''''%%%%%!%%%%%!%''''''''", "'''''''''%!%!%%!%%%%''''''", "&''''''''%%!!!!%%'%%%%%'''", "&%%%'''''%%%!!%%%''''%%%%'", "'%%%%%%''%%%!!%%%''''''%&&", "''''%%%%%%%%!!%%%%%'''''''", "''''''%%%%%%!!%%%%%%%'''''", "'''''''''%%%!!%%%'''%%%'''", "''''''''''%%!!%%'''''%%%''", "'''''''''%%%!!%%%%'''''%%'", "''''''''%%%%!!%%%%'''''%%'", "''''''''%%'%!!%'%%%%''''%%", "'''''''%%''%%%%'''%%'''''&", "''''''%%'''%%%%'''%%'''''&", "''''''%'''''%%'''''%''''''", "'''''&%'''''%%''''''#&''''", "'''''&&'''''%%'''''''&''''", "''''''''''''%%''''''''''''", "''''''''''''%%''''''''''''", "'''''''''''%%'''''''''''''", "'''''''''''%%'''''''''''''", "'''''''''''%%'''''''''''''", "'''''''''''%%'''''''''''''", "'''''''''&&!!&''''''''''''", "''''''''''&!&'''''''''''''", "'''''''''''&&'''''''''''''", "'''''''''''&''''''''''''''", }; xevil-2.02r2.orig/x11/gen_xpm/green_hugger/green_hugger_4b.xpm0100644000175000017500000000236107041513606023571 0ustar aaronlaaronl/* XPM */ static char *green_hugger_4b[] = { /* width height ncolors chars_per_pixel */ "26 32 6 1 0 0", /* colors */ "! c #000000", "# c #800000", "$ c #008000", "% c #808000", "& c #ff0000", "' c None", /* pixels */ "'''''''''''''''''$$''''%&&", "''''''$$'''''''''$$'''%%%'", "''''''$$'''''''''!''%%%'''", "''''''''!'''''''!'''%%''''", "'''''''''!%%%%%%!%%%%%''''", "''''''''%!%%%%%!%%%%%'''''", "''''''%%%%!%%!%!%'''''''''", "'''%%%%%'%%!!!!%%''''''''&", "'%%%%''''%%%!!%%%'''''%%%&", "&&%''''''%%%!!%%%''%%%%%%'", "'''''''%%%%%!!%%%%%%%%''''", "'''''%%%%%%%!!%%%%%%''''''", "'''%%%'''%%%!!%%%'''''''''", "''%%%'''''%%!!%%''''''''''", "'%%'''''%%%%!!%%%'''''''''", "'%%'''''%%%%!!%%%%''''''''", "%%''''%%%%'%!!%'%%''''''''", "&'''''%%'''%%%%''%%'''''''", "&'''''%%'''%%%%'''%%''''''", "''''''%'''''%%'''''%''''''", "''''&#''''''%%'''''%&'''''", "''''&'''''''%%'''''&&'''''", "''''''''''''%%''''''''''''", "''''''''''''%%''''''''''''", "'''''''''''''%%'''''''''''", "'''''''''''''%%'''''''''''", "'''''''''''''%%'''''''''''", "'''''''''''''%%'''''''''''", "''''''''''''&!!&&'''''''''", "'''''''''''''&!&''''''''''", "'''''''''''''&&'''''''''''", "''''''''''''''&'''''''''''", }; xevil-2.02r2.orig/x11/gen_xpm/green_hugger/green_hugger_5.xpm0100644000175000017500000000126307041513606023430 0ustar aaronlaaronl/* XPM */ static char *green_hugger_5[] = { /* width height ncolors chars_per_pixel */ "20 18 5 1 0 0", /* colors */ "! c #000000", "# c #008000", "$ c #808000", "% c #ff0000", "& c None", /* pixels */ "&&##&&&&&&&&&&&&&&&&", "&&##&&&&&&&&&&##&&&&", "&&&!&&&&&&&&&&##&&&&", "&&&&!&&&&&&&&&!&&&&&", "&&&&&!$!!!!!$!&&&&&&", "&&&&$$!$!!!$!$&&&&&&", "&&&$$$$!$$$!$$$&&&&&", "&&&$$$$$$$$$$$$$&&&&", "&&$$$$$$$$$$$$$$$&&&", "&$$$$$$$$$$$$$&$$$&&", "&$$&&&$$$$$$$&&&$$&&", "$$&&&$$$&&&$$$&&&$$&", "$$&&$$$&&&&&&$$&&$$&", "$&&&$$&&&&&&&$$&&$$&", "$$&&$&&&&&&&&$$&&$$&", "&$&&$$&&&&&&$$&&$$&&", "&$$&%%&&&&&%%&&$$&&&", "&&%%&&&&&&&&&&&%&&&&", }; xevil-2.02r2.orig/x11/gen_xpm/green_hugger/9_duplicate_of_50100644000175000017500000000000007041513606023036 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/green_hugger/10_duplicate_of_00100644000175000017500000000000007041513606023101 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/green_hugger/10b_duplicate_of_0b0100644000175000017500000000000007041513606023405 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/green_hugger/18_duplicate_of_40100644000175000017500000000000007041513606023115 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/green_hugger/20_duplicate_of_40100644000175000017500000000000007041513606023106 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/green_hugger/20b_duplicate_of_4b0100644000175000017500000000000007041513606023412 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/green_hugger/23_duplicate_of_40100644000175000017500000000000007041513606023111 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/green_hugger/23b_duplicate_of_4b0100644000175000017500000000000007041513606023415 0ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/green_hugger/green_hugger_25.xpm0100644000175000017500000000140507041513606023510 0ustar aaronlaaronl/* XPM */ static char *green_hugger_25[] = { /* width height ncolors chars_per_pixel */ "32 14 6 1 0 0", /* colors */ "! c #000000", "# c #008000", "$ c #808000", "% c #ff0000", "& c #00ff00", "' c None", /* pixels */ "''''''''''''''%%$'''''''''''''''", "'''''%%$'''''''$$$''''''''''''''", "'''''''$$$$'''''$$''%'''''''''''", "'''''''''$$$''''$&$'%%$''''%%'''", "'''$$$$$&&&&$''''&$''$$$$''%%$$$", "''$$$$$$&$$&$$''$&$''''$$$''''$$", "'$$''''''$!$$$$$$&''''''$$'##''$", "$$''''''''!!$$$$&$''''$$$$!##'$$", "$$$''''''''$!$$$$$$''$$$$!!''$$$", "'$&$''''''''!&$$$&$$$$$$!!$$$$$'", "'''$$$'''''''&!$$&'$$$$!$$$$$'''", "''%%'$$''''''&&!$$$$$$$$&&&'''''", "''%!!$$''''''&&!&&&&&$&&&&&&&&''", "&&&&%'''&&&&&&&&&&&&&&&&&&&&&&&'", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/0040755000175000017500000000000007637441102017670 5ustar aaronlaaronlxevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_0.xpm0100644000175000017500000000424407041513606023145 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_0[] = { /* width height ncolors chars_per_pixel */ "28 40 42 1 0 0", /* colors */ "! c #000000", "# c #cc0066", "$ c #333366", "% c #008080", "& c #993366", "' c #cc3366", "( c #a6caf0", ") c #336666", "* c #3366ff", "+ c #996666", ", c #339966", "- c #3399ff", ". c #555555", "/ c #999966", "0 c #6699ff", "1 c #33cc66", "2 c #ff5050", "3 c #99cc66", "4 c #cccc66", "5 c #ccff66", "6 c #660000", "7 c #990000", "8 c #cc0000", "9 c #333300", ": c #ffff66", "; c #cc3300", "< c #336600", "= c #666600", "> c #336699", "? c #cbcbcb", "@ c #669900", "A c #999900", "B c #00cc99", "C c #a0a0a4", "D c #ff0000", "E c #ffcc99", "F c #00ff99", "G c #ccff00", "H c None", "I c #ffffff", "J c #ccff99", "K c #666699", /* pixels */ "HHHHHHHHHHHHHHHHHHHHHHHHHHHH", "HHHHHHHHHHF,*=99=9HHHHHH", "HHHH(($--$C$$**-0-*$HHHHHHHH", "HHHH($-((*E$$***0!!$HHHHHHHH", "HHH($-(**E4.$!$!!$.HHHHHHHHH", "HH($-$**EE@4$*!<)4/.HHHHHHHH", "HHE$**$*.E@.9HH.EEEEHHHHHHHH", "HHE***$H..9.HHCEE***$**HHHHH", "HHH-*-HHHHHHHH$**-($(((*HHHH", "HHHHHHHHHHHHHH%-(*-*--*$HHHH", "HHHHHHHHHHHHHH%$$$$!>>$$HHHH", "HHHHHHHHHHHHHH*?(((EEE(*HHHH", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_0b.xpm0100644000175000017500000000433007041513606023303 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_0b[] = { /* width height ncolors chars_per_pixel */ "28 40 45 1 0 0", /* colors */ "! c #000000", "# c #cc0066", "$ c #ff0066", "% c #333366", "& c #008080", "' c #993366", "( c #cc3366", ") c #a6caf0", "* c #336666", "+ c #3366ff", ", c #996666", "- c #339966", ". c #3399ff", "/ c #555555", "0 c #999966", "1 c #cc9966", "2 c #ff9966", "3 c #33cc66", "4 c #ff5050", "5 c #99cc66", "6 c #cccc66", "7 c #ccff66", "8 c #660000", "9 c #990000", ": c #cc0000", "; c #333300", "< c #ffff66", "= c #cc3300", "> c #336600", "? c #666600", "@ c #336699", "A c #cbcbcb", "B c #669900", "C c #999900", "D c #00cc99", "E c #a0a0a4", "F c #ff0000", "G c #cccc99", "H c #ffcc99", "I c #00ff99", "J c #ccff00", "K c None", "L c #ffffff", "M c #ccff99", "N c #666699", /* pixels */ "KKKKKKKKKKKKKKKKKKKKKKKKKKKK", "KKKKKKKKKKI->KKK&IIIII&KKKKK", "K&IIIIIII&I->&I3>------KKKKK", "K----->*%*I*>**>>*&-&-KKKKKK", "KK&*&->KKKI->KKKKKKKKKKKKKKK", "KKKKKKKKKI**KKKKKKKKKKKKKKKK", "KKKKKKKKI-< c #663399", "? c #996699", "@ c #cbcbcb", "A c #339999", "B c #669900", "C c #669999", "D c #999900", "E c #00cc99", "F c #33cc99", "G c #a0a0a4", "H c #ff0000", "I c #cccc99", "J c #ffcc99", "K c #00ff99", "L c #ccff00", "M c None", "N c #ffffff", "O c #ccff99", "P c #666699", /* pixels */ "MMMMMMMMMMK,;MMM%KKKKK%MMMMM", "M%KKKKKKK%K,;%K1;,,,,,,MMMMM", "M,,,,,;)$)K);));;)%,%,MMMMMM", "MM%)=/+MMMK,;MMMMMMMMMMMMMMM", "MMMMMMMMMK))MMMMMMMMMMMMMMMM", "MMMMMMMMK,)MMMMM:MMMMMMMMMMM", "MMMMMMMMK,::ML:MM:MMMMMMMMMM", "MMMMMMMMK,MB:.:454:MMMMMMMMM", "MMMMMMMMK,M5:4:33D:MMMMMMMMM", "MMMMMMMMK,M$!$$3))$GMMMMMMMM", "MMMM<8%MK,M$))$NJ@G)MMMMMMMM", "MMMM<88%K)M!$!$PGGG'MMMMMMMM", "MMM<88%1E%$8B45B!$!$!B45I/M**-M", "MMJ$*$JJPB554B/$MM/B4JJ$''*F", "MJ$A'$JG?/B4//MMMMMJJGC$'*-J", "MJ$='-$J/!//BMMMM''!-@-$*-$'", "M'***!88MMMMMMMM'M!$**-*$$JM", "MMJ*!$MMMMMMMMMMMM!**-*$$'MM", "MMMMMMMMMMMMMMMMMM'$=$$$JMMM", "MMMMMMMMMMMMMMMMMM'J''CJMMMM", "MMMMMMMMMMMMMMMMMMMMM(MMMMMM", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_0d.xpm0100644000175000017500000000424507041513606023312 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_0d[] = { /* width height ncolors chars_per_pixel */ "28 40 42 1 0 0", /* colors */ "! c #000000", "# c #cc0066", "$ c #333366", "% c #008080", "& c #993366", "' c #cc3366", "( c #a6caf0", ") c #336666", "* c #3366ff", "+ c #996666", ", c #339966", "- c #3399ff", ". c #555555", "/ c #999966", "0 c #6699ff", "1 c #33cc66", "2 c #ff5050", "3 c #99cc66", "4 c #cccc66", "5 c #ccff66", "6 c #660000", "7 c #990000", "8 c #cc0000", "9 c #333300", ": c #ffff66", "; c #cc3300", "< c #336600", "= c #666600", "> c #336699", "? c #cbcbcb", "@ c #669900", "A c #999900", "B c #00cc99", "C c #a0a0a4", "D c #ff0000", "E c #ffcc99", "F c #00ff99", "G c #ccff00", "H c None", "I c #ffffff", "J c #ccff99", "K c #666699", /* pixels */ "HHHHHHHHHHHHHHHHHHHHHHHHHHHH", "HHHHHHHHHHF,>$$HHHH", "HHHHHHHHHHHHHH*?(((EEE(*HHHH", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_0e.xpm0100644000175000017500000000437207041513606023314 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_0e[] = { /* width height ncolors chars_per_pixel */ "28 40 47 1 0 0", /* colors */ "! c #000000", "# c #cc0066", "$ c #ff0066", "% c #333366", "& c #008080", "' c #993366", "( c #a6caf0", ") c #336666", "* c #3366ff", "+ c #996666", ", c #339966", "- c #669966", ". c #3399ff", "/ c #555555", "0 c #999966", "1 c #6699ff", "2 c #cc9966", "3 c #33cc66", "4 c #ff5050", "5 c #99cc66", "6 c #cccc66", "7 c #ccff66", "8 c #660000", "9 c #990000", ": c #cc0000", "; c #333300", "< c #ffff66", "= c #cc3300", "> c #336600", "? c #666600", "@ c #336699", "A c #cbcbcb", "B c #669900", "C c #669999", "D c #999900", "E c #00cc99", "F c #a0a0a4", "G c #ff0000", "H c #cccc99", "I c #ffcc99", "J c #00ff99", "K c #ccff00", "L c #33ff99", "M c None", "N c #ffffff", "O c #ccff99", "P c #666699", /* pixels */ "MMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMMMMMMMMMJ,>MMM&JJJJJ&MMMMM", "M&JJJJJJJ&J,>&J3>,,,,,,MMMMM", "M,,,,,>)%)J)>))>>)&,&,MMMMMM", "MM&)&,>MMML,>MMMMMMMMMMMMMMM", "MMMMMMMMML))MMMMMMMMMMMMMMMM", "MMMMMMMML,<I00*..(**%**MMMMMMM", "MMMMMMM&..II(%**(%.((*MMMMMM", "MMMMMM*..(**I&%.*%*..*MMMMMM", "MMMMMM(%**(%.I(%%&!@%%MMMMMM", "MMMMMMI&%.%.*..I((II(*MMMMMM", "MMMMM((I(%&&!@@%MMMMMMMMMMMM", "MMMMMMMMI((I(I(*MMMMMMMMMMMM", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_0f.xpm0100644000175000017500000000443407041513606023314 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_0f[] = { /* width height ncolors chars_per_pixel */ "28 40 49 1 0 0", /* colors */ "! c #000000", "# c #cc0066", "$ c #ff0066", "% c #333366", "& c #008080", "' c #993366", "( c #a6caf0", ") c #ff33ff", "* c #336666", "+ c #3366ff", ", c #996666", "- c #339966", ". c #3399ff", "/ c #999966", "0 c #555555", "1 c #6699ff", "2 c #33cc66", "3 c #ff5050", "4 c #99cc66", "5 c #cccc66", "6 c #330000", "7 c #ccff66", "8 c #660000", "9 c #cc0000", ": c #333300", "; c #ffff66", "< c #cc3300", "= c #336600", "> c #666600", "? c #336699", "@ c #663399", "A c #996699", "B c #cbcbcb", "C c #339999", "D c #669900", "E c #669999", "F c #999900", "G c #00cc99", "H c #33cc99", "I c #a0a0a4", "J c #ff0000", "K c #cccc99", "L c #ffcc99", "M c #00ff99", "N c #ccff00", "O c None", "P c #ffffff", "Q c #ccff99", "R c #666699", /* pixels */ "OOOOOOOOOOM-=OOO&MMMMM&OOOOO", "O&MMMMMMM&M-=&M2=------OOOOO", "O-----=*%*M*=**==*&-&-OOOOOO", "OO&*?0,OOOM-=OOOOOOOOOOOOOOO", "OOOOOOOOOM**OOOOOOOOOOOOOOOO", "OOOOOOOOM-*O4OOO4OOOOOOOOOOO", "OOOOOOOOM-4;ON44/4OOOOOOOOOO", "OOOOOOOOM-OD;/;575;OOOOOOOOO", "OOOOOOOOM-O7;5444F;OOOOOOOOO", "OOOOOOOOM-O4!%%4**%IOOOOOOOO", "OOOO>:&OM-O%**%PLBI*OOOOOOOO", "OOOO>::&M*O!%!%RIII(OOOOOOOO", "OOO>::&2G&%:>R!%%!%!OOOOOOOO", "OOO>:O:&&&%:>55%!!!%OOOOOOOO", "OOO::O:>*&&:I//IDD5IOOOOOOOO", "OOO::O!M&&&:00I5I5,OOOOOOOOO", "OOOOOOM&*&&=!00I5Q0OOOOOOOOO", "OOOOOO&&&&%%&&!0I>>OOO057OOO", "OOOOOO&&&&%!89'888 c #336699", "? c #669900", "@ c #669999", "A c #00cc99", "B c #a0a0a4", "C c #ff0000", "D c #cccc99", "E c #ffcc99", "F c #00ff99", "G c #33ff99", "H c None", "I c #ccff99", "J c #666699", /* pixels */ "HHHHHHHHHHHF+>HHH", "HHHHHHHHHHH$$$****-@*HHH", "HHHHHHHHHHH$!>*****@*/HH", "HHHHHHHHHHHH$!$$****@5/H", "HHHHHHHHHHH9./!$$/4444.H", "HHHHHHHHHH9.//%--EEE..HH", "HHHHHHHHH>$(E$%*HH", "HHHHHHHHHE((E(E(*H(E(-HH", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_2b.xpm0100644000175000017500000000400507041513606023304 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_2b[] = { /* width height ncolors chars_per_pixel */ "24 40 42 1 0 0", /* colors */ "! c #000000", "# c #cc0066", "$ c #333366", "% c #008080", "& c #993366", "' c #cc3366", "( c #a6caf0", ") c #336666", "* c #3366ff", "+ c #339966", ", c #669966", "- c #3399ff", ". c #555555", "/ c #999966", "0 c #6699ff", "1 c #cc9966", "2 c #33cc66", "3 c #ff5050", "4 c #cccc66", "5 c #ccff66", "6 c #660000", "7 c #990000", "8 c #cc0000", "9 c #333300", ": c #ffff66", "; c #cc3300", "< c #336600", "= c #666600", "> c #336699", "? c #669900", "@ c #669999", "A c #00cc99", "B c #a0a0a4", "C c #ff0000", "D c #cccc99", "E c #ffcc99", "F c #00ff99", "G c #ccff00", "H c #33ff99", "I c None", "J c #ccff99", "K c #666699", /* pixels */ "IIIIIIIIIIIF+%AIIIIIIIII", "IIIIIIIIIIIF%FFFIIIIIIII", "IIIIIIIII+FFF<$IIIIIIIII", "IIIIIIIIIIIF+*$**@@4/II", "IIIIIIIIIIII$!!$)./D45/I", "IIIIIIIIIII9./!$$/4444.I", "IIIIIIIIII9.//%--EEE..II", "IIIIIIIII>$(E$%*II", "IIIIIIIIIE((E(E(*I(E(-II", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_2c.xpm0100644000175000017500000000376407041513606023320 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_2c[] = { /* width height ncolors chars_per_pixel */ "24 40 41 1 0 0", /* colors */ "! c #000000", "# c #cc0066", "$ c #333366", "% c #008080", "& c #993366", "' c #cc3366", "( c #a6caf0", ") c #336666", "* c #3366ff", "+ c #339966", ", c #669966", "- c #3399ff", ". c #555555", "/ c #999966", "0 c #6699ff", "1 c #33cc66", "2 c #ff5050", "3 c #cccc66", "4 c #ccff66", "5 c #660000", "6 c #990000", "7 c #cc0000", "8 c #333300", "9 c #ffff66", ": c #cc3300", "; c #336600", "< c #666600", "= c #336699", "> c #669900", "? c #669999", "@ c #00cc99", "A c #a0a0a4", "B c #ff0000", "C c #cccc99", "D c #ffcc99", "E c #00ff99", "F c #ccff00", "G c #33ff99", "H c None", "I c #ccff99", "J c #666699", /* pixels */ "H%EEEEE%HHHE+;HHHHHHHHHH", "H++++++;1E%E+;%EEEEEEEE%", "HH+%+%);;))E);)$);++++++", "HHHHHHHHHHHE+;HHH;+%+)%H", "HHHHHHHHHHG))HHHHHHHHHHH", "HHHHHHHHHG+)HHHHHHHHHHHH", "HHHHHHHHHE+HHHHHHHHHHHHH", "HHHHHHHHHE+HHH3HHHHHHHHH", "HHHHHHHHHE+H99HF9HH9HHHH", "HHHHHHHHHE+H/>9/9343HHHH", "HHHHHHHHHE+H@+@@@@>HHHHH", "HHHHHHHHHE@++%%%+%8C4HHH", "HHHHHHHH1@+%!$!$J8>4C4.H", "HHHHHHHH%++$8>.43C8", "HHHHHHHE%)%%8..A3A3A.44H", "HHHHHHH%%%%$8!..A3IA>34>", "HHHHHHH%%%%$$$$275'<>C4>", "HHHHHHHH%%%$!&B222''4CC>", "HHHHHHHH%%%$522B''2CCC> c #336699", "? c #669900", "@ c #669999", "A c #00cc99", "B c #a0a0a4", "C c #ff0000", "D c #cccc99", "E c #ffcc99", "F c #00ff99", "G c #ccff00", "H c #33ff99", "I c None", "J c #ccff99", "K c #666699", /* pixels */ "IIIIIIIIIIIF+%AIIIIIIIII", "IIIIIIIIIIIF%FFFIIIIIIII", "IIIIIIIII+FFF<$IIIIIIIII", "IIIIIIIIIIIF+>III", "IIIIIIIIIII$$$****-@*III", "IIIIIIIIIII$!>*****@@/II", "IIIIIIIIIIII$!$$**/D45/I", "IIIIIIIIIII9./!$)/4444.I", "IIIIIIIIII9.//%--EEE..II", "IIIIIIIII>$(E$%*II", "IIIIIIIIIE((E(E(*I(E(-II", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_4.xpm0100644000175000017500000000454407041513606023154 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_4[] = { /* width height ncolors chars_per_pixel */ "26 40 58 1 0 0", /* colors */ "! c #000000", "# c #990066", "$ c #cc0066", "% c #000080", "& c #333366", "' c #3333ff", "( c #008080", ") c #993366", "* c #cc3366", "+ c #a6caf0", ", c #336666", "- c #3366ff", ". c #996666", "/ c #339966", "0 c #669966", "1 c #3399ff", "2 c #999966", "3 c #555555", "4 c #6699ff", "5 c #4d4d4d", "6 c #9999ff", "7 c #33cc66", "8 c #ff5050", "9 c #99cc66", ": c #cccc66", "; c #330000", "< c #ccff66", "= c #660000", "> c #990000", "? c #cc0000", "@ c #333300", "A c #663300", "B c #ffff66", "C c #993300", "D c #333399", "E c #cc3300", "F c #ff3300", "G c #336600", "H c #666600", "I c #336699", "J c #cbcbcb", "K c #669900", "L c #669999", "M c #999900", "N c #cc9999", "O c #00cc99", "P c #a0a0a4", "Q c #ff0000", "R c #cccc00", "S c #cccc99", "T c #ffcc99", "U c #00ff99", "V c #ccff00", "W c None", "X c #ffffff", "Y c #ccff99", "Z c #666699", "[ c #330066", /* pixels */ "WWWWWWWWWWWU/GWWW(UUUUU(WW", "W(UUUUUUUU(U/G(U7G//////WW", "W//////G,&,U,G,,GG,(/(/WWW", "WW(,/(/GWWWU/GWWWWWWWWWWWW", "WWWWWWWWWWW(O(WWWWWWWWWWWW", "WWWWWWWWWWWW,GWWWWWWWWWWWW", "WWWWWWWWWWWW((WWWWWWWWWWWW", "WWWWWWWWWWW:((WWWWWWWWWWWW", "WWWHWWWWWBBWVBWWBWW@@3HWWW", "W<:<@(WWW2KB2B:<:WO(O:<:WW", "<:S<:7O(/MC(WWWKS<", "<:KWW;(/L!!&&I!!L**5>;WH<:", ":SK;C>$?;I!&2ZPZ;$C>B<:KY:", "!@@Y.R<@@>?)::0KHK", "H0::EQ8?=!.P33P3;A>*CK3K3W", "WHK0*?8)=&@M<<3;>[=?=(WWWW", "WWW>Q>>=;&>@*?@&U(WWWW", "WWW3>=5,&?$=#>>>$&(,,WWWWW", "WWWWW,((=?Q8F>>QQ=((UWWWWW", "WWWWW(0!5)5,&&&5)5!0(WWWWW", "WWWWWW,3,,(3/00(,,3,WWWWWW", "WWWWWWW=>???F)Q??>=WWWWWWW", "WWWWWWWW&&&??F)Q??&WWWWWWW", "WWWWWWW&D141&D&&D1DD&WWWWW", "WWWWW&D'46----&--644'DWWWW", "WWWWW,!%11---D---1L%!&WWWW", "WWWWWDK%L1-D&!&D-DDKK,WWWW", "WWWWW3::K1-D!W!D--P::3WWWW", "WWWWW3::K&&-WWW&!3H:<<3WWW", "WWWWW3..3@!-WWW-&33.:33WWW", "WWWWW33<33&&JWWJ&+3333-+WW", "WWWW-+333&+&TWWT1&++&&&-WW", "WWWW-+1&&&&1JWWJ1&1&1++-+W", "WWWW-1++1%&TWWWWT1%111+-+W", "WWWWJ&111&JWWWWWWT-&%&&T+W", "WWWWWT&%&TWWWWWWWWTTJTJWWW", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_4b.xpm0100644000175000017500000000456607041513606023322 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_4b[] = { /* width height ncolors chars_per_pixel */ "26 40 59 1 0 0", /* colors */ "! c #000000", "# c #990066", "$ c #cc0066", "% c #000080", "& c #333366", "' c #3333ff", "( c #008080", ") c #993366", "* c #cc3366", "+ c #a6caf0", ", c #336666", "- c #3366ff", ". c #996666", "/ c #339966", "0 c #669966", "1 c #3399ff", "2 c #999966", "3 c #555555", "4 c #6699ff", "5 c #4d4d4d", "6 c #cc9966", "7 c #9999ff", "8 c #33cc66", "9 c #ff5050", ": c #99cc66", "; c #cccc66", "< c #330000", "= c #ccff66", "> c #660000", "? c #990000", "@ c #cc0000", "A c #333300", "B c #663300", "C c #ffff66", "D c #993300", "E c #333399", "F c #cc3300", "G c #ff3300", "H c #336600", "I c #666600", "J c #336699", "K c #cbcbcb", "L c #669900", "M c #669999", "N c #999900", "O c #cc9999", "P c #00cc99", "Q c #a0a0a4", "R c #ff0000", "S c #cccc00", "T c #cccc99", "U c #ffcc99", "V c #00ff99", "W c #ccff00", "X c None", "Y c #ffffff", "Z c #ccff99", "[ c #666699", "] c #330066", /* pixels */ "XXXXXXXXXXXV/(PXXXXXXXXXXX", "XXXXXXXXXXXV(VVVXXXXXXXXXX", "XXXXXXXXX/VVVH&XXXXXXXXXXX", "XXXXXXXXXXXV/HXXXXXXXXXXXX", "XXXXXXXXXXX(P(XXXXXXXXXXXX", "XXXXXXXXXXXX,HXXXXXXXXXXXX", "XXXXXXXXXXX;;,XXXXXXXXXXXX", "XXXXXXXXXCCX=CXWXXXXXXXXXX", "XXXIXXXXXXLCCC;XCXXAA3IXXX", "X=;=A(XXX26C2CWC;XP(P;=;XX", "=;T=;8P(/N=C;WC:N/(/;=;=IX", "I==;XX((,(&;&,,&(;VX;=AATX", ";AA=X(,(A!OQYUKQ,(,VX3AA=X", "ZAA3XPV(&5KQ3QQQ+(((XX.=;I", ";;0XX,,,&&&&!!&&M(((XXXLT=", "=;LXX,*!M!!&&J!!M>@<@!.Q33Q3&AN==3@>(XXXX", "XXX?R??><&?A=T>?*@A&V(XXXX", "XXX3?>5,&@$>#???@&(,,XXXXX", "XXXXX,((>@R99?R@@>((VXXXXX", "XXXXX(0!5)5,&&&5)5!0(XXXXX", "XXXXXX,3,,(3/00(,,3,XXXXXX", "XXXXXXX>?@@@G)R@@?>XXXXXXX", "XXXXXXX>?@@@GG)R@@&XXXXXXX", "XXXXXXX&&J&@@&&&E1E&XXXXXX", "XXXXX&E'47--&&&--74'&XXXXX", "XXXXX,!%M1---E---1M%!,XXXX", "XXXXXELLL1-E&!&E--1MLEXXXX", "XXXXX3;;LE-E!X!EE-EL;3XXXX", "XXXXX3;;L&&-XXX&!-3;==3XXX", "XXXXX3..3A!-XXX-&33.;33XXX", "XXXXX33=33&&KXXK&+3333-+XX", "XXXX-+333&+&UXXU1&++&&&-XX", "XXXX-+1&&&&1KXXK1&1&1++-+X", "XXXX-1++1%&UXXXXU1%111+-X+", "XXXXK&111&KXXXXXXU-&%&&U+X", "XXXXXU&%&UXXXXXXXXUUKUKXXX", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_4c.xpm0100644000175000017500000000456607041513606023323 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_4c[] = { /* width height ncolors chars_per_pixel */ "26 40 59 1 0 0", /* colors */ "! c #000000", "# c #990066", "$ c #cc0066", "% c #000080", "& c #333366", "' c #3333ff", "( c #008080", ") c #993366", "* c #cc3366", "+ c #a6caf0", ", c #336666", "- c #3366ff", ". c #996666", "/ c #339966", "0 c #669966", "1 c #3399ff", "2 c #555555", "3 c #999966", "4 c #6699ff", "5 c #4d4d4d", "6 c #cc9966", "7 c #9999ff", "8 c #ff9966", "9 c #33cc66", ": c #ff5050", "; c #99cc66", "< c #cccc66", "= c #330000", "> c #ccff66", "? c #660000", "@ c #990000", "A c #cc0000", "B c #333300", "C c #663300", "D c #ffff66", "E c #993300", "F c #333399", "G c #cc3300", "H c #ff3300", "I c #336600", "J c #666600", "K c #336699", "L c #cbcbcb", "M c #669900", "N c #669999", "O c #999900", "P c #cc9999", "Q c #00cc99", "R c #a0a0a4", "S c #cccc00", "T c #ff0000", "U c #cccc99", "V c #ffcc99", "W c #00ff99", "X c None", "Y c #ffffff", "Z c #ccff99", "[ c #666699", "] c #330066", /* pixels */ "X(WWWWW(XXXW/IXXXXXXXXXXXX", "X//////I9W(W/I(WWWWWWWW(XX", "XX/(/(,II,,W,I,&,I//////XX", "XXXXXXXXXXXW/IXXXI/(/,(XXX", "XXXXXXXXXXX(Q(XXXXXXXXXXXX", "XXXXXXXXXXXX,IXXXXXXXXXXXX", "XXXXXXXXXXXD((DXXXXXXXXXXX", "XXXXXXXXXXDD(DXXDXXXXXXXXX", "XXXJXXXXXXMD3D<>B(XXX36DDD>><9Q(/O>D<>D;O<(/<><>JX", "J>>BBUX", "X(,(B!PRYVLR,(,WX2BB>X", "ZBB2XQW(&5LR2RRR+(((XX.>", "><", "MJ>**T:!BBZ.S>BB@A)<<0MJM", "J0<>2=@]?A?(XXXX", "XXX@T@@?=&@B>U?@*AB&W(XXXX", "XXX2@?5,&A?#@@@$A&(,,XXXXX", "XXXXX,((??A:8TTTA?((WXXXXX", "XXXXX(0!555,&&&5)5!0(XXXXX", "XXXXXX,2,,(2/00(,,2,XXXXXX", "XXXXXXX?@AAAAH)AA@?XXXXXXX", "XXXXXXX?@A&&&F&TAA&XXXXXXX", "XXXXXXX&F14&&F&&F1F&XXXXXX", "XXXXXXF'47----&--74'&XXXXX", "XXXXX&F%N1---F---1N%F&XXXX", "XXXXX,MM%N1F&!&F-1MMMFXXXX", "XXXXX2<>2XXX", "XXXXX2..2B!-XXX-&22.<22XXX", "XXXXX22>22&&LXXL&+2222-+XX", "XXXX-+222&+&VXXV1&++&&&-XX", "XXXX-+1&&&&1LXXL1&1&1++-+X", "XXXX-1++1%&VXXXXV1%111+-X+", "XXXXL&111&LXXXXXXV-&%&&VX+", "XXXXXV&%&VXXXXXXXXVVLVLXXX", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_4d.xpm0100644000175000017500000000460707041513606023320 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_4d[] = { /* width height ncolors chars_per_pixel */ "26 40 60 1 0 0", /* colors */ "! c #000000", "# c #990066", "$ c #cc0066", "% c #000080", "& c #333366", "' c #3333ff", "( c #008080", ") c #993366", "* c #cc3366", "+ c #a6caf0", ", c #336666", "- c #3366ff", ". c #996666", "/ c #339966", "0 c #669966", "1 c #3399ff", "2 c #555555", "3 c #999966", "4 c #6699ff", "5 c #4d4d4d", "6 c #cc9966", "7 c #9999ff", "8 c #ff9966", "9 c #33cc66", ": c #ff5050", "; c #99cc66", "< c #cccc66", "= c #330000", "> c #ccff66", "? c #660000", "@ c #990000", "A c #cc0000", "B c #333300", "C c #663300", "D c #ffff66", "E c #993300", "F c #333399", "G c #cc3300", "H c #ff3300", "I c #336600", "J c #666600", "K c #336699", "L c #cbcbcb", "M c #669900", "N c #669999", "O c #999900", "P c #cc9999", "Q c #00cc99", "R c #a0a0a4", "S c #ff0000", "T c #cccc00", "U c #cccc99", "V c #ffcc99", "W c #00ff99", "X c #ccff00", "Y c None", "Z c #ffffff", "[ c #ccff99", "] c #666699", "^ c #330066", /* pixels */ "YYYYYYYYYYW/(QYYYYYYYYYYYY", "YYYYYYYYYYW(WWWYYYYYYYYYYY", "YYYYYYYY/WWWI&YYYYYYYYYYYY", "YYYYYYYYYYW/IYYYYYYYYYYYYY", "YYYYYYYYYY(Q(YYYYYYYYYYYYY", "YYYYYYYYYYY,IYYYYYYYYYYYYY", "YYYYYYYYYYY(DDYYYYYYYYYYYY", "YYYYYYYYYDYDDYXYYYYYYYYYYY", "YYYJYYYYYMD3D<>B(YY36DRD>><(<9Q(/>D<>;;OO/(/<><>JY", "J>>BBUY", "Y(,(B!PRZVLR,(,WY2BB>Y", "[BB2YQW(&5LR2RRR+(,(YY.>", "><", "MJ>**5@!BB[.T>BB@A)<<0MJM", "J0<>2=@^?A?(YYYY", "YYY@S@@?=&@B>U?@*AB&W(YYYY", "YYY2@?5,&A$#@@$AA&(,,YYYYY", "YYYYY,((?AS8@SSSA?((WYYYYY", "YYYYY(0!5)5,&&&5)5!0(YYYYY", "YYYYYY,2,,(2/00(,,2,YYYYYY", "YYYYYYY?@AAAH)SSAA&YYYYYYY", "YYYYYY?@A&&AAH)&F&FYYYYYYY", "YYYYYYY&F14&&F&&F1F&YYYYYY", "YYYYY&F'47----&--74'F&YYYY", "YYYYY&F'47---F---1N%!,YYYY", "YYYYY,MM'1--&!&F-1MMMFYYYY", "YYYYY2<>2YYY", "YYYYY2..2B!-YYY-&22.<22YYY", "YYYYY22>22&&LYYL&+2222-+YY", "YYYY-+222&+&VYYV1&++&&&-YY", "YYYY-+1&&&&1LYYL1&1&1++-+Y", "YYYY-1++1%&VYYYYV1%111+-+Y", "YYYYL&111&LYYYYYYV-&%&&VY+", "YYYYYV&%&VYYYYYYYYVVLVLYYY", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_5.xpm0100644000175000017500000000446107041513606023153 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_5[] = { /* width height ncolors chars_per_pixel */ "26 40 55 1 0 0", /* colors */ "! c #000000", "# c #990066", "$ c #cc0066", "% c #000080", "& c #333366", "' c #008080", "( c #993366", ") c #cc3366", "* c #a6caf0", "+ c #336666", ", c #3366ff", "- c #996666", ". c #339966", "/ c #669966", "0 c #3399ff", "1 c #999966", "2 c #555555", "3 c #6699ff", "4 c #4d4d4d", "5 c #cc9966", "6 c #9999ff", "7 c #33cc66", "8 c #ff5050", "9 c #99cc66", ": c #cccc66", "; c #330000", "< c #ccff66", "= c #660000", "> c #990000", "? c #cc0000", "@ c #333300", "A c #ffff66", "B c #333399", "C c #cc3300", "D c #ff3300", "E c #336600", "F c #666600", "G c #336699", "H c #cbcbcb", "I c #669900", "J c #669999", "K c #999900", "L c #cc9999", "M c #00cc99", "N c #a0a0a4", "O c #ff0000", "P c #cccc00", "Q c #cccc99", "R c #ffcc99", "S c #00ff99", "T c #ccff00", "U c None", "V c #ffffff", "W c #ccff99", "X c #666699", /* pixels */ "UUUUUUUUUUS.EUUU'SSSSS'UUU", "'SSSSSSSS'S.E'S7E......UUU", "......E+&+S+E++EE+'.'.UUUU", "U'+.'.EUUUS.EUUUUUUUUUUUUU", "UUUUUUUUUU'M'UUUUUUUUUUUUU", "UUUUUUUUUUU+EUUUUUUUUUUUUU", "UUUUUUUUUU::+UUUUUUUUUUUUU", "UUUUUUUUAAU4@@W-P<@@+>CUUUUUUU", "UUUUC>>'!-N22N2;'>>CUUUUUU", "UUU>)?8';@K<<2;>'8?)>UUUUU", "UU/@)'8OC>>?&')):''=?O88>O??=''>1Q>OO=''1IQ1UUU", "UFQQ<???D(O??>IQQQ1UUUU", "UUU11I!!G&??&&&G!!I11UUUUU", "UUUUUB'06,,&&,,60'BUUUUUUU", "UUUU!0300,,,,,,0030!UUUUUU", "UUUU&',00,,B,,,00,'&UUUUUU", "UUUU&!!B,,B!!B,,B!!&UUUUUU", "UUUU2::I&&,UU,&&I::2UUUUUU", "UUUU2--2@!,UU,!@2--2UUUUUU", "UUUURRRR2&UUUU&2RRRRUUUUUU", "UU,,,,,RRNUUUUNRR,,,,,UUUU", "U,,,0**00&UUUU&00**0,,,UUU", "U,,0000&*&UUUU&*&0000,,UUU", "U&&&%&&0&&UUUU&&0&&%&&&*UU", "U,*****,*,UUUU,*,*****,U**", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_21.xpm0100644000175000017500000000452407041513606023231 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_21[] = { /* width height ncolors chars_per_pixel */ "26 40 57 1 0 0", /* colors */ "! c #000000", "# c #990066", "$ c #cc0066", "% c #000080", "& c #333366", "' c #3333ff", "( c #008080", ") c #993366", "* c #cc3366", "+ c #a6caf0", ", c #336666", "- c #3366ff", ". c #996666", "/ c #339966", "0 c #669966", "1 c #3399ff", "2 c #999966", "3 c #555555", "4 c #6699ff", "5 c #4d4d4d", "6 c #9999ff", "7 c #33cc66", "8 c #ff5050", "9 c #cccc66", ": c #330000", "; c #ccff66", "< c #660000", "= c #990000", "> c #cc0000", "? c #333300", "@ c #663300", "A c #ffff66", "B c #993300", "C c #333399", "D c #cc3300", "E c #ff3300", "F c #336600", "G c #666600", "H c #336699", "I c #cbcbcb", "J c #669900", "K c #999900", "L c #669999", "M c #cc9999", "N c #00cc99", "O c #a0a0a4", "P c #ff0000", "Q c #cccc00", "R c #cccc99", "S c #ffcc99", "T c #00ff99", "U c #ccff00", "V c None", "W c #ffffff", "X c #ccff99", "Y c #666699", "Z c #330066", /* pixels */ "VVVVVVVVVVVT/FVVV(TTTTT(VV", "V(TTTTTTTT(T/F(T7F//////VV", "V//////F,&,T,F,,FF,(/(/VVV", "VV(,/(/FVVVT/FVVVVVVVVVVVV", "VVVVVVVVVVV(N(VVVVVVVVVVVV", "VVVVVVVVVVVV,FVVVVVVVVVVVV", "VVVVVVVVVVVV((VVVVVVVVVVVV", "VVVVVVVVVVV9((VVVVVVVVVVVV", "VVVGVVVVVAAVUAVVAVV??3GVVV", "V;9;?(VVV2JA2A9;9VN(N9;9VV", ";9R;97N(,(&&&,9&(/(/9;9;GV", "G;;9VV((?!MOWSIO,TTV9;??RV", "9??;V(,(&5IO3OOO+(,TV3??;V", "X??3VNT(&&&&!!&&L(((VV.;9G", "990VVNT(L!!&&H!!L=B(VVVJR;", ";9JVV:(/:H!&2YOY:**5=:VG;9", "9RJ:B=$>!??X.Q;??$B=A;9JX9", ";JG;**5=)990JGJ", "G099DP8><&?K;;2:Z@=*BJ3J3V", "VGJ0*>8)<&:3333:=Z<><(VVVV", "VVV=P==<:&=?OO<=*>?&T(VVVV", "VVV3=<5,&><#===$>&(,,VVVVV", "VVVVV,((<>P8E==PP<((TVVVVV", "VVVVV(0!5)5,&&&5)5!0(VVVVV", "VVVVVV,3,,(3/00(,,3,VVVVVV", "VVVVVVV<=>>>E)P>>=>E)P>>&VVVVVVV", "VVVVVVV&C141&C&&C1CC&VVVVV", "VVVVV&C'46----&--644'CVVVV", "VVVVV,!%11---C---1L%!&VVVV", "VVVVVCJ%L1-C&!&C-CCJJ,VVVV", "VVVVV399J1-C!V!C--O993VVVV", "VVVVV399J&&-VVV&!3G9;;3VVV", "VVVVV3..3?!-VVV-&33.933VVV", "VVVVV33;33&&IVVI&+3333-+VV", "VVVV-+333&+&SVVS1&++&&&-VV", "VVVV-+1&&&&1IVVI1&1&1++-+V", "VVVV-1++1%&SVVVVS1%111+-+V", "VVVVI&111&IVVVVVVS-&%&&S+V", "VVVVVS&%&SVVVVVVVVSSISIVVV", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_21b.xpm0100644000175000017500000000454607041513606023377 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_21b[] = { /* width height ncolors chars_per_pixel */ "26 40 58 1 0 0", /* colors */ "! c #000000", "# c #990066", "$ c #cc0066", "% c #000080", "& c #333366", "' c #3333ff", "( c #008080", ") c #993366", "* c #cc3366", "+ c #a6caf0", ", c #336666", "- c #3366ff", ". c #996666", "/ c #339966", "0 c #669966", "1 c #3399ff", "2 c #999966", "3 c #555555", "4 c #6699ff", "5 c #4d4d4d", "6 c #cc9966", "7 c #9999ff", "8 c #33cc66", "9 c #ff5050", ": c #cccc66", "; c #330000", "< c #ccff66", "= c #660000", "> c #990000", "? c #cc0000", "@ c #333300", "A c #663300", "B c #ffff66", "C c #993300", "D c #333399", "E c #cc3300", "F c #ff3300", "G c #336600", "H c #666600", "I c #336699", "J c #cbcbcb", "K c #669900", "L c #999900", "M c #669999", "N c #cc9999", "O c #00cc99", "P c #a0a0a4", "Q c #ff0000", "R c #cccc00", "S c #cccc99", "T c #ffcc99", "U c #00ff99", "V c #ccff00", "W c None", "X c #ffffff", "Y c #ccff99", "Z c #666699", "[ c #330066", /* pixels */ "WWWWWWWWWWWU/(OWWWWWWWWWWW", "WWWWWWWWWWWU(UUUWWWWWWWWWW", "WWWWWWWWW/UUUG&WWWWWWWWWWW", "WWWWWWWWWWWU/GWWWWWWWWWWWW", "WWWWWWWWWWW(O(WWWWWWWWWWWW", "WWWWWWWWWWWW,GWWWWWWWWWWWW", "WWWWWWWWWWW::,WWWWWWWWWWWW", "WWWWWWWWWBBW*5=!@@Y.R<@@$C>B<:KY:", "=!.R33R3;>?)::0KHK", "H0::EQ9?=&@L<<2;[A>*CK3K3W", "WHK0*?9)=&;3333;>[=?=(WWWW", "WWW>Q>>=;&>@PP=>*?@&U(WWWW", "WWW3>=5,&?=#>>>$?&(,,WWWWW", "WWWWW,((=?Q99>Q??=((UWWWWW", "WWWWW(0!5)5,&&&5)5!0(WWWWW", "WWWWWW,3,,(3/00(,,3,WWWWWW", "WWWWWWW=>???F)Q??>=WWWWWWW", "WWWWWWW=>???FF)Q??&WWWWWWW", "WWWWWWW&&I&??&&&D1D&WWWWWW", "WWWWW&D'47--&&&--74'&WWWWW", "WWWWW,!%M1---D---1M%!,WWWW", "WWWWWDKKK1-D&!&D--1MKDWWWW", "WWWWW3::KD-D!W!DD-DK:3WWWW", "WWWWW3::K&&-WWW&!-3:<<3WWW", "WWWWW3..3@!-WWW-&33.:33WWW", "WWWWW33<33&&JWWJ&+3333-+WW", "WWWW-+333&+&TWWT1&++&&&-WW", "WWWW-+1&&&&1JWWJ1&1&1++-+W", "WWWW-1++1%&TWWWWT1%111+-W+", "WWWWJ&111&JWWWWWWT-&%&&T+W", "WWWWWT&%&TWWWWWWWWTTJTJWWW", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_21c.xpm0100644000175000017500000000454607041513606023400 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_21c[] = { /* width height ncolors chars_per_pixel */ "26 40 58 1 0 0", /* colors */ "! c #000000", "# c #990066", "$ c #cc0066", "% c #000080", "& c #333366", "' c #3333ff", "( c #008080", ") c #993366", "* c #cc3366", "+ c #a6caf0", ", c #336666", "- c #3366ff", ". c #996666", "/ c #339966", "0 c #669966", "1 c #3399ff", "2 c #555555", "3 c #999966", "4 c #6699ff", "5 c #4d4d4d", "6 c #cc9966", "7 c #9999ff", "8 c #ff9966", "9 c #33cc66", ": c #ff5050", "; c #cccc66", "< c #330000", "= c #ccff66", "> c #660000", "? c #990000", "@ c #cc0000", "A c #333300", "B c #663300", "C c #ffff66", "D c #993300", "E c #333399", "F c #cc3300", "G c #ff3300", "H c #336600", "I c #666600", "J c #336699", "K c #cbcbcb", "L c #669900", "M c #999900", "N c #669999", "O c #cc9999", "P c #00cc99", "Q c #a0a0a4", "R c #ff0000", "S c #cccc00", "T c #cccc99", "U c #ffcc99", "V c #00ff99", "W c None", "X c #ffffff", "Y c #ccff99", "Z c #666699", "[ c #330066", /* pixels */ "W(VVVVV(WWWV/HWWWWWWWWWWWW", "W//////H9V(V/H(VVVVVVVV(WW", "WW/(/(,HH,,V,H,&,H//////WW", "WWWWWWWWWWWV/HWWWH/(/,(WWW", "WWWWWWWWWWW(P(WWWWWWWWWWWW", "WWWWWWWWWWWW,HWWWWWWWWWWWW", "WWWWWWWWWWWC((CWWWWWWWWWWW", "WWWWWWWWWWCC(CWWCWWWWWWWWW", "WWWIWWWWWWLC3C;WCWWAA2IWWW", "W=;=A(WWW36CCC==;WP(P;=;WW", "=;T=;9P(,(&&&,,&(;(/;=;=IW", "I==;WW((A!OQXUKQ,VVW;=AATW", ";AA=W(,(&5KQ2QQQ+(,VW2AA=W", "YAA2WPV(&&&&!!&&N(((WW.=;I", ";;0WW,,,N!!&&J!!N(((WWWLT=", "=;LWW((!!.S22S2&AM==3<[B?*DL2L2W", "WIL0*@:)>&<2222@>(WWWW", "WWW?R??><&?AQQ>?*@A&V(WWWW", "WWW2?>5,&@>#???$@&(,,WWWWW", "WWWWW,((>>@:8RRR@>((VWWWWW", "WWWWW(0!555,&&&5)5!0(WWWWW", "WWWWWW,2,,(2/00(,,2,WWWWWW", "WWWWWWW>?@@@@G)@@?>WWWWWWW", "WWWWWWW>?@&&&E&R@@&WWWWWWW", "WWWWWWW&E14&&E&&E1E&WWWWWW", "WWWWWWE'47----&--74'&WWWWW", "WWWWW&E%N1---E---1N%E&WWWW", "WWWWW,LL%N1E&!&E-1LLLEWWWW", "WWWWW2;;LL1-!W!E-EL;;2WWWW", "WWWWW2;;L&E-WWW&!QI;==2WWW", "WWWWW2..2A!-WWW-&22.;22WWW", "WWWWW22=22&&KWWK&+2222-+WW", "WWWW-+222&+&UWWU1&++&&&-WW", "WWWW-+1&&&&1KWWK1&1&1++-+W", "WWWW-1++1%&UWWWWU1%111+-W+", "WWWWK&111&KWWWWWWU-&%&&UW+", "WWWWWU&%&UWWWWWWWWUUKUKWWW", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_21d.xpm0100644000175000017500000000456707041513606023404 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_21d[] = { /* width height ncolors chars_per_pixel */ "26 40 59 1 0 0", /* colors */ "! c #000000", "# c #990066", "$ c #cc0066", "% c #000080", "& c #333366", "' c #3333ff", "( c #008080", ") c #993366", "* c #cc3366", "+ c #a6caf0", ", c #336666", "- c #3366ff", ". c #996666", "/ c #339966", "0 c #669966", "1 c #3399ff", "2 c #555555", "3 c #999966", "4 c #6699ff", "5 c #4d4d4d", "6 c #cc9966", "7 c #9999ff", "8 c #ff9966", "9 c #33cc66", ": c #ff5050", "; c #cccc66", "< c #330000", "= c #ccff66", "> c #660000", "? c #990000", "@ c #cc0000", "A c #333300", "B c #663300", "C c #ffff66", "D c #993300", "E c #333399", "F c #cc3300", "G c #ff3300", "H c #336600", "I c #666600", "J c #336699", "K c #cbcbcb", "L c #669900", "M c #999900", "N c #669999", "O c #cc9999", "P c #00cc99", "Q c #a0a0a4", "R c #ff0000", "S c #cccc00", "T c #cccc99", "U c #ffcc99", "V c #00ff99", "W c #ccff00", "X c None", "Y c #ffffff", "Z c #ccff99", "[ c #666699", "] c #330066", /* pixels */ "XXXXXXXXXXV/(PXXXXXXXXXXXX", "XXXXXXXXXXV(VVVXXXXXXXXXXX", "XXXXXXXX/VVVH&XXXXXXXXXXXX", "XXXXXXXXXXV/HXXXXXXXXXXXXX", "XXXXXXXXXX(P(XXXXXXXXXXXXX", "XXXXXXXXXXX,HXXXXXXXXXXXXX", "XXXXXXXXXXX(CCXXXXXXXXXXXX", "XXXXXXXXXCXCCXWXXXXXXXXXXX", "XXXIXXXXXLC3C;XC(XXAA2IXXX", "X=;=A(XX36CQC==;(;P(P;=;XX", "=;T=;9P(,(&&&,,&(/(/;=;=IX", "I==;XX((A!OQYUKQ,VVX;=AATX", ";AA=X(,(&5KQ2QQQ+(,VX2AA=X", "ZAA2XPV(&&&&!!&&N(,(XX.=;I", ";;0XX,,,N!!&&J!!N,((XXXLT=", "=;LXX((!!AAZ.S=AA$@?C=;LZ;", "=LI=**5?>!.S22S2&AM==3<]B?*DL2L2X", "XIL0*@:)>&<2222@>(XXXX", "XXX?R??><&?AQQ>?*@A&V(XXXX", "XXX2?>5,&@>#???$@&(,,XXXXX", "XXXXX,((>@R8?RRR@>((VXXXXX", "XXXXX(0!5)5,&&&5)5!0(XXXXX", "XXXXXX,2,,(2/00(,,2,XXXXXX", "XXXXXXX>?@@@G)RR@@&XXXXXXX", "XXXXXX>?@&&@@G)&E&EXXXXXXX", "XXXXXXX&E14&&E&&E1E&XXXXXX", "XXXXX&E'47----&--74'E&XXXX", "XXXXX&E'47---E---1N%!,XXXX", "XXXXX,LL'1--&!&E-1LLLEXXXX", "XXXXX2;;L1-E!X!E-EL;;2XXXX", "XXXXX2;;L&--XXX&!QI;==2XXX", "XXXXX2..2A!-XXX-&22.;22XXX", "XXXXX22=22&&KXXK&+2222-+XX", "XXXX-+222&+&UXXU1&++&&&-XX", "XXXX-+1&&&&1KXXK1&1&1++-+X", "XXXX-1++1%&UXXXXU1%111+-+X", "XXXXK&111&KXXXXXXU-&%&&UX+", "XXXXXU&%&UXXXXXXXXUUKUKXXX", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_22.xpm0100644000175000017500000000454507041513606023235 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_22[] = { /* width height ncolors chars_per_pixel */ "26 40 58 1 0 0", /* colors */ "! c #000000", "# c #990066", "$ c #cc0066", "% c #000080", "& c #333366", "' c #3333ff", "( c #008080", ") c #993366", "* c #cc3366", "+ c #a6caf0", ", c #336666", "- c #3366ff", ". c #996666", "/ c #339966", "0 c #669966", "1 c #3399ff", "2 c #999966", "3 c #555555", "4 c #6699ff", "5 c #4d4d4d", "6 c #9999ff", "7 c #33cc66", "8 c #ff5050", "9 c #99cc66", ": c #cccc66", "; c #330000", "< c #ccff66", "= c #660000", "> c #990000", "? c #cc0000", "@ c #333300", "A c #663300", "B c #ffff66", "C c #993300", "D c #333399", "E c #cc3300", "F c #ff3300", "G c #336600", "H c #666600", "I c #336699", "J c #cbcbcb", "K c #669900", "L c #669999", "M c #999900", "N c #cc9999", "O c #00cc99", "P c #a0a0a4", "Q c #cccc00", "R c #ff0000", "S c #cccc99", "T c #ffcc99", "U c #00ff99", "V c #ccff00", "W c None", "X c #ffffff", "Y c #ccff99", "Z c #666699", "[ c #330066", /* pixels */ "WWWWWWWWWWWU/GWWW(UUUUU(WW", "W(UUUUUUUU(U/G(U7G//////WW", "W//////G,&,U,G,,GG,(/(/WWW", "WW(,/(/GWWWU/GWWWWWWWWWWWW", "WWWWWWWWWWW(O(WWWWWWWWWWWW", "WWWWWWWWWWWW,GWWWWWWWWWWWW", "WWWWWWWWWWWW((WWWWWWWWWWWW", "WWWWWWWWWWW:((WWWWWWWWWWWW", "WWWHWWWWWBBWVBWWBWW@@3HWWW", "W<:<@(WWW2KB2B:<:WO(O:<:WW", "<:S<:7O(/MC(WWWKS<", "<:KWW;(/L&&&!!&&L**5>;WH<:", ":SK;C>$?;!!&&I!!L$C>B<:KY:", "!I!&2ZPZ;>?)::0KHK", "H0::ER8?=@@Y.Q<@@A>*CK3K3W", "WHK0*?8)=!.P33P3;[=?=(WWWW", "WWW>R>>=;&>@*?@&U(WWWW", "WWW3>=5,&?$=#>>>$&(,,WWWWW", "WWWWW,((=?R8F>>RR=((UWWWWW", "WWWWW(0!5)5,&&&5)5!0(WWWWW", "WWWWWW,3,,(3/00(,,3,WWWWWW", "WWWWWWW=>???F)R??>=WWWWWWW", "WWWWWWWW&&&??F)R??&WWWWWWW", "WWWWWWW&D141&D&&D1DD&WWWWW", "WWWWW&D'46----&--644'DWWWW", "WWWWW,!%11---D---1L%!&WWWW", "WWWWWDK%L1-D&!&D-DDKK,WWWW", "WWWWW3::K1-D!W!D--P::3WWWW", "WWWWW3::K&&-WWW&!3H:<<3WWW", "WWWWW3..3@!-WWW-&33.:33WWW", "WWWWW33<33&&JWWJ&+3333-+WW", "WWWW-+333&+&TWWT1&++&&&-WW", "WWWW-+1&&&&1JWWJ1&1&1++-+W", "WWWW-1++1%&TWWWWT1%111+-+W", "WWWWJ&111&JWWWWWWT-&%&&T+W", "WWWWWT&%&TWWWWWWWWTTJTJWWW", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_22b.xpm0100644000175000017500000000456707041513606023403 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_22b[] = { /* width height ncolors chars_per_pixel */ "26 40 59 1 0 0", /* colors */ "! c #000000", "# c #990066", "$ c #cc0066", "% c #000080", "& c #333366", "' c #3333ff", "( c #008080", ") c #993366", "* c #cc3366", "+ c #a6caf0", ", c #336666", "- c #3366ff", ". c #996666", "/ c #339966", "0 c #669966", "1 c #3399ff", "2 c #999966", "3 c #555555", "4 c #6699ff", "5 c #4d4d4d", "6 c #cc9966", "7 c #9999ff", "8 c #33cc66", "9 c #ff5050", ": c #99cc66", "; c #cccc66", "< c #330000", "= c #ccff66", "> c #660000", "? c #990000", "@ c #cc0000", "A c #333300", "B c #663300", "C c #ffff66", "D c #993300", "E c #333399", "F c #cc3300", "G c #ff3300", "H c #336600", "I c #666600", "J c #336699", "K c #cbcbcb", "L c #669900", "M c #669999", "N c #999900", "O c #cc9999", "P c #00cc99", "Q c #a0a0a4", "R c #cccc00", "S c #ff0000", "T c #cccc99", "U c #ffcc99", "V c #00ff99", "W c #ccff00", "X c None", "Y c #ffffff", "Z c #ccff99", "[ c #666699", "] c #330066", /* pixels */ "XXXXXXXXXXXV/(PXXXXXXXXXXX", "XXXXXXXXXXXV(VVVXXXXXXXXXX", "XXXXXXXXX/VVVH&XXXXXXXXXXX", "XXXXXXXXXXXV/HXXXXXXXXXXXX", "XXXXXXXXXXX(P(XXXXXXXXXXXX", "XXXXXXXXXXXX,HXXXXXXXXXXXX", "XXXXXXXXXXX;;,XXXXXXXXXXXX", "XXXXXXXXXCCX=CXWXXXXXXXXXX", "XXXIXXXXXXLCCC;XCXXAA3IXXX", "X=;=A(XXX26C2CWC;XP(P;=;XX", "=;T=;8P(/==C;WC:N/(/;=;=IX", "I==;XX((,N=C;;:CN;VX;=AATX", ";AA=X(,(A(&;&,,&((,VX3AA=X", "ZAA3XPV(&!OQYUKQ,(((XX.=;I", ";;0XX,,,&5KQ3QQQ+(((XXXLT=", "=;LXX,*!M&&&!!&&M>@<@AAZ.R=AAB?*DL3L3X", "XIL0*@9)>!.Q33Q3<]>@>(XXXX", "XXX?S??><&?A=T>?*@A&V(XXXX", "XXX3?>5,&@$>#???@&(,,XXXXX", "XXXXX,((>@S99?S@@>((VXXXXX", "XXXXX(0!5)5,&&&5)5!0(XXXXX", "XXXXXX,3,,(3/00(,,3,XXXXXX", "XXXXXXX>?@@@G)S@@?>XXXXXXX", "XXXXXXX>?@@@GG)S@@&XXXXXXX", "XXXXXXX&&J&@@&&&E1E&XXXXXX", "XXXXX&E'47--&&&--74'&XXXXX", "XXXXX,!%M1---E---1M%!,XXXX", "XXXXXELLL1-E&!&E--1MLEXXXX", "XXXXX3;;LE-E!X!EE-EL;3XXXX", "XXXXX3;;L&&-XXX&!-3;==3XXX", "XXXXX3..3A!-XXX-&33.;33XXX", "XXXXX33=33&&KXXK&+3333-+XX", "XXXX-+333&+&UXXU1&++&&&-XX", "XXXX-+1&&&&1KXXK1&1&1++-+X", "XXXX-1++1%&UXXXXU1%111+-X+", "XXXXK&111&KXXXXXXU-&%&&U+X", "XXXXXU&%&UXXXXXXXXUUKUKXXX", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_22c.xpm0100644000175000017500000000456707041513606023404 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_22c[] = { /* width height ncolors chars_per_pixel */ "26 40 59 1 0 0", /* colors */ "! c #000000", "# c #990066", "$ c #cc0066", "% c #000080", "& c #333366", "' c #3333ff", "( c #008080", ") c #993366", "* c #cc3366", "+ c #a6caf0", ", c #336666", "- c #3366ff", ". c #996666", "/ c #339966", "0 c #669966", "1 c #3399ff", "2 c #555555", "3 c #999966", "4 c #6699ff", "5 c #4d4d4d", "6 c #cc9966", "7 c #9999ff", "8 c #ff9966", "9 c #33cc66", ": c #ff5050", "; c #99cc66", "< c #cccc66", "= c #330000", "> c #ccff66", "? c #660000", "@ c #990000", "A c #cc0000", "B c #333300", "C c #663300", "D c #ffff66", "E c #993300", "F c #333399", "G c #cc3300", "H c #ff3300", "I c #336600", "J c #666600", "K c #336699", "L c #cbcbcb", "M c #669900", "N c #669999", "O c #999900", "P c #cc9999", "Q c #00cc99", "R c #a0a0a4", "S c #cccc00", "T c #ff0000", "U c #cccc99", "V c #ffcc99", "W c #00ff99", "X c None", "Y c #ffffff", "Z c #ccff99", "[ c #666699", "] c #330066", /* pixels */ "X(WWWWW(XXXW/IXXXXXXXXXXXX", "X//////I9W(W/I(WWWWWWWW(XX", "XX/(/(,II,,W,I,&,I//////XX", "XXXXXXXXXXXW/IXXXI/(/,(XXX", "XXXXXXXXXXX(Q(XXXXXXXXXXXX", "XXXXXXXXXXXX,IXXXXXXXXXXXX", "XXXXXXXXXXXD((DXXXXXXXXXXX", "XXXXXXXXXXDD(DXXDXXXXXXXXX", "XXXJXXXXXXMD3D<>B(XXX36DDD>><9Q(/O>D<>D;O<(/<><>JX", "J>>><>;;OWWX<>BBUX", "X(,(B(&&&,,&((,WX2BB>X", "ZBB2XQW(&!PRYVLR,(((XX.>", "><", "MJ>**T:!K!&3[R[=@A)<<0MJM", "J0<BBC@*EM2M2X", "XJM0*A:)?!.R22R2=]?A?(XXXX", "XXX@T@@?=&@B>U?@*AB&W(XXXX", "XXX2@?5,&A?#@@@$A&(,,XXXXX", "XXXXX,((??A:8TTTA?((WXXXXX", "XXXXX(0!555,&&&5)5!0(XXXXX", "XXXXXX,2,,(2/00(,,2,XXXXXX", "XXXXXXX?@AAAAH)AA@?XXXXXXX", "XXXXXXX?@A&&&F&TAA&XXXXXXX", "XXXXXXX&F14&&F&&F1F&XXXXXX", "XXXXXXF'47----&--74'&XXXXX", "XXXXX&F%N1---F---1N%F&XXXX", "XXXXX,MM%N1F&!&F-1MMMFXXXX", "XXXXX2<>2XXX", "XXXXX2..2B!-XXX-&22.<22XXX", "XXXXX22>22&&LXXL&+2222-+XX", "XXXX-+222&+&VXXV1&++&&&-XX", "XXXX-+1&&&&1LXXL1&1&1++-+X", "XXXX-1++1%&VXXXXV1%111+-X+", "XXXXL&111&LXXXXXXV-&%&&VX+", "XXXXXV&%&VXXXXXXXXVVLVLXXX", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_22d.xpm0100644000175000017500000000461007041513606023372 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_22d[] = { /* width height ncolors chars_per_pixel */ "26 40 60 1 0 0", /* colors */ "! c #000000", "# c #990066", "$ c #cc0066", "% c #000080", "& c #333366", "' c #3333ff", "( c #008080", ") c #993366", "* c #cc3366", "+ c #a6caf0", ", c #336666", "- c #3366ff", ". c #996666", "/ c #339966", "0 c #669966", "1 c #3399ff", "2 c #555555", "3 c #999966", "4 c #6699ff", "5 c #4d4d4d", "6 c #cc9966", "7 c #9999ff", "8 c #ff9966", "9 c #33cc66", ": c #ff5050", "; c #99cc66", "< c #cccc66", "= c #330000", "> c #ccff66", "? c #660000", "@ c #990000", "A c #cc0000", "B c #333300", "C c #663300", "D c #ffff66", "E c #993300", "F c #333399", "G c #cc3300", "H c #ff3300", "I c #336600", "J c #666600", "K c #336699", "L c #cbcbcb", "M c #669900", "N c #669999", "O c #999900", "P c #cc9999", "Q c #00cc99", "R c #a0a0a4", "S c #cccc00", "T c #ff0000", "U c #cccc99", "V c #ffcc99", "W c #00ff99", "X c #ccff00", "Y c None", "Z c #ffffff", "[ c #ccff99", "] c #666699", "^ c #330066", /* pixels */ "YYYYYYYYYYW/(QYYYYYYYYYYYY", "YYYYYYYYYYW(WWWYYYYYYYYYYY", "YYYYYYYY/WWWI&YYYYYYYYYYYY", "YYYYYYYYYYW/IYYYYYYYYYYYYY", "YYYYYYYYYY(Q(YYYYYYYYYYYYY", "YYYYYYYYYYY,IYYYYYYYYYYYYY", "YYYYYYYYYYY(DDYYYYYYYYYYYY", "YYYYYYYYYDYDDYXYYYYYYYYYYY", "YYYJYYYYYMD3D<>B(YY36DRD>><(<9Q(/>D<>>;;O/(/<><>JY", "J>>;;OOWWY<>BBUY", "Y(,(B(&&&,,&((,WY2BB>Y", "[BB2YQW(&!PRZVLR,(,(YY.>", "><", "MJ>**5@!K!&3]R]=@A)<<0MJM", "J0<BBC@*EM2M2Y", "YJM0*A:)?!.R22R2=^?A?(YYYY", "YYY@T@@?=&@B>U?@*AB&W(YYYY", "YYY2@?5,&A$#@@$AA&(,,YYYYY", "YYYYY,((?AT8@TTTA?((WYYYYY", "YYYYY(0!5)5,&&&5)5!0(YYYYY", "YYYYYY,2,,(2/00(,,2,YYYYYY", "YYYYYYY?@AAAH)TTAA&YYYYYYY", "YYYYYY?@A&&AAH)&F&FYYYYYYY", "YYYYYYY&F14&&F&&F1F&YYYYYY", "YYYYY&F'47!---&--74'F&YYYY", "YYYYY&F'47---F---1N%!,YYYY", "YYYYY,MM'1--&!&F-1MMMFYYYY", "YYYYY2<>2YYY", "YYYYY2..2B!-YYY-&22.<22YYY", "YYYYY22>22&&LYYL&+2222-+YY", "YYYY-+222&+&VYYV1&++&&&-YY", "YYYY-+1&&&&1LYYL1&1&1++-+Y", "YYYY-1++1%&VYYYYV1%111+-+Y", "YYYYL&111&LYYYYYYV-&%&&VY+", "YYYYYV&%&VYYYYYYYYVVLVLYYY", }; xevil-2.02r2.orig/x11/gen_xpm/chopper_boy/chopper_boy_25.xpm0100644000175000017500000000317607041513606023237 0ustar aaronlaaronl/* XPM */ static char *chopper_boy_25[] = { /* width height ncolors chars_per_pixel */ "38 18 43 1 0 0", /* colors */ "! c #000000", "# c #cc0066", "$ c #333366", "% c #008080", "& c #993366", "' c #cc3366", "( c #a6caf0", ") c #336666", "* c #3366ff", "+ c #339966", ", c #3399ff", "- c #999966", ". c #555555", "/ c #6699ff", "0 c #33cc66", "1 c #99cc66", "2 c #ff5050", "3 c #cccc66", "4 c #ccff66", "5 c #660000", "6 c #990000", "7 c #cc0000", "8 c #333300", "9 c #ffff66", ": c #cc3300", "; c #336600", "< c #666600", "= c #336699", "> c #cbcbcb", "? c #669900", "@ c #999900", "A c #669999", "B c #00cc99", "C c #a0a0a4", "D c #ff0000", "E c #cccc99", "F c #ffcc99", "G c #00ff99", "H c #ccff00", "I c None", "J c #ffffff", "K c #ccff99", "L c #666699", /* pixels */ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII", "IIIIIIIIIII$$D+$%IIIIII%IIII$$D+D+$%II", "IIIIIIIIIIIII%D+D%%III++%D$+DDD%%%D+II", "IIIIIIII.-IIIIIIDD%+D+$+DDI%%%IIII%$+I", "IIIIIII.34-IIIIII$$$$$I$%GIIIIIIIII$$I", "IIIIIII44DA*=IIIIIIIIIIII%%IIIIIIII++I", "IIIIIID33EAA=I6DDDDIIIIIIC$!()CIIIIIII", "IIIIII333-*,/%#DDDD527<.I3!$CC$99IIIII", "IIIII44D-***%$7%D$DD72)@D1IIII", "IIIII4D3)***$7$%D$DD2DC3D?!$CF)14-1III", "III(DD3,$$**$$%$D2&D22.CDC$$LJ1131IIII", "II**J3,,%$**$$$$D52'D7!.DD3!$$$DD1IIII", "II*DJDJJ,!=$$%$#D72':'%..D3L!)$3-HIIII", "$**$$*J,$$8?4.?3KC22''%!DC<<$)!99I1III", "**(($(**%IE4ED.%%type == UN_POSTER) { if (!reduceDraw) { PosterSquare *pSquare = &unionSquares[l.r][l.c]->pSquare; Pixmap pix = xdata.posterPixmaps[dpyNum][pSquare->poster]; Pixmap mask = xdata.posterMasks[dpyNum][pSquare->poster]; if (!pix || !mask) { return; } // Now draw using clip mask XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum],mask); XSetClipOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.stretch_x(x - pSquare->loc.c * WSQUARE_WIDTH), xvars.stretch_y(y - pSquare->loc.r * WSQUARE_HEIGHT)); XCopyArea(xvars.dpy[dpyNum],pix, buffer,xvars.gc[dpyNum], xvars.stretch_x(pSquare->loc.c * WSQUARE_WIDTH), xvars.stretch_y(pSquare->loc.r * WSQUARE_HEIGHT), xvars.stretch_x(WSQUARE_WIDTH), xvars.stretch_y(WSQUARE_HEIGHT), xvars.stretch_x(x), xvars.stretch_y(y)); // Restore gc to initial state. XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum],None); XSetClipOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum],0,0); } // reduceDraw } // Draw door. else if (unionSquares[l.r][l.c]->type == UN_DOOR) { int topBottom = unionSquares[l.r][l.c]->dSquare.topBottom; int doorNum = themes[themeIndex].doorBase + topBottom; XCopyArea(xvars.dpy[dpyNum], xdata.doorPixmaps[dpyNum][doorNum], buffer,xvars.gc[dpyNum],0,0, xvars.stretch_x(WSQUARE_WIDTH), xvars.stretch_y(WSQUARE_HEIGHT), xvars.stretch_x(x), xvars.stretch_y(y)); } // Draw moverSquare. else if (unionSquares[l.r][l.c]->type == UN_MOVER) { // If moversquare goes through a wall, draw the wall first. if (map[l.r][l.c] == Wwall) { // Hack, rip out union square and draw just wall. UnionSquare *tmp = unionSquares[l.r][l.c]; unionSquares[l.r][l.c] = NULL; // go recursive draw_square(buffer,xvars,dpyNum,l,x,y,reduceDraw); unionSquares[l.r][l.c] = tmp; } int mSquareNum = themes[themeIndex].moverSquareBase + unionSquares[l.r][l.c]->mSquare.orientation; // Now draw using clip mask if (!reduceDraw) { XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum], xdata.moverSquareMasks[dpyNum][mSquareNum]); XSetClipOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.stretch_x(x), xvars.stretch_y(y)); } XCopyArea(xvars.dpy[dpyNum], xdata.moverSquarePixmaps[dpyNum][mSquareNum], buffer,xvars.gc[dpyNum],0,0, xvars.stretch_x(WSQUARE_WIDTH), xvars.stretch_y(WSQUARE_HEIGHT), xvars.stretch_x(x), xvars.stretch_y(y)); // Restore gc to initial state. if (!reduceDraw) { XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum],None); XSetClipOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum],0,0); } } // Unknown UnionSquare. else { assert(0); } } // Draw regular square. else { // World::draw_background() takes care of drawing empty squares. if (blockNum != Wempty) { // Only use transparent CopyArea for certain bricks. Boolean useTransparent = blockUseTransparent[map[l.r][l.c]] && !reduceDraw; if (useTransparent) { XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum], xdata.blockMasks[dpyNum][blockNum]); XSetClipOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.stretch_x(x), xvars.stretch_y(y)); } XCopyArea(xvars.dpy[dpyNum], xdata.blockPixmaps[dpyNum][blockNum], buffer,xvars.gc[dpyNum],0,0, xvars.stretch_x(WSQUARE_WIDTH), xvars.stretch_y(WSQUARE_HEIGHT), xvars.stretch_x(x), xvars.stretch_y(y)); if (useTransparent) { // Restore gc to initial state. XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum],None); XSetClipOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum],0,0); } } } } void World::draw_mover(CMN_DRAWABLE buffer,Xvars &xvars,int dpyNum, MoverP /* mover */,int x,int y) { int moverNum = themes[themeIndex].moverIndex; XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum], xdata.moverMasks[dpyNum][moverNum]); XSetClipOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.stretch_x(x), xvars.stretch_y(y)); XCopyArea(xvars.dpy[dpyNum], xdata.moverPixmaps[dpyNum][moverNum], buffer,xvars.gc[dpyNum],0,0, xvars.stretch_x(moverSize.width), xvars.stretch_y(moverSize.height), xvars.stretch_x(x), xvars.stretch_y(y)); // Restore gc to initial state. XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum],None); XSetClipOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum],0,0); } void World::draw_outside_offset(CMN_DRAWABLE dest, Xvars &xvars,int dpyNum,Size sourceOffset, const Area &destArea) { if (!xvars.is_valid(xValid)) { init_x(xvars,IX_INIT,NULL); } // Everything is already in window coordinates. Pos destPos = destArea.get_pos(); Size destSize = destArea.get_size(); XCopyArea(xvars.dpy[dpyNum],xdata.outsidePixmaps[dpyNum][outsideIndex], dest,xvars.gc[dpyNum], sourceOffset.width,sourceOffset.height, destSize.width,destSize.height, destPos.x,destPos.y); } void World::draw_background(CMN_DRAWABLE buffer,Xvars &xvars,int dpyNum, Area area,Boolean background3D) { if (!xvars.is_valid(xValid)) { init_x(xvars,IX_INIT,NULL); } // backgrounds.size should really be given in unstretched coordinates // to avoid having to divide by two. Size bSize = backgrounds[backgroundIndex].size; // Size of the background in stretched coordinates. Size bgSize; bgSize.set(xvars.stretch_x(bSize.width >> 1), xvars.stretch_y(bSize.height >> 1)); Pos pos = xvars.stretch_pos(area.get_pos()); Size size = xvars.stretch_size(area.get_size()); // Move background at half the speed of the foreground. if (background3D) { pos.x /= W_BACKGROUNDRATE; pos.y /= W_BACKGROUNDRATE; } // The origin to use for tiling with the background. Pos tsOrigin(-(pos.x % bgSize.width), -(pos.y % bgSize.height)); // Set GC to fill with tile of the background. XSetTSOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum], tsOrigin.x,tsOrigin.y); XSetFillStyle(xvars.dpy[dpyNum],xvars.gc[dpyNum], FillTiled); XSetTile(xvars.dpy[dpyNum],xvars.gc[dpyNum], xdata.backgroundPixmaps[dpyNum][backgroundIndex]); // Fill buffer, tiled with the background. XFillRectangle(xvars.dpy[dpyNum],buffer,xvars.gc[dpyNum], 0,0,size.width,size.height); // Revert GC to former state. // // Not going to bother reverting the tile in the GC, we don't use // it anywhere else anyway. Only applies when fill_style is FillSolid. // Tried setting it to "None" or to the value returned from XGetGCValues // on the initial GC. Both gave errors. // XSetTSOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum], 0,0); XSetFillStyle(xvars.dpy[dpyNum],xvars.gc[dpyNum], FillSolid); } // Fill the background of pixmaps[] (as specified by masks[]) with // the given color. void World_fill_background(Xvars& xvars,int dpyNum, Pixmap pixmaps[],Pixmap masks[], const Size& size,int pixNum, Pixel color) { Pixmap scratch = XCreatePixmap(xvars.dpy[dpyNum],xvars.root[dpyNum], size.width,size.height,xvars.depth[dpyNum]); if (!scratch) { return; } XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],color); for (int n = 0; n < pixNum; n++) { // Fill scratch with color. XFillRectangle(xvars.dpy[dpyNum],scratch,xvars.gc[dpyNum],0,0, size.width,size.height); // Copy pixmaps[n] onto scratch using appropriate mask. XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum],masks[n]); XCopyArea(xvars.dpy[dpyNum],pixmaps[n],scratch,xvars.gc[dpyNum], 0,0,size.width,size.height,0,0); XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum],None); // Now copy scratch back onto pixmaps[n] without using mask. XCopyArea(xvars.dpy[dpyNum],scratch,pixmaps[n],xvars.gc[dpyNum], 0,0,size.width,size.height,0,0); } XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],xvars.black[dpyNum]); } void World::init_x(Xvars &xvars,IXCommand,void*) { for (int dpyNum = 0; dpyNum < xvars.dpyMax; dpyNum++) { xdata.background[dpyNum] = xvars.alloc_named_color(dpyNum,Xvars_BACKGROUND); // Regular blocks. int n; for (n = 0; n < W_ALL_BLOCKS_NUM; n++) { Pixmap* mask = NULL; // Only create the mask if necessary. So, check to see if this block is // used as a transparent block in any theme. Inefficient, but doesn't // really matter here. for (int block = 0; (mask == NULL) && (block < W_BLOCKS_NUM); block++) { if (blockUseTransparent[block]) { for (int th = 0; th < W_THEME_NUM; th++) { if (themes[th].blockIndices[block] == n) { mask = &xdata.blockMasks[dpyNum][n]; break; } } } } // Load pixmap and possibly mask. Boolean val = xvars.load_pixmap(&xdata.blockPixmaps[dpyNum][n], mask,dpyNum, (char**)blocksBits[n]); if (!val) { cerr << "Failed to load block " << n << endl; } } // for n // For reduce draw, we won't use masks for XCopyArea, so fill background // with black. if (Viewport::get_reduce_draw()) { Size blockSize; blockSize.set(xvars.stretch_x(WSQUARE_WIDTH), xvars.stretch_y(WSQUARE_HEIGHT)); World_fill_background(xvars,dpyNum,xdata.blockPixmaps[dpyNum], xdata.blockMasks[dpyNum],blockSize, W_ALL_BLOCKS_NUM, xvars.black[dpyNum]); } // Create posterPixmaps, blocks must be created first. // // Use W_ALL_POSTERS_NUM to get the title poster. for (n = 0; n < W_ALL_POSTERS_NUM; n++) { Boolean val = xvars.load_pixmap(&xdata.posterPixmaps[dpyNum][n], &xdata.posterMasks[dpyNum][n], dpyNum,(char**)posters[n].id); if (!val) { cerr << "Failed to load poster " << n << endl; } } // Create doorPixmaps. for (n = 0; n < W_ALL_DOORS_NUM; n++) { Boolean val = xvars.load_pixmap(&xdata.doorPixmaps[dpyNum][n],NULL,dpyNum, (char**)doorPixmapBits[n]); if (!val) { cerr << "Failed to load door block " << n << endl; } } // Mover squares. for (n = 0; n < W_ALL_MOVER_SQUARES_NUM; n++) { Boolean val = xvars.load_pixmap(&xdata.moverSquarePixmaps[dpyNum][n], &xdata.moverSquareMasks[dpyNum][n], dpyNum, (char**)moverSquarePixmapBits[n]); if (!val) { cerr << "Failed to mover square " << n << endl; } } // For reduce draw, we won't use masks for XCopyArea, so fill background // with black. if (Viewport::get_reduce_draw()) { Size blockSize; blockSize.set(xvars.stretch_x(WSQUARE_WIDTH), xvars.stretch_y(WSQUARE_HEIGHT)); World_fill_background(xvars,dpyNum,xdata.moverSquarePixmaps[dpyNum], xdata.moverSquareMasks[dpyNum],blockSize, W_ALL_MOVER_SQUARES_NUM, xvars.black[dpyNum]); } // Mover. for (n = 0; n < W_ALL_MOVERS_NUM; n++) { Boolean val = xvars.load_pixmap(&xdata.moverPixmaps[dpyNum][n], &xdata.moverMasks[dpyNum][n], dpyNum, (char**)moverPixmapBits[n]); if (!val) { cerr << "Failed to load mover " << n << endl; } } // Backgrounds. for (n = 0; n < W_ALL_BACKGROUNDS_NUM; n++) { Boolean val = xvars.load_pixmap(&xdata.backgroundPixmaps[dpyNum][n],NULL,dpyNum, (char**)backgrounds[n].id); if (!val) { cerr << "Failed to load background " << n << endl; } } // Outsides. for (n = 0; n < W_ALL_OUTSIDES_NUM; n++) { Boolean val = xvars.load_pixmap(&xdata.outsidePixmaps[dpyNum][n],NULL,dpyNum, (char**)outsides[n].id); if (!val) { cerr << "Failed to load outside " << n << endl; } } } // for dpyNum xvars.mark_valid(xValid); } void Locator::draw_buffered(CMN_DRAWABLE window,Xvars &xvars, int dpyNum,const Box &room) { // Don't draw if outside the world. if (!world->overlap(room)) { return; } if (!xvars.is_valid(xValid)) { init_x(xvars,IX_INIT,NULL); } // Draw new stuff GLoc gridStart; gridStart.horiz = (int)floor((float)room.loc.c / (float)OL_GRID_COL_MAX) - 1; gridStart.vert = (int)floor((float)room.loc.r / (float)OL_GRID_ROW_MAX) - 1; GLoc gridFinish; gridFinish.horiz = (int)ceil((float)(room.loc.c + room.dim.colMax) / (float) OL_GRID_COL_MAX) + 1; gridFinish.vert = (int)ceil((float)(room.loc.r + room.dim.rowMax) / (float) OL_GRID_ROW_MAX) + 1; GLoc gloc; // Don't need to clease the wasDrawn flag if not using the wasDrawn flag. if (drawingAlgorithm == DRAW_MERGE_AREAS) { // Clear the was_drawn flag for all gridEntries and shadowEntries for (gloc.vert = gridStart.vert; gloc.vert < gridFinish.vert; gloc.vert++) { for (gloc.horiz = gridStart.horiz; gloc.horiz < gridFinish.horiz; gloc.horiz++) if (valid(gloc)) { OLshadowEntry *se = shadows[gloc.vert][gloc.horiz]->get_next(); while (se) { se->set_was_drawn(False); se = se->get_next(); } OLgridEntry *ge = grid[gloc.vert][gloc.horiz]->get_next(); while (ge) { ge->set_was_drawn(False); ge = ge->get_next(); } } } } // DRAW_MERGE_AREAS // Go through all shadows in room. for (gloc.vert = gridStart.vert; gloc.vert < gridFinish.vert; gloc.vert++) { for (gloc.horiz = gridStart.horiz; gloc.horiz < gridFinish.horiz; gloc.horiz++) { if (valid(gloc)) { OLshadowEntry *se = shadows[gloc.vert][gloc.horiz]->get_next(); while (se) { if (!se->get_was_drawn()) { // don't draw if already done. const Area &shadowArea = se->get_area(); // Orphaned shadows must always draw themselves, there // is no OLgridEntry that might take care of them. if (se->get_orphaned()) { // Draw the shadow area. if (drawingAlgorithm == DRAW_MERGE_AREAS) { // Set was_drawn before call to merge_draw_area so // that area doesn't waste time merging with itself. se->set_was_drawn(True); merge_draw_area(window,xvars,dpyNum,room, shadowArea,gloc); } else { draw_area(window,xvars,dpyNum,room,shadowArea,gloc); } } // Not an orphan. Shadow draws self if it doesn't overlap // the current location of the object. else { OLgridEntry *ge = se->get_grid_entry(); // Regular grid entry will draw shadow. if (shadowArea.overlap(ge->get_area())) { se->set_draw_self(False); } // Draw the shadow area. else { se->set_draw_self(True); if (drawingAlgorithm == DRAW_MERGE_AREAS) { se->set_was_drawn(True); merge_draw_area(window,xvars,dpyNum,room, shadowArea,gloc); } else { draw_area(window,xvars,dpyNum,room, shadowArea,gloc); } } } } // se->get_was_drawn() is False. else { // Shadow implicitly took care of drawing itself. se->set_draw_self(True); } se = se->get_next(); } // while se } // valid } // for gloc.horiz } // for gloc.vert // Go through all grid entries in room. for (gloc.vert = gridStart.vert; gloc.vert < gridFinish.vert; gloc.vert++) { for (gloc.horiz = gridStart.horiz; gloc.horiz < gridFinish.horiz; gloc.horiz++) { if (valid(gloc)) { OLgridEntry *ge = grid[gloc.vert][gloc.horiz]->get_next(); while (ge) { OLentry *ent = ge->get_entry(); assert (ent->gloc == gloc); if ((ge->get_mapped() || ge->get_flash())) { OLshadowEntry *se = ge->get_shadow_entry(); const Area &shadowArea = se->get_area(); if (se->draw_self() || se->get_was_drawn() || // Don't try to combine areas if the shadow is // not in the room. // Edge effects taken care of by extra +1 in // looking at grid squares of the room. !shadowArea.overlap(room)) { // At this point we know we don't need to worry about the shadow. if (!ge->get_was_drawn()) { if (drawingAlgorithm == DRAW_MERGE_AREAS) { ge->set_was_drawn(True); merge_draw_area(window,xvars,dpyNum,room, ge->get_area(),gloc); } else { draw_area(window,xvars,dpyNum,room, ge->get_area(),gloc); } } } else if (!ge->get_was_drawn()) { // Need to draw both grid entry and shadow. if (drawingAlgorithm == DRAW_MERGE_AREAS) { ge->set_was_drawn(True); se->set_was_drawn(True); // Try to combine areas of gridEntry and shadow. Area combined = shadowArea.combine(ge->get_area()); Size size = combined.get_size(); if (size.width <= OL_GRID_WIDTH && size.height <= OL_GRID_HEIGHT) { // Draw once, combining areas. merge_draw_area(window,xvars,dpyNum,room, combined,gloc); } else { // Combined area is too big, so draw areas separately. merge_draw_area(window,xvars,dpyNum,room, ge->get_area(),gloc); merge_draw_area(window,xvars,dpyNum,room, shadowArea,gloc); } } else { draw_area(window,xvars,dpyNum,room, shadowArea.combine(ge->get_area()),gloc); } } else { // gridEntry was drawn, but not shadow, so draw shadow here. if (drawingAlgorithm == DRAW_MERGE_AREAS) { se->set_was_drawn(True); merge_draw_area(window,xvars,dpyNum,room, shadowArea, gloc); } else { draw_area(window,xvars,dpyNum,room, shadowArea,gloc); } } } ge = ge->get_next(); } // while ge } // valid } // for gloc.horiz } // for gloc.vert } Drawable Locator::get_scratch_buffer(Pos& pos,Xvars&,int dpyNum) { pos.set_zero(); return xdata.scratchBuffer[dpyNum]; } void Locator::init_x(Xvars &xvars,IXCommand command,void*) { assert(command == IX_INIT); assert(!xvars.is_valid(xValid)); for (int dpyNum = 0; dpyNum < xvars.dpyMax; dpyNum++) { // Floating backbuffer. xdata.buffer[dpyNum] = XCreatePixmap(xvars.dpy[dpyNum],xvars.root[dpyNum], xvars.stretch_x(OL_GRID_COL_MAX * WSQUARE_WIDTH), xvars.stretch_y(OL_GRID_ROW_MAX * WSQUARE_HEIGHT), xvars.depth[dpyNum]); // Scratch buffer, supplied to Physical objects that want to do // drawing tricks. xdata.scratchBuffer[dpyNum] = XCreatePixmap(xvars.dpy[dpyNum],xvars.root[dpyNum], xvars.stretch_x(OL_GRID_COL_MAX * WSQUARE_WIDTH), xvars.stretch_y(OL_GRID_ROW_MAX * WSQUARE_HEIGHT), xvars.depth[dpyNum]); // Tick marks // Much of this code directly from Windows Locator::init_x(), but I don't // see an easy way to share. // // Load base tick bitmaps onto surface. // Also compute max tick size while we're doing a loop anyway. TickType tt; int hp; Size tickMax; // stretched coordinates. tickMax.set_zero(); for (hp = 0; hp < CO_DIR_HALF_PURE; hp++) { tickMax.width = Utils::maximum(tickMax.width,xvars.stretch_x(tickSizes[hp].width)); tickMax.height = Utils::maximum(tickMax.height,xvars.stretch_y(tickSizes[hp].height)); for (tt = 0; tt < TICK_MAX; tt++) { Dir dir = Coord::half_pure_to_pure(hp); if (Transform2D::is_base(dir,NULL)) { assert(tickPixmapBits[tt][hp] != PH_AUTO_GEN); xvars.load_pixmap(&xdata.tickPixmaps[dpyNum][tt][hp], &xdata.tickMasks[dpyNum][tt][hp], dpyNum,(char**)tickPixmapBits[tt][hp]); } } } // For efficiency, only create one scratch surface for doing the // transformations. Pass it into generate_pixmap_from_transform(). Pixmap scratch = XCreatePixmap(xvars.dpy[dpyNum],xvars.root[dpyNum], tickMax.width,tickMax.height, xvars.depth[dpyNum]); Pixmap maskScratch = XCreatePixmap(xvars.dpy[dpyNum],xvars.root[dpyNum], tickMax.width,tickMax.height, 1); // Load auto-generated ticks. for (tt = 0; tt < TICK_MAX; tt++) { for (hp = 0; hp < CO_DIR_HALF_PURE; hp++) { // Need "pure" dire for Transform2D, not Dir dir = Coord::half_pure_to_pure(hp); if (!Transform2D::is_base(dir,NULL)) { assert(tickPixmapBits[tt][hp] == PH_AUTO_GEN); Dir base = Transform2D::get_base(dir,NULL); int baseHP = Coord::pure_to_half_pure(base); int tNum; const TransformType* transforms = Transform2D::get_transforms(tNum,dir,NULL); // Create the empty pixmap. xdata.tickPixmaps[dpyNum][tt][hp] = XCreatePixmap(xvars.dpy[dpyNum],xvars.root[dpyNum], xvars.stretch_x(tickSizes[hp].width), xvars.stretch_y(tickSizes[hp].height), xvars.depth[dpyNum]); // Transform from base pixmap to auto-generated one. xvars.generate_pixmap_from_transform(dpyNum, xdata.tickPixmaps[dpyNum][tt][hp], xdata.tickPixmaps[dpyNum][tt][baseHP], xvars.stretch_size(tickSizes[baseHP]), scratch, transforms,tNum, xvars.depth[dpyNum]); // Create the empty mask. xdata.tickMasks[dpyNum][tt][hp] = XCreatePixmap(xvars.dpy[dpyNum],xvars.root[dpyNum], xvars.stretch_x(tickSizes[hp].width), xvars.stretch_y(tickSizes[hp].height), 1); // Transform from base mask to auto-generated one. xvars.generate_pixmap_from_transform(dpyNum, xdata.tickMasks[dpyNum][tt][hp], xdata.tickMasks[dpyNum][tt][baseHP], xvars.stretch_size(tickSizes[baseHP]), maskScratch, transforms,tNum, 1); } } // hp } // tt // Kill scratch pixmaps. XFreePixmap(xvars.dpy[dpyNum],scratch); XFreePixmap(xvars.dpy[dpyNum],maskScratch); } // dpyNum xvars.mark_valid(xValid); } void Locator::merge_draw_area(Drawable window,Xvars &xvars,int dpyNum, const Box &room,const Area &area, const GLoc &gloc) { // Trivial reject. if (!area.overlap(room)) { return; } Area newArea = area; GLoc check; for (check.horiz = gloc.horiz - 1; check.horiz <= gloc.horiz + 1; check.horiz++) { for (check.vert = gloc.vert - 1; check.vert <= gloc.vert + 1; check.vert++) { if (valid(check)&& possible_overlap(area,check)) { // Try to merge in gridEntries OLgridEntry *checkGe = grid[check.vert][check.horiz]->get_next(); while (checkGe) { if (!checkGe->get_was_drawn() && newArea.overlap(checkGe->get_area())) { // Try to combine areas. Area tryMe = newArea.combine(checkGe->get_area()); Size size = tryMe.get_size(); if (size.width <= OL_GRID_WIDTH && size.height <= OL_GRID_HEIGHT) { // Combine was successful. Rah, rah. checkGe->set_was_drawn(True); newArea = tryMe; // Since we merged in the gridEntry, check the associated // shadow entry as well. OLshadowEntry *se = checkGe->get_shadow_entry(); if (!se->get_was_drawn()) { // Try to combine areas. Area tryMe2 = newArea.combine(se->get_area()); Size size = tryMe2.get_size(); if (size.width <= OL_GRID_WIDTH && size.height <= OL_GRID_HEIGHT) { // Combined the shadow as well. se->set_was_drawn(True); newArea = tryMe2; } } } } checkGe = checkGe->get_next(); } // while (checkGe) // Try to merge in shadowEntries OLshadowEntry *se = shadows[check.vert][check.horiz]->get_next(); while (se) { if (!se->get_was_drawn() && newArea.overlap(se->get_area())) { // Try to combine areas. Area tryMe = newArea.combine(se->get_area()); Size size = tryMe.get_size(); if (size.width <= OL_GRID_WIDTH && size.height <= OL_GRID_HEIGHT) { // Combine was successful. Rah, rah. se->set_was_drawn(True); newArea = tryMe; // Since we merged in the shadow, check the associated grid // entry as well. if (!se->get_orphaned()) { // else no entry to check. OLgridEntry *ge = se->get_grid_entry(); if (!ge->get_was_drawn()) { // Try to combine areas. Area tryMe2 = newArea.combine(ge->get_area()); Size size = tryMe2.get_size(); if (size.width <= OL_GRID_WIDTH && size.height <= OL_GRID_HEIGHT) { // Combined the shadow's gridEntry as well. ge->set_was_drawn(True); newArea = tryMe2; } } } } } se = se->get_next(); } // while (se) } // if valid } // for } // for // Do actual drawing on merged area. draw_area(window,xvars,dpyNum,room,newArea,compute_gloc(newArea)); } void Locator::draw_area(Drawable window,Xvars &xvars,int dpyNum, const Box &room,const Area &area,const GLoc &gloc) { ///// Unnecessary since all calls come from merge_draw_area which already ///// does this, and areas don't get smaller. // Trivial reject. if (drawingAlgorithm != DRAW_MERGE_AREAS) { if (!area.overlap(room)) return; } // reduceDraw is always False for X // // If we are using Locator::draw_area, we are not doing smooth scrolling. // So we don't use the the background3D effect. // Locator::draw_directly() doesn't use Locator::draw_area(). world->draw(xdata.buffer[dpyNum],xvars,dpyNum,area,False,False); // Iterate over grid squares + and - 1 in both directions. GLoc start,finish; start.horiz = gloc.horiz - 1; start.vert = gloc.vert - 1; finish.horiz = gloc.horiz + 2; finish.vert = gloc.vert + 2; // Avoid double drawing composite objects. clear_already_drawn_flag(start,finish); for (int dLevel = 0; dLevel < DRAWING_LEVELS; dLevel++) { GLoc check; for (check.horiz = start.horiz; check.horiz < finish.horiz; check.horiz++) { for (check.vert = start.vert; check.vert < finish.vert; check.vert++) { if (valid(check) && possible_overlap(area,check)) { OLgridEntry *checkGe = grid[check.vert][check.horiz]->get_next(); while (checkGe) { if ((checkGe->get_drawing_level() == dLevel) && (checkGe->get_flash() || checkGe->get_mapped())) { PhysicalP checkP = checkGe->get_physical(); const Area &checkArea = checkP->get_area(); if (checkArea.overlap(area)) { draw_chain(xdata.buffer[dpyNum],xvars,dpyNum,area,checkP); } } checkGe = checkGe->get_next(); } // while } // if } // for vert } // for horiz } // for dLevel Pos pos; Size size; area.get_rect(pos,size); // Copy the backbuffer section onto the actual window. XCopyArea(xvars.dpy[dpyNum],xdata.buffer[dpyNum],window,xvars.gc[dpyNum], 0,0, xvars.stretch_x(size.width), xvars.stretch_y(size.height), xvars.stretch_x(pos.x - room.loc.c * WSQUARE_WIDTH), xvars.stretch_x(pos.y - room.loc.r * WSQUARE_HEIGHT)); // For debugging, if the -draw_rects argument was passed in. if (drawRects) { XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],xvars.red[dpyNum]); XDrawRectangle(xvars.dpy[dpyNum],window,xvars.gc[dpyNum], xvars.stretch_x(pos.x - room.loc.c * WSQUARE_WIDTH), xvars.stretch_y(pos.y - room.loc.r * WSQUARE_HEIGHT), xvars.stretch_x(size.width) - 1, xvars.stretch_y(size.height) - 1); XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],xvars.black[dpyNum]); } } Boolean Locator::draw_tick(TickType tt,CMN_DRAWABLE window,Xvars &xvars, int dpyNum, const Size &windowSize, Dir tickDir,int offset) { if (!xvars.is_valid(xValid)) { init_x(xvars,IX_INIT,NULL); } int hp = Coord::pure_to_half_pure(tickDir); // Stretched coordinates. Pos destPos; Size tSize = xvars.stretch_size(tickSizes[hp]); // Set X coordinate of destPos. switch (tickDir) { case CO_R: case CO_DN_R: case CO_UP_R: destPos.x = windowSize.width - tSize.width; break; case CO_DN: case CO_UP: destPos.x = offset - (tSize.width >> 1); break; case CO_DN_L: case CO_L: case CO_UP_L: destPos.x = 0; break; default: assert(0); } // Set Y coordinate of destPos. switch (tickDir) { case CO_R: case CO_L: destPos.y = offset - (tSize.height >> 1); break; case CO_DN_R: case CO_DN: case CO_DN_L: destPos.y = windowSize.height - tSize.height; break; case CO_UP_L: case CO_UP: case CO_UP_R: destPos.y = 0; break; default: assert(0); } // Copy tick onto surface. XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum], xdata.tickMasks[dpyNum][tt][hp]); XSetClipOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum], destPos.x,destPos.y); XCopyArea(xvars.dpy[dpyNum],xdata.tickPixmaps[dpyNum][tt][hp], window,xvars.gc[dpyNum],0,0, xvars.stretch_x(tickSizes[hp].width), xvars.stretch_y(tickSizes[hp].height), destPos.x,destPos.y); // Restore gc to initial state. XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum],None); XSetClipOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum],0,0); return True; } void Fire::init_x(Xvars &xvars,IXCommand command,void*) { assert(!xvars.is_valid(xdata.valid)); assert(command == IX_INIT); int dpyNum; for (dpyNum = 0; dpyNum < xvars.dpyMax; dpyNum++) { Boolean val = xvars.load_pixmap(&xdata.pixmap[dpyNum], &xdata.mask[dpyNum], dpyNum,(char**)fireBits); if (!val) { cerr << "Failed to load fire graphics." << endl; } } xvars.mark_valid(xdata.valid); } // Draw functions for Physcial. void Protection::draw(Drawable buffer,Xvars &xvars,int dpyNum, const Area &bufArea) { if (!xvars.is_valid(pXdata->valid)) { init_x(xvars,IX_INIT,NULL,*prc,*pXdata); } Pos pos; Size size; area.get_rect(pos,size); Size offset = area - bufArea; XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],pXdata->color[dpyNum]); XDrawRectangle(xvars.dpy[dpyNum],buffer,xvars.gc[dpyNum], xvars.stretch_x(offset.width), xvars.stretch_y(offset.height), xvars.stretch_x(size.width - 1), xvars.stretch_y(size.height - 1)); XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],xvars.black[dpyNum]); } void Moving::draw(Drawable buffer,Xvars &xvars,int dpyNum, const Area &bufArea) { // Initialize X variables if necessary. if (!xvars.is_valid(movingXdata->valid)) { init_x(xvars,IX_INIT,NULL,*mc,*movingXdata); } Pos pos; Size size; area.get_rect(pos,size); Size offset = area - bufArea; Pixmap scratch; if (is_invisible()) { LocatorP locator = get_locator(); Pos dummy; scratch = locator->get_scratch_buffer(dummy,xvars,dpyNum); // Which way to distort the image. // We will draw the image twice to get the wrap-around. // Copy portion of area into scratch buffer. XCopyArea(xvars.dpy[dpyNum],buffer,scratch,xvars.gc[dpyNum], xvars.stretch_x(offset.width), xvars.stretch_y(offset.height), xvars.stretch_x(size.width), xvars.stretch_y(size.height), xvars.stretch_x(0), xvars.stretch_y(size.height - 3)); XCopyArea(xvars.dpy[dpyNum],buffer,scratch,xvars.gc[dpyNum], xvars.stretch_x(offset.width), xvars.stretch_y(offset.height), xvars.stretch_x(size.width), xvars.stretch_y(size.height), xvars.stretch_x(0), xvars.stretch_y(-3)); } CMN_IMAGEDATA imageData; get_pixmap_mask(xvars,dpyNum,imageData,dir,movingAnimNum); Pixmap pixmap = imageData.pixmap; Pixmap mask = imageData.mask; XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum],mask); XSetClipOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.stretch_x(offset.width), xvars.stretch_y(offset.height)); Drawable srcPix; if (is_invisible()) { // Draw from the scratch surface. srcPix = scratch; } else { // Use supplied pixmap. srcPix = pixmap; } XCopyArea(xvars.dpy[dpyNum],srcPix, buffer,xvars.gc[dpyNum],0,0, xvars.stretch_x(size.width), xvars.stretch_y(size.height), xvars.stretch_x(offset.width), xvars.stretch_y(offset.height)); // Restore gc to initial state. XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum],None); XSetClipOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum],0,0); // Haven't fixed this for stretching yet. #if 0 ColorNum colorNum; if (draw_outline(colorNum) && // Don't draw for XPM images. !mc->useXPM ) { XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.humanColors[dpyNum][colorNum]); XPoint points[12]; points[0].x = offset.width; points[0].y = offset.height; points[1].x = offset.width + 1; points[1].y = offset.height; points[2].x = offset.width; points[2].y = offset.height + 1; points[3].x = offset.width + size.width - 1; points[3].y = offset.height; points[4].x = offset.width + size.width - 2; points[4].y = offset.height; points[5].x = offset.width + size.width - 1; points[5].y = offset.height + 1; points[6].x = offset.width; points[6].y = offset.height + size.height - 1; points[7].x = offset.width; points[7].y = offset.height + size.height - 2; points[8].x = offset.width + 1; points[8].y = offset.height + size.height - 1; points[9].x = offset.width + size.width - 1; points[9].y = offset.height + size.height - 1; points[10].x = offset.width + size.width - 2; points[10].y = offset.height + size.height - 1; points[11].x = offset.width + size.width - 1; points[11].y = offset.height + size.height - 2; XDrawPoints(xvars.dpy[dpyNum],buffer,xvars.gc[dpyNum],points, 12,CoordModeOrigin); XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.black[dpyNum]); } #endif } void Moving::get_pixmap_mask(Xvars &,int dpyNum,CMN_IMAGEDATA &imageData, Dir dir,int animNum) { imageData.pixmap = movingXdata->pixmaps[dpyNum][dir][animNum]; imageData.mask = movingXdata->masks[dpyNum][dir][animNum]; } // Draw functions for Actual void Explosion::draw(Drawable buffer,Xvars &xvars,int dpyNum, const Area &bufArea) { Pos pos; Size size; area.get_rect(pos,size); Size offset = area - bufArea; XFillArc(xvars.dpy[dpyNum],buffer,xvars.gc[dpyNum], xvars.stretch_x(offset.width), xvars.stretch_y(offset.height), xvars.stretch_x(size.width), xvars.stretch_y(size.height), 0,23040); } void Fire::draw(Drawable buffer,Xvars &xvars,int dpyNum, const Area &bufArea) { // Initialize X variables if necessary. if (!xvars.is_valid(xdata.valid)) { init_x(xvars,IX_INIT,NULL); } const Area &area = get_area(); Pos pos; Size size; area.get_rect(pos,size); Size offset = area - bufArea; Size sizeMax = Fire::get_size_max(); // Grab a random part of the source bitmap. // World coordinates. Pos srcPos(Utils::choose(sizeMax.width - size.width + 1), Utils::choose(sizeMax.height - size.height + 1)); XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum],xdata.mask[dpyNum]); XSetClipOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.stretch_x(offset.width), xvars.stretch_y(offset.height)); XCopyArea(xvars.dpy[dpyNum],xdata.pixmap[dpyNum],buffer, xvars.gc[dpyNum], xvars.stretch_x(srcPos.x),xvars.stretch_y(srcPos.y), xvars.stretch_x(size.width),xvars.stretch_y(size.height), xvars.stretch_x(offset.width),xvars.stretch_y(offset.height)); // Restore gc to initial state. XSetClipMask(xvars.dpy[dpyNum],xvars.gc[dpyNum],None); XSetClipOrigin(xvars.dpy[dpyNum],xvars.gc[dpyNum],0,0); #if 0 XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],xvars.red[dpyNum]); XFillArc(xvars.dpy[dpyNum],buffer,xvars.gc[dpyNum], xvars.stretch_x(offset.width), xvars.stretch_y(offset.height), xvars.stretch_x(size.width), xvars.stretch_y(size.height), 0,23040); XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],xvars.black[dpyNum]); #endif } void Protection::init_x(Xvars &xvars,IXCommand,void*, const ProtectionContext &prc, ProtectionXdata &pXdata) { assert(!xvars.is_valid(pXdata.valid)); for (int dpyNum = 0; dpyNum < xvars.dpyMax; dpyNum++) { pXdata.color[dpyNum] = xvars.alloc_named_color(dpyNum,prc.colorName,xvars.black[dpyNum]); } xvars.mark_valid(pXdata.valid); } void Moving::init_x(Xvars &xvars,IXCommand command,void*, const MovingContext &mc,MovingXdata &movingXdata) { assert(!xvars.is_valid(movingXdata.valid)); assert(command == IX_INIT); // Load all non-autogenerated bitmaps. // This should load ALL the base bitmaps. int dpyNum; for (dpyNum = 0; dpyNum < xvars.dpyMax; dpyNum++) { for (int n = 0; n < CO_DIR_MAX; n++) { if (mc.animMax[n] == 0 || mc.pixmapBits[n][0] == PH_AUTO_GEN) { continue; } for (int m = 0; m < mc.animMax[n]; m++) { assert(mc.useXPM); // Load an XPM image Boolean val = xvars.load_pixmap(&movingXdata.pixmaps[dpyNum][n][m], &movingXdata.masks[dpyNum][n][m], dpyNum,(char**)mc.pixmapBits[n][m]); if (!val) { cerr << "load_pixmap() failed for " << mc.physicalContext.className << " dir=" << n << " animNum=" << m << endl; } } // for m } // for n } // for dpyNum // Auto generate the PH_AUTO_GEN pixmaps and masks. for (dpyNum = 0; dpyNum < xvars.dpyMax; dpyNum++) { // For efficiency, only create one scratch surface for doing the // transformations. Pass it into generate_pixmap_from_transform(). Pixmap scratch = XCreatePixmap(xvars.dpy[dpyNum],xvars.root[dpyNum], xvars.stretch_x(mc.physicalContext.sizeMax.width), xvars.stretch_y(mc.physicalContext.sizeMax.height), xvars.depth[dpyNum]); Pixmap maskScratch = XCreatePixmap(xvars.dpy[dpyNum],xvars.root[dpyNum], xvars.stretch_x(mc.physicalContext.sizeMax.width), xvars.stretch_y(mc.physicalContext.sizeMax.height), 1); // Loop over all dirs. for (int n = 0; n < CO_DIR_MAX; n++) { if (mc.animMax[n] == 0 || mc.pixmapBits[n][0] != PH_AUTO_GEN) { continue; } // Lookup the necessary transformations. Dir base = Transform2D::get_base(n,mc.transformOverride); int tNum; const TransformType* transforms = Transform2D::get_transforms(tNum,n,mc.transformOverride); // Loop over all animation frames. for (int m = 0; m < mc.animMax[n]; m++) { // Create the empty pixmap. movingXdata.pixmaps[dpyNum][n][m] = XCreatePixmap(xvars.dpy[dpyNum],xvars.root[dpyNum], xvars.stretch_x(mc.sizes[n].width), xvars.stretch_y(mc.sizes[n].height), xvars.depth[dpyNum]); // Transform from base pixmap to auto-generated one. xvars.generate_pixmap_from_transform(dpyNum, movingXdata.pixmaps[dpyNum][n][m], movingXdata.pixmaps[dpyNum][base][m], xvars.stretch_size(mc.sizes[base]), scratch, transforms,tNum, xvars.depth[dpyNum]); // Create the empty mask. movingXdata.masks[dpyNum][n][m] = XCreatePixmap(xvars.dpy[dpyNum],xvars.root[dpyNum], xvars.stretch_x(mc.sizes[n].width), xvars.stretch_y(mc.sizes[n].height), 1); // Transform from base mask to auto-generated one. xvars.generate_pixmap_from_transform(dpyNum, movingXdata.masks[dpyNum][n][m], movingXdata.masks[dpyNum][base][m], xvars.stretch_size(mc.sizes[base]), maskScratch, transforms,tNum, 1); } // for m } // for n // Kill scratch pixmaps. XFreePixmap(xvars.dpy[dpyNum],scratch); XFreePixmap(xvars.dpy[dpyNum],maskScratch); } // for dpyNum xvars.mark_valid(movingXdata.valid); } xevil-2.02r2.orig/x11/l_agreement_dlg.cpp0100644000175000017500000004063407041422250017532 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "l_agreement_dlg.cpp" // No corresponding header file, the only entry point is through // LAgreement::check_accpted(). #include "utils.h" extern "C" { #include #include } #include #include "xdata.h" #include "panel.h" #include "l_agreement.h" #define PREV_LABEL "Prev" #define NEXT_LABEL "Next" #define ACCEPT_LABEL "Accept" #define REJECT_LABEL "Reject" class LAgreementDlg { public: enum { ACCEPTED,REJECTED,UNDECIDED, }; LAgreementDlg(Xvars &,int dpyNum,int argc,char** argv, Boolean lgViewportVal,Boolean smoothScrollVal, Boolean reduceDrawVal); ~LAgreementDlg(); void process_event(int dpyNum,XEvent *event); int get_status() {return status;} /* EFFECTS: Return ACCEPTED, REJECTED or ,UNDECIDED. */ Boolean get_large_viewport() {return optionToggles[LARGE_VIEWPORT]->get_value();} /* EFFECTS: Return whether we should use large viewports for XEvil. */ Boolean get_smooth_scroll() {return optionToggles[SMOOTH_SCROLL]->get_value();} Boolean get_reduce_draw() {return !optionToggles[DRAW_BACKGROUNDS]->get_value();} /* NOTE: The opposite of DRAW_BACKGROUNDS. */ private: enum {SHAREWARE_1,PREV,NEXT,ACCEPT,REJECT,SHAREWARE_2,BUTTONS_MAX}; enum {LARGE_VIEWPORT,SMOOTH_SCROLL,DRAW_BACKGROUNDS,OPTIONS_MAX}; static const char* buttonLabels[BUTTONS_MAX]; static const char* optionToggleLabels[OPTIONS_MAX]; static const char* optionTextText[OPTIONS_MAX]; enum { TEXT_PADDING = 3, BUTTON_VERT_PADDING = 6, OPTION_HORIZ_PADDING = 8, BUTTONS_EDGE_PADDING = 10, // On outside edges. }; void check_viewed_before(); /* EFFECTS: Check for an .xevilrc Sets viewedBefore and rcFilename. */ void mark_as_viewed(); /* EFFECTS: Create a .xevilrc to mark that the user has viewed the dialog at least once. */ void redraw(); void parse(const char*); void compute_button_pos(Pos buttonPos[BUTTONS_MAX], Size buttonSizes[BUTTONS_MAX], int widthMax, int top); /* MODIFIES: buttonPos */ /* EFFECTS: Compute the location of all the "buttons" including the shareware labels. widthMax is the available space. top is the very top of the buttons. */ static void button_callback(Panel*,void*,void*); void _button_callback(Panel*); Boolean get_button_sensitive(int); Xvars* xvars; int separatorY_1; int separatorY_2; int dpyNum; int status; // Little hack here, not all LAgreementDlg::buttons are really buttons, // also used for the obnoxious "SHAREWARE" labels. TextPanel* buttons[BUTTONS_MAX]; PtrList pages; int currentPage; Size windowSize; Size fontSize; Window window; TogglePanel* optionToggles[OPTIONS_MAX]; TextPanel* optionText[OPTIONS_MAX]; // Has the User already seen the license agreement dialog in some // previous use of XEvil. Boolean viewedBefore; // The absolute filename of the .xevilrc file. char* rcFilename; }; // This method is way too big, split it up a bit. LAgreementDlg::LAgreementDlg(Xvars &x_vars,int dpy_num,int argc,char** argv, Boolean lgViewportVal,Boolean smoothScrollVal, Boolean reduceDrawVal) { xvars = &x_vars; dpyNum = dpy_num; status = UNDECIDED; // User hasn't said yes or no yet. // Initialize this up at the top, so we get the right button states. currentPage = 0; // Create content model, the list of pages. parse(LAgreement::get_text()); // We should really just put this in Xvars. fontSize = xvars->fontSize[dpyNum]; // Compute sizes for the buttons. Size buttonSizes[BUTTONS_MAX]; int n; for (n = 0; n < BUTTONS_MAX; n++) { buttonSizes[n] = TextPanel::get_unit(xvars->font[dpyNum], Utils::strlen(buttonLabels[n])); } // Just used for the height, for two rows. Size optionTextUnit = TextPanel::get_unit(xvars->font[dpyNum],1,2); // Create window windowSize.width = fontSize.width * Line::get_text_columns() + 2 * TEXT_PADDING; windowSize.height = fontSize.height * Page::get_text_rows() + 2 * TEXT_PADDING // around the text in the main area + 1 // separator + (OPTIONS_MAX + 1) * TEXT_PADDING + OPTIONS_MAX * optionTextUnit.height + 1 // separator + 2 * BUTTON_VERT_PADDING + buttonSizes[0].height; window = xvars->create_toplevel_window(argc,argv,dpyNum,windowSize, "XEvil License Agreement",ExposureMask); // Compute location of the top separator line. separatorY_1 = fontSize.height * Page::get_text_rows() + 2 * TEXT_PADDING; // Compute max width of the option buttons. int optionsMaxWidth = 0; for (n = 0; n < OPTIONS_MAX; n++) { Size opSize = TogglePanel::get_unit(xvars->font[dpyNum], Utils::strlen(optionToggleLabels[n]),1); optionsMaxWidth = Utils::maximum(optionsMaxWidth,opSize.width); } // Now create the toggle buttons and corresponding text. Pos optionPos(OPTION_HORIZ_PADDING,separatorY_1 + 1 + TEXT_PADDING); for (n = 0; n < OPTIONS_MAX; n++) { // Create toggle button. Size optionToggleUnit = TogglePanel::get_unit(xvars->font[dpyNum], strlen(optionToggleLabels[n]),1); Pos togglePos(OPTION_HORIZ_PADDING, optionPos.y + optionTextUnit.height / 2 - optionToggleUnit.height / 2); optionToggles[n] = new TogglePanel(dpyNum,*xvars,window, togglePos,optionToggleUnit, // Don't care about callback. We will poll result when // dialog is popped down. NULL,NULL, optionToggleLabels[n]); assert(optionToggles[n]); // Create text for toggle button. Pos textPos(2 * OPTION_HORIZ_PADDING + optionsMaxWidth, optionPos.y); Size textUnit = TextPanel::get_unit(xvars->font[dpyNum],strlen(optionTextText[n]),2); optionText[n] = new TextPanel(dpyNum,*xvars,window, textPos,textUnit, NULL,NULL, optionTextText[n], // Don't want a border. TEXT_PANEL_EVENT_MASK,False); assert(optionText[n]); optionPos.y += optionTextUnit.height; } // Set initial values optionToggles[LARGE_VIEWPORT]->set_value(lgViewportVal); optionToggles[SMOOTH_SCROLL]->set_value(smoothScrollVal); optionToggles[DRAW_BACKGROUNDS]->set_value(!reduceDrawVal); // Location of the bottom separator line. separatorY_2 = separatorY_1 + 1 + (OPTIONS_MAX + 1) * TEXT_PADDING + OPTIONS_MAX * optionTextUnit.height; // Before creating the buttons. // Sets initial value of viewedBefore. check_viewed_before(); // Figure out where to place the buttons. Pos buttonPos[BUTTONS_MAX]; compute_button_pos(buttonPos,buttonSizes, windowSize.width, separatorY_2 + 1 + BUTTON_VERT_PADDING); // Create the buttons for (n = 0; n < BUTTONS_MAX; n++) { // Shareware labels. if (n == SHAREWARE_1 || n == SHAREWARE_2) { buttons[n] = new TextPanel(dpyNum,*xvars,window, buttonPos[n],buttonSizes[n], NULL,NULL,buttonLabels[n], TEXT_PANEL_EVENT_MASK, False); } // Normal buttons. else { buttons[n] = new ButtonPanel(dpyNum,*xvars,window, buttonPos[n],buttonSizes[n], button_callback,(void*)this, buttonLabels[n]); } assert(buttons[n]); buttons[n]->set_sensitive(get_button_sensitive(n)); } // Pop up the window. XMapWindow(xvars->dpy[dpyNum],window); } LAgreementDlg::~LAgreementDlg() { Utils::freeif(rcFilename); int n; for (n = 0; n < BUTTONS_MAX; n++) { delete buttons[n]; } for (n = 0; n < OPTIONS_MAX; n++) { delete optionToggles[n]; delete optionText[n]; } XDestroyWindow(xvars->dpy[dpyNum],window); for (n = 0; n < pages.length(); n++) { delete (Page*)pages.get(n); } } void LAgreementDlg::process_event(int dpyNum,XEvent *event) { // Received WM_DELETE_WINDOW. if (event->type == ClientMessage && event->xclient.format == 32 && event->xclient.data.l[0] == xvars->wmDeleteWindow[dpyNum] && event->xany.window == window) { status = REJECTED; } // Get expose, window close, and delegate to children if (event->type == Expose && event->xexpose.window == window) { redraw(); return; } // See if the toggle buttons or toggle labels want it. int n; for (n = 0; n < OPTIONS_MAX; n++) { if (optionToggles[n]->process_event(dpyNum,event)) { return; } if (optionText[n]->process_event(dpyNum,event)) { return; } } // Give event to first button that wants it. for (n = 0; n < BUTTONS_MAX; n++) { if (buttons[n]->process_event(dpyNum,event)) { return; } } } void LAgreementDlg::check_viewed_before() { // Now that XEvil is GPL, we don't force the user to page through the // license agreement the first time XEvil is run, i.e. no more .xevilrc. viewedBefore = True; rcFilename = NULL; #if 0 const char* home = Utils::getenv("HOME"); if (!home || !*home) { viewedBefore = False; rcFilename = NULL; return; } ostrstream str; str << home; if (home[strlen(home)-1] != '/') { str << "/"; } str << ".xevilrc" << ends; // Keep rcFilename around even if the file doesn't exist yet. rcFilename = str.str(); FILE* fp = fopen(rcFilename,"r"); if (!fp) { viewedBefore = False; return; } else { viewedBefore = True; fclose(fp); } #endif } void LAgreementDlg::mark_as_viewed() { if (rcFilename) { FILE* fp = fopen(rcFilename,"w"); if (fp) { fprintf(fp,"XEvil is your friend. Trust XEvil.\n"); fclose(fp); } } // else HOME env variable is not available, so give up. } void LAgreementDlg::redraw() { XClearWindow(xvars->dpy[dpyNum],window); // Loop over all lines on current page. Page* page = (Page*)pages.get(currentPage); const PtrList& lines = page->get_lines(); for (int n = 0; n < lines.length(); n++) { int length; const char* text = ((Line*)lines.get(n))->get_text(length); if (length > 0) { XDrawString(xvars->dpy[dpyNum],window,xvars->gc[dpyNum], TEXT_PADDING, TEXT_PADDING + xvars->font[dpyNum]->max_bounds.ascent + fontSize.height * n, text,length); } } // Draw separators. XDrawLine(xvars->dpy[dpyNum],window,xvars->gc[dpyNum], 0,separatorY_1,windowSize.width - 1,separatorY_1); XDrawLine(xvars->dpy[dpyNum],window,xvars->gc[dpyNum], 0,separatorY_2,windowSize.width - 1,separatorY_2); // Buttons will redraw themselves. } void LAgreementDlg::parse(const char *text) { const char *p = text; Line::set_text_columns(70); Page::set_text_rows(24); while (*p) { Page* page = new Page(&p,p); pages.add(page); } } void LAgreementDlg::compute_button_pos(Pos buttonPos[BUTTONS_MAX], Size buttonSizes[BUTTONS_MAX], int widthMax, int top) { buttonPos[SHAREWARE_1].x = BUTTONS_EDGE_PADDING; buttonPos[SHAREWARE_1].y = top; buttonPos[SHAREWARE_2].x = widthMax - BUTTONS_EDGE_PADDING - buttonSizes[SHAREWARE_2].width; buttonPos[SHAREWARE_2].y = top; int bWidth = widthMax - 2 * BUTTONS_EDGE_PADDING - buttonSizes[SHAREWARE_1].width - buttonSizes[SHAREWARE_2].width; for (int n = SHAREWARE_1 + 1; n < SHAREWARE_2; n++) { buttonPos[n].x = buttonPos[SHAREWARE_1].x + buttonSizes[SHAREWARE_1].width + (int)((float)n / (float)(BUTTONS_MAX - 1) * (float)bWidth) - (buttonSizes[n].width / 2); buttonPos[n].y = top; } #if 0 Pos pos((int)((n + 1.0f) / (float)(BUTTONS_MAX + 1) * windowSize.width) - (buttonSizes[n].width / 2), ); #endif } void LAgreementDlg::button_callback(Panel* panel,void*,void* closure) { LAgreementDlg* dlg = (LAgreementDlg*)closure; dlg->_button_callback(panel); } void LAgreementDlg::_button_callback(Panel* panel) { // Which button was pressed. Search through four buttons, big deal. int button; for (button = 0; button < BUTTONS_MAX; button++) { if (buttons[button] == panel) { break; } } assert(button < BUTTONS_MAX); switch (button) { case PREV: assert(currentPage > 0); currentPage--; break; case NEXT: assert(currentPage < pages.length() - 1); currentPage++; break; case ACCEPT: // So user won't have to click through it again. mark_as_viewed(); status = ACCEPTED; // Don't bother with a redraw. return; case REJECT: status = REJECTED; // Don't bother with a redraw. return; default: assert(0); } // Update whether buttons are sensitive or not. for (int n = 0; n < BUTTONS_MAX; n++) { buttons[n]->set_sensitive(get_button_sensitive(n)); } redraw(); } Boolean LAgreementDlg::get_button_sensitive(int button) { switch (button) { case PREV: // If not the first page. return currentPage > 0; case NEXT: // If not the last page. return currentPage < pages.length() - 1; case ACCEPT: case REJECT: // If the last page or if user has already seen the dialog at least // once. return viewedBefore || (currentPage == pages.length() - 1); case SHAREWARE_1: case SHAREWARE_2: return True; default: assert(0); return False; } } // Don't write "SHAREWARE". XEvil is now GPL. const char* LAgreementDlg::buttonLabels[BUTTONS_MAX] = { "_", // "SHAREWARE", "Prev", "Next", "Accept", "Reject", "_", // "SHAREWARE", }; const char* LAgreementDlg::optionToggleLabels[OPTIONS_MAX] = { "Large Viewport", "Smooth Scroll", "Draw Background", }; const char* LAgreementDlg::optionTextText[OPTIONS_MAX] = { "Unselect [Large Viewport] to speed up drawing,\n" "or to play two-player on one machine.", "Use [Smooth Scroll] if you have a machine\n" "with fast graphics.", "Only meaningful for smooth scroll.\n" "Unselect [Draw Background] to speed up drawing." }; Boolean LAgreement::check_accepted(Boolean& largeViewport, Boolean& smoothScroll, Boolean& reduceDraw, Xvars &xvars, int dpyNum, int argc,char** argv) { // User ran "xevil -accept_agreement". if (commLineAccepted) { return True; } LAgreementDlg dlg(xvars,dpyNum,argc,argv, largeViewport,smoothScroll,reduceDraw); // Run the dialog modally until the user chooses one way or the other. while (1) { // Grab X events. XEvent event; XNextEvent(xvars.dpy[dpyNum],&event); // Let the dialog handle it, return if a decision has been made. dlg.process_event(dpyNum,&event); int val = dlg.get_status(); // Poll value of the option toggle buttons. largeViewport = dlg.get_large_viewport(); smoothScroll = dlg.get_smooth_scroll(); reduceDraw = dlg.get_reduce_draw(); if (val == LAgreementDlg::REJECTED) { return False; } else if (val == LAgreementDlg::ACCEPTED) { return True; } } // LAgreementDlg destructor will pop down window. } xevil-2.02r2.orig/x11/main.cpp0100644000175000017500000000623407637236576015375 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "main.cpp" // Include Files #include "utils.h" extern "C" { #include #ifdef OPENWOUND_XOS_STRLEN_HACK #define _strings_h #endif #include } #include #include "utils.h" #include "neth.h" #include "game.h" class TurnStarter: public ITurnStarter { public: TurnStarter(struct timeval *timer) : m_timer(timer) { } /* EFFECTS: Set timer to be the start time for the turn when startTurn() is called. */ virtual void start_turn() { if (gettimeofday(m_timer,NULL) != 0) { cerr << "Error with gettimeofday()." << endl; } } private: struct timeval *m_timer; }; // main's job is very simple. // Create the Game, then run the outer loop, one iteration per turn. // Empty the event queue and feed it to Game every turn. int main(int argc, char **argv) { Utils::seed_random(); GameP game = new Game(&argc,argv); // assert (clock() != -1); long total = 0; long events = 0; // TurnStarter exists so Game::yield() can decide when to start timing // the next turn. struct timeval startTime; TurnStarter turnStarter(&startTime); // Start the first turn. turnStarter.start_turn(); while (True) { Quanta quanta = game->get_quanta(); // Clock the game total++; game->pre_clock(); if (game->has_ui()) { for (int dpyNum = 0; dpyNum < game->get_dpy_max(); dpyNum++) { int eventsNum; if (eventsNum = XEventsQueued(game->get_dpy(dpyNum),QueuedAfterReading)) for (int m = 0; m < eventsNum; m++) { XEvent event; XNextEvent(game->get_dpy(dpyNum),&event); game->process_event(dpyNum,&event); events++; } } } game->post_clock(); if (game->show_stats() && !(total % Game::REPORT_TIME)) cout << "total:" << total << " events:" << events << " percent:" << ((float)events / (float) total) << endl; // This should be the only place exit() is called. // (But it isn't, ui.cpp calls if license agreement is rejected // and game.cpp calls if "xevil -info".) if (game->quit_game()) { delete game; exit(1); } // Let game decide how to throw time away. game->yield(startTime,quanta,&turnStarter); } // Never gets here. return 0; } xevil-2.02r2.orig/x11/panel.cpp0100644000175000017500000003164707637236444015550 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "panel.cpp" #ifndef NO_PRAGMAS #pragma implementation "panel.h" #endif #include "utils.h" extern "C" { #include #include } #include #include #include "utils.h" #include "xdata.h" #include "panel.h" #define PANEL_BORDER 1 #define PANEL_MARGAIN 2 #define PANEL_BG_COLOR Xvars_WINDOW_BG_COLOR #define KEYSYM_BUFFER 10 Panel::Panel(int dpy_num,const Xvars &x_vars,Window parent, const Pos &p,const Size &s, PanelCallback cb,void* clsre, unsigned int eventMask, Boolean border) : xvars(x_vars), callback(cb), closure(clsre) { dpyNum = dpy_num; foreground = xvars.black[dpyNum]; background = xvars.alloc_named_color(dpyNum,PANEL_BG_COLOR); int borderWidth = (border ? PANEL_BORDER : 0); size.width = s.width - 2 * borderWidth; size.height = s.height - 2 * borderWidth; window = XCreateSimpleWindow(xvars.dpy[dpyNum],parent,p.x,p.y, size.width,size.height,borderWidth, xvars.windowBorder[dpyNum], xvars.alloc_named_color(dpyNum,PANEL_BG_COLOR)); XSelectInput(xvars.dpy[dpyNum],window,eventMask); XMapWindow(xvars.dpy[dpyNum],window); } Panel::~Panel() { XDestroyWindow(xvars.dpy[dpyNum],window); } void Panel::set_foreground(Pixel c,Boolean re_draw) { foreground = c; if (re_draw) { redraw(); } } void Panel::set_background(Pixel c,Boolean re_draw) { background = c; if (re_draw) { redraw(); } } Boolean Panel::process_event(int dpy_num,XEvent *event) { assert(dpyNum == dpy_num); if (event->type == Expose && event->xexpose.window == get_window()) { redraw(); return True; } return False; } TextPanel::TextPanel(int dpy_num,const Xvars &xv,Window parent, const Pos &p,const Size &s, PanelCallback callback,void* closure, const char *msg, unsigned int eventMask, Boolean border) : Panel(dpy_num,xv,parent,p,s,callback,closure,eventMask,border) { if (msg != NULL) { assert(strlen(msg) < PANEL_STRING_LENGTH); strcpy(message,msg); } else { strcpy(message,""); } sensitive = True; } void TextPanel::set_message(const char *msg) { assert(msg); if (strlen(msg) >= PANEL_STRING_LENGTH) { strncpy(message,msg,PANEL_STRING_LENGTH - 1); } else { strcpy(message,msg); } redraw(); } Size TextPanel::get_unit(XFontStruct *font,int cols,int rows) { Size fontSize; fontSize.width = font->max_bounds.width; fontSize.height = font->max_bounds.ascent + font->max_bounds.descent; Size ret; ret.width = fontSize.width * cols + 2 * PANEL_BORDER + 2 * PANEL_MARGAIN; ret.height = fontSize.height * rows + 2 * PANEL_BORDER + 2 * PANEL_MARGAIN; return ret; } void TextPanel::redraw() { Size size = get_size(); const Xvars &xvars = get_xvars(); int dpyNum = get_dpy_num(); XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],get_background()); XFillRectangle(xvars.dpy[dpyNum],get_window(),xvars.gc[dpyNum],0,0, size.width,size.height); XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],get_foreground()); // Draw text, line by line. char *start = message; char *current = message; int lineNo = 0; while (True) { if (*current == '\n' || *current == '\0') { XDrawString(xvars.dpy[dpyNum],get_window(), xvars.gc[dpyNum],PANEL_MARGAIN, PANEL_MARGAIN + xvars.font[dpyNum]->max_bounds.ascent + (xvars.font[dpyNum]->max_bounds.ascent + xvars.font[dpyNum]->max_bounds.descent) * lineNo, start,current - start); start = current + 1; lineNo++; if (*current == '\0') { break; } } current++; } if (!sensitive) { XSetFillStyle(xvars.dpy[dpyNum],xvars.gc[dpyNum],FillStippled); XFillRectangle(xvars.dpy[dpyNum],get_window(),xvars.gc[dpyNum],0,0, size.width,size.height); XSetFillStyle(xvars.dpy[dpyNum],xvars.gc[dpyNum],FillSolid); } XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],xvars.black[dpyNum]); } void TextPanel::clear() { const Xvars &xvars = get_xvars(); int dpyNum = get_dpy_num(); XClearWindow(xvars.dpy[dpyNum],get_window()); } void TextPanel::set_sensitive(Boolean s) { if (sensitive != s) { sensitive = s; redraw(); } } WritePanel::WritePanel(int dpy_num,const Xvars &xvars, Window parent,const Pos &pos,const Size &size, PanelCallback cb,void* clos, const char *pmpt, unsigned int eventMask) : TextPanel(dpy_num,xvars,parent,pos,size,cb,clos,NULL,eventMask) { assert(strlen(pmpt) < PANEL_STRING_LENGTH); strcpy(prompt,pmpt); strcpy(value,""); active = False; update_message(); } void WritePanel::set_value(const char *val) { assert(strlen(val) < PANEL_STRING_LENGTH); strcpy(value,val); update_message(); } Boolean WritePanel::process_event(int dpy_num,XEvent *event) { int dpyNum = get_dpy_num(); assert(dpyNum == dpy_num); if (get_sensitive()) { if (event->xkey.window == get_window()) { if (event->type == KeyPress) { char buffer[KEYSYM_BUFFER]; KeySym keysym; int len = XLookupString(&event->xkey,buffer,KEYSYM_BUFFER,&keysym,NULL); buffer[len] = '\0'; if ((keysym >= XK_KP_Space && keysym <= XK_KP_9) || (keysym >= XK_space && keysym <= XK_asciitilde)) { if (active) { if (strlen(value) + len < PANEL_STRING_LENGTH) { strcat(value,buffer); } } else { active = True; if (strlen(value) < PANEL_STRING_LENGTH) { strcpy(value,buffer); } } update_message(); } else if (keysym == XK_BackSpace || keysym == XK_Delete) { if (active) { if (strlen(value) > 0) { value[strlen(value) - 1] = '\0'; } } else { value[0] = '\0'; active = True; } update_message(); } else if (keysym == XK_Return || keysym == XK_KP_Enter || keysym == XK_Linefeed) { if (active) { void* closure = get_closure(); PanelCallback callback = get_callback(); if (callback) { (*callback)(this,(void*)value,closure); } active = False; } else { value[0] = '\0'; active = True; } update_message(); } return True; } else if (event->type == ButtonPress) { if (!active) { value[0] = '\0'; active = True; } update_message(); return True; } } } return TextPanel::process_event(dpyNum,event); } void WritePanel::update_message() { ostrstream tmp; if (active) { tmp << prompt << value << "_" << ends; } else { tmp << prompt << value << ends; } set_message(tmp.str()); delete tmp.str(); } KeyPressPanel::KeyPressPanel(int dpy_num,const Xvars &xvars, Window parent,const Pos &pos,const Size &size, PanelCallback callback,void* closure, const char *msg, unsigned int eventMask) : TextPanel(dpy_num,xvars,parent,pos,size,callback,closure,msg,eventMask) { } Boolean KeyPressPanel::process_event(int dpy_num,XEvent *event) { int dpyNum = get_dpy_num(); assert(dpyNum == dpy_num); if (get_sensitive() && event->type == KeyPress && event->xbutton.window == get_window()) { PanelCallback callback = get_callback(); void* closure = get_closure(); if (callback) { (*callback)(this,(void*)event,closure); } return True; } else { return TextPanel::process_event(dpyNum,event); } } ButtonPanel::ButtonPanel(int dpy_num,const Xvars &xvars, Window parent,const Pos &pos,const Size &size, PanelCallback callback,void* closure, const char *msg, unsigned int eventMask) : TextPanel(dpy_num,xvars,parent,pos,size,callback,closure,msg,eventMask) { } Boolean ButtonPanel::process_event(int dpyNum,XEvent *event) { if (get_sensitive() && (event->type == ButtonPress) && (event->xbutton.window == get_window())) { PanelCallback callback = get_callback(); void* closure = get_closure(); if (callback) { (*callback)(this,(void*)(int)event->xbutton.button,closure); } return True; } else { return TextPanel::process_event(dpyNum,event); } } TogglePanel::TogglePanel(int dpy_num,const Xvars &xvars, Window parent,const Pos &pos,const Size &size, PanelCallback callback,void* closure, const char *msg, unsigned int eventMask) : TextPanel(dpy_num,xvars,parent,pos,size,callback,closure,msg,eventMask) { set = False; } void TogglePanel::set_value(Boolean s) { if (s != set) { Pixel foreground = get_foreground(); set_foreground(get_background(),False); set_background(foreground); set = s; } } Boolean TogglePanel::process_event(int dpyNum,XEvent *event) { if (get_sensitive() && (event->type == ButtonPress) && (event->xbutton.window == get_window())) { set_value(!set); PanelCallback callback = get_callback(); void* closure = get_closure(); if (callback) { (*callback)(this,(void*)(int)set,closure); } return True; } else { return TextPanel::process_event(dpyNum,event); } } ChatPanel::ChatPanel(int dpyNum,const Xvars &xvars, Window parent,const Pos &pos,const Size &size, PanelCallback callback,void* closure, const char *msg, unsigned int eventMask) : TextPanel(dpyNum,xvars,parent,pos,size,callback,closure,msg, eventMask) { value[0] = '\0'; chatOn = False; } void ChatPanel::set_chat(Boolean val) { // Nothing to do. if (val == chatOn) { return; } chatOn = val; if (chatOn) { update_message(); } else { // Erase current chat message. value[0] = '\0'; // Clear the visible area. set_message(""); } } // Some code copied from WritePanel. Boolean ChatPanel::process_event(int dpy_num,XEvent *event) { int dpyNum = get_dpy_num(); assert(dpyNum == dpy_num); // If chat is on grab all KeyPress events even if they are for some // other window on the display. if (get_sensitive() && chatOn && event->type == KeyPress) { char buffer[KEYSYM_BUFFER]; KeySym keysym; int len = XLookupString(&event->xkey,buffer,KEYSYM_BUFFER,&keysym,NULL); buffer[len] = '\0'; // Printable character typed. if ((keysym >= XK_KP_Space && keysym <= XK_KP_9) || (keysym >= XK_space && keysym <= XK_asciitilde)) { if (Utils::strlen(value) + len < PANEL_STRING_LENGTH) { Utils::strcat(value,buffer); } update_message(); } // Delete a character. else if (keysym == XK_BackSpace || keysym == XK_Delete) { if (Utils::strlen(value) > 0) { value[Utils::strlen(value) - 1] = '\0'; } update_message(); } // Commit the message call callback. else if (keysym == XK_Return || keysym == XK_KP_Enter || keysym == XK_Linefeed) { void* closure = get_closure(); PanelCallback callback = get_callback(); if (callback) { (*callback)(this,(void*)value,closure); } set_chat(False); } // Cancel chat mode. else if (keysym == XK_Escape) { set_chat(False); } return True; } return TextPanel::process_event(dpyNum,event); } void ChatPanel::set_message(const char *msg) { // Want to disable all set_message() commands if chat mode is engaged. if (chatOn) { return; } TextPanel::set_message(msg); } void ChatPanel::update_message() { if (!chatOn) { return; } ostrstream tmp; tmp << "CHAT <<" << value << "\nEnter to send, Esc to cancel." << ends; TextPanel::set_message(tmp.str()); delete tmp.str(); } xevil-2.02r2.orig/x11/serverping.cpp0100644000175000017500000002232707637246100016616 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "serverping.cpp" // Although this is currently in the X11 directory, it is all cross-platform // code and should be reasonably easy to compile on Windows. #include #include #include "utils.h" #include "streams.h" #include "xetp_basic.h" #include "neth.h" #include "id.h" class ServerPing { public: ServerPing(int argc,char** argv); ~ServerPing(); void go(); private: enum { COUNT_DEFAULT = 3, TIMEOUT_DEFAULT = 1000, }; void message(const char* msg); void error(const char* msg); void error(const char* msg1,const char* msg2); void print_usage_and_exit(); void print_results_and_exit(); /* REQUIRES: a XETPBasic::SERVER_PONG header was just received on udpIn. */ /* EFFECTS: Print the results of a SERVER_PONG, reading data from udpIn. */ int count; // Number of pings to send. int timeout; // ms char* serverName; CMN_SOCKET udpSock; CMN_PORT clientPort; CMN_PORT serverPort; CMN_SOCKADDR_IN serverAddr; UDPInStreamP udpIn; UDPOutStreamP udpOut; }; ServerPing::ServerPing(int argc,char** argv) { XETPBasic::check_sizes(); count = COUNT_DEFAULT; timeout = TIMEOUT_DEFAULT; // Means not set. clientPort = 0; // Parse arguments. int n; const char* value; for (n = 0; n < argc; n++) { if (value = Utils::arg_value_check(n,argc,argv,"-count")) { count = Utils::atoi(value); } if (value = Utils::arg_value_check(n,argc,argv,"-timeout")) { timeout = Utils::atoi(value); } if (Utils::arg_name_check(n,argc,argv,"-h") || Utils::arg_name_check(n,argc,argv,"-help")) { print_usage_and_exit(); } if (value = Utils::arg_value_check(n,argc,argv,"-client_port")) { clientPort = Utils::atoi(value); } } if (argc < 2) { print_usage_and_exit(); } char* sString = argv[argc - 1]; char* port = Utils::strchr(sString,':'); // server:port if (port) { serverName = new char[port - sString + 1]; assert(serverName); Utils::strncpy(serverName,sString,port - sString); serverName[port - sString] = '\0'; serverPort = (CMN_PORT)Utils::atoi(port + 1); } // No port specified, use default. else { serverName = Utils::strdup(sString); serverPort = XETPBasic::DEFAULT_PORT; } // If client port wasn't set on the command line. if (clientPort == 0) { // Don't use +1, may conflict with XEvil client on this machine. clientPort = XETPBasic::DEFAULT_PORT + 7; } // Set up sockets and streams. udpSock = socket(AF_INET, SOCK_DGRAM, 0); if (udpSock < 0) { error("Error opening client UDP socket."); } ostrstream str; str << "Looking up IP address for server " << serverName << ends; message(str.str()); delete str.str(); // Create server address. memset((void *)&serverAddr,'\0',sizeof(serverAddr)); serverAddr.sin_family = AF_INET; struct hostent *hp = gethostbyname(serverName); if (hp == 0) { error("Invalid server name ",serverName); return; } memcpy((void *)&serverAddr.sin_addr,(void *)hp->h_addr,hp->h_length); serverAddr.sin_port = htons((u_short)serverPort); #if 0 ostrstream str2; str2 << serverName << " has address " << hex << serverAddr.sin_addr.s_addr << ends; message(str2.str()); delete str2.str(); #endif // Bind local address for UDP CMN_SOCKADDR_IN client; memset((void *)&client,'\0',sizeof(client)); client.sin_family = AF_INET; client.sin_addr.s_addr = htonl(INADDR_ANY); client.sin_port = htons((u_short)clientPort); if (bind(udpSock,(CMN_SOCKADDR *)&client,sizeof(client)) < 0) { ostrstream str; str << "Could not bind local UDP port " << clientPort << ends; error(str.str()); delete str.str(); return; } // Create streams, only one will own the socket. udpIn = new UDPInStream(udpSock,True); udpOut = new UDPOutStream(udpSock,&serverAddr,False); } ServerPing::~ServerPing() { delete udpOut; delete udpIn; delete serverName; } void ServerPing::go() { // Send "count" number of SERVER_PINGs. for (int tries = 0; tries < count; tries++) { // Send the ping. ostrstream msg; msg << "Sending XETP::SERVER_PING to " << serverName << ':' << serverPort << ends; message(msg.str()); delete msg.str(); XETPBasic::send_server_ping(udpOut); // Don't buffer the ping. udpOut->flush(); // Wait for return from server, for specified timeout. fd_set fdvar; FD_ZERO(&fdvar); FD_SET(udpSock,&fdvar); // Factor into seconds and microseconds. int timeoutUS = 1000 * timeout; struct timeval waitTime; waitTime.tv_sec = timeoutUS / 1000000; waitTime.tv_usec = timeoutUS % 1000000; int cond = CMN_SELECT(udpSock + 1,&fdvar,NULL,NULL,&waitTime); if (cond > 0 && FD_ISSET(udpSock,&fdvar)) { // Prepare to read from the incoming packet. CMN_SOCKADDR_IN addr; if (udpIn->prepare_packet(&addr) < 0) { error("Failed to read UDP packet."); return; } // Should check that addr == serverAddr. u_short method = 0; u_int length = 0; if (!XETPBasic::receive_header(udpIn,method,length)) { error("Received invalid UDP header."); return; } if (method == XETPBasic::SERVER_PONG) { print_results_and_exit(); } else { message("Received packet other than SERVER_PONG."); } // Done with the packet. // There might be more than one XETP packet in the UDP packet, // who cares. udpIn->done_packet(); } } // If we get here, we failed to reach the server. ostrstream msg; msg << "No return from " << serverName << ':' << serverPort << " after " << count << " tries." << ends; error(msg.str()); delete msg.str(); } void ServerPing::message(const char* msg) { cout << msg << endl; } void ServerPing::error(const char* msg) { cerr << "ERROR: " << msg << endl; exit(1); } void ServerPing::error(const char* msg1,const char* msg2) { ostrstream str; str << msg1 << msg2 << ends; error(str.str()); // Will never get here, but WTF. delete str.str(); } void ServerPing::print_usage_and_exit() { cout << "Serverping allows you to remotely check the status of an XEvil server." << endl << endl; cout << "usage: serverping {-count num_tries} {-timeout timeout_ms} " << "server_name{:port}" << endl; cout << " num_tries is the number of pings to send before giving up," << " default=" << COUNT_DEFAULT << "." << endl; cout << " timeout_ms is the time in milliseconds to wait for a response before" << endl << " giving up on each ping, default=" << TIMEOUT_DEFAULT << "." << endl; cout << endl << "The output has the following form:" << endl << "SUCCESS: XEvil Server :" << endl << "GameStyle " << endl << "MachinesPlaying " << endl << "HumansPlaying " << endl << "" << endl << "Name@Hostname HumanKills MachineKills" << endl << "@ " << endl << "@ " << endl << "... {line repeats for each human player}" << endl; exit(1); } void ServerPing::print_results_and_exit() { cout << endl << "SUCCESS: XEvil Server " << serverName << ":" << serverPort << endl; GameStyleType gsType = (GameStyleType)udpIn->read_char(); cout << "GameStyle " << Utils::game_style_to_string(gsType) << endl; int enemiesNum = udpIn->read_int(); cout << "MachinesPlaying " << enemiesNum << endl; int humansNum = udpIn->read_short(); cout << "HumansPlaying " << humansNum << endl; char* version = Utils::string_read(udpIn); cout << version << endl; delete version; cout << "Name@Hostname HumanKills MachineKills" << endl; // Read in data specific to each Human. const int NAME_LENGTH = 40; char name[NAME_LENGTH]; char clientName[NAME_LENGTH]; for (int n = 0; n < humansNum; n++) { Utils::string_read(udpIn,name,NAME_LENGTH); Utils::string_read(udpIn,clientName,NAME_LENGTH); int humanKills = udpIn->read_int(); int enemyKills = udpIn->read_int(); Id id; id.read(udpIn); cout << '\"' << name << "\"@" << clientName << ' ' << humanKills << ' ' << enemyKills << endl; } exit(0); } main(int argc,char** argv) { ServerPing ping(argc,argv); ping.go(); } xevil-2.02r2.orig/x11/ui.cpp0100644000175000017500000013750207636130562015054 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "ui.cpp" #ifndef NO_PRAGMAS #pragma implementation "ui.h" #endif // Include Files #include "utils.h" extern "C" { #include #include #ifdef OPENWOUND_XOS_STRLEN_HACK #define _strings_h #endif #include #include #include #include } #include #include #include "coord.h" #include "area.h" #include "xdata.h" #include "ui.h" #include "world.h" #include "locator.h" #include "id.h" #include "physical.h" #include "game_style.h" #include "bitmaps/ui/ui.bitmaps" #include "sound.h" #include "l_agreement.h" #include "panel.h" #include "viewport.h" // Defines #define DEFAULT_BIG_FONT_NAME "-*-helvetica-*-r-*-*-18-*-*-*-*-*-*-*" //#define DEFAULT_FONT_NAME "-*-courier-*-r-*-*-17-*-*-*-*-*-*-*" #define DEFAULT_FONT_NAME "8x13bold" #define BACKUP_FONT_NAME "9x15" #define MESSAGE_TIME 9 #define RED_COLOR "red2" #define GREEN_COLOR "green1" #define ARENA_TEXT_COLOR "blue" #define CONTROLS_COLS 90 #define CONTROLS_ROWS (UI_KEYS_MAX + 5) #define LEARN_CONTROLS_COLS 72 #define LEARN_CONTROLS_ROWS 10 #define HELP_COLS 70 const static UIkeymap keys_right_sun3 = { {XK_R11},{XK_Right},{XK_R15},{XK_Down},{XK_R13}, {XK_Left},{XK_R7},{XK_Up},{XK_R9}, {XK_R1},{XK_R2},{XK_R3}, {XK_R4},{XK_R5},{XK_R6}, {XK_space}, }; const static UIkeymap keys_right_decmips = { {XK_KP_5},{XK_KP_6},{XK_KP_3},{XK_KP_2},{XK_KP_1}, {XK_KP_4},{XK_KP_7},{XK_KP_8},{XK_KP_9}, {XK_Find},{XK_Insert},{268500736}, {XK_Select},{XK_Prior},{XK_Next}, {XK_space}, }; const static UIkeymap keys_right_iris = { {XK_KP_5},{XK_KP_6},{XK_KP_3},{XK_KP_2},{XK_KP_1}, {XK_KP_4},{XK_KP_7},{XK_KP_8},{XK_KP_9}, {XK_Insert},{XK_Home},{XK_Prior}, {XK_Delete},{XK_End},{XK_Next}, {XK_space}, }; const static UIkeymap keys_right_ncd = { {XK_KP_5},{XK_KP_6},{XK_KP_3},{XK_KP_2},{XK_KP_1}, {XK_KP_4},{XK_KP_7},{XK_KP_8},{XK_KP_9}, {XK_Left},{XK_Down},{XK_Right}, {XK_KP_F1},{XK_KP_F2},{XK_KP_F3}, {XK_space}, }; const static UIkeymap keys_right_sun4 = { {XK_KP_5},{XK_KP_6},{XK_KP_3},{XK_KP_2},{XK_KP_1}, {XK_KP_4},{XK_KP_7},{XK_KP_8},{XK_KP_9}, {XK_Insert},{XK_Home},{XK_Prior}, {XK_Delete,XK_BackSpace},{XK_End},{XK_Next}, {XK_space}, }; const static UIkeymap keys_right_sun4_sparc = { {XK_F31},{XK_Right},{XK_F35},{XK_Down},{XK_F33}, {XK_Left},{XK_F27},{XK_Up},{XK_F29}, {XK_F21},{XK_F22},{XK_F23}, {XK_F24},{XK_F25},{XK_F26}, {XK_space}, }; const static UIkeymap keys_right_mac = { {XK_KP_5},{XK_KP_6},{XK_KP_3},{XK_KP_2},{XK_KP_1}, {XK_KP_4},{XK_KP_7},{XK_KP_8},{XK_KP_9}, {XK_Help},{XK_Home},{XK_Prior}, {XK_Select},{XK_End},{XK_Next}, {XK_space}, }; const static UIkeymap keys_left_all = { {XK_l,XK_l},{XK_semicolon,XK_semicolon},{XK_slash,XK_slash}, {XK_period,XK_period}, {XK_m,XK_comma}, {XK_k,XK_k},{XK_i,XK_i},{XK_o,XK_o},{XK_p,XK_bracketleft}, {XK_a},{XK_s},{XK_d}, {XK_z},{XK_x},{XK_c}, {XK_F3}, // Meaningless }; const static UIkeymap *keymaps_preset[][2] = { {&keys_right_sun3, &keys_left_all}, // UIsun3 {&keys_right_decmips, &keys_left_all}, // UIdecmips {&keys_right_iris, &keys_left_all}, // UIiris {&keys_right_ncd, &keys_left_all}, // UIncd {&keys_right_iris, &keys_left_all}, // UItektronix {&keys_right_sun4, &keys_left_all}, // UIsun4 {&keys_right_sun4, &keys_left_all}, // UIrsaix {&keys_right_sun4_sparc, &keys_left_all}, // UIsun4_sparc {&keys_right_mac,&keys_left_all}, // UImac {&keys_right_decmips,&keys_left_all}, // UIalpha {&keys_right_iris,&keys_left_all}, // UIlinux }; static int UI_error_handler(Display *dpy,XErrorEvent *evt) { char msg[80]; XGetErrorText(dpy,evt->error_code,msg,80); cerr << "X Error: " << msg << endl; // Whatever. return 0; } Ui::Ui(int *agc, char **agv, WorldP w, LocatorP l,char **d_names, char *font_name,SoundManager *, const DifficultyLevel dLevels[DIFFICULTY_LEVELS_NUM], RoleType rType) { argc = *agc; argv = agv; displayNames = d_names; fontName = Utils::strdup(font_name); difficultyLevels = dLevels; world = w; locator = l; settingsChanges = UInone; otherInput = False; pause = False; roleType = rType; // Bug fix, used to be xvars.dpyMax which isn't initialized yet. for (int n = 0; n < Xvars::DISPLAYS_MAX; n++) { keysetSet[n] = False; } for (int dpyNum = 0; dpyNum < Xvars::DISPLAYS_MAX; dpyNum++) { vIndexNum[dpyNum] = vIndexMax[dpyNum] = 0; } difficulty = DIFF_NONE; // Not yet set. init_x(); // Blatant hack to make sure color is allocated for NShield. // More general solution would be, perhaps to force certain classes // to ::init_x() first. for (int d = 0; d < xvars.dpyMax; d++) { xvars.alloc_named_color(d,"steelblue"); } // Run the license agreement. // Note: The license agreement will not be run if the user runs // "xevil -server -no_ui". // Must be after init_x(). Boolean reduceDraw = Viewport::get_reduce_draw(); Boolean accepted = LAgreement::check_accepted(largeViewport,smoothScroll,reduceDraw, xvars,0,argc,argv); Viewport::set_reduce_draw(reduceDraw); if (!accepted) { // Should probably let game.cpp call exit. exit(1); } // Ick, this should be in init_x(), but we need to call init_x() before // running the License Agreement to get this information. xvars.stretch = (largeViewport ? 2 : 1); // Must be called before the object returned from Ui::get_viewport_info() // is used. Viewport::init_viewport_info(largeViewport,smoothScroll); create_controls(); create_learn_controls(); create_help(); // Add viewport number zero. add_viewport(); } Ui::~Ui() { for (int n = 0; n < viewports.length(); n++) { delete (Viewport*)viewports.get(n); } } int Ui::add_viewport() { assert(viewports.length() < UI_VIEWPORTS_MAX); int viewportNum = viewports.length(); // Update maps between displays and viewports. // // Figure out the display number of this Viewport. // Inefficient, but doesn't really matter here. int dpyNum = -1; int menusNum; for (int dNum = 0; dpyNum == -1 && dNum < xvars.dpyMax; dNum++) { for (int vNum = 0; vNum < vIndexMax[dNum]; vNum++) { if (vIndex[dNum][vNum] == viewportNum) { // Found it. // Only the first viewport on any display has any menus. if (vNum == 0) { // First viewport on first display has all the menus, i.e. primary. if (dNum == 0) { menusNum = VW_MENUS_PRIMARY_NUM; } // First viewport on other displays only have a few menus, // i.e. secondary. else { menusNum = VW_MENUS_SECONDARY_NUM; } } else { menusNum = 0; } dpyNum = dNum; break; } } } // If this fails, vIndex and the other maps are messed up. assert(dpyNum >= 0); Viewport* vPort; if (xvars.is_stretched()) { vPort = new LargeViewport(argc,argv,xvars,dpyNum,world,locator, smoothScroll,menusNum, this,this,this, difficultyLevels,roleType, viewportCallbacks, (void*)this); } else { vPort = new SmallViewport(argc,argv,xvars,dpyNum,world,locator, smoothScroll,menusNum, this,this,this, difficultyLevels,roleType, viewportCallbacks, (void*)this); } assert(vPort); // Must call init() immediately. vPort->init(); // We explicitly copy the level string from the zeroth viewport, since // the level strings are the same for all viewportrs. // // We should have a better way to do this. In Game::reset(), // humans_reset() comes after new_level(), so the new viewport is added after // set_level() has been called for all the viewports. if (viewports.length() != 0) { Viewport* vPort0 = (Viewport*)viewports.get(0); const char* levelMsg = vPort0->get_level(); vPort->set_level(levelMsg); } viewports.add((void*)vPort); // Increase the count of the number of viewports actually // created on the given display. assert(vIndex[dpyNum][vIndexNum[dpyNum]] == viewportNum); assert(vIndexNum[dpyNum] < vIndexMax[dpyNum]); vIndexNum[dpyNum]++; return viewportNum; } void Ui::set_pause(Boolean val) { if (pause == val) { return; } for (int dpyNum = 0; dpyNum < xvars.dpyMax; dpyNum++) { // Turn pause on. if (val) { XClearWindow(xvars.dpy[dpyNum],xdata.controls[dpyNum]); learnControls[dpyNum]->clear(); for (int v = 0; v < vIndexNum[dpyNum]; v++) { Viewport* vPort = (Viewport*)viewports.get(vIndex[dpyNum][v]); vPort->clear_all(); } } // Turn pause off. else { controls_redraw(dpyNum); learnControls[dpyNum]->redraw(); for (int v = 0; v < vIndexNum[dpyNum]; v++) { Viewport* vPort = (Viewport*)viewports.get(vIndex[dpyNum][v]); vPort->unclear_all(); } } } // for dpyNum pause = val; } void Ui::set_prompt_difficulty() { difficulty = DIFF_NONE; // unspecified until user enters it. for (int n = 0; n < viewports.length(); n++) { Viewport* vPort = (Viewport*)viewports.get(n); vPort->set_prompt_difficulty(True); } } void Ui::unset_prompt_difficulty() { for (int n = 0; n < viewports.length(); n++) { Viewport* vPort = (Viewport*)viewports.get(n); vPort->set_prompt_difficulty(False); } } void Ui::change_difficulty(int val) { difficulty = val; } GameStyleType Ui::get_game_style_type() { return settings.style; } RoleType Ui::get_role_type() { return roleType; } // Check user-defined keys. Boolean Ui::key_equals(int dpyNum,int key, int input,int keycode) { Boolean ret = ((keycode == (keycodes[dpyNum][input])[key][0]) || (keycode == (keycodes[dpyNum][input])[key][1])); return ret; } void Ui::key_event(int dpyNum,int keycode,Boolean down) { Boolean found = False; // Loop over all the viewports on the display. // Target the keypress to whichever one(s) match. // // Again, the whole point of this is so that a keypress on one viewport // can be interpreted as a command on a different viewport on the same // display. for (int vNum = 0; vNum < vIndexNum[dpyNum]; vNum++) { int viewportNum = vIndex[dpyNum][vNum]; Viewport* vPort = (Viewport*)viewports.get(viewportNum); UIinput input = vPort->get_input(); // Only look at viewports that have an input set, i.e. use the // keys on the right or left side of the keyboard. if (input != UI_INPUT_NONE) { for (int key = 0; key < UI_KEYS_MAX; key++) { if (key_equals(dpyNum,key,input,keycode)) { found = True; vPort->receive_key(key,down); } } } } if (down) { // Restart game if space pressed. // This doesn't always work, the otherInput flag might get cleared // before it is used. if (keycode == XKeysymToKeycode(xvars.dpy[dpyNum],XK_space)) { otherInput = True; } if (!found) { // Undocumented pause key feature. // Don't do pause if XK_F1 is used for something else. if (keycode == XKeysymToKeycode(xvars.dpy[dpyNum],XK_F1)) { settingsChanges |= UIpause; settings.pause = True; } } } } void Ui::del_viewport() { assert(viewports.length() > 1); Viewport* vPort = (Viewport*)viewports.get(viewports.length() - 1); int dpyNum = vPort->get_dpy_num(); // Delete from list of all viewports. viewports.del(viewports.length() - 1); // Keep map from display to viewports in synch. vIndexNum[dpyNum]--; assert(vIndex[dpyNum][vIndexNum[dpyNum]] == viewports.length()); delete vPort; } void Ui::set_humans_num(int val) { // Only set for viewport 0. Viewport* vPort = (Viewport*)viewports.get(0); settings.humansNum = val; vPort->set_menu_humans_num(val); } void Ui::set_enemies_num(int val) { // Only set for viewport 0. Viewport* vPort = (Viewport*)viewports.get(0); settings.enemiesNum = val; vPort->set_menu_enemies_num(val); } void Ui::set_enemies_refill(Boolean val) { // Only set for viewport 0. Viewport* vPort = (Viewport*)viewports.get(0); settings.enemiesRefill = val; vPort->set_enemies_refill(val); } void Ui::set_style(GameStyleType style) { // Only set for viewport 0. Viewport* vPort = (Viewport*)viewports.get(0); // Just used for updating the menu. settings.style = style; vPort->set_style_and_role_type(style,roleType); } void Ui::set_quanta(Quanta quanta) { // Only set for viewport 0. Viewport* vPort = (Viewport*)viewports.get(0); settings.quanta = quanta; vPort->set_quanta(quanta); } void Ui::set_cooperative(Boolean val) { // Only set for viewport 0. Viewport* vPort = (Viewport*)viewports.get(0); settings.cooperative = val; vPort->set_cooperative(val); } void Ui::set_humans_playing(int val) { for (int n = 0; n < viewports.length(); n++) { Viewport* vPort = (Viewport*)viewports.get(n); vPort->set_humans_playing(val); } } void Ui::set_enemies_playing(int val) { for (int n = 0; n < viewports.length(); n++) { Viewport* vPort = (Viewport*)viewports.get(n); vPort->set_enemies_playing(val); } } void Ui::set_level(const char *val) { for (int n = 0; n < viewports.length(); n++) { Viewport* vPort = (Viewport*)viewports.get(n); vPort->set_level(val); } } void Ui::set_input(int n,UIinput input) { assert(n >= 0 && n < viewports.length()); Viewport* vPort = (Viewport*)viewports.get(n); vPort->set_input(input); } void Ui::set_keyset(int dpyNum,UIkeyset ks) { for (int input = 0; input < 2; input++) { for (int n = 0; n < UI_KEYS_MAX; n++) { for (int which = 0; which < 2; which++) { keycodes[dpyNum][input][n][which] = XKeysymToKeycode(xvars.dpy[dpyNum], (*keymaps_preset[ks][input])[n][which]); } } } keysetSet[dpyNum] = True; } void Ui::set_keyset(int dpyNum,UIkeyset ks, KeySym right[][2],KeySym left[][2]) { int n; for (n = 0; n < UI_KEYS_MAX; n++) { if (right[n][0]) { keycodes[dpyNum][UI_KEYS_RIGHT][n][0] = XKeysymToKeycode(xvars.dpy[dpyNum],right[n][0]); if (right[n][1]) { keycodes[dpyNum][UI_KEYS_RIGHT][n][1] = XKeysymToKeycode(xvars.dpy[dpyNum],right[n][1]); } else { keycodes[dpyNum][UI_KEYS_RIGHT][n][1] = XKeysymToKeycode(xvars.dpy[dpyNum],right[n][0]); } } else { keycodes[dpyNum][UI_KEYS_RIGHT][n][0] = XKeysymToKeycode(xvars.dpy[dpyNum], (*keymaps_preset[ks][UI_KEYS_RIGHT])[n][0]); keycodes[dpyNum][UI_KEYS_RIGHT][n][1] = XKeysymToKeycode(xvars.dpy[dpyNum], (*keymaps_preset[ks][UI_KEYS_RIGHT])[n][1]); } } for (n = 0; n < UI_KEYS_MAX; n++) { if (left[n][0]) { keycodes[dpyNum][UI_KEYS_LEFT][n][0] = XKeysymToKeycode(xvars.dpy[dpyNum],left[n][0]); if (left[n][1]) { keycodes[dpyNum][UI_KEYS_LEFT][n][1] = XKeysymToKeycode(xvars.dpy[dpyNum],left[n][1]); } else { keycodes[dpyNum][UI_KEYS_LEFT][n][1] = XKeysymToKeycode(xvars.dpy[dpyNum],left[n][0]); } } else { keycodes[dpyNum][UI_KEYS_LEFT][n][0] = XKeysymToKeycode(xvars.dpy[dpyNum], (*keymaps_preset[ks][UI_KEYS_LEFT])[n][0]); keycodes[dpyNum][UI_KEYS_LEFT][n][1] = XKeysymToKeycode(xvars.dpy[dpyNum], (*keymaps_preset[ks][UI_KEYS_LEFT])[n][1]); } } keysetSet[dpyNum] = True; } int Ui::get_dpy_num(int viewportNum) { Viewport* vPort = (Viewport*)viewports.get(viewportNum); return vPort->get_dpy_num(); } UImask Ui::get_settings(UIsettings &s) { s = settings; UImask tmp = settingsChanges; settingsChanges = UInone; return tmp; } void Ui::register_intel(int n, IntelP intel) { assert(n >= 0 && n < viewports.length()); Viewport* vPort = (Viewport*)viewports.get(n); // Use viewport num as humanColorNum in xvars. vPort->register_intel(n,intel); } void Ui::demo_reset() { for (int n = 0; n < viewports.length(); n++) { Viewport* vPort = (Viewport*)viewports.get(n); vPort->reset(); } } void Ui::reset() { demo_reset(); // Allow all viewports to accept user input now. Viewport::accept_input(); } void Ui::set_redraw_arena() { for (int n = 0; n < viewports.length(); n++) { Viewport* vPort = (Viewport*)viewports.get(n); vPort->set_redraw_arena(); } } void Ui::process_event(int dpyNum,XEvent *event) { int viewportNum = get_viewport_num(dpyNum,event->xany.window); // Received WM_DELETE_WINDOW, i.e. from pressing the close window // button (usually) in the upper-right of the window. if (event->type == ClientMessage && event->xclient.format == 32 && event->xclient.data.l[0] == xvars.wmDeleteWindow[dpyNum]) { // One of the top-level viewports. Quit game. // Perhaps this logic should be inside Viewport::process_event(). // // Also, be nice to have a more general way of handling top-level // windows. if (viewportNum != -1) { settingsChanges |= UIquit; } // Pop down controls window. else if (event->xany.window == xdata.controls[dpyNum]) { Viewport* vPort = (Viewport*)viewports.get(vIndex[dpyNum][0]); // Turn off control button on zeroth viewport on this display. vPort->set_menu_controls(False); XUnmapWindow(xvars.dpy[dpyNum],event->xany.window); } // Pop down learn controls window. else if (event->xany.window == xdata.learnControls[dpyNum]) { Viewport* vPort = (Viewport*)viewports.get(vIndex[dpyNum][0]); vPort->set_menu_learn_controls(False); XUnmapWindow(xvars.dpy[dpyNum],event->xany.window); } // Pop down help window. else if (event->xany.window == xdata.help[dpyNum]) { assert(dpyNum == 0); Viewport* vPort = (Viewport*)viewports.get(vIndex[dpyNum][0]); vPort->set_menu_help(False); XUnmapWindow(xvars.dpy[dpyNum],event->xany.window); } return; } // Turn off pause. if (pause) { if (event->type == KeyPress || event->type == ButtonPress) { settingsChanges |= UIpause; settings.pause = False; } return; } // Give event to the Viewport. if (viewportNum != -1) { Viewport* vPort = (Viewport*)viewports.get(viewportNum); vPort->process_event(event); return; } // See if we need to redraw the controls window. if (event->xany.window == xdata.controls[dpyNum] && event->type == Expose) { controls_expose(dpyNum,event); return; } // Give the learnControls window a crack at it. if (learnControls[dpyNum]->process_event(dpyNum,event)) { return; } // Give the Help window a crack at it. if (help[dpyNum]->process_event(dpyNum,event)) { return; } } void Ui::pre_clock() { int dpyNum; for (dpyNum = 0; dpyNum < xvars.dpyMax; dpyNum++) { assert(keysetSet[dpyNum]); } if (!pause) { otherInput = False; // Display new arena messages. char *arenaMsg; Boolean exclusive; // Loop, empty the queue. do { IntelId msgTarget; Quanta time; Boolean propagate; // not used here. exclusive = locator->arena_message_deq(&arenaMsg,msgTarget,time, propagate); if (arenaMsg) { // Go through all viewports, setting message on appropriate ones. for (int n = 0; n < viewports.length(); n++) { Viewport* vPort = (Viewport*)viewports.get(n); IntelP intel = vPort->get_intel(); // If message is exclusive to a certain viewport, // intelId must match msgTarget. if (!exclusive || (intel && intel->get_intel_id() == msgTarget) ) { // -1 means use default value. if (time == -1) { time = UI_ARENA_MESSAGE_TIME; } // Either this is the target for the exclusive message or // the message goes to all viewports. vPort->set_arena_message(arenaMsg,time); // Dont' need to redraw all, because we'll redraw the message // every turn. // We found the viewport we're looking for, so stop looking. if (exclusive) { break; } } } delete arenaMsg; } } while(arenaMsg); // Clock all the Viewports. // Drawing happens here. for (int n = 0; n < viewports.length(); n++) { Viewport* vPort = (Viewport*)viewports.get(n); vPort->pre_clock(); } // Update message bar. if (messageTimer.ready()) { char *msg; if (msg = locator->message_deq()) { set_message(msg); delete msg; messageTimer.set(MESSAGE_TIME); } } messageTimer.clock(); } // pause // Force all drawing requests to finish at the end of each turn. for (dpyNum = 0; dpyNum < xvars.dpyMax; dpyNum++) { if (vIndexNum[dpyNum] > 0) { XSync(xvars.dpy[dpyNum],False); } } } void Ui::post_clock() { // Clock all the Viewports. // This initiates drawing. for (int n = 0; n < viewports.length(); n++) { Viewport* vPort = (Viewport*)viewports.get(n); vPort->post_clock(); } } void Ui::menu_quit_CB(void*,Viewport*,void* closure) { UiP ui = (UiP)closure; ui->settingsChanges |= UIquit; } void Ui::menu_new_game_CB(void*,Viewport*,void* closure) { UiP ui = (UiP)closure; ui->settingsChanges |= UInewGame; } void Ui::menu_humans_num_CB(void* value,Viewport*,void* closure) { UiP ui = (UiP)closure; ui->settingsChanges |= UIhumansNum; const char* chPValue = (const char*)value; ui->settings.humansNum = Utils::atoi(chPValue); } void Ui::menu_enemies_num_CB(void* value,Viewport*,void* closure) { UiP ui = (UiP)closure; ui->settingsChanges |= UIenemiesNum; const char* chPValue = (const char*)value; ui->settings.enemiesNum = Utils::atoi(chPValue); } void Ui::menu_enemies_refill_CB(void* value,Viewport*,void* closure) { UiP ui = (UiP)closure; ui->settingsChanges |= UIenemiesRefill; // SGI compiler says you can't cast void* to Boolean. Boolean val = (Boolean)(int)value; ui->settings.enemiesRefill = val; } void Ui::menu_controls_CB(void* value,Viewport* vPort,void* closure) { UiP ui = (UiP)closure; int dpyNum = vPort->get_dpy_num(); Boolean val = (Boolean)(int)value; if (val) { XMapWindow(ui->xvars.dpy[dpyNum],ui->xdata.controls[dpyNum]); } else { XUnmapWindow(ui->xvars.dpy[dpyNum],ui->xdata.controls[dpyNum]); } } // Button was pressed to pop up the learn controls dialog. void Ui::menu_learn_controls_CB(void* value, Viewport* vPort,void* closure) { UiP ui = (UiP)closure; int dpyNum = vPort->get_dpy_num(); Boolean active = (Boolean)(int)value; if (active) { ui->lControls[dpyNum].input = ui->lControls[dpyNum].key = ui->lControls[dpyNum].which = 0; ostrstream str; str << "There are 2 sets of controls for the players on the right and" << "\n" << "left sides of the keyboard, respectively." << "\n" << "Each player has " << UI_KEYS_MAX << " commands. " << "Two physical keys on the keyboard can" << "\n" << "be mapped to each command. This is useful when two keys " << "are physically" << "\n" << "close to each other and you would like both of them to perform" << "\n" << "the same action." << "\n" << "\n" << "Place the cursor in this window and type the prompted key." << "\n" << "\n" << (ui->lControls[dpyNum].input ? "Left" : "Right") << " player enter the " << (ui->lControls[dpyNum].which ? "second" : "first") << " key for <" << ui->keysNames[ui->lControls[dpyNum].key] << ">." << ends; ui->learnControls[dpyNum]->set_message(str.str()); delete str.str(); XMapWindow(ui->xvars.dpy[dpyNum],ui->xdata.learnControls[dpyNum]); } else { XUnmapWindow(ui->xvars.dpy[dpyNum],ui->xdata.learnControls[dpyNum]); } } void Ui::menu_scenarios_CB(void* value,Viewport*,void* closure) { UiP ui = (UiP)closure; Boolean val = (Boolean)(int)value; if (val) { ui->settingsChanges |= UIstyle; ui->settings.style = SCENARIOS; } } void Ui::menu_levels_CB(void* value,Viewport*,void* closure) { UiP ui = (UiP)closure; Boolean val = (Boolean)(int)value; if (val) { ui->settingsChanges |= UIstyle; ui->settings.style = LEVELS; } } void Ui::menu_kill_CB(void* value,Viewport*,void* closure) { UiP ui = (UiP)closure; Boolean val = (Boolean)(int)value; if (val) { ui->settingsChanges |= UIstyle; ui->settings.style = KILL; } } void Ui::menu_duel_CB(void* value,Viewport*,void* closure) { UiP ui = (UiP)closure; Boolean val = (Boolean)(int)value; if (val) { ui->settingsChanges |= UIstyle; ui->settings.style = DUEL; } } void Ui::menu_extended_CB(void* value,Viewport*,void* closure) { UiP ui = (UiP)closure; Boolean val = (Boolean)(int)value; if (val) { ui->settingsChanges |= UIstyle; ui->settings.style = EXTENDED; } } void Ui::menu_training_CB(void* value,Viewport*,void* closure) { UiP ui = (UiP)closure; Boolean val = (Boolean)(int)value; if (val) { ui->settingsChanges |= UIstyle; ui->settings.style = TRAINING; } } void Ui::menu_quanta_CB(void* value,Viewport*,void* closure) { UiP ui = (UiP)closure; ui->settingsChanges |= UIquanta; const char* chPValue = (const char*)value; ui->settings.quanta = Utils::atoi(chPValue); } void Ui::menu_cooperative_CB(void* value,Viewport*,void* closure) { UiP ui = (UiP)closure; ui->settingsChanges |= UIcooperative; Boolean val = (Boolean)(int)value; ui->settings.cooperative = val; } void Ui::menu_help_CB(void* value,Viewport* vPort,void* closure) { UiP ui = (UiP)closure; int dpyNum = vPort->get_dpy_num(); Boolean active = (Boolean)(int)value; if (active) { XMapWindow(ui->xvars.dpy[dpyNum],ui->xdata.help[dpyNum]); } else { XUnmapWindow(ui->xvars.dpy[dpyNum],ui->xdata.help[dpyNum]); } } void Ui::status_weapon_CB(void* value,Viewport* vPort,void*) { // Some mouse controls. // UiP ui = (UiP)closure; int button = (int)value; switch (button) { case Button1: vPort->dispatch(IT_WEAPON_CENTER,NULL); break; case Button2: vPort->dispatch(IT_WEAPON_CHANGE,NULL); break; case Button3: vPort->dispatch(IT_WEAPON_DROP,NULL); break; } } void Ui::status_item_CB(void* value,Viewport* vPort,void*) { // UiP ui = (UiP)closure; int button = (int)value; switch (button) { case Button1: vPort->dispatch(IT_ITEM_USE,NULL); break; case Button2: vPort->dispatch(IT_ITEM_CHANGE,NULL); break; case Button3: vPort->dispatch(IT_ITEM_DROP,NULL); break; } } void Ui::chat_CB(void* value,Viewport* vPort,void* closure) { const char* message = (const char*)value; UiP ui = (UiP)closure; ui->settingsChanges |= UIchatRequest; // No UI for specifying the receiver yet. ui->settings.chatReceiver[0] = '\0'; // Copy over the message. Utils::strncpy(ui->settings.chatMessage,message,UI_CHAT_MESSAGE_MAX); ui->settings.chatMessage[UI_CHAT_MESSAGE_MAX] = '\0'; } void Ui::learn_controls_CB(Panel* panel,void* value,void* closure) { UiP ui = (UiP)closure; int dpyNum = panel->get_dpy_num(); XEvent* event = (XEvent*)value; if (event->type != KeyPress) { return; } // Viewport containing the [Learn Controls] button. panel has no viewport. int vNum = ui->vIndex[dpyNum][0]; Viewport* vPort = (Viewport*)ui->viewports.get(vNum); // If the learnControls button isn't pressed, don't do anything with // the learn Controls dialog. // This shouldn't happen, but does for some reason on an Athena SGI. if (!vPort->get_menu_learn_controls()) { return; } ostrstream str; str << (ui->lControls[dpyNum].input ? "Left" : "Right") << " player: The " << (ui->lControls[dpyNum].which ? "second" : "first") << " key for <" << ui->keysNames[ui->lControls[dpyNum].key] << "> is " << XKeysymToString(XKeycodeToKeysym(ui->xvars.dpy[dpyNum], event->xkey.keycode,0)) << "." << "\n" << "\n"; ui->keycodes[dpyNum][ui->lControls[dpyNum].input] [ui->lControls[dpyNum].key][ui->lControls[dpyNum].which] = event->xkey.keycode; #if 0 // Some special code to only store one key for chat. if (ui->lControls[dpyNum].key == IT_CHAT) { assert(ui->lControls[dpyNum].which == 0); ui->keycodes[dpyNum][1] = ui->keycodes[dpyNum][0]; ui->lControls[dpyNum].which++; } #endif // Need something so that only does chat for first player. assert(IT_CHAT == UI_KEYS_MAX - 1); // "Carry" bits for the counter // // Increment "which" of the two keys. if (ui->lControls[dpyNum].which < 1) { ui->lControls[dpyNum].which++; } // Increment the key being set. else if (ui->lControls[dpyNum].key < (UI_KEYS_MAX - 1) // Don't set chat key for second player. && (!(ui->lControls[dpyNum].key == (IT_CHAT - 1) && ui->lControls[dpyNum].input > 0))) { ui->lControls[dpyNum].key++; ui->lControls[dpyNum].which = 0; } // Increment between right and left players else if (ui->lControls[dpyNum].input < 1) { ui->lControls[dpyNum].input++; ui->lControls[dpyNum].key = 0; ui->lControls[dpyNum].which = 0; } // Done else { vPort->set_menu_learn_controls(False); XUnmapWindow(ui->xvars.dpy[dpyNum],ui->xdata.learnControls[dpyNum]); } str << (ui->lControls[dpyNum].input ? "Left" : "Right") << " player enter the " << (ui->lControls[dpyNum].which ? "second" : "first") << " key for <" << keysNames[ui->lControls[dpyNum].key] << ">." << ends; // Add message in front of str.str(). ostrstream fullStr; if (ui->lControls[dpyNum].input == UI_KEYS_LEFT) { fullStr << "You may dismiss this dialog now if you only want to" << "\n" << "set the controls for one player." << "\n" << "\n"; } fullStr << str.str() << ends; delete str.str(); ui->learnControls[dpyNum]->set_message(fullStr.str()); delete fullStr.str(); ui->controls_redraw(dpyNum); } void Ui::set_message(const char *message) { for (int n = 0; n < viewports.length(); n++) { Viewport* vPort = (Viewport*)viewports.get(n); vPort->set_message(message); } } void Ui::init_x() { // Map from viewports to displays. // Now just a local variable instead of a member, the info // is recomputed when the Viewport object is actually created. int dpyIndex[UI_VIEWPORTS_MAX]; // Initialize Xvars. xvars.dpyMax = 0; // Assign a display to all viewports. for (int vNum = 0; vNum < UI_VIEWPORTS_MAX; vNum++) { Boolean found = False; for (int m = 0; m < vNum && !found; m++) { // Use already opened display. if (!strcmp(displayNames[m],displayNames[vNum])) { int theDisplay = dpyIndex[m]; dpyIndex[vNum] = theDisplay; vIndex[theDisplay][vIndexMax[theDisplay]] = vNum; vIndexMax[theDisplay]++; found = True; } } // Open new display. if (!found) { if (xvars.dpyMax >= Xvars::DISPLAYS_MAX) { cerr << "Can only open " << Xvars::DISPLAYS_MAX << " different displays." << endl; cerr << "If more displays are desired, recompile with " << "a higher value for Xvars::DISPLAYS_MAX." << endl; exit(1); } if (!(xvars.dpy[xvars.dpyMax] = XOpenDisplay(strlen(displayNames[vNum]) ? displayNames[vNum] :(char *) NULL))) { cerr << "Could not open X display " << displayNames[xvars.dpyMax] << endl; if (strlen(displayNames[xvars.dpyMax])) { cerr << "Make sure you have used xhost on " << displayNames[xvars.dpyMax] << " to allow this machine to connect to it." << endl; } exit(1); } // Synchronous, for debugging. if (synchronous) { XSynchronize(xvars.dpy[xvars.dpyMax],True); } // Initialize a bunch of useful X variables. xvars.scr_ptr[xvars.dpyMax] = DefaultScreenOfDisplay(xvars.dpy[xvars.dpyMax]); xvars.scr_num[xvars.dpyMax] = DefaultScreen(xvars.dpy[xvars.dpyMax]); xvars.root[xvars.dpyMax] = RootWindowOfScreen(xvars.scr_ptr[xvars.dpyMax]); xvars.visual[xvars.dpyMax] = DefaultVisual(xvars.dpy[xvars.dpyMax],xvars.scr_num[xvars.dpyMax]); xvars.depth[xvars.dpyMax] = DefaultDepthOfScreen(xvars.scr_ptr[xvars.dpyMax]); xvars.cmap[xvars.dpyMax] = DefaultColormap(xvars.dpy[xvars.dpyMax],xvars.scr_num[xvars.dpyMax]); xvars.white[xvars.dpyMax] = WhitePixel(xvars.dpy[xvars.dpyMax],xvars.scr_num[xvars.dpyMax]); xvars.black[xvars.dpyMax] = BlackPixel(xvars.dpy[xvars.dpyMax],xvars.scr_num[xvars.dpyMax]); // Get font. Use user-specified font if given. // regular size font. const char *theFont = fontName ? fontName : DEFAULT_FONT_NAME; xvars.font[xvars.dpyMax] = XLoadQueryFont(xvars.dpy[xvars.dpyMax],theFont); if (!xvars.font[xvars.dpyMax]) { cerr << "Could not load font " << theFont << " trying backup font " << BACKUP_FONT_NAME << endl; // Try backup font, should always be there. xvars.font[xvars.dpyMax] = XLoadQueryFont(xvars.dpy[xvars.dpyMax],BACKUP_FONT_NAME); } if (!xvars.font[xvars.dpyMax]) { // Really failed. cerr << "Could not load " << BACKUP_FONT_NAME; if (strlen(displayNames[vNum])) cerr << " on " << displayNames[vNum]; cerr << endl; exit (1); } // BigFont theFont = DEFAULT_BIG_FONT_NAME; xvars.bigFont[xvars.dpyMax] = XLoadQueryFont(xvars.dpy[xvars.dpyMax],theFont); if (!xvars.bigFont[xvars.dpyMax]) { cerr << "Could not load font " << theFont << " trying backup font " << BACKUP_FONT_NAME << endl; // Try backup font, should always be there. xvars.bigFont[xvars.dpyMax] = XLoadQueryFont(xvars.dpy[xvars.dpyMax],BACKUP_FONT_NAME); } if (!xvars.bigFont[xvars.dpyMax]) { // Really failed. cerr << "Could not load " << BACKUP_FONT_NAME; if (strlen(displayNames[vNum])) cerr << " on " << displayNames[vNum]; cerr << endl; exit (1); } // For convenience, compute sizes of fonts. xvars.fontSize[xvars.dpyMax].width = xvars.font[xvars.dpyMax]->max_bounds.width; xvars.fontSize[xvars.dpyMax].height = xvars.font[xvars.dpyMax]->max_bounds.ascent + xvars.font[xvars.dpyMax]->max_bounds.descent; xvars.bigFontSize[xvars.dpyMax].width = xvars.bigFont[xvars.dpyMax]->max_bounds.width; xvars.bigFontSize[xvars.dpyMax].height = xvars.bigFont[xvars.dpyMax]->max_bounds.ascent + xvars.bigFont[xvars.dpyMax]->max_bounds.descent; // Create graphics context. XGCValues values; values.graphics_exposures = False; values.font = xvars.font[xvars.dpyMax]->fid; values.foreground = xvars.black[xvars.dpyMax]; values.background = xvars.white[xvars.dpyMax]; values.stipple = XCreateBitmapFromData(xvars.dpy[xvars.dpyMax], xvars.root[xvars.dpyMax],INSENSITIVE_BITS, INSENSITIVE_WIDTH,INSENSITIVE_HEIGHT); xvars.gc[xvars.dpyMax] = XCreateGC(xvars.dpy[xvars.dpyMax],xvars.root[xvars.dpyMax], GCGraphicsExposures | GCFont | GCForeground | GCBackground | GCStipple, &values); // Some colors. xvars.red[xvars.dpyMax] = xvars.alloc_named_color(xvars.dpyMax,RED_COLOR, xvars.black[xvars.dpyMax]); xvars.green[xvars.dpyMax] = xvars.alloc_named_color(xvars.dpyMax,GREEN_COLOR, xvars.black[xvars.dpyMax]); xvars.arenaTextColor[xvars.dpyMax] = xvars.alloc_named_color(xvars.dpyMax,ARENA_TEXT_COLOR, xvars.white[xvars.dpyMax]); xvars.windowBg[xvars.dpyMax] = xvars.alloc_named_color(xvars.dpyMax,Xvars_WINDOW_BG_COLOR); xvars.windowBorder[xvars.dpyMax] = xvars.alloc_named_color(xvars.dpyMax,Xvars_WINDOW_BORDER_COLOR); for (int m = 0; m < Xvars::HUMAN_COLORS_NUM; m++) { xvars.humanColors[xvars.dpyMax][m] = xvars.alloc_named_color(xvars.dpyMax,Xvars::humanColorNames[m], xvars.black[xvars.dpyMax]); } // Initialize xdata. I.e. values local to the Ui. XColor color; color.red = color.green = color.blue = 0; color.flags = DoRed | DoGreen | DoBlue; Pixmap pixmap = XCreateBitmapFromData(xvars.dpy[xvars.dpyMax], xvars.root[xvars.dpyMax],CURSOR_BITS, CURSOR_WIDTH,CURSOR_HEIGHT); Pixmap mask = XCreateBitmapFromData(xvars.dpy[xvars.dpyMax], xvars.root[xvars.dpyMax],CURSOR_MASK_BITS, CURSOR_WIDTH,CURSOR_HEIGHT); xvars.arenaCursor[xvars.dpyMax] = XCreatePixmapCursor(xvars.dpy[xvars.dpyMax],pixmap,mask, &color,&color,CURSOR_HOT_X,CURSOR_HOT_Y); XFreePixmap(xvars.dpy[xvars.dpyMax],pixmap); XFreePixmap(xvars.dpy[xvars.dpyMax],mask); xvars.iconPixmap[xvars.dpyMax] = 0; xvars.iconMask[xvars.dpyMax] = 0; // (??)Doesn't work, pixmap must be 1-bit deep when specified this way. // Use color XEvil icon when program is iconified. // // A little funny, calling load_pixmap() before xvars is fully // initialized. xvars.load_pixmap(&xvars.iconPixmap[xvars.dpyMax], &xvars.iconMask[xvars.dpyMax], xvars.dpyMax,XPM_ICON_BITS,True); #if 0 xvars.iconPixmap[xvars.dpyMax] = XCreateBitmapFromData(xvars.dpy[xvars.dpyMax], xvars.root[xvars.dpyMax],ICON_BITS, ICON_WIDTH,ICON_HEIGHT); #endif // Maps between displays and viewports. dpyIndex[vNum] = xvars.dpyMax; vIndex[xvars.dpyMax][vIndexNum[xvars.dpyMax]] = vNum; vIndexMax[xvars.dpyMax]++; xvars.dpyMax++; } } intern_atoms(); XSetErrorHandler(&UI_error_handler); } void Ui::intern_atoms() { for (int dpyNum = 0; dpyNum < xvars.dpyMax; dpyNum++) { xvars.wmProtocols[dpyNum] = XInternAtom(xvars.dpy[dpyNum],"WM_PROTOCOLS",False); xvars.wmDeleteWindow[dpyNum] = XInternAtom(xvars.dpy[dpyNum],"WM_DELETE_WINDOW",False); } } int Ui::get_viewport_num(int dpyNum,Window window) { // Lame-ass linear search. // Could use the HashTable class now that we have it. for (int v = 0; v < vIndexNum[dpyNum]; v++) { int viewportNum = vIndex[dpyNum][v]; Viewport* vPort = (Viewport*)viewports.get(viewportNum); if (vPort->has_window(window)) { return viewportNum; } } return -1; } void Ui::create_controls() { // Need to move all this window-creation code into a common method, // probably on Xvars. for (int dpyNum = 0; dpyNum < xvars.dpyMax; dpyNum++) { Size size; size.width = xvars.font[dpyNum]->max_bounds.width * CONTROLS_COLS; size.height = (xvars.font[dpyNum]->max_bounds.ascent + xvars.font[dpyNum]->max_bounds.descent) * CONTROLS_ROWS; xdata.controls[dpyNum] = xvars.create_toplevel_window(argc,argv,dpyNum,size, "XEvil Controls",ExposureMask); } // dpyNum } void Ui::create_learn_controls() { for (int dpyNum = 0; dpyNum < xvars.dpyMax; dpyNum++) { Size size = TextPanel::get_unit(xvars.font[dpyNum], LEARN_CONTROLS_COLS,LEARN_CONTROLS_ROWS); xdata.learnControls[dpyNum] = xvars.create_toplevel_window(argc,argv,dpyNum,size, "Set Controls", ExposureMask | KeyPressMask); Pos pos; // Initialized to (0,0) learnControls[dpyNum] = new KeyPressPanel(dpyNum,xvars,xdata.learnControls[dpyNum], pos,size,Ui::learn_controls_CB,(void*)this); assert(learnControls[dpyNum]); } // dpyNum } void Ui::create_help() { // Parse the helpMessage and create a string with appropriate line breaks // for the TextPanel. Line::set_text_columns(HELP_COLS); Page page(NULL,helpMessage); const PtrList& lines = page.get_lines(); ostrstream message; for (int n = 0; n < lines.length(); n++) { Line* line = (Line*)lines.get(n); char* text = line->alloc_text(); // Careful to use '\n' for line break. message << text << '\n'; delete [] text; } message << ends; for (int dpyNum = 0; dpyNum < xvars.dpyMax; dpyNum++) { // Create the top-level window. Size size = TextPanel::get_unit(xvars.font[dpyNum], HELP_COLS,lines.length()); xdata.help[dpyNum] = xvars.create_toplevel_window(argc,argv,dpyNum,size, "XEvil Help", ExposureMask); // Create the TextPanel inside. Pos pos; // Initialized to (0,0) help[dpyNum] = new TextPanel(dpyNum,xvars,xdata.help[dpyNum],pos,size); assert(help[dpyNum]); help[dpyNum]->set_message(message.str()); } // dpyNum delete message.str(); } void Ui::controls_redraw(int dpyNum) { XClearWindow(xvars.dpy[dpyNum],xdata.controls[dpyNum]); // Temporary list of keysyms. // // Indexed by // [right or left] // [key number] // [which of the two possible keys] // [possibly multiple names, e.g. 'M' and 'm', for same keycode] KeySym keymaps[2][UI_KEYS_MAX][2][2]; for (int input = 0; input < 2; input++) { for (int nn = 0; nn < UI_KEYS_MAX; nn++) { for (int which = 0; which < 2; which++) { for (int i = 0; i < 2; i++) { unsigned int keycode = keycodes[dpyNum][input][nn][which]; keymaps[input][nn][which][i] = XKeycodeToKeysym(xvars.dpy[dpyNum],keycode,i); } } } } // Line number, I have no idea why I called it "p". int p = 0; // Fluff at the top char player[] = "Left Side >>>>>> Right Side (DEFAULT) <<<<<<"; XDrawString(xvars.dpy[dpyNum],xdata.controls[dpyNum],xvars.gc[dpyNum], xvars.fontSize[dpyNum].width, xvars.font[dpyNum]->max_bounds.ascent + (p++) * xvars.fontSize[dpyNum].height, player,strlen(player)); char line[] = "------------------------------------------------------------------------------------------"; XDrawString(xvars.dpy[dpyNum],xdata.controls[dpyNum],xvars.gc[dpyNum], xvars.fontSize[dpyNum].width, xvars.font[dpyNum]->max_bounds.ascent + (p++) * xvars.fontSize[dpyNum].height, line,strlen(line)); // Loop through all keys. for (int n = 0; n < UI_KEYS_MAX; n++) { // String for right side. strstream str0; str0 << keysNames[n] << ": " << XKeysymToString(keymaps[0][n][0][0]); if (keymaps[0][n][0][1] && strlen(XKeysymToString(keymaps[0][n][0][1]))) str0 << ", " << XKeysymToString(keymaps[0][n][0][1]); if (keymaps[0][n][0][0] != keymaps[0][n][1][0] && keymaps[0][n][1][0]) { str0 << ", " << XKeysymToString(keymaps[0][n][1][0]); if (keymaps[0][n][1][1] && strlen(XKeysymToString(keymaps[0][n][1][1]))) str0 << ", " << XKeysymToString(keymaps[0][n][1][1]); } str0 << ends; // String for left side. strstream str1; str1 << keysNames[n] << ": " << XKeysymToString(keymaps[1][n][0][0]); if (keymaps[1][n][0][1] && strlen(XKeysymToString(keymaps[1][n][0][1]))) { str1 << ", " << XKeysymToString(keymaps[1][n][0][1]); } if (keymaps[1][n][0][0] != keymaps[1][n][1][0] && keymaps[1][n][1][0]) { str1 << ", " << XKeysymToString(keymaps[1][n][1][0]); if (keymaps[1][n][1][1] && strlen(XKeysymToString(keymaps[1][n][1][1]))) str1 << ", " << XKeysymToString(keymaps[1][n][1][1]); } str1 << ends; // Draw key on left side. if (n != IT_CHAT) { // Chat meaningless for left player. XDrawString(xvars.dpy[dpyNum],xdata.controls[dpyNum],xvars.gc[dpyNum], xvars.fontSize[dpyNum].width, xvars.font[dpyNum]->max_bounds.ascent + p * xvars.fontSize[dpyNum].height, str1.str(),strlen(str1.str())); } // Draw on right side. XDrawString(xvars.dpy[dpyNum],xdata.controls[dpyNum],xvars.gc[dpyNum], xvars.fontSize[dpyNum].width * (CONTROLS_COLS / 2 + 1), xvars.font[dpyNum]->max_bounds.ascent + (p++) * xvars.fontSize[dpyNum].height, str0.str(),strlen(str0.str())); delete str0.str(); delete str1.str(); } p++; // Fluff at the bottom. char line2[] = "Keyboard controls can be set with the -keys command line option"; XDrawString(xvars.dpy[dpyNum],xdata.controls[dpyNum],xvars.gc[dpyNum], xvars.fontSize[dpyNum].width, xvars.font[dpyNum]->max_bounds.ascent + (p++) * xvars.fontSize[dpyNum].height, line2,strlen(line2)); char line3[] = "the [Set controls] button or with the appropriate X resources."; XDrawString(xvars.dpy[dpyNum],xdata.controls[dpyNum],xvars.gc[dpyNum], xvars.fontSize[dpyNum].width, xvars.font[dpyNum]->max_bounds.ascent + (p++) * xvars.fontSize[dpyNum].height, line3,strlen(line3)); p++; } IViewportInfo* Ui::get_viewport_info() { return Viewport::get_info(); } char *Ui::keysNames[UI_KEYS_MAX] = { "center", "right", "down_right", "down", "down_left", "left", "up_left", "up", "up_right", "weapon_use", "weapon_change", "weapon_drop", "item_use", "item_change", "item_drop", "chat", }; Boolean Ui::synchronous = False; // The default value. Boolean Ui::largeViewport = True; Boolean Ui::smoothScroll = False; ViewportCallback Ui::viewportCallbacks[VIEWPORT_CB_NUM] = { menu_controls_CB, menu_learn_controls_CB, menu_quit_CB, menu_new_game_CB, menu_humans_num_CB, menu_enemies_num_CB, menu_enemies_refill_CB, NULL, menu_scenarios_CB, menu_levels_CB, menu_kill_CB, menu_duel_CB, menu_extended_CB, menu_training_CB, menu_quanta_CB, menu_cooperative_CB, menu_help_CB, status_weapon_CB, status_item_CB, chat_CB, }; char* Ui::helpMessage = "For full instructions, including NETWORK PLAY, see " "http://www.xevil.com/docs/instructions.html\n" "\n" "Run 'xevil -help' for usage and basic NETWORK PLAY options.\n" "\n" "Use the \"Set Controls\" and \"Show Controls\" buttons to configure the " "keyboard.\n" "\n" "XEvil(TM) Copyright(C) 1994,1999 Steve Hardt and Michael Judge\n" "http://www.xevil.com satan@xevil.com" ; xevil-2.02r2.orig/x11/viewport.cpp0100644000175000017500000022012507041422166016302 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "viewport.cpp" #ifndef NO_PRAGMAS #pragma implementation "viewport.h" #endif #include "utils.h" #include "xdata.h" #include "coord.h" #include "viewport.h" #include "game_style.h" #include "physical.h" #include "locator.h" #include "role.h" extern "C" { #include #ifdef OPENWOUND_XOS_STRLEN_HACK #define _strings_h #endif #include #include } #include #define TICK_BORDER_WIDTH 5 // border width big enough for a tick mark. #define TICK_WIDTH 3 #define ARENA_BORDER_COLOR "black" #define SMOOTH_BORDER_WIDTH 2 // Just for decoration. #define MENU_BG_COLOR "gray80" // For viewports with no object. #define ROW_SHIFT 5 #define COL_SHIFT 4 // Number of characters across for each menu button. #define QUIT_LINE_LENGTH 5 #define NEW_GAME_LINE_LENGTH 9 #define HUMANS_NUM_LINE_LENGTH 9 #define ENEMIES_NUM_LINE_LENGTH 11 #define ENEMIES_REFILL_LINE_LENGTH 13 #define CONTROLS_LINE_LENGTH 13 #define LEARN_CONTROLS_LINE_LENGTH 12 #define STYLE_LINE_LENGTH 11 #define SCENARIOS_LINE_LENGTH 9 #define LEVELS_LINE_LENGTH 6 #define KILL_LINE_LENGTH 16 #define DUEL_LINE_LENGTH 4 #define EXTENDED_LINE_LENGTH 13 #define TRAINING_LINE_LENGTH 8 #define QUANTA_LINE_LENGTH 13 #define COOPERATIVE_LINE_LENGTH 11 #define HELP_LINE_LENGTH 4 // How far on top and sides viewport extends around the room. #define SM_EXTRA_COL 2 #define SM_EXTRA_ROW 0 #define LG_EXTRA_COL 2 #define LG_EXTRA_ROW 0 // The inner dim, add LG_EXTRA_COL and LG_EXTRA_ROW to get the // actual size of the Viewport. #define LG_COL_MAX 26 #define LG_ROW_MAX 16 #define SM_COL_MAX 30 #define SM_ROW_MAX 16 #define SM_STATUS_LINE_LENGTH 25 #define LG_INTELS_LINE_LENGTH 11 #define LG_LEVEL_LINE_LENGTH SM_STATUS_LINE_LENGTH // Arena message will be displayed this distance above // the center of the screen. This is so the text is not // right on top of the player. #define ARENA_MESSAGE_OFF_CENTER 25 // 40 enum {statusName,statusClassName,statusHealth,statusMass, statusWeapon,statusItem,statusLivesHKills,statusKillsMKills}; struct PanelClosure { Boolean radio; Viewport* viewport; // Callback passed into Viewport constructor. ViewportCallback callback; }; KeyState::KeyState() { for (int n = 0; n < UI_KEYS_MAX; n++) { isDown[n] = False; } } class VInfoProvider: public IViewportInfo { public: VInfoProvider() {vInfo = NULL;} ~VInfoProvider() {delete vInfo;} void set_viewport_info(const ViewportInfo& v); /* EFFECTS: When the information is available, use this. */ virtual ViewportInfo get_info(); private: ViewportInfo* vInfo; }; void VInfoProvider::set_viewport_info(const ViewportInfo& v) { vInfo = new ViewportInfo(v); assert(vInfo); } ViewportInfo VInfoProvider::get_info() { // If this assert happens, it means that Viewport::init_viewport_info() // was not called early enough. assert(vInfo); return *vInfo; } class BorderTickRenderer: public ITickRenderer { public: BorderTickRenderer(Drawable outer,Xvars&,int dpyNum, const Size& outerSize); ~BorderTickRenderer(); virtual void begin_draw(int dpyNum); /* EFFECTS: Clear out the border buffers. */ virtual void end_draw(int dpyNum); /* EFFECTS: Draw the border buffers to window. */ virtual Boolean draw_tick(TickType tt,CMN_DRAWABLE window, Xvars &xvars,int dpyNum, const Size &arenaSize, Dir tickDir,int offset); /* EFFECTS: Record one tick mark. */ private: static void init_x(Xvars&,int dpyNum,const Size& outerSize); /* EFFECTS: Initialize the static graphics data for one display. Can only do one at a time since we need outerSize to init borderBuffers. */ Boolean dir_to_border_or_corner(int &val,Dir); /* MODIFIES: val */ /* REQUIRES: Dir is one of the 8 cardinal directions. */ /* EFFECTS: Convert dir to an enumerated border or corner. Return True if border, False if corner. */ enum {BORDER_R,BORDER_DN,BORDER_L,BORDER_UP,BORDER_MAX}; enum {CORNER_DN_R,CORNER_DN_L,CORNER_UP_L,CORNER_UP_R,CORNER_MAX}; Drawable outer; Xvars& xvars; int dpyNum; Size outerSize; // corners and borderBuffers should more appropriately be non-static, // since they are really specific to a single Renderer. But, we share // the buffers for all the renderers on a display as an optimization. // This means that we can't have draw_tick() calls interleaved for // different renderers on the same display. Never happens anyway. // Static data. static XvarsValid xValid[Xvars::DISPLAYS_MAX]; // The rectangular areas corresponding to each border/corner. static Area borderAreas[Xvars::DISPLAYS_MAX][BORDER_MAX]; static Area cornerAreas[Xvars::DISPLAYS_MAX][CORNER_MAX]; // Rectangles of width ARENA_BORDER_COLOR. Small back-buffers for // draw_tick(). static Drawable borderBuffers[Xvars::DISPLAYS_MAX][BORDER_MAX]; // Most recently drawn color for corner. static Pixel corners[Xvars::DISPLAYS_MAX][CORNER_MAX]; static Pixel tickColors[Xvars::DISPLAYS_MAX][TICK_MAX]; static Pixel background[Xvars::DISPLAYS_MAX]; static const char* tickColorNames[TICK_MAX]; }; BorderTickRenderer::BorderTickRenderer(Drawable oter,Xvars& x_vars, int dpy_num, const Size& outer_size) : outer(oter), xvars(x_vars), dpyNum(dpy_num), outerSize(outer_size) { if (!xvars.is_valid(xValid[dpyNum])) { init_x(xvars,dpyNum,outerSize); } } BorderTickRenderer::~BorderTickRenderer() { } void BorderTickRenderer::begin_draw(int dpyNum) { // Erase the corners. for (int corner = 0; corner < CORNER_MAX; corner++) { corners[dpyNum][corner] = background[dpyNum]; } // Erase the borderBuffers. XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],background[dpyNum]); for (int border = 0; border < BORDER_MAX; border++) { Size borderSize = borderAreas[dpyNum][border].get_size(); XFillRectangle(xvars.dpy[dpyNum],borderBuffers[dpyNum][border], xvars.gc[dpyNum], 0,0,borderSize.width,borderSize.height); } XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],xvars.black[dpyNum]); } void BorderTickRenderer::end_draw(int dpyNum) { // Whack corners onto window. for (int corner = 0; corner < CORNER_MAX; corner++) { XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum], corners[dpyNum][corner]); Pos pos = cornerAreas[dpyNum][corner].get_pos(); Size size = cornerAreas[dpyNum][corner].get_size(); XFillRectangle(xvars.dpy[dpyNum],outer,xvars.gc[dpyNum], pos.x,pos.y,size.width,size.height); // Revert GC to former state. XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],xvars.black[dpyNum]); } // Whack borderBuffers onto window. for (int border = 0; border < BORDER_MAX; border++) { Pos pos = borderAreas[dpyNum][border].get_pos(); Size size = borderAreas[dpyNum][border].get_size(); XCopyArea(xvars.dpy[dpyNum],borderBuffers[dpyNum][border],outer, xvars.gc[dpyNum], 0,0,size.width,size.height, pos.x,pos.y); } } Boolean BorderTickRenderer::draw_tick(TickType tt,CMN_DRAWABLE window, Xvars &,int dpyNum, const Size &arenaSize, Dir tickDir,int offset) { // Sanity check on the sizes passed around. assert((arenaSize.width == outerSize.width - 2 * TICK_BORDER_WIDTH) && (arenaSize.height == outerSize.height - 2 * TICK_BORDER_WIDTH)); assert(window == outer); int val; Boolean isBorder = dir_to_border_or_corner(val,tickDir); if (!isBorder) { // Set the value for the given corner. corners[dpyNum][val] = tickColors[dpyNum][tt]; } else { // Fill in a small line on the apropriate borderBuffer. int offset2 = offset - TICK_BORDER_WIDTH - (TICK_WIDTH >> 1); XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum], tickColors[dpyNum][tt]); switch (val) { case BORDER_R: case BORDER_L: XFillRectangle(xvars.dpy[dpyNum],borderBuffers[dpyNum][val], xvars.gc[dpyNum], 0,offset2,TICK_BORDER_WIDTH,TICK_WIDTH); break; case BORDER_DN: case BORDER_UP: XFillRectangle(xvars.dpy[dpyNum],borderBuffers[dpyNum][val], xvars.gc[dpyNum], offset2,0,TICK_WIDTH,TICK_BORDER_WIDTH); break; default: assert(0); } XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.black[dpyNum]); } return True; } void BorderTickRenderer::init_x(Xvars& xvars,int dpyNum, const Size& outerSize) { assert(!xvars.is_valid(xValid[dpyNum])); // Static initialization of xValid requires this to be true. // assert(XVARS_VALID_INIT == 0); // Allocate colors. background[dpyNum] = xvars.alloc_named_color(dpyNum,ARENA_BORDER_COLOR); for (TickType tt = 0; tt < TICK_MAX; tt++) { tickColors[dpyNum][tt] = xvars.alloc_named_color(dpyNum,tickColorNames[tt]); } // Compute areas of each border/corner. // Should have some helper in area to create areas from internal // touching dirs, or something like that. { Pos pos(outerSize.width - TICK_BORDER_WIDTH, TICK_BORDER_WIDTH); Size size; size.set(TICK_BORDER_WIDTH, outerSize.height - 2 * TICK_BORDER_WIDTH); Area area(pos,size); borderAreas[dpyNum][BORDER_R] = area; } { Pos pos(TICK_BORDER_WIDTH, outerSize.height - TICK_BORDER_WIDTH); Size size; size.set(outerSize.width - 2 * TICK_BORDER_WIDTH, TICK_BORDER_WIDTH); Area area(pos,size); borderAreas[dpyNum][BORDER_DN] = area; } { Pos pos(0, TICK_BORDER_WIDTH); Size size; size.set(TICK_BORDER_WIDTH, outerSize.height - 2 * TICK_BORDER_WIDTH); Area area(pos,size); borderAreas[dpyNum][BORDER_L] = area; } { Pos pos(TICK_BORDER_WIDTH, 0); Size size; size.set(outerSize.width - 2 * TICK_BORDER_WIDTH, TICK_BORDER_WIDTH); Area area(pos,size); borderAreas[dpyNum][BORDER_UP] = area; } // Now corners. Size cornerSize; cornerSize.set(TICK_BORDER_WIDTH,TICK_BORDER_WIDTH); { Pos pos(outerSize.width - TICK_BORDER_WIDTH, outerSize.height - TICK_BORDER_WIDTH); Area area(pos,cornerSize); cornerAreas[dpyNum][CORNER_DN_R] = area; } { Pos pos(0, outerSize.height - TICK_BORDER_WIDTH); Area area(pos,cornerSize); cornerAreas[dpyNum][CORNER_DN_L] = area; } { Pos pos(0, 0); Area area(pos,cornerSize); cornerAreas[dpyNum][CORNER_UP_L] = area; } { Pos pos(outerSize.width - TICK_BORDER_WIDTH, 0); Area area(pos,cornerSize); cornerAreas[dpyNum][CORNER_UP_R] = area; } // Create borderBuffers. for (int border = 0; border < BORDER_MAX; border++) { Size size = borderAreas[dpyNum][border].get_size(); borderBuffers[dpyNum][border] = XCreatePixmap(xvars.dpy[dpyNum],xvars.root[dpyNum], size.width,size.height, xvars.depth[dpyNum]); } xvars.mark_valid(xValid[dpyNum]); } Boolean BorderTickRenderer::dir_to_border_or_corner(int& val,Dir dir) { switch (dir) { case CO_R: val = BORDER_R; return True; case CO_DN_R: val = CORNER_DN_R; return False; case CO_DN: val = BORDER_DN; return True; case CO_DN_L: val = CORNER_DN_L; return False; case CO_L: val = BORDER_L; return True; case CO_UP_L: val = CORNER_UP_L; return False; case CO_UP: val = BORDER_UP; return True; case CO_UP_R: val = CORNER_UP_R; return False; default: assert(0); } return False;; } XvarsValid BorderTickRenderer::xValid[Xvars::DISPLAYS_MAX] = { 0, // XVARS_VALID_INIT, // Assuming that XVARS_VALID_INIT == 0, this will automatically // initialize the rest of the values. }; Area BorderTickRenderer::borderAreas[Xvars::DISPLAYS_MAX][BORDER_MAX]; Area BorderTickRenderer::cornerAreas[Xvars::DISPLAYS_MAX][CORNER_MAX]; Drawable BorderTickRenderer::borderBuffers[Xvars::DISPLAYS_MAX][BORDER_MAX]; Pixel BorderTickRenderer::corners[Xvars::DISPLAYS_MAX][CORNER_MAX]; Pixel BorderTickRenderer::tickColors[Xvars::DISPLAYS_MAX][TICK_MAX]; Pixel BorderTickRenderer::background[Xvars::DISPLAYS_MAX]; const char* BorderTickRenderer::tickColorNames[TICK_MAX] = { "yellow", "green", "red", "blue", }; // Would be better to put this and draw_string() inside of Xvars. // Size is window coordinates. void Viewport_draw_string_center(Xvars &xvars,int dpyNum, Drawable drawable,const Size& size, const char *msg) { assert(msg); Size textSize; textSize.height = xvars.bigFont[dpyNum]->max_bounds.ascent + xvars.bigFont[dpyNum]->max_bounds.descent; // get width if (xvars.bigFont[dpyNum]->per_char) { // variable width, go over all chars. textSize.width = 0; const char *p = msg; while (*p) { int index = *p - xvars.bigFont[dpyNum]->min_char_or_byte2; textSize.width += xvars.bigFont[dpyNum]->per_char[index].width; p++; } } else { // Fixed witdth font, just multiply textSize.width = xvars.bigFont[dpyNum]->max_bounds.width * strlen(msg); } // Draw in center of the arena. Pos pos((size.width - textSize.width) / 2, (size.height - textSize.height) / 2 - xvars.stretch_y(ARENA_MESSAGE_OFF_CENTER)); // Draw on black background in big font. XSetFont(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.bigFont[dpyNum]->fid); XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.black[dpyNum]); XDrawString(xvars.dpy[dpyNum],drawable, xvars.gc[dpyNum], pos.x,pos.y + xvars.bigFont[dpyNum]->max_bounds.ascent, msg,strlen(msg)); XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.arenaTextColor[dpyNum]); pos.x++; pos.y++; XDrawString(xvars.dpy[dpyNum],drawable, xvars.gc[dpyNum], pos.x,pos.y + xvars.bigFont[dpyNum]->max_bounds.ascent, msg,strlen(msg)); // Set back to default XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum],xvars.black[dpyNum]); XSetFont(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.font[dpyNum]->fid); } class IScroller { public: virtual ~IScroller(); virtual void init(Xvars&,int dpyNum,Drawable arenaBG, const Size& viewportSize) = 0; /* EFFECTS: Initialize any graphics needs of the IScroller. viewportSize is in unstretched coordinates. arenaBG is the background window behind the arena, used for drawing tricks on its border. */ virtual Boolean move_to_pos(Area& viewportArea,const Pos& pos, const Dim& innerDim,const Dim& extraDim) = 0; /* MODIFIES: vieportArea.set_pos() */ /* REQUIRES: pos is a location in the world. */ /* EFFECTS: Set the pos of viewportArea as necessary to follow an object centered at pos. Return whether the viewport moved. */ virtual void draw_arena(Window arena,Window arenaBG,WorldP,LocatorP, const Area& viewportArea,IntelP intel, Boolean forceDraw,Boolean reduceDraw, const char* arenaMessage) = 0; /* REQUIRES: xvars and dpyNum are the same as the ones given to init. */ /* EFFECTS: Draw the world and locator onto the window arena which represents the area specified by viewportArea. If forceDraw is true, must redraw everything. If arenaMessage is non-NULL, draw it in the center of the arena. */ virtual int get_border_width() = 0; /* NOTE: The Scroller owns this because it may or may want to draw tick marks in the arena border. */ virtual void reset() = 0; }; IScroller::~IScroller() { } class DiscreteScroller: public IScroller { public: DiscreteScroller(); virtual ~DiscreteScroller(); virtual void init(Xvars&,int dpyNum,Drawable,const Size&); virtual Boolean move_to_pos(Area& viewportArea,const Pos& pos, const Dim& innerDim,const Dim& extraDim); virtual void draw_arena(Window arena,Window arenaBG,WorldP,LocatorP, const Area& viewportArea,IntelP intel, Boolean forceDraw,Boolean reduceDraw, const char* arenaMessage); /* EFFECTS: Just draw what has changed. Don't scroll the background at a different rate than the foreground. Draws tick marks in the border. */ virtual int get_border_width() {return TICK_BORDER_WIDTH;} virtual void reset(); private: enum {FLASH_TIME = 3}; ITickRenderer* borderRenderer; Xvars* xvars; int dpyNum; Timer flashTimer; }; DiscreteScroller::DiscreteScroller() { borderRenderer = NULL; flashTimer.set_max(FLASH_TIME); flashTimer.set(); } DiscreteScroller::~DiscreteScroller() { delete borderRenderer; } void DiscreteScroller::init(Xvars& x_vars,int dpy_num,Drawable arenaBG, const Size& viewportSize) { xvars = &x_vars; dpyNum = dpy_num; Size outerSize = xvars->stretch_size(viewportSize); outerSize.width += 2 * TICK_BORDER_WIDTH; outerSize.height += 2 * TICK_BORDER_WIDTH; borderRenderer = new BorderTickRenderer(arenaBG,*xvars,dpyNum,outerSize); assert(borderRenderer); } Boolean DiscreteScroller::move_to_pos(Area& viewportArea,const Pos& pos, const Dim& innerDim, const Dim& extraDim) { // Center the viewport on a chunk of this size. // The entire viewport has size // innerDim + 2 * get_extra_dim() // The Loc containing pos. Loc l; l.set(pos.y / WSQUARE_HEIGHT,pos.x / WSQUARE_WIDTH); Pos oldPos = viewportArea.get_pos(); // Scroll by rooms. Loc vLoc; vLoc.r = innerDim.rowMax * (l.r / innerDim.rowMax) - extraDim.rowMax; vLoc.c = innerDim.colMax * (l.c / innerDim.colMax) - extraDim.colMax; Pos newPos(vLoc.c * WSQUARE_WIDTH,vLoc.r * WSQUARE_HEIGHT); // No change. if (oldPos == newPos) { return False; } // Move to new position. else { viewportArea.set_pos(newPos); return True; } } void DiscreteScroller::draw_arena(Window arena,Window arenaBG, WorldP world,LocatorP locator, const Area& viewportArea,IntelP intel, Boolean forceDraw, Boolean, const char* arenaMessage) { // Redraw the entire visible portion of the World only if necessary. if (forceDraw) { // Don't use reduceDraw with Discrete scrolling. If we wanted it to // work, we would have to make locator->draw_buffered take the // reduceDraw argument. world->draw(arena,*xvars,dpyNum,viewportArea,False,False); } // Get the viewportArea as a Box. Pos vPos = viewportArea.get_pos(); Size vSize = viewportArea.get_size(); // SmallViewport should never be scrolled in increments other than // wsquares. assert(vPos.x % WSQUARE_WIDTH == 0 && vPos.y % WSQUARE_HEIGHT == 0); assert(vSize.width % WSQUARE_WIDTH == 0 && vSize.height % WSQUARE_HEIGHT == 0); Loc vLoc; vLoc.set(vPos.y / WSQUARE_HEIGHT,vPos.x / WSQUARE_WIDTH); Dim vDim(vSize.height / WSQUARE_HEIGHT,vSize.width / WSQUARE_WIDTH); Box viewportBox(vLoc,vDim); // Draw all visible objects. locator->draw_buffered(arena,*xvars,dpyNum,viewportBox); flashTimer.clock(); // Draw tick marks on the border around the arena. if (intel) { // Every few turns, don't draw the tick marks. if (flashTimer.ready()) { // Begin and end draw to erase border. borderRenderer->begin_draw(dpyNum); borderRenderer->end_draw(dpyNum); flashTimer.set(); } else { locator->draw_ticks(arenaBG,*xvars,dpyNum, viewportArea,intel->get_id(), borderRenderer); } } if (arenaMessage) { Viewport_draw_string_center(*xvars,dpyNum,arena, xvars->stretch_size(vSize), arenaMessage); } } void DiscreteScroller::reset() { // This will clear out any tick marks. borderRenderer->begin_draw(dpyNum); borderRenderer->end_draw(dpyNum); } class SmoothScroller: public IScroller { public: SmoothScroller(); virtual ~SmoothScroller(); virtual void init(Xvars&,int dpyNum,Drawable,const Size& viewportSize); virtual Boolean move_to_pos(Area& viewportArea,const Pos& pos, const Dim& innerDim,const Dim& extraDim); /* EFFECTS: Smooth scrolling. */ virtual void draw_arena(Window arena,Window arenaBG,WorldP,LocatorP, const Area& viewportArea,IntelP intel, Boolean forceDraw,Boolean reduceDraw, const char* arenaMessage); /* EFFECTS: Redraw entire screen. Scroll the background at a different rate than the foreground. */ virtual int get_border_width() {return SMOOTH_BORDER_WIDTH;} virtual void reset() {} private: Xvars* xvars; int dpyNum; // The double-buffer. Pixmap buffer; }; SmoothScroller::SmoothScroller() { } void SmoothScroller::init(Xvars& x_vars,int dpy_num,Drawable, const Size& viewportSize) { xvars = &x_vars; dpyNum = dpy_num; // In window coordinates, does not include border. Size arenaSize = xvars->stretch_size(viewportSize); if (Viewport::get_use_buffer()) { // Create back-buffer the size of the arena, without the border. buffer = XCreatePixmap(xvars->dpy[dpyNum], xvars->root[dpyNum], arenaSize.width, arenaSize.height, xvars->depth[dpyNum]); } } SmoothScroller::~SmoothScroller() { if (Viewport::get_use_buffer()) { XFreePixmap(xvars->dpy[dpyNum],buffer); } } Boolean SmoothScroller::move_to_pos(Area& viewportArea,const Pos& pos, const Dim&,const Dim&) { Pos posOld = viewportArea.get_pos(); Pos posNew = pos - 0.5f * viewportArea.get_size(); viewportArea.set_pos(posNew); return !(posOld == posNew); } void SmoothScroller::draw_arena(Window arena,Window, WorldP world,LocatorP locator, const Area& viewportArea,IntelP intel, Boolean,Boolean reduceDraw, const char* arenaMessage) { Boolean useBuffer = Viewport::get_use_buffer(); Pixmap dest = (useBuffer ? buffer : arena); // Window coordinates. Size arenaInner = xvars->stretch_size(viewportArea.get_size()); // Only need to fill with black if not drawing the background. if (reduceDraw) { XFillRectangle(xvars->dpy[dpyNum],dest,xvars->gc[dpyNum], 0,0,arenaInner.width,arenaInner.height); } // Draw world on the back-buffer. Will redraw entire world each turn. world->draw(dest,*xvars,dpyNum,viewportArea,reduceDraw,True); // Draw all objects directly to dest. locator->draw_directly(dest,*xvars,dpyNum,viewportArea); // Draw tick marks on margins of screen. if (intel) { // Use locator as the implementation of ITickRenderer. This uses // the XPM tick mark images. locator->draw_ticks(dest,*xvars,dpyNum, viewportArea,intel->get_id(), locator); } if (arenaMessage) { Viewport_draw_string_center(*xvars,dpyNum,dest, arenaInner, arenaMessage); } // Whack back-buffer onto window. if (useBuffer) { XCopyArea(xvars->dpy[dpyNum],buffer,arena,xvars->gc[dpyNum], 0,0, arenaInner.width, arenaInner.height, 0,0); } } Viewport::Viewport(int arg_c,char** arg_v, Xvars& x_vars,int dNum, WorldP wrld,LocatorP lctr, Boolean smoothScroll,int mNum, IDifficultyCallback* diffCB, IStyleInfo* styInfo, IKeyObserver* kObserver, // IChatObserver* cObserver, const DifficultyLevel dLevels[DIFFICULTY_LEVELS_NUM], RoleType rType, ViewportCallback callbacks[VIEWPORT_CB_NUM], void* clos) : argc(arg_c), argv(arg_v), xvars(x_vars), dpyNum(dNum), world(wrld), locator(lctr), menusNum(mNum) { intel = NULL; roleType = rType; input = UI_INPUT_NONE; cursorDefined = False; arenaMessage = NULL; redrawArena = True; promptDifficulty = False; keyState = new KeyState(); keyDispatcher = new KeyDispatcher(); assert(keyDispatcher); diffCallback = diffCB; styleInfo = styInfo; keyObserver = kObserver; // chatObserver = cObserver; difficultyLevels = dLevels; // Create PanelClosures // NOTE: Creating one for menuStyle even though it is not used. for (int n = 0; n < VIEWPORT_CB_NUM; n++) { PanelClosure* p = new PanelClosure; assert(p); // Certain menu items must enforce radio-button behavior. if (n == menuScenarios || n == menuLevels || n == menuKill || n == menuDuel || n == menuExtended || n == menuTraining) { p->radio = True; } else { p->radio = False; } p->viewport = this; // The viewport callback. p->callback = callbacks[n]; panelClosures.add((void*)p); } // The one closure for all ViewportCallbacks. closure = clos; if (smoothScroll) { scroller = new SmoothScroller(); } else { scroller = new DiscreteScroller(); } assert(scroller); } void Viewport::init() { // Call all the virtual functions here that we aren't allowed to call // in the constructor. Is there a hard-core C++ guru out there who // knows a better way of doing this? // Dimensions of viewport are slightly larger than the innerDim. Dim viewportDim = get_inner_dim(); Dim extraDim = get_extra_dim(); viewportDim.colMax += 2 * extraDim.colMax; viewportDim.rowMax += 2 * extraDim.rowMax; // Start alligned with upper-left of world. Pos pos(0,0); Size size; size.set(viewportDim); Area vArea(pos,size); viewportArea = vArea; if (!sizeValid[dpyNum]) { init_sizes(xvars,dpyNum,world); } create_toplevel(); scroller->init(xvars,dpyNum,arenaBG,viewportArea.get_size()); } Viewport::~Viewport() { assert (panelClosures.length() == VIEWPORT_CB_NUM); int n; for (n = 0; n < panelClosures.length(); n++) { PanelClosure* p = (PanelClosure*)panelClosures.get(n); delete p; } Utils::freeif(arenaMessage); delete keyDispatcher; delete keyState; for (n = 0; n < menusNum; n++) { delete menus[n]; } for (n = 0; n < VW_STATUSES_NUM; n++) { delete statuses[n]; } delete humansPlaying; delete enemiesPlaying; delete messageBar; delete level; delete scroller; XDestroyWindow(xvars.dpy[dpyNum],toplevel); } void Viewport::set_menu_controls(Boolean val) { assert(menusNum > menuControls); ((TogglePanel*)menus[menuControls])->set_value(val); } Boolean Viewport::get_menu_learn_controls() { assert(menusNum > menuLearnControls); return ((TogglePanel*)menus[menuLearnControls])->get_value(); } void Viewport::set_menu_learn_controls(Boolean val) { assert(menusNum > menuLearnControls); ((TogglePanel*)menus[menuLearnControls])->set_value(val); } void Viewport::set_menu_humans_num(int val) { assert(menusNum > menuHumansNum); ostrstream str; str << val << ends; ((WritePanel *)menus[menuHumansNum])->set_value(str.str()); delete str.str(); } void Viewport::set_menu_enemies_num(int val) { assert(menusNum > menuEnemiesNum); ostrstream str; str << val << ends; ((WritePanel *)menus[menuEnemiesNum])->set_value(str.str()); delete str.str(); } void Viewport::set_menu_help(Boolean val) { assert(menusNum > menuHelp); ((TogglePanel*)menus[menuHelp])->set_value(val); } void Viewport::set_enemies_refill(Boolean val) { ((TogglePanel *)menus[menuEnemiesRefill])->set_value(val); } void Viewport::set_style_and_role_type(GameStyleType style,RoleType roleType) { assert(menusNum == VW_MENUS_PRIMARY_NUM); // Set value of radio buttons. ((TogglePanel *)menus[menuScenarios])->set_value(style == SCENARIOS); ((TogglePanel *)menus[menuLevels])->set_value(style == LEVELS); ((TogglePanel *)menus[menuKill])->set_value(style == KILL); ((TogglePanel *)menus[menuDuel])->set_value(style == DUEL); ((TogglePanel *)menus[menuExtended])->set_value(style == EXTENDED); ((TogglePanel *)menus[menuTraining])->set_value(style == TRAINING); // EnemiesNum menus[menuEnemiesNum]-> set_sensitive(Role::uses_enemies_num(roleType) && GameStyle::uses_enemies_num(style)); // EnemiesRefill menus[menuEnemiesRefill]-> set_sensitive(Role::uses_enemies_refill(roleType) && GameStyle::uses_enemies_refill(style)); // GameStyle Boolean enabled = Role::uses_game_style(roleType); menus[menuLevels]->set_sensitive(enabled); menus[menuScenarios]->set_sensitive(enabled); menus[menuKill]->set_sensitive(enabled); menus[menuDuel]->set_sensitive(enabled); menus[menuExtended]->set_sensitive(enabled); menus[menuTraining]->set_sensitive(enabled); // HumansNum menus[menuHumansNum]->set_sensitive(Role::uses_humans_num(roleType)); // Cooperative menus[menuCooperative]->set_sensitive(Role::uses_cooperative(roleType)); } void Viewport::set_quanta(Quanta quanta) { assert(menusNum > menuQuanta); ostrstream str; str << quanta << ends; ((WritePanel *)menus[menuQuanta])->set_value(str.str()); delete str.str(); } void Viewport::set_cooperative(Boolean val) { assert(menusNum > menuCooperative); ((TogglePanel *)menus[menuCooperative])->set_value(val); } void Viewport::set_humans_playing(int val) { ostrstream msg; if (val == 1) { msg << "1 Human" << ends; } else { msg << val << " Humans" << ends; } char *msg_str = msg.str(); humansPlaying->set_message(msg_str); delete msg_str; } void Viewport::set_enemies_playing(int val) { ostrstream msg; if (val == 1) { msg << "1 Enemy" << ends; } else { msg << val << " Enemies" << ends; } char *msg_str = msg.str(); enemiesPlaying->set_message(msg_str); delete msg_str; } const char* Viewport::get_level() { return level->get_message(); } void Viewport::set_level(const char* val) { level->set_message(val); } void Viewport::set_input(UIinput inpt) { assert(inpt != UI_INPUT_NONE); input = inpt; } void Viewport::set_message(const char* message) { messageBar->set_message(message); } void Viewport::set_arena_message(const char* msg,Quanta time) { Utils::freeif(arenaMessage); arenaMessage = Utils::strdup(msg); arenaMessageTimer.set(time); redrawArena = True; } void Viewport::register_intel(int humanColorNum,IntelP intl) { assert(intl); intel = intl; // Set colors of status panels to be those of the human. if (intel->is_human()) { Pixel pixel = xvars.humanColors[dpyNum][humanColorNum]; for (int num = 0; num < VW_STATUSES_NUM; num++) { statuses[num]->set_foreground(pixel); } } } void Viewport::clear_all() { XClearWindow(xvars.dpy[dpyNum],arena); for (int mm = 0; mm < menusNum; mm++) { menus[mm]->clear(); } for (int s = 0; s < VW_STATUSES_NUM; s++) { statuses[s]->clear(); } humansPlaying->clear(); enemiesPlaying->clear(); messageBar->clear(); level->clear(); } void Viewport::unclear_all() { redrawArena = True; for (int mm = 0; mm < menusNum; mm++) { menus[mm]->redraw(); } for (int s = 0; s < VW_STATUSES_NUM; s++) { statuses[s]->redraw(); } humansPlaying->redraw(); enemiesPlaying->redraw(); messageBar->redraw(); level->redraw(); } void Viewport::set_prompt_difficulty(Boolean val) { promptDifficulty = val; redrawArena = True; } Boolean Viewport::has_window(Window w) { // Check toplevel and arena. if (toplevel == w || arena == w) { return True; } // Check menus. int m; for (m = 0; m < menusNum; m++) { if (menus[m]->get_window() == w) { return True; } } // Check statuses. for (m = 0; m < VW_STATUSES_NUM; m++) { if (statuses[m]->get_window() == w) { return True; } } if (humansPlaying->get_window() == w) { return True; } if (enemiesPlaying->get_window() == w) { return True; } if (messageBar->get_window() == w) { return True; } if (level->get_window() == w) { return True; } return False; } void Viewport::reset() { intel = NULL; redrawArena = True; promptDifficulty = False; Utils::freeif(arenaMessage); // Actual message being displayed. for (int m = 0; m < VW_STATUSES_NUM; m++) { statuses[m]->set_message(""); statuses[m]->set_foreground(xvars.black[dpyNum]); } Dim extraDim = get_extra_dim(); messageBar->set_chat(False); Pos zeroPos; viewportArea.set_pos(zeroPos); scroller->reset(); } void Viewport::process_event(XEvent* event) { assert(has_window(event->xany.window)); // Put this first becase messageBar wants to capture all key events // for chat mode. if (messageBar->process_event(dpyNum,event)) { return; } // Events on the toplevel or arena. if (event->xany.window == toplevel || event->xany.window == arena) { switch(event->type) { case Expose: expose(event); break; case KeyPress: key_press(event); break; case KeyRelease: key_release(event); break; case ButtonPress: button_press(event); break; default: cerr << "Warning: Unexpected event of type " << event->type << endl; break; } return; } // Send to all menus/statuses/etc. int m; for (m = 0; m < menusNum; m++) { if (menus[m]->process_event(dpyNum,event)) { return; } } for (m = 0; m < VW_STATUSES_NUM; m++) { if (statuses[m]->process_event(dpyNum,event)) { return; } } if (humansPlaying->process_event(dpyNum,event)) { return; } if (enemiesPlaying->process_event(dpyNum,event)) { return; } if (level->process_event(dpyNum,event)) { return; } } IViewportInfo* Viewport::get_info() { if (!vInfoProvider) { vInfoProvider = new VInfoProvider(); assert(vInfoProvider); } return vInfoProvider; } void Viewport::init_viewport_info(Boolean isStretched,Boolean smoothScroll) { // Make sure provider has been created. VInfoProvider* provider = (VInfoProvider*)get_info(); if (isStretched) { provider->set_viewport_info(LargeViewport::get_info(smoothScroll)); } else { provider->set_viewport_info(SmallViewport::get_info(smoothScroll)); } } // Implement IDispatcher. void Viewport::dispatch(ITcommand command,void*) { if (!acceptInput) { return; } // Can chat even if no associated human. For Server in observer mode. if (command == IT_CHAT) { // Only enable Chat mode if the current Role supports it. if (Role::uses_chat(styleInfo->get_role_type())) { messageBar->set_chat(True); } return; } // If there is an intel associated with the viewport, give command to it. if (intel && intel->is_playing()) { // Only give the command to a human. if (intel->is_human()) { ((HumanP)intel)->set_command(command); } return; } // No associated intel, so scroll with the keyset. Boolean changed; switch (command) { // Right. case IT_R: changed = shift_viewport(COL_SHIFT,0); break; // Down right. case IT_DN_R: changed = shift_viewport(COL_SHIFT,ROW_SHIFT); break; // Down. case IT_DN: changed = shift_viewport(0,ROW_SHIFT); break; // Down left. case IT_DN_L: changed = shift_viewport(-COL_SHIFT,ROW_SHIFT); break; // Left. case IT_L: changed = shift_viewport(-COL_SHIFT,0); break; // Up left. case IT_UP_L: changed = shift_viewport(-COL_SHIFT,-ROW_SHIFT); break; // Up. case IT_UP: changed = shift_viewport(0,-ROW_SHIFT); break; // Up right. case IT_UP_R: changed = shift_viewport(COL_SHIFT,-ROW_SHIFT); break; default: changed = False; } if (changed) { redrawArena = True; } } void Viewport::pre_clock() { // Before check for death in follow_intel(). update_statuses(); follow_intel(); draw(); arenaMessageTimer.clock(); // Clear arenaMessage being displayed if time is up. if (arenaMessage && arenaMessageTimer.ready()) { Utils::freeif(arenaMessage); // Clean up the message next time. redrawArena = True; } } void Viewport::post_clock() { // Want this immediately after the events have been pulled from the // queue and before Locator::clock(). if (input != UI_INPUT_NONE) { keyDispatcher->clock(keyState,this,NULL); } } void Viewport::expose(XEvent*) { if (!cursorDefined) { XDefineCursor(xvars.dpy[dpyNum],arena,xvars.arenaCursor[dpyNum]); cursorDefined = True; } // Mark dirty to force a redraw. redrawArena = True; draw(); } // Helper macros for Viewport::key_press(). #define NUM_KEY_EQ(keySym) \ ((event->xkey.keycode == XKeysymToKeycode(xvars.dpy[dpyNum],XK_ ## keySym)) || \ (event->xkey.keycode == XKeysymToKeycode(xvars.dpy[dpyNum],XK_KP_ ## keySym))) void Viewport::key_press(XEvent *event) { // If waiting for user to enter difficulty, don't accept anything else. if (promptDifficulty) { // Should be DIFFICULTY_LEVELS_NUM of these. It'd be nice to // abstract this more. if (NUM_KEY_EQ(0)) { diffCallback->change_difficulty(0); } else if (NUM_KEY_EQ(1)) { diffCallback->change_difficulty(1); } else if (NUM_KEY_EQ(2)) { diffCallback->change_difficulty(2); } else if (NUM_KEY_EQ(3)) { diffCallback->change_difficulty(3); } if (event->xkey.keycode == XKeysymToKeycode(xvars.dpy[dpyNum],XK_space)) { diffCallback->change_difficulty(DIFF_NORMAL); } return; } // The observer will translate the keycode into a key and send it // back to Viewport::receive_key. Note that it may send it to // receive_key on a different viewport. keyObserver->key_event(dpyNum,event->xkey.keycode,True); } void Viewport::key_release(XEvent *event) { if (promptDifficulty) { return; } keyObserver->key_event(dpyNum,event->xkey.keycode,False); } void Viewport::receive_key(int key,Boolean down) { keyState->set(key,down); } void Viewport::button_press(XEvent *event) { if (promptDifficulty) { diffCallback->change_difficulty(DIFF_NORMAL); return; } // Button1 moves your character. if (event->xbutton.button == Button1) { dispatch(Intel::dir_to_command(button_press_to_dir(event)),NULL); } // Button2 fires weapon. else if (event->xbutton.button == Button2) { dispatch(Intel::dir_to_command_weapon(button_press_to_dir(event)),NULL); } // Button3 changes weapon. else if (event->xbutton.button == Button3) { dispatch(IT_WEAPON_CHANGE,NULL); } } void Viewport::init_sizes(Xvars& xvars,int dpyNum,WorldP) { Dim innerDim = get_inner_dim(); Dim extraDim = get_extra_dim(); int border = scroller->get_border_width(); innerSize[dpyNum].set(xvars.stretch_x(innerDim.colMax * WSQUARE_WIDTH), xvars.stretch_y(innerDim.rowMax * WSQUARE_HEIGHT)); arenaSize[dpyNum].width = innerSize[dpyNum].width + xvars.stretch_x(2 * WSQUARE_WIDTH * extraDim.colMax) + 2 * border; arenaSize[dpyNum].height = innerSize[dpyNum].height + xvars.stretch_y(2 * WSQUARE_HEIGHT * extraDim.rowMax) + 2 * border; } void Viewport::panel_callback(Panel* panel,void* value,void* closure) { PanelClosure* pClosure = (PanelClosure*)closure; assert(pClosure); // Enforce radio button behavior for certain panels. // Make sure you can't uncheck the active button. // The logic to unselect the active button when another one is set is // in Viewport::set_style(). // // Would be much better to put the radio-button logic in the Panel classes. if (pClosure->radio) { // SGI compiler says you can't cast void* to Boolean. Boolean bValue = (Boolean)(int)value; if (!bValue) { ((TogglePanel*)panel)->set_value(True); } } // Call the appropriate callback registered in the Viewport constructor // with the closure given to the Viewport constructor. pClosure->callback(value,pClosure->viewport, pClosure->viewport->closure); } Dir Viewport::button_press_to_dir(XEvent *event) { assert(event->type == ButtonPress); if (event->xbutton.x < arenaSize[dpyNum].width * 0.3333) { if (event->xbutton.y < arenaSize[dpyNum].height * 0.3333) { return CO_UP_L; } else if (event->xbutton.y < arenaSize[dpyNum].height * 0.6666) { return CO_L; } else { return CO_DN_L; } } else if (event->xbutton.x < arenaSize[dpyNum].width * .6666) { if (event->xbutton.y < arenaSize[dpyNum].height * 0.3333) { return CO_UP; } else if (event->xbutton.y < arenaSize[dpyNum].height * 0.6666) { return CO_air; } else { return CO_DN; } } else { if (event->xbutton.y < arenaSize[dpyNum].height * 0.3333) { return CO_UP_R; } else if (event->xbutton.y < arenaSize[dpyNum].height * 0.6666) { return CO_R; } else { return CO_DN_R; } } } void Viewport::draw() { // Just draw some text in the middle of the arena. if (promptDifficulty) { if (redrawArena) { XClearWindow(xvars.dpy[dpyNum],arena); // prompt user for level of difficulty. XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.red[dpyNum]); Pos pos(xvars.fontSize[dpyNum].width,xvars.fontSize[dpyNum].height); draw_string(pos,"Enter level of difficulty:"); pos.y += xvars.fontSize[dpyNum].height; for (int n = 0; n < DIFFICULTY_LEVELS_NUM; n++) { ostrstream str; str << "[" << n; if (n == DIFF_NORMAL) { str << ",space] "; } else { str << "] "; } str << difficultyLevels[n].name << ends; pos.y += xvars.fontSize[dpyNum].height; draw_string(pos,str.str()); delete str.str(); } XSetForeground(xvars.dpy[dpyNum],xvars.gc[dpyNum], xvars.black[dpyNum]); } } // Normal drawing. else { // Draw world and all objects. scroller->draw_arena(arena,arenaBG,world,locator,viewportArea,intel, redrawArena,reduceDraw,arenaMessage); } // Mark as not dirty. We just brought everything up to date. redrawArena = False; } void Viewport::draw_string(const Pos &pos,char *msg) { XDrawString(xvars.dpy[dpyNum],arena, xvars.gc[dpyNum], pos.x,pos.y + xvars.font[dpyNum]->max_bounds.ascent, msg,strlen(msg)); } Boolean Viewport::shift_viewport(int cols,int rows) { Pos shift(cols * WSQUARE_WIDTH,rows * WSQUARE_HEIGHT); const Dim worldDim = world->get_dim(); Pos pos = viewportArea.get_pos(); Size size = viewportArea.get_size(); if (shift.x > 0) { if (pos.x + shift.x < worldDim.colMax * WSQUARE_WIDTH) { pos.x += shift.x; } } if (shift.x < 0) { if (pos.x + size.width + shift.x > 0) { pos.x += shift.x; } } if (shift.y > 0) { if (pos.y + shift.y < worldDim.rowMax * WSQUARE_HEIGHT) { pos.y += shift.y; } } if (shift.y < 0) { if (pos.y + size.height + shift.y > 0) { pos.y += shift.y; } } // See if we actually changed pos. if (!(pos == viewportArea.get_pos())) { viewportArea.set_pos(pos); return True; } return False; } void Viewport::create_toplevel() { const char* title = NULL; switch (roleType) { case R_STAND_ALONE: title = "XEvil"; break; case R_CLIENT: title = "XEvil [Client]"; break; case R_SERVER: title = "XEvil [Server]"; break; default: assert(0); } toplevel = xvars.create_toplevel_window(argc,argv,dpyNum,viewportSize[dpyNum], title,KeyPressMask | KeyReleaseMask); #if 0 toplevel = XCreateSimpleWindow(xvars.dpy[dpyNum],xvars.root[dpyNum],0,0, viewportSize[dpyNum].width, viewportSize[dpyNum].height, 0,xvars.windowBorder[dpyNum], xvars.windowBg[dpyNum]); XSizeHints size_hints; size_hints.flags = PPosition | PSize | PMinSize | PMaxSize; size_hints.min_width = viewportSize[dpyNum].width; size_hints.min_height = viewportSize[dpyNum].height; size_hints.max_width = viewportSize[dpyNum].width; size_hints.max_height = viewportSize[dpyNum].height; XTextProperty windowName, iconName; char *window_name = "XEvil"; // Will appear on window. char *icon_name = "XEvil"; Status stat = XStringListToTextProperty(&window_name,1,&windowName); assert(stat); stat = XStringListToTextProperty(&icon_name,1,&iconName); assert(stat); XWMHints wm_hints; wm_hints.initial_state = NormalState; wm_hints.input = True; wm_hints.icon_pixmap = xvars.icon[dpyNum]; wm_hints.flags = StateHint | IconPixmapHint | InputHint; XClassHint class_hints; class_hints.res_name = argv[0]; class_hints.res_class = "XEvil"; XSetWMProperties(xvars.dpy[dpyNum],toplevel, &windowName,&iconName,argv,argc, &size_hints,&wm_hints,&class_hints); XSelectInput(xvars.dpy[dpyNum],toplevel, KeyPressMask | KeyReleaseMask); // Add WM_DELETE_WINDOW protocol XChangeProperty(xvars.dpy[dpyNum],toplevel, xvars.wmProtocols[dpyNum],XA_ATOM, 32,PropModePrepend, (unsigned char *)&xvars.wmDeleteWindow[dpyNum], 1); #endif create_menus(); create_arena(); create_statuses(); create_intels_playing(); create_message_bar(); create_level(); XMapWindow(xvars.dpy[dpyNum],arena); XMapWindow(xvars.dpy[dpyNum],arenaBG); XMapWindow(xvars.dpy[dpyNum],toplevel); } void Viewport::create_menus() { if (!menusNum) { return; } Pixel menuBg = xvars.alloc_named_color(dpyNum,MENU_BG_COLOR); Panel *p = NULL; // Compute sizes for all menus. Size quitUnit = ButtonPanel::get_unit(xvars.font[dpyNum],QUIT_LINE_LENGTH); Size newGameUnit = ButtonPanel::get_unit(xvars.font[dpyNum],NEW_GAME_LINE_LENGTH); Size humansNumUnit = WritePanel::get_unit(xvars.font[dpyNum],HUMANS_NUM_LINE_LENGTH); Size enemiesNumUnit = WritePanel::get_unit(xvars.font[dpyNum],ENEMIES_NUM_LINE_LENGTH); Size enemiesRefillUnit = TogglePanel::get_unit(xvars.font[dpyNum],ENEMIES_REFILL_LINE_LENGTH); Size controlsUnit = TogglePanel::get_unit(xvars.font[dpyNum],CONTROLS_LINE_LENGTH); Size learnControlsUnit = TogglePanel::get_unit(xvars.font[dpyNum],LEARN_CONTROLS_LINE_LENGTH); Size styleUnit = TogglePanel::get_unit(xvars.font[dpyNum],STYLE_LINE_LENGTH); Size scenariosUnit = TogglePanel::get_unit(xvars.font[dpyNum],SCENARIOS_LINE_LENGTH); Size levelsUnit = TogglePanel::get_unit(xvars.font[dpyNum],LEVELS_LINE_LENGTH); Size killUnit = TogglePanel::get_unit(xvars.font[dpyNum],KILL_LINE_LENGTH); Size duelUnit = TogglePanel::get_unit(xvars.font[dpyNum],DUEL_LINE_LENGTH); Size extendedUnit = TogglePanel::get_unit(xvars.font[dpyNum],EXTENDED_LINE_LENGTH); Size trainingUnit = TogglePanel::get_unit(xvars.font[dpyNum],TRAINING_LINE_LENGTH); Size quantaUnit = WritePanel::get_unit(xvars.font[dpyNum],QUANTA_LINE_LENGTH); Size cooperativeUnit = WritePanel::get_unit(xvars.font[dpyNum],COOPERATIVE_LINE_LENGTH); Size helpUnit = TextPanel::get_unit(xvars.font[dpyNum],HELP_LINE_LENGTH); // Create actual menu panels. // Menus created at (0,0) for Large and Small Viewports. Pos pos(0,0); if (menusNum == VW_MENUS_PRIMARY_NUM) { assert(dpyNum == 0); // Quit button. p = menus[menuQuit] = new ButtonPanel(dpyNum,xvars,toplevel, pos,quitUnit, Viewport::panel_callback,panelClosures.get(menuQuit), "Quit"); assert(p); p->set_background(menuBg,False); pos.x += quitUnit.width; // New Game button. p = menus[menuNewGame] = new ButtonPanel(dpyNum,xvars,toplevel, pos,newGameUnit, Viewport::panel_callback,panelClosures.get(menuNewGame), "New Game"); assert(p); p->set_background(menuBg,False); pos.x += newGameUnit.width; // Humans WritePanel p = menus[menuHumansNum] = new WritePanel(dpyNum,xvars,toplevel, pos,humansNumUnit, Viewport::panel_callback,panelClosures.get(menuHumansNum), "Humans:"); assert(p); p->set_background(menuBg,False); pos.x += humansNumUnit.width; // Enemies WritePanel p = menus[menuEnemiesNum] = new WritePanel(dpyNum,xvars,toplevel, pos,enemiesNumUnit, Viewport::panel_callback,panelClosures.get(menuEnemiesNum), "Enemies:"); assert(p); p->set_background(menuBg,False); pos.x += enemiesNumUnit.width; // Enemies Refill TogglePanel p = menus[menuEnemiesRefill] = new TogglePanel(dpyNum,xvars,toplevel, pos,enemiesRefillUnit, Viewport::panel_callback, panelClosures.get(menuEnemiesRefill), "Regen Enemies"); assert(p); p->set_background(menuBg,False); pos.x += enemiesRefillUnit.width; } else { assert(menusNum == VW_MENUS_SECONDARY_NUM); } // Learn Controls ButtonPanel p = menus[menuLearnControls] = new TogglePanel(dpyNum,xvars,toplevel, pos,learnControlsUnit, Viewport::panel_callback, panelClosures.get(menuLearnControls), "Set Controls"); assert(p); p->set_background(menuBg,False); pos.x += learnControlsUnit.width; // Controls TogglePanel p = menus[menuControls] = new TogglePanel(dpyNum,xvars,toplevel, pos,controlsUnit, Viewport::panel_callback, panelClosures.get(menuControls), "Show Controls"); assert(p); p->set_background(menuBg,False); pos.x += controlsUnit.width; // speed now in first row. if (menusNum == VW_MENUS_PRIMARY_NUM) { p = menus[menuQuanta] = new WritePanel(dpyNum,xvars,toplevel, pos,quantaUnit, Viewport::panel_callback,panelClosures.get(menuQuanta), "Speed(ms):"); assert(p); p->set_background(menuBg,False); pos.x += quantaUnit.width; } // Second row. pos.x = 0; pos.y += quitUnit.height; if (menusNum == VW_MENUS_PRIMARY_NUM) { // Game stlye header. p = menus[menuStyle] = new TextPanel(dpyNum,xvars,toplevel, pos,styleUnit, NULL,NULL, "Game style:"); assert(p); // p->set_background(menuBg,False); pos.x += styleUnit.width; // Levels game style. p = menus[menuLevels] = new TogglePanel(dpyNum,xvars,toplevel, pos,levelsUnit, Viewport::panel_callback,panelClosures.get(menuLevels), "Levels"); assert(p); p->set_background(menuBg,False); pos.x += levelsUnit.width; // Scenarios game style. p = menus[menuScenarios] = new TogglePanel(dpyNum,xvars,toplevel, pos,scenariosUnit, Viewport::panel_callback, panelClosures.get(menuScenarios), "Scenarios"); assert(p); p->set_background(menuBg,False); pos.x += scenariosUnit.width; // Kill, Kill, Kill game style. p = menus[menuKill] = new TogglePanel(dpyNum,xvars,toplevel, pos,killUnit, Viewport::panel_callback,panelClosures.get(menuKill), "Kill, Kill, Kill"); assert(p); p->set_background(menuBg,False); pos.x += killUnit.width; // Duel game style. p = menus[menuDuel] = new TogglePanel(dpyNum,xvars,toplevel, pos,duelUnit, Viewport::panel_callback,panelClosures.get(menuDuel), "Duel"); assert(p); p->set_background(menuBg,False); pos.x += duelUnit.width; // Extended duel game style. p = menus[menuExtended] = new TogglePanel(dpyNum,xvars,toplevel, pos,extendedUnit, Viewport::panel_callback,panelClosures.get(menuExtended), "Extended Duel"); assert(p); p->set_background(menuBg,False); pos.x += extendedUnit.width; // Training game style. p = menus[menuTraining] = new TogglePanel(dpyNum,xvars,toplevel, pos,trainingUnit, Viewport::panel_callback, panelClosures.get(menuTraining), "Training"); assert(p); p->set_background(menuBg,False); pos.x += trainingUnit.width; // Cooperative mode. pos.x = viewportSize[dpyNum].width - cooperativeUnit.width - helpUnit.width; p = menus[menuCooperative] = new TogglePanel(dpyNum,xvars,toplevel, pos,cooperativeUnit, Viewport::panel_callback, panelClosures.get(menuCooperative), "Cooperative"); assert(p); p->set_background(menuBg,False); // Help button. pos.x = viewportSize[dpyNum].width - helpUnit.width; p = menus[menuHelp] = new TogglePanel(dpyNum,xvars,toplevel, pos,helpUnit, Viewport::panel_callback, panelClosures.get(menuHelp), "Help"); assert(p); p->set_background(menuBg,False); } } void Viewport::create_arena() { // The background window behind arena, used for drawing tick marks. arenaBG = XCreateSimpleWindow(xvars.dpy[dpyNum], toplevel, 0,menusSize[dpyNum].height, arenaSize[dpyNum].width, arenaSize[dpyNum].height, 0, xvars.alloc_named_color(dpyNum, ARENA_BORDER_COLOR, xvars.black[dpyNum]), xvars.alloc_named_color(dpyNum, ARENA_BORDER_COLOR, xvars.black[dpyNum])); // arenaBG doesn't really need any events. int border = scroller->get_border_width(); // Create arena just inside arenaBG. arena = XCreateSimpleWindow(xvars.dpy[dpyNum], arenaBG, border,border, arenaSize[dpyNum].width - 2 * border, arenaSize[dpyNum].height - 2 * border, 0, xvars.alloc_named_color(dpyNum, Xvars_BACKGROUND), xvars.alloc_named_color(dpyNum, Xvars_BACKGROUND)); XSelectInput(xvars.dpy[dpyNum],arena, ExposureMask | ButtonPressMask); } void Viewport::create_intels_playing() { Pos pos = intelsPlayingPos[dpyNum]; Size oneIntelPlaying = intelsPlayingSize[dpyNum]; oneIntelPlaying.height /= 2; humansPlaying = new TextPanel(dpyNum,xvars,toplevel, pos,oneIntelPlaying); assert(humansPlaying); pos.y += oneIntelPlaying.height; enemiesPlaying = new TextPanel(dpyNum,xvars,toplevel, pos,oneIntelPlaying); assert(enemiesPlaying); } void Viewport::create_message_bar() { messageBar = new ChatPanel(dpyNum,xvars,toplevel, messageBarPos[dpyNum],messageBarSize[dpyNum], Viewport::panel_callback, panelClosures.get(stChat)); assert(messageBar); } // Need better name. This refers to the status item that displays // level-specific information. void Viewport::create_level() { level = new TextPanel(dpyNum,xvars,toplevel, levelPos[dpyNum],levelSize[dpyNum]); assert(level); } void Viewport::update_statuses() { // See if we actually need to do anything. if (!intel || !intel->intel_status_changed()) { return; } const IntelStatus *status = intel->get_intel_status(); ostrstream name; name << status->name << ends; statuses[statusName]->set_message(name.str()); delete name.str(); ostrstream className; className << status->className << ends; statuses[statusClassName]->set_message(className.str()); delete className.str(); ostrstream health; if (status->health == -1) { health << "Dead" << ends; } else { health << status->health << " Health" << ends; } statuses[statusHealth]->set_message(health.str()); delete health.str(); ostrstream mass; mass << status->mass << " Mass" << ends; statuses[statusMass]->set_message(mass.str()); delete mass.str(); ostrstream weapon; if (status->weaponClassId == A_None) { weapon << "No Weapon"; } else { weapon << status->weapon; } if (status->ammo != PH_AMMO_UNLIMITED) { weapon << " (" << status->ammo << ")"; } weapon << ends; statuses[statusWeapon]-> set_foreground(status->weaponReady ? xvars.green[dpyNum] : xvars.red[dpyNum],False); statuses[statusWeapon]->set_message(weapon.str()); delete weapon.str(); ostrstream item; if (status->itemClassId == A_None) { item << "No Item"; } else { item << status->item << " (" << status->itemCount << ")"; } item << ends; statuses[statusItem]->set_message(item.str()); delete item.str(); ostrstream livesHKills; if (styleInfo->get_game_style_type() == EXTENDED) { // Takes soups into account. livesHKills << (status->humanKills - status->soups) << " Human Kills" << ends; } else { if (status->lives == IT_INFINITE_LIVES) { // Does this case ever happen? I don't think so. livesHKills << "Unlimited Lives" << ends; } else { if (status->lives == 1) { livesHKills << "1 Life" << ends; } else { livesHKills << status->lives << " Lives" << ends; } } } statuses[statusLivesHKills]->set_message(livesHKills.str()); delete livesHKills.str(); ostrstream killsMKills; if (styleInfo->get_game_style_type() == EXTENDED) { killsMKills << status->enemyKills << " Machine Kills" << ends; } else { int kills = status->humanKills + status->enemyKills; if (kills == 1) { killsMKills << "1 Kill" << ends; } else { killsMKills << kills << " Kills" << ends; } } statuses[statusKillsMKills]->set_message(killsMKills.str()); delete killsMKills.str(); } void Viewport::follow_intel() { if (intel) { // Only follow if playing. if (intel->is_playing()) { PhysicalP p; if (p = locator->lookup(intel->get_id())) { const Area &a = p->get_area(); if (scroller->move_to_pos(viewportArea,a.get_middle(), get_inner_dim(),get_extra_dim())) { redrawArena = True; } } } #if 0 // As good a place as any to check if the intel is dead. else { // Unregister the Intel. intel = NULL; } #endif } } Boolean Viewport::acceptInput = False; VInfoProvider* Viewport::vInfoProvider = NULL; Boolean Viewport::reduceDraw = False; Boolean Viewport::useBuffer = True; Boolean Viewport::sizeValid[Xvars::DISPLAYS_MAX] = { 0, // Compiler will initialize the rest of the values to zero. }; Size Viewport::menusSize[Xvars::DISPLAYS_MAX]; Size Viewport::innerSize[Xvars::DISPLAYS_MAX]; Size Viewport::arenaSize[Xvars::DISPLAYS_MAX]; Size Viewport::statusesSize[Xvars::DISPLAYS_MAX]; Pos Viewport::intelsPlayingPos[Xvars::DISPLAYS_MAX]; Size Viewport::intelsPlayingSize[Xvars::DISPLAYS_MAX]; Pos Viewport::messageBarPos[Xvars::DISPLAYS_MAX]; Size Viewport::messageBarSize[Xvars::DISPLAYS_MAX]; Pos Viewport::levelPos[Xvars::DISPLAYS_MAX]; Size Viewport::levelSize[Xvars::DISPLAYS_MAX]; Size Viewport::viewportSize[Xvars::DISPLAYS_MAX]; SmallViewport::SmallViewport(int argc,char** argv, Xvars& xvars,int dpyNum, WorldP w,LocatorP l, Boolean smoothScroll,int menusNum, IDifficultyCallback* diffCB, IStyleInfo* styleInfo, IKeyObserver* keyObserver, // IChatObserver* chatObserver, const DifficultyLevel dLevels[DIFFICULTY_LEVELS_NUM], RoleType roleType, ViewportCallback callbacks[VIEWPORT_CB_NUM], void* closure) : Viewport(argc,argv,xvars,dpyNum,w,l, smoothScroll,menusNum,diffCB,styleInfo, keyObserver,dLevels,roleType,callbacks,closure) { } Dim SmallViewport::get_inner_dim() { Dim ret(SM_ROW_MAX,SM_COL_MAX); return ret; } Dim SmallViewport::get_extra_dim() { Dim ret(SM_EXTRA_ROW,SM_EXTRA_COL); return ret; } void SmallViewport::init_sizes(Xvars& xvars,int dpyNum,WorldP world) { Viewport::init_sizes(xvars,dpyNum,world); // Statuses first to get width of viewport. statusesSize[dpyNum] = TextPanel::get_unit(xvars.font[dpyNum],SM_STATUS_LINE_LENGTH); // Minus 1 because health and mass on the same line and plus .5 to // leave a little space. statusesSize[dpyNum].height = (int) (statusesSize[dpyNum].height * (VW_STATUSES_NUM - .75)); // Menus next, needed for intelsPlayingPos. Size oneMenuUnit = ButtonPanel::get_unit(xvars.font[dpyNum],1); menusSize[dpyNum].height = 2 * oneMenuUnit.height; menusSize[dpyNum].width = arenaSize[dpyNum].width + statusesSize[dpyNum].width; // Intels Playing, two of them. intelsPlayingPos[dpyNum].x = arenaSize[dpyNum].width; intelsPlayingPos[dpyNum].y = menusSize[dpyNum].height + statusesSize[dpyNum].height; intelsPlayingSize[dpyNum] = TextPanel::get_unit(xvars.font[dpyNum],SM_STATUS_LINE_LENGTH); intelsPlayingSize[dpyNum].height *= 2; // Level-specific info, flush with bottom of arena. levelSize[dpyNum] = TextPanel::get_unit(xvars.font[dpyNum],SM_STATUS_LINE_LENGTH,2); levelPos[dpyNum].x = arenaSize[dpyNum].width; levelPos[dpyNum].y = menusSize[dpyNum].height + arenaSize[dpyNum].height - levelSize[dpyNum].height; // Message bar at bottom. messageBarPos[dpyNum].x = 0; messageBarPos[dpyNum].y = menusSize[dpyNum].height + arenaSize[dpyNum].height; messageBarSize[dpyNum] = TextPanel::get_unit(xvars.font[dpyNum],1,2); messageBarSize[dpyNum].width = arenaSize[dpyNum].width + statusesSize[dpyNum].width; // Entire size of viewport. viewportSize[dpyNum].width = arenaSize[dpyNum].width + statusesSize[dpyNum].width; viewportSize[dpyNum].height = menusSize[dpyNum].height + arenaSize[dpyNum].height + messageBarSize[dpyNum].height; } void SmallViewport::create_statuses() { Pos pos(arenaSize[dpyNum].width,menusSize[dpyNum].height); Size statusUnit; for (int n = 0; n < VW_STATUSES_NUM; n++) { if (n == statusWeapon) { statusUnit = TextPanel::get_unit(xvars.font[dpyNum],SM_STATUS_LINE_LENGTH); statuses[n] = new ButtonPanel(dpyNum,xvars,toplevel, pos,statusUnit, Viewport::panel_callback, panelClosures.get(stWeapon)); } else if (n == statusItem) { statusUnit = TextPanel::get_unit(xvars.font[dpyNum],SM_STATUS_LINE_LENGTH); statuses[n] = new ButtonPanel(dpyNum,xvars,toplevel, pos,statusUnit, Viewport::panel_callback, panelClosures.get(stItem)); } else if (n == statusHealth) { statusUnit = TextPanel::get_unit(xvars.font[dpyNum], SM_STATUS_LINE_LENGTH / 2); statuses[n] = new TextPanel(dpyNum,xvars, toplevel, pos,statusUnit); } else if (n == statusMass) { statusUnit = TextPanel::get_unit(xvars.font[dpyNum],SM_STATUS_LINE_LENGTH); Size otherStatusUnit = TextPanel::get_unit(xvars.font[dpyNum],SM_STATUS_LINE_LENGTH / 2); Pos p(pos.x + otherStatusUnit.width,pos.y); Size s; s.width = statusUnit.width - otherStatusUnit.width; s.height = statusUnit.height; statuses[n] = new TextPanel(dpyNum,xvars, toplevel,p,s); } else { statusUnit = TextPanel::get_unit(xvars.font[dpyNum],SM_STATUS_LINE_LENGTH); statuses[n] = new TextPanel(dpyNum,xvars,toplevel, pos,statusUnit); } assert(statuses[n]); if (n != statusHealth) { pos.y += statusUnit.height; } } } ViewportInfo SmallViewport::get_info(Boolean smoothScroll) { if (smoothScroll) { Size visible; visible.set((SM_COL_MAX + 2 * SM_EXTRA_COL) * WSQUARE_WIDTH, (SM_ROW_MAX + 2 * SM_EXTRA_ROW) * WSQUARE_WIDTH); ViewportInfo ret(IT_VISION_RANGE,visible); return ret; } else { Size logicalSize; logicalSize.set(SM_COL_MAX * WSQUARE_WIDTH, SM_ROW_MAX * WSQUARE_HEIGHT); Size extraSize; extraSize.set(SM_EXTRA_COL * WSQUARE_WIDTH, SM_EXTRA_ROW * WSQUARE_HEIGHT); // Non-smooth scrolling. ViewportInfo ret(IT_VISION_RANGE,logicalSize,extraSize); return ret; } } LargeViewport::LargeViewport(int argc,char** argv, Xvars& xvars,int dpyNum, WorldP w,LocatorP l, Boolean smoothScroll,int menusNum, IDifficultyCallback* diffCB, IStyleInfo* styleInfo, IKeyObserver* keyObserver, // IChatObserver* chatObserver, const DifficultyLevel dLevels[DIFFICULTY_LEVELS_NUM], RoleType roleType, ViewportCallback callbacks[VIEWPORT_CB_NUM], void* closure) : Viewport(argc,argv,xvars,dpyNum,w,l,smoothScroll, menusNum,diffCB,styleInfo, keyObserver,dLevels,roleType,callbacks,closure) { } Dim LargeViewport::get_inner_dim() { Dim ret(LG_ROW_MAX,LG_COL_MAX); return ret; } Dim LargeViewport::get_extra_dim() { Dim ret(LG_EXTRA_ROW,LG_EXTRA_COL); return ret; } void LargeViewport::init_sizes(Xvars& xvars,int dpyNum,WorldP world) { Viewport::init_sizes(xvars,dpyNum,world); // Menus. Size oneMenuUnit = ButtonPanel::get_unit(xvars.font[dpyNum],1); menusSize[dpyNum].width = arenaSize[dpyNum].width; menusSize[dpyNum].height = 2 * oneMenuUnit.height; // Get height of 2 statuses. Size statusUnit = TextPanel::get_unit(xvars.font[dpyNum],1,1); statusUnit.height *= 2; // Level-specific info. levelSize[dpyNum] = TextPanel::get_unit(xvars.font[dpyNum],LG_LEVEL_LINE_LENGTH,2); levelSize[dpyNum].height = statusUnit.height; levelPos[dpyNum].x = arenaSize[dpyNum].width - levelSize[dpyNum].width; levelPos[dpyNum].y = menusSize[dpyNum].height + arenaSize[dpyNum].height; // Status rectangles. statusesSize[dpyNum].height = statusUnit.height; statusesSize[dpyNum].width = arenaSize[dpyNum].width - levelSize[dpyNum].width; // Intels playing. intelsPlayingSize[dpyNum] = TextPanel::get_unit(xvars.font[dpyNum],LG_INTELS_LINE_LENGTH); intelsPlayingSize[dpyNum].height *= 2; intelsPlayingPos[dpyNum].x = arenaSize[dpyNum].width - intelsPlayingSize[dpyNum].width; intelsPlayingPos[dpyNum].y = levelPos[dpyNum].y + levelSize[dpyNum].height; // Message bar at bottom. messageBarPos[dpyNum].x = 0; messageBarPos[dpyNum].y = intelsPlayingPos[dpyNum].y; messageBarSize[dpyNum].width = intelsPlayingPos[dpyNum].x; messageBarSize[dpyNum].height = intelsPlayingSize[dpyNum].height; viewportSize[dpyNum].width = arenaSize[dpyNum].width; viewportSize[dpyNum].height = menusSize[dpyNum].height + arenaSize[dpyNum].height + levelSize[dpyNum].height + intelsPlayingSize[dpyNum].height; } void LargeViewport::create_statuses() { Pos pos(0,menusSize[dpyNum].height + arenaSize[dpyNum].height); Size statusUnit[4]; int n; for (n = 0; n < 4; n++) { statusUnit[n].height = statusesSize[dpyNum].height / 2; } statusUnit[0].width = (int)(0.29 * statusesSize[dpyNum].width); statusUnit[1].width = (int)(0.29 * statusesSize[dpyNum].width); statusUnit[2].width = (int)(0.18 * statusesSize[dpyNum].width); statusUnit[3].width = statusesSize[dpyNum].width - statusUnit[0].width - statusUnit[1].width - statusUnit[2].width; // First row. n = 0; statuses[statusWeapon] = new ButtonPanel(dpyNum,xvars,toplevel, pos,statusUnit[n], Viewport::panel_callback, panelClosures.get(stWeapon)); pos.x += statusUnit[n++].width; statuses[statusName] = new TextPanel(dpyNum,xvars,toplevel, pos,statusUnit[n]); pos.x += statusUnit[n++].width; statuses[statusHealth] = new TextPanel(dpyNum,xvars,toplevel, pos,statusUnit[n]); pos.x += statusUnit[n++].width; statuses[statusLivesHKills] = new TextPanel(dpyNum,xvars,toplevel, pos,statusUnit[n]); pos.x = 0; n = 0; pos.y += statusUnit[n].height; // Second row. statuses[statusItem] = new ButtonPanel(dpyNum,xvars,toplevel, pos,statusUnit[n], Viewport::panel_callback, panelClosures.get(stItem)); pos.x += statusUnit[n++].width; statuses[statusClassName] = new TextPanel(dpyNum,xvars,toplevel, pos,statusUnit[n]); pos.x += statusUnit[n++].width; statuses[statusMass] = new TextPanel(dpyNum,xvars,toplevel, pos,statusUnit[n]); pos.x += statusUnit[n++].width; statuses[statusKillsMKills] = new TextPanel(dpyNum,xvars,toplevel, pos,statusUnit[n]); } ViewportInfo LargeViewport::get_info(Boolean smoothScroll) { if (smoothScroll) { Size visible; visible.set((LG_COL_MAX + 2 * LG_EXTRA_COL) * WSQUARE_WIDTH, (LG_ROW_MAX + 2 * LG_EXTRA_ROW) * WSQUARE_WIDTH); ViewportInfo ret(IT_VISION_RANGE,visible); return ret; } else { Size logicalSize; logicalSize.set(LG_COL_MAX * WSQUARE_WIDTH, LG_ROW_MAX * WSQUARE_HEIGHT); Size extraSize; extraSize.set(LG_EXTRA_COL * WSQUARE_WIDTH, LG_EXTRA_ROW * WSQUARE_HEIGHT); // Non-smooth scrolling. ViewportInfo ret(IT_VISION_RANGE,logicalSize,extraSize); return ret; } } xevil-2.02r2.orig/x11/xdata.cpp0100644000175000017500000004150107041422166015523 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #ifndef NO_PRAGMAS #pragma implementation "xdata.h" #endif // Include Files #include "utils.h" #include "xdata.h" #include "area.h" #include #include #include #include // Means always allocate some color, even if it's really, really bad. #define XPM_CLOSENESS 65535 Window Xvars::create_toplevel_window(int argc,char** argv, int dpyNum,const Size& size, const char* title, long eventMask) { // Creates with 0 border width. Window toplevel = XCreateSimpleWindow(dpy[dpyNum],root[dpyNum],0,0, size.width,size.height, 0,windowBorder[dpyNum], windowBg[dpyNum]); XSizeHints size_hints; size_hints.flags = PPosition | PSize | PMinSize | PMaxSize; size_hints.min_width = size.width; size_hints.min_height = size.height; size_hints.max_width = size.width; size_hints.max_height = size.height; XTextProperty windowName, iconName; // Should be safe to cast away const, XStringListToTextProperty doesn't // mutate the string list argument. char *window_name = (char*)title; // Will appear on window. char *icon_name = (char*)title; Status stat = XStringListToTextProperty(&window_name,1,&windowName); assert(stat); stat = XStringListToTextProperty(&icon_name,1,&iconName); assert(stat); // Hints to window manager. XWMHints wm_hints; wm_hints.initial_state = NormalState; wm_hints.input = True; wm_hints.flags = StateHint | InputHint; // Only set IconPixmap and IconMask hints if the pixmaps loaded // correctly. if (iconPixmap[dpyNum]) { wm_hints.icon_pixmap = iconPixmap[dpyNum]; wm_hints.flags |= IconPixmapHint; if (iconMask[dpyNum]) { wm_hints.icon_mask = iconMask[dpyNum]; wm_hints.flags |= IconMaskHint; } } XClassHint class_hints; class_hints.res_name = argv[0]; class_hints.res_class = "XEvil"; XSetWMProperties(dpy[dpyNum],toplevel, &windowName,&iconName,argv,argc, &size_hints,&wm_hints,&class_hints); XSelectInput(dpy[dpyNum],toplevel,eventMask); // Add WM_DELETE_WINDOW protocol XChangeProperty(dpy[dpyNum],toplevel, wmProtocols[dpyNum],XA_ATOM, 32,PropModePrepend, (unsigned char *)&wmDeleteWindow[dpyNum], 1); return toplevel; } Pixel Xvars::alloc_named_color(int dpyNum,const char *name,Pixel def) const { XColor actual,database; // Check for monochrome display. // Hack, not supposed to look at c_class member of visual. Status status = 1; if (((visual[dpyNum]->c_class == PseudoColor) || (visual[dpyNum]->c_class == StaticColor) || (visual[dpyNum]->c_class == DirectColor) || (visual[dpyNum]->c_class == TrueColor)) && (status = XAllocNamedColor(dpy[dpyNum],cmap[dpyNum],(char *)name, &actual,&database))) { return actual.pixel; } else { if (!status) { cerr << "Warning:: unable to allocate color " << ((char *)name) << "." << endl; } return (def == (Pixel)-1) ? white[dpyNum] : def; } } void Xvars::generate_pixmap_from_transform(int dpyNum, Drawable dest,Drawable src, const Size& srcSize, Drawable scratch, const TransformType* transforms, int tNum, int depth) { // Some cut and paste from the Windows version. // If we had more powerful graphics abstractions, we could make this // cross-platform code. Not really worth doing it now. assert(tNum <= 2); Size scratchSize; switch(tNum) { // Just copy pixels src to dest. case 0: // Why doesn't this work??? Gives BadMatch. #if 0 XCopyArea(dpy[dpyNum], src,dest,gc[dpyNum], 0,0,srcSize.width,srcSize.height, 0,0); #endif // Less efficient workaround. gen_pix_from_trans(dpyNum,dest,src,srcSize, TR_NONE,depth); break; // Transform from src to dest. case 1: gen_pix_from_trans(dpyNum,dest,src,srcSize, transforms[0],depth); break; // Transform from src to scratch, then scratch to dest. case 2: gen_pix_from_trans(dpyNum,scratch,src,srcSize,transforms[0],depth); scratchSize = Transform2D::apply(transforms[0],srcSize); gen_pix_from_trans(dpyNum,dest,scratch,scratchSize,transforms[1],depth); break; default: assert(0); } } Boolean Xvars::load_pixmap(Drawable* pixmap,Drawable* mask, int dpyNum,char** xpmBits) { return load_pixmap(pixmap,mask,dpyNum,xpmBits,is_stretched()); } Boolean Xvars::load_pixmap(Drawable* pixmap,Drawable* mask, int dpyNum,char** xpmBits,Boolean fullSize) { // Just load XPM as is. if (fullSize) { XpmAttributes attr; attr.valuemask = XpmCloseness; attr.closeness = XPM_CLOSENESS; attr.alloc_close_colors = True; int val = XpmCreatePixmapFromData(dpy[dpyNum],root[dpyNum], xpmBits, pixmap,mask, &attr); XpmFreeAttributes(&attr); Boolean ret = (val == XpmSuccess); if (!*pixmap || (mask && !*mask)) { ret = False; } return ret; } //// Load image and mask into memory, reduce them and put them up to the //// display server as a new pixmap and mask XImage* srcImage; XImage* srcMask; Size srcSize; // Load in src image from supplied data. XpmAttributes attr; attr.valuemask = XpmReturnPixels | XpmCloseness; attr.closeness = XPM_CLOSENESS; attr.alloc_close_colors = True; // Perhaps should use XpmReturnAllocPixels, neither gives the transparent // value. int val = XpmCreateImageFromData(dpy[dpyNum], xpmBits, &srcImage,(mask ? &srcMask : (XImage**)NULL), &attr); srcSize.width = attr.width; srcSize.height = attr.height; if (val != XpmSuccess) { XpmFreeAttributes(&attr); return False; } // Must be even size. assert((srcSize.width % 2 == 0) && (srcSize.height % 2 == 0)); int depth = srcImage->depth; int bitmap_pad = srcImage->bitmap_pad; // Size of reduced, destination image. Size destSize; destSize.set(srcSize.width / 2,srcSize.height / 2); // Create image for dest data. char* destData = new_bytes_for_image(destSize,depth,bitmap_pad); XImage *destImage = XCreateImage(dpy[dpyNum],visual[dpyNum],depth,ZPixmap,0, destData,destSize.width,destSize.height, bitmap_pad,0); assert(destImage); // Create dest mask if needed. XImage *destMask; if (mask) { assert(srcMask->depth == 1); char* destMaskData = new_bytes_for_image(destSize,1,bitmap_pad); destMask = XCreateImage(dpy[dpyNum],visual[dpyNum],1,ZPixmap,0, destMaskData,destSize.width,destSize.height, bitmap_pad,0); assert(destMask); } // Do the pixel reduction. // unstretch_image(dpyNum,destImage,srcImage,attr.pixels,attr.npixels); unstretch_image(dpyNum,destImage,srcImage, attr.pixels,attr.npixels); if (mask) { unstretch_image(dpyNum,destMask,srcMask,NULL,0); } // Kill src image and mask. XpmFreeAttributes(&attr); XDestroyImage(srcImage); if (mask) { XDestroyImage(srcMask); } // Create dest pixmap and mask *pixmap = XCreatePixmap(dpy[dpyNum],root[dpyNum], destSize.width,destSize.height, depth); if (!*pixmap) { // Should do more cleanup. return False; } if (mask) { *mask = XCreatePixmap(dpy[dpyNum],root[dpyNum], destSize.width,destSize.height, 1); if (!*mask) { // Should do more cleanup. return False; } } // Put dest image and mask up to the display server. put_image(dpyNum,*pixmap,destImage,destSize); if (mask) { put_image(dpyNum,*mask,destMask,destSize); } // Kill dest image and mask destroy_image(destImage); if (mask) { destroy_image(destMask); } return True; } Area Xvars::stretch_area(const Area& area) { Area ret(stretch_pos(area.get_pos()), stretch_size(area.get_size())); return ret; } void Xvars::gen_pix_from_trans(int dpyNum,Drawable dest,Drawable src, const Size& srcSize,TransformType transform, int depth) { // Get source image into client memory. XImage* srcImage = XGetImage(dpy[dpyNum],src,0,0,srcSize.width,srcSize.height, AllPlanes,ZPixmap); if (!srcImage) { cerr << "Could not get image in Xvars::gen_pix_from_trans." << endl; return; } // Size of destination image. Size destSize = Transform2D::apply(transform,srcSize); // Allocate memory for the image. char* destData = new_bytes_for_image(destSize,depth,srcImage->bitmap_pad); // Create XImage for the transformed data. XImage* destImage = XCreateImage(dpy[dpyNum],visual[dpyNum],depth,ZPixmap,0, destData,destSize.width,destSize.height, srcImage->bitmap_pad,0); assert(destImage); assert(destData == destImage->data); // Traverse coordinates of src, compute corresponding position on // dest and copy the pixel. Pos srcPos; for (srcPos.y = 0; srcPos.y < srcSize.height; srcPos.y++) { for (srcPos.x = 0; srcPos.x < srcSize.width; srcPos.x++) { Pos destPos = Transform2D::apply(transform,srcPos,srcSize); unsigned long pix = XGetPixel(srcImage,srcPos.x,srcPos.y); XPutPixel(destImage,destPos.x,destPos.y,pix); } } put_image(dpyNum,dest,destImage,destSize); // Make sure to use new/delete for freeing the memory we allocated. destroy_image(destImage); XDestroyImage(srcImage); } static void Xvars_unstretch_subsample(XImage* dest,XImage* src) { // Real simple, sample every other pixel in ever other row. Pos destPos; for (destPos.y = 0; destPos.y < dest->height; destPos.y++) { for (destPos.x = 0; destPos.x < dest->width; destPos.x++) { unsigned long pix = XGetPixel(src,destPos.x * 2,destPos.y * 2); XPutPixel(dest,destPos.x,destPos.y,pix); } } } void Xvars::unstretch_image(int dpyNum, XImage* dest,XImage* src, Pixel* pixels,int pixelsNum) { assert(src->width == 2 * dest->width && src->height == 2 * dest->height); // Don't use color info at all, just subsample the pixels. // // Do this if 1) useAveraging is turned off, // 2) there is no interesting pixel information, i.e. masks. if (!useAveraging || pixels == NULL) { Xvars_unstretch_subsample(dest,src); return; } // First get list of RGB values for the available pixels. // colors[] will be indexed parallel to pixels[]. XColor* colors = new XColor[pixelsNum]; assert(colors); int n; for (n = 0; n < pixelsNum; n++) { colors[n].pixel = pixels[n]; } XQueryColors(dpy[dpyNum],cmap[dpyNum],colors,pixelsNum); // Create hashtable to map from pixels to RGB values. // Safe to put pointers to colors[], since that array is guaranteed to // live as long as the HashTable. IDictionary* pixel2RGB = HashTable_factory(); for (n = 0; n < pixelsNum; n++) { pixel2RGB->put((void*)colors[n].pixel,(void*)&colors[n]); } // Real simple, sample every other pixel. // We could make it look much better with a better algorithm, e.g. // average every block of four pixels. Pos destPos; for (destPos.y = 0; destPos.y < dest->height; destPos.y++) { for (destPos.x = 0; destPos.x < dest->width; destPos.x++) { // Use int not XColor, since members of XColor are short. int r = 0, g = 0, b = 0; // Search four pixels of src. Pos srcPos; for (srcPos.y = 2 * destPos.y; srcPos.y < 2 * (destPos.y + 1); srcPos.y++) { for (srcPos.x = 2 * destPos.x; srcPos.x < 2 * (destPos.x + 1); srcPos.x++) { unsigned long pix = XGetPixel(src,srcPos.x,srcPos.y); XColor* color = (XColor*)pixel2RGB->get((void*)pix); // The XImage, src, shouldn't have any pixels that aren't in the // list of pixels passed in. if (color) { r += color->red; g += color->green; b += color->blue; } else { if (pix != 0) { cerr << "Xvars::unstretch_image() found pixel " << pix << " that is not in the pixel list." << endl; } } } // x } // y // Divide by 4, since we are averaging 4 pixels in the source. XColor destColor; destColor.red = (r >> 2); destColor.green = (g >> 2); destColor.blue = (b >> 2); // Find the color in colors closest to the RGB values in destColor. int destIndex = color_match(&destColor,colors,pixelsNum); Pixel destPixel = colors[destIndex].pixel; // Put the pixel in the dest image. XPutPixel(dest,destPos.x,destPos.y,destPixel); } } delete pixel2RGB; delete [] colors; } // This is a bloody bottleneck, simple linear search. Need something better, // like a BSP tree of the color space. int Xvars::color_match(XColor* color,XColor* palette,int paletteNum) { // Means none found yet. int ret = -1; float retFit; for (int n = 0; n < paletteNum; n++) { float rDiff = palette[n].red - color->red; float gDiff = palette[n].green - color->green; float bDiff = palette[n].blue - color->blue; float fit = rDiff * rDiff + gDiff * gDiff + bDiff * bDiff; // Perfect fit, we're done. if (fit == 0.0f) { return n; } // First checked, or best so far. if (ret == -1 || fit < retFit) { ret = n; retFit = fit; } } assert(ret != -1); return ret; } #if 0 // Round val up to the nearest multiple of unit. static int Utils_int_ceil(int val,int unit) { if (val % unit == 0) { return val; } else { return val + (unit - val % unit); } } #endif char* Xvars::new_bytes_for_image(const Size& size,int depth,int bitmap_pad) { // Calc bytes for one row. int rowBits = size.width * bitmap_pad; // Now, I originally thought I should have (size.width * depth) rounded up // to the nearest increment of bitmap_pad. The X documentation sure sounds // that way. But, crashes in 24 bit mode, e.g. depth==24, bitmap_pad==32. // So, here I'm allocating bitmap_pad bits for every pixel. May be // wasteful, but won't crash, goddamn it. // (We could really afford to be more wasteful here, if we needed to. The // XImages are always only temporary. And, usually only allocated one or // two at a time.) int rowBytes = rowBits / 8; // Bytes for all rows. int bytesNum = rowBytes * size.height; // Allocate data for dest image. char* data = new char[bytesNum]; assert(data); return data; } void Xvars::destroy_image(XImage* image) { delete [] image->data; image->data = NULL; XDestroyImage(image); } void Xvars::put_image(int dpyNum,Drawable dest,XImage* src,const Size& size) { // Create temp GC to set foreground and background in case we are // dealing with a mask. GC gc; XGCValues values; values.foreground = 1; values.background = 0; gc = XCreateGC(dpy[dpyNum],dest, GCForeground | GCBackground,&values); XPutImage(dpy[dpyNum],dest,gc,src, 0,0,0,0,size.width,size.height); // Kill temp GC. XFreeGC(dpy[dpyNum],gc); } const char *Xvars::humanColorNames[Xvars::HUMAN_COLORS_NUM] = { "blue", "brown", "black", "purple", "green4", "pink3", }; Boolean Xvars::useAveraging = False; xevil-2.02r2.orig/x11/panel.h0100644000175000017500000001700207041422126015161 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "panel.h" Some simple widgets. #ifndef PANEL_H #define PANEL_H #ifndef NO_PRAGMAS #pragma interface #endif #include "utils.h" #define PANEL_STRING_LENGTH 600 // Have #defines for these so caller doesn't have to rely on default // arguments to get the default behavior. #define PANEL_EVENT_MASK ExposureMask #define TEXT_PANEL_EVENT_MASK ExposureMask class Panel; typedef void (*PanelCallback)(Panel* p,void* value,void* closure); class Panel { // No callback. public: Panel(int dpyNum,const Xvars &, Window,const Pos &,const Size &, PanelCallback callback = NULL,void* closure = NULL, unsigned int eventMask = PANEL_EVENT_MASK, Boolean border = True); /* EFFECTS: Creatue a new panel at position pos of size size. The position and size includes the border. Color is initially black. Use a viewportNum of -1 if there is no associated viewportNum. */ /* NOTE: Must explicity set dpyNum as a Panel may be created with viewportNum = -1. */ virtual ~Panel(); Pixel get_foreground() {return foreground;} Pixel get_background() {return background;} Size get_size() {return size;} Window get_window() {return window;} const Xvars &get_xvars() {return xvars;} int get_dpy_num() {return dpyNum;} void set_foreground(Pixel c,Boolean re_draw = True); void set_background(Pixel c,Boolean re_draw = True); /* EFFECTS: Changes the color for the panel. Redraws iff re_draw. */ virtual Boolean process_event(int dpyNum,XEvent *event); /* EFFECTS: Panel deals with the event if it applies. Returns True iff it used the event. */ /* NOTE: Only calls up the tree if event is not processed at current level. */ virtual void redraw() = 0; virtual void clear() = 0; #ifndef PROTECTED_IS_PUBLIC protected: #endif PanelCallback get_callback() {return callback;} void* get_closure() {return closure;} /* NOTE: Callback and closure not used by all subclasses of Panel. */ private: int dpyNum; const Xvars &xvars; Window window; Size size; // Inside the border. Pixel foreground, background; PanelCallback callback; void* closure; }; // Display a text label. class TextPanel: public Panel { // No callback. public: TextPanel(int dpyNum,const Xvars &xvars, Window parent,const Pos &pos,const Size &size, PanelCallback callback = NULL,void* closure = NULL, const char *msg = NULL, unsigned int eventMask = TEXT_PANEL_EVENT_MASK, Boolean border = True); const char* get_message() {return message;} /* EFFECTS: Return the message currently displayed. Return "" if no message displayed. Never returns NULL. */ virtual void set_message(const char *msg); /* REQUIRES: msg is non-NULL */ /* NOTE: Makes its own copy. Redraws. */ static Size get_unit(XFontStruct *,int cols,int rows = 1); virtual void redraw(); virtual void clear(); void set_sensitive(Boolean val); Boolean get_sensitive() {return sensitive;} private: char message[PANEL_STRING_LENGTH]; Boolean sensitive; }; // Accepts text input. Displays "_" as its message. class WritePanel : public TextPanel { // Callback value is the (const char*) value of the TextPanel. public: WritePanel(int dpyNum,const Xvars &xvars, Window parent, const Pos &pos,const Size &size, PanelCallback callback = NULL,void* closure = NULL, const char *prompt = NULL, unsigned int eventMask = ExposureMask | ButtonPressMask | KeyPressMask | KeyReleaseMask); /* NOTE: prompt appears before the user's input text. */ const char *get_value() {return value;} void set_value(const char *value); virtual Boolean process_event(int dpyNum,XEvent *event); private: void update_message(); Boolean active; char prompt[PANEL_STRING_LENGTH]; char value[PANEL_STRING_LENGTH]; }; class KeyPressPanel: public TextPanel { // Callback value is the (XEvent*) event of the key press. public: KeyPressPanel(int dpyNum,const Xvars &xvars, Window parent, const Pos &pos,const Size &size, PanelCallback callback = NULL,void* closure = NULL, const char *msg = NULL, unsigned int eventMask = ExposureMask | KeyPressMask | KeyReleaseMask); virtual Boolean process_event(int dpyNum,XEvent *event); }; class ButtonPanel: public TextPanel { // Callback value is the (int) button number. public: ButtonPanel(int dpyNum,const Xvars &xvars, Window parent, const Pos &pos,const Size &size, PanelCallback callback = NULL,void* closure = NULL, const char *msg = NULL, unsigned int eventMask = ExposureMask | ButtonPressMask); virtual Boolean process_event(int dpyNum,XEvent *event); }; class TogglePanel: public TextPanel { // Callback value is the Boolean state of the TogglePanel. public: TogglePanel(int dpyNum,const Xvars &xvars, Window parent, const Pos &pos,const Size &size, PanelCallback callback = NULL,void* closure = NULL, const char *msg = NULL, unsigned int eventMask = ExposureMask | ButtonPressMask); Boolean get_value() {return set;} void set_value(Boolean); virtual Boolean process_event(int dpyNum,XEvent *event); private: Boolean set; }; // Act like a regular TextPanel unless chat is turned on. If // chat is on, ChatPanel will capture all key events to the // display regardless of the target window. Will call // callback when the chat message is finished. No callback // if the message is canceled. class ChatPanel: public TextPanel { // Callback value is the (const char*) value of the ChatPanel. public: ChatPanel(int dpyNum,const Xvars &xvars, Window parent,const Pos &pos,const Size &size, PanelCallback callback = NULL,void* closure = NULL, const char *msg = NULL, unsigned int eventMask = ExposureMask | KeyPressMask | KeyReleaseMask); Boolean get_chat() {return chatOn;} void set_chat(Boolean val); /* NOTE: Will redraw if necessary. */ const char* get_value() {return value;} /* EFFECTS: Return the chat message itself, not including any prompts or instructions to the user. */ virtual Boolean process_event(int dpyNum,XEvent *event); /* NOTE: May grab events for windows other than this->get_window(). */ virtual void set_message(const char *msg); /* NOTE: To override default behavior of TextPanel. */ private: void update_message(); Boolean chatOn; char value[PANEL_STRING_LENGTH]; }; #endif xevil-2.02r2.orig/x11/sound.h0100644000175000017500000000374407041422126015222 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "sound.h" // Dummy classes, only implemented on Windows. // A place holder if we ever implement sound on X. #ifndef SOUND_H #define SOUND_H #include "utils.h" #include "sound_cmn.h" struct SoundEvent { SoundEvent() {dummy = 0;} int dummy; }; class SoundManager { public: SoundManager(Boolean,Locator *) {} ~SoundManager() {} Boolean isSoundOn(){return False;} void turnOnoff(Boolean){} void setTrackVolume(int) {} void setEffectsVolume(int) {} int getTrackVolume(){return 0;} int getEffectsVolume(){return 0;} // Boolean init(HWND hwndOwner); Boolean removeSound(unsigned int){return False;} Boolean playSound(unsigned int,int,int,Boolean,Boolean = False) {return False;} Boolean stopSound(unsigned int) {return False;} Boolean destroyAllSound() {return False;} Boolean submitRequest(SoundRequest) {return False;} SoundEvent getEvent(int) {SoundEvent ret; return ret;} void clearRegisteredSounds() {} void setKeyPosition(short,Pos){} Pos getKeyPosition(short){Pos ret; return ret;} void setNumKeyPositions(short){} short getNumKeyPositions(){return 0;} }; #endif xevil-2.02r2.orig/x11/stdafx.h0100644000175000017500000000167607041422124015363 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // A hack to make the Windows compiler work with precompiled headers. xevil-2.02r2.orig/x11/ui.h0100644000175000017500000003210207041422106014473 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "ui.h" Header for user interface module. /* Overview: Draws the world. Manages viewports. Holds x variables. Follows an intel if one is registered. Sends commands to the intel if it is human. For weapon commands, tapping key gives most recently pressed direction or IT_CENTER if there is none. */ /* NOTE: A Ui is never destroyed. Allocates memory for transfering to callbacks and event handlers. */ #ifndef UI_H #define UI_H #ifndef NO_PRAGMAS #pragma interface #endif // Include Files #include "utils.h" #include "coord.h" #include "world.h" #include "locator.h" #include "id.h" #include "intel.h" #include "game_style.h" #include "sound.h" #include "ui_cmn.h" #include "viewport.h" #define UI_VIEWPORTS_MAX 6 #define UI_SHORT_STRING_LENGTH 80 enum UIkeyset {UIsun3, UIdecmips, UIiris, UIncd, UItektronix, UIsun4, UIrsaix, UIsun4_sparc,UImac,UIalpha,UIlinux,UIunspecifiedKeyset}; class Ui; typedef Ui *UiP; // First index is an IT_COMMAND, sedond is one of two. typedef KeySym UIkeymap[UI_KEYS_MAX][2]; // Should move all this into ui_cmn.h class UIsettings { public: int humansNum; int enemiesNum; Boolean enemiesRefill; Boolean pause; GameStyleType style; Quanta quanta; Boolean sound; Rooms worldRooms; int soundvol; int trackvol; Boolean cooperative; char connectHostname[R_NAME_MAX]; // UIconnectServer CMN_PORT connectPort; // UIconnectServer char humanName[IT_STRING_LENGTH]; // UIconnectServer, UIrunServer CMN_PORT serverPort; // UIrunServer Boolean localHuman; // UIrunServer char chatReceiver[IT_STRING_LENGTH]; // UIchatRequest char chatMessage[UI_CHAT_MESSAGE_MAX + 1]; // UIchatRequest }; class TextPanel; class TogglePanel; class KeyPressPanel; class Ui: public IDifficultyCallback, public IStyleInfo, public IKeyObserver { struct UIxdata { // Set controls windows. Window controls[Xvars::DISPLAYS_MAX]; // The top level shell containing the KeyPressPanel. Window learnControls[Xvars::DISPLAYS_MAX]; // Help message. Window help[Xvars::DISPLAYS_MAX]; }; public: Ui(int *argc,char **argv,WorldP w,LocatorP l, char **displayNames,char *fontName,SoundManager *, const DifficultyLevel dLevels[DIFFICULTY_LEVELS_NUM], RoleType); /* EFFECTS: Create user interface with one viewport (number 0) with world w and locator l. The memory pointed to by displayNames becomes the property of the Ui. Needs RoleType in the constructor so can add info to the window manager title bar. */ /* NOTE: Must set_keyset on all displays before first clock. Must manually set_* all desired parameters before first reset. */ ~Ui(); int get_viewports_num() {return viewports.length();} /* EFFECTS: Total number of viewports in the Ui. */ int get_viewports_num_on_dpy(int dpyNum) {return vIndexNum[dpyNum];} int get_viewport_on_dpy(int dpyNum,int v) {return vIndex[dpyNum][v];} /* EFFECTS: Get viewports and number of viewports on a single display. The viewports on a display, dpyNum, range from 0 to get_viewports_num_on(dpyNum) - 1. */ Display *get_dpy(int dpyNum) {return xvars.dpy[dpyNum];} int get_dpy_max() {return xvars.dpyMax;} int get_dpy_num(int viewportNum); /* EFFECTS: Display number from viewport Number. */ UImask get_settings(UIsettings &s); /* MODIFIES: s */ /* EFFECTS: Get all of the settings that are stored in the Ui. Mostly the menubar stuff. settingsChanges gives the fields in s that have changed since the last call of get_settings. Other fields are not guaranteed to be meaningful. Initially, nothing is changed. */ const char * const *get_keys_names() {return (const char * const *)keysNames;} Boolean settings_changed() {return settingsChanges != UInone;} /* EFFECTS: Tells whether the the settings have changed since the last call of get_settings(). Initially is False. */ Boolean keyset_set(int dpyNum) {return keysetSet[dpyNum];} void set_humans_num(int); void set_enemies_num(int); void set_enemies_refill(Boolean); void set_style(GameStyleType); void set_quanta(Quanta); void set_cooperative(Boolean); // Do nothing, only place holders for Windows version. void set_track_volume(int) {} void set_sound_volume(int) {} void set_sound_onoff(Boolean){} void set_world_rooms(const Rooms &){} void set_role_type(RoleType r) {assert(0);} /* NOTE: Don't have code to change the window title bar after the window has been created. */ void set_humans_playing(int); void set_enemies_playing(int); void set_level(const char *); static void set_reduce_draw(Boolean val) {Viewport::set_reduce_draw(val);} /* EFFECTS: Don't draw backgrounds and outside. */ static void set_use_buffer(Boolean val) {Viewport::set_use_buffer(val);} /* EFFECTS: Set whether or not to use a double-buffer for drawing. */ Boolean other_input() {return otherInput;} /* EFFECTS: Tells whether there has been any keyboard or mouse press other than a valid control since the last clock. */ void set_input(int vNum,UIinput input); /* EFFECTS: Set the input device for viewport num. */ void set_keyset(int dpyNum,UIkeyset keyset); void set_keyset(int dpyNum,UIkeyset basis,KeySym right[UI_KEYS_MAX][2], KeySym left[UI_KEYS_MAX][2]); /* REQUIRES: Must be called at least once before the first clock. */ /* IMPLEMENTATION NOTE: Sets keycodes[0 and 1] */ void set_difficulty(int) {} /* NOTE: Dummy, could be used to get default value for set_prompt_difficulty. */ void set_pause(Boolean); void set_prompt_difficulty(); void unset_prompt_difficulty(); int get_difficulty() {return difficulty;} /* EFFECTS: Similar to set_level_title. Prompts user for difficulty level. get_difficulty() returns user entered difficulty since last call to set_prompt_difficulty() or, DIFF_NONE if none set. */ virtual void change_difficulty(int); /* NOTE: For implementing IDifficultyCallback. */ virtual GameStyleType get_game_style_type(); virtual RoleType get_role_type(); /* NOTE: For implementing IStyleInfo. */ virtual void key_event(int dpyNum,int keycode,Boolean down); /* NOTE: For implementing IKeyObserver. */ #if 0 virtual void send_chat_request(const char* receiver,const char* message); /* NOTE: For implementing IChatObserver. */ #endif int add_viewport(); /* EFFECTS: Add another viewport and return its number. */ void del_viewport(); /* EFFECTS: Delete the highest numbered viewport. */ void register_intel(int n, IntelP intel); /* REQUIRES: intel is not already registered with a different viewport. */ /* EFFECTS: Registers the intel on viewport n. The viewport will now follow the object represented by intel->get_id() and send commands to it if it is human. */ void demo_reset(); /* EFFECTS: Like reset() but does not effect whether viewport can be scrolled. */ void reset(); /* EFFECTS: Prepare Ui for a new game. Clear out all registered intels. Does NOT remove viewports. */ void set_redraw_arena(); /* EFFECTS: Next turn, the Ui must redraw the arena window. */ void process_event(int dpyNum,XEvent *event); /* EFFECTS: Root event handling routine. */ void pre_clock(); /* EFFECTS: Follows the object of the registered intel if any and redraws the world and locator. Ui::pre_clock() is guaranteed to pull messages from the queues in this phase. Drawing happens in pre_clock(). */ /* NOTE: pre means before reading the events from the queue for this turn. */ void post_clock(); /* EFFECTS: Just respond to keyboard events. */ /* NOTES: post means after reading the events for this turn. */ // The callbacks exported to the Viewport. static void menu_quit_CB(void*,Viewport*,void*); static void menu_new_game_CB(void*,Viewport*,void*); static void menu_humans_num_CB(void*,Viewport*,void*); static void menu_enemies_num_CB(void*,Viewport*,void*); static void menu_enemies_refill_CB(void*,Viewport*,void*); static void menu_controls_CB(void*,Viewport*,void*); static void menu_learn_controls_CB(void*,Viewport*,void*); static void menu_scenarios_CB(void*,Viewport*,void*); static void menu_levels_CB(void*,Viewport*,void*); static void menu_kill_CB(void*,Viewport*,void*); static void menu_duel_CB(void*,Viewport*,void*); static void menu_extended_CB(void*,Viewport*,void*); static void menu_training_CB(void*,Viewport*,void*); static void menu_quanta_CB(void*,Viewport*,void*); static void menu_cooperative_CB(void*,Viewport*,void*); static void menu_help_CB(void*,Viewport*,void*); static void status_weapon_CB(void*,Viewport*,void*); static void status_item_CB(void*,Viewport*,void*); static void chat_CB(void*,Viewport*,void*); static void learn_controls_CB(Panel*,void*,void*); static IViewportInfo* get_viewport_info(); /* EFFECTS: Return structure in static memory with info necessary to figure out the viewport around a given point. */ static void set_synchronous() {synchronous = True;} /* EFFECTS: For debugging, make all X requests synchronous. */ static void set_large_viewport(Boolean val) {largeViewport = val;} /* EFFECTS: Sets the initial value for large/small Viewport. Can be overridden by the License Agreement dialog. */ static void set_smooth_scroll(Boolean val) {smoothScroll = val;} /* EFFECTS: Sets the initial value for smooth scroll. Can be overridden by the user in the License Agreement dialog. */ private: void set_message(const char *message); /* EFECTS: Places message on all the viewports' message bars. */ void draw(int viewportNum, Boolean changedOnly = False); /* REQUIRES: viewportNum is valid. */ /* EFFECTS: Draw everything in viewport number num. */ void init_x(); /* EFFECTS: Initialize the X Window variables in the Ui. */ /* NOTE: Also sets vIndex,vIndexMax,meunusNum,dpyIndex. */ void intern_atoms(); Boolean viewport_to_loc(int n,const Loc &l); int get_viewport_num(int dpyNum,Window window); /* EFFECTS: If window is one of the arenas, returns the viewport num. Otherwise, returns -1. */ void create_controls(); void create_learn_controls(); void create_help(); void controls_redraw(int dpyNum); void controls_expose(int dpyNum,XEvent *) {controls_redraw(dpyNum);} Boolean key_equals(int dpyNum,int key,int input,int keycode); /* EFFECTS: Match the physical keycode on the given display with the keys registered for one of the two inputs on that display. */ // Variables. static char *keysNames[UI_KEYS_MAX]; char **argv; // Warning: Exposing the rep. int argc; Xvars xvars; UIxdata xdata; char **displayNames; /* Array of [UI_VIEWPORTS_MAX]. Warning: Exposing the rep. */ char *fontName; PtrList viewports; // List of (Viewport*). // Map from displays to viewports, a one to many map. int vIndex[Xvars::DISPLAYS_MAX][UI_VIEWPORTS_MAX]; // Current number of viewports on a display. int vIndexNum[Xvars::DISPLAYS_MAX]; // Possible number of viewports on a display. int vIndexMax[Xvars::DISPLAYS_MAX]; WorldP world; LocatorP locator; // The keyboard mappings // [display num][right or left][key number][2 keys per mapping] unsigned int keycodes[Xvars::DISPLAYS_MAX][2][UI_KEYS_MAX][2]; // Just for making an assert. Boolean keysetSet[Xvars::DISPLAYS_MAX]; UIsettings settings; UImask settingsChanges; Boolean otherInput; Timer messageTimer; Boolean pause; RoleType roleType; // This value is mofified by the Viewport via giving it th int difficulty; const DifficultyLevel* difficultyLevels; // Size DIFFICULTY_LEVELS_NUM. // The actual control learning panel. KeyPressPanel* learnControls[Xvars::DISPLAYS_MAX]; // The panel displaying the help message inside the toplevel window. TextPanel* help[Xvars::DISPLAYS_MAX]; // Would be better if these were stored in the learn controls dialog // itself. struct LControls { int input,key,which; }; LControls lControls[Xvars::DISPLAYS_MAX]; static Boolean synchronous; // From the command line. static Boolean largeViewport; static Boolean smoothScroll; // The callbacks to export to the Viewport. static ViewportCallback viewportCallbacks[VIEWPORT_CB_NUM]; static char* helpMessage; }; #endif xevil-2.02r2.orig/x11/viewport.h0100644000175000017500000003727707041422036015761 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "viewport.h" The window for one player. #ifndef VIEWPORT_H #define VIEWPORT_H #ifndef NO_PRAGMAS #pragma interface #endif // Include Files #include "utils.h" #include "coord.h" #include "xdata.h" #include "intel.h" #include "ui_cmn.h" #include "panel.h" #include "world.h" #include "locator.h" // Kind of a hack, using this enumeration for two separate things. // Internally in viewport for the menus, externally for the // list of all the callbacks. // The external use has three callbacks that do not correspond to menu items, // stWeapon, stItem, and stChat. // And, menuStyle is only used internally. It has no callback since it is // just a text label. // // We really should split this into two separate enumerations. enum { menuControls,menuLearnControls, // These two MUST be first. menuQuit,menuNewGame,menuHumansNum,menuEnemiesNum,menuEnemiesRefill, menuStyle,menuScenarios,menuLevels,menuKill,menuDuel,menuExtended, menuTraining,menuQuanta,menuCooperative,menuHelp, stWeapon,stItem, stChat, // Bad naming convention. VIEWPORT_CB_NUM, // Must be last. }; #define VW_MENUS_PRIMARY_NUM 17 #define VW_MENUS_SECONDARY_NUM 2 // Not 9, because ammo is with weapon. #define VW_STATUSES_NUM 8 // KeyState handles XEvil virtual keys, i.e. 0 < key <= UI_KEYS_MAX class KeyState: public IKeyState { public: KeyState(); virtual Boolean key_down(int key,void*) {return isDown[key];} /* EFFECTS: Return whether the given key is currently down. */ void set(int key,Boolean down) {assert(key < UI_KEYS_MAX); isDown[key] = down;} /* EFFECTS: Set the up/down state of a key. */ private: Boolean isDown[UI_KEYS_MAX]; }; // Should collapse all these Observer/Callback/Info interfaces into // one IViewportManager. Wouldn't have to pass as many arguments // around. // Way of reporting that the user has specified the difficulty level. class IDifficultyCallback { public: virtual void change_difficulty(int) = 0; }; // So the Viewport can get the GameStyleType to decide on some of the // text for the statuses. class IStyleInfo { public: virtual GameStyleType get_game_style_type() = 0; virtual RoleType get_role_type() = 0; }; // This is all needed to do the magic where a key pressed on one viewport // on a display can send a command to a different viewport. class IKeyObserver { public: virtual void key_event(int dpyNum,int keycode,Boolean down) = 0; /* EFFECTS: Report that a key was pressed or released on the specified display. */ }; #if 0 // So the Viewport can request that a chat message be sent. class IChatObserver { public: virtual void send_chat_request(const char* receiver,const char* message) = 0; /* REQUIRES: receiver is non-NULL */ /* EFFECTS: Send message to the named receiver. Receiver will be the empty string if message should be sent to everyone. */ }; #endif class Viewport; typedef void (*ViewportCallback)(void* value,Viewport*,void* closure); class VInfoProvider; class IScroller; class Viewport: public IDispatcher { public: void init(); /* EFFECTS: Must be called immediately after constructing the Viewport. */ /* NOTE: Ick. Hack so that we can call virtual functions from the initialization code for Viewport. */ virtual ~Viewport(); int get_dpy_num() {return dpyNum;} IntelP get_intel() {return intel;} void set_menu_controls(Boolean val); Boolean get_menu_learn_controls(); void set_menu_learn_controls(Boolean val); void set_menu_humans_num(int); void set_menu_enemies_num(int); void set_menu_help(Boolean val); void set_enemies_refill(Boolean); void set_style_and_role_type(GameStyleType style,RoleType); /* NOTE: Only together for efficiency in updating the sensitivity of the menu items. */ void set_quanta(Quanta); void set_cooperative(Boolean); void set_humans_playing(int); void set_enemies_playing(int); const char* get_level(); void set_level(const char*); UIinput get_input() {return input;} void set_input(UIinput); /* EFFECTS: Specify whether to use the controls on the right or left side of the keyboard. */ void set_message(const char*); /* EFFECTS: Set the message in the message bar at the bottom of the viewport. */ void set_arena_message(const char* message,Quanta); /* EFFECTS: Display message in the arena area for the given number of turns. */ /* NOTE: Makes copy of (const char*) argument. */ void set_redraw_arena() {redrawArena = True;} /* EFFECTS: Mark the arena portion of the Viewport as dirty. */ static void accept_input() {acceptInput = True;} /* EFFECTS: No Viewports will accept user intput until this is called. */ /* NOTE: This is so that the viewport can't scroll around while the demo is playing. */ void register_intel(int humanColorNum,IntelP intel); /* REQUIRES: intel is non-NULL. intel is not registered with any other Viewport. */ /* EFFECTS: The viewport will now follow the object represented by intel->get_id() and send commands to it if it is human. humanColorNum gives the index into Xvars::humanColors. */ void clear_all(); /* EFFECTS: Clear all windows/subwindows in the Ui. */ /* NOTE: Used for implementing pause feature. */ void unclear_all(); /* EFFECTS: Force everything to get drawn. */ /* NOTE: Used for recovering when pause is turned off. */ void set_prompt_difficulty(Boolean val); /* EFFECTS: Disable regular drawing of the Viewport and instead prompt the user for the difficulty level. */ void reset(); /* EFFECTS: Initialize for a new game. */ Boolean has_window(Window w); /* EFFECTS: Is the given window under control of this Viewport. Used for event handling. */ void process_event(XEvent* e); /* REQUIRES: e is an event on a window for which has_window() is True. */ /* EFFECTS: Process an event that happened on a window in this viewport, including subwindows. */ void pre_clock(); void post_clock(); /* NOTE: pre and post refer to before and after pulling all the events out of the queue. */ static IViewportInfo* get_info(); /* EFFECTS: Returns an IViewportInfo object that provides information about viewports. This can be called before any Viewport is created and before init_viewport_info() is called. However, the returned IViewportInfo object may not actually be used until init_viewport_info() is called. The returned object should never be freed. */ /* NOTE: This complexity is all to deal with the fact that the Role get created before the Ui. */ static void init_viewport_info(Boolean isStretched,Boolean smoothScroll); /* EFFECTS: After this call, the object returned from Viewport::get_info() is ready for use. */ virtual void dispatch(ITcommand,void*); /* EFFECTS: Take appropriate action in response to an ITcommand. The void* argument is not used, only there to match the interface needed for KeyDispatcher. (It is used on Windows.) */ /* NOTE: For implementing IDispatcher. */ void receive_key(int key,Boolean); /* EFFECTS: Ui tells us when a key for this viewport is pressed. Ui does all mapping from keycodes to the key enumeration. */ /* NOTE: The key event may have come from another Viewport on the same display. */ static Boolean get_reduce_draw() {return reduceDraw;} static void set_reduce_draw(Boolean val) {reduceDraw = val;} static Boolean get_use_buffer() {return useBuffer;} static void set_use_buffer(Boolean val) {useBuffer = val;} #ifndef PROTECTED_IS_PUBLIC protected: #endif Viewport(int argc,char** argv, Xvars& xvars,int dpyNum, WorldP,LocatorP, Boolean smoothScroll,int menusNum, IDifficultyCallback* diffCB, IStyleInfo* styleInfo, IKeyObserver* keyObserver, // IChatObserver* chatObserver, const DifficultyLevel dLevels[DIFFICULTY_LEVELS_NUM], RoleType roleType, ViewportCallback callbacks[VIEWPORT_CB_NUM], void* closure); /* NOTE: Does not take ownership of the callbacks, and closures, arrays. */ void create_toplevel(); /* EFFECTS: Create a top-level window, set the input mask, set standard WM properties, and map it. Creates menus, arena, statuses, intelsPlaying, and messageBar. If viewportNum == 0 then it creates the menus. */ void create_menus(); void create_arena(); virtual void create_statuses() = 0; void create_intels_playing(); void create_message_bar(); void create_level(); Dir button_press_to_dir(XEvent *event); // BEGIN EVENTS void expose(XEvent* event); void key_press(XEvent* event); void key_release(XEvent* event); void button_press(XEvent* event); // END EVENTS virtual Dim get_inner_dim() = 0; /* EFFECTS: The dimensions of the rectangle to track when following an intel. The area displayed is actually larger by get_extra_dim() wsquares. */ virtual Dim get_extra_dim() = 0; /* EFFECTS: The extra space around the edges of the viewport. As soon as the player gets to this outer margin, the world scrolls to the next screen. */ virtual void init_sizes(Xvars&,int dpyNum,WorldP world); /* EFFECTS: Initialize all the sizes for a given Display. */ /* NOTE: Viewport::init_sizes() does the sizes common to the children of Viewport, so children should call Viewport::init_sizes() explicitly. */ static void panel_callback(Panel*,void*,void*); /* EFFECTS: Just forwards to appropriate callback in panelClosures. */ void update_statuses(); /* NOTE: Part of clock(). */ void follow_intel(); /* NOTE: Part of clock(). */ void draw(); /* NOTE: Part of clock(). */ /* NOTE: Will draw everything if redrawArena is true, else just what has changed. */ void draw_string(const Pos &pos,char *msg); /* EFFECTS: Draw string msg using current GC on arena with upper left of character at position pos. */ static void draw_string_center(char *msg); /* EFFECTS: Draw string msg centered on the arena. */ Boolean shift_viewport(int cols,int rows); /* EFFECTS: Move the viewport by the given number of rows or cols. But, always keep the world visible in the viewport. rows and cols may be negative. Return whether the viewport moved. */ // Because some X functions need it. int argc; char** argv; Xvars& xvars; int dpyNum; WorldP world; LocatorP locator; // Toplevel XEvil window. Window toplevel; // Window behind arena, used for drawing tick marks. Window arenaBG; // Playing field. Window arena; Boolean cursorDefined; // The rectangular box of wsquares that the viewport is showing, // unstreched coordinates. Area viewportArea; IntelP intel; KeyState* keyState; KeyDispatcher* keyDispatcher; UIinput input; Boolean promptDifficulty; // Takes advantage of fact that menuControls and menuLearnControls are // the first two elements of the enumeration. TextPanel *menus[VW_MENUS_PRIMARY_NUM]; int menusNum; TextPanel *statuses[VW_STATUSES_NUM]; TextPanel *humansPlaying; TextPanel *enemiesPlaying; ChatPanel *messageBar; // Need better name. This refers to the status item that displays // level-specific information. TextPanel *level; Timer arenaMessageTimer; // A message or NULL. char *arenaMessage; Boolean redrawArena; const DifficultyLevel* difficultyLevels; RoleType roleType; // Forwarding info for calling the registered callbacks. // A list of (PanelClosure*). PtrList panelClosures; // Passed into the Viewport constructor. void* closure; IDifficultyCallback* diffCallback; IStyleInfo* styleInfo; IKeyObserver* keyObserver; // IChatObserver* chatObserver; IScroller* scroller; static Boolean acceptInput; // For supplying ViewportInfo lazily. // (Note: Only used by Role right now.) static VInfoProvider* vInfoProvider; static Boolean reduceDraw; static Boolean useBuffer; /////////// All following sizes are in window coordinates. //////////// // Have the sizes been initialized for the display. static Boolean sizeValid[Xvars::DISPLAYS_MAX]; // Size of the entire menu rectangle. static Size menusSize[Xvars::DISPLAYS_MAX]; // Size of the inner area, the area being tracked on the world. static Size innerSize[Xvars::DISPLAYS_MAX]; // arenaSize includes border static Size arenaSize[Xvars::DISPLAYS_MAX]; // Size of the rectangle of statuses for the active intel static Size statusesSize[Xvars::DISPLAYS_MAX]; // Info about humans/machines still remaining. static Pos intelsPlayingPos[Xvars::DISPLAYS_MAX]; static Size intelsPlayingSize[Xvars::DISPLAYS_MAX]; // The 2-line message bar at the bottom of the window. static Pos messageBarPos[Xvars::DISPLAYS_MAX]; static Size messageBarSize[Xvars::DISPLAYS_MAX]; // Displays level-specific information. static Pos levelPos[Xvars::DISPLAYS_MAX]; static Size levelSize[Xvars::DISPLAYS_MAX]; // Size of the entire viewport, does not include any titling the // Window Manager puts on. static Size viewportSize[Xvars::DISPLAYS_MAX]; }; // Low resolution viewport, unstretched coordinates, small pixmaps. class SmallViewport: public Viewport { public: SmallViewport(int argc,char** argv, Xvars& xvars,int dpyNum, WorldP,LocatorP, Boolean smoothScroll,int menusNum, IDifficultyCallback* diffCB, IStyleInfo* styleInfo, IKeyObserver* keyObserver, // IChatObserver* chatObserver, const DifficultyLevel dLevels[DIFFICULTY_LEVELS_NUM], RoleType roleType, ViewportCallback callbacks[VIEWPORT_CB_NUM], void* closure); virtual Dim get_inner_dim(); virtual Dim get_extra_dim(); virtual void init_sizes(Xvars&,int dpyNum,WorldP); /* EFFECTS: Initialize sizes appropriate for the small viewport. */ virtual void create_statuses(); static ViewportInfo get_info(Boolean smoothScroll); }; // High resolution viewport, stretched coordinates, large pixmaps. class LargeViewport: public Viewport { public: LargeViewport(int argc,char** argv, Xvars& xvars,int dpyNum, WorldP,LocatorP, Boolean smoothScroll,int menusNum, IDifficultyCallback* diffCB, IStyleInfo* styleInfo, IKeyObserver* keyObserver, // IChatObserver* chatObserver, const DifficultyLevel dLevels[DIFFICULTY_LEVELS_NUM], RoleType roleType, ViewportCallback callbacks[VIEWPORT_CB_NUM], void* closure); virtual Dim get_inner_dim(); virtual Dim get_extra_dim(); virtual void init_sizes(Xvars&,int dpyNum,WorldP); /* EFFECTS: Initialize sizes appropriate for the large viewport. */ virtual void create_statuses(); static ViewportInfo get_info(Boolean smoothScroll); }; #endif xevil-2.02r2.orig/x11/xdata.h0100644000175000017500000002416407041410464015174 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "xdata.h" Window system dependent classes. #ifndef XDATA_H #define XDATA_H #ifndef NO_PRAGMAS #pragma interface #endif // Include Files extern "C" { #include #include } #include "utils.h" #include "coord.h" #define Xvars_WINDOW_BG_COLOR "gray70" #define Xvars_WINDOW_BORDER_COLOR "grey40" typedef Boolean XvarsValid; #define XVARS_VALID_INIT False; #define UI_KEYS_MAX IT_WEAPON_R enum UIinput {UI_KEYS_RIGHT,UI_KEYS_LEFT,UI_INPUT_NONE}; // Only command on UNIX is init graphics. enum IXCommand {IX_INIT}; typedef Drawable CMN_DRAWABLE; // For Physical::get_pixmap_mask(). struct CMN_IMAGEDATA { Pixmap pixmap; Pixmap mask; }; // Pointer to xbm bits (or resource id on win32) typedef char *CMN_BITS_ID; typedef XEvent *CMN_EVENTDATA; typedef char *CMN_COLOR; ///////// Xvars #define Xvars_BACKGROUND "light grey" typedef unsigned long Pixel; class Xvars { public: enum { DISPLAYS_MAX = 6, DISPLAY_NAME_LENGTH = 80, HUMAN_COLORS_NUM = 6 }; Window create_toplevel_window(int argc,char** argv, int dpyNum,const Size&, const char* title, long eventMask); /* EFFECTS: Create a new top-level window of given size (in window coordinates). title will be displayed in the window manager decoration and when the window is iconified. eventMask gives the set of events the window is interested in, NULL for no events. New window will receive WM_DELETE_WINDOW client messages. The new window will ask the window manager to never be resized. */ /* NOTE: Does not map window. */ Pixel alloc_named_color(int displayNum,const char *name, Pixel def = (Pixel)-1) const; /* EFFECTS: Tries to allocate the named color using the current values of the Xvars. Returns the Pixel if successful. Otherwise, returns default. If called with only 2 arguments, default is white. If black and white display, returns default. */ Boolean is_valid(XvarsValid check) {return check;} /* EFFECTS: Check whether some graphics-user is valid against the current Xvars. */ /* NOTE: On UNIX this is the identity function. */ void mark_valid(XvarsValid& val) {val = True;} /* MODIFIES: val */ /* EFFECTS: Set val to be valid. */ void generate_pixmap_from_transform(int dpyNum,Drawable dest,Drawable src, const Size& srcSize, Drawable scratch, const TransformType* transforms, int tNum, int depth); /* REQUIRES: scratch is at least as big as the max of src and dest. depth is the bit depth of src and dest. */ /* EFFECTS: Generate one pixmap from another based on some transformations. Use scratch for all scratch calculations. */ Boolean load_pixmap(Drawable* pixmap,Drawable* mask, int dpyNum,char** xpmBits); /* MODIFIES: pixmap, mask */ /* EFFECTS: Load an XPM pixmap and mask from xpmBits. Only load mask if non-NULL. Reduce pixmap size by a factor of 2 if !xvars.is_stretched(). */ Boolean load_pixmap(Drawable* pixmap,Drawable* mask, int dpyNum,char** xpmBits,Boolean fullSize); /* EFFECTS: Same as above load_pixmap() except caller explicitly specifies whether pixmap is fullSize or reduced by a factor of 2. */ /* NOTE: This method can be called before Xvars::stretch is set. */ static void set_use_averaging(Boolean val) {useAveraging = val;} /* EFFECTS: Set whether or not to use averaging to generate the reduced pixmaps. If False, use subsampling. */ // Stretch methods. Boolean is_stretched() {return stretch == 2;} /* EFFECTS: If true, use the stretched coordinate system, and large pixmaps. Else, use unstretched coordinate system and small pixmaps. */ int stretch_x(int val) {return stretch * val;} int stretch_y(int val) {return stretch * val;} inline Pos stretch_pos(const Pos& pos); inline Size stretch_size(const Size& size); Area stretch_area(const Area& area); int stretch; // Total number of allocated displays. int dpyMax; Display *dpy[DISPLAYS_MAX]; Screen *scr_ptr[DISPLAYS_MAX]; int scr_num[DISPLAYS_MAX]; Window root[DISPLAYS_MAX]; Visual *visual[DISPLAYS_MAX]; int depth[DISPLAYS_MAX]; Colormap cmap[DISPLAYS_MAX]; // background/foreground. Pixel white[DISPLAYS_MAX],black[DISPLAYS_MAX]; Pixel red[DISPLAYS_MAX], green[DISPLAYS_MAX], arenaTextColor[DISPLAYS_MAX]; /* Default to black. */ Pixel humanColors[DISPLAYS_MAX][HUMAN_COLORS_NUM]; Pixel windowBg[DISPLAYS_MAX]; Pixel windowBorder[DISPLAYS_MAX]; /* Default gc except foreground is black, background is white, no graphics exposures, font is set, stipple is suitable for drawing insensitive areas, fill style is FillSolid */ GC gc[DISPLAYS_MAX]; XFontStruct *font[DISPLAYS_MAX]; Size fontSize[DISPLAYS_MAX]; XFontStruct *bigFont[DISPLAYS_MAX]; Size bigFontSize[DISPLAYS_MAX]; static const char *humanColorNames[HUMAN_COLORS_NUM]; // For when the windows are iconified Pixmap iconPixmap[Xvars::DISPLAYS_MAX]; Pixmap iconMask[Xvars::DISPLAYS_MAX]; // Used to get the WM_DELETE message from the window manager. Atom wmProtocols[Xvars::DISPLAYS_MAX]; Atom wmDeleteWindow[Xvars::DISPLAYS_MAX]; // Empty cursor so it doesn't distract the user. Cursor arenaCursor[Xvars::DISPLAYS_MAX]; private: void gen_pix_from_trans(int dpyNum,Drawable dest,Drawable src, const Size& srcSize,TransformType transform, int depth); /* REQUIRES: dest is large enough for the transformed version of src. */ /* EFFECTS: Helper for generate_pixmap_from_transform. Do one transformation, from source to dest. */ void unstretch_image(int dpyNum,XImage* dest,XImage* src, Pixel* pixels,int pixelsNum); /* REQUIRES: dest is an image exactly half the width and height of src. src != dest */ /* EFFECTS: Reduce size of src image, copying it to dest. src is unchanged. pixels is the list of pixels in src, has length nPixels. Can pass in NULL,0 for pixels,nPixels for a mask. */ int color_match(XColor* color,XColor* palette,int paletteNum); /* EFFECTS: Match RGB values in color to the list of colors in palette. Return index into palette of closest color. */ char* new_bytes_for_image(const Size&,int depth,int bitmap_pad); /* EFFECTS: Allocate (with new) the appropriate number of bytes needed for an X Image. */ void destroy_image(XImage*); /* EFFECTS: Destroy an XImage and the memory that was allocated with new_bytes_for_image(). Don't use this to destroy an image whose data came from XpmCreateImageFromData() or anything else other than new_bytes_for_image(). */ void put_image(int dpyNum,Drawable dest,XImage* src,const Size&); /* EFFECTS: XPutImage src up to dest. Will work properly even if src is a mask. */ static Boolean useAveraging; }; inline Pos Xvars::stretch_pos(const Pos& pos) { Pos ret(pos.x * stretch,pos.y * stretch); return ret; } inline Size Xvars::stretch_size(const Size& size) { Size ret; ret.set(size.width * stretch,size.height * stretch); return ret; } struct Wxdata { // Background color. Pixel background[Xvars::DISPLAYS_MAX]; // Blocks. Pixmap blockPixmaps[Xvars::DISPLAYS_MAX][W_ALL_BLOCKS_NUM]; Pixmap blockMasks[Xvars::DISPLAYS_MAX][W_ALL_BLOCKS_NUM]; // not all used. // Posters. Pixmap posterPixmaps[Xvars::DISPLAYS_MAX][W_ALL_POSTERS_NUM]; Pixmap posterMasks[Xvars::DISPLAYS_MAX][W_ALL_POSTERS_NUM]; // Door, top and bottom. Pixmap doorPixmaps[Xvars::DISPLAYS_MAX][2]; // Horizontal and vertical mover squares. Pixmap moverSquarePixmaps[Xvars::DISPLAYS_MAX][W_ALL_MOVER_SQUARES_NUM]; Pixmap moverSquareMasks[Xvars::DISPLAYS_MAX][W_ALL_MOVER_SQUARES_NUM]; // Mover itself. Pixmap moverPixmaps[Xvars::DISPLAYS_MAX][W_ALL_MOVERS_NUM]; Pixmap moverMasks[Xvars::DISPLAYS_MAX][W_ALL_MOVERS_NUM]; // The backgrounds, behind the players and world blocks. Pixmap backgroundPixmaps[Xvars::DISPLAYS_MAX][W_ALL_BACKGROUNDS_NUM]; // The outsides, graphics drawn outside the world. Pixmap outsidePixmaps[Xvars::DISPLAYS_MAX][W_ALL_OUTSIDES_NUM]; }; struct OLxdata { Pixmap buffer[Xvars::DISPLAYS_MAX]; Pixmap scratchBuffer[Xvars::DISPLAYS_MAX]; Pixmap tickPixmaps[Xvars::DISPLAYS_MAX][TICK_MAX][CO_DIR_HALF_PURE]; Pixmap tickMasks[Xvars::DISPLAYS_MAX][TICK_MAX][CO_DIR_HALF_PURE]; }; class FireXdata { public: FireXdata() {valid = XVARS_VALID_INIT;} Pixmap pixmap[Xvars::DISPLAYS_MAX]; Pixmap mask[Xvars::DISPLAYS_MAX]; XvarsValid valid; }; class ProtectionXdata { public: ProtectionXdata() {valid = XVARS_VALID_INIT;} Pixel color[Xvars::DISPLAYS_MAX]; XvarsValid valid; }; class MovingXdata { public: MovingXdata() {valid = XVARS_VALID_INIT; offsetsValid = False;} XvarsValid valid; Pixmap pixmaps[Xvars::DISPLAYS_MAX][CO_DIR_MAX][PH_ANIM_MAX], masks[Xvars::DISPLAYS_MAX][CO_DIR_MAX][PH_ANIM_MAX]; // Hack, This snippet of data is completely independent of init_x(), etc. Size offsets[CO_DIR_MAX]; Boolean offsetsValid; }; #endif xevil-2.02r2.orig/x11/makefile0100644000175000017500000000662007041424434015421 0ustar aaronlaaronl# # XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge # http://www.xevil.com # satan@xevil.com # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or (at # your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program, the file "gpl.txt"; if not, write to the Free # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA, or visit http://www.gnu.org. # # x11 directory Makefile DEPTH = .. include $(DEPTH)/config.mk OBJS = $(OBJ_DIR)/xdata.o $(OBJ_DIR)/panel.o $(OBJ_DIR)/l_agreement_dlg.o \ $(OBJ_DIR)/viewport.o \ $(OBJ_DIR)/ui.o \ $(OBJ_DIR)/draw.o $(OBJ_DIR)/main.o ALL_INCL_DIRS = -I$(DEPTH)/cmn -I$(DEPTH)/x11 -I$(DEPTH)/x11/bitmaps $(INCL_DIRS) ALL_CFLAGS = -DX11=1 $(CFLAGS) xevil: $(OBJS) $(OBJ_DIR)/serverping @echo "Directory x11 finished." #### XEvil modules $(OBJ_DIR)/ui.o: ui.cpp ../cmn/utils.h ../cmn/coord.h ../cmn/area.h \ ../cmn/world.h ../cmn/id.h ../cmn/intel.h ../cmn/physical.h \ ../cmn/locator.h ui.h ../cmn/bitmaps/ui/ui.bitmaps xdata.h sound.h viewport.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/ui.o -c ui.cpp $(OBJ_DIR)/xdata.o: xdata.cpp ../cmn/utils.h xdata.h ../cmn/world.h ../cmn/locator.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/xdata.o -c xdata.cpp $(OBJ_DIR)/panel.o: panel.cpp ../cmn/utils.h xdata.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/panel.o -c panel.cpp $(OBJ_DIR)/viewport.o: viewport.cpp ../cmn/utils.h ../cmn/locator.h ../cmn/physical.h ../cmn/coord.h ../cmn/game_style.h viewport.h panel.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/viewport.o -c viewport.cpp $(OBJ_DIR)/l_agreement_dlg.o: l_agreement_dlg.cpp ../cmn/utils.h xdata.h \ panel.h ../cmn/l_agreement.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/l_agreement_dlg.o -c l_agreement_dlg.cpp $(OBJ_DIR)/draw.o: draw.cpp ../cmn/utils.h xdata.h ../cmn/coord.h ../cmn/actual.h ../cmn/locator.h ../cmn/world.h ../cmn/physical.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/draw.o -c draw.cpp # NOTE: Does not need actual.h $(OBJ_DIR)/main.o: main.cpp ../cmn/utils.h ../cmn/coord.h ../cmn/area.h \ ../cmn/world.h ../cmn/id.h ../cmn/intel.h \ ../cmn/physical.h ../cmn/locator.h ui.h ../cmn/game.h ../cmn/neth.h xdata.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/main.o -c main.cpp ### Serverping utility program. ### serverping allows you to remotely check the status of an XEvil server. $(OBJ_DIR)/serverping.o: serverping.cpp ../cmn/utils.h ../cmn/streams.h \ ../cmn/xetp.h ../cmn/neth.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/serverping.o -c serverping.cpp $(OBJ_DIR)/serverping:: $(OBJ_DIR)/serverping.o $(CC) $(LINK_FLAGS) $(LINK_OPT) $(LIBS_DIRS) -o $(OBJ_DIR)/serverping $(OBJ_DIR)/serverping.o $(OBJ_DIR)/utils.o $(OBJ_DIR)/xetp_basic.o $(OBJ_DIR)/streams.o $(OBJ_DIR)/id.o $(LIBS) # $(STRIP) $(OBJ_DIR)/serverping xevil-2.02r2.orig/x11/app-defaults/0040755000175000017500000000000007675236133016317 5ustar aaronlaaronlxevil-2.02r2.orig/x11/app-defaults/XEvil.iris0100644000175000017500000000064706272544144020236 0ustar aaronlaaronlXEvil.right_center: KP_5 XEvil.right_right: KP_6 XEvil.right_down_right: KP_3 XEvil.right_down: KP_2 XEvil.right_down_left: KP_1 XEvil.right_left: KP_4 XEvil.right_up_left: KP_7 XEvil.right_up: KP_8 XEvil.right_up_right: KP_9 XEvil.right_weapon_use: Insert XEvil.right_weapon_change: Home XEvil.right_weapon_drop: Prior XEvil.right_item_use: Delete XEvil.right_item_change: End XEvil.right_item_drop: Next xevil-2.02r2.orig/x11/app-defaults/XEvil.mac0100644000175000017500000000126406272600244020016 0ustar aaronlaaronlXEvil.right_center: KP_5 XEvil.right_right: KP_6 XEvil.right_down_right: KP_3 XEvil.right_down: KP_2 XEvil.right_down_left: KP_1 XEvil.right_left: KP_4 XEvil.right_up_left: KP_7 XEvil.right_up: KP_8 XEvil.right_up_right: KP_9 XEvil.right_weapon_use: Help XEvil.right_weapon_change: Home XEvil.right_weapon_drop: Prior XEvil.right_item_use: Select XEvil.right_item_change: End XEvil.right_item_drop: Next xevil-2.02r2.orig/x11/app-defaults/XEvil.sun30100644000175000017500000000123606272600244020145 0ustar aaronlaaronlXEvil.right_center: R11 XEvil.right_right: Right XEvil.right_down_right: R15 XEvil.right_down: Down XEvil.right_down_left: R13 XEvil.right_left: Left XEvil.right_up_left: R7 XEvil.right_up: Up XEvil.right_up_right: R9 XEvil.right_weapon_use: R1 XEvil.right_weapon_change: R2 XEvil.right_weapon_drop: R3 XEvil.right_item_use: R4 XEvil.right_item_change: R5 XEvil.right_item_drop: R6 xevil-2.02r2.orig/x11/app-defaults/XEvil.sun4_sparc0100644000175000017500000000124606272600244021337 0ustar aaronlaaronlXEvil.right_center: F31 XEvil.right_right: Right XEvil.right_down_right: F35 XEvil.right_down: Down XEvil.right_down_left: F33 XEvil.right_left: Left XEvil.right_up_left: F27 XEvil.right_up: Up XEvil.right_up_right: F29 XEvil.right_weapon_use: F21 XEvil.right_weapon_change: F22 XEvil.right_weapon_drop: F23 XEvil.right_item_use: F24 XEvil.right_item_change: F25 XEvil.right_item_drop: F26 xevil-2.02r2.orig/readme.txt0100644000175000017500000000207207041372754015312 0ustar aaronlaaronlXEvil(TM), a fast-action, networked, anti-social, kill-everything game Copyright (C) 1994,2000 Steve Hardt and Michael Judge http://www.xevil.com satan@xevil.com For instructions on playing XEvil, see the "instructions" directory in the distribution, or go to http://www.xevil.com/docs/instructions.html. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program, the file "gpl.txt"; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA, or visit http://www.gnu.org. Enjoy the violence, Steve Hardt Michael Judgexevil-2.02r2.orig/makefile0100644000175000017500000000712407637265644015031 0ustar aaronlaaronl# # XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge # http://www.xevil.com # satan@xevil.com # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or (at # your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program, the file "gpl.txt"; if not, write to the Free # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA, or visit http://www.gnu.org. # # toplevel Makefile DEPTH = . include $(DEPTH)/config.mk #### IF you get an error like: #### "makefile:21 commands commence before first target. Stop #### #### chances are you unzipped the XEvil source without converting from #### Windows to UNIX line breaks. You can Use "unzip -a", but #### see http://www.xevil.com/xevil/dev/compiling.html for an important note. ALL_OBJS = $(OBJ_DIR)/role.o $(OBJ_DIR)/game.o $(OBJ_DIR)/world.o \ $(OBJ_DIR)/physical.o $(OBJ_DIR)/actual.o \ $(OBJ_DIR)/main.o $(OBJ_DIR)/intel.o \ $(OBJ_DIR)/locator.o $(OBJ_DIR)/ui.o $(OBJ_DIR)/coord.o \ $(OBJ_DIR)/area.o $(OBJ_DIR)/utils.o $(OBJ_DIR)/xdata.o \ $(OBJ_DIR)/draw.o $(OBJ_DIR)/game_style.o \ $(OBJ_DIR)/streams.o \ $(OBJ_DIR)/xetp.o $(OBJ_DIR)/xetp_basic.o $(OBJ_DIR)/id.o \ $(OBJ_DIR)/sound_cmn.o $(OBJ_DIR)/panel.o $(OBJ_DIR)/l_agreement.o \ $(OBJ_DIR)/ui_cmn.o $(OBJ_DIR)/l_agreement_dlg.o $(OBJ_DIR)/viewport.o xevil: $(OBJ_DIR)/xevil $(OBJ_DIR)/xevil$(VERSION).$(PCKG_NAME).tar.Z #xevil: $(OBJ_DIR)/xevil$(VERSION).$(PCKG_NAME).tar.Z #xevil: $(OBJ_DIR)/xevil # Build the xevil executable. # Make sure the $(STRIP) line is commented out for a debug build. # For a release build, it should be uncommented. # # Also look at DEBUG_OPT in config.mk for debug vs. release builds. $(OBJ_DIR)/xevil:: @if test ! -d $(OBJ_DIR); then \ mkdir $(OBJ_DIR); \ fi; cd $(DEPTH)/cmn; $(MAKE) cd $(DEPTH)/x11; $(MAKE) $(CC) $(LINK_FLAGS) $(LINK_OPT) $(LIBS_DIRS) -o $(OBJ_DIR)/xevil $(ALL_OBJS) $(LIBS) $(STRIP) $(OBJ_DIR)/xevil # Could also include serverping in the distribution $(OBJ_DIR)/xevil$(VERSION).$(PCKG_NAME).tar.Z:: cp readme.txt $(OBJ_DIR) cp gpl.txt $(OBJ_DIR) cp -r instructions $(OBJ_DIR) (cd $(OBJ_DIR); tar cf xevil$(VERSION).$(PCKG_NAME).tar xevil readme.txt gpl.txt instructions) (cd $(OBJ_DIR); $(COMPRESS) -f xevil$(VERSION).$(PCKG_NAME).tar) ## Make a distribution file. #dist: # tar chf xevil`date +%m.%d.%y`.tar $(FILES) # compress xevil`date +%m.%d.%y`.tar ## X11 and Win32 code in a zip file, using CRLF for text files distzip: rm -f xevilsrc.zip zip -9 -r -l xevilsrc.zip $(FILES) zip -9 -r xevilsrc.zip $(WIN32_BINARY_FILES) zip -9 -r -l xevilsrc.zip $(WIN32_TEXT_FILES) ## Make a shadow tree for the XEvil source. workdir: @if test ! -d $(WORK_DIR); then \ mkdir $(WORK_DIR); \ else \ echo $(WORK_DIR) already exists; \ fi; \ for filee in $(FILES); do \ /bin/rm -f $(WORK_DIR)/$$filee; \ ln -s $(SRC_DIR)/$$filee $(WORK_DIR); \ done ## Remove executables and all junk. clean: /bin/rm -f $(OBJ_DIR)/* core */core rmdir $(OBJ_DIR) # /bin/rm -f $(TARGETS) $(OBJS) core test test.o xshow.o xshow tildaclean: /bin/rm -f *~ */*~ */*/*~ */*/*/*~ #.SUFFIXES: .C .o #.C.o: $*.C # $(CC) $(DEBUG_OPT) $(CFLAGS) $(INCL_DIRS) -o $*.o -c $*.C xevil-2.02r2.orig/classes.txt0100644000175000017500000001426307041456366015521 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ The inheritence graph of all classes in XEvil. <> means an object with Statistics =============================================================================== Physical Explosion Fire FireExplosion Protection NProtection TProtection XProtection Moving Trapdoor Home Shot Shell <> SwapShell <> Lance <> Laser <> FrogShell <> Fireball Missile <> Star <> Droplet Blood GreenBlood OilDroplet Falling Grenade <> Napalm <> Egg Touchable Xit Flag Heavy AltarOfSin Liftable Rock Weight Item Cloak <> 800 AutoUse Doppel <> 900 Transmogifier <> 90 MedKit <> 8000 Drugs CrackPipe <> 6000 Caffine <> 6500 PCP <> 6300 Shield NShield <> 9000 TShield <> 7000 Animated Bomb <> 80 Weapon Cutter Chainsaw 800 Gun Pistol 5000 MGun 9000 Lancer 7000 AutoLancer 11000 FThrower 900 Launcher 8000 Grenades -10 Napalms -5 Stars 6000 SingleGun Swapper -20 FrogGun 700 Whistle DogWhistle 10000 (-30 if no ammo) DemonSummoner 10100 (-25 if no ammo) Creature <> Enforcer <> Seal <> Frog <> Hero <> Ninja <> ChopperBoy <> Walker <> Dog <> Mutt <> Alien <> RedHugger GreenHugger FireDemon Dragon Yeti <> Ability Locomotion Grounded (Enforcer) <> (Seal) <> Hopping (Frog) <> Walking (Hero) <> (Walker) <> (Dog) <> (Yeti) <> Sticky (Alien) <> (Ninja) <> (RedHugger) (GreenHugger) Flying (ChopperBoy) <> (FireDemon) Holder User (Hero) <> (Ninja) <> (ChopperBoy) <> (Walker) <> Carrier (Dog) <> Suicide (Enforcer) <> (Seal) <> (Frog) <> Fighter (Hero) <> (Ninja) <> (Dog) <> BuiltIn (FireDemon) 90000 (Walker) <> 5500 (Dragon) Hugger (RedHugger) (GreenHugger) Prickly (Enforcer) (Alien) (Yeti) Healing (Hero) (Alien) Lifter (ChopperBoy) Morphed (Frog) AnimTime (Seal) (Walker) OnFire (FireDemon) (Dragon) SwapProtect (FireDemon) Composite Segmented (Dragon) Sensitive (Yeti) Modifier Crack CaffineM PCPM DoubleSpeed DoubleJump DoubleHealth Values for "Dir": +---------------CO_up_L<17>-------CO_up<15>-------CO_up_R<16>--------------+ | | | || | | || | CO_l_UP<14> || CO_r_UP<8> | CO_climb_UP<20> | | || | CO_l<12> || CO_r<6> | || | | CO_climb_L<24>=CO_climb<18>=CO_climb_R<23> CO_air_UP<21> | | || | | | || CO_air_L<3>--CO_air<4>--CO_air_R<2> | | || | | | CO_climb_DN<19> CO_air_DN<22> | CO_l_DN<13> || CO_r_DN<7> | || | | | | CO_center_L<1> CO_center<5> CO_center_R<0> | +-----------------CO_dn_L<11>-------CO_dn<9>-------CO_dn_R<10>-------------+ CO_R<25>...CO_UP_R_R<40> are the "pure" directions, the 16 cardinal directions. xevil-2.02r2.orig/config.mk0100644000175000017500000003075007637265632015125 0ustar aaronlaaronl# # XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge # http://www.xevil.com # satan@xevil.com # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or (at # your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program, the file "gpl.txt"; if not, write to the Free # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA, or visit http://www.gnu.org. # #### Defines that are applicable to makes on all UNIX architectures SHELL = /bin/sh OBJ_DIR = $(DEPTH)/x11/release TARGETS = xevil # For a debug build, DEBUG_OPT should be -g # For a release build, DEBUG_OPT should be -O # Also look at the comment about $(STRIP) in the toplevel makefile for # debug vs. release builds. # # You can add -DNDEBUG to speed up a release build by removing the assert() # calls. But, on a really obscure Linux machine, this caused Xlib to blow up # internally, so you do so at your own risk. DEBUG_OPT = -O #-DNDEBUG LINK_OPT = # The string that will be used for making the packaged .tar.Z file. VERSION = 2.02r2 #SRC_DIR and WORK_DIR are only used for `make workdir` SRC_DIR = /mit/hardts/src/X/xevil1.4.9 WORK_DIR = /tmp/hardts3 ## Files not specified relative to DEPTH because we don't want the ## ./win32/res in the zip file. Or, unzipxevil won't work. FILES = \ *readme* makefile \ x11/app-defaults \ classes* *.mk unzipxevil \ cmn/*.cpp cmn/*.h cmn/makefile \ cmn/bitmaps \ x11/*.cpp x11/*.h x11/makefile \ x11/bitmaps x11/gen_xpm \ instructions/*.html \ *.xew *.bat *.txt *.html *.spec WIN32_BINARY_FILES = \ win32/*.lib \ win32/res \ win32/sounds \ instructions/*.gif WIN32_TEXT_FILES = \ dist.bat \ win32/*.cpp \ win32/*.h \ win32/*.mak \ win32/*.rc \ win32/*.dsp \ win32/*.dsw STRIP = strip COMPRESS = gzip #### Other macros are defined in the Specific Architectures section below. #### Attempt to guesss the host architecture using the HOSTYPE and hostype # variables. Then call self with the architecture name. default: @if [ $${HOSTTYPE-bob} != bob ] ; then \ archit=$$HOSTTYPE ; \ elif [ $${hosttype-bob} != bob ] ; then \ archit=$$hosttype ; \ else \ archit=unknown ; \ fi ; \ if [ $$archit != unknown ] ; then \ echo Making for $$archit ; \ $(MAKE) $$archit ; \ else \ echo "Could not figure out host architecture." ; \ echo "Set the HOSTTYPE environment variable to be one of the entries in config.mk" ; \ fi ; #### Specific architectures. ## Feel free to modify one of these to accomodate your machine's configuration. alphaOld: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm -ldnet_stub" \ CFLAGS="-DUSE_RANDOM -DRANDOM_NEEDS_PROTOTYPES -DPROTECTED_IS_PUBLIC -DSELECT_NEEDS_PROTOTYPES" \ LINK_FLAGS="-static" \ $(TARGETS) #gargamel alpha-gargamel-old: @$(MAKE) CC="cxx" LIBS="-lXpm -lX11 -lm -ldnet_stub" \ CFLAGS="-DUSE_RANDOM -DPROTECTED_IS_PUBLIC -DSELECT_NEEDS_PROTOTYPES -DNO_PRAGMAS" \ LINK_FLAGS="-non_shared" \ OBJ_DIR=$(DEPTH)/x11/OSF \ $(TARGETS) alpha: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm -ldnet_stub" \ CFLAGS="-DUSE_RANDOM -DPROTECTED_IS_PUBLIC -DSELECT_NEEDS_PROTOTYPES" \ INCL_DIRS="-I/u/mjudge/xevil/xpm/include" \ LIBS_DIRS="-L/u/mjudge/xevil/xpm/OSF" \ LINK_FLAGS="-static" OBJ_DIR=$(DEPTH)/x11/OSF PCKG_NAME="osf" \ $(TARGETS) athena-sun4: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm -lsocket -lnsl" \ CFLAGS="-DUSE_RANDOM -DRANDOM_NEEDS_PROTOTYPES -DXEVIL_KEYSET=UIsun4 -DPROTECTED_IS_PUBLIC" \ INCL_DIRS="-I/usr/openwin/include -I/mit/gnu/lib" \ LIBS_DIRS="-L/usr/openwin/lib" \ $(TARGETS) ## NOTE: The -lsocket and -lnsl libraries are not necessary on many systems. athena-sun5: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm -lsocket -lnsl" \ CFLAGS="-DXEVIL_KEYSET=UIsun4 -DPROTECTED_IS_PUBLIC" \ INCL_DIRS="-I/usr/openwin/include -I/mit/gnu/lib" \ LIBS_DIRS="-L/usr/openwin/lib" \ $(TARGETS) ## NOTE: The -lsocket and -lnsl libraries are not necessary on many systems. decmips: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm" \ INCL_DIRS="-I/mit/gnu/lib" \ CFLAGS="-DUSE_RANDOM -DRANDOM_NEEDS_PROTOTYPES -DSELECT_NEEDS_PROTOTYPES" \ $(TARGETS) decstation: @$(MAKE) decmips ds: @$(MAKE) decmips FreeBSD: @$(MAKE) freebsd # The -DMSEC_PER_CLOCK=8 is kind of a hack, take it out if the game speed of # XEvil is all screwed up. freebsd: @$(MAKE) CC="c++" \ CFLAGS="-DUSE_RANDOM -DPROTECTED_IS_PUBLIC -DMSEC_PER_CLOCK=8 -DUNAME_USR_BIN" \ INCL_DIRS="-I/usr/X11R6/include" LIBS_DIRS="-L/usr/X11R6/lib" \ OBJ_DIR=$(DEPTH)/x11/FREEBSD PCKG_NAME="freebsd" \ LIBS="-lXpm -lX11 -lm" $(TARGETS) hp700: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm" INCL_DIRS="" CFLAGS="-DUSE_RANDOM -DRANDOM_NEEDS_PROTOTYPES -DMATH_H_IS_CC -DPROTECTED_IS_PUBLIC" \ $(TARGETS) hp9000s700old: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm" INCL_DIRS="-I/tools/ns/lib/g++-include" LIBS_DIRS="-L/tools/ns/lib" \ CFLAGS="-DUSE_RANDOM -DRANDOM_NEEDS_PROTOTYPES -DMATH_H_IS_CC -DPROTECTED_IS_PUBLIC -DSELECT_TAKES_INTP -DNO_SETPRECISION" \ LINK_FLAGS="-static" \ OBJ_DIR=$(DEPTH)/x11/HPUX PCKG_NAME="hpux" \ $(TARGETS) #Couldn't get -static to work. #russia hp9000s700: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm" \ INCL_DIRS="-I/tools/ns/lib/g++-include -I/u/mjudge/xevil/xpm/include" \ LIBS_DIRS="-L/usr/lib -L/tools/ns/lib -L/u/mjudge/xevil/xpm/HPUX" \ CFLAGS="-DUSE_RANDOM -DMATH_H_IS_CC -DPROTECTED_IS_PUBLIC -DNO_SETPRECISION" \ LINK_FLAGS="" \ OBJ_DIR=$(DEPTH)/x11/HPUX PCKG_NAME="hpux"\ $(TARGETS) #-DRANDOM_NEEDS_PROTOTYPES # added -mips1 flag, instead of -32 # chainsaw iris.old: @$(MAKE) CC="CC" CFLAGS="-mips1 -DXEVIL_KEYSET=UIiris -DNO_PRAGMAS" \ INCL_DIRS="-I/u/mjudge/xevil/xpm/xpm-3.4k-irix/include" \ LIBS_DIRS="-L/u/mjudge/xevil/xpm/xpm-3.4k-irix/lib" \ LIBS="-lXpm -lX11 -lm" LINK_FLAGS="-mips1" \ OBJ_DIR=$(DEPTH)/x11/IRIX PCKG_NAME="irix" \ $(TARGETS) iris: @$(MAKE) CC="g++" CFLAGS="-DXEVIL_KEYSET=UIiris -DNO_PRAGMAS -DNO_STDLIB" \ INCL_DIRS="-I/u/mjudge/xevil/xpm/include" \ LIBS_DIRS="-L/tmp_mnt/u/mjudge/xevil/xpm/IRIX" \ LIBS="-lXpm -lX11 -lm" LINK_FLAGS="-static" \ OBJ_DIR=$(DEPTH)/x11/IRIX PCKG_NAME="irix" \ $(TARGETS) iris4d: @$(MAKE) iris jsc-sun4: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm" \ CFLAGS="-DUSE_RANDOM -DCLOCKS_PER_SEC=1000000L" \ INCL_DIRS=-I/usr/local/X11R5/sun4/include \ LIBS_DIRS=-L/usr/local/X11R5/sun4/lib $(TARGETS) # Versions of Linux with gcc 3.2. # Added no-deprecated option so wouldn't complain about using old-style c++ # header names, eg instead of i686: @$(MAKE) CC="g++" \ CFLAGS="-Wno-deprecated -DUSE_RANDOM -DXEVIL_KEYSET=UIlinux -DUSE_UINT_NET_LENGTH" \ LINK_FLAGS="-static" \ INCL_DIRS="-I/usr/X11R6/include" \ LIBS_DIRS="-L/usr/X11R6/lib" \ LIBS="-lXpm -lX11 -lm -ldl" \ OBJ_DIR=$(DEPTH)/x11/REDHAT_LINUX PCKG_NAME="redhatlinux" \ $(TARGETS) # Versions of Linux generally up to gcc 2.96 i386: @$(MAKE) CC="g++" \ CFLAGS="-DUSE_RANDOM -DXEVIL_KEYSET=UIlinux -DUSE_UINT_NET_LENGTH" \ LINK_FLAGS="-static" \ INCL_DIRS="-I/usr/X11R6/include" \ LIBS_DIRS="-L/usr/X11R6/lib" \ LIBS="-lXpm -lX11 -lm" \ OBJ_DIR=$(DEPTH)/x11/REDHAT_LINUX PCKG_NAME="redhatlinux" \ $(TARGETS) # use static # Should add -DXEVIL_KEYSET=UIlinux i386-linux-old: @$(MAKE) CC="g++" CFLAGS="-DUSE_RANDOM -DPROTECTED_IS_PUBLIC -DIO_COOKIE_HACK" \ LINK_FLAGS="-static" INCL_DIRS="" LIBS_DIRS="-L/usr/X11R6/lib" \ LIBS="-lXpm -lX11 -lm" \ OBJ_DIR=$(DEPTH)/x11/LINUX \ $(TARGETS) #for devastator and truth i386-linux-old2: @$(MAKE) CC="g++" CFLAGS="-DUSE_RANDOM -DPROTECTED_IS_PUBLIC -DIO_COOKIE_HACK -DXEVIL_KEYSET=UIlinux" \ LINK_FLAGS="-static" INCL_DIRS="" LIBS_DIRS="-L/usr/X11R6/lib" \ LIBS="-lXpm -lX11 -lm" \ OBJ_DIR=$(DEPTH)/x11/LINUX PCKG_NAME="linux" \ $(TARGETS) # Some other varieties of linux, perhaps should change OBJ_DIR and PCKG_NAME i386-linux: @$(MAKE) i386 i486-linux: @$(MAKE) i386 powerpc-linux: @$(MAKE) i386 powerpc: @$(MAKE) i386 i386-sco: @$(MAKE) CC="CC" CFLAGS="-b elf -DUSE_RANDOM -DUSE_SELECT_H -DMATH_H_IS_CC" \ INCL_DIRS="-I/usr/include/X11 -I/usr/include/CC" \ LIBS_DIRS="-L/usr/lib -L/usr/lib/CC" \ LIBS="-lXpm -lX11 -lm -lc -lsocket -lmalloc" $(TARGETS) #static doesn't work on jordan rs6000jordanalso: @$(MAKE) CC="g++" CFLAGS="-DUSE_RANDOM -DUSE_SELECT_H -DXEVIL_KEYSET=UIrsaix -DPROTECTED_IS_PUBLIC -DUSE_ULONG_NET_LENGTH" \ LIBS="-lXpm -lX11 -lm" INCL_DIRS="-I/usr/include -I/tools/ns/lib/g++-include" \ LIBS_DIRS="-L/tools/ns/lib" \ OBJ_DIR=$(DEPTH)/x11/AIX \ $(TARGETS) #static doesn't work on jordan #jordan rs6000jordan: @$(MAKE) CC="g++" CFLAGS="-DUSE_RANDOM -DUSE_SELECT_H -DXEVIL_KEYSET=UIrsaix -DPROTECTED_IS_PUBLIC -DUSE_ULONG_NET_LENGTH" \ INCL_DIRS="-I/usr/include -I/tools/ns/lib/g++-include -I/u/mjudge/xevil/xpm/include" \ LIBS_DIRS="-L/tools/ns/lib -L/u/mjudge/xevil/xpm/AIX" \ LIBS="-lXpm -lX11 -lm" \ OBJ_DIR=$(DEPTH)/x11/AIX PCKG_NAME="aix"\ $(TARGETS) #iron rs6000: @$(MAKE) CC="g++" CFLAGS="-DUSE_RANDOM -DUSE_SELECT_H -DXEVIL_KEYSET=UIrsaix -DPROTECTED_IS_PUBLIC -DMATH_CLASS_HACK " \ INCL_DIRS="-I/usr/include -I/tools/ns/lib/g++-include -I/u/mjudge/xevil/xpm/include" \ LIBS_DIRS="-L/tools/ns/lib -L/u/mjudge/xevil/xpm/AIX" \ LIBS="-lXpm -lX11 -lm" \ LINK_FLAGS="" \ OBJ_DIR=$(DEPTH)/x11/AIX PCKG_NAME="aix"\ $(TARGETS) oldsun4: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm" \ CFLAGS="-DCLOCKS_PER_SEC=1000000L -DUSE_RANDOM -DRANDOM_NEEDS_PROTOTYPES -DXEVIL_KEYSET=UIsun4 -DPROTECTED_IS_PUBLIC -DSELECT_NEEDS_PROTOTYPES" \ $(TARGETS) openwound-sun4: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm" \ CFLAGS="-DUSE_RANDOM -DRANDOM_NEEDS_PROTOTYPES -DXEVIL_KEYSET=UIsun4 -DPROTECTED_IS_PUBLIC -DSELECT_NEEDS_PROTOTYPES -DOPENWOUND_XOS_STRLEN_HACK" \ INCL_DIRS="-I/tools/ns/lib/g++-include -I/usr/openwin/include -I/u/mjudge/xevil/xpm/include"\ LIBS_DIRS="-L/tools/ns/lib -L/usr/openwin/lib -L/u/mjudge/xevil/xpm/SUN4"\ LINK_FLAGS="-static" \ OBJ_DIR=$(DEPTH)/x11/SUN4 PCKG_NAME="sun4" \ $(TARGETS) # Took out -DCLOCKS_PER_SEC=1000000L # scar sun4-scar: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm" \ CFLAGS="-DCLOCKS_PER_SEC=1000000L -DUSE_RANDOM -DRANDOM_NEEDS_PROTOTYPES -DXEVIL_KEYSET=UIsun4 -DPROTECTED_IS_PUBLIC -DSELECT_NEEDS_PROTOTYPES -DOPENWOUND_XOS_STRLEN_HACK" \ INCL_DIRS="-I/tools/ns/lib/g++-include -I/usr/openwin/include"\ LIBS_DIRS="-L/tools/ns/lib -L/usr/openwin/lib"\ LINK_FLAGS="-static" \ OBJ_DIR=$(DEPTH)/x11/SUN4 PCKG_NAME="sun4" \ $(TARGETS) # was acland, now worms solaris-old: @$(MAKE) CC="g++" LIBS="-lXext -lXpm -lX11 -lm -lsocket -lnsl" \ CFLAGS="-DUSE_RANDOM -DRANDOM_NEEDS_PROTOTYPES -DXEVIL_KEYSET=UIsun4 -DPROTECTED_IS_PUBLIC -DSELECT_NEEDS_PROTOTYPES -DOPENWOUND_XOS_STRLEN_HACK" \ INCL_DIRS="-I/tools/ns/lib/g++-include -I/usr/openwin/include -I/u/mjudge/xevil/xpm/xpm-3.4k-solaris/include" \ LIBS_DIRS="-L/tools/ns/lib -L/usr/openwin/lib -L/u/mjudge/xevil/xpm/xpm-3.4k-solaris/lib" \ LINK_FLAGS="-static" \ OBJ_DIR=$(DEPTH)/x11/SOLARIS PCKG_NAME="solaris" \ $(TARGETS) sun4: @$(MAKE) solaris # worms # now, mocha solaris: @$(MAKE) CC="g++" LIBS="-lXext -lXpm -lX11 -lm -lsocket -lnsl" \ CFLAGS="-DUSE_RANDOM -DXEVIL_KEYSET=UIsun4 -DPROTECTED_IS_PUBLIC -DSELECT_NEEDS_PROTOTYPES -DOPENWOUND_XOS_STRLEN_HACK" \ INCL_DIRS="-I/usr/openwin/include -I/u/mjudge/xevil/xpm/include" \ LIBS_DIRS="-L/usr/openwin/lib -L/u/mjudge/xevil/xpm/SOLARIS" \ LINK_FLAGS="" \ OBJ_DIR=$(DEPTH)/x11/SOLARIS PCKG_NAME="solaris" \ $(TARGETS) beepbeep-sun4: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm" \ CFLAGS="-DXEVIL_KEYSET=UIsun4 -DPROTECTED_IS_PUBLIC" \ INCL_DIRS="-I/usr/openwin/include" LIBS_DIRS="-L/usr/openwin/lib" \ $(TARGETS) sun5: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm" \ CFLAGS="-DUSE_RANDOM -DRANDOM_NEEDS_PROTOTYPES -DXEVIL_KEYSET=UIsun4 -DPROTECTED_IS_PUBLIC" \ INCL_DIRS="-I/usr/openwin/include" LIBS_DIRS="-L/usr/openwin/lib" \ $(TARGETS) vision-sun4: @$(MAKE) CC="g++" LIBS="-lXpm -lX11 -lm" \ CFLAGS="-DCLOCKS_PER_SEC=1000000L -DUSE_RANDOM -DRANDOM_NEEDS_PROTOTYPES -DXEVIL_KEYSET=UIsun4 -DPROTECTED_IS_PUBLIC" \ INCL_DIRS="-I/usr/openwin/include" \ $(TARGETS) #dynamic linking fails sun386i: @$(MAKE) CC="g++"\ INCL_DIRS="-I/usr/openwin/include -I/u/mjudge/xevil/xpm/include" \ LIBS_DIRS="-L/usr/openwin/lib -L/u/mjudge/xevil/xpm/SOLX86" \ LIBS="-lXpm -lX11 -lm -lsocket -lnsl" \ STRIP="/usr/ccs/bin/strip" \ LINK_FLAGS="" \ OBJ_DIR=$(DEPTH)/x11/SOLX86 PCKG_NAME="solx86"\ $(TARGETS) xevil-2.02r2.orig/unzipxevil0100644000175000017500000000042507636132650015453 0ustar aaronlaaronl#!/bin/csh # Convert text echo "---------------- Text and Binary Files -----------------" unzip -a xevilsrc.zip -x win32/res/\*.bmp -x win32/\*.dsp # Don't convert CRLF echo "---------------- Binary Files -----------------" unzip -b xevilsrc.zip win32/res/\*.bmp win32/\*.dsp xevil-2.02r2.orig/cmn/0040755000175000017500000000000007637441100014064 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/0040755000175000017500000000000007675236133015535 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/alien/0040755000175000017500000000000007637441100016613 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/alien/alien.bitmaps0100644000175000017500000001272707041425154021272 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/alien/alien_0.xpm" #include "gen_xpm/alien/alien_0b.xpm" #include "gen_xpm/alien/alien_0c.xpm" #include "gen_xpm/alien/alien_0d.xpm" #include "gen_xpm/alien/alien_0e.xpm" #include "gen_xpm/alien/alien_0f.xpm" #include "gen_xpm/alien/alien_10b.xpm" #include "gen_xpm/alien/alien_10c.xpm" #include "gen_xpm/alien/alien_10d.xpm" #include "gen_xpm/alien/alien_18.xpm" #include "gen_xpm/alien/alien_2.xpm" #include "gen_xpm/alien/alien_20b.xpm" #include "gen_xpm/alien/alien_20c.xpm" #include "gen_xpm/alien/alien_25.xpm" #include "gen_xpm/alien/alien_4.xpm" #include "gen_xpm/alien/alien_5.xpm" #include "gen_xpm/alien/alien_9.xpm" #endif Size Alien::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP Alien::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Alien(w,l,pos); assert(ret); return ret; } CreatureXdata Alien::creatureXdata; StickyXdata Alien::stickyXdata; PricklyXdata Alien::pricklyXdata; HealingXdata Alien::healingXdata; const CreatureContext Alien::creatureContext = { /** CreatureContext **/ 5, /* crawlSpeed */ 8, /* centerSpeed */ 14, /* airSpeed */ 6, /* climbSpeed */ 13, /* jump */ 2, /* acceleration */ 180, /* corpseHealth */ True, /* biological */ DROPLET_GREEN_BLOOD, /* dropletType */ 0, /*alien death sound*/ {/** MovingContext **/ #if X11 "black",False, "black",False, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(0,0,0)/*"black"*/,FALSE, #endif /* animMax */ {6,6,1,1,1,1, 1, 4,4, 1, 4,4, 1, 4,4, 1, 4,4, 1, 4,4, 1,1, 4,4, 1, /* deadAnimMax */ }, /* sizes */ {{24,29},{24,29},{26,28},{26,28},{13,29},{10,27}, {16,31}, {16,31},{16,31}, {31,16}, {31,16},{31,16}, {16,31}, {16,31},{16,31}, {31,16}, {31,16},{31,16}, {9,29}, /* Must be */ {9,29},{9,29}, /* same size. */ {13,29},{13,29}, {9,29},{9,29}, {30,11}, /* deadSize */ }, /* offsets */ {{0}}, /* pixmapBits */ {{CMN_ID(alien_0,IDB_HIALIEN0),CMN_ID(alien_0b,IDB_HIALIEN0B), CMN_ID(alien_0c,IDB_HIALIEN0C),CMN_ID(alien_0d,IDB_HIALIEN0D), CMN_ID(alien_0e,IDB_HIALIEN0E), CMN_ID(alien_0f,IDB_HIALIEN0F),}, {PH_AUTO_GEN}, {CMN_ID(alien_2,IDB_HIALIEN2)}, {PH_AUTO_GEN}, {CMN_ID(alien_4,IDB_HIALIEN4)}, {CMN_ID(alien_5,IDB_HIALIEN5)}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(alien_9,IDB_HIALIEN10)}, {CMN_ID(alien_9,IDB_HIALIEN10),CMN_ID(alien_10b,IDB_HIALIEN10B), CMN_ID(alien_10c,IDB_HIALIEN10C),CMN_ID(alien_10d,IDB_HIALIEN10D)},{PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(alien_18,IDB_HIALIEN18)}, {PH_AUTO_GEN}, // Fourth climbing frame same as the second. {CMN_ID(alien_18,IDB_HIALIEN18),CMN_ID(alien_20b,IDB_HIALIEN18B), CMN_ID(alien_20c,IDB_HIALIEN18C),CMN_ID(alien_20b,IDB_HIALIEN18B)}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(alien_18,IDB_HIALIEN18),CMN_ID(alien_20b,IDB_HIALIEN18B), CMN_ID(alien_20c,IDB_HIALIEN18C),CMN_ID(alien_20b,IDB_HIALIEN18B)}, {PH_AUTO_GEN}, {CMN_ID(alien_25,IDB_HIALIEN25)}, /* deadPixmapBits */ }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 300, /* health */ 300, /* mass */ A_Alien, /* classId */ "alien", /* clas */ True, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ True, /* potentialEnemy */ 10, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {31,31}, /* sizeMax */ Alien::create, /* create */ False, /* statsCreations */ False, /* statsUses */ True, /* statsDeaths */ Alien::get_stats, /* get_stats */ NULL, /* arg */ Alien::init_x, /* init_x */ Alien::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ False, /* invisibility */ }, }; const StickyContext Alien::stickyContext = { /** StickyContext **/ 5, /* wallCrawlSpeed */ }; const PricklyContext Alien::pricklyContext = { /** PricklyContext **/ 23, /* damage */ }; const HealingContext Alien::healingContext = { /** HealingContext **/ 2.0f,/* multiplier */ 1,/* unit */ 20,/* time */ }; xevil-2.02r2.orig/cmn/bitmaps/altar_of_sin/0040755000175000017500000000000007637441100020163 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/altar_of_sin/altar_of_sin.bitmaps0100644000175000017500000000716507041425154024212 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/altar_of_sin/altar_of_sin_4.xpm" #include "gen_xpm/altar_of_sin/altar_of_sin_4b.xpm" #include "gen_xpm/altar_of_sin/altar_of_sin_4c.xpm" #endif #define ALTAR_OF_SIN_KILLS 5 #define ALTAR_OF_SIN_TRIES 100 Size AltarOfSin::get_size_max() { return context.fallingContext.movingContext.sizes[CO_air]; } PhysicalP AltarOfSin::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new AltarOfSin(w,l,pos); assert(ret); return ret; } HeavyXdata AltarOfSin::xdata; const HeavyContext AltarOfSin::context = {/** HeavyContext **/ 100, /* damage */ {/** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, "red1",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(255,0,0)/*"red1"*/,TRUE, #endif /* animMax */ {0,0,0,0,3}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{24,32},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0}, {CMN_ID(altar_of_sin_4,IDB_HIALTAR), CMN_ID(altar_of_sin_4b,IDB_HIALTARB), CMN_ID(altar_of_sin_4c,IDB_HIALTARC)},}, /* maskBits */ {{0}}, {/** PhysicalContext **/ 2000, /* health */ 10000, /* mass */ A_AltarOfSin, /* classId */ "altar-of-sin", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ /* Handled specially in GameObjects. */ 0.0f, /* objectWorldPercent */ 1, /* levelMaxTimes */ {24,32}, /* sizeMax */ AltarOfSin::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ AltarOfSin::init_x, /* init_x */ AltarOfSin::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }; #if 0 // copied from Hero const HealingContext AltarOfSin::healingContext = { /** HealingContext **/ 2.0f,/* multiplier */ 1,/* unit */ 4,/* time */ }; // copied from FireDemon const OnFireContext AltarOfSin::onFireContext = { /** OnFireContext **/ 1, /* fires */ 6, /* heat */ True, /* deadBurns */ }; // mostly copied from FireDemon const BuiltInContext AltarOfSin::fireballsContext = { /** BuiltInContext **/ 10, /* shotTime */ A_Fireballs, /* weaponClassId */ "fireballs", /* weaponStr */ 90000, /* coolness */ 0, /* attackSound */ FireDemon::get_shot_size, /* get_shot_size */ FireDemon::create_shot, /* create_shot */ NULL, /* compute_weapon_dir */ }; #endif xevil-2.02r2.orig/cmn/bitmaps/auto_lancer/0040755000175000017500000000000007637441100020017 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/auto_lancer/auto_lancer.bitmaps0100644000175000017500000000664407041425154023703 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/auto_lancer/auto_lancer_4.xpm" #endif Size AutoLancer::get_size_max() { return context.weaponContext.itemContext.fallingContext.movingContext .physicalContext.sizeMax; } PhysicalP AutoLancer::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new AutoLancer(w,l,pos); assert(ret); return ret; } static void auto_lancer_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = True; #if WIN32 iconId = IDB_AUTOLANCER; #endif #if X11 iconId = 0; #endif } GunXdata AutoLancer::xdata; const GunContext AutoLancer::context = { /** GunContext **/ 4, /* shotTime */ 40, /* ammoInitial */ 45, /* ammoMax */ { /** WeaponContext **/ SoundNames::LANCER, { /** ItemContext **/ True, /* persists */ 11000, /* coolness */ 0, /*item use sound */ { /** FallingContext **/ { /** MovingContext **/ #if X11 "red",False, Xvars_BACKGROUND,True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, Xvars_BACKGROUND,True, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{20,6},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(auto_lancer_4,IDB_AUTOLANCER)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 5, /* health */ 23, /* mass */ A_AutoLancer, /* classId */ "auto-lancer", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0, /* objectWorldPercent */ 0, /* levelMaxTimes */ {20,6}, /* sizeMax */ Lancer::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ AutoLancer::init_x, /* init_x */ AutoLancer::create_from_stream, /* create_from_stream */ auto_lancer_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/blood/0040755000175000017500000000000007637441100016622 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/blood/blood.bitmaps0100644000175000017500000000714307041425154021304 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/blood/blood_25.xpm" #include "gen_xpm/blood/blood_39.xpm" #include "gen_xpm/blood/blood_4.xpm" #include "gen_xpm/blood/blood_40.xpm" #include "gen_xpm/blood/blood_9.xpm" #endif Size Blood::get_size_max() { return context.movingContext.physicalContext.sizeMax; } PhysicalP Blood::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } DropletXdata Blood::xdata; const DropletContext Blood::context = {/** DropletContext **/ 25, /* dissolveTime */ {/** MovingContext **/ #if X11 "red",False, "white",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(0,255,255)/*"cyan"*/,TRUE, #endif /* animMax */ {0,0,0,0,1,0, 1, 0,0, 1, 0,0, 1, 0,0, 1, 0,0, 0, 0,0, 0,0, 0,0, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, }, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{2,4},{0,0}, {1,7}, {0},{0}, {7,1}, {0},{0}, {1,7}, {0},{0}, {7,1}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {7,2},{6,4},{5,5},{4,6}, {2,7},{4,6},{5,5},{6,4}, {7,2},{6,4},{5,5},{4,6}, {2,7},{4,6},{5,5},{6,4}, }, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(blood_4,IDB_BLOOD4)},{0}, {PH_AUTO_GEN}, {0},{0}, {CMN_ID(blood_9,IDB_BLOOD9)}, {0},{0}, {PH_AUTO_GEN}, {0},{0}, {PH_AUTO_GEN}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {CMN_ID(blood_25,IDB_BLOOD25)}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {CMN_ID(blood_39,IDB_BLOOD39)}, {CMN_ID(blood_40,IDB_BLOOD40)} }, /* maskBits */ {{0}}, {/* PhysicalContext */ 1, /* health */ 0, /* mass */ A_Blood, /* classId */ "blood", /* className */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {7,7}, /* sizeMax */ Blood::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Blood::init_x, /* init_x */ Blood::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }; xevil-2.02r2.orig/cmn/bitmaps/bomb/0040755000175000017500000000000007637441100016442 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/bomb/bomb.bitmaps0100644000175000017500000001115207041425154020737 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/bomb/bomb_25.xpm" #include "gen_xpm/bomb/bomb_25b.xpm" #include "gen_xpm/bomb/bomb_26.xpm" #include "gen_xpm/bomb/bomb_27.xpm" #include "gen_xpm/bomb/bomb_28.xpm" #include "gen_xpm/bomb/bomb_29.xpm" #include "gen_xpm/bomb/bomb_30.xpm" #include "gen_xpm/bomb/bomb_31.xpm" #endif // Defines #define BOMB_TIME 10 #define BOMB_FRAME_INACTIVE 6 #define BOMB_FRAME_ACTIVE 5 #define BOMB_EXPLOSION_RADIUS 100 #define BOMB_EXPLOSION_DAMAGE_MAX 350 Size Bomb::get_size_max() { return context.itemContext.fallingContext.movingContext.physicalContext.sizeMax; } PhysicalP Bomb::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Bomb(w,l,pos); assert(ret); return ret; } static void bomb_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = False; #if WIN32 iconId = IDB_HIBOMB6; #endif #if X11 iconId = 0; #endif } AnimatedXdata Bomb::xdata; const AnimatedContext Bomb::context = { /** AnimatedContext **/ { /** ItemContext **/ False, /* persists */ 80, /* coolness */ 0, /*item use sound*/ // The Explosion object makes the noise. { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, "white",True, #endif #if WIN32 RGB(0,0,0),False, RGB(0,0,0),True, #endif /* animMax */ {0,0,0,0,0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0,0, 0,0, 2,2,2,2,2,2,1,}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0},{0,0}, {0,0},{0,0}, {14,13},{14,13},{14,13},{14,13},{14,13},{14,13},{14,13}, }, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {CMN_ID(bomb_25,IDB_HIBOMB0), CMN_ID(bomb_25b,IDB_HIBOMBBLK)}, {CMN_ID(bomb_26,IDB_HIBOMB1), CMN_ID(bomb_25b,IDB_HIBOMBBLK),}, {CMN_ID(bomb_27,IDB_HIBOMB2), CMN_ID(bomb_25b,IDB_HIBOMBBLK),}, {CMN_ID(bomb_28,IDB_HIBOMB3), CMN_ID(bomb_25b,IDB_HIBOMBBLK),}, {CMN_ID(bomb_29,IDB_HIBOMB4), CMN_ID(bomb_25b,IDB_HIBOMBBLK),}, {CMN_ID(bomb_30,IDB_HIBOMB5), CMN_ID(bomb_25b,IDB_HIBOMBBLK),}, {CMN_ID(bomb_31,IDB_HIBOMB6)}, }, /* maskBits */ {{0}}, { /** PhysicalContext **/ 1, /* health */ 20, /* mass */ A_Bomb, /* classId */ "bomb", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ True, /* potentialOtherItem */ .0006f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {14,13}, /* sizeMax */ Bomb::create, /* create */ False, /* statsCreations */ True, /* statsUses */ False, /* statsDeaths */ Bomb::get_stats, /* get_stats */ NULL, /* arg */ Bomb::init_x, /* init_x */ Bomb::create_from_stream, /* create_from_stream */ bomb_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/caffine/0040755000175000017500000000000007637441100017116 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/caffine/caffine.bitmaps0100644000175000017500000000645407041425152022076 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // For CaffineM and Caffine. #if X11 #include "gen_xpm/caffine/caffine_4.xpm" #endif #define CAFFINE_M_TIME 300 Size Caffine::get_size_max() { return context.autoUseContext.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP Caffine::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Caffine(w,l,pos); assert(ret); return ret; } static void caffine_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = False; #if WIN32 iconId = IDB_CAFFINE; #endif #if X11 iconId = 0; #endif } DrugsXdata Caffine::xdata; const DrugsContext Caffine::context = { /** DrugsContext **/ 0, /* odChance */ { /** AutoUseContext **/ False, /* humansOnly */ { /** ItemContext **/ True, /* persists */ 6500, /* coolness */ 0, { /** FallingContext **/ {/** MovingContext **/ #if X11 "white",True, "brown4",False, #endif #if WIN32 RGB(255,0,0)/*"red"*/,True, RGB(255,255,255)/*"white"*/,False, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{6,11},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(caffine_4,IDB_CAFFINE)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 1, /* health */ 3, /* mass */ A_Caffine, /* classId */ "caffine", /* className */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ True, /* potentialOtherItem */ 0.0003f, /* objectWorldPercent */ 6, /* levelMaxTimes */ {6,11}, /* sizeMax */ Caffine::create, /* create */ False, /* statsCreations */ True, /* statsUses */ False, /* statsDeaths */ Caffine::get_stats, /* get_stats */ NULL, /* arg */ Caffine::init_x, /* init_x */ Caffine::create_from_stream, /* create_from_stream */ caffine_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, } }; xevil-2.02r2.orig/cmn/bitmaps/chainsaw/0040755000175000017500000000000007637441100017320 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/chainsaw/chainsaw.bitmaps0100644000175000017500000001773307041425152022504 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/chainsaw/chainsaw_0.xpm" #include "gen_xpm/chainsaw/chainsaw_0b.xpm" #include "gen_xpm/chainsaw/chainsaw_0c.xpm" #include "gen_xpm/chainsaw/chainsaw_1.xpm" #include "gen_xpm/chainsaw/chainsaw_7.xpm" #include "gen_xpm/chainsaw/chainsaw_7b.xpm" #include "gen_xpm/chainsaw/chainsaw_1b.xpm" #include "gen_xpm/chainsaw/chainsaw_1c.xpm" #include "gen_xpm/chainsaw/chainsaw_4.xpm" #include "gen_xpm/chainsaw/chainsaw_4b.xpm" #include "gen_xpm/chainsaw/chainsaw_5.xpm" #include "gen_xpm/chainsaw/chainsaw_5b.xpm" #endif Size Chainsaw::get_size_max() { return context.weaponContext.itemContext.fallingContext.movingContext.physicalContext.sizeMax; } PhysicalP Chainsaw::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Chainsaw(w,l,pos); assert(ret); return ret; } static void chainsaw_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = True; #if WIN32 iconId = IDB_CHAINSAW25; #endif #if X11 iconId = 0; #endif } CutterXdata Chainsaw::xdata; const CutterContext Chainsaw::context = { /** CutterContext **/ 40, /* damage */ /* offsets */ {{8,-3},{-8,-3},{9,-1},{-9,-1},{-1,-15},{1,-3}, {0,-14}, {0,14},{0,-14}, {13,-2}, {13,-2},{-13,-2}, {0,14}, {0,14},{0,-14}, {14,-1}, {14,-1},{-14,-1}, {0,-15}, {0,16},{0,-15}, {0,-15},{0,15}, {8,-3},{-8,-3}, }, SoundNames::CHAINSAW_SOUND, { /** WeaponContext **/ 0, /*weapon sound*/ { /** ItemContext **/ True, /* persists */ 800, /* coolness */ 0, /*item use sound */ { /** FallingContext **/ {/** MovingContext **/ #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(192,192,192)/*"gray70"*/,TRUE, #endif #if X11 "black",False, "gray70",True, #endif /* animMax */ {3,3,3,3,2,2, 2, 2,2, 3, 3,3, 2, 2,2, 3, 3,3, 2, 2,2, 2,2, 3,3, 1, /* unheldAnimNum */ }, /* sizes */ {{19,9},{19,9},{19,9},{19,9},{9,19},{6,9}, {9,19}, {9,19},{9,19}, {19,9}, {19,9},{19,9}, {9,19}, {9,19},{9,19}, {19,9}, {19,9},{19,9}, {9,19}, {9,19},{9,19}, {9,19},{9,19}, {19,9},{19,9}, {19,9}, /* unheldSize */ }, /* offsets */ {{0}}, /* pixmapBits */ // Not worth the trouble to make the rotations/reflections // auto-generated, e.g. PH_AUTO_GEN {{CMN_ID(chainsaw_0,IDB_CHAINSAW25), CMN_ID(chainsaw_0b,IDB_CHAINSAW25B), CMN_ID(chainsaw_0c,IDB_CHAINSAW25C)}, {CMN_ID(chainsaw_1,IDB_CHAINSAW33), CMN_ID(chainsaw_1b,IDB_CHAINSAW33B), CMN_ID(chainsaw_1c,IDB_CHAINSAW33C)}, {CMN_ID(chainsaw_0,IDB_CHAINSAW25), CMN_ID(chainsaw_0b,IDB_CHAINSAW25B), CMN_ID(chainsaw_0c,IDB_CHAINSAW25C)}, {CMN_ID(chainsaw_1,IDB_CHAINSAW33), CMN_ID(chainsaw_1b,IDB_CHAINSAW33B), CMN_ID(chainsaw_1c,IDB_CHAINSAW33C)}, {CMN_ID(chainsaw_4,IDB_CHAINSAW37), CMN_ID(chainsaw_4b,IDB_CHAINSAW37B)}, {CMN_ID(chainsaw_5,IDB_CHAINSAW5), CMN_ID(chainsaw_5b,IDB_CHAINSAW5B)}, /* _r */ {CMN_ID(chainsaw_4,IDB_CHAINSAW37), CMN_ID(chainsaw_4b,IDB_CHAINSAW37B)}, {CMN_ID(chainsaw_4,IDB_CHAINSAW29), CMN_ID(chainsaw_4b,IDB_CHAINSAW29B)}, {CMN_ID(chainsaw_4,IDB_CHAINSAW37), CMN_ID(chainsaw_4b,IDB_CHAINSAW37B)}, /* _dn */ {CMN_ID(chainsaw_0,IDB_CHAINSAW25), CMN_ID(chainsaw_0b,IDB_CHAINSAW25B), CMN_ID(chainsaw_0c,IDB_CHAINSAW25C)}, {CMN_ID(chainsaw_0,IDB_CHAINSAW25), CMN_ID(chainsaw_0b,IDB_CHAINSAW25B), CMN_ID(chainsaw_0c,IDB_CHAINSAW25C)}, {CMN_ID(chainsaw_1,IDB_CHAINSAW33), CMN_ID(chainsaw_1b,IDB_CHAINSAW33B), CMN_ID(chainsaw_1c,IDB_CHAINSAW33C)}, /* _l */ {CMN_ID(chainsaw_4,IDB_CHAINSAW29), CMN_ID(chainsaw_4b,IDB_CHAINSAW29B)}, {CMN_ID(chainsaw_4,IDB_CHAINSAW29), CMN_ID(chainsaw_4b,IDB_CHAINSAW29B)}, {CMN_ID(chainsaw_4,IDB_CHAINSAW37), CMN_ID(chainsaw_4b,IDB_CHAINSAW37B)}, /* _up */ {CMN_ID(chainsaw_0,IDB_CHAINSAW25), CMN_ID(chainsaw_0b,IDB_CHAINSAW25B), CMN_ID(chainsaw_0c,IDB_CHAINSAW25C)}, {CMN_ID(chainsaw_0,IDB_CHAINSAW25), CMN_ID(chainsaw_0b,IDB_CHAINSAW25B), CMN_ID(chainsaw_0c,IDB_CHAINSAW25C)}, {CMN_ID(chainsaw_1,IDB_CHAINSAW33), CMN_ID(chainsaw_1b,IDB_CHAINSAW33B), CMN_ID(chainsaw_1c,IDB_CHAINSAW33C)}, /* _climb and _air */ {CMN_ID(chainsaw_4,IDB_CHAINSAW37), CMN_ID(chainsaw_4b,IDB_CHAINSAW37B)}, {CMN_ID(chainsaw_7,IDB_CHAINSAW29), CMN_ID(chainsaw_7b,IDB_CHAINSAW29B)}, {CMN_ID(chainsaw_4,IDB_CHAINSAW37), CMN_ID(chainsaw_4b,IDB_CHAINSAW37B)}, {CMN_ID(chainsaw_4,IDB_CHAINSAW37), CMN_ID(chainsaw_4b,IDB_CHAINSAW37B)}, {CMN_ID(chainsaw_7,IDB_CHAINSAW29), CMN_ID(chainsaw_7b,IDB_CHAINSAW29B)}, {CMN_ID(chainsaw_0,IDB_CHAINSAW25), CMN_ID(chainsaw_0b,IDB_CHAINSAW25B), CMN_ID(chainsaw_0c,IDB_CHAINSAW25C)}, {CMN_ID(chainsaw_1,IDB_CHAINSAW33), CMN_ID(chainsaw_1b,IDB_CHAINSAW33B), CMN_ID(chainsaw_1c,IDB_CHAINSAW33C)}, /* unheldPixmapBits */ {CMN_ID(chainsaw_0,IDB_CHAINSAW25)}, }, /* maskBits */ {{0}}, { /** PhysicalContext **/ 200, /* health */ 1000, /* mass */ A_Chainsaw, /* classId */ "chainsaw", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ True, /* potentialWeapon */ False, /* potentialOtherItem */ .0002f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {19,19}, /* sizeMax */ Chainsaw::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Chainsaw::init_x, /* init_x */ Chainsaw::create_from_stream, /* create_from_stream */ chainsaw_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/chopper_boy/0040755000175000017500000000000007637441100020034 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/chopper_boy/chopper_boy.bitmaps0100644000175000017500000001434307041425152023726 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/chopper_boy/chopper_boy_0.xpm" #include "gen_xpm/chopper_boy/chopper_boy_0b.xpm" #include "gen_xpm/chopper_boy/chopper_boy_0c.xpm" #include "gen_xpm/chopper_boy/chopper_boy_0d.xpm" #include "gen_xpm/chopper_boy/chopper_boy_0e.xpm" #include "gen_xpm/chopper_boy/chopper_boy_0f.xpm" #include "gen_xpm/chopper_boy/chopper_boy_2.xpm" #include "gen_xpm/chopper_boy/chopper_boy_2b.xpm" #include "gen_xpm/chopper_boy/chopper_boy_2c.xpm" #include "gen_xpm/chopper_boy/chopper_boy_2d.xpm" #include "gen_xpm/chopper_boy/chopper_boy_4.xpm" #include "gen_xpm/chopper_boy/chopper_boy_4b.xpm" #include "gen_xpm/chopper_boy/chopper_boy_4c.xpm" #include "gen_xpm/chopper_boy/chopper_boy_4d.xpm" #include "gen_xpm/chopper_boy/chopper_boy_5.xpm" #include "gen_xpm/chopper_boy/chopper_boy_21.xpm" #include "gen_xpm/chopper_boy/chopper_boy_21b.xpm" #include "gen_xpm/chopper_boy/chopper_boy_21c.xpm" #include "gen_xpm/chopper_boy/chopper_boy_21d.xpm" #include "gen_xpm/chopper_boy/chopper_boy_22.xpm" #include "gen_xpm/chopper_boy/chopper_boy_22b.xpm" #include "gen_xpm/chopper_boy/chopper_boy_22c.xpm" #include "gen_xpm/chopper_boy/chopper_boy_22d.xpm" #include "gen_xpm/chopper_boy/chopper_boy_25.xpm" #endif Size ChopperBoy::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP ChopperBoy::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new ChopperBoy(w,l,pos); assert(ret); return ret; } CreatureXdata ChopperBoy::creatureXdata; UserXdata ChopperBoy::userXdata; FlyingXdata ChopperBoy::flyingXdata; LifterXdata ChopperBoy::lifterXdata; const CreatureContext ChopperBoy::creatureContext = { /** CreatureContext **/ 0, /* crawlSpeed */ 7, /* centerSpeed */ 9, /* airSpeed */ 0, /* climbSpeed */ 7, /* jump */ 2, /* acceleration */ 160, /* corpseHealth */ True, /* biological */ DROPLET_BLOOD, /* dropletType */ SoundNames::CHOP_DEATH, {/** MovingContext **/ #if X11 "Green4",False, "black",False, #endif #if WIN32 RGB(0,192,0),FALSE, RGB(0,0,0),FALSE, #endif /* animMax */ {6,6,4,4,4,1, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 4,4, 0,0, 1, /* deadAnimMax */ }, /* sizes */ {{14,20},{14,20},{12,20},{12,20},{13,20},{13,20}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, /* Must be */ {0,0},{0,0}, /* same size. */ {13,20},{13,20}, {0,0},{0,0}, {19,9}, /* deadSize */ }, /* offsets */ {{0}}, {/* pixmapBits */ {CMN_ID(chopper_boy_0,IDB_HICHOPPERBOY0), CMN_ID(chopper_boy_0b,IDB_HICHOPPERBOY0B), CMN_ID(chopper_boy_0c,IDB_HICHOPPERBOY0C), CMN_ID(chopper_boy_0d,IDB_HICHOPPERBOY0D), CMN_ID(chopper_boy_0e,IDB_HICHOPPERBOY0E), CMN_ID(chopper_boy_0f,IDB_HICHOPPERBOY0F)}, {PH_AUTO_GEN}, {CMN_ID(chopper_boy_2,IDB_HICHOPPERBOY2), CMN_ID(chopper_boy_2b,IDB_HICHOPPERBOY2B), CMN_ID(chopper_boy_2c,IDB_HICHOPPERBOY2C), CMN_ID(chopper_boy_2d,IDB_HICHOPPERBOY2D)}, {PH_AUTO_GEN}, {CMN_ID(chopper_boy_4,IDB_HICHOPPERBOY4), CMN_ID(chopper_boy_4b,IDB_HICHOPPERBOY4B), CMN_ID(chopper_boy_4c,IDB_HICHOPPERBOY4C), CMN_ID(chopper_boy_4d,IDB_HICHOPPERBOY4D)}, {CMN_ID(chopper_boy_5,IDB_HICHOPPERBOY5)}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {CMN_ID(chopper_boy_21,IDB_HICHOPPERBOY21), CMN_ID(chopper_boy_21b,IDB_HICHOPPERBOY21B), CMN_ID(chopper_boy_21c,IDB_HICHOPPERBOY21C), CMN_ID(chopper_boy_21d,IDB_HICHOPPERBOY21D)}, {CMN_ID(chopper_boy_22,IDB_HICHOPPERBOY22), CMN_ID(chopper_boy_22b,IDB_HICHOPPERBOY22B), CMN_ID(chopper_boy_22c,IDB_HICHOPPERBOY22C), CMN_ID(chopper_boy_22d,IDB_HICHOPPERBOY22D)}, {0},{0}, {CMN_ID(chopper_boy_25,IDB_HICHOPPERBOY25)}, }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 100, /* health */ 160, /* mass */ A_ChopperBoy, /* classId */ "chopper-boy", /* clas */ True, /* transmogifyTarget */ True, /* doppelUser */ True, /* potentialHuman */ True, /* potentialEnemy */ 20, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {19,20}, /* sizeMax */ ChopperBoy::create, /* create */ False, /* statsCreations */ False, /* statsUses */ True, /* statsDeaths */ ChopperBoy::get_stats, /* get_stats */ NULL, /* arg */ ChopperBoy::init_x, /* init_x */ ChopperBoy::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ True, /* invisibility */ }, /* MovingContext */ }; /* CreatureContext */ const UserContext ChopperBoy::userContext = { /** UserContext **/ True, /* usesWeapons */ True, /* usesItems */ }; // Used by altarofsin const FlyingContext ChopperBoy::flyingContext = { /** FlyingContext **/ 4, /* gravTime */ }; const LifterContext ChopperBoy::lifterContext = { /** LifterContext **/ 0, /* throwSpeed, ChopperBoy can't throw */ }; xevil-2.02r2.orig/cmn/bitmaps/cloak/0040755000175000017500000000000007637441100016614 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/cloak/cloak.bitmaps0100644000175000017500000000655407041425152021273 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/cloak/cloak_4.xpm" #include "gen_xpm/cloak/cloak_4b.xpm" #include "gen_xpm/cloak/cloak_4c.xpm" #include "gen_xpm/cloak/cloak_4d.xpm" #include "gen_xpm/cloak/cloak_4e.xpm" #include "gen_xpm/cloak/cloak_4f.xpm" #endif Size Cloak::get_size_max() { return context.fallingContext.movingContext.sizes[CO_air]; } PhysicalP Cloak::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Cloak(w,l,pos); assert(ret); return ret; } static void cloak_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = False; #if WIN32 iconId = IDB_CLOAK; #endif #if X11 iconId = 0; #endif } ItemXdata Cloak::xdata; const ItemContext Cloak::context = { /** ItemContext **/ True, /* persists */ 800, /* coolness */ SoundNames::CLOAK_USE,/*use sound*/ { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, "brown",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(128,0,0)/*"brown"*/,TRUE, #endif /* animMax */ {0,0,0,0,6}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{15,15},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0}, {CMN_ID(cloak_4,IDB_CLOAK),CMN_ID(cloak_4b,IDB_CLOAKB), CMN_ID(cloak_4c,IDB_CLOAKC),CMN_ID(cloak_4d,IDB_CLOAKD), CMN_ID(cloak_4e,IDB_CLOAKE),CMN_ID(cloak_4f,IDB_CLOAKF)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 10, /* health */ 10, /* mass */ A_Cloak, /* classId */ "cloak", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ True, /* potentialOtherItem */ .00002f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {15,15}, /* sizeMax */ Cloak::create, /* create */ False, /* statsCreations */ True, /* statsUses */ False, /* statsDeaths */ Cloak::get_stats, /* get_stats */ NULL, /* arg */ Cloak::init_x, /* init_x */ Cloak::create_from_stream, /* create_from_stream */ cloak_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }; xevil-2.02r2.orig/cmn/bitmaps/crack_pipe/0040755000175000017500000000000007637441100017623 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/crack_pipe/crack_pipe.bitmaps0100644000175000017500000000654407041425152023310 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // For CrackPipe and Crack. #if X11 #include "gen_xpm/crack_pipe/crack_pipe_4.xpm" #endif #define CRACK_TIME 500 Size CrackPipe::get_size_max() { return context.autoUseContext.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP CrackPipe::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new CrackPipe(w,l,pos); assert(ret); return ret; } static void crack_pipe_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = False; #if WIN32 iconId = IDB_CRACKPIPE; #endif #if X11 iconId = 0; #endif } DrugsXdata CrackPipe::xdata; const DrugsContext CrackPipe::context = { /** DrugsContext **/ 10, /* odChance */ { /** AutoUseContext **/ False, /* humansOnly */ { /** ItemContext **/ True, /* persists */ 6000, /* coolness */ 0, { /** FallingContext **/ {/** MovingContext **/ #if X11 "gray40",False, "white",True, #endif #if WIN32 RGB(255,0,0)/*"red"*/,True, RGB(255,255,255)/*"white"*/,False, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{10,5},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(crack_pipe_4,IDB_CRACKPIPE)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 5, /* health */ 2, /* mass */ A_CrackPipe, /* classId */ "crack-pipe", /* className */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ True, /* potentialOtherItem */ 0.0001f, /* objectWorldPercent */ 2, /* levelMaxTimes */ {10,5}, /* sizeMax */ CrackPipe::create, /* create */ False, /* statsCreations */ True, /* statsUses */ False, /* statsDeaths */ CrackPipe::get_stats, /* get_stats */ NULL, /* arg */ CrackPipe::init_x, /* init_x */ CrackPipe::create_from_stream, /* create_from_stream */ crack_pipe_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, } }; xevil-2.02r2.orig/cmn/bitmaps/demon_summoner/0040755000175000017500000000000007637441100020552 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/demon_summoner/demon_summoner.bitmaps0100644000175000017500000000701507041425152025160 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/demon_summoner/demon_summoner_4.xpm" #endif #define DEMON_SUMMONER_SUICIDE_TIME (15 * 25) // 15 sec Size DemonSummoner::get_size_max() { return context.weaponContext.itemContext.fallingContext. movingContext.sizes[CO_air]; } PhysicalP DemonSummoner::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new DemonSummoner(w,l,pos); assert(ret); return ret; } static void demon_summoner_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = True; #if WIN32 iconId = IDB_DEMONSUMMONER; #endif #if X11 iconId = 0; #endif } WeaponXdata DemonSummoner::xdata; const WhistleContext DemonSummoner::context = { /** WhistleContext **/ -25, /* coolnessNoAmmo */ 1, /* ammo */ 0, /* alternateChance */ { /** WeaponContext **/ 0, { /** ItemContext **/ True, /* persists */ 10100, /* coolness */ 0, /*item use sound */ { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, "red",False, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, Xvars_BACKGROUND,TRUE, #endif {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{5,13},}, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(demon_summoner_4,IDB_DEMONSUMMONER)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 500, /* health */ 10, /* mass */ A_DemonSummoner, /* classId */ "demon-summoner", /* className */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {5,13}, /* sizeMax */ DemonSummoner::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ DemonSummoner::init_x, /* init_x */ DemonSummoner::create_from_stream, /* create_from_stream */ demon_summoner_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/dog/0040755000175000017500000000000007637441100016274 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/dog/dog.bitmaps0100644000175000017500000003034107041511224020416 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // Also has class "Mutt". #if X11 #include "gen_xpm/dog/dog_0.xpm" #include "gen_xpm/dog/dog_0b.xpm" #include "gen_xpm/dog/dog_19.xpm" #include "gen_xpm/dog/dog_19b.xpm" #include "gen_xpm/dog/dog_2.xpm" #include "gen_xpm/dog/dog_20b.xpm" #include "gen_xpm/dog/dog_25.xpm" #include "gen_xpm/dog/dog_26.xpm" #include "gen_xpm/dog/dog_28.xpm" #include "gen_xpm/dog/dog_38.xpm" #include "gen_xpm/dog/dog_39.xpm" #include "gen_xpm/dog/dog_4.xpm" #include "gen_xpm/dog/dog_5.xpm" #include "gen_xpm/dog/dog_5b.xpm" #include "gen_xpm/mutt/mutt_0.xpm" #include "gen_xpm/mutt/mutt_0b.xpm" #include "gen_xpm/mutt/mutt_19.xpm" #include "gen_xpm/mutt/mutt_19b.xpm" #include "gen_xpm/mutt/mutt_2.xpm" #include "gen_xpm/mutt/mutt_20b.xpm" #include "gen_xpm/mutt/mutt_25.xpm" #include "gen_xpm/mutt/mutt_26.xpm" #include "gen_xpm/mutt/mutt_28.xpm" #include "gen_xpm/mutt/mutt_38.xpm" #include "gen_xpm/mutt/mutt_39.xpm" #include "gen_xpm/mutt/mutt_4.xpm" #include "gen_xpm/mutt/mutt_5.xpm" #include "gen_xpm/mutt/mutt_5b.xpm" #endif Size Dog::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP Dog::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Dog(w,l,pos); assert(ret); return ret; } CreatureXdata Dog::creatureXdata; WalkingXdata Dog::walkingXdata; FighterXdata Dog::fighterXdata; CarrierXdata Dog::carrierXdata; const CreatureContext Dog::creatureContext = { /** CreatureContext **/ 7, /* crawlSpeed */ 7, /* centerSpeed */ 13, /* airSpeed */ 5, /* climbSpeed */ 10, /* jump */ 2, /* acceleration */ 50, /* corpseHealth */ True, /* biological */ DROPLET_BLOOD, /* dropletType */ SoundNames::DOG_DEATH, {/** MovingContext **/ #if X11 "chocolate4",False, "white",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(128,0,0)/*"tan"*/,TRUE, #endif /* animMax */ {2,2,1,1,1,2, 2, 2,2, 2, 2,2, 2, 2,2, 2, 2,2, 1, 2,2, 1,1, 2,2, 1, /* deadAnimMax */ /* Fighter attack animMax */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1, }, /* sizes */ {{12,10},{12,10},{12,9},{12,9},{10,12},{5,10}, {10,5}, {10,12},{10,12}, {5,10}, {12,10},{12,10}, {10,5}, {10,12},{10,12}, {5,10}, {12,10},{12,10}, {10,12}, /* Must be */ {10,12},{10,12}, /* same size. */ {10,12},{10,12}, {12,10},{12,10}, {12,7}, /* deadSize */ /* Fighter attack sizes */ {12,10}, /* center_R */ {12,10}, /* center_L */ {12,9}, /* air_R */ {12,9}, /* air_L */ {10,12}, /* r_DN */ {10,12}, /* r_UP */ {12,10}, /* dn_R */ {12,10}, /* dn_L */ {10,12}, /* l_DN */ {10,12}, /* l_UP */ {12,10}, /* up_R */ {12,10}, /* up_L */ {9,12}, /* air_UP */ {9,12}, /* air_DN */ }, {{0}}, /* offsets */ /* pixmapBits */ {{CMN_ID(dog_0,IDB_HIDOG0),CMN_ID(dog_0b,IDB_HIDOG0B)}, {PH_AUTO_GEN}, {CMN_ID(dog_2,IDB_HIDOG2)},{PH_AUTO_GEN}, {CMN_ID(dog_4,IDB_HIDOG21)}, {CMN_ID(dog_5,IDB_HIDOG5),CMN_ID(dog_5b,IDB_HIDOG5B)}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(dog_5,IDB_HIDOG5),CMN_ID(dog_5b,IDB_HIDOG5B)}, {CMN_ID(dog_0,IDB_HIDOG0),CMN_ID(dog_0b,IDB_HIDOG0B)}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(dog_4,IDB_HIDOG21)}, {CMN_ID(dog_19,IDB_HIDOG22),CMN_ID(dog_19b,IDB_HIDOG22B)}, {CMN_ID(dog_4,IDB_HIDOG21),CMN_ID(dog_20b,IDB_HIDOG21B)}, {CMN_ID(dog_4,IDB_HIDOG21)},{CMN_ID(dog_19,IDB_HIDOG22)}, {CMN_ID(dog_0,IDB_HIDOG0),CMN_ID(dog_0b,IDB_HIDOG0B)}, {PH_AUTO_GEN}, {CMN_ID(dog_25,IDB_HIDOGDEAD)}, /* deadPixmapBits */ /* Fighter attack bitmaps */ {CMN_ID(dog_26,IDB_HIDOG0_ATTACK)}, /* center_R */ {PH_AUTO_GEN}, /* center_L */ {CMN_ID(dog_28,IDB_HIDOG2_ATTACK)}, /* air_R */ {PH_AUTO_GEN}, /* air_L */ {PH_AUTO_GEN}, /* r_DN */ {PH_AUTO_GEN}, /* r_UP */ {CMN_ID(dog_26,IDB_HIDOG0_ATTACK)}, /* dn_R */ {PH_AUTO_GEN}, /* dn_L */ {PH_AUTO_GEN}, /* l_DN */ {PH_AUTO_GEN}, /* l_UP */ {PH_AUTO_GEN}, /* up_R */ {PH_AUTO_GEN}, /* up_L */ {CMN_ID(dog_38,IDB_HIDOG21_ATTACK)}, /* air_UP */ {CMN_ID(dog_39,IDB_HIDOG22_ATTACK)}, /* air_DN */ }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 50, /* health */ 70, /* mass */ A_Dog, /* classId */ "dog", /* clas */ True, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 20, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {12,12}, /* sizeMax */ Dog::create, /* create */ False, /* statsCreations */ False, /* statsUses */ True, /* statsDeaths */ Dog::get_stats, /* get_stats */ NULL, /* arg */ Dog::init_x, /* init_x */ Dog::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ Fighter::offset_generator, /* offsetGenerator */ &Fighter::transformOverride, /* transformOverride */ True, /* useXPM */ True, /* invisibility */ }, }; const WalkingContext Dog::walkingContext = { 0, /* dummy */ }; const FighterContext Dog::fighterContext = { /** FighterContext **/ #if X11 "chocolate4", /* foreground */ "white", /* background */ #endif #if WIN32 RGB(0,0,0), /* foreground */ RGB(128,0,0), /* background */ #endif 3, /* slide */ 9, /* jumpHorizontal */ 9, /* jumpVertical */ 15, /* damageStuck */ 30, /* damageFree */ /* hotSpots */ {{11,3},{0,0},{11,3},{0,0},{0},{0}, {0}, {0},{0}, {0}, {11,3},{0,0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {4,0},{4,11},}, SoundNames::DOG_ATTACK, }; const CarrierContext Dog::carrierContext = { /** CarrierContext **/ 0, /* dummy */ }; ///////////////////////////////////////// Mutt /////////////////////////////// // There has go to be a better way to do this than all // this (fucking) code duplication. Size Mutt::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP Mutt::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Mutt(w,l,pos); assert(ret); return ret; } CreatureXdata Mutt::creatureXdata; WalkingXdata Mutt::walkingXdata; FighterXdata Mutt::fighterXdata; CarrierXdata Mutt::carrierXdata; const CreatureContext Mutt::creatureContext = { /** CreatureContext **/ 6, /* crawlSpeed */ 6, /* centerSpeed */ 13, /* airSpeed */ 5, /* climbSpeed */ 10, /* jump */ 2, /* acceleration */ 50, /* corpseHealth */ True, /* biological */ DROPLET_BLOOD, /* dropletType */ SoundNames::DOG_DEATH, {/** MovingContext **/ #if X11 "chocolate3",False, "white",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(128,0,0)/*"tan"*/,TRUE, #endif /* animMax */ {2,2,1,1,1,2, 2, 2,2, 2, 2,2, 2, 2,2, 2, 2,2, 1, 2,2, 1,1, 2,2, 1, /* deadAnimMax */ /* Fighter attack animMax */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1, }, /* sizes */ {{12,10},{12,10},{12,9},{12,9},{10,12},{5,10}, {10,5}, {10,12},{10,12}, {5,10}, {12,10},{12,10}, {10,5}, {10,12},{10,12}, {5,10}, {12,10},{12,10}, {10,12}, /* Must be */ {10,12},{10,12}, /* same size. */ {10,12},{10,12}, {12,10},{12,10}, {12,7}, /* deadSize */ /* Fighter attack sizes */ {12,10}, /* center_R */ {12,10}, /* center_L */ {12,9}, /* air_R */ {12,9}, /* air_L */ {10,12}, /* r_DN */ {10,12}, /* r_UP */ {12,10}, /* dn_R */ {12,10}, /* dn_L */ {10,12}, /* l_DN */ {10,12}, /* l_UP */ {12,10}, /* up_R */ {12,10}, /* up_L */ {9,12}, /* air_UP */ {9,12}, /* air_DN */ }, {{0}}, /* offsets */ /* pixmapBits */ {{CMN_ID(mutt_0,IDB_HIDDOG0),CMN_ID(mutt_0b,IDB_HIDDOG0B)}, {PH_AUTO_GEN}, {CMN_ID(mutt_2,IDB_HIDDOG2)},{PH_AUTO_GEN}, {CMN_ID(mutt_4,IDB_HIDDOG21)}, {CMN_ID(mutt_5,IDB_HIDDOG5),CMN_ID(mutt_5b,IDB_HIDDOG5B)}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(mutt_5,IDB_HIDDOG5),CMN_ID(mutt_5b,IDB_HIDDOG5B)}, {CMN_ID(mutt_0,IDB_HIDDOG0),CMN_ID(mutt_0b,IDB_HIDDOG0B)}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(mutt_4,IDB_HIDDOG21)}, {CMN_ID(mutt_19,IDB_HIDDOG22),CMN_ID(mutt_19b,IDB_HIDDOG22B)}, {CMN_ID(mutt_4,IDB_HIDDOG21),CMN_ID(mutt_20b,IDB_HIDDOG21B)}, {CMN_ID(mutt_4,IDB_HIDDOG21)},{CMN_ID(mutt_19,IDB_HIDDOG22)}, {CMN_ID(mutt_0,IDB_HIDDOG0),CMN_ID(mutt_0b,IDB_HIDDOG0B)}, {PH_AUTO_GEN}, {CMN_ID(mutt_25,IDB_HIDDOGDEAD)}, /* deadPixmapBits */ /* Fighter attack bitmaps */ {CMN_ID(mutt_26,IDB_HIDDOG0_ATTACK)}, /* center_R */ {PH_AUTO_GEN}, /* center_L */ {CMN_ID(mutt_28,IDB_HIDDOG2_ATTACK)}, /* air_R */ {PH_AUTO_GEN}, /* air_L */ {PH_AUTO_GEN}, /* r_DN */ {PH_AUTO_GEN}, /* r_UP */ {CMN_ID(mutt_26,IDB_HIDDOG0_ATTACK)}, /* dn_R */ {PH_AUTO_GEN}, /* dn_L */ {PH_AUTO_GEN}, /* l_DN */ {PH_AUTO_GEN}, /* l_UP */ {PH_AUTO_GEN}, /* up_R */ {PH_AUTO_GEN}, /* up_L */ {CMN_ID(mutt_38,IDB_HIDDOG21_ATTACK)}, /* air_UP */ {CMN_ID(mutt_39,IDB_HIDDOG22_ATTACK)}, /* air_DN */ }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 65, /* health */ 70, /* mass */ A_Mutt, /* classId */ "mutt", /* clas */ True, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 20, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {12,12}, /* sizeMax */ Mutt::create, /* create */ False, /* statsCreations */ False, /* statsUses */ True, /* statsDeaths */ Mutt::get_stats, /* get_stats */ NULL, /* arg */ Mutt::init_x, /* init_x */ Mutt::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ Fighter::offset_generator, /* offsetGenerator */ &Fighter::transformOverride, /* transformOverride */ True, /* useXPM */ True, /* invisibility */ }, }; const WalkingContext Mutt::walkingContext = { 0, /* dummy */ }; const FighterContext Mutt::fighterContext = { /** FighterContext **/ #if X11 "chocolate4", /* foreground */ "white", /* background */ #endif #if WIN32 RGB(0,0,0), /* foreground */ RGB(128,0,0), /* background */ #endif 3, /* slide */ 9, /* jumpHorizontal */ 9, /* jumpVertical */ 20, /* damageStuck */ 40, /* damageFree */ /* hotSpots */ {{11,3},{0,0},{11,3},{0,0},{0},{0}, {0}, {0},{0}, {0}, {11,3},{0,0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {4,0},{4,11},}, SoundNames::DOG_ATTACK, }; const CarrierContext Mutt::carrierContext = { /** CarrierContext **/ 0, /* dummy */ }; xevil-2.02r2.orig/cmn/bitmaps/dog_whistle/0040755000175000017500000000000007637441100020033 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/dog_whistle/dog_whistle.bitmaps0100644000175000017500000000670407041425150023724 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/dog_whistle/dog_whistle_4.xpm" #endif Size DogWhistle::get_size_max() { return context.weaponContext.itemContext.fallingContext. movingContext.sizes[CO_air]; } PhysicalP DogWhistle::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new DogWhistle(w,l,pos); assert(ret); return ret; } static void dog_whistle_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = True; #if WIN32 iconId = IDB_DOGWHISTLE; #endif #if X11 iconId = 0; #endif } WeaponXdata DogWhistle::xdata; const WhistleContext DogWhistle::context = { /** WhistleContext **/ -30, /* coolnessNoAmmo */ 2, /* ammo */ 20, /* alternateChance */ { /** WeaponContext **/ 0, { /** ItemContext **/ True, /* persists */ 10000, /* coolness */ 0, /*item use sound */ { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, "bisque4",False, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, Xvars_BACKGROUND,TRUE, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{4,13},}, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(dog_whistle_4,IDB_DOGWHISTLE)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 5, /* health */ 9, /* mass */ A_DogWhistle, /* classId */ "dog-whistle", /* className */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ True, /* potentialWeapon */ False, /* potentialOtherItem */ .0001f, /* objectWorldPercent */ 2, /* levelMaxTimes */ {4,13}, /* sizeMax */ DogWhistle::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ DogWhistle::init_x, /* init_x */ DogWhistle::create_from_stream, /* create_from_stream */ dog_whistle_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/doppel/0040755000175000017500000000000007637441100017006 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/doppel/doppel.bitmaps0100644000175000017500000000650207041425150021646 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/doppelganger/doppelganger_4.xpm" #include "gen_xpm/doppelganger/doppelganger_4b.xpm" #endif Size Doppel::get_size_max() { return context.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP Doppel::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Doppel(w,l,pos); assert(ret); return ret; } static void doppel_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = False; #if WIN32 iconId = IDB_DOPPEL; #endif #if X11 iconId = 0; #endif } AutoUseXdata Doppel::xdata; const AutoUseContext Doppel::context = { /** AutoUseContext **/ True, /* humansOnly */ {/** ItemContext **/ True, /* persists */ 900, /* coolness */ SoundNames::DOPPEL_USE,/*use sound*/ { /** FallingContext **/ {/** MovingContext **/ #if X11 "purple",False, "cyan",True, #endif #if WIN32 RGB(128,0,128)/*"purple"*/,FALSE, RGB(0,255,255)/*"cyan"*/,TRUE, #endif /* animMax */ {0,0,0,0,2}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{11,12},}, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(doppelganger_4,IDB_DOPPEL), CMN_ID(doppelganger_4b,IDB_DOPPEL2)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 10, /* health */ 10, /* mass */ A_Doppel, /* classId */ "doppelganger", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ True, /* potentialOtherItem */ .00002f, /* objectWorldPercent */ 4, /* levelMaxTimes */ {11,12}, /* sizeMax */ Doppel::create, /* create */ False, /* statsCreations */ True, /* statsUses */ False, /* statsDeaths */ Doppel::get_stats, /* get_stats */ NULL, /* arg */ Doppel::init_x, /* init_x */ Doppel::create_from_stream, /* create_from_stream */ doppel_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/dragon/0040755000175000017500000000000007637441100016775 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/dragon/dragon.bitmaps0100644000175000017500000001204407041425146021627 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/dragon/dragon_0.xpm" #include "gen_xpm/dragon/dragon_25.xpm" #include "gen_xpm/dragon/dragon_26.xpm" #include "gen_xpm/dragon/dragon_26b.xpm" #include "gen_xpm/dragon/dragon_26c.xpm" #include "gen_xpm/dragon/dragon_26d.xpm" #endif #define DRAGON_FIREBALL_HEAT 4 #define DRAGON_FIREBALL_TIME 20 Size Dragon::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP Dragon::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Dragon(w,l,pos); assert(ret); return ret; } CreatureXdata Dragon::creatureXdata; FlyingXdata Dragon::flyingXdata; BuiltInXdata Dragon::builtInXdata; OnFireXdata Dragon::onFireXdata; SegmentedXdata Dragon::segmentedXdata; const CreatureContext Dragon::creatureContext = { /** CreatureContext **/ 0, /* crawlSpeed */ 8, /* centerSpeed */ 8, /* airSpeed */ 0, /* climbSpeed */ 8, /* jump */ 2, /* acceleration */ 200, /* corpseHealth */ False, /* biological */ DROPLET_NONE, /* dropletType */ 0, /* deadSoundId */ {/** MovingContext **/ #if WIN32 RGB(255,0,0)/*"red4"*/,FALSE, RGB(255,128,0)/*"orangered"*/,TRUE, #endif #if X11 "red4",False, "orangered",True, #endif /* animMax */ {1,1,1,1,1,1, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 1,1, 0,0, 1, /* deadAnimMax */ 4, /* segmented head */ }, /* sizes */ {{28,29},{28,29},{28,29},{28,29},{28,29},{28,29}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, /* Must be */ {0,0},{0,0}, /* same size. */ {28,29},{28,29}, {0,0},{0,0}, {28,14}, /* deadSize */ {28,29}, /* segmented head */ }, /* offsets */ {{0}}, /* pixmapBits */ {{CMN_ID(dragon_0,IDB_DRAGONBODY)}, {CMN_ID(dragon_0,IDB_DRAGONBODY)}, {CMN_ID(dragon_0,IDB_DRAGONBODY)}, {CMN_ID(dragon_0,IDB_DRAGONBODY)}, {CMN_ID(dragon_0,IDB_DRAGONBODY)}, {CMN_ID(dragon_0,IDB_DRAGONBODY)}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {CMN_ID(dragon_0,IDB_DRAGONBODY)}, {CMN_ID(dragon_0,IDB_DRAGONBODY)}, {0},{0}, {CMN_ID(dragon_25,IDB_DRAGONDEAD)}, /* deadPixmapBits */ {CMN_ID(dragon_26,IDB_DRAGONHEAD), CMN_ID(dragon_26b,IDB_DRAGONHEADB), CMN_ID(dragon_26c,IDB_DRAGONHEADC), CMN_ID(dragon_26d,IDB_DRAGONHEADD)}, /* segmented head */ }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 68, /* health */ 600, /* mass */ A_Dragon, /* classId */ "dragon", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {28,29}, /* sizeMax */ Dragon::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Dragon::init_x, /* init_x */ Dragon::create_from_stream, /* create_from_stream */ }, True, /* hires */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ False, /* invisibility */ }, }; const FlyingContext Dragon::flyingContext = { /** FlyingContext **/ 4, /* gravTime */ }; // copied from FireDemon const BuiltInContext Dragon::builtInContext = { /** BuiltInContext **/ 10, /* shotTime */ A_Fireballs, /* weaponClassId */ "fireballs", /* weaponStr */ 90000, /* coolness */ 0, /* attackSound */ Dragon::get_shot_size, /* get_shot_size */ Dragon::create_shot, /* create_shot */ NULL, /* compute_weapon_dir */ }; // copied from FireDemon const OnFireContext Dragon::onFireContext = { /** OnFireContext **/ 1, /* fires */ 6, /* heat */ False, /* deadBurns */ }; const SegmentedContext Dragon::segmentedContext = { /** SegmentedContext **/ 14, /* followDistance */ }; xevil-2.02r2.orig/cmn/bitmaps/egg/0040755000175000017500000000000007637441100016265 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/egg/egg.bitmaps0100644000175000017500000000670707041425146020420 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/egg/egg_4.xpm" #include "gen_xpm/egg/egg_5.xpm" #endif // Any Human w/in this radius will trigger the Egg. #define EGG_RADIUS 170 // Chance that the generated hugger will be a green hugger. #define EGG_GREEN_HUGGER_PERCENT 5 #define EGG_HUGGER_EJECT_HEIGHT 20 Size Egg::get_size_max() { return context.movingContext.physicalContext.sizeMax; } PhysicalP Egg::create(void *,WorldP,LocatorP,const Pos &) { assert(0); // Be careful, constructor for Egg requires the IntelOptions for an Alien, // and this is only really known by Game. (Game::intel_options_for()). return NULL; } FallingXdata Egg::xdata; const FallingContext Egg::context = {/** FallingContext **/ {/** MovingContext **/ #if X11 "green4",True, "gray30",False, #endif #if WIN32 RGB(0,128,0)/*"green4"*/,TRUE, RGB(96,96,96)/*"gray30"*/,FALSE, #endif /* animMax */ {0,0,0,0,1,1, // Note: using CO_center for the open egg. 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0,0, 0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, }, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{10,15},{10,15}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {0,0},{0,0},{0,0},{0,0}, {0,0},{0,0},{0,0},{0,0}, {0,0},{0,0},{0,0},{0,0}, {0,0},{0,0},{0,0},{0,0}, }, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(egg_4,IDB_EGG)},{CMN_ID(egg_5,IDB_EGG_OPEN)}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, }, /* maskBits */ {{0}}, {/* PhysicalContext */ 100, /* health */ 50, /* mass */ A_Egg, /* classId */ "egg", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {10,15}, /* sizeMax */ Egg::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Egg::init_x, /* init_x */ Egg::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }; xevil-2.02r2.orig/cmn/bitmaps/enforcer/0040755000175000017500000000000007637441100017326 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/enforcer/enforcer.bitmaps0100644000175000017500000001074007041425144022510 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/enforcer/enforcer_0.xpm" #include "gen_xpm/enforcer/enforcer_0b.xpm" #include "gen_xpm/enforcer/enforcer_0c.xpm" #include "gen_xpm/enforcer/enforcer_25.xpm" #include "gen_xpm/enforcer/enforcer_4.xpm" #endif Size Enforcer::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP Enforcer::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Enforcer(w,l,pos); assert(ret); return ret; } CreatureXdata Enforcer::creatureXdata; GroundedXdata Enforcer::groundedXdata; SuicideXdata Enforcer::suicideXdata; PricklyXdata Enforcer::pricklyXdata; const CreatureContext Enforcer::creatureContext = { /** CreatureContext **/ 0, /* crawlSpeed */ 5, /* centerSpeed */ 12, /* airSpeed */ 0, /* climbSpeed */ 0, /* jump */ 2, /* acceleration */ 300, /* corpseHealth */ False, /* biological */ DROPLET_OIL, /* dropletType */ SoundNames::BREAKDOWN, /* deadSoundId */ {/** MovingContext **/ #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(255,0,0)/*"red"*/,TRUE, #endif #if X11 "black",False, "red",True, #endif /* animMax */ {4,4,4,4,1,1, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 1,1, 0,0, 1, /* deadAnimNum */ }, /* sizes */ {{16,30},{16,30},{16,30},{16,30},{16,30},{16,30}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, /* Must be */ {0,0},{0,0}, /* same size. */ {16,30},{16,30}, {0,0},{0,0}, {30,16}, /* deadSize */ }, /* offsets */ {{0}}, /* pixmapBits */ {{CMN_ID(enforcer_0,IDB_ENFORCER0),CMN_ID(enforcer_0b,IDB_ENFORCER0B), CMN_ID(enforcer_0c,IDB_ENFORCER0C),CMN_ID(enforcer_0,IDB_ENFORCER0D)}, {PH_AUTO_GEN}, {CMN_ID(enforcer_0,IDB_ENFORCER0),CMN_ID(enforcer_0b,IDB_ENFORCER0B), CMN_ID(enforcer_0c,IDB_ENFORCER0C),CMN_ID(enforcer_0,IDB_ENFORCER0D)}, {PH_AUTO_GEN}, {CMN_ID(enforcer_4,IDB_ENFORCER5)},{CMN_ID(enforcer_4,IDB_ENFORCER5)}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {CMN_ID(enforcer_4,IDB_ENFORCER5)},{CMN_ID(enforcer_4,IDB_ENFORCER5)}, {0},{0}, {CMN_ID(enforcer_25,IDB_ENFORCER_DEAD)} }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 400, /* health */ 500, /* mass */ A_Enforcer, /* classId */ "enforcer", /* clas */ False, /* transmogifyTarget */ True, /* doppelUser */ False, /* potentialHuman */ True, /* potentialEnemy */ 10, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {30,30}, /* sizeMax */ Enforcer::create, /* create */ False, /* statsCreations */ False, /* statsUses */ True, /* statsDeaths */ Enforcer::get_stats, /* get_stats */ NULL, /* arg */ Enforcer::init_x, /* init_x */ Enforcer::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ True, /* invisibility */ }, }; const GroundedContext Enforcer::groundedContext = { /** GroundedContext **/ 0, /* dummy */ }; const SuicideContext Enforcer::suicideContext = { /** SuicideContext **/ 0, /* dummy */ }; const PricklyContext Enforcer::pricklyContext = { /** PricklyContext **/ 25, /* damage */ }; xevil-2.02r2.orig/cmn/bitmaps/explosion/0040755000175000017500000000000007637441100017543 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/explosion/explosion.bitmaps0100644000175000017500000000370007041425144023140 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #define EXPLOSION_VISIBLE_RADIUS 20 // Kind of funny for Explosion, since it doesn't actually occupy area. // Return size of visible area. Size Explosion::get_size_max() { Size ret; ret.width = 2 * EXPLOSION_VISIBLE_RADIUS; ret.height = 2 * EXPLOSION_VISIBLE_RADIUS; return ret; } PhysicalP Explosion::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } const PhysicalContext Explosion::context = {/** PhysicalContext **/ 0, /* health */ 0, /* mass */ A_Explosion, /* classId */ "explosion", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {40,40}, /* sizeMax */ Explosion::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Explosion::init_x, /* init_x */ Explosion::create_from_stream, /* create_from_stream */ }; xevil-2.02r2.orig/cmn/bitmaps/fire/0040755000175000017500000000000007637441100016450 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/fire/fire.bitmaps0100644000175000017500000000431507041425144020755 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/fire/fire_4.xpm" #endif // Defines #define FIRE_HEAT 4 #define FIRE_DAMAGE 3 #define FIRE_DIAMETER_INIT 21 #define FIRE_RADIUS_DELTA 2 #define FIRE_VEL_Y -8 Size Fire::get_size_max() { // Starts out at max size then shrinks. return context.sizeMax; } PhysicalP Fire::create(void *,WorldP w,LocatorP l,const Pos &pos) { // Take this out if you need to. // Remember, here pos is the middle, not upper-left. assert(0); PhysicalP ret = new Fire(w,l,pos); assert(ret); return ret; } FireXdata Fire::xdata; // Should really be a FireContext. const CMN_BITS_ID Fire::fireBits = CMN_ID(fire_4,IDB_FIRE); const PhysicalContext Fire::context = {/** PhysicalContext **/ 0, /* health */ 0, /* mass */ A_Fire, /* classId */ "fire", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {FIRE_DIAMETER_INIT,FIRE_DIAMETER_INIT}, /* sizeMax */ Fire::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Fire::init_x, /* init_x */ Fire::create_from_stream, /* create_from_stream */ }; xevil-2.02r2.orig/cmn/bitmaps/fireball/0040755000175000017500000000000007637441100017303 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/fireball/fireball.bitmaps0100644000175000017500000000551507041425142022444 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/fireball/fireball_4.xpm" #include "gen_xpm/fireball/fireball_4b.xpm" #include "gen_xpm/fireball/fireball_4c.xpm" #endif #define FIREBALL_TIME 6 #define FIREBALL_HEAT 4 #define FIREBALL_BACKUP_PHYSICAL_DAMAGE 100 Size Fireball::get_size() { return context.movingContext.sizes[CO_air]; } PhysicalP Fireball::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } ShotXdata Fireball::xdata; const ShotContext Fireball::context = {/** ShotContext **/ 0, /* damage */ 13, /* speed */ 0, False, {/** MovingContext **/ #if X11 "",False, "",False, #endif #if WIN32 RGB(0,0,0),FALSE, RGB(0,0,0),FALSE, #endif /* animMax */ {0,0,0,0,3}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{24,24},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0}, {CMN_ID(fireball_4,IDB_FIREBALL), CMN_ID(fireball_4b,IDB_FIREBALLB), CMN_ID(fireball_4c,IDB_FIREBALLC)}, }, /* maskBits */ {{0}}, {/* PhysicalContext */ 1, /* health */ 0, /* mass */ A_Fireball, /* classId */ "fireball", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ // If you change the size, you should also do fire_explosion.bitmaps. {24,24}, /* sizeMax */ Fireball::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Fireball::init_x, /* init_x */ Fireball::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }; xevil-2.02r2.orig/cmn/bitmaps/fire_demon/0040755000175000017500000000000007637441100017632 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/fire_demon/fire_demon.bitmaps0100644000175000017500000001214207041425144023316 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/fire_demon/fire_demon_0.xpm" #include "gen_xpm/fire_demon/fire_demon_0b.xpm" #include "gen_xpm/fire_demon/fire_demon_2.xpm" #include "gen_xpm/fire_demon/fire_demon_22.xpm" #include "gen_xpm/fire_demon/fire_demon_25.xpm" #include "gen_xpm/fire_demon/fire_demon_4.xpm" #include "gen_xpm/fire_demon/fire_demon_5.xpm" #include "gen_xpm/fire_demon/fire_demon_5b.xpm" #endif #define FIRE_DEMON_FIREBALL_HEAT 6 #define FIRE_DEMON_FIREBALL_TIME 20 Size FireDemon::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP FireDemon::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new FireDemon(w,l,pos); assert(ret); return ret; } CreatureXdata FireDemon::creatureXdata; FlyingXdata FireDemon::flyingXdata; BuiltInXdata FireDemon::builtInXdata; OnFireXdata FireDemon::onFireXdata; SwapProtectXdata FireDemon::swapProtectXdata; const CreatureContext FireDemon::creatureContext = { /** CreatureContext **/ 0, /* crawlSpeed */ 7, /* centerSpeed */ 7, /* airSpeed */ 0, /* climbSpeed */ 7, /* jump */ 6, /* acceleration */ 600, /* corpseHealth */ False, /* biological */ DROPLET_NONE, /* dropletType */ 0, /*firedemon death*/ {/** MovingContext **/ #if X11 "red4",False, "orangered",True, #endif #if WIN32 RGB(255,0,0)/*"red4"*/,FALSE, RGB(255,128,0)/*"orangered"*/,TRUE, #endif /* animMax */ {2,2,1,1,1,2, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 1,1, 0,0, 1, /* deadAnimMax */ }, /* sizes */ {{52,44},{52,44},{46,44},{46,44},{48,48},{47,48}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, /* Must be */ {0,0},{0,0}, /* same size. */ {48,48},{60,48}, {0,0},{0,0}, {49,22}, /* deadSize */ }, /* offsets */ {{0}}, /* pixmapBits */ {{CMN_ID(fire_demon_0,IDB_HIFIREDEMON0), CMN_ID(fire_demon_0b,IDB_HIFIREDEMON0B)}, {PH_AUTO_GEN}, {CMN_ID(fire_demon_2,IDB_HIFIREDEMON2)}, {PH_AUTO_GEN}, {CMN_ID(fire_demon_4,IDB_HIFIREDEMON4)}, {CMN_ID(fire_demon_5,IDB_HIFIREDEMON5), CMN_ID(fire_demon_5b,IDB_HIFIREDEMON5B)}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {CMN_ID(fire_demon_4,IDB_HIFIREDEMON4)}, {CMN_ID(fire_demon_22,IDB_HIFIREDEMON22)}, {0},{0}, {CMN_ID(fire_demon_25,IDB_HIFIREDEMON_DEAD)}, /* deadPixmapBits */ }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 1500, /* health */ 2000, /* mass */ A_FireDemon, /* classId */ "fire-demon", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {60,48}, /* sizeMax */ FireDemon::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ FireDemon::init_x, /* init_x */ FireDemon::create_from_stream, /* create_from_stream */ }, True, /* hires */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ False, /* invisibility */ }, }; const FlyingContext FireDemon::flyingContext = { /** FlyingContext **/ 2, /* gravTime */ }; // copied into AltarOfSin const BuiltInContext FireDemon::builtInContext = { /** BuiltInContext **/ 12, /* shotTime */ A_Fireballs, /* weaponClassId */ "fireballs", /* weaponStr */ 90000, /* coolness */ 0, /* attackSound */ FireDemon::get_shot_size, /* get_shot_size */ FireDemon::create_shot, /* create_shot */ NULL, /* compute_weapon_dir */ }; // copied into AltarOfSin const OnFireContext FireDemon::onFireContext = { /** OnFireContext **/ 1, /* fires */ 6, /* heat */ True, /* deadBurns */ }; const SwapProtectContext FireDemon::swapProtectContext = { /** SwapProtectContext **/ 9, /* swapResistance */ }; xevil-2.02r2.orig/cmn/bitmaps/fire_explosion/0040755000175000017500000000000007637441100020550 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/fire_explosion/fire_explosion.bitmaps0100644000175000017500000000362307041425144025156 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // Kind of funny for FireExplosion, since it doesn't actually occupy area. // Return size of visible area. Size FireExplosion::get_size_max() { return Fireball::get_size(); } PhysicalP FireExplosion::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } const PhysicalContext FireExplosion::context = {/** PhysicalContext **/ 0, /* health */ 0, /* mass */ A_FireExplosion, /* classId */ "fire-explosion", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ // Size copied from fireball.bitmaps {24,24}, /* sizeMax */ FireExplosion::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ FireExplosion::init_x, /* init_x */ FireExplosion::create_from_stream, /* create_from_stream */ }; xevil-2.02r2.orig/cmn/bitmaps/flag/0040755000175000017500000000000007637441100016434 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/flag/flag.bitmaps0100644000175000017500000000506707041425142020730 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/flag/flag_4.xpm" #endif Size Flag::get_size_max() { return context.fallingContext.movingContext.sizes[CO_air]; } PhysicalP Flag::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Flag(w,l,pos); assert(ret); return ret; } TouchableXdata Flag::xdata; const TouchableContext Flag::context = { /** TouchableContext **/ { /** FallingContext **/ { /** MovingContext **/ #if X11 "black",False, "red",False, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, RGB(255,0,0)/*"red"*/,False, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{11,13},}, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(flag_4,IDB_HIFLAG)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 0, /* health */ 0, /* mass */ A_Flag, /* classId */ "flag", /* className */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {11,13}, /* sizeMax */ Flag::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Flag::init_x, /* init_x */ Flag::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }; xevil-2.02r2.orig/cmn/bitmaps/frog/0040755000175000017500000000000007637441100016460 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/frog/frog.bitmaps0100644000175000017500000001006007041425142020765 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/frog/frog_0.xpm" #include "gen_xpm/frog/frog_2.xpm" #include "gen_xpm/frog/frog_24.xpm" #include "gen_xpm/frog/frog_25.xpm" #include "gen_xpm/frog/frog_4.xpm" #include "gen_xpm/frog/frog_5.xpm" #endif Size Frog::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP Frog::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Frog(w,l,pos); assert(ret); return ret; } CreatureXdata Frog::creatureXdata; HoppingXdata Frog::hoppingXdata; SuicideXdata Frog::suicideXdata; const CreatureContext Frog::creatureContext = { /** CreatureContext **/ 0, /* crawlSpeed */ 0, /* centerSpeed */ 15, /* airSpeed */ 15, /* climbSpeed */ 13, /* jump */ 0, /* acceleration */ 80, /* corpseHealth */ True, /* biological */ DROPLET_BLOOD, /* dropletType */ SoundNames::FROG_DEATH, {/** MovingContext **/ #if X11 "black", False, "green4", False, #endif #if WIN32 RGB(0,0,0)/*"black"*/, FALSE, RGB(0,255,0)/*"green4"*/, FALSE, #endif /* animMax */ {1,1,1,1,1,1, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 1, 1,1, 1,1, 1,1, 1, /* deadAnimNum */ }, /* sizes */ {{7,5},{7,5},{13,8},{13,8},{9,11},{9,5}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {9,5}, /* Must be (trying same width) */ {9,11},{9,11}, /* same size. */ {9,11},{9,11}, {13,8},{13,8}, {7,7}, /* deadSize */ }, /* offsets */ {{0}}, /* pixmapBits */ {{CMN_ID(frog_0,IDB_FROG0)},{PH_AUTO_GEN}, {CMN_ID(frog_2,IDB_FROG2)},{PH_AUTO_GEN}, {CMN_ID(frog_4,IDB_FROG4)},{CMN_ID(frog_5,IDB_FROG5)}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {CMN_ID(frog_5,IDB_FROG5)}, {PH_AUTO_GEN},{CMN_ID(frog_4,IDB_FROG4)}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(frog_2,IDB_FROG2)},{CMN_ID(frog_24,IDB_FROG3)}, {CMN_ID(frog_25,IDB_FROG_DEAD)}, /* deadPixmapBits */ }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 10, /* health */ 15, /* mass */ A_Frog, /* classId */ "frog", /* clas */ True, /* transmogifyTarget */ True, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {13,11}, /* sizeMax */ Frog::create, /* create */ False, /* statsCreations */ False, /* statsUses */ True, /* statsDeaths */ Frog::get_stats, /* get_stats */ NULL, /* arg */ Frog::init_x, /* init_x */ Frog::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ False, /* invisibility */ }, }; const HoppingContext Frog::hoppingContext = { /** HoppingContext **/ 0, /* dummy */ }; const SuicideContext Frog::suicideContext = { /** SuicideContext **/ 0, /* dummy */ }; xevil-2.02r2.orig/cmn/bitmaps/frog_gun/0040755000175000017500000000000007637441100017331 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/frog_gun/frog_gun.bitmaps0100644000175000017500000000713307041425142022516 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/frog_gun/frog_gun_4.xpm" #endif Size FrogGun::get_size_max() { return context.gunContext.weaponContext.itemContext.fallingContext. movingContext.sizes[CO_air]; } PhysicalP FrogGun::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new FrogGun(w,l,pos); assert(ret); return ret; } static void frog_gun_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = True; #if WIN32 iconId = IDB_FROGGUN; #endif #if X11 iconId = 0; #endif } SingleGunXdata FrogGun::xdata; const SingleGunContext FrogGun::context = { /** SingleGunContext **/ { /** GunContext **/ 10, /* shotTime */ PH_AMMO_UNLIMITED, /* ammoInitial */ PH_AMMO_UNLIMITED, /* ammoMax */ { /** WeaponContext **/ SoundNames::FROGGUN, { /** ItemContext **/ True, /* persists */ 700, /* coolness */ 0, /*item use sound */ { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, Xvars_BACKGROUND,True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, Xvars_BACKGROUND,TRUE, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{14,8},}, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(frog_gun_4,IDB_FROGGUN)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 5, /* health */ 9, /* mass */ A_FrogGun, /* classId */ "frog-gun", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ True, /* potentialWeapon */ False, /* potentialOtherItem */ .0002f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {14,8}, /* sizeMax */ FrogGun::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ FrogGun::init_x, /* init_x */ FrogGun::create_from_stream, /* create_from_stream */ frog_gun_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/frog_shell/0040755000175000017500000000000007637441100017647 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/frog_shell/frog_shell.bitmaps0100644000175000017500000000546507041425142023360 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/frog_shell/frog_shell_4.xpm" #include "gen_xpm/frog_shell/frog_shell_4b.xpm" #endif Size FrogShell::get_size() { return context.movingContext.sizes[CO_air]; } PhysicalP FrogShell::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } ShotXdata FrogShell::xdata; const ShotContext FrogShell::context = {/** ShotContext **/ 0, /* damage */ /* Ignored in this case. */ 12, /* speed */ 0, True,//REPEATING {/** MovingContext **/ #if X11 "black",False, "green4",False, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(0,255,0)/*"green4"*/,FALSE, #endif /* animMax */ {0,0,0,0,2}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{5,5},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0}, {CMN_ID(frog_shell_4,IDB_FROG_SHELL), CMN_ID(frog_shell_4b,IDB_FROG_SHELLB),},}, /* maskBits */ {{0}}, {/** PhysicalContext **/ 1, /* health */ 0, /* mass */ A_FrogShell, /* classId */ "frog-shell", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {5,5}, /* sizeMax */ FrogShell::create, /* create */ True, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ FrogShell::get_stats, /* get_stats */ NULL, /* arg */ FrogShell::init_x, /* init_x */ FrogShell::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }; // Used by AltarOfSin const MorphedContext FrogShell::morphedContext = { /** MorphedContext **/ 200, /* revertTime */ }; xevil-2.02r2.orig/cmn/bitmaps/f_thrower/0040755000175000017500000000000007637441100017522 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/f_thrower/f_thrower.bitmaps0100644000175000017500000000673107041425144023105 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/flame_thrower/flame_thrower_4.xpm" #endif #define F_THROWER_FIRE_TIME 7 Size FThrower::get_size_max() { return context.weaponContext.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP FThrower::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new FThrower(w,l,pos); assert(ret); return ret; } static void f_thrower_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = True; #if WIN32 iconId = IDB_FTHROWER; #endif #if X11 iconId = 0; #endif } GunXdata FThrower::xdata; const GunContext FThrower::context = { /** GunContext **/ 1, /* shotTime */ 80, /* ammoInitial */ 150, /* ammoMax */ { /** WeaponContext **/ SoundNames::FLAMETHROWER, { /** ItemContext **/ True, /* persists */ 900, /* coolness */ 0, /*item use sound */ { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, "blue2",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(0,0,192)/*"blue2"*/,TRUE, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{16,9},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(flame_thrower_4,IDB_FTHROWER)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 5, /* health */ 25, /* mass */ A_FThrower, /* classId */ "flame-thrower", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ True, /* potentialWeapon */ False, /* potentialOtherItem */ .0002f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {16,9}, /* sizeMax */ FThrower::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ FThrower::init_x, /* init_x */ FThrower::create_from_stream, /* create_from_stream */ f_thrower_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/green_blood/0040755000175000017500000000000007637441100020002 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/green_blood/green_blood.bitmaps0100644000175000017500000000735407041425142023645 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/green_blood/green_blood_25.xpm" #include "gen_xpm/green_blood/green_blood_39.xpm" #include "gen_xpm/green_blood/green_blood_4.xpm" #include "gen_xpm/green_blood/green_blood_40.xpm" #include "gen_xpm/green_blood/green_blood_9.xpm" #endif Size GreenBlood::get_size_max() { return context.movingContext.physicalContext.sizeMax; } PhysicalP GreenBlood::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } DropletXdata GreenBlood::xdata; const DropletContext GreenBlood::context = {/** DropletContext **/ 25, /* dissolveTime */ {/** MovingContext **/ #if X11 "green3",False, "white",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(0,255,255)/*"cyan"*/,TRUE, #endif /* animMax */ {0,0,0,0,1,0, 1, 0,0, 1, 0,0, 1, 0,0, 1, 0,0, 0, 0,0, 0,0, 0,0, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, }, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{2,4},{0,0}, {1,7}, {0},{0}, {7,1}, {0},{0}, {1,7}, {0},{0}, {7,1}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {7,2},{6,4},{5,5},{4,6}, {2,7},{4,6},{5,5},{6,4}, {7,2},{6,4},{5,5},{4,6}, {2,7},{4,6},{5,5},{6,4}, }, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(green_blood_4,IDB_BLOODG4)},{0}, {PH_AUTO_GEN}, {0},{0}, {CMN_ID(green_blood_9,IDB_BLOODG9)}, {0},{0}, {PH_AUTO_GEN}, {0},{0}, {PH_AUTO_GEN}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {CMN_ID(green_blood_25,IDB_BLOODG25)}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {CMN_ID(green_blood_39,IDB_BLOODG39)}, {CMN_ID(green_blood_40,IDB_BLOODG40)} }, /* maskBits */ {{0}}, {/* PhysicalContext */ 1, /* health */ 0, /* mass */ A_GreenBlood, /* classId */ "green-blood", /* className */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {7,7}, /* sizeMax */ Blood::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ GreenBlood::init_x, /* init_x */ GreenBlood::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }; xevil-2.02r2.orig/cmn/bitmaps/grenade/0040755000175000017500000000000007637441100017130 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/grenade/grenade.bitmaps0100644000175000017500000001116407041425140022111 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/grenade/grenade_4.xpm" #include "gen_xpm/grenade/grenade_4b.xpm" #include "gen_xpm/grenade/grenade_4c.xpm" #include "gen_xpm/grenade/grenade_4d.xpm" #endif #define GRENADE_TIME 16 #define GRENADE_EXPLOSION_RADIUS 60 #define GRENADE_EXPLOSION_DAMAGE_MAX 190 Size Grenade::get_size(Dir dir) { return context.movingContext.sizes[dir]; } Size Grenade::get_size_max() { return context.movingContext.sizes[CO_air]; } PhysicalP Grenade::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } FallingXdata Grenade::xdata; const FallingContext Grenade::context = {/** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, "gray60",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(192,192,192)/*"gray60"*/,TRUE, #endif /* animMax */ {0,0,0,0,4,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0,0, 0,0, 4,0,4,0, 4,0,4,0, 4,0,4,0, 4,0,4,0, }, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{8,8},{0,0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {8,8},{0,0},{8,8},{0,0}, {8,8},{0,0},{8,8},{0,0}, {8,8},{0,0},{8,8},{0,0}, {8,8},{0,0},{8,8},{0,0}, }, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0}, {CMN_ID(grenade_4,IDB_GRENADE1),CMN_ID(grenade_4b,IDB_GRENADE2), CMN_ID(grenade_4c,IDB_GRENADE3),CMN_ID(grenade_4d,IDB_GRENADE4)},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {CMN_ID(grenade_4,IDB_GRENADE1),CMN_ID(grenade_4b,IDB_GRENADE2), CMN_ID(grenade_4c,IDB_GRENADE3),CMN_ID(grenade_4d,IDB_GRENADE4)}, {0}, {CMN_ID(grenade_4,IDB_GRENADE1),CMN_ID(grenade_4b,IDB_GRENADE2), CMN_ID(grenade_4c,IDB_GRENADE3),CMN_ID(grenade_4d,IDB_GRENADE4)}, {0}, {CMN_ID(grenade_4,IDB_GRENADE1),CMN_ID(grenade_4b,IDB_GRENADE2), CMN_ID(grenade_4c,IDB_GRENADE3),CMN_ID(grenade_4d,IDB_GRENADE4)}, {0}, {CMN_ID(grenade_4,IDB_GRENADE1),CMN_ID(grenade_4b,IDB_GRENADE2), CMN_ID(grenade_4c,IDB_GRENADE3),CMN_ID(grenade_4d,IDB_GRENADE4)}, {0}, {CMN_ID(grenade_4,IDB_GRENADE1),CMN_ID(grenade_4b,IDB_GRENADE2), CMN_ID(grenade_4c,IDB_GRENADE3),CMN_ID(grenade_4d,IDB_GRENADE4)}, {0}, {CMN_ID(grenade_4,IDB_GRENADE1),CMN_ID(grenade_4b,IDB_GRENADE2), CMN_ID(grenade_4c,IDB_GRENADE3),CMN_ID(grenade_4d,IDB_GRENADE4)}, {0}, {CMN_ID(grenade_4,IDB_GRENADE1),CMN_ID(grenade_4b,IDB_GRENADE2), CMN_ID(grenade_4c,IDB_GRENADE3),CMN_ID(grenade_4d,IDB_GRENADE4)}, {0}, {CMN_ID(grenade_4,IDB_GRENADE1),CMN_ID(grenade_4b,IDB_GRENADE2), CMN_ID(grenade_4c,IDB_GRENADE3),CMN_ID(grenade_4d,IDB_GRENADE4)}, {0}, }, /* maskBits */ {{0}}, {/* PhysicalContext */ 1, /* health */ 5, /* mass */ A_Grenade, /* classId */ "grenade", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {8,8}, /* sizeMax */ Grenade::create, /* create */ True, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ Grenade::get_stats, /* get_stats */ NULL, /* arg */ Grenade::init_x, /* init_x */ Grenade::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }; xevil-2.02r2.orig/cmn/bitmaps/grenades/0040755000175000017500000000000007637441100017313 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/grenades/grenades.bitmaps0100644000175000017500000000674407041425140022467 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/grenades/grenades_4.xpm" #endif #define GRENADES_TOSS_SPEED 12 #define GRENADES_ROLL_SPEED 9 Size Grenades::get_size_max() { return context.weaponContext.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP Grenades::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Grenades(w,l,pos); assert(ret); return ret; } static void grenades_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = True; #if WIN32 iconId = IDB_GRENADES; #endif #if X11 iconId = 0; #endif } GunXdata Grenades::xdata; const GunContext Grenades::context = { /** GunContext **/ 8, /* shotTime */ 10, /* ammoInitial */ 20, /* ammoMax */ { /** WeaponContext **/ 0,/*sound*/ { /** ItemContext **/ True, /* persists */ -10, /* coolness */ 0, /*item use sound */ { /** FallingContext **/ {/** MovingContext **/ #if X11 "gray60",False, "black",False, #endif #if WIN32 RGB(128,128,128)/*"gray60"*/,False, RGB(0,0,0)/*"black"*/,False, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{14,6},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(grenades_4,IDB_GRENADES)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 1, /* health */ 20, /* mass */ A_Grenades, /* classId */ "grenades", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ True, /* potentialWeapon */ False, /* potentialOtherItem */ .0002f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {14,6}, /* sizeMax */ Grenades::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Grenades::init_x, /* init_x */ Grenades::create_from_stream, /* create_from_stream */ grenades_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/hero/0040755000175000017500000000000007637441100016460 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/hero/hero.bitmaps0100644000175000017500000001720407041425140020772 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/hero/hero_0.xpm" #include "gen_xpm/hero/hero_0b.xpm" #include "gen_xpm/hero/hero_0c.xpm" #include "gen_xpm/hero/hero_0d.xpm" #include "gen_xpm/hero/hero_0e.xpm" #include "gen_xpm/hero/hero_0f.xpm" #include "gen_xpm/hero/hero_10.xpm" #include "gen_xpm/hero/hero_18.xpm" #include "gen_xpm/hero/hero_2.xpm" #include "gen_xpm/hero/hero_20.xpm" #include "gen_xpm/hero/hero_20c.xpm" #include "gen_xpm/hero/hero_20d.xpm" #include "gen_xpm/hero/hero_20e.xpm" #include "gen_xpm/hero/hero_20f.xpm" #include "gen_xpm/hero/hero_25.xpm" #include "gen_xpm/hero/hero_26.xpm" #include "gen_xpm/hero/hero_28.xpm" #include "gen_xpm/hero/hero_32.xpm" #include "gen_xpm/hero/hero_38.xpm" #include "gen_xpm/hero/hero_39.xpm" #include "gen_xpm/hero/hero_4.xpm" #include "gen_xpm/hero/hero_5.xpm" #include "gen_xpm/hero/hero_9.xpm" #endif Size Hero::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP Hero::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Hero(w,l,pos); assert(ret); return ret; } CreatureXdata Hero::creatureXdata; WalkingXdata Hero::walkingXdata; FighterXdata Hero::fighterXdata; UserXdata Hero::userXdata; HealingXdata Hero::healingXdata; LifterXdata Hero::lifterXdata; const CreatureContext Hero::creatureContext = { /** CreatureContext **/ 3, /* crawlSpeed */ 6, /* centerSpeed */ 13, /* airSpeed */ 4, /* climbSpeed */ 10, /* jump */ 2, /* acceleration */ 200, /* corpseHealth */ True, /* biological */ DROPLET_BLOOD, /* dropletType */ SoundNames::DEATH, {/** MovingContext **/ #if X11 "black",False, "tan",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(128,0,0)/*"tan"*/,TRUE, #endif /* animMax */ {6,6,1,1,1,1, 1, 6,6, 1, 2,2, 1, 6,6, 1, 6,6, 1, 6,6, 1,1, 6,6, 1, /* deadAnimMax */ /* Fighter attack animMax */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1, }, /* sizes */ {{16,28},{16,28},{15,25},{15,25},{13,32},{17,28}, {28,17}, {28,16},{28,16}, {14,21}, {14,21},{14,21}, {28,17}, {28,16},{28,16}, {17,28}, {16,28},{16,28}, {15,33}, /* Must be */ {15,33},{15,33}, /* same size. */ {13,32},{13,32}, {15,33},{15,33}, {28,6}, /* deadSize */ /* Fighter attack sizes */ {17,28}, /* center_R */ {17,28}, /* center_L */ {31,7}, /* air_R */ {31,7}, /* air_L */ {28,17}, /* r_DN */ {28,17}, /* r_UP */ {18,23}, /* dn_R */ {18,23}, /* dn_L */ {28,17}, /* l_DN */ {28,17}, /* l_UP */ {17,28}, /* up_R */ {17,28}, /* up_L */ {11,36}, /* air_UP */ {7,31}, /* air_DN */ }, {{0}}, /* offsets */ /* pixmapBits */ {{CMN_ID(hero_0,IDB_HHERO0),CMN_ID(hero_0b,IDB_HHERO0B), CMN_ID(hero_0c,IDB_HHERO0C),CMN_ID(hero_0d,IDB_HHERO0D), CMN_ID(hero_0e,IDB_HHERO0E),CMN_ID(hero_0f,IDB_HHERO0F)}, {PH_AUTO_GEN}, {CMN_ID(hero_2,IDB_HHERO2)},{PH_AUTO_GEN}, {CMN_ID(hero_4,IDB_HHERO4)},{CMN_ID(hero_5,IDB_HHERO5)}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(hero_9,IDB_HERO10B)}, {CMN_ID(hero_10,IDB_HERO10),CMN_ID(hero_9,IDB_HERO10B)},{PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(hero_18,IDB_HHERO18B)}, {PH_AUTO_GEN}, {CMN_ID(hero_20,IDB_HHERO18),CMN_ID(hero_18,IDB_HHERO18B), CMN_ID(hero_20c,IDB_HHERO18C),CMN_ID(hero_20d,IDB_HHERO18D), CMN_ID(hero_20e,IDB_HHERO18E),CMN_ID(hero_20f,IDB_HHERO18F)}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(hero_20,IDB_HHERO18),CMN_ID(hero_18,IDB_HHERO18B), CMN_ID(hero_20c,IDB_HHERO18C),CMN_ID(hero_20d,IDB_HHERO18D), CMN_ID(hero_20e,IDB_HHERO18E),CMN_ID(hero_20f,IDB_HHERO18F)}, {PH_AUTO_GEN}, {CMN_ID(hero_25,IDB_HHERO_DEAD)}, /* deadPixmapBits */ /* Fighter attack bitmaps */ {CMN_ID(hero_26,IDB_HHERO0B_ATTACK)}, /* center_R */ {PH_AUTO_GEN}, /* center_L */ {CMN_ID(hero_28,IDB_HHERO2_ATTACK)}, /* air_R */ {PH_AUTO_GEN}, /* air_L */ {PH_AUTO_GEN}, /* r_DN */ {PH_AUTO_GEN}, /* r_UP */ {CMN_ID(hero_32,IDB_HHERO10B_ATTACK)}, /* dn_R */ {PH_AUTO_GEN}, /* dn_L */ {PH_AUTO_GEN}, /* l_DN */ {PH_AUTO_GEN}, /* l_UP */ {PH_AUTO_GEN}, /* up_R */ {PH_AUTO_GEN}, /* up_L */ {CMN_ID(hero_38,IDB_HHERO21_ATTACK2)}, /* air_UP */ {CMN_ID(hero_39,IDB_HHERO22_ATTACK)}, /* air_DN */ }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 200, /* health */ 210, /* mass */ A_Hero, /* classId */ "hero", /* clas */ True, /* transmogifyTarget */ True, /* doppelUser */ True, /* potentialHuman */ True, /* potentialEnemy */ 50, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {31,36}, /* sizeMax */ Hero::create, /* create */ False, /* statsCreations */ False, /* statsUses */ True, /* statsDeaths */ Hero::get_stats, /* get_stats */ NULL, /* arg */ Hero::init_x, /* init_x */ Hero::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ Fighter::offset_generator, /* offsetGenerator */ &Fighter::uprightTransformOverride, /* transformOverride */ True, /* useXPM */ True, /* invisibility */ }, }; const WalkingContext Hero::walkingContext = { 0, /* dummy */ }; const FighterContext Hero::fighterContext = { /** FighterContext **/ #if X11 "black", /* foreground */ "tan", /* background */ #endif #if WIN32 RGB(0,0,0), /* foreground */ RGB(128,0,0), /* background */ #endif 3, /* slide */ 9, /* jumpHorizontal */ 9, /* jumpVertical */ 25, /* damageStuck */ 50, /* damageFree */ /* hotSpots */ {// Moved standing punch down one so can hit chopperboy // Moved body slam down one, so doesn't go above people. {16,8},{0,0},{30,4},{0,0},{0},{0}, {0}, {0},{0}, {0}, {17,7},{0,0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {3,0},{3,30}, }, SoundNames::HERO_ATTACK, }; const UserContext Hero::userContext = { /** UserContext **/ True, /* usesWeapons */ True, /* usesItems */ }; // AltarOfSin uses same values. const HealingContext Hero::healingContext = { /** HealingContext **/ 2.0f,/* multiplier */ 1,/* unit */ 4,/* time */ }; const LifterContext Hero::lifterContext = { /** LifterContext **/ 8, /* throwSpeed */ }; xevil-2.02r2.orig/cmn/bitmaps/home/0040755000175000017500000000000007637441100016453 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/home/home.bitmaps0100644000175000017500000000457307041425140020765 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/home/home_4.xpm" #endif #define HOME_RADIUS 8 Size Home::get_size() { return context.sizes[CO_air]; } PhysicalP Home::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Home(w,l,pos); assert(ret); return ret; } MovingXdata Home::xdata; const MovingContext Home::context = { /** MovingContext **/ #if X11 "brown",False, "black",True, #endif #if WIN32 RGB(128,64,0)/*"brown"*/,FALSE, RGB(0,0,0)/*"black"*/,TRUE, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{24,26},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(home_4,IDB_HIHOME)},}, /* maskBits */ {{0},{0},{0},{0},{0},}, { /** PhysicalContext **/ 0, /* health */ 0, /* mass */ A_Home, /* classId */ "home", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {24,26}, /* sizeMax */ Home::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Home::init_x, /* init_x */ Home::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }; xevil-2.02r2.orig/cmn/bitmaps/hugger/0040755000175000017500000000000007637441100017004 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/hugger/hugger.bitmaps0100644000175000017500000002126707041511722021650 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,1999 Steve Hardt and Michael Judge * * The file, license.txt, distributed along with this source code contains * the license agreement for the XEvil source code and executable. * If you do not have this file, obtain a copy from * http://www.xevil.com/docs/license.txt * * http://www.xevil.com * satan@xevil.com */ // Includes bitmaps and info for *BOTH* RedHugger and GreenHugger. #if X11 #include "gen_xpm/red_hugger/red_hugger_0.xpm" #include "gen_xpm/red_hugger/red_hugger_0b.xpm" #include "gen_xpm/red_hugger/red_hugger_2.xpm" #include "gen_xpm/red_hugger/red_hugger_4b.xpm" #include "gen_xpm/red_hugger/red_hugger_25.xpm" #include "gen_xpm/red_hugger/red_hugger_4.xpm" #include "gen_xpm/red_hugger/red_hugger_5.xpm" #include "gen_xpm/green_hugger/green_hugger_0.xpm" #include "gen_xpm/green_hugger/green_hugger_0b.xpm" #include "gen_xpm/green_hugger/green_hugger_2.xpm" #include "gen_xpm/green_hugger/green_hugger_4b.xpm" #include "gen_xpm/green_hugger/green_hugger_25.xpm" #include "gen_xpm/green_hugger/green_hugger_4.xpm" #include "gen_xpm/green_hugger/green_hugger_5.xpm" #endif ////////////////////////////////////////////////////////////////////////// // First, functions and data for RedHugger. Size RedHugger::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP RedHugger::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new RedHugger(w,l,pos); assert(ret); return ret; } CreatureXdata RedHugger::creatureXdata; StickyXdata RedHugger::stickyXdata; HuggerXdata RedHugger::huggerXdata; const CreatureContext RedHugger::creatureContext = { /** CreatureContext **/ 7, /* crawlSpeed */ 7, /* centerSpeed */ // Crawling same as center. 14, /* airSpeed */ 6, /* climbSpeed */ 11, /* jump */ 2, /* acceleration */ 50, /* corpseHealth */ True, /* biological */ DROPLET_GREEN_BLOOD, /* dropletType */ SoundNames::HUGGER_DEATH, /*hugger death sound*/ {/** MovingContext **/ #if X11 "black",False, "chocolate3",False, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(64,0,0)/*"chocolate3"*/,FALSE, #endif /* animMax */ {2,2,1,1,2,1, 1, 2,2, 1, 2,2, 1, 2,2, 1, 2,2, 1, 2,2, 2,2, 2,2, 1, /* deadAnimMax */ }, /* sizes */ {{16,9},{16,9},{9,16},{9,16},{13,16},{10,9}, {9,10}, {9,16},{9,16}, {10,9}, {16,9},{16,9}, {9,10}, {9,16},{9,16}, {10,9}, {16,9},{16,9}, {13,16}, /* Must be */ {13,16},{13,16}, /* same size. */ {13,16},{13,16}, {13,16},{13,16}, {16,7}, /* deadSize */ }, /* offsets */ {{0}}, /* pixmapBits */ {{CMN_ID(red_hugger_0,IDB_HIHUGGER_RED0), CMN_ID(red_hugger_0b,IDB_HIHUGGER_RED0B)}, {PH_AUTO_GEN}, {CMN_ID(red_hugger_2,IDB_HIHUGGER_RED6)},{PH_AUTO_GEN}, {CMN_ID(red_hugger_4,IDB_HIHUGGER_RED4), CMN_ID(red_hugger_4b,IDB_HIHUGGER_RED4B)}, {CMN_ID(red_hugger_5,IDB_HIHUGGER_RED5)}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(red_hugger_5,IDB_HIHUGGER_RED5)}, {CMN_ID(red_hugger_0,IDB_HIHUGGER_RED0), CMN_ID(red_hugger_0b,IDB_HIHUGGER_RED0B)},{PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(red_hugger_4,IDB_HIHUGGER_RED4)}, {PH_AUTO_GEN},{CMN_ID(red_hugger_4,IDB_HIHUGGER_RED4), CMN_ID(red_hugger_4b,IDB_HIHUGGER_RED4B)}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(red_hugger_4,IDB_HIHUGGER_RED4), CMN_ID(red_hugger_4b,IDB_HIHUGGER_RED4B)},{PH_AUTO_GEN}, {CMN_ID(red_hugger_25,IDB_HIHUGGER_RED_DEAD)}, /* deadPixmapBits */ }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 35, /* health */ 25, /* mass */ A_RedHugger, /* classId */ "red-hugger", /* clas */ True, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {16,16}, /* sizeMax */ RedHugger::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ RedHugger::init_x, /* init_x */ RedHugger::create_from_stream, /* create_from_stream */ }, True, /* hires */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ False, /* invisibility */ }, }; const StickyContext RedHugger::stickyContext = { /** StickyContext **/ 7, /* wallCrawlSpeed */ }; const HuggerContext RedHugger::huggerContext = { /** HuggerContext **/ False, /* useHuggeeIntel */ }; /////////////////////////////////////////////////////////////////////////// // Now, GreenHugger. Size GreenHugger::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP GreenHugger::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new GreenHugger(w,l,pos); assert(ret); return ret; } CreatureXdata GreenHugger::creatureXdata; StickyXdata GreenHugger::stickyXdata; HuggerXdata GreenHugger::huggerXdata; const CreatureContext GreenHugger::creatureContext = { /** CreatureContext **/ 7, /* crawlSpeed */ 7, /* centerSpeed */ // Crawling same as center. 14, /* airSpeed */ 6, /* climbSpeed */ 11, /* jump */ 2, /* acceleration */ 50, /* corpseHealth */ True, /* biological */ DROPLET_GREEN_BLOOD, /* dropletType */ SoundNames::HUGGER_DEATH, /*hugger death sound*/ {/** MovingContext **/ #if X11 "black",True, "olivedrab",False, #endif #if WIN32 RGB(0,0,0)/*"black"*/,TRUE, RGB(0,128,64)/*"olivedrab"*/,FALSE, #endif /* animMax */ {2,2,1,1,2,1, 1, 2,2, 1, 2,2, 1, 2,2, 1, 2,2, 1, 2,2, 2,2, 2,2, 1, /* deadAnimMax */ }, /* sizes */ {{16,9},{16,9},{9,16},{9,16},{13,16},{10,9}, {9,10}, {9,16},{9,16}, {10,9}, {16,9},{16,9}, {9,10}, {9,16},{9,16}, {10,9}, {16,9},{16,9}, {13,16}, /* Must be */ {13,16},{13,16}, /* same size. */ {13,16},{13,16}, {13,16},{13,16}, {16,7}, /* deadSize */ }, /* offsets */ {{0}}, {{CMN_ID(green_hugger_0,IDB_HIHUGGER_GREEN0), CMN_ID(green_hugger_0b,IDB_HIHUGGER_GREEN0B)}, {PH_AUTO_GEN}, {CMN_ID(green_hugger_2,IDB_HIHUGGER_GREEN6)},{PH_AUTO_GEN}, {CMN_ID(green_hugger_4,IDB_HIHUGGER_GREEN4), CMN_ID(green_hugger_4b,IDB_HIHUGGER_GREEN4B)}, {CMN_ID(green_hugger_5,IDB_HIHUGGER_GREEN5)}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(green_hugger_5,IDB_HIHUGGER_GREEN5)}, {CMN_ID(green_hugger_0,IDB_HIHUGGER_GREEN0), CMN_ID(green_hugger_0b,IDB_HIHUGGER_GREEN0B)},{PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(green_hugger_4,IDB_HIHUGGER_GREEN4)}, {PH_AUTO_GEN},{CMN_ID(green_hugger_4,IDB_HIHUGGER_GREEN4), CMN_ID(green_hugger_4b,IDB_HIHUGGER_GREEN4B)}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(green_hugger_4,IDB_HIHUGGER_GREEN4), CMN_ID(green_hugger_4b,IDB_HIHUGGER_GREEN4B)},{PH_AUTO_GEN}, {CMN_ID(green_hugger_25,IDB_HIHUGGER_GREEN_DEAD)}, /* deadPixmapBits */ }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 35, /* health */ 25, /* mass */ A_GreenHugger, /* classId */ "green-hugger", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {16,16}, /* sizeMax */ GreenHugger::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ GreenHugger::init_x, /* init_x */ GreenHugger::create_from_stream, /* create_from_stream */ }, True, /* hires */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ False, /* invisibility */ }, }; const StickyContext GreenHugger::stickyContext = { /** StickyContext **/ 7, /* wallCrawlSpeed */ }; const HuggerContext GreenHugger::huggerContext = { /** HuggerContext **/ True, /* useHuggeeIntel */ }; xevil-2.02r2.orig/cmn/bitmaps/lance/0040755000175000017500000000000007637441100016605 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/lance/lance.bitmaps0100644000175000017500000000745707041425136021262 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/lance/lance_25.xpm" #include "gen_xpm/lance/lance_28.xpm" #endif Size Lance::get_size(Dir dir) { return context.movingContext.sizes[dir]; } Size Lance::get_size_max() { return context.movingContext.physicalContext.sizeMax; } PhysicalP Lance::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } ShotXdata Lance::xdata; const ShotContext Lance::context = {/** ShotContext **/ 95, /* damage */ 40, /* speed */ 0,//SOUNDID False,//REPEATING {/** MovingContext **/ #if X11 "black",False, "red",False, #endif #if WIN32 RGB(0,0,0)/*black*/,FALSE, RGB(255,0,0)/*red*/,FALSE, #endif /* animMax */ {0,0,0,0,0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0,0, 0,0, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, }, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {40,1},{40,1},{40,1},{1,40}, {1,40},{1,40},{40,1},{40,1}, {40,1},{40,1},{40,1},{1,40}, {1,40},{1,40},{40,1},{40,1}, }, /* offsets */ {{0,0}}, /* pixmapBits */ {{0},{0},{0},{0},{0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {CMN_ID(lance_25,IDB_LANCE_HORZ)},{CMN_ID(lance_25,IDB_LANCE_HORZ)}, {CMN_ID(lance_25,IDB_LANCE_HORZ)},{CMN_ID(lance_28,IDB_LANCE_VERT)}, {CMN_ID(lance_28,IDB_LANCE_VERT)},{CMN_ID(lance_28,IDB_LANCE_VERT)}, {CMN_ID(lance_25,IDB_LANCE_HORZ)},{CMN_ID(lance_25,IDB_LANCE_HORZ)}, {CMN_ID(lance_25,IDB_LANCE_HORZ)},{CMN_ID(lance_25,IDB_LANCE_HORZ)}, {CMN_ID(lance_25,IDB_LANCE_HORZ)},{CMN_ID(lance_28,IDB_LANCE_VERT)}, {CMN_ID(lance_28,IDB_LANCE_VERT)},{CMN_ID(lance_28,IDB_LANCE_VERT)}, {CMN_ID(lance_25,IDB_LANCE_HORZ)},{CMN_ID(lance_25,IDB_LANCE_HORZ)}, }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 1, /* health */ 0, /* mass */ A_Lance, /* classId */ "lance", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {40,40}, /* sizeMax */ Lance::create, /* create */ True, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ Lance::get_stats, /* get_stats */ NULL, /* arg */ Lance::init_x, /* init_x */ Lance::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ Coord::zero_offset_generator, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }; xevil-2.02r2.orig/cmn/bitmaps/lancer/0040755000175000017500000000000007637441100016767 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/lancer/lancer.bitmaps0100644000175000017500000000652507041425136021621 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/lancer/lancer_4.xpm" #endif Size Lancer::get_size_max() { return context.weaponContext.itemContext.fallingContext.movingContext .physicalContext.sizeMax; } PhysicalP Lancer::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Lancer(w,l,pos); assert(ret); return ret; } static void lancer_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = True; #if WIN32 iconId = IDB_LANCER; #endif #if X11 iconId = 0; #endif } GunXdata Lancer::xdata; const GunContext Lancer::context = { /** GunContext **/ 35, /* shotTime */ 40, /* ammoInitial */ 50, /* ammoMax */ { /** WeaponContext **/ SoundNames::LANCER, { /** ItemContext **/ True, /* persists */ 7000, /* coolness */ 0, /*item use sound */ { /** FallingContext **/ { /** MovingContext **/ #if X11 "black",False, Xvars_BACKGROUND,True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, Xvars_BACKGROUND,True, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{20,6},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(lancer_4,IDB_LANCER)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 5, /* health */ 20, /* mass */ A_Lancer, /* classId */ "lancer", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ True, /* potentialWeapon */ False, /* potentialOtherItem */ .0002f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {20,6}, /* sizeMax */ Lancer::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Lancer::init_x, /* init_x */ Lancer::create_from_stream, /* create_from_stream */ lancer_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/laser/0040755000175000017500000000000007637441100016631 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/laser/laser.bitmaps0100644000175000017500000000751407041425136021324 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/laser/laser_25.xpm" #include "gen_xpm/laser/laser_28.xpm" #endif Size Laser::get_size(Dir dir) { return context.movingContext.sizes[dir]; } Size Laser::get_size_max() { return context.movingContext.physicalContext.sizeMax; } PhysicalP Laser::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } ShotXdata Laser::xdata; const ShotContext Laser::context = {/** ShotContext **/ 35, /* damage */ 40, /* speed */ 0,/*soundid*/ False, /*repeatingsound*/ {/** MovingContext **/ #if X11 "green4",False, "black",False, #endif #if WIN32 RGB(0,255,0)/*"green4"*/,False, RGB(0,0,0)/*"black"*/,False, #endif /* animMax */ {0,0,0,0,0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0,0, 0,0, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, }, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {30,1},{30,1},{30,1},{1,30}, {1,30},{1,30},{30,1},{30,1}, {30,1},{30,1},{30,1},{1,30}, {1,30},{1,30},{30,1},{30,1}, }, /* offsets */ {{0},}, /* pixmapBits */ {{0},{0},{0},{0},{0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {CMN_ID(laser_25,IDB_LASER_HORIZ)},{CMN_ID(laser_25,IDB_LASER_HORIZ)}, {CMN_ID(laser_25,IDB_LASER_HORIZ)},{CMN_ID(laser_28,IDB_LASER_VERT)}, {CMN_ID(laser_28,IDB_LASER_VERT)},{CMN_ID(laser_28,IDB_LASER_VERT)}, {CMN_ID(laser_25,IDB_LASER_HORIZ)},{CMN_ID(laser_25,IDB_LASER_HORIZ)}, {CMN_ID(laser_25,IDB_LASER_HORIZ)},{CMN_ID(laser_25,IDB_LASER_HORIZ)}, {CMN_ID(laser_25,IDB_LASER_HORIZ)},{CMN_ID(laser_28,IDB_LASER_VERT)}, {CMN_ID(laser_28,IDB_LASER_VERT)},{CMN_ID(laser_28,IDB_LASER_VERT)}, {CMN_ID(laser_25,IDB_LASER_HORIZ)},{CMN_ID(laser_25,IDB_LASER_HORIZ)}, }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 1, /* health */ 0, /* mass */ A_Laser, /* classId */ "laser", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {30,30}, /* sizeMax */ Laser::create, /* create */ True, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ Laser::get_stats, /* get_stats */ NULL, /* arg */ Laser::init_x, /* init_x */ Laser::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ Coord::zero_offset_generator, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }; xevil-2.02r2.orig/cmn/bitmaps/launcher/0040755000175000017500000000000007637441100017324 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/launcher/launcher.bitmaps0100644000175000017500000000730507041425136022510 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/launcher/launcher_4.xpm" #endif Size Launcher::get_size_max() { return context.weaponContext.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP Launcher::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Launcher(w,l,pos); assert(ret); return ret; } static void launcher_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = True; #if WIN32 iconId = IDB_HILAUNCHER; #endif #if X11 iconId = 0; #endif } GunXdata Launcher::xdata; const GunContext Launcher::context = { /** GunContext **/ 5, /* shotTime */ 10, /* ammoInitial */ 20, /* ammoMax */ { /** WeaponContext **/ SoundNames::LAUNCHER, { /** ItemContext **/ True, /* persists */ 8000, /* coolness */ 0, /*item use sound */ { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, "gray",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, RGB(192,192,192)/*"gray"*/,True, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{21,12},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(launcher_4,IDB_HILAUNCHER)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 3, /* health */ 20, /* mass */ A_Launcher, /* classId */ "launcher", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ True, /* potentialWeapon */ False, /* potentialOtherItem */ .0002f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {21,12}, /* sizeMax */ Launcher::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Launcher::init_x, /* init_x */ Launcher::create_from_stream, /* create_from_stream */ launcher_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }; /********* old launcher ********/ #if 0 /* pixmapBits */ {{0},{0},{0},{0},{IDB_LAUNCHER1,IDB_LAUNCHER2,IDB_LAUNCHER3,IDB_LAUNCHER4, IDB_LAUNCHER5,IDB_LAUNCHER6,IDB_LAUNCHER7, IDB_LAUNCHER8,IDB_LAUNCHER9,IDB_LAUNCHER10,IDB_LAUNCHER11,IDB_LAUNCHER12},}, #endif xevil-2.02r2.orig/cmn/bitmaps/locator/0040755000175000017500000000000007637441100017166 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/locator/locator.bitmaps0100644000175000017500000000537707041425134022221 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // locator.bitmaps #if X11 #include "gen_xpm/locator/tick_0_0.xpm" #include "gen_xpm/locator/tick_0_7.xpm" #include "gen_xpm/locator/tick_1_0.xpm" #include "gen_xpm/locator/tick_1_7.xpm" #include "gen_xpm/locator/tick_2_0.xpm" #include "gen_xpm/locator/tick_2_7.xpm" #include "gen_xpm/locator/tick_3_0.xpm" #include "gen_xpm/locator/tick_3_7.xpm" #endif const CMN_BITS_ID Locator::tickPixmapBits[TICK_MAX][CO_DIR_HALF_PURE] = { { // TICK_HUMAN CMN_ID(tick_0_0,IDB_YARROW_R), PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, CMN_ID(tick_0_7,IDB_YARROW_UP_R), }, { // TICK_NEUTRAL CMN_ID(tick_1_0,IDB_GARROW_R), PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, CMN_ID(tick_1_7,IDB_GARROW_UP_R), }, { // TICK_ENEMY CMN_ID(tick_2_0,IDB_RARROW_R), PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, CMN_ID(tick_2_7,IDB_RARROW_UP_R), }, { // TICK_OTHER CMN_ID(tick_3_0,IDB_BARROW_R), PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, PH_AUTO_GEN, CMN_ID(tick_3_7,IDB_BARROW_UP_R), }, }; // Stretched coordinates. const Size Locator::tickSizes[CO_DIR_HALF_PURE] = { {8,7}, {8,8}, {7,8}, {8,8}, {8,7}, {8,8}, {7,8}, {8,8}, }; const OLItemInfo Locator::nonExistentClassesItemInfo[A_None - A_CLASSES_NUM] = { // isItem, isWeapon, iconId // A_Fireballs { True, True, CMN_ID(0,IDB_FIREBALLICON),}, // A_Lasers { True, True, CMN_ID(0,IDB_LASERS),}, // A_DropLiftable { True, True, CMN_ID(0,IDB_DROPLIFTABLE),}, // A_HandToHand { True, True, CMN_ID(0,IDB_HANDTOHAND),}, // A_SuicideButton { True, False, CMN_ID(0,IDB_SUICIDEBUTTON),}, // A_Prickly { True, True, CMN_ID(0,IDB_PRICKLY),}, }; xevil-2.02r2.orig/cmn/bitmaps/med_kit/0040755000175000017500000000000007637441100017137 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/med_kit/med_kit.bitmaps0100644000175000017500000000607607041425134022140 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/med_kit/med_kit_4.xpm" #endif Size MedKit::get_size_max() { return context.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP MedKit::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new MedKit(w,l,pos); assert(ret); return ret; } static void med_kit_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = False; #if WIN32 iconId = IDB_HIMEDKIT; #endif #if X11 iconId = 0; #endif } AutoUseXdata MedKit::xdata; const AutoUseContext MedKit::context = { /** AutoUseContext **/ False, /* humansOnly */ { /** ItemContext **/ True, /* persists */ 8000, /* coolness */ 0, { /** FallingContext **/ {/** MovingContext **/ #if X11 "red",True, "white",False, #endif #if WIN32 RGB(255,0,0)/*"red"*/,True, RGB(255,255,255)/*"white"*/,False, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{7,7}}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(med_kit_4,IDB_HIMEDKIT)}}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 10, /* health */ 10, /* mass */ A_MedKit, /* classId */ "med-kit", /* className */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ True, /* potentialOtherItem */ 0.0003f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {7,7}, /* sizeMax */ MedKit::create, /* create */ False, /* statsCreations */ True, /* statsUses */ False, /* statsDeaths */ MedKit::get_stats, /* get_stats */ NULL, /* arg */ MedKit::init_x, /* init_x */ MedKit::create_from_stream, /* create_from_stream */ med_kit_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/missile/0040755000175000017500000000000007637441100017170 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/missile/missile.bitmaps0100644000175000017500000000733007041425134022214 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/missile/missile_25.xpm" #include "gen_xpm/missile/missile_39.xpm" #include "gen_xpm/missile/missile_40.xpm" #endif #define MISSILE_RADIUS 320 #define MISSILE_DESTRUCT_TIME 65 #define MISSILE_ROTATE_TIME 2 Size Missile::get_size(Dir dir) { return context.movingContext.sizes[dir]; } Size Missile::get_size_max(){ Size size; size.width = 10; size.height = 10; return size; } PhysicalP Missile::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } ShotXdata Missile::xdata; const ShotContext Missile::context = {/** ShotContext **/ 50, /* damage */ 10, /* speed */ 0,/**/ True,/*REPEATING*/ {/** MovingContext **/ #if X11 "black",False, "cyan",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(0,255,255)/*"cyan"*/,TRUE, #endif /* animMax */ {0,0,0,0,0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0,0, 0,0, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, }, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {10,3},{9,6},{7,7},{6,9}, {3,10},{6,9},{7,7},{9,6}, {10,3},{9,6},{7,7},{6,9}, {3,10},{6,9},{7,7},{9,6}, }, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {CMN_ID(missile_25,IDB_MISSLE25)}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {CMN_ID(missile_39,IDB_MISSLE39)}, {CMN_ID(missile_40,IDB_MISSLE40)} }, /* maskBits */ {{0}}, {/* PhysicalContext */ 1, /* health */ 0, /* mass */ A_Missile, /* classId */ "missile", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {10,10}, /* sizeMax */ Missile::create, /* create */ True, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ Missile::get_stats, /* get_stats */ NULL, /* arg */ Missile::init_x, /* init_x */ Missile::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }; xevil-2.02r2.orig/cmn/bitmaps/m_gun/0040755000175000017500000000000007637441100016630 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/m_gun/m_gun.bitmaps0100644000175000017500000000656707041425134021327 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/machine_gun/machine_gun_4.xpm" #endif Size MGun::get_size_max() { return context.weaponContext.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP MGun::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new MGun(w,l,pos); assert(ret); return ret; } static void m_gun_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = True; #if WIN32 iconId = IDB_MGUN1; #endif #if X11 iconId = 0; #endif } GunXdata MGun::xdata; const GunContext MGun::context = { /** GunContext **/ 4, /* shotTime */ 30, /* ammoInitial */ 80, /* ammoMax */ { /** WeaponContext **/ SoundNames::MGUN, { /** ItemContext **/ True, /* persists */ 9000, /* coolness */ 0, /*item use sound */ { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, Xvars_BACKGROUND,True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, Xvars_BACKGROUND,TRUE, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{17,9},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(machine_gun_4,IDB_MGUN1)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 5, /* health */ 15, /* mass */ A_MGun, /* classId */ "machine-gun", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ True, /* potentialWeapon */ False, /* potentialOtherItem */ .0002f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {17,9}, /* sizeMax */ MGun::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ MGun::init_x, /* init_x */ MGun::create_from_stream, /* create_from_stream */ m_gun_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/napalm/0040755000175000017500000000000007637441100016773 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/napalm/napalm.bitmaps0100644000175000017500000001163207041425132021620 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/napalm_grenade/napalm_grenade_4.xpm" #include "gen_xpm/napalm_grenade/napalm_grenade_4b.xpm" #include "gen_xpm/napalm_grenade/napalm_grenade_4c.xpm" #include "gen_xpm/napalm_grenade/napalm_grenade_4d.xpm" #endif Size Napalm::get_size(Dir dir) { return context.movingContext.sizes[dir]; } Size Napalm::get_size_max() { return context.movingContext.sizes[CO_air]; } PhysicalP Napalm::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } FallingXdata Napalm::xdata; const FallingContext Napalm::context = {/** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, "gray60",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(192,192,192)/*"gray60"*/,TRUE, #endif /* animMax */ {0,0,0,0,4,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0,0, 0,0, 4,0,4,0, 4,0,4,0, 4,0,4,0, 4,0,4,0, }, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{8,8},{0,0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {8,8},{0,0},{8,8},{0,0}, {8,8},{0,0},{8,8},{0,0}, {8,8},{0,0},{8,8},{0,0}, {8,8},{0,0},{8,8},{0,0}, }, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0}, {CMN_ID(napalm_grenade_4,IDB_NAPALM1), CMN_ID(napalm_grenade_4b,IDB_NAPALM2), CMN_ID(napalm_grenade_4c,IDB_NAPALM3), CMN_ID(napalm_grenade_4d,IDB_NAPALM4)},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {CMN_ID(napalm_grenade_4,IDB_NAPALM1), CMN_ID(napalm_grenade_4b,IDB_NAPALM2), CMN_ID(napalm_grenade_4c,IDB_NAPALM3), CMN_ID(napalm_grenade_4d,IDB_NAPALM4)}, {0}, {CMN_ID(napalm_grenade_4,IDB_NAPALM1), CMN_ID(napalm_grenade_4b,IDB_NAPALM2), CMN_ID(napalm_grenade_4c,IDB_NAPALM3), CMN_ID(napalm_grenade_4d,IDB_NAPALM4)}, {0}, {CMN_ID(napalm_grenade_4,IDB_NAPALM1), CMN_ID(napalm_grenade_4b,IDB_NAPALM2), CMN_ID(napalm_grenade_4c,IDB_NAPALM3), CMN_ID(napalm_grenade_4d,IDB_NAPALM4)}, {0}, {CMN_ID(napalm_grenade_4,IDB_NAPALM1), CMN_ID(napalm_grenade_4b,IDB_NAPALM2), CMN_ID(napalm_grenade_4c,IDB_NAPALM3), CMN_ID(napalm_grenade_4d,IDB_NAPALM4)}, {0}, {CMN_ID(napalm_grenade_4,IDB_NAPALM1), CMN_ID(napalm_grenade_4b,IDB_NAPALM2), CMN_ID(napalm_grenade_4c,IDB_NAPALM3), CMN_ID(napalm_grenade_4d,IDB_NAPALM4)}, {0}, {CMN_ID(napalm_grenade_4,IDB_NAPALM1), CMN_ID(napalm_grenade_4b,IDB_NAPALM2), CMN_ID(napalm_grenade_4c,IDB_NAPALM3), CMN_ID(napalm_grenade_4d,IDB_NAPALM4)}, {0}, {CMN_ID(napalm_grenade_4,IDB_NAPALM1), CMN_ID(napalm_grenade_4b,IDB_NAPALM2), CMN_ID(napalm_grenade_4c,IDB_NAPALM3), CMN_ID(napalm_grenade_4d,IDB_NAPALM4)}, {0}, {CMN_ID(napalm_grenade_4,IDB_NAPALM1), CMN_ID(napalm_grenade_4b,IDB_NAPALM2), CMN_ID(napalm_grenade_4c,IDB_NAPALM3), CMN_ID(napalm_grenade_4d,IDB_NAPALM4)}, {0}, }, /* maskBits */ {{0}}, {/* PhysicalContext */ 1, /* health */ 5, /* mass */ A_Napalm, /* classId */ "napalm-grenade", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {8,8}, /* sizeMax */ Napalm::create, /* create */ True, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ Napalm::get_stats, /* get_stats */ NULL, /* arg */ Napalm::init_x, /* init_x */ Napalm::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }; xevil-2.02r2.orig/cmn/bitmaps/napalms/0040755000175000017500000000000007637441100017156 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/napalms/napalms.bitmaps0100644000175000017500000000661607041425132022174 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/napalm_grenades/napalm_grenades_4.xpm" #endif Size Napalms::get_size_max() { return context.weaponContext.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP Napalms::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Napalms(w,l,pos); assert(ret); return ret; } static void napalms_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = True; #if WIN32 iconId = IDB_NAPALMS; #endif #if X11 iconId = 0; #endif } GunXdata Napalms::xdata; const GunContext Napalms::context = { /** GunContext **/ 8, /* shotTime */ 10, /* ammoInitial */ 20, /* ammoMax */ { /** WeaponContext **/ 0,/*sound*/ { /** ItemContext **/ True, /* persists */ -5, /* coolness */ 0, /*item use sound */ { /** FallingContext **/ {/** MovingContext **/ #if X11 "red",False, "black",False, #endif #if WIN32 RGB(128,128,128)/*"gray60"*/,False, RGB(0,0,0)/*"black"*/,False, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{14,6},}, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(napalm_grenades_4,IDB_NAPALMS)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 1, /* health */ 20, /* mass */ A_Napalms, /* classId */ "napalm-grenades", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ True, /* potentialWeapon */ False, /* potentialOtherItem */ .0002f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {14,6}, /* sizeMax */ Napalms::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Napalms::init_x, /* init_x */ Napalms::create_from_stream, /* create_from_stream */ napalms_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/ninja/0040755000175000017500000000000007637441100016622 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/ninja/ninja.bitmaps0100644000175000017500000002040507041425132021274 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/ninja/ninja_0.xpm" #include "gen_xpm/ninja/ninja_0b.xpm" #include "gen_xpm/ninja/ninja_0c.xpm" #include "gen_xpm/ninja/ninja_0d.xpm" #include "gen_xpm/ninja/ninja_0e.xpm" #include "gen_xpm/ninja/ninja_0f.xpm" #include "gen_xpm/ninja/ninja_2.xpm" #include "gen_xpm/ninja/ninja_2b.xpm" #include "gen_xpm/ninja/ninja_2c.xpm" #include "gen_xpm/ninja/ninja_2d.xpm" #include "gen_xpm/ninja/ninja_4.xpm" #include "gen_xpm/ninja/ninja_5.xpm" #include "gen_xpm/ninja/ninja_9.xpm" #include "gen_xpm/ninja/ninja_10b.xpm" #include "gen_xpm/ninja/ninja_10c.xpm" #include "gen_xpm/ninja/ninja_10d.xpm" #include "gen_xpm/ninja/ninja_10e.xpm" #include "gen_xpm/ninja/ninja_10f.xpm" #include "gen_xpm/ninja/ninja_18.xpm" #include "gen_xpm/ninja/ninja_20.xpm" #include "gen_xpm/ninja/ninja_20c.xpm" #include "gen_xpm/ninja/ninja_20d.xpm" #include "gen_xpm/ninja/ninja_20e.xpm" #include "gen_xpm/ninja/ninja_20f.xpm" #include "gen_xpm/ninja/ninja_22.xpm" #include "gen_xpm/ninja/ninja_22b.xpm" #include "gen_xpm/ninja/ninja_25.xpm" #include "gen_xpm/ninja/ninja_26.xpm" #include "gen_xpm/ninja/ninja_28.xpm" #include "gen_xpm/ninja/ninja_32.xpm" #include "gen_xpm/ninja/ninja_38.xpm" #include "gen_xpm/ninja/ninja_39.xpm" #endif Size Ninja::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP Ninja::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Ninja(w,l,pos); assert(ret); return ret; } CreatureXdata Ninja::creatureXdata; StickyXdata Ninja::stickyXdata; FighterXdata Ninja::fighterXdata; UserXdata Ninja::userXdata; const CreatureContext Ninja::creatureContext = { /** CreatureContext **/ 3, /* crawlSpeed */ 7, /* centerSpeed */ 14, /* airSpeed */ 5, /* climbSpeed */ 12, /* jump */ 2, /* acceleration */ 150, /* corpseHealth */ True, /* biological */ DROPLET_BLOOD, /* dropletType */ SoundNames::NINJA_DEATH, {/** MovingContext **/ #if X11 "black",False, "orange",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(255,128,0)/*"orange"*/,TRUE, #endif /* animMax */ {6,6,4,4,1,1, 1, 6,6, 1, 6,6, 1, 6,6, 1, 6,6, 1, 6,6, 1,2, 6,6, 1, /* deadAnimMax */ /* Fighter attack animMax */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1, }, /* sizes */ {{16,28},{16,28},{18,18},{18,18},{14,30},{14,28}, {11,31}, {11,31},{11,31}, {31,11}, {31,11},{31,11}, {11,31}, {11,31},{11,31}, {31,11}, {31,11},{31,11}, {14,32}, /* Must be */ {14,32},{14,32}, /* same size. */ {14,30},{14,30}, {14,32},{14,32}, {22,6}, /* deadSize */ /* Fighter attack sizes */ {24,24}, /* center_R */ {24,24}, /* center_L */ {24,19}, /* air_R */ {24,19}, /* air_L */ {11,31}, /* r_DN */ {11,31}, /* r_UP */ {31,11}, /* dn_R */ {31,11}, /* dn_L */ {11,31}, /* l_DN */ {11,31}, /* l_UP */ {31,11}, /* up_R */ {31,11}, /* up_L */ {12,36}, /* air_UP */ {14,30}, /* air_DN */ }, {{0}}, /* offsets */ /* pixmapBits */ {{CMN_ID(ninja_0,IDB_HININJA0),CMN_ID(ninja_0b,IDB_HININJA0B), CMN_ID(ninja_0c,IDB_HININJA0C),CMN_ID(ninja_0d,IDB_HININJA0D), CMN_ID(ninja_0e,IDB_HININJA0E),CMN_ID(ninja_0f,IDB_HININJA0F)}, {PH_AUTO_GEN}, {CMN_ID(ninja_2,IDB_HININJA2),CMN_ID(ninja_2b,IDB_HININJA2B), CMN_ID(ninja_2c,IDB_HININJA2C),CMN_ID(ninja_2d,IDB_HININJA2D)}, {PH_AUTO_GEN}, {CMN_ID(ninja_4,IDB_HININJA21)},{CMN_ID(ninja_5,IDB_HININJA5)}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(ninja_9,IDB_HININJA10)}, {CMN_ID(ninja_9,IDB_HININJA10),CMN_ID(ninja_10b,IDB_HININJA10B), CMN_ID(ninja_10c,IDB_HININJA10C),CMN_ID(ninja_10d,IDB_HININJA10D), CMN_ID(ninja_10e,IDB_HININJA10E),CMN_ID(ninja_10f,IDB_HININJA10F)}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(ninja_18,IDB_HININJA_18B)}, // CO_climb {PH_AUTO_GEN}, {CMN_ID(ninja_20,IDB_HININJA_18),CMN_ID(ninja_18,IDB_HININJA_18B), CMN_ID(ninja_20c,IDB_HININJA_18C),CMN_ID(ninja_20d,IDB_HININJA_18D), CMN_ID(ninja_20e,IDB_HININJA_18E),CMN_ID(ninja_20f,IDB_HININJA_18F)}, {PH_AUTO_GEN}, // CO_air_DN is not the same as CO_air, so not PH_AUTO_GEN {CMN_ID(ninja_22,IDB_HININJA22),CMN_ID(ninja_22b,IDB_HININJA22B)}, {CMN_ID(ninja_20,IDB_HININJA_18),CMN_ID(ninja_18,IDB_HININJA_18B), CMN_ID(ninja_20c,IDB_HININJA_18C),CMN_ID(ninja_20d,IDB_HININJA_18D), CMN_ID(ninja_20e,IDB_HININJA_18E),CMN_ID(ninja_20f,IDB_HININJA_18F)}, {PH_AUTO_GEN}, {CMN_ID(ninja_25,IDB_HININJA_DEAD)}, /* deadPixmapBits */ /* Fighter attack bitmaps */ {CMN_ID(ninja_26,IDB_HININJA0_ATTACK)}, /* center_R */ {PH_AUTO_GEN}, /* center_L */ {CMN_ID(ninja_28,IDB_HININJA2_ATTACK)}, /* air_R */ {PH_AUTO_GEN}, /* air_L */ {PH_AUTO_GEN}, /* r_DN */ {PH_AUTO_GEN}, /* r_UP */ {CMN_ID(ninja_32,IDB_HININJA10_ATTACK)}, /* dn_R */ {PH_AUTO_GEN}, /* dn_L */ {PH_AUTO_GEN}, /* l_DN */ {PH_AUTO_GEN}, /* l_UP */ {PH_AUTO_GEN}, /* up_R */ {PH_AUTO_GEN}, /* up_L */ {CMN_ID(ninja_38,IDB_HININJA21_ATTACK2)}, /* air_UP */ {CMN_ID(ninja_39,IDB_HININJA22_ATTACK)}, /* air_DN */ }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 135, /* health */ 120, /* mass */ A_Ninja, /* classId */ "ninja", /* clas */ True, /* transmogifyTarget */ True, /* doppelUser */ True, /* potentialHuman */ True, /* potentialEnemy */ 50, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {31,36}, /* sizeMax */ Ninja::create, /* create */ False, /* statsCreations */ False, /* statsUses */ True, /* statsDeaths */ Ninja::get_stats, /* get_stats */ NULL, /* arg */ Ninja::init_x, /* init_x */ Ninja::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ Fighter::offset_generator, /* offsetGenerator */ &Fighter::transformOverride, /* transformOverride */ True, /* useXPM */ True, /* invisibility */ }, }; // Also used by AltarOfSin const StickyContext Ninja::stickyContext = { /** StickyContext **/ 3, /* wallCrawlSpeed */ }; const FighterContext Ninja::fighterContext = { /** FighterContext **/ #if X11 "black", /* foreground */ "orange", /* background */ #endif #if WIN32 RGB(0,0,0)/*"black"*/, /* foreground */ RGB(255,128,0)/*"orange"*/, /* background */ #endif 3, /* slide */ 11, /* jumpHorizontal */ 12, /* jumpVertical */ 25, /* damageStuck */ 50, /* damageFree */ /* hotSpots */ {// jump kick,13 is actually below the foot. {23,11},{0,0},{23,13},{0,0},{0},{0}, {0}, {0,0},{0,0}, {0}, {30,3},{0,0}, {0}, {0,0},{0,0}, {0}, {0,0},{0,0}, {0}, {0},{0}, {8,0},{7,29}, }, SoundNames::NINJA_ATTACK, }; const UserContext Ninja::userContext = { /** UserContext **/ True, /* usesWeapons */ True, /* usesItems */ }; xevil-2.02r2.orig/cmn/bitmaps/n_protection/0040755000175000017500000000000007637441100020226 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/n_protection/n_protection.bitmaps0100644000175000017500000000377407041425134024320 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #define N_PROTECTION_N 3 Size NProtection::get_size_max() { assert(0); return context.physicalContext.sizeMax; } PhysicalP NProtection::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } ProtectionXdata NProtection::xdata; const ProtectionContext NProtection::context = { /** ProtectionContext **/ #if X11 "steelblue", /* colorName */ #endif #if WIN32 RGB(0,0,255), /* color blue */ #endif { /** PhysicalContext **/ 0, /* health */ 0, /* mass */ A_NProtection, /* classId */ "n-protection", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {0,0}, /* sizeMax */ NProtection::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ NProtection::init_x, /* init_x */ NProtection::create_from_stream, /* create_from_stream */ }, }; xevil-2.02r2.orig/cmn/bitmaps/n_shield/0040755000175000017500000000000007637441100017310 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/n_shield/n_shield.bitmaps0100644000175000017500000000702607041425132022454 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/n_shield/n_shield_4.xpm" #endif Size NShield::get_size_max() { return context.autoUseContext.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP NShield::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new NShield(w,l,pos); assert(ret); return ret; } static void n_shield_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = False; #if WIN32 iconId = IDB_HINSHIELD; #endif #if X11 iconId = 0; #endif } ShieldXdata NShield::xdata; const ShieldContext NShield::context = { /** ShieldContext **/ { /** AutoUseContext **/ False, /* humansOnly */ { /** ItemContext **/ True, /* persists */ 9000, /* coolness */ SoundNames::SHIELD_USE, /*item use sound*/ { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, // Funky hack in Ui::Ui. Look there before changing color from // "steelblue". "steelblue",False, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, RGB(0,0,192)/*"steelblue"*/,False, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{7,9},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(n_shield_4,IDB_HINSHIELD)},}, /* maskBits */ {{0},{0},{0},{0},{0},}, { /** PhysicalContext **/ 10, /* health */ 10, /* mass */ A_NShield, /* classId */ "n-shield", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ True, /* potentialOtherItem */ .00008f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {7,9}, /* sizeMax */ NShield::create, /* create */ False, /* statsCreations */ True, /* statsUses */ False, /* statsDeaths */ NShield::get_stats, /* get_stats */ NULL, /* arg */ NShield::init_x, /* init_x */ NShield::create_from_stream, /* create_from_stream */ n_shield_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/oil_droplet/0040755000175000017500000000000007637441100020037 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/oil_droplet/oil_droplet.bitmaps0100644000175000017500000000734107041425132023732 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/oil_droplet/oil_droplet_25.xpm" #include "gen_xpm/oil_droplet/oil_droplet_39.xpm" #include "gen_xpm/oil_droplet/oil_droplet_4.xpm" #include "gen_xpm/oil_droplet/oil_droplet_40.xpm" #include "gen_xpm/oil_droplet/oil_droplet_9.xpm" #endif Size OilDroplet::get_size_max() { return context.movingContext.physicalContext.sizeMax; } PhysicalP OilDroplet::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } DropletXdata OilDroplet::xdata; const DropletContext OilDroplet::context = {/** DropletContext **/ 25, /* dissolveTime */ {/** MovingContext **/ #if X11 "black",False, "white",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(0,255,255)/*"cyan"*/,TRUE, #endif /* animMax */ {0,0,0,0,1,0, 1, 0,0, 1, 0,0, 1, 0,0, 1, 0,0, 0, 0,0, 0,0, 0,0, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, }, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{2,4},{0,0}, {1,7}, {0},{0}, {7,1}, {0},{0}, {1,7}, {0},{0}, {7,1}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {7,2},{6,4},{5,5},{4,6}, {2,7},{4,6},{5,5},{6,4}, {7,2},{6,4},{5,5},{4,6}, {2,7},{4,6},{5,5},{6,4}, }, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(oil_droplet_4,IDB_OIL4)},{0}, {PH_AUTO_GEN}, {0},{0}, {CMN_ID(oil_droplet_9,IDB_OIL9)}, {0},{0}, {PH_AUTO_GEN}, {0},{0}, {PH_AUTO_GEN}, {0},{0}, {0}, {0},{0}, {0},{0}, {0},{0}, {CMN_ID(oil_droplet_25,IDB_OIL25)}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {CMN_ID(oil_droplet_39,IDB_OIL39)}, {CMN_ID(oil_droplet_40,IDB_OIL40)} }, /* maskBits */ {{0}}, {/* PhysicalContext */ 1, /* health */ 0, /* mass */ A_OilDroplet, /* classId */ "oil-droplet", /* className */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {7,7}, /* sizeMax */ Blood::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ OilDroplet::init_x, /* init_x */ OilDroplet::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }; xevil-2.02r2.orig/cmn/bitmaps/phys_mover/0040755000175000017500000000000007637441100017716 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/phys_mover/phys_mover.bitmaps0100644000175000017500000000341507041425130023464 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ Size PhysMover::get_size_max() { Size ret; ret.set(W_MOVER_WIDTH_MAX,W_MOVER_HEIGHT_MAX); return ret; } PhysicalP PhysMover::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } const PhysicalContext PhysMover::context = {/** PhysicalContext **/ 0, /* health */ 0, /* mass */ A_PhysMover, /* classId */ "phys-mover", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {32,16}, /* sizeMax */ PhysMover::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ PhysMover::init_x, /* init_x */ PhysMover::create_from_stream, /* create_from_stream */ }; xevil-2.02r2.orig/cmn/bitmaps/pistol/0040755000175000017500000000000007637441100017035 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/pistol/pistol.bitmaps0100644000175000017500000000655307041425130021730 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/pistol/pistol_4.xpm" #endif Size Pistol::get_size_max() { return context.weaponContext.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP Pistol::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Pistol(w,l,pos); assert(ret); return ret; } static void pistol_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = True; #if WIN32 iconId = IDB_HIPISTOL; #endif #if X11 iconId = 0; #endif } GunXdata Pistol::xdata; const GunContext Pistol::context = { /** GunContext **/ 12, /* shotTime */ 10, /* ammoInitial */ 30, /* ammoMax */ { /** WeaponContext **/ SoundNames::PISTOL, { /** ItemContext **/ True, /* persists */ 5000, /* coolness */ 0, /*item use sound */ { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, Xvars_BACKGROUND,True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, Xvars_BACKGROUND,True, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{10,9},}, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(pistol_4,IDB_HIPISTOL)}}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 5, /* health */ 7, /* mass */ A_Pistol, /* classId */ "pistol", /* className */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ True, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0004f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {10,9}, /* sizeMax */ Pistol::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Pistol::init_x, /* init_x */ Pistol::create_from_stream, /* create_from_stream */ pistol_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/p_c_p/0040755000175000017500000000000007637441100016603 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/p_c_p/p_c_p.bitmaps0100644000175000017500000000643107041425130021237 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // For PCPM and PCP. #if X11 #include "gen_xpm/PCP/PCP_4.xpm" #endif #define PCP_M_TIME 350 Size PCP::get_size_max() { return context.autoUseContext.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP PCP::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new PCP(w,l,pos); assert(ret); return ret; } static void p_c_p_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = False; #if WIN32 iconId = IDB_PILLS; #endif #if X11 iconId = 0; #endif } DrugsXdata PCP::xdata; const DrugsContext PCP::context = { /** DrugsContext **/ 6, /* odChance */ { /** AutoUseContext **/ False, /* humansOnly */ { /** ItemContext **/ True, /* persists */ 6300, /* coolness */ 0, { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, "yellow",True, #endif #if WIN32 RGB(255,0,0)/*"red"*/,True, RGB(255,255,255)/*"white"*/,False, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{12,6},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(PCP_4,IDB_PILLS)},}, /* maskBits */ {{0},{0},{0},{0},{0},}, { /** PhysicalContext **/ 1, /* health */ 1, /* mass */ A_PCP, /* classId */ "PCP", /* className */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ True, /* potentialOtherItem */ 0.0001f, /* objectWorldPercent */ 2, /* levelMaxTimes */ {12,6}, /* sizeMax */ PCP::create, /* create */ False, /* statsCreations */ True, /* statsUses */ False, /* statsDeaths */ PCP::get_stats, /* get_stats */ NULL, /* arg */ PCP::init_x, /* init_x */ PCP::create_from_stream, /* create_from_stream */ p_c_p_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, } }; xevil-2.02r2.orig/cmn/bitmaps/rock/0040755000175000017500000000000007637441100016461 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/rock/rock.bitmaps0100644000175000017500000000547007041425130020775 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/rock/rock_4.xpm" #endif Size Rock::get_size_max() { return context.heavyContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP Rock::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Rock(w,l,pos); assert(ret); return ret; } LiftableXdata Rock::xdata; const LiftableContext Rock::context = {/** LiftableContext **/ {/** HeavyContext **/ 100, /* damage */ {/** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, "gray70",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, RGB(128,128,128)/*"gray70"*/,True, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{13,13},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(rock_4,IDB_ROCKHI)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 200, /* health */ 300, /* mass */ A_Rock, /* classId */ "rock", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ True, /* potentialOtherItem */ 0.0002f, /* objectWorldPercent */ 15, /* levelMaxTimes */ {13,13}, /* sizeMax */ Rock::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Rock::init_x, /* init_x */ Rock::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/seal/0040755000175000017500000000000007637441100016447 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/seal/seal.bitmaps0100644000175000017500000001017107041425130020743 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/baby_seal/baby_seal_0.xpm" #include "gen_xpm/baby_seal/baby_seal_0b.xpm" #include "gen_xpm/baby_seal/baby_seal_25.xpm" #include "gen_xpm/baby_seal/baby_seal_4.xpm" #endif Size Seal::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP Seal::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Seal(w,l,pos); assert(ret); return ret; } CreatureXdata Seal::creatureXdata; GroundedXdata Seal::groundedXdata; SuicideXdata Seal::suicideXdata; AnimTimeXdata Seal::animTimeXdata; const CreatureContext Seal::creatureContext = { /** CreatureContext **/ 0, /* crawlSpeed */ 2, /* centerSpeed */ 12, /* airSpeed */ 0, /* climbSpeed */ 0, /* jump */ 1, /* acceleration */ 90, /* corpseHealth */ True, /* biological */ DROPLET_BLOOD, /* dropletType */ SoundNames::SEAL_DEATH, /* deadSoundId */ {/** MovingContext **/ #if WIN32 RGB(0,255,0)/*"green4"*/,False, RGB(0,0,255)/*"blue"*/,False, #endif #if X11 "white",True, "black",False, #endif /* animMax */ {2,2,1,1,1,1, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 0, 0,0, 1,1, 0,0, 1, /* deadAnimMax */ }, /* sizes */ {{14,11},{14,11},{14,11},{14,11},{11,11},{11,11}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, {0,0},{0,0}, {0,0}, /* Must be */ {0,0},{0,0}, /* same size. */ {11,11},{11,11}, {0,0},{0,0}, {19,4}, /* deadSize */ }, /* offsets */ {{0}}, /* pixmapBits */ {{CMN_ID(baby_seal_0,IDB_SEAL0),CMN_ID(baby_seal_0b,IDB_SEAL0B)}, {PH_AUTO_GEN}, {CMN_ID(baby_seal_0b,IDB_SEAL0B)},{PH_AUTO_GEN}, {CMN_ID(baby_seal_4,IDB_SEAL5)},{CMN_ID(baby_seal_4,IDB_SEAL5)}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {0}, {0},{0}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {0},{0}, {CMN_ID(baby_seal_25,IDB_SEALDEAD)}, /* deadPixmapBits */ }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 45, /* health */ 80, /* mass */ A_Seal, /* classId */ "baby-seal", /* clas */ False, /* transmogifyTarget */ True, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {19,11}, /* sizeMax */ Seal::create, /* create */ False, /* statsCreations */ False, /* statsUses */ True, /* statsDeaths */ Seal::get_stats, /* get_stats */ NULL, /* arg */ Seal::init_x, /* init_x */ Seal::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ False, /* invisibility */ }, }; const GroundedContext Seal::groundedContext = { /** GroundedContext **/ 0, /* dummy */ }; const SuicideContext Seal::suicideContext = { /** SuicideContext **/ 0, /* dummy */ }; const AnimTimeContext Seal::animTimeContext = { /** AnimTimeContext **/ 5, /* animTime */ }; xevil-2.02r2.orig/cmn/bitmaps/shell/0040755000175000017500000000000007637441100016632 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/shell/shell.bitmaps0100644000175000017500000000501007041425126021312 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/shell/shell_4.xpm" #endif Size Shell::get_size() { return context.movingContext.sizes[CO_air]; } PhysicalP Shell::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } ShotXdata Shell::xdata; const ShotContext Shell::context = {/** ShotContext **/ 50, /* damage */ 13, /* speed */ 0, /* soundid */ False,/* Repeating */ {/** MovingContext **/ #if X11 "black",False, "gray",True, #endif #if WIN32 RGB(0,0,0)/*black*/,False, RGB(192,192,192)/*"gray"*/,True, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{6,6},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(shell_4,IDB_SHELL)},}, /* maskBits */ {{0}}, {/* PhysicalContext */ 1, /* health */ 0, /* mass */ A_Shell, /* classId */ "shell", /* className */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {6,6}, /* sizeMax */ Shell::create, /* create */ True, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ Shell::get_stats, /* get_stats */ NULL, /* arg */ Shell::init_x, /* init_x */ Shell::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }; xevil-2.02r2.orig/cmn/bitmaps/sound_cmn/0040755000175000017500000000000007637441100017510 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/sound_cmn/sound_cmn.bitmaps0100644000175000017500000000520007041425126023047 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "sound_cmn.bitmaps" #if WIN32 unsigned int SoundNames::names[SoundNames::SOUND_MAX] = { 0, // dummy value // // Resource Name SoundName // 0, //IDW_SOUNDTRACK, // SOUNDTRACK 0, //IDW_SOUNDTRACK_LEVELS, // SOUNDTRACK_LEVELS 0, //IDW_SOUNDTRACK_SEAL, // SOUNDTRACK_SEAL IDW_CHAINSAW_SOUND, // CHAINSAW_SOUND IDW_FLAMETHROWER, // FLAMETHROWER IDW_DEATH, // DEATH IDW_SEAL_DEATH, // SEAL_DEATH IDW_HUGGER_DEATH, // HUGGER_DEATH IDW_FROG_DEATH, // FROG_DEATH IDW_BREAKDOWN, // BREAKDOWN IDW_BANG, // BANG IDW_PISTOL, // PISTOL IDW_MGUN, // MGUN IDW_LAUNCHER, // LAUNCHER IDW_EXPLOSION, // EXPLOSION IDW_DOG_DEATH, // DOG_DEATH IDW_LASER, // LASER IDW_HERO_ATTACK, // HERO_ATTACK IDW_NINJA_ATTACK, // NINJA_ATTACK IDW_DOG_ATTACK, // DOG_ATTACK IDW_CHOP_DEATH, // CHOP_DEATH IDW_DOPPEL_USE, // DOPPEL_USE IDW_CLOAK_USE, // CLOAK_USE IDW_TRANS_USE, // TRANS_USE IDW_SHIELD_USE, // SHIELD_USE IDW_NINJA_DEATH, // NINJA_DEATH IDW_FROGGUN, // FROGGUN IDW_LANCER, // LANCER IDW_SWAPPER, // SWAPPER, IDM_FIRESOUNDTRACK, // FIRE IDM_HIVESOUNDTRACK, // HIVE IDM_KILLSOUNDTRACK, // KILLKILLKILL IDM_SEALSOUNDTRACK, // SEAL IDM_ZEEPEEGSOUNDTRACK, IDM_NIGHTSKYSOUNDTRACK, IDM_SWEETDARKSOUNDTRACK, #if 0 // Nice piece but sounds really painful on cheap sound cards. IDM_TERRAEXMSOUNDTRACK, #endif IDM_NEWSONGSOUNDTRACK, }; #endif xevil-2.02r2.orig/cmn/bitmaps/star/0040755000175000017500000000000007637441100016474 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/star/star.bitmaps0100644000175000017500000000506607041425126021031 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/star/star_4.xpm" #include "gen_xpm/star/star_4b.xpm" #endif Size Star::get_size() { return context.movingContext.sizes[CO_air]; } PhysicalP Star::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } ShotXdata Star::xdata; const ShotContext Star::context = {/** ShotContext **/ 40, /* damage */ 12, /* speed */ 0,/*soundid*/ True,/*repeating*/ {/** MovingContext **/ #if X11 "black",False, "gray45",False, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, RGB(128,128,128)/*"gray45"*/,False, #endif /* animMax */ {0,0,0,0,2}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{7,7},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(star_4,IDB_STAR),CMN_ID(star_4b,IDB_STARB)},}, /* maskBits */ {{0}}, {/* PhysicalContext */ 1, /* health */ 0, /* mass */ A_Star, /* classId */ "star", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {7,7}, /* sizeMax */ Star::create, /* create */ True, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ Star::get_stats, /* get_stats */ NULL, /* arg */ Star::init_x, /* init_x */ Star::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }; xevil-2.02r2.orig/cmn/bitmaps/stars/0040755000175000017500000000000007637441100016657 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/stars/stars.bitmaps0100644000175000017500000000651307041425126021375 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/stars/stars_4.xpm" #endif Size Stars::get_size_max() { return context.weaponContext.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP Stars::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Stars(w,l,pos); assert(ret); return ret; } static void stars_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = True; #if WIN32 iconId = IDB_STARS; #endif #if X11 iconId = 0; #endif } GunXdata Stars::xdata; const GunContext Stars::context = { /** GunContext **/ 14, /* shotTime */ 10, /* ammoInitial */ 40, /* ammoMax */ { /** WeaponContext **/ 0, /*sound*/ { /** ItemContext **/ True, /* persists */ 6000, /* coolness */ 0, /*item use sound */ { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, "gray45",False, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, RGB(96,96,96)/*"gray45"*/,False, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{18,12},}, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(stars_4,IDB_STARS)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 3, /* health */ 5, /* mass */ A_Stars, /* classId */ "stars", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ True, /* potentialWeapon */ False, /* potentialOtherItem */ .0002f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {18,12}, /* sizeMax */ Stars::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Stars::init_x, /* init_x */ Stars::create_from_stream, /* create_from_stream */ stars_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/swapper/0040755000175000017500000000000007637441100017204 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/swapper/swapper.bitmaps0100644000175000017500000000722207041425124022243 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/soul_swapper/soul_swapper_4.xpm" #endif #define SWAPPER_TIME 10 Size Swapper::get_size_max() { return context.gunContext.weaponContext.itemContext.fallingContext. movingContext.sizes[CO_air]; } PhysicalP Swapper::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Swapper(w,l,pos); assert(ret); return ret; } static void swapper_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = True; #if WIN32 iconId = IDB_SWAPPER; #endif #if X11 iconId = 0; #endif } SingleGunXdata Swapper::xdata; const SingleGunContext Swapper::context = { /** SingleGunContext **/ { /** GunContext **/ 12, /* shotTime */ PH_AMMO_UNLIMITED, /* ammoInitial */ PH_AMMO_UNLIMITED, /* ammoMax */ { /** WeaponContext **/ SoundNames::SWAPPER, { /** ItemContext **/ True, /* persists */ -20, /* coolness */ 0, /*item use sound */ { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, Xvars_BACKGROUND,True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, Xvars_BACKGROUND,True, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{15,7},}, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(soul_swapper_4,IDB_SWAPPER)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 5, /* health */ 15, /* mass */ A_Swapper, /* classId */ "soul-swapper", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ True, /* potentialWeapon */ False, /* potentialOtherItem */ .0002f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {15,7}, /* sizeMax */ Swapper::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Swapper::init_x, /* init_x */ Swapper::create_from_stream, /* create_from_stream */ swapper_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/swap_shell/0040755000175000017500000000000007637441100017664 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/swap_shell/swap_shell.bitmaps0100644000175000017500000000527507041425124023411 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/swap_shell/swap_shell_4.xpm" #include "gen_xpm/swap_shell/swap_shell_4b.xpm" #endif Size SwapShell::get_size() { return context.movingContext.sizes[CO_air]; } PhysicalP SwapShell::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } ShotXdata SwapShell::xdata; const ShotContext SwapShell::context = {/** ShotContext **/ 0, /* damage */ /* Ignored in this case. */ 12, /* speed */ 0,/*soundid*/ True,/*repeating*/ {/** MovingContext **/ #if X11 "black",False, "yellow",False, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, RGB(255,255,0)/*"yellow"*/,False, #endif /* animMax */ {0,0,0,0,2}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{5,5},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0}, {CMN_ID(swap_shell_4,IDB_SWAP_SHELL), CMN_ID(swap_shell_4b,IDB_SWAP_SHELLB)},}, /* maskBits */ {{0}}, {/** PhysicalContext **/ 1, /* health */ 0, /* mass */ A_SwapShell, /* classId */ "swap-shell", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {5,5}, /* sizeMax */ SwapShell::create, /* create */ True, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ SwapShell::get_stats, /* get_stats */ NULL, /* arg */ SwapShell::init_x, /* init_x */ SwapShell::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }; xevil-2.02r2.orig/cmn/bitmaps/transform/0040755000175000017500000000000007637441100017536 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/transform/transform.bitmaps0100644000175000017500000002056607041425122023133 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // transform.bitmaps // Specific transformations used to auto-generate bitmaps. // E.g. the bitmaps for a Creature walking to the left are // the same as those walking right, just reflected around // the X axis. // TODO: For Ninja, CO_r_DN should be like for CO_r_UP and // CO_l_DN should be CO_l_UP. // Map from base directions to all other directions. // {0} means the direction is a base direction. // {TR_NONE} means the identity transform. OneTransform Transform2D::transforms[CO_DIR_MAX] = { {0}, // CO_center_R {1,CO_center_R,{TR_RF_X}}, // CO_center_L {0}, // CO_air_R {1,CO_air_R,{TR_RF_X}}, // CO_air_L {0}, // CO_air {0}, // CO_center {1,CO_dn,{TR_RT_3}}, // CO_r {2,CO_dn_R,{TR_RF_X,TR_RT_3}}, // CO_r_DN {1,CO_dn_R,{TR_RT_3}}, // CO_r_UP {0}, // CO_dn {0}, // CO_dn_R {1,CO_dn_R,{TR_RF_X}}, // CO_dn_L {1,CO_dn,{TR_RT_1}}, // CO_l {1,CO_dn_R,{TR_RT_1}}, // CO_l_DN {2,CO_dn_R,{TR_RF_X,TR_RT_1}}, // CO_l_UP {2,CO_dn,{TR_RF_X,TR_RT_2}}, // CO_up {2,CO_dn_R,{TR_RF_X,TR_RT_2}}, // CO_up_R {1,CO_dn_R,{TR_RT_2}}, // CO_up_L {0}, // CO_climb {1,CO_climb_UP,{TR_NONE}}, // CO_climb_DN {0}, // CO_climb_UP {1,CO_air,{TR_NONE}}, // CO_air_UP {1,CO_air,{TR_NONE}}, // CO_air_DN {0}, // CO_climb_R {1,CO_climb_R,{TR_RF_X}}, // CO_climb_L {0}, // CO_R {2,CO_UP_R_R,{TR_RF_X,TR_RT_2}}, // CO_DN_R_R {1,CO_UP_R,{TR_RT_1}}, // CO_DN_R {1,CO_UP_R_R,{TR_RT_1}}, // CO_DN_DN_R {1,CO_R,{TR_RT_1}}, // CO_DN {2,CO_UP_R_R,{TR_RF_X,TR_RT_3}}, // CO_DN_DN_L {2,CO_UP_R,{TR_RF_X,TR_RT_3}}, // CO_DN_L {1,CO_UP_R_R,{TR_RT_2}}, // CO_DN_L_L {1,CO_R,{TR_RF_X}}, // CO_L {1,CO_UP_R_R,{TR_RF_X}}, // CO_UP_L_L {1,CO_UP_R,{TR_RF_X}}, // CO_UP_L {1,CO_UP_R_R,{TR_RT_3}}, // CO_UP_UP_L {2,CO_R,{TR_RF_X,TR_RT_1}}, // CO_UP {2,CO_UP_R_R,{TR_RF_X,TR_RT_1}}, // CO_UP_UP_R {0}, // CO_UP_R {0}, // CO_UP_R_R }; OneTransform Creature::uprightTransformOverride[CO_DIR_MAX] = { {TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT}, {TR_USE_DEFAULT}, {1,CO_center,{TR_RT_3}}, // CO_r {2,CO_center_R,{TR_RF_X,TR_RT_3}}, // CO_r_DN {1,CO_center_R,{TR_RT_3}}, // CO_r_UP {TR_USE_DEFAULT}, // CO_dn {TR_USE_DEFAULT}, // CO_dn_R {TR_USE_DEFAULT}, // CO_dn_L {1,CO_center,{TR_RT_1}}, // CO_l {1,CO_center_R,{TR_RT_1}}, // CO_l_DN {2,CO_center_R,{TR_RF_X,TR_RT_1}}, // CO_l_UP {2,CO_center,{TR_RF_X,TR_RT_2}}, // CO_up {2,CO_center_R,{TR_RF_X,TR_RT_2}}, // CO_up_R {1,CO_center_R,{TR_RT_2}}, // CO_up_L {TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT}, {TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT}, {TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT}, {TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT}, {TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT}, }; // CAREFUL!!! // If you change any of the values between CO_DN_R_R and CO_UP_R in either of // Fighter::transformOverride or Fighter::uprightTransformOverride, you may have to change // it in the other as well. Would be better to have some way of composing transformOverrides, // so they could share the common functionality. // // This is the transformOverride that Fighter provides to adjust for // the way that it uses the CO_DN_R_R...CO_UP_R slots in MovingContext. // // Maybe this should be some sort of .bitmaps file like transform.bitmaps. OneTransform Fighter::transformOverride[CO_DIR_MAX] = { {TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT}, {TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT}, {TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT}, {TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT}, {TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT}, {TR_USE_DEFAULT}, {0}, // CO_DN_R_R -> center_R {1,CO_DN_R_R,{TR_RF_X}}, // CO_DN_R -> center_L {0}, // CO_DN_DN_R -> air_R {1,CO_DN_DN_R,{TR_RF_X}}, // CO_DN -> air_L {2,CO_DN_L_L,{TR_RF_X,TR_RT_3}}, // CO_DN_DN_L -> r_DN {1,CO_DN_L_L,{TR_RT_3}}, // CO_DN_L -> r_UP {0}, // CO_DN_L_L -> dn_R {1,CO_DN_L_L,{TR_RF_X}}, // CO_L -> dn_L {1,CO_DN_L_L,{TR_RT_1}}, // CO_UP_L_L -> l_DN {2,CO_DN_L_L,{TR_RF_X,TR_RT_1}}, // CO_UP_L -> l_UP {2,CO_DN_L_L,{TR_RF_X,TR_RT_2}}, // CO_UP_UP_L -> up_R {1,CO_DN_L_L,{TR_RT_2}}, // CO_UP -> up_L {0}, // CO_UP_UP_R -> air_UP {0}, // CO_UP_R -> air_DN {TR_USE_DEFAULT}, }; // This does everything in Fighter::transformOverride plus it adjust so that // when the Fighter is walking on the walls/ceiling it uses the upright // bitmaps instead of the crawling bitmaps. E.g. Ninja uses // Fighter::transformOverride while Hero uses // Fighter::uprightTransformOverride. OneTransform Fighter::uprightTransformOverride[CO_DIR_MAX] = { {TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT}, {TR_USE_DEFAULT},{TR_USE_DEFAULT}, {1,CO_center,{TR_RT_3}}, // CO_r {2,CO_center_R,{TR_RF_X,TR_RT_3}}, // CO_r_DN {1,CO_center_R,{TR_RT_3}}, // CO_r_UP {TR_USE_DEFAULT}, // CO_dn {TR_USE_DEFAULT}, // CO_dn_R {TR_USE_DEFAULT}, // CO_dn_L {1,CO_center,{TR_RT_1}}, // CO_l {1,CO_center_R,{TR_RT_1}}, // CO_l_DN {2,CO_center_R,{TR_RF_X,TR_RT_1}}, // CO_l_UP {2,CO_center,{TR_RF_X,TR_RT_2}}, // CO_up {2,CO_center_R,{TR_RF_X,TR_RT_2}}, // CO_up_R {1,CO_center_R,{TR_RT_2}}, // CO_up_L {TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT}, {TR_USE_DEFAULT},{TR_USE_DEFAULT},{TR_USE_DEFAULT}, {0}, // CO_DN_R_R -> center_R {1,CO_DN_R_R,{TR_RF_X}}, // CO_DN_R -> center_L {0}, // CO_DN_DN_R -> air_R {1,CO_DN_DN_R,{TR_RF_X}}, // CO_DN -> air_L {2,CO_DN_R_R,{TR_RF_X,TR_RT_3}}, // CO_DN_DN_L -> r_DN {1,CO_DN_R_R,{TR_RT_3}}, // CO_DN_L -> r_UP {0}, // CO_DN_L_L -> dn_R {1,CO_DN_L_L,{TR_RF_X}}, // CO_L -> dn_L {1,CO_DN_R_R,{TR_RT_1}}, // CO_UP_L_L -> l_DN {2,CO_DN_R_R,{TR_RF_X,TR_RT_1}}, // CO_UP_L -> l_UP {2,CO_DN_R_R,{TR_RF_X,TR_RT_2}}, // CO_UP_UP_L -> up_R {1,CO_DN_R_R,{TR_RT_2}}, // CO_UP -> up_L {0}, // CO_UP_UP_R -> air_UP {0}, // CO_UP_R -> air_DN {TR_USE_DEFAULT}, }; xevil-2.02r2.orig/cmn/bitmaps/trapdoor/0040755000175000017500000000000007637441100017355 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/trapdoor/trapdoor.bitmaps0100644000175000017500000000462707041425106022573 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/trapdoor/trapdoor_4.xpm" #endif // Defines. #define TRAPDOOR_TIME 50 Size Trapdoor::get_size() { return context.sizes[CO_air]; } PhysicalP Trapdoor::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } MovingXdata Trapdoor::xdata; const MovingContext Trapdoor::context = { /** MovingContext **/ #if X11 "black",True, "brown",False, #endif #if WIN32 RGB(0,0,0)/*"black"*/,True, RGB(128,64,0)/*"brown"*/,False, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{30,15},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(trapdoor_4,IDB_HITRAPDOOR)},}, /* maskBits */ {{0},{0},{0},{0},{0},}, { /** PhysicalContext **/ 0, /* health */ 0, /* mass */ A_Trapdoor, /* classId */ "trapdoor", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {30,15}, /* sizeMax */ Trapdoor::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Trapdoor::init_x, /* init_x */ Trapdoor::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }; xevil-2.02r2.orig/cmn/bitmaps/transmogifier/0040755000175000017500000000000007637441100020374 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/transmogifier/transmogifier.bitmaps0100644000175000017500000000634207041425122024623 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/transmogifier/transmogifier_4.xpm" #endif Size Transmogifier::get_size_max() { return context.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP Transmogifier::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Transmogifier(w,l,pos); assert(ret); return ret; } static void transmogifier_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = False; #if WIN32 iconId = IDB_TRANSMOGIFIER; #endif #if X11 iconId = 0; #endif } AutoUseXdata Transmogifier::xdata; const AutoUseContext Transmogifier::context = { /** AutoUseContext **/ False, /* humansOnly */ { /** ItemContext **/ True, /* persists */ 90, /* coolness */ SoundNames::TRANS_USE, /*item use sound*/ { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",True, "brown2",False, #endif #if WIN32 RGB(0,0,0)/*"black"*/,True, RGB(128,0,0)/*"brown2"*/,False, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{26,15},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(transmogifier_4,IDB_TRANSMOGIFIER)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 5, /* health */ 2, /* mass */ A_Transmogifier, /* classId */ "transmogifier", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ True, /* potentialOtherItem */ .00002f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {26,15}, /* sizeMax */ Transmogifier::create, /* create */ False, /* statsCreations */ True, /* statsUses */ False, /* statsDeaths */ Transmogifier::get_stats, /* get_stats */ NULL, /* arg */ Transmogifier::init_x, /* init_x */ Transmogifier::create_from_stream, /* create_from_stream */ transmogifier_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/t_protection/0040755000175000017500000000000007637441100020234 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/t_protection/t_protection.bitmaps0100644000175000017500000000400107041425124024313 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #define T_PROTECTION_TIME 190 Size TProtection::get_size_max() { assert(0); return context.physicalContext.sizeMax; } PhysicalP TProtection::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } ProtectionXdata TProtection::xdata; const ProtectionContext TProtection::context = { /** ProtectionContext **/ #if X11 "yellow", /* colorName */ #endif #if WIN32 RGB(255,255,0), /* color Yellow */ #endif { /** PhysicalContext **/ 0, /* health */ 0, /* mass */ A_TProtection, /* classId */ "t-protection", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {0,0}, /* sizeMax */ TProtection::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ TProtection::init_x, /* init_x */ TProtection::create_from_stream, /* create_from_stream */ }, }; xevil-2.02r2.orig/cmn/bitmaps/t_shield/0040755000175000017500000000000007637441100017316 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/t_shield/t_shield.bitmaps0100644000175000017500000000661707041425124022476 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/t_shield/t_shield_4.xpm" #endif Size TShield::get_size_max() { return context.autoUseContext.itemContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP TShield::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new TShield(w,l,pos); assert(ret); return ret; } static void t_shield_get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId) { isItem = True; isWeapon = False; #if WIN32 iconId = IDB_HITSHIELD; #endif #if X11 iconId = 0; #endif } ShieldXdata TShield::xdata; const ShieldContext TShield::context = { /** ShieldContext **/ { /** AutoUseContext **/ False, /* humansOnly */ { /** ItemContext **/ True, /* persists */ 7000, /* coolness */ SoundNames::SHIELD_USE, /*shield use*/ { /** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, "yellow",False, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, RGB(255,255,0)/*"yellow"*/,False, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{7,9},}, /* offsets */ {{0}}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(t_shield_4,IDB_HITSHIELD)},}, /* maskBits */ {{0},{0},{0},{0},{0},}, { /** PhysicalContext **/ 10, /* health */ 10, /* mass */ A_TShield, /* classId */ "t-shield", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ True, /* potentialOtherItem */ .00008f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {7,9}, /* sizeMax */ TShield::create, /* create */ False, /* statsCreations */ True, /* statsUses */ False, /* statsDeaths */ TShield::get_stats, /* get_stats */ NULL, /* arg */ TShield::init_x, /* init_x */ TShield::create_from_stream, /* create_from_stream */ t_shield_get_item_info, /* get_item_info */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/ui/0040755000175000017500000000000007637441100016140 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/ui/ui.bitmaps0100644000175000017500000000307307041425104020131 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #ifndef UI_BITMAPS #define UI_BITMAPS #include "utils.h" #include "ui/reaper.xbm" #include "ui/null_cursor" #include "ui/insensitive" #include "ui/xevil_icon.xpm" #define XPM_ICON_BITS xevil_icon #define ICON_BITS (char *)reaper_bits #define ICON_WIDTH reaper_width #define ICON_HEIGHT reaper_height #define CURSOR_BITS (char *)null_cursor_bits #define CURSOR_MASK_BITS (char *)null_cursor_bits #define CURSOR_WIDTH null_cursor_width #define CURSOR_HEIGHT null_cursor_height #define CURSOR_HOT_X null_cursor_x_hot #define CURSOR_HOT_Y null_cursor_y_hot #define INSENSITIVE_BITS (char *)insensitive_bits #define INSENSITIVE_WIDTH insensitive_width #define INSENSITIVE_HEIGHT insensitive_height #endif xevil-2.02r2.orig/cmn/bitmaps/walker/0040755000175000017500000000000007637441100017010 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/walker/walker.bitmaps0100644000175000017500000001404207041425104021647 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/walker/walker_0.xpm" #include "gen_xpm/walker/walker_0b.xpm" #include "gen_xpm/walker/walker_0c.xpm" #include "gen_xpm/walker/walker_0d.xpm" #include "gen_xpm/walker/walker_18.xpm" #include "gen_xpm/walker/walker_2.xpm" #include "gen_xpm/walker/walker_20b.xpm" #include "gen_xpm/walker/walker_25.xpm" #include "gen_xpm/walker/walker_2b.xpm" #include "gen_xpm/walker/walker_4.xpm" #include "gen_xpm/walker/walker_4b.xpm" #include "gen_xpm/walker/walker_4c.xpm" #include "gen_xpm/walker/walker_4d.xpm" #include "gen_xpm/walker/walker_5.xpm" #include "gen_xpm/walker/walker_5b.xpm" #include "gen_xpm/walker/walker_5c.xpm" #include "gen_xpm/walker/walker_5d.xpm" #endif Size Walker::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP Walker::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Walker(w,l,pos); assert(ret); return ret; } CreatureXdata Walker::creatureXdata; WalkingXdata Walker::walkingXdata; UserXdata Walker::userXdata; BuiltInXdata Walker::builtInXdata; AnimTimeXdata Walker::animTimeXdata; const CreatureContext Walker::creatureContext = { /** CreatureContext **/ 0, /* crawlSpeed */ 6, /* centerSpeed */ 14, /* airSpeed */ 4, /* climbSpeed */ 12, /* jump */ 2, /* acceleration */ 200, /* corpseHealth */ False, /* biological */ DROPLET_OIL, /* dropletType */ SoundNames::BREAKDOWN, /*deadsound*/ {/** MovingContext **/ #if X11 "black",False, "antiquewhite3",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,FALSE, RGB(255,255,255)/*"antiquewhite3"*/,TRUE, #endif /* animMax */ {4,4,2,2,4,4, 4, 4,4, 4, 4,4, 4, 4,4, 4, 4,4, 1, 2,2, 4,4, 2,2, 1, /* deadAnimMax */ }, /* sizes */ {{28,26},{28,26},{37,15},{37,15},{20,13},{20,26}, {26,20}, {26,28},{26,28}, {20,13}, {20,13},{20,13}, {26,20}, {26,28},{26,28}, {20,26}, {28,26},{28,26}, {16,26}, /* Must be */ {16,26},{16,26}, /* same size. */ {20,13},{20,13}, {16,26},{16,26}, {27,14}, /* deadSize */ }, /* offsets */ {{0}}, /* pixmapBits */ {{CMN_ID(walker_0,IDB_HIWALKER0),CMN_ID(walker_0b,IDB_HIWALKER0B), CMN_ID(walker_0c,IDB_HIWALKER0C),CMN_ID(walker_0d,IDB_HIWALKER0D)}, {PH_AUTO_GEN}, {CMN_ID(walker_2,IDB_HIWALKER2),CMN_ID(walker_2b,IDB_HIWALKER2B)}, {PH_AUTO_GEN}, {CMN_ID(walker_4,IDB_HIWALKER4),CMN_ID(walker_4b,IDB_HIWALKER4B), CMN_ID(walker_4c,IDB_HIWALKER4C),CMN_ID(walker_4d,IDB_HIWALKER4D)}, {CMN_ID(walker_5,IDB_HIWALKER5),CMN_ID(walker_5b,IDB_HIWALKER5B), CMN_ID(walker_5c,IDB_HIWALKER5C),CMN_ID(walker_5d,IDB_HIWALKER5D)}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(walker_4,IDB_HIWALKER4),CMN_ID(walker_4b,IDB_HIWALKER4B), CMN_ID(walker_4c,IDB_HIWALKER4C),CMN_ID(walker_4d,IDB_HIWALKER4D)}, {CMN_ID(walker_4,IDB_HIWALKER4),CMN_ID(walker_4b,IDB_HIWALKER4B), CMN_ID(walker_4c,IDB_HIWALKER4C),CMN_ID(walker_4d,IDB_HIWALKER4D)}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(walker_18,IDB_HIWALKER18)}, {PH_AUTO_GEN}, {CMN_ID(walker_18,IDB_HIWALKER18),CMN_ID(walker_20b,IDB_HIWALKER18B)}, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {CMN_ID(walker_18,IDB_HIWALKER18),CMN_ID(walker_20b,IDB_HIWALKER18B)}, {PH_AUTO_GEN}, {CMN_ID(walker_25,IDB_HIWALKER_DEAD)}, /* deadPixmapBits */ }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 200, /* health */ 400, /* mass */ A_Walker, /* classId */ "walker", /* clas */ True, /* transmogifyTarget */ True, /* doppelUser */ True, /* potentialHuman */ True, /* potentialEnemy */ 20, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {37,28}, /* sizeMax */ Walker::create, /* create */ False, /* statsCreations */ False, /* statsUses */ True, /* statsDeaths */ Walker::get_stats, /* get_stats */ NULL, /* arg */ Walker::init_x, /* init_x */ Walker::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ NULL, /* offsetGenerator */ &Creature::uprightTransformOverride, /* transformOverride */ True, /* useXPM */ True, /* invisibility */ }, }; const WalkingContext Walker::walkingContext = { /** WalkingContext **/ 0, /* dummy */ }; const UserContext Walker::userContext = { /** UserContext **/ True, /* usesWeapons */ True, /* usesItems */ }; // Also used by the AltarOfSin const BuiltInContext Walker::builtInContext = { /** BuiltInContext **/ 11, /* shotTime */ A_Lasers, /* weaponClassId */ "lasers", /* weaponStr */ 5500, /* coolness */ SoundNames::LASER, /* attackSound */ Laser::get_size, /* get_shot_size */ Walker::create_shot, /* create_shot */ Laser::compute_weapon_dir, /* compute_weapon_dir */ }; const AnimTimeContext Walker::animTimeContext = { /** AnimTimeContext **/ 3, /* animTime */ }; xevil-2.02r2.orig/cmn/bitmaps/weight/0040755000175000017500000000000007637441100017012 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/weight/weight.bitmaps0100644000175000017500000000552107041425070021657 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/weight/weight_4.xpm" #endif Size Weight::get_size_max() { return context.heavyContext.fallingContext.movingContext.sizes[CO_air]; } PhysicalP Weight::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Weight(w,l,pos); assert(ret); return ret; } LiftableXdata Weight::xdata; const LiftableContext Weight::context = {/** LiftableContext **/ {/** HeavyContext **/ 225, /* damage */ {/** FallingContext **/ {/** MovingContext **/ #if X11 "black",False, "azure",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, RGB(0,128,128)/*"azure"*/,True, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{14,15},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(weight_4,IDB_HIWEIGHT)},}, /* maskBits */ {{0}}, { /** PhysicalContext **/ 300, /* health */ 500, /* mass */ A_Weight, /* classId */ "weight", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ True, /* potentialOtherItem */ 0.0002f, /* objectWorldPercent */ 15, /* levelMaxTimes */ {14,15}, /* sizeMax */ Weight::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Weight::init_x, /* init_x */ Weight::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }, }; xevil-2.02r2.orig/cmn/bitmaps/world/0040755000175000017500000000000007637441100016652 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/world/world.bitmaps0100644000175000017500000002745707041425040021370 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "world.bitmaps" // NOTE: WSQUARE_WIDTH and WSQUARE_HEIGHT in utils.h. #include "utils.h" #include "world.h" #if X11 #include "gen_xpm/world/block_0.xpm" #include "gen_xpm/world/block_1.xpm" #include "gen_xpm/world/block_2.xpm" #include "gen_xpm/world/block_3.xpm" #include "gen_xpm/world/block_4.xpm" #include "gen_xpm/world/block_5.xpm" #include "gen_xpm/world/block_6.xpm" #include "gen_xpm/world/block_7.xpm" #include "gen_xpm/world/block_8.xpm" #include "gen_xpm/world/block_9.xpm" #include "gen_xpm/world/block_10.xpm" #include "gen_xpm/world/block_11.xpm" #include "gen_xpm/world/block_12.xpm" #include "gen_xpm/world/block_13.xpm" #include "gen_xpm/world/block_14.xpm" #include "gen_xpm/world/block_15.xpm" #include "gen_xpm/world/block_16.xpm" #include "gen_xpm/world/block_17.xpm" #include "gen_xpm/world/block_18.xpm" #include "gen_xpm/world/block_19.xpm" #include "gen_xpm/world/block_20.xpm" #include "gen_xpm/world/block_21.xpm" #include "gen_xpm/world/background_0.xpm" #include "gen_xpm/world/background_1.xpm" #include "gen_xpm/world/background_2.xpm" #include "gen_xpm/world/background_3.xpm" #include "gen_xpm/world/background_4.xpm" #include "gen_xpm/world/background_5.xpm" #include "gen_xpm/world/background_6.xpm" #include "gen_xpm/world/background_7.xpm" #include "gen_xpm/world/background_8.xpm" #include "gen_xpm/world/background_9.xpm" #include "gen_xpm/world/background_10.xpm" #include "gen_xpm/world/background_11.xpm" #include "gen_xpm/world/background_12.xpm" #include "gen_xpm/world/background_13.xpm" #include "gen_xpm/world/outside_0.xpm" #include "gen_xpm/world/outside_1.xpm" #include "gen_xpm/world/outside_2.xpm" #include "gen_xpm/world/outside_3.xpm" #include "gen_xpm/world/outside_4.xpm" #include "gen_xpm/world/outside_5.xpm" #include "gen_xpm/world/door_0.xpm" #include "gen_xpm/world/door_1.xpm" #include "gen_xpm/world/door_2.xpm" #include "gen_xpm/world/door_3.xpm" #include "gen_xpm/world/door_4.xpm" #include "gen_xpm/world/door_5.xpm" #include "gen_xpm/world/door_6.xpm" #include "gen_xpm/world/door_7.xpm" #include "gen_xpm/world/door_8.xpm" #include "gen_xpm/world/door_9.xpm" #include "gen_xpm/world/mover_square_0.xpm" #include "gen_xpm/world/mover_square_1.xpm" #include "gen_xpm/world/mover_square_2.xpm" #include "gen_xpm/world/mover_square_3.xpm" #include "gen_xpm/world/mover_square_4.xpm" #include "gen_xpm/world/mover_square_5.xpm" #include "gen_xpm/world/mover_square_6.xpm" #include "gen_xpm/world/mover_square_7.xpm" #include "gen_xpm/world/mover_square_8.xpm" #include "gen_xpm/world/mover_square_9.xpm" #include "gen_xpm/world/mover_0.xpm" #include "gen_xpm/world/mover_1.xpm" #include "gen_xpm/world/mover_2.xpm" #include "gen_xpm/world/mover_3.xpm" #include "gen_xpm/world/mover_4.xpm" #include "gen_xpm/world/poster_0.xpm" #include "gen_xpm/world/poster_1.xpm" #include "gen_xpm/world/poster_2.xpm" #include "gen_xpm/world/poster_3.xpm" #include "gen_xpm/world/poster_4.xpm" #include "gen_xpm/world/poster_5.xpm" #include "gen_xpm/world/poster_6.xpm" #include "gen_xpm/world/poster_7.xpm" #include "gen_xpm/world/poster_8.xpm" #include "gen_xpm/world/poster_9.xpm" #include "gen_xpm/world/poster_10.xpm" #include "gen_xpm/world/poster_11.xpm" #include "gen_xpm/world/poster_12.xpm" #include "gen_xpm/world/poster_13.xpm" #endif // background color defined in utils.h Xvars_BACKGROUND // Wempty and Woutside aren't directly used on Windows. But they still // need to be in the Windows build so they can generate XPM files for UNIX. static CMN_BITS_ID World_blocksBits[W_ALL_BLOCKS_NUM] = { CMN_ID(block_0,IDB_EMPTY), CMN_ID(block_1,IDB_HIWALL2), CMN_ID(block_2,IDB_HILADDER2), CMN_ID(block_3,IDB_OUTSIDE), CMN_ID(block_4,IDB_HISQUANCH), CMN_ID(block_5,IDB_HIUPDOWN), CMN_ID(block_6,IDB_HITEXTSQUARE), CMN_ID(block_7,IDB_HIERBLOK2), CMN_ID(block_8,IDB_HILADDER), CMN_ID(block_9,IDB_HIERUPDOWN), CMN_ID(block_10,IDB_MD1WALL), CMN_ID(block_11,IDB_MD1LADDER), CMN_ID(block_12,IDB_MD1UPDOWN), CMN_ID(block_13,IDB_MD2WALL), CMN_ID(block_14,IDB_MD2LADDER), CMN_ID(block_15,IDB_MD2UPDOWN), CMN_ID(block_16,IDB_MD3WALL), CMN_ID(block_17,IDB_MD3LADDER), CMN_ID(block_18,IDB_MD3UPDOWN), CMN_ID(block_19,IDB_MD4WALL), CMN_ID(block_20,IDB_MD4LADDER), CMN_ID(block_21,IDB_MD4UPDOWN), }; CMN_BITS_ID *World::blocksBits = World_blocksBits; static BitmapSpec World_backgrounds[W_ALL_BACKGROUNDS_NUM] = { {CMN_ID(background_0,IDB_BGHELL1),{100,100}}, {CMN_ID(background_1,IDB_BGHELL2),{100,100}}, {CMN_ID(background_2,IDB_BGINDUSTRIAL),{100,100}}, {CMN_ID(background_3,IDB_BGIND1),{100,100}}, {CMN_ID(background_4,IDB_BGALIENNU),{100,100}}, {CMN_ID(background_5,IDB_HIER1),{100,100}}, {CMN_ID(background_6,IDB_MD1BACKGROUND),{64,64}}, {CMN_ID(background_7,IDB_MD2BACKGROUND),{94,94}}, {CMN_ID(background_8,IDB_MD3BACKGROUND),{128,128}}, {CMN_ID(background_9,IDB_MD4BACKGROUND),{128,128}}, {CMN_ID(background_10,IDB_FWBACKGROUND1),{128,128}}, {CMN_ID(background_11,IDB_FWBACKGROUND2),{128,128}}, {CMN_ID(background_12,IDB_FWBACKGROUND3),{128,128}}, {CMN_ID(background_13,IDB_FWBACKGROUND4),{128,128}}, }; BitmapSpec *World::backgrounds = World_backgrounds; static BitmapSpec World_outsides[W_ALL_OUTSIDES_NUM] = { {CMN_ID(outside_0,IDB_HIOUTSIDE),{100,100}}, {CMN_ID(outside_1,IDB_HIOUTSIDE1),{100,100}}, {CMN_ID(outside_2,IDB_HIOUTSIDE2),{100,100}}, {CMN_ID(outside_3,IDB_MD1OUTSIDE),{128,128}}, {CMN_ID(outside_4,IDB_MD3OUTSIDE),{128,128}}, {CMN_ID(outside_5,IDB_MD4OUTSIDE),{96,96}}, }; BitmapSpec *World::outsides = World_outsides; static CMN_BITS_ID World_doorPixmapBits[W_ALL_DOORS_NUM] = { CMN_ID(door_0,IDB_HIDOOR1), CMN_ID(door_1,IDB_HIDOOR2), CMN_ID(door_2,IDB_MD1DOOR1), CMN_ID(door_3,IDB_MD1DOOR2), CMN_ID(door_4,IDB_MD2DOOR1), CMN_ID(door_5,IDB_MD2DOOR2), CMN_ID(door_6,IDB_MD3DOOR1), CMN_ID(door_7,IDB_MD3DOOR2), CMN_ID(door_8,IDB_MD4DOOR1), CMN_ID(door_9,IDB_MD4DOOR2), }; CMN_BITS_ID *World::doorPixmapBits = World_doorPixmapBits; static CMN_BITS_ID World_moverSquarePixmapBits[W_ALL_MOVER_SQUARES_NUM] = { CMN_ID(mover_square_0,IDB_HORIZMOVERSQUARE), CMN_ID(mover_square_1,IDB_VERTMOVERSQUARE), CMN_ID(mover_square_2,IDB_MD1HORIZMOVERSQUARE), CMN_ID(mover_square_3,IDB_MD1VERTMOVERSQUARE), CMN_ID(mover_square_4,IDB_MD2HORIZMOVERSQUARE), CMN_ID(mover_square_5,IDB_MD2VERTMOVERSQUARE), CMN_ID(mover_square_6,IDB_MD3HORIZMOVERSQUARE), CMN_ID(mover_square_7,IDB_MD3VERTMOVERSQUARE), CMN_ID(mover_square_8,IDB_MD4HORIZMOVERSQUARE), CMN_ID(mover_square_9,IDB_MD4VERTMOVERSQUARE), }; CMN_BITS_ID *World::moverSquarePixmapBits = World_moverSquarePixmapBits; static CMN_BITS_ID World_moverPixmapBits[W_ALL_MOVERS_NUM] = { CMN_ID(mover_0,IDB_MOVER), CMN_ID(mover_1,IDB_MD1MOVER), CMN_ID(mover_2,IDB_MD2MOVER), CMN_ID(mover_3,IDB_MD3MOVER), CMN_ID(mover_4,IDB_MD4MOVER), }; CMN_BITS_ID *World::moverPixmapBits = World_moverPixmapBits; // Must be multiples of 32, for absolutely no good reason. hardts static BitmapSpec World_posterPixmapBits[W_ALL_POSTERS_NUM] = { {CMN_ID(poster_0,IDB_SQUANCH_BIG),{160,96}}, {CMN_ID(poster_1,IDB_KILL_PARENTS),{64,64}}, {CMN_ID(poster_2,IDB_PENT),{32,32}}, {CMN_ID(poster_3,IDB_DROP_SCHOOL),{96,96}}, {CMN_ID(poster_4,IDB_WINNERS_DRUGS),{64,32}}, {CMN_ID(poster_5,IDB_SKULL),{64,64}}, {CMN_ID(poster_6,IDB_PYRAMID),{64,64}}, {CMN_ID(poster_7,IDB_VEGETABLES),{64,64}}, {CMN_ID(poster_8,IDB_NICE_DAY),{32,32}}, {CMN_ID(poster_9,IDB_BEAT_DOG),{128,32}}, {CMN_ID(poster_10,IDB_STRANGLE_CAT),{96,96}}, {CMN_ID(poster_11,IDB_TAKE_CANDY),{128,64}}, {CMN_ID(poster_12,IDB_BCEAGLE),{32,32}}, // The XEvil title screen, must be last. {CMN_ID(poster_13,IDB_TITLE),{352,160}}, }; BitmapSpec *World::posters = World_posterPixmapBits; // Although these values are not used directly by X11, we still need them // for acting as a server. static int default_backgroundIndices[] = {0,1,2,3,4,10,11,12,13}; static int default_outsideIndices[] = {0,1,2}; static int default_posterIndices[] = {0,1,2,3,4,5,6,7,8,9,10,11,12}; static int mayan_backgroundIndices[] = {5}; static int md1_backgroundIndices[] = {6}; static int md1_outsideIndices[] = {3}; static int md2_backgroundIndices[] = {7}; static int md2_outsideIndices[] = {4}; // reuse md4's outside static int md3_backgroundIndices[] = {8}; static int md3_outsideIndices[] = {4}; static int md4_backgroundIndices[] = {9}; static int md4_outsideIndices[] = {5}; static Theme World_themes[W_THEME_NUM] = { /** default theme */ { // Indices 0-6 MUST be here, in order, for the default theme. // Necessary to generate XPM files for UNIX correctly. {0,1,2,3,4,5,6}, /* blockIndices */ default_backgroundIndices, 9, /* backgroundsNum */ default_outsideIndices, 3, /* outsidesNum */ // doorBase MUST be 0 for default theme. 0, /* doorBase */ // moverSquareBase MUST be 0 for default theme. 0, /* moverSquareBase */ // moverIndex MUST be 0 for default theme. 0, /* moverIndex */ default_posterIndices, /* posterIndices */ 14, /* postersNum */ }, /** Mayan **/ { {0,7,8,3,4,9,6}, /* blockIndices */ mayan_backgroundIndices, 1, /* backgroundsNum */ default_outsideIndices, 3, /* outsidesNum */ 0, /* doorBase */ 0, /* moverSquareBase */ 0, /* moverIndex */ default_posterIndices, /* posterIndices */ 14, /* postersNum */ }, /** MD 1 **/ { {0,10,11,3,4,12,6}, /* blockIndices */ md1_backgroundIndices, 1, /* backgroundsNum */ md1_outsideIndices, 1, /* outsidesNum */ 2, /* doorBase */ 2, /* moverSquareBase */ 1, /* moverIndex */ default_posterIndices, /* posterIndices */ 14, /* postersNum */ }, /** MD 2 **/ { {0,13,14,3,4,15,6}, /* blockIndices */ md2_backgroundIndices, 1, /* backgroundsNum */ md2_outsideIndices, 1, /* outsidesNum */ 4, /* doorBase */ 4, /* moverSquareBase */ 2, /* moverIndex */ default_posterIndices, /* posterIndices */ 14, /* postersNum */ }, /** MD 3 **/ { {0,16,17,3,4,18,6}, /* blockIndices */ md3_backgroundIndices, 1, /* backgroundsNum */ md3_outsideIndices, 1, /* outsidesNum */ 6, /* doorBase */ 6, /* moverSquareBase */ 3, /* moverIndex */ default_posterIndices, /* posterIndices */ 14, /* postersNum */ }, /** MD 4 **/ { {0,19,20,3,4,21,6}, /* blockIndices */ md4_backgroundIndices, 1, /* backgroundsNum */ md4_outsideIndices, 1, /* outsidesNum */ 8, /* doorBase */ 8, /* moverSquareBase */ 4, /* moverIndex */ default_posterIndices, /* posterIndices */ 14, /* postersNum */ }, }; // Also in phys_mover.bitmaps, PhysMover::context.sizeMax #define W_MOVER_SPEED 5 #define W_MOVER_PAUSE_TIME 30 // Doesn't change, always two wsquares. const Size World::moverSize = {(2 * WSQUARE_WIDTH),WSQUARE_HEIGHT}; Boolean World::blockUseTransparent[W_BLOCKS_NUM] = { False, // Wempty False, // Wwall True, // Wladder False, // Woutside False, // Wsquanch False, // WupDown False, // WtextSquare }; xevil-2.02r2.orig/cmn/bitmaps/xit/0040755000175000017500000000000007637441100016327 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/xit/xit.bitmaps0100644000175000017500000000521707041425162020515 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/exit/exit_4.xpm" #endif Size Xit::get_size_max() { return context.fallingContext.movingContext.sizes[CO_air]; } PhysicalP Xit::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Xit(w,l,pos); assert(ret); return ret; } TouchableXdata Xit::xdata; const TouchableContext Xit::context = { /** TouchableContext **/ { /** FallingContext **/ { /** MovingContext **/ #if X11 "black",False, "white",True, #endif #if WIN32 RGB(0,0,0)/*"black"*/,False, RGB(255,255,255)/*"white"*/,True, #endif /* animMax */ {0,0,0,0,1}, /* sizes */ {{0,0},{0,0},{0,0},{0,0},{30,30},}, /* offsets */ {{0,0},{0,0},{0,0},{0,0},{0,0},}, /* pixmapBits */ {{0},{0},{0},{0},{CMN_ID(exit_4,IDB_XIT)},}, /* maskBits */ {{0},{0},{0},{0},{0},}, { /** PhysicalContext **/ 0, /* health */ 0, /* mass */ A_Xit, /* classId */ "exit", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {30,30}, /* sizeMax */ Xit::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ Xit::init_x, /* init_x */ Xit::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ }, }, }; xevil-2.02r2.orig/cmn/bitmaps/x_protection/0040755000175000017500000000000007637441100020240 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/x_protection/x_protection.bitmaps0100644000175000017500000000377407041425022024340 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #define X_PROTECTION_HEALTH 300 Size XProtection::get_size_max() { assert(0); return context.physicalContext.sizeMax; } PhysicalP XProtection::create(void *,WorldP,LocatorP,const Pos &) { assert(0); return NULL; } ProtectionXdata XProtection::xdata; const ProtectionContext XProtection::context = { /** ProtectionContext **/ #if X11 "red", /* colorName */ #endif #if WIN32 RGB(255,0,0), /* colorName */ #endif { /** PhysicalContext **/ 0, /* health */ 0, /* mass */ A_XProtection, /* classId */ "x-protection", /* clas */ False, /* transmogifyTarget */ False, /* doppelUser */ False, /* potentialHuman */ False, /* potentialEnemy */ 0, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {0,0}, /* sizeMax */ NProtection::create, /* create */ False, /* statsCreations */ False, /* statsUses */ False, /* statsDeaths */ NULL, /* get_stats */ NULL, /* arg */ XProtection::init_x, /* init_x */ XProtection::create_from_stream, /* create_from_stream */ }, }; xevil-2.02r2.orig/cmn/bitmaps/yeti/0040755000175000017500000000000007637441100016475 5ustar aaronlaaronlxevil-2.02r2.orig/cmn/bitmaps/yeti/yeti.bitmaps0100644000175000017500000001262607041424766021044 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #include "gen_xpm/yeti/yeti_0.xpm" #include "gen_xpm/yeti/yeti_0b.xpm" #include "gen_xpm/yeti/yeti_0c.xpm" #include "gen_xpm/yeti/yeti_0d.xpm" #include "gen_xpm/yeti/yeti_2.xpm" #include "gen_xpm/yeti/yeti_4.xpm" #include "gen_xpm/yeti/yeti_5.xpm" #include "gen_xpm/yeti/yeti_9.xpm" #include "gen_xpm/yeti/yeti_10.xpm" #include "gen_xpm/yeti/yeti_10b.xpm" #include "gen_xpm/yeti/yeti_10c.xpm" #include "gen_xpm/yeti/yeti_10d.xpm" #include "gen_xpm/yeti/yeti_10e.xpm" #include "gen_xpm/yeti/yeti_10f.xpm" #include "gen_xpm/yeti/yeti_18.xpm" #include "gen_xpm/yeti/yeti_20b.xpm" #include "gen_xpm/yeti/yeti_25.xpm" #endif Size Yeti::get_size_max() { return creatureContext.movingContext.physicalContext.sizeMax; } PhysicalP Yeti::create(void *,WorldP w,LocatorP l,const Pos &pos) { PhysicalP ret = new Yeti(w,l,pos); assert(ret); return ret; } CreatureXdata Yeti::creatureXdata; WalkingXdata Yeti::walkingXdata; PricklyXdata Yeti::pricklyXdata; AnimTimeXdata Yeti::animTimeXdata; SensitiveXdata Yeti::sensitiveXdata; const CreatureContext Yeti::creatureContext = { /** CreatureContext **/ 2, /* crawlSpeed */ 6, /* centerSpeed */ 13, /* airSpeed */ 3, /* climbSpeed */ 10, /* jump */ 1, /* acceleration */ 300, /* corpseHealth */ True, /* biological */ DROPLET_BLOOD, /* dropletType */ SoundNames::DEATH, {/** MovingContext **/ #if X11 "black",False, "tan",True, #endif #if WIN32 RGB(0,0,0),FALSE, RGB(128,0,0),TRUE, #endif /* animMax */ {4,4,1,1,1,1, #if 0 1, 10,10, #endif 0, 0,0, 1, 10,10, #if 0 1, 10,10, 1, 10,10, #endif 0, 0,0, 0, 0,0, 1, 2,2, 1,1, 2,2, 1, /* deadAnimMax */ }, /* sizes */ {{24,25},{24,25},{25,25},{25,25},{22,25},{22,25}, {19,20}, {19,25},{19,25}, {20,19}, {25,19},{25,19}, {19,20}, {19,25},{19,25}, {20,19}, {25,19},{25,19}, {16,25}, /* Must be */ {16,25},{16,25}, /* same size. */ {22,25},{22,25}, {16,25},{16,25}, {25,10}, /* deadSize */ }, {{0}}, /* offsets */ /* pixmapBits */ {{CMN_ID(yeti_0,IDB_YETI0),CMN_ID(yeti_0b,IDB_YETI0B), CMN_ID(yeti_0c,IDB_YETI0C),CMN_ID(yeti_0d,IDB_YETI0D)}, {PH_AUTO_GEN}, {CMN_ID(yeti_2,IDB_YETI2)},{PH_AUTO_GEN}, {CMN_ID(yeti_4,IDB_YETI4)},{CMN_ID(yeti_5,IDB_YETI5)}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(yeti_9,IDB_YETI9)}, {CMN_ID(yeti_10,IDB_YETI10),CMN_ID(yeti_10b,IDB_YETI10B), CMN_ID(yeti_10c,IDB_YETI10C),CMN_ID(yeti_10d,IDB_YETI10D), CMN_ID(yeti_10e,IDB_YETI10E),CMN_ID(yeti_10f,IDB_YETI10F), CMN_ID(yeti_10e,IDB_YETI10E), CMN_ID(yeti_10d,IDB_YETI10D),CMN_ID(yeti_10c,IDB_YETI10C), CMN_ID(yeti_10b,IDB_YETI10B), }, {PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {PH_AUTO_GEN}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(yeti_18,IDB_YETI18)}, {PH_AUTO_GEN},{CMN_ID(yeti_18,IDB_YETI18),CMN_ID(yeti_20b,IDB_YETI18B)}, {PH_AUTO_GEN},{PH_AUTO_GEN}, {CMN_ID(yeti_18,IDB_YETI18),CMN_ID(yeti_20b,IDB_YETI18B)},{PH_AUTO_GEN}, {CMN_ID(yeti_25,IDB_YETI25)}, /* deadPixmapBits */ }, /* maskBits */ {{0}}, {/** PhysicalContext **/ 350, /* health */ 400, /* mass */ A_Yeti, /* classId */ "yeti", /* clas */ True, /* transmogifyTarget */ True, /* doppelUser */ False, /* potentialHuman */ True, /* potentialEnemy */ 10, /* enemyWeight */ False, /* potentialWeapon */ False, /* potentialOtherItem */ 0.0f, /* objectWorldPercent */ 0, /* levelMaxTimes */ {25,25}, /* sizeMax */ Yeti::create, /* create */ False, /* statsCreations */ False, /* statsUses */ True, /* statsDeaths */ Yeti::get_stats, /* get_stats */ NULL, /* arg */ Yeti::init_x, /* init_x */ Yeti::create_from_stream, /* create_from_stream */ }, True, /* hiRes */ 0, /* offsetGenerator */ 0, /* transformOverride */ True, /* useXPM */ True, /* invisibility */ }, }; const WalkingContext Yeti::walkingContext = { 0, /* dummy */ }; const PricklyContext Yeti::pricklyContext = { 24, /* damage */ }; const AnimTimeContext Yeti::animTimeContext = { /** AnimTimeContext **/ 4, /* animTime */ }; const SensitiveContext Yeti::sensitiveContext = { /** SensitiveContext **/ 0, /* corporealMultiplier */ 4, /* heatMultiplier */ }; xevil-2.02r2.orig/cmn/actual.cpp0100644000175000017500000023326607041422214016044 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "actual.cpp" // Actual objects to be instantiated. #include "stdafx.h" #if X11 #ifndef NO_PRAGMAS #pragma implementation "actual.h" #endif #endif // Include Files #if X11 #include #endif #if WIN32 #include #include "resource.h" #endif #include "utils.h" #include "coord.h" #include "world.h" #include "physical.h" #include "actual.h" #include "sound_cmn.h" // Bitmap files. Also contain constants and some simple methods. // Most importantly, they contain the "contexts". #include "bitmaps/phys_mover/phys_mover.bitmaps" #include "bitmaps/explosion/explosion.bitmaps" #include "bitmaps/fire/fire.bitmaps" #include "bitmaps/fire_explosion/fire_explosion.bitmaps" #include "bitmaps/n_protection/n_protection.bitmaps" #include "bitmaps/t_protection/t_protection.bitmaps" #include "bitmaps/x_protection/x_protection.bitmaps" #include "bitmaps/shell/shell.bitmaps" #include "bitmaps/swap_shell/swap_shell.bitmaps" #include "bitmaps/lance/lance.bitmaps" #include "bitmaps/laser/laser.bitmaps" #include "bitmaps/frog_shell/frog_shell.bitmaps" #include "bitmaps/fireball/fireball.bitmaps" #include "bitmaps/missile/missile.bitmaps" #include "bitmaps/star/star.bitmaps" #include "bitmaps/blood/blood.bitmaps" #include "bitmaps/green_blood/green_blood.bitmaps" #include "bitmaps/oil_droplet/oil_droplet.bitmaps" #include "bitmaps/trapdoor/trapdoor.bitmaps" #include "bitmaps/home/home.bitmaps" #include "bitmaps/grenade/grenade.bitmaps" #include "bitmaps/napalm/napalm.bitmaps" #include "bitmaps/egg/egg.bitmaps" #include "bitmaps/xit/xit.bitmaps" #include "bitmaps/flag/flag.bitmaps" #include "bitmaps/rock/rock.bitmaps" #include "bitmaps/weight/weight.bitmaps" #include "bitmaps/altar_of_sin/altar_of_sin.bitmaps" #include "bitmaps/doppel/doppel.bitmaps" #include "bitmaps/cloak/cloak.bitmaps" #include "bitmaps/transmogifier/transmogifier.bitmaps" #include "bitmaps/med_kit/med_kit.bitmaps" #include "bitmaps/crack_pipe/crack_pipe.bitmaps" #include "bitmaps/caffine/caffine.bitmaps" #include "bitmaps/p_c_p/p_c_p.bitmaps" #include "bitmaps/n_shield/n_shield.bitmaps" #include "bitmaps/t_shield/t_shield.bitmaps" #include "bitmaps/bomb/bomb.bitmaps" #include "bitmaps/chainsaw/chainsaw.bitmaps" #include "bitmaps/pistol/pistol.bitmaps" #include "bitmaps/m_gun/m_gun.bitmaps" #include "bitmaps/lancer/lancer.bitmaps" #include "bitmaps/auto_lancer/auto_lancer.bitmaps" #include "bitmaps/f_thrower/f_thrower.bitmaps" #include "bitmaps/launcher/launcher.bitmaps" #include "bitmaps/grenades/grenades.bitmaps" #include "bitmaps/napalms/napalms.bitmaps" #include "bitmaps/stars/stars.bitmaps" #include "bitmaps/swapper/swapper.bitmaps" #include "bitmaps/frog_gun/frog_gun.bitmaps" #include "bitmaps/dog_whistle/dog_whistle.bitmaps" #include "bitmaps/demon_summoner/demon_summoner.bitmaps" #include "bitmaps/enforcer/enforcer.bitmaps" #include "bitmaps/frog/frog.bitmaps" #include "bitmaps/hero/hero.bitmaps" #include "bitmaps/ninja/ninja.bitmaps" #include "bitmaps/alien/alien.bitmaps" #include "bitmaps/hugger/hugger.bitmaps" #include "bitmaps/chopper_boy/chopper_boy.bitmaps" #include "bitmaps/seal/seal.bitmaps" #include "bitmaps/fire_demon/fire_demon.bitmaps" #include "bitmaps/dragon/dragon.bitmaps" #include "bitmaps/walker/walker.bitmaps" #include "bitmaps/dog/dog.bitmaps" #include "bitmaps/yeti/yeti.bitmaps" ///// Some helper macros to define creatures with certain abilities. #define DEFINE_CREATURE_CTORS_2(CLASSNAME,ABILITY0,ability0,ABILITY1,ability1) \ CLASSNAME::CLASSNAME(WorldP w,LocatorP l,const Pos &rawPos) \ : Creature(creatureContext,creatureXdata, \ new PtrList(new ABILITY0(ability0 ## Context,ability0 ## Xdata), \ new ABILITY1(ability1 ## Context,ability1 ## Xdata)), \ w,l,rawPos) {} \ \ CLASSNAME::CLASSNAME(InStreamP inStream,WorldP w,LocatorP l) \ : Creature(inStream,creatureContext,creatureXdata, \ w,l) {} #define DEFINE_CREATURE_CTORS_3(CLASSNAME,ABILITY0,ability0,ABILITY1,ability1,ABILITY2,ability2) \ CLASSNAME::CLASSNAME(WorldP w,LocatorP l,const Pos &rawPos) \ : Creature(creatureContext,creatureXdata, \ new PtrList(new ABILITY0(ability0 ## Context,ability0 ## Xdata), \ new ABILITY1(ability1 ## Context,ability1 ## Xdata), \ new ABILITY2(ability2 ## Context,ability2 ## Xdata)), \ w,l,rawPos) {} \ \ CLASSNAME::CLASSNAME(InStreamP inStream,WorldP w,LocatorP l) \ : Creature(inStream,creatureContext,creatureXdata, \ w,l) {} #define DEFINE_CREATURE_CTORS_4(CLASSNAME,ABILITY0,ability0,ABILITY1,ability1,ABILITY2,ability2,ABILITY3,ability3) \ CLASSNAME::CLASSNAME(WorldP w,LocatorP l,const Pos &rawPos) \ : Creature(creatureContext,creatureXdata, \ new PtrList(new ABILITY0(ability0 ## Context,ability0 ## Xdata), \ new ABILITY1(ability1 ## Context,ability1 ## Xdata), \ new ABILITY2(ability2 ## Context,ability2 ## Xdata), \ new ABILITY3(ability3 ## Context,ability3 ## Xdata)), \ w,l,rawPos) {} \ \ CLASSNAME::CLASSNAME(InStreamP inStream,WorldP w,LocatorP l) \ : Creature(inStream,creatureContext,creatureXdata, \ w,l) {} #define DEFINE_CREATURE_CTORS_5(CLASSNAME,ABILITY0,ability0,ABILITY1,ability1,ABILITY2,ability2,ABILITY3,ability3,ABILITY4,ability4) \ CLASSNAME::CLASSNAME(WorldP w,LocatorP l,const Pos &rawPos) \ : Creature(creatureContext,creatureXdata, \ new PtrList(new ABILITY0(ability0 ## Context,ability0 ## Xdata), \ new ABILITY1(ability1 ## Context,ability1 ## Xdata), \ new ABILITY2(ability2 ## Context,ability2 ## Xdata), \ new ABILITY3(ability3 ## Context,ability3 ## Xdata), \ new ABILITY4(ability4 ## Context,ability4 ## Xdata)), \ w,l,rawPos) {} \ \ CLASSNAME::CLASSNAME(InStreamP inStream,WorldP w,LocatorP l) \ : Creature(inStream,creatureContext,creatureXdata, \ w,l) {} PhysMover::PhysMover(WorldP w,LocatorP l,MoverP mover) : Physical(context,w,l) { moverId = mover->get_mover_id(); areaPrev = mover->get_area(); // state = AfterUpdate; state = BeforeAct; } PhysMover::PhysMover(InStreamP in,WorldP w,LocatorP l) : Physical(in,context,w,l) { state = AfterUpdate; _update_from_stream(in); } DEFINE_UPDATE_FROM_STREAM(PhysMover,Physical) void PhysMover::_update_from_stream(InStreamP in) { moverId.read(in); areaPrev.read(in); WorldP world = get_world(); MoverP mover = world->lookup(moverId); if (mover) { mover->update_from_stream(areaPrev); } } int PhysMover::get_write_length() { return Physical::get_write_length() + Identifier::get_write_length() + // moverId Area::get_write_length(); // area } void PhysMover::write(OutStreamP out) { Physical::write(out); // Not always true. Is true after a few turns? // if (state != AfterUpdate) { // cerr << "PhysMover: state should be AfterUpdate when write() is called." // << endl; //} Area area = get_area(); Area areaNext = get_area_next(); if (!(area == areaNext)) { cerr << "PhysMover: area should equal areaNext when write() is called." << endl; } moverId.write(out); area.write(out); } DEFINE_CREATE_FROM_STREAM(PhysMover) const Area &PhysMover::get_area() { if (state == AfterUpdate) return later_area(); else return earlier_area(); } const Area &PhysMover::get_area_next() { if (state == BeforeAct) return earlier_area(); else return later_area(); } Boolean PhysMover::collidable() { return False; } Boolean PhysMover::corporeal_attack(PhysicalP,int) { return False; } void PhysMover::heat_attack(PhysicalP,int,Boolean) {} void PhysMover::act() { // assert(state == BeforeAct); Fails at new level. state = BetweenActUpdate; } void PhysMover::update() { assert(state == BetweenActUpdate); state = AfterUpdate; } // Don't actually draw, Locator will draw the background for it. void PhysMover::draw(CMN_DRAWABLE,Xvars &,int,const Area &) { } void PhysMover::init_x(Xvars &,IXCommand,void*) { } const Area &PhysMover::earlier_area() { WorldP world = get_world(); MoverP mover = world->lookup(moverId); if (mover) { areaPrev = mover->get_area() - mover->get_vel(); } // Just to return something. return areaPrev; } const Area &PhysMover::later_area() { WorldP world = get_world(); MoverP mover = world->lookup(moverId); if (mover) { return mover->get_area(); } // Just to return something. return areaPrev; } void PhysMover::mover_clock() { // assert(state == AfterUpdate); // Don't assert, actually two mover_clock() calls before first act() call. state = BeforeAct; } Explosion::Explosion(WorldP w,LocatorP l,const Pos &mid, const Id &bomb_er,int r,int dMax) : Physical(context,w,l) { bomber = bomb_er; Pos pos; pos.x = mid.x - EXPLOSION_VISIBLE_RADIUS; pos.y = mid.y - EXPLOSION_VISIBLE_RADIUS; Size size; size.width = size.height = 2 * EXPLOSION_VISIBLE_RADIUS; Area narea(AR_RECT,pos,size); area = narea; middle = mid; radius = r; damageMax = dMax; } Explosion::Explosion(InStreamP in,WorldP w,LocatorP l) : Physical(in,context,w,l) { damageMax = 0; _update_from_stream(in); } DEFINE_UPDATE_FROM_STREAM(Explosion,Physical) void Explosion::_update_from_stream(InStreamP in) { area.read(in); middle.read(in); radius = in->read_short(); } int Explosion::get_write_length() { return Physical::get_write_length() + Area::get_write_length() + // area Pos::get_write_length() + // middle sizeof(short); // radius } void Explosion::write(OutStreamP out) { Physical::write(out); area.write(out); middle.write(out); assert(radius <= USHRT_MAX); out->write_short((u_short)radius); } DEFINE_CREATE_FROM_STREAM(Explosion) Boolean Explosion::collidable() { return False; } const Area &Explosion::get_area() { return area; } const Area &Explosion::get_area_next() { return area; } void Explosion::act() { PhysicalP nearby[OL_NEARBY_MAX]; int nitems; LocatorP locator = get_locator(); locator->get_nearby(nearby,nitems,this,radius); PhysicalP p = locator->lookup(bomber); int hit = 0; for (int n = 0; n < nitems; n++) { // Perhaps should check that nearby[n] is mapped. if (nearby[n]->collidable()) { const Area &otherArea = nearby[n]->get_area(); int distance = middle.distance(otherArea.get_middle()); assert (distance >= 0); nearby[n]->corporeal_attack(p,damageMax*(radius-distance)/radius); hit++; } } ostrstream msg; msg << "Explosion hits " << hit << " objects." << ends; locator->message_enq(msg.str()); kill_self(); Physical::act(); } void Explosion::init_x(Xvars &,IXCommand,void*) { } Fire::Fire(WorldP w,LocatorP l,const Pos &mid,Boolean coll) : Physical(context,w,l) { Pos pos; pos.x = mid.x - FIRE_DIAMETER_INIT / 2; pos.y = mid.y - FIRE_DIAMETER_INIT / 2; Size size; size.width = size.height = FIRE_DIAMETER_INIT; Area nArea(AR_RECT,pos,size); area = areaNext = nArea; isCollidable = coll; } Fire::Fire(InStreamP in,WorldP w,LocatorP l) : Physical(in,context,w,l) { isCollidable = False; _update_from_stream(in); } DEFINE_UPDATE_FROM_STREAM(Fire,Physical) void Fire::_update_from_stream(InStreamP in) { area.read(in); areaNext = area; } int Fire::get_write_length() { return Physical::get_write_length() + Area::get_write_length(); } void Fire::write(OutStreamP out) { Physical::write(out); assert(area == areaNext); area.write(out); } DEFINE_CREATE_FROM_STREAM(Fire) int Fire::get_damage() { return FIRE_DAMAGE; } const Area &Fire::get_area() { return area; } const Area &Fire::get_area_next() { return areaNext; } int Fire::get_drawing_level() { // Draw like everything else for now. return 1; } Boolean Fire::collidable() { return isCollidable; } void Fire::avoid(PhysicalP){ } void Fire::collide(PhysicalP other) { if (other->is_shot()) return; other->heat_attack(NULL,FIRE_HEAT,True); } Boolean Fire::corporeal_attack(PhysicalP,int) { return False; } void Fire::heat_attack(PhysicalP,int,Boolean) { } void Fire::act() { Pos pos; Size size; area.get_rect(pos,size); size.width -= (FIRE_RADIUS_DELTA * 2); size.height = size.width; if (size.width <= 0) { // Will be gone before next draw. kill_self(); } else { pos.x += FIRE_RADIUS_DELTA; pos.y += FIRE_VEL_Y; Area nArea(AR_RECT,pos,size); areaNext = nArea; } Physical::act(); } void Fire::update() { area = areaNext; Physical::update(); } FireExplosion::FireExplosion(WorldP w,LocatorP l, const Pos &rawPos,const Id &sh) : Physical(context,w,l) { shooter = sh; Area narea(AR_RECT,rawPos,Fireball::get_size()); area = narea; timer.set(F_THROWER_FIRE_TIME); } FireExplosion::FireExplosion(InStreamP in,WorldP w,LocatorP l) : Physical(in,context,w,l) { timer.set(1); _update_from_stream(in); } DEFINE_UPDATE_FROM_STREAM(FireExplosion,Physical) void FireExplosion::_update_from_stream(InStreamP in) { area.read(in); } int FireExplosion::get_write_length() { return Physical::get_write_length() + Area::get_write_length(); // area } void FireExplosion::write(OutStreamP out) { Physical::write(out); area.write(out); } DEFINE_CREATE_FROM_STREAM(FireExplosion) Boolean FireExplosion::collidable() { return False; } Boolean FireExplosion::corporeal_attack(PhysicalP,int) { return False; } void FireExplosion::heat_attack(PhysicalP,int,Boolean) { } const Area &FireExplosion::get_area() { return area; } const Area &FireExplosion::get_area_next() { return area; } void FireExplosion::draw(CMN_DRAWABLE,Xvars &,int,const Area &) { // Don't draw at all. } void FireExplosion::act() { if (timer.ready()) { kill_self(); } // Create fireballs going in both directions. else { WorldP world = get_world(); LocatorP locator = get_locator(); PhysicalP left = new Fireball(world,locator,area.get_pos(),shooter,CO_L); PhysicalP right = new Fireball(world,locator,area.get_pos(),shooter,CO_R); assert(left && right); locator->add(left); locator->add(right); } timer.clock(); Physical::act(); } void FireExplosion::init_x(Xvars &,IXCommand,void*) { } NProtection::NProtection(WorldP w,LocatorP l,const Area &area) : Protection(context,xdata,w,l,area) { n = N_PROTECTION_N; } CONSTRUCTOR_LEAF_IO(NProtection,Protection) { n = 0; } DEFINE_CREATE_FROM_STREAM(NProtection) Boolean NProtection::corporeal_protect(int) { assert(n >= 0); if (n <= 0) { return False; } n--; if (n == 0 ) { kill_self(); } return True; } Boolean NProtection::heat_protect(int,Boolean) { assert(n >= 0); return False; } void NProtection::init_x(Xvars &xvars,IXCommand command,void* arg) { Protection::init_x(xvars,command,arg,context,xdata); } TProtection::TProtection(WorldP w,LocatorP l,const Area &area) : Protection(context,xdata,w,l,area) { timer.set(T_PROTECTION_TIME); } CONSTRUCTOR_LEAF_IO(TProtection,Protection) { } DEFINE_CREATE_FROM_STREAM(TProtection) void TProtection::act() { if (timer.ready()) { kill_self(); } timer.clock(); Protection::act(); } Boolean TProtection::corporeal_protect(int) { return True; } Boolean TProtection::heat_protect(int,Boolean) { return True; } void TProtection::init_x(Xvars &xvars,IXCommand command,void* arg) { Protection::init_x(xvars,command,arg,context,xdata); } XProtection::XProtection(WorldP w,LocatorP l,const Area &area) : Protection(context,xdata,w,l,area) { health = X_PROTECTION_HEALTH; } CONSTRUCTOR_LEAF_IO(XProtection,Protection) { } DEFINE_CREATE_FROM_STREAM(XProtection) Boolean XProtection::corporeal_protect(int damage) { health -= damage; if (health <= 0) { kill_self(); } return True; } Boolean XProtection::heat_protect(int heat,Boolean) { // Approximate the amount of damage the heat attack would do. int damage = heat * Fire::get_damage(); return XProtection::corporeal_protect(damage); } void XProtection::init_x(Xvars &xvars,IXCommand command,void* arg) { Protection::init_x(xvars,command,arg,context,xdata); } Rock::Rock(WorldP w,LocatorP l,const Pos &pos) : Liftable(context,xdata,w,l,pos) { } CONSTRUCTOR_LEAF_IO(Rock,Liftable) { } DEFINE_CREATE_FROM_STREAM(Rock) void Rock::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.heavyContext.fallingContext.movingContext, xdata); } Weight::Weight(WorldP w,LocatorP l,const Pos &pos) : Liftable(context,xdata,w,l,pos) {} CONSTRUCTOR_LEAF_IO(Weight,Liftable) { } DEFINE_CREATE_FROM_STREAM(Weight) void Weight::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.heavyContext.fallingContext.movingContext, xdata); } DoubleSpeed::DoubleSpeed(int timed) : Doubler(timed) { multiplier = 1.5f; increment = 0.5f; } ModifierId DoubleSpeed::get_modifier_id() { return M_DoubleSpeed; } int DoubleSpeed::apply(Attribute attr,int val) { switch (attr) { case ACCELERATION: case AIR_SPEED: case CENTER_SPEED: case CLIMB_SPEED: case CRAWL_SPEED: val = (int)(val * multiplier); break; }; if (next) return next->apply(attr,val); else return val; } ModifierId DoubleJump::get_modifier_id() { return M_DoubleJump; } int DoubleJump::apply(Attribute attr,int val) { switch (attr) { // Side effect that flying creatures get an extra boost, but AltarOfSin // doesn't give DoubleJump to Flying creatures. case AIR_SPEED: case JUMP: val = (int)(val * multiplier); break; } if (next) return next->apply(attr,val); else return val; } ModifierId DoubleHealth::get_modifier_id() { return M_DoubleHealth; } int DoubleHealth::apply(Attribute attr,int val) { if (attr == HEALTH_MAX) { val = (int)(val * multiplier); } if (next) return next->apply(attr,val); else return val; } AltarOfSin::AltarOfSin(WorldP w,LocatorP l,const Pos &pos) : Heavy(context,xdata,w,l,pos) { turnTaken = False; } CONSTRUCTOR_LEAF_IO(AltarOfSin,Heavy) { turnTaken = False; } DEFINE_CREATE_FROM_STREAM(AltarOfSin) Boolean AltarOfSin::corporeal_attack(PhysicalP other,int) { /* Don't fuck with the Altar of Sin. */ if (turnTaken) { return False; } IntelP intel; if (other && (other->get_class_id() != A_AltarOfSin) && (intel = other->get_intel())) { LocatorP locator = get_locator(); ostrstream str; // Turned into a frog/baby seal. if (Utils::coin_flip() && other->is_moving() && // Don't frog a frog, or something that has already been morphed. other->get_class_id() != A_Frog && other->get_class_id() != A_Seal && !other->get_ability(AB_Morphed)) { Boolean doFrog = Utils::coin_flip(); str << intel->get_name() << " attacks the Altar of Sin and is " << "turned into a " << (doFrog ? "frog" : "baby-seal") << "." << ends; locator->message_enq(str.str()); other->set_intel(NULL); if (!other->get_mapped()) { cerr << "Warning:AltarOfSin::corporeal_attack: object " << "should be mapped." << endl; } other->set_mapped_next(False); const Area &area = other->get_area(); PhysicalP morph; if (doFrog) { Pos pos = area.get_middle() - 0.5f * Frog::get_size_max(); morph = new Frog(get_world(),locator,pos); } else { Pos pos = area.get_middle() - 0.5f * Seal::get_size_max(); morph = new Seal(get_world(),locator,pos); } assert(morph); // Give frog the morphed ability, so it will eventually turn back. AbilityP morphed = new Morphed(FrogShell::morphedContext,Morphed::defaultXdata,other); ((CreatureP)morph)->add_ability(morphed); morph->set_intel(intel); locator->add(morph); } // Lose all health. else { str << "BLASPHMER! " << intel->get_name() << " loses health for daring to attack the Altar of Sin." << ends; locator->message_enq(str.str()); int damage = other->get_health(); other->corporeal_attack(this,damage); } locator->arena_message_enq(Utils::strdup("Don't FUCK with the Altar of Sin"), other); turnTaken = True; } return True; } void AltarOfSin::heat_attack(PhysicalP,int,Boolean){ } void AltarOfSin::collide(PhysicalP other) { IntelP intel; if (!turnTaken && other->is_creature() && (intel = other->get_intel()) && intel->is_human()) { int lives = intel->get_lives(); LocatorP locator = get_locator(); ostrstream msg; ostrstream arenaMsg; // Choose different blessings to give. int n = 0; Boolean ok = False; while (!ok && n < ALTAR_OF_SIN_TRIES) { n++; ok = True; ModifierP mod; /*** Appending to the Intel's or Creature's modifier list. ***/ ModifierP modList = intel->get_modifiers(); assert(modList); ModifierP pModList = ((CreatureP)other)->get_modifiers(); assert(pModList); int which = Utils::choose(9); switch (which) { // extra life or extra kills. case 0: // If human has infinite lives, give him some points(kills) instead. if (lives == IT_INFINITE_LIVES) { #if 0 for (int m = 0; m < ALTAR_OF_SIN_KILLS; m++) { intel->add_human_kill(); } msg << intel->get_name() << " sells soul for " << ALTAR_OF_SIN_KILLS << " kills." << ends; arenaMsg << "You Gain " << ALTAR_OF_SIN_KILLS << " Kills" << ends; #endif // Everybody hates the "You Gain 5 Kills" thing. So, I removed it. ok = False; } else { intel->set_lives(lives + 1); msg << intel->get_name() << " sells soul for an extra life." << ends; arenaMsg << "You Sold Your Soul For an Extra Life" << ends; } break; // double speed case 1: mod = new DoubleSpeed(); assert(mod); modList->append_unique(mod); msg << intel->get_name() << " sells soul for Double Speed." << ends; arenaMsg << "Double Speed" << ends; break; // extra jump case 2: if (other->get_ability(AB_Flying) || other->get_ability(AB_Grounded)) { // extra jump is useless or nearly so. ok = False; break; } mod = new DoubleJump(); assert(mod); modList->append_unique(mod); msg << intel->get_name() << " sells soul for extra jumping powers." << ends; arenaMsg << "Extra Jumping Powers" << ends; break; // double maximum health case 3: mod = new DoubleHealth(); assert(mod); // Add to Creature's modifiers because of problems with // initializing health when transferred from one physical // to another. pModList->append_unique(mod); // So max health takes effect immediately. other->heal(); msg << intel->get_name() << " sells soul for Double Health." << ends; arenaMsg << "Double Health" << ends; break; // Healing powers case 4: { // Already has healing powers. if (other->get_ability(AB_Healing)) { ok = False; break; } AbilityP h = new Healing(Hero::healingContext,Healing::defaultXdata); // Already checked that other is a Creature(). ((CreatureP)other)->add_ability(h); // Might as well make sure they can take advantage of it now. other->heal(); msg << intel->get_name() << " sells soul for Healing Powers." << ends; arenaMsg << "Healing Powers" << ends; } break; // HellFire case 5: { // Already has OnFire powers. if (other->get_ability(AB_OnFire)) { ok = False; break; } AbilityP a = new OnFire(FireDemon::onFireContext,OnFire::defaultXdata); // Already checked that other is a Creature(). ((CreatureP)other)->add_ability(a); msg << intel->get_name() << " sells soul for HellFire Powers." << ends; arenaMsg << "HellFire Powers" << ends; } break; // Fireballs case 6: { // Already has BuiltIn weapon if (other->get_ability(AB_BuiltIn)) { ok = False; break; } // Don't want to be BuiltIn and Fighter at the same time. AbilityP fighter = other->get_ability(AB_Fighter); if (fighter) { ((CreatureP)other)->remove_ability(AB_Fighter); } AbilityP a = new BuiltIn(FireDemon::builtInContext,BuiltIn::defaultXdata); // Already checked that other is a Creature(). ((CreatureP)other)->add_ability(a); msg << intel->get_name() << " sells soul for Fireballs." << ends; arenaMsg << "Fireballs" << ends; } break; // Flying powers case 7: { // Already has flying powers. if (other->get_ability(AB_Flying)) { ok = False; break; } // Remove the existing Locomotion LocomotionP l = other->get_locomotion(); if (l) { ((CreatureP)other)->remove_ability(l->get_ability_id()); } // else something is wrong. AbilityP a = new Flying(ChopperBoy::flyingContext,Flying::defaultXdata); // Already checked that other is a Creature(). ((CreatureP)other)->add_ability(a); msg << intel->get_name() << " sells soul for Flying Powers." << ends; arenaMsg << "Flying Powers" << ends; } break; // Sticky ability case 8: { // Already has sticky. // Also, don't kill off Flying to replace with Sticky. if (other->get_ability(AB_Sticky) || other->get_ability(AB_Flying)) { ok = False; break; } // Has to have all the bitmaps required for Sticky, e.g. // climbing on the walls and ceiling. if (!Sticky::has_required_frames(((MovingP)other)->get_moving_context())) { ok = False; break; } // Remove the existing Locomotion LocomotionP l = other->get_locomotion(); if (l) { ((CreatureP)other)->remove_ability(l->get_ability_id()); } // else something is wrong. AbilityP a = new Sticky(Ninja::stickyContext,Sticky::defaultXdata); // Already checked that other is a Creature(). ((CreatureP)other)->add_ability(a); msg << intel->get_name() << " sells soul for Sticky Powers." << ends; arenaMsg << "Sticky Powers" << ends; } break; default: ok = False; // try again. } } // while locator->message_enq(msg.str()); locator->arena_message_enq(arenaMsg.str(),other); kill_self(); turnTaken = True; } else { Heavy::collide(other); } } void AltarOfSin::update() { turnTaken = False; Heavy::update(); } void AltarOfSin::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.fallingContext.movingContext, xdata); } Doppel::Doppel(WorldP w,LocatorP l,const Pos &pos) : AutoUse(context,xdata,w,l,pos) {} CONSTRUCTOR_LEAF_IO(Doppel,AutoUse) { } DEFINE_CREATE_FROM_STREAM(Doppel) void Doppel::use(PhysicalP p) { assert(p && p->get_intel()); // If p is not allowed to use doppelgangers, just return. const PhysicalContext *usersPC = p->get_context(); if (!usersPC->doppelUser) { return; } stats.add_use(); WorldP world = get_world(); LocatorP locator = get_locator(); IntelP masterIntel = p->get_intel(); PhysicalP obj = create_physical(p->get_area(),p); NeutralP neutral = new DoppelIntel(world,locator,"Doppel", &DoppelIntel::suggestedOptions,DoppelIntel::suggestedMask, masterIntel); assert(neutral); locator->register_neutral(neutral); locator->add(obj); obj->set_intel(neutral); // obj->set_dont_collide(p); // Use the dont_collide functions of the intel, not the physical. neutral->set_dont_collide(masterIntel->get_intel_id()); kill_self(); Item::use(p); } // New version which uses the PhysicalContext create function // More general and easy to extend. PhysicalP Doppel::create_physical(const Area &area,PhysicalP original) { WorldP world = get_world(); LocatorP locator = get_locator(); Pos middle = area.get_middle(); PhysicalP obj; // Get the PhysicalContext(description of its class) of the original const PhysicalContext *originalContext = original->get_context(); // Use the original's PhysicalContext to create a new object. obj = originalContext->create(originalContext->arg,world,locator, middle - 0.5f * originalContext->sizeMax); assert(obj); return obj; } void Doppel::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.itemContext.fallingContext.movingContext, xdata); } Stats Doppel::stats; Cloak::Cloak(WorldP w,LocatorP l,const Pos &pos) : Item(context,xdata,w,l,pos) {} CONSTRUCTOR_LEAF_IO(Cloak,Item) { } DEFINE_CREATE_FROM_STREAM(Cloak) void Cloak::use(PhysicalP p) { assert(p->is_moving()); // Destroy any protection p may be using. LocatorP l = get_locator(); PhysicalP prot = l->lookup(((MovingP)p)->get_protection()); if (prot) { prot->kill_self(); } // Only make invisible if the Object supports invisibilty. // Don't bother doing anything on an already invisible user. if (((MovingP)p)->supports_invisibility() && !((MovingP)p)->is_invisible()) { ((MovingP)p)->set_invisible_next(PH_INVISIBLE_TIME); // So p will stop being invisible when p attacks something. ((MovingP)p)->set_attack_hook(attack_hook); stats.add_use(); } kill_self(); Item::use(p); } void Cloak::attack_hook(PhysicalP p) { assert(p->is_moving()); // Means turn it off. ((MovingP)p)->set_invisible_next(-1); } void Cloak::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.fallingContext.movingContext, xdata); } Stats Cloak::stats; Transmogifier::Transmogifier(WorldP w,LocatorP l,const Pos &pos) : AutoUse(context,xdata,w,l,pos) {} CONSTRUCTOR_LEAF_IO(Transmogifier,AutoUse) { } DEFINE_CREATE_FROM_STREAM(Transmogifier) void Transmogifier::use(PhysicalP other) { assert(other->alive()); stats.add_use(); IntelP intel = other->get_intel(); // Must check that other does not have protection against swapping. if (intel && !other->swap_protect()) { LocatorP locator = get_locator(); const Area &area = other->get_area(); // Don't transmogify something into a new object of the same class // it already is. That's boring. PhysicalP p = new_physical(area.get_middle(),other->get_class_id()); locator->add(p); p->set_intel(intel); other->set_intel(NULL); other->drop_all(); other->set_quiet_death(); other->kill_self(); } kill_self(); AutoUse::use(other); } // New version which uses Locator::filter_contexts. // More general and easy to extend. PhysicalP Transmogifier::new_physical(const Pos &middle,ClassId notThis) { const PhysicalContext *list[A_CLASSES_NUM]; int size; LocatorP l = get_locator(); WorldP w = get_world(); // Get list of all classes that are potential transmogify targets. size = l->filter_contexts(list,NULL,transmogify_target_filter, (void*)notThis); // Something is wrong if size == 0, because there are no classes to // transmogify into. assert(size); // Randomly choose. int which = Utils::choose(size); // Create object centered on middle. Pos pos = middle - 0.5f * list[which]->sizeMax; // Make sure a create function exists. assert(list[which]->create); PhysicalP obj = list[which]->create(list[which]->arg,w,l,pos); return obj; } Boolean Transmogifier::transmogify_target_filter(const PhysicalContext *pc, void *closure) { // notThis is used to prevent transmogifying into the same class an object // already is. ClassId notThis = (ClassId)closure; if (pc->classId == notThis) { return False; } return pc->transmogifyTarget; } void Transmogifier::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.itemContext.fallingContext.movingContext, xdata); } Stats Transmogifier::stats; MedKit::MedKit(WorldP w,LocatorP l,const Pos &pos) : AutoUse(context,xdata,w,l,pos) { } CONSTRUCTOR_LEAF_IO(MedKit,AutoUse) { } DEFINE_CREATE_FROM_STREAM(MedKit) void MedKit::use(PhysicalP p) { stats.add_use(); assert(p->alive()); p->heal(); kill_self(); AutoUse::use(p); } void MedKit::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.itemContext.fallingContext.movingContext, xdata); } Stats MedKit::stats; Crack::Crack() : Modifier(CRACK_TIME) {} ModifierId Crack::get_modifier_id() { return M_Crack; } int Crack::apply(Attribute attr,int val) { switch (attr) { case ACCELERATION: case AIR_SPEED: case CENTER_SPEED: case CLIMB_SPEED: case CRAWL_SPEED: // Using *= gives warnings on some compilers. val = (int)(val * 2.0); break; case JUMP: val = (int)(val * 1.5); break; case DAMAGE: val = val * 2; break; case HIGH: val = 1; // Creature is high. break; }; if (next) return next->apply(attr,val); else return val; } CrackPipe::CrackPipe(WorldP w,LocatorP l,const Pos &pos) : Drugs(context,xdata,w,l,pos) {} CONSTRUCTOR_LEAF_IO(CrackPipe,Drugs) { } DEFINE_CREATE_FROM_STREAM(CrackPipe) ModifierP CrackPipe::create_modifier() { stats.add_use(); ModifierP crack = new Crack(); assert(crack); return crack; } void CrackPipe::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.autoUseContext.itemContext.fallingContext.movingContext, xdata); } Stats CrackPipe::stats; CaffineM::CaffineM() : Modifier(CAFFINE_M_TIME) {} ModifierId CaffineM::get_modifier_id() { return M_CaffineM; } int CaffineM::apply(Attribute attr,int val) { switch (attr) { case ACCELERATION: case AIR_SPEED: case CENTER_SPEED: case CLIMB_SPEED: case CRAWL_SPEED: // Using *= gives warnings on some compilers. val = (int)(val * 1.4); break; case JUMP: val = (int)(val * 1.3); break; case HIGH: val = 1; // Creature is high. break; }; if (next) return next->apply(attr,val); else return val; } Caffine::Caffine(WorldP w,LocatorP l,const Pos &pos) : Drugs(context,xdata,w,l,pos) {} CONSTRUCTOR_LEAF_IO(Caffine,Drugs) { } DEFINE_CREATE_FROM_STREAM(Caffine) ModifierP Caffine::create_modifier() { stats.add_use(); ModifierP m = new CaffineM(); assert(m); return m; } void Caffine::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.autoUseContext.itemContext.fallingContext.movingContext, xdata); } Stats Caffine::stats; PCPM::PCPM() : Modifier(PCP_M_TIME) {} ModifierId PCPM::get_modifier_id() { return M_PCPM; } int PCPM::apply(Attribute attr,int val) { switch (attr) { case HIGH: val = 1; // Creature is high. break; case CORPOREAL_ATTACK: if (val > 0) { // Turn damage into "superficial damage". val = -val; } break; case DAMAGE: val = val * 2; break; case HEAT_ATTACK: val = 0; break; }; if (next) { return next->apply(attr,val); } else { return val; } } void PCPM::preDie(PhysicalP p) { // Whack off half of health. p->corporeal_attack(NULL,p->get_health() / 2); } PCP::PCP(WorldP w,LocatorP l,const Pos &pos) : Drugs(context,xdata,w,l,pos) { } CONSTRUCTOR_LEAF_IO(PCP,Drugs) { } DEFINE_CREATE_FROM_STREAM(PCP) ModifierP PCP::create_modifier() { stats.add_use(); ModifierP m = new PCPM(); assert(m); return m; } void PCP::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.autoUseContext.itemContext.fallingContext.movingContext, xdata); } Stats PCP::stats; NShield::NShield(WorldP w,LocatorP l,const Pos &pos) : Shield(context,xdata,w,l,pos) { } CONSTRUCTOR_LEAF_IO(NShield,Shield) { } DEFINE_CREATE_FROM_STREAM(NShield); void NShield::use(PhysicalP p) { stats.add_use(); Shield::use(p); } ProtectionP NShield::create_protection(const Area &area) { ProtectionP pr = new NProtection(get_world(),get_locator(),area); assert(pr); return pr; } void NShield::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg, context.autoUseContext.itemContext.fallingContext.movingContext, xdata); } Stats NShield::stats; TShield::TShield(WorldP w,LocatorP l,const Pos &pos) : Shield(context,xdata,w,l,pos) { } CONSTRUCTOR_LEAF_IO(TShield,Shield) { } DEFINE_CREATE_FROM_STREAM(TShield) void TShield::use(PhysicalP p) { stats.add_use(); Shield::use(p); } ProtectionP TShield::create_protection(const Area &area) { ProtectionP pr = new TProtection(get_world(),get_locator(),area); assert(pr); return pr; } void TShield::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg, context.autoUseContext.itemContext.fallingContext.movingContext, xdata); } Stats TShield::stats; Bomb::Bomb(WorldP w,LocatorP l,const Pos &p) : Animated(context,xdata,w,l,p,BOMB_FRAME_INACTIVE) { // set_frame(BOMB_FRAME_INACTIVE); // set_frame_next(BOMB_FRAME_INACTIVE); frame = BOMB_FRAME_INACTIVE; Timer ntimer(BOMB_TIME); timer = ntimer; active = False; defused = False; } CONSTRUCTOR_LEAF_IO(Bomb,Animated) { active = False; defused = False; } DEFINE_CREATE_FROM_STREAM(Bomb) Boolean Bomb::is_bomb() { return True; } void Bomb::use(PhysicalP bomberP) { if (!active) { frame = BOMB_FRAME_ACTIVE; timer.set(); active = True; if (bomberP) { bomber = bomberP->get_id(); } LocatorP locator = get_locator(); #if 0 // Don't send the 4,3,2,etc to to message bar anymore. ostrstream msg; msg << frame << ends; locator->message_enq(msg.str()); #endif set_cant_take(); } Animated::use(bomberP); } void Bomb::act() { if (active) timer.clock(); if (active && timer.ready()) { if (! frame) { kill_self(); } else { timer.set(); frame--; #if 0 LocatorP locator = get_locator(); ostrstream msg; msg << frame << ends; locator->message_enq(msg.str()); #endif } } set_frame_next(frame); Animated::act(); } void Bomb::set_quiet_death() { defused = True; Animated::set_quiet_death(); } void Bomb::die() { if (!defused) { // Kind of a hack, recording bombs that exploded, not bombs that // were used. stats.add_use(); WorldP world = get_world(); LocatorP locator = get_locator(); const Area area = get_area(); PhysicalP explosion = new Explosion(world,locator,area.get_middle(),bomber, BOMB_EXPLOSION_RADIUS,BOMB_EXPLOSION_DAMAGE_MAX); assert (explosion); locator->add(explosion); } Animated::die(); } void Bomb::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg, context.itemContext.fallingContext.movingContext, xdata); } Stats Bomb::stats; Trapdoor::Trapdoor(WorldP w,LocatorP l,const Pos &pos,const Id &home_id) : Moving(context,xdata,w,l,pos) { Timer nTimer(TRAPDOOR_TIME); timer = nTimer; timer.set(); sealsNum = 0; homeId = home_id; } CONSTRUCTOR_LEAF_IO(Trapdoor,Moving) { sealsNum = 0; } DEFINE_CREATE_FROM_STREAM(Trapdoor) Boolean Trapdoor::collidable() { return False; } int Trapdoor::get_drawing_level() { return 0; } void Trapdoor::append_seals_out(int &num,IntelId *lems) { // num starts out at the correct initial value. for (int i = 0; i < sealsNum; i++, num++) { lems[num] = seals[i]; } } void Trapdoor::act() { if (timer.ready() && sealsNum < SEALS_MAX) { LocatorP l = get_locator(); WorldP w = get_world(); const Area &area = get_area(); Pos pos = area.get_middle(); Size sealSize = Seal::get_size_max(); pos.x -= sealSize.width / 2; pos.y += sealSize.height; PhysicalP seal = new Seal(w,l,pos); assert(seal); char sealStr[20]; ostrstream str(sealStr,20); str << "seal-" << sealsNum << ends; NeutralP sealIntel = new SealIntel(w,l,sealStr,homeId); seal->set_intel(sealIntel); l->register_neutral(sealIntel); seals[sealsNum] = sealIntel->get_intel_id(); l->add(seal); sealsNum++; timer.set(); } timer.clock(); Moving::act(); } void Trapdoor::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context, xdata); } Home::Home(WorldP w,LocatorP l,const Pos &pos) : Moving(context,xdata,w,l,pos) { sealsSafe = 0; } CONSTRUCTOR_LEAF_IO(Home,Moving) { sealsSafe = 0; } DEFINE_CREATE_FROM_STREAM(Home) Boolean Home::collidable() { return False; } int Home::get_drawing_level() { return 0; } void Home::act() { PhysicalP nearby[OL_NEARBY_MAX]; int nItems; LocatorP locator = get_locator(); locator->get_nearby(nearby,nItems,this,HOME_RADIUS); for (int n = 0; n < nItems; n++) { IntelP intel = nearby[n]->get_intel(); if (intel && intel->is_seal_intel()) { nearby[n]->set_quiet_death(); nearby[n]->kill_self(); sealsSafe++; } } Moving::act(); } void Home::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context, xdata); } Shell::Shell(WorldP w,LocatorP l,const Pos &p,const Id &shooter, Dir d) : Shot(context,xdata,w,l,p,shooter,d) { stats.add_creation(); } CONSTRUCTOR_LEAF_IO(Shell,Shot) { } DEFINE_CREATE_FROM_STREAM(Shell) void Shell::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.movingContext, xdata); } Stats Shell::stats; SwapShell::SwapShell(WorldP w,LocatorP l,const Pos &p, const Id &sh,const Id &sw,Dir d) : Shot(context,xdata,w,l,p,sh,d) { swapper = sw; stats.add_creation(); } CONSTRUCTOR_LEAF_IO(SwapShell,Shot) { } DEFINE_CREATE_FROM_STREAM(SwapShell) void SwapShell::collide(PhysicalP other) { if (other->is_shot()) { return; } LocatorP locator = get_locator(); const Id &shooter = get_shooter(); PhysicalP shooterP; // Do nothing if shooter no longer exists. if (!other->swap_protect() && (shooterP = locator->lookup(shooter))) { // Swap souls. IntelP tmp = other->get_intel(); /* Don't swap unless both shooter and other have intelligence. */ if (tmp && shooterP->get_intel()) { other->set_intel(shooterP->get_intel()); shooterP->set_intel(tmp); // Destroy swapper. PhysicalP swapperP = locator->lookup(swapper); if (swapperP) { swapperP->kill_self(); } } } kill_self(); } void SwapShell::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.movingContext, xdata); } Stats SwapShell::stats; Lance::Lance(WorldP w,LocatorP l,const Pos &p,const Id &shooter,Dir d) : Shot(context,xdata,w,l,p,shooter,d,d) { stats.add_creation(); } CONSTRUCTOR_LEAF_IO(Lance,Shot) { } DEFINE_CREATE_FROM_STREAM(Lance) // This function is also used by Laser::compute_weapon_dir(). Dir Lance::compute_weapon_dir(ITcommand command) { switch (command) { case IT_WEAPON_R: return CO_R; case IT_WEAPON_DN_R: return CO_DN_R_R; case IT_WEAPON_DN: return CO_DN; case IT_WEAPON_DN_L: return CO_DN_L_L; case IT_WEAPON_L: return CO_L; case IT_WEAPON_UP_L: return CO_UP_L_L; case IT_WEAPON_UP: return CO_UP; case IT_WEAPON_UP_R: return CO_UP_R_R; }; return CO_air; } void Lance::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.movingContext, xdata); } Stats Lance::stats; Laser::Laser(WorldP w,LocatorP l,const Pos &p,const Id &shooter,Dir d) : Shot(context,xdata,w,l,p,shooter,d,d) { stats.add_creation(); } CONSTRUCTOR_LEAF_IO(Laser,Shot) { } DEFINE_CREATE_FROM_STREAM(Laser) Dir Laser::compute_weapon_dir(ITcommand command) { // Kind of a hack. return Lance::compute_weapon_dir(command); } void Laser::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.movingContext,xdata); } Stats Laser::stats; FrogShell::FrogShell(WorldP w,LocatorP l,const Pos &p, const Id &shooter,const Id &frog_gun,Dir d) : Shot(context,xdata,w,l,p,shooter,d) { frogGun = frog_gun; stats.add_creation(); } CONSTRUCTOR_LEAF_IO(FrogShell,Shot) { } DEFINE_CREATE_FROM_STREAM(FrogShell) void FrogShell::collide(PhysicalP other) { // Be careful not to frog a Frog, or something that is already morphed. if (other->is_shot() || other->get_class_id() == A_Frog || other->get_ability(AB_Morphed)) { return; } IntelP intel = other->get_intel(); if (!other->frog_protect() && intel && other->is_moving()) { other->set_intel(NULL); assert(other->get_mapped()); other->set_mapped_next(False); const Area &area = other->get_area(); Pos pos = area.get_middle() - 0.5f * Frog::get_size_max(); LocatorP locator = get_locator(); PhysicalP frog = new Frog(get_world(),locator,pos); assert(frog); // Give frog the morphed ability, so it will eventually turn back. AbilityP morphed = new Morphed(morphedContext,Morphed::defaultXdata,other); ((CreatureP)frog)->add_ability(morphed); frog->set_intel(intel); locator->add(frog); // Destroy frogGun. PhysicalP p; if (p = locator->lookup(frogGun)) { p->kill_self(); } } kill_self(); } void FrogShell::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.movingContext, xdata); } Stats FrogShell::stats; Fireball::Fireball(WorldP w,LocatorP l,const Pos &p,const Id &shooter, Dir d,int h,int t,Boolean hOnFire) : Shot(context,xdata,w,l,p,shooter,d) { if (t == -1) { timer.set(FIREBALL_TIME); } else { timer.set(t); } if (h == -1) { heat = FIREBALL_HEAT; } else { heat = h; } hurtOnFire = hOnFire; } CONSTRUCTOR_LEAF_IO(Fireball,Shot) { heat = 0; hurtOnFire = False; } DEFINE_CREATE_FROM_STREAM(Fireball) void Fireball::collide(PhysicalP other) { // Fireballs are not destroyed by shots. if (other->is_shot() && other->get_class_id() != A_Missile) { return; } LocatorP locator = get_locator(); PhysicalP p = locator->lookup(get_shooter()); // If we have the flag set to hurt Creatures with the OnFire // ability,do a one-time corporeal_attack(). if (hurtOnFire && other->get_ability(AB_OnFire)) { other->corporeal_attack(p,FIREBALL_BACKUP_PHYSICAL_DAMAGE); kill_self(); } else { other->heat_attack(p,heat); } } void Fireball::act() { if (timer.ready()) { kill_self(); } timer.clock(); Shot::act(); } void Fireball::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.movingContext, xdata); } Missile::Missile(WorldP w,LocatorP l,const Pos &p,const Id &sh,Dir d) : Shot(context,xdata,w,l,p,sh,d,d) { timer.set(MISSILE_DESTRUCT_TIME); Timer nTimer(MISSILE_ROTATE_TIME); rotate = nTimer; hasTarget = False; shooterId = sh; stats.add_creation(); } CONSTRUCTOR_LEAF_IO(Missile,Shot) { } DEFINE_CREATE_FROM_STREAM(Missile) void Missile::act() { LocatorP locator = get_locator(); // Find a target. if (!hasTarget) { PhysicalP nearby[OL_NEARBY_MAX]; int nearbyNum; // Should work even though this not fully constructed. locator->get_nearby(nearby,nearbyNum,this,MISSILE_RADIUS); // Search through list for best possible candidate. const Area &area = get_area(); Pos middle = area.get_middle(); int distance_2 = -1; // Best so far. IntelP nearbyIntel; PhysicalP shooter; IntelP shooterIntel; for (int n = 0; n < nearbyNum; n++) { if (nearby[n]->alive() && nearby[n]->is_creature() && // Don't go after invisible things. !(nearby[n]->is_moving() && ((MovingP)nearby[n])->is_invisible())&& // Don't go after shooter. nearby[n]->get_id() != shooterId && // Don't go after nearby if it is a slave to the shooter's intel // or the shooter is a slave to nearby. !( (shooter = locator->lookup(shooterId)) && (nearbyIntel = nearby[n]->get_intel()) && (shooterIntel = shooter->get_intel()) && ((!nearbyIntel->is_human() && ((MachineP)nearbyIntel)->get_master_intel_id() == shooterIntel->get_intel_id() ) || (!shooterIntel->is_human() && ((MachineP)shooterIntel)->get_master_intel_id() == nearbyIntel->get_intel_id() ) ) ) && // Don't go after members of shooters team !(shooter && locator->same_team(shooter,nearby[n]))) { const Area &area = nearby[n]->get_area(); int dist_2 = middle.distance_2(area.get_middle()); if (distance_2 == -1 || dist_2 < distance_2) { targetId = nearby[n]->get_id(); distance_2 = dist_2; hasTarget = True; } } // big if statement } // for n } // hasTarget if (rotate.ready()) { rotate.set(); PhysicalP target; if ((target = locator->lookup(targetId)) && // Lose sight of invisible objects. !(target->is_moving() && ((MovingP)target)->is_invisible())) { Boolean noChange = False; Dir dir = get_dir(); const Area &area = get_area(); const Area &targetArea = target->get_area(); Dir dirTo = area.dir_to(targetArea); if (dir > dirTo) { if (dir - dirTo > (CO_DIR_PURE / 2)) { dir++; } else { dir--; } } else if (dirTo > dir) { if (dirTo - dir > (CO_DIR_PURE / 2)) { dir--; } else { dir++; } } else { noChange = True; } if (!noChange) { if (dir >= CO_DIR_MAX) { dir -= CO_DIR_PURE; } if (dir < (CO_DIR_MAX - CO_DIR_PURE)) { dir += CO_DIR_PURE; } set_dir_next(dir); const Vel *unitVels = get_unit_vels(); set_vel_next((float)context.speed * unitVels[dir]); } } // good target } // rotate.ready() if (timer.ready()) { kill_self(); } timer.clock(); rotate.clock(); Shot::act(); } void Missile::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.movingContext, xdata); } Stats Missile::stats; Star::Star(WorldP w,LocatorP l,const Pos &p,const Id &sh,Dir d) : Shot(context,xdata,w,l,p,sh,d) { stats.add_creation(); } CONSTRUCTOR_LEAF_IO(Star,Shot) { } DEFINE_CREATE_FROM_STREAM(Star) void Star::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.movingContext, xdata); } Stats Star::stats; Blood::Blood(WorldP w,LocatorP l,const Pos &pos,const Vel &vel) : Droplet(context,xdata,w,l,pos,vel) {} CONSTRUCTOR_LEAF_IO(Blood,Droplet) { } DEFINE_CREATE_FROM_STREAM(Blood) PhysicalP Blood::create_and_add_if(WorldP w,LocatorP l,const Pos &p,const Vel &v) { PhysicalP blood = NULL; int index = get_available_entry(l); if (index != -1) { blood = new Blood(w,l,p,v); assert(blood); l->add(blood); set_entry(index,blood->get_id()); } return blood; } void Blood::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.movingContext, xdata); } GreenBlood::GreenBlood(WorldP w,LocatorP l,const Pos &pos,const Vel &vel) : Droplet(context,xdata,w,l,pos,vel) {} CONSTRUCTOR_LEAF_IO(GreenBlood,Droplet) { } DEFINE_CREATE_FROM_STREAM(GreenBlood) PhysicalP GreenBlood::create_and_add_if(WorldP w,LocatorP l,const Pos &p,const Vel &v) { PhysicalP blood = NULL; int index = get_available_entry(l); if (index != -1) { blood = new GreenBlood(w,l,p,v); assert(blood); l->add(blood); set_entry(index,blood->get_id()); } return blood; } void GreenBlood::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.movingContext, xdata); } OilDroplet::OilDroplet(WorldP w,LocatorP l,const Pos &pos,const Vel &vel) : Droplet(context,xdata,w,l,pos,vel) {} CONSTRUCTOR_LEAF_IO(OilDroplet,Droplet) { } DEFINE_CREATE_FROM_STREAM(OilDroplet) PhysicalP OilDroplet::create_and_add_if(WorldP w,LocatorP l,const Pos &p,const Vel &v) { PhysicalP blood = NULL; int index = get_available_entry(l); if (index != -1) { blood = new OilDroplet(w,l,p,v); assert(blood); l->add(blood); set_entry(index,blood->get_id()); } return blood; } void OilDroplet::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.movingContext, xdata); } Grenade::Grenade(WorldP w,LocatorP l,const Pos &pos,const Id &sh, Dir dir,Speed speed) : Falling(context,xdata,w,l,pos,dir) { assert(dir != CO_air); const Vel *unitVels = get_unit_vels(); Vel initVel = (float)speed * unitVels[dir]; set_vel(initVel); set_vel_next(initVel); timer.set(GRENADE_TIME); shooter = sh; defused = False; } Grenade::Grenade(WorldP w,LocatorP l,const Pos &pos,const Id &sh, const Vel &vel) : Falling(context,xdata,w,l,pos,vel.get_dir()) { stats.add_creation(); set_vel(vel); set_vel_next(vel); timer.set(GRENADE_TIME); shooter = sh; defused = False; } CONSTRUCTOR_LEAF_IO(Grenade,Falling) { defused = False; } DEFINE_CREATE_FROM_STREAM(Grenade) void Grenade::set_quiet_death() { defused = True; Falling::set_quiet_death(); } void Grenade::act() { if (timer.ready()) { kill_self(); } timer.clock(); Falling::act(); } void Grenade::die() { if (!defused) { WorldP world = get_world(); LocatorP locator = get_locator(); const Area area = get_area(); PhysicalP explosion = new Explosion(world,locator,area.get_middle(),shooter, GRENADE_EXPLOSION_RADIUS,GRENADE_EXPLOSION_DAMAGE_MAX); assert (explosion); locator->add(explosion); } Falling::die(); } void Grenade::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.movingContext, xdata); } Stats Grenade::stats; Napalm::Napalm(WorldP w,LocatorP l,const Pos &pos,const Id &sh, const Vel &vel) : Falling(context,xdata,w,l,pos,vel.get_dir()) { stats.add_creation(); set_vel(vel); set_vel_next(vel); timer.set(GRENADE_TIME); shooter = sh; defused = False; } CONSTRUCTOR_LEAF_IO(Napalm,Falling) { defused = False; } DEFINE_CREATE_FROM_STREAM(Napalm) void Napalm::set_quiet_death() { defused = True; Falling::set_quiet_death(); } // Don't want NapalmGrenades to set each other off. void Napalm::heat_attack(PhysicalP,int,Boolean) { } void Napalm::act() { if (timer.ready()) { kill_self(); } timer.clock(); Falling::act(); } void Napalm::die() { // Create a FireExplosion object to spit out fireballs. if (!defused) { WorldP world = get_world(); LocatorP locator = get_locator(); const Area area = get_area(); Pos pos = Coord::shot_initial_pos(area,CO_dn,Fireball::get_size(),CO_air); PhysicalP p = new FireExplosion(world,locator,pos,shooter); assert(p); locator->add(p); } Falling::die(); } void Napalm::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.movingContext, xdata); } Stats Napalm::stats; Egg::Egg(WorldP w,LocatorP l,const Pos &pos, const IntelOptions &ops,ITmask opMask) : Falling(context,xdata,w,l,pos) { intelOptions = ops; intelOpMask = opMask; open = False; } CONSTRUCTOR_LEAF_IO(Egg,Falling) { intelOpMask = ITnone; _update_from_stream(in); } DEFINE_UPDATE_FROM_STREAM(Egg,Falling) void Egg::_update_from_stream(InStreamP in) { open = (Boolean)in->read_char(); } int Egg::get_write_length() { return Falling::get_write_length() + sizeof(char); } void Egg::write(OutStreamP out) { Falling::write(out); out->write_char((char)open); } DEFINE_CREATE_FROM_STREAM(Egg) void Egg::act() { if (!open) { LocatorP l = get_locator(); PhysicalP nearby[OL_NEARBY_MAX]; int nItems; l->get_nearby(nearby,nItems,this,EGG_RADIUS); // Check for nearby humans. for (int n = 0; n < nItems; n++) { IntelP intel = nearby[n]->get_intel(); if (intel && intel->is_human() && !nearby[n]->get_ability(AB_Hugger) && nearby[n]->get_class_id() != A_Alien) // Trigger the egg. { PhysicalP hugger; IntelP intel; WorldP w = get_world(); // Hugger initial position is above the egg. const Area &area = get_area(); Pos eggMiddle = area.get_middle(); // Decide whether to create a red or green face hugger. Boolean gHugger = Utils::choose(EGG_GREEN_HUGGER_PERCENT) == 0; Size huggerSize = gHugger ? GreenHugger::get_size_max() : RedHugger::get_size_max(); Pos p(eggMiddle.x - huggerSize.width / 2, eggMiddle.y - EGG_HUGGER_EJECT_HEIGHT); // Create a Green or Red Hugger. if (gHugger) { // Create a GreenHugger, a neutral intelligence. hugger = new GreenHugger(w,l,p); intel = new Neutral(w,l,"Hugger", &intelOptions,intelOpMask); l->register_neutral((NeutralP)intel); } else { // Create a RedHugger, an enemy intelligence. hugger = new RedHugger(w,l,p); intel = new Enemy(w,l,"Hugger", &intelOptions,intelOpMask); l->register_enemy((EnemyP)intel); } assert(hugger); assert(intel); hugger->set_intel(intel); l->add(hugger); // Don't want Hugger to bump into the egg. hugger->set_dont_collide(this->get_id()); // Make egg open. open = True; set_dir_next(CO_center); // The pixmap for an open egg. break; } } } Falling::act(); } void Egg::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.movingContext, xdata); } Xit::Xit(WorldP w,LocatorP l,const Pos &pos) : Touchable(context,xdata,w,l,pos) {} CONSTRUCTOR_LEAF_IO(Xit,Touchable) { } DEFINE_CREATE_FROM_STREAM(Xit) void Xit::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.fallingContext.movingContext, xdata); } Flag::Flag(WorldP w,LocatorP l,const Pos &pos) : Touchable(context,xdata,w,l,pos) {} CONSTRUCTOR_LEAF_IO(Flag,Touchable) { } DEFINE_CREATE_FROM_STREAM(Flag) void Flag::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.fallingContext.movingContext, xdata); } Chainsaw::Chainsaw(WorldP w,LocatorP l,const Pos &p) : Cutter(context,xdata,w,l,p) {} CONSTRUCTOR_LEAF_IO(Chainsaw,Cutter) { } DEFINE_CREATE_FROM_STREAM(Chainsaw) void Chainsaw::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.weaponContext.itemContext.fallingContext.movingContext, xdata); } // This is here Pistol::Pistol(WorldP w,LocatorP l,const Pos &p) : Gun(context,xdata,w,l,p) {} CONSTRUCTOR_LEAF_IO(Pistol,Gun) { } DEFINE_CREATE_FROM_STREAM(Pistol) void Pistol::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.weaponContext.itemContext.fallingContext.movingContext, xdata); } MGun::MGun(WorldP w,LocatorP l,const Pos &p) : Gun(context,xdata,w,l,p) {} CONSTRUCTOR_LEAF_IO(MGun,Gun) { } DEFINE_CREATE_FROM_STREAM(MGun) void MGun::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.weaponContext.itemContext.fallingContext.movingContext, xdata); } Swapper::Swapper(WorldP w,LocatorP l,const Pos &p) : SingleGun(context,xdata,w,l,p) {} CONSTRUCTOR_LEAF_IO(Swapper,SingleGun) { } DEFINE_CREATE_FROM_STREAM(Swapper) Size Swapper::get_shot_size(Dir) { return SwapShell::get_size(); } PhysicalP Swapper::create_shot(PhysicalP shooter,WorldP w,LocatorP l, const Pos &pos,Dir d) { PhysicalP swapShell = new SwapShell(w,l,pos,shooter->get_id(),get_id(),d); assert (swapShell); return swapShell; } void Swapper::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.gunContext.weaponContext.itemContext.fallingContext.movingContext, xdata); } Lancer::Lancer(WorldP w,LocatorP l,const Pos &p) : Gun(context,xdata,w,l,p) {} CONSTRUCTOR_LEAF_IO(Lancer,Gun) { } DEFINE_CREATE_FROM_STREAM(Lancer) Size Lancer::get_shot_size(Dir dir) { return Lance::get_size(dir); } Dir Lancer::compute_weapon_dir(ITcommand command) { return Lance::compute_weapon_dir(command); } PhysicalP Lancer::create_shot(PhysicalP shooter,WorldP w,LocatorP l, const Pos &pos,Dir d) { PhysicalP lance = new Lance(w,l,pos,shooter->get_id(),d); assert (lance); return lance; } void Lancer::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.weaponContext.itemContext.fallingContext.movingContext, xdata); } AutoLancer::AutoLancer(WorldP w,LocatorP l,const Pos &p) : Gun(context,xdata,w,l,p) {} CONSTRUCTOR_LEAF_IO(AutoLancer,Gun) { } DEFINE_CREATE_FROM_STREAM(AutoLancer) Size AutoLancer::get_shot_size(Dir dir) { return Lance::get_size(dir); } Dir AutoLancer::compute_weapon_dir(ITcommand command) { return Lance::compute_weapon_dir(command); } PhysicalP AutoLancer::create_shot(PhysicalP shooter,WorldP w,LocatorP l, const Pos &pos,Dir d) { PhysicalP lance = new Lance(w,l,pos,shooter->get_id(),d); assert (lance); return lance; } void AutoLancer::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.weaponContext.itemContext.fallingContext.movingContext, xdata); } FrogGun::FrogGun(WorldP w,LocatorP l,const Pos &p) : SingleGun(context,xdata,w,l,p) {} CONSTRUCTOR_LEAF_IO(FrogGun,SingleGun) { } DEFINE_CREATE_FROM_STREAM(FrogGun) Size FrogGun::get_shot_size(Dir) { return FrogShell::get_size(); } PhysicalP FrogGun::create_shot(PhysicalP shooter,WorldP w,LocatorP l, const Pos &pos,Dir d) { PhysicalP shot = new FrogShell(w,l,pos,shooter->get_id(),get_id(),d); assert (shot); return shot; } void FrogGun::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.gunContext.weaponContext.itemContext.fallingContext.movingContext, xdata); } DogWhistle::DogWhistle(WorldP w,LocatorP l,const Pos &p) : Whistle(context,xdata,w,l,p) {} CONSTRUCTOR_LEAF_IO(DogWhistle,Whistle) { } DEFINE_CREATE_FROM_STREAM(DogWhistle) PetP DogWhistle::create_pet(IntelP master,Boolean alternatePet,int n) { // The default pet is a Dog, alternate pet is a RedHugger, ha, ha. const Area &area = get_area(); Pos pos = area.get_middle() - 0.5f * (alternatePet ? RedHugger::get_size_max() : Dog::get_size_max()); // So multiple dogs don't pop up on top of each other. Size offset; offset.set(Utils::choose(21) - 3,Utils::choose(21) - 3); pos = pos + offset; LocatorP l = get_locator(); PhysicalP p; if (alternatePet) { p = new RedHugger(get_world(),get_locator(),pos); } else { if (n % 2 == 0) { p = new Dog(get_world(),get_locator(),pos); } else { p = new Mutt(get_world(),get_locator(),pos); } } assert(p); IntelOptions ops; ops.psychotic = True; ops.classFriends = False; // So Dogs attack enemy dogs. // Don't give a limited lifespan. PetP pet = new Pet(get_world(),get_locator(),"Spot",&ops, ITpsychotic | ITclassFriends,master); assert(pet); pet->set_dont_collide(master->get_intel_id()); p->set_intel(pet); l->add(p); l->register_neutral(pet); return pet; } void DogWhistle::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.weaponContext.itemContext.fallingContext.movingContext, xdata); } DemonSummoner::DemonSummoner(WorldP w,LocatorP l,const Pos &p) : Whistle(context,xdata,w,l,p) { } CONSTRUCTOR_LEAF_IO(DemonSummoner,Whistle) { } DEFINE_CREATE_FROM_STREAM(DemonSummoner) PetP DemonSummoner::create_pet(IntelP master,Boolean,int) { // Doesn't use alternatePet const Area &area = get_area(); Pos pos = area.get_middle() - 0.5f * FireDemon::get_size_max(); // Don't bother offseting randomly for multiple Demons. LocatorP l = get_locator(); PhysicalP p = new FireDemon(get_world(),get_locator(),pos); assert(p); IntelOptions ops; ops.psychotic = True; ops.classFriends = False; // If summon multiple demons. ops.limitedLifespan = DEMON_SUMMONER_SUICIDE_TIME; PetP pet = new Pet(get_world(),get_locator(),"WormChewer",&ops, ITpsychotic | ITclassFriends | ITlimitedLifespan,master); assert(pet); pet->set_dont_collide(master->get_intel_id()); p->set_intel(pet); l->add(p); l->register_neutral(pet); return pet; } void DemonSummoner::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.weaponContext.itemContext.fallingContext.movingContext, xdata); } FThrower::FThrower(WorldP w,LocatorP l,const Pos &p) : Gun(context,xdata,w,l,p) { Timer nTimer(F_THROWER_FIRE_TIME); stopFiring = nTimer; isFiring = False; } CONSTRUCTOR_LEAF_IO(FThrower,Gun) { } DEFINE_CREATE_FROM_STREAM(FThrower) PhysicalP FThrower::create_shot(PhysicalP shooter,WorldP w,LocatorP l, const Pos &pos,Dir d) { PhysicalP fireball = new Fireball(w,l,pos,shooter->get_id(),d); assert (fireball); return fireball; } void FThrower::fire(const Id &id,ITcommand command) { killerId = id; fireCommand = command; stopFiring.set(); isFiring = True; } void FThrower::act() { if (isFiring && stopFiring.ready()) isFiring = False; if (isFiring) Gun::fire(killerId,fireCommand); stopFiring.clock(); Gun::act(); } Size FThrower::get_shot_size(Dir) { return Fireball::get_size(); } void FThrower::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.weaponContext.itemContext.fallingContext.movingContext, xdata); } Launcher::Launcher(WorldP w,LocatorP l,const Pos &p) : Gun(context,xdata,w,l,p) {} CONSTRUCTOR_LEAF_IO(Launcher,Gun) { } DEFINE_CREATE_FROM_STREAM(Launcher) Size Launcher::get_shot_size(Dir dir) { return Missile::get_size(dir); } PhysicalP Launcher::create_shot(PhysicalP shooter,WorldP world, LocatorP locator,const Pos &pos,Dir dir) { PhysicalP shot = new Missile(world,locator,pos,shooter->get_id(),dir); assert (shot); return shot; } void Launcher::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.weaponContext.itemContext.fallingContext.movingContext, xdata); } Grenades::Grenades(WorldP w,LocatorP l,const Pos &p) : Gun(context,xdata,w,l,p) {} CONSTRUCTOR_LEAF_IO(Grenades,Gun) { } DEFINE_CREATE_FROM_STREAM(Grenades) Size Grenades::get_shot_size(Dir dir) { return Grenade::get_size(dir); } PhysicalP Grenades::create_shot(PhysicalP shooter,WorldP world, LocatorP locator,const Pos &pos,Dir dir) { Speed speed; if (dir == CO_UP_L || dir == CO_UP || dir == CO_UP_R) { speed = GRENADES_TOSS_SPEED; } else if (dir == CO_R || dir == CO_DN_R || dir == CO_DN_L || dir == CO_L) { speed = GRENADES_ROLL_SPEED; } else if (dir == CO_DN) { speed = 0; } else { assert(0); } assert(shooter->is_moving()); const Vel *unitVels = get_unit_vels(); Vel vel = ((MovingP)shooter)->get_vel() + (float)speed * unitVels[dir]; // PhysicalP shot = new Grenade(world,locator,pos,shooter->get_id(),dir,speed); PhysicalP shot = new Grenade(world,locator,pos,shooter->get_id(),vel); assert (shot); return shot; } void Grenades::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.weaponContext.itemContext.fallingContext.movingContext, xdata); } Napalms::Napalms(WorldP w,LocatorP l,const Pos &p) : Gun(context,xdata,w,l,p) {} CONSTRUCTOR_LEAF_IO(Napalms,Gun) { } DEFINE_CREATE_FROM_STREAM(Napalms) Size Napalms::get_shot_size(Dir dir) { return Napalm::get_size(dir); } // Copied from Grenades, should have common parent. PhysicalP Napalms::create_shot(PhysicalP shooter,WorldP world, LocatorP locator,const Pos &pos,Dir dir) { // Using same parameters as grenades. Speed speed; if (dir == CO_UP_L || dir == CO_UP || dir == CO_UP_R) speed = GRENADES_TOSS_SPEED; else if (dir == CO_R || dir == CO_DN_R || dir == CO_DN_L || dir == CO_L) speed = GRENADES_ROLL_SPEED; else if (dir == CO_DN) speed = 0; else assert(0); assert(shooter->is_moving()); const Vel *unitVels = get_unit_vels(); Vel vel = ((MovingP)shooter)->get_vel() + (float)speed * unitVels[dir]; // PhysicalP shot = new Grenade(world,locator,pos,shooter->get_id(),dir,speed); PhysicalP shot = new Napalm(world,locator,pos,shooter->get_id(),vel); assert (shot); return shot; } void Napalms::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.weaponContext.itemContext.fallingContext.movingContext, xdata); } Stars::Stars(WorldP w,LocatorP l,const Pos &p) : Gun(context,xdata,w,l,p) {} CONSTRUCTOR_LEAF_IO(Stars,Gun) { } DEFINE_CREATE_FROM_STREAM(Stars) Size Stars::get_shot_size(Dir) { return Star::get_size(); } PhysicalP Stars::create_shot(PhysicalP shooter,WorldP world,LocatorP locator, const Pos &pos,Dir dir) { PhysicalP shot = new Star(world,locator,pos,shooter->get_id(),dir); assert (shot); return shot; } void Stars::fire(const Id &shooterId,ITcommand command) { LocatorP locator = get_locator(); PhysicalP shooter = locator->lookup(shooterId); if (shooter) { // Ninjas firing stars give a wider spread. int delta = (shooter->get_class_id() == A_Ninja) ? 2 : 1; // Fire a spread of shots around center. Dir center = Intel::command_weapon_to_dir_8(command); if (center != CO_air) for (Dir baseDir = center - delta; baseDir <= center + delta; baseDir++) { Dir dir; if (baseDir >= CO_DIR_MAX) dir = baseDir - CO_DIR_PURE; else if (baseDir < CO_DIR_MAX - CO_DIR_PURE) dir = baseDir + CO_DIR_PURE; else dir = baseDir; // Only set the timer on the last shot. Boolean lastOne = (baseDir == center + delta); Gun::_fire(shooterId,dir,lastOne,lastOne); } } } void Stars::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,context.weaponContext.itemContext.fallingContext.movingContext, xdata); } DEFINE_CREATURE_CTORS_3(Enforcer,Grounded,grounded,Suicide,suicide,Prickly,prickly) DEFINE_CREATE_FROM_STREAM(Enforcer) void Enforcer::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } Stats Enforcer::stats; DEFINE_CREATURE_CTORS_2(Frog,Suicide,suicide,Hopping,hopping) DEFINE_CREATE_FROM_STREAM(Frog) void Frog::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } Stats Frog::stats; // Temporarily disable Hero's lifting ability until we have time to finish it // properly. //DEFINE_CREATURE_CTORS_5(Hero,User,user,Fighter,fighter,Walking,walking,Healing,healing,Lifter,lifter) DEFINE_CREATURE_CTORS_4(Hero,User,user,Fighter,fighter,Walking,walking,Healing,healing) DEFINE_CREATE_FROM_STREAM(Hero) void Hero::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } Stats Hero::stats; DEFINE_CREATURE_CTORS_3(Ninja,User,user,Fighter,fighter,Sticky,sticky) DEFINE_CREATE_FROM_STREAM(Ninja) void Ninja::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } Stats Ninja::stats; DEFINE_CREATURE_CTORS_3(Alien,Sticky,sticky,Prickly,prickly,Healing,healing) DEFINE_CREATE_FROM_STREAM(Alien) void Alien::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } Stats Alien::stats; DEFINE_CREATURE_CTORS_2(RedHugger,Sticky,sticky,Hugger,hugger) DEFINE_CREATE_FROM_STREAM(RedHugger) void RedHugger::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } DEFINE_CREATURE_CTORS_2(GreenHugger,Sticky,sticky,Hugger,hugger) DEFINE_CREATE_FROM_STREAM(GreenHugger) void GreenHugger::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } DEFINE_CREATURE_CTORS_3(ChopperBoy,User,user,Flying,flying,Lifter,lifter) DEFINE_CREATE_FROM_STREAM(ChopperBoy) void ChopperBoy::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } Stats ChopperBoy::stats; DEFINE_CREATURE_CTORS_3(Seal,Grounded,grounded,Suicide,suicide,AnimTime,animTime) DEFINE_CREATE_FROM_STREAM(Seal) void Seal::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } Stats Seal::stats; DEFINE_CREATURE_CTORS_4(FireDemon,Flying,flying,BuiltIn,builtIn,OnFire,onFire,SwapProtect,swapProtect) DEFINE_CREATE_FROM_STREAM(FireDemon) Size FireDemon::get_shot_size(Dir) { return Fireball::get_size(); } PhysicalP FireDemon::create_shot(WorldP w,LocatorP l,const Pos &pos, const Id &shooter,Dir dir) { PhysicalP shot = new Fireball(w,l,pos,shooter,dir, FIRE_DEMON_FIREBALL_HEAT,FIRE_DEMON_FIREBALL_TIME, True); // Special fireballs that hurt those with the OnFire ability. assert(shot); return shot; } void FireDemon::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } DEFINE_CREATURE_CTORS_4(Dragon,Flying,flying,BuiltIn,builtIn,OnFire,onFire,Segmented,segmented) DEFINE_CREATE_FROM_STREAM(Dragon) Size Dragon::get_shot_size(Dir) { return Fireball::get_size(); } PhysicalP Dragon::create_shot(WorldP w,LocatorP l,const Pos &pos, const Id &shooter,Dir dir) { PhysicalP shot = new Fireball(w,l,pos,shooter,dir, DRAGON_FIREBALL_HEAT,DRAGON_FIREBALL_TIME, True); // Special fireballs that hurt those with the OnFire ability. assert(shot); return shot; } void Dragon::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } DEFINE_CREATURE_CTORS_4(Walker,User,user,Walking,walking,BuiltIn,builtIn,AnimTime,animTime) DEFINE_CREATE_FROM_STREAM(Walker) PhysicalP Walker::create_shot(WorldP w,LocatorP l,const Pos &pos, const Id &shooter,Dir dir) { PhysicalP shot = new Laser(w,l,pos,shooter,dir); assert(shot); return shot; } void Walker::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } Stats Walker::stats; DEFINE_CREATURE_CTORS_3(Dog,Carrier,carrier,Fighter,fighter,Walking,walking) DEFINE_CREATE_FROM_STREAM(Dog) Boolean Dog::draw_outline(ColorNum &) { // Dogs look stupid with an outline, the Dog is too small. return False; } void Dog::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } Stats Dog::stats; DEFINE_CREATURE_CTORS_3(Mutt,Carrier,carrier,Fighter,fighter,Walking,walking) DEFINE_CREATE_FROM_STREAM(Mutt) Boolean Mutt::draw_outline(ColorNum &) { // Dogs look stupid with an outline, the Dog is too small. return False; } void Mutt::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } Stats Mutt::stats; DEFINE_CREATURE_CTORS_4(Yeti,Prickly,prickly,Walking,walking, AnimTime,animTime,Sensitive,sensitive); DEFINE_CREATE_FROM_STREAM(Yeti) void Yeti::init_x(Xvars &xvars,IXCommand command,void* arg) { Moving::init_x(xvars,command,arg,creatureContext.movingContext,creatureXdata); } Stats Yeti::stats; xevil-2.02r2.orig/cmn/area.cpp0100644000175000017500000005704507636130446015517 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "area.cpp" // Also has class Avoid. #if X11 #ifndef NO_PRAGMAS #pragma implementation "area.h" #endif #endif // Include Files #include "stdafx.h" extern "C" { #include // For INT_MAX } #include #include "utils.h" #include "coord.h" #include "area.h" Size Area::operator - (const Area &other) const { assert ((shape == AR_RECT) && (other.shape == AR_RECT)); return pos - other.pos; } Boolean Area::operator == (const Area &other) const { assert(shape == AR_RECT && other.shape == AR_RECT); return pos == other.pos && size == other.size; } Area Area::operator + (const Size &shift) const { assert(shape == AR_RECT); Area ret(AR_RECT,pos + shift,size); return ret; } Area Area::operator - (const Size &shift) const { assert(shape == AR_RECT); Area ret(AR_RECT,pos - shift,size); return ret; } Area::Area(ARshape sh,const Loc &loc,const Dim &dim) { assert(sh == AR_RECT); shape = AR_RECT; pos.x = loc.c * WSQUARE_WIDTH; pos.y = loc.r * WSQUARE_HEIGHT; size.width = dim.colMax * WSQUARE_WIDTH; size.height = dim.rowMax * WSQUARE_HEIGHT; } Area::Area(InStreamP in) { read(in); } void Area::read(InStreamP in) { shape = AR_RECT; pos.read(in); size.read(in); } void Area::write(OutStreamP out) const { pos.write(out); size.write(out); } Box Area::get_box() const { assert (shape == AR_RECT); Loc loc; loc.r = (int)floor(pos.y * WSQUARE_HEIGHT_INV); loc.c = (int)floor(pos.x * WSQUARE_WIDTH_INV); // Always has dimension of at least 1x1. Loc finish; finish.r = (int)ceil((pos.y + size.height) * WSQUARE_HEIGHT_INV); finish.c = (int)ceil((pos.x + size.width) * WSQUARE_WIDTH_INV); Dim dim(finish.r - loc.r,finish.c - loc.c); Box box(loc,dim); return box; } void Area::wsquares(Loc list[AR_WSQUARES_MAX],int &nitems) const { nitems = 0; assert(shape == AR_RECT); Loc loc; for (loc.r = (int)floor(pos.y * WSQUARE_HEIGHT_INV); loc.r * WSQUARE_HEIGHT < pos.y + size.height; loc.r++) { for (loc.c = (int)floor(pos.x * WSQUARE_WIDTH_INV); loc.c * WSQUARE_WIDTH < pos.x + size.width; loc.c++) { if (nitems >= AR_WSQUARES_MAX) { cerr << "Warning: Area::wsquares: Too many wsquares." << endl; return; } list[nitems] = loc; nitems++; } } } Boolean Area::overlap(const Area &r) const { assert((shape == AR_RECT) && (r.shape == AR_RECT)); if ((pos.x + size.width <= r.pos.x) || (r.pos.x + r.size.width <= pos.x) || (pos.y + size.height <= r.pos.y) || (r.pos.y + r.size.height <= pos.y)) { return False; } else { return True; } } Boolean Area::overlap(const Loc &loc) const { Pos test; Boolean ret; assert(shape == AR_RECT); test.x = loc.c * WSQUARE_WIDTH; test.y = loc.r * WSQUARE_HEIGHT; if ((test.x >= pos.x + size.width) || (test.y >= pos.y + size.height) || (test.x + WSQUARE_WIDTH <= pos.x) || (test.y + WSQUARE_HEIGHT <= pos.y)) { ret = False; } else { ret = True; } return ret; } Boolean Area::overlap(const Box &box) const { Pos testPos; Size testSize; Boolean ret; assert(shape == AR_RECT); testPos.x = box.loc.c * WSQUARE_WIDTH; testPos.y = box.loc.r * WSQUARE_HEIGHT; testSize.width = box.dim.colMax * WSQUARE_WIDTH; testSize.height = box.dim.rowMax * WSQUARE_HEIGHT; if ((testPos.x >= pos.x + size.width) || (testPos.y >= pos.y + size.height) || (testPos.x + testSize.width <= pos.x) || (testPos.y + testSize.height <= pos.y)) { ret = False; } else { ret = True; } return ret; } Boolean Area::overlap(const Pos &p) const { assert(shape == AR_RECT); if ((pos.x + size.width <= p.x) || (pos.x > p.x) || (pos.y + size.height <= p.y) || (pos.y > p.y)) { return False; } else { return True; } } Loc Area::middle_wsquare() const { assert (shape == AR_RECT); Loc ret; ret.r = (int)((pos.y + size.height * 0.5) * WSQUARE_HEIGHT_INV); ret.c = (int)((pos.x + size.width * 0.5) * WSQUARE_WIDTH_INV); return ret; } ARsig Area::avoid_wsquare(Avoid &avoid,const Loc &loc) const { assert(shape == AR_RECT); if (! overlap(loc)) { return AR_NO_SIG; } avoid.r = -(loc.c * WSQUARE_WIDTH - size.width - pos.x); avoid.dn = -(loc.r * WSQUARE_HEIGHT - size.height - pos.y); avoid.l = (loc.c + 1) * WSQUARE_WIDTH - pos.x; avoid.up = (loc.r + 1) * WSQUARE_HEIGHT - pos.y; return AR_CLOSE; } int Area::avoid_wsquare_dir(const Loc &loc,Dir dir) const { assert(shape == AR_RECT); assert(overlap(loc)); switch (dir) { case CO_R: return (loc.c + 1) * WSQUARE_WIDTH - pos.x; case CO_DN: return (loc.r + 1) * WSQUARE_HEIGHT - pos.y; case CO_L: return -(loc.c * WSQUARE_WIDTH - size.width - pos.x); case CO_UP: return -(loc.r * WSQUARE_HEIGHT - size.height - pos.y); }; assert(0); return CO_air; } int Area::avoid_area_dir(const Area &other,Dir dir) const { assert(shape == AR_RECT && other.shape == AR_RECT); assert(overlap(other)); // Amount this shifted to avoid other. switch (dir) { case CO_R: return other.pos.x + other.size.width - pos.x; case CO_DN: return other.pos.y + other.size.height - pos.y; case CO_L: return pos.x + size.width - other.pos.x ; case CO_UP: return pos.y + size.height - other.pos.y; } assert(0); return CO_air; } Size Area::avoid(const Area &other) const { assert((shape == AR_RECT) && (other.shape == AR_RECT)); Avoid avoid; avoid.r = pos.x + size.width - other.pos.x; avoid.dn = pos.y + size.height - other.pos.y; avoid.l = other.pos.x + other.size.width - pos.x; avoid.up = other.pos.y + other.size.height - pos.y; return avoid.offset_rank(); } Size Area::avoid_no_up(const Area &other) const { assert((shape == AR_RECT) && (other.shape == AR_RECT)); Avoid avoid; avoid.r = -(other.pos.x - size.width - pos.x); avoid.dn = INT_MAX; avoid.l = other.pos.x + other.size.width - pos.x; avoid.up = other.pos.y + other.size.height - pos.y; return avoid.offset_rank(); } Pos Area::adjacent_rect(const Size &otherSize,Dir dir) const { assert (shape == AR_RECT); Pos middle = get_middle(); Pos ret; switch (dir) { case CO_UP_R_R: case CO_R: case CO_DN_R_R: ret.x = pos.x + size.width; ret.y = middle.y - (int)(0.5 * otherSize.height); break; case CO_DN_R: ret = pos + size; break; case CO_DN_DN_R: case CO_DN: case CO_DN_DN_L: ret.x = middle.x - (int)(0.5 * otherSize.width); ret.y = pos.y + size.height; break; case CO_DN_L: ret.x = pos.x - otherSize.width; ret.y = pos.y + size.height; break; case CO_DN_L_L: case CO_L: case CO_UP_L_L: ret.x = pos.x - otherSize.width; ret.y = middle.y - (int)(0.5 * otherSize.height); break; case CO_UP_L: ret = pos - otherSize; break; case CO_UP_UP_L: case CO_UP: case CO_UP_UP_R: ret.x = middle.x - (int)(0.5 * otherSize.width); ret.y = pos.y - otherSize.height; break; case CO_UP_R: ret.x = pos.x + size.width; ret.y = pos.y - otherSize.height; break; default: assert(0); break; } return ret; } Boolean Area::touches(const Area &oth,Touching touching) const { assert(shape == AR_RECT && oth.shape == AR_RECT); switch (touching) { case CO_r: return pos.x + size.width == oth.pos.x && pos.y < oth.pos.y + oth.size.height && pos.y + size.height > oth.pos.y; case CO_dn: return pos.y + size.height == oth.pos.y && pos.x < oth.pos.x + oth.size.width && pos.x + size.width > oth.pos.x; case CO_l: return pos.x == oth.pos.x + oth.size.width && pos.y < oth.pos.y + oth.size.height && pos.y + size.height > oth.pos.y; case CO_up: return pos.y == oth.pos.y + oth.size.height && pos.x < oth.pos.x + oth.size.width && pos.x + size.width > oth.pos.x; default: assert(0); return False; } } void Area::touching_wsquares(TouchingList &list) const { assert(shape == AR_RECT); list.r.num = list.dn.num = list.l.num = list.up.num = 0; // Right side. if ((pos.x + size.width) % WSQUARE_WIDTH == 0) { Loc loc; loc.c = (pos.x + size.width) / WSQUARE_WIDTH; for (loc.r = (int)floor(pos.y * WSQUARE_HEIGHT_INV); loc.r * WSQUARE_HEIGHT < pos.y + size.height; loc.r++) { list.r.list[list.r.num] = loc; list.r.num++; } } // Bottom. if ((pos.y + size.height) % WSQUARE_HEIGHT == 0) { Loc loc; loc.r = (pos.y + size.height) / WSQUARE_HEIGHT; for (loc.c = (int)floor(pos.x * WSQUARE_WIDTH_INV); loc.c * WSQUARE_WIDTH < pos.x + size.width; loc.c++) { list.dn.list[list.dn.num] = loc; list.dn.num++; } } // Left side. if (pos.x % WSQUARE_WIDTH == 0) { Loc loc; loc.c = pos.x / WSQUARE_WIDTH - 1; for (loc.r = (int)floor(pos.y * WSQUARE_HEIGHT_INV); loc.r * WSQUARE_HEIGHT < pos.y + size.height; loc.r++) { list.l.list[list.l.num] = loc; list.l.num++; } } // Top. if (pos.y % WSQUARE_HEIGHT == 0) { Loc loc; loc.r = pos.y / WSQUARE_HEIGHT - 1; for (loc.c = (int)floor(pos.x * WSQUARE_WIDTH_INV); loc.c * WSQUARE_WIDTH < pos.x + size.width; loc.c++) { list.up.list[list.up.num] = loc; list.up.num++; } } } void Area::edge_wsquares(TouchingList &list) const { assert(shape == AR_RECT); list.r.num = list.dn.num = list.l.num = list.up.num = 0; // Right side. { Loc loc; loc.c = (pos.x + size.width) / WSQUARE_WIDTH; for (loc.r = (int)floor(pos.y * WSQUARE_HEIGHT_INV); loc.r * WSQUARE_HEIGHT < pos.y + size.height; loc.r++) { list.r.list[list.r.num] = loc; list.r.num++; } } // Bottom. { Loc loc; loc.r = (pos.y + size.height) / WSQUARE_HEIGHT; for (loc.c = (int)floor(pos.x * WSQUARE_WIDTH_INV); loc.c * WSQUARE_WIDTH < pos.x + size.width; loc.c++) { list.dn.list[list.dn.num] = loc; list.dn.num++; } } // Left side. { Loc loc; loc.c = (int)ceil(pos.x * WSQUARE_WIDTH_INV) - 1; for (loc.r = (int)floor(pos.y * WSQUARE_HEIGHT_INV); loc.r * WSQUARE_HEIGHT < pos.y + size.height; loc.r++) { list.l.list[list.l.num] = loc; list.l.num++; } } // Top. { Loc loc; loc.r = (int)ceil(pos.y * WSQUARE_HEIGHT_INV) - 1; for (loc.c = (int)floor(pos.x * WSQUARE_WIDTH_INV); loc.c * WSQUARE_WIDTH < pos.x + size.width; loc.c++) { list.up.list[list.up.num] = loc; list.up.num++; } } } Boolean Area::corner_offset(Size &offset,Loc list[],Loc &inner, Dir corner) const { assert(shape == AR_RECT); Pos opp = pos + size; // lower right of area. // the 0,1,2 in the comments tell which wsquares will be returned in list. // x is the one that will be returned in inner. switch (corner) { // down right corner. // x0 // 21 case CO_DN_R: if (Utils::mod(opp.x,WSQUARE_WIDTH) > 0 && Utils::mod(opp.y,WSQUARE_HEIGHT) > 0) { list[0].c = list[1].c = Utils::div(opp.x,WSQUARE_WIDTH); list[2].c = inner.c = list[0].c - 1; list[1].r = list[2].r = Utils::div(opp.y,WSQUARE_HEIGHT); list[0].r = inner.r = list[1].r - 1; offset.width = -Utils::mod(opp.x,WSQUARE_WIDTH); offset.height = -Utils::mod(opp.y,WSQUARE_HEIGHT); return True; } break; // down left corner // 0x // 12 case CO_DN_L: if (Utils::mod(pos.x,WSQUARE_WIDTH) > 0 && Utils::mod(opp.y,WSQUARE_WIDTH) > 0) { list[0].c = list[1].c = Utils::div(pos.x,WSQUARE_WIDTH); list[2].c = inner.c = list[0].c + 1; list[1].r = list[2].r = Utils::div(opp.y,WSQUARE_HEIGHT); list[0].r = inner.r = list[1].r - 1; offset.width = WSQUARE_WIDTH - Utils::mod(pos.x,WSQUARE_WIDTH); offset.height = -Utils::mod(opp.y,WSQUARE_HEIGHT); return True; } break; // upper left corner // 01 // 2x case CO_UP_L: if (Utils::mod(pos.x,WSQUARE_WIDTH) > 0 && Utils::mod(pos.y,WSQUARE_HEIGHT) > 0) { list[0].c = list[2].c = Utils::div(pos.x,WSQUARE_WIDTH); list[1].c = inner.c = list[0].c + 1; list[0].r = list[1].r = Utils::div(pos.y,WSQUARE_HEIGHT); list[2].r = inner.r = list[1].r + 1; offset.width = WSQUARE_WIDTH - Utils::mod(pos.x,WSQUARE_WIDTH); offset.height = WSQUARE_HEIGHT - Utils::mod(pos.y,WSQUARE_HEIGHT); return True; } break; // upper right corner // 01 // x2 case CO_UP_R: if (Utils::mod(opp.x,WSQUARE_WIDTH) > 0 && Utils::mod(pos.y,WSQUARE_HEIGHT) > 0) { list[1].c = list[2].c = Utils::div(opp.x,WSQUARE_WIDTH); list[0].c = inner.c = list[1].c - 1; list[0].r = list[1].r = Utils::div(pos.y,WSQUARE_HEIGHT); list[2].r = inner.r = list[0].r + 1; offset.width = - Utils::mod(opp.x,WSQUARE_WIDTH); offset.height = WSQUARE_HEIGHT - Utils::mod(pos.y,WSQUARE_HEIGHT); return True; } break; default: assert(0); } return False; } void Area::set_middle(const Pos &mid) { assert(shape == AR_RECT); pos.x = mid.x - (int)floor(size.width * 0.5); pos.y = mid.y - (int)floor(size.height * 0.5); } Dir Area::dir_to(const Pos &other) const { assert(shape == AR_RECT); int xdir,ydir; if (other.x >= pos.x + size.width) { xdir = 1; } else if (other.x < pos.x) { xdir = -1; } else { xdir = 0; } if (other.y >= pos.y + size.height) { ydir = 1; } else if (other.y < pos.y) { ydir = -1; } else { ydir = 0; } switch (xdir) { case 1: switch (ydir) { case -1: return CO_UP_R; case 0: return CO_R; case 1: return CO_DN_R; }; case 0: switch (ydir) { case -1: return CO_UP; case 0: return CO_air; case 1: return CO_DN; }; case -1: switch (ydir) { case -1: return CO_UP_L; case 0: return CO_L; case 1: return CO_DN_L; }; }; assert(0); return CO_air; } Dir Area::dir_to(const Area &other) const { assert((shape == AR_RECT) && (other.shape == AR_RECT)); int xdir,ydir; if (other.pos.x >= pos.x + size.width) xdir = 1; else if (other.pos.x + other.size.width <= pos.x) xdir = -1; else xdir = 0; if (other.pos.y >= pos.y + size.height) ydir = 1; else if (other.pos.y + other.size.height <= pos.y) ydir = -1; else ydir = 0; switch (xdir) { case 1: switch (ydir) { case -1: return CO_UP_R; case 0: return CO_R; case 1: return CO_DN_R; }; case 0: switch (ydir) { case -1: return CO_UP; case 0: return CO_air; case 1: return CO_DN; }; case -1: switch (ydir) { case -1: return CO_UP_L; case 0: return CO_L; case 1: return CO_DN_L; }; }; assert(0); return CO_air; } Area Area::combine(const Area &a) const { assert((shape == AR_RECT) && (a.shape == AR_RECT)); Pos pos1; pos1.x = Utils::minimum(pos.x,a.pos.x); pos1.y = Utils::minimum(pos.y,a.pos.y); Pos pos2; pos2.x = Utils::maximum(pos.x + size.width,a.pos.x + a.size.width); pos2.y = Utils::maximum(pos.y + size.height,a.pos.y + a.size.height); Size s = pos2 - pos1; Area ret(AR_RECT,pos1,s); return ret; } Area Area::wsquare_allign(const Size &offset) const { assert(shape == AR_RECT); Pos lr = pos + size; // lower right of area. Pos retPos = pos; Size retSize = size; // allign right side if (offset.width > 0 && lr.x % WSQUARE_WIDTH != 0) retPos.x += ((lr.x / WSQUARE_WIDTH) + 1) * WSQUARE_WIDTH - lr.x; // allign bottom side if (offset.height > 0 && lr.y % WSQUARE_HEIGHT != 0) retPos.y += ((lr.y / WSQUARE_HEIGHT) + 1) * WSQUARE_HEIGHT - lr.y; // allign left side. if (offset.width < 0 && pos.x % WSQUARE_WIDTH != 0) retPos.x = (pos.x / WSQUARE_WIDTH) * WSQUARE_WIDTH; // allign top side. if (offset.height < 0 && pos.y % WSQUARE_HEIGHT != 0) retPos.y = (pos.y / WSQUARE_HEIGHT) * WSQUARE_HEIGHT; Area ret(AR_RECT,retPos,retSize); return ret; } Boolean Area::wsquare_alligned() const { assert(shape == AR_RECT); return pos.x % WSQUARE_WIDTH == 0 && pos.y % WSQUARE_HEIGHT == 0 && (pos.x + size.width) % WSQUARE_WIDTH == 0 && (pos.y + size.height) % WSQUARE_HEIGHT == 0; } Area Area::grow_by(int delta) const { assert(shape == AR_RECT); Pos p(pos.x - delta,pos.y - delta); Size s; s.set(size.width + 2 * delta,size.height + 2 * delta); Area ret(AR_RECT,p,s); return ret; } Size Area::clip_top(int val) { assert(shape == AR_RECT); if (val > pos.y) { int diff = val - pos.y; pos.y += diff; size.height -= diff; // Clipped everything away. assert(size.height > 0); Size ret; ret.set(0,diff); return ret; } Size ret; ret.set_zero(); return ret; } Size Area::clip_left(int val) { assert(shape == AR_RECT); if (val > pos.x) { int diff = val - pos.x; pos.x += diff; size.width -= diff; // Clipped everything away. assert(size.width > 0); Size ret; ret.set(diff,0); return ret; } Size ret; ret.set_zero(); return ret; } Size Area::clip(const Size &clipper) { assert(shape == AR_RECT); Size ret; ret.set_zero(); if (pos.x < 0) { ret.width = -pos.x; pos.x = 0; size.width -= ret.width; } if (pos.y < 0) { ret.height = -pos.y; pos.y = 0; size.height -= ret.height; } if (pos.x + size.width > clipper.width) { size.width = clipper.width - pos.x; } if (pos.y + size.height > clipper.height) { size.height = clipper.height - pos.y; } assert(size.width > 0 && size.height > 0); return ret; } /////////////////////////////// Avoid /////////////////////////////////////// void Avoid::maximize(const Avoid &avoid) { r = Utils::maximum(r,avoid.r); dn = Utils::maximum(dn,avoid.dn); l = Utils::maximum(l,avoid.l); up = Utils::maximum(up,avoid.up); } Size Avoid::offset_rank(int rank) const { assert ((rank >= 0) && (rank < 4)); int dists[4]; dists[0] = r; dists[1] = dn; dists[2] = l; dists[3] = up; Utils::insertion_sort(dists,4); int m = dists[rank]; Size ret; if (m == r) { ret.width = -r; ret.height = 0; return ret; } if (m == dn) { ret.width = 0; ret.height = -dn; return ret; } if (m == l) { ret.width = l; ret.height = 0; return ret; } if (m == up) { ret.width = 0; ret.height = up; return ret; } assert(0); ret.width = ret.height = 0; return ret; } Size Avoid::offset_dir(Dir dir) const { Size ret; switch(dir) { case CO_R: ret.width = -r; ret.height = 0; break; case CO_DN: ret.width = 0; ret.height = -dn; break; case CO_L: ret.width = l; ret.height = 0; break; case CO_UP: ret.width = 0; ret.height = up; break; default: assert(0); } return ret; } int Avoid::get_dir(Dir dir) const { switch (dir) { case CO_R: return r; case CO_DN: return dn; case CO_L: return l; case CO_UP: return up; }; assert(0); return CO_air; } //////////////////////////// ViewportRegion and ViewportInfo ////////////////////////// ViewportRegion::ViewportRegion(const Area &a) { // Not used anymore. assert(0); type = V_AREA; area = a; } ViewportRegion::ViewportRegion(const Pos &p,int rad,const Area &visibleArea) { type = V_DISK; pos = p; radius = rad; area = visibleArea; } Boolean ViewportRegion::visibleOverlap(const Area &pArea) const { if (type == V_AREA) { return area.overlap(pArea); } if (type == V_DISK) { // Use inner,visible area return area.overlap(pArea); } assert(0); return False; } Boolean ViewportRegion::peripheralOverlap(const Area &pArea) const { if (type == V_AREA) { return area.overlap(pArea); } if (type == V_DISK) { // Use outer,peripheral disk. int dist_2 = pos.distance_2(pArea.get_middle()); int radius_2 = radius * radius; return (dist_2 <= radius_2); } assert(0); return False; } void ViewportRegion::grow_by(int val) { if (type == V_AREA) { area.grow_by(val); } else if (type == V_DISK) { // grow visible area area.grow_by(val); // grow peripheral radius += val; } else { assert(0); } } ViewportInfo::ViewportInfo(int r,const Size &visibleSize) { smoothScroll = True; radius = r; logicalSize = visibleSize; extraSize.set(0,0); // Actually not used, but we do read/write it. } ViewportInfo::ViewportInfo(int r,const Size &lSize,const Size &exSize) { smoothScroll = False; radius = r; logicalSize = lSize; extraSize = exSize; } void ViewportInfo::read(InStreamP in) { smoothScroll = (Boolean)in->read_char(); logicalSize.read_32(in); extraSize.read(in); radius = in->read_int(); } int ViewportInfo::get_write_length() { return sizeof(char) + // smoothScroll Size::get_write_length_32() + // logicalSize Size::get_write_length() + // extraSize sizeof(int); // radius } void ViewportInfo::write(OutStreamP out) const { out->write_char((char)smoothScroll); logicalSize.write_32(out); extraSize.write(out); out->write_int(radius); } ViewportRegion ViewportInfo::get_viewport_for(const Pos &pos) const { // This simulates the code in Ui::viewport_to_loc on UNIX and // Ui::viewport_to_pos on Windows. // Windows if (smoothScroll) { Pos vPos = pos - 0.5f * logicalSize; Area visible(AR_RECT,vPos,logicalSize); ViewportRegion ret(pos,radius,visible); return ret; } // UNIX else { Pos vPos((pos.x / logicalSize.width) * logicalSize.width - extraSize.width, (pos.y / logicalSize.height) * logicalSize.height - extraSize.height); Size vSize; vSize.set(logicalSize.width + 2 * extraSize.width, logicalSize.height + 2 * extraSize.height); Area visible(AR_RECT,vPos,vSize); ViewportRegion ret(pos,radius,visible); return ret; } } Dim ViewportInfo::get_viewport_dim() const { Size size; if (smoothScroll) { size = logicalSize; } else { size.set(logicalSize.width + 2 * extraSize.width, logicalSize.height + 2 * extraSize.height); } assert(size.width % WSQUARE_WIDTH == 0 && size.height % WSQUARE_HEIGHT == 0); Dim dim(size.height / WSQUARE_HEIGHT, size.width / WSQUARE_WIDTH); return dim; } xevil-2.02r2.orig/cmn/coord.cpp0100644000175000017500000004444607041422214015701 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "coord.cpp" #if X11 #ifndef NO_PRAGMAS #pragma implementation "coord.h" #endif #endif // Include Files #include "stdafx.h" #include "utils.h" #include "coord.h" #include "area.h" #ifndef NULL #define NULL 0 #endif // Functions. void Stats::add_death(time_t birthTime) { if (enabled) { time_t lifespan = time(NULL) - birthTime; if (deaths > 0) aveLifespan = (float)((aveLifespan * deaths + lifespan) / (deaths + 1)); else aveLifespan = (float)lifespan; deaths++; } } Boolean Stats::enabled = False; void Pos::read(InStreamP in) { x = in->read_signed_short(); y = in->read_signed_short(); } int Pos::get_write_length() { return 2 * sizeof(short); } void Pos::write(OutStreamP out) const { out->write_signed_short(x); out->write_signed_short(y); } int Pos::distance(const Pos &p) const { Size diff = *this - p; assert (diff.abs_2() >= 0); return (int)sqrt((double)(diff.width * diff.width + diff.height * diff.height)); //stupid MS compiler gets ambiguous call without the recast to int } int Pos::distance_2(const Pos &p) const { Size diff = *this - p; return diff.width * diff.width + diff.height * diff.height; } void Vel::read(InStreamP in) { dx = in->read_float(); dy = in->read_float(); } int Vel::get_write_length() { return 2 * sizeof(float); } void Vel::write(OutStreamP out) const { out->write_float(dx); out->write_float(dy); } Dir Size::get_dir() { if (!width && !height) { return CO_air; } if (height < 0.5 * width) { if (height > -2 * width) { if (height < -0.5 * width) { return CO_UP_R; } else { return CO_R; } } else { if (height < 2 * width) { return CO_UP; } else { return CO_UP_L; } } } else { if (height < -2 * width) { if (height < -0.5 * width) { return CO_L; } else { return CO_DN_L; } } else { if (height < 2 * width) { return CO_DN_R; } else { return CO_DN; } } } } void Size::get_dirs_4(Dir &d1,Dir &d2) { if (!width && !height) { d1 = d2 = CO_air; return; } if (width) { d1 = (width > 0) ? CO_R : CO_L; } if (height) { d2 = (height > 0) ? CO_DN : CO_UP; } else { d2 = d1; } if (!width) { d1 = d2; } } void Size::read(InStreamP in) { width = in->read_char(); height = in->read_char(); } int Size::get_write_length() { return 2 * sizeof(char); } void Size::write(OutStreamP out) const { assert(width <= UCHAR_MAX && height <= UCHAR_MAX); out->write_char((u_char)width); out->write_char((u_char)height); } void Size::read_32(InStreamP in) { width = in->read_int(); height = in->read_int(); } int Size::get_write_length_32() { return 2 * sizeof(int); } void Size::write_32(OutStreamP out) const { out->write_int(width); out->write_int(height); } float Size::cross(const Vel &vel) { return width * vel.dy - height * vel.dx; } float Size::dot(const Vel &vel) { return width * vel.dx + height * vel.dy; } void Loc::read(InStreamP in) { r = in->read_short(); c = in->read_short(); } int Loc::get_write_length() { return 2 * sizeof(short); } void Loc::write(OutStreamP out) const { assert(r <= USHRT_MAX && c <= USHRT_MAX); out->write_short((u_short)r); out->write_short((u_short)c); } Boolean Box::overlap(const Loc &l) { if ((l.c >= loc.c) && (l.c < loc.c + dim.colMax) && (l.r >= loc.r) && (l.r < loc.r + dim.rowMax)) { return True; } return False; } Vel Vel::shrink(float k) const { Vel ret = *this; if (ret.dx > k) { ret.dx -= k; } else if (ret.dx < -k) { ret.dx += k; } else { ret.dx = 0.0f; } if (ret.dy > k) { ret.dy -= k; } else if (ret.dy < -k) { ret.dy += k; } else { ret.dy = 0.0f; } return ret; } void Vel::damp(float k) { if (dx > k) { dx -= k; } else if (dx < -k) { dx += k; } else { dx = 0.0f; } if (dy > k) { dy -= k; } else if (dy < -k) { dy += k; } else { dy = 0.0f; } } Boolean Vel::is_zero() const { Boolean ret; if ((dx == 0) && (dy == 0)) { ret = True; } else { ret = False; } return ret; } Dir Vel::get_dir() const { if (!dx && !dy) { return CO_air; } if (dy < 0.5 * dx) { if (dy > -2 * dx) { if (dy < -0.5 * dx) { return CO_UP_R; } else { return CO_R; } } else { if (dy < 2 * dx) { return CO_UP; } else { return CO_UP_L; } } } else { if (dy < -2 * dx) { if (dy < -0.5 * dx) { return CO_L; } else { return CO_DN_L; } } else { if (dy < 2 * dx) { return CO_DN_R; } else { return CO_DN; } } } } void Vel::limit(float k) { assert (k >= 0); if (dx > k) { dx = k; } if (dx < -k) { dx = -k; } if (dy > k) { dy = k; } if (dy < -k) { dy = -k; } } void Vel::get_dirs_4(Dir in[4],Dir out[4],int &inNum,int &outNum) { inNum = 0; outNum = 0; if (dx > 0) { in[inNum] = CO_R; inNum++; } else { out[outNum] = CO_R; outNum++; } if (dy > 0) { in[inNum] = CO_DN; inNum++; } else { out[outNum] = CO_DN; outNum++; } if (dx < 0) { in[inNum] = CO_L; inNum++; } else { out[outNum] = CO_L; outNum++; } if (dy < 0) { in[inNum] = CO_UP; inNum++; } else { out[outNum] = CO_UP; outNum++; } assert(inNum + outNum == 4); } void Dim::read(InStreamP in) { rowMax = in->read_short(); colMax = in->read_short(); } int Dim::get_write_length() { return 2 * sizeof(short); } void Dim::write(OutStreamP out) const { assert(rowMax <= USHRT_MAX && colMax <= USHRT_MAX); out->write_short((u_short)rowMax); out->write_short((u_short)colMax); } Boolean operator == (const Loc &l1, const Loc &l2) { return l1.r == l2.r && l1.c == l2.c; } Boolean operator == (const Pos &p1, const Pos &p2) { return p1.x == p2.x && p1.y == p2.y; } Boolean operator == (const Vel &v1, const Vel &v2) { return v1.dx == v2.dx && v1.dy == v2.dy; } Boolean operator == (const Size &s1, const Size &s2) { if ((s1.width == s2.width) && (s1.height == s2.height)) return True; else return False; } Boolean operator == (const GLoc &g1,const GLoc &g2) { return (g1.horiz == g2.horiz) && (g1.vert == g2.vert); } Boolean operator == (const Dim &d1,const Dim &d2) { return d1.rowMax == d2.rowMax && d1.colMax == d2.colMax; } Boolean operator == (const Rooms &r1,const Rooms &r2) { return r1.acrossMax == r2.acrossMax && r1.downMax == r2.downMax; } Boolean operator != (const GLoc &g1,const GLoc &g2) { return (g1.horiz != g2.horiz) || (g1.vert != g2.vert); } Pos operator + (const Pos &pos,const Size &size) { Pos ret; ret.x = pos.x + size.width; ret.y = pos.y + size.height; return ret; } Pos operator - (const Pos &pos,const Size &size) { Pos ret; ret.x = pos.x - size.width; ret.y = pos.y - size.height; return ret; } Size operator - (const Pos &p1,const Pos &p2) { Size ret; ret.width = p1.x - p2.x; ret.height = p1.y - p2.y; return ret; } Pos operator + (const Pos &pos, const Vel &vel) { Pos ret; /* We want it to round towards zero so that it does the same thing for something going to the right as to the left. */ ret.x = pos.x + (int)vel.dx; ret.y = pos.y + (int)vel.dy; /* ret.x = pos.x + (int)trunc(vel.dx); ret.y = pos.y + (int)trunc(vel.dy); */ return ret; } Size operator * (float k,const Size &size) { Size ret; ret.width = (int)floor(k * size.width); ret.height = (int)floor(k * size.height); return ret; } Vel operator + (const Vel &v1,const Vel &v2) { Vel ret(v1.dx + v2.dx,v1.dy + v2.dy); return ret; } Vel operator + (const Vel &vel, const Acc &acc) { Vel ret(vel.dx + acc.ddx,vel.dy + acc.ddy); return ret; } Vel operator + (const Vel &vel, const Size &size) { Vel ret(vel.dx + size.width,vel.dy + size.height); return ret; } Vel operator * (float k,const Vel &vel) { Vel ret(k * vel.dx, k * vel.dy); return ret; } Vel operator / (float k,const Vel &vel) { Vel ret(k / vel.dx, k / vel.dy); return ret; } Vel operator + (float k,const Vel &vel) { Vel ret(k + vel.dx,k + vel.dy); return ret; } Acc operator * (int k,const Acc &acc) { Acc ret; ret.ddx = k * acc.ddx; ret.ddy = k * acc.ddy; return ret; } Size operator + (const Size& s1,const Size& s2) { Size ret; ret.set(s1.width + s2.width,s1.height + s2.height); return ret; } #if 0 Size& operator += (Size& s1,const Size& s2) { s1.width += s2.width; s1.height += s2.height; return s1; } #endif Boolean Coord::is_dir_pure(Dir dir) { return dir >= CO_R && dir < (CO_R + CO_DIR_PURE); } Dir Coord::dir_opposite(Dir dir) { if (dir == CO_air) return CO_air; assert(dir >= CO_R && dir < CO_DIR_MAX); return ((dir - CO_R + CO_DIR_PURE / 2) % CO_DIR_PURE) + CO_R; } Dir Coord::movement_dir_4(Dir dir) { switch(dir) { case CO_center: case CO_air: case CO_climb: case CO_r: case CO_dn: case CO_l: case CO_up: return CO_air; case CO_center_R: case CO_dn_R: case CO_up_R: case CO_air_R: case CO_climb_R: case CO_UP_R: case CO_UP_R_R: case CO_R: case CO_DN_R_R: case CO_DN_R: return CO_R; case CO_air_DN: case CO_r_DN: case CO_l_DN: case CO_climb_DN: case CO_DN_DN_R: case CO_DN: case CO_DN_DN_L: return CO_DN; case CO_center_L: case CO_dn_L: case CO_up_L: case CO_air_L: case CO_climb_L: case CO_UP_L: case CO_UP_L_L: case CO_L: case CO_DN_L_L: case CO_DN_L: return CO_L; case CO_air_UP: case CO_r_UP: case CO_l_UP: case CO_climb_UP: case CO_UP_UP_R: case CO_UP: case CO_UP_UP_L: return CO_UP; default: assert(0); return CO_air; } } Dir Coord::parallel_dir(Stance stance) { switch (stance) { case CO_r: case CO_l: case CO_climb: return CO_DN; case CO_up: case CO_dn: case CO_center: return CO_R; case CO_air: return CO_air; default: assert(0); return CO_air; } } Pos Coord::shot_initial_pos(const Area &area,Touching touching, const Size &shotSize,Dir shotDir) { // Return value; Pos ret; Pos pos; Size size; area.get_rect(pos,size); // Set x coord. switch (shotDir) { case CO_UP_R: case CO_UP_R_R: case CO_R: case CO_DN_R_R: case CO_DN_R: if (shotSize.width <= size.width) ret.x = pos.x + size.width - shotSize.width; else ret.x = pos.x; break; case CO_UP_L: case CO_UP_L_L: case CO_L: case CO_DN_L_L: case CO_DN_L: if (shotSize.width <= size.width) ret.x = pos.x; else ret.x = pos.x + size.width - shotSize.width; break; case CO_UP_UP_L: case CO_UP: case CO_UP_UP_R: case CO_DN_DN_L: case CO_DN: case CO_DN_DN_R: case CO_air: ret.x = (int)(pos.x + size.width * .5 - shotSize.width * .5); if (touching == CO_l) { ret.x = Utils::maximum(ret.x,pos.x); } else if (touching == CO_r) { ret.x = Utils::minimum(ret.x + shotSize.width,pos.x + size.width) - shotSize.width; } break; default: assert(0); } // Set y coord. switch (shotDir) { case CO_DN_L: case CO_DN_DN_L: case CO_DN: case CO_DN_DN_R: case CO_DN_R: if (shotSize.height <= size.height) ret.y = pos.y + size.height - shotSize.height; else ret.y = pos.y; break; case CO_UP_L: case CO_UP_UP_L: case CO_UP: case CO_UP_UP_R: case CO_UP_R: if (shotSize.height <= size.height) ret.y = pos.y; else ret.y = pos.y + size.height - shotSize.height; break; case CO_UP_R_R: case CO_R: case CO_DN_R_R: case CO_UP_L_L: case CO_L: case CO_DN_L_L: case CO_air: ret.y = (int)(pos.y + size.height * .5 - shotSize.height * .5); if (touching == CO_up) { ret.y = Utils::maximum(ret.y,pos.y); } else if (touching == CO_dn) { ret.y = Utils::minimum(ret.y + shotSize.height,pos.y + size.height) - shotSize.height; } break; default: assert(0); } return ret; } NetData::NetData() { lastModified = 0; fClocked = False; sent = False; // means is unspecified. tickType = TICK_MAX; } Touching Coord::dir_to_touching(Dir dir) { switch (dir) { case CO_r: case CO_r_DN: case CO_r_UP: return CO_r; case CO_dn: case CO_dn_R: case CO_dn_L: case CO_center: case CO_center_R: case CO_center_L: return CO_dn; case CO_l: case CO_l_DN: case CO_l_UP: return CO_l; case CO_up: case CO_up_R: case CO_up_L: return CO_up; default: return CO_air; } } Touching Coord::zero_offset_generator(Dir) { // See Coord::generate_offsets. return CO_UP_L; } void Coord::generate_offsets(Size offsets[CO_DIR_MAX], const Size sizes[CO_DIR_MAX],const Size &sizeMax, Touching (*dirToTouching)(Dir)) { Dir dir; for (dir = 0; dir < CO_DIR_MAX; dir++) { Touching touching = dirToTouching(dir); assert(touching == CO_r || touching == CO_dn || touching == CO_l || touching == CO_up || touching == CO_air || touching == CO_UP_L); // CO_UP_L is a flag that means the offsets should both be zero. if (touching == CO_UP_L) { offsets[dir].width = 0; offsets[dir].height = 0; } // Normal touching values. else { if (touching == CO_r) { offsets[dir].width = sizeMax.width - sizes[dir].width; } else if (touching == CO_l) { offsets[dir].width = 0; } else { offsets[dir].width = (sizeMax.width - sizes[dir].width) >> 1; } if (touching == CO_dn) { offsets[dir].height = sizeMax.height - sizes[dir].height; } else if (touching == CO_up) { offsets[dir].height = 0; } else { offsets[dir].height = (sizeMax.height - sizes[dir].height) >> 1; } } // not CO_UP_L } } signed char NetData::gClocked = -1; // disabled by default. unsigned int OneTransform::compute_key(const TransformType* transforms,int tNum) { assert(TRANSFORMS_MAX == 2); // Or we need to change this code. assert(tNum <= TRANSFORMS_MAX); if (tNum == 0 || (tNum == 1 && transforms[0] == TR_NONE)) { return 0x0; } if (tNum == 1) { switch (transforms[0]) { case TR_RT_1: return 0x1; case TR_RT_2: return 0x2; case TR_RT_3: return 0x3; case TR_RF_X: return 0x4; } } if (tNum == 2) { // Reflection always goes before rotation in canonical order. assert(transforms[0] == TR_RF_X); switch (transforms[1]) { case TR_RT_1: return 0x5; case TR_RT_2: return 0x6; case TR_RT_3: return 0x7; } } // Shouldn't get here. assert(0); return 0x0; } Boolean Transform2D::is_base(Dir d,TransformMap* override) { // Check whether to use override or default. OneTransform* trans; if (override && (*override)[d].transformsNum != TR_USE_DEFAULT) { trans = &(*override)[d]; } else { trans = &transforms[d]; } return trans->transformsNum == 0; } Dir Transform2D::get_base(Dir d,TransformMap* override) { assert(!is_base(d,override)); // Check whether to use override or default. OneTransform* trans; if (override && (*override)[d].transformsNum != TR_USE_DEFAULT) { trans = &(*override)[d]; } else { trans = &transforms[d]; } return trans->base; } const TransformType* Transform2D::get_transforms(int &tNum,Dir d, TransformMap* override) { assert(!is_base(d,override)); // Check whether to use override or default. OneTransform* trans; if (override && (*override)[d].transformsNum != TR_USE_DEFAULT) { trans = &(*override)[d]; } else { trans = &transforms[d]; } // Special check for the identity transformation. if (trans->transforms[0] == TR_NONE) { assert(trans->transformsNum == 1); tNum = 0; return NULL; } tNum = trans->transformsNum; return trans->transforms; } Pos Transform2D::apply(TransformType tt,const Pos &pos,const Size &size) { switch (tt) { case TR_NONE: return pos; case TR_RT_1: return Pos(size.height - 1 - pos.y,pos.x); case TR_RT_2: return Pos(size.width - 1 - pos.x,size.height - 1 - pos.y); case TR_RT_3: return Pos(pos.y,size.width - 1 - pos.x); case TR_RF_X: return Pos(size.width - 1 - pos.x,pos.y); default: assert(0); // Will all compilers accept this syntax? return Pos(); } } Size Transform2D::apply(TransformType tt,const Size &size) { switch (tt) { case TR_NONE: return size; case TR_RT_1: case TR_RT_3: { Size ret; ret.set(size.height,size.width); return ret; } case TR_RT_2: case TR_RF_X: return size; default: assert(0); // Will all compilers accept this syntax? return size; } } Pos Transform2D::apply_all(Dir d,const Pos &pos,const Size &size, TransformMap* override) { int tNum; const TransformType* transforms = Transform2D::get_transforms(tNum,d,override); Pos ret = pos; for (int m = 0; m < tNum; m++) { ret = Transform2D::apply(transforms[m],ret,size); } return ret; } // Transform2D::transforms is defined in transform.bitmaps included in // physical.cpp xevil-2.02r2.orig/cmn/game.cpp0100644000175000017500000031263007637251020015503 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "game.cpp" #if X11 #ifndef NO_PRAGMAS #pragma implementation "game.h" #endif #endif // Include Files #include "stdafx.h" extern "C" { #include } #if X11 #include #endif #if WIN32 #include #endif #include #include "utils.h" #include "coord.h" #include "world.h" #include "id.h" #include "intel.h" #include "physical.h" #include "actual.h" #include "locator.h" #include "ui.h" #include "game_style.h" #include "game.h" #include "sound.h" #include "xetp.h" #include "l_agreement.h" #if WIN32 #include "uiplayer.h" #include "uiserver.h" #include "xviewport.h" #include "resource.h" #endif #if X11 extern "C" { #include } #endif // Defines #define VERSION "2.02r2" // 2.0 Beta 4B is the RedHat Linux version. // 2.02 is GPL // 2.02 r2 is updated for gcc 3.2 #ifdef XEVIL_KEYSET #define KEYSET_DEFAULT XEVIL_KEYSET #else // Used to be UIdecmips, but now Linux is probably the most common. // This corresponds to the standard IBM keyboard. #define KEYSET_DEFAULT UIlinux #endif #ifndef XEVIL_CLASS #define XEVIL_CLASS "XEvil" #endif #define WORLD_ACROSS_MAX_DEFAULT 5 // 4 increase because made rooms smaller #define WORLD_DOWN_MAX_DEFAULT 2 #define QUANTA_DEFAULT 40 // In milliseconds #define QUANTA_MAX 500 #define EXTRA_TURNS 50 #define DEMO_EXTRA_TURNS EXTRA_TURNS #define OTHER_INPUT_RESET 160 #define HUMANS_NUM_DEFAULT 1 #define ENEMIES_NUM_DEFAULT 0 // 3 #define REFILL_TIME 260 #define EXTRA_ITEMS_MULTIPLIER 8 #define LEVEL_TITLE_TIME 40 #define GET_BEARINGS_TIME UI_ARENA_MESSAGE_TIME #define AWARD_BONUS_TIME UI_ARENA_MESSAGE_TIME #define DEMO_CUTOFF_TIME 400 #define DRAWING_ALGORITHM_DEFAULT Locator::DRAW_MERGE_AREAS #define OBJECT_WORLD_PERCENT_MIN .00019 #define NEW_LEVEL_TIME UI_ARENA_MESSAGE_TIME #define PREPARE_CONNECT_TIME 2 #define AWARD_BONUS_TRIES 50 // Chance there will be one this level #define ALTAR_OF_SIN_CHANCE 8 // Play sound #define SOUNDONOFF_DEFAULT True char *Game::wittySayings[Game::WITTY_SAYINGS_NUM] = { "If it moves it's a threat. If it doesn't move it's a potential threat.", "Happy, happy. Joy, joy.", "For the mother country!!!", "Hi ho. Hi ho. It's off to kill we go.", "Well, do you feel lucky, Punk?", "Wake up, time to die.", "Let's rock.", "I love the smell of napalm in the morning.", "How's it feel to be hunted?", "Go ahead, make my day.", "I'll be back.", "Won't you be my neighbor?", "3E. We bring good things to death.", "We come in peace. (Shoot to kill. Shoot to kill.)", "Hey. You can't do that.", "I'm here to chew bubble-gum and kick ass. And I'm all out of bubble-gum.", "You're a useless asshole, Pogo-Man.", "Settle down, Beavis.", "Ho, ho, ho. Now I have a machine gun.", "Aren't you dead yet?", "I don't give a fuck what you know. I'm going to torture you anyway.", "I'm hungry. Let's get a taco.", "I'm sorry, Dave. I can't do that.", "Violence is the only true form of communication.", "Let the flames purify your soul!!!", "Fuck me gently with a chainsaw.", "He doesn't look like a quivering ball of white-hot canine fury.", "Hackito ergo sum.", "I'm singing in the rain...", "Washin' the dog!! Washin' the dog!!", "ooooh. That's gotta hurt.", "Kids, don't try this at home. We're trained professionals.", "Oh, you want some of this?! Fuck you!", "Well, he shoulda' armed himself!", "Fuck art. Let's kill.", "If you can't eat it or fuck it, kill it.", "Skrotus lives in my fridge.", "I love you. You love me. We're a happy family.", "You always were an asshole, Gorman.", "Change it dude. This sucks.", "The game of death, doom, and (more or less) ultimate destruction.", "I think I'll just Dieeeeeee.", "You know he'll feel that one in the morning.", "I've had this ice-cream bar since I was a child.", "Shut up or I will kill you. I will physically kill you.", "Better stop before someone gets hurt.", "What??", "Whoa!!", "Jesus will love you if you give me money.", "Evil. It's not just for breakfast anymore.", "XEvil. The carpal tunnel game.", "Violence. It's not just the best policy. It's the only policy.", "Got ... to get ... to ... my arm.", "Who's the lucky one?", "Don't blink. It would really suck if you blinked.", "Here kitty, kitty, kitty.", "Stay on target...", "Do not taunt Happy-Fun-Ball.", "Bring out the gimp. Gimp's sleepin.\nWell, I guess you'll just have to go wake him up now, won't you.", "That's easy.", "It's just a rabbit.", "Ignorance is the number one cause of happiness.", "What the heck's going on? I thought I was a normal guy.", "Oh, no. It's K-k-k-ken c-c-c-coming to k-k-k-kill me.", "You bloated sack of protoplasm.", "The weak exist only to amuse the strong.", "We're not hitch-hiking anymore. We're riding.", "No, sir. I didn't like it.", "Are we there yet?", "Kurt Cobain spoke for my generation.", "We're on a mission from God.", "Oh, I'm a lumberjack and I'm ok...", "I'm sorry. You must have mistaken me for the clown that gives a damn.", "Another visitor. Stay awhile. STAY FOREVER!!!!", "I laughed. I cried. It was better than Cats.\nI'd see it again and again.", "SPOON!!!", "Only life can kill you.", "That which does not kill us, hurts.", "Hey, baby. Wanna wrestle.", "Fuck you and the horse you rode in on.", "Spin, spin, spin, spin, spin, spin, spin...", "Dope will get you through times of no money\nbetter than money will get you through times of no dope.", "What he said.", "Like, take off, eh.", "Lord God, Leroy, that was the toughest meanest hippie I ever saw.", "Happy thoughts. Happy thoughts. Happy thoughts.", "M*cr*s*ft: Who need quality when you have marketing.", "The proof is left as an exercise.", "Ummm... We have a problem.", "Come see the violence inherent in the system.\nHelp! Help! I'm being repressed.", "Hey, man, you a sniper? Shut up.\nYou sure look like a sniper. I said, shut up.", "Oh, I'm sorry. Did that hurt?", "What me worry?", "Nobody expects the Spanish Inquisition!!!", "We are, we are, we are, we are, we are the engineers.\nWe can, we can, we can, we can demolish forty beers.", "When in doubt, shoot the lawyer.", "All that hate's gonna burn you up, boy.\nKeeps me warm.", "He lives in that piece of paper?\nNo, you idiot. He lives in a regular house.", "I'll give you something to cry about.", "It's not a bug, it's a feature.", "Don't hate me because I'm beautiful.", "What a great game of cards this is.", "You're ugly and your mother dresses you funny.", "I can eat fifty eggs.", "What we have here is failure to communicate.", "Jesus loves me more than you.", "Are you threatening me!!!??", "I need TP for my bunghole.", "You're immune to both romance and mirth. You must be a... a...\nThat's right. I'm an engineer.", "Out Out!! You demons of stupidity!!", "To infinity, and beyond!!!", "I love Bomb. It's nice.", "Marines! We are leaving.", "Toad Sexing kicks ass.", "Let me try that again.", "I is a college graduate.", "FRIDAY!!! ... IN STEREO!!! ...", "I'll get you, my pretty. And your little dog, too!", "I hold the keys to the kingdom!\nI'm the God! I'm the God!", "We're going to need a bigger boat.", "Time for some righteous killing in the name of Our Lord and Savior Jesus Christ.", "The Rivers shall Run Red with the blood of the infidels!", "Oh, my God! They killed Kenny!", "I'm not fat, I'm big boned", "Kick the baby.", "fnord", "Save the planet. Kill yourself.", "I just do what the voices in my head tell me to.", "Here's to you, T-Bird.", "Whole new paradigm. Same old shit.", "Teen suicide. Just do it.", "It's the history eraser button, you fool!!", "XEvil is mother. XEvil is father.", "You die. She dies. Everybody dies.", "Aaaaa!! My soul is trapped in XEvil. Send help!!", "Bugs Bugs Bugs Bugs Bugs Bugs Bugs Bugs Bugs Bugs\nBugs Bugs Bugs Bugs Bugs Bugs Bugs Bugs Bugs Bugs", "Fuck 'em if they can't take a joke.", "Nah, nah, nah, naaah. You lose a plot of land.", "Crom!!!", "The enemy's gate is down.", "Just because you're paranoid, doesn't mean they're not out to get you.", "And it won't even run down your battery.", "How can you have any pudding if you don't eat your meat!!?", "You're my bitch now.", "Prepare to Qualify.", "I got a bad feeling about this drop.", "Cowboys never quit!", }; char *Game::intelNames[Game::INTEL_NAMES_NUM] = { "Dr. Pain", "Steve", "hardts", "James E. Tetazoo", "Arnold", "Victor the Cleaner", "Hudson", "Hicks", "Twinkie Boy", "Bob", "Ben Bitdiddle", "Beavis", "Butt-Head", "Fred", "Mulch-Man", "Mike", "Tim", "Peter", "Alan", "Neal", "Tony", "Asshole", "Crazy Hairy", "Spaceman Spiff", "Kitty-Wench", "Juker", "Shrieks", "Albert Lin", "Jim Gouldstone", "Steph", "Paining", "Dim", "The Man", "Twinkie Girl", "Mr. Buzzcut", "Sensei Steve", "Ren", "Stimpy", "Mr. Horse", "Dilbert", "Dogbert", "Gromit", "The Tick", "Fat Freddie", "Phineas", "Freewheelin Franklin", "Doctor Who", "Celery-Head-Man", "Roo", "Shwang", "Leo", "Smoothie", "Hawaii Chick", "Cowboy Steve", "Outlaw Jim", "Prick", "Smack", "Hello, Kitty", "Wedge", "Redshirt", "Mistress Leah", "e^x Man", "John Rusnak", "Mr. Bonk", "Pixie of Pass/Fail", "Josh the 10-yr Old", "Little Wooden Boy", "Brain", "Kenny", "Kyle", "Cartman", "Stan", "Mr. Hat", "Cid", }; DifficultyLevel Game::difficultyLevels[DIFFICULTY_LEVELS_NUM] = { /* reflexes, enemiesInitial, enemiesIncr, enemiesMax, name */ { 40, 2, 1, 10, "trivial" }, { 6, /*8*/ 3, 2, 50, "normal" }, { 4, 5, 5, 50, "hard" }, { 0, 20, 10, 1000000, "bend-over" }, }; RankingSet Game::rankingSets[RANKING_SETS_NUM] = { /* minKills followed by the set of possible ranks. */ { 0, { "Hell's Peg Boy", "Satan's Vibrating Sex Toy", "Hell's Semen Taster", "Satan's Enema", "Member of Hell's Children's Choir", NULL, }}, { 10, { "Hell's Proctologist", "Hell's Fluffer", "Satan's Earwax Remover", "Prostitute in Hell's Brothel", "Fecal Sorter", NULL, }}, { 25, { "Hell's Speedbump", "Hell's Janitor", "Cook in Hell's Cafeteria", "Hell's Shoe Salesman", "Hell's Chili Taster", "Satan's Shoehorn", NULL, }}, { 40, { "IS Tech Support for Hell", "QA of Vomit Production", "Teacher at Beelzebub Jr. High", "Hell's Copier Repairman", "Hell's Plumber", NULL, }}, { 60, { "Guidance Counselor at Mephistopheles High", "Hell's Doorman", "Hell's Aerobic Instructor", "Hell's Sysadmin", "Satan's Used Car Salesman", "Hell's Dentist", "Hell's Social Worker", NULL, }}, // Middle management level. { 90, { "Manager, Soul Collection Department", "Manager, Hell Climate Control", "Manager, Medieval Torture Devices Maintenance", "Manager, Department of Temptation", "Manager, Department of Graft and Corruption", NULL, }}, { 90, { "Hell's Chief Build Engineer", "Drill Sergeant for Hell's New Recruits", "Pimp in Hell's Brothel", "Postal Worker", NULL, }}, { 130, { "Torture Methods Research Scientist", "VP of Hell's PR Department", "Strategic Planner, Plague and Pestilence", NULL, }}, { 170, { "VP of Hell Marketing", "VP of Hell Legal", "VP of Soul Purchases", "VP of Worldly Corruption", NULL, }}, { 250, { "High Priest of Torture", "Lead Software Engineer of Hell", NULL, }}, { 666, { "Replace Bill as Satan's Right Hand Man", NULL, }}, { 666666666, { "You are the new Satan", NULL, }}, }; // Functions void GameStats::report() { if (numTurns % Game::REPORT_TIME == 0) cout << "Turn " << numTurns << ": Average time of turn: " << aveTime << endl; } void GameStats::clock() { time_t oldPrevTime = prevTime; time(&prevTime); if (numTurns) aveTime = (numTurns * aveTime + (prevTime - oldPrevTime)) / (numTurns + 1); numTurns++; } GameObjects::GameObjects(WorldP w,LocatorP l) : world(w),locator(l) { resetCalled = False; for (int n = 0; n < A_CLASSES_NUM; n++) { maximums[n] = 0; actuals[n] = 0; ids[n] = NULL; } } GameObjects::~GameObjects() { for (int n = 0; n < A_CLASSES_NUM; n++) { if (ids[n]) delete [] ids[n]; } } void GameObjects::game_reset(const char *one_item, Boolean no_items,Boolean one_each) { oneItem = one_item; noItems = no_items; oneEach = one_each; resetCalled = True; // level_reset(worldDim); } void GameObjects::level_reset(const Dim &worldDim,GameStyleP style) { // WARNING: GameObjects forgets about old items. Not a memory leak, but // this may end up with more and more items coming into existence. // We do want to kill off extra AltarOfSins, though. int n; for (n = 0; n < actuals[A_AltarOfSin]; n++) { PhysicalP p = locator->lookup(ids[A_AltarOfSin][n]); if (p) { Game::off_clock_kill(locator,p); } } // Initialize arrays. for (n = 0; n < A_CLASSES_NUM; n++) { maximums[n] = 0; actuals[n] = 0; levelAlready[n] = 0; levelMaxTimes[n] = 0; // infinity if (ids[n]) { delete [] ids[n]; ids[n] = NULL; } } // Get arrays of potential weapons and potential otherItems. int weaponsNum; const PhysicalContext *weapons[A_CLASSES_NUM]; weaponsNum = locator->filter_contexts(weapons,NULL, potential_weapon_filter,NULL); int oItemsNum; const PhysicalContext *oItems[A_CLASSES_NUM]; oItemsNum = locator->filter_contexts(oItems,NULL, potential_other_item_filter,NULL); // Let Style filter out to specific weapons and items, if desired. // Must pass in arrays of length A_CLASSES_NUM. style->filter_weapons_and_other_items(locator,weaponsNum,weapons,oItemsNum,oItems); // Normal case. if (!Utils::strlen(oneItem) && !noItems && !oneEach) { // Area of the world. int areaFactor = worldDim.rowMax * worldDim.colMax; // Set maximums[n] for all potential weapons, n. for (n = 0; n < weaponsNum; n++) { // Check not already set. assert(maximums[weapons[n]->classId] == 0); // Don't allow objectWorldPercent values that are too small. float objWPercent = (float)max(weapons[n]->objectWorldPercent, OBJECT_WORLD_PERCENT_MIN); maximums[weapons[n]->classId] = (int)ceil(areaFactor * objWPercent); // A limit may be placed on how many times the object comes back // in a level. levelMaxTimes[weapons[n]->classId] = weapons[n]->levelMaxTimes; } // Set maximums[n] for all potential other items, n. for (n = 0; n < oItemsNum; n++) { // Check not already set. assert(maximums[oItems[n]->classId] == 0); float objWPercent = (float)max(oItems[n]->objectWorldPercent, OBJECT_WORLD_PERCENT_MIN); maximums[oItems[n]->classId] = (int)ceil(areaFactor * objWPercent); levelMaxTimes[oItems[n]->classId] = oItems[n]->levelMaxTimes; } // Should we have an Altar this level. maximums[A_AltarOfSin] = (Utils::choose(ALTAR_OF_SIN_CHANCE) == 0); // Really should get it from PhysicalContext. levelMaxTimes[A_AltarOfSin] = 1; } // If only one item in the Game. else if (Utils::strlen(oneItem)) { ClassId classId = Game::parse_class_name(locator,oneItem); if (classId != A_None) { maximums[classId] = 1; } } // One of each object. else if (oneEach) { for (n = 0; n < weaponsNum; n++) { maximums[weapons[n]->classId] = 1; } for (n = 0; n < oItemsNum; n++) { maximums[oItems[n]->classId] = 1; } maximums[A_AltarOfSin] = 1; } // Compute actuals from maximums. compute_actuals(weapons,weaponsNum,oItems,oItemsNum); // Somewhat of a hack. Always want maximum number when using oneItem or // oneEach. if (strlen(oneItem) || oneEach) { for (n = 0; n < A_CLASSES_NUM; n++) { actuals[n] = maximums[n]; } } // Create the arrays of ids for each object type. // Only need space for actuals[n]. for (n = 0; n < A_CLASSES_NUM; n++) if (actuals[n]) { Id invalid; ids[n] = new Id[actuals[n]]; assert(ids[n]); for (int m = 0; m < actuals[n]; m++) ids[n][m] = invalid; // Explicitly initialize ids because different C++ compilers follow // different rules about constructing elements of an array. } } void GameObjects::refill() { assert(resetCalled); int n; for (n = 0; n < A_CLASSES_NUM; n++) { if (actuals[n]) { // We know that the actuals is indexed by classId. const PhysicalContext *cx = locator->get_context((ClassId)n); assert(cx); refill_helper(cx,n); } } } Boolean GameObjects::is_available(const Id &id) { PhysicalP p = locator->lookup(id); if (!p) { return False; } // Only count items that aren't held by other players. if (p->is_item()) { return !((ItemP)p)->is_held(); } return True; } // Ahh, no more #define REFILL_HELPER(). It's a real function now. void GameObjects::refill_helper(const PhysicalContext *cx,int which) { int existsNum = 0; int m; for (m = 0; m < actuals[which]; m++) { if (is_available(ids[which][m])) { existsNum++; } } int newOnes = actuals[which] - existsNum; // Don't create object more that levelMaxTimes per level. if (levelMaxTimes[which]) { // 0 means infinity newOnes = Utils::minimum(newOnes, levelMaxTimes[which] - levelAlready[which]); } // Now create the new ones. for (m = 0; newOnes > 0; m++) { assert(m < actuals[which]); if (!is_available(ids[which][m])) { Pos pos = world->empty_rect(cx->sizeMax); assert(cx->create); PhysicalP p = cx->create(cx->arg,world,locator,pos); // Increment number of times created this level. levelAlready[which]++; locator->add(p); ids[which][m] = p->get_id(); newOnes--; } } } void GameObjects::compute_actuals(const PhysicalContext *weapons[], int weaponsNum, const PhysicalContext *oItems[], int oItemsNum) { // Initialize all actuals to 0. int n; for (n = 0; n < A_CLASSES_NUM; n++) actuals[n] = 0; // Number of weapon and otherItems classes to include in this level. int weaponsLevel = 2 + Utils::choose(5); // 2 <= weaponsLevel <= 6 int oItemsLevel = 1 + Utils::choose(5); // 1 <= oItemsLevel <= 5 if (weaponsLevel > weaponsNum) { weaponsLevel = weaponsNum; } if (oItemsLevel > oItemsNum) { oItemsLevel = oItemsNum; } // assert(weaponsLevel <= weaponsNum && oItemsLevel <= oItemsNum); Not since role can filter them. // Rank the weapon and other classes. int *weaponsRank = new int[weaponsNum]; Utils::random_list(weaponsRank,weaponsNum); int *oItemsRank = new int[oItemsNum]; Utils::random_list(oItemsRank,oItemsNum); // Set actuals to be non-zero for weaponsLevel number of classes. Choose // those ranked highest according to weaponsRank. for (n = 0; n < weaponsLevel; n++) { int which = weapons[weaponsRank[n]]->classId; actuals[which] = maximums[which] ? (Utils::choose(maximums[which]) + 1) : 0; // cout << "actuals[" << weapons[weaponsRank[n]]->className << "] = " // << actuals[which] << " of " << maximums[which] << endl; } // Set actuals to be non-zero for oItemsLevel number of classes. Choose // those ranked highest according to oItemsRank. for (n = 0; n < oItemsLevel; n++) { int which = oItems[oItemsRank[n]]->classId; actuals[which] = maximums[which] ? (Utils::choose(maximums[which]) + 1) : 0; // cout << "actuals[" << oItems[oItemsRank[n]]->className << "] = " // << actuals[which] << " of " << maximums[which] << endl; } // cout << endl; delete [] weaponsRank; delete [] oItemsRank; // Altar of sin is special. if (maximums[A_AltarOfSin]) { actuals[A_AltarOfSin] = maximums[A_AltarOfSin]; } } Boolean GameObjects::potential_weapon_filter(const PhysicalContext* cx,void*) { return cx->potentialWeapon; } Boolean GameObjects::potential_other_item_filter(const PhysicalContext* cx, void*) { return cx->potentialOtherItem; } Game::Game(int *arg_c,char **arg_v) : world(), soundManager(SOUNDONOFF_DEFAULT,&locator), locator(&world,DRAWING_ALGORITHM_DEFAULT,&soundManager), gameObjects(&world,&locator) { // Move earlier, so it is before error messages. intro(); // Call even for a non-network game. Good to check our assumptions. XETP::check_sizes(); // Just for tracing in the debugger. char* version = Utils::get_OS_info(); delete version; noUi = False; noNewLevel = False; observer = False; dedicatedServer = False; uiKeyset = UIunspecifiedKeyset; // an invalid value. fullScreen = False; // Now Ui is created after parse_args for X and Windows. ui = NULL; world.set_locator(&locator); // Always normal difficulty for demo. difficulty = DIFF_NORMAL; #if WIN32 // Since Windows has a good UI for setting difficulty, don't force // user to set it. difficultyNext = DIFF_NORMAL; #endif #if X11 // DIFF_NONE will always ask for level of difficulty. difficultyNext = DIFF_NONE; #endif Enemy::set_reflexes_time(difficultyLevels[difficulty].reflexes); quitGame = False; currentSoundName = 0; #if WIN32 musictype=UIsettings::MIDI; #endif startImmediately = False; argc = arg_c; argv = arg_v; refillTimer.set(REFILL_TIME); noLevelTitle = False; pause = False; // Now style isn't set until after/during parse_args. style = NULL; humansNumNext = HUMANS_NUM_DEFAULT; // Before parse_args. for (int n = 0; n < Locator::HUMANS_MAX; n++) { humanNames[n] = Utils::strdup(""); } // Must be before parse_args. enemiesNumNext = ENEMIES_NUM_DEFAULT; cooperative = cooperativeNext = False; enemiesRefill = enemiesRefillNext = False; quanta = -1; humansPlayingPrev = enemiesPlayingPrev = 0; enemyNameCount = 0; worldRooms.downMax = WORLD_DOWN_MAX_DEFAULT; worldRooms.acrossMax = WORLD_ACROSS_MAX_DEFAULT; intelHarmless = False; showStats = False; noItems = False; oneEach = False; oneItem = Utils::strdup(""); humanClass = A_None; humanExtraAbility = AB_MAX; // no extra abilities noDemo = False; infiniteLives = False; worldFile = NULL; role = NULL; //------------------------------ PARSE_ARGS ------------------------------ parse_args(argc,argv); //--------------------------- AFTER PARSE_ARGS --------------------------- // Put after parse_args() so DebugInfo()::turn_on() can be called. DebugInfo::initialize(); // Wasn't assigned in parse_args, so use appropriate default. if (role == NULL) { if (dedicatedServer) { // -dedicated, but not -server role = new Server(False,NULL,&locator); } else { role = new StandAlone(); } } assert(role); // Before check that role is ok(). if (noUi && role->get_type() != R_SERVER) { cerr << "Can only set -no_ui if running as a server." << endl; noUi = False; } // Create the UI, this is now the only place the Ui is created. #if X11 if (!noUi) { ui = new Ui(arg_c,arg_v,&world,&locator, display_names(arg_c,arg_v),font_name(arg_c,arg_v), &soundManager,difficultyLevels, role->get_type()); assert(ui); } #endif #if WIN32 // noUi is meaningless on Windows. if (dedicatedServer) { ui = new UiServer(&locator); // Start immediately if a dedicated server. startImmediately = True; } else { ui = new UiPlayer(arg_c,arg_v,&world,&locator, display_names(arg_c,arg_v),font_name(arg_c,arg_v), &soundManager,difficultyLevels, fullScreen ? Xvars::FULL_SCREEN_MODE : Xvars::WINDOW_SCREEN_MODE, VERSION); } assert(ui); #endif if (ui) { // Moved out of parse_args, because Ui might not exist. if (uiKeyset != UIunspecifiedKeyset) { for (int dpyNum = 0; dpyNum < ui->get_dpy_max(); dpyNum++) { ui->set_keyset(dpyNum,uiKeyset); } } ui->set_world_rooms(worldRooms); ui->set_enemies_num(enemiesNumNext); ui->set_enemies_refill(enemiesRefillNext); ui->set_cooperative(cooperativeNext); ui->set_quanta(quanta); ui->set_difficulty(difficultyNext); #if WIN32 ui->set_role_type(role->get_type()); ui->set_musictype(musictype); ui->set_sound_onoff(soundManager.isSoundOn()); ui->set_track_volume(soundManager.getTrackVolume()); ui->set_sound_volume(soundManager.getEffectsVolume()); #endif } // If we aren't displaying a UI, start the game immediately. if (!ui) { startImmediately = True; } // Depends on the role humansNumNext = limit_humans_num(humansNumNext); // Not good that we are calling methods on role before role->connect(). // This specific case is ok. role->set_humans_num(humansNumNext); if (ui) { ui->set_humans_num(role->get_humans_num()); } // If quanta wasn't set in parse_args. if (quanta == -1) { quanta = QUANTA_DEFAULT; } if (ui) { ui->set_quanta(quanta); } // If style hasn't already been set. if (!style) { GameStyleType gsType = role->get_default_game_style(); style = GameStyle::by_type(gsType); assert(style); } // Can't set this earlier, because isn't guaranteed to exist until now. if (ui) { ui->set_style(style->get_type()); } // After parse_args state = noDemo ? demoOff : demoOn; // Delay connecting to server until after Ui has initialized graphics on // Windows, ui->add_viewport(). if (role->get_type() == R_CLIENT) { state = prepareConnect; timer.set(PREPARE_CONNECT_TIME); } // Tell Server to start running. We can't just do everything in the Server // constructor because (UNIX only) the constructor of Ui may block for // arbitrary amount of time waiting for the License Agreement Dialog. if (role->get_type() == R_SERVER) { ((ServerP)role)->run(); } // By default, next game will be the same style as this one. styleNext = style->clone(); // world.set_rooms_next(worldRooms); // Now in Game::reset. // Must be before first call to Ui::set_input. if (ui) { process_x_resources(argc,argv); ui->set_input(0,UI_KEYS_RIGHT); ui->set_enemies_num(enemiesNumNext); } locator.set_messages_ignore(True); // Must be after intro(). // World title map needs to know the dimensions of the viewport. // If no Ui, don't really care about the title/demo screen. if (ui) { // The IViewportInfo is valid after the ui is constructed. world.title_map(Ui::get_viewport_info()); } if (role->get_type() != R_CLIENT) { if (state == demoOn) { timer.set(DEMO_CUTOFF_TIME); demo_setup(); } } // randomize the list of in the constructor just to be sure. Utils::random_list(intelNamesIndices,INTEL_NAMES_NUM); levelTitleStored = NULL; #if WIN32 start_soundtrack(); #endif } Game::~Game() { if (oneItem) { delete oneItem; } delete ui; delete style; delete styleNext; delete role; #if WIN32 soundManager.stopCD(); soundManager.stopMIDI(); #endif delete levelTitleStored; for (int n = 0; n < Locator::HUMANS_MAX; n++) { Utils::freeif(humanNames[n]); } } const char* Game::get_version_string() { return VERSION; } static RestartEnd restartEnd; void Game::pre_clock() { restartEnd = RE_NONE; ui_settings_check(restartEnd); // Must be before ui->clock(). // Start new game because of user input. if (!pause && state == gameOver && timer.ready() && ui && ui->other_input()) { restartEnd = RE_RESTART; } // Start new demo. if (!pause && state == demoOn && ui && ui->other_input()) { timer.set(0); } // Must be after Client::yield() and before clearRegisteredSounds() if (role->get_type() == R_CLIENT) { // check for soundplay play_sounds(); } soundManager.clearRegisteredSounds(); // Put this right before Ui clears them out. role->handle_messages(this,&locator); if (ui) { // Drawing happens here. ui->pre_clock(); } else { // Still want to nuke the messages each turn. locator.clear_all_messages(); } } void Game::post_clock() { // Put before everything else, to interpret keys at last possible moment. if (ui) { ui->post_clock(); } // Keep polling role to make sure it is ok. e.g. fail for Client // if Server goes down. if (state != roleFailed && state != prepareConnect && !role->ok()) { state = roleFailed; // timer.set(ROLE_FAILED_TIME); } if (role->get_type() == R_CLIENT) { // Finish connecting to server. if (state == prepareConnect) { if (timer.ready()) { // Clear out anything that might be hanging around before // connecting to server. // We don't use Game::reset() when role is Client. if (ui) { ui->reset(); } locator.reset(); world.reset(); assert(role && role->get_type() == R_CLIENT); ((ClientP)role)->connect_server(); // Doesn't really matter. Don't use gameOver because then // any key press causes the game to reset. state = gameOn; } } // All the Locator pseudo-clocking stuff happens in Client::yield. role->clock(this,&world,&locator); if (restartEnd == RE_RESTART) { // Will tell server to start new game for this client. ((ClientP)role)->request_new_human(); } // This really shouldn't be in two places. timer.clock(); return; } // We need to do something cleaner, maybe two switches, one for Client, // one for StandAlone and Server. if (!pause) { /* Put (reset) after ui->clock so doesn't draw screen twice on reset. Intel needs to be clocked to get id so that ui can follow the id of the intel. */ if (restartEnd == RE_RESTART) { new_game(); // If it was set. if (ui) { ui->unset_prompt_difficulty(); } } else if (restartEnd == RE_END) { end_game(False); // I bet this is unnecessary. if (ui) { ui->unset_prompt_difficulty(); } } // The big-ass state machine. Maybe we should have a IGameState inteface with separate // implementations for each state. switch (state) { case demoOff: if (startImmediately) { // Start a new game now. new_game(); } break; case demoOn: case demoExtra: { if (startImmediately) { // Start a new game now. new_game(); } else if (timer.ready()) { // Start new demo. state = demoOn; timer.set(DEMO_CUTOFF_TIME); locator.reset(); if (ui) { ui->demo_reset(); } world.demo_reset(); demo_setup(); } else if (state == demoOn && locator.enemies_alive() <= 1) { state = demoExtra; timer.set(DEMO_EXTRA_TURNS); } world.clock(); locator.clock(); } break; case newGame: { if (timer.ready()) { // Check if we have to ask the user for a difficulty setting. if (difficultyNext == DIFF_NONE && // not set yet styleNext->need_difficulty(enemiesNumNext)) { if (ui) { // need to get difficulty level from user. state = getDifficulty; ui->set_prompt_difficulty(); } else { // No way to ask user for difficulty, assume DIFF_NORMAL difficultyNext = DIFF_NORMAL; reset(); } } else { // leave difficulty alone. Start game. reset(); } } } break; case getDifficulty: { // Check if user has given a difficulty value. assert(ui != NULL); int uiDiff = ui->get_difficulty(); if (uiDiff != DIFF_NONE) { difficultyNext = uiDiff; ui->unset_prompt_difficulty(); ui->set_difficulty(difficultyNext); // Make sure UI has new value. // reset(); new_game(); } // else stay in getDifficulty until User supplies a value. } break; case getBearings: { if (timer.ready()) { style->new_level_set_timer(timer); state = gameOn; } } break; case awardBonus: { if (timer.ready()) { assert(levelTitleStored); // Pass ownership of levelTitleStored to get_bearings(). get_bearings(levelTitleStored); levelTitleStored = NULL; } } break; case gameOn: case gameExtra: case levelExtra: { world.clock(); locator.clock(); reincarnations_check(); int humansPlaying = locator.humans_playing(); int enemiesPlaying = locator.enemies_alive(); if (humansPlaying != humansPlayingPrev) { humansPlayingPrev = humansPlaying; if (ui) { ui->set_humans_playing(humansPlaying); } role->set_humans_playing(humansPlaying); } if (enemiesPlaying != enemiesPlayingPrev) { enemiesPlayingPrev = enemiesPlaying; if (ui) { ui->set_enemies_playing(enemiesPlaying); } role->set_enemies_playing(enemiesPlaying); } if (state == gameExtra) { // Game is really over, stop clocking. if (timer.ready()) { end_game(True); } } else { assert(state == gameOn || state == levelExtra); game_over_check(humansPlaying,enemiesPlaying); // Check state because game_over_check() may have changed it. if (state == gameOn) { new_level_check(enemiesPlaying); } if (state == levelExtra) { // Extra time after level end has run out, start new level. if (timer.ready()) { if (!noNewLevel) { new_level(); } } } if (state == gameOn || state == levelExtra) { refill_check(); } } if (showStats) { stats.report(); } stats.clock(); } break; // handled at top of Game::clock(). case gameOver: break; case roleFailed: // Do nothing util user starts a new game. break; default: assert(0); } // switch // All-purpose timer, different uses for different states. timer.clock(); } // if (!pause) // check for soundplay play_sounds(); role->clock(this,&world,&locator); } void Game::yield(CMN_TIME time,int quanta,ITurnStarterP turnStarter) { assert(role); role->yield(time,quanta,this,turnStarter,&world,&locator); } ClassId Game::parse_class_name(LocatorP l,const char *name) { ClassId n; for (n = 0; n < A_CLASSES_NUM; n++) { const PhysicalContext *context = l->get_context(n); if (context && !strcmp(context->className,name)) return n; } return A_None; } void Game::ui_settings_check(RestartEnd &restartEnd) { if (ui == NULL) { return; } if (ui->settings_changed()) { UIsettings settings; UImask mask = ui->get_settings(settings); if (mask & UInewGame) { restartEnd = RE_RESTART; } if (mask & UIquit) { print_stats(); // main quits the game before next clock quit(); } #if WIN32 if (mask & UItrackvol) { soundManager.setTrackVolume(settings.trackvol); } if (mask & UIsoundvol) { soundManager.setEffectsVolume(settings.soundvol); } if (mask & UIsound) { soundManager.turnOnoff(settings.sound); if (settings.sound) { start_soundtrack(); } else { stop_soundtrack(); } } if (mask & UImusictype) { stop_soundtrack(); musictype = settings.musictype; start_soundtrack(); } #endif if (mask & UIrooms) { worldRooms = settings.worldRooms; } if (mask & UIhumansNum) { humansNumNext = limit_humans_num(settings.humansNum); ui->set_humans_num(humansNumNext); } if (mask & UIenemiesNum) { enemiesNumNext = Utils::minimum(settings.enemiesNum, Locator::ENEMIES_MAX); ui->set_enemies_num(enemiesNumNext); } if (mask & UIenemiesRefill) { enemiesRefillNext = settings.enemiesRefill; ui->set_enemies_refill(enemiesRefillNext); } if (mask & UIpause) { pause = settings.pause; ui->set_pause(pause); } if (mask & UIstyle) { if (settings.style != styleNext->get_type()) { // If set. ui->unset_prompt_difficulty(); set_style_next(settings.style); } } if (mask & UIquanta) { quanta = settings.quanta; if (quanta < 0) quanta = 0; if (quanta > QUANTA_MAX) quanta = QUANTA_MAX; ui->set_quanta(quanta); } #if WIN32 if (mask & UIscreenmode) { change_screen_mode((Xvars::SCREENMODE)settings.screenmode); } #endif if (mask & UIcooperative) { cooperativeNext = settings.cooperative; ui->set_cooperative(cooperativeNext); } #if WIN32 // Set from the "Difficulty..." menu item. // Won't apply until next game. if (mask & UIdifficulty) { difficultyNext = settings.difficulty; ui->set_difficulty(difficultyNext); } #endif if (mask & UIconnectServer) { delete role; ostrstream portName; portName << settings.connectPort << ends; IViewportInfo* vInfo = Ui::get_viewport_info(); ClientP client = new Client(settings.connectHostname,portName.str(), 0,settings.humanName,vInfo, Connection::ADJUST_SKIP,&locator); delete portName.str(); assert(client); role = client; ui->set_role_type(role->get_type()); set_style_next(role->get_default_game_style()); // Want to give a turn to let Client put a message up on the window. state = prepareConnect; timer.set(PREPARE_CONNECT_TIME); } else if ((mask & UIdisconnectServer) || (mask & UIstopServer)) { RoleType oldRoleType = role->get_type(); delete role; role = new StandAlone(); assert(role); restartEnd = RE_END; ui->set_role_type(role->get_type()); set_style_next(role->get_default_game_style()); if (oldRoleType == R_CLIENT) { locator.arena_message_enq(Utils::strdup("Disconnected from server. Reverting to stand-alone game.")); } else if (oldRoleType == R_SERVER) { locator.arena_message_enq(Utils::strdup("Server shut down. Reverting to stand-alone game.")); } // else ignore it } else if (mask & UIrunServer) { // A little funny the way we mutate humanNames[] here, but it's // just the same as if the user specified -name on the commmand line. if (Utils::strlen(settings.humanName)) { Utils::freeif(humanNames[0]); humanNames[0] = Utils::strdup(settings.humanName); } delete role; ostrstream portName; portName << settings.serverPort << ends; role = new Server(settings.localHuman,portName.str(),&locator); delete portName.str(); assert(role); restartEnd = RE_RESTART; ui->set_role_type(role->get_type()); set_style_next(role->get_default_game_style()); ((ServerP)role)->run(); } else if (mask & UIchatRequest) { // Just pass the chat request on to the role. role->send_chat_request(&locator,settings.chatReceiver, settings.chatMessage); } } // if settings changed } void Game::set_style_next(GameStyleType styleType) { delete styleNext; styleNext = GameStyle::by_type(styleType); if (ui) { ui->set_style(styleType); } ostrstream str; styleNext->describe(str); locator.message_enq(str.str()); } void Game::reincarnations_check() { Incarnator iter(locator); HumanP human; while (human = iter()) { PhysicalP obj = human_physical(); // human_physical now adds to locator. human->reincarnate(); obj->set_intel(human); ostrstream msg; msg << human->get_name() << " is back from the dead." << ends; locator.message_enq(msg.str()); } } void Game::game_over_check(int humansPlaying,int enemiesPlaying) { int hNum = (role->get_type() == R_SERVER) ? HU_UNSPECIFIED : humansPlaying; if (cooperative) { // Pretend there are at most one player, so will end game if // just humans left. hNum = Utils::minimum(hNum,1); } if (style->game_over_check(hNum,enemiesPlaying)) { state = gameExtra; timer.set(EXTRA_TURNS); } } void Game::new_level_check(int enemiesPlaying) { assert(state == gameOn); ostrstream str; Boolean lStrChanged = False; int val = style->new_level_check(enemiesPlaying,&world,&locator, level,lStrChanged,str,timer, (IPhysicalManagerP)this); // start new level immediately. if (val == 0) { timer.set(0); if (!noNewLevel) { new_level(); } // Perhaps shouldn't return here, maybe should still do the // lStrChanged logic. return; } // start new level in a little bit else if (val == 1) { state = levelExtra; timer.set(NEW_LEVEL_TIME); } // continue with current level else { assert(val == -1); } // Now use lStrChanged flag explicitly, because we can't effectively check // if str has anything in it. Fucking Linux compilers. if (lStrChanged) { if (ui) { ui->set_level(str.str()); } // Ok to delete even if ui is NULL, str.str() will allocate the memory to // kill off. delete str.str(); } } void Game::refill_check() { if (refillTimer.ready()) { if (style->can_refill_game_objects()) { gameObjects.refill(); } style->refill_enemies(enemiesRefill,&world,&locator, (IPhysicalManagerP)this); refillTimer.set(REFILL_TIME); } refillTimer.clock(); } Boolean Game::potential_human_filter(const PhysicalContext* pc,void*) { return pc->potentialHuman; } // New version which uses Locator::filter_contexts. // More general and easy to extend. PhysicalP Game::human_physical(int humanNum) { // The class of the human to be created. const PhysicalContext *theContext; if (humanClass == A_None || // Nonzero numbered humans are always chosen randomly. // Careful with the Dragon hack below, look at humansNum. humanNum != 0) { // Choose class randomly. // Get list of all classes that are potential Human classes. const PhysicalContext *list[A_CLASSES_NUM]; int size = locator.filter_contexts(list,NULL,potential_human_filter,NULL); assert(size); theContext = list[Utils::choose(size)]; } else { // Class has already been chosen. theContext = locator.get_context(humanClass); } // Create an object of the class corresponding to theContext. Pos pos = style->human_initial_pos(&world,&locator,theContext->sizeMax); assert(theContext->create); PhysicalP obj = NULL; // Hack for Dragon, need a more general mechanism. if (humanClass == A_Dragon && humanNum == 0) { PtrList ret; Segmented::create_and_add_composite(ret,&world,&locator, Dragon::SEGMENTS_NUM,pos, theContext->create,theContext->arg); obj = (PhysicalP)ret.get(0); } else { obj = theContext->create(theContext->arg,&world,&locator,pos); locator.add(obj); } assert(obj); // Add extra abilities if (obj->is_creature() && humanExtraAbility != AB_MAX) { AbilityP a = NULL; switch(humanExtraAbility) { case AB_Sticky: if (Sticky::has_required_frames( ((MovingP)obj)->get_moving_context())) { a = new Sticky(Ninja::stickyContext,Sticky::defaultXdata); } else { cerr << obj->get_class_name() << " does not have all the animation frames to be a Sticky." << endl; } break; case AB_Flying: a = new Flying(ChopperBoy::flyingContext,Flying::defaultXdata); break; case AB_Hopping: a = new Hopping(Frog::hoppingContext,Hopping::defaultXdata); break; case AB_OnFire: a = new OnFire(FireDemon::onFireContext,OnFire::defaultXdata); break; default: cerr << "unknown ability" << endl; } if (a) { // Can only have one locomotion. if (a->is_locomotion()) { LocomotionP l = obj->get_locomotion(); if (l) { ((CreatureP)obj)->remove_ability(l->get_ability_id()); } } ((CreatureP)obj)->add_ability(a); } } return obj; } Boolean Game::potential_enemy_filter(const PhysicalContext* pc,void*) { return pc->potentialEnemy; } PhysicalP Game::enemy_physical() { return enemy_physical(NULL,0); } // New version which uses Locator::filter_contexts. // More general and easy to extend. PhysicalP Game::enemy_physical(ClassId *choosable,int choosableNum) { ClassId localChoosable[A_CLASSES_NUM]; if (choosableNum == 0) { // Ask the Locator for potential enemies since none were passed in. assert(!choosable); choosable = localChoosable; choosableNum = locator.filter_contexts(NULL,choosable, potential_enemy_filter,NULL); } // Fill in weights. int weights[A_CLASSES_NUM]; int n; for (n = 0; n < choosableNum; n++) { const PhysicalContext *context = locator.get_context(choosable[n]); assert(context); weights[n] = context->enemyWeight; } // Sum of all weights. int weightsSum = 0; for (n = 0; n < choosableNum; n++) { weightsSum += weights[n]; } // Choose random weight in [0,weightsSun). int choice = Utils::choose(weightsSum); // weightBelow is always the total amount of weight of the classes from // 0 to n. When this exceeds the chosen weight, create a Physical of // class n. int weightBelow = 0; for (n = 0; n < choosableNum; n++) { weightBelow += weights[n]; if (choice < weightBelow) { return enemy_physical(choosable[n]); } } assert(0); return NULL; } // New more general version. PhysicalP Game::enemy_physical(ClassId classId) { const PhysicalContext *context = locator.get_context(classId); assert(context); Pos pos = world.empty_rect(context->sizeMax); assert(context->create); PhysicalP obj = context->create(context->arg,&world,&locator,pos); return obj; } char *Game::choose_ranking(int kills) { // Figure out the ranking set, they are listed in order. int setNum = 0; assert(kills >= 0 && rankingSets[0].killsMin == 0); while (setNum < RANKING_SETS_NUM - 1) { if (kills >= rankingSets[setNum + 1].killsMin) { // We have the min number of kills to go to the next set. setNum++; } else { // We are at the highest set we can be at. break; } } // Determine size of this RankingSet. int cardinality = 0; // RankingSet::rankings must be NULL-terminated. while(rankingSets[setNum].rankings[cardinality]) { cardinality++; } assert(cardinality > 0); int which = Utils::choose(cardinality); return rankingSets[setNum].rankings[which]; } void Game::end_game(Boolean showMessages) { state = gameOver; timer.set(OTHER_INPUT_RESET); if (showMessages) { for (int n = 0; n < locator.humans_registered(); n++) { HumanP human = locator.get_human(n); ostrstream msg; // Soups are only taken into account if you have unlimited lives. int totalKills; if (human->get_lives() == IT_INFINITE_LIVES) { // A Human should only have infinite lives for the EXTENDED game style. // If this changes, consider changing the logic in the Ui for // displaying // number of human kills. assert(style->get_type() == EXTENDED); totalKills = human->get_human_kills() - human->get_soups() + human->get_enemy_kills(); } else { totalKills = human->get_human_kills() + human->get_enemy_kills(); } char *ranking = choose_ranking(totalKills); msg << totalKills << (totalKills == 1 ? "Kill" : " Kills") << ", Rank: " << ranking << ends; IntelId humanIntelId = human->get_intel_id(); locator.arena_message_enq(msg.str(),&humanIntelId,10000); } } } void Game::new_level() { // Always reset to be sure, even if we are going to set it below. world.set_special_map_next(World::MAP_NONE); world.set_rooms_next(worldRooms); // After the previous two calls, so it takes precedence. if (worldFile) { world.set_file_next(worldFile); } timer.set(0); // Will clean out non-persistent teams. locator.level_reset(); ostrstream lStr; // For level box on the side of the ui-> ostrstream lTitleStr; // For Ui title screen. Boolean doBonus; // Possibly increment level count number. if (style->advance_level()) { level++; if (level > levelHighest) { levelHighest = level; } // See if we should award a bonus for work on the previous level. doBonus = style->award_bonus(); } else { // Never get a bonus if you can't advance to the next level. doBonus = False; } // Ask style to start new level // Every style MUST set something for lStr and lTitleStr. style->new_level(level,&world,&locator,difficultyLevels[difficulty], lStr,lTitleStr, (IPhysicalManagerP)this,role->get_humans_num()); #if WIN32 start_soundtrack(); #endif // Must be after style set to new_level. gameObjects.level_reset(world.get_dim(),style); // Refill gameObjects immediately, but not style->refill(). refillTimer.set(REFILL_TIME); if (style->can_refill_game_objects()) { gameObjects.refill(); } // Go to awardBonus state. if (doBonus) { delete levelTitleStored; // If it already exists. // Store levelTitle string for later use. levelTitleStored = lTitleStr.str(); // Tell user about the bonus. award_bonuses_now(); timer.set(AWARD_BONUS_TIME); state = awardBonus; } // Go to getBearings state. else { get_bearings(lTitleStr.str()); } if (ui) { ui->set_level(lStr.str()); } delete lStr.str(); // Will pass in more info later. role->new_level(this,&world,&locator); } void Game::award_bonuses_now() { int hNum = locator.humans_playing(); for (int n = 0; n < hNum; n++) { // Grab the Physical for human number n. HumanP h = locator.get_human(n); PhysicalP p = NULL; if (h) { p = locator.lookup(h->get_id()); } if (!p || !p->alive() || p->get_intel() != h) { continue; } char* awardMsg = NULL; int count = 0; while (!awardMsg && count < AWARD_BONUS_TRIES) { count++; // Decide what bonus to give. int which = Utils::choose(5); switch (which) { // Grant full health. case 0: if (p->get_health() < (int)(.7 * p->get_health_max())) { p->heal(); awardMsg = "Bonus: Full Health"; } break; // AutoLancer case 1: { // Make sure p is a User and that p can hold more weapons. UserP user = (UserP)p->get_ability(AB_User); if (user && user->get_weapons_num() < PH_WEAPONS_MAX) { const Area& area = p->get_area(); Pos newPos = area.get_middle() - 0.5 * AutoLancer::get_size_max(); PhysicalP weap = new AutoLancer(&world,&locator,newPos); assert(weap); locator.add(weap); awardMsg = "Bonus: Auto-Lancer"; } } break; // DemonSummoner // Should share code with AutoLancer. case 2: { // Make sure p is a User and that p can hold more weapons. UserP user = (UserP)p->get_ability(AB_User); if (user && user->get_weapons_num() < PH_WEAPONS_MAX) { const Area& area = p->get_area(); Pos newPos = area.get_middle() - 0.5 * DemonSummoner::get_size_max(); PhysicalP weap = new DemonSummoner(&world,&locator,newPos); assert(weap); locator.add(weap); awardMsg = "Bonus: Demon-Summoner"; } } break; // Lasers case 3: { // Already has BuiltIn weapon if (!p->get_ability(AB_BuiltIn)) { // Don't want to be BuiltIn and Fighter at the same time. AbilityP fighter = p->get_ability(AB_Fighter); if (fighter) { ((CreatureP)p)->remove_ability(AB_Fighter); } AbilityP a = new BuiltIn(Walker::builtInContext,BuiltIn::defaultXdata); assert(a); ((CreatureP)p)->add_ability(a); awardMsg = "Bonus: Built-In Lasers"; } } break; // XProtection case 4: { if (p->is_moving()) { PhysicalP prevProt = locator.lookup(((MovingP)p)->get_protection()); if (prevProt) { // Don't give XProtection if p already has it. if (prevProt->get_class_id() == A_XProtection) { break; } prevProt->kill_self(); } ProtectionP xProt = new XProtection(&world,&locator,p->get_area()); assert(xProt); locator.add(xProt); ((MovingP)p)->set_protection(xProt->get_id()); awardMsg = "Bonus: X-Shield"; } } break; default: assert(0); } // switch } // while if (!awardMsg) { awardMsg = "Cannot Award Bonus Now"; } IntelId hId = h->get_intel_id(); locator.arena_message_enq(Utils::strdup(awardMsg),&hId,AWARD_BONUS_TIME); } // for humans num } // This method takes ownership for the memory of levelTitleStr. void Game::get_bearings(char *levelTitleStr) { if (!noLevelTitle) { // Give user a few turns to figure out what's going on before starting the new level. state = getBearings; timer.set(GET_BEARINGS_TIME); locator.arena_message_enq(levelTitleStr,NULL,GET_BEARINGS_TIME); } else { // start immediately, no level title or time to get bearings. state = getBearings; timer.set(0); delete levelTitleStr; } } void Game::reset() { assert(role->get_type() != R_CLIENT); if (styleNext->need_difficulty(enemiesNumNext)) { assert(difficultyNext != DIFF_NONE); // should be specified by now. difficulty = difficultyNext; } int hNumNext = (role->get_type() == R_SERVER) ? HU_UNSPECIFIED : humansNumNext; char *err = styleNext->can_reset(hNumNext,enemiesNumNext,cooperativeNext); // The style may not allow us to play with the given settings. if (err) { locator.arena_message_enq(err); // Force the game to end. state = gameOver; timer.set(OTHER_INPUT_RESET); return; } // Get ready for a new game. Stats::enable(); locator.set_messages_ignore(False); if (state == gameOn || state == gameExtra) { end_game(False); } enemyNameCount = 0; enemiesRefill = enemiesRefillNext; cooperative = cooperativeNext; // Would be nice to have a more general mechanism. Composite::reset_id_generator(); ///////////////// Before here, switch on styleNext. delete style; style = styleNext; styleNext = style->clone(); ///////////////// After this point, switch on style // Role may ignore the value passed in. role->set_humans_num(humansNumNext); // Just to be sure. if (ui) { ui->set_humans_num(role->get_humans_num()); } level = 0; // So will start out at 1. levelHighest = 0; // Set the enemies reflexes according to the new level of difficulty. Enemy::set_reflexes_time(difficultyLevels[difficulty].reflexes); // ui->reset() used to be after Locator::reset() if (ui) { ui->reset(); } locator.reset(); // Moved resetting world rooms to new_level(); ostrstream msg; msg << wittySayings[Utils::choose(WITTY_SAYINGS_NUM)] << ends; locator.message_enq(msg.str()); /* Don't need to call Ui::set_* because the new values originally came from ui-> */ gameObjects.game_reset(oneItem,noItems,oneEach); style->reset(&world,&locator,difficultyLevels[difficulty],enemiesNumNext); // Used to be after new_level(). Shouldn't hurt anything to be here. // Needs to be after style is set to new value. role->reset(this); // NOTE: Humans haven't been added to the Locator yet. new_level(); // After new_level because world must be reset. // After role->set_humans_num() humans_reset(); // clock once to put objects in game. // This has to be after humans_reset(). assert(world.just_reset()); world.clock(); locator.clock(); // Force Game::clock to set Ui::set_intels_playing(). humansPlayingPrev = enemiesPlayingPrev = -1; // Used to be 0. } void Game::new_game() { state = newGame; timer.set(0); } void Game::process_x_resources(int *,char **) { // Should have already checked for UI before coming here. assert(ui != NULL); #if X11 for (int dpyNum = 0; dpyNum < ui->get_dpy_max(); dpyNum++) if (!ui->keyset_set(dpyNum)) { const char* const *keysNames = ui->get_keys_names(); KeySym right[UI_KEYS_MAX][2],left[UI_KEYS_MAX][2]; for (int n = 0; n < UI_KEYS_MAX; n++) for (int which = 0; which < 2; which++) { { // Right keys. right[n][which] = 0; ostrstream strm; if (which == 0) strm << "right_" << keysNames[n] << ends; else strm << "right_" << keysNames[n] << "_2" << ends; char *option = strm.str(); // Should we free value?? char *value = XGetDefault(ui->get_dpy(0),XEVIL_CLASS,option); if (value) { KeySym keysym = XStringToKeysym(value); if (keysym != NoSymbol) right[n][which] = keysym; } delete option; } { // Left Keys. left[n][which] = 0; ostrstream strm; if (which == 0) strm << "left_" << keysNames[n] << ends; else strm << "left_" << keysNames[n] << "_2" << ends; char *option = strm.str(); // Should we free value?? char *value = XGetDefault(ui->get_dpy(0),XEVIL_CLASS,option); if (value) { KeySym keysym = XStringToKeysym(value); if (keysym != NoSymbol) left[n][which] = keysym; } delete option; } } // This sets the default, even if there are no resources found. ui->set_keyset(dpyNum,KEYSET_DEFAULT,right,left); } #endif } void Game::parse_args(int *argc,char **argv) { // Create a bunch of "-name" strings for comparing with command-line // args. ostrstream dashName[Locator::HUMANS_MAX]; int n; for (n = 0; n < Locator::HUMANS_MAX; n++) { dashName[n] << "-name" << n << ends; } // Defaults int skip = Connection::ADJUST_SKIP; CMN_PORT clientPort = 0; // Means not specified // Take two passes at the arguments because the constructors for Roles need // certain arguments to already be parsed. //////////// First Pass /////////// // Get -name so we have it for the constructor of Client. for (n = 0; n < *argc; n++) { // -name is the same as -name0 if (!strcmp("-ability",argv[n]) && (n + 1 < *argc)) { n++; if (!strcmp(argv[n],"flying")) { humanExtraAbility = AB_Flying; } else if (!strcmp(argv[n],"on-fire")) { humanExtraAbility = AB_OnFire; } else if (!strcmp(argv[n],"sticky")) { humanExtraAbility = AB_Sticky; } else if (!strcmp(argv[n],"hopping")) { humanExtraAbility = AB_Hopping; } } else if (!strcmp("-accept_agreement",argv[n])) { LAgreement::comm_line_accepted(); } else if (!strcmp("-client_port",argv[n]) && (n + 1 < *argc)) { clientPort = Utils::atoi(argv[n+1]); n++; } else if (! strcmp("-dedicated",argv[n])) { dedicatedServer = True; } else if (!strcmp("-name",argv[n]) && (n + 1 < *argc)) { humanNames[0] = Utils::strdup(argv[n+1]); n++; } else if (! strcmp("-no_ui",argv[n])) { noUi = True; } else if (!strcmp("-observer",argv[n])) { observer = True; } else if (!strcmp("-skip",argv[n]) && (n + 1 < *argc)) { skip = Utils::maximum(Connection::ADJUST_SKIP,Utils::atoi(argv[n + 1])); n++; } // Check "-name" arguments. else { for (int j = 0; j < Locator::HUMANS_MAX; j++) { if ((! strcmp(dashName[j].str(),argv[n])) && (n + 1 < *argc)) { humanNames[j] = Utils::strdup(argv[n+1]); n++; } } } } //////////// Second Pass /////////// for (n = 0; n < *argc; n++) { if (! strcmp("-buggy",argv[n])) { // For simulating a bad network connection. GenericStream::set_buggy(True); } #if WIN32 #if _DEBUG // Used to be called -bmptransfer else if (!strcmp("-bmp_match_palette",argv[n]) && (n + 2 < *argc)) { UiPlayer::bmp_match_palette(argv[n+1],argv[n+2]); // suck off two extra arguments n += 2; } #endif #endif else if (role == NULL && !strcmp("-connect",argv[n]) && (n + 1 < *argc)) { IViewportInfo* vInfo = Ui::get_viewport_info(); // -connect if (n + 2 < *argc && argv[n+2][0] != '-') { // skip is a local variable from above role = new Client(argv[n+1],argv[n+2],clientPort, humanNames[0],vInfo,skip,&locator); // suck off two extra arguments n += 2; } // -connect else { // skip is a local variable from above role = new Client(argv[n+1],NULL,clientPort, humanNames[0],vInfo,skip,&locator); // suck off one extra argument n++; } assert(role); // Wait until Client::connect_server to check role->ok() } else if (! strcmp("-cooperative",argv[n])) { cooperativeNext = True; } else if (! strcmp("-debug_info",argv[n])) { DebugInfo::turn_on(); } else if (!strcmp("-difficulty",argv[n]) && (n + 1 < *argc)) { n++; for (int m = 0; m < DIFFICULTY_LEVELS_NUM; m++) { if (!strcmp(difficultyLevels[m].name,argv[n])) difficultyNext = m; } } else if (!strcmp("-disconnect_time",argv[n]) && (n + 1 < *argc)) { n++; Server::set_no_activity_disconnect(Utils::atoi(argv[n])); } else if (! strcmp("-draw_rects",argv[n])) { locator.set_draw_rects(True); } else if (! strcmp("-duel",argv[n])) { delete style; style = GameStyle::by_type(DUEL); } else if (! strcmp("-dummy_arg",argv[n])) { // Do nothing this is just a placeholder. } // "-enemies" is down with "-machines" else if (! strcmp("-extended",argv[n])) { delete style; style = GameStyle::by_type(EXTENDED); } #if WIN32 else if (!strcmp("-full_screen",argv[n])) { fullScreen = True; } // Auto-generate XPM images for UNIX from the Windows bitmaps. else if (!strcmp("-gen_xpm",argv[n]) && (n + 1 < *argc)) { n++; UiPlayer::set_generate_xpm(argv[n]); } else if (!strcmp("-cd",argv[n])) { musictype = UIsettings::CD; } else if (!strcmp("-midi",argv[n])) { musictype = UIsettings::MIDI; } else if (!strcmp("-no_soundtrack",argv[n])) { musictype = UIsettings::NONE; } #endif else if (!Utils::strcmp("-h",argv[n]) || !Utils::strcmp("-help",argv[n])) { cout << endl << "See http://www.xevil.com/docs/instructions.html for full description." << endl << "usage: " << argv[0] << " " << endl << endl << "Common arguments:" << endl << "-font or -fn " << endl << " set the font" << endl << "-display or -d " << endl << " set the X display for all players in the game" << endl << "-display or -d " << endl << " set the X display for a specific player, player number N, starts with '0'" << endl << "-info" << endl << " print license agreement" << endl << "-h or -help" << endl << " print help message" << endl << "-world " << endl << " use the worldfile to specify the map" << endl << endl << "-connect {serverport}" << endl << " connect as a client to an XEvil server, serverport is optional" << endl << "-name " << endl << " only with -connnect, specify your player name" << endl << "-no_dead_reckoning" << endl << " only with connect, disable dead reckoning" << endl << endl << "-server {port}" << endl << " run an XEvil server, port is optional" << endl << "-no_ui" << endl << " only with -server, run as a command-line server, implies -observer" << endl << "-observer" << endl << " only with -server, run server with no human player on the server machine" << endl << "-disconnect_time" << endl << " only with -server, specify time (ms) before disconnecting clients that do not respond" << endl << "-no_disconnect" << endl << " only with -server, don't disconnect clients that do not respond" << endl; // Just exit, don't want to deal with Ui being created, etc, if we // use Game::quit(). exit(1); return; } else if (! strcmp("-harmless",argv[n])) { intelHarmless = True; } else if (!strcmp("-human_class",argv[n]) && (n + 1 < *argc)) { assert(humanClass == A_None); n++; // If not found, humanClass will just remain as A_None. humanClass = parse_class_name(&locator,argv[n]); } else if (! strcmp("-human_reflexes",argv[n]) && (n + 1 < *argc)) { n++; int val = Utils::atoi(argv[n]); Client::set_human_reflexes(val); cout << "Human reflexes set to " << val << " milliseconds." << endl; } else if ((! strcmp("-humans",argv[n])) && (n + 1 < *argc)) { humansNumNext = Utils::atoi(argv[n+1]); n++; } else if (! strcmp("-infinity",argv[n])) { infiniteLives = True; } else if (! strcmp("-info",argv[n])) { // Print the license agreement out to standard out. Line::set_text_columns(70); Page thePage(NULL,LAgreement::get_text()); const PtrList& lines = thePage.get_lines(); for (int nn = 0; nn < lines.length(); nn++) { char* txt = ((Line*)lines.get(nn))->alloc_text(); cout << txt << endl; delete [] txt; } exit(0); } else if (! strcmp("-kill",argv[n])) { delete style; style = GameStyle::by_type(KILL); } #if X11 else if ((! strcmp("-keys",argv[n])) && (n + 1 < *argc)) { // Sets the keyset for all displays to the same value. n++; if (! strcmp("alpha",argv[n])) uiKeyset = UIalpha; if (! strcmp("decmips",argv[n])) uiKeyset = UIdecmips; if (! strcmp("iris",argv[n])) uiKeyset = UIiris; if (! strcmp("mac",argv[n])) uiKeyset = UImac; if (! strcmp("ncd",argv[n])) uiKeyset = UIncd; if (! strcmp("rsaix",argv[n])) uiKeyset = UIrsaix; if (! strcmp("sun3",argv[n])) uiKeyset = UIsun3; if (! strcmp("sun4",argv[n])) uiKeyset = UIsun4; if (! strcmp("sun4_sparc",argv[n])) uiKeyset = UIsun4_sparc; if (! strcmp("tektronix",argv[n])) uiKeyset = UItektronix; if (! strcmp("linux",argv[n])) uiKeyset = UIlinux; } else if (!strcmp("-large_viewport",argv[n])) { Ui::set_large_viewport(True); } #endif // X11 else if (!strcmp("-levels",argv[n])) { delete style; style = GameStyle::by_type(LEVELS); } else if ((!strcmp("-machines",argv[n]) || !strcmp("-enemies",argv[n])) && (n + 1 < *argc)) { enemiesNumNext = Utils::atoi(argv[n+1]); enemiesNumNext = Utils::minimum(enemiesNumNext,Locator::ENEMIES_MAX); n++; } else if (! strcmp("-map",argv[n])) { world.set_map_print(True); } // Should this be commented #if WIN32 else if (! strcmp("-midi_location",argv[n]) && (n + 1 < *argc)) { mididirectory = argv[n+1]; n++; } #endif else if (! strcmp("-net_stats",argv[n])) { Role::show_stats(); } #if 0 else if (! strcmp("-no_adjust_skip",argv[n])) { Connection::disable_adjust_skip(); } #endif else if (! strcmp("-no_demo",argv[n])) { noDemo = True; } else if (!strcmp("-no_disconnect",argv[n])) { Server::disable_auto_disconnect(); } else if (!strcmp("-no_dead_reckoning",argv[n])) { Client::disable_dead_reckoning(); } #if WIN32 else if (! strcmp("-no_init_graphics",argv[n])) { Ui::no_init_graphics(); } #endif else if (! strcmp("-no_items",argv[n])) { noItems = True; } else if (! strcmp("-no_level_title",argv[n])) { noLevelTitle = True; } else if (! strcmp("-no_movers",argv[n])) { World::disable_movers(); } else if (! strcmp("-no_new_level",argv[n])) { noNewLevel = True; } #if X11 else if (! strcmp("-no_smooth_scroll",argv[n])) { Ui::set_smooth_scroll(False); } #endif else if (! strcmp("-old_draw",argv[n])) { locator.set_drawing_algorithm(Locator::DRAW_NO_MERGE); } else if (! strcmp("-one_each",argv[n])) { oneEach = True; } else if ((! strcmp("-one_item",argv[n])) && (n + 1 < *argc)) { n++; oneItem = Utils::strdup(argv[n]); } else if (! strcmp("-echo_ping_pong",argv[n])) { Role::echo_ping_pong(); } else if (! strcmp("-echo_turn_windows",argv[n])) { Connection::enable_echo_turn_windows(); } // Used to be just -regenerate_machines. else if (!strcmp("-regenerate_machines",argv[n]) || !strcmp("-regenerate_enemies",argv[n])) { enemiesRefillNext = True; } else if (! strcmp("-reduce_draw",argv[n])) { Ui::set_reduce_draw(True); } else if (! strcmp("-rooms",argv[n]) && (n + 1 < *argc)) { Rooms temp; if (sscanf(argv[n+1],"%dx%d", &temp.acrossMax,&temp.downMax) == 2) worldRooms = temp; n++; } else if ((! strcmp("-scenario",argv[n])) && (n + 1 < *argc)) { n++; Scenarios::set_override(argv[n]); } else if (!strcmp("-scenarios",argv[n])) { delete style; style = GameStyle::by_type(SCENARIOS); } else if (role == NULL && (!strcmp("-server",argv[n]))) { // Server has human player unless we are an observer or we have no Ui // or we are a dedicated server Boolean localHuman = !(observer || noUi || dedicatedServer); // Note that -dedicated without -server is handled after parse_args in Game's // constructor. // -server if (n + 1 < *argc && argv[n+1][0] != '-') { role = new Server(localHuman,argv[n+1],&locator); // suck off extra argument. n++; } else { role = new Server(localHuman,NULL,&locator); } assert(role); } #if X11 else if (!strcmp("-small_viewport",argv[n])) { Ui::set_large_viewport(False); } else if (! strcmp("-smooth_scroll",argv[n])) { Ui::set_smooth_scroll(True); } #endif else if ((! strcmp("-speed",argv[n])) && (n + 1 < *argc)) { quanta = Utils::atoi(argv[n+1]); n++; } else if (! strcmp("-stats",argv[n])) { showStats = True; } #if X11 else if (! strcmp("-synchronous",argv[n])) { Ui::set_synchronous(); } #endif else if ((! strcmp("-target_delay",argv[n])) && (n + 1 < *argc)) { n++; Turn val = Utils::maximum(1,Utils::atoi(argv[n])); Connection::set_target_delay(val); } else if (! strcmp("-training",argv[n])) { delete style; style = GameStyle::by_type(TRAINING); } #if X11 else if (! strcmp("-use_averaging",argv[n])) { Xvars::set_use_averaging(True); } else if (! strcmp("-use_buffer",argv[n])) { Ui::set_use_buffer(True); } else if (! strcmp("-no_buffer",argv[n])) { Ui::set_use_buffer(False); } #endif else if (! strcmp("-world",argv[n]) && (n + 1 < *argc)) { worldFile = argv[n+1]; n++; } } // for // Delete memory for "-name" strings. for (n = 0; n < Locator::HUMANS_MAX; n++) { delete dashName[n].str(); } } char **Game::display_names(int *argc,char **argv) { #if X11 ostrstream dashDisplay[UI_VIEWPORTS_MAX][2]; char **displayNames = new charP [UI_VIEWPORTS_MAX]; int n; for (n = 0; n < UI_VIEWPORTS_MAX; n++) { displayNames[n] = new char [Xvars::DISPLAY_NAME_LENGTH]; strcpy(displayNames[n],""); dashDisplay[n][0] << "-display" << n << ends; dashDisplay[n][1] << "-d" << n << ends; } // Loop through all command line arguments. for (n = 0; n < *argc - 1 ; n++) { // Set display name for all viewports. if (!strcmp(argv[n],"-display") || !strcmp(argv[n],"-d")) { assert(strlen(argv[n+1]) < Xvars::DISPLAY_NAME_LENGTH); for (int vNum = 0; vNum < UI_VIEWPORTS_MAX; vNum++) { strcpy(displayNames[vNum],argv[n+1]); } } // Set display name for one viewport. for (int m = 0; m < UI_VIEWPORTS_MAX; m++) { for (int which = 0; which < 2; which++) { if (!strcmp(argv[n],dashDisplay[m][which].str())) { assert(strlen(argv[n+1]) < Xvars::DISPLAY_NAME_LENGTH); strcpy(displayNames[m],argv[n+1]); } } } } for (n = 0; n < UI_VIEWPORTS_MAX; n++) { for (int which = 0; which < 2; which++) { delete dashDisplay[n][which].str(); } } return displayNames; #endif #if WIN32 return NULL; #endif } char *Game::font_name(int *argc,char **argv) { // Loop through all command line arguments. for (int n = 0; n < *argc - 1 ; n++) { if (!strcmp("-font",argv[n]) || !strcmp("-fn",argv[n])) { return argv[n+1]; } } return NULL; } void Game::humans_reset() { assert(role->get_type() != R_CLIENT); int humansNum = role->get_humans_num(); // assert(humansNum <= Xvars::HUMAN_COLORS_NUM); no longer true. assert(humansNum <= Locator::HUMANS_MAX); assert(humansNum <= INTEL_NAMES_NUM); // randomize the list of names here. Utils::random_list(intelNamesIndices,INTEL_NAMES_NUM); if (cooperative) { // Each human contributes to the pool of lives. int livesOne = style->human_initial_lives(); if (livesOne != IT_INFINITE_LIVES) { sharedLives = livesOne * humansNum; } else { sharedLives = livesOne; } // BUG: sharedLives doesn't make a lot of sense for CLIENT/SERVER // Must be after setting cooperative to cooperativeNext. locator.add_persistent_team(humans_team,NULL); } else { locator.add_persistent_team(one_human_team,NULL); } // Create humans along with their viewports, if necessary. for (int h = 0; h < humansNum; h++) { // Don't create extra viewports on server. if (h < role->num_viewports_needed()) { if (ui) { assert(h <= ui->get_viewports_num()); if (h == ui->get_viewports_num()) { int vNum = ui->add_viewport(); assert(h == vNum); #if X11 int v = ui->get_viewports_num_on_dpy(ui->get_dpy_num(vNum)); #endif #if WIN32 int v = vNum; #endif if (v == 1) { ui->set_input(vNum,UI_KEYS_RIGHT); } else if (v == 2) { ui->set_input(vNum,UI_KEYS_LEFT); } } } // if (ui) } // for h create_human_and_physical(h); } // Delete extra viewports. if (ui && role->get_type() != R_SERVER) { int delNum = ui->get_viewports_num() - humansNum; for (int n = 0; n < delNum; n++) { if (ui->get_viewports_num() > 1) { ui->del_viewport(); } } } // else was done for each human in create_human_and_physical } void Game::create_human_and_physical(int h) { if (h >= Locator::HUMANS_MAX) { cerr << "Maximum number of humans already reached." << endl; return; } assert(role->get_type() != R_CLIENT); // Choose random name if -name was not specified for this player. char *nameNonPc = Utils::strlen(humanNames[h]) ? humanNames[h] : intelNames[intelNamesIndices[h % INTEL_NAMES_NUM]]; // Give infinite lives for UIsettings::EXTENDED. // Not infinite lives for Uisettings::DUEL. int lives = style->human_initial_lives(); if (infiniteLives) { lives = IT_INFINITE_LIVES; } int *shLives = NULL; if (cooperative) { // Humans will share Game::sharedLives for the number of lives. shLives = &sharedLives; } HumanP human = new Human(&world,&locator,nameNonPc,lives,shLives, h % Xvars::HUMAN_COLORS_NUM); assert(human); style->set_human_data(human,&world,&locator); locator.register_human(human); if (ui && h < role->num_viewports_needed()) { ui->register_intel(h,human); } // Actual objects for humans. PhysicalP obj = human_physical(h); // human_physical now adds to locator. obj->set_intel(human); role->human_created(this,human,h,&world,&locator); // No longer necessary to add a team for each human. } #if WIN32 void Game::change_screen_mode(Xvars::SCREENMODE p_newmode) { if (!ui) { return; } ui->reset_graphics(p_newmode); } #endif void Game::intro() { // If you are thinking about changing the text here, I suggest you contact // the XEvil authors at satan@xevil.com first. // You may NOT change the copyright portion. // Even if you are making changes to XEvil, you do not have copyright // for XEvil. // Put message in the status bar when the game starts up. // Use \n in string for locator.message_enq. ostrstream msg; msg << "XEvil(TM) " << VERSION << " http://www.xevil.com satan@xevil.com " << XETP::versionStr << "\n" << "Copyright(C) 1994,2000 Steve Hardt and Michael Judge" << ends; locator.message_enq(msg.str()); // Print message to standard out. Doesn't really do anything on Windows. // Use endl for cout. cout << "XEvil(TM) version " << VERSION << " http://www.xevil.com satan@xevil.com " << XETP::versionStr << endl << "Copyright(C) 1994,2000 Steve Hardt and Michael Judge" << endl << endl; cout << "XEvil is free software under the Gnu General Public License." << endl << "XEvil comes with absolutely no warranty." << endl; cout << "Type 'xevil -info' for license information and information on no warranty." << endl << " 'xevil -help' for usage and network-play instructions." << endl; } // Used in Game::print_stats(). Boolean Game::stats_creations_filter(const PhysicalContext* cx,void*) { return cx->statsCreations; } Boolean Game::stats_uses_filter(const PhysicalContext* cx,void*) { return cx->statsUses; } Boolean Game::stats_deaths_filter(const PhysicalContext* cx,void*) { return cx->statsDeaths; } // New way using Locator::filter_contexts. void Game::print_stats() { // Fucking HP compiler crashes. #ifndef NO_SETPRECISION cout << setprecision(3); #endif cout << endl << "-----------------------STATISTICS-----------------------" << endl; int contextsNum,n; const PhysicalContext *contexts[A_CLASSES_NUM]; // Creations. contextsNum = locator.filter_contexts(contexts,NULL,stats_creations_filter,NULL); for (n = 0; n < contextsNum; n++) { const Stats &stats = contexts[n]->get_stats(contexts[n]->arg); cout << contexts[n]->className << ": created: " << stats.get_creations() << endl; } cout << endl; // Uses. contextsNum = locator.filter_contexts(contexts,NULL,stats_uses_filter,NULL); for (n = 0; n < contextsNum; n++) { const Stats &stats = contexts[n]->get_stats(contexts[n]->arg); cout << contexts[n]->className << ": used: " << stats.get_uses() << endl; } cout << endl; // Deaths. contextsNum = locator.filter_contexts(contexts,NULL,stats_deaths_filter,NULL); for (n = 0; n < contextsNum; n++) { const Stats &stats = contexts[n]->get_stats(contexts[n]->arg); cout << contexts[n]->className << ": number killed: " << stats.get_deaths() << " average lifespan: " << stats.get_ave_lifespan() << " seconds" << endl; } // Total for all Creatures. const Stats &creature = Creature::get_stats(); cout << "Total creatures killed: " << creature.get_deaths() << " average lifespan: " << creature.get_ave_lifespan() << " seconds" << endl << endl; // Figure this one out yourself. cout << "Highest level: " << levelHighest << endl; } PhysicalP Game::create_enemy(PhysicalP obj,Boolean addToLocator) { if (!obj) { obj = enemy_physical(); } IntelOptions ops; ITmask opMask = intel_options_for(ops,obj->get_class_id()); ostrstream name; name << "Machine-" << (enemyNameCount++) << ends; EnemyP enemy = new Enemy(&world,&locator,name.str(),&ops,opMask); assert(enemy); delete name.str(); locator.register_enemy(enemy); if (addToLocator) { locator.add(obj); } obj->set_intel(enemy); return obj; } ITmask Game::intel_options_for(IntelOptions &ops,ClassId classId) { ops.harmless = intelHarmless; ops.classFriends = style->class_friends(); // Should be in the PhysicalContext. // REALLY should be in the PhysicalContext, I just got bit. ops.psychotic = (classId == A_Enforcer || classId == A_Alien || classId == A_FireDemon || classId == A_Dog || classId == A_Mutt || classId == A_Dragon || classId == A_Yeti || classId == A_RedHugger || classId == A_GreenHugger); return ITharmless | ITclassFriends | ITpsychotic; } void Game::kill_physical(PhysicalP p) { off_clock_kill(&locator,p); } void Game::world_changed() { locator.set_messages_ignore(False); if (ui) { ui->set_redraw_arena(); } #if WIN32 start_soundtrack(); #endif } void Game::manager_reset(GameStyleType style) { if (ui) { ui->set_style(style); ui->reset(); } } void Game::register_intel(int num,IntelP intel) { if (ui) { ui->register_intel(num,intel); } } void Game::humans_num_incremented() { // Perhaps should also be looking for when a connection is lost. // These are the states where it is legal to join in a game. if (state == getBearings || state == gameOn || state == levelExtra || state == gameExtra || state == awardBonus) { int h = locator.humans_registered(); // This will push the new human to the appropriate connection. create_human_and_physical(h); } } void Game::humans_num_decremented(const IntelId &iId) { IntelP intel = locator.lookup(iId); if (!intel) { return; } // Why are we using Locator::explicit_die() instead of // Game::off_clock_kill(). Should be consistent about this. // Find and kill the physical for the human and all of its // followers, chainsaws, protection, etc. Id id = intel->get_id(); PhysicalP p = locator.lookup(id); if (p) { PtrList list; p->get_followers(list); locator.explicit_die(p); for (int n = 0; n < list.length(); n++) { PhysicalP follower = (PhysicalP)list.get(n); locator.explicit_die(follower); } } locator.unregister_human(iId); } void Game::quit() { if (role) { role->game_quitting(); } quitGame = True; } void Game::set_humans_playing(int val) { if (ui) { ui->set_humans_playing(val); } } void Game::set_enemies_playing(int val) { if (ui) { ui->set_enemies_playing(val); } } Quanta Game::manager_get_quanta() { return quanta; } GameStyleType Game::get_game_style_type() { assert(style); return style->get_type(); } void Game::demo_setup() { // Choose between different demos. switch (Utils::choose(8)) { case 0: { // A bunch of Heros and an Alien. for (int n = 0; n < 10; n++) { ostrstream name; name << "Enemy-" << n << ends; IntelOptions ops; ops.harmless = True; EnemyP enemy = new Enemy(&world,&locator,name.str(), &ops,ITharmless); assert(enemy); delete name.str(); locator.register_enemy(enemy); Pos pos = world.empty_rect(Hero::get_size_max()); PhysicalP obj = new Hero(&world,&locator,pos); assert(obj); locator.add(obj); obj->set_intel(enemy); } IntelOptions ops; ops.psychotic = True; EnemyP enemy = new Enemy(&world,&locator,"killer",&ops,ITpsychotic); assert(enemy); locator.register_enemy(enemy); Pos pos = world.empty_rect(Alien::get_size_max()); PhysicalP obj = new Alien(&world,&locator,pos); assert(obj); locator.add(obj); obj->set_intel(enemy); } break; case 1: { // Hero, FThrower, and a bunch of Frogs (does not mean Frenchmen). for (int n = 0; n < 15; n++) { ostrstream name; name << "Enemy-" << n << ends; IntelOptions ops; ops.psychotic = Utils::coin_flip(); EnemyP enemy = new Enemy(&world,&locator,name.str(), &ops,ITpsychotic); assert(enemy); delete name.str(); locator.register_enemy(enemy); Pos pos = world.empty_rect(Frog::get_size_max()); PhysicalP obj = new Frog(&world,&locator,pos); assert(obj); locator.add(obj); obj->set_intel(enemy); } EnemyP enemy = new Enemy(&world,&locator,"killer",NULL,0); assert(enemy); locator.register_enemy(enemy); Pos pos = world.empty_rect(Hero::get_size_max()); PhysicalP obj = new Hero(&world,&locator,pos); assert(obj); locator.add(obj); obj->set_intel(enemy); // pos = world.empty_rect(FThrower::get_size_max()); PhysicalP fThrower = new FThrower(&world,&locator,pos); locator.add(fThrower); } break; case 2: { // A bunch of Enforcers. for (int n = 0; n < 10; n++) { ostrstream name; name << "Enemy-" << n << ends; IntelOptions ops; ops.classFriends = False; ops.psychotic = True; EnemyP enemy = new Enemy(&world,&locator,name.str(), &ops,ITclassFriends|ITpsychotic); assert(enemy); delete name.str(); locator.register_enemy(enemy); Pos pos = world.empty_rect(Enforcer::get_size_max()); PhysicalP obj = new Enforcer(&world,&locator,pos); assert(obj); locator.add(obj); obj->set_intel(enemy); } } break; case 3: { // A bunch of Ninjas and a chainsaw. for (int n = 0; n < 10; n++) { ostrstream name; name << "Enemy-" << n << ends; IntelOptions ops; ops.classFriends = False; EnemyP enemy = new Enemy(&world,&locator,name.str(), &ops,ITclassFriends); assert(enemy); delete name.str(); locator.register_enemy(enemy); Pos pos = world.empty_rect(Ninja::get_size_max()); PhysicalP obj = new Ninja(&world,&locator,pos); assert(obj); locator.add(obj); obj->set_intel(enemy); } Pos pos = world.empty_rect(Chainsaw::get_size_max()); PhysicalP obj = new Chainsaw(&world,&locator,pos); locator.add(obj); } break; case 4: { // drop weights Dim worldDim= world.get_dim(); // x is in title space for (int x = WSQUARE_WIDTH * 1; // 2 = 1 for the last wsquare plus 1 for the weight/bomb itself x < (worldDim.colMax - 1) * WSQUARE_WIDTH; x += WSQUARE_WIDTH) { Pos pos(x,2 * WSQUARE_HEIGHT); Pos pos2(x,WSQUARE_HEIGHT); PhysicalP p = new Weight(&world,&locator,pos); PhysicalP p2 = new Bomb(&world,&locator,pos2); // Vel vel(0,-13); // ((MovingP)p)->set_vel_next(vel); // ((MovingP)p2)->set_vel_next(vel); locator.add(p); locator.add(p2); // moved to after the Locator::add(), hardts ((ItemP)p2)->use(NULL); } for (int m = 0; m < 10; m++) { ostrstream name; name << "Enemy-" << m << ends; EnemyP enemy = new Enemy(&world,&locator,name.str(), NULL,ITnone); assert(enemy); delete name.str(); locator.register_enemy(enemy); Pos pos = world.empty_rect(Hero::get_size_max()); #if 0 Size maxSize = Hero::get_size_max(); Pos pos((titleOrigin.c + 1) * WSQUARE_WIDTH + Utils::choose((W_TITLE_COL_MAX - 2) * WSQUARE_WIDTH - maxSize.width), titleOrigin.r * WSQUARE_HEIGHT + W_TITLE_ROW_MAX * (WSQUARE_HEIGHT - 1) - maxSize.height); #endif PhysicalP obj; switch (Utils::choose(3)) { case 0: obj = new Ninja(&world,&locator,pos); break; case 1: obj = new Hero(&world,&locator,pos); break; case 2: { obj = new Frog(&world,&locator,pos); } break; }; assert(obj); locator.add(obj); obj->set_intel(enemy); } } break; case 5: { // Ninjas and ChopperBoys. int n; for (n = 0; n < 10; n++) { ostrstream name; name << "Enemy-" << n << ends; IntelOptions ops; ops.classFriends = False; EnemyP enemy = new Enemy(&world,&locator,name.str(), &ops,ITclassFriends); assert(enemy); delete name.str(); locator.register_enemy(enemy); PhysicalP obj; Pos pos; if (n % 2) { pos = world.empty_rect(Ninja::get_size_max()); obj = new Ninja(&world,&locator,pos); } else { pos = world.empty_rect(ChopperBoy::get_size_max()); obj = new ChopperBoy(&world,&locator,pos); } assert(obj); locator.add(obj); obj->set_intel(enemy); } for (n = 0; n < 5; n++) { Pos pos = world.empty_rect(Launcher::get_size_max()); PhysicalP obj = new Launcher(&world,&locator,pos); assert(obj); locator.add(obj); } } break; case 6: { // pack o' dogs int n; // Game should probably have its own definition of dog team. locator.add_team(Scenarios::dog_team,NULL); // Don't use create_enemy() as that eventually calls Scenarios::intel_options_for() // and the scenario isn't set up yet. for (n = 0; n < 9; n++) { ostrstream name; name << "Dog-" << n << ends; EnemyP intel = new Enemy(&world,&locator,name.str(),NULL,ITnone); assert(intel); delete name.str(); locator.register_enemy(intel); Pos pos = world.empty_rect(Dog::get_size_max()); PhysicalP obj = new Dog(&world,&locator,pos); assert(obj); locator.add(obj); obj->set_intel(intel); } for (n = 0; n < 3; n++) { ostrstream name; name << "Enemy-" << n << ends; IntelOptions ops; ops.harmless = True; EnemyP enemy = new Enemy(&world,&locator,name.str(),&ops,ITharmless); assert(enemy); delete name.str(); locator.register_enemy(enemy); PhysicalP obj; if (n == 0) { Pos pos = world.empty_rect(Ninja::get_size_max()); obj = new Ninja(&world,&locator,pos); } else { Pos pos = world.empty_rect(Hero::get_size_max()); obj = new Hero(&world,&locator,pos); } assert(obj); locator.add(obj); obj->set_intel(enemy); } } break; // One dragon. case 7: { // So dragons don't collide. locator.add_team(universal_team,NULL); for (int n = 0; n < 1; n++) { Pos pos = world.empty_rect(Dragon::get_size_max()); PtrList ret; Segmented::create_and_add_composite(ret,&world,&locator,Dragon::SEGMENTS_NUM,pos, Dragon::create,NULL); for (int m = 0; m < ret.length(); m++) { ostrstream name; name << "Enemy-" << n << ends; IntelOptions ops; ops.harmless = True; EnemyP enemy = new Enemy(&world,&locator,name.str(),&ops,ITharmless); assert(enemy); delete name.str(); locator.register_enemy(enemy); PhysicalP p = (PhysicalP)ret.get(m); p->set_intel(enemy); // Make 'em a bit faster. ModifierP modifiers = ((CreatureP)p)->get_modifiers(); assert(modifiers); ModifierP ds = new DoubleSpeed(); modifiers->append_unique(ds); } } } break; default: assert(0); } // switch } Boolean Game::universal_team(LocatorP,PhysicalP,PhysicalP) { return True; } void Game::off_clock_kill(LocatorP /*locator*/,PhysicalP p) { // Kill off a Physical. Normally, during Locator::clock() we just // call p->kill_self(). But, we need this extra stuff for it to // work outside of Locator::clock(). // // Looking at this code a second time it makes me a bit nervous, // We don't call Locator::explicit_die. So, the object exists in // the Locator for another turn and, I believe, gets nuked in // Locator::delete_dead(). Don't like the idea of the object // existing for another turn. Should always use // Game::off_clock_kill() or always Locator::explicit_die(), not // some combination. p->set_quiet_death(); { const Area &area = p->get_area(); const Area &areaNext = p->get_area_next(); if (!(area == areaNext)) { // Surpress warning message. Really should look into why this // happens. Does happen for Chainsaw. #if 0 cerr << "off_clock_kill(1), area does not equal area next for a " << p->get_class_name() << endl; #endif } } if (!p->die_called()) { p->kill_self(); p->die(); } // In case die modifies the next variables. p->hack_update_area_next(); { const Area &area = p->get_area(); const Area &areaNext = p->get_area_next(); if (!(area == areaNext)) { cerr << "off_clock_kill(2), area does not equal area next for a " << p->get_class_name() << endl; } } } /*** '*' means set in humans_team() '1' means set in one_human_team() P2 P1 |Human | Slave to P1 | Slave to P1's master | Slave to some human, not P1 | | | | or p1's master +------+-------------+----------------------+---------------------------+ Human | * | * 1 | null | * | +------+-------------+----------------------+---------------------------+ Slave to P2 | * 1 | null | null | null | +------+-------------+----------------------+---------------------------+ Slave to P2's | null| null | * 1 | null | master | | | | | +------+-------------+----------------------+---------------------------+ Slave to some | | null | null | | other human, not| * | | | * | P2 or P2s master| | | | | +------+-------------+----------------------+---------------------------+ ***/ Boolean Game::humans_team(LocatorP l,PhysicalP p1,PhysicalP p2) { // Both are Human. IntelP p1Intel = p1->get_intel(); IntelP p2Intel = p2->get_intel(); if (!p1Intel || !p2Intel) { return False; } if (p1Intel->is_human() && p2Intel->is_human()) { return True; } Boolean p1HumanSlave = False; if (!p1Intel->is_human()) { IntelId masterId = ((MachineP)p1Intel)->get_master_intel_id(); IntelP master = l->lookup(masterId); if (master && master->is_human()) { p1HumanSlave = True; } } Boolean p2HumanSlave = False; if (!p2Intel->is_human()) { IntelId masterId = ((MachineP)p2Intel)->get_master_intel_id(); IntelP master = l->lookup(masterId); if (master && master->is_human()) { p2HumanSlave = True; } } if (p1Intel->is_human() && p2HumanSlave) { return True; } if (p1HumanSlave && p2Intel->is_human()) { return True; } if (p1HumanSlave && p2HumanSlave) { return True; } return False; } // Human and his slaves are on the same team. Boolean Game::one_human_team(LocatorP,PhysicalP p1,PhysicalP p2) { IntelP p1Intel = p1->get_intel(); IntelP p2Intel = p2->get_intel(); if (!p1Intel || !p2Intel) { return False; } // P1 is Human, P2 is P1's slave. if (p1Intel->is_human()) { if (!p2Intel->is_human()) { if (((MachineP)p2Intel)->get_master_intel_id() == p1Intel->get_intel_id()) { return True; } } } // P2 is Human, P1 is P2's slave. if (p2Intel->is_human()) { if (!p1Intel->is_human()) { if (((MachineP)p1Intel)->get_master_intel_id() == p2Intel->get_intel_id()) { return True; } } } // P1 and P2 are slaves of the same master. if (!p1Intel->is_human() && !p2Intel->is_human()) { if (((MachineP)p1Intel)->get_master_intel_id() == ((MachineP)p2Intel)->get_master_intel_id()) { return True; } } return False; } #if WIN32 int Game::getWindowList(CTypedPtrList&p_windowlist) { if (ui) { return ui->getWindowList(p_windowlist); } else { return -1; // means no UI } } #endif void Game::play_sounds() { #if WIN32 SoundEvent t_req; int t_pan=0; int t_vol; Pos t_pos=soundManager.getKeyPosition(0); for (int i=0;i1) { soundManager.playSoundById(t_req.soundid,0,0,False); } else { t_pan=(int)(((float)t_req.position.x-(float)t_pos.x) / (float)(((float)W_ROOM_COL_MAX/2)*(float)WSQUARE_WIDTH)*(float)10000); // t_pan=(int)((float)t_req.position.x-(float)t_pos.x) // /(float)(((float)W_ROOM_COL_MAX/2)*(float)WSQUARE_WIDTH ) *(float)10000; if (t_pan>10000) t_pan=10000; if (t_pan< -10000) t_pan= -10000; if (t_pan>2000) t_pan=10000; if (t_pan<-2000) t_pan=-10000; t_vol= (int)(-1000* (t_req.position.distance(t_pos))/ (((float)W_ACROSS_MAX_MAX*2)*(float)WSQUARE_WIDTH )); if (t_vol>0) t_vol=0; soundManager.playSoundById(t_req.soundid,t_pan,t_vol,False); } } } #endif } #if WIN32 void Game::start_soundtrack() { switch (musictype) { case UIsettings::NONE : break; case UIsettings::WAV : { // WAV files disabled. #if 0 soundManager.stopSound(currentSoundName); currentSoundName = style->get_soundtrack(); soundManager.playSound(currentSoundName,0,0,True,True); #endif } break; case UIsettings::CD : { if (soundManager.getTrackCount()) { int t_choose=Utils::choose(soundManager.getTrackCount()); soundManager.stopCD(); soundManager.requestCDtrack(t_choose,1); } } break; case UIsettings::MIDI : { soundManager.stopMIDI(); if (!mididirectory.GetLength()) { currentSoundName = style->get_midisoundtrack(); soundManager.playMidi(currentSoundName,TRUE,1); } else { soundManager.requestRandomMIDItrack(mididirectory,TRUE,1); } } break; default : break; } } void Game::stop_soundtrack() { switch (musictype) { case UIsettings::CD : soundManager.stopCD(); break; case UIsettings::WAV : soundManager.stopSound(currentSoundName); break; case UIsettings::MIDI : soundManager.stopMIDI(); break; } } #endif int Game::limit_humans_num(int h) { int ret = Utils::minimum(h,Locator::HUMANS_MAX); // Can only have more humans than viewports if we are a server. if (role->get_type() != R_SERVER) { ret = Utils::minimum(ret,UI_VIEWPORTS_MAX); } return ret; } xevil-2.02r2.orig/cmn/game_style.cpp0100644000175000017500000020630607637236156016742 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // game_style.cpp #if X11 #ifndef NO_PRAGMAS #pragma implementation "game_style.h" #endif #endif // Include Files #include "stdafx.h" extern "C" { #include } #if X11 #include #endif #if WIN32 #include #endif #include #include "utils.h" #include "coord.h" #include "world.h" #include "locator.h" #include "game_style.h" #include "actual.h" #include "sound_cmn.h" #define SCENARIO_BONUS_TIME 650 #define SCENARIO_HIVE_ALIENS 13 #define SCENARIO_HIVE_EGGS 8 #define SCENARIO_FLAG_ENEMIES 15 #define SCENARIO_SEALS_ENEMIES 4 #define SCENARIO_ZIG_ZAG_ENEMIES 30 // 40 // 50 #define SCENARIO_POUND_DOGS 20 #define SCENARIO_JAPAN_TOWN_NINJAS 15 #define LEVEL_TIME 3000 #define HUMAN_LIVES 4 #define HUMAN_LIVES_SCENARIOS 7 //10 #define SCENARIO_SEALS_SEALS (SCENARIO_SEALS_TRAPDOORS * Trapdoor::SEALS_MAX) #define SCENARIO_SEALS_NEED 15 // Used to be 20, make it easier. #define SCENARIO_ANTI_SEALS_MAX_SLIPPAGE 3 // number of Seals that can get away #define NORMAL_SCENARIOS_FREQUENCY 5 // Every fifth level is a SCENARIO. ////////////////////////// Specific Scenarios ////////////////////////////// enum ScenarioType { EXTERMINATE, // We don't use it right now. BONUS, HIVE, CAPTURE_THE_FLAG, SEALS, ANTI_SEALS, KILL_THE_FIRE_DEMON, KILL_THE_DRAGON, ZIG_ZAG, THE_POUND, JAPAN_TOWN, SCENARIO_NONE, // Must be last. }; class Scenario { public: Scenario(); virtual ~Scenario(); virtual ScenarioType get_scenario_type() = 0; /* NOTE: Only used so we don't choose the same scenario twice in a row. */ virtual Boolean class_friends(); /* EFFECTS: Are Enemies classFriends with each other. */ /* DEFAULT: True */ virtual void set_human_data(HumanP,WorldP,LocatorP); /* DEFAULT: do nothing */ virtual Pos human_initial_pos(WorldP,LocatorP,const Size &s); /* DEFAULT: world.empty_rect(s) */ virtual Boolean can_refill_game_objects(); /* DEFAULT: True */ virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP) = 0; virtual void setup_world(WorldP,LocatorP,const DifficultyLevel &) = 0; virtual void new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int humansNum) = 0; /* EFFECTS: These two functions start a new level in a scenario. setup_world() should just setup the map and size of the world. new_level() is called after world.reset() and does the bulk of the work. */ /* NOTE: Unlike GameStyle::new_level, level is constant. It has already been incremented. Also, there is no kill_fntn as the physicals have already been cleaned. */ virtual void new_level_set_timer(Timer &timer); /* DEFAULT: do nothing */ virtual Boolean advance_level(); /* DEFAULT: True */ virtual Boolean award_bonus(); /* DEFAULT: False */ virtual void refill_enemies(Boolean enemiesRefill,WorldP,LocatorP,IPhysicalManagerP); /* DEFAULT: do nothing */ virtual void filter_weapons_and_other_items(LocatorP,int &weaponsNum, const PhysicalContext *weapons[], int &oItemsNum, const PhysicalContext *oItems[]); /* DEFAULT: Do nothing. */ virtual unsigned int get_soundtrack(); /* DEFAULT: IDW_SOUNDTRACK */ virtual SoundName get_midisoundtrack(){return SoundNames::SOUND_RANDOM;} /* DEFAULT: SOUND_RANDOM */ }; class Exterminate : public Scenario { public: Exterminate(); virtual ScenarioType get_scenario_type() {return EXTERMINATE;} virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP); virtual void setup_world(WorldP,LocatorP,const DifficultyLevel &); virtual void new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int humansNum); private: int enemiesNum; }; class Bonus : public Scenario { public: Bonus(); virtual ScenarioType get_scenario_type() {return BONUS;} virtual Boolean can_refill_game_objects(); virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP); virtual void setup_world(WorldP,LocatorP,const DifficultyLevel &); virtual void new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int humansNum); virtual void new_level_set_timer(Timer &timer); private: Id frogs[SCENARIO_BONUS_FROGS]; int frogsRemaining; }; class Hive : public Scenario { public: Hive(); virtual ScenarioType get_scenario_type() {return HIVE;} virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP); virtual Boolean award_bonus(); /* EFFECTS: Return True. */ virtual void setup_world(WorldP,LocatorP,const DifficultyLevel &); virtual void new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int humansNum); virtual void refill_enemies(Boolean enemiesRefill,WorldP,LocatorP,IPhysicalManagerP); static Boolean aliens_team(LocatorP,PhysicalP,PhysicalP); /* EFFECTS: Aliens and Huggers */ virtual SoundName get_midisoundtrack(){return SoundNames::HIVE_SOUNDTRACK;} private: Id xitId; }; class CaptureTheFlag : public Scenario { public: CaptureTheFlag(); virtual ScenarioType get_scenario_type() {return CAPTURE_THE_FLAG;} virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP); virtual void setup_world(WorldP,LocatorP,const DifficultyLevel &); virtual void new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int humansNum); virtual void refill_enemies(Boolean enemiesRefill,WorldP,LocatorP,IPhysicalManagerP); private: Id flagIds[SCENARIO_FLAG_FLAGS]; int flagsRemaining; }; // Has methods common to Seals and AntiSeals. class GenericSeals: public Scenario { public: GenericSeals(); virtual void setup_world(WorldP,LocatorP,const DifficultyLevel &); virtual void new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int humansNum); virtual Boolean advance_level(); virtual void refill_enemies(Boolean enemiesRefill,WorldP,LocatorP,IPhysicalManagerP); virtual unsigned int get_soundtrack(); virtual SoundName get_midisoundtrack(){return SoundNames::SEAL_SOUNDTRACK;} #ifndef PROTECTED_IS_PUBLIC protected: #endif void compute_out_safe_active_dead(LocatorP,int &lemOut,int &lemSafe,int &lemActive,int &lemDead); /* MODIFIES: lemOut, lemSafe, lemActive, lemDead */ /* EFFECTS: Compute the current number of seals out, safe, active, and dead. */ /* NOTE: Usually lemOut == lemSafe + lemActive + lemDead, but not always because of one turn needed to get new Seals in the locator. */ virtual Boolean (*get_team())(LocatorP,PhysicalP,PhysicalP) = 0; virtual void set_level_strings(int level,ostrstream &lStr,ostrstream &lTitleStr) = 0; /* EFFECTS: Called in new_level() to set the appropriate messages. */ Id homeId; Id trapdoorIds[SCENARIO_SEALS_TRAPDOORS]; int sealsOut,sealsSafe,sealsActive,sealsDead; Boolean dontAdvance; }; class Seals : public GenericSeals { public: Seals(); virtual ScenarioType get_scenario_type() {return SEALS;} virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP); virtual Boolean award_bonus(); /* EFFECTS: Return True. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual Boolean (*get_team())(LocatorP,PhysicalP,PhysicalP); virtual void set_level_strings(int level,ostrstream &lStr,ostrstream &lTitleStr); private: static Boolean seals_team(LocatorP,PhysicalP,PhysicalP); /* EFFECTS: A team such that any two seals are on the same team, any human/human-slave and seal is on the same team, but not two human/human-slaves on the same team. */ }; class AntiSeals : public GenericSeals { public: AntiSeals(); virtual ScenarioType get_scenario_type() {return ANTI_SEALS;} virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP); #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual Boolean (*get_team())(LocatorP,PhysicalP,PhysicalP); virtual void set_level_strings(int level,ostrstream &lStr,ostrstream &lTitleStr); private: static Boolean anti_seals_team(LocatorP,PhysicalP,PhysicalP); }; class KillTheFireDemon : public Scenario { public: KillTheFireDemon(); virtual ScenarioType get_scenario_type() {return KILL_THE_FIRE_DEMON;} virtual SoundName get_midisoundtrack(){return SoundNames::FIRE_SOUNDTRACK;} virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP); virtual void setup_world(WorldP,LocatorP,const DifficultyLevel &); virtual void new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int humansNum); virtual Boolean award_bonus(); /* EFFECTS: Return True. */ }; class KillTheDragon : public Scenario { public: KillTheDragon(); virtual ScenarioType get_scenario_type() {return KILL_THE_DRAGON;} virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP); virtual void setup_world(WorldP,LocatorP,const DifficultyLevel &); virtual void new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int humansNum); virtual SoundName get_midisoundtrack(){return SoundNames::FIRE_SOUNDTRACK;} virtual Boolean award_bonus(); /* EFFECTS: Return True. */ }; class ZigZag : public Scenario { public: ZigZag(); virtual ScenarioType get_scenario_type() {return ZIG_ZAG;} virtual void set_human_data(HumanP,WorldP,LocatorP); virtual Pos human_initial_pos(WorldP,LocatorP,const Size &s); virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP); virtual void setup_world(WorldP,LocatorP,const DifficultyLevel &); virtual void new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int humansNum); virtual void refill_enemies(Boolean enemiesRefill,WorldP,LocatorP,IPhysicalManagerP); virtual Boolean award_bonus(); /* EFFECTS: Return True. */ private: Id xitId; }; class ThePound : public Scenario { public: ThePound(); virtual ScenarioType get_scenario_type() {return THE_POUND;} virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP); virtual void setup_world(WorldP,LocatorP,const DifficultyLevel &); virtual void new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int humansNum); }; class JapanTown : public Scenario { public: JapanTown(); virtual ScenarioType get_scenario_type() {return JAPAN_TOWN;} virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP); virtual void setup_world(WorldP,LocatorP,const DifficultyLevel &); virtual void new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int humansNum); virtual void filter_weapons_and_other_items(LocatorP,int &weaponsNum, const PhysicalContext *weapons[], int &oItemsNum, const PhysicalContext *oItems[]); static Boolean ninja_team(LocatorP,PhysicalP,PhysicalP); /* EFFECTS: All enemy Ninjas. */ /* NOTE: Left public so that Game can reuse this team definition. */ }; GameStyle::GameStyle() {} GameStyle::~GameStyle() {} GameStyle *GameStyle::by_type(GameStyleType type) { GameStyle *ret = NULL; switch (type) { case LEVELS: ret = new Normal(); break; case LEVELS_ONLY: ret = new Levels(); break; case KILL: ret = new KillKillKill(); break; case DUEL: ret = new Duel(); break; case EXTENDED: ret = new ExtendedDuel(); break; case TRAINING: ret = new Training(); break; case SCENARIOS: ret = new Scenarios(); break; } assert(ret); return ret; } Boolean GameStyle::uses_enemies_num(GameStyleType style) { return (style == KILL || style == DUEL || style == EXTENDED); } Boolean GameStyle::uses_enemies_refill(GameStyleType style) { // They happen to be the same now. return uses_enemies_num(style); } Boolean GameStyle::class_friends() { return True; } int GameStyle::human_initial_lives() { return HUMAN_LIVES; } void GameStyle::set_human_data(HumanP,WorldP,LocatorP) {} Pos GameStyle::human_initial_pos(WorldP world,LocatorP,const Size &size) { return world->empty_rect(size); } Boolean GameStyle::can_refill_game_objects() { return True; } Boolean GameStyle::need_difficulty(int) { return True; } int GameStyle::new_level_check(int,WorldP,LocatorP, int,Boolean &,ostrstream &,Timer &timer, IPhysicalManagerP) { // A timer-based level. if (timer.ready()) { return 0; } // continue return -1; } Boolean GameStyle::game_over_check(int humansPlaying,int) { if (humansPlaying == HU_UNSPECIFIED) { return False; } return (humansPlaying == 0); } Boolean GameStyle::advance_level() { return True; } Boolean GameStyle::award_bonus() { return False; } void GameStyle::new_level_set_timer(Timer &timer) { timer.set(LEVEL_TIME); } char *GameStyle::can_reset(int,int,Boolean) { // Ok to reset. return NULL; } void GameStyle::clean_physicals(Boolean doMinimum,WorldP world, LocatorP locator,IPhysicalManagerP manager) { // Clean up all Physicals in the Game. World must have been reset so // that human players can be moved to the inside of the world. PhysicalIter pIter(*locator); PhysicalP p; // Make two passes, one just to get the followers. PtrList leaveAlone; // Explicitly leave these Objects alone. while (p = pIter()) { int action = partition(p,doMinimum,world,locator); if (action == RELOCATE || action == LEAVE_ALONE) { // Don't worry about add_unique(), as of now, no object can be a // follower of more than one other object. // // Also, get all followers of followers. Fix Dragon bug. get_followers_recursive(leaveAlone,p); } } // Now that we have the leaveAlone list, actually clean the objects. PhysicalIter pIter2(*locator); while (p = pIter2()) { int action = partition(p,doMinimum,world,locator); if (action == RELOCATE) { const Area &area = p->get_area(); IntelP intel = p->get_intel(); Size size = area.get_size(); Pos posNew; if (intel && intel->is_human()) { // Let specific scenario decide. posNew = human_initial_pos(world,locator,size); } else { // If necessary, add machine_initial_pos(). posNew = world->empty_rect(size); } ((MovingP)p)->relocate(posNew); } else if (action == KILL_OFF && !leaveAlone.contains(p)) { manager->kill_physical(p); } // else leave object alone } } void GameStyle::filter_weapons_and_other_items(LocatorP,int &, const PhysicalContext *[], int &, const PhysicalContext *[]) { } unsigned int GameStyle::get_soundtrack() { return SoundNames::SOUNDTRACK; } SoundName GameStyle::get_midisoundtrack() { return SoundNames::SOUND_RANDOM; } int GameStyle::partition(PhysicalP p,Boolean doMinimum, WorldP world,LocatorP locator) { IntelP intel = p->get_intel(); Boolean controlled = False; // Save Human controlled physicals. if (intel && intel->is_human()) { controlled = True; } // Save enemies if doMinimum is True. Only used now for KillKillKill // game style. if (doMinimum && intel && intel->is_enemy()) { controlled = True; } // Save Machines that are slaves of Humans. if (intel && !intel->is_human()) { IntelP master = locator->lookup(((MachineP)intel)->get_master_intel_id()); if (master && master->is_human()) { controlled = True; } } // Move human/slave to a new location inside the World. if (controlled) { assert(p->is_moving()); const Area &area = p->get_area(); Loc middle = area.middle_wsquare(); if (!doMinimum || !world->inside(middle)) { // Relocate if doing everthing or if we need to keep it inside. return RELOCATE; } return LEAVE_ALONE; } else if (p->is_item()) { if (!doMinimum) { // The follower logic will take care of items held by Human players return KILL_OFF; } return LEAVE_ALONE; } // Kill everything else, ha, ha, ha. else { return KILL_OFF; } } void GameStyle::get_followers_recursive(PtrList& leaveAlone,PhysicalP p) { PtrList immediate; p->get_followers(immediate); leaveAlone.append(immediate); // Call self on all followers. for (int n = 0; n < immediate.length(); n++) { PhysicalP f = (PhysicalP)immediate.get(n); get_followers_recursive(leaveAlone,f); } } Normal::Normal() { playScenarios = False; levels = new Levels(); scenarios = new Scenarios(); assert(levels && scenarios); } Normal::~Normal() { delete levels; delete scenarios; } GameStyleP Normal::clone() { GameStyleP ret = new Normal(); assert(ret); return ret; } void Normal::describe(ostrstream &str) { str << "Complete each level/scenario to proceed to the next one." << ends; } GameStyleType Normal::get_type() { // A bit of a hack return LEVELS; } int Normal::human_initial_lives() { return HUMAN_LIVES; } void Normal::set_human_data(HumanP h,WorldP w,LocatorP l) { GameStyleP delegate = get_delegate(); delegate->set_human_data(h,w,l); } Pos Normal::human_initial_pos(WorldP w,LocatorP l,const Size &s) { GameStyleP delegate = get_delegate(); return delegate->human_initial_pos(w,l,s); } Boolean Normal::can_refill_game_objects() { GameStyleP delegate = get_delegate(); return delegate->can_refill_game_objects(); } char *Normal::can_reset(int humansNumNext,int,Boolean) { if (humansNumNext == HU_UNSPECIFIED) { return NULL; } if (humansNumNext < 1) { return Utils::strdup("NEED AT LEAST ONE HUMAN PLAYER"); } return NULL; } void Normal::reset(WorldP w,LocatorP l,const DifficultyLevel &dLevel,int enemiesNumNext) { levels->reset(w,l,dLevel,enemiesNumNext); scenarios->reset(w,l,dLevel,enemiesNumNext); } int Normal::new_level_check(int enemiesPlaying,WorldP w,LocatorP l, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP manager) { GameStyleP delegate = get_delegate(); return delegate->new_level_check(enemiesPlaying,w,l,level,lStrChanged,levelStr,timer,manager); } Boolean Normal::advance_level() { GameStyleP delegate = get_delegate(); return delegate->advance_level(); } Boolean Normal::award_bonus() { GameStyleP delegate = get_delegate(); return delegate->award_bonus(); } void Normal::new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int humansNum) { // Choose which delegate to use. if (level % NORMAL_SCENARIOS_FREQUENCY == 0) { playScenarios = True; } else { playScenarios = False; } GameStyleP delegate = get_delegate(); delegate->new_level(level,world,locator,dLevel,lStr,lTitleStr,manager,humansNum); } void Normal::new_level_set_timer(Timer &timer) { GameStyleP delegate = get_delegate(); delegate->new_level_set_timer(timer); } void Normal::refill_enemies(Boolean eRefill,WorldP w,LocatorP l, IPhysicalManagerP manager) { GameStyleP delegate = get_delegate(); delegate->refill_enemies(eRefill,w,l,manager); } unsigned int Normal::get_soundtrack() { GameStyleP delegate = get_delegate(); return delegate->get_soundtrack(); } SoundName Normal::get_midisoundtrack() { GameStyleP delegate = get_delegate(); return delegate->get_midisoundtrack(); } Levels::Levels() {} GameStyleP Levels::clone() { GameStyleP ret = new Levels(); assert(ret); return ret; } void Levels::describe(ostrstream &str) { str << "Human player(s) fights through increasing levels of " << "difficulty." << "\n" << "To complete a level you must kill all enemy players." << ends; } GameStyleType Levels::get_type() { return LEVELS_ONLY; } char *Levels::can_reset(int humansNumNext,int,Boolean) { if (humansNumNext == HU_UNSPECIFIED) { return NULL; } if (humansNumNext < 1) { return Utils::strdup("LEVELS REQUIRES AT LEAST ONE HUMAN PLAYER"); } return NULL; } void Levels::reset(WorldP,LocatorP,const DifficultyLevel &dLevel,int) { // So first level will start out with enemiesInitial. enemiesNum = dLevel.enemiesInitial - dLevel.enemiesIncr; } int Levels::new_level_check(int enemiesPlaying,WorldP,LocatorP, int,Boolean &,ostrstream &,Timer &, IPhysicalManagerP) { if (enemiesPlaying == 0) { return 1; } else { return -1; } } void Levels::new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int) { world->reset(); // clean_physicals(True,world,locator,manager); clean_physicals(False,world,locator,manager); lTitleStr << "[" << level << "] Kill All Machines" << ends; lStr << "Level: " << level << ends; enemiesNum += dLevel.enemiesIncr; enemiesNum = Utils::minimum(enemiesNum,dLevel.enemiesMax); for (int m = 0; m < enemiesNum; m++) { manager->create_enemy(NULL); } } void Levels::new_level_set_timer(Timer &) {} void Levels::refill_enemies(Boolean,WorldP,LocatorP, IPhysicalManagerP) { // Never refill. } unsigned int Levels::get_soundtrack() { return SoundNames::SOUNDTRACK_LEVELS; } KillKillKill::KillKillKill() { justReset = False; enemiesNum = 0; } GameStyleP KillKillKill::clone() { GameStyleP ret = new KillKillKill(); assert(ret); return ret; } void KillKillKill::describe(ostrstream &str) { str << "Every human and machine for him/her/itself." << ends; } GameStyleType KillKillKill::get_type() { return KILL; } Boolean KillKillKill::class_friends() { return False; } char *KillKillKill::can_reset(int humansNumNext,int enemiesNumNext,Boolean) { if (humansNumNext == HU_UNSPECIFIED) { return NULL; } if (humansNumNext + enemiesNumNext < 2) { return Utils::strdup("YOU NEED AT LEAST 2 HUMAN OR MACHINE PLAYERS TO " "PLAY KILL, KILL, KILL"); } return NULL; } Boolean KillKillKill::need_difficulty(int enemiesNumNext) { return (enemiesNumNext > 0); } void KillKillKill::reset(WorldP,LocatorP,const DifficultyLevel &, int enemiesNumNext) { enemiesNum = enemiesNumNext; justReset = True; } Boolean KillKillKill::game_over_check(int humansPlaying,int enemiesPlaying) { if (humansPlaying == HU_UNSPECIFIED) { return False; } return (humansPlaying + enemiesPlaying <= 1); } void KillKillKill::new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int) { world->reset(); // Don't wipe out the Enemies. clean_physicals(True,world,locator,manager); lTitleStr << "Level: " << level << ends; lStr << "Level: " << level << ends; // Only create enemies first time or if enemiesRefill is set. if (justReset) { justReset = False; for (int m = 0; m < enemiesNum; m++) { manager->create_enemy(NULL); } } } void KillKillKill::refill_enemies(Boolean enemiesRefill,WorldP,LocatorP locator, IPhysicalManagerP manager) { // Only refill enemies if enemiesRefill flag is set. if (!enemiesRefill) { return; } int diff = enemiesNum - locator->enemies_alive(); assert(diff >= 0); for (int n = 0; n < diff; n++) { manager->create_enemy(NULL); } } SoundName KillKillKill::get_midisoundtrack() { return SoundNames::KILL_SOUNDTRACK; } Duel::Duel() { } GameStyleP Duel::clone() { GameStyleP ret = new Duel(); assert(ret); return ret; } void Duel::describe(ostrstream &str) { str << "Human vs. human battle to the death." << "\n" << "Each human has 3 lives." << ends; } GameStyleType Duel::get_type() { return DUEL; } Boolean Duel::need_difficulty(int enemiesNumNext) { return (enemiesNumNext > 0); } char *Duel::can_reset(int humansNumNext,int,Boolean cooperative) { if (humansNumNext == HU_UNSPECIFIED) { return NULL; } if (humansNumNext < 2) { return Utils::strdup("YOU NEED AT LEAST 2 HUMAN PLAYERS FOR A DUEL"); } if (cooperative) { return Utils::strdup("CAN'T PLAY A DUEL WITH COOPERATIVE MODE ON"); } return NULL; } void Duel::reset(WorldP,LocatorP,const DifficultyLevel &, int enemiesNumNext) { enemiesNum = enemiesNumNext; justReset = True; } Boolean Duel::game_over_check(int humansPlaying,int) { if (humansPlaying == HU_UNSPECIFIED) { return False; } return (humansPlaying <= 1); } void Duel::new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int) { world->reset(); clean_physicals(False,world,locator,manager); lTitleStr << "Level: " << level << ends; lStr << "Level: " << level << ends; // Only create enemies first time. if (justReset) { justReset = False; for (int m = 0; m < enemiesNum; m++) { manager->create_enemy(NULL); } } } void Duel::refill_enemies(Boolean enemiesRefill,WorldP,LocatorP locator, IPhysicalManagerP manager) { // Only refill enemies if enemiesRefill flag is set. if (!enemiesRefill) { return; } int diff = enemiesNum - locator->enemies_alive(); assert(diff >= 0); for (int n = 0; n < diff; n++) { manager->create_enemy(NULL); } } ExtendedDuel::ExtendedDuel() {} GameStyleP ExtendedDuel::clone() { GameStyleP ret = new ExtendedDuel(); assert(ret); return ret; } void ExtendedDuel::describe(ostrstream &str) { str << "Human vs. human battle to the death." << "\n" << "Unlimited lives." << ends; } GameStyleType ExtendedDuel::get_type() { return EXTENDED; } int ExtendedDuel::human_initial_lives() { return IT_INFINITE_LIVES; } Boolean ExtendedDuel::need_difficulty(int enemiesNumNext) { return (enemiesNumNext > 0); } char *ExtendedDuel::can_reset(int humansNumNext,int,Boolean cooperative) { if (humansNumNext == HU_UNSPECIFIED) { return NULL; } if (humansNumNext < 2) { return Utils::strdup("YOU NEED AT LEAST 2 HUMAN PLAYERS FOR A DUEL"); } if (cooperative) { return Utils::strdup("CAN'T PLAY A DUEL WITH COOPERATIVE MODE ON"); } return NULL; } void ExtendedDuel::reset(WorldP,LocatorP,const DifficultyLevel &, int enemiesNumNext) { enemiesNum = enemiesNumNext; justReset = True; } Boolean ExtendedDuel::game_over_check(int humansPlaying,int) { if (humansPlaying == HU_UNSPECIFIED) { return False; } return (humansPlaying <= 1); } void ExtendedDuel::new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int) { world->reset(); clean_physicals(False,world,locator,manager); lTitleStr << "Level: " << level << ends; lStr << "Level: " << level << ends; // Only create enemies first time. if (justReset) { justReset = False; for (int m = 0; m < enemiesNum; m++) { manager->create_enemy(NULL); } } } void ExtendedDuel::refill_enemies(Boolean enemiesRefill,WorldP,LocatorP locator, IPhysicalManagerP manager) { // Only refill enemies if enemiesRefill flag is set. if (!enemiesRefill) { return; } int diff = enemiesNum - locator->enemies_alive(); assert(diff >= 0); for (int n = 0; n < diff; n++) { manager->create_enemy(NULL); } } Training::Training() {} GameStyleP Training::clone() { GameStyleP ret = new Training(); assert(ret); return ret; } void Training::describe(ostrstream &str) { str << "No enemies. Useful for learning the controls." << ends; } GameStyleType Training::get_type() { return TRAINING; } Boolean Training::need_difficulty(int) { return False; } void Training::reset(WorldP,LocatorP,const DifficultyLevel &,int) {} void Training::new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int) { world->reset(); clean_physicals(False,world,locator,manager); lTitleStr << "Level: " << level << ends; lStr << "Level: " << level << ends; } void Training::refill_enemies(Boolean,WorldP,LocatorP,IPhysicalManagerP) {} Scenarios::Scenarios() { scenario = NULL; } Scenarios::~Scenarios() { delete scenario; } GameStyleP Scenarios::clone() { GameStyleP ret = new Scenarios(); assert(ret); return ret; } void Scenarios::describe(ostrstream &str) { str << "A number of different scenarios." << "\n" << "You must complete each scenario to continue on to the " << "next one." << ends; } GameStyleType Scenarios::get_type() { return SCENARIOS; } Boolean Scenarios::class_friends() { assert(scenario); return scenario->class_friends(); } int Scenarios::human_initial_lives() { return HUMAN_LIVES_SCENARIOS; } void Scenarios::set_human_data(HumanP h,WorldP w,LocatorP l) { assert(scenario); scenario->set_human_data(h,w,l); } Pos Scenarios::human_initial_pos(WorldP w,LocatorP l,const Size &s) { // defer to specific scenario assert(scenario); return scenario->human_initial_pos(w,l,s); } Boolean Scenarios::can_refill_game_objects() { // defer to specific scenario assert(scenario); return scenario->can_refill_game_objects(); } char *Scenarios::can_reset(int humansNumNext,int,Boolean) { if (humansNumNext == HU_UNSPECIFIED) { return NULL; } if (humansNumNext < 1) { return Utils::strdup("SCENARIOS REQUIRES AT LEAST ONE HUMAN PLAYER"); } return NULL; } void Scenarios::reset(WorldP,LocatorP,const DifficultyLevel &,int) { delete scenario; scenario = NULL; } int Scenarios::new_level_check(int enemiesPlaying,WorldP w,LocatorP l, int level,Boolean &lStrChanged, ostrstream &levelStr,Timer &timer, IPhysicalManagerP manager) { assert(scenario); return scenario->new_level_check(enemiesPlaying,w,l,level, lStrChanged,levelStr,timer,manager); } Boolean Scenarios::advance_level() { if (scenario) { return scenario->advance_level(); } else { // For first time. return True; } } Boolean Scenarios::award_bonus() { if (scenario) { return scenario->award_bonus(); } else { // For first time. return False; } } void Scenarios::new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int humansNum) { // Works even if scenario is NULL. if (!scenario || scenario->advance_level()) { // Sets new value for this->scenario. choose_scenario(); } scenario->setup_world(world,locator,dLevel); world->reset(); clean_physicals(False,world,locator,manager); scenario->new_level(level,world,locator,dLevel, lStr,lTitleStr,manager,humansNum); } void Scenarios::new_level_set_timer(Timer &timer) { assert(scenario); scenario->new_level_set_timer(timer); } void Scenarios::refill_enemies(Boolean eRefill,WorldP w,LocatorP l, IPhysicalManagerP manager) { assert(scenario); scenario->refill_enemies(eRefill,w,l,manager); } void Scenarios::set_override(char *val) { // override = Utils::strdup(val); override = val; } void Scenarios::choose_scenario() { ScenarioType prevScenario = scenario ? scenario->get_scenario_type() : SCENARIO_NONE; delete scenario; scenario = NULL; if (override) { if (!(strcmp("exterminate",override))) { scenario = new Exterminate(); } else if (!(strcmp("bonus",override))) { scenario = new Bonus(); } else if (!(strcmp("hive",override))) { scenario = new Hive(); } else if (!(strcmp("flag",override))) { scenario = new CaptureTheFlag(); } else if (!(strcmp("baby-seals",override))) { scenario = new Seals(); } else if (!(strcmp("anti-baby-seals",override))) { scenario = new AntiSeals(); } else if (!(strcmp("fire-demon",override))) { scenario = new KillTheFireDemon(); } else if (!(strcmp("dragon",override))) { scenario = new KillTheDragon(); } else if (!(strcmp("zig-zag",override))) { scenario = new ZigZag(); } else if (!(strcmp("the-pound",override))) { scenario = new ThePound(); } else if (!(strcmp("japan-town",override))) { scenario = new JapanTown(); } } // We chose one from the override, so we are done. if (scenario) { return; } // Keep trying until we choose one that isn't the same as the last one. while (True) { switch (Utils::choose(10)) { case 0: scenario = new Bonus(); break; case 1: scenario = new Hive(); break; case 2: scenario = new CaptureTheFlag(); break; case 3: scenario = new Seals(); break; case 4: scenario = new AntiSeals(); break; case 5: scenario = new KillTheFireDemon(); break; case 6: scenario = new KillTheDragon(); break; case 7: scenario = new ZigZag(); break; case 8: scenario = new ThePound(); break; case 9: scenario = new JapanTown(); break; default: assert(0); } // Done, don't choose same scenario twice in a row. if (scenario->get_scenario_type() != prevScenario) { return; } // Try again. else { delete scenario; scenario = NULL; } } } void Scenarios::filter_weapons_and_other_items(LocatorP l, int &wNum,const PhysicalContext *w[], int &oINum,const PhysicalContext *oI[]) { assert(scenario); scenario->filter_weapons_and_other_items(l,wNum,w,oINum,oI); } unsigned int Scenarios::get_soundtrack() { // Needs to work before first new level. if (scenario) { return scenario->get_soundtrack(); } else { return GameStyle::get_soundtrack(); } } SoundName Scenarios::get_midisoundtrack() { // Needs to work before first new level. if (scenario) { return scenario->get_midisoundtrack(); } else { return GameStyle::get_midisoundtrack(); } } // All enemy dogs on same team. static Boolean Scenarios_dog_team_member(PhysicalP p) { IntelP intel = p->get_intel(); if (intel && intel->is_enemy() && p->get_class_id() == A_Dog) { return True; } return False; } Boolean Scenarios::dog_team(LocatorP,PhysicalP p1,PhysicalP p2) { return Scenarios_dog_team_member(p1) && Scenarios_dog_team_member(p2); } char *Scenarios::override = NULL; ////////////////////////// Specific Scenarios //////////////////////////////////// Scenario::Scenario() {} Scenario::~Scenario() {} Boolean Scenario::class_friends() { return True; } void Scenario::set_human_data(HumanP,WorldP,LocatorP) {} Pos Scenario::human_initial_pos(WorldP world,LocatorP,const Size &size) { return world->empty_rect(size); } Boolean Scenario::can_refill_game_objects() { return True; } void Scenario::new_level_set_timer(Timer &) {} Boolean Scenario::advance_level() { return True; } Boolean Scenario::award_bonus() { return False; } void Scenario::refill_enemies(Boolean,WorldP,LocatorP,IPhysicalManagerP) {} void Scenario::filter_weapons_and_other_items(LocatorP,int &,const PhysicalContext *[], int &,const PhysicalContext *[]) { } unsigned int Scenario::get_soundtrack() { return SoundNames::SOUNDTRACK; } Exterminate::Exterminate() {} int Exterminate::new_level_check(int enemiesPlaying,WorldP,LocatorP, int,Boolean &,ostrstream &,Timer &, IPhysicalManagerP) { if (enemiesPlaying == 0) { return 1; } return -1; } void Exterminate::setup_world(WorldP,LocatorP,const DifficultyLevel &) { // Nothing to do. } void Exterminate::new_level(int level,WorldP,LocatorP, const DifficultyLevel &dLevel, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int) { lTitleStr << "[" << level << "] EXTERMINATE" << ends; lStr << "[" << level << "] EXTERMINATE\nKill all machines." << ends; // Doesn't increment like LEVELS game style enemiesNum = dLevel.enemiesIncr; for (int m = 0; m < enemiesNum; m++) { manager->create_enemy(NULL); } } Bonus::Bonus() { frogsRemaining = 0; } Boolean Bonus::can_refill_game_objects() { return False; } int Bonus::new_level_check(int,WorldP,LocatorP locator, int level,Boolean &lStrChanged, ostrstream &levelStr,Timer &timer, IPhysicalManagerP) { // Ran out of time. if (timer.ready()) { locator->message_enq(Utils::strdup("FAILED TO KILL ALL THE FROGS")); return 0; } // Count number of Frogs still alive. int remaining = 0; for (int n = 0; n < SCENARIO_BONUS_FROGS; n++) { PhysicalP p = locator->lookup(frogs[n]); if (p && p->alive()) { remaining++; } } // Update ui-> if (remaining != frogsRemaining) { frogsRemaining = remaining; levelStr << "[" << level << "] BONUS LEVEL\nfrogs remaining: " << remaining << ends; lStrChanged = True; if (remaining > 0) { ostrstream arenaStr; arenaStr << remaining << " Frog" << (remaining > 1 ? "s" : "") << " Remaining" << ends; locator->arena_message_enq(arenaStr.str()); } // Will only be called once per level. if (frogsRemaining == 0) { // ostrstream ostr; // ostr << "**** You must feel proud of yourself for killing all " // << "those defenseless frogs. ****" << ends; // locator->message_enq(ostr.str()); locator->arena_message_enq(Utils::strdup("Got em all")); return 1; } } return -1; } void Bonus::setup_world(WorldP world,LocatorP,const DifficultyLevel &) { Rooms rooms(2,1); world->set_rooms_next(rooms); } void Bonus::new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int) { // Create frogs for (int n = 0; n < SCENARIO_BONUS_FROGS; n++) { PhysicalP p = manager->create_enemy(manager->enemy_physical(A_Frog)); frogs[n] = p->get_id(); } // Create one weapon PhysicalP weap = NULL; switch(Utils::choose(5)) { case 0: weap = new FThrower(world,locator,world->empty_rect(FThrower::get_size_max())); break; case 1: weap = new Grenades(world,locator,world->empty_rect(Grenades::get_size_max())); break; case 2: weap = new Chainsaw(world,locator,world->empty_rect(Chainsaw::get_size_max())); break; case 3: weap = new MGun(world,locator,world->empty_rect(MGun::get_size_max())); break; case 4: weap = new Stars(world,locator,world->empty_rect(Pistol::get_size_max())); break; } assert(weap); locator->add(weap); frogsRemaining = SCENARIO_BONUS_FROGS; lTitleStr << "[" << level << "] Bonus Level: Kill " << (int)SCENARIO_BONUS_FROGS << " Frogs" << ends; lStr << "[" << level << "] BONUS LEVEL\nfrogs remaining: " << (int)SCENARIO_BONUS_FROGS << ends; } void Bonus::new_level_set_timer(Timer &timer) { // Limited time to kill the frogs. timer.set(SCENARIO_BONUS_TIME); } Hive::Hive() { } int Hive::new_level_check(int,WorldP,LocatorP locator, int,Boolean &,ostrstream &,Timer &, IPhysicalManagerP) { PhysicalP xit = locator->lookup(xitId); assert(xit); // The Xit should never be destroyed. if (((TouchableP)xit)->wasTouched()) { return 0; } return -1; } Boolean Hive::award_bonus() { return True; } void Hive::setup_world(WorldP world,LocatorP,const DifficultyLevel &) { Rooms rooms(5,5); world->set_rooms_next(rooms); } void Hive::new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int) { // Aliens are created in Game::clock. // So Aliens and Huggers are friends. locator->add_team(aliens_team,NULL); // Create the Xit. Pos pos = world->empty_accessible_rect(Xit::get_size_max()); PhysicalP p = new Xit(world,locator,pos); assert(p); locator->add(p); xitId = p->get_id(); // Create some eggs. IntelOptions eggOptions; ITmask eggMask = manager->intel_options_for(eggOptions,A_Alien); for (int n = 0; n < SCENARIO_HIVE_EGGS; n++) { Pos pos = world->empty_rect(Egg::get_size_max()); PhysicalP egg = new Egg(world,locator,pos,eggOptions,eggMask); assert(egg); locator->add(egg); } lTitleStr << "[" << level << "] HIVE" << ends; lStr << "[" << level << "] HIVE.\nFind the exit." << ends; } void Hive::refill_enemies(Boolean,WorldP,LocatorP locator,IPhysicalManagerP manager) { int diff = SCENARIO_HIVE_ALIENS - locator->enemies_alive(); // diff might be less than zero if some RedHuggers have come into existence. //assert(diff >= 0); for (int n = 0; n < diff; n++) { manager->create_enemy(manager->enemy_physical(A_Alien)); } } static Boolean Hive_aliens_team_member(PhysicalP p) { // Eggs are on the team, even though they don't have intelligence. if (p->get_class_id() == A_Egg) { return True; } // Creature in process of being hugged. if (p->is_creature() && ((CreatureP)p)->get_alien_immune()) { return True; } IntelP intel = p->get_intel(); if (!intel) { return False; } if (intel->is_human()) { return False; } // Hugger or alien. if (p->get_class_id() == A_Alien || p->get_ability(AB_Hugger)) { return True; } return False; } Boolean Hive::aliens_team(LocatorP,PhysicalP p1,PhysicalP p2) { return Hive_aliens_team_member(p1) && Hive_aliens_team_member(p2); } CaptureTheFlag::CaptureTheFlag() {} int CaptureTheFlag::new_level_check(int,WorldP,LocatorP locator, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &, IPhysicalManagerP manager) { int fRemaining = 0; for (int n = 0; n < SCENARIO_FLAG_FLAGS; n++) { PhysicalP p = locator->lookup(flagIds[n]); if (p) { fRemaining++; if (((TouchableP)p)->wasTouched()) { manager->kill_physical(p); } } } if (fRemaining != flagsRemaining) { flagsRemaining = fRemaining; levelStr << "[" << level << "] COLLECT " << (int)SCENARIO_FLAG_FLAGS << " FLAGS\nremaining: "<< flagsRemaining << ends; lStrChanged = True; ostrstream arenaStr; if (fRemaining != 0) { arenaStr << flagsRemaining << " Flag" << (flagsRemaining > 1 ? "s" : "") << " Remaining" << ends; } else { arenaStr << "All Flags Collected" << ends; } locator->arena_message_enq(arenaStr.str()); } if (fRemaining == 0) { // All flags are gone, so end level. return 1; } return -1; } void CaptureTheFlag::setup_world(WorldP world,LocatorP,const DifficultyLevel &) { world->set_special_map_next(World::FLAG); } void CaptureTheFlag::new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP,int) { for (int n = 0; n < SCENARIO_FLAG_FLAGS; n++) { Pos pos = world->empty_accessible_rect(Flag::get_size_max()); PhysicalP p = new Flag(world,locator,pos); assert(p); locator->add(p); flagIds[n] = p->get_id(); } flagsRemaining = SCENARIO_FLAG_FLAGS; lTitleStr << "[" << level << "] Capture The Flag: " << (int)SCENARIO_FLAG_FLAGS << " Flags" << ends; lStr << "[" << level << "] COLLECT " << (int)SCENARIO_FLAG_FLAGS << " FLAGS.\nremaining: " << (int)SCENARIO_FLAG_FLAGS << ends; } void CaptureTheFlag::refill_enemies(Boolean,WorldP,LocatorP locator,IPhysicalManagerP manager) { int diff = SCENARIO_FLAG_ENEMIES - locator->enemies_alive(); assert(diff >= 0); for (int n = 0; n < diff; n++) { manager->create_enemy(NULL); } } GenericSeals::GenericSeals() { dontAdvance = False; sealsOut = sealsSafe = sealsActive = sealsDead = 0; } void GenericSeals::setup_world(WorldP world,LocatorP,const DifficultyLevel &) { world->set_special_map_next(World::SEALS); } void GenericSeals::new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP,int) { // Add a team for each human in the game. // Don't use locator->humans_registered() because they may not have been // registered at this time. TeamOptions ops; ops.membersDontCollide = False; // Only need one team rule now. Boolean (*teamFntn)(LocatorP,PhysicalP,PhysicalP) = get_team(); locator->add_team(teamFntn,&ops); // You have to save/kill the seals to go on. dontAdvance = True; // Know these areas are open because they are within the // (OBJECT_COL_MAX,OBJECT_ROW_MAX) margain around the World edge. Size worldSize = world->get_size(); Size homeSize = Home::get_size(); Size trapdoorSize = Trapdoor::get_size(); Pos homePos((worldSize.width - homeSize.width) / 2, worldSize.height - WSQUARE_HEIGHT - homeSize.height); PhysicalP home = new Home(world,locator,homePos); assert(home); locator->add(home); homeId = home->get_id(); // Create Trapdoor after Home because it needs homeId. Pos trapdoorPos(3 * WSQUARE_WIDTH,WSQUARE_HEIGHT); Pos trapdoorPos2(worldSize.width - 3 * WSQUARE_WIDTH - trapdoorSize.width, WSQUARE_HEIGHT); PhysicalP trapdoor = new Trapdoor(world,locator,trapdoorPos,homeId); locator->add(trapdoor); trapdoorIds[0] = trapdoor->get_id(); PhysicalP trapdoor2 = new Trapdoor(world,locator,trapdoorPos2,homeId); locator->add(trapdoor2); trapdoorIds[1] = trapdoor2->get_id(); sealsOut = sealsSafe = sealsActive = sealsDead = 0; // lStr and lTitleStr were in the wrong order, ok now. set_level_strings(level,lStr,lTitleStr); } Boolean GenericSeals::advance_level() { return !dontAdvance; } void GenericSeals::refill_enemies(Boolean,WorldP,LocatorP locator,IPhysicalManagerP manager) { int diff = SCENARIO_SEALS_ENEMIES - locator->enemies_alive(); assert(diff >= 0); // Change the num argument to enemy_physical if this list is changed. int list[] = {A_Ninja,A_Dog,A_Walker}; // No more Hero or Alien for (int n = 0; n < diff; n++) { manager->create_enemy(manager->enemy_physical(list,3)); } } unsigned int GenericSeals::get_soundtrack() { return SoundNames::SOUNDTRACK_SEAL; } void GenericSeals::compute_out_safe_active_dead(LocatorP locator,int &lemOut,int &lemSafe,int &lemActive,int &lemDead) { // Lookup home and trapdoors. HomeP home = (HomeP)locator->lookup(homeId); TrapdoorP trapdoor = (TrapdoorP)locator->lookup(trapdoorIds[0]); TrapdoorP trapdoor2 = (TrapdoorP)locator->lookup(trapdoorIds[1]); assert(home && trapdoor && trapdoor2); // Count seals out, active, and safe. // Care about SealIntels, not Seals. IntelId seals[SCENARIO_SEALS_SEALS]; lemOut = 0; trapdoor->append_seals_out(lemOut,seals); trapdoor2->append_seals_out(lemOut,seals); lemSafe = home->get_seals_safe(); lemActive = 0; lemDead = 0; for (int n = 0; n < lemOut; n++) { IntelP sealIntel = locator->lookup(seals[n]); if (sealIntel) { PhysicalP seal = locator->lookup(sealIntel->get_id()); if (seal) { if (seal->alive()) { lemActive++; } else { lemDead++; } } } else { lemDead++; } } // Don't count safe seals as dead. lemDead -= lemSafe; assert(lemDead >= 0); lemDead = Utils::maximum(lemDead,0); // keep playing anyway. // Can't use this because, for one turn, lemOut is incremented, but lemActive hasn't // caught up. // lemDead = lemOut - lemSafe - lemActive; } Seals::Seals() { } int Seals::new_level_check(int,WorldP,LocatorP locator, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &, IPhysicalManagerP) { int lemOut,lemSafe,lemActive,lemDead; compute_out_safe_active_dead(locator,lemOut,lemSafe,lemActive,lemDead); // unnecessary. sealsDead = lemDead; // Update the Ui if necessary. if (lemSafe != sealsSafe || lemOut != sealsOut || lemActive != sealsActive) { // Only update arena string if sealsSafe has changed. if (lemSafe != sealsSafe && lemSafe != SCENARIO_SEALS_NEED) { ostrstream arenaStr; arenaStr << "Save " << (SCENARIO_SEALS_NEED - lemSafe) << " More Baby Seals" << ends; locator->arena_message_enq(arenaStr.str()); } sealsSafe = lemSafe; sealsOut = lemOut; sealsActive = lemActive; levelStr << "[" << level << "] SAVE " << (int)SCENARIO_SEALS_NEED << " BABY SEALS\n" << "out: " << sealsOut << " safe: " << sealsSafe << " dead: " << lemDead << ends; lStrChanged = True; // New level if enough seals are safe or too many are dead. if (lemDead > (SCENARIO_SEALS_SEALS - SCENARIO_SEALS_NEED) || lemSafe >= SCENARIO_SEALS_NEED) { if (lemSafe < SCENARIO_SEALS_NEED) { ostrstream msg; msg << "YOU FAILED TO SAVE " << (int)SCENARIO_SEALS_NEED << " BABY SEALS. TRY THIS LEVEL AGAIN." << ends; locator->arena_message_enq(msg.str()); } else { locator->arena_message_enq(Utils::strdup("Good work. Go to the next level.")); // Success!! dontAdvance = False; } return 1; } } return -1; } Boolean Seals::award_bonus() { return True; } Boolean (* Seals::get_team())(LocatorP,PhysicalP,PhysicalP) { return seals_team; } void Seals::set_level_strings(int level,ostrstream &lStr,ostrstream &lTitleStr) { lTitleStr << "[" << level << "] SAVE THE BABY SEALS" << ends; lStr << "[" << level << "] SAVE "<< (int)SCENARIO_SEALS_NEED << " BABY SEALS\n" << "out: 0 safe: 0 dead: 0" << ends; } /* Team consists of: Seal X Seal Seal X (Human | HumanSlave) (Human | HumanSlave) X Seal Does not have: (Human | HumanSlave) X (Human | HumanSlave) */ static Boolean Seals_team_check(LocatorP locator,PhysicalP p1,PhysicalP p2) { IntelP p1Intel = p1->get_intel(); IntelP p2Intel = p2->get_intel(); if (!p1Intel || !p2Intel) { return False; } // p is a Seal if (p1Intel->is_seal_intel()) { if (p2Intel->is_seal_intel()) { return True; } if (p2Intel->is_human()) { return True; } // p2Intel is a machine else { IntelId p2MasterId = ((MachineP)p2Intel)->get_master_intel_id(); IntelP p2Master = locator->lookup(p2MasterId); if (p2Master && p2Master->is_human()) { return True; } } } return False; } Boolean Seals::seals_team(LocatorP locator, PhysicalP p1,PhysicalP p2) { if (Seals_team_check(locator,p1,p2)) { return True; } if (Seals_team_check(locator,p2,p1)) { return True; } return False; } AntiSeals::AntiSeals() { } int AntiSeals::new_level_check(int,WorldP,LocatorP locator, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &, IPhysicalManagerP) { // level not over by default. int ret = -1; int lemOut,lemSafe,lemActive,lemDead; compute_out_safe_active_dead(locator,lemOut,lemSafe,lemActive,lemDead); // Failure if (lemSafe > SCENARIO_ANTI_SEALS_MAX_SLIPPAGE) { ostrstream msg; #if 0 // Not enough space on screen, need two lines. msg << "YOU LET TOO MANY OF THE FAT BASTARDS GET AWAY\n" << "Try this level again" << ends; #else msg << "YOU LET TOO MANY OF THE FAT BASTARDS GET AWAY" << ends; #endif locator->arena_message_enq(msg.str()); // start new level ret = 1; } // Failure message takes precedence over the rest. else { if (lemSafe != sealsSafe) { assert(lemSafe > sealsSafe); // strictly increasing. locator->arena_message_enq(Utils::strdup("Careful. One just got away.")); } if (lemDead != sealsDead || lemSafe != sealsSafe) { int lemToKill = SCENARIO_SEALS_SEALS - lemDead - lemSafe; // Success!! if (lemToKill == 0) { locator->arena_message_enq(Utils::strdup("Satan approves of your Blood-Lust. Go to the next level.")); // start new level dontAdvance = False; ret = 1; } // Update UI else if (lemSafe == sealsSafe) { // o.w. the "one got away" message takes priority ostrstream arenaStr; arenaStr << "Kill " << lemToKill << " More Baby Seals" << ends; locator->arena_message_enq(arenaStr.str()); levelStr << "[" << level << "] KILL " << lemToKill << " BABY SEALS" << ends; lStrChanged = True; } } // lemDead != sealsDead } // lemSafe check sealsOut = lemOut; sealsActive = lemActive; sealsDead = lemDead; sealsSafe = lemSafe; return ret; } Boolean (*AntiSeals::get_team())(LocatorP,PhysicalP,PhysicalP) { return anti_seals_team; } void AntiSeals::set_level_strings(int level,ostrstream &lStr,ostrstream &lTitleStr) { lTitleStr << "[" << level << "] KILL THE BABY SEALS" << ends; lStr << "[" << level << "] KILL "<< (int)SCENARIO_SEALS_SEALS << " BABY SEALS" << ends; } static Boolean anti_seals_team_check(LocatorP locator,PhysicalP p) { IntelP pIntel = p->get_intel(); if (!pIntel) { return False; } // p is a Seal if (pIntel->is_seal_intel()) { return True; } // p is a machine if (!pIntel->is_human()) { IntelP master = locator->lookup(((MachineP)pIntel)->get_master_intel_id()); // Slaves of humans are not on the team. if (master && master->is_human()) { return False; } return True; } return False; } Boolean AntiSeals::anti_seals_team(LocatorP locator, PhysicalP p1,PhysicalP p2) { if (anti_seals_team_check(locator,p1) && anti_seals_team_check(locator,p2)) { return True; } return False; } KillTheFireDemon::KillTheFireDemon() { } int KillTheFireDemon::new_level_check(int enemiesPlaying,WorldP,LocatorP locator, int,Boolean &,ostrstream &,Timer &, IPhysicalManagerP) { if (enemiesPlaying == 0) { locator->arena_message_enq(Utils::strdup("Take That, You Mother-Fucking Spawn From Hell")); return 1; } return -1; } void KillTheFireDemon::setup_world(WorldP world,LocatorP,const DifficultyLevel &) { Rooms rooms(2,2); world->set_rooms_next(rooms); } void KillTheFireDemon::new_level(int level,WorldP,LocatorP, const DifficultyLevel &, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int) { manager->create_enemy(manager->enemy_physical(A_FireDemon)); lTitleStr << "[" << level << "] FIRE DEMON" << ends; lStr << "[" << level << "] Kill the Fire Demon." << ends; } Boolean KillTheFireDemon::award_bonus() { return True; } KillTheDragon::KillTheDragon(){ } int KillTheDragon::new_level_check(int enemiesPlaying,WorldP,LocatorP locator, int,Boolean &,ostrstream &,Timer &, IPhysicalManagerP) { if (enemiesPlaying == 0) { locator->arena_message_enq(Utils::strdup("The Infernal Worm has been vanquished")); return 1; } return -1; } void KillTheDragon::setup_world(WorldP world,LocatorP,const DifficultyLevel &) { Rooms rooms(2,2); world->set_rooms_next(rooms); } void KillTheDragon::new_level(int level,WorldP w,LocatorP l, const DifficultyLevel &, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int) { const PhysicalContext *cx = &Dragon::creatureContext.movingContext.physicalContext; Pos pos = w->empty_rect(cx->sizeMax); PtrList segments; Segmented::create_and_add_composite(segments,w,l,Dragon::SEGMENTS_NUM,pos,cx->create,cx->arg); for (int n = 0; n < segments.length(); n++) { PhysicalP p = (PhysicalP)segments.get(n); // Add intel, register enemy, etc. // Pass in False, since we already added the object to the Locator. manager->create_enemy(p,False); } lTitleStr << "[" << level << "] Dragon" << ends; lStr << "[" << level << "] Kill the Dragon." << ends; } Boolean KillTheDragon::award_bonus() { return True; } ZigZag::ZigZag(){ } void ZigZag::set_human_data(HumanP human,WorldP world,LocatorP) { // Set depth for zig-zag scenario, so doesn't display it immediatly. Rooms worldRooms = world->get_rooms(); human->set_data((void *)(worldRooms.downMax - 1)); } Pos ZigZag::human_initial_pos(WorldP world,LocatorP,const Size &size) { // ZIG_ZAG, start humans in lower left. // Doesn't really need to be accessible, just haven't made the // RoomIndex version of World::empty_rect(). Rooms worldRooms = world->get_rooms(); RoomIndex lowerLeft(worldRooms.downMax - 1,0); // Player starts in lower-left-most room. return world->empty_accessible_rect(size,lowerLeft); } int ZigZag::new_level_check(int,WorldP world,LocatorP locator, int,Boolean &,ostrstream &,Timer &, IPhysicalManagerP) { PhysicalP xit = locator->lookup(xitId); assert(xit); // The Xit should never be destroyed. if (((TouchableP)xit)->wasTouched()) { return 0; } // See if we need to inform human of change in depth. for (int n = 0; n < locator->humans_registered(); n++) { HumanP human = locator->get_human(n); if (human) { // previous depth int depthOld = (int)human->get_data(); Id id = human->get_id(); // Get physical for intelligence PhysicalP p = locator->lookup(id); if (p) { // Compute current depth const Area &area = p->get_area(); Loc mSquare = area.middle_wsquare(); Dim roomDim = world->get_room_dim(); int depth = mSquare.r / roomDim.rowMax; if (depth != depthOld) { // so doesn't get set next turn. human->set_data((void *)depth); // Use 1-based counting for the User. ostrstream str; str << "Depth " << (depth + 1) << ends; locator->arena_message_enq(str.str(),p); } } } } // for return -1; } void ZigZag::setup_world(WorldP world,LocatorP ,const DifficultyLevel &) { world->set_special_map_next(World::ZIG_ZAG); } void ZigZag::new_level(int level,WorldP world,LocatorP locator, const DifficultyLevel &, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP,int) { Rooms worldRooms = world->get_rooms(); RoomIndex upperRight(0,worldRooms.acrossMax - 1); // Create the Xit. Pos pos = world->empty_accessible_rect(Xit::get_size_max(),upperRight); PhysicalP p = new Xit(world,locator,pos); assert(p); locator->add(p); xitId = p->get_id(); // 1-based counting of depth for the user. lTitleStr << "[" << level << "] ZIG-ZAG: Depth " << worldRooms.downMax << ends; lStr << "[" << level << "] ZIG-ZAG.\nFind the exit." << ends; } void ZigZag::refill_enemies(Boolean,WorldP,LocatorP locator,IPhysicalManagerP manager) { int diff = SCENARIO_ZIG_ZAG_ENEMIES - locator->enemies_alive(); assert(diff >= 0); for (int n = 0; n < diff; n++) { manager->create_enemy(NULL); } } Boolean ZigZag::award_bonus() { return True; } ThePound::ThePound(){ } int ThePound::new_level_check(int enemiesPlaying,WorldP,LocatorP locator, int,Boolean &,ostrstream &,Timer &, IPhysicalManagerP) { if (enemiesPlaying == 0) { locator->arena_message_enq(Utils::strdup("Killed the Mutts")); return 1; } return -1; } void ThePound::setup_world(WorldP world,LocatorP,const DifficultyLevel &) { Rooms rooms(2,3); world->set_rooms_next(rooms); } void ThePound::new_level(int level,WorldP,LocatorP locator, const DifficultyLevel &, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int) { locator->add_team(Scenarios::dog_team,NULL); for (int n = 0; n < SCENARIO_POUND_DOGS; n++) { manager->create_enemy(manager->enemy_physical(A_Dog)); } lTitleStr << "[" << level << "] The Pound" << ends; lStr << "[" << level << "] The Pound" << ends; } JapanTown::JapanTown() {} int JapanTown::new_level_check(int enemiesPlaying,WorldP,LocatorP locator, int,Boolean &,ostrstream &,Timer &, IPhysicalManagerP) { if (enemiesPlaying == 0) { locator->arena_message_enq(Utils::strdup("Damn Ninjas. Worse than roaches.")); return 1; } return -1; } void JapanTown::setup_world(WorldP world,LocatorP,const DifficultyLevel &) { Rooms rooms(2,3); world->set_rooms_next(rooms); } void JapanTown::new_level(int level,WorldP,LocatorP locator, const DifficultyLevel &, ostrstream &lStr,ostrstream &lTitleStr, IPhysicalManagerP manager,int) { locator->add_team(JapanTown::ninja_team,NULL); for (int n = 0; n < SCENARIO_JAPAN_TOWN_NINJAS; n++) { manager->create_enemy(manager->enemy_physical(A_Ninja)); } lTitleStr << "[" << level << "] Japan-Town" << ends; lStr << "[" << level << "] Japan-Town" << ends; } void JapanTown::filter_weapons_and_other_items(LocatorP locator, int &weaponsNum, const PhysicalContext *weapons[], int &, const PhysicalContext *[]) { weapons[0] = locator->get_context(A_Stars); weapons[1] = locator->get_context(A_Lancer); weaponsNum = 2; assert(weapons[0] && weapons[1]); // Leave items alone. } static Boolean JapanTown_ninja_team_member(PhysicalP p) { IntelP intel = p->get_intel(); if (intel && intel->is_enemy() && p->get_class_id() == A_Ninja) { return True; } return False; } Boolean JapanTown::ninja_team(LocatorP,PhysicalP p1,PhysicalP p2) { return JapanTown_ninja_team_member(p1) && JapanTown_ninja_team_member(p2); } xevil-2.02r2.orig/cmn/id.cpp0100644000175000017500000000372707041422212015162 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "id.cpp" #if X11 #ifndef NO_PRAGMAS #pragma implementation "id.h" #endif #endif #include "stdafx.h" #include #include "utils.h" #include "id.h" // Lame-o HP compiler won't let this be inline. Identifier::Identifier() { invalidate(); } void Identifier::read(InStreamP in) { u_short val = in->read_short(); if (val == 0xffff) { index = INVALID; } else { index = val; } unique = in->read_int(); } int Identifier::get_write_length() { return sizeof(short) + sizeof(int); } void Identifier::write(OutStreamP out) const { u_short val; if (index == INVALID) { val = 0xffff; } else { assert(index < USHRT_MAX); // strictly less than to avoid 0xffff val = (u_short)index; } out->write_short(val); out->write_int(unique); } Boolean Identifier::operator == (const Identifier &other) const { return (index != INVALID) && (other.index == index) && (other.unique == unique); } Boolean Identifier::operator != (const Identifier &other) const { return (index == INVALID) || (other.index != index) || (other.unique != unique); } xevil-2.02r2.orig/cmn/intel.cpp0100644000175000017500000014663507636126642015731 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "intel.cpp" #if X11 #ifndef NO_PRAGMAS #pragma implementation "intel.h" #endif #endif // Include Files #include "stdafx.h" extern "C" { #include } #if X11 #include #endif #if WIN32 #include #endif #include "utils.h" #include "physical.h" #include "intel.h" #include "actual.h" #include "xetp.h" #include "xdata.h" // Defines #define FIGHT_RANGE 40 // made it smaller for Dogs 45 // [50-40] #define FIGHT_RANGE_2 (FIGHT_RANGE * FIGHT_RANGE) #define WANDER_WIDTH 1000 #define WANDER_HEIGHT 600 #define SHOT_CUTOFF 9 #define LADDER_JUMP_TIME 4 #define FTHROWER_RANGE_2 (90 * 90) #define HEALTH_ATTACK_PERCENT .1 #define TRANSMOGIFIER_PERCENT .15 // For DoppelIntel #define MASTER_MIN_DIST 100 //50 #define MASTER_MIN_DIST_2 (MASTER_MIN_DIST * MASTER_MIN_DIST) #define MASTER_MAX_DIST 400 // 600 // 350 #define MASTER_MAX_DIST_2 (MASTER_MAX_DIST * MASTER_MAX_DIST) // Strategy change times for different strategies. #define TO_AWAY_TARGET_TIME 30 #define TO_POS_TIME 100 #define TO_MASTER_TIME 100 #define DEFAULT_REFLEXES_TIME 4 // for seals, enemies, doppelgangers #define PET_REFLEXES_MULTIPLIER 0.5 // better than average. #define DROP_ITEM_CHANCE 50 #define DOPPEL_SUICIDE_TIME (60 * 25) // 60 sec #define REFLEXES_TWEAK_CHANCE 20 const IntelOptions Intel::intelOptionsDefault = { True, // classFriends False, // harmless False, // psychotic False, // ignoreItems 0, // limitedLifespan }; void IntelStatus::read(InStreamP in) { Utils::string_read(in,name,IT_STRING_LENGTH); classId = in->read_int(); Utils::string_read(in,className,IT_STRING_LENGTH); health = in->read_int(); healthmax = in->read_int(); mass = in->read_int(); weaponClassId = in->read_int(); Utils::string_read(in,weapon,IT_STRING_LENGTH); weaponReady = (Boolean)in->read_char(); ammo = in->read_int(); itemClassId = in->read_int(); Utils::string_read(in,item,IT_STRING_LENGTH); itemCount = in->read_int(); lives = in->read_int(); humanKills = in->read_int(); enemyKills = in->read_int(); soups = in->read_int(); } int IntelStatus::get_write_length() { return Utils::get_string_write_length(name) + // name sizeof(int) + // classId Utils::get_string_write_length(className) + // className sizeof(int) + // health sizeof(int) + // healthMax sizeof(int) + // mass sizeof(int) + // weaponClassId Utils::get_string_write_length(weapon) + // weapon sizeof(char) + // weaponReady sizeof(int) + // ammo sizeof(int) + // itemClassId Utils::get_string_write_length(item) + // item sizeof(int) + // itemCount sizeof(int) + // lives sizeof(int) + // humanKills sizeof(int) + // enemyKills sizeof(int); // soups } void IntelStatus::write(OutStreamP out) { Utils::string_write(out,name); out->write_int(classId); Utils::string_write(out,className); out->write_int(health); out->write_int(healthmax); out->write_int(mass); out->write_int(weaponClassId); Utils::string_write(out,weapon); out->write_char((char)weaponReady); out->write_int(ammo); out->write_int(itemClassId); Utils::string_write(out,item); out->write_int(itemCount); out->write_int(lives); out->write_int(humanKills); out->write_int(enemyKills); out->write_int(soups); } Boolean IntelStatus::operator == (const IntelStatus &is) { if (strcmp(name,is.name)) { return False; } if (classId != is.classId) { return False; } if (strcmp(className,is.className)) { return False; } if (health != is.health) { return False; } if (healthmax != is.healthmax) { return False; } if (mass != is.mass) { return False; } if (weaponClassId != is.weaponClassId) { return False; } if (strcmp(weapon,is.weapon)) { return False; } if (weaponReady != is.weaponReady) { return False; } if (ammo != is.ammo) { return False; } if (itemClassId != is.itemClassId) { return False; } if (strcmp(item,is.item)) { return False; } if (itemCount != is.itemCount) { return False; } if (lives != is.lives) { return False; } if (humanKills != is.humanKills) { return False; } if (enemyKills != is.enemyKills) { return False; } if (soups != is.soups) { return False; } return True; } Intel::Intel(WorldP w,LocatorP l,char *name, const IntelOptions *ops,ITmask opMask) { intelStatusChanged = True; living = True; world = w; locator = l; intelOptions = intelOptionsDefault; if (opMask & ITharmless) { intelOptions.harmless = ops->harmless; } if (opMask & ITclassFriends) { intelOptions.classFriends = ops->classFriends; } if (opMask & ITpsychotic) { intelOptions.psychotic = ops->psychotic; } if (opMask & ITignoreItems) { intelOptions.ignoreItems = ops->ignoreItems; } if (opMask & ITlimitedLifespan) { intelOptions.limitedLifespan = ops->limitedLifespan; } // intelStatus assert(Utils::strlen(name) < IT_STRING_LENGTH); Utils::strcpy(intelStatus.name,name); intelStatus.classId = A_None; Utils::strcpy(intelStatus.className,"none"); intelStatus.health = 0; intelStatus.mass = 0; intelStatus.weaponClassId = A_None; Utils::strcpy(intelStatus.weapon,"none"); intelStatus.weaponReady = False; intelStatus.ammo = PH_AMMO_UNLIMITED; intelStatus.itemClassId = A_None; Utils::strcpy(intelStatus.item,"none"); intelStatus.itemCount = 0; intelStatus.lives = -666; // This should never be used. intelStatus.humanKills = 0; intelStatus.enemyKills = 0; intelStatus.soups = 0; // dontCollide starts out as invalid. // Empty modifier list, mark as the head. modifiers = new Modifier(0,True); assert(modifiers); creationOk = True; } Intel::Intel(InStreamP in,WorldP w,LocatorP l) { creationOk = False; memset(&intelStatus,'\0',sizeof(intelStatus)); world = w; locator = l; intelOptions = intelOptionsDefault; // dontCollide starts out as invalid. // Empty modifier list, mark as the head. modifiers = new Modifier(0,True); assert(modifiers); update_from_stream(in); } void Intel::update_from_stream(InStreamP in) { /* intelStatus */ intelStatus.read(in); // Always true. intelStatusChanged = True; /* living */ living = (Boolean)in->read_char(); /* id */ id.read(in); /* intelId */ intelId.read(in); creationOk = in->alive(); } int Intel::get_write_length() { return intelStatus.get_write_length() + // intelStatus sizeof(char) + // living Identifier::get_write_length() + // id Identifier::get_write_length(); // intelId } void Intel::write(OutStreamP out) { intelStatus.write(out); out->write_char((char)living); id.write(out); intelId.write(out); } Intel::~Intel() { // Deletes entire list. delete modifiers; } Boolean Intel::is_human() { return False; } Boolean Intel::is_enemy() { return False; } Boolean Intel::is_seal_intel() { return False; } Boolean Intel::is_pet() { return False; } Boolean Intel::reincarnate_me() { int lives = _get_lives(); return !living && (lives == IT_INFINITE_LIVES || lives > 0); } const IntelStatus *Intel::get_intel_status() { intelStatusChanged = False; // Set intelStatus.lives to the real value, which may depend on children. intelStatus.lives = _get_lives(); return &intelStatus; } Boolean Intel::is_playing() { if (alive() || get_lives() == IT_INFINITE_LIVES || get_lives() > 0) { return True; } return False; } void Intel::set_name(char *newName) { assert(newName && (strlen(newName) < IT_STRING_LENGTH)); strcpy(intelStatus.name,newName); intelStatusChanged = True; } void Intel::add_human_kill() { intelStatus.humanKills++; intelStatusChanged = True; } void Intel::add_enemy_kill() { intelStatus.enemyKills++; intelStatusChanged = True; } void Intel::add_soup() { intelStatus.soups++; intelStatusChanged = True; } ITcommand Intel::dir_to_command(Dir dir) { assert(dir == CO_air || dir >= CO_R); ITcommand ret = IT_CENTER; if (dir != CO_air) { ret = (ITcommand)((dir - CO_R) * 0.5 + IT_R); } return ret; } ITcommand Intel::dir_to_command_weapon(Dir dir) { assert(dir == CO_air || dir >= CO_R); ITcommand ret = IT_WEAPON_CENTER; if (dir != CO_air) ret = (ITcommand)((dir - CO_R) * 0.5 + IT_WEAPON_R); return ret; } Dir Intel::command_weapon_to_dir_4(ITcommand command) { switch (command) { case IT_WEAPON_R: return CO_R; case IT_WEAPON_DN: return CO_DN; case IT_WEAPON_L: return CO_L; case IT_WEAPON_UP: return CO_UP; } return CO_air; } Dir Intel::command_weapon_to_dir_8(ITcommand command) { switch (command) { case IT_WEAPON_R: return CO_R; case IT_WEAPON_DN_R: return CO_DN_R; case IT_WEAPON_DN: return CO_DN; case IT_WEAPON_DN_L: return CO_DN_L; case IT_WEAPON_L: return CO_L; case IT_WEAPON_UP_L: return CO_UP_L; case IT_WEAPON_UP: return CO_UP; case IT_WEAPON_UP_R: return CO_UP_R; } return CO_air; } ITcommand Intel::center_pos_to_command(const Pos &pos) { if (pos.y > pos.x) { if (pos.y > -pos.x) { return IT_DN; } else { return IT_L; } } else { if (pos.y > -pos.x) { return IT_R; } else { return IT_UP; } } } Size Intel::command_to_size(ITcommand command,int mag) { Size ret; ret.set_zero(); switch (command) { // Right case IT_R: ret.width = mag; break; // Down right. case IT_DN_R: ret.width = mag; ret.height = mag; break; // Down. case IT_DN: ret.height = mag; break; // Down left. case IT_DN_L: ret.width = -mag; ret.height = mag; break; // Left. case IT_L: ret.width = -mag; break; // Up left. case IT_UP_L: ret.width = -mag; ret.height = -mag; break; // Up. case IT_UP: ret.height = -mag; break; // Up right. case IT_UP_R: ret.width = mag; ret.height = -mag; break; // Else let it be (0,0). } return ret; } void Intel::die() { intelStatus.health = -1; intelStatus.classId = A_None; strcpy(intelStatus.className,"tormented spirit"); intelStatus.mass = 0; intelStatus.weaponClassId = A_None; strcpy(intelStatus.weapon,"none"); intelStatus.weaponReady = False; intelStatus.ammo = PH_AMMO_UNLIMITED; intelStatus.itemClassId = A_None; strcpy(intelStatus.item,"none"); intelStatusChanged = True; // Want to keep id valid so can lookup to deliver messages // after Player is killed. // id.invalidate(); living = False; // Don't keep drug high or doubleSpeed, etc. when you die. modifiers->clear(); } void Intel::reincarnate() { int lives = _get_lives(); if (lives != IT_INFINITE_LIVES) { // If multiple players loose last life at the same time, they all get // to come back from the dead. To fix this right, reincarnate_me() or // something like it would have to grab a lock on the life. // Locator starts reincarnating both of them. if (lives > 0) { _set_lives(lives - 1); } intelStatusChanged = True; } living = True; } void Intel::clock(PhysicalP p) { id = p->get_id(); //// Update intelStatus // classId, class ClassId classId = p->get_class_id(); if (classId != intelStatus.classId) { intelStatus.classId = classId; strcpy(intelStatus.className,p->get_class_name()); intelStatusChanged = True; } // health Health health = p->get_health(); if ((health >= 0) && (health != intelStatus.health)) { intelStatus.health = health; intelStatusChanged = True; } // healthMax health=p->get_health_max(); if (health!=intelStatus.healthmax) { intelStatus.healthmax = health; intelStatusChanged = True; } // mass Mass mass = p->get_mass(); if (mass != intelStatus.mass) { intelStatus.mass = mass; intelStatusChanged = True; } // weaponClassId, weapon const char *weapon; ClassId wClassId = p->get_weapon_string(weapon); if (wClassId != intelStatus.weaponClassId) { intelStatus.weaponClassId = wClassId; strcpy(intelStatus.weapon,(char *)weapon); intelStatusChanged = True; } HolderP holder = NULL; CreatureP cre = NULL; if (p->is_creature()) { cre = ((CreatureP)p); holder = cre->get_holder(); } if (holder) { assert(cre); PhysicalP weapon = holder->get_weapon_current(); Boolean weaponReady = False; BuiltInP builtIn; // weaponReady if (weapon) { weaponReady = ((WeaponP)weapon)->ready(); } // WARNING: code duplication below. else if (cre->get_ability(AB_Fighter)) { weaponReady = True; } // this code assumes that no Creature has both the Fighter and // BuiltIn capabilities else if (builtIn = (BuiltInP)cre->get_ability(AB_BuiltIn)){ if (builtIn->ready()) { weaponReady = True; } } if (intelStatus.weaponReady != weaponReady) { intelStatus.weaponReady = weaponReady; intelStatusChanged = True; } // ammo int ammo = weapon ? ((WeaponP)weapon)->get_ammo() : PH_AMMO_UNLIMITED; if (intelStatus.ammo != ammo) { intelStatus.ammo = ammo; intelStatusChanged = True; } // itemClassId, item PhysicalP item = holder->get_item_current(); ClassId itemClassId = item ? item->get_class_id() : A_None; if (intelStatus.itemClassId != itemClassId) { intelStatus.itemClassId = itemClassId; strcpy(intelStatus.item,item ? item->get_class_name() : "none"); intelStatusChanged = True; } // itemCount int itemCount = holder->get_item_count(); if (intelStatus.itemCount != itemCount) { intelStatus.itemCount = itemCount; intelStatusChanged = True; } } // Not Holder, some code duplication. else { // weaponReady Boolean weaponReady = False; BuiltInP builtIn; if (cre && cre->get_ability(AB_Fighter)) { weaponReady = True; } // this code assumes that no Creature has both the Fighter and // BuiltIn capabilities else if (cre && (builtIn = (BuiltInP)cre->get_ability(AB_BuiltIn))){ if (builtIn->ready()) { weaponReady = True; } } if (intelStatus.weaponReady != weaponReady) { intelStatus.weaponReady = weaponReady; intelStatusChanged = True; } // ammo if (intelStatus.ammo != PH_AMMO_UNLIMITED) { intelStatus.ammo = PH_AMMO_UNLIMITED; intelStatusChanged = True; } // itemClassId, item // assumes that no Creature has both Holder and Suicide // // Maybe we should have a get_item_string() like get_weapon_string()? if (cre && cre->get_ability(AB_Suicide)) { if (intelStatus.itemClassId != A_SuicideButton) { intelStatus.itemClassId = A_SuicideButton; strcpy(intelStatus.item,"suicide button"); intelStatusChanged = True; } } else if (intelStatus.itemClassId != A_None) { intelStatus.itemClassId = A_None; strcpy(intelStatus.item,"none"); intelStatusChanged = True; } // itemCount intelStatus.itemCount = 0; } // Kills does not depend on the physical. } int Intel::_get_lives() { return 1; } void Intel::_set_lives(int) {} Human::Human(WorldP w,LocatorP l,char *name,int lves, int *sharedLves,ColorNum cNum) : Intel(w,l,name,NULL,ITnone) { lives = lves; sharedLives = sharedLves; // One life is used for current life. int lv = Human::_get_lives(); if (lv > 0) { // Avoid funny bug when new client connects to COOPERATIVE game with zero // lives remaining. It used to set lives to -1 which is infinite lives. Human::_set_lives(lv - 1); } command = IT_NO_COMMAND; noRepeat = IT_NO_COMMAND; assert(cNum < Xvars::HUMAN_COLORS_NUM); colorNum = cNum; data = NULL; } Human::Human(InStreamP in,WorldP w,LocatorP l) : Intel(in,w,l) { command = IT_NO_COMMAND; noRepeat = IT_NO_COMMAND; data = NULL; // Just reflect the value of lives. sharedLives = NULL; _update_from_stream(in); } void Human::update_from_stream(InStreamP in) { Intel::update_from_stream(in); _update_from_stream(in); } void Human::_update_from_stream(InStreamP in) { colorNum = in->read_short(); u_short lvs = in->read_short(); if (lvs == 0xffff) { lives = IT_INFINITE_LIVES; } else { lives = lvs; } } int Human::get_write_length() { return Intel::get_write_length() + sizeof(short) + // colorNum sizeof(short); // lives } void Human::write(OutStreamP out) { Intel::write(out); assert(colorNum <= USHRT_MAX); out->write_short((u_short)colorNum); int lvs; if (sharedLives) { lvs = *sharedLives; } else { lvs =lives; } if (lvs == IT_INFINITE_LIVES) { out->write_short(0xffff); } else { // strictly less than, because 0xffff means IT_INFINITE_LIVES assert(lvs < USHRT_MAX); out->write_short((u_short)lvs); } } Boolean Human::is_human() { return True; } void Human::set_command(ITcommand c) { command = c; #if 0 if (netOut) { XETP::send_command(netOut,get_intel_id(),command); // Want to send this immediately. if (netOut->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)netOut)->flush(); } } #endif } void Human::clock(PhysicalP p) { // A little sanity check. int *livesPtr = sharedLives; if (!livesPtr) { livesPtr = &lives; } assert(*livesPtr == IT_INFINITE_LIVES || *livesPtr >= 0); assert(alive()); // Disable old noRepeat if we didn't get the same command again. if (noRepeat != IT_NO_COMMAND && command != noRepeat) { noRepeat = IT_NO_COMMAND; } // Here is where noRepeat actually blocks the command from being executed. if (noRepeat == command) { command = IT_NO_COMMAND; } // Set the command this turn, but disallow it until some other command // comes in. // Set the new noRepeat. if (command != IT_NO_COMMAND && !p->command_repeatable(command)) { noRepeat = command; } // We always call set_command, we need to set it even for IT_NO_COMMAND. p->set_command(command); command = IT_NO_COMMAND; Intel::clock(p); } int Human::_get_lives() { if (sharedLives) { return *sharedLives; } return lives; } void Human::_set_lives(int val) { if (_get_lives() != IT_INFINITE_LIVES) { if (sharedLives) { // Set shared value. *sharedLives = val; // Mark all Humans dirty just to be sure. LocatorP l = get_locator(); for (int n = 0; n < l->humans_registered(); n++) { HumanP human = l->get_human(n); human->make_intel_status_dirty(); } } else { lives = val; } } } Machine::Machine(WorldP w,LocatorP l,char *name,const IntelOptions *ops, ITmask opMask) : Intel(w,l,name,ops,opMask) { // strategyChange uses default initializer. Timer oTimer(LADDER_JUMP_TIME); ladderJump = oTimer; strategy = doNothing; } IntelId Machine::get_master_intel_id() { IntelId invalid; return invalid; } void Machine::clock(PhysicalP p) { assert(alive() && p->is_creature()); const IntelOptions &ops = get_intel_options(); LocatorP locator = get_locator(); Boolean commandSet = False; if (reflexes.ready()) { // Composite objects don't do their own movement unless they are the // leader. CompositeP composite = p->get_composite(); if (!composite || composite->is_leader()) { use_items(commandSet,p); // May just leave strategy alone. choose_strategy(p); // Act on current strategy. switch (strategy) { case doNothing: if (!commandSet) { p->set_command(IT_NO_COMMAND); commandSet = True; } break; case toPos: if (!commandSet) { commandSet = move_pos(p,targetPos,ladderJump); if (!commandSet) { // We got there, do something else. strategyChange.set(0); } } break; case toTarget: { PhysicalP target = locator->lookup(targetId); if (!commandSet && target) { commandSet = move_target(p,target,ladderJump); } } break; case awayTarget: { PhysicalP target = locator->lookup(targetId); if (!commandSet && target) { commandSet = away_target(p,target,ladderJump); } } break; case attackTarget: { PhysicalP target = locator->lookup(targetId); // Check is_creature so won't attack items. if (!commandSet && !ops.harmless && target && target->is_creature()) { commandSet = attack_target(p,target); } if (!commandSet && target) { commandSet = move_target(p,target,ladderJump); } } break; case retreatTarget: { PhysicalP target = locator->lookup(targetId); // Check is_creature so won't attack items. if (!commandSet && !ops.harmless && target && target->is_creature()) { commandSet = attack_target(p,target); } if (!commandSet && target) { commandSet = away_target(p,target,ladderJump); } } break; case toDir: if (!commandSet) { commandSet = move_dir(p,targetDir,ladderJump); } break; } } // composite check int rflexes = _get_reflexes_time(); // Fix the dog stuck on corner bug. Tweak the value for reflexes // every once in a while so we don't end up with a case where // the Machine intel is active with the same frequency as a // looping physics phenomena. In this case, Dog pets had a reflexes // time of 2 and the bouncing on the corner happened every other turn, // so the dog intel was only active when it was in the air. if (Utils::choose(REFLEXES_TWEAK_CHANCE) == 0) { rflexes++; } reflexes.set(rflexes); } reflexes.clock(); strategyChange.clock(); ladderJump.clock(); Intel::clock(p); } int Machine::_get_reflexes_time() { return DEFAULT_REFLEXES_TIME; } // By default, try to kill others and get items. void Machine::choose_strategy(PhysicalP p) { LocatorP locator = get_locator(); const IntelOptions &ops = get_intel_options(); // New strategy. // Make sure target is non-NULL for strategies that require it. if (strategyChange.ready()) { Boolean isEnemy; PhysicalP target = choose_target(isEnemy,p,IT_VISION_RANGE); HolderP holder = p->get_holder(); if (target) { targetId = target->get_id(); if (isEnemy) { if ((ops.psychotic || (((holder && (has_gun(holder) || has_cutter(holder))) || p->get_ability(AB_Fighter) || p->get_ability(AB_BuiltIn) || p->get_ability(AB_Prickly)) && (p->get_health() > HEALTH_ATTACK_PERCENT * p->get_health_max()))) && !ops.harmless) { strategy = attackTarget; } else { strategy = retreatTarget; } } else { strategy = toTarget; } strategyChange.set(TO_AWAY_TARGET_TIME); } else { strategy = doNothing; } } // strategyChange not ready. else { // Make sure that target still exists. if (strategy_uses_target_id()) { if (!locator->lookup(targetId)) { strategy = doNothing; } } } // If no target, change strategy to toPos. if (strategy == doNothing) { const Area &area = p->get_area(); Pos middle = area.get_middle(); // Choose range that is inside the world. Pos minPos(middle.x - WANDER_WIDTH / 2, middle.y - WANDER_WIDTH / 2); Pos maxPos(middle.x + WANDER_WIDTH / 2, middle.y + WANDER_WIDTH / 2); WorldP w = get_world(); Size worldSize = w->get_size(); minPos.x = Utils::maximum(0,minPos.x); minPos.y = Utils::maximum(0,minPos.y); maxPos.x = Utils::minimum(worldSize.width,maxPos.x); maxPos.y = Utils::minimum(worldSize.height,maxPos.y); // Make sure we have some area to choose in. if (minPos.x < maxPos.x && minPos.y < maxPos.y) { targetPos.x = minPos.x + Utils::choose(maxPos.x - minPos.x); targetPos.y = minPos.y + Utils::choose(maxPos.y - minPos.y); strategy = toPos; strategyChange.set(TO_POS_TIME); } } } Boolean Machine::filter_target(PhysicalP) { return True; } Boolean Machine::attack_target(PhysicalP p,PhysicalP target) { // Fire a gun if available. HolderP holder = (HolderP)p->get_holder(); // has_gun() only checks weapons, not items, so it works for Carrier. Boolean useGun = holder && has_gun(holder); if (useGun) { if (weapon_current_is_gun(holder)) { PhysicalP weapon = holder->get_weapon_current(); assert(weapon->is_weapon()); if (((WeaponP)weapon)->ready()) { const Area &area = p->get_area(); Pos pos = area.get_middle(); const Area &targetArea = target->get_area(); Pos targetPos = targetArea.get_middle(); Size rel = targetPos - pos; Boolean distOk = True; if (weapon->get_class_id() == A_FThrower) { distOk = rel.abs_2() < FTHROWER_RANGE_2; } if (distOk) { Dir weaponDir = rel.get_dir(); const Vel *unitVels = p->get_unit_vels(); float z = rel.cross(unitVels[weaponDir]); if (fabs(z) <= SHOT_CUTOFF) { p->set_command(dir_to_command_weapon(weaponDir)); return True; } } } } else { /* if (weapon_current_is_gun(p)) */ p->set_command(IT_WEAPON_CHANGE); return True; } } /* if (useGun) */ // Use cutter if available. // has_cutter() only checks weapons, not items, so it works for Carrier. Boolean useCutter = !useGun && holder && has_cutter(holder); if (useCutter) { if (!weapon_current_is_cutter(holder)) { p->set_command(IT_WEAPON_CHANGE); return True; } // else move toward target. } // Use built in weapon if available. BuiltInP builtIn = (BuiltInP)p->get_ability(AB_BuiltIn); Boolean useBuiltIn = !useGun && !useCutter && builtIn; if (useBuiltIn) { // Must set current weapon to none. if (holder && holder->get_weapon_current()) { p->set_command(IT_WEAPON_CHANGE); return True; } // See if we can fire the built-in weapon. else { if (builtIn->ready()) { const Area &area = p->get_area(); Pos pos = area.get_middle(); const Area &targetArea = target->get_area(); Pos targetPos = targetArea.get_middle(); Size rel = targetPos - pos; Dir weaponDir = rel.get_dir(); const Vel *unitVels = p->get_unit_vels(); float z = rel.cross(unitVels[weaponDir]); if (fabs(z) <= SHOT_CUTOFF) { p->set_command(dir_to_command_weapon(weaponDir)); return True; } } } } // We don't really know how to drop weights on people, so just get // rid of the Liftable. Boolean dropLiftable = !useGun && !useCutter && !useBuiltIn && p->get_ability(AB_Lifter) && weapon_current_is_drop_liftable(p); if (dropLiftable) { p->set_command(IT_WEAPON_DROP); return True; } // Close range fighting if (!useGun && !useCutter && !useBuiltIn && !dropLiftable && p->get_ability(AB_Fighter)) { // Change current weapon to none. if (holder && holder->get_weapon_current()) { p->set_command(IT_WEAPON_CHANGE); return True; } else { const Area &area = p->get_area(); const Area &targetArea = target->get_area(); const Pos middle = area.get_middle(); const Pos targetMiddle = targetArea.get_middle(); if (middle.distance_2(targetMiddle) <= FIGHT_RANGE_2) { // Dir dirTo = area.dir_to(targetArea); Size rel = targetMiddle - middle; Dir dirTo = rel.get_dir(); p->set_command(dir_to_command_weapon(dirTo)); return True; } // Else run to target. } } // return False; } Boolean Machine::move_target(PhysicalP physical,PhysicalP target, Timer &ladderJump) { const Area &area = physical->get_area(); Dir toTarget = area.dir_to(target->get_area()); return move_dir(physical,toTarget,ladderJump); } Boolean Machine::away_target(PhysicalP physical,PhysicalP target, Timer &ladderJump) { const Area &area = physical->get_area(); Dir awayTarget = Coord::dir_opposite(area.dir_to(target->get_area())); return move_dir(physical,awayTarget,ladderJump); } Boolean Machine::move_pos(PhysicalP physical,const Pos &targetPos, Timer &ladderJump) { const Area &area = physical->get_area(); Dir toPos = area.dir_to(targetPos); if (toPos == CO_air) { // We've arrived. return False; } return move_dir(physical,toPos,ladderJump); } Boolean Machine::move_dir(PhysicalP physical,Dir dir, Timer &ladderJump) { assert(physical->is_creature()); CreatureP creature = (CreatureP) physical; ITcommand command = IT_NO_COMMAND; if (creature->get_ability(AB_Flying)) { command = dir_to_command(dir); } // Sticky, Walking, Grounded, Hopping else { Stance stance = creature->get_stance(); Touching touching = creature->get_touching_area(); const Hanging &hanging = creature->get_hanging(); // Grounded creatures should not try to climb ladders. Boolean canClimb = creature->can_climb() && !creature->get_ability(AB_Grounded); switch (dir) { case CO_R: switch (stance) { case CO_center: case CO_dn: case CO_l: case CO_up: if ((touching != CO_R) || creature->get_ability(AB_Sticky)) command = IT_R; break; case CO_climb: if ((touching != CO_R) || creature->get_ability(AB_Sticky)) { command = IT_UP_R; ladderJump.set(); } break; }; break; case CO_DN_R: if (canClimb && touching != CO_dn && ladderJump.ready()) { command = IT_DN; break; } switch (stance) { case CO_center: case CO_dn: case CO_up: command = IT_R; break; case CO_r: command = IT_DN; break; case CO_l: command = IT_DN_R; break; case CO_climb: if (touching != CO_dn) command = IT_DN; else { command = IT_R; ladderJump.set(); } break; } break; case CO_DN: switch (stance) { case CO_r: case CO_up: case CO_l: case CO_climb: if ((touching != CO_dn) || canClimb || (hanging.corner == CO_dn_R) || (hanging.corner == CO_dn_L)) command = IT_DN; break; case CO_center: if (canClimb) command = IT_DN; break; } break; case CO_DN_L: if (canClimb && touching != CO_dn && ladderJump.ready()) { command = IT_DN; break; } switch (stance) { case CO_center: case CO_dn: case CO_up: command = IT_L; break; case CO_l: command = IT_DN; break; case CO_r: command = IT_DN_L; break; case CO_climb: if (touching != CO_dn && ladderJump.ready()) command = IT_DN; else { command = IT_L; ladderJump.set(); } break; } break; case CO_L: switch (stance) { case CO_center: case CO_dn: case CO_r: case CO_up: if ((touching != CO_L) || (creature->get_ability(AB_Sticky))) command = IT_L; break; case CO_climb: if ((touching != CO_L) || (creature->get_ability(AB_Sticky))) { command = IT_UP_L; ladderJump.set(); } break; } break; case CO_UP_L: if (canClimb && touching != CO_up && ladderJump.ready()) { command = IT_UP; break; } switch (stance) { case CO_center: case CO_dn: case CO_up: command = IT_L; break; case CO_r: command = IT_UP; break; case CO_l: command = IT_UP_L; break; case CO_climb: if (touching != CO_up) command = IT_UP; else { command = IT_L; ladderJump.set(); } break; }; break; case CO_UP: switch (stance) { case CO_center: case CO_air: case CO_dn: case CO_r: case CO_l: case CO_climb: if ((touching != CO_up) || canClimb || (hanging.corner == CO_up_R) || (hanging.corner == CO_up_L)) command = IT_UP; break; } break; case CO_UP_R: if (canClimb && touching != CO_up && ladderJump.ready()) { command = IT_UP; break; } switch (stance) { case CO_center: case CO_dn: case CO_up: command = IT_R; break; case CO_r: case CO_l: command = IT_UP_R; break; case CO_climb: if (touching != CO_up) command = IT_UP; else { command = IT_R; ladderJump.set(); } break; } break; } if ((command == IT_NO_COMMAND) && !canClimb) command = IT_CENTER; } if (command != IT_NO_COMMAND) { physical->set_command(command); return True; } return False; } Boolean Machine::has_gun(HolderP p) { for (int n = 0; n < p->get_weapons_num(); n++) { PhysicalP gun = p->get_weapon(n); if (gun && gun->is_gun()) { return True; } } return False; } Boolean Machine::has_cutter(HolderP p) { for (int n = 0; n < p->get_weapons_num(); n++) { PhysicalP w = p->get_weapon(n); if (w && w->is_cutter()) { return True; } } return False; } Boolean Machine::has_shield(HolderP p) { for (int n = 0; n < p->get_items_num(); n++) { PhysicalP w = p->get_item(n); if (w && w->is_shield()) { return True; } } return False; } Boolean Machine::has_drugs(HolderP p) { for (int n = 0; n < p->get_items_num(); n++) { PhysicalP w = p->get_item(n); if (w && w->is_drugs()) { return True; } } return False; } Boolean Machine::has_item(HolderP p,ClassId classId) { for (int n = 0; n < p->get_items_num(); n++) { PhysicalP item = p->get_item(n); if (item && item->get_class_id() == classId) { return True; } } return False; } Boolean Machine::weapon_current_is_gun(HolderP p) { PhysicalP weapon = p->get_weapon_current(); return weapon && weapon->is_gun(); } Boolean Machine::weapon_current_is_cutter(HolderP p) { PhysicalP weapon = p->get_weapon_current(); return weapon && weapon->is_cutter(); } Boolean Machine::weapon_current_is_drop_liftable(PhysicalP p) { // This is a HACK, we should really make Lifter override // get_weapon_current(), etc. const char *dummy; ClassId classId = p->get_weapon_string(dummy); if (classId == A_DropLiftable) { return True; } return False; } PhysicalP Machine::choose_target(Boolean &isEnemy,PhysicalP p, int range) { LocatorP locator = get_locator(); PhysicalP nearby[OL_NEARBY_MAX]; int nearbyNum; locator->get_nearby(nearby,nearbyNum,p,range); PhysicalP items[OL_NEARBY_MAX]; int itemsNum = 0; PhysicalP enemies[OL_NEARBY_MAX]; int enemiesNum = 0; // Pull out possible items and enemies from nearby. const IntelOptions &ops = get_intel_options(); ClassId classId = p->get_class_id(); for (int n = 0; n < nearbyNum; n++) { IntelP intel = nearby[n]->get_intel(); IntelP master = NULL; if (intel && !intel->is_human()) { master = locator->lookup(((MachineP)intel)->get_master_intel_id()); } // Possible enemies if ( // Must be a creature nearby[n]->is_creature() && // Must be alive nearby[n]->alive() && // Must have intelligence intel && // Machines ignoring machines of same class. (intel->is_human() || (master && master->is_human()) || // classFriends doesn't apply to slaves of humans !(ops.classFriends && nearby[n]->get_class_id() == classId)) && // Don't go after members of same team. !locator->same_team(p,nearby[n]) && // Ignore invisible targets (Can cast to MovingP because is_creature()) !((MovingP)nearby[n])->is_invisible() && // Give children a chance to filter out targets filter_target(nearby[n]) ) { enemies[enemiesNum] = nearby[n]; enemiesNum++; } // possible items else if ( // Not ignoring items !ops.ignoreItems && // Must be user or carrier to pick up items //// For now, Carriers don't actively go after items, not worth it //// to pick up one thing. (p->get_ability(AB_User)) && // Must be item and can take it. nearby[n]->is_item() && ((ItemP)nearby[n])->can_take(p) && // Ignore invisible targets (Can cast to MovingP because is_item().) !((MovingP)nearby[n])->is_invisible() && // Give children a chance to filter out targets filter_target(nearby[n]) ) { items[itemsNum] = nearby[n]; itemsNum++; } } // for if (enemiesNum) { PhysicalP target = enemies[Utils::choose(enemiesNum)]; isEnemy = True; return target; } if (itemsNum) { PhysicalP target = items[Utils::choose(itemsNum)]; isEnemy = False; return target; } return NULL; } void Machine::use_items(Boolean &commandSet,PhysicalP p) { LocatorP locator = get_locator(); HolderP holder = p->get_holder(); if (!holder) { return; } // Use MedKit. if (!commandSet && (p->get_health() < p->get_health_max()) && (has_item(holder,A_MedKit))) { PhysicalP item = holder->get_item_current(); if (item && (item->get_class_id() == A_MedKit)) { assert(item->is_auto_use()); p->set_command(IT_ITEM_USE); } else { p->set_command(IT_ITEM_CHANGE); } commandSet = True; } // Use Transmogifier. if (!commandSet && (p->get_health() < TRANSMOGIFIER_PERCENT * p->get_health_max()) && (has_item(holder,A_Transmogifier))) { PhysicalP item = holder->get_item_current(); if (item && (item->get_class_id() == A_Transmogifier)) { assert(item->is_auto_use()); p->set_command(IT_ITEM_USE); } else { p->set_command(IT_ITEM_CHANGE); } commandSet = True; } // Use Shield. if (!commandSet && p->is_moving() && has_shield(holder)) { PhysicalP protectionP = locator->lookup(((MovingP)p)->get_protection()); if (!protectionP) { PhysicalP item = holder->get_item_current(); if (item && item->is_shield()) { assert(item->is_auto_use()); p->set_command(IT_ITEM_USE); } else { p->set_command(IT_ITEM_CHANGE); } commandSet = True; } // else, don't wipe out the current protection. } #if 0 //haven't tested it with the Holder logic // Careful with Aliens. // Use Doppel. if (!commandSet && p->get_holder()) && p->is_moving() && has_item(p,A_Doppel)) { PhysicalP item = p->get_item_current(); if (item && item->get_class_id() == A_Doppel) { p->set_command(IT_ITEM_USE); } else { p->set_command(IT_ITEM_CHANGE); } commandSet = TRUE; } #endif // Use Cloak. if (!commandSet && p->get_ability(AB_User) && // Carrier can't use cloak. (has_item(holder,A_Cloak))) { PhysicalP item = holder->get_item_current(); if (item && (item->get_class_id() == A_Cloak)) { p->set_command(IT_ITEM_USE); } else { p->set_command(IT_ITEM_CHANGE); } commandSet = True; } // Use Drugs. if (!commandSet && (has_drugs(holder))) { PhysicalP item = holder->get_item_current(); if (item && item->is_drugs()) { assert(item->is_auto_use()); p->set_command(IT_ITEM_USE); } else { p->set_command(IT_ITEM_CHANGE); } commandSet = True; } // Randomly drop items after holding them for a while. if (!commandSet && holder->get_items_num() > 0 && // If User/Carrier has > 0 items, one should always be current, but // this is not ALWAYS true. See comments in class Holder. holder->get_item_current() && (Utils::choose(DROP_ITEM_CHANCE) == 0)) { p->set_command(IT_ITEM_DROP); commandSet = True; } } Enemy::Enemy(WorldP w,LocatorP l,char *name, const IntelOptions *ops,ITmask opMask) :Machine(w,l,name,ops,opMask) {} Boolean Enemy::is_enemy() { return True; } int Enemy::_get_reflexes_time() { // Return static member. return reflexesTime; } int Enemy::reflexesTime = DEFAULT_REFLEXES_TIME; Neutral::Neutral(WorldP w,LocatorP l,char *name, const IntelOptions *ops,ITmask opMask) :Machine(w,l,name,ops,opMask) {} Boolean Neutral::is_enemy() { return False; } SealIntel::SealIntel(WorldP w,LocatorP l,char *name,const Id &home_id) :Neutral(w,l,name,NULL,ITnone) { // Timer oTimer(LADDER_JUMP_TIME); // ladderJump = oTimer; homeId = home_id; } Boolean SealIntel::is_seal_intel() { return True; } void SealIntel::choose_strategy(PhysicalP p) { // Doesn't use Neutral::choose_strategy(). // Doesn't care about strategyChange timer. assert(alive() && p->is_creature()); LocatorP l = get_locator(); PhysicalP home = l->lookup(homeId); if (!home) { cerr << "Error in LIntel, home not found." << endl; return; } // assert(home); const Area &area = home->get_area(); Pos middle = area.get_middle(); set_toPos(middle); } DoppelIntel::DoppelIntel(WorldP w,LocatorP l,char *name, const IntelOptions *ops,ITmask opMask,IntelP master) :Neutral(w,l,name,ops,opMask) { assert(master); masterIntelId = master->get_intel_id(); // Set timer to kill self if specified // Careful to use get_intel_options(), not the passed in parameter. const IntelOptions& options = get_intel_options(); if (options.limitedLifespan > 0) { suicideTimer.set(options.limitedLifespan); } } IntelId DoppelIntel::get_master_intel_id() { return masterIntelId; } void DoppelIntel::add_human_kill() { LocatorP l = get_locator(); IntelP intel = l->lookup(masterIntelId); if (intel) { intel->add_human_kill(); return; } Neutral::add_human_kill(); } void DoppelIntel::add_enemy_kill() { LocatorP l = get_locator(); IntelP intel = l->lookup(masterIntelId); if (intel) { intel->add_enemy_kill(); return; } Neutral::add_enemy_kill(); } void DoppelIntel::add_soup() { assert(0); } void DoppelIntel::clock(PhysicalP p) { const IntelOptions& ops = get_intel_options(); // Kill self if we have a limited lifespan. if (ops.limitedLifespan > 0) { if (suicideTimer.ready()) { p->set_quiet_death(); p->kill_self(); } suicideTimer.clock(); } Neutral::clock(p); } void DoppelIntel::choose_strategy(PhysicalP p) { // We want to be able to override whatever Neutral chooses. Neutral::choose_strategy(p); Timer &strategyChange = get_strategy_change(); Strategy strategy = get_strategy(); LocatorP locator = get_locator(); // Make sure master is not to close or too far away. PhysicalP masterP = NULL; int master_dist_2; // meaningful iff masterP. IntelP master = locator->lookup(masterIntelId); if (master) { masterP = lookup_and_compute_dist_2(master_dist_2,p,master->get_id()); } // Wandering too far from the master. if (masterP && master_dist_2 > MASTER_MAX_DIST_2) { strategyChange.set(TO_MASTER_TIME); set_toTarget(masterP->get_id()); } // We're close enough to the master, do something else. if (masterP && strategy == toTarget && masterP->get_id() == get_target_id() && master_dist_2 < MASTER_MIN_DIST_2) { // Change strategy next turn. strategyChange.set(1); } } // This is unnecessary with the new TEAM logic. Boolean DoppelIntel::filter_target(PhysicalP p) { LocatorP locator = get_locator(); IntelP intel = p->get_intel(); PhysicalP masterP = NULL; IntelP master = locator->lookup(masterIntelId); if (master) { Id masterId = master->get_id(); masterP = locator->lookup(masterId); } // Not your master. if (p == masterP) { return False; } // Don't want to have slaves of same master fighting each other. if (intel && !intel->is_human() && ((MachineP)intel)->get_master_intel_id() == masterIntelId) { return False; } return Neutral::filter_target(p); } PhysicalP DoppelIntel::lookup_and_compute_dist_2(int &dist_2, PhysicalP p,const Id &id) { LocatorP locator = get_locator(); PhysicalP ret = locator->lookup(id); if (ret && p) { const Area &retArea = ret->get_area(); const Area &area = p->get_area(); Pos retMiddle = retArea.get_middle(); Pos middle = area.get_middle(); Size diff = retMiddle - middle; dist_2 = diff.abs_2(); } else { ret = NULL; } return ret; } IntelOptions DoppelIntel::suggestedOptions = { False, /* classFriends */ False, /* NOT SPECIFIED */ True, /* psychotic */ True, /* ignoreItems */ DOPPEL_SUICIDE_TIME, /* limitedLifespan */ }; ITmask DoppelIntel::suggestedMask = ITclassFriends | ITpsychotic | ITignoreItems | ITlimitedLifespan; Pet::Pet(WorldP w,LocatorP l,char *name, const IntelOptions *ops,ITmask opMask,IntelP master) :DoppelIntel(w,l,name,ops,opMask,master) { mode = Heel; } Boolean Pet::is_pet() { return True; } // Debugging crap. //#define PRINT_MODES #ifdef PRINT_MODES void mode_helper(int prev,int curr) { char buffer[80]; ostrstream str(buffer,80); str << "mode changing from:" << Pet::mode_string(prev) << " to: " << Pet::mode_string(curr) << endl << ends; #if WIN32 TRACE(buffer); #endif } #endif void Pet::go_get_em(PhysicalP shooter,ITcommand command) { #ifdef PRINT_MODES int prevMode = mode; #endif assert(shooter); LocatorP locator = get_locator(); IntelP shooterIntel = shooter->get_intel(); assert(shooterIntel); // Master has changed. if (shooterIntel->get_intel_id() != get_master_intel_id()) { // The physical controlled by the pet won't collide with the whoever the // shooterIntel is controlling. set_dont_collide(shooterIntel->get_intel_id()); set_master_intel_id(shooterIntel->get_intel_id()); // Pet::choose_strategy() will take care of returning to master. } //// Transitions in finite state machine. // Heel -> Seek if (mode == Heel) { Dir dir = command_weapon_to_dir_8(command); if (dir != CO_air) { set_toDir(dir); mode = Seek; #ifdef PRINT_MODES mode_helper(prevMode,mode); #endif return; } } // Seek -> Returning // Attacking -> Returning if (mode == Seek || mode == Attacking) // && command == IT_WEAPON_CENTER) { IntelP master = locator->lookup(get_master_intel_id()); if (master) set_toTarget(master->get_id()); mode = Returning; #ifdef PRINT_MODES mode_helper(prevMode,mode); #endif return; } } int Pet::_get_reflexes_time() { return (int)(DoppelIntel::_get_reflexes_time() * PET_REFLEXES_MULTIPLIER); } void Pet::choose_strategy(PhysicalP p) { #ifdef PRINT_MODES int prevMode = mode; #endif assert(p); // Look up master LocatorP locator = get_locator(); IntelP master = locator->lookup(get_master_intel_id()); //if (!(master && master->alive())) { // If master is dead, act like a Neutral. // Neutral::choose_strategy(p); // return; //} int master_dist_2; PhysicalP masterP = master ? lookup_and_compute_dist_2(master_dist_2,p,master->get_id()) : (PhysicalP)NULL; if (!masterP) { // Act like a Neutral, except won't attack master or go after items // (because of filter_target). Neutral::choose_strategy(p); return; } //// masterP is now guaranteed to be valid. Timer &strategyChange = get_strategy_change(); // Use strategy change timer to make the Pet come back when he's // been away too long. if (master_dist_2 < HEEL_RADIUS_2) { // Keeps getting set every time pet is near enough to master. strategyChange.set(RETURN_TIME); // Drop anything Carrier is holding to give to the master. if (p->get_ability(AB_Carrier)) { p->drop_all(); } } //// Transitions in finite state machine. // Heel -> Returning if (mode == Heel && master_dist_2 > HEEL_RADIUS_2) { mode = Returning; set_toTarget(masterP->get_id()); #ifdef PRINT_MODES mode_helper(prevMode,mode); #endif return; } // Returning -> Heel if (mode == Returning && master_dist_2 < HEEL_RADIUS_2) { mode = Heel; set_toTarget(masterP->get_id()); #ifdef PRINT_MODES mode_helper(prevMode,mode); #endif return; } // Seek -> Returning // Attacking -> Returning if ((mode == Seek || mode == Attacking) && strategyChange.ready()) { mode = Returning; set_toTarget(masterP->get_id()); #ifdef PRINT_MODES mode_helper(prevMode,mode); #endif return; } // Seek -> Attacking // Heel -> Attacking // (added) Returning -> Attacking if (mode == Seek || mode == Heel || mode == Returning) { Boolean isEnemy; PhysicalP target = choose_target(isEnemy,p,ATTACK_RADIUS); if (target && isEnemy) { set_attackTarget(target->get_id()); mode = Attacking; #ifdef PRINT_MODES mode_helper(prevMode,mode); #endif return; } } // Attacking -> Returning if (mode == Attacking) { // Just to be sure the strategy is in sync. if (strategy_uses_target_id()) { int target_dist_2; PhysicalP target = lookup_and_compute_dist_2(target_dist_2,p,get_target_id()); if (!target || !target->alive() || target_dist_2 > GIVE_UP_ATTACK_RADIUS_2) { // Target is dead or too far away. set_toTarget(masterP->get_id()); mode = Returning; #ifdef PRINT_MODES mode_helper(prevMode,mode); #endif return; } } } } Boolean Pet::filter_target(PhysicalP candidate) { // Only actively seek creatures. Not weapons and items. // (If the object the Pet is controlling can pick up weapons/items, // it still do so if it happens to run into the weapon/item. if (!candidate->is_creature()) { #if 0 // Don't go after Prickly, Enforcers, Aliens, etc. candidate->get_ability(AB_Prickly) || // Don't go after FireDemons, Dragons candidate->get_ability(AB_OnFire) #endif return False; } else { return DoppelIntel::filter_target(candidate); } } char *Pet::mode_string(int mode) { switch (mode) { case Heel: return "Heel"; case Returning: return "Returning"; case Seek: return "Seek"; case Attacking: return "Attacking"; default: return "Unknown"; } } xevil-2.02r2.orig/cmn/l_agreement.cpp0100644000175000017500000005331607041455266017066 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "l_agreement.cpp" #if X11 #ifndef NO_PRAGMAS #pragma implementation "l_agreement.h" #endif #endif #include "stdafx.h" #include "utils.h" #include "l_agreement.h" Line::Line(const char **textRet,const char *text) { const char *p = text; #if 0 // First eat beginning WS. Assuming no tabs. while (*p && *p == ' ') { p++; } #endif start = p; // Adding words Boolean hitEOL; while (1) { hitEOL = False; // End of string. if (!*p) { length = (p - start); *textRet = p; break; } if (*p == '\n') { length = (p - start); // Eat the '\n' character. *textRet = p + 1; hitEOL = True; break; } // Search for end of next word. const char* wordP = p; // Eat leading word WS. while (*wordP && *wordP == ' ') { wordP++; } while (*wordP && *wordP != ' ' && *wordP != '\n') { wordP++; } if (wordP - start > textColumns) { // This is the only word on the line. // Will have to break word in two. if (p == start) { length = textColumns; *textRet = start + textColumns; break; } // Break at the end of the previous word. length = p - start; *textRet = p; break; } // Add word to current line. p = wordP; } // Eat trailing WS. if (!hitEOL) { while (**textRet && **textRet == ' ') { (*textRet)++; } } } char* Line::alloc_text() { char* ret = new char[length + 1]; assert(ret); for (int n = 0; n < length; n++) { ret[n] = *(start + n); } ret[length] = '\0'; return ret; } int Line::textColumns = 65; Page::Page(const char **textRet,const char *text) { const char *p = text; // If textRet is NULL, put everything in one page. // Ignore textRows all together. while (*p && (!textRet || lines.length() < textRows)) { Line* line = new Line(&p,p); lines.add(line); } if (textRet) { *textRet = p; } else { assert(!(*p)); } } Page::~Page() { for (int n = 0; n < lines.length(); n++) { delete (Line*)lines.get(n); } } int Page::textRows = 25; Boolean LAgreement::commLineAccepted = False; const char *LAgreement::get_text() { return "XEvil(TM) copyright(C) 1994,2000 Steve Hardt and Michael Judge\n" "http://www.xevil.com\n" "satan@xevil.com\n" "\n" "This program is free software; you can redistribute it and/or modify " "it under the terms of the GNU General Public License as published by " "the Free Software Foundation; either version 2 of the License, or (at " "your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful, but " "WITHOUT ANY WARRANTY; without even the implied warranty of " "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU " "General Public License (given below) for more details.\n" "\n" "\n" "-------------------------------\n" "XEVIL CREDITS\n" "(email to satan@xevil.com)\n" // Ohhhh!! This is horrible. Putting an #ifdef here. // Really need the LAgreement parser to understand '\t' so that // we can line up text properly. X11 uses a fixed width font, // WIN32 uses a variable-width font. // Be very, very careful to keep the credits in sync on both // platforms. #if X11 "Design and Architecture: Steve Hardt\n" "Windows Front End: Michael Judge\n" " Steve Hardt\n" "UNIX Front End: Steve Hardt\n" "Cross Platform Code: Steve Hardt\n" "Artwork: Comrade.Cid\n" " Steve Hardt\n" " Michael Judge\n" " frankwu.com\n" " Anthony Davis\n" " Matthew Dey\n" " Michael Davidson\n" " Peter Arsoff\n" " Brian Nelson\n" "Music: Ann Greyson\n" " Michael Cummings\n" " D.J. Litany\n" "Sound: Michael Judge\n" #endif #if WIN32 "Design and Architecture:\n" " Steve Hardt\n" "Windows Front End:\n" " Michael Judge\n" " Steve Hardt\n" "UNIX Front End:\n" " Steve Hardt\n" "Cross Platform Code:\n" " Steve Hardt\n" "Artwork:\n" " Comrade.Cid\n" " Steve Hardt\n" " Michael Judge\n" " frankwu.com\n" " Anthony Davis\n" " Matthew Dey\n" " Michael Davidson\n" " Peter Arsoff\n" " Brian Nelson\n" "Music:\n" " Ann Greyson\n" " Michael Cummings\n" " D.J. Litany\n" "Sound:\n" " Michael Judge\n" #endif "\n" "\n" "-------------------------------\n" "GNU GENERAL PUBLIC LICENSE\n" "Version 2, June 1991\n" "\n" "Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n" " 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" "Everyone is permitted to copy and distribute verbatim copies " "of this license document, but changing it is not allowed.\n" "\n" "PREAMBLE\n" "\n" "The licenses for most software are designed to take away your " "freedom to share and change it. By contrast, the GNU General Public " "License is intended to guarantee your freedom to share and change free " "software--to make sure the software is free for all its users. This " "General Public License applies to most of the Free Software " "Foundation's software and to any other program whose authors commit to " "using it. (Some other Free Software Foundation software is covered by " "the GNU Library General Public License instead.) You can apply it to " "your programs, too.\n" "\n" "When we speak of free software, we are referring to freedom, not " "price. Our General Public Licenses are designed to make sure that you " "have the freedom to distribute copies of free software (and charge for " "this service if you wish), that you receive source code or can get it " "if you want it, that you can change the software or use pieces of it " "in new free programs; and that you know you can do these things.\n" "\n" "To protect your rights, we need to make restrictions that forbid " "anyone to deny you these rights or to ask you to surrender the rights. " "These restrictions translate to certain responsibilities for you if you " "distribute copies of the software, or if you modify it.\n" "\n" "For example, if you distribute copies of such a program, whether " "gratis or for a fee, you must give the recipients all the rights that " "you have. You must make sure that they, too, receive or can get the " "source code. And you must show them these terms so they know their " "rights.\n" "\n" "We protect your rights with two steps: (1) copyright the software, and " "(2) offer you this license which gives you legal permission to copy, " "distribute and/or modify the software.\n" "\n" "Also, for each author\'s protection and ours, we want to make certain " "that everyone understands that there is no warranty for this free " "software. If the software is modified by someone else and passed on, we " "want its recipients to know that what they have is not the original, so " "that any problems introduced by others will not reflect on the original " "authors\' reputations.\n" "\n" "Finally, any free program is threatened constantly by software " "patents. We wish to avoid the danger that redistributors of a free " "program will individually obtain patent licenses, in effect making the " "program proprietary. To prevent this, we have made it clear that any " "patent must be licensed for everyone\'s free use or not licensed at all.\n" "\n" "The precise terms and conditions for copying, distribution and " "modification follow.\n" "\n" "\n" "GNU GENERAL PUBLIC LICENSE\n" "TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" "\n" "0. This License applies to any program or other work which contains " "a notice placed by the copyright holder saying it may be distributed " "under the terms of this General Public License. The \"Program\", below, " "refers to any such program or work, and a \"work based on the Program\" " "means either the Program or any derivative work under copyright law: " "that is to say, a work containing the Program or a portion of it, " "either verbatim or with modifications and/or translated into another " "language. (Hereinafter, translation is included without limitation in " "the term \"modification\".) Each licensee is addressed as \"you\".\n" "\n" "Activities other than copying, distribution and modification are not " "covered by this License; they are outside its scope. The act of " "running the Program is not restricted, and the output from the Program " "is covered only if its contents constitute a work based on the " "Program (independent of having been made by running the Program). " "Whether that is true depends on what the Program does.\n" "\n" "1. You may copy and distribute verbatim copies of the Program's " "source code as you receive it, in any medium, provided that you " "conspicuously and appropriately publish on each copy an appropriate " "copyright notice and disclaimer of warranty; keep intact all the " "notices that refer to this License and to the absence of any warranty; " "and give any other recipients of the Program a copy of this License " "along with the Program.\n" "\n" "You may charge a fee for the physical act of transferring a copy, and " "you may at your option offer warranty protection in exchange for a fee.\n" "\n" "2. You may modify your copy or copies of the Program or any portion " "of it, thus forming a work based on the Program, and copy and " "distribute such modifications or work under the terms of Section 1 " "above, provided that you also meet all of these conditions:\n" "\n" " a) You must cause the modified files to carry prominent notices " " stating that you changed the files and the date of any change.\n" "\n" " b) You must cause any work that you distribute or publish, that in " " whole or in part contains or is derived from the Program or any " " part thereof, to be licensed as a whole at no charge to all third " " parties under the terms of this License.\n" "\n" " c) If the modified program normally reads commands interactively " " when run, you must cause it, when started running for such " " interactive use in the most ordinary way, to print or display an " " announcement including an appropriate copyright notice and a " " notice that there is no warranty (or else, saying that you provide " " a warranty) and that users may redistribute the program under " " these conditions, and telling the user how to view a copy of this " " License. (Exception: if the Program itself is interactive but " " does not normally print such an announcement, your work based on " " the Program is not required to print an announcement.)\n" "\n" "These requirements apply to the modified work as a whole. If " "identifiable sections of that work are not derived from the Program, " "and can be reasonably considered independent and separate works in " "themselves, then this License, and its terms, do not apply to those " "sections when you distribute them as separate works. But when you " "distribute the same sections as part of a whole which is a work based " "on the Program, the distribution of the whole must be on the terms of " "this License, whose permissions for other licensees extend to the " "entire whole, and thus to each and every part regardless of who wrote it.\n" "\n" "Thus, it is not the intent of this section to claim rights or contest " "your rights to work written entirely by you; rather, the intent is to " "exercise the right to control the distribution of derivative or " "collective works based on the Program.\n" "\n" "In addition, mere aggregation of another work not based on the Program " "with the Program (or with a work based on the Program) on a volume of " "a storage or distribution medium does not bring the other work under " "the scope of this License.\n" "\n" "3. You may copy and distribute the Program (or a work based on it, " "under Section 2) in object code or executable form under the terms of " "Sections 1 and 2 above provided that you also do one of the following:\n" "\n" " a) Accompany it with the complete corresponding machine-readable " " source code, which must be distributed under the terms of Sections " " 1 and 2 above on a medium customarily used for software interchange; or,\n" "\n" " b) Accompany it with a written offer, valid for at least three " " years, to give any third party, for a charge no more than your " " cost of physically performing source distribution, a complete " " machine-readable copy of the corresponding source code, to be " " distributed under the terms of Sections 1 and 2 above on a medium " " customarily used for software interchange; or,\n" "\n" " c) Accompany it with the information you received as to the offer " " to distribute corresponding source code. (This alternative is " " allowed only for noncommercial distribution and only if you " " received the program in object code or executable form with such " " an offer, in accord with Subsection b above.)\n" "\n" "The source code for a work means the preferred form of the work for " "making modifications to it. For an executable work, complete source " "code means all the source code for all modules it contains, plus any " "associated interface definition files, plus the scripts used to " "control compilation and installation of the executable. However, as a " "special exception, the source code distributed need not include " "anything that is normally distributed (in either source or binary " "form) with the major components (compiler, kernel, and so on) of the " "operating system on which the executable runs, unless that component " "itself accompanies the executable.\n" "\n" "If distribution of executable or object code is made by offering " "access to copy from a designated place, then offering equivalent " "access to copy the source code from the same place counts as " "distribution of the source code, even though third parties are not " "compelled to copy the source along with the object code.\n" "\n" "4. You may not copy, modify, sublicense, or distribute the Program " "except as expressly provided under this License. Any attempt " "otherwise to copy, modify, sublicense or distribute the Program is " "void, and will automatically terminate your rights under this License. " "However, parties who have received copies, or rights, from you under " "this License will not have their licenses terminated so long as such " "parties remain in full compliance.\n" "\n" "5. You are not required to accept this License, since you have not " "signed it. However, nothing else grants you permission to modify or " "distribute the Program or its derivative works. These actions are " "prohibited by law if you do not accept this License. Therefore, by " "modifying or distributing the Program (or any work based on the " "Program), you indicate your acceptance of this License to do so, and " "all its terms and conditions for copying, distributing or modifying " "the Program or works based on it.\n" "\n" "6. Each time you redistribute the Program (or any work based on the " "Program), the recipient automatically receives a license from the " "original licensor to copy, distribute or modify the Program subject to " "these terms and conditions. You may not impose any further " "restrictions on the recipients' exercise of the rights granted herein. " "You are not responsible for enforcing compliance by third parties to " "this License.\n" "\n" "7. If, as a consequence of a court judgment or allegation of patent " "infringement or for any other reason (not limited to patent issues), " "conditions are imposed on you (whether by court order, agreement or " "otherwise) that contradict the conditions of this License, they do not " "excuse you from the conditions of this License. If you cannot " "distribute so as to satisfy simultaneously your obligations under this " "License and any other pertinent obligations, then as a consequence you " "may not distribute the Program at all. For example, if a patent " "license would not permit royalty-free redistribution of the Program by " "all those who receive copies directly or indirectly through you, then " "the only way you could satisfy both it and this License would be to " "refrain entirely from distribution of the Program.\n" "\n" "If any portion of this section is held invalid or unenforceable under " "any particular circumstance, the balance of the section is intended to " "apply and the section as a whole is intended to apply in other " "circumstances.\n" "\n" "It is not the purpose of this section to induce you to infringe any " "patents or other property right claims or to contest validity of any " "such claims; this section has the sole purpose of protecting the " "integrity of the free software distribution system, which is " "implemented by public license practices. Many people have made " "generous contributions to the wide range of software distributed " "through that system in reliance on consistent application of that " "system; it is up to the author/donor to decide if he or she is willing " "to distribute software through any other system and a licensee cannot " "impose that choice.\n" "\n" "This section is intended to make thoroughly clear what is believed to " "be a consequence of the rest of this License.\n" "\n" "8. If the distribution and/or use of the Program is restricted in " "certain countries either by patents or by copyrighted interfaces, the " "original copyright holder who places the Program under this License " "may add an explicit geographical distribution limitation excluding " "those countries, so that distribution is permitted only in or among " "countries not thus excluded. In such case, this License incorporates " "the limitation as if written in the body of this License.\n" "\n" "9. The Free Software Foundation may publish revised and/or new versions " "of the General Public License from time to time. Such new versions will " "be similar in spirit to the present version, but may differ in detail to " "address new problems or concerns.\n" "\n" "Each version is given a distinguishing version number. If the Program " "specifies a version number of this License which applies to it and \"any " "later version\", you have the option of following the terms and conditions " "either of that version or of any later version published by the Free " "Software Foundation. If the Program does not specify a version number of " "this License, you may choose any version ever published by the Free Software " "Foundation.\n" "\n" "10. If you wish to incorporate parts of the Program into other free " "programs whose distribution conditions are different, write to the author " "to ask for permission. For software which is copyrighted by the Free " "Software Foundation, write to the Free Software Foundation; we sometimes " "make exceptions for this. Our decision will be guided by the two goals " "of preserving the free status of all derivatives of our free software and " "of promoting the sharing and reuse of software generally.\n" "\n" "\n" "NO WARRANTY\n" "\n" "11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY " "FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN " "OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES " "PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED " "OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF " "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS " "TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE " "PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, " "REPAIR OR CORRECTION.\n" "\n" "12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING " "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR " "REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, " "INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING " "OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED " "TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY " "YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER " "PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE " "POSSIBILITY OF SUCH DAMAGES.\n" "\n" "END OF TERMS AND CONDITIONS" ; } xevil-2.02r2.orig/cmn/locator.cpp0100644000175000017500000015367707637235400016257 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "locator.C" #if X11 #ifndef NO_PRAGMAS #pragma implementation "locator.h" #endif #endif // Include Files #include "stdafx.h" #if WIN32 #include "resource.h" #endif #include "utils.h" #include "coord.h" #include "id.h" #include "area.h" #include "physical.h" #include "locator.h" #include "actual.h" #include "sound_cmn.h" #include "sound.h" #if WIN32 #include "resource.h" #endif #include "bitmaps/locator/locator.bitmaps" // for arrows // When we reach this, start deleting objects. #define OL_LIST_WARN ((int)(OL_LIST_MAX * 0.9)) OLgridEntry::OLgridEntry(OLentry *e) { entry = e; prev = next = NULL; #if X11 wasDrawn = False; #endif } const Area &OLgridEntry::get_area() { assert(prev); return entry->physical->get_area(); } int OLgridEntry::get_drawing_level() { assert(entry->physical && prev); return entry->physical->get_drawing_level(); } void OLgridEntry::insert(OLgridEntry* grid[OL_GRID_VERT_MAX] [OL_GRID_HORIZ_MAX], const GLoc &gl) { assert((prev == NULL) && (next == NULL)); assert(Locator::valid(gl)); entry->gloc = gl; next = grid[gl.vert][gl.horiz]->next; prev = grid[gl.vert][gl.horiz]; if (grid[gl.vert][gl.horiz]->next) grid[gl.vert][gl.horiz]->next->prev = this; grid[gl.vert][gl.horiz]->next = this; } void OLgridEntry::remove() { assert(prev); if (next) next->prev = prev; prev->next = next; prev = next = NULL; } #if X11 OLshadowEntry::OLshadowEntry() { entry = NULL; prev = next = NULL; orphaned = False; wasDrawn = False; } OLshadowEntry::OLshadowEntry(const Area &a,OLentry *e) { area = a; entry = e; prev = next = NULL; orphaned = False; wasDrawn = False; } void OLshadowEntry::insert(OLshadowEntry * shadows[OL_GRID_VERT_MAX] [OL_GRID_HORIZ_MAX], const GLoc &gl) { assert((prev == NULL) && (next == NULL)); entry->shadowGloc = gl; assert(Locator::valid(gl)); next = shadows[gl.vert][gl.horiz]->next; prev = shadows[gl.vert][gl.horiz]; if (shadows[gl.vert][gl.horiz]->next) shadows[gl.vert][gl.horiz]->next->prev = this; shadows[gl.vert][gl.horiz]->next = this; } void OLshadowEntry::remove() { assert (prev); if (next) next->prev = prev; prev->next = next; prev = next = NULL; } #endif HumanP Incarnator::operator () () { // First non-null human that wants to be reincarnated >= index n. while (n < locator->humansMax && !(locator->humans[n] && locator->reincarnating[n] && locator->reincarnateTimers[n].ready())) { n++; } if (n == locator->humansMax) { return NULL; } else { // Extract human. locator->reincarnating[n] = False; return locator->humans[n]; } } PhysicalP PhysicalIter::operator () () { while (n < locator->listMax && !locator->list[n].valid) { n++; } assert(n <= locator->listMax); if (n == locator->listMax) { return NULL; } else { n++; return locator->list[n-1].physical; } } ArenaMessageIter::ArenaMessageIter(Locator &l,const IntelId &i) { ptr = l.arenaHead; locator = &l; intelId = i; } char *ArenaMessageIter::next(Boolean &propagate) { while (ptr != locator->arenaTail) { int ret = -1; // If exclusive, intels must match. if (locator->arenaMessages[ptr].exclusive) { if (locator->arenaMessages[ptr].intelId == intelId) { ret = ptr; } } // Return first message found. else { ret = ptr; } // Increment pointer even if we found a match. ptr = (ptr + 1) % OL_MESSAGES_MAX; if (ret != -1) { // Set return value of propagate. propagate = locator->arenaMessages[ret].propagate; return locator->arenaMessages[ret].msg; } } // Didn't find a match. return NULL; } Locator::Locator(WorldP w, int drawAlg,SoundManager * s) { // assert(TEAMS_MAX >= HUMANS_MAX * 2); no longer true contextCount = 0; world = w; drawingAlgorithm = drawAlg; drawRects = False; soundManager = s; register_contexts(); uniqueGen = 0; listMax = 0; for (int c = 0; c < OL_GRID_HORIZ_MAX; c++) { for (int r = 0; r < OL_GRID_VERT_MAX; r++) { grid[r][c] = new OLgridEntry(NULL); assert(grid[r][c]); #if X11 shadows[r][c] = new OLshadowEntry(); assert(shadows[r][c]); #endif } } addNum = 0; useDelList = False; delNum = 0; rememberSounds = False; soundsNum = 0; #if X11 shadowDelNum = 0; #endif xValid = XVARS_VALID_INIT; head = tail = 0; arenaHead = arenaTail = 0; messagesIgnore = False; humansMax = enemiesNum = neutralsNum = 0; for (int n = 0; n < HUMANS_MAX; n++) { Timer nTimer(REINCARNATE_TIME); reincarnateTimers[n] = nTimer; } persistentTeamsNum = teamsNum = 0; } Locator::~Locator() { reset(); for (int c = 0; c < OL_GRID_HORIZ_MAX; c++) for (int r = 0; r < OL_GRID_VERT_MAX; r++) { assert(grid[r][c]); delete grid[r][c]; #if X11 assert(shadows[r][c]); delete shadows[r][c]; #endif } #if X11 for (;shadowDelNum>0;shadowDelNum--) { assert(shadowDelList[shadowDelNum-1]); delete shadowDelList[shadowDelNum-1]; } #endif } void Locator::add(PhysicalP p) { if (addNum >= OL_LIST_MAX) { cerr << "Object locator is full. Can only have " << OL_LIST_MAX << " objects in the game." << endl; assert(0); } addList[addNum] = p; addNum++; p->set_id(reserve_list_entry(p)); } void Locator::add_as(PhysicalP p,const Id &id) { assert(id.index >= 0 && id.index < OL_LIST_MAX); // Kill any object that might have been at that location. // clean up the grid, possibly add to the shadowDelList if (id.index < listMax && list[id.index].valid && list[id.index].physical) { // die, fucker del_now(list[id.index].physical); } // Stolen from Locator::add if (addNum >= OL_LIST_MAX) { cerr << "Object locator is full. Can only have " << OL_LIST_MAX << " objects in the game." << endl; assert(0); } // addList[addNum] = p;a // addNum++; // Make all entries less than id.index invalid. while (listMax <= id.index) { list[listMax].valid = False; list[listMax].reserved = False; listMax++; } // if (id.index >= listMax) { // Since Locator::del_now() may have decreased listMax // listMax = id.index + 1; //} list[id.index].valid = False; list[id.index].reserved = True; list[id.index].physical = p; // Just to make sure. p->set_id(id); add_now(p); } void Locator::get_nearby(PhysicalP nearby[OL_NEARBY_MAX],int &nitems, PhysicalP p,int radius) { //stupid MS compiler gets ambiguous call without the recast to double int glocRadius = (int)ceil((double)((double)radius / OL_GRID_SIZE_MIN)); int radius_2 = radius * radius; nitems = 0; const Id id = p->get_id(); GLoc pGLoc = list[id.index].gloc; const Area &pArea = p->get_area(); Pos pPos = pArea.get_middle(); GLoc gloc; for (gloc.horiz = pGLoc.horiz - glocRadius; gloc.horiz <= pGLoc.horiz + glocRadius; gloc.horiz++) for (gloc.vert = pGLoc.vert - glocRadius; gloc.vert <= pGLoc.vert + glocRadius; gloc.vert++) if (valid(gloc)) { // Skip the header. OLgridEntry *ge = grid[gloc.vert][gloc.horiz]->get_next(); while (ge) { PhysicalP p2 = ge->get_physical(); if (p != p2) { const Area& area = p2->get_area(); if (pPos.distance_2(area.get_middle()) <= radius_2) { assert(nitems < OL_NEARBY_MAX); nearby[nitems] = p2; nitems++; } } ge = ge->get_next(); } } } PhysicalP Locator::lookup(const Id &id,Boolean recentAddition) { if (id.index != Id::INVALID && id.index < listMax && (list[id.index].valid || // recentAddition toggles whether recently added objects can be // looked up. (recentAddition && list[id.index].reserved))) { Id testId = list[id.index].physical->get_id(); if (testId == id) { return list[id.index].physical; } } return NULL; } IntelP Locator::lookup(const IntelId &iId) { if (iId.index == IntelId::INVALID) { return NULL; } // Check humans. if (iId.index < humansMax && humans[iId.index]) { IntelId testId = humans[iId.index]->get_intel_id(); if (testId == iId) { return humans[iId.index]; } } // Check enemies. if (iId.index < enemiesNum && enemies[iId.index]->alive()) { IntelId testId = enemies[iId.index]->get_intel_id(); if (testId == iId) { return enemies[iId.index]; } } // Check neutrals. if (iId.index < neutralsNum && neutrals[iId.index]->alive()) { IntelId testId = neutrals[iId.index]->get_intel_id(); if (testId == iId) { return neutrals[iId.index]; } } return NULL; } // Used on both UNIX (LargeViewport only) and Windows. void Locator::draw_directly(CMN_DRAWABLE window,Xvars &xvars,int dpyNum, const Area &area) { if (!xvars.is_valid(xValid)) { init_x(xvars,IX_INIT,NULL); } // Get all the grid squares covering the area in question. GLoc gridStart; GLoc gridFinish; grid_covering_area(gridStart,gridFinish,area); // Avoid double drawing composite objects. clear_already_drawn_flag(gridStart,gridFinish); // Loop over all drawing levels, all grid squares, all objects in each // grid square. GLoc gloc; for (int dLevel = 0; dLevel < DRAWING_LEVELS; dLevel++) { for (gloc.vert = gridStart.vert; gloc.vert < gridFinish.vert; gloc.vert++) { for (gloc.horiz = gridStart.horiz; gloc.horiz < gridFinish.horiz; gloc.horiz++) { if (!valid(gloc)) { continue; } OLgridEntry *ge = grid[gloc.vert][gloc.horiz]->get_next(); while (ge) { OLentry *ent = ge->get_entry(); assert (ent->gloc == gloc); // Must be visible this turn and be at the current drawing level. if ((ge->get_mapped() || ge->get_flash()) && (ge->get_drawing_level() == dLevel)) { PhysicalP p = ge->get_physical(); assert(p); // Usually only draws one object, except for Composite objects // with drawing order. draw_chain(window,xvars,dpyNum,area,p); } ge = ge->get_next(); } // while ge } // horiz } // vert } // dlevel } void Locator::draw_ticks(CMN_DRAWABLE window,Xvars &xvars,int dpyNum, const Area &area,const Id &id, ITickRenderer* renderer) { renderer->begin_draw(dpyNum); PhysicalP p = lookup(id); // Only draw tick marks if there is a Physical to center them on. if (p) { // In window coords. Area winArea = xvars.stretch_area(area); Pos winPos = winArea.get_pos(); Size winSize = winArea.get_size(); // Get all objects within a certain range. // Same range as machine players. PhysicalP nearby[OL_NEARBY_MAX]; int nitems; get_nearby(nearby,nitems,p,IT_VISION_RANGE); for (int n = 0; n < nitems; n++) { // TICK_MAX means don't draw tick. NetDataP netData = nearby[n]->get_net_data(); TickType tt = netData->get_tick_type(); // Use tick type specified by the NetData first. If there is none, // let the Locator compute it. if (tt == TICK_MAX) { tt = compute_tick_type(nearby[n],p->get_intel()); } // Should we draw a tick for the Physical if (tt != TICK_MAX) { const Area &checkArea = nearby[n]->get_area(); // Only draw tick marks for objects off-screen. // The Client decides whether or not to draw ticks, even if the // Server decided what type of tick to draw. if (!checkArea.overlap(area)) { Pos middle = checkArea.get_middle(); int windowX = xvars.stretch_x(middle.x) - winPos.x; int windowY = xvars.stretch_y(middle.y) - winPos.y; if (windowY < 0) { // along top edge if (windowX < 0) { // upper left corner if (!renderer->draw_tick(tt,window,xvars,dpyNum, winSize,CO_UP_L,0)) { break; } } else if (windowX < winSize.width) { // regular case if (!renderer->draw_tick(tt,window,xvars,dpyNum, winSize,CO_UP,windowX)) { break; } } else { // upper right if (!renderer->draw_tick(tt,window,xvars,dpyNum, winSize,CO_UP_R,0)) { break; } } } else if (windowY >= winSize.height) { // along bottom edge if (windowX < 0) { // bottom left corner if (!renderer->draw_tick(tt,window,xvars,dpyNum, winSize,CO_DN_L,0)) { break; } } else if (windowX < winSize.width) { // normal case if (!renderer->draw_tick(tt,window,xvars,dpyNum, winSize,CO_DN,windowX)) { break; } } else { // bottom right if (!renderer->draw_tick(tt,window,xvars,dpyNum, winSize,CO_DN_R,0)) { break; } } } else { // right or left side if (windowX < 0) { if (!renderer->draw_tick(tt,window,xvars,dpyNum, winSize,CO_L,windowY)) { break; } } else if (windowX >= winSize.width) { if (!renderer->draw_tick(tt,window,xvars,dpyNum, winSize,CO_R,windowY)) { break; } } else { assert(0); } } } // overlap }// not TICK_MAX } // for } // if (p) renderer->end_draw(dpyNum); } // For Locator's implementation of ITickRenderer. Does nothing. void Locator::begin_draw(int) { } // For Locator's implementation of ITickRenderer. Does nothing. void Locator::end_draw(int) { } void Locator::draw_chain(CMN_DRAWABLE window,Xvars &xvars,int dpyNum, const Area &area,PhysicalP p) { Id id = p->get_id(); assert(lookup(id) == p); // Don't draw multiple times. // Since p was drawn, we can be sure that p's draw_before_me() objects // were drawn. if (list[id.index].alreadyDrawn) { return; } // Can't reject p if it is outside area yet. We must call all the way down // p's chain because p may have some draw-before that does overlap area. // First draw any objects that must be drawn before p. CompositeP comp = p->get_composite(); if (comp) { // We are relying on get_draw_before_me() not to get in an infinite loop. PhysicalP q = comp->get_draw_before_me(); if (q) { draw_chain(window,xvars,dpyNum,area,q); } } // Now we can reject p if it is outside area. const Area &areaP = p->get_area(); if (areaP.overlap(area)) { // Physical::draw() will do the correct offset. // Pass in area, not areaP. p->draw(window,xvars,dpyNum,area); list[id.index].alreadyDrawn = True; } } void Locator::reset() { // Destroy the addList. int n; for (n = 0; n < addNum; n++) { delete addList[n]; } addNum = 0; for (n = 0; n < listMax; n++) { if (list[n].valid) { del_now(list[n].physical); } } listMax = 0; // Don't reset this, because the client may be getting old packets. // uniqueGen = 0; // Check grid integrity. There should only be the headers remaining. for (int c = 0; c < OL_GRID_HORIZ_MAX; c++) { for (int r = 0; r < OL_GRID_VERT_MAX; r++) { if (!grid[r][c]) { cerr << "Error in grid integrity. grid[" << r << "][" << c << "]" << " is null" << endl; } else if (grid[r][c]->get_next() != NULL) { cerr << "Error in grid integrity. grid[" << r << "][" << c << "]" << " has a next entry." << endl; } } } clear_all_messages(); for (n = 0; n < humansMax; n++) { // May be null. delete humans[n]; } for (n = 0; n < enemiesNum; n++) { delete enemies[n]; } for (n = 0; n < neutralsNum; n++) { delete neutrals[n]; } humansMax = enemiesNum = neutralsNum = 0; for (n = 0; n < teamsNum; n++) { delete_team_data(teams[n]); } teamsNum = 0; for (n = 0; n < persistentTeamsNum; n++) { delete_team_data(persistentTeams[n]); } persistentTeamsNum = 0; } void Locator::clear_all_messages() { // Delete all messages remaining in both queues. char *msg; while (msg = message_deq()) { delete msg; } IntelId dummy; Quanta dummy2 = 0; Boolean dummy3 = False; do { arena_message_deq(&msg,dummy,dummy2,dummy3); delete msg; } while (msg); } void Locator::level_reset() { // Kill off non-persistent teams. for (int n = 0; n < teamsNum; n++) { delete_team_data(teams[n]); } teamsNum = 0; } void Locator::clock() { #if X11 kill_shadow_del_list(); shadows_follow_physicals(); #endif collision_checks(); intelligence_and_act(); kill_outside_world(); kill_excess_objects(); check_for_death(); update_phase(); grid_follows_physicals(); // Also sets list[n].collided = False. add_new_objects(); delete_dead(); reincarnate_clock(); } void Locator::client_pre_clock() { #if X11 kill_shadow_del_list(); shadows_follow_physicals(); #endif } void Locator::client_post_clock() { grid_follows_physicals(); // Also sets list[n].collided = False. // add_new_objects(); // delete_dead(); // reincarnate_clock(); } #if X11 void Locator::kill_shadow_del_list() { // Kill shadow delete list. int n; for (n = 0; n < shadowDelNum; n++) { shadowDelList[n]->remove(); delete shadowDelList[n]; } shadowDelNum = 0; } void Locator::shadows_follow_physicals() { int n; // Move shadows to previous area. for (n = 0; n < listMax; n++) { if (list[n].valid && (list[n].mapped || list[n].flash)) { list[n].shadowEntry->set_area(list[n].physical->get_area()); GLoc realGloc = compute_gloc(list[n].shadowEntry->get_area()); if (list[n].shadowGloc != realGloc) { list[n].shadowEntry->remove(); list[n].shadowEntry->insert(shadows,realGloc); } } } } #endif void Locator::intelligence_and_act() { /* Intelligence phase and action phase. Set next variables. Externally visible state should not change. Exceptions to this: canTake. */ int n; for (n = 0; n < listMax; n++) { if (list[n].valid) { // Think before you act. list[n].physical->intelligence(); list[n].physical->act(); } } } void Locator::kill_outside_world() { int n; for (n = 0; n < listMax; n++) { if (list[n].valid && (list[n].mapped || list[n].flash)) { const Area &area = list[n].physical->get_area_next(); if (!world->inside(area.middle_wsquare())) { // (&& !list[n].physical->delete_me()) list[n].physical->set_quiet_death(); list[n].physical->kill_self(); arena_message_enq(Utils::strdup("Knocked Out Of World"), list[n].physical); } } } } void Locator::check_for_death() { // Check for death. I.e. healthNext < 0. /* NOTE: If using kill_self in this phase, an object must manually call die and check for die_called(). Hack in Frog::die. */ int n; for (n = 0; n < listMax; n++) { if (list[n].valid && list[n].physical->get_health_next() < 0 && list[n].physical->get_health() >= 0 && !list[n].physical->die_called()) { list[n].physical->die(); } } } void Locator::update_phase() { // Update externally visable state. int n; for (n = 0; n < listMax; n++) { if (list[n].valid) { list[n].physical->update(); } } } void Locator::grid_follows_physicals() { /* Update the locator grid, shifting gridEntries around if necessary. */ int n; for (n = 0; n < listMax; n++) { if (list[n].valid) { allign_flash_and_mapped(n); if (list[n].mapped || list[n].flash) { const Area &area = list[n].physical->get_area(); if (world->inside(area.middle_wsquare())) { GLoc realGLoc = compute_gloc(list[n].physical); if (list[n].gloc != realGLoc) { list[n].gridEntry->remove(); list[n].gridEntry->insert(grid,realGLoc); } } else { if (!(list[n].physical->die_called() && list[n].physical->delete_me())) { // For Server and StandAlone, we should have already cleaned up // in kill_outside_world. // For Client, we do it here. del_now(list[n].physical); /* cerr << "item knocked out of world, but die " << list[n].physical->die_called() << " and delete " << list[n].physical->delete_me() << " not both called " << endl; */ } } // inside } // mapped || flash list[n].collided = False; } // if valid } // for n } void Locator::add_new_objects() { // Add all objects on the list. int n; for (n = 0; n < addNum; n++) { add_now(addList[n]); } addNum = 0; } void Locator::delete_dead() { // Delete objects that are dead. int n; for (n = 0; n < listMax; n++) { if (list[n].valid && list[n].physical->delete_me()) { del_now(list[n].physical); } } } void Locator::message_enq(char *msg) { if (messagesIgnore) { delete msg; return; } if ((tail + 1) % OL_MESSAGES_MAX != head) { messages[tail] = msg; tail = (tail + 1) % OL_MESSAGES_MAX; } else { delete msg; // cout << "Warning: Message queue overflow. Discarding message." << endl; } } char *Locator::message_deq() { if (head == tail) return NULL; int ret = head; head = (head + 1) % OL_MESSAGES_MAX; return messages[ret]; } char *Locator::peek_most_recent_message() { if (head == tail) { return NULL; } return messages[Utils::mod(tail - 1,OL_MESSAGES_MAX)]; } void Locator::arena_message_enq(char *msg,IntelId *intelId, Quanta time,Boolean propagate) { // Don't disable arenaMessages. // if (messagesIgnore) { // delete msg; // return; //} if ((arenaTail + 1) % OL_MESSAGES_MAX != arenaHead) { // Fill ArenaMessage structure. arenaMessages[arenaTail].msg = msg; arenaMessages[arenaTail].exclusive = (intelId != NULL); arenaMessages[arenaTail].time = time; arenaMessages[arenaTail].propagate = propagate; if (intelId) { arenaMessages[arenaTail].intelId = *intelId; } arenaTail = (arenaTail + 1) % OL_MESSAGES_MAX; } else { delete msg; // cout << "Warning: Message queue overflow. Discarding message." << endl; } } void Locator::arena_message_enq(char *msg,PhysicalP p) { IntelP intel = p->get_intel(); if (intel) { IntelId intelId = intel->get_intel_id(); // Will always do default amount of time. arena_message_enq(msg,&intelId); } else { delete msg; } } Boolean Locator::arena_message_deq(char **msg,IntelId &intelId, Quanta &time,Boolean &propagate) { assert(msg); if (arenaHead == arenaTail) { *msg = NULL; time = -1; return False; } int ret = arenaHead; arenaHead = (arenaHead + 1) % OL_MESSAGES_MAX; *msg = arenaMessages[ret].msg; time = arenaMessages[ret].time; // may be -1 propagate = arenaMessages[ret].propagate; if (arenaMessages[ret].exclusive) { intelId = arenaMessages[ret].intelId; return True; } else { return False; } } void Locator::register_human(HumanP h) { // find an empty spot int n; for (n = 0; n < humansMax; n++) { if (!humans[n]) { break; } } // Increase size of array. if (n == humansMax) { assert(humansMax < HUMANS_MAX); humansMax++; } // n is now a valid spot to insert the human. // Assign h an IntelId. IntelId iId = h->get_intel_id(); assert(iId.index == IntelId::INVALID); iId.index = n; iId.unique = uniqueGen; uniqueGen++; h->set_intel_id(iId); // Add to the array of Humans. humans[n] = h; reincarnating[n] = False; reincarnateTimers[n].reset(); } void Locator::register_human_as(HumanP h) { IntelId iId = h->get_intel_id(); assert(iId.index != IntelId::INVALID && iId.index < HUMANS_MAX); if (iId.index < humansMax && humans[iId.index]) { // kill human off if one was already there. delete humans[iId.index]; } // Increment humansMax while (humansMax <= iId.index) { humans[humansMax] = NULL; reincarnating[humansMax] = False; reincarnateTimers[humansMax].reset(); humansMax++; } humans[iId.index] = h; // These values don't matter. reincarnating[iId.index] = False; reincarnateTimers[iId.index].reset(); } void Locator::unregister_human(const IntelId &iId) { IntelP intel = lookup(iId); if (!(intel && intel->is_human())) { return; } delete humans[iId.index]; humans[iId.index] = NULL; // Decrease effective size of list. int n = iId.index; if (n == humansMax - 1) { // Scan back til we hit a valid entry. while(n > 0 && !humans[n - 1]) { n--; } humansMax = n; } } void Locator::register_enemy(EnemyP m) { IntelId iId = m->get_intel_id(); assert(iId.index == IntelId::INVALID); iId.unique = uniqueGen; uniqueGen++; // Try inserting in current array. for (int n = 0; n < enemiesNum; n++) { if (!enemies[n]->alive()) { delete enemies[n]; enemies[n] = m; iId.index = n; m->set_intel_id(iId); return; } } // Else add to array. assert(enemiesNum < ENEMIES_MAX); enemies[enemiesNum] = m; iId.index = enemiesNum; m->set_intel_id(iId); enemiesNum++; } void Locator::register_neutral(NeutralP m) { IntelId iId = m->get_intel_id(); assert(iId.index == IntelId::INVALID); iId.unique = uniqueGen; uniqueGen++; // Try inserting in current array. for (int n = 0; n < neutralsNum; n++) { if (!neutrals[n]->alive()) { delete neutrals[n]; neutrals[n] = m; iId.index = n; m->set_intel_id(iId); return; } } // Else add to array. assert(neutralsNum < NEUTRALS_MAX); neutrals[neutralsNum] = m; iId.index = neutralsNum; m->set_intel_id(iId); neutralsNum++; } int Locator::humans_playing() { int n,ret; for (n = 0, ret = 0; n < humansMax; n++) { if (humans[n] && (humans[n]->alive() || humans[n]->reincarnate_me())) { ret++; } } return ret; } int Locator::enemies_alive() { int n,ret; for (n = 0, ret = 0; n < enemiesNum; n++) if (enemies[n]->alive()) ret++; return ret; } int Locator::neutrals_alive() { int n,ret; for (n = 0, ret = 0; n < neutralsNum; n++) if (neutrals[n]->alive()) ret++; return ret; } int Locator::humans_registered() { // Count elements of humans[] that are non-null. int ret = 0; for (int n = 0; n < humansMax; n++) { if (humans[n]) { ret++; } } return ret; } HumanP Locator::get_human(int which) { int humansBefore = 0; for (int n = 0; n < humansMax; n++) { if (humans[n]) { if (which == humansBefore) { return humans[n]; } // Count number of valid humans before n. humansBefore++; } } // Asked for a human that doesn't exist. assert(0); return NULL; } void Locator::set_remember_deleted(Boolean val) { if (val == useDelList) { return; } if (val) { assert(delNum == 0); useDelList = True; } else { // Clear out existing requests. delNum = 0; useDelList = False; } } void Locator::set_remember_sounds(Boolean val) { if (val == rememberSounds) { return; } if (val) { assert(soundsNum == 0); rememberSounds = True; } else { // Clear out existing requests. soundsNum = 0; rememberSounds = False; } } TeamId Locator::add_persistent_team(Boolean (*same_team) (LocatorP,PhysicalP,PhysicalP), TeamOptionsP ops) { // Code dupd in add_team() assert(persistentTeamsNum < TEAMS_MAX); // same unique number generator as regular teams. TeamId ret = uniqueGen; // ret.index = persistentTeamsNum; // ret.unique = uniqueGen; uniqueGen++; persistentTeams[persistentTeamsNum].teamId = ret; if (ops) { persistentTeams[persistentTeamsNum].options = *ops; } else { TeamOptions defaultOps; persistentTeams[persistentTeamsNum].options = defaultOps; } persistentTeams[persistentTeamsNum].same_team = same_team; persistentTeamsNum++; return ret; } TeamId Locator::add_team(Boolean (*same_team)(LocatorP,PhysicalP,PhysicalP), TeamOptionsP ops) { // Code dupd in add_persistent_team() assert(teamsNum < TEAMS_MAX); TeamId ret = uniqueGen; // ret.index = teamsNum; // ret.unique = uniqueGen; uniqueGen++; teams[teamsNum].teamId = ret; if (ops) { teams[teamsNum].options = *ops; } else { TeamOptions defaultOps; teams[teamsNum].options = defaultOps; } teams[teamsNum].same_team = same_team; teamsNum++; return ret; } Boolean Locator::same_team(TeamOptions &ops,PhysicalP p1,PhysicalP p2) { // Is there a better way to do this? int n; // regular teams for (n = 0; n < teamsNum; n++) { if (teams[n].same_team(this,p1,p2)) { // Both are on the same team according to rule n. ops = teams[n].options; return True; } } // persistent teams for (n = 0; n < persistentTeamsNum; n++) { if (persistentTeams[n].same_team(this,p1,p2)) { // Both are on team n. ops = persistentTeams[n].options; return True; } } // Tried all the teams. return False; } void Locator::delete_team_data(OLTeam &team) { // Does nothing now. } const PhysicalContext *Locator::get_context(ClassId classId) { if (classId >= 0 && classId < A_CLASSES_NUM) { return contexts[classId]; } return NULL; } int Locator::filter_contexts(const PhysicalContext *contextList[A_CLASSES_NUM], ClassId idList[A_CLASSES_NUM], Boolean (* filter)(const PhysicalContext *,void *), void *closure) { assert(list); int numFound = 0; int n; for (n = 0; n < A_CLASSES_NUM; n++) if (contexts[n] && filter(contexts[n],closure)) { assert(numFound < A_CLASSES_NUM); if (contextList) { contextList[numFound] = contexts[n]; } if (idList) { // We guarantee that the index of a context in Locator::contexts // is the ClassId of that context. idList[numFound] = (ClassId)n; } numFound++; } return numFound; } void Locator::get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId,ClassId cId) { assert(cId >= 0 && cId < A_None); // A regular class. if (cId < A_CLASSES_NUM) { if (contexts[cId] && contexts[cId]->get_item_info != NULL) { contexts[cId]->get_item_info(isItem,isWeapon,iconId); } else { isItem = False; isWeapon = False; iconId = (CMN_BITS_ID)0; } } // One of the "non-existent" classes, see coord.h else { const OLItemInfo &iInfo = nonExistentClassesItemInfo[cId - A_CLASSES_NUM]; isItem = iInfo.isItem; isWeapon = iInfo.isWeapon; iconId = iInfo.iconId; } } TickType Locator::compute_tick_type(PhysicalP p,IntelP relativeTo) { TickType tt = TICK_MAX; IntelP intel = p->get_intel(); // Have intel and not be invisible to draw tick marks. if (intel && p->is_moving() && !((MovingP)p)->is_invisible()) { // Choose appropriate type of tick. if (intel->is_human()) { tt = TICK_HUMAN; } else if (intel->is_enemy()) { tt = TICK_ENEMY; } else { tt = TICK_NEUTRAL; // Slaves of other humans should have the tick mark of a human. IntelP pMaster = lookup(((MachineP)intel)->get_master_intel_id()); if (pMaster) { assert(pMaster->is_human()); if (pMaster != relativeTo) { tt = TICK_HUMAN; } } } } // Draw nearby objects of great importance, e.g Flag, Xit, AltarOfSin else { // Could use PhysicalContext, but why bother. if (p->get_class_id() == A_Flag || p->get_class_id() == A_Xit || p->get_class_id() == A_AltarOfSin) { tt = TICK_OTHER; } } return tt; } void Locator::add_now(PhysicalP p) { Id id = p->get_id(); int n = id.index; assert (list[n].physical == p); list[n].valid = True; list[n].collided = False; list[n].collidable = p->collidable(); list[n].mapped = p->get_mapped(); list[n].flash = p->get_flash(); list[n].alreadyDrawn = False; // Maybe we should set the reserved flag to False? if (list[n].mapped || list[n].flash) { // Create and add shadow and grid entries. list[n].gridEntry = new OLgridEntry(&list[n]); assert(list[n].gridEntry); GLoc gloc = compute_gloc(list[n].physical); list[n].gridEntry->insert(grid,gloc); #if X11 list[n].shadowEntry = new OLshadowEntry(p->get_area(),&list[n]); assert(list[n].shadowEntry); list[n].shadowEntry->insert(shadows,gloc); #endif } } void Locator::del_now(PhysicalP p) { Id id = p->get_id(); // Object has been added and is in locator, add it to the delete list and // kill its OLEntry and shadowEntry if (list[id.index].valid) { // Add to the delete list. // This code copied in allign_flash_and_mapped. if (useDelList) { if (delNum < OL_LIST_MAX) { delList[delNum] = id; delNum++; } else { cerr << "List of recently deleted objects has overflown." << endl; } } list[id.index].valid = False; list[id.index].reserved = False; if (list[id.index].mapped || list[id.index].flash) { list[id.index].gridEntry->remove(); delete list[id.index].gridEntry; #if X11 shadowDelList[shadowDelNum] = list[id.index].shadowEntry; list[id.index].shadowEntry->set_orphaned(); shadowDelNum++; #endif } } // Object has been added, but we are deleting it before Locator has a chance // to clock and complete the process. So, remove from the add list and // unreserve the entry. else { if (!list[id.index].reserved) { cerr << "Locator::del_now() bad ID when deleting object" << endl; return; } list[id.index].reserved = False; // Already know that valid is False. // Delete p from the addList. int n; Boolean found = False; for (n = 0; n < addNum; n++) { if (addList[n] == p) { addList[n] = addList[addNum - 1]; addList[addNum - 1] = NULL; addNum--; found = True; break; } } // Make sure the Physical was actually in the add list. assert(found); } // Decrease effective size of list. if (id.index == listMax - 1) { // Scan back til we hit a valid entry. while(id.index > 0 && !list[id.index-1].valid) { id.index--; } listMax = id.index; } // We now make sure to delete p. delete p; } void Locator::allign_flash_and_mapped(int n) { Boolean flash = list[n].physical->get_flash(); Boolean mapped = list[n].physical->get_mapped(); // Add new OLgridEntry and shadowEntry. if (!(list[n].mapped || list[n].flash) && (mapped || flash)) { list[n].gridEntry = new OLgridEntry(&list[n]); assert(list[n].gridEntry); GLoc gloc = compute_gloc(list[n].physical); list[n].gridEntry->insert(grid,gloc); #if X11 list[n].shadowEntry = new OLshadowEntry(list[n].physical->get_area(),&list[n]); assert(list[n].shadowEntry); list[n].shadowEntry->insert(shadows,gloc); #endif } // Destroy grid entry and mark shadow entry for deletion. if ((list[n].mapped || list[n].flash) && !(mapped || flash)) { list[n].gridEntry->remove(); delete list[n].gridEntry; #if X11 shadowDelList[shadowDelNum] = list[n].shadowEntry; list[n].shadowEntry->set_orphaned(); shadowDelNum++; #endif // kind of a hack using delList for recently unmapped objects. if (useDelList) { if (delNum < OL_LIST_MAX) { delList[delNum] = list[n].physical->get_id(); delNum++; } else { cerr << "List of recently deleted objects has overflown." << endl; } } } list[n].mapped = mapped; list[n].flash = flash; } Id Locator::reserve_list_entry(PhysicalP p) { // Must use this form of get_id(), since this is one of the few places // where it is valid for the id not to be set. Id dummy; for (int n = 0; ; n++) { assert(n <= listMax); // Increase effective size of list. if (n == listMax) { // If Locator list is full, we are in deep shit. This will // probably cause an assertion somewhere. if (n >= OL_LIST_MAX) { cerr << "ERROR: Exceeded maximum number of " << OL_LIST_MAX << " objects in the game." << endl; // Return an invalid Id. return dummy; } list[n].valid = False; list[n].reserved = False; listMax++; } // Found an empty entry. if (!list[n].valid && !list[n].reserved) { Id ret; ret.index = n; ret.unique = uniqueGen; uniqueGen++; list[n].reserved = True; list[n].physical = p; return ret; } } } /* Collision phase. Physical::collide will be called at most once for any object. */ void Locator::collision_checks() { for (int n = 0; n < listMax; n++) { if (list[n].valid && !list[n].collided && list[n].mapped && list[n].collidable && list[n].physical->alive()) { // So corpses don't collide, see below. PhysicalP p1 = list[n].physical; GLoc gloc; for (gloc.vert = list[n].gloc.vert - 1; gloc.vert <= list[n].gloc.vert + 1; gloc.vert++) { for (gloc.horiz = list[n].gloc.horiz - 1; gloc.horiz <= list[n].gloc.horiz + 1; gloc.horiz++) { if (valid(gloc) && possible_overlap(p1->get_area(),gloc)) { // Skip the header. OLgridEntry *ge = grid[gloc.vert][gloc.horiz]->get_next(); while (ge) { PhysicalP p2 = ge->get_physical(); assert(p2); IntelP intel1 = p1->get_intel(); IntelP intel2 = p2->get_intel(); TeamOptions ops; if ( !ge->get_collided() && ge->get_mapped() && ge->get_collidable() && p1 != p2 && // Don't collide with self. // Make sure neither physical is set not to // collide with the other. p2->get_dont_collide() != p1->get_id() && p1->get_dont_collide() != p2->get_id() && // Teammates don't collide with each other !(same_team(ops,p1,p2) && ops.membersDontCollide) && // If both have intels, make sure neither intel // is set not to collide with the other. // If they don't both have intels, continue. (! (intel1 && intel2) || (intel1->get_dont_collide() != intel2->get_intel_id() && intel2->get_dont_collide() != intel1->get_intel_id()) ) && p2->alive() // So corpses don't collide, see below. ) { // Composite objects don't collide with each other. // We could do this with teams. CompositeP c1 = p1->get_composite(); CompositeP c2 = p2->get_composite(); if (c1 && c2 && c1->get_composite_id() == c2->get_composite_id()) { ge = ge->get_next(); continue; } /// Check for the dont_collide_composite() flag if (c1 && c1->get_composite_id() == p2->get_dont_collide_composite()) { ge = ge->get_next(); continue; } if (c2 && c2->get_composite_id() == p1->get_dont_collide_composite()) { ge = ge->get_next(); continue; } const Area &a1 = p1->get_area(); if (a1.overlap(p2->get_area())) { if (p1->get_mass() > p2->get_mass()) { p2->avoid(p1); } else if (p2->get_mass() > p1->get_mass()) { p1->avoid(p2); } else if (Utils::coin_flip()) { p1->avoid(p2); } else { p2->avoid(p1); } p1->collide(p2); p2->collide(p1); list[n].collided = True; ge->set_collided(True); } // overlap } // big-ass if // Also called above to "continue" ge = ge->get_next(); } // while ge } // valid gloc } // gloc horiz } // gloc vert } // if list valid } // for n } GLoc Locator::compute_gloc(PhysicalP p) { const Area &area = p->get_area(); #ifndef NDEBUG Size size = area.get_size(); assert(size.width <= OL_GRID_WIDTH && size.height <= OL_GRID_HEIGHT); #endif Pos middle = area.get_middle(); GLoc gloc; gloc.horiz = middle.x / OL_GRID_WIDTH; gloc.vert = middle.y / OL_GRID_HEIGHT; return gloc; } GLoc Locator::compute_gloc(const Area &area) { Pos middle = area.get_middle(); GLoc gloc; gloc.horiz = middle.x / OL_GRID_WIDTH; gloc.vert = middle.y / OL_GRID_HEIGHT; return gloc; } Boolean Locator::possible_overlap(const Area &area,const GLoc &gloc) { //static int tr; //static int fa; Pos pos(gloc.horiz * OL_GRID_WIDTH - OL_GRID_WIDTH / 2, gloc.vert * OL_GRID_HEIGHT - OL_GRID_HEIGHT / 2); Size size; size.set(2 * OL_GRID_WIDTH,2 * OL_GRID_HEIGHT); Area virtGLoc(AR_RECT,pos,size); if (virtGLoc.overlap(area)) { //tr++; //cout << "true/false: " << tr << "/" << fa << " ratio: " << ((float)tr / (float)fa) << endl; return True; } else { //fa++; //cout << "true/false: " << tr << "/" << fa << " ratio: " << ((float)tr / (float)fa) << endl; return False; } } void Locator::reincarnate_clock(){ for (int n = 0; n < humansMax; n++) { if (humans[n]) { if (!reincarnating[n] && humans[n]->reincarnate_me()) { reincarnating[n] = True; reincarnateTimers[n].set(); } reincarnateTimers[n].clock(); } } } void Locator::kill_excess_objects() { // Count number of existing objects. int count = 0; int n; for (n = 0; n < listMax; n++) { if (list[n].valid || list[n].reserved) { count++; } } // If we decide to trim off the excess objects. if (count > OL_LIST_WARN) { cerr << "Approaching critical number of objects in XEvil." << " Trim some of the excess." << endl; // Kill unheld items. for (n = 0; n < listMax; n++) { if (list[n].valid) { PhysicalP p = list[n].physical; if (p->is_item() && !((ItemP)p)->is_held()) { p->set_quiet_death(); p->kill_self(); } } } // Count remaining int postCount = 0; for (n = 0; n < listMax; n++) { if (list[n].valid || list[n].reserved) { postCount++; } } cerr << "Was " << count << " objects, there are now " << postCount << " objects." << endl; } } void Locator::clear_already_drawn_flag(const GLoc &gridStart, const GLoc &gridFinish) { GLoc gloc; for (gloc.vert = gridStart.vert; gloc.vert < gridFinish.vert; gloc.vert++) { for (gloc.horiz = gridStart.horiz; gloc.horiz < gridFinish.horiz; gloc.horiz++) { if (valid(gloc)) { OLgridEntry *ge = grid[gloc.vert][gloc.horiz]->get_next(); while (ge) { OLentry *ent = ge->get_entry(); // Clear the flag. ent->alreadyDrawn = False; ge = ge->get_next(); } } } } } void Locator::grid_covering_area(GLoc& start,GLoc& finish,const Area& area) { Pos aPos; Size aSize; area.get_rect(aPos,aSize); start.horiz = (int)floor((aPos.x / WSQUARE_WIDTH)/(float)OL_GRID_COL_MAX) - 1; start.vert = (int)floor((aPos.y / WSQUARE_HEIGHT)/(float)OL_GRID_ROW_MAX) - 1; finish.horiz = (int)ceil(ceil((float)(aPos.x + aSize.width) / (float)WSQUARE_WIDTH)/ (float) OL_GRID_COL_MAX) + 1; finish.vert = (int)ceil(ceil((float)(aPos.y + aSize.height)/(float)WSQUARE_HEIGHT)/ (float) OL_GRID_ROW_MAX) + 1; } void Locator::register_contexts() { // As good a place as any to put this call. Ability::register_abilities(); // Set all contexts to NULL. int n; for (n = 0; n < A_CLASSES_NUM; n++) { contexts[n] = NULL; } // Here we go... register_context(&Explosion::context); register_context(&Fire::context); register_context(&FireExplosion::context); register_context(&NProtection::context.physicalContext); register_context(&TProtection::context.physicalContext); register_context(&XProtection::context.physicalContext); register_context(&Trapdoor::context.physicalContext); register_context(&Home::context.physicalContext); register_context(&Shell::context.movingContext.physicalContext); register_context(&SwapShell::context.movingContext.physicalContext); register_context(&Lance::context.movingContext.physicalContext); register_context(&Laser::context.movingContext.physicalContext); register_context(&FrogShell::context.movingContext.physicalContext); register_context(&Fireball::context.movingContext.physicalContext); register_context(&Missile::context.movingContext.physicalContext); register_context(&Star::context.movingContext.physicalContext); register_context(&Blood::context.movingContext.physicalContext); register_context(&GreenBlood::context.movingContext.physicalContext); register_context(&OilDroplet::context.movingContext.physicalContext); register_context(&Grenade::context.movingContext.physicalContext); register_context(&Napalm::context.movingContext.physicalContext); register_context(&Egg::context.movingContext.physicalContext); register_context(&Xit::context.fallingContext.movingContext.physicalContext); register_context(&Flag::context.fallingContext.movingContext.physicalContext); register_context(&Rock::context.heavyContext.fallingContext.movingContext.physicalContext); register_context(&Weight::context.heavyContext.fallingContext.movingContext.physicalContext); register_context(&AltarOfSin::context.fallingContext.movingContext.physicalContext); register_context(&Doppel::context.itemContext.fallingContext. movingContext.physicalContext); register_context(&Cloak::context.fallingContext. movingContext.physicalContext); register_context(&Transmogifier::context.itemContext.fallingContext. movingContext.physicalContext); register_context(&MedKit::context.itemContext.fallingContext. movingContext.physicalContext); register_context(&CrackPipe::context.autoUseContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&Caffine::context.autoUseContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&PCP::context.autoUseContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&NShield::context.autoUseContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&TShield::context.autoUseContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&Bomb::context.itemContext.fallingContext. movingContext.physicalContext); register_context(&Chainsaw::context.weaponContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&Pistol::context.weaponContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&MGun::context.weaponContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&Lancer::context.weaponContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&AutoLancer::context.weaponContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&FThrower::context.weaponContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&Launcher::context.weaponContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&Grenades::context.weaponContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&Napalms::context.weaponContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&Stars::context.weaponContext.itemContext.fallingContext. movingContext.physicalContext); register_context(&Swapper::context.gunContext.weaponContext.itemContext. fallingContext.movingContext.physicalContext); register_context(&FrogGun::context.gunContext.weaponContext.itemContext. fallingContext.movingContext.physicalContext); register_context(&DogWhistle::context.weaponContext.itemContext. fallingContext.movingContext.physicalContext); register_context(&DemonSummoner::context.weaponContext.itemContext. fallingContext.movingContext.physicalContext); register_context(&Enforcer::creatureContext.movingContext.physicalContext); register_context(&Frog::creatureContext.movingContext.physicalContext); register_context(&Hero::creatureContext.movingContext.physicalContext); register_context(&Ninja::creatureContext.movingContext.physicalContext); register_context(&Alien::creatureContext.movingContext.physicalContext); register_context(&RedHugger::creatureContext. movingContext.physicalContext); register_context(&GreenHugger::creatureContext. movingContext.physicalContext); register_context(&ChopperBoy::creatureContext.movingContext.physicalContext); register_context(&Seal::creatureContext.movingContext.physicalContext); register_context(&FireDemon::creatureContext.movingContext.physicalContext); register_context(&Dragon::creatureContext.movingContext.physicalContext); register_context(&Walker::creatureContext.movingContext.physicalContext); register_context(&Dog::creatureContext.movingContext.physicalContext); register_context(&Mutt::creatureContext.movingContext.physicalContext); register_context(&Yeti::creatureContext.movingContext.physicalContext); register_context(&PhysMover::context); assert(contextCount <= A_CLASSES_NUM); // Some sanity checking, see if something is wrong with the // newly programmed PhysicalContexts. for (n = 0; n < A_CLASSES_NUM; n++) { const PhysicalContext *cx = contexts[n]; if (cx) { // Make sure that the index of a context is the same as it's classId. assert(cx->classId == n); // If potentialEnemy, enemyWeight is greater than zero. // Not the converse, see Seals. if (cx->potentialEnemy) { assert(cx->enemyWeight > 0); } assert(cx->enemyWeight >= 0); assert(cx->create); // Should have a get_stats() method iff one of the stats* flags is // set. assert((cx->statsCreations || cx->statsUses || cx->statsDeaths) == (cx->get_stats != NULL)); // Can't act as both a weapon and otherItem. assert(!(cx->potentialWeapon && cx->potentialOtherItem)); // If Physical could be created as either a weapon or otherItem, make // sure objectWorldPercent is greater than zero. assert((cx->potentialWeapon || cx->potentialOtherItem) == (cx->objectWorldPercent > 0)); assert(cx->objectWorldPercent >= 0); } } if (contextCount < A_CLASSES_NUM) { cout << "ERROR: Locator::register_contexts(): Not all classes have been " << "registered" << endl; } } void Locator::register_context(const PhysicalContext *context) { contexts[context->classId] = context; // int cCountPre = contextCount; contextCount++; // int cCountPost = contextCount; // cerr << "cCountPre is " << cCountPre << " post is " << cCountPost << // " contextCount@ " << &contextCount << " is " << contextCount << endl; } Boolean Locator::submitSoundRequest(SoundRequest req) { // Don't bother submitting or remembering the sound request if no sound. SoundName name = req.get_sound_name(); // Don't use lookup, because we want to submit the sound if we are // a Server sending to Client. if (!(name > 0 && name < SoundNames::SOUND_MAX)) { return False; } // Server will rember recent sounds so it can send them to the Client. if (rememberSounds && soundsNum < OL_RECENT_SOUNDS_MAX) { sounds[soundsNum] = req; soundsNum++; } if (!SoundNames::lookup(name)) { return False; } return soundManager->submitRequest(req); } xevil-2.02r2.orig/cmn/physical.cpp0100644000175000017500000063731507041510466016421 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "physical.cpp" #include "stdafx.h" #if X11 #ifndef NO_PRAGMAS #pragma implementation "physical.h" #endif #endif // Include Files #include "xdata.h" #include "physical.h" #include #if X11 #include #endif #if WIN32 #include #endif #include "utils.h" #include "coord.h" #include "area.h" #include "world.h" #include "id.h" #include "intel.h" #include "locator.h" #include "physical.h" #include "actual.h" #include "bitmaps/transform/transform.bitmaps" // Defines #define VEL_SMALL 1 #define MOVING_ANIM_TIME 2 #define MOVING_EXTRA_VEL_MAX 9 #define FALLING_VEL_MAX 12 #define HEAVY_DAMAGE_VEL 3 #define ITEM_CAN_TAKE_TIME 15 #define ITEM_DROP_OFFSET_WIDTH 20 #define ITEM_DROP_OFFSET_HEIGHT 20 #define ITEM_CLASS_MAX 2 // How items of a given class can be held. #define LIFTABLE_EXCLUDED_TIME ITEM_CAN_TAKE_TIME #define EXTRA_VEL_DAMP 1 #define DROP_SPEED 2 #define CREATURE_ACCELERATION_MAX 40 #define CREATURE_AIR_SPEED_MAX 40 #define CREATURE_CENTER_SPEED_MAX 40 #define CREATURE_CLIMB_SPEED_MAX 40 #define CREATURE_CRAWL_SPEED_MAX 40 #define CREATURE_JUMP_MAX 40 #define CREATURE_HIGH_VIBRATE 3 #define CREATURE_HEALTH_MAX_MAX 2000 #define CREATURE_DROPLETS_MAX 10 // Max droplets of blood per hit. // Greater than 25 damage to get second droplet #define CREATURE_DROPLET_FACTOR .04 #define FIGHTER_DAMAGE_MAX 150 #define FIGHTER_SLIDE_TIME 4 #define SHOT_OFFSET 19 #define HEAT_MAX 25 #define FLYING_GRAV_VEL_CUTOFF 1 #define CORPSE_TIME 140 #define FLASH_TIME 5 #define TOUCHABLE_RADIUS 20 //11 //10 #define HUGGER_TIME 90 #define USER_CYCLE_TIME 50 #define SPLATTER_SPEED 8 #if WIN32 #define M_PI 3.14159265 #endif //// Functions Physical::Physical(const PhysicalContext &p_c,WorldP w,LocatorP l) { world = w; locator = l; command = IT_NO_COMMAND; pc = &p_c; health = healthNext = pc->health; mass = massNext = pc->mass; // dontCollide initializes itself. intel = NULL; if (! staticValid) { init_static(); } deleteMe = False; mapped = mappedNext = True; noDeathDelete = False; dieCalled = False; heat = heatNext = 0; previousHeatWasSecondary = False; dontCollideComposite = COMPOSITE_ID_NONE; // Add 1 to FLASH_TIME to draw for proper number of turns. Timer t(FLASH_TIME + 1); flashTimer = t; quietDeath = False; netData = NULL; creationOk = True; } Physical::Physical() { assert(0); } Physical::Physical(InStreamP in,const PhysicalContext &p_c, WorldP w,LocatorP l) { creationOk = True; world = w; locator = l; command = IT_NO_COMMAND; pc = &p_c; mass = massNext = pc->mass; // dontCollide initializes itself. intel = NULL; if (! staticValid) { init_static(); } deleteMe = False; noDeathDelete = False; previousHeatWasSecondary = False; dontCollideComposite = COMPOSITE_ID_NONE; quietDeath = False; netData = NULL; _update_from_stream(in,False); } void Physical::update_from_stream(InStreamP in) { // Things should be ok to start with, child classes haven't had a chance // to call creation_failed() yet. assert(creationOk); _update_from_stream(in,True); } void Physical::_update_from_stream(InStreamP in,Boolean alreadyExists) { if (alreadyExists) { // If updating from stream, not creating from stream, // the id read in should be the same as the existing one. Id streamId(in); if (!(id == streamId)) { creationOk = False; } } else { // create_from_stream(), old value of id should not be set yet. id.read(in); } u_short h2 = in->read_short(); signed short h1 = (signed short)h2; health = (Health)h1; healthNext = health; heat = in->read_short(); heatNext = heat; // mapped, dieCalled, and flash u_char flags = in->read_char(); mapped = (flags & 0x1); mappedNext = mapped; // Not really needed, just to check an assertion. dieCalled = (flags & 0x2); Boolean flash = (flags & 0x4); if (flash) { // Will never be clocked anyway. flashTimer.set(1); } else { flashTimer.set(0); } // May stil be invalidated by child classes. creationOk = creationOk && in->alive(); LocatorP locator = get_locator(); IntelId iId; iId.read(in); intel = locator->lookup(iId); // may be NULL. } int Physical::get_write_length() { return id.get_write_length() + // id sizeof(short) + // health // intel->get_write_length() + // intel sizeof(short) + // heat sizeof(char)+ // mapped, dieCalled, flash Identifier::get_write_length(); // intelId } void Physical::write(OutStreamP out) { id.write(out); signed short h1 = (signed short)health; u_short h2 = (u_short)h1; out->write_short(h2); // intel assert(heat < USHRT_MAX); out->write_short((u_short)heat); u_char flags = 0x0; flags |= mapped; flags |= (dieCalled << 1); flags |= (!flashTimer.ready() << 2); out->write_char(flags); IntelId iId; if (intel) { iId = intel->get_intel_id(); } iId.write(out); } Physical::~Physical() { delete netData; } Health Physical::get_health_max() { return pc->health; } Dir Physical::get_dir() { return CO_air; } int Physical::get_drawing_level() { return 1; } Vel Physical::get_vel() // Returns (0,0) { Vel vel; return vel; } Boolean Physical::is_moving() { return False; } Boolean Physical::is_shot() { return False; } Boolean Physical::is_item() { return False; } Boolean Physical::is_shield() { return False; } Boolean Physical::is_bomb() { return False; } Boolean Physical::is_weapon() { return False; } Boolean Physical::is_cutter() { return False; } Boolean Physical::is_gun() { return False; } Boolean Physical::is_creature() { return False; } AbilityP Physical::get_ability(AbilityId) { return NULL; } HolderP Physical::get_holder() { return NULL; } LocomotionP Physical::get_locomotion() { return NULL; } CompositeP Physical::get_composite() { return NULL; } Boolean Physical::is_auto_use() { return False; } Boolean Physical::is_drugs() { return False; } Boolean Physical::is_liftable() { return False; } Boolean Physical::collidable() { return True; } PHsig Physical::get_id(Id &outside_id) { // used to have check for idValid outside_id = id; return PH_NO_SIG; } void Physical::get_followers(PtrList &) { // Default is no followers. } void Physical::follow(const Area &,Dir,Boolean) { assert(0); } void Physical::set_id(const Id &new_id) { id = new_id; // used to have check for idValid } NetDataP Physical::get_net_data() { if (!netData) { netData = new NetData(); } return netData; } Boolean Physical::command_repeatable(ITcommand c) { switch (c) { case IT_WEAPON_CHANGE: case IT_WEAPON_DROP: case IT_ITEM_USE: case IT_ITEM_CHANGE: case IT_ITEM_DROP: return False; // Allow repeat for all movement keys and for WEAPON_USE default: return True; } } void Physical::heal() { set_health_next(get_health_max()); } void Physical::set_intel(IntelP i) { intel = i; if (i) { i->set_id(id); } } void Physical::set_mapped_next(Boolean val) { mappedNext = val; } void Physical::flash() { flashTimer.set(); } Boolean Physical::corporeal_attack(PhysicalP,int damage) { // Ignore "superficial" damage. if (damage > 0 && // alive_next() checks if something else has already killed this. alive() && alive_next()) { healthNext = health - damage; } // For now dead objects return True. I.e. corpses will bleed. return True; } void Physical::heat_attack(PhysicalP,int h,Boolean secondary) { // Secondary means the attack came from colliding with something that was // on fire, as opposed to directly being hit by fire, e.g. a flame thrower. assert(h >= 0); // Don't propagate fires. if (! (secondary && previousHeatWasSecondary)) { heatNext = heat + h; if (heatNext > HEAT_MAX) { heatNext = HEAT_MAX; } if (heat == 0 && heatNext > 0) { LocatorP l = get_locator(); ostrstream str; str << get_class_name() << " is on fire." << ends; locator->message_enq(str.str()); } } previousHeatWasSecondary = secondary; } Boolean Physical::swap_protect() { return False; } Boolean Physical::frog_protect() { return False; } void Physical::avoid(PhysicalP) { } void Physical::collide(PhysicalP) { } void Physical::set_quiet_death() { quietDeath = True; } void Physical::act() { const Area &area = get_area(); /* The knocked out of world check is now done inside the locator. */ if (heatNext > 0) { Pos pos; Size size; area.get_rect(pos,size); pos.x += Utils::choose(size.width); // Start fire in upper-half. if (size.height > 1) { pos.y += Utils::choose((int)(size.height * .5)); } LocatorP locator = get_locator(); PhysicalP fire = new Fire(get_world(),locator,pos); fire->set_dont_collide(this->get_id()); locator->add(fire); heatNext--; // alive_next() checks if something else has already killed this. if (alive() && alive_next()) { healthNext -= Fire::get_damage(); } } // Call non-virtual version, to handle following. // Parent update_area_next()'s will already have been called as // necessary. _update_area_next(False); } void Physical::update() { mass = massNext; command = IT_NO_COMMAND; // Fire damage is now in Physical::act health = healthNext; mapped = mappedNext; heat = heatNext; flashTimer.clock(); } void Physical::die() { if (dieCalled) { cerr << "Physical::die called twice" << endl; } if (healthNext >= 0) { cerr << "Physical::die, healthNext >= 0, value is " << healthNext << endl; healthNext = -1; } if (health < 0) { cerr << "Physical::die, health already less than 0, value is " << health << endl; } dieCalled = True; if (intel) { intel->die(); } intel = NULL; if (!noDeathDelete) { set_delete_me(); } } void Physical::dr_clock() { // Make followers follow, setting current and next variables. _update_area_next(True); } ClassId Physical::get_weapon_string(const char *&str) { // static const char noneStr[] = "none"; str = "none"; return A_None; } void Physical::drop_all() { } Dir Physical::get_dir_next() { return CO_air; } ITcommand Physical::get_command() { return command; } void Physical::init_static() { // CO_air_* is not really a unit. unitAccs[CO_center_R].ddx = 1.0f; unitAccs[CO_center_L].ddx = -1.0f; unitAccs[CO_air_R].ddx = .4f; unitAccs[CO_air_L].ddx = -.4f; unitAccs[CO_air_R].ddy = unitAccs[CO_air_L].ddy = -1.0f; // -0.95 unitAccs[CO_air_UP].ddy = -1.0f; unitAccs[CO_air_DN].ddy = 1.0f; unitAccs[CO_center_R].ddy = unitAccs[CO_center_L].ddy = unitAccs[CO_air].ddy = unitAccs[CO_air].ddx = unitAccs[CO_center].ddx = unitAccs[CO_center].ddy = unitAccs[CO_air_UP].ddx = unitAccs[CO_air_DN].ddx = 0.0f; unitAccs[CO_r].ddx = unitAccs[CO_r].ddy = unitAccs[CO_dn].ddx = unitAccs[CO_dn].ddy = unitAccs[CO_l].ddx = unitAccs[CO_l].ddy = unitAccs[CO_up].ddx = unitAccs[CO_up].ddy = 0.0f; unitAccs[CO_r_DN].ddx = unitAccs[CO_r_UP].ddx = unitAccs[CO_dn_R].ddy = unitAccs[CO_dn_L].ddy = unitAccs[CO_l_DN].ddx = unitAccs[CO_l_UP].ddx = unitAccs[CO_up_R].ddy = unitAccs[CO_up_L].ddy = unitAccs[CO_climb_DN].ddx = unitAccs[CO_climb_UP].ddx = 0.0f; unitAccs[CO_r_DN].ddy = unitAccs[CO_l_DN].ddy = unitAccs[CO_climb_DN].ddy = 0.5f; unitAccs[CO_r_UP].ddy = unitAccs[CO_l_UP].ddy = unitAccs[CO_climb_UP].ddy = -0.5f; unitAccs[CO_dn_R].ddx = unitAccs[CO_up_R].ddx = 0.5f; unitAccs[CO_dn_L].ddx = unitAccs[CO_up_L].ddx = -0.5f; int n; for (n = 0; n < 16; n++) { float theta = (float)M_PI * n / 8.0f; unitAccs[CO_R + n].ddx = (float)cos(theta); unitAccs[CO_R + n].ddy = (float)sin(theta); } for (n = 0; n < CO_DIR_MAX; n++) { unitVels[n] = unitAccs[n]; } staticValid = True; } void Physical::update_area_next(Boolean currentAndNext) { _update_area_next(currentAndNext); } void Physical::_update_area_next(Boolean currentAndNext) { // Whether currentAndNext is true or not, get_area_next() and // get_dir_next() should give the correct results here, because // Physical::_update_area_next() is called last. const Area &areaNext = get_area_next(); if (currentAndNext) { // sanity check const Area &area = get_area(); if (!(area == areaNext)) { cerr << "Physical::_update_area_next() area does not equal " << "areaNext when expected." << endl; } } Dir dirNext = get_dir_next(); // Make all followers follow. PtrList followers; get_followers(followers); for (int n = 0; n < followers.length(); n++) { PhysicalP p = (PhysicalP)followers.get(n); p->follow(areaNext,dirNext,currentAndNext); } } Boolean Physical::staticValid = False; Acc Physical::unitAccs[CO_DIR_MAX]; Vel Physical::unitVels[CO_DIR_MAX]; Protection::Protection(const ProtectionContext &pr_c,ProtectionXdata &x_data, WorldP w,LocatorP l,const Area &ar) : Physical(pr_c.physicalContext,w,l) { area = areaNext = areaBaseNext = ar; delta = 0; pXdata = &x_data; prc = &pr_c; } Protection::Protection(InStreamP in, const ProtectionContext &pr_c, ProtectionXdata &x_data, WorldP w, LocatorP l) : Physical(in,pr_c.physicalContext,w,l) { pXdata = &x_data; prc = &pr_c; // Leave areaBaseNext as the default. _update_from_stream(in); } void Protection::update_from_stream(InStreamP in) { Physical::update_from_stream(in); _update_from_stream(in); } void Protection::_update_from_stream(InStreamP in) { delta = in->read_signed_char(); area.read(in); areaNext = area; } int Protection::get_write_length() { return Physical::get_write_length() + sizeof(char) + // delta Area::get_write_length(); // area } void Protection::write(OutStreamP out) { Physical::write(out); if (!(area == areaNext)) { cerr << "Protection::write(), area != areaNext." << endl; } out->write_signed_char(delta); area.write(out); } Boolean Protection::collidable() { return False; } const Area &Protection::get_area() { return area; } const Area &Protection::get_area_next() { return areaNext; } void Protection::follow(const Area &followeeArea,Dir, Boolean currentAndNext) { areaBaseNext = followeeArea; Pos basePos; Size baseSize; areaBaseNext.get_rect(basePos,baseSize); Pos nPos(basePos.x - delta,basePos.y - delta); Size nSize; nSize.width = baseSize.width + 2 * delta; nSize.height = baseSize.height + 2 * delta; if (nSize.width < 0) { nSize.width = 0; } if (nSize.height < 0) { nSize.height = 0; } // Don't get bigger than a grid cell. if (nSize.width > OL_GRID_WIDTH) { nSize.width = OL_GRID_WIDTH; } if (nSize.height > OL_GRID_HEIGHT) { nSize.height = OL_GRID_HEIGHT; } Area nArea(AR_RECT,nPos,nSize); areaNext = nArea; update_area_next(currentAndNext); } void Protection::act() { _act(); Physical::act(); } void Protection::update() { area = areaNext; Physical::update(); } void Protection::dr_clock() { // We are not really doing all the right things here. // should do animation purely on the Client side like Moving does. // areaNext should be computed in _act(), not in follow(). // We don't know if dr_clock() will be called before, or after // follow(). Of course, we already have the same problem with StandAlone. _act(); Physical::dr_clock(); } void Protection::update_area_next(Boolean currentAndNext) { // Also set current state. if (currentAndNext) { area = areaNext; } Physical::update_area_next(currentAndNext); } void Protection::_act() { delta++; if (delta == DELTA_MAX) { delta = DELTA_MIN; } } Moving::Moving(const MovingContext &m_c, MovingXdata &x_data, WorldP w, LocatorP l, const Pos &raw_pos, Dir dirInitial) : Physical(m_c.physicalContext,w,l) { movingXdata = &x_data; mc = &m_c; rawPos = rawPosNext = raw_pos; rawPosChanged = False; dir = dirNext = dirInitial; /* Don't change. See Shell. */ if (m_c.animMax[dir]) { movingAnimNum = Utils::choose(m_c.animMax[dir]); } else { movingAnimNum = 0; } assert(movingAnimNum < PH_ANIM_MAX); // offsets[CO_air] and sizes[CO_air] are guaranteed to be set. // Be careful to set movingXdata and mc before calling get_offsets(). Size *offsets = get_offsets(); Area nArea(AR_RECT,raw_pos + offsets[dir],mc->sizes[dir]); area = areaNext = nArea; WorldP world = get_world(); hitWall = hitWallNext = !world->open(area); moverVel.set_zero(); extraVelNextSet = False; assert(context_valid()); // invisible initializes itself. invisibleNext = 0; attackHook = NULL; // NOTE: protection initializes itself. }; Moving::Moving() { assert(0); } Moving::Moving(InStreamP in, const MovingContext &m_c, MovingXdata &x_data, WorldP w, LocatorP l) : Physical(in,m_c.physicalContext,w,l) { movingXdata = &x_data; mc = &m_c; rawPosChanged = False; hitWall = hitWallNext = False; moverVel.set_zero(); extraVelNextSet = False; assert(context_valid()); // invisible initializes itself. invisibleNext = 0; attackHook = NULL; movingAnimNum = 0; // Don't choose randomly, we don't know the dir. _update_from_stream(in); } DEFINE_UPDATE_FROM_STREAM(Moving,Physical) void Moving::_update_from_stream(InStreamP in) { // invisible and movingAnimNum u_char flags = in->read_char(); Boolean isInvisible = (flags & 0x80) >> 7; if (isInvisible) { // Don't really have to worry about this time running out, // object will get nuked if CLIENT_OLD_OBJECT_KILL turns pass without // another update. invisible.set(PH_INVISIBLE_TIME); } else { // Set not invisible. invisible.set(0); } // All but high bit, 128 frames maximum // movingAnimNum = flags & 0x7F; rawPos.read(in); rawPosNext = rawPos; area.read(in); areaNext = area; Dir dirRead = (Dir)in->read_char(); // Changing direction, so reset animation. if (dir != dirRead) { movingAnimNum = 0; } dir = dirRead; dirNext = dir; NetDataP netData = get_net_data(); // CHANGED: Ignore animation we read in, just increment whatever we have. // // Make sure we have a valid animation frame. // X has less frames than Windows sometimes. if (mc->animMax[dir]) { // Only animate if this is the first update_from_stream() coming in this // turn. if (!netData->clocked_this_turn()) { // new_anim_num() uses the timer. movingAnimNum = new_anim_num(movingAnimNum,mc->animMax[dir]); //movingAnimNum = movingAnimNum % mc->animMax[dir]; } } else { // For funny things like Fireball. movingAnimNum = 0; } protection.read(in); vel.read(in); velNext = vel; assert(movingAnimNum < PH_ANIM_MAX); // Do not call update_area_next(), or do anything to affect followers. } int Moving::get_write_length() { return Physical::get_write_length() + sizeof(char) + // movingAnimNum, invisible Pos::get_write_length() + // rawPos Area::get_write_length() + // area sizeof(char) + // dir protection.get_write_length() + // protection Vel::get_write_length(); // vel // Not sending extraVel, only used for vibrating right now. } void Moving::write(OutStreamP out) { Physical::write(out); // Put invisible on the front of movingAnimNum. assert(movingAnimNum < 128); u_char flags = (u_char)movingAnimNum; Boolean isInvisible = is_invisible(); flags |= (isInvisible & 0x1) << 7; out->write_char(flags); // assert(rawPos == rawPosNext); if (!(rawPos == rawPosNext)) { cerr << "ERROR: rawPos and rawPosNext don't match for some " << get_class_name() << endl; } rawPos.write(out); // assert(area == areaNext); if (!(area == areaNext)) { cerr << "ERROR: area and areaNext don't match for some " << get_class_name() << endl; } area.write(out); if (dir != dirNext) { cerr << "ERROR: dir and dirNext don't match for some " << get_class_name() << endl; } // assert(dir == dirNext); out->write_char((char)dir); protection.write(out); if (!(vel == velNext)) { cerr << get_class_name() << " vel does not equal velNext" << endl; } vel.write(out); } Boolean Moving::is_moving() { return True; } const Area &Moving::get_area() { return area; } const Area &Moving::get_area_next() { return areaNext; } Vel Moving::get_vel() { return vel; } Boolean Moving::ignore_walls() { return False; } Dir Moving::get_dir() { return dir; } Id Moving::get_protection() { return protection; } void Moving::get_followers(PtrList &list) { // The protection. LocatorP locator = get_locator(); PhysicalP p = locator->lookup(protection); if (p) { list.add(p); } Physical::get_followers(list); } void Moving::follow(const Area &followeeArea,Dir, Boolean currentAndNext) { Pos pos = followeeArea.get_middle(); // Don't use set_middle_next(), because that won't handle currentAndNext // properly. _set_middle_next() exists for this purpose. _set_middle_next(pos); update_area_next(currentAndNext); } // This is the version other objects call on this one during the act() // phase. void Moving::set_middle_next(const Pos &middleNext) { _set_middle_next(middleNext); update_area_next(False); } // Used by children who may have to call update_area_next(). void Moving::_set_middle_next(const Pos &middleNext) { Pos pos; Size size; area.get_rect(pos,size); // BUG: This won't work right if a child overrides get_size_offset_next(). Size *offsets = get_offsets(); Pos rPosNext = middleNext - offsets[dir] - 0.5f * size; /* Important to set rawPosChanged if called before act. */ set_raw_pos_next(rPosNext); } void Moving::relocate(const Pos &rPos) { assert(area == areaNext); assert(dir == dirNext); assert(vel == velNext); assert(rawPos == rawPosNext); // assert(extraVel == extraVelNext); assert(hitWall == hitWallNext); Pos pos; Size size; area.get_rect(pos,size); Size delta = pos - rawPos; rawPos = rawPosNext = rPos; Area nArea(AR_RECT,rawPos + delta,size); area = areaNext = nArea; hitWall = hitWallNext = False; } void Moving::set_mapped_next(Boolean val) { LocatorP locator = get_locator(); PhysicalP p = locator->lookup(protection); if (p) { p->set_mapped_next(val); } Physical::set_mapped_next(val); } void Moving::set_protection(const Id &id) { protection = id; } void Moving::set_invisible_next(int turns) { assert(mc->invisibility); if (turns == -1) { // Means turn off invisibility. invisibleNext = -1; } else { // Don't want to reduce the value if already set. invisibleNext = Utils::maximum(invisibleNext,turns); // Works even if invisibleNext was formerly -1. } } Boolean Moving::corporeal_attack(PhysicalP killer,int damage) { // Protection from corporeal attacks. LocatorP l = get_locator(); ProtectionP p = (ProtectionP)l->lookup(protection); if (p && p->corporeal_protect(damage)) { return False; } return Physical::corporeal_attack(killer,damage); } void Moving::heat_attack(PhysicalP killer,int h,Boolean secondary) { // Protection from heat. LocatorP l = get_locator(); ProtectionP p = (ProtectionP)l->lookup(protection); if (p && p->heat_protect(h,secondary)) { return; } Physical::heat_attack(killer,h,secondary); } void Moving::act() { // Just set next variables. _act(); // Don't run into walls. _update_area_next(False); Physical::act(); } // Used by act() and dr_clock(). void Moving::_act() { // Note: no restrictions on vel. (There are in Creature.) extraVel.limit((float)MOVING_EXTRA_VEL_MAX); Vel sumVel = velNext + extraVel + moverVel; moverVel.set_zero(); extraVel.damp((float)EXTRA_VEL_DAMP); if (!rawPosChanged) { rawPosNext = rawPos + sumVel; } } int Moving::new_anim_num(int animPrev,int animMax) { assert(animMax > 0 && animPrev >= 0); int ret = animPrev; // Timer so that one frame may be shown over multiple turns. if (animTimer.ready()) { ret = (ret + 1) % animMax; animTimer.set(get_anim_time()); } animTimer.clock(); assert(ret < PH_ANIM_MAX); return ret; } void Moving::update() { _update(); Physical::update(); } void Moving::_update() { rawPos = rawPosNext; rawPosChanged = False; area = areaNext; if(mc->animMax[dir]) { movingAnimNum = new_anim_num(movingAnimNum,mc->animMax[dir]); } // If direction changed, reset animation counter. if (dir != dirNext) { movingAnimNum = 0; } dir = dirNext; hitWall = hitWallNext; vel = velNext; if (extraVelNextSet) { extraVel = extraVelNext; extraVelNextSet = False; } // Clock first, so will be invisible for, e.g. 1 turn if // invisibleNext is set to 1. invisible.clock(); if (invisibleNext > 0) { // Never reduce the amount of time invisible. invisible.set(Utils::maximum(invisible.get_remaining(),invisibleNext)); } // Turn off invisibility. if (invisibleNext == -1) { invisible.set(0); } // invisibleNext doesn't act like the other next variables, it is just // non-zero for 1 turn. invisibleNext = 0; } void Moving::avoid(PhysicalP other) { const Area &otherArea = other->get_area(); Size offset = area.avoid_no_up(otherArea); set_raw_pos_next(rawPos + offset); } void Moving::collide(PhysicalP other) { Mass m1 = this->get_mass(); Mass m2 = other->get_mass(); // Don`t have collisions with objects of zero mass. if (m1 > 0 && m2 > 0) { Vel v1 = this->get_vel(); Vel v2 = other->get_vel(); Area a1 = this->get_area(); Area a2 = other->get_area(); Pos p1 = a1.get_middle(); Pos p2 = a2.get_middle(); Size delta = p2 - p1; // Fix the bug with objects being dragged along. if (delta.dot(v1) > 0 || // p1 running into p2 delta.dot(v2) < 0) { // p2 running into p1 Vel newVel(compute_collision(m1,v1.dx,m2,v2.dx), compute_collision(m1,v1.dy,m2,v2.dy)); set_vel_next(0); extraVel = newVel; } } } void Moving::die() { LocatorP locator = get_locator(); PhysicalP p = locator->lookup(protection); // Must be careful about killing p because we are in the die() phase. if (p && !p->die_called()) { p->kill_self(); p->die(); } Physical::die(); } void Moving::dr_clock() { _act(); // Keep from going through walls. _update_area_next(False); // We use False instead of True here, because _update() will copy the // next variables into the current ones. _update(); Physical::dr_clock(); } Touching Moving::offset_generator(Dir dir) { return Coord::dir_to_touching(dir); } Dir Moving::get_dir_next() { return dirNext; } int Moving::get_anim_time() { return MOVING_ANIM_TIME; } Size *Moving::get_offsets() { check_generate_offsets(*mc,movingXdata); return movingXdata->offsets; } Boolean Moving::draw_outline(ColorNum &colorNum) { if (is_invisible()) { return False; } // Draw outline around object if controlled by a Human or if a slave to // a Human master. IntelP intel = get_intel(); IntelP master = NULL; if (intel) { if (intel->is_human()) { colorNum = ((HumanP)intel)->get_color_num(); return True; } else { LocatorP locator = get_locator(); master = locator->lookup(((MachineP)intel)->get_master_intel_id()); if (master && master->is_human()) { colorNum = ((HumanP)master)->get_color_num(); return True; } } } return False; } Boolean Moving::generate_masks() { return False; } void Moving::update_area_next(Boolean currentAndNext) { _update_area_next(currentAndNext); Physical::update_area_next(currentAndNext); } void Moving::get_size_offset_next(Size &size,Size &offset,Dir dir) { Size *offsets = get_offsets(); size = mc->sizes[dir]; offset = offsets[dir]; } void Moving::set_size_offset_current_and_next(const Size &size, const Size &offset) { Area nArea(AR_RECT,rawPos + offset,size); area = areaNext = nArea; } void Moving::patch_size_and_size_next() { // Make rawPos{Next} and area{Next} fit with the local implemenation's // (virtual) size and offset. Do this by centering on the area read in // from the remote machine. // local size and offset Size lSize,lOffset; assert(dir == dirNext); get_size_offset_next(lSize,lOffset,dir); // remote pos and size Pos rPos; Size rSize; area.get_rect(rPos,rSize); // Do nothing if they already match if (!(lSize == rSize)) { // A hack to have Creature-specific knowledge here, but fuck it. // This whole method is a hack. Touching touching = CO_dn; // for objects on the ground. if (is_creature()) { touching = Coord::dir_to_touching(dir); } // Create newPos so that touching is preserved over the change in size. Pos newPos; // Get X coordinate if (touching == CO_l) { newPos.x = rPos.x; } else if (touching == CO_r) { newPos.x = rPos.x + rSize.width - lSize.width; } else { newPos.x = rPos.x + (int)(0.5 * (rSize.width - lSize.width)); } // Get Y coordinate if (touching == CO_up) { newPos.y = rPos.y; } else if (touching == CO_dn) { newPos.y = rPos.y + rSize.height - lSize.height; } else { newPos.y = rPos.y + (int)(0.5 * (rSize.height - lSize.height)); } Area newArea(AR_RECT,newPos,lSize); area = newArea; areaNext = newArea; rawPos = newPos - lOffset; rawPosNext = rawPos; } } void Moving::_update_area_next(Boolean currentAndNext) { // Compute areaNext and hitWallNext. May modify rawPosNext or dirNext. Size size,off_set; get_size_offset_next(size,off_set,dirNext); Area first_guess(AR_RECT,rawPosNext + off_set,size); if (ignore_walls()) { areaNext = first_guess; hitWallNext = False; } else { WorldP world = get_world(); Size offset; // Use velNext to avoid ChopperBoy up down through wall bug. switch (world->open_offset(offset,first_guess,velNext)) { case W_NO_SIG: areaNext = first_guess; hitWallNext = False; break; case W_CLOSE: rawPosNext = rawPosNext + offset; areaNext = first_guess; areaNext.shift(offset); hitWallNext = True; /* Doesn't set velocity to 0. */ break; case W_CLOSE_BAD: rawPosNext = rawPosNext + offset; areaNext = first_guess; areaNext.shift(offset); hitWallNext = True; set_vel_next(0); // ???? break; case W_FAILURE: /* Abort all changes to area, rawPos, or dir. */ areaNext = area; rawPosNext = rawPos; dirNext = dir; hitWallNext = True; set_vel_next(0); // ??? Will help? 8/18/94 break; } } // Also apply changes to current value. if (currentAndNext) { rawPos = rawPosNext; area = areaNext; dir = dirNext; hitWall = hitWallNext; } } // If you get an assertion here, you probably messed up something in one of the // .bitmaps files. Boolean Moving::context_valid() { assert(PH_AUTO_GEN != 0 && PH_AUTO_GEN != (CMN_BITS_ID)1); /* if (!(mc->sizes[CO_climb] == mc->sizes[CO_climb_UP]) || !(mc->sizes[CO_climb] == mc->sizes[CO_climb_DN])) return False; */ /* frog.bitmaps */ // See Moving::corner #if 0 if ((mc->animMax[CO_r] && mc->animMax[CO_r_UP]) && !(mc->sizes[CO_r] == mc->sizes[CO_r_UP])) { assert(0); return False; } if ((mc->animMax[CO_r] && mc->animMax[CO_r_DN]) && !(mc->sizes[CO_r] == mc->sizes[CO_r_DN])) { assert(0); return False; } #endif if ((mc->animMax[CO_dn_R] && mc->animMax[CO_dn_L]) && !(mc->sizes[CO_dn_R] == mc->sizes[CO_dn_L])) { assert(0); return False; } #if 0 if ((mc->animMax[CO_l] && mc->animMax[CO_l_UP]) && !(mc->sizes[CO_l] == mc->sizes[CO_l_UP])) { assert(0); return False; } if ((mc->animMax[CO_l] && mc->animMax[CO_l_DN]) && !(mc->sizes[CO_l] == mc->sizes[CO_l_DN])) { assert(0); return False; } #endif if ((mc->animMax[CO_up_R] && mc->animMax[CO_up_L]) && !(mc->sizes[CO_up_R] == mc->sizes[CO_up_L])) { assert(0); return False; } // No longer true that CO_dn or CO_up have to be same size as CO_dn_[RL] and // CO_up_[RL], respectively. Hugger. // // Removed even more constraints for dog on the ceiling and walls. // No longer assert that all objects have CO_air. for (int dir = 0; dir < CO_DIR_MAX; dir++) { if (mc->animMax[dir] < 0) { assert(0); return False; } int m; for (m = 0; m < mc->animMax[dir]; m++) { if (mc->pixmapBits[dir][m] == 0) { // Auto-generated pixmaps will have 0 for several of the // frames. if (mc->pixmapBits[dir][0] != PH_AUTO_GEN) { assert(0); return False; } } #if X11 if (mc->maskBits[dir][m] == 0) { // Auto-generated frames will also have 0 for the // masks. // Also, masks are null for XPM specified pixmaps. if (mc->pixmapBits[dir][0] != PH_AUTO_GEN && !mc->useXPM) { assert(0); return False; } } #endif } // for m } // for dir return True; } float Moving::compute_collision(Mass m1,float v1,Mass m2,float v2) { assert(m1 > 0 && m2 > 0); float A = m1 * v1 + m2 * v2; float B = 0.5f * m1 * v1 * v1 + 0.5f * m2 * v2 * v2; float a = (float)(m1*m2 + m1*m1); float b = -2 * m1 * A; float c = A * A - 2 * m2 * B; float disc = b * b - 4 * a * c; /* Hack. If the discriminant is negative for some reason, returning 0 shouldn't do too much damage. */ if (disc < 0) { return 0.0f; } float v1_1 = (float)((-b + sqrt(disc))/ (2 * a)); float v1_2 = (float)((-b - sqrt(disc))/ (2 * a)); return fabs(v1_1 - v1) > fabs(v1_2 - v1) ? v1_1 : v1_2; } void Moving::check_generate_offsets(const MovingContext &mc,MovingXdata *xdata) { if (xdata->offsetsValid) { return; } Dir dir; // Double check sizeMax Size sizeMax; sizeMax.set(0,0); for (dir = 0; dir < CO_DIR_MAX; dir++) { sizeMax.width = Utils::maximum(mc.sizes[dir].width,sizeMax.width); sizeMax.height = Utils::maximum(mc.sizes[dir].height,sizeMax.height); } if (!(sizeMax == mc.physicalContext.sizeMax)) { cerr << mc.physicalContext.className << ": computed sizeMax (" << sizeMax.width << "," << sizeMax.height << "), doesn't equal that in context (" << mc.physicalContext.sizeMax.width << "," << mc.physicalContext.sizeMax.height << ")" << endl; assert(0); } // Some classes specify their own special code for generating offsets. if (mc.offsetGenerator) { Coord::generate_offsets(xdata->offsets,mc.sizes,sizeMax, mc.offsetGenerator); } else { Coord::generate_offsets(xdata->offsets,mc.sizes,sizeMax, Moving::offset_generator); } xdata->offsetsValid = True; } // Put the CMN_BITS_ID in bits 0-15, transform in 16-19, // isMask in bit 23, 24-31 are zero. void* Moving::compute_key(Dir dir,int animNum,Boolean isMask, const MovingContext* mc,MovingXdata*) { // We know unsigned int is 32 bits from XETP::check_sizes(). // We also know that void* is at least 32 bits. assert(mc->animMax[dir] > 0); // If auto-generated bitmap, use the transformations as part of the // SurfaceManager key. int tNum = 0; const TransformType* transforms = NULL; Dir baseDir = dir; if (mc->pixmapBits[dir][0] == PH_AUTO_GEN) { transforms = Transform2D::get_transforms(tNum,dir,mc->transformOverride); baseDir = Transform2D::get_base(dir,mc->transformOverride); } // Use the pixmap resource id as the base. u_int cmnBitsId = (unsigned int)mc->pixmapBits[baseDir][animNum]; // It is ok to call OneTransform::compute_key() even if there is no // transformation, will just return 0x0. u_int transKey = OneTransform::compute_key(transforms,tNum); // transKey must fit in 4 bits. assert((transKey & 0xfffffff0) == 0x0); // cmnBitsId must fit in 16 bits. assert((cmnBitsId & 0xffff0000) == 0x0); u_int ret = (transKey << 16) | cmnBitsId; // In bit 23. if (isMask) { ret |= 0x1 << 23; } // Top-most byte must be empty, see comments about unique keys in s_man.h. assert((ret & 0xff000000) == 0x0); return (void*)ret; } void Moving::check_auto_generated(const MovingContext& mc) { int n; int m; for (n = 0; n < CO_DIR_MAX; n++) { if (mc.animMax[n] > 0 && mc.pixmapBits[n][0] == PH_AUTO_GEN) { assert(!Transform2D::is_base(n,mc.transformOverride)); Dir base = Transform2D::get_base(n,mc.transformOverride); // Must be same number of frames. assert(mc.animMax[n] == mc.animMax[base]); // Size must be same as the transformed size of the base. int tNum; const TransformType* transforms = Transform2D::get_transforms(tNum,n,mc.transformOverride); Size trSize = mc.sizes[base]; for (m = 0; m < tNum; m++) { trSize = Transform2D::apply(transforms[m],trSize); } assert(mc.sizes[n] == trSize); } } } Shot::Shot(const ShotContext &s_c,ShotXdata &xdata,WorldP w,LocatorP l, const Pos &p,const Id &shoot_er, Dir shotDir,Dir movingDir) : Moving(s_c.movingContext,xdata,w,l,p,movingDir) { context = &s_c; shooter = shoot_er; const Vel *unitVels = get_unit_vels(); Vel initVel = (float)context->speed * unitVels[shotDir]; set_vel(initVel); set_vel_next(initVel); // This is a little funny, changing next values in the constructor. // Won't be clocked until next turn. if (hit_wall()) { kill_self(); } firstTurn = True; } CONSTRUCTOR_INTERNAL_NODE_IO(Shot,Moving,moving) { context = &cx; firstTurn = False; // shooter initializes itself. } Boolean Shot::is_shot() { return True; } void Shot::avoid(PhysicalP) {} void Shot::collide(PhysicalP other) { if (other->is_shot()) { return; } // If we hit out in a wall, don't hurt anyone. if (hit_wall() && firstTurn) { return; } // Will kill_self() in ::act(). LocatorP locator = get_locator(); PhysicalP p = locator->lookup(shooter); // p may be NULL. other->corporeal_attack(p,context->damage); kill_self(); } void Shot::act() { if (hit_wall()) { // Used to be hit_wall_next() but lances died too soon. kill_self(); } Moving::act(); } void Shot::update() { firstTurn = False; Moving::update(); } Droplet::Droplet(const DropletContext &cx,DropletXdata &x_data, WorldP w,LocatorP l,const Pos &raw_pos,const Vel &vel, Dir dirInitial) : Moving(cx.movingContext,x_data,w,l,raw_pos, (dirInitial == CO_air ? vel.get_dir() : dirInitial)) { // If True, the dir never changes for the droplet. staticDir = (dirInitial != CO_air); inAir = True; set_vel(vel); set_vel_next(vel); context = &cx; } CONSTRUCTOR_INTERNAL_NODE_IO(Droplet,Moving,moving) { inAir = False; // Do we need to stream this out? context = &cx; } Boolean Droplet::collidable() { return False; } void Droplet::act() { Dir dir = get_dir(); if (inAir) { Touching touching; Hanging hanging; const Area &area = get_area(); WorldP world = get_world(); MoverP dummy; world->compute_touching_hanging(touching,hanging,dummy,area); // If in air and hit wall, stick to wall. if (touching != CO_air) { if (!staticDir) { set_dir_next((Dir)touching); } set_vel_next(0); timer.set(context->dissolveTime); inAir = False; } // Account for gravity. else { Vel velNext = get_vel_next(); velNext.dy += PH_GRAVITY; // Reuse FALLING_VEL_MAX. velNext.limit((float)FALLING_VEL_MAX); set_vel_next(velNext); if (!staticDir) { set_dir_next(velNext.get_dir()); } } } else { if (timer.ready()) { kill_self(); } } // Note: doesn't check if world has changed. timer.clock(); Moving::act(); } Size Droplet::get_size_max(DropletType dType) { // Of course the whole point of OO programming is to avoid switch statements // like these. Can't do that with static fntns though. switch (dType) { case DROPLET_BLOOD: return Blood::get_size_max(); case DROPLET_GREEN_BLOOD: return GreenBlood::get_size_max(); case DROPLET_OIL: return OilDroplet::get_size_max(); // case DROPLET_SPARK: // return Spark::get_size_max(); default: assert (0); } // Make compiler happy. Size dummy; dummy.set(0,0); return dummy; } PhysicalP Droplet::create_and_add_if(DropletType dType,WorldP w, LocatorP l,const Pos &p,const Vel &v) { switch (dType) { case DROPLET_BLOOD: return Blood::create_and_add_if(w,l,p,v); case DROPLET_GREEN_BLOOD: return GreenBlood::create_and_add_if(w,l,p,v); case DROPLET_OIL: return OilDroplet::create_and_add_if(w,l,p,v); // case DROPLET_SPARK: // return Spark::create_and_add_if(w,l,p,v); default: assert (0); } return NULL; } int Droplet::get_available_entry(LocatorP locator) { // Initialize new slot. Never uninitialized, but doesn't matter. // No memory leak. if (dropletMax < DROPLET_MAX) { return dropletMax++; } // Else try to reuse existing slots. for (int n = 0; n < DROPLET_MAX; n++) { // Important! Check for recentAdded objects in this lookup. if (!locator->lookup(dropletList[n],True)) return n; } // Nothing free. Tough shit. return -1; } void Droplet::set_entry(int index,const Id &id) { assert(index >=0 && index < dropletMax); dropletList[index] = id; } Id Droplet::dropletList[DROPLET_MAX]; int Droplet::dropletMax = 0; Falling::Falling(const FallingContext &f_c,FallingXdata &x_data, WorldP w,LocatorP l,const Pos &raw_pos,Dir dirInitial) : Moving(f_c.movingContext,x_data,w,l,raw_pos,dirInitial) {} CONSTRUCTOR_INTERNAL_NODE_IO(Falling,Moving,moving) { } void Falling::act() { // Account for gravity. if (gravity_on()) { Touching touching; Hanging hanging; const Area &area = get_area(); WorldP world = get_world(); MoverP dummy; world->compute_touching_hanging(touching,hanging,dummy,area); Vel velNext = get_vel_next(); if (touching != CO_dn) { velNext.dy += PH_GRAVITY; } else { velNext.dy = 0.0f; } if (touching == CO_r || touching == CO_l) { velNext.dx = 0.0f; } velNext.limit((float)FALLING_VEL_MAX); set_vel_next(velNext); } Moving::act(); } Boolean Falling::gravity_on() { return True; } Touchable::Touchable(const TouchableContext &t_c,TouchableXdata &x_data, WorldP w,LocatorP l,const Pos &raw_pos) : Falling(t_c.fallingContext,x_data,w,l,raw_pos) { touched = False; context = &t_c; } CONSTRUCTOR_INTERNAL_NODE_IO(Touchable,Falling,falling) { touched = False; context = &cx; } int Touchable::get_drawing_level() { return 0; } Boolean Touchable::collidable() { return False; } void Touchable::act() { if (!touched) { PhysicalP nearby[OL_NEARBY_MAX]; int nItems; LocatorP l = get_locator(); l->get_nearby(nearby,nItems,this,TOUCHABLE_RADIUS); const Area &area = get_area(); for (int n = 0; n < nItems; n++) { IntelP intel = nearby[n]->get_intel(); if (intel && intel->is_human()) { const Area &otherArea = nearby[n]->get_area(); if (area.overlap(otherArea)) touched = True; } } } Falling::act(); } Heavy::Heavy(const HeavyContext &h_c,HeavyXdata &x_data, WorldP w,LocatorP l,const Pos &raw_pos) : Falling(h_c.fallingContext,x_data,w,l,raw_pos) { context = &h_c; // pusher starts out invalid } CONSTRUCTOR_INTERNAL_NODE_IO(Heavy,Falling,falling) { context = &cx; // pusher starts out invalid } void Heavy::collide(PhysicalP other) { const Vel &vel = get_vel(); if (vel.dy >= HEAVY_DAMAGE_VEL) { const Area &area = get_area(); const Area &otherArea = other->get_area(); const Pos &otherMiddle = otherArea.get_middle(); // If target is below or inside the Heavy. Dir dirTo = area.dir_to(otherMiddle); if ((dirTo == CO_DN_R) || (dirTo == CO_DN) || (dirTo == CO_DN_L) || (dirTo == CO_air)) { // Attack is done by the pusher. LocatorP l = get_locator(); PhysicalP p = l->lookup(pusher); other->corporeal_attack(p,context->damage); } } else { // Don't change pusher if bumped by another stationary object. if (other->get_intel()) { pusher = other->get_id(); } } Falling::collide(other); } Liftable::Liftable(const LiftableContext &cx,LiftableXdata &x_data, WorldP w,LocatorP l,const Pos &raw_pos) : Heavy(cx.heavyContext,x_data,w,l,raw_pos) { // lifter starts out invalid excludedTimer.set_max(LIFTABLE_EXCLUDED_TIME); excludedTime = False; } CONSTRUCTOR_INTERNAL_NODE_IO(Liftable,Heavy,heavy) { // lifter starts out invalid excludedTime = False; } Boolean Liftable::is_liftable() { return True; } int Liftable::get_drawing_level() { return 2; } Boolean Liftable::being_lifted() { if (excludedTime) { return False; } LocatorP l = get_locator(); PhysicalP p = l->lookup(lifter); return (p != NULL); } void Liftable::update() { excludedTimer.clock(); if (excludedTime && excludedTimer.ready()) { excludedTime = False; lifter.invalidate(); // Disable set_dont_collide(). set_dont_collide(lifter); } Heavy::update(); } void Liftable::collide(PhysicalP other) { LocatorP l = get_locator(); PhysicalP p = l->lookup(lifter); if (p && !excludedTime) { // Being lifted, so don't hurt anything. Falling::collide(other); } else { // Just like any other Heavy object. Heavy::collide(other); } } void Liftable::lift(PhysicalP l) { lifter = l->get_id(); set_dont_collide(lifter); excludedTime = False; // Want lifter to get credit for any kills. set_pusher(lifter); } void Liftable::release(PhysicalP) { // Don't invalidate lifter or set_dont_collide() until timer expires. excludedTime = True; excludedTimer.set(); } Item::Item(const ItemContext &c_x, ItemXdata &x_data, WorldP w, LocatorP l, const Pos &pos,Dir dirInitial) : Falling(c_x.fallingContext,x_data,w,l,pos,dirInitial) { //canTake = ntimer; excludedTimer.set_max(ITEM_CAN_TAKE_TIME); dieMessage = DESTROYED; held = False; context = &c_x; cantTake = False; } CONSTRUCTOR_INTERNAL_NODE_IO(Item,Falling,falling) { dieMessage = DESTROYED; context = &cx; cantTake = False; _update_from_stream(in); } DEFINE_UPDATE_FROM_STREAM(Item,Falling) void Item::_update_from_stream(InStreamP in) { holderId.read(in); // Set value of held based on holderId. // We should really just get rid of "held" all together and // just use whether holderId is valid or not. LocatorP locator = get_locator(); if (locator->lookup(holderId)) { held = True; } else { held = False; } } int Item::get_write_length() { return Falling::get_write_length() + Identifier::get_write_length(); // holderId or dummy } void Item::write(OutStreamP out) { Falling::write(out); if (held) { holderId.write(out); } else { // Don't use holderId because it might be invalid. Id dummy; dummy.write(out); } } Boolean Item::can_take(PhysicalP taker) { return (taker->get_id() != excluded || excludedTimer.ready()) && !held && !cantTake; } int Item::get_drawing_level() { return 2; } Id Item::get_holder_id() { if (held) { return holderId; } else { Id invalid; return invalid; } } int Item::get_coolness() { return context->coolness; } void Item::set_quiet_death() { dieMessage = NONE; Falling::set_quiet_death(); } void Item::taken(PhysicalP p) { assert(!held); assert(!cantTake); held = True; holderId = p->get_id(); set_mapped_next(False); } void Item::dropped(PhysicalP dropper) { // Can happen in update phase (from User::die). LocatorP locator = get_locator(); assert(held); assert(locator->lookup(holderId) == dropper); held = False; const Area area = dropper->get_area(); Pos middleNext = area.get_middle(); // Decide whether to drop to side or below. if (dropper->is_creature()) { Touching touching = ((CreatureP)dropper)->get_touching_area(); if (touching == CO_dn) { switch(dropper->get_dir()) { case CO_center_R: case CO_dn_R: middleNext.x -= ITEM_DROP_OFFSET_WIDTH; break; case CO_center_L: case CO_dn_L: middleNext.x += ITEM_DROP_OFFSET_WIDTH; break; default: middleNext.x += (Utils::coin_flip() ? ITEM_DROP_OFFSET_WIDTH : - ITEM_DROP_OFFSET_WIDTH); } } else { middleNext.y += ITEM_DROP_OFFSET_HEIGHT; } } else { middleNext.x += (Utils::coin_flip() ? ITEM_DROP_OFFSET_WIDTH : - ITEM_DROP_OFFSET_WIDTH); } _set_middle_next(middleNext); excludedTimer.set(); excluded = dropper->get_id(); set_mapped_next(True); update_area_next(False); } void Item::use(PhysicalP) { dieMessage = USED; SoundRequest req(context->useSound,get_area()); LocatorP locator = get_locator(); locator->submitSoundRequest(req); } void Item::act() { excludedTimer.clock(); Falling::act(); } void Item::die() { LocatorP locator = get_locator(); ostrstream msg; switch (dieMessage) { case NONE: break; case USED: msg << get_class_name() << " has been used." << ends; locator->message_enq(msg.str()); break; case DESTROYED: msg << get_class_name() << " is destroyed." << ends; locator->message_enq(msg.str()); break; }; Falling::die(); } Boolean Item::gravity_on() { return !is_held(); } AutoUse::AutoUse(const AutoUseContext &c, AutoUseXdata &x_data, WorldP w, LocatorP l, const Pos &pos) : Item(c.itemContext,x_data,w,l,pos) { context = &c; } CONSTRUCTOR_INTERNAL_NODE_IO(AutoUse,Item,item) { context = &cx; } Boolean AutoUse::is_auto_use() { return True; } void AutoUse::collide(PhysicalP other) { IntelP otherIntel = other->get_intel(); // First, ways in which AutoUse doesn't automatically use() itself. if (!other->is_creature() || ((CreatureP)other)->get_holder() || !otherIntel || (!otherIntel->is_human() && context->humansOnly)) { Item::collide(other); } else { use(other); } } Drugs::Drugs(const DrugsContext &c, DrugsXdata &x_data, WorldP w, LocatorP l, const Pos &pos) : AutoUse(c.autoUseContext,x_data,w,l,pos) { context = &c; } CONSTRUCTOR_INTERNAL_NODE_IO(Drugs,AutoUse,autoUse) { context = &cx; } Boolean Drugs::is_drugs() { return True; } void Drugs::taken(PhysicalP p) { // Prevent non-biologicals from picking up drugs. if (p->is_creature() && !((CreatureP)p)->biological()) { ostrstream msg; msg << "Non-Biological Creatures Cannot Use Drugs" << ends; LocatorP locator = get_locator(); locator->arena_message_enq(msg.str(),p); kill_self(); } else { AutoUse::taken(p); } } void Drugs::use(PhysicalP p) { assert(p->alive() && p->is_creature()); LocatorP locator = get_locator(); if (((CreatureP)p)->biological()) { // check for chance of overdose if context->odChance is not 0. assert(context->odChance >= 0); if (context->odChance && Utils::choose(context->odChance) == 0) { p->kill_self(); ostrstream msg; msg << p->get_class_name() << " dies from crack overdose." << ends; locator->message_enq(msg.str()); ostrstream arenaMsg; arenaMsg << "You Died From Drug Overdose" << ends; locator->arena_message_enq(arenaMsg.str(),p); set_quiet_death(); // so doesn't report "has been used" message. } else { /*** Add to Creature's modifier list ***/ ModifierP modifiers = ((CreatureP)p)->get_modifiers(); assert(modifiers); ModifierP m = create_modifier(); modifiers->append_unique(m); } } else { // Shouldn't get here, should kill self when picking it up. ostrstream msg; msg << "Non-Biological Creatures Cannot Use Drugs" << ends; locator->arena_message_enq(msg.str(),p); } kill_self(); AutoUse::use(p); } Shield::Shield(const ShieldContext &s_c, ShieldXdata &x_data, WorldP w, LocatorP l, const Pos &pos) : AutoUse(s_c.autoUseContext,x_data,w,l,pos) { } CONSTRUCTOR_INTERNAL_NODE_IO(Shield,AutoUse,autoUse) { } Boolean Shield::is_shield() { return True; } void Shield::use(PhysicalP p) { assert(p->is_moving()); LocatorP l = get_locator(); Id id = ((MovingP)p)->get_protection(); ProtectionP oldProtection = (ProtectionP) l->lookup(id); if (oldProtection) { oldProtection->kill_self(); } ProtectionP protection = create_protection(p->get_area()); l->add(protection); ((MovingP)p)->set_protection(protection->get_id()); kill_self(); AutoUse::use(p); } Animated::Animated(const AnimatedContext &a_c, AnimatedXdata &x_data, WorldP w, LocatorP l, const Pos &pos,Frame frameInitial) : Item(a_c.itemContext,x_data,w,l,pos,frameInitial + FRAME_BASE) {} CONSTRUCTOR_INTERNAL_NODE_IO(Animated,Item,item) { } Weapon::Weapon(const WeaponContext &c_x, WeaponXdata &x_data, WorldP w, LocatorP l, const Pos &pos,Dir dirInitial) : Item(c_x.itemContext,x_data,w,l,pos,dirInitial) { enteredScope = False; wc = &c_x; } CONSTRUCTOR_INTERNAL_NODE_IO(Weapon,Item,item) { enteredScope = False; wc = &cx; } void Weapon::fire(const Id &,ITcommand) { //not best way to do this //put noise in shot so it can decide if repeating. LocatorP locator; locator = get_locator(); SoundRequest req(wc->soundid,get_area()); locator->submitSoundRequest(req); } Boolean Weapon::useful_no_ammo() { return False; } Boolean Weapon::fire_repeatedly() { return True; } void Weapon::use(PhysicalP) { // Doesn't call Item::use(). } void Weapon::enter_scope_next(PhysicalP) { /* #ifdef PRINT_ERRORS if (enteredScope) cerr << "Warning:: " << get_class_name() << " already entered scope." << endl; #endif */ enteredScope = True; } void Weapon::leave_scope_next(PhysicalP) { /* #ifdef PRINT_ERRORS if (!enteredScope) cerr << "Warning:: " << get_class_name() << " not in scope." << endl; #endif */ enteredScope = False; } void Weapon::take_ammo_from(WeaponP other) { int thisAmmo = get_ammo(); int otherAmmo = other->get_ammo(); if ((thisAmmo != PH_AMMO_UNLIMITED) && (otherAmmo != PH_AMMO_UNLIMITED)) { int maxTake = get_ammo_max() - thisAmmo; int trans = Utils::minimum(maxTake,otherAmmo); set_ammo(thisAmmo + trans); other->set_ammo(otherAmmo - trans); } } Dir Weapon::compute_weapon_dir(ITcommand command) { return Intel::command_weapon_to_dir_8(command); } Cutter::Cutter(const CutterContext &c_x,CutterXdata &x_data, WorldP w,LocatorP l,const Pos &pos) : Weapon(c_x.weaponContext,x_data,w,l,pos,UNHELD_DIR) { // Now just uses UNHELD_DIR for direction when unheld. // When dropping Cutter, seems to drop too far to right?? inScope = inScopeNext = False; context = &c_x; } CONSTRUCTOR_INTERNAL_NODE_IO(Cutter,Weapon,weapon) { inScope = inScopeNext = False; context = &cx; _update_from_stream(in); } DEFINE_UPDATE_FROM_STREAM(Cutter,Weapon) void Cutter::_update_from_stream(InStreamP in) { inScope = (Boolean)in->read_char(); inScopeNext = inScope; } int Cutter::get_write_length() { return Weapon::get_write_length() + sizeof(char); // inScope } void Cutter::write(OutStreamP out) { Weapon::write(out); // Don't know why this happens. Still need to check out this warning. #if 0 if (inScope != inScopeNext) { cerr << "WARNING: Cutter::write() inScope != inScopeNext" << endl; } #endif out->write_char((u_char)inScope); } Boolean Cutter::is_cutter() { return True; } Boolean Cutter::ready() { return False; } int Cutter::get_ammo() { return PH_AMMO_UNLIMITED; } int Cutter::get_ammo_max() { return PH_AMMO_UNLIMITED; } Boolean Cutter::ignore_walls() { return is_held(); } void Cutter::set_ammo(int) { assert(0); } void Cutter::follow(const Area &followeeArea,Dir followeeDir, Boolean currentAndNext) { Pos middle = followeeArea.get_middle(); if (inScope) { set_dir_next(followeeDir); _set_middle_next(middle + context->offsets[followeeDir]); } else { _set_middle_next(middle); } // Don't use set_middle_next(), that won't handle currentAndNext correctly. update_area_next(currentAndNext); } void Cutter::enter_scope_next(PhysicalP user) { if(!entered_scope()) { set_dont_collide(user->get_id()); set_mapped_next(True); killerId = user->get_id(); set_dir_next(CO_center); inScopeNext = True; // moving will now get the correct results from // Cutter::get_size_offset_next() update_area_next(False); Weapon::enter_scope_next(user); } #ifdef PRINT_ERRORS else { cerr << "Warning:: " << get_class_name() << " entered scope twice." << endl; } #endif } void Cutter::leave_scope_next(PhysicalP user) { if (entered_scope()) { // Probably should remember what previous value of dontCollide was. Id invalid; set_dont_collide(invalid); set_mapped_next(False); set_dir_next(UNHELD_DIR); inScopeNext = False; // moving will now get the correct results from // Cutter::get_size_offset_next() update_area_next(False); Weapon::leave_scope_next(user); } #ifdef PRINT_ERRORS else cerr << "Warning:: " << get_class_name() << " left scope twice." << endl; #endif } void Cutter::collide(PhysicalP other) { if (inScope) { PhysicalP p; LocatorP locator = get_locator(); if (p = locator->lookup(killerId)) { assert(p->is_moving()); other->corporeal_attack(p,context->damage); ((MovingP)p)->attack_hook(); } else { other->corporeal_attack(NULL,context->damage); } SoundRequest req(context->cuttingsound,get_area()); locator->submitSoundRequest(req); } else { Weapon::collide(other); } } void Cutter::update() { inScope = inScopeNext; Weapon::update(); } void Cutter::take_ammo_from(WeaponP other) { // Switch healths. if (get_health() >= 0 && other->get_health() > get_health()) { // Don't need temp variable because setting next variables. other->set_health_next(get_health()); set_health_next(other->get_health()); } } Gun::Gun(const GunContext &g_c, GunXdata &x_data, WorldP w, LocatorP l, const Pos &p) : Weapon(g_c.weaponContext,x_data,w,l,p) { assert(g_c.ammoInitial <= g_c.ammoMax); gc = &g_c; Timer ntimer(g_c.shotTime); timer = ntimer; ammo = g_c.ammoInitial; } CONSTRUCTOR_INTERNAL_NODE_IO(Gun,Weapon,weapon) { gc = &cx; _update_from_stream(in); } DEFINE_UPDATE_FROM_STREAM(Gun,Weapon) void Gun::_update_from_stream(InStreamP in) { u_short val = in->read_short(); if (val == 0xffff) { ammo = PH_AMMO_UNLIMITED; } else { ammo = val; } } int Gun::get_write_length() { return Weapon::get_write_length() + sizeof(short); // ammo } void Gun::write(OutStreamP out) { Weapon::write(out); if (ammo == PH_AMMO_UNLIMITED) { out->write_short(0xffff); } else { assert(ammo < USHRT_MAX); // strictly less than to avoid 0xffff out->write_short((u_short)ammo); } } Boolean Gun::is_gun() { return True; } Boolean Gun::ready() { return timer.ready(); } int Gun::get_ammo() { return ammo; } int Gun::get_ammo_max() { return gc->ammoMax; } void Gun::update() { timer.clock(); Weapon::update(); } void Gun::set_ammo(int val) { assert(val <= gc->ammoMax && val >= 0); ammo = val; } Size Gun::get_shot_size(Dir) { return Shell::get_size(); } void Gun::fire(const Id &id,ITcommand command) { Dir dir = compute_weapon_dir(command); _fire(id,dir); } void Gun::_fire(const Id &id,Dir dir,Boolean setTimer,Boolean costsAmmo) /* NOTE: PH_AMMO_UNLIMITED is not currently tested. */ { assert((ammo == PH_AMMO_UNLIMITED) || ((ammo <= gc->ammoMax) && (ammo >= 0))); // Person who fired weapon may not exist anymore. (See FThrower) LocatorP locator = get_locator(); PhysicalP p; if (p = locator->lookup(id)) { if ((dir != CO_air) && ready() && ((ammo == PH_AMMO_UNLIMITED) || (ammo > 0))) { const Area &area = p->get_area(); // Pos newPos = area.adjacent_rect(get_shot_size(dir),dir); Pos newPos = Coord::shot_initial_pos(area, p->is_creature() ? ((CreatureP)p)->get_touching_area() : CO_air, get_shot_size(dir),dir); WorldP world = get_world(); LocatorP locator = get_locator(); PhysicalP shot = create_shot(p,world,locator,newPos,dir); shot->set_dont_collide(p->get_id()); // Shot should not collide with any members of the shooter's composite object. CompositeP comp = p->get_composite(); if (comp) { shot->set_dont_collide_composite(comp->get_composite_id()); } locator->add(shot); if (setTimer) timer.set(); if (costsAmmo && ammo != PH_AMMO_UNLIMITED) ammo--; Weapon::fire(id, dir); } } } PhysicalP Gun::create_shot(PhysicalP shooter,WorldP world,LocatorP locator, const Pos &pos,Dir dir) { PhysicalP shot = new Shell(world,locator,pos,shooter->get_id(), dir); assert (shot); return shot; } SingleGun::SingleGun(const SingleGunContext &c, SingleGunXdata &x_data, WorldP w,LocatorP l,const Pos &p) : Gun(c.gunContext,x_data,w,l,p) {} CONSTRUCTOR_INTERNAL_NODE_IO(SingleGun,Gun,gun) { } Boolean SingleGun::ready() { // Can only fire if previous shot has been destroyed. LocatorP locator = get_locator(); return (locator->lookup(shotId) == NULL) && Gun::ready(); } void SingleGun::fire(const Id &id,ITcommand command) { assert(get_ammo() == PH_AMMO_UNLIMITED); LocatorP locator = get_locator(); PhysicalP p; if (p = locator->lookup(id)) { Dir dir = compute_weapon_dir(command); if ((dir != CO_air) && ready()) { const Area &area = p->get_area(); // Pos newPos = area.adjacent_rect(get_shot_size(dir),dir); Pos newPos = Coord::shot_initial_pos(area, p->is_creature() ? ((CreatureP)p)->get_touching_area() : CO_air, get_shot_size(dir),dir); WorldP world = get_world(); LocatorP locator = get_locator(); PhysicalP shot = create_shot(p,world,locator,newPos,dir); shot->set_dont_collide(p->get_id()); // Shot should not collide with any members of the shooter's composite object. CompositeP comp = p->get_composite(); if (comp) { shot->set_dont_collide_composite(comp->get_composite_id()); } locator->add(shot); shotId = shot->get_id(); Weapon::fire(id, dir); } } } Whistle::Whistle(const WhistleContext &cx, WhistleXdata &xdata, WorldP w, LocatorP l, const Pos &raw_pos) : Weapon(cx.weaponContext,xdata,w,l,raw_pos) { context = &cx; ammo = cx.ammo; petNum = 0; } CONSTRUCTOR_INTERNAL_NODE_IO(Whistle,Weapon,weapon) { context = &cx; petNum = 0; _update_from_stream(in); } DEFINE_UPDATE_FROM_STREAM(Whistle,Weapon) void Whistle::_update_from_stream(InStreamP in) { u_short val = in->read_short(); if (val == 0xffff) { ammo = PH_AMMO_UNLIMITED; } else { ammo = val; } } int Whistle::get_write_length() { return Weapon::get_write_length() + sizeof(short); // ammo } void Whistle::write(OutStreamP out) { Weapon::write(out); if (ammo == PH_AMMO_UNLIMITED) { out->write_short(0xffff); } else { assert(ammo < USHRT_MAX); // strictly less than to avoid 0xffff out->write_short((u_short)ammo); } } Boolean Whistle::ready() { return True; } int Whistle::get_ammo() { return ammo; } int Whistle::get_ammo_max() { return PET_MAX; } int Whistle::get_coolness() { if (ammo <= 0) { return context->coolnessNoAmmo; } return Weapon::get_coolness(); } Boolean Whistle::useful_no_ammo() { return True; } Boolean Whistle::fire_repeatedly() { return False; } void Whistle::fire(const Id &id,ITcommand command) { LocatorP locator = get_locator(); PhysicalP shooter = locator->lookup(id); IntelP shooterIntel = NULL; if (shooter) { shooterIntel = shooter->get_intel(); } // Make sure the guy who fired the whistle exists and has an intel, // else just give up and return. if (!shooter || !shooterIntel) { return; } if (ammo > 0 && petNum < PET_MAX) { // There is a possibility of an alternate pet only if alternateChance is // non-zero. Boolean alternatePet = (context->alternateChance ? (Utils::choose(context->alternateChance) == 0) : False); // Create all pets at once. int n; for (n = 0; n < ammo && petNum < PET_MAX; n++) { PetP pet = create_pet(shooterIntel,alternatePet,n); pets[petNum] = pet->get_intel_id(); petNum++; } set_ammo(0); // First whistle blow after creating any pets says go get em. } // Tell all pets to goGetEm or to return to master. // This happens if no ammo to make new pets, or we already have // the max number of pets. else { LocatorP locator = get_locator(); int n; for (n = 0; n < petNum; n++) { PetP pet = (PetP)locator->lookup(pets[n]); if (pet) { // Give command if pet should go get em, or IT_WEAPON_CENTER to // return to master. pet->go_get_em(shooter,command); } } } } void Whistle::act() { // Make sure Pet intelligences still exist. Delete any that are gone. LocatorP locator = get_locator(); int n; for (n = 0; n < petNum; ) { PetP pet = (PetP)locator->lookup(pets[n]); if (pet) { // Go to next. n++; } else { pets[n] = pets[petNum - 1]; // copy from last element. petNum--; // Do not increment n. } } // Kill self if out of ammo and all pets are dead. if (ammo == 0 && petNum == 0) { kill_self(); } Weapon::act(); } void Whistle::set_ammo(int val) { ammo = val; } Modifier::Modifier(int timedVal,Boolean head) { if (timedVal) { timed = True; timer.set(timedVal); } else { timed = False; } next = NULL; prev = NULL; isHead = head; } Modifier::~Modifier() { // Can be NULL. delete next; } ModifierId Modifier::get_modifier_id() { return M_None; } #if 0 int Modifier::apply(Attribute,int startVal) { // Do nothing. return startVal; } #endif void Modifier::combine(ModifierP m) { assert(get_modifier_id() == m->get_modifier_id()); if (timed) { timer.set(timer.get_remaining() + m->timer.get_remaining()); } delete m; } #if 0 void Modifier::prepend(Modifier *m) { assert(isHead && !m->next && !m->prev && !prev); m->next = next; next->prev = m; m->prev = this; next = m; } #endif void Modifier::append_unique(Modifier *m) { assert(isHead && !m->next && !m->prev && !prev); ModifierId mId = m->get_modifier_id(); Modifier *p = this; Modifier *beforeP; do { // If find Modifier of same type. if (p->get_modifier_id() == mId) { p->combine(m); return; } beforeP = p; p = p->next; } while (p); // Else append to list. beforeP->next = m; m->prev = beforeP; } void Modifier::clear() { assert(isHead); // Clear out everything after this. delete next; next = NULL; } void Modifier::remove() { assert(!isHead); if (next) { next->prev = prev; next = NULL; } if (prev) { prev->next = next; prev = NULL; } } #if 0 void Modifier::remove(Modifier *m) { assert(isHead && m != this); Modifier *p = this; while (p->next != m && p->next) { p = p->next; } p->next = m->next; m->next = NULL; } #endif #if 0 int Modifier::apply_list(Attribute attr,int startVal) { // Feels like 6.001 all over again. int nextVal = apply(attr,startVal); if (next) return next->apply_list(attr,nextVal); else return nextVal; } #endif int Modifier::apply(Attribute attr,int val) { if (next) return next->apply(attr,val); else return val; } void Modifier::clock(PhysicalP p) { Boolean deleteThis = False; if (timed && timer.ready()) { deleteThis = True; remove(); // fixup surrounding list } timer.clock(); // Call down chain. if (next) next->clock(p); // Only call at end of function. if (deleteThis) { preDie(p); delete this; } } void Modifier::preDie(PhysicalP) { } Doubler::Doubler(int timed) :Modifier(timed) { multiplier = 2.0f; increment = 1.0f; } void Doubler::combine(ModifierP other) { assert(other->get_modifier_id() == get_modifier_id()); multiplier += increment; delete other; // Should probably also call Modifier::combine to add the timers. } Creature::Creature(const CreatureContext &c_c, CreatureXdata &x_data, PtrList *caps, WorldP w, LocatorP l, const Pos &raw_pos) : Moving(c_c.movingContext,x_data,w,l,raw_pos) { touching = CO_air; canClimb = False; stance = stanceNext = CO_air; grav = gravNext = 0; cc = &c_c; Timer nTimer(CORPSE_TIME); corpseTimer = nTimer; assert(context_valid()); birthTime = time(NULL); stunNext = 0; wantClimb = False; // Empty modifier list, mark as the head. modifiers = new Modifier(0,True); assert(modifiers); initialize_abilities(caps); check_abilities(); } Creature::Creature() { assert(0); } Creature::Creature(InStreamP in,const CreatureContext &cx, CreatureXdata &x_data, WorldP w,LocatorP l) : Moving(in,cx.movingContext,x_data,w,l) { touching = CO_air; canClimb = False; stance = stanceNext = CO_air; grav = gravNext = 0; cc = &cx; assert(context_valid()); birthTime = 0; stunNext = 0; wantClimb = False; // Empty modifier list, mark as the head. modifiers = new Modifier(0,True); assert(modifiers); // Will set all abilities to NULL initialize_abilities(NULL); // Will read abilities from the stream. _update_from_stream(in); if (!in->alive()) { creation_failed(); return; } check_abilities(); } void Creature::update_from_stream(InStreamP in) { Moving::update_from_stream(in); _update_from_stream(in); } void Creature::_update_from_stream(InStreamP in) { ABBitField bitIn = in->read_int(); ABBitField bitCurrent = compute_abilities_bit_field(); // Update the existing abilities from the stream. if (bitIn == bitCurrent) { // Abilities will have been written in order. for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { abilities[n]->update_from_stream(in); } } } // Abilities have changed, recreate all abilities. else { // Delete all existing ones. int n; for (n = 0; n < AB_MAX; n++) { delete abilities[n]; abilities[n] = NULL; } // Read new ones from stream. for (n = 0; n < AB_MAX; n++) { // If stream provides ability n. if (bitIn & (0x1 << n)) { abilities[n] = Ability::create_from_stream(in,n,this); } } } } int Creature::get_write_length() { // bit field of all the abilities. int bitFieldLen = sizeof(ABBitField); // size of actual abilities int abLen = 0; for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { abLen += abilities[n]->get_write_length(); } } return Moving::get_write_length() + bitFieldLen + abLen; } void Creature::write(OutStreamP out) { Moving::write(out); int n; ABBitField bitField = compute_abilities_bit_field(); out->write_int(bitField); for (n = 0; n < AB_MAX; n++) { if (abilities[n]) { abilities[n]->write(out); } } } Creature::~Creature() { delete modifiers; for (int n = 0; n < AB_MAX; n++) { // may be NULL delete abilities[n]; } } Boolean Creature::is_creature() { return True; } ITcommand Creature::get_command() { ITcommand mCommand = Moving::get_command(); if (stunned()) { // The only commands allowed when stunned are // IT_WEAPON_CHANGE, IT_WEAPON_DROP, IT_ITEM_USE, IT_ITEM_CHANGE, // and IT_ITEM_DROP. Can still whip out your chainsaw to cut up huggers. if (mCommand == IT_WEAPON_CHANGE || mCommand == IT_WEAPON_DROP || mCommand == IT_ITEM_USE || mCommand == IT_ITEM_CHANGE || mCommand == IT_ITEM_DROP) { return mCommand; } else { return IT_NO_COMMAND; } } else { return mCommand; } } Boolean Creature::on_door() { const Area &area = get_area(); Loc dest; WorldP world = get_world(); return world->check_door(area.middle_wsquare(),dest); } void Creature::get_followers(PtrList &list) { for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { abilities[n]->get_followers(list); } } Moving::get_followers(list); } Boolean Creature::command_repeatable(ITcommand c) { // Don't repeat going through doors, or getting up from a crouch. if (c == IT_UP && (on_door() || get_stance() == CO_dn)) { return False; } // See if any ability disallows the command repeat. for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { if (!abilities[n]->command_repeatable(c)) { return False; } } } return Moving::command_repeatable(c); } Boolean Creature::standing_squarely() { Boolean ret = ((stance == CO_dn || stance == CO_center) && hanging.corner != CO_dn_R && hanging.corner != CO_dn_L); return ret; } ClassId Creature::get_weapon_string(const char *&str) { // Check all the abilities. for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { ClassId cId = abilities[n]->get_weapon_string(str); if (cId != A_None) { return cId; } } } return Moving::get_weapon_string(str); } int Creature::get_drawing_level() { // Check all the abilities. for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { int val = abilities[n]->get_drawing_level(); if (val != -1) { return val; } } } return Moving::get_drawing_level(); } int Creature::get_anim_time() { // Check all the abilities. for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { int val = abilities[n]->get_anim_time(); if (val != -1) { return val; } } } return Moving::get_anim_time(); } void Creature::follow(const Area &followeeArea,Dir followeeDir, Boolean currentAndNext) { // Check all the abilities. for (int n = 0; n < AB_MAX; n++) { // Go until one returns True. if (abilities[n]) { if (abilities[n]->follow(followeeArea,followeeDir,currentAndNext)) { return; } } } Moving::follow(followeeArea,followeeDir,currentAndNext); } Boolean Creature::swap_protect() { // Go until one of the abilities returns True. for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { if (abilities[n]->swap_protect()) { return True; } } } return Moving::swap_protect(); } Boolean Creature::frog_protect() { // Go until one of the abilities returns True. for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { if (abilities[n]->frog_protect()) { return True; } } } return Moving::frog_protect(); } Boolean Creature::stick_touching(Touching touching) { // Does any ability allow touching in the given direction for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { if (abilities[n]->stick_touching(touching)) { return True; } } } return (touching == CO_dn); } int Creature::compute_droplets_num(int damage) { if (damage == 0) { return 0; } // "superficial damage" if (damage < 0) { damage = -damage; } return Utils::minimum(CREATURE_DROPLETS_MAX, (int)ceil(damage * CREATURE_DROPLET_FACTOR)); } void Creature::stun_next(int time) { stunNext = time; #if 0 stunTimer.set(time); // Kind of a hack, mucking with set_vel(0); set_vel_next(0); set_extra_vel_next(0); set_stance_next(CO_air); #endif } void Creature::set_intel(IntelP intel) { for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { abilities[n]->set_intel(intel); } } Moving::set_intel(intel); } void Creature::set_quiet_death() { // Get rid of corpses. if (!alive()) { set_delete_me(); } Moving::set_quiet_death(); } void Creature::heal() { for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { abilities[n]->heal(); } } Moving::heal(); } void Creature::set_mapped_next(Boolean val) { for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { abilities[n]->set_mapped_next(val); } } Moving::set_mapped_next(val); } void Creature::drop_all() { for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { abilities[n]->drop_all(); } } Moving::drop_all(); } Boolean Creature::corporeal_attack(PhysicalP killer,int damage) { // Does not take the possible existence of a Protection into account for // figuring out killer. IntelP kIntel; IntelId kIntelId; // Starts out invalid. if (killer && (kIntel = killer->get_intel())) { kIntelId = kIntel->get_intel_id(); } IntelP intel = get_intel(); if (intel) { intel->set_killer_intel_id(kIntelId); } // Protection from corporeal attacks. damage = apply_modifiers(Modifier::CORPOREAL_ATTACK,damage); // Put in a hook for Ability::corporeal_attack() when we need it. if (Moving::corporeal_attack(killer,damage)) { // Don't create blood if attack is blocked. if (cc->dropletType != DROPLET_NONE) { // Create Blood drop. LocatorP locator = get_locator(); const Area &area = get_area(); Pos middle = area.get_middle(); Size bloodSize = Droplet::get_size_max(cc->dropletType); Pos rawPos(middle.x - bloodSize.width / 2, middle.y - bloodSize.height / 2); for (int n = 0; n < compute_droplets_num(damage); n++) { // splatter up, right/left choosen randomly. Vel bloodVel((float)(Utils::choose(2 * SPLATTER_SPEED + 1) - SPLATTER_SPEED), (float)-(Utils::choose(SPLATTER_SPEED)+1)); // Try to create blood drop, don't care about return value. Droplet::create_and_add_if(cc->dropletType,get_world(), locator,rawPos,bloodVel); } } return True; } return False; } void Creature::heat_attack(PhysicalP killer,int heat,Boolean secondary) { // Does not take the possible existence of a Protection into account for // figuring out killer. IntelP kIntel; IntelId kIntelId; // Starts out invalid. if (killer && (kIntel = killer->get_intel())) { kIntelId = kIntel->get_intel_id(); } IntelP intel = get_intel(); if (intel) { intel->set_killer_intel_id(kIntelId); } // Protection from heat attacks. // // Not sure whether modifiers should go before or after abilities. heat = apply_modifiers(Modifier::HEAT_ATTACK,heat); // See if one of the Abilities wants to handle it. for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { if (abilities[n]->heat_attack(killer,heat,secondary)) { return; } } } _heat_attack(killer,heat,secondary); } void Creature::_heat_attack(PhysicalP killer,int heat,Boolean secondary) { Moving::heat_attack(killer,heat,secondary); } void Creature::act() { // Make all abilities act. for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { abilities[n]->act(); } } WorldP world = get_world(); Vel velNext = get_vel_next(); // Account for gravity. velNext.dy += gravNext; // Limit velocities. switch (stanceNext) { case CO_air: velNext.limit((float)apply_modifiers(Modifier::AIR_SPEED,cc->airSpeed, CREATURE_AIR_SPEED_MAX)); break; case CO_center: velNext.limit((float)apply_modifiers(Modifier::CENTER_SPEED,cc->centerSpeed, CREATURE_CENTER_SPEED_MAX)); break; case CO_climb: velNext.limit((float)apply_modifiers(Modifier::CLIMB_SPEED,cc->climbSpeed, CREATURE_CLIMB_SPEED_MAX)); break; case CO_r: case CO_l: case CO_up: { // Hack, shouldn't put knowledge about Sticky here. // Should make a Creature::get_wall_crawl_speed() that defers to the // abilities. Then Sticky::get_wall_crawl_speed() would return non-zero. Sticky* sticky = (Sticky*)get_ability(AB_Sticky); // We shouldn't be on the walls if we aren't Sticky. // This may change sometime, requiring us to undo this hack. assert(sticky); Speed wallCrawlSpeed = sticky->get_wall_crawl_speed(); velNext.limit((float)apply_modifiers(Modifier::CLIMB_SPEED,wallCrawlSpeed, CREATURE_CLIMB_SPEED_MAX)); } break; case CO_dn: velNext.limit((float)apply_modifiers(Modifier::CRAWL_SPEED,cc->crawlSpeed, CREATURE_CRAWL_SPEED_MAX)); break; default: assert(0); } set_vel_next(velNext); set_dir_next(compute_dir(stanceNext,velNext)); // See if we are high. if (alive()) { int high = apply_modifiers(Modifier::HIGH,0); if (high) { // vibrate parallel to the wall we are touching, or up/down for ladder. const Vel *unitVels = get_unit_vels(); Dir dir = Coord::parallel_dir(stanceNext); if (dir == CO_air) { // vibrate in any of sixteen directions. dir = Utils::choose(CO_DIR_PURE) + CO_R; } set_extra_vel_next((float)(CREATURE_HIGH_VIBRATE * (Utils::coin_flip() ? 1 : -1)) * // direction or its opposite unitVels[dir]); } } // Move along with Movers. MoverP mover = world->lookup(touchingMoverId); // Only move along with mover if you stick in the right direction. if (mover) { if (stick_touching(touching)) { set_mover_vel(mover->get_vel()); } } // Check for doors. ITcommand command = get_command(); Loc dest; const Area &area = get_area(); Loc loc = area.middle_wsquare(); const Pos &rawPos = get_raw_pos(); // If on a door and command is IT_UP, go through the door. if (command == IT_UP && world->check_door(loc,dest)) { Pos p; p.x = rawPos.x - loc.c * WSQUARE_WIDTH + dest.c * WSQUARE_WIDTH; p.y = rawPos.y - loc.r * WSQUARE_HEIGHT + dest.r * WSQUARE_HEIGHT; set_raw_pos_next(p); } // If marked for wanting to climb and we can do so, then climb. if (canClimb && wantClimb) { set_stance_next(CO_climb); set_vel_next(0); set_grav_next(0); center_wsquare_x_next(area.middle_wsquare()); set_want_climb(False); } if (! alive()) { if (get_intel()) { cerr << "Warning: Creature::act(): Corpse with non-NULL intelligence." << endl; } corpseTimer.clock(); } Moving::act(); } void Creature::update() { // update all abilities for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { abilities[n]->update(); } } // Clock Creature's modifiers, then Intel's modifiers. // Maybe Intel's modifiers should be clocked in Intel::clock, but for // now I'll keep them in the same place. modifiers->clock(this); IntelP intel = get_intel(); if (intel) { ModifierP iModifiers = intel->get_modifiers(); iModifiers->clock(this); } stance = stanceNext; grav = gravNext; const Area area = get_area_next(); WorldP world = get_world(); MoverP touchingMover; world->compute_touching_hanging(touching,hanging,touchingMover,area); if (touchingMover) { touchingMoverId = touchingMover->get_mover_id(); } else { touchingMoverId.invalidate(); } canClimb = world->can_climb(area.middle_wsquare()); // Remove corpse after time limit or if damaged enough. if (!get_quiet_death() && !alive() && (corpseTimer.ready() || (get_health() < - cc->corpseHealth))) { LocatorP locator = get_locator(); ostrstream msg; if (corpseTimer.ready()) { msg << get_class_name() << " corpse has decomposed." << ends; locator->message_enq(msg.str()); } else { msg << get_class_name() << " corpse has been destroyed." << ends; locator->message_enq(msg.str()); } set_delete_me(); } if (stunNext) { stunTimer.set(stunNext); // All before Moving::update. set_vel_next(0); set_extra_vel_next(0); set_stance_next(CO_air); stunNext = 0; } stunTimer.clock(); alienImmune.clock(); Moving::update(); } void Creature::die() { // die for all abilities for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { abilities[n]->die(); } } LocatorP locator = get_locator(); if (!get_quiet_death()) { if (cc->deadSoundId) { SoundRequest req(cc->deadSoundId,get_area()); locator->submitSoundRequest(req); } // Increment Creature stats stats.add_death(birthTime); // Increment stats for the leaf node. const PhysicalContext &pc = cc->movingContext.physicalContext; if (pc.get_stats) { Stats &leafStats = pc.get_stats(pc.arg); leafStats.add_death(birthTime); } } // Prepare for being a corpse. if (!get_quiet_death()) { corpseTimer.set(); // Set current and next values because called in update phase. Vel velNew(0.0f,(float)DROP_SPEED); set_vel_next(velNew); set_stance_next(CO_air); ostrstream msg; msg << get_class_name() << " has died." << ends; locator->message_enq(msg.str()); set_no_death_delete(); } // Deal with awarding kills. IntelP intel = get_intel(); IntelId killerIntelId; if (intel) { killerIntelId = intel->get_killer_intel_id(); } IntelP killerIntel; if (killerIntel = locator->lookup(killerIntelId)) { // Compute soups. I.e. A human killed by something other than a // different human. if (intel && intel->is_human() && (!killerIntel || !killerIntel->is_human() || killerIntel == intel)) { intel->add_soup(); } // Award killer with a kill of the appropriate type. Don't get kills // for taking yourself out. if (intel && killerIntel && intel != killerIntel) { if (intel->is_human()) { killerIntel->add_human_kill(); } else if (((MachineP)intel)->is_enemy()) { killerIntel->add_enemy_kill(); } } } else if (intel && intel->is_human()) { intel->add_soup(); } // We may be changing the next variables because the creature will be a // corpse next turn. update_area_next(False); Moving::die(); } void Creature::dr_clock() { CompositeP comp = get_composite(); if (comp && !comp->is_leader()) { // The leader will take care of calling follow() to make all the // others follow. return; } Moving::dr_clock(); } void Creature::collide(PhysicalP other) { // Go until one of the abilities returns True. for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { if (abilities[n]->collide(other)) { return; } } } Moving::collide(other); } AbilityP Creature::get_ability(AbilityId cId) { // Take advantage of abilities being indexed by AbilityId. if (abilities[cId]) { assert(abilities[cId]->get_ability_id() == cId); return abilities[cId]; } return NULL; } HolderP Creature::get_holder() { for (int n = 0; n < AB_MAX; n++) { if (abilities[n] && abilities[n]->is_holder()) { return (HolderP)abilities[n]; } } return NULL; } LocomotionP Creature::get_locomotion() { for (int n = 0; n < AB_MAX; n++) { if (abilities[n] && abilities[n]->is_locomotion()) { return (LocomotionP)abilities[n]; } } return NULL; } CompositeP Creature::get_composite() { for (int n = 0; n < AB_MAX; n++) { if (abilities[n] && abilities[n]->is_composite()) { return (CompositeP)abilities[n]; } } return NULL; } void Creature::add_ability(AbilityP a) { AbilityId aId = a->get_ability_id(); assert(!abilities[aId]); // Would be better to have this in the constructor, but we // have the chicken-and-egg problem when constructing Creatures. a->initialize(this); abilities[aId] = a; // For debugging. check_abilities(); } void Creature::remove_ability(AbilityId aId) { assert(abilities[aId]); // To make User, Carrier, drop stuff, etc. abilities[aId]->die(); // May be weird for Morphed, will cause Corpse to be dropped. delete(abilities[aId]); abilities[aId] = NULL; } Health Creature::get_health_max() { return apply_modifiers(Modifier::HEALTH_MAX, cc->movingContext.physicalContext.health, CREATURE_HEALTH_MAX_MAX); } Boolean Creature::generate_masks() { // Could check abilities, e.g. Alien doesn't really need masks, // but difficult to keep in-sync if abilities change. return True; } Speed Creature::get_acceleration() { return apply_modifiers(Modifier::ACCELERATION, cc->acceleration, CREATURE_ACCELERATION_MAX); } Speed Creature::get_jump() { return apply_modifiers(Modifier::JUMP, cc->jump, CREATURE_JUMP_MAX); } Touching Creature::get_touching_stance() { if (stance == CO_center) { return CO_dn; } else if (stance == CO_climb) { return CO_air; } else { return (Touching)stance; } } void Creature::center_wsquare_x_next(const Loc &loc) { const Area area = get_area(); const MovingContext *mc = get_moving_context(); const Pos rawPos = get_raw_pos(); assert (stanceNext == CO_climb); assert (area.overlap(loc)); Size *offsets = get_offsets(); Pos rpos(loc.c * WSQUARE_WIDTH + (WSQUARE_WIDTH - mc->sizes[CO_climb].width) / 2 - offsets[CO_climb].width, rawPos.y); set_raw_pos_next(rpos); } void Creature::corner(const Hanging &hanging) { Pos rpos; const MovingContext *mc = get_moving_context(); WorldP world = get_world(); Size *offsets = get_offsets(); ////// Corner around a Loc. if (hanging.type == Hanging::LOC) { const Loc &loc = hanging.loc; switch (hanging.corner) { case CO_up_L: // Final is CO_r_DN. assert(stanceNext == CO_r); rpos.x = loc.c * WSQUARE_WIDTH - mc->sizes[CO_r].width - offsets[CO_r].width; rpos.y = (loc.r + 1) * WSQUARE_HEIGHT - (int)ceil(0.5 * mc->sizes[CO_r].height) - offsets[CO_r].height; break; case CO_dn_L: // Final is CO_r_UP. assert(stanceNext == CO_r); rpos.x = loc.c * WSQUARE_WIDTH - mc->sizes[CO_r].width - offsets[CO_r].width; rpos.y = loc.r * WSQUARE_HEIGHT - (int)floor(0.5 * mc->sizes[CO_r].height) - offsets[CO_r].height; break; case CO_l_UP: // Final is CO_dn_R. assert(stanceNext == CO_dn); rpos.x = (loc.c + 1) * WSQUARE_WIDTH - (int)ceil(0.5 * mc->sizes[CO_dn].width) - offsets[CO_dn].width; rpos.y = loc.r * WSQUARE_HEIGHT - mc->sizes[CO_dn].height - offsets[CO_dn].height; break; case CO_r_UP: // Final is CO_dn_L. assert(stanceNext == CO_dn); rpos.x = loc.c * WSQUARE_WIDTH - (int)floor(0.5 * mc->sizes[CO_dn].width) - offsets[CO_dn].width; rpos.y = loc.r * WSQUARE_HEIGHT - mc->sizes[CO_dn].height - offsets[CO_dn].height; break; case CO_up_R: // Final is CO_l_DN. assert(stanceNext == CO_l); rpos.x = (loc.c + 1) * WSQUARE_WIDTH - offsets[CO_l].width; rpos.y = (loc.r + 1) * WSQUARE_HEIGHT - (int)ceil(0.5 * mc->sizes[CO_l].height) - offsets[CO_l].height; break; case CO_dn_R: // Final is CO_l_UP. assert(stanceNext == CO_l); rpos.x = (loc.c + 1) * WSQUARE_WIDTH - offsets[CO_l].width; rpos.y = loc.r * WSQUARE_HEIGHT - (int)floor(0.5 * mc->sizes[CO_l].height) - offsets[CO_l].height; break; case CO_l_DN: // Final is CO_up_R. assert(stanceNext == CO_up); rpos.x = (loc.c + 1) * WSQUARE_WIDTH - (int)ceil(0.5 * mc->sizes[CO_up].width) - offsets[CO_up].width; rpos.y = (loc.r + 1) * WSQUARE_HEIGHT - offsets[CO_up].height; break; case CO_r_DN: // Final is CO_up_L. assert(stanceNext == CO_up); rpos.x = loc.c * WSQUARE_WIDTH - (int)floor(0.5 * mc->sizes[CO_up].width) - offsets[CO_up].width; rpos.y = (loc.r + 1) * WSQUARE_HEIGHT - offsets[CO_up].height; break; default: assert(0); } } ////// Corner around a Mover. else if (hanging.type == Hanging::MOVER) { MoverP mover = world->lookup(hanging.moverId); if (!mover) { // Mover doesn't exist anymore. return; } const Area &area = mover->get_area(); Pos pos; Size size; area.get_rect(pos,size); switch (hanging.corner) { case CO_up_L: // Final is CO_r_DN. assert(stanceNext == CO_r); rpos.x = pos.x - mc->sizes[CO_r].width - offsets[CO_r].width; rpos.y = (pos.y + size.height) - (int)ceil(0.5 * mc->sizes[CO_r].height) - offsets[CO_r].height; break; case CO_dn_L: // Final is CO_r_UP. assert(stanceNext == CO_r); rpos.x = pos.x - mc->sizes[CO_r].width - offsets[CO_r].width; rpos.y = pos.y - (int)floor(0.5 * mc->sizes[CO_r].height) - offsets[CO_r].height; break; case CO_l_UP: // Final is CO_dn_R. assert(stanceNext == CO_dn); rpos.x = (pos.x + size.width) - (int)ceil(0.5 * mc->sizes[CO_dn].width) - offsets[CO_dn].width; rpos.y = pos.y - mc->sizes[CO_dn].height - offsets[CO_dn].height; break; case CO_r_UP: // Final is CO_dn_L. assert(stanceNext == CO_dn); rpos.x = pos.x - (int)floor(0.5 * mc->sizes[CO_dn].width) - offsets[CO_dn].width; rpos.y = pos.y - mc->sizes[CO_dn].height - offsets[CO_dn].height; break; case CO_up_R: // Final is CO_l_DN. assert(stanceNext == CO_l); rpos.x = (pos.x + size.width) - offsets[CO_l].width; rpos.y = (pos.y + size.height) - (int)ceil(0.5 * mc->sizes[CO_l].height) - offsets[CO_l].height; break; case CO_dn_R: // Final is CO_l_UP. assert(stanceNext == CO_l); rpos.x = (pos.x + size.width) - offsets[CO_l].width; rpos.y = pos.y - (int)floor(0.5 * mc->sizes[CO_l].height) - offsets[CO_l].height; break; case CO_l_DN: // Final is CO_up_R. assert(stanceNext == CO_up); rpos.x = (pos.x + size.width) - (int)ceil(0.5 * mc->sizes[CO_up].width) - offsets[CO_up].width; rpos.y = (pos.y + size.height) - offsets[CO_up].height; break; case CO_r_DN: // Final is CO_up_L. assert(stanceNext == CO_up); rpos.x = pos.x - (int)floor(0.5 * mc->sizes[CO_up].width) - offsets[CO_up].width; rpos.y = (pos.y + size.height) - offsets[CO_up].height; break; default: assert(0); } } ////// invalid Hanging::type else { assert(0); } set_raw_pos_next(rpos); } int Creature::apply_modifiers(Attribute attr,int initial,int maximum) { // First apply Creature's modifiers int ret = modifiers->apply(attr,initial); // Then, apply Intel's modifiers. IntelP intel = get_intel(); if (intel) { ModifierP iModifiers = intel->get_modifiers(); ret = iModifiers->apply(attr,ret); } // limit to maximum if supplied. if (maximum != -1) { ret = Utils::minimum(ret,maximum); } return ret; } Dir Creature::get_dir_next() { return Moving::get_dir_next(); } void Creature::update_area_next(Boolean currentAndNext) { Moving::update_area_next(currentAndNext); } void Creature::get_size_offset_next(Size &size,Size &offset,Dir dir) { // Give it to the first ability that returns True. for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { if (abilities[n]->get_size_offset_next(size,offset,dir)) { return; } } } _get_size_offset_next(size,offset,dir); } void Creature::_get_size_offset_next(Size &size,Size &offset,Dir dir) { // get_quiet_death() check taken care of in Creature::die. if (!alive_next() && !get_quiet_death()) { Moving::get_size_offset_next(size,offset,DEAD_DIR); } else { Moving::get_size_offset_next(size,offset,dir); } } void Creature::get_pixmap_mask(Xvars &xvars,int dpyNum,CMN_IMAGEDATA &pixmap, Dir dir,int animNum) { // Give it to the first ability that returns True. for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { if (abilities[n]->get_pixmap_mask(xvars,dpyNum,pixmap,dir,animNum)) { return; } } } _get_pixmap_mask(xvars,dpyNum,pixmap,dir,animNum); } void Creature::_get_pixmap_mask(Xvars &xvars,int dpyNum,CMN_IMAGEDATA &pixmap, Dir dir,int animNum) { if (!alive()) { Moving::get_pixmap_mask(xvars,dpyNum,pixmap,DEAD_DIR,0); } else { Moving::get_pixmap_mask(xvars,dpyNum,pixmap,dir,animNum); } } void Creature::set_stance_next(const Stance &stance) { assert((stance == CO_r) || (stance == CO_dn) || (stance == CO_l) || (stance == CO_up) || (stance == CO_air) || (stance == CO_center) || (stance == CO_climb)); stanceNext = stance; } Dir Creature::compute_dir(const Stance &st,const Vel &v) { Dir ret = CO_center; switch (st) { case CO_r: if (fabs(v.dy) < VEL_SMALL) ret = CO_r; else ret = v.dy > 0 ? CO_r_DN : CO_r_UP; break; case CO_dn: if (fabs(v.dx) < VEL_SMALL) ret = CO_dn; else ret = v.dx > 0 ? CO_dn_R : CO_dn_L; break; case CO_l: if (fabs(v.dy) < VEL_SMALL) ret = CO_l; else ret = v.dy > 0 ? CO_l_DN : CO_l_UP; break; case CO_up: if (fabs(v.dx) < VEL_SMALL) ret = CO_up; else ret = v.dx > 0 ? CO_up_R : CO_up_L; break; case CO_center: if (fabs(v.dx) < VEL_SMALL) ret = CO_center; else ret = v.dx > 0 ? CO_center_R : CO_center_L; break; // If diagonal, will give horizontal direction. case CO_air: if (fabs(v.dx) < VEL_SMALL) { if (fabs(v.dy) < VEL_SMALL) { ret = CO_air; } else { // Changed ret = v.dy > 0 ? CO_air_DN : CO_air_UP; } } else { ret = v.dx > 0 ? CO_air_R : CO_air_L; } break; // If diagonal, will give horizontal direction. case CO_climb: if (fabs(v.dx) < VEL_SMALL) { if (fabs(v.dy) < VEL_SMALL) { ret = CO_climb; } else { // Changed ret = v.dy > 0 ? CO_climb_DN : CO_climb_UP; } } else { ret = v.dx > 0 ? CO_climb_R : CO_climb_L; } break; default: assert (0); break; } return ret; } Boolean Creature::context_valid() { if ((cc->crawlSpeed < 0) || (cc->centerSpeed < 0) || (cc->airSpeed < 0) || (cc->climbSpeed < 0) || (cc->jump < 0) || (cc->acceleration < 0)) { return False; } return True; } void Creature::initialize_abilities(PtrList *caps) { // Initialize abilities list int n; for (n = 0; n < AB_MAX; n++) { abilities[n] = NULL; } // caps may be NULL if there are no abilities. if (caps) { // WARNING: Make sure to call Ability::initialize(). for (n = 0; n < caps->length(); n++) { AbilityP c = (AbilityP)caps->get(n); AbilityId id = c->get_ability_id(); assert (id >= 0 && id < AB_MAX); // Check for duplicate abilities assert(abilities[id] == NULL); abilities[id] = c; abilities[id]->initialize(this); } delete caps; } } void Creature::check_abilities() { // Check for some incompatabilities. assert(!(abilities[AB_Fighter] && abilities[AB_BuiltIn])); // should be one locomotion and <= one holer. int locomotions = 0; int holders = 0; int n; for (n = 0; n < AB_MAX; n++) { if (abilities[n]) { if (abilities[n]->is_locomotion()) { locomotions++; } if (abilities[n]->is_holder()) { holders++; } } } assert(locomotions == 1); assert(holders <= 1); } ABBitField Creature::compute_abilities_bit_field() { ABBitField bitField = 0x0; for (int n = 0; n < AB_MAX; n++) { if (abilities[n]) { bitField |= (0x1 << n); } } return bitField; } Stats Creature::stats; Ability::Ability() { cre = NULL; } Ability::~Ability(){ } Ability::Ability(InStreamP,CreatureP creat) { cre = creat; } void Ability::initialize(CreatureP creat) { assert(cre == NULL); // Guard against double initialization. cre = creat; } void Ability::update_from_stream(InStreamP) { } int Ability::get_write_length() { return 0; } void Ability::write(OutStreamP) { } Boolean Ability::is_holder() { return False; } Boolean Ability::is_locomotion() { return False; } Boolean Ability::is_composite() { return False; } Boolean Ability::get_pixmap_mask(Xvars &,int,CMN_IMAGEDATA &,Dir,int) { return False; } Boolean Ability::get_size_offset_next(Size &,Size &,Dir) { return False; } ClassId Ability::get_weapon_string(const char *&) { return A_None; } void Ability::drop_all() { } void Ability::get_followers(PtrList &) { } Boolean Ability::follow(const Area &,Dir,Boolean) { return False; } Boolean Ability::command_repeatable(ITcommand) { return True; } int Ability::get_drawing_level() { // means use default. return -1; } int Ability::get_anim_time() { // means use default. return -1; } Boolean Ability::heat_attack(PhysicalP,int,Boolean) { return False; } Boolean Ability::swap_protect() { return False; } Boolean Ability::frog_protect() { return False; } void Ability::set_intel(IntelP) { } void Ability::heal() { } void Ability::set_mapped_next(Boolean) { } void Ability::act() { } void Ability::update() { } void Ability::die() { } Boolean Ability::collide(PhysicalP) { return False; } Boolean Ability::stick_touching(Touching) { return False; } void Ability::register_abilities() { create_function[AB_Grounded] = Grounded::create_from_stream; create_function[AB_Suicide] = Suicide::create_from_stream; create_function[AB_Hopping] = Hopping::create_from_stream; create_function[AB_User] = User::create_from_stream; create_function[AB_Carrier] = Carrier::create_from_stream; create_function[AB_Fighter] = Fighter::create_from_stream; create_function[AB_Walking] = Walking::create_from_stream; create_function[AB_Sticky] = Sticky::create_from_stream; create_function[AB_Flying] = Flying::create_from_stream; create_function[AB_BuiltIn] = BuiltIn::create_from_stream; create_function[AB_Hugger] = Hugger::create_from_stream; create_function[AB_Prickly] = Prickly::create_from_stream; create_function[AB_Healing] = Healing::create_from_stream; create_function[AB_Lifter] = Lifter::create_from_stream; create_function[AB_Morphed] = Morphed::create_from_stream; create_function[AB_AnimTime] = AnimTime::create_from_stream; create_function[AB_OnFire] = OnFire::create_from_stream; create_function[AB_SwapProtect] = SwapProtect::create_from_stream; create_function[AB_Segmented] = Segmented::create_from_stream; create_function[AB_Sensitive] = Sensitive::create_from_stream; // Make sure we got 'em all. for (int n = 0; n < AB_MAX; n++) { assert(create_function[n]); } } AbilityP Ability::create_from_stream(InStreamP in,AbilityId aId, CreatureP creat) { // Just call the apropriate create function. assert(create_function[aId]); AbilityP ret = create_function[aId](in,creat); assert(ret); return ret; } AbilityCreateFunctionType Ability::create_function[AB_MAX]; Locomotion::Locomotion() : Ability() { } Locomotion::Locomotion(InStreamP in,CreatureP c) : Ability(in,c) { } Boolean Locomotion::is_locomotion() { return True; } Grounded::Grounded(const GroundedContext &,GroundedXdata &) :Locomotion() { } Grounded::Grounded(InStreamP in,CreatureP c, const GroundedContext &, GroundedXdata &) : Locomotion(in,c) { } DEFINE_CREATE_ABILITY_FROM_STREAM(Grounded) GroundedContext Grounded::defaultContext; GroundedXdata Grounded::defaultXdata; AbilityId Grounded::get_ability_id() { return AB_Grounded; } #if 1 #define DO_INCREASE(x) do {if (x < 0) x = 0.0f;} while (0) #define DO_DECREASE(x) do {if (x > 0) x = 0.0f;} while (0) #else #define DO_INCREASE(x) #define DO_DECREASE(x) #endif void Grounded::act() { // Methods of Moving or Creature. Speed acceleration = cre->get_acceleration(); const Stance stance = cre->get_stance(); const Touching touchingArea = cre->get_touching_area(); const Touching touchingStance = cre->get_touching_stance(); Vel vel = cre->get_vel(); const Acc *unitAccs = cre->get_unit_accs(); const ITcommand command = cre->get_command(); if (touchingArea != touchingStance) { // Hit the ground. if (touchingArea == CO_dn) { cre->set_stance_next(CO_center); Vel velNew(vel.dx,0.0f); cre->set_vel_next(velNew); } // Hit side walls. else if ((touchingArea == CO_r) || (touchingArea == CO_l)) { Vel velNew(0.0f,vel.dy); cre->set_vel_next(velNew); } // In the air. else if (touchingArea == CO_air) { cre->set_stance_next(CO_air); } } else if (touchingArea == CO_dn) { Vel velNew(vel.dx,0.0f); cre->set_vel_next(velNew); } // Set gravity. cre->set_grav_next((touchingArea == CO_dn) ? 0 : PH_GRAVITY); /* Interpret commands from controlling intelligence. May override some of above settings. */ switch (command) { case IT_CENTER: if (stance == CO_center) { cre->set_vel_next(0); } break; case IT_R: if (stance == CO_center) { DO_INCREASE(vel.dx); cre->set_vel_next(vel + acceleration * unitAccs[CO_center_R]); } break; case IT_L: if (stance == CO_center) { DO_DECREASE(vel.dx); cre->set_vel_next(vel + acceleration * unitAccs[CO_center_L]); } break; } } Suicide::Suicide(const SuicideContext &,SuicideXdata &) :Ability() { } DEFINE_CREATE_ABILITY_FROM_STREAM(Suicide) SuicideContext Suicide::defaultContext; SuicideXdata Suicide::defaultXdata; Suicide::Suicide(InStreamP in,CreatureP c, const SuicideContext &, SuicideXdata &) : Ability(in,c) { } AbilityId Suicide::get_ability_id() { return AB_Suicide; } void Suicide::act() { if (cre->get_command() == IT_ITEM_USE) { cre->kill_self(); } } Hopping::Hopping(const HoppingContext &,HoppingXdata &) :Locomotion() { } DEFINE_CREATE_ABILITY_FROM_STREAM(Hopping) HoppingContext Hopping::defaultContext; HoppingXdata Hopping::defaultXdata; Hopping::Hopping(InStreamP in,CreatureP c, const HoppingContext &, HoppingXdata &) : Locomotion(in,c) { } AbilityId Hopping::get_ability_id() { return AB_Hopping; } void Hopping::act() { // Methods of Moving or Creature. Speed acceleration = cre->get_acceleration(); Speed jump = cre->get_jump(); const Stance stance = cre->get_stance(); const Touching touchingArea = cre->get_touching_area(); const Touching touchingStance = cre->get_touching_stance(); const Vel vel = cre->get_vel(); const Vel *unitVels = cre->get_unit_vels(); const Boolean canClimb = cre->can_climb(); const Area area = cre->get_area(); const ITcommand command = cre->get_command(); Speed halfJump = (int)(jump * 0.5); // Default set gravity. cre->set_grav_next((touchingArea == CO_dn) || (canClimb && (stance == CO_climb) && cre->alive()) ? 0 : PH_GRAVITY); // Change stance if necessary. if (stance != CO_climb) { if (touchingArea != touchingStance) { cre->set_want_climb(False); // Hit the ground. if (touchingArea == CO_dn) { cre->set_stance_next(CO_center); cre->set_vel_next(0); } // Side walls. else if (touchingArea == CO_r) { Vel velNew(0.0f,vel.dy); cre->set_vel_next(velNew); } else if (touchingArea == CO_l) { Vel velNew(0.0f,vel.dy); cre->set_vel_next(velNew); } else if (touchingArea == CO_air) { cre->set_stance_next(CO_air); } else if (touchingArea != CO_up) { assert(0); } } else if (touchingArea == CO_dn) { Vel velNew(vel.dx,0.0f); cre->set_vel_next(velNew); } } else {// stance == CO_climb // Stop climbing if not in climbing square. if (!canClimb) { cre->set_stance_next(CO_air); } else if (! vel.is_zero()) { cre->set_vel_next(0); } } /* Interpret commands from controlling intelligence. May override some of above settings. */ switch (command) { case IT_CENTER: if (stance == CO_air) { cre->set_want_climb(True); } if ((stance != CO_climb) && canClimb) { cre->set_stance_next(CO_climb); cre->set_grav_next(0); cre->set_vel_next(0); cre->center_wsquare_x_next(area.middle_wsquare()); } break; case IT_R: if ((stance == CO_center) || (stance == CO_climb)) { cre->set_vel_next((float)jump * unitVels[CO_UP_R_R]); cre->set_stance_next(CO_air); } break; case IT_DN_R: if (stance == CO_climb) { cre->set_vel_next((float)jump * unitVels[CO_DN_R]); cre->set_stance_next(CO_air); } else if ((stance == CO_center) || (stance == CO_climb)) { cre->set_vel_next((float)halfJump * unitVels[CO_UP_R_R]); cre->set_stance_next(CO_air); } break; case IT_DN: if (stance == CO_air) { cre->set_want_climb(True); } if ((stance != CO_climb) && canClimb) { cre->set_stance_next(CO_climb); cre->set_grav_next(0); cre->set_vel_next(0); cre->center_wsquare_x_next(area.middle_wsquare()); } else if (stance == CO_climb) { cre->set_vel_next((float)jump * unitVels[CO_climb_DN]); } break; case IT_DN_L: if (stance == CO_climb) { cre->set_vel_next((float)jump * unitVels[CO_DN_L]); cre->set_stance_next(CO_air); } else if ((stance == CO_center) || (stance == CO_climb)) { cre->set_vel_next((float)halfJump * unitVels[CO_UP_L_L]); cre->set_stance_next(CO_air); } break; case IT_L: if ((stance == CO_center) || (stance == CO_climb)) { cre->set_vel_next((float)jump * unitVels[CO_UP_L_L]); cre->set_stance_next(CO_air); } break; case IT_UP_L: if ((stance == CO_center) || (stance == CO_climb)) { cre->set_vel_next((float)jump * unitVels[CO_air_L]); cre->set_stance_next(CO_air); } break; case IT_UP: // Doors are handled by Creature. if (cre->on_door()) break; if (stance == CO_air) { cre->set_want_climb(True); } if ((stance != CO_climb) && canClimb) { cre->set_stance_next(CO_climb); cre->set_vel_next(0); cre->set_grav_next(0); cre->center_wsquare_x_next(area.middle_wsquare()); } else if (stance == CO_center) {// Jump up. cre->set_vel_next((float)jump * unitVels[CO_air_UP]); cre->set_stance_next(CO_air); } else if (stance == CO_climb) { cre->set_vel_next((float)jump * unitVels[CO_climb_UP]); } break; case IT_UP_R: // Jump right. if ((stance == CO_center) || (stance == CO_climb)) { cre->set_vel_next((float)jump * unitVels[CO_air_R]); cre->set_stance_next(CO_air); } break; }; } Holder::Holder() : Ability() { } Holder::Holder(InStreamP in,CreatureP c) : Ability(in,c) { } Boolean Holder::is_holder() { return True; } Boolean Holder::ok_to_hold(PhysicalP other) { if (!(cre->alive() && other->is_item() && ((ItemP)other)->can_take(cre))) { return False; } // Must be a better way than to put explicit knowledge about Lifter here. LifterP lifter = (LifterP)cre->get_ability(AB_Lifter); if (lifter && lifter->is_lifting()) { return False; } return True; } User::User(const UserContext &cx,UserXdata &) :Holder() { weaponsNum = weaponCurrent = itemsNum = itemCurrent = 0; context = &cx; Timer dummy(USER_CYCLE_TIME); weaponCycleTimer = dummy; itemCycleTimer = dummy; itemCount = 0; } DEFINE_CREATE_ABILITY_FROM_STREAM(User) UserContext User::defaultContext; UserXdata User::defaultXdata; User::User(InStreamP in,CreatureP c, const UserContext &cx, UserXdata &) : Holder(in,c) { weaponsNum = weaponCurrent = itemsNum = itemCurrent = 0; context = &cx; itemCount = 0; update_from_stream(in); } void User::update_from_stream(InStreamP in) { Id id(in); LocatorP locator = cre->get_locator(); PhysicalP p = locator->lookup(id); if (p) { // Set user to have p as the only weapon, and make it the current weapon. if (p->is_weapon()) { weaponsNum = 1; weapons[0] = id; weaponCurrent = 0; return; } cerr << "ERROR: User::update_from_stream(), " << "should have received a weapon." << endl; // Drop through and clear weapons. } // Clear all weapons. weaponsNum = 0; weaponCurrent = 0; } int User::get_write_length() { // The current weapon. return Identifier::get_write_length(); } void User::write(OutStreamP out) { // Write the identifier of the current weapon. if (weaponCurrent != weaponsNum) { weapons[weaponCurrent].write(out); } else { Id invalid; invalid.write(out); } } AbilityId User::get_ability_id() { return AB_User; } int User::get_weapons_num() { return weaponsNum; } int User::get_items_num() { return itemsNum; } PhysicalP User::get_weapon(int n) { assert(n >= 0); if (n < weaponsNum) { LocatorP locator = cre->get_locator(); PhysicalP ret; if (ret = locator->lookup(weapons[n])) { return ret; } } return NULL; } PhysicalP User::get_item(int n) { assert(n >= 0); if (n < itemsNum) { LocatorP locator = cre->get_locator(); PhysicalP ret; if (ret = locator->lookup(items[n])) { return ret; } } return NULL; } PhysicalP User::get_weapon_current() { assert (weaponCurrent <= weaponsNum); if (weaponCurrent != weaponsNum) { LocatorP locator = cre->get_locator(); PhysicalP ret; if (ret = locator->lookup(weapons[weaponCurrent])) { return ret; } } return NULL; } ClassId User::get_weapon_string(const char *&str) { PhysicalP p = get_weapon_current(); if (p) { str = p->get_class_name(); return p->get_class_id(); } return A_None; } PhysicalP User::get_item_current() { assert (itemCurrent <= itemsNum); if (itemCurrent != itemsNum) { PhysicalP ret; LocatorP locator = cre->get_locator(); if (ret = locator->lookup(items[itemCurrent])) { return ret; } } return NULL; } int User::get_item_count() { return itemCount; } void User::get_followers(PtrList &list) { LocatorP locator = cre->get_locator(); int n; // weapons for (n = 0; n < weaponsNum; n++) { PhysicalP p = locator->lookup(weapons[n]); if (p) { list.add(p); } } // items for (n = 0; n < itemsNum; n++) { PhysicalP p = locator->lookup(items[n]); if (p) { list.add(p); } } } Boolean User::command_repeatable(ITcommand command) { // Don't repeat firing a weapon if // 1) it is just becoming empty // 2) it doesn't allow repeated firing. if (Intel::is_command_weapon(command)) { if (weaponCurrent != weaponsNum) { LocatorP locator = cre->get_locator(); WeaponP p; if (p = (WeaponP)locator->lookup(weapons[weaponCurrent])) { int ammo = p->get_ammo(); // Is about to become empty, PH_AMMO_UNLIMITED is not affected by this. if (ammo == 1 && p->ready()) { return False; } if (!p->fire_repeatedly()) { return False; } } } } return True; } void User::set_mapped_next(Boolean val) { if (cre->get_mapped_next() != val) { LocatorP locator = cre->get_locator(); PhysicalP weapon; if ((weaponCurrent != weaponsNum) && (weapon = locator->lookup(weapons[weaponCurrent]))) { if (val) { ((WeaponP)weapon)->enter_scope_next(cre); } else { ((WeaponP)weapon)->leave_scope_next(cre); } } } } // NOTE: This does not check if the Item persists. E.g. Bombs will // be dropped. void User::drop_all() { // Damn, this is easy. while (weaponsNum > 0) { weapon_drop(); } while (itemsNum > 0) { item_drop(); } } void User::act() { assert(weaponCurrent <= weaponsNum); assert(itemCurrent <= itemsNum); // Make sure that don't have any weapons or items if can't use them. assert((context->usesWeapons || weaponsNum == 0) && (context->usesItems || itemsNum == 0)); LocatorP locator = cre->get_locator(); ITcommand command = cre->get_command(); if (Intel::is_command_weapon(command)) { // Fire weapon. weapon_use(command); } else { switch (command) { case IT_WEAPON_CHANGE: weapon_change(); break; case IT_WEAPON_DROP: weapon_drop(); break; case IT_ITEM_USE: item_use(); break; case IT_ITEM_CHANGE: item_change(); break; case IT_ITEM_DROP: item_drop(); break; } } assert(weaponCurrent <= weaponsNum); assert(itemCurrent <= itemsNum); /* Go through list of weapons and items, moving them along with the object or deleting them if they no longer exist or have no ammo. */ const Area &areaNext = cre->get_area_next(); Dir dirNext = cre->get_dir_next(); // Traverse list of weapons. int n; for (n = 0; n < weaponsNum;) { assert(weaponCurrent <= weaponsNum); PhysicalP p; if (p = locator->lookup(weapons[n])) { if (((WeaponP)p)->get_ammo() > 0 || ((WeaponP)p)->get_ammo() == PH_AMMO_UNLIMITED || ((WeaponP)p)->useful_no_ammo()) { // ((WeaponP)p)->follow(areaNext,dirNext,False); } else { p->kill_self(); } n++; } // p is NULL, clean up the weapon. else { weapons[n] = weapons[weaponsNum - 1]; weaponsNum--; if (weaponCurrent == weaponsNum && n != weaponsNum) { weaponCurrent = n; // Keep same current weapon. } else if (weaponCurrent == weaponsNum + 1) { weaponCurrent = weaponsNum; // So still no weapon. } else if (weaponCurrent == n) { weaponCurrent = coolest_weapon(); // Still some weapon active. } PhysicalP weapon; if ((weaponCurrent != weaponsNum) && (weapon = locator->lookup(weapons[weaponCurrent]))) { ((WeaponP)weapon)->enter_scope_next(cre); } } } // Traverse list of items. // Count number of current item that User has. Set itemCountNext. // NOTE: This might not be completely accurate, as itemCurrent can change // during this traversal. But, who cares. It'll be updated next turn. itemCountNext = 0; ClassId itemCurrentClassId = A_None; PhysicalP item; if (itemCurrent != itemsNum && (item = locator->lookup(items[itemCurrent]))) { itemCurrentClassId = item->get_class_id(); } for (n = 0; n < itemsNum;) { assert(itemCurrent <= itemsNum); PhysicalP p; if (p = locator->lookup(items[n])) { // Increment itemCountNext. if (p->get_class_id() == itemCurrentClassId) { itemCountNext++; } // Make item follow user. // ((ItemP)p)->follow(areaNext,dirNext,False); n++; } // p is NULL else { items[n] = items[itemsNum - 1]; itemsNum--; if (itemCurrent == itemsNum && n != itemsNum) { itemCurrent = n; // Keep same current item. } else if (itemCurrent == itemsNum + 1) { itemCurrent = itemsNum; // So still no item. } else if (itemCurrent == n) { itemCurrent = coolest_item(); // Some item or itemsNum. } } } assert(weaponCurrent <= weaponsNum); assert(itemCurrent <= itemsNum); weaponCycleTimer.clock(); itemCycleTimer.clock(); } void User::update() { itemCount = itemCountNext; } Boolean User::collide(PhysicalP other) { if (!ok_to_hold(other)) { return False; } // Used below. int itemClassCount = 0; // Pick up weapon. if (other->is_weapon()) { WeaponP weapon; Boolean destroyOther = False; // If this User can't use weapons. if (!context->usesWeapons) { destroyOther = True; } // If User already has this weapon. else if (has_weapon(&weapon,other->get_class_id())) { // Take ammo from other and kill other. // Cutter heals itself to other's health. weapon->take_ammo_from((WeaponP)other); destroyOther = True; } // If User is already holding the max number of weapons. else if (weaponsNum >= PH_WEAPONS_MAX) { ostrstream msg; msg << "Can only hold " << PH_WEAPONS_MAX << " weapons" << ends; LocatorP locator = cre->get_locator(); locator->arena_message_enq(msg.str(),cre); destroyOther = True; } // Actually pick it up. else { ((ItemP)other)->taken(cre); weapons[weaponsNum] = other->get_id(); // Increment weaponCurrent along with weaponsNum, so if no weapon was // selected, still no weapon selected. if (weaponCurrent == weaponsNum) { weaponCurrent++; } weaponsNum++; if (weaponsNum == 1) { // Used to be 0. // Will set it to new weapon or builtIn weapon. weaponCurrent = coolest_weapon(); // If new weapon is selected. if (weaponCurrent == 0) { ((WeaponP)other)->enter_scope_next(cre); } } // else don't change weaponCurrent. } // We are destroying the weapon for some reason. if (destroyOther) { other->set_quiet_death(); other->kill_self(); } } // is weapon // Pick up item. else if (context->usesItems && itemsNum < PH_ITEMS_MAX && ((itemClassCount = item_class_count(other->get_class_id())) < ITEM_CLASS_MAX)) { assert(!other->is_weapon()); ((ItemP)other)->taken(cre); items[itemsNum] = other->get_id(); itemsNum++; // itemCurrent is 0 if no previous item. } else { LocatorP locator = cre->get_locator(); if (itemsNum == PH_ITEMS_MAX) { ostrstream msg; msg << "Can only hold " << PH_ITEMS_MAX << " items" << ends; locator->arena_message_enq(msg.str(),cre); } else if (itemClassCount >= ITEM_CLASS_MAX) { ostrstream msg; msg << "Can only hold " << ITEM_CLASS_MAX << " of any one item" << ends; locator->arena_message_enq(msg.str(),cre); } other->set_quiet_death(); other->kill_self(); } // Did something with other. return True; } void User::die() { LocatorP locator = cre->get_locator(); // Drop all weapons. int n; for (n = 0; n < weaponsNum; n++) { PhysicalP weapon = locator->lookup(weapons[n]); if (weapon) { if (n == weaponCurrent) { ((WeaponP)weapon)->leave_scope_next(cre); } // FIXED: Don't drop persistent items if doing a quiet death. if (((ItemP)weapon)->persists() && !cre->get_quiet_death()) { ((ItemP)weapon)->dropped(cre); } else if (!weapon->die_called()) { weapon->set_quiet_death(); weapon->kill_self(); weapon->die(); } } } weaponCurrent = 0; weaponsNum = 0; // Drop all items. itemCurrent = 0; for (n = 0; n < itemsNum; n++) { PhysicalP item = locator->lookup(items[n]); if (item) { // FIXED: Don't drop persistent items if doing a quiet death. if (((ItemP)item)->persists() && !cre->get_quiet_death()) { ((ItemP)item)->dropped(cre); } else if (!item->die_called()) { item->set_quiet_death(); item->kill_self(); item->die(); } } } itemsNum = 0; } Boolean User::has_weapon(Weapon **weaponOut,ClassId classId) { for (int n = 0; n < weaponsNum; n++) { PhysicalP weapon; LocatorP locator = cre->get_locator(); // Clean up deleted weapons elsewhere. if ((weapon = locator->lookup(weapons[n])) && (weapon->get_class_id() == classId)) { if (weaponOut) { *weaponOut = (WeaponP)weapon; } return True; } } return False; } int User::coolest_weapon() { LocatorP locator = cre->get_locator(); int index = weaponsNum; int coolnessMax = 0; BuiltInP builtIn = (BuiltInP)cre->get_ability(AB_BuiltIn); if (builtIn) { coolnessMax = builtIn->get_weapon_coolness(); } // Your builtIn weapon must be defaultable. assert(coolnessMax >= 0); int n; for (n = 0; n < weaponsNum; n++) { WeaponP weapon = (WeaponP)locator->lookup(weapons[n]); if (weapon && weapon->get_coolness() > coolnessMax && // Only weapons of nonnegative coolness. weapon->get_coolness() >= 0) { coolnessMax = weapon->get_coolness(); index = n; } } return index; } /* Mostly copied from User::coolest_weapon. */ int User::coolest_item() { LocatorP locator = cre->get_locator(); int index = itemsNum; int coolnessMax = 0; // Your builtIn item must be defaultable. assert(coolnessMax >= 0); int n; for (n = 0; n < itemsNum; n++) { ItemP item = (ItemP)locator->lookup(items[n]); if (item && item->get_coolness() > coolnessMax && // Only items of nonnegative coolness. item->get_coolness() >= 0) { coolnessMax = item->get_coolness(); index = n; } } return index; } int User::next_coolest_weapon() { LocatorP locator = cre->get_locator(); // Find the coolness of having weapon set to "none". BuiltInP builtIn = (BuiltInP)cre->get_ability(AB_BuiltIn); int noneCoolness = 0; if (builtIn) { noneCoolness = builtIn->get_weapon_coolness(); } // Find coolness of current weapon or of builtIn weapon. int currentCoolness = 0; if (weaponCurrent != weaponsNum) { WeaponP weapon = (WeaponP)locator->lookup(weapons[weaponCurrent]); if (weapon) { currentCoolness = weapon->get_coolness(); } else { // Somehow, the current weapon got destroyed, just return coolest // of all weapons. return coolest_weapon(); } } // Current weapon is none. else { currentCoolness = noneCoolness; } // Look for weapon of maximum coolness less than currentCoolness. Boolean found = False; int maxx; int index; int n; for (n = 0; n < weaponsNum; n++) { WeaponP weapon = (WeaponP)locator->lookup(weapons[n]); if (weapon && (!found || weapon->get_coolness() > maxx) && weapon->get_coolness() < currentCoolness) { maxx = weapon->get_coolness(); index = n; found = True; } } // See if setting weapon to none is the best fit. if ((noneCoolness < currentCoolness) && (!found || noneCoolness > maxx)) { maxx = noneCoolness; // unnecessary. index = weaponsNum; found = True; } if (!found) { // Cycle around. return coolest_weapon(); } else { return index; } } /* Mostly copied from User::next_coolest_weapon. */ int User::next_coolest_item() { LocatorP locator = cre->get_locator(); // Find coolness of current item. int currentCoolness; if (itemCurrent != itemsNum) { ItemP item = (ItemP)locator->lookup(items[itemCurrent]); if (item) { currentCoolness = item->get_coolness(); } else { // Somehow, the current item got destroyed, just return coolest // of all items. return coolest_item(); } } else { currentCoolness = 0; } // Look for item of maximum coolness less than currentCoolness. Boolean found = False; int maxx; int index; int n; for (n = 0; n < itemsNum; n++) { ItemP item = (ItemP)locator->lookup(items[n]); if (item && (!found || item->get_coolness() > maxx) && (item->get_coolness() < currentCoolness)) { maxx = item->get_coolness(); index = n; found = True; } } if (!found) { // Cycle around. return coolest_item(); } else { return index; } } void User::weapon_use(ITcommand command) { if (weaponCurrent != weaponsNum) { LocatorP locator = cre->get_locator(); PhysicalP p; if (p = locator->lookup(weapons[weaponCurrent])) { ((WeaponP)p)->fire(cre->get_id(),command); // Inform Creature that an attack occurred. cre->attack_hook(); } } } void User::weapon_change() { LocatorP locator = cre->get_locator(); PhysicalP weapon = NULL; if ((weaponCurrent != weaponsNum) && (weapon = locator->lookup(weapons[weaponCurrent]))) { ((WeaponP)weapon)->leave_scope_next(cre); } int coolest = coolest_weapon(); // If its been awhile since the last weapon change AND // we're not already on the coolest weapon, if (weaponCycleTimer.ready() && weaponCurrent != coolest) { weaponCurrent = coolest; } else { // If we changed weapons recently, cycle to the next coolest weapon. weaponCurrent = next_coolest_weapon(); } // weapon was just changed weaponCycleTimer.set(); if ((weaponCurrent != weaponsNum) && (weapon = locator->lookup(weapons[weaponCurrent]))) { ((WeaponP)weapon)->enter_scope_next(cre); weapon->flash(); } } void User::weapon_drop() { LocatorP locator = cre->get_locator(); if (weaponCurrent != weaponsNum) { // Some weapon is current. // Clean up dead weapons elsewhere. PhysicalP weapon; if (weapon = locator->lookup(weapons[weaponCurrent])) { ((WeaponP)weapon)->leave_scope_next(cre); ((ItemP)weapon)->dropped(cre); weaponsNum--; weapons[weaponCurrent] = weapons[weaponsNum]; // Some weapon or weaponCurrent == weaponsNum. weaponCurrent = coolest_weapon(); PhysicalP weapon; if ((weaponCurrent != weaponsNum) && (weapon = locator->lookup(weapons[weaponCurrent]))) { ((WeaponP)weapon)->enter_scope_next(cre); } } // BUG, can get into an infinite loop here from User::drop_all } else { // No current weapon. /* Cycle to next available weapon, so can keep dropping. */ weapon_change(); } } void User::item_use() { if (itemCurrent != itemsNum) { LocatorP locator = cre->get_locator(); PhysicalP p; if (p = locator->lookup(items[itemCurrent])) { ((ItemP)p)->use(cre); } } } void User::item_change() { int coolest = coolest_item(); // If its been awhile since the last item change AND // we're not already on the coolest item, if (itemCycleTimer.ready() && itemCurrent != coolest) { itemCurrent = coolest; } else { // If we changed items recently, cycle to the next coolest item. itemCurrent = next_coolest_item(); } // item was just changed itemCycleTimer.set(); PhysicalP p; LocatorP locator = cre->get_locator(); if ((itemCurrent != itemsNum) && (p = locator->lookup(items[itemCurrent]))) { p->flash(); } } void User::item_drop() { LocatorP locator = cre->get_locator(); if (itemCurrent != itemsNum) { // Some item is current. // Clean up dead items elsewhere. PhysicalP item; if (item = locator->lookup(items[itemCurrent])) { ((ItemP)item)->dropped(cre); itemsNum--; items[itemCurrent] = items[itemsNum]; // Some item current. itemCurrent = coolest_item(); } } else { // No current item. /* Cycle to next available item, so can keep dropping. */ item_change(); } } int User::item_class_count(ClassId cId) { LocatorP l = cre->get_locator(); int ret = 0; for (int n = 0; n < itemsNum; n++) { PhysicalP p = l->lookup(items[n]); if (p && p->get_class_id() == cId) { ret++; } } return ret; } Carrier::Carrier(const CarrierContext &,CarrierXdata &) :Holder() { hasItem = False; } DEFINE_CREATE_ABILITY_FROM_STREAM(Carrier) CarrierContext Carrier::defaultContext; CarrierXdata Carrier::defaultXdata; Carrier::Carrier(InStreamP in,CreatureP c, const CarrierContext &, CarrierXdata &) : Holder(in,c) { hasItem = False; } AbilityId Carrier::get_ability_id() { return AB_Carrier; } int Carrier::get_weapons_num() { return 0; } int Carrier::get_items_num() { return hasItem ? 1 : 0; } PhysicalP Carrier::get_weapon(int) { return NULL; } PhysicalP Carrier::get_weapon_current() { return NULL; } PhysicalP Carrier::get_item(int n) { assert(n >= 0); if (n == 0 && hasItem) { LocatorP locator = cre->get_locator(); PhysicalP ret = locator->lookup(item); return ret; } return NULL; } PhysicalP Carrier::get_item_current() { // Returns NULL if !has_item(), so does the right thing. return get_item(0); } int Carrier::get_item_count() { return hasItem ? 1 : 0; } void Carrier::get_followers(PtrList &list) { if (hasItem) { LocatorP l = cre->get_locator(); PhysicalP p = l->lookup(item); if (p) { list.add(p); } } } void Carrier::drop_all() { if (hasItem) { LocatorP l = cre->get_locator(); PhysicalP p = l->lookup(item); if (p) { ((ItemP)p)->dropped(cre); } hasItem = False; } } void Carrier::act() { LocatorP locator = cre->get_locator(); ITcommand command = cre->get_command(); PhysicalP p = NULL; if ( hasItem ) { p = locator->lookup(item); if (p) { assert(p->is_item()); } } switch (command) { case IT_ITEM_USE: // Can only use AutoUse items. if (p) { if (p->is_auto_use()) { ((ItemP)p)->use(cre); } else { ostrstream str; str << "Cannot use " << p->get_class_name() << ends; locator->arena_message_enq(str.str(),cre); } } break; case IT_ITEM_CHANGE: if (p) { p->flash(); } break; case IT_ITEM_DROP: if (p) { ((ItemP)p)->dropped(cre); hasItem = False; } } if (p) { #if 0 const Area &areaNext = get_area_next(); Dir dirNext = get_dir_next(); // Make item follow user. ((ItemP)p)->follow(areaNext,dirNext,False); #endif } else { // If item has been destroyed. hasItem = False; } } Boolean Carrier::collide(PhysicalP other) { if (!ok_to_hold(other)) { return False; } if (hasItem) { return False; } // Both weapons and items are put in the item slot. ((ItemP)other)->taken(cre); item = other->get_id(); hasItem = True; return True; } void Carrier::die() { if (hasItem) { LocatorP l = cre->get_locator(); PhysicalP p = l->lookup(item); if (p) { if (((ItemP)p)->persists()) { ((ItemP)p)->dropped(cre); } else if (!p->die_called()) { p->set_quiet_death(); p->kill_self(); p->die(); } } } } Fighter::Fighter(const FighterContext &f_c,FighterXdata &) :Ability() { Timer nTimer(FIGHTER_SLIDE_TIME); stuckTimer = nTimer; fc = &f_c; attack = attackNext = attackNone; } Fighter::Fighter(InStreamP in,CreatureP c, const FighterContext &cx, FighterXdata &) : Ability(in,c) { fc = &cx; update_from_stream(in); } void Fighter::update_from_stream(InStreamP in) { char attk = in->read_char(); attack = (Attack)attk; attackNext = attack; } int Fighter::get_write_length() { return sizeof(char); } void Fighter::write(OutStreamP out) { assert(attack == attackNext); out->write_char((char)attack); } // Right now, this is the only Ability that needs special code, // the rest use DEFINE_CREATE_ABILITY_FROM_STREAM. (also AnimTime) AbilityP Fighter::create_from_stream(InStreamP in,CreatureP creat) { ClassId cId = creat->get_class_id(); AbilityP ret = new Fighter(in,creat,*lookup_context(cId),defaultXdata); assert(ret); return ret; } void Fighter::initialize(CreatureP c) { Ability::initialize(c); // Just so we will assert if we forgot to register the Fighter. lookup_context(cre->get_class_id()); // If you assert here, check your ".bitmaps" file. // MovingContext::offsetGenerator should be set to Fighter::offset_generator // for all Fighters. See "ninja.bitmaps". assert(cre->get_offset_generator() == Fighter::offset_generator); // Similar to above. Should be Fighter::transformOverride for all Fighters. assert(cre->get_transform_override() == &Fighter::transformOverride || cre->get_transform_override() == &Fighter::uprightTransformOverride); } AbilityId Fighter::get_ability_id() { return AB_Fighter; } Boolean Fighter::get_pixmap_mask(Xvars &xvars,int dpyNum,CMN_IMAGEDATA &pixmap, Dir dir,int) { // Alive check is somewhat of a hack. if (cre->alive() && attack && dir_to_attack(dir)) { // Just map the dir to the attackDir used to store the // fighter pixmaps. Dir attackDir = dir_to_attack_dir(dir); cre->get_pixmap_mask(xvars,dpyNum,pixmap,attackDir,0); return True; } return False; } Boolean Fighter::get_size_offset_next(Size &size,Size &offset, Dir dirNext) { // Alive check is somewhat of a hack. if (cre->alive_next() && attackNext && dir_to_attack(dirNext)) { // Just map the dir to the attackDir used to store the // fighter pixmaps. Dir attackDirNext = dir_to_attack_dir(dirNext); cre->get_size_offset_next(size,offset,attackDirNext); return True; } return False; } ClassId Fighter::get_weapon_string(const char *&str) { // If we are a Holder with a current weapon, let Holder take // care of it. HolderP holder = cre->get_holder(); if (holder && holder->get_weapon_current()) { return A_None; } // If a Lifter lifting something, let lifter take care of it. LifterP lifter = (LifterP)cre->get_ability(AB_Lifter); if (lifter && lifter->is_lifting()) { return A_None; } // Set to hand-to-hand str = "hand-to-hand"; return A_HandToHand; } void Fighter::act() { ITcommand command = cre->get_command(); const Dir dir = cre->get_dir(); // No longer attacking, e.g. hit the ground after a flying attack. if (attack && (attack != dir_to_attack(dir))) { attackNext = attackNone; // cre->set_vel_next(0); } // Sliding along the ground to attack. if (attack == attackStuck) { if (stuckTimer.ready()) { attackNext = attackNone; cre->set_vel_next(0); } else { stuckTimer.clock(); } } // If we have a current weapon, don't attack. HolderP holder = cre->get_holder(); if (holder->get_weapon_current()) { return; } // If a Lifter lifting something, don't attack. LifterP lifter = (LifterP)cre->get_ability(AB_Lifter); if (lifter && lifter->is_lifting()) { return; } // Start new attack. if (!attack && Intel::is_command_weapon(command)) { Boolean didAttack = True; // Choose attack depending on stance. switch (cre->get_stance()) { case CO_center: switch (command) { case IT_WEAPON_R: attack_stuck(CO_center_R,CO_center); break; case IT_WEAPON_DN_R: attack_stuck(CO_dn_R,CO_dn); break; case IT_WEAPON_DN_L: attack_stuck(CO_dn_L,CO_dn); break; case IT_WEAPON_L: attack_stuck(CO_center_L,CO_center); break; case IT_WEAPON_UP_L: attack_free_horizontal(CO_UP_L); break; case IT_WEAPON_UP: attack_free_vertical(CO_air_UP); break; case IT_WEAPON_UP_R: attack_free_horizontal(CO_UP_R); break; default: didAttack = False; } break; case CO_air: if (command == IT_WEAPON_DN) { attack_free_vertical(CO_air_DN); } else { didAttack = False; } break; case CO_r: switch (command) { case IT_WEAPON_L: case IT_WEAPON_DN_L: attack_free_horizontal(CO_center_L); break; case IT_WEAPON_UP_L: attack_free_horizontal(CO_UP_L); break; case IT_WEAPON_UP: case IT_WEAPON_UP_R: attack_stuck(CO_r_UP,CO_r); break; case IT_WEAPON_DN: case IT_WEAPON_DN_R: attack_stuck(CO_r_DN,CO_r); break; default: didAttack = False; } break; case CO_dn: switch (command) { case IT_WEAPON_UP_R: attack_free_horizontal(CO_UP_R); break; case IT_WEAPON_UP_L: attack_free_horizontal(CO_UP_L); break; case IT_WEAPON_UP: attack_free_vertical(CO_air_UP); break; case IT_WEAPON_R: case IT_WEAPON_DN_R: attack_stuck(CO_dn_R,CO_dn); break; case IT_WEAPON_L: case IT_WEAPON_DN_L: attack_stuck(CO_dn_L,CO_dn); break; default: didAttack = False; } break; case CO_l: switch (command) { case IT_WEAPON_R: case IT_WEAPON_DN_R: attack_free_horizontal(CO_center_R); break; case IT_WEAPON_UP_R: attack_free_horizontal(CO_UP_R); break; case IT_WEAPON_UP: case IT_WEAPON_UP_L: attack_stuck(CO_l_UP,CO_l); break; case IT_WEAPON_DN: case IT_WEAPON_DN_L: attack_stuck(CO_l_DN,CO_l); break; default: didAttack = False; } break; case CO_up: switch (command) { case IT_WEAPON_DN: attack_free_vertical(CO_air_DN); break; case IT_WEAPON_R: case IT_WEAPON_DN_R: case IT_WEAPON_UP_R: attack_stuck(CO_up_R,CO_up); break; case IT_WEAPON_L: case IT_WEAPON_DN_L: case IT_WEAPON_UP_L: attack_stuck(CO_up_L,CO_up); break; default: didAttack = False; } break; case CO_climb: switch (command) { case IT_WEAPON_R: case IT_WEAPON_DN_R: attack_free_horizontal(CO_center_R); break; case IT_WEAPON_DN: attack_free_vertical(CO_air_DN); break; case IT_WEAPON_L: case IT_WEAPON_DN_L: attack_free_horizontal(CO_center_L); break; case IT_WEAPON_UP_L: attack_free_horizontal(CO_UP_L); break; case IT_WEAPON_UP: attack_free_vertical(CO_air_UP); break; case IT_WEAPON_UP_R: attack_free_horizontal(CO_UP_R); break; default: didAttack = False; } break; default: didAttack = False; break; } // Inform Creature that an attack occurred. if (didAttack) { SoundRequest req(fc->attackSound,cre->get_area()); LocatorP locator=cre->get_locator(); locator->submitSoundRequest(req); cre->attack_hook(); } } // if starting a new attack. // Careful about adding logic here, there is a return up above. } void Fighter::update() { attack = attackNext; } Boolean Fighter::collide(PhysicalP other) { if (attack) { // Special case so Pets with same master don't hurt each other. //// This is unnecessary with the new Teams code. IntelP intel = cre->get_intel(); IntelP oIntel = other->get_intel(); if (intel && oIntel && !intel->is_human() && !oIntel->is_human() && ((MachineP)intel)->get_master_intel_id() == ((MachineP)oIntel)->get_master_intel_id()) { return False; } Dir dir = cre->get_dir(); const Area &area = cre->get_area(); Pos pos; Size size; area.get_rect(pos,size); const Area &otherArea = other->get_area(); // Compute the Attack from the current dir, don't just use current value // of this->attack. Attack attackFromDir = dir_to_attack(dir); if (attackFromDir) { // If there is no hotSpot specified for the current direction, generate // one by // transforming from the hotSpot of the base for the direction. // // This is not as clean as I'd like: // 1) We are directly looking at MovingContext // 2) This scheme will mess up if any creature legitimately has a // hotSpot of (0,0). // // Hot Spots are indexed in FighterContext by the non-attacking dir. Size hotSpot = fc->hotSpots[dir]; if (hotSpot.width == 0 && hotSpot.height == 0) { // Get the base direction for dir. const MovingContext *mc = cre->get_moving_context(); Dir base = Transform2D::get_base(dir,mc->transformOverride); // Convert from Size to Pos so we can use Transform2D's methods. Pos newHotSpot(fc->hotSpots[base].width,fc->hotSpots[base].height); // The base must have a valid hot spot. assert(!(newHotSpot.x == 0 && newHotSpot.y == 0)); // Get the size of the base. Dir attackBase = dir_to_attack_dir(base); const Size &baseSize = mc->sizes[attackBase]; // Transform the hot spot of the base. newHotSpot = Transform2D::apply_all(dir,newHotSpot, baseSize,mc->transformOverride); // Convert back from Pos to Size. hotSpot.width = newHotSpot.x; hotSpot.height = newHotSpot.y; } // If the hotSpot is inside other's area, then do some damage. if (otherArea.overlap(pos + hotSpot)){ // Move just enough to get out of the way. Size offset = area.avoid(otherArea); const Pos &rawPos = cre->get_raw_pos(); cre->set_raw_pos_next(rawPos + offset); int damage = (attackFromDir == attackStuck) ? fc->damageStuck : fc->damageFree; damage = cre->apply_modifiers(Modifier::DAMAGE,damage, FIGHTER_DAMAGE_MAX); other->corporeal_attack(cre,damage); attackNext = attackNone; return True; } } // attackFromDir } return False; } Attack Fighter::dir_to_attack(Dir dir) { switch (dir) { case CO_center_R: case CO_center_L: case CO_r_DN: case CO_r_UP: case CO_dn_R: case CO_dn_L: case CO_l_DN: case CO_l_UP: case CO_up_R: case CO_up_L: return attackStuck; case CO_air_R: case CO_air_DN: case CO_air_L: case CO_air_UP: return attackFree; } return attackNone; } Dir Fighter::dir_to_attack_dir(Dir dir) { switch (dir) { case CO_center_R: return CO_DN_R_R; case CO_center_L: return CO_DN_R; case CO_air_R: return CO_DN_DN_R; case CO_air_L: return CO_DN; case CO_r_DN: return CO_DN_DN_L; case CO_r_UP: return CO_DN_L; case CO_dn_R: return CO_DN_L_L; case CO_dn_L: return CO_L; case CO_l_DN: return CO_UP_L_L; case CO_l_UP: return CO_UP_L; case CO_up_R: return CO_UP_UP_L; case CO_up_L: return CO_UP; case CO_air_UP: return CO_UP_UP_R; case CO_air_DN: return CO_UP_R; default: assert(0); return CO_air; } } Boolean Fighter::is_attack_dir(Dir dir) { return dir >= CO_DN_R_R && dir <= CO_UP_R; } Dir Fighter::attack_dir_to_dir(Dir dir) { switch (dir) { case CO_DN_R_R: return CO_center_R; case CO_DN_R: return CO_center_L; case CO_DN_DN_R: return CO_air_R; case CO_DN: return CO_air_L; case CO_DN_DN_L: return CO_r_DN; case CO_DN_L: return CO_r_UP; case CO_DN_L_L: return CO_dn_R; case CO_L: return CO_dn_L; case CO_UP_L_L: return CO_l_DN; case CO_UP_L: return CO_l_UP; case CO_UP_UP_L: return CO_up_R; case CO_UP: return CO_up_L; case CO_UP_UP_R: return CO_air_UP; case CO_UP_R: return CO_air_DN; default: assert(0); return CO_air; } } void Fighter::attack_stuck(Dir dir,Stance stance) { const Vel *unitVels = cre->get_unit_vels(); cre->set_vel_next((float)fc->slide * unitVels[dir]); cre->set_stance_next(stance); stuckTimer.set(); attackNext = attackStuck; } void Fighter::attack_free_horizontal(Dir dir) { const Acc *unitAccs = cre->get_unit_accs(); cre->set_vel_next(cre->get_vel() + fc->jumpHorizontal * unitAccs[dir]); cre->set_stance_next(CO_air); attackNext = attackFree; } void Fighter::attack_free_vertical(Dir dir) { const Acc *unitAccs = cre->get_unit_accs(); Vel vel = cre->get_vel(); Vel velNext(0.0f,vel.dy + fc->jumpVertical * unitAccs[dir].ddy); cre->set_vel_next(velNext); cre->set_stance_next(CO_air); attackNext = attackFree; } Touching Fighter::offset_generator(Dir dir) { if (is_attack_dir(dir)) { Dir nonAttack = attack_dir_to_dir(dir); return Creature::offset_generator(nonAttack); } return Creature::offset_generator(dir); } const FighterContext *Fighter::lookup_context(ClassId cId) { // Not very extendable. This sucks, Beavis. switch (cId) { case A_Ninja: return &Ninja::fighterContext; case A_Hero: return &Hero::fighterContext; case A_Dog: return &Dog::fighterContext; case A_Mutt: return &Mutt::fighterContext; default: assert(0); } return NULL; } FighterXdata Fighter::defaultXdata; Walking::Walking(const WalkingContext &,WalkingXdata &) :Locomotion() { } DEFINE_CREATE_ABILITY_FROM_STREAM(Walking) WalkingContext Walking::defaultContext; WalkingXdata Walking::defaultXdata; Walking::Walking(InStreamP in,CreatureP c, const WalkingContext &, WalkingXdata &) : Locomotion(in,c) { } AbilityId Walking::get_ability_id() { return AB_Walking; } void Walking::act() { Vel vel = cre->get_vel(); const Pos &rawPos = cre->get_raw_pos(); // Avoid getting stuck. /* if (cre->alive() && velPrev.dy > 0 && rawPosPrev == rawPos) { Vel velNext(0,vel.dy); cre->set_vel_next(velNext); #ifdef PRINT_ERRORS cerr << "Walking::_act() trying to get unstuck." << endl; #endif return; } velPrev = vel; rawPosPrev = rawPos; */ // Methods of Moving or Creature. Speed acceleration = cre->get_acceleration(); #if WIN32 acceleration = (int)(acceleration * 1.5); #endif Speed jump = cre->get_jump(); const Stance stance = cre->get_stance(); const Touching touchingArea = cre->get_touching_area(); const Touching touchingStance = cre->get_touching_stance(); const Hanging &hanging = cre->get_hanging(); const Acc *unitAccs = cre->get_unit_accs(); const Boolean canClimb = cre->can_climb(); const Area area = cre->get_area(); const ITcommand command = cre->get_command(); // Default set gravity. cre->set_grav_next((touchingArea == CO_dn) || (canClimb && (stance == CO_climb) && cre->alive()) ? 0 : PH_GRAVITY); // Change stance if necessary. if (stance != CO_climb) { if (touchingArea != touchingStance) { cre->set_want_climb(False); // Hit the ground. if (touchingArea == CO_dn) { cre->set_stance_next(CO_center); Vel velNew(vel.dx,0.0f); cre->set_vel_next(velNew); } // Side walls. else if (touchingArea == CO_r) { // Keep the +-1 in so that when Heros jump against small // walls/bumps he still goes over. Vel velNew(1.0f,vel.dy); cre->set_vel_next(velNew); } else if (touchingArea == CO_l) { Vel velNew(-1.0f,vel.dy); cre->set_vel_next(velNew); } // In the air. else if (touchingArea == CO_air) { cre->set_stance_next(CO_air); } else if (touchingArea != CO_up) { assert(0); } } else if (touchingArea == CO_dn) { if (vel.dy != 0) { Vel velNew(vel.dx,0.0f); cre->set_vel_next(velNew); } } } // Stop climbing if not in climbing square. else if (!canClimb) { // stance == CO_climb cre->set_stance_next(CO_air); } /* Interpret commands from controlling intelligence. May override some of above settings. */ switch (command) { case IT_CENTER: if (stance == CO_air) { cre->set_want_climb(True); } if ((stance != CO_climb) && canClimb && (stance != CO_dn) && (stance != CO_center)) { cre->set_stance_next(CO_climb); cre->set_vel_next(0); cre->set_grav_next(0); cre->center_wsquare_x_next(area.middle_wsquare()); cre->set_want_climb(False); } else if (stance != CO_air) { cre->set_vel_next(0); } break; case IT_R: if ((stance == CO_dn) || (stance == CO_center) || // Regular walking. (stance == CO_climb)) { DO_INCREASE(vel.dx); cre->set_vel_next(vel + acceleration * unitAccs[CO_center_R]); } break; case IT_DN_R: if (stance == CO_dn) { DO_INCREASE(vel.dx); DO_INCREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_dn_R]); } else if (stance == CO_center) { // Crawling. DO_INCREASE(vel.dx); DO_INCREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_dn_R]); cre->set_stance_next(CO_dn); } else if (stance == CO_climb) { DO_INCREASE(vel.dx); DO_INCREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_center_R]); } break; case IT_DN: if (stance == CO_air) { cre->set_want_climb(True); } if ((stance != CO_climb) && canClimb && !cre->standing_squarely()) { cre->set_stance_next(CO_climb); cre->set_vel_next(0); cre->set_grav_next(0); cre->center_wsquare_x_next(area.middle_wsquare()); cre->set_want_climb(False); } // slow down. else if (stance == CO_dn) { cre->set_vel_next(0); } else if (stance == CO_center) { cre->set_stance_next(CO_dn); } else if (stance == CO_climb) { DO_INCREASE(vel.dy); if (touchingArea == CO_dn) { cre->set_stance_next(CO_dn); Vel velNew(vel.dx,0.0f); cre->set_vel_next(velNew); } else { cre->set_vel_next(vel + acceleration * unitAccs[CO_climb_DN]); } } break; case IT_DN_L: if (stance == CO_dn) { // Crawling. DO_DECREASE(vel.dx); DO_INCREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_dn_L]); } else if (stance == CO_center) { // Crawling. DO_DECREASE(vel.dx); DO_INCREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_dn_L]); cre->set_stance_next(CO_dn); } else if (stance == CO_climb) { DO_DECREASE(vel.dx); DO_INCREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_center_L]); } break; case IT_L: if ((stance == CO_dn) || (stance == CO_center) || // Regular walking. (stance == CO_climb)) { DO_DECREASE(vel.dx); cre->set_vel_next(vel + acceleration * unitAccs[CO_center_L]); } break; case IT_UP_L: if ((stance == CO_dn) || (stance == CO_center) || (stance == CO_climb)) { // Jump left. DO_DECREASE(vel.dx); cre->set_vel_next(vel + jump * unitAccs[CO_air_L]); cre->set_stance_next(CO_air); } break; case IT_UP: if (stance == CO_air) { cre->set_want_climb(True); } // Doors are handled by Creature. if (cre->on_door()) break; if ((stance != CO_climb) && canClimb) { cre->set_stance_next(CO_climb); cre->set_vel_next(0); cre->set_grav_next(0); cre->center_wsquare_x_next(area.middle_wsquare()); cre->set_want_climb(False); } else if (stance == CO_dn) { cre->set_stance_next(CO_center); } else if (stance == CO_center) { // Jump up. cre->set_vel_next(vel + jump * unitAccs[CO_air_UP]); cre->set_stance_next(CO_air); } else if (stance == CO_climb) { DO_DECREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_climb_UP]); } break; case IT_UP_R: // Jump right. if ((stance == CO_dn) || (stance == CO_center) || (stance == CO_climb)) { DO_INCREASE(vel.dx); cre->set_vel_next(vel + jump * unitAccs[CO_air_R]); cre->set_stance_next(CO_air); } break; } } Sticky::Sticky(const StickyContext &cx,StickyXdata &) : Locomotion() { wantCorner1 = wantCorner2 = CO_air; set_dont_attach(False); context = &cx; } DEFINE_CREATE_ABILITY_FROM_STREAM(Sticky) StickyContext Sticky::defaultContext; StickyXdata Sticky::defaultXdata; Sticky::Sticky(InStreamP in,CreatureP c, const StickyContext &, StickyXdata &) : Locomotion(in,c) { wantCorner1 = wantCorner2 = CO_air; set_dont_attach(False); } void Sticky::initialize(CreatureP c) { Locomotion::initialize(c); assert(has_required_frames(cre->get_moving_context())); } AbilityId Sticky::get_ability_id() { return AB_Sticky; } void Sticky::act() { // Methods of Moving or Creature. Speed acceleration = cre->get_acceleration(); #if WIN32 acceleration = (int)(acceleration * 1.5); #endif Speed jump = cre->get_jump(); const Stance stance = cre->get_stance(); const Touching touchingArea = cre->get_touching_area(); const Touching touchingStance = cre->get_touching_stance(); const Hanging &hanging = cre->get_hanging(); Vel vel = cre->get_vel(); const Acc *unitAccs = cre->get_unit_accs(); const Boolean canClimb = cre->can_climb(); const Area area = cre->get_area(); const ITcommand command = cre->get_command(); // Disable the dontAttach flag if we aren't in the air anymore. if (stance != CO_air && get_dont_attach()) { set_dont_attach(False); } // Have to do this check here because we need the flag set // before checking whether we should attach to walls. if ((command == IT_UP_L || command == IT_UP_R) && stance == CO_air) { set_dont_attach(True); } /* Set gravity. Don't lock on walls if dead. */ cre->set_grav_next( // Dead and not on the ground (!cre->alive() && (touchingArea != CO_dn)) || // Touching wall or ceiling, but dontAttach flag is set. (get_dont_attach() && (touchingArea == CO_r || touchingArea == CO_l || touchingArea == CO_up)) || // In the air and not on a ladder. ((touchingArea == CO_air) && !(canClimb && (stance == CO_climb))) ? PH_GRAVITY : 0); /* Make stance correspond to touching. I.e. attach / detach to wall. Do not attach to wall if climbing. */ if ((stance != CO_climb) || !canClimb) { if ((touchingArea != touchingStance) || ((stance == CO_climb) && !canClimb)) { cre->set_want_climb(False); if (touchingArea == CO_dn) { cre->set_stance_next(CO_center); Vel velNew(vel.dx,0.0f); cre->set_vel_next(velNew); } else if (touchingArea == CO_r) { if (get_dont_attach()) { // Keep the +-1 in so that when jump against small // walls/bumps he still goes over. Vel velNew(1.0f,vel.dy); cre->set_vel_next(velNew); } else { // attach cre->set_stance_next(CO_r); cre->set_vel_next(0); // Vel velNew(0.0f,vel.dy); // cre->set_vel_next(velNew); } } else if (touchingArea == CO_l) { if (get_dont_attach()) { Vel velNew(-1.0f,vel.dy); cre->set_vel_next(velNew); } else { // attach cre->set_stance_next(CO_l); cre->set_vel_next(0); // Vel velNew(0.0f,vel.dy); // cre->set_vel_next(velNew); } } else if (touchingArea == CO_up) { if (!get_dont_attach()) { cre->set_stance_next(CO_up); // cre->set_vel_next(0); Vel velNew(vel.dx,0.0f); cre->set_vel_next(velNew); } } else if (touchingArea == CO_air) { cre->set_stance_next(CO_air); } else { assert(0); } } else if ((touchingArea == CO_dn) || (touchingArea == CO_up)) { // Maybe we should get on/off ladder here, right now is done // below. if (vel.dy != 0) { Vel velNew(vel.dx,0.0f); cre->set_vel_next(velNew); } } else if ((touchingArea == CO_r) || (touchingArea == CO_l)) { if (vel.dx != 0) { Vel velNew(0.0f,vel.dy); cre->set_vel_next(velNew); } } } // Stop climbing if not in climbing square. // else if (! canClimb) // stance == CO_climb // cre->set_stance_next(CO_air); /* Interpret commands from controlling intelligence. May override some of above settings. */ switch (command) { case IT_CENTER: if (stance == CO_air) { cre->set_want_climb(True); } set_want_corner(CO_air); if ((stance != CO_climb) && canClimb && (stance != CO_dn) && (stance != CO_center)) { cre->set_stance_next(CO_climb); cre->set_vel_next(0); cre->set_grav_next(0); cre->center_wsquare_x_next(area.middle_wsquare()); } else if (stance != CO_air) { cre->set_vel_next(0); } break; case IT_R: set_want_corner(CO_air); if (stance == CO_r) { // On right wall. cre->set_vel_next(0); set_want_corner(CO_r_UP,CO_r_DN); } else if ((stance == CO_dn) || (stance == CO_center) || // Regular walking. (stance == CO_climb)) { DO_INCREASE(vel.dx); cre->set_vel_next(vel + acceleration * unitAccs[CO_center_R]); } else if (stance == CO_l) { // On left wall. DO_INCREASE(vel.dx); cre->set_vel_next(vel + PH_PUSH_OFF * unitAccs[CO_R]); } else if (stance == CO_up) {// On ceiling. DO_INCREASE(vel.dx); cre->set_vel_next(vel + acceleration * unitAccs[CO_up_R]); } break; case IT_DN_R: set_want_corner(CO_air); if (stance == CO_r) {// On right wall. DO_INCREASE(vel.dx); DO_INCREASE(vel.dy); set_want_corner(CO_r_DN); cre->set_vel_next(vel + acceleration * unitAccs[CO_r_DN]); } else if (stance == CO_dn) { DO_INCREASE(vel.dx); DO_INCREASE(vel.dy); set_want_corner(CO_dn_R); cre->set_vel_next(vel + acceleration * unitAccs[CO_dn_R]); } else if ((stance == CO_l) || (stance == CO_up)) { DO_INCREASE(vel.dx); DO_INCREASE(vel.dy); cre->set_vel_next(vel + PH_PUSH_OFF * unitAccs[CO_DN_R]); } else if (stance == CO_center) { // regular walking DO_INCREASE(vel.dx); DO_INCREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_dn_R]); cre->set_stance_next(CO_dn); } else if (stance == CO_climb) { DO_INCREASE(vel.dx); DO_INCREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_center_R]); } break; case IT_DN: if (stance == CO_air) { cre->set_want_climb(True); } set_want_corner(CO_air); if ((stance != CO_climb) && canClimb && !cre->standing_squarely()) { cre->set_stance_next(CO_climb); cre->set_vel_next(0); cre->set_grav_next(0); cre->center_wsquare_x_next(area.middle_wsquare()); } else if (stance == CO_dn) { cre->set_vel_next(0); set_want_corner(CO_dn_R,CO_dn_L); } else if (stance == CO_center) { // duck cre->set_stance_next(CO_dn); } else if (stance == CO_up) { DO_INCREASE(vel.dy); cre->set_vel_next(vel + PH_PUSH_OFF * unitAccs[CO_DN]); } else if (stance == CO_r) { DO_INCREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_r_DN]); } else if (stance == CO_l) { DO_INCREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_l_DN]); } else if (stance == CO_climb) { if (touchingArea == CO_dn) { cre->set_stance_next(CO_dn); Vel velNew(vel.dx,0.0f); cre->set_vel_next(velNew); } else { DO_INCREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_climb_DN]); } } break; case IT_DN_L: set_want_corner(CO_air); if ((stance == CO_r) || (stance == CO_up)) {// On other walls. DO_DECREASE(vel.dx); DO_INCREASE(vel.dy); cre->set_vel_next(vel + PH_PUSH_OFF * unitAccs[CO_DN_L]); } else if (stance == CO_dn) {// Crawling. DO_DECREASE(vel.dx); DO_INCREASE(vel.dy); set_want_corner(CO_dn_L); cre->set_vel_next(vel + acceleration * unitAccs[CO_dn_L]); } else if (stance == CO_l) {// On left wall. DO_DECREASE(vel.dx); DO_INCREASE(vel.dy); set_want_corner(CO_l_DN); cre->set_vel_next(vel + acceleration * unitAccs[CO_l_DN]); } else if (stance == CO_center) {// Crawling. DO_DECREASE(vel.dx); DO_INCREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_dn_L]); cre->set_stance_next(CO_dn); } else if (stance == CO_climb) { DO_DECREASE(vel.dx); DO_INCREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_center_L]); } break; case IT_L: set_want_corner(CO_air); if (stance == CO_l) {// On left wall. set_want_corner(CO_l_DN,CO_l_UP); cre->set_vel_next(0); } else if ((stance == CO_dn) || (stance == CO_center) || // Regular walking. (stance == CO_climb)) { DO_DECREASE(vel.dx); cre->set_vel_next(vel + acceleration * unitAccs[CO_center_L]); } else if (stance == CO_r) {// On right wall. DO_DECREASE(vel.dx); cre->set_vel_next(vel + PH_PUSH_OFF * unitAccs[CO_L]); } else if (stance == CO_up) {// On ceiling. DO_DECREASE(vel.dx); cre->set_vel_next(vel + acceleration * unitAccs[CO_up_L]); } break; case IT_UP_L: set_want_corner(CO_air); if ((stance == CO_r) || (stance == CO_dn) || (stance == CO_center) || (stance == CO_climb)) { // Jump left. DO_DECREASE(vel.dx); DO_DECREASE(vel.dy); cre->set_vel_next(vel + jump * unitAccs[CO_air_L]); cre->set_stance_next(CO_air); } else if (stance == CO_l) {// On left wall. DO_DECREASE(vel.dx); DO_DECREASE(vel.dy); set_want_corner(CO_l_UP); cre->set_vel_next(vel + acceleration * unitAccs[CO_l_UP]); } else if (stance == CO_up) {// On ceiling. DO_DECREASE(vel.dx); DO_DECREASE(vel.dy); set_want_corner(CO_up_L); cre->set_vel_next(vel + acceleration * unitAccs[CO_up_L]); } break; case IT_UP: // Doors are handled by Creature. if (cre->on_door()) { break; } if (stance == CO_air) { cre->set_want_climb(True); } set_want_corner(CO_air); if ((stance != CO_climb) && canClimb && stance != CO_up) { cre->set_stance_next(CO_climb); cre->set_vel_next(0); cre->set_grav_next(0); cre->center_wsquare_x_next(area.middle_wsquare()); } else if (stance == CO_up) {// On ceiling. set_want_corner(CO_up_R,CO_up_L); cre->set_vel_next(0); } else if (stance == CO_dn) { cre->set_stance_next(CO_center); } else if (stance == CO_center) {// Jump up. DO_DECREASE(vel.dy); cre->set_vel_next(vel + jump * unitAccs[CO_air_UP]); cre->set_stance_next(CO_air); } else if (stance == CO_r) {// On right wall. DO_DECREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_r_UP]); } else if (stance == CO_l) {// On left wall. DO_DECREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_l_UP]); } else if (stance == CO_climb) { if (touchingArea == CO_up) { cre->set_stance_next(CO_up); Vel velNew(vel.dx,0.0f); cre->set_vel_next(velNew); } else { DO_DECREASE(vel.dy); cre->set_vel_next(vel + acceleration * unitAccs[CO_climb_UP]); } } break; case IT_UP_R: set_want_corner(CO_air); if (stance == CO_r) {// On right wall. DO_INCREASE(vel.dx); DO_DECREASE(vel.dy); set_want_corner(CO_r_UP); cre->set_vel_next(vel + acceleration * unitAccs[CO_r_UP]); } else if ((stance == CO_dn) || (stance == CO_l) || (stance == CO_center) || (stance == CO_climb)) { /* Jump right. */ DO_INCREASE(vel.dx); DO_DECREASE(vel.dy); cre->set_vel_next(vel + jump * unitAccs[CO_air_R]); cre->set_stance_next(CO_air); } else if (stance == CO_up) // On ceiling. { DO_INCREASE(vel.dx); DO_DECREASE(vel.dy); set_want_corner(CO_up_R); cre->set_vel_next(vel + acceleration * unitAccs[CO_up_R]); } break; } // Go around outside corners. if (want_corner(hanging.corner)) { cre->set_stance_next(cornered_stance(hanging)); // Transfer verto to horiz velocity if going from vertical to horiz stance. if (hanging.corner == CO_r_DN ||hanging.corner == CO_l_UP) { // Positive Y becomes positive X. Vel velNew(vel.dy,0.0f); cre->set_vel_next(velNew); } else if ( hanging.corner == CO_l_DN || hanging.corner == CO_r_UP) { // Positive Y becomes negative X. Vel velNew(-vel.dy,0.0f); cre->set_vel_next(velNew); } else { cre->set_vel_next(0); } cre->corner(hanging); set_want_corner(CO_air); } } Boolean Sticky::has_required_frames(const MovingContext *mc) { assert(mc); // Needs fucking everything. for (Dir dir = CO_center_R; dir < CO_R; dir++) { if (mc->animMax[dir] < 1) { return False; } } return True; } Boolean Sticky::want_corner(const Corner &corner) { return (corner != CO_air) && ((corner == wantCorner1) || (corner == wantCorner2)); } Boolean Sticky::stick_touching(Touching touching) { switch (touching) { case CO_r: // case CO_dn: Already granted by Creature. case CO_l: case CO_up: return True; default: return False; } } Stance Sticky::cornered_stance(const Hanging &hanging) { switch (hanging.corner) { case CO_r_DN: return CO_up; case CO_r_UP: return CO_dn; case CO_dn_R: return CO_l; case CO_dn_L: return CO_r; case CO_l_DN: return CO_up; case CO_l_UP: return CO_dn; case CO_up_R: return CO_l; case CO_up_L: return CO_r; default: assert(0); return CO_air; } } Flying::Flying(const FlyingContext &cx,FlyingXdata &) :Locomotion() { context = &cx; Timer nTimer(cx.gravTime); gravTimer = nTimer; } DEFINE_CREATE_ABILITY_FROM_STREAM(Flying) FlyingContext Flying::defaultContext; FlyingXdata Flying::defaultXdata; Flying::Flying(InStreamP in,CreatureP c, const FlyingContext &cx, FlyingXdata &) : Locomotion(in,c) { context = &cx; } AbilityId Flying::get_ability_id() { return AB_Flying; } void Flying::act() { // Methods of Moving or Creature. Speed acceleration = cre->get_acceleration(); #if WIN32 acceleration = (int)(acceleration * 1.5); #endif Speed jump = cre->get_jump(); const Stance stance = cre->get_stance(); const Touching touchingArea = cre->get_touching_area(); const Touching touchingStance = cre->get_touching_stance(); const Vel vel = cre->get_vel(); const Acc *unitAccs = cre->get_unit_accs(); const ITcommand command = cre->get_command(); // Used to be an assertion. But, now with dynamic abilities, is possible // for a creature to be in some other stance when given the Flying ability. // Drawing code should be ok. If the Creature used to have a Locomotion // that put him in the current stance, then it must have the frames to // draw in the stance. if (stance != CO_air && stance != CO_center) { cre->set_stance_next(CO_air); } /* Deal with gravity here instead of in Creature because falling less than one pixel per clock. */ cre->set_grav_next(0); // Don't use Creature's notion of gravity. // Limits on velNext imposed by Creature. Vel velNext = vel; if (touchingArea != CO_dn && gravTimer.ready() && vel.dy <= FLYING_GRAV_VEL_CUTOFF) { velNext.dy += 1; gravTimer.set(); } if (touchingArea != touchingStance) { if (touchingArea == CO_dn) { cre->set_stance_next(CO_center); velNext.dy = 0.0f; } else if (touchingArea == CO_air) { cre->set_stance_next(CO_air); } } /* Interpret commands from controlling intelligence. May override some of above settings. */ switch (command) { case IT_CENTER: velNext.set_zero(); break; case IT_R: DO_INCREASE(velNext.dx); velNext = velNext + acceleration * unitAccs[CO_R]; break; case IT_DN_R: DO_INCREASE(velNext.dx); DO_INCREASE(velNext.dy); if (stance == CO_air) { velNext = velNext + acceleration * unitAccs[CO_DN_R]; } else { velNext = velNext + acceleration * unitAccs[CO_center_R]; } break; case IT_DN: if (stance == CO_air) { DO_INCREASE(velNext.dy); velNext = velNext + acceleration * unitAccs[CO_DN]; } else { velNext.set_zero(); } break; case IT_DN_L: DO_DECREASE(velNext.dx); DO_INCREASE(velNext.dy); if (stance == CO_air) { velNext = velNext + acceleration * unitAccs[CO_DN_L]; } else { velNext = velNext + acceleration * unitAccs[CO_center_L]; } break; case IT_L: DO_DECREASE(velNext.dx); velNext = velNext + acceleration * unitAccs[CO_L]; break; case IT_UP_L: if (stance == CO_air) { DO_DECREASE(velNext.dx); DO_DECREASE(velNext.dy); velNext = velNext + acceleration * unitAccs[CO_air_L]; } else { DO_DECREASE(velNext.dx); velNext = velNext + jump * unitAccs[CO_air_L]; cre->set_stance_next(CO_air); } break; case IT_UP: // Doors are handled by Creature. if (cre->on_door()) break; if (stance == CO_air) { DO_DECREASE(velNext.dy); velNext = velNext + acceleration * unitAccs[CO_air_UP]; } else { velNext = velNext + jump * unitAccs[CO_air_UP]; cre->set_stance_next(CO_air); } break; case IT_UP_R: if (stance == CO_air) { DO_INCREASE(velNext.dx); DO_DECREASE(velNext.dy); velNext = velNext + acceleration * unitAccs[CO_air_R]; } else { DO_INCREASE(velNext.dx); velNext = velNext + jump * unitAccs[CO_air_R]; cre->set_stance_next(CO_air); } break; }; cre->set_vel_next(velNext); gravTimer.clock(); } BuiltIn::BuiltIn(const BuiltInContext &cx,BuiltInXdata &) :Ability() { // AltarOfSin requires that BuiltInXdata not be used, passes in dummy. context = &cx; Timer nTimer(cx.shotTime); shotTimer = nTimer; } DEFINE_CREATE_ABILITY_FROM_STREAM(BuiltIn) BuiltInContext BuiltIn::defaultContext; BuiltInXdata BuiltIn::defaultXdata; BuiltIn::BuiltIn(InStreamP in,CreatureP c, const BuiltInContext &cx, BuiltInXdata &) : Ability(in,c) { context = &cx; } AbilityId BuiltIn::get_ability_id() { return AB_BuiltIn; } ClassId BuiltIn::get_weapon_string(const char *&str) { // If we are a Holder with a current weapon, let Holder take // care of it. HolderP holder = cre->get_holder(); if (holder && holder->get_weapon_current()) { return A_None; } // Set to the BuiltIn weapon. str = context->weaponStr; return context->weaponClassId; } Boolean BuiltIn::ready() { return shotTimer.ready(); } void BuiltIn::act() { Dir shotDir; // If the context specifies a particular compute_weapon_dir function, // use it. Else, default. if (context->compute_weapon_dir) { shotDir = context->compute_weapon_dir(cre->get_command()); } else { shotDir = Intel::command_weapon_to_dir_8(cre->get_command()); } assert(context->create_shot && context->get_shot_size); HolderP holder = cre->get_holder(); if (shotTimer.ready() && shotDir != CO_air && // Don't fire if Creature is a holder with a current weapon. !(holder && holder->get_weapon_current())) { const Area &area = cre->get_area(); LocatorP locator = cre->get_locator(); Pos shotPos = Coord::shot_initial_pos(area,cre->get_touching_area(), context->get_shot_size(shotDir),shotDir); PhysicalP shot = context->create_shot(cre->get_world(),locator,shotPos, cre->get_id(),shotDir); shot->set_dont_collide(cre->get_id()); // Shot should not collide with any members of the shooter's composite object. CompositeP comp = cre->get_composite(); if (comp) { shot->set_dont_collide_composite(comp->get_composite_id()); } locator->add(shot); shotTimer.set(); // Make sound. if (context->attackSound) { SoundRequest req(context->attackSound,cre->get_area()); locator->submitSoundRequest(req); } // Signal that we attacked something. cre->attack_hook(); } shotTimer.clock(); } Hugger::Hugger(const HuggerContext &cx,HuggerXdata &) :Ability() { context = &cx; } DEFINE_CREATE_ABILITY_FROM_STREAM(Hugger) HuggerContext Hugger::defaultContext; HuggerXdata Hugger::defaultXdata; Hugger::Hugger(InStreamP in,CreatureP c, const HuggerContext &cx, HuggerXdata &) : Ability(in,c) { context = &cx; } AbilityId Hugger::get_ability_id() { return AB_Hugger; } int Hugger::get_drawing_level() { return 2; } void Hugger::act() { LocatorP locator = cre->get_locator(); PhysicalP huggee = locator->lookup(huggeeId); if (cre->alive() && huggee) { // Someone else killed the huggee while being hugged. if (!huggee->alive()) { Id invalid; huggeeId = invalid; } // Create new alien. else if (!cre->stunned() && !cre->stunned_next()) { const Area &area = huggee->get_area(); Pos middle = area.get_middle(); Size alienSize = Alien::get_size_max(); Pos alienPos(middle.x - alienSize.width / 2, middle.y - alienSize.height / 2); PhysicalP alien = new Alien(cre->get_world(),locator,alienPos); assert(alien); locator->add(alien); // Set the intelligence of the new Alien. if (context->useHuggeeIntel) { // Use intelligence of huggee. alien->set_intel(huggee->get_intel()); huggee->set_intel(NULL); // No kill is awarded for this death. } else { // Do one point of damage to huggee, so hugger will get credit for the // kill. Do this before swapping the intels. huggee->corporeal_attack(cre,1); // Use own intelligence. Huggee's intel dies with the huggee's // physical body. alien->set_intel(cre->get_intel()); cre->set_intel(NULL); } // kill huggee huggee->kill_self(); // kill hugger cre->kill_self(); } // huggee is alive() but hugger is stunned. else { // Stay locked onto hugee's face. const Area &area = huggee->get_area(); Pos p; Size s; area.get_rect(p,s); // Guess where hugee's face is, upper-left + (width/2,height*.3). Pos pNext(p.x + (int) (0.5 * s.width), p.y + (int) (0.3 * s.height)); cre->_set_middle_next(pNext); // Don't need to call update_area_next(), because Moving::act() is // yet to happen. } } // if (alive() && huggee) } Boolean Hugger::collide(PhysicalP other) { LocatorP l = cre->get_locator(); if ( // Dead Huggers don't hug. cre->alive() && // Make sure not already hugging something. !l->lookup(huggeeId) && // Only hug living biological creatures. other->alive() && other->is_creature() && ((CreatureP)other)->biological() && ///// Don't need the following two checks now that we have Teams. // Don't hug aliens or other huggers. other->get_class_id() != A_Alien && !((CreatureP)other)->get_ability(AB_Hugger) && // Don't hug alien immune creatures. !((CreatureP)other)->get_alien_immune() ) { // Kind of a hack, stun self as well as huggee. cre->stun_next(HUGGER_TIME); // Stun other for one turn longer so that we have one turn to // turn other into an alien. ((CreatureP)other)->stun_next(HUGGER_TIME + 1); // Don't want other to get killed or hugged when already being hugged. // Need two extra turns, one to turn other into Alien, and one for // synchronization as alienImmune is immediate and stun is not. ((CreatureP)other)->set_alien_immune(HUGGER_TIME + 2); huggeeId = other->get_id(); return True; } return False; } Prickly::Prickly(const PricklyContext &cx,PricklyXdata &) :Ability() { context = &cx; } DEFINE_CREATE_ABILITY_FROM_STREAM(Prickly) PricklyContext Prickly::defaultContext; PricklyXdata Prickly::defaultXdata; Prickly::Prickly(InStreamP in,CreatureP c, const PricklyContext &cx, PricklyXdata &) : Ability(in,c) { context = &cx; } AbilityId Prickly::get_ability_id() { return AB_Prickly; } ClassId Prickly::get_weapon_string(const char *&str) { // Code copied from Fighter::get_weapon_string(). // Sucks to have Abilities having to depend on peer Abilities. // If we are a Holder with a current weapon, let Holder take // care of it. HolderP holder = cre->get_holder(); if (holder && holder->get_weapon_current()) { return A_None; } // If a Lifter lifting something, let lifter take care of it. LifterP lifter = (LifterP)cre->get_ability(AB_Lifter); if (lifter && lifter->is_lifting()) { return A_None; } // Set to hand-to-hand str = "prickly"; return A_Prickly; } Boolean Prickly::collide(PhysicalP other) { if ( // Dead don't hurt. cre->alive() && // Use an AutoUse, don't destroy it. Would be better to put this check // somewhere else. !other->is_auto_use() && other->get_class_id() != A_AltarOfSin) { int damage = cre->apply_modifiers(Modifier::DAMAGE,context->damage); other->corporeal_attack(cre,damage); cre->attack_hook(); return True; } return False; } Healing::Healing(const HealingContext &cx,HealingXdata &) :Ability() { // don't use Xdata, AltarOfSin passes in dummy value. context = &cx; Timer t(context->time); healTimer = t; healTimer.set(); // dont set healthMin until Ability::cre is valid, in initialize(). } DEFINE_CREATE_ABILITY_FROM_STREAM(Healing) HealingContext Healing::defaultContext; HealingXdata Healing::defaultXdata; Healing::Healing(InStreamP in,CreatureP c, const HealingContext &cx, HealingXdata &) : Ability(in,c) { context = &cx; healthMin = cre->get_health(); } void Healing::initialize(CreatureP c) { Ability::initialize(c); // Must be after Ability::initialize(). healthMin = cre->get_health(); } AbilityId Healing::get_ability_id() { return AB_Healing; } void Healing::heal() { healthMin = cre->get_health_max(); } void Healing::act() { // alive_next() checks if something else has already killed this. if (cre->alive() && cre->alive_next()) { Health health = cre->get_health(); // BUG FIX: If we were just healed via Healing::heal(), don't heal // incrementallythis turn. Wait until next turn when // health has the new value. Otherwise we set healthMin incorrectly. // Would probably be a cleaner fix to have a "healthMinNext" like Moving does. if (cre->get_health_next() <= health) { if (health < healthMin) { healthMin = health; } // Only heal every few turns. if (healTimer.ready()) { // Heal up to multiplier * min health in units of unit. Health healthBest = Utils::minimum(cre->get_health_max(),((int)(healthMin * context->multiplier))); Health healthNext = health + context->unit; if (healthNext > healthBest) { healthNext = healthBest; } cre->set_health_next(healthNext); healTimer.set(); } } healTimer.clock(); } } LifterSpeedModifier::LifterSpeedModifier() : Modifier() { lifting = False; } ModifierId LifterSpeedModifier::get_modifier_id() { return M_LifterSpeed; } int LifterSpeedModifier::apply(Attribute attr,int val) { // Cut speed in half if lifting something. if (lifting) { switch (attr) { // case ACCELERATION: case AIR_SPEED: case CENTER_SPEED: case CLIMB_SPEED: case CRAWL_SPEED: // Using *= gives warnings on some compilers. val = (int)(val * 0.75); break; } } if (next) { return next->apply(attr,val); } else { return val; } } Lifter::Lifter(const LifterContext &cx,LifterXdata &) :Ability() { context = &cx; } DEFINE_CREATE_ABILITY_FROM_STREAM(Lifter) LifterContext Lifter::defaultContext; LifterXdata Lifter::defaultXdata; Lifter::Lifter(InStreamP in,CreatureP c, const LifterContext &cx, LifterXdata &) : Ability(in,c) { context = &cx; // Don't bother adding LifterSpeedModifier } void Lifter::initialize(CreatureP c) { // Call first, to set cre. Ability::initialize(c); ModifierP modifiers = cre->get_modifiers(); assert(modifiers); speedModifier = new LifterSpeedModifier(); assert(speedModifier); modifiers->append_unique(speedModifier); } AbilityId Lifter::get_ability_id() { return AB_Lifter; } ClassId Lifter::get_weapon_string(const char *&str) { // Don't have to worry about Holder since Lifter will only // lift if Holder has no items. LocatorP l = cre->get_locator(); PhysicalP p = l->lookup(liftable); if (p) { if (context->throwSpeed) { str = "throw"; } else { str = "drop"; } return A_DropLiftable; } return A_None; } void Lifter::act() { LocatorP l = cre->get_locator(); PhysicalP p = l->lookup(liftable); if (p) { assert(p->is_liftable()); // Make the Liftable follow the Lifter Area area = cre->get_area(); Pos pos; Size size; area.get_rect(pos,size); Pos middle = area.get_middle(); Area otherArea = p->get_area(); Size otherSize = otherArea.get_size(); Stance stance = cre->get_stance(); // Liftable drags on the floor or is carried. if (stance == CO_center || stance == CO_dn || // If can carry, always do so. context->throwSpeed) { // Start with position on floor. int yMiddle = pos.y + size.height - otherSize.height + (otherSize.height >> 1); int xMiddle = middle.x; // Carry head height if (context->throwSpeed) { // Center liftable about at head-height, unless that is lower // down than the floor y value. int headYMiddle = pos.y + (int)(0.3 * size.height); yMiddle = Utils::minimum(yMiddle,headYMiddle); // Don't lag when carrying. Vel vel = cre->get_vel(); xMiddle = (int)(middle.x + vel.dx); } // else drag on floor Pos middleNext(xMiddle,yMiddle); // Can cast to moving because it is a Liftable. ((MovingP)p)->set_middle_next(middleNext); } // Liftable hangs beneath the Lifter. else { Pos middleNext(middle.x, pos.y + size.height + (otherSize.height >> 1)); // Can cast to moving because it is a Liftable. ((MovingP)p)->set_middle_next(middleNext); } // Put all this shit in follow(). // We picked up a weapon, so drop the Liftable. HolderP holder = cre->get_holder(); if (holder && holder->get_weapons_num() > 0) { drop_liftable(p); return; } // Drop/throw the Liftable if any type of WEAPON command is issued. ITcommand command = cre->get_command(); if (command == IT_WEAPON_CHANGE || command == IT_WEAPON_DROP || command == IT_WEAPON_CENTER) { drop_liftable(p); return; } // Throw if we can. else if (Intel::is_command_weapon(command)) { if (context->throwSpeed) { Dir dir = Intel::command_weapon_to_dir_8(command); // Throw. throw_liftable(p,dir); } else { // Can only drop. drop_liftable(p); } return; } } // Tell speedModifier whether or not to slow us down. ((LifterSpeedModifier *)speedModifier)->set_lifting(p != NULL); } Boolean Lifter::collide(PhysicalP other) { // Don't do anything if already lifting. LocatorP l = cre->get_locator(); PhysicalP p = l->lookup(liftable); if (p) { // Disable collisions with weapons while we are lifting something. if (other->is_weapon()) { return True; } else { // Normal collisions. return False; } } // Can only lift Liftables. if (!other->is_liftable()) { return False; } // Already being lifted by someone else. if (((LiftableP)other)->being_lifted()) { return False; } // Not allowed to pick anything up if we have weapons. HolderP holder = cre->get_holder(); if (holder && holder->get_weapons_num() > 0) { return False; } // Similar to the way Heavy works, but more restrictive. const Area &area = cre->get_area(); const Area &otherArea = other->get_area(); const Pos &otherMiddle = otherArea.get_middle(); Dir dirTo = area.dir_to(otherMiddle); // Make it easier to pick up stuff, wider range of acceptable dirs. if ((dirTo == CO_DN || dirTo == CO_DN_R || dirTo == CO_DN_L) || // If we can throw, we can pick up from any direction. context->throwSpeed > 0) { liftable = other->get_id(); ((LiftableP)other)->lift(cre); // Don't need to make the Liftable follow here, because _act() will take // care of it. collide() happens before act(). } return True; } Boolean Lifter::is_lifting() { LocatorP l = cre->get_locator(); PhysicalP p = l->lookup(liftable); return (p != NULL); } void Lifter::drop_liftable(PhysicalP p) { if (p) { ((LiftableP)p)->release(cre); liftable.invalidate(); // Dropping is considered an attack. cre->attack_hook(); } } void Lifter::throw_liftable(PhysicalP p,Dir dir) { if (p && p->is_moving()) { ((LiftableP)p)->release(cre); liftable.invalidate(); const Vel *unitVels = cre->get_unit_vels(); ((MovingP)p)->set_extra_vel_next((float)context->throwSpeed * unitVels[dir]); // Throwing is considered an attack. cre->attack_hook(); } } Morphed::Morphed(const MorphedContext &cx,MorphedXdata &, PhysicalP p) :Ability() { if (p) { assert(p->get_intel() == NULL); unmapped = p->get_id(); timer.set(cx.revertTime); unmappedSet = True; } else { unmappedSet = False; } } DEFINE_CREATE_ABILITY_FROM_STREAM(Morphed) MorphedContext Morphed::defaultContext; MorphedXdata Morphed::defaultXdata; Morphed::Morphed(InStreamP in,CreatureP c, const MorphedContext &,MorphedXdata &) : Ability(in,c) { unmappedSet = False; } AbilityId Morphed::get_ability_id() { return AB_Morphed; } void Morphed::get_followers(PtrList &list) { // Included the unmapped object, e.g. so you don't get stuck as a frog for // the new level. if (unmappedSet) { LocatorP locator = cre->get_locator(); PhysicalP p = locator->lookup(unmapped); if (p) { list.add(p); } } } void Morphed::drop_all() { // Drop everything the unmapped object is carrying. if (unmappedSet) { LocatorP locator = cre->get_locator(); PhysicalP p = locator->lookup(unmapped); if (p) { p->drop_all(); } } } void Morphed::act() { // alive() may not be necessary. if (cre->alive() && unmappedSet) { LocatorP locator = cre->get_locator(); PhysicalP p = locator->lookup(unmapped); if (p && p->alive()) { #if 0 // Should be taken care of by the follower logic. assert(p->is_moving()); const Area &area = cre->get_area(); ((MovingP)p)->set_middle_next(area.get_middle()); #endif // Morph cre back into its original form. if (timer.ready()) { p->set_intel(cre->get_intel()); p->set_mapped_next(True); cre->set_intel(NULL); cre->set_quiet_death(); cre->kill_self(); unmappedSet = False; } } } if (unmappedSet) { timer.clock(); } } void Morphed::die() { if (unmappedSet) { LocatorP locator = cre->get_locator(); PhysicalP p; if ((p = locator->lookup(unmapped)) && p->alive()) { assert(p->get_intel() == NULL); p->set_intel(cre->get_intel()); cre->set_intel(NULL); // propagate the quiet death flag, or map so that the corpse is visible. if (cre->get_quiet_death()) { p->set_quiet_death(); } else { p->set_mapped_next(True); // Is this necessary with the follower logic? const Area &area = cre->get_area(); assert(p->is_moving()); ((MovingP)p)->set_middle_next(area.get_middle()); } // Kill off the unmapped object if (!p->die_called()) { /* Partial hack to prevent corpse from getting knocked out of the world. */ const Area &area = p->get_area_next(); WorldP world = cre->get_world(); if (!world->inside(area.middle_wsquare())) { p->set_quiet_death(); } p->kill_self(); p->die(); } // Want the corpse of the unmapped, not the Morphed Creature. cre->set_quiet_death(); } } } AnimTime::AnimTime(const AnimTimeContext &cx,AnimTimeXdata &) :Ability() { context = &cx; assert(context->animTime > 0); } AbilityP AnimTime::create_from_stream(InStreamP in,CreatureP creat) { ClassId cId = creat->get_class_id(); AbilityP ret = new AnimTime(in,creat,*lookup_context(cId),defaultXdata); assert(ret); return ret; } AnimTime::AnimTime(InStreamP in,CreatureP c, const AnimTimeContext &cx,AnimTimeXdata &) : Ability(in,c) { context = &cx; } void AnimTime::initialize(CreatureP c) { Ability::initialize(c); // Just so will assert if a class wasn't registered. lookup_context(cre->get_class_id()); } AbilityId AnimTime::get_ability_id() { return AB_AnimTime; } int AnimTime::get_anim_time() { return context->animTime; } const AnimTimeContext *AnimTime::lookup_context(ClassId cId) { switch (cId) { case A_Seal: return &Seal::animTimeContext; case A_Walker: return &Walker::animTimeContext; case A_Yeti: return &Yeti::animTimeContext; default: assert(0); } return NULL; } AnimTimeXdata AnimTime::defaultXdata; OnFire::OnFire(const OnFireContext &cx,OnFireXdata &) :Ability() { context = &cx; // don't use OnFireXdata, AltarOfSin passes in dummy value. } DEFINE_CREATE_ABILITY_FROM_STREAM(OnFire) OnFireContext OnFire::defaultContext; OnFireXdata OnFire::defaultXdata; OnFire::OnFire(InStreamP in,CreatureP c, const OnFireContext &cx,OnFireXdata &) :Ability(in,c) { context = &cx; } AbilityId OnFire::get_ability_id() { return AB_OnFire; } Boolean OnFire::heat_attack(PhysicalP,int,Boolean) { // We took care of it, do nothing. return True; } void OnFire::act() { // For composite objects, only the leader is OnFire. // May need something more general later. CompositeP comp = cre->get_composite(); if (comp) { if (!comp->is_leader()) { return; } } // Dead object only burn if context->deadBurns is set. if (!(cre->alive() || context->deadBurns)) { return; } const Area &area = cre->get_area(); Pos pos; Size size; area.get_rect(pos,size); LocatorP locator = cre->get_locator(); // Generate fire. for (int n = 0; n < context->fires; n++) { Pos firePos(pos.x + Utils::choose(size.width), pos.y + Utils::choose((int)(.8 * size.height))); PhysicalP fire = new Fire(cre->get_world(),locator,firePos,False); locator->add(fire); } } Boolean OnFire::collide(PhysicalP other) { // Don't burn things that we want to pick up. HolderP holder = cre->get_holder(); if (holder && holder->ok_to_hold(other)) { return False; } if (cre->alive() && !other->is_shot()) { other->heat_attack(cre,context->heat); cre->attack_hook(); return True; } return False; } SwapProtect::SwapProtect(const SwapProtectContext &cx,SwapProtectXdata &) :Ability() { swapResistance = cx.swapResistance; } DEFINE_CREATE_ABILITY_FROM_STREAM(SwapProtect) SwapProtectContext SwapProtect::defaultContext; SwapProtectXdata SwapProtect::defaultXdata; SwapProtect::SwapProtect(InStreamP in,CreatureP c, const SwapProtectContext &,SwapProtectXdata &) :Ability(in,c) { swapResistance = 0; } AbilityId SwapProtect::get_ability_id() { return AB_SwapProtect; } Boolean SwapProtect::swap_protect() { if (swapResistance > 0) { swapResistance--; return True; } return False; } Boolean SwapProtect::frog_protect() { return True; } Composite::Composite() : Ability() { } Composite::Composite(InStreamP in,CreatureP cre) : Ability(in,cre) { } Boolean Composite::is_composite() { return True; } PhysicalP Composite::get_draw_before_me() { return NULL; } CompositeId Composite::idGenerator = 0; Segmented::Segmented(const SegmentedContext &cx,SegmentedXdata &) :Composite() { context = &cx; isLeader = False; leaderAnimNum = 0; leaderAnimTimer.set_max(LEADER_ANIM_TIME); followDistance = context->followDistance; } DEFINE_CREATE_ABILITY_FROM_STREAM(Segmented) Segmented::Segmented(InStreamP in,CreatureP c, const SegmentedContext &cx,SegmentedXdata &) :Composite(in,c) { context = &cx; isLeader = False; update_from_stream(in); // don't bother with leaderAnimTimer // followDistance will come from update_from_stream(). } void Segmented::update_from_stream(InStreamP in) { isLeader = (Boolean)in->read_char(); next.read(in); leaderAnimNum = (int)in->read_char(); followDistance = (int)in->read_short(); } int Segmented::get_write_length() { return sizeof(char) + // isLeader Identifier::get_write_length() + // next, needed for get_draw_before_me() sizeof(char) + // leaderAnimNum sizeof(u_short); // followDistance } void Segmented::write(OutStreamP out) { out->write_char(isLeader); next.write(out); out->write_char((u_char)leaderAnimNum); assert(followDistance < USHRT_MAX); out->write_short((u_short)followDistance); } AbilityId Segmented::get_ability_id() { return AB_Segmented; } void Segmented::get_followers(PtrList &list) { if (cre->alive()) { LocatorP l = cre->get_locator(); PhysicalP nextP = l->lookup(next); if (nextP) { if (nextP->alive() && nextP->is_creature() && nextP->get_ability(AB_Segmented)) { list.add(nextP); } } } } Boolean Segmented::follow(const Area &followeeArea,Dir, Boolean currentAndNext) { // Make cre follow followeeArea const Area &area = cre->get_area(); Pos fPos = followeeArea.get_middle(); Pos pos = area.get_middle(); int dist_2 = pos.distance_2(fPos); // Don't get too close. if (dist_2 > followDistance * followDistance) { // Kinda expensive, a sqrt() and a divide. float dist = (float)sqrt((double)dist_2); float invert_dist = 1.0f / dist; // delta points from followee to cre Vel delta((float)(pos.x - fPos.x),(float)(pos.y - fPos.y)); // Move along vector from nPos to pos. Pos newPos = fPos + (followDistance * invert_dist) * delta; // The "approved" way of setting the next pos for ::follow(). // Don't use set_middle_next(), because that won't handle currentAndNext // properly. _set_middle_next() exists for this purpose. cre->_set_middle_next(newPos); cre->update_area_next(currentAndNext); } // else if already too close, don't worry about it. // True even if we are too close. In either case, we handled it. return True; } Boolean Segmented::get_pixmap_mask(Xvars &xvars,int dpyNum,CMN_IMAGEDATA &pixmap, Dir dir,int animNum) { Dir mappedDir; int mappedAnimNum; map_dir_anim_num(mappedDir,mappedAnimNum,dir,animNum); // Call non-virtual Creature::_get_pixmap_mask, to avoid recursion. cre->_get_pixmap_mask(xvars,dpyNum,pixmap,mappedDir,mappedAnimNum); return True; } void Segmented::set_intel(IntelP intel) { LocatorP l = cre->get_locator(); // Is this the head of a chain of null intels. // That is the only thing where a Human is allowed to control // more than just one segment. Boolean headOfNullIntels = True; if (l->lookup(prev)) { headOfNullIntels = False; } else { PhysicalP p = cre; while (p) { if (p->get_intel()) { headOfNullIntels = False; break; } SegmentedP s = (SegmentedP)p->get_ability(AB_Segmented); if (s) { p = l->lookup(s->next); // Success as soon as p is NULL here. } // This shouldn't happen. else { headOfNullIntels = False; break; } } } // Another hack here, this doesn't work properly if the locator hasn't // been clocked yet, but doesn't break anything. When called from // Game::create_human_and_physical(). // kind of a hack. // If a human takes over, change the compositeId. if (!headOfNullIntels && intel && intel->is_human()) { CompositeId newCId = Composite::generate_id(); set_composite_id(newCId); } // TODO: If a human soul-swaps into a dragon, do // something smart like turn all the // following segments into doppelgangers, or make them all // harmless, or remove their intel. Careful not to fuck up the // locator's registry of intels. } void Segmented::act() { LocatorP l = cre->get_locator(); // Disconnect prev segment if not valid. PhysicalP p = l->lookup(prev); if (p && !compatible_prev(p)) { prev.invalidate(); SegmentedP segPrev = (SegmentedP)p->get_ability(AB_Segmented); if (segPrev) { segPrev->next.invalidate(); } } // Become leader if prev has died or has become incompatible. // Must be after checking for disconnecting prev segment. if (!isLeader) { if (!l->lookup(prev)) { assume_leadership(); } } // Disconnect next segment if not valid. PhysicalP n = l->lookup(next); if (n && !compatible_next(n)) { next.invalidate(); SegmentedP segNext = (SegmentedP)n->get_ability(AB_Segmented); if (segNext) { segNext->prev.invalidate(); } } leaderAnimTimer.clock(); } void Segmented::update() { if (leaderAnimTimer.ready()) { const MovingContext* mc = cre->get_moving_context(); // Choose the leader animNum randomly. // We will probably want to make this behavior more general if we use // Segmented for more than just Dragon. leaderAnimNum = Utils::choose(mc->animMax[LEADER_DIR]); leaderAnimTimer.set(); } } Boolean Segmented::compatible_prev(PhysicalP p) { assert(p); // Only a null intel can follow another null intel. IntelP intel = cre->get_intel(); IntelP prevIntel = p->get_intel(); if (intel && !prevIntel) { return False; } if (!p->alive() || !cre->alive()) { return False; } SegmentedP seg = (SegmentedP)p->get_ability(AB_Segmented); if (!seg) { return False; } // Disconnect if composite ids don't match. if (seg->get_composite_id() != get_composite_id()) { return False; } // A human cannot follow anything except null. if (intel && intel->is_human() && prevIntel) { return False; } // Ok for a non-human to follow. // Machine::clock() will cause non-humans to do nothing if not the // leader. return True; } Boolean Segmented::compatible_next(PhysicalP n) { assert(n); // Only a null intel can follow another null intel. IntelP intel = cre->get_intel(); IntelP nextIntel = n->get_intel(); if (!intel && nextIntel) { return False; } if (!n->alive() || !cre->alive()) { return False; } SegmentedP seg = (SegmentedP)n->get_ability(AB_Segmented); if (!seg) { return False; } // Disconnect if composite ids don't match. if (seg->get_composite_id() != get_composite_id()) { return False; } // human can only be followed by null intel. if (intel && intel->is_human() && nextIntel) { return False; } // Ok for a non-human to follow a human, // Machine::clock() will cause non-humans to do nothing if not the // leader. return True; } Boolean Segmented::is_leader() { return isLeader; } PhysicalP Segmented::get_draw_before_me() { // Always draw the Segmented object from tail to head. LocatorP l = cre->get_locator(); PhysicalP p = l->lookup(next); // May be NULL. return p; } void Segmented::create_and_add_composite(PtrList &ret,WorldP world, LocatorP locator, int segmentsNum,const Pos &pos, PhysicalP (*create)(void *arg,WorldP w,LocatorP l,const Pos &pos), void *arg) { assert(segmentsNum > 0 && ret.length() == 0); CompositeId cId = generate_id(); ret.fill(segmentsNum); // Create chain from back to front. PhysicalP nextSegment = NULL; // The segment just created. for (int n = 0; n < segmentsNum; n++) { // Create them all in the same place. No reason not to. PhysicalP obj = create(arg,world,locator,pos); assert(obj && obj->is_creature()); // Mark all objects in the chain as being part of the same composite // Creature. SegmentedP seg = (SegmentedP)obj->get_ability(AB_Segmented); // The create() function better create something with the Segmented abiltiy. assert(seg); seg->set_composite_id(cId); // Must add before seg->insert_before() so has valid Id. locator->add(obj); if (nextSegment) { SegmentedP seg = (SegmentedP)obj->get_ability(AB_Segmented); assert(seg); seg->insert_before((CreatureP)nextSegment); } nextSegment = obj; // Insert in reverse order so head is at element 0. ret.set(segmentsNum - 1 - n,obj); } // nextSegment ends up pointing at the beginning of the chain. assert(nextSegment); } void Segmented::insert_before(CreatureP nextC) { LocatorP l = cre->get_locator(); SegmentedP nextS = (SegmentedP)nextC->get_ability(AB_Segmented); assert(nextS); Id id = cre->get_id(); // assert(l->lookup(id)); Id nextId = nextC->get_id(); // assert(l->lookup(nextId)); // Generic linked list insert. prev = nextS->prev; PhysicalP prevP = l->lookup(prev); if (prevP) { SegmentedP prevS = (SegmentedP)prevP->get_ability(AB_Segmented); assert(prevS); assert(prevS->next == nextId); // Or chain was broken. prevS->next = id; } nextS->prev = id; next = nextId; // Each segment agrees not to collide with the next one. cre->set_dont_collide(nextC->get_id()); } void Segmented::assume_leadership() { // Doesn't work when you shoot the head. #if 0 // kind of a hack. // If a human takes over, change the compositeId. IntelP intel = cre->get_intel(); if (intel && intel->is_human()) { LocatorP l = cre->get_locator(); CompositeId newCId = Composite::generate_id(); // Don't recurse, human will only control one segment. PhysicalP p = cre; // while (p) { SegmentedP seg = (SegmentedP)p->get_ability(AB_Segmented); assert(seg); seg->set_composite_id(newCId); // p = l->lookup(seg->get_next()); //} } #endif isLeader = True; } void Segmented::map_dir_anim_num(Dir& mappedDir,int& mappedAnimNum,Dir dir,int animNum) { mappedDir = dir; mappedAnimNum = animNum; // Map direction to get leader pixmaps. Don't remap dead pixmaps. if (dir != Creature::DEAD_DIR && is_leader()) { mappedAnimNum = leaderAnimNum; mappedDir = LEADER_DIR; } } SegmentedContext Segmented::defaultContext; SegmentedXdata Segmented::defaultXdata; Sensitive::Sensitive(const SensitiveContext &cx,SensitiveXdata &) :Ability() { context = &cx; } Sensitive::Sensitive(InStreamP in,CreatureP c, const SensitiveContext &cx,SensitiveXdata &) :Ability(in,c) { context = &cx; // Not yet implemented. assert(context->corporealMultiplier == 0); } DEFINE_CREATE_ABILITY_FROM_STREAM(Sensitive) AbilityId Sensitive::get_ability_id() { return AB_Sensitive; } Boolean Sensitive::heat_attack(PhysicalP killer,int heat,Boolean secondary) { if (context->heatMultiplier == 0) { return False; } // Multiply the heat by heatMultiplier. cre->_heat_attack(killer,context->heatMultiplier * heat,secondary); // Ignoring the value returned by Creature::_heat_attack(). return True; } SensitiveContext Sensitive::defaultContext; SensitiveXdata Sensitive::defaultXdata; xevil-2.02r2.orig/cmn/role.cpp0100644000175000017500000024361107041422212015525 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "role.cpp" #if X11 #ifndef NO_PRAGMAS #pragma implementation "role.h" #endif #endif #include "stdafx.h" #include #if X11 #include #include #endif #if WIN32 #include #endif #include "utils.h" #include "neth.h" #include "role.h" #include "streams.h" #include "physical.h" #include "world.h" #include "locator.h" #include "xetp.h" #include "intel.h" #include "game_style.h" ///////////////////////////////////////////////////////////////////////////// // Different Roles: StandAlone, Client, and Server ///////////////////////////////////////////////////////////////////////////// // Warn Client 3 times before disconnecting them. All in turns.4 #define NO_ACTIVITY_WARN 75 // 3 sec #define NO_ACTIVITY_WARN_2 100 // 4 sec #define NO_ACTIVITY_WARN_3 125 // 5 sec // Always give at least this much time to setup. #define MINIMUM_CUTOFF 500 // 20 sec #define NO_ACTIVITY_DISCONNECT_DEFAULT 7000 // in milliseconds #define CLIENT_OLD_OBJECT_KILL 10 // turns #define SEND_HUMAN_TIME 25 // turns // Initial value of skip if dynamically adjusting skip. #define ADJUST_SKIP_INITIAL_SKIP 4 // Maximum allowed value for skip when adjusting skip. If this // doesn't do it, assume nothing will. // Probably should be kept < Connection::ADJUST_SKIP_TIME #define ADJUST_SKIP_MAX 10 // Aim at making delay <= to this. #define DEFAULT_TARGET_DELAY 5 // Number of different UDP ports to try to bind the local UDP address. #define CLIENT_PORT_TRIES 5 Role::Role() { assert(!roleExists); roleExists = True; } Role::~Role() { assert(roleExists); roleExists = False; } GameStyleType Role::get_default_game_style() { return LEVELS; } int Role::num_viewports_needed() { return get_humans_num(); } void Role::human_created(IGameManagerP,HumanP,int,WorldP,LocatorP) { } void Role::clock(IGameManagerP,WorldP,LocatorP) { } void Role::yield_time(CMN_TIME startTime,int quanta) { struct timeval waitTime; int msec = compute_remaining(waitTime,startTime,quanta); if (waitTime.tv_usec > 0) { #if WIN32 SleepEx(msec,FALSE); #endif #if X11 if (CMN_SELECT(0,NULL,NULL,NULL,&waitTime) < 0) { error("Error with select."); // Could force some sort of exit() here. } #endif } } void Role::display_chat_message(LocatorP locator,const char* sender, const char* message) { int senLen = Utils::strlen(sender); int msgLen = Utils::strlen(message); // Two for '<', '>' and one for '\0'. char *newMsg = new char[senLen + msgLen + 3]; assert(newMsg); newMsg[0] = '<'; Utils::strcpy(newMsg + 1,sender); newMsg[senLen + 1] = '>'; Utils::strcpy(newMsg + senLen + 2,message); // Display as an arena message, don't propogate message to the Clients. // Clients will already receive XETP::CHAT packets. locator->arena_message_enq(newMsg,NULL,-1,False); // Locator now owns the memory for newMsg. } void Role::new_level(IGameManagerP,WorldP,LocatorP) { } void Role::reset(IGameManagerP) { } void Role::handle_messages(IGameManagerP,LocatorP) { } void Role::set_humans_playing(int) { } void Role::set_enemies_playing(int) { } void Role::game_quitting() { } void Role::send_chat_request(LocatorP,const char*,const char*) { } // Return time since startTime in milliseconds. static int time_since(CMN_TIME startTime) { #if X11 struct timeval now; if (gettimeofday(&now,NULL) != 0) { cerr << "Error with gettimeofday()" << endl; } // diff in msec. assert(sizeof(int) == 4); long secDiff = now.tv_sec - startTime.tv_sec; long usecDiff = now.tv_usec - startTime.tv_usec; // Could be negative. int diff = secDiff * 1000 + usecDiff / 1000; #endif #if WIN32 // diff is in msec int diff = timeGetTime() - startTime; #endif return diff; } int Role::compute_remaining(struct timeval &waitTime, CMN_TIME startTime,int quanta) { int msec; waitTime.tv_sec = 0; int diff = time_since(startTime); // Give up remaining time. if (diff > 0) { msec = quanta - diff; } // No time has elapsed, so give up all of quanta. else { msec = quanta; } // Used up all the time. if (msec < 0) { msec = 0; } // Clamp at giving up one second of time, shouldn't happen. if (msec >= 1000) { msec = 999; } waitTime.tv_usec = 1000 * msec; return msec; } // All client/server/standalone errors/messages come through here. void Role::_error(const char *msg) { #if WIN32 // In debugger. TRACE(msg); #endif #if X11 // Use standard out for both errors and messages on UNIX. cout << msg << endl; #endif } void Role::error(const char *msg1,const char *msg2,const char *msg3) { ostrstream str; if (msg2 == NULL) { str << msg1 << ends; } else if (msg3 == NULL) { str << msg1 << msg2 << ends; } else { str << msg1 << msg2 << msg3 << ends; } // Call one argument version. _error(str.str()); delete str.str(); } void Role::message(const char *msg1,const char *msg2,const char *msg3) { ostrstream str; if (msg2 == NULL) { str << msg1 << ends; } else if (msg3 == NULL) { str << msg1 << msg2 << ends; } else { str << msg1 << msg2 << msg3 << ends; } // Call one argument version. _message(str.str()); delete str.str(); } void Role::_message(const char *msg) { _error(msg); } void Role::check_show_stats(CMN_TIME startTime) { // static startTime; static int counter; // Sample every 25 turns. if (showStats && (counter % 25 == 0)) { int msec = time_since(startTime); int sec = msec / 1000; if (msec > 0) { cout << "----- UDPin: " << UDPInStream::get_bytes_in() << " UDPout: " << UDPOutStream::get_bytes_out() << " TCPin: " << NetInStream::get_bytes_in() << " TCPout: " << NetOutStream::get_bytes_out() << " in " << msec << " milliseconds." << endl; if (sec > 0) { cout << " UDPin: " << (UDPInStream::get_bytes_in() / sec) << " UDPout: " << (UDPOutStream::get_bytes_out() / sec) << " TCPin: " << (NetInStream::get_bytes_in() / sec) << " TCPout: " << (NetOutStream::get_bytes_out() / sec) << " in " << sec << " seconds, turn " << counter << endl; } cout << "Average outgoing XETP packet length: " << UDPOutStream::get_average_length_out() << endl; cout << endl; // counter = 0; // startTime = now; } } UDPInStream::reset_counter(); UDPOutStream::reset_counter(); NetInStream::reset_counter(); NetOutStream::reset_counter(); counter++; } int Role::quantaToMS(Quanta q,IGameManagerP man) { return q * Utils::maximum((int)man->manager_get_quanta(),1); } Quanta Role::MSToQuanta(int val,IGameManagerP man) { // watch out for division by zero. return val / Utils::maximum((int)man->manager_get_quanta(),1); } Boolean Role::uses_humans_num(RoleType r) { switch (r) { case R_STAND_ALONE: return True; case R_CLIENT: case R_SERVER: return False; default: assert(0); return False; } } Boolean Role::uses_cooperative(RoleType r) { switch (r) { case R_STAND_ALONE: case R_SERVER: return True; case R_CLIENT: return False; default: assert(0); return False; } } Boolean Role::uses_enemies_num(RoleType r) { switch (r) { case R_STAND_ALONE: case R_SERVER: return True; case R_CLIENT: return False; default: assert(0); return False; } } Boolean Role::uses_enemies_refill(RoleType r) { switch (r) { case R_STAND_ALONE: case R_SERVER: return True; case R_CLIENT: return False; default: assert(0); return False; } } Boolean Role::uses_game_style(RoleType r) { switch (r) { case R_STAND_ALONE: case R_SERVER: return True; case R_CLIENT: return False; default: assert(0); return False; } } Boolean Role::uses_difficulty(RoleType r) { switch (r) { case R_STAND_ALONE: case R_SERVER: return True; case R_CLIENT: return False; default: assert(0); return False; } } Boolean Role::uses_chat(RoleType r) { switch (r) { case R_CLIENT: case R_SERVER: return True; case R_STAND_ALONE: return False; default: assert(0); return False; } } Boolean Role::showStats = False; Boolean Role::echoPingPong = False; Boolean Role::roleExists = False; StandAlone::StandAlone() { humansNum = 0; } Boolean StandAlone::ok() { return True; } RoleType StandAlone::get_type() { return R_STAND_ALONE; } int StandAlone::get_humans_num() { return humansNum; } void StandAlone::set_humans_num(int val) { humansNum = val; } void StandAlone::yield(CMN_TIME startTime,int quanta,IGameManagerP, ITurnStarterP turnStarter, WorldP,LocatorP l) { PhysicalIter iter(*l); // Some debugging crap, should probably take it out for a release build. PhysicalP p; while (p = iter()) { const Area &area = p->get_area(); const Area &areaNext = p->get_area_next(); if (!(area == areaNext)) { cerr << "test failed, area does not equal area next for a " << p->get_class_name() << endl; } } // Throw away time. Role::yield_time(startTime,quanta); // Start timing for next turn. turnStarter->start_turn(); } Client::Client(char *sName,char *portName,CMN_PORT clientPrt,char *hName, IViewportInfo* vInf,int skp,LocatorP errLocator) { assert(vInf); turn = 0; connected = CONN_FAILED; tcpIn = NULL; tcpOut = NULL; udpIn = NULL; udpOut = NULL; humanName = Utils::strdup(hName); errorLocator = errLocator; skip = skp; vInfo = vInf; turnMax = 0; XETP::check_sizes(); // An invalid version. worldVersion = -1; strncpy(serverName,sName,R_NAME_MAX); if (portName) { port = Utils::atoi(portName); if (port <= 0) { error("Invalid port ",portName,"."); return; } } else { port = XETP::DEFAULT_PORT; } // Get client UDP port. if (clientPrt <= 0) { // Default to server port plus one. clientPortBase = port + 1; } else { clientPortBase = clientPrt; } if (gethostname(hostName,R_NAME_MAX)) { error("Unable to get local machine's hostname."); return; } tcpSock = socket(AF_INET, SOCK_STREAM, 0); if (tcpSock < 0) { error("Error opening client TCP socket."); return; } udpSock = socket(AF_INET, SOCK_DGRAM, 0); if (udpSock < 0) { error("Error opening client UDP socket."); return; } // Display message that we are looking up IP address. // Assumes that caller will call Client::connect_server after a turn or two, // so the message will be displayed on the Ui. ostrstream str; str << "Looking up IP address for server " << serverName << ends; // Display for a long time. errLocator->arena_message_enq(str.str(),NULL,1000000); errLocator->message_enq(Utils::strdup(str.str())); // Probably would be better to use Role::message(), but we want it to stay // up for a long time. Should add argument to Role::message(). connected = CONN_PARTIALLY; } void Client::connect_server() { if (connected != CONN_PARTIALLY) { connected = CONN_FAILED; return; } // Create server address. memset((void *)&serverAddr,'\0',sizeof(serverAddr)); serverAddr.sin_family = AF_INET; u_long IPAddr = inet_addr(serverName); // serverName is in dotted IP address notation, just copy it in. if (IPAddr != INADDR_NONE) { memcpy((void *)&serverAddr.sin_addr.s_addr,(void *)&IPAddr,sizeof(u_long)); } // serverName is a hostname, perform DNS lookup. else { struct hostent *hp = gethostbyname(serverName); if (hp == 0) { error("Invalid server name ",serverName); return; } memcpy((void *)&serverAddr.sin_addr,(void *)hp->h_addr,hp->h_length); } serverAddr.sin_port = htons((u_short)port); // Bind local address for UDP // Try all ports in the range // [clientPortBase...(clientPortBase+CLIENT_PORT_TRIES). // Makes it easier for users to run multiple clients on the same machine, // only really meaninful on UNIX. int n; for (n = 0; n < CLIENT_PORT_TRIES; n++) { CMN_SOCKADDR_IN client; memset((void *)&client,'\0',sizeof(client)); client.sin_family = AF_INET; client.sin_addr.s_addr = htonl(INADDR_ANY); client.sin_port = htons((u_short)(clientPortBase + n)); if (bind(udpSock,(CMN_SOCKADDR *)&client,sizeof(client)) >= 0) { // Success. break; } } if (n == CLIENT_PORT_TRIES) { ostrstream str; str << "Could not bind local UDP port to any of " << clientPortBase << "-" << (clientPortBase + CLIENT_PORT_TRIES - 1) << ends; error(str.str()); delete str.str(); return; } // cout << "UDP port seems to be" << client.sin_port << endl; // Connect TCP to server if (connect(tcpSock, (CMN_SOCKADDR *)&serverAddr,sizeof(serverAddr)) >= 0) { // Send initial connection tcpOut = new NetOutStream(tcpSock,True); assert(tcpOut); // Client tells server if it should send sounds or not. #if WIN32 Boolean wantSounds = True; #endif #if X11 Boolean wantSounds = False; #endif // Note: This is the only time we use vInfo. // Ui must have called Viewport::init_viewport_info() before now or // this will fail. XETP::send_tcp_connect(tcpOut,clientPortBase + n,humanName, vInfo->get_info(), skip,wantSounds); // Mark as OK. connected = CONN_SUCCESS; } // Could test that UDP connection works before continuing. // Inform user of failed connection if (!ok()) { strstream msg; msg << "Could not connect to " << serverName << " on port " << port << "." << ends; error(msg.str()); delete(msg.str()); delete tcpOut; return; } // Inform user of successful connection strstream msg; msg << hostName << " connected to " << serverName << " on port " << port << ends; message(msg.str()); delete msg.str(); // Create TCP and UDP streams. tcpIn = new NetInStream(tcpSock,False); assert(tcpIn); udpIn = new UDPInStream(udpSock,True); assert(udpIn); udpOut = new UDPOutStream(udpSock,&serverAddr,False); assert(udpOut); // Used so that multiple update_from_stream()s don't animate multiple times. NetData::enable_clocked_flag(); } Client::~Client() { // Perhaps we should use ok() if (connected == CONN_SUCCESS) { // Explicitly tell server to disconnect. XETP::send_disconnect(udpOut); udpOut->flush(); } Utils::freeif(humanName); delete tcpIn; delete tcpOut; delete udpIn; delete udpOut; } RoleType Client::get_type() { return R_CLIENT; } int Client::get_humans_num() { return 1; } void Client::set_humans_num(int) { } Boolean Client::ok() { return connected == CONN_SUCCESS; } void Client::clock(IGameManagerP manager,WorldP,LocatorP locator) { if (!ok()) { return; } // Only send human command every few turns. if (humanReflexes.ready()) { IntelP intel = locator->lookup(humanIntelId); if (intel) { assert(intel->is_human()); HumanP human = (HumanP)intel; if (human->get_command() != IT_NO_COMMAND) { XETP::send_command(udpOut,humanIntelId,human->get_command()); // Want to send this immediately. // udpOut->flush(); human->set_command(IT_NO_COMMAND); // Set timer. int reflexTime = MSToQuanta(humanReflexesTimeMS,manager); humanReflexes.set(reflexTime); } } } humanReflexes.clock(); // Turn is not incremented until yield() is done. } void Client::yield(CMN_TIME startTime,int quanta,IGameManagerP manager, ITurnStarterP turnStarter, WorldP w,LocatorP l) { if (!ok()) { // Still want to throw away time properly. Role::yield_time(startTime,quanta); // Start timing for next turn. turnStarter->start_turn(); return; } check_alive(manager); // Should we modify quanta??? // Decide how much time to throw away. struct timeval waitTime; compute_remaining(waitTime,startTime,quanta); fd_set fdvar; FD_ZERO(&fdvar); // Listen to server. FD_SET(tcpSock,&fdvar); FD_SET(udpSock,&fdvar); // Before any changes made to objects. l->client_pre_clock(); NetData::toggle_clocked_flag(); // Loop until all time for this turn thrown away or server starts new turn. do { check_alive(manager); int sockMax = Utils::maximum(tcpSock,udpSock) + 1; int cond = CMN_SELECT(sockMax,&fdvar,NULL,NULL,&waitTime); if (cond > 0) { // TCP data coming in. if (FD_ISSET(tcpSock,&fdvar)) { Boolean newTurn = receive_tcp_data(manager,w,l); if (newTurn) { waitTime.tv_usec = 0; } } // UDP data coming in. if (FD_ISSET(udpSock,&fdvar)) { Boolean newTurn = receive_udp_data(manager,w,l); if (newTurn) { waitTime.tv_usec = 0; } } // See how much more, if any, time we still need to throw away. compute_remaining(waitTime,startTime,quanta); } // Error or time expired. else { // To be sure. waitTime.tv_usec = 0; } } while (waitTime.tv_usec > 0); // Start the timer for the next turn here because we are doing // significant computation AFTER calling select to throw time away. // So, the following time will be added to the next turn. turnStarter->start_turn(); // Two things: // 1) Dead reckoning and animation clock // // 2) Now check to see if any objects are old and need to be killed off. // We do this by comparing the turn of this object with the highest turn // we've ever seen. PtrList dieList; PhysicalIter iter(*l); PhysicalP p; while (p = iter()) { NetDataP netData = p->get_net_data(); assert(turnMax >= netData->get_last_modified()); if (turnMax - netData->get_last_modified() >= CLIENT_OLD_OBJECT_KILL) { #if 0 ostrstream str; str << "killing old object " << p->get_class_name() << " turn=" << turn << " turnMax=" << turnMax << ends; message(str.str()); delete str.str(); #endif dieList.add((void*)p); } // Do dead reckoning for p if we aren't going to kill it. else if (deadReckoning) { // Only do dead reckoning if we didn't receive new data this turn. NetDataP netData = p->get_net_data(); if (!netData->clocked_this_turn()) { p->dr_clock(); netData->set_clocked_this_turn(); } } } // Don't call explicit_die inside the iteration because it screws up the // iterator. int n; for (n = 0; n < dieList.length(); n++) { l->explicit_die((PhysicalP)dieList.get(n)); } // After changes made to objects. // Also called above l->client_post_clock(); // Flush any commands/pings to the server. udpOut->flush(); turn++; check_show_stats(startTime); } void Client::game_quitting() { if (!ok()) { return; } // Explicitly tell server to disconnect. XETP::send_disconnect(udpOut); udpOut->flush(); } void Client::send_chat_request(LocatorP,const char* receiver, const char* message) { if (!ok()) { return; } XETP::send_chat_request(udpOut,receiver,message); udpOut->flush(); } void Client::request_new_human() { if (!ok()) { return; } XETP::send_request_new_human(udpOut); } void Client::_error(const char *msg) { // Also print to stdout. Role::_error(msg); if (errorLocator) { ostrstream str2; str2 << "ERROR: " << msg << ends; errorLocator->arena_message_enq(str2.str(),NULL,ROLE_FAILED_TIME); // Don't delete str2.str(), give memory to the Locator. errorLocator->message_enq(Utils::strdup(str2.str())); } #if WIN32 // Only the client can afford to block on error messages. // AfxMessageBox(msg); #endif } void Client::_message(const char *msg) { // Also print to stdout. Role::_error(msg); if (errorLocator) { ostrstream str2; str2 << msg << ends; errorLocator->arena_message_enq(str2.str()); // Don't delete str2.str(), give memory to the Locator. errorLocator->message_enq(Utils::strdup(str2.str())); } } Boolean Client::receive_tcp_data(IGameManagerP manager, WorldP world,LocatorP locator) { if (!ok()) { return False; } Boolean ret = False; // not a new turn u_short method = 0; u_int length = 0; if (!XETP::receive_header(tcpIn,method,length)) { message("Received invalid TCP header."); return ret; } switch (method) { case XETP::HUMAN: // Use udpOut no matter what process_human(tcpIn,udpOut,manager,world,locator); break; // Can't receive via TCP, because sometimes we throw them away. #if 0 case XETP::OBJECT: process_object(tcpIn,world,locator); break; #endif case XETP::NEW_TURN: ret = True; break; case XETP::NEW_WORLD: // message("new_world received"); process_new_world(tcpIn,manager,world,locator); break; case XETP::RESET: process_reset(tcpIn,manager,world,locator); break; case XETP::MESSAGE: process_message(tcpIn,length,locator); break; case XETP::ARENA_MESSAGE: process_arena_message(tcpIn,length,manager,locator); break; default: error("Received unknown XETP header."); } return ret; } static const char *lastObject = NULL; // class name static u_short lastMethod = 333; static u_int lastLength = 0; Boolean Client::receive_udp_data(IGameManagerP manager, WorldP world,LocatorP locator) { if (!ok()) { return False; } Boolean ret = False; // not a new turn // Prepare to read from packet. CMN_SOCKADDR_IN addr; if (udpIn->prepare_packet(&addr) < 0) { error("Failed to read UDP packet."); return False; } // Should check that addr == serverAddr. // Keep reading XETP packets until the UDP packet is empty, or we hit // an error. If we hit an error, just discard the packet. int bytesRemaining; Boolean ok = True; while (ok && (bytesRemaining = udpIn->bytes_remaining()) > 0) { u_short method = 0; u_int length = 0; if (!XETP::receive_header(udpIn,method,length)) { error("Received invalid UDP header."); ok = False; } if (ok) { lastLength = length; lastMethod = method; switch (method) { case XETP::HUMAN: process_human(udpIn,udpOut,manager,world,locator); break; case XETP::OBJECT: process_object(udpIn,world,locator); break; case XETP::DELETE_OBJECT: process_delete_object(udpIn,world,locator); break; case XETP::NEW_TURN: ret = True; break; case XETP::NEW_WORLD: process_new_world(udpIn,manager,world,locator); break; case XETP::PING: if (echoPingPong) { message("Received PING from Server, send back a PONG."); } XETP::send_pong(udpOut,turnMax); // Tell server NOW, or we're fucking history. // udpOut->flush(); break; case XETP::TIMER_PING: { Turn pingTurn = (Turn)udpIn->read_int(); XETP::send_timer_pong(udpOut,pingTurn,turn); // udpOut->flush(); } break; case XETP::MESSAGE: process_message(udpIn,length,locator); break; case XETP::ARENA_MESSAGE: process_arena_message(udpIn,length,manager,locator); break; case XETP::DISCONNECT: error("Server has disconnected connection"); connected = CONN_FAILED; break; case XETP::HUMANS_PLAYING: manager->set_humans_playing(udpIn->read_int()); break; case XETP::ENEMIES_PLAYING: manager->set_enemies_playing(udpIn->read_int()); break; case XETP::SOUND_REQUEST: process_sound_request(udpIn,locator); break; case XETP::CHAT: process_chat(udpIn,locator); break; default: error("Received unknown XETP header."); } } } // while bytes remaining // Done reading packet. udpIn->done_packet(); // Should we start a new turn. return ret; } void Client::process_new_world(InStreamP in,IGameManagerP manager, WorldP world,LocatorP) { // Don't reset the locator. // Don't do anything with the version for now. int worldVersion = in->read_int(); // manager->new_world(in); world->reset(NULL,in); manager->world_changed(); } void Client::process_reset(InStreamP in,IGameManagerP manager, WorldP,LocatorP) { GameStyleType style = (GameStyleType)in->read_int(); // Perhaps should also call Locator::reset(). manager->manager_reset(style); } void Client::process_human(InStreamP in,OutStreamP,IGameManagerP manager, WorldP world,LocatorP locator) { IntelId intelId(in); IntelP intel = locator->lookup(intelId); // If Intel exists, just update it. if (intel) { intel->update_from_stream(in); // Just to be sure. manager->register_intel(0,intel); } // Else add a new human to the locator. else { // Clear out any existing humans. int hNum = locator->humans_registered(); assert(hNum <= 1); if (hNum == 1) { HumanP old = locator->get_human(0); // Be sure to kill the Physical pointing to the human if it exists, // o.w. it will have a reference to freed memory. PhysicalP p = locator->lookup(old->get_id()); if (p) { locator->explicit_die(p); } // This will delete the Human. locator->unregister_human(old->get_intel_id()); } // Give Human outStream so that it can talk back to the Server. HumanP human = new Human(in,world,locator); if (!human->creation_ok()) { delete human; return; } locator->register_human_as(human); humanIntelId = human->get_intel_id(); // Perhaps should call even if human is NULL to make the UI point at // nothing. (Although, Viewport currently disallows // register_intel() with NULL intel.) manager->register_intel(0,human); } } void Client::process_object(InStreamP inStream,WorldP world,LocatorP locator) { // Read classId and Id ClassId classId = (ClassId)inStream->read_short(); Id id(inStream); Turn turn = (Turn)inStream->read_int(); TickType tt = (TickType)inStream->read_char(); // The highest turn we've ever seen from the server. if (turn > turnMax) { turnMax = turn; if (echoPingPong) { ostrstream str; str << "PONG the server with turn " << turnMax << ends; message(str.str()); delete str.str(); } // Tell server so it can free turn windows to send more data. XETP::send_pong(udpOut,turnMax); // udpOut->flush(); } // Don't bother creating an object that is out of date. assert(inStream->get_protocol() == GenericStream::UDP); // Must be UDP or we need to flush the rest of the data from the stream. if (turnMax - turn >= CLIENT_OLD_OBJECT_KILL) { return; } if (inStream->alive()) { PhysicalP pExisting = locator->lookup(id); // If object exists, update the object from the information in the stream. if (pExisting) { // Don't use data from old packets, if we already have newer data. NetDataP netData = pExisting->get_net_data(); if (netData->get_last_modified() > turn) { return; } pExisting->update_from_stream(inStream); const char *className = pExisting->get_class_name(); // Don't make these calls on a garbage object read in. if (pExisting->creation_ok() && (pExisting->get_id() == id)) { // Patch differences in size from client and server. if (pExisting->is_moving()) { ((MovingP)pExisting)->patch_size_and_size_next(); } // Mark object as being updated. netData->touch(turn); // Mark object as being clocked this turn, must do this after the call // to update_from_stream(). netData->set_clocked_this_turn(); // Set tick type if it was specified from the stream, TICK_MAX // means unspecified. netData->set_tick_type(tt); // debugging hack lastObject = className; } // Something is wrong with the object we just read, kill it. if (!inStream->alive() || !pExisting->creation_ok()) { error("Bad data read when updating ",(char *)className, ", destroy object."); locator->explicit_die(pExisting); // Bring stream back to life. if (!inStream->alive() && inStream->get_protocol() == GenericStream::UDP) { ((UDPInStreamP)inStream)->revive(); } } } // Create a new object from the data in the stream. else { const PhysicalContext *cx = locator->get_context(classId); if (cx) { if (cx->create_from_stream) { PhysicalP p = cx->create_from_stream(inStream,world,locator); if (p) { if (p->get_id() == id) { // Patch differences in size from client and server. if (p->is_moving()) { ((MovingP)p)->patch_size_and_size_next(); } // Mark object as being updated. NetDataP netData = p->get_net_data(); netData->touch(turn); // Set tick type if it was specified from the stream, TICK_MAX // means unspecified. netData->set_tick_type(tt); // Id is redundant, too lazy to recompile now. locator->add_as(p,id); // debugging hack lastObject = p->get_class_name(); } // Packet read in is inconsistent, id in header does not match // that inside the object. else { error("Bad data read creating object from stream, id's are inconsistent"); locator->explicit_die(p); } } else { error("Failed to create object from stream."); } } else { error("No create_from_stream() for ",cx->className); } } else { ostrstream str; str << "No context for classId " << classId << ends; error(str.str()); delete str.str(); } } } } void Client::process_delete_object(InStreamP in,WorldP,LocatorP locator) { Id id(in); if (!in->alive()) { return; } // Kill the object. PhysicalP p = locator->lookup(id); if (p) { locator->explicit_die(p); // p->set_quiet_death(); //p->kill_self(); } } void Client::process_message(InStreamP in,int length,LocatorP locator) { if (length <= 0) { return; } char *msg = new char[length + 1]; in->read(msg,length); msg[length] = '\0'; if (in->alive()) { locator->message_enq(msg); } else { delete [] msg; } } void Client::process_arena_message(InStreamP in,int length, IGameManagerP manager,LocatorP locator) { length -= sizeof(int); // take of the space for time(ms) if (length <= 0) { return; } int timeMS = in->read_int(); Quanta timeQuanta = MSToQuanta(timeMS,manager); char *msg = new char[length + 1]; in->read(msg,length); msg[length] = '\0'; if (in->alive()) { // Don't need to bother specifying an Intel. locator->arena_message_enq(msg,NULL,timeQuanta); } else { delete [] msg; } } void Client::process_sound_request(InStreamP in,LocatorP locator) { SoundRequest request; request.read(in); if (in->alive()) { locator->submitSoundRequest(request); } } void Client::process_chat(InStreamP in,LocatorP locator) { char sender[IT_STRING_LENGTH]; Utils::string_read(in,sender,IT_STRING_LENGTH); // We don't use senderId, only exists for future use. IntelId senderId; senderId.read(in); char* message = Utils::string_read(in); display_chat_message(locator,sender,message); delete message; } void Client::check_alive(IGameManagerP /*manager*/) { if (ok() && (!tcpIn->alive() || !tcpOut->alive() || !udpIn->alive() || !udpOut->alive())) { connected = CONN_FAILED; error("Lost connection to server ",serverName); #if 0 strstream str; str << "tcpIn: " << (int)tcpIn->alive() << " tcpOut: " << (int)tcpOut->alive() << " udpIn: " << (int)udpIn->alive() << " udpOut: " << (int)udpOut->alive() << ends; error(str.str()); delete str.str(); #endif // manager->quit(); } } int Client::humanReflexesTimeMS = 20; // In milliseconds. Boolean Client::deadReckoning = True; // On by default. Connection::Connection(ServerP srvr, LocatorP eLocator, char *cName,char *hName, CMN_SOCKET tcp,InStreamP tcp_in, CMN_SOCKET udp,CMN_SOCKADDR_IN* cAddr, Turn now, const ViewportInfo &v_info,int skp,Boolean wSounds) : vInfo(v_info) { server = srvr; errorLocator = eLocator; strncpy(clientName,cName,R_NAME_MAX); // why not dynamic alloc string? humanName = Utils::strdup(hName); udpClientAddr = cAddr; // We now own the memory. tcpIn = tcp_in; assert(tcpIn); tcpOut = new NetOutStream(tcp,False); assert(tcpOut); tcpSock = tcp; udpOut = new UDPOutStream(udp,udpClientAddr,False); assert(udpOut); // humanId takes care of itself. lastActivity = now; startTurn = now; sentCreationMessage = False; // Start out in the middle of the upper-left room. Pos pos((W_ROOM_COL_MAX * WSQUARE_WIDTH) / 2, (W_ROOM_ROW_MAX * WSQUARE_HEIGHT) / 2); viewport = vInfo.get_viewport_for(pos); // skipTimer starts out ready. // Decide whether to dynamically adjust skip or not. if (skp == ADJUST_SKIP) { adjustSkip = True; skip = ADJUST_SKIP_INITIAL_SKIP; } else { adjustSkip = False; skip = skp; } assert(skip > 0); borrowedSkip = False; wantSounds = wSounds; // Starts out set to max time, don't do anything until // we have collected some data. adjustSkipTimer.set_max(ADJUST_SKIP_TIME); adjustSkipTimer.set(); // Don't have any data yet. delaysNum = 0; // All turn windows start unallocated. int n; for (n = 0; n < TURN_WINDOWS_MAX; n++) { turnWindows[n] = FREE_TURN_WINDOW; } } Connection::~Connection() { delete tcpIn; delete tcpOut; delete udpOut; delete udpClientAddr; delete humanName; // should use delete[] ?? } char* Connection::get_full_client_name() { IntelP intel = errorLocator->lookup(human); if (!intel) { return Utils::strdup(clientName); } ostrstream str; str << '\"' << intel->get_name() << "\"@" << clientName << ends; return str.str(); } Boolean Connection::allocate_turn_window(Turn /*turn*/) { if (skipTimer.ready()) { skipTimer.set(skip); return True; } if (borrowedSkip) { return True; } #if 0 assert(turn != FREE_TURN_WINDOW); for (int n = 0; n < TURN_WINDOWS_MAX; n++) { if (turnWindows[n] == FREE_TURN_WINDOW) { turnWindows[n] = turn; // print allocated turn windows. if (echoTurnWindows) { cout << clientName << " ["; for (int m = 0; m < TURN_WINDOWS_MAX; m++) { if (turnWindows[m] != FREE_TURN_WINDOW) { cout << turnWindows[m] << ","; } } cout << "]" << endl; } return True; } } if (echoTurnWindows) { cout << "FAILED to allocate window" << endl; } // No free windows. #endif return False; } void Connection::free_turn_windows(Turn turn) { assert(turn != FREE_TURN_WINDOW); // Free all windows <= turn. for (int n = 0; n < TURN_WINDOWS_MAX; n++) { if (turnWindows[n] != FREE_TURN_WINDOW && turnWindows[n] <= turn) { if (echoTurnWindows) { cout << clientName << " freed turnWindow " << turnWindows[n] << endl; } turnWindows[n] = FREE_TURN_WINDOW; } } } // To figure out how client and server clocks relate to each other. static Turn lastServerTurn = 0; static Turn lastClientTurn = 0; void Connection::process_timer_pong(UDPInStreamP in) { Turn pingTurn = (Turn)in->read_int(); lastClientTurn = (Turn)in->read_int(); // Ignore clientTurn for now. // don't allow negative Turn delay = Utils::maximum(server->get_turn() - pingTurn,0); // Assume server turn is average of start and end time. lastServerTurn = (server->get_turn() + pingTurn) >> 1; if (delaysNum < MEASURED_DELAYS_MAX) { delays[delaysNum] = delay; delaysNum++; } else { server->error("Throwing away delay info."); } } void Connection::clock(Boolean turnWindowAllocated) { if (adjustSkip) { assert(skip > 0); // Only send timer_ping if we are allowed to send data at all // this turn. if (turnWindowAllocated) { XETP::send_timer_ping(udpOut,server->get_turn()); } if (adjustSkipTimer.ready()) { float avg = 0.0f; for (int n = 0; n < delaysNum; n++) { avg += delays[n]; } if (delaysNum) { avg /= delaysNum; } #ifdef SKIP_MESSAGES ostrstream msg; msg << "Average delay is " << avg << " out of " << delaysNum << " samples." << ends; server->message(msg.str()); delete msg.str(); #endif #if 0 ostrstream msg2; msg2 << "clientTurn=" << lastClientTurn << " serverTurn=" << lastServerTurn << " diff=" << (lastServerTurn - lastClientTurn) << ends; server->message(msg2.str()); delete msg2.str(); #endif // Do the adjustment. // Latency is too high, send less data. if (delaysNum == 0 || avg > targetDelay) { if (skip < ADJUST_SKIP_MAX) { skip++; } // else { // server->error("Client has reached maximum skip value."); // } #ifdef SKIP_MESSAGES ostrstream msg; msg << "Increasing skip to " << skip << ends; server->message(msg.str()); delete msg.str(); #endif } // We have moved back into our target range, can send more data now. else if (delaysNum > 0 && avg <= targetDelay && skip > 1) { skip--; #ifdef SKIP_MESSAGES ostrstream msg; msg << "Decreasing skip to " << skip << ends; server->message(msg.str()); delete msg.str(); #endif } // reset for next time. delaysNum = 0; adjustSkipTimer.set(); } adjustSkipTimer.clock(); } // adjustSkip borrowedSkip = False; skipTimer.clock(); } void Connection::borrow_skip_time() { // skipTimer.get_remaining() == skip only happpens here if we just borrowed last // turn. // For each Server turn, allocate(), clock(), borrow(). // Also, don't bother borrowing if we will send next turn anyway. if (skipTimer.get_remaining() < skip && !skipTimer.ready()) { skipTimer.set(skipTimer.get_remaining() + skip); borrowedSkip = True; } } Turn Connection::targetDelay = DEFAULT_TARGET_DELAY; Boolean Connection::echoTurnWindows = False; Server::Server(Boolean lHuman,char *portName,LocatorP errLocator) { // Hack, using errLocator for more than reporting errors. errLocator->set_remember_deleted(True); errLocator->set_remember_sounds(True); turn = 0; running = False; errorLocator = errLocator; udpIn = NULL; localHuman = lHuman; tcpSock = 0; udpSock = 0; worldVersion = 0; // first valid version XETP::check_sizes(); if (portName) { port = Utils::atoi(portName); if (port <= 0) { error("Invalid port ",portName,"."); return; } } else { port = XETP::DEFAULT_PORT; } // Don't do anything that could cause an error until Server::run(). } void Server::run() { // All actual network calls, creating and binding sockets, listen, etc. // // Server object must still be usable even if we return from an error. #if X11 signal(SIGPIPE,SIG_IGN); #endif if (gethostname(hostName,R_NAME_MAX)) { error("Unable to get hostname of local machine."); return; } tcpSock = socket(AF_INET, SOCK_STREAM, 0); if (tcpSock < 0) { error("Error opening TCP socket for incoming connections."); return; } udpSock = socket(AF_INET, SOCK_DGRAM, 0); if (udpSock < 0) { error("Error opening UDP socket for incoming data."); return; } // Bind server addresses CMN_SOCKADDR_IN serverAddr; memset((void *)&serverAddr,'\0',sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); serverAddr.sin_port = htons(port); // Give address to both the TCP and UDP sockets. if (bind(tcpSock, (CMN_SOCKADDR *)&serverAddr, sizeof(serverAddr)) < 0) { ostrstream str; str << "Couldn't bind socket name to TCP socket on port " << port << "." << ends; error(str.str()); delete str.str(); return; } if (bind(udpSock, (CMN_SOCKADDR *)&serverAddr, sizeof(serverAddr)) < 0) { ostrstream str; str << "Couldn't bind socket name to UDP socket on port " << port << "." << ends; error(str.str()); delete str.str(); return; } // Listen for connections on the TCP socket. listen(tcpSock,5); // UDP in is shared by all connections. udpIn = new UDPInStream(udpSock,True); assert(udpIn); // Message to server log. strstream msg; msg << "Set up server on port " << port << ends; message(msg.str()); delete(msg.str()); running = True; } Server::~Server() { message("Exiting."); // Hack, using errLocator for more than reporting errors. errorLocator->set_remember_deleted(False); errorLocator->set_remember_sounds(False); for (int n = 0; n < connections.length(); n++) { delete get_connection(n); } delete udpIn; CLOSE_SOCKET(tcpSock); } Boolean Server::ok() { return running; } RoleType Server::get_type() { return R_SERVER; } GameStyleType Server::get_default_game_style() { return EXTENDED; } int Server::get_humans_num() { return connections.length() + (localHuman ? 1 : 0); } int Server::num_viewports_needed() { if (localHuman) { return 1; } else { return 0; } } void Server::set_humans_num(int) { } void Server::human_created(IGameManagerP manager, HumanP human,int num, WorldP,LocatorP locator) { if (!running) { return; } // human should already be registered. IntelId hId = human->get_intel_id(); assert(locator->lookup(hId)); // Use first human created as the local human. // Don't need to push this data to any of the clients. if (localHuman && num == 0) { localHumanId = hId; // Log the human's name. strstream msg; msg << "Player 0 \"" << human->get_name() << '\"' << "@SERVER" << ends; message(msg.str()); delete(msg.str()); return; } // Find a connection to assign this human to. int n; Connection* cn = NULL; for (n = 0; n < connections.length(); n++) { cn = get_connection(n); if (locator->lookup(cn->get_human()) == NULL) { // Done. break; } } if (n == connections.length()) { error("Trying to assign a human when all connections already have one."); return; } assert(cn); // If client provided us with a name, set it on the newly created Human. if (Utils::strlen(cn->get_human_name())) { human->set_name(cn->get_human_name()); } // Assign this human to connection n and send the info to the client. cn->set_human(human->get_intel_id()); // Log all the players in the game, some code duplication for the // local human. ostrstream str; char* fullName = cn->get_full_client_name(); str << "Player " << num << " " << fullName << ends; message(str.str()); delete fullName; delete str.str(); // Send assign_intel via TCP OutStreamP out = cn->get_tcp_out_stream(); XETP::send_human(out,human); // Tell all connections that a new player has joined if we haven't already. // Have to do it here because we didn't know the player's name until now. if (!cn->sent_creation_message()) { int m; int timeMS = quantaToMS(2 * UI_ARENA_MESSAGE_TIME,manager); // Don't bother sending message to new player, it'll probably get eaten // anyway. for (m = 0; m < connections.length() && m != n; m++) { char* fullName = cn->get_full_client_name(); ostrstream str; str << fullName << " has joined the game" << ends; delete fullName; OutStreamP out = cn->get_udp_out_stream(); XETP::send_arena_message(out,timeMS,str.str()); delete str.str(); } cn->creation_message_sent(); } } void Server::clock(IGameManagerP manager,WorldP world,LocatorP locator) { if (!check_alive()) { return; } delete_dead_connections(manager,world,locator); // Try to allocate turn window for each connection. Boolean* turnWindowAllocated = NULL; if (connections.length()) { turnWindowAllocated = new Boolean[connections.length()]; } int n; for (n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); turnWindowAllocated[n] = cn->allocate_turn_window(turn); } send_pings(turnWindowAllocated); send_objects(locator,turnWindowAllocated); // calls send_sounds() send_recently_deleted(locator,turnWindowAllocated); // Doesn't use turnWindowAllocated, only sends when changed // or every SEND_HUMAN_TIME turns anyway. send_humans(locator); // Clock the connections. // If you move this, check that borrow_skip_time() is still correct. for (n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); cn->clock(turnWindowAllocated[n]); } flush_connections(); delete [] turnWindowAllocated; // Turn is not incremented until yield() is done. } Boolean Server::check_alive() { if (!running) { return False; } if (!udpIn->alive()) { error("UDP input stream is dead. Shutting down server."); running = False; // manager->quit(); return False; } return True; } // Caller should use Server::message() to log the reason for deleting the // connection. This function will inform the clients, however. void Server::delete_dead_connections(IGameManagerP manager,WorldP world, LocatorP locator) { // Kill off dead connections. May reorder list. int n = 0; while (n < connections.length()) { // Connection has not responded to pings, so kill it. Boolean tooOld = False; Connection* cn = get_connection(n); // Kill off connections that don't respond to our pings. if (autoDisconnect) { assert(turn >= cn->get_last_activity()); Quanta diff = (Quanta)(turn - cn->get_last_activity()); if (diff >= MSToQuanta(noActivityDisconnect,manager) && // Give the connection some slack when it is first starting up. turn - cn->get_start_turn() >= MINIMUM_CUTOFF) { char* fullName = cn->get_full_client_name(); ostrstream str; str << fullName << " has not responded in " << diff << " turns. Disconnect." << ends; message(str.str()); delete fullName; delete str.str(); tooOld = True; } } Boolean isDead = False; if (!cn->alive()) { char* fullName = cn->get_full_client_name(); message("Lost connection to ",fullName,"."); delete fullName; isDead = True; } // Kill off a connection. if (isDead || tooOld) { // Try to tell connection that it is about to die. XETP::send_disconnect(cn->get_udp_out_stream()); delete_connection(manager,world,locator,n); } else { n++; } } } void Server::send_pings(Boolean turnWindowAllocated[]) { // If we haven't heard from a Client in a while, send a PING. for (int n = 0; n < connections.length(); n++) { if (turnWindowAllocated[n]) { Connection* cn = get_connection(n); Turn diff = turn - cn->get_last_activity(); if (diff == NO_ACTIVITY_WARN || diff == NO_ACTIVITY_WARN_2 || diff == NO_ACTIVITY_WARN_3) { if (echoPingPong) { ostrstream str; str << "Haven't heard from " << cn->get_client_name() << " in " << diff << " turns, sending PING." << ends; message(str.str()); delete str.str(); } XETP::send_ping(cn->get_udp_out_stream()); } // Timer pings sent in Connection::clock(). } } } // Send all objects to all clients via UDP void Server::send_objects(LocatorP locator,Boolean turnWindowAllocated[]) { // Keep track so we can clear the NetData::sent_flag. PtrList alreadySent; int n; for (n = 0; n < connections.length(); n++) { #if 0 // kept around for send_recently_deleted() turnWindowAllocated[n] = connections[n]->allocate_turn_window(turn); #endif Connection* cn = get_connection(n); OutStreamP stream = cn->get_udp_out_stream(); // Prepare for use. alreadySent.clear(); // Find Physical of Human associated with the viewport. PhysicalP humanPhysical = NULL; IntelP human = locator->lookup(cn->get_human()); if (human) { humanPhysical = locator->lookup(human->get_id()); } // Update the viewport for this connection. if (humanPhysical) { Area area = humanPhysical->get_area(); Pos pos = area.get_middle(); const ViewportInfoP vInfo = cn->get_viewport_info(); ViewportRegion viewport = vInfo->get_viewport_for(pos); // Grow viewport by a bit to help with edge cases. viewport.grow_by(OL_GRID_SIZE_MAX); cn->set_viewport(viewport); // HumanPhysical not special anymore. } // Call to allocate_turn_window() is above. if (turnWindowAllocated[n]) { // Could put this in its own phase. send_sounds(locator,n); // Send all objects that overlap the viewport. const ViewportRegionP viewport = cn->get_viewport(); // First pass, send all Creatures and their followers. // // WARNING: Making the assumption that only Creatures can have // followers and that Creatures are never followers. // If this is broken, we will still send everything, but // followers may be sent in different packets that their followees. // <<<>>> PhysicalP p; PhysicalIter iter(*locator); while (p = iter()) { if (p->is_creature()) { NetDataP netData = p->get_net_data(); assert(!netData->get_sent_flag()); // Should have cleared it last turn. // Uses should_send_object(). check_send_object_and_followers(locator,stream,viewport, p,turn,alreadySent, human); } } // Second pass, send all other objects that are not Creatures or their // followers. PhysicalIter iter2(*locator); while (p = iter2()) { NetDataP netData = p->get_net_data(); if (!netData->get_sent_flag()) { // Former bug, weren't checking on the second pass. if (should_send_object(locator,viewport,p,human)) { XETP::send_object(stream,p,turn,locator->compute_tick_type(p,human)); // Don't bother setting and clearing the sent flag at this point. } } } } // if turnWindowAllocated // Now clear the sent flag for next time. // Must do this even if not turnWindowAllocated, still have the // humanPhysical and its followers. int n; for (n = 0; n < alreadySent.length(); n++) { PhysicalP p = (PhysicalP)alreadySent.get(n); NetDataP netData = p->get_net_data(); if (!netData->get_sent_flag()) { cerr << "WARNING: Server::send_objects(): sentFlag is False for an object on the " << "alreadySent list." << endl; } netData->set_sent_flag(False); } } // for connections.length() } void Server::check_send_object_and_followers(LocatorP locator,OutStreamP out, const ViewportRegionP viewport, PhysicalP p,Turn turn, PtrList &alreadySent,IntelP relativeTo) { // If we don't send the main object, don't worry about the followers here, // they'll be taken care of in the second pass. if (!should_send_object(locator,viewport,p,relativeTo)) { return; } PtrList followers; p->get_followers(followers); // Apply the should_send_object() criteria to all followers. int m; for (m = 0; m < followers.length();) { PhysicalP follower = (PhysicalP)followers.get(m); if (!follower->is_creature() && // For composite objects, we may have a Creature follower, // don't send it in the same packet. should_send_object(locator,viewport,follower,relativeTo)) { // This one is ok, go to next element. m++; } else { followers.del(m); // copies last element to element m, so we don't want to // increment m } } // Record all objects that we send in alreadySent, so we can clear the // sent flag. alreadySent.add(p); alreadySent.append(followers); // Mark all objects that we send with the sent_flag. NetDataP netData = p->get_net_data(); assert(!netData->get_sent_flag()); netData->set_sent_flag(True); for (m = 0; m < followers.length(); m++) { PhysicalP q = (PhysicalP)followers.get(m); netData = q->get_net_data(); assert(!netData->get_sent_flag()); netData->set_sent_flag(True); } // p has some followers, send p and all followers in the same packet. if (followers.length() > 0) { PtrList tickTypes(followers.length() + 1); for (int n = 0; n < followers.length(); n++) { PhysicalP follower = (PhysicalP)followers.get(n); TickType tt = locator->compute_tick_type(follower,relativeTo); tickTypes.add((void *)tt); } // Reuse followers list to be the list of {p and all followers}. followers.add(p); tickTypes.add((void *)locator->compute_tick_type(p,relativeTo)); XETP::send_objects(out,followers,turn,tickTypes); } // Just send single object, don't have to allocate any data. else { XETP::send_object(out,p,turn,locator->compute_tick_type(p,relativeTo)); } } Boolean Server::should_send_object(LocatorP locator,const ViewportRegionP viewport, PhysicalP p,IntelP relativeTo) { // Don't bother with unmapped objects. if (!(p->get_mapped() || p->get_flash())) { return False; } // Send object iff it is in the viewport. Area area = p->get_area(); // Object must at least be in the viewport's periphery. if (viewport->peripheralOverlap(area)) { // We send tickType for all objects, let client decide whether to // draw actual object, or just a tick. TickType tt = locator->compute_tick_type(p,relativeTo); // Object must either be in the visible region of the viewport or // be in the periphery and show up as a tick mark. if (tt != TICK_MAX || viewport->visibleOverlap(area)) { return True; } } return False; } void Server::send_sounds(LocatorP locator,int n) { Connection* cn = get_connection(n); // Send recent sounds. if (cn->want_sounds()) { int m; for (m = 0; m < locator->get_sounds_num(); m++) { SoundRequest req; locator->get_sound(req,m); OutStreamP stream = cn->get_udp_out_stream(); XETP::send_sound_request(stream,req); } } } void Server::send_recently_deleted(LocatorP locator,Boolean turnWindowAllocated[]) { // Send any objects that were recently deleted (or recently unmapped). int m; for (m = 0; m < locator->get_recently_deleted_num(); m++) { Id id = locator->get_recently_deleted(m); int n; for (n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); // Only send delete message if we have permission to send this turn. if (turnWindowAllocated[n]) { OutStreamP stream = cn->get_udp_out_stream(); PhysicalP p = locator->lookup(id); if (p) { // p is still around, must have just been unmapped. assert(!p->get_mapped()); XETP::send_object(stream,p,turn,TICK_MAX); } else { XETP::send_delete_object(stream,id); } } } } // Would be nice to do this on a per-connection basis, so could still send // delete message even if turn is skipped. Not worth the cost right now. locator->reset_recently_deleted(); // Same for sounds. locator->reset_sounds(); } void Server::send_humans(LocatorP locator) { // Send each human to the corresponding client via UDP // connection number n is human number n. int n; for (n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); HumanP human = (HumanP)locator->lookup(cn->get_human()); Timer &humanTimer = cn->send_human_timer(); if (human && (human->intel_status_changed() || humanTimer.ready())) { OutStreamP out = cn->get_udp_out_stream(); XETP::send_human(out,human); // just to reset intel_status_changed. // We should probably just be sending the intelStatus. human->get_intel_status(); humanTimer.set(SEND_HUMAN_TIME); } humanTimer.clock(); } } void Server::flush_connections() { // Flush each connection. int n; for (n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); UDPOutStreamP udpOut = cn->get_udp_out_stream(); udpOut->flush(); } } void Server::yield(CMN_TIME startTime,int quanta, IGameManagerP manager,ITurnStarterP turnStarter, WorldP w,LocatorP l) { if (!running) { Role::yield_time(startTime,quanta); // Start timing for next turn. turnStarter->start_turn(); return; } // Decide how much time to throw away. struct timeval waitTime; compute_remaining(waitTime,startTime,quanta); // Right now, we don't check for data coming in on any of the tcp input // streams. // Loop until all time for this turn thrown away. Call at least once. do { fd_set fdvar; FD_ZERO(&fdvar); FD_SET(tcpSock,&fdvar); // acceptor socket FD_SET(udpSock,&fdvar); // common UDP socket u_int sockMax = Utils::maximum(tcpSock,udpSock); #if 0 int n; // individual TCP sockets. for (n = 0; n < connections.length(); n++) { sockMax = Utils::maximum(sockMax,connections[n]->get_tcp_socket()); FD_SET(connections[n]->get_tcp_socket(),&fdvar); } #endif sockMax++; // select() claims to want 1 greater than max number. int cond = CMN_SELECT(sockMax,&fdvar,NULL,NULL,&waitTime); if (cond > 0) { // If there is ANY data, be sure to read ALL of it before starting a // new turn. Boolean moreToRead; do { moreToRead = False; // TCP connection coming in if (FD_ISSET(tcpSock,&fdvar)) { accept_connection(manager,w,l); } // UDP data coming in if (FD_ISSET(udpSock,&fdvar)) { receive_udp_data(manager,w,l); } // See if we should keep reading data. FD_ZERO(&fdvar); FD_SET(tcpSock,&fdvar); // acceptor socket FD_SET(udpSock,&fdvar); // common UDP socket // sockMax should still be the same // Don't block for any time. struct timeval pollTime; pollTime.tv_sec = 0; pollTime.tv_usec = 0; int cond2 = CMN_SELECT(sockMax,&fdvar,NULL,NULL,&pollTime); if (cond2 > 0) { moreToRead = True; } } while (moreToRead); // See how much more, if any, time we still need to throw away. compute_remaining(waitTime,startTime,quanta); } // Error or time expired. else { // Be sure to drop out of the outer while loop. waitTime.tv_usec = 0; } } while (waitTime.tv_usec > 0); // Now we increment turn, right before drawing. turn++; check_show_stats(startTime); turnStarter->start_turn(); } void Server::new_level(IGameManagerP manager, WorldP world,LocatorP locator) { if (!running) { return; } // Flush all messages to the clients. So, the client users know what the // fuck is going on when a new level starts. // The clients will receive the messages and arena_messages twice in // this case, but who cares. handle_messages(manager,locator); // At this point, world has already been updated to the new map. // Mark new version of world. worldVersion++; // Send new world to all connections via TCP int n; for (n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); if (cn->alive()) { // Give the new client the current world via TCP. OutStreamP out = cn->get_tcp_out_stream(); XETP::send_new_world(out,world,worldVersion); UDPOutStreamP udpOut = cn->get_udp_out_stream(); udpOut->flush(); } } } void Server::reset(IGameManagerP manager) { if (!running) { return; } message("New game (", Utils::game_style_to_string(manager->get_game_style_type()), ")."); // Disassociate all humans with the connections. // This is done automatically because locator has been reset. // Tell all connections that game has reset via TCP. int n; for (n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); if (cn->alive()) { OutStreamP stream = cn->get_tcp_out_stream(); XETP::send_reset(stream,manager->get_game_style_type()); UDPOutStreamP udpOut = cn->get_udp_out_stream(); udpOut->flush(); } } } void Server::handle_messages(IGameManagerP manager,LocatorP l) { // Careful changing this, it is also used internally by // Server::new_level() to flush messages to the clients. if (!running) { return; } // We don't need to worry about sending duplicates because Game will // clear out all messages every turn. // Regular messages char *msg = l->peek_most_recent_message(); if (msg) { for (int n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); UDPOutStreamP out = cn->get_udp_out_stream(); XETP::send_message(out,msg); } } // Arena messages for (int n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); ArenaMessageIter iter(*l,cn->get_human()); char *msg; Boolean propagate = False; while (msg = iter.next(propagate)) { // Careful to send only messages that are marked to be propagated. if (propagate) { UDPOutStreamP out = cn->get_udp_out_stream(); // Send number of milliseconds to display message. int timeMS = quantaToMS(UI_ARENA_MESSAGE_TIME,manager); XETP::send_arena_message(out,timeMS,msg); } } } } void Server::send_chat_request(LocatorP locator,const char* receiver,const char* message) { if (localHuman) { IntelP sender = locator->lookup(localHumanId); if (!sender) { // If localHuman isn't around for some reason, don't send the message. return; } _process_chat_request(locator,sender,receiver,message); } else { // Send message from the SERVER. _process_chat_request(locator,NULL,receiver,message); } } void Server::set_humans_playing(int num) { if (!running) { return; } for (int n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); XETP::send_humans_playing(cn->get_udp_out_stream(),num); } } void Server::set_enemies_playing(int num) { if (!running) { return; } for (int n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); XETP::send_enemies_playing(cn->get_udp_out_stream(),num); } } // Errors and messages come through here. void Server::_error(const char *msg) { // Put to stdout to assist logging. // Use standard out for both errors and messages on UNIX, not stderr. #if X11 // If we can't get the timestamp for any reason, just don't put it out. time_t calTime = time(NULL); if (calTime != -1) { char *timeStr = Utils::strdup(ctime(&calTime)); if (timeStr) { int len = strlen(timeStr); if (len > 0) { // Kill the new line if it exists. if (timeStr[len - 1] == '\n') { timeStr[len - 1] = '\0'; } cout << "[" << timeStr << "] "; } } } cout << msg << endl; #endif // Careful to set the propagate flag to False so the message doesn't get // sent to the clients. if (errorLocator) { ostrstream str2; str2 << "SERVER: " << msg << ends; errorLocator->arena_message_enq(str2.str(),NULL,ROLE_FAILED_TIME,False); // Don't delete str2.str(), give memory to the Locator. // Could do a regular message_enq(), but would have to deal with the // propagate problem. } } void Server::display_chat_message(LocatorP l,const char* sender, const char* msg) { // Log the chat message, then let Role handle it. strstream logMsg; logMsg << '<' << sender << '>' << msg << ends; message(logMsg.str()); delete logMsg.str(); Role::display_chat_message(l,sender,msg); } void Server::accept_connection(IGameManagerP manager,WorldP world,LocatorP l) { // There is no longer a limit on the max number of connections. Could put // user-specified one here. #if 0 if (connections.length() >= CONNECTIONS_MAX) { error("Already at maximum number of connections."); return; } #endif //--------------- First accept TCP connection -----------// CMN_SOCKADDR_IN tcpAddr; memset((void *)&tcpAddr,'\0',sizeof(tcpAddr)); CMN_NET_LENGTH length = sizeof(tcpAddr); int msgsock = accept(tcpSock,(CMN_SOCKADDR *)&tcpAddr, &length); if (length != sizeof(CMN_SOCKADDR_IN)) { error("Received client address that is not proper length."); } if (msgsock < 0) { error("Error in accept()."); return; } // tcpAddr should now be filled in /* Given it's network address, attempt to lookup the hostname of the connecting machine. */ char *clientName; struct hostent *hostptr = gethostbyaddr((char *)&tcpAddr.sin_addr, sizeof(CMN_SOCKADDR_IN),AF_INET); if (hostptr) { clientName = (char *)hostptr->h_name; } else { error("Warning: Could not look up hostname of connecting machine."); // So, use IP address. clientName = inet_ntoa(tcpAddr.sin_addr); } //--------------- Now get info from the TCP_CONNECT -----------// InStreamP tcpIn = new NetInStream(msgsock,True); u_short udpPort = 0; char humanName[IT_STRING_LENGTH]; Boolean udpPortSet = False; ViewportInfo vInfo; int skip; Boolean wantSounds; while (!udpPortSet) { message("Waiting for connection to complete from ",clientName); u_short method; u_int length; if (XETP::receive_header(tcpIn,method,length)) { if (method != XETP::TCP_CONNECT) { error("Received incorrect XETP method when expecting TCP_CONNECT."); // Throw away incoming data. u_char *buf = new u_char[length]; tcpIn->read(buf,length); delete []buf; continue; } udpPort = tcpIn->read_short(); udpPortSet = True; Utils::string_read(tcpIn,humanName,IT_STRING_LENGTH); vInfo.read(tcpIn); skip = tcpIn->read_int(); wantSounds = (Boolean)tcpIn->read_char(); } else { // XETP header didn't come in error("Bad XETP header when connecting. Abort connection."); delete tcpIn; return; } } // If we already have a connection to this machine, kill the old one. int n; for (n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); CMN_SOCKADDR_IN *addr = cn->get_udp_client_address(); if (addr->sin_addr.s_addr == tcpAddr.sin_addr.s_addr && addr->sin_port == udpPort) { message("New connection from ",cn->get_client_name(), ", kill the old one."); delete_connection(manager,world,l,n); // to counteract the increment, delete_connection changes // connections.length() n--; // Could break here, but might as well check 'em all. } } // Create memory for new client address. CMN_SOCKADDR_IN *udpAddr = new CMN_SOCKADDR_IN; assert(udpAddr); // Copy TCP address. memcpy(udpAddr,&tcpAddr,sizeof(CMN_SOCKADDR_IN)); // Use port given by client. udpAddr->sin_port = htons(udpPort); // Log the connection. strstream msg; msg << clientName << " connected (TCP port " << ntohs(tcpAddr.sin_port) << ", UDP port " << udpPort << ")" << ends; message(msg.str()); delete(msg.str()); Connection* cn = new Connection(this,errorLocator, clientName,humanName,msgsock, tcpIn,udpSock,udpAddr,turn, vInfo,skip,wantSounds); connections.add(cn); // Give the new client the current world via TCP. OutStreamP out = cn->get_tcp_out_stream(); XETP::send_new_world(out,world,worldVersion); // Start a new game. XETP::send_reset(out,manager->get_game_style_type()); // Say hello to the new client. ostrstream greeting; greeting << "Welcome to " << hostName << "."; if (get_humans_num() == 1) { greeting << " You are the only player."; } else { greeting << " There are now " << get_humans_num() << " players."; } greeting << ends; int timeMS = quantaToMS(UI_ARENA_MESSAGE_TIME,manager); XETP::send_arena_message(out,timeMS,greeting.str()); delete greeting.str(); manager->humans_num_incremented(); } void Server::delete_connection(IGameManagerP manager,WorldP,LocatorP l,int n) { assert(n < connections.length()); Connection* cn = get_connection(n); IntelP intel = l->lookup(cn->get_human()); int kills = 0; if (intel) { assert(intel->is_human()); HumanP human = (HumanP)intel; // If the human has infinite lives, take soups into account. if (human->get_lives() == IT_INFINITE_LIVES) { kills = human->get_human_kills() - human->get_soups(); } else { kills = human->get_human_kills(); } } // Tell everyone that a connection has been removed. int timeMS = quantaToMS(2 * UI_ARENA_MESSAGE_TIME,manager); for (int m = 0; m < connections.length(); m++) { if (m != n) { Connection* cm = get_connection(m); char* fullName = cn->get_full_client_name(); ostrstream str; str << fullName << " has disconnected"; if (intel) { str << ", " << kills << " human kills"; } str << ends; XETP::send_arena_message(cm->get_udp_out_stream(), timeMS,str.str()); delete fullName; delete str.str(); } } manager->humans_num_decremented(cn->get_human()); delete cn; connections.del(n); } void Server::receive_udp_data(IGameManagerP manager, WorldP world,LocatorP locator) { CMN_SOCKADDR_IN clientAddr; udpIn->prepare_packet(&clientAddr); // Keep reading XETP packets until the UDP packet is empty. int bytesRemaining; while ((bytesRemaining = udpIn->bytes_remaining()) > 0) { // Get header from client u_short method; u_int bodyLen; if (!XETP::receive_header(udpIn,method,bodyLen)) { error("Received bad header."); return; } int n = find_connection(&clientAddr); // If there is no connection corresponding to the incoming UDP packet. if (n == -1) { // SERVER_PING is the only method that can come from an address other // than a connection. if (method == XETP::SERVER_PING) { udpIn->done_packet(); send_udp_server_pong(manager,locator,udpSock,&clientAddr); return; } error("Received data from unknown client. Tell it to DISCONNECT."); udpIn->done_packet(); // Create a temp stream to write DISCONNECT to the client. UDPOutStream out(udpSock,&clientAddr,False); XETP::send_disconnect(&out); return; } // Remember last time something came from a client. // Should probably use the Client's idea of what turn it is. Connection* cn = get_connection(n); cn->set_last_activity(turn); switch (method) { case XETP::COMMAND: process_command(udpIn,n,world,locator); break; case XETP::PONG: process_pong(udpIn,n); break; case XETP::DISCONNECT: { // Client is explicitly requesting to be disconnected. char* fullName = cn->get_full_client_name(); message(fullName," has disconnected."); delete fullName; delete_connection(manager,world,locator,n); break; } case XETP::REQUEST_NEW_HUMAN: process_request_new_human(manager,n); break; case XETP::TIMER_PING: { Turn pingTurn = (Turn)udpIn->read_int(); UDPOutStreamP udpOut = cn->get_udp_out_stream(); XETP::send_timer_pong(udpOut,pingTurn,turn); // udpOut->flush(); } break; case XETP::TIMER_PONG: cn->process_timer_pong(udpIn); break; case XETP::CHAT_REQUEST: process_chat_request(udpIn,n,locator); break; default: error("Server can't process method from UDP packet."); } } // while bytes remaining udpIn->done_packet(); } #if 0 void Server::receive_tcp_data(IGameManagerP,WorldP,LocatorP,int n) { InStreamP in = connections[n]->get_tcp_in_stream(); u_short method = 0; u_int length = 0; if (!XETP::receive_header(in,method,length)) { message("Received invalid TCP header."); return; } switch (method) { case XETP::NAME: // Mark the name in the connection, will be used in // Server::human_created(). Utils::string_read(in,connections[n]->human_name_buffer(), connections[n]->human_name_buffer_length()); break; default: error("Server can't process method from TCP packet."); } } #endif void Server::process_command(InStreamP in,int n, WorldP,LocatorP locator) { IntelId iId(in); ITcommand command = (ITcommand)in->read_char(); if (Connection::echo_turn_windows()) { cout << "Received command " << command << endl; } if (!in->alive()) { return; } Connection* cn = get_connection(n); if (iId != cn->get_human()) { error("Received command from invalid human id."); return; } IntelP intel = locator->lookup(iId); if (!intel) { return; } if (!intel->is_human()) { error("Intel associated with a client is non-Human."); return; } // Actually set the command on the human. ((HumanP)intel)->set_command(command); // Try to borrow some time so that we send the results as soon as possible. cn->borrow_skip_time(); } void Server::process_pong(InStreamP in,int n) { Turn clientTurn = (Turn)in->read_int(); // set_last_activity() should probably go through this, but would have // to get turn from every packet from the client. Connection* cn = get_connection(n); cn->free_turn_windows(clientTurn); // Already called set_last_activity() which is the important thing. if (echoPingPong) { message("Received PONG from ",cn->get_client_name()); } } void Server::process_request_new_human(IGameManagerP manager,int n) { Connection* cn = get_connection(n); // Weird shit happens if REQUEST_NEW_HUMAN comes in on the same // turn the Connection was created. Something to do with Locator // not being clocked once to add everything. if (turn - cn->get_start_turn() > 0) { manager->humans_num_decremented(cn->get_human()); manager->humans_num_incremented(); } } // Only called for CHAT_REQUESTs from clients. void Server::process_chat_request(InStreamP in,int senderNum, LocatorP locator) { char receiver[IT_STRING_LENGTH]; Utils::string_read(in,receiver,IT_STRING_LENGTH); char* message = Utils::string_read(in); // If the sender doesn't exist anymore, ignore the message. Connection* cn = get_connection(senderNum); IntelId senderId = cn->get_human(); IntelP sender = locator->lookup(senderId); if (!sender) { delete message; return; } assert(sender->is_human()); _process_chat_request(locator,sender,receiver,message); delete message; } // May be called from CHAT_REQUEST from client, or local request. void Server::_process_chat_request(LocatorP locator,IntelP sender, const char* receiver,const char* message) { // If a receiver name is specified, only send to that player. int rIndex = -1; // Means send to everyone. int n; if (Utils::strlen(receiver)) { for (n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); IntelP intel = locator->lookup(cn->get_human()); if (intel && !Utils::strcmp(intel->get_name(),receiver)) { rIndex = n; break; } } if (localHuman) { IntelP intel = locator->lookup(localHumanId); if (intel && !Utils::strcmp(intel->get_name(),receiver)) { // Special flag to mean display on Server only. rIndex = connections.length(); } } // If we can't find the one unique receiver, don't send to anybody. // We could send an error message to the sender. if (rIndex == -1) { return; } } // Don't send empty messages. if (Utils::strlen(message) > 0) { const char* senderName; IntelId senderId; if (sender) { senderName = sender->get_name(); senderId = sender->get_intel_id(); } else { senderName = "SERVER"; // senderId will just be an invalid Id. } // Special flag to just display on the server. if (rIndex == connections.length()) { display_chat_message(locator,senderName,message); return; } // Send message to all players between start and end. int start = 0; int end = connections.length(); // If message is targeted, just send to that Client. if (rIndex != -1) { start = rIndex; end = rIndex + 1; } // Maybe we shouldn't send the message back to the sender. for (n = start; n < end; n++) { Connection* cn = get_connection(n); UDPOutStreamP out = cn->get_udp_out_stream(); XETP::send_chat(out,senderName,senderId,message); out->flush(); } // If message goes to everybody display it on the server. if (rIndex == -1) { display_chat_message(locator,senderName,message); } } } // NOTE: This only works for UDP right now. int Server::find_connection(CMN_SOCKADDR_IN *clientAddr) { for (int n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); CMN_SOCKADDR_IN* addr = cn->get_udp_client_address(); // Check IP address and port. if (addr->sin_addr.s_addr == clientAddr->sin_addr.s_addr && addr->sin_port == clientAddr->sin_port) { return n; } } return -1; } int Server::find_connection(const IntelId& iId) { for (int n = 0; n < connections.length(); n++) { Connection* cn = get_connection(n); if (cn->get_human() == iId) { return n; } } return -1; } void Server::send_udp_server_pong(IGameManager* manager,LocatorP locator, CMN_SOCKET udpSock, CMN_SOCKADDR_IN* destAddr) { static char* unknownString = ""; static char* serverString = ""; // Temporary stream. UDPOutStream out(udpSock,destAddr,False); // Allocate some temporary arrays to pass as arguments to send_server_pong(). int humansNum = locator->humans_registered(); const char** names = new constCharP[humansNum]; const char** clientNames = new constCharP[humansNum]; int* humanKills = new int[humansNum]; int* enemyKills = new int[humansNum]; Id* ids = new Id[humansNum]; assert(names && clientNames && humanKills && enemyKills && ids); char* version = Utils::get_OS_info(); // Fill the parallel arrays with info about each Human. for (int n = 0; n < humansNum; n++) { HumanP human = locator->get_human(n); assert(human); names[n] = human->get_name(); // Inefficient, we could store the association between humans_registered() // and connections as an index. That would be more prone to error, though. int cNum = find_connection(human->get_intel_id()); if (cNum == -1) { clientNames[n] = unknownString; if (localHuman && (human->get_intel_id() == localHumanId)) { clientNames[n] = serverString; } } else { Connection* cn = get_connection(cNum); clientNames[n] = cn->get_client_name(); } // If the human has infinite lives, take soups into account. if (human->get_lives() == IT_INFINITE_LIVES) { humanKills[n] = human->get_human_kills() - human->get_soups(); } else { humanKills[n] = human->get_human_kills(); } enemyKills[n] = human->get_enemy_kills(); // May be an invalid id. ids[n] = human->get_id(); } XETP::send_server_pong(&out,manager->get_game_style_type(), locator->enemies_alive(),humansNum, version, names,clientNames, humanKills,enemyKills,ids); delete version; delete [] names; delete [] humanKills; delete [] enemyKills; delete [] ids; // Temp UDP stream will close itself here. } Boolean Server::autoDisconnect = True; int Server::noActivityDisconnect = NO_ACTIVITY_DISCONNECT_DEFAULT; xevil-2.02r2.orig/cmn/sound_cmn.cpp0100644000175000017500000000343507041422210016545 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ #if X11 #ifndef NO_PRAGMAS #pragma implementation "sound_cmn.h" #endif #endif #include "stdafx.h" #include "utils.h" #include "streams.h" #include "sound_cmn.h" #if WIN32 #include "resource.h" #endif #include "bitmaps/sound_cmn/sound_cmn.bitmaps" void SoundRequest::read(InStreamP in) { pos.read(in); soundName = (SoundName)in->read_int(); } int SoundRequest::get_write_length() { return Pos::get_write_length() + sizeof(u_int); } void SoundRequest::write(OutStreamP out) const { pos.write(out); out->write_int((u_int)soundName); } // unnecessary #if 0 SoundRequest & SoundRequest::operator=(const SoundRequest& req) { id = req.id; soundName = req.soundName; return *this; } #endif unsigned int SoundNames::lookup(SoundName name) { #if X11 // Avoid stupid compiler warnings. name = name; #endif #if WIN32 if (name >= 0 && name < SOUND_MAX) { return names[name]; } #endif return 0; } xevil-2.02r2.orig/cmn/streams.cpp0100644000175000017500000003113507041422210016234 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "streams.cpp" #if X11 #ifndef NO_PRAGMAS #pragma implementation "streams.h" #endif #endif #include "stdafx.h" #include "utils.h" #include "neth.h" // needed for recv, send, recvfrom, sendto #include #include "streams.h" #include "xetp.h" // yuck, need this for XETP::versionStr Checksum GenericStream::compute_checksum(u_char *data,int len) { Checksum c = 0; for (int n = 0; n < len; n++) { u_int byte = data[n]; c += byte; } return c; } Boolean GenericStream::buggy = False; GenericStream::~GenericStream() { } NetInStream::NetInStream(CMN_SOCKET s,Boolean ownSocket) : InStream(ownSocket) { sock = s; isAlive = True; } NetInStream::~NetInStream() { if (ownSocket) { CLOSE_SOCKET(sock); } } int NetInStream::get_protocol() { return TCP; } Boolean NetInStream::alive() { return isAlive; } Boolean NetInStream::read(void *buf,int size) { if (!isAlive) { return False; } // ssize_t bytesRead = ::read(sock,buf,size); int offset = 0; while(offset < size) { int bytesRead = (int)::recv(sock,(char *)buf + offset,size - offset,0); if (bytesRead <= 0) { isAlive = False; return False; } offset += bytesRead; } // Keep stats. bytesIn += size; return True; } u_char NetInStream::read_char() { u_char byte; if (read(&byte,1)) { return byte; } else { return 0; } } int NetInStream::read_signed_char() { u_char val = read_char(); signed char val2 = (signed char)val; return val2; } u_short NetInStream::read_short() { u_char bytes[2]; if (read(bytes,2)) { u_short ret; ret = (((u_short)bytes[0]) << 8) | (((u_short)bytes[1]) << 0); return ret; } else { return 0; } } int NetInStream::read_signed_short() { u_short val = read_short(); signed short val2 = (signed short)val; return val2; } u_int NetInStream::read_int() { u_char bytes[4]; if (read(bytes,4)) { u_int ret; ret = (((u_int)bytes[0]) << 24) | (((u_int)bytes[1]) << 16) | (((u_int)bytes[2]) << 8) | (((u_int)bytes[3]) << 0); return ret; } else { return 0; } } float NetInStream::read_float() { u_int intVal = read_int(); float *fp = (float *)&intVal; return *fp; } int NetInStream::bytesIn = 0; NetOutStream::NetOutStream(CMN_SOCKET s,Boolean ownSocket) : OutStream(ownSocket) { sock = s; isAlive = True; } NetOutStream::~NetOutStream() { if (ownSocket) { CLOSE_SOCKET(sock); } } int NetOutStream::get_protocol() { return TCP; } Boolean NetOutStream::alive() { return isAlive; } Boolean NetOutStream::write(void *buf,int size) { if (!isAlive) { return False; } // ssize_t bytesWritten = ::write(sock,buf,size); int bytesWritten = (int)::send(sock,(char *)buf,size,0); if (bytesWritten != size) { isAlive = False; return False; } // Keep stats. bytesOut += bytesWritten; return True; } void NetOutStream::write_char(u_char byte) { write(&byte,1); } void NetOutStream::write_signed_char(int val) { signed char val2 = (signed char)val; assert(val == val2); // Check that data wasn't lost. write_char(val2); } void NetOutStream::write_short(u_short val) { u_char buf[2]; buf[0] = (u_char)((val & 0xff00) >> 8); buf[1] = (u_char)((val & 0x00ff) >> 0); write(buf,2); } void NetOutStream::write_signed_short(int val) { signed short val2 = (signed short)val; assert(val == val2); // Check that data wasn't lost. write_short(val2); } void NetOutStream::write_int(u_int val) { u_char buf[4]; buf[0] = (u_char)((val & 0xff000000) >> 24); buf[1] = (u_char)((val & 0x00ff0000) >> 16); buf[2] = (u_char)((val & 0x0000ff00) >> 8); buf[3] = (u_char)((val & 0x000000ff) >> 0); write(buf,4); } void NetOutStream::write_float(float val) { u_int *ip = (u_int *)&val; u_int i = *ip; write_int(i); } int NetOutStream::bytesOut = 0; UDPInStream::UDPInStream(CMN_SOCKET sock,Boolean ownSocket) : NetInStream(sock,ownSocket) { bufPtr = 0; bufLen = 0; } UDPInStream::~UDPInStream() { } int UDPInStream::get_protocol() { return UDP; } int UDPInStream::prepare_packet(CMN_SOCKADDR_IN *address) { // Just to be sure. bufLen = 0; bufPtr = 0; if (!isAlive) { return -1; } CMN_NET_LENGTH addrSize = sizeof(CMN_SOCKADDR_IN); // Ignore who it came from for now. int n = recvfrom(sock,(char *)buffer,UDP_STREAM_BUFFER_LEN,0, (CMN_SOCKADDR *)address,&addrSize); // <= because we never send packets with no data if (n <= UDP_STREAM_HEADER_LEN) { // also checks for < 0 // For now, don't kill stream. // isAlive = False; return -1; } if (addrSize != sizeof(CMN_SOCKADDR_IN)) { cerr << "UDPInStream received invalid size socket address." << endl; } // Keep stats. bytesIn += n; // Point to received buffer before the header. bufLen = n; bufPtr = 0; // Check that XETP::versionStr matches char data[XETP::VERSION_LENGTH]; if (!read((u_char *)data,XETP::VERSION_LENGTH)) { return -1; } if (strncmp(data,XETP::versionStr,XETP::VERSION_LENGTH)) { // null terminate string. char recvdVersion[XETP::VERSION_LENGTH + 1]; memcpy(recvdVersion,data,XETP::VERSION_LENGTH); recvdVersion[XETP::VERSION_LENGTH] = '\0'; // This error message should really be Role::error(). cerr << "Received packet with the wrong XETP version." << endl << "Expected " << XETP::versionStr << " but received " << recvdVersion << endl; return False; } Checksum d = (Checksum)read_int(); // Now pointing after the checksum. // Check that checksum matches Checksum c = compute_checksum(buffer + UDP_STREAM_HEADER_LEN,n - UDP_STREAM_HEADER_LEN); if (c != d) { cerr << "UDPInStream checksum does not match, packet gave " << d << " computed value of " << c << endl; return -1; } // Return length of the body. (not tested) return bufLen - UDP_STREAM_HEADER_LEN; } void UDPInStream::done_packet() { if (!isAlive) { return; } #if 0 if (bufPtr != bufLen) { cerr << "Warning: discarding packet info when only " << bufPtr << " bytes of " << bufLen << " has been read." << endl; } #endif bufLen = 0; bufPtr = 0; } Boolean UDPInStream::read(void *buf,int size) { if (!isAlive) { return False; } if (bufPtr + size <= bufLen) { memcpy(buf,buffer + bufPtr,size); bufPtr += size; return True; } cerr << "ERROR: Trying to read more data than UDP packet contains." << endl; // isAlive = False; return False; } int UDPInStream::bytesIn = 0; UDPOutStream::UDPOutStream(CMN_SOCKET sock,CMN_SOCKADDR_IN *addr, Boolean ownSocket) : NetOutStream(sock,ownSocket) { address = addr; // Leave some room for the header. bufPtr = UDP_STREAM_HEADER_LEN; bufLen = UDP_STREAM_HEADER_LEN; // Initialize with meaningless data for (int n = 0; n < UDP_STREAM_HEADER_LEN; n++) { buffer[n] = (u_char)'@'; } } UDPOutStream::~UDPOutStream() { flush(); } int UDPOutStream::get_protocol() { return UDP; } void UDPOutStream::prepare_packet(int size) { assert(size < UDP_STREAM_BODY_LEN); if (!isAlive) { return; } // Send packet when buffer is full. // bufLen includes the header length. if (bufLen + size > UDP_STREAM_BUFFER_LEN) { // Will modify bufLen and bufPtr flush(); } // Remove any allocated, but unused space. bufLen = bufPtr; // Allocate more space. bufLen += size; // Keep average packet length; totalBytesOut += size; packetCount++; } void UDPOutStream::done_packet() { if (bufPtr < bufLen) { cerr << "Warning: UDPOutStream only writing " << bufPtr << " bytes when set for " << bufLen << endl; } } void UDPOutStream::flush() { if (!isAlive) { return; } // Write bufPtr bytes, not bufLen. // Only send if some data has been written to the stream. if (bufPtr > UDP_STREAM_HEADER_LEN) { // cout << "Flushing " << bufPtr << " bytes." << endl; // Wait until we are about to send before creating the header, so we // can compute the checksum. create_header(); // Careful to do this after computing the checksum in create_header. int count = buggy_tests(); int n; for (n = 0; n < count; n++) { if (bufPtr != sendto(sock,(char *)buffer,bufPtr,0, (CMN_SOCKADDR *)address, sizeof(CMN_SOCKADDR_IN))) { cerr << "Failed to send UDP packet." << endl; // Don't kill it for now. // isAlive = False; } } // Keep stats. bytesOut += bufPtr; } // Leave some room for the next header. bufPtr = UDP_STREAM_HEADER_LEN; bufLen = UDP_STREAM_HEADER_LEN; // Initialize with meaningless data for (int n = 0; n < UDP_STREAM_HEADER_LEN; n++) { buffer[n] = (u_char)'@'; } } Boolean UDPOutStream::write(void *buf,int size) { if (!isAlive) { return False; } if (bufPtr + size <= bufLen) { memcpy(buffer + bufPtr,buf,size); bufPtr += size; return True; } cerr << "Writing more data to UDPOutStream than amount specified." << endl; // isAlive = False; return False; } int UDPOutStream::buggy_tests() { int count = 1; if (buggy) { // Randomly drop a packet. if (Utils::choose(2) == 0) { cerr << "Test: Drop a packet." << endl; count = 0; } // Duplicate packet else if (Utils::choose(30) == 0) { count = 2 + Utils::choose(5); cerr << "Testing: Send " << count << " copies of a packet." << endl; } // Send random packet of random length else if (Utils::choose(100) == 0) { bufPtr = Utils::choose(UDP_STREAM_BUFFER_LEN) + 1; for (int n = 0; n < bufPtr; n++) { buffer[n] = (u_char)Utils::choose(256); } cerr << "Testing: Send garbage packet of length " << bufPtr << endl; } // Send truncated packet else if (Utils::choose(100) == 0) { int oldLen = bufPtr; if (bufPtr > 0) { bufPtr = Utils::choose(bufPtr); } cerr << "Testing: Truncate " << oldLen << " byte packet to " << bufPtr << " bytes" << endl; } // Send packet with extra crap at end else if (Utils::choose(100) == 0) { int extraLen = Utils::choose(20) + 1; int newLen = bufPtr + extraLen; if (newLen <= UDP_STREAM_BUFFER_LEN) { for (; bufPtr < newLen; bufPtr++) { buffer[bufPtr] = (u_char)Utils::choose(256); } } cerr << "Testing: Add " << extraLen << " bytes to a packet formerly of length " << (newLen - extraLen) << endl; } // Randomly twiddle a few bytes. else if (Utils::choose(100) == 0) { if (bufPtr > 0) { int changes = Utils::choose(5) + 1; for (int n = 0; n < changes; n++) { int which = Utils::choose(bufPtr); buffer[which] = (u_char)Utils::choose(256); } cerr << "Testing: Randomly change " << changes << " bytes in a packet." << endl; } } } return count; } void UDPOutStream::create_header() { // Check that we didn't accidentally write data into the header's space. if (!buggy) { // in buggy mode we might want to write garbage. int n; for (n = 0; n < UDP_STREAM_HEADER_LEN; n++) { assert(buffer[n] == (u_char)'@'); } } // Copy checksum into the header bytes. Checksum c = compute_checksum(buffer + UDP_STREAM_HEADER_LEN,bufPtr - UDP_STREAM_HEADER_LEN); // Little funny here, moving bufPtr back to the beginning to write the header bytes. // then put it back at the end. int bufPtrSave = bufPtr; bufPtr = 0; write(XETP::versionStr,XETP::VERSION_LENGTH); write_int((u_int)c); bufPtr = bufPtrSave; } int UDPOutStream::bytesOut = 0; int UDPOutStream::totalBytesOut = 0; int UDPOutStream::packetCount = 0; xevil-2.02r2.orig/cmn/ui_cmn.cpp0100644000175000017500000001175607041422210016037 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "ui_cmn.cpp" #if X11 #ifndef NO_PRAGMAS #pragma implementation "ui_cmn.h" #endif #endif #include "stdafx.h" #include "utils.h" #include "ui_cmn.h" KeyDispatcher::KeyDispatcher() { weaponKeyDown = False; weaponCommandDefault = IT_CENTER; dispatchCalled = False; } void KeyDispatcher::clock(IKeyState* keyState,IDispatcher* dispatcher, void* closure) { ITcommand command = IT_NO_COMMAND; // Weirdness for firing weapons. // If user holds down WEAPON_CENTER and presses a direction, // a shot is fired in that direction. // If user presses and releases WEAPON_CENTER, a shot is fired // in the direction the user most recently moved or fired. if (keyState->key_down(IT_WEAPON_CENTER,closure)) { if (!weaponKeyDown) { weaponKeyDown = True; dispatchCalled = False; } } if (!keyState->key_down(IT_WEAPON_CENTER,closure) && weaponKeyDown == True) { // Fire weapon in last direction if weapon_center was pressed and // released without sending any other command. if (!dispatchCalled) { command = weaponCommandDefault; } weaponKeyDown = False; } // Movement if (keyState->key_down(IT_R,closure)) { command = weaponKeyDown ? IT_WEAPON_R : IT_R; weaponCommandDefault = IT_WEAPON_R; } if (keyState->key_down(IT_L,closure)) { if (command == IT_WEAPON_R || command == IT_R) { // If left and right pressed, consider it to be center. command = IT_CENTER; // Does not effect weaponCommandDefault. } else { command = weaponKeyDown ? IT_WEAPON_L : IT_L; weaponCommandDefault = IT_WEAPON_L; } } if (keyState->key_down(IT_DN,closure)) { if (keyState->key_down(IT_UP,closure)) { // If up and down pressed, do nothing } if ((command == IT_R)||(command == IT_WEAPON_R)) { command = weaponKeyDown ? IT_WEAPON_DN_R : IT_DN_R; weaponCommandDefault = IT_WEAPON_DN_R; } else if ((command == IT_L)||(command == IT_WEAPON_L)) { command = weaponKeyDown ? IT_WEAPON_DN_L : IT_DN_L; weaponCommandDefault = IT_WEAPON_DN_L; } else { command = weaponKeyDown ? IT_WEAPON_DN : IT_DN; weaponCommandDefault = IT_WEAPON_DN; } } else if (keyState->key_down(IT_UP,closure)) { if ((command == IT_R)||(command == IT_WEAPON_R)) { command = weaponKeyDown ? IT_WEAPON_UP_R : IT_UP_R; weaponCommandDefault = IT_WEAPON_UP_R; } else if ((command == IT_L)||(command == IT_WEAPON_L)) { command = weaponKeyDown ? IT_WEAPON_UP_L : IT_UP_L; weaponCommandDefault = IT_WEAPON_UP_L; } else { command = weaponKeyDown ? IT_WEAPON_UP : IT_UP; weaponCommandDefault = IT_WEAPON_UP; } } if (keyState->key_down(IT_CENTER,closure)) { command = IT_CENTER; // Does not effect weaponCommandDefault. } if (keyState->key_down(IT_UP_R,closure)) { command = weaponKeyDown ? IT_WEAPON_UP_R : IT_UP_R; weaponCommandDefault = IT_WEAPON_UP_R; } if (keyState->key_down(IT_UP_L,closure)) { command = weaponKeyDown ? IT_WEAPON_UP_L : IT_UP_L; weaponCommandDefault = IT_WEAPON_UP_L; } if (keyState->key_down(IT_DN_L,closure)) { command = weaponKeyDown ? IT_WEAPON_DN_L : IT_DN_L; weaponCommandDefault = IT_WEAPON_DN_L; } if (keyState->key_down(IT_DN_R,closure)) { command = weaponKeyDown ? IT_WEAPON_DN_R : IT_DN_R; weaponCommandDefault = IT_WEAPON_DN_R; } // Rest of weapons and items. if (keyState->key_down(IT_WEAPON_CHANGE,closure)) { command = IT_WEAPON_CHANGE; } else if (keyState->key_down(IT_WEAPON_DROP,closure)) { command = IT_WEAPON_DROP; } else if (keyState->key_down(IT_ITEM_USE,closure)) { command = IT_ITEM_USE; } else if (keyState->key_down(IT_ITEM_CHANGE,closure)) { command = IT_ITEM_CHANGE; } else if (keyState->key_down(IT_ITEM_DROP,closure)) { command = IT_ITEM_DROP; } else if (keyState->key_down(IT_CHAT,closure)) { command = IT_CHAT; } // Only call dispatch() if we have an interesting command. if (command != IT_NO_COMMAND) { dispatcher->dispatch(command,closure); dispatchCalled = True; } } xevil-2.02r2.orig/cmn/utils.cpp0100644000175000017500000004364507636130530015742 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "utils.C" #if X11 #ifndef NO_PRAGMAS #pragma implementation "utils.h" #endif #endif // Include Files #include "stdafx.h" #include #include #include #include #include #if WIN32 #include #endif #if X11 #include #endif #ifdef WIN32 // For file manipulation routines. #include #include #include // For GetVersionEx #include #endif #include "utils.h" #include "streams.h" #define PTR_LIST_DEFAULT_ALLC 5 void Utils::seed_random() { int seed = (int)time(NULL); #ifdef USE_RANDOM srandom(seed); #else srand((unsigned int)seed); #endif } Boolean Utils::coin_flip() { #ifdef USE_RANDOM return (Boolean)(random() % 2); #else return (Boolean)(rand() % 2); #endif } int Utils::choose(int x) { assert (x > 0); #ifdef USE_RANDOM return (int)(random() % x); #else return rand() % x; #endif } int Utils::weighted_choose(int n,int* weights) { // Get sum of all weights. int sum = 0; int m; for (m = 0; m < n; m++) { assert(weights[m] >= 0); sum += weights[m]; } // Choose number in spectrum of summed weights. int which = choose(sum); // Find index of weight corresponding to chosen number. sum = 0; for (m = 0; m < n; m++) { sum += weights[m]; if (which < sum) { return m; } } // We counted wrong. assert(0); return 0; } void Utils::insertion_sort(int arry[],int numElements) { for (int j = 0; j < numElements - 1; j++) { // Set arry[j] to be the minimum from arry[j]..arry[numElements-1]. for (int i = j + 1; i < numElements; i++) { if (arry[i] < arry[j]) { int tmp = arry[i]; arry[i] = arry[j]; arry[j] = tmp; } } } } void Utils::random_list(int arry[],int num) { int n; for (n = 0; n < num; n++) { arry[n] = n; } for (n = num - 1; n > 0; n--) { int index = choose(n); int tmp = arry[index]; arry[index] = arry[n]; arry[n] = tmp; } } int Utils::minimum(int arry[],int size) { Boolean anySet = False; int ret = 0; for (int n = 0; n < size; n++) { if (!anySet || (arry[n] < ret)) { ret = arry[n]; anySet = True; } } assert(anySet); return ret; } int Utils::minimum(int arry[],Boolean oks[],int size) { Boolean anySet = False; int ret = -1; for (int n = 0; n < size; n++) { if (oks[n] && (!anySet || (arry[n] < ret))) { ret = arry[n]; anySet = True; } } return ret; } Boolean Utils::inList(int key,const int list[],int size) { for (int i = 0; i < size; i++) { if (list[i] == key) { return True; } } return False; } void Utils::freeif(char *&str) { if (str) { delete [] str; } str = NULL; } char *Utils::strdup(const char *str) { char *ret = NULL; if (str) { ret = new char[strlen(str)+1]; assert(ret); strcpy(ret,str); } return ret; } int Utils::atoi(const char* s) { return ::atoi(s); } const char* Utils::getenv(const char* varName) { return ::getenv(varName); } int Utils::ceil_div(int n,int m) { assert(n >= 0 && m > 0); if (n % m == 0) { return n / m; } else { return (n / m) + 1; } } Boolean Utils::string_equals_ignore_case(char *str1,char *str2) { if (str1 == NULL && str2 == NULL) { return True; } if (str1 == NULL || str2 == NULL) { return False; } // Compare lower case versions. int n; for (n = 0; str1[n] && str2[n]; n++) { if (tolower(str1[n]) != tolower(str2[n])) { return False; } } // Both ended at the same time. if (!str1[n] && !str2[n]) { return True; } // Different lengths, one is a prefix of the other. return False; } void Utils::string_read(InStreamP in,char *buffer,int bufLen) { // get the length. u_short l = in->read_short(); string_read_body(in,l,buffer,bufLen); } char* Utils::string_read(InStreamP in) { // get the length. u_short l = in->read_short(); // Will return empty string if error. if (!in->alive()) { l = 0; } // Allocate string long enough to hold data plus NULL. char* buffer = new char[l + 1]; assert(buffer); string_read_body(in,l,buffer,l + 1); return buffer; } void Utils::string_read_body(InStreamP in,u_short l,char *buffer,int bufLen) { if (!in->alive()) { // Don't read anything, return empty string. buffer[0] = '\0'; return; } if (l + 1 < bufLen) { // Entire string fits in buffer. in->read(buffer,l); buffer[l] = '\0'; } else { // Will have to truncate some of the string. char *b = new char[l]; in->read(b,l); memcpy(buffer,b,bufLen - 1); buffer[bufLen - 1] = '\0'; delete [] b; } } int Utils::get_string_write_length(const char *msg) { return sizeof(short) + // length of string. strlen(msg); // string itself. } void Utils::string_write(OutStreamP out,const char *msg) { assert(msg); int len = strlen(msg); assert(len <= USHRT_MAX); out->write_short((u_short)len); out->write((void*)msg,len); } const char* Utils::arg_value_check(int& n,int argc,char** argv, const char* name) { assert(n < argc); if (!Utils::strcmp(name,argv[n]) && (n + 1 < argc)) { n++; return argv[n]; } return NULL; } Boolean Utils::arg_name_check(int n,int argc,char** argv, const char* name) { assert(n < argc); if (!Utils::strcmp(name,argv[n])) { return True; } return False; } #if WIN32 Boolean Utils::is_dir(const char* fName) { if (!fName || !fName[0]) { return False; } // Make local copy that is guaranteed NOT to end in '\'. char* ffName = Utils::strdup(fName); int len = strlen(ffName); if (ffName[len - 1] == '\\') { ffName[len - 1] = '\0'; } Boolean ret; struct _stat buffer; int val = _stat(ffName,&buffer); if ((val == 0) && (buffer.st_mode & _S_IFDIR)) { ret = True; } else { ret = False; } delete ffName; return ret; } Boolean Utils::mkdir(const char* fName) { int val = _mkdir(fName); return (val == 0); } #endif const char* Utils::game_style_to_string(GameStyleType gsType) { switch (gsType) { case LEVELS: return "Levels"; case SCENARIOS: return "Scenarios"; case LEVELS_ONLY: return "Levels Only"; case KILL: return "Kill,Kill,Kill"; case DUEL: return "Duel"; case EXTENDED: return "Extended Duel"; case TRAINING: return "Training"; default: return "Unknown"; } } char* Utils::get_OS_info() { ostrstream ret; #ifdef WIN32 OSVERSIONINFO osInfo; osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); Boolean set = False; if (GetVersionEx(&osInfo)) { switch (osInfo.dwPlatformId) { // Windows NT case VER_PLATFORM_WIN32_NT: set = True; ret << "WinNT " << osInfo.dwMajorVersion << '.' << osInfo.dwMinorVersion; break; // Windows 95 or 98 case VER_PLATFORM_WIN32_WINDOWS: set = True; // Not very certain of the logic I'm using to discern between // Win 95 and 98. // Useless fucking Microsoft APIs. if (osInfo.dwMajorVersion == 4 && osInfo.dwMinorVersion >= 10) { ret << "Windows 98"; } else if (osInfo.dwMajorVersion == 4 && osInfo.dwMinorVersion == 0) { ret << "Windows 95"; } else { ret << "Windows 95/98"; } break; } // Only copy in the extra info (like service pack number) // if there is something there. if (set) { if (Utils::strlen(osInfo.szCSDVersion) && Utils::strcmp(osInfo.szCSDVersion," ")) { ret << '(' << osInfo.szCSDVersion << ')'; } ret << ends; } } if (!set) { ret << "Unknown Win32" << ends; } #endif #ifdef UNAME_USR_BIN #define UNAME_PATH "/usr/bin/uname" #else #define UNAME_PATH "/bin/uname" #endif #ifdef X11 FILE* fp = popen(UNAME_PATH " -a","r"); Boolean set = False; if (fp) { const int BUF_LEN = 120; char buffer[120]; if (fgets(buffer,BUF_LEN,fp) != 0) { int strLen = Utils::strlen(buffer); if (strLen > 0) { // Kill trailing newline if (buffer[strLen - 1] == '\n') { buffer[strLen - 1] = '\0'; } ret << buffer << ends; set = True; } } pclose(fp); } if (!set) { ret << "Unknown UNIX" << ends; } #endif return ret.str(); } PtrList::PtrList() { // By default, don't allocate any memory untils the first ::add(). commonConstructor(0); } PtrList::PtrList(int startLen) { commonConstructor(startLen); } PtrList::PtrList(void *el0) { commonConstructor(1); add(el0); } PtrList::PtrList(void *el0,void *el1) { commonConstructor(2); add(el0); add(el1); } PtrList::PtrList(void *el0,void *el1,void *el2) { commonConstructor(3); add(el0); add(el1); add(el2); } PtrList::PtrList(void *el0,void *el1,void *el2,void *el3) { commonConstructor(4); add(el0); add(el1); add(el2); add(el3); } PtrList::PtrList(void *el0,void *el1,void *el2,void *el3,void *el4) { commonConstructor(5); add(el0); add(el1); add(el2); add(el3); add(el4); } PtrList::~PtrList() { if (data) { delete [] data; } } PtrList::PtrList(InStreamP in) { if (in->alive()) { commonConstructor(0); return; } // We will set both len and allc to the size read in from stream. int desiredLen = in->read_int(); commonConstructor(desiredLen); for (int n = 0; n < desiredLen; n++) { add((void *)in->read_int()); } } int PtrList::get_write_length(int len) { return sizeof(int) + // length of list len * sizeof(void *); // all elements } void PtrList::write(OutStreamP out) const{ // Not tested. out->write_int(len); for (int n = 0; n < len; n++) { out->write_int((int)data[n]); } } void PtrList::add(void *val) { assert(len <= allc); if (len == allc) { // increases allc, but not len increaseSize(); } data[len] = val; len++; } void *PtrList::get(int i) const { assert(i < len && i >= 0); return data[i]; } Boolean PtrList::contains(void *el) const { return index(el) != -1; } int PtrList::index(void *el) const { for (int n = 0; n < len; n++) { if (data[n] == el) { return n; } } return -1; } void PtrList::set(int i,void *val) { assert(i < len && i >= 0); data[i] = val; } void PtrList::set_and_fill(int i,void *val,void *fill) { while (i >= len) { append(fill); } set(i,val); } void PtrList::del(int i) { assert(i < len && i >= 0); data[i] = data[len - 1]; data[len - 1] = NULL; // really unnecessary. len--; } void PtrList::append(const PtrList &other) { for (int n = 0; n < other.length(); n++) { add(other.get(n)); } } void PtrList::fill(int num,void *val) { for (int i = 0; i < num; i++) { append(val); } } void PtrList::commonConstructor(int startAllc) { len = 0; allc = startAllc; if (startAllc > 0) { data = new voidP[allc]; } else { data = NULL; } } void PtrList::increaseSize() { assert(len == allc); // Double list size, unless it was zero. If zero, use default size. int newAllc = (allc > 0) ? (2 * allc) : PTR_LIST_DEFAULT_ALLC; void **newData = new voidP[newAllc]; assert(newData); if (data) { assert(allc > 0); memcpy(newData,data,allc * sizeof(void *)); delete [] data; } // len is unchanged. data = newData; allc = newAllc; } IDictionary::~IDictionary() { } class Bucket { friend class HashTable; friend class HashIterator; private: Bucket(void *k,void *v,Bucket*n) {key = k; value = v; next = n;} void* key; void* value; Bucket* next; }; class HashTable: public IDictionary { friend class HashIterator; public: HashTable(int startAlloc,int (*hashFntn)(void* key,int length)); /* EFFECTS: Create hash table with initial number of allocated elements, or use default number if not specified. hashFntn specifies the hash function, or use a default implementation. */ virtual ~HashTable(); virtual void* get(void* key); virtual void* getAtIndex(int index); virtual int length(); virtual IDictIterator* iterate(); virtual void* put(void* key,void* value); private: Bucket* HashTable::_get(int &index,void* key); /* MODIFIES: index */ /* EFFECTS: Internal helper function. Return the Bucket containing key or NULL if not found. Set index to the bucket list for key whether key is found or not. */ // Don't use a power of 2 or of 10. May mess up this crappy hash function. enum {DEFAULT_BUCKETS_NUM = 97}; static int defaultHash(void*,int); /* EFFECTS: The default hash function. */ Bucket** buckets; int bucketsNum; // The actual hash function being used. int (*hashFunction)(void *key,int length); }; class HashIterator: public IDictIterator { public: HashIterator(HashTable*); virtual ~HashIterator(); virtual void* next(void*& key); private: HashTable* hashTable; Bucket *bucket; int bucketRow; }; IDictionary* HashTable_factory(int startAlloc,int (*hashFntn)(void *key,int length)) { IDictionary *ret = new HashTable(startAlloc,hashFntn); assert(ret); return ret; } HashTable::HashTable(int startAlloc,int (*hashFntn)(void* key,int length)) { // Decide number of buckets. if (startAlloc == -1) { bucketsNum = DEFAULT_BUCKETS_NUM; } else { bucketsNum = startAlloc; } // Decide which hash function to use. if (hashFntn) { hashFunction = hashFntn; } else { hashFunction = defaultHash; } // Create empty list of buckets. buckets = new Bucket* [bucketsNum]; assert(buckets); for (int n = 0; n < bucketsNum; n++) { buckets[n] = NULL; } } HashTable::~HashTable() { // Delete all the buckets. for (int n = 0; n < bucketsNum; n++) { Bucket* b = buckets[n]; while (b) { Bucket* bNext = b->next; delete b; b = bNext; } } // Delete the list itself. delete [] buckets; } void* HashTable::put(void* key,void* value) { // value may not be NULL, or we have to change what the return value means for // HashTable::get assert(value); int index; Bucket* b = _get(index,key); // Value already exists, replace it. if (b) { void* ret = b->value; b->value = value; return ret; } // Insert new bucket at beginning of given bucket list. else { Bucket* newB = new Bucket(key,value,buckets[index]); buckets[index] = newB; return NULL; } } void* HashTable::get(void* key) { int dummy; Bucket* b = _get(dummy,key); if (b) { return b->value; } return NULL; } void* HashTable::getAtIndex(int index) { int count = 0; for (int n = 0; n < bucketsNum; n++) { Bucket* b = buckets[n]; while (b) { if (count == index) { return b->value; } count++; b = b->next; } } return NULL; } // Inefficient implementation. We could easily cache the length with // each put operation. int HashTable::length() { int ret = 0; for (int n = 0; n < bucketsNum; n++) { Bucket* b = buckets[n]; while (b) { ret++; b = b->next; } } return ret; } IDictIterator* HashTable::iterate() { IDictIterator* ret = new HashIterator(this); assert(ret); return ret; } Bucket* HashTable::_get(int &index,void* key) { index = hashFunction(key,bucketsNum); assert(index >= 0 && index < bucketsNum); Bucket* b = buckets[index]; while (b) { if (b->key == key) { return b; } b = b->next; } return NULL; } // Pretty crappy hash function, I know. // Careful if bucketsNum is a power of 2. int HashTable::defaultHash(void* key,int bucketsNum) { return ((unsigned int)key) % bucketsNum; } IDictIterator::~IDictIterator() { } HashIterator::HashIterator(HashTable* hTable) { // So we will start at row 0. bucketRow = -1; bucket = NULL; hashTable = hTable; } HashIterator::~HashIterator() { } void* HashIterator::next(void*& key) { while (1) { // If at end of a row of buckets. if (bucket == NULL) { // Past end of the last row of Buckets. if (bucketRow >= hashTable->bucketsNum - 1) { return NULL; } // Start at first bucket of next row of Buckets. bucketRow++; bucket = hashTable->buckets[bucketRow]; } if (bucket) { // The bucket we will return this time. Bucket* ret = bucket; // Get ready for next time. bucket = bucket->next; key = ret->key; return ret->value; } } } void DebugInfo::initialize() { #if WIN32 if (_on) { fstream outStream; outStream.open("c:\\out.txt",ios::out); outStream.close(); } #endif } void DebugInfo::print(const char *str) { if (!_on) { return; } #if WIN32 fstream outStream; outStream.open("c:\\out.txt",ios::app); outStream << str << endl; outStream.close(); TRACE(str); TRACE("\n"); #endif #if X11 cout << str << endl; #endif } // This gives the default setting for whether to print debug info or not. Boolean DebugInfo::_on = #if X11 False; #endif #if WIN32 #if _DEBUG True; #else False; #endif #endif // WIN32 xevil-2.02r2.orig/cmn/world.cpp0100644000175000017500000025264707041514734015737 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "world.cpp" #if X11 #ifndef NO_PRAGMAS #pragma implementation "world.cpp" #endif #endif // Include Files. #include "stdafx.h" #if WIN32 #include "resource.h" #endif // Include Files. #include #include "utils.h" #include "coord.h" #include "xdata.h" #include "area.h" #include "world.h" #include "bitmaps/world/world.bitmaps" // For PhysMover. #include "actual.h" // Defines. #define HANGING_PERCENT 0.40 // The % of the edge hanging off the corner. #define STRAND_PERCENT .50 // Gives number of boundaries between rooms. #define STRAND_LENGTH 8 // Length of strands in Blueprints::fill_random. #define EMPTY_TRIES_MAX 5000 #define WALL_LENGTH 30 #define WALLS_PERCENT .01 #define WALLS_HORIZ_CHANCE 4 // 2 gives equal chance #define LADDER_CHANCE 10 #define MAP_PRINT_DEFAULT False #define UP_DOWN_CHANCE 4 #define OPEN_ITERATIONS 2 #define POSTERS_ACTUAL_PERCENT .0003 // Percentage of dim. #define DOORS_ACTUAL_PERCENT .1 // Pairs of doors as percentage of rooms. // Percentage of rooms that can possibly have movers. // both are multipliers on number of rooms. #define MOVERS_PERCENT .4 // Tries to find a space for the mover. #define MOVER_TRIES 6 // Min number of movers across a horizontal track must be. #define MOVERS_HORIZ_MIN_TRACK 6 // moverwidths #define MOVERS_HORIZ_TRACK_LENGTH 25 // wsquares // Used to determine how much space to leave between walls. // Only the default, actual variable is objectMinDim. #define OBJECT_COL_MAX 2 #define OBJECT_ROW_MAX 2 #define OBJECT_BIG_COL_MAX 2 #define OBJECT_BIG_ROW_MAX 3 // Blueprints class. A helper for World. class Blueprints { public: Blueprints(WorldP world,char map[W_ROW_MAX_MAX][W_COL_MAX_MAX], const Dim &objectDimMax,int specialMap); /* EFFECTS: Create a blueprints object with room boundaries defined. */ int get_middle_row(int down); int get_middle_col(int across); /* NOTES: Offset from edge of room, in WSQUARES. Floor at middleRow. Ladder at [middleCol ... middleCol + objectDimMax.colMax). */ // NOTE: The following three methods replace Blueprints::fill_map. void room_boundries(); /* MODIFIES: map */ /* EFFECTS: Using the defined room boundaries, create a map of the world. */ void extra_walls(); /* MODIFIES: map */ void up_downs(); /* MODIFIES: map */ /* EFFECTS: Change all walls on edge of ladders to up_downs. */ void print(); /* EFFECTS: Print the room boundaries to cout. */ Boolean blocked_right(const RoomIndex &ri); Boolean blocked_bottom(const RoomIndex &ri); Boolean blocked_left(const RoomIndex &ri); Boolean blocked_top(const RoomIndex &ri); /* EFFECTS: Returns whether ri has a blocking wall on the edge of the room. */ private: void fill_random(); /* EFFECTS: Snake algorithm to define boundries between rooms. */ void special_map_adjust(); /* EFFECTS: Adjust map for any requirements imposed by the special map specification. */ Boolean open(const RoomIndex &ri); void has_right(const RoomIndex &ri,const Loc &rl); void missing_right(const RoomIndex &ri,const Loc &rl); void has_bottom(const RoomIndex &ri,const Loc &rl); void missing_bottom(const RoomIndex &ri,const Loc &rl); void has_top(const RoomIndex &ri,const Loc &rl); void missing_top(const RoomIndex &ri,const Loc &rl); void has_left(const RoomIndex &ri,const Loc &rl); void missing_left(const RoomIndex &ri,const Loc &rl); void ladder(const Loc &loc); /* EFFECTS: Draw a ladder going up and down from loc until a wall is hit. */ Boolean wall_below(int rTop,int cTop,int num); /* EFFECTS: Return whether there is a Wwall or WupDown in the vertical column of num blocks whose top is (rTop,cTop). */ WorldP world; Rooms worldRooms; Dim worldDim; char (* map)[W_COL_MAX_MAX]; int middleRows[W_DOWN_MAX_MAX]; int middleCols[W_ACROSS_MAX_MAX]; Boolean horiz[W_DOWN_MAX_MAX + 1][W_ACROSS_MAX_MAX]; Boolean vert[W_DOWN_MAX_MAX][W_ACROSS_MAX_MAX + 1]; WSpecialMap specialMap; Dim objectDimMax; }; Blueprints::Blueprints(WorldP w,char m[W_ROW_MAX_MAX][W_COL_MAX_MAX], const Dim &o_dim_max,WSpecialMap special) { objectDimMax = o_dim_max; world = w; worldRooms = world->get_rooms(); worldDim = world->get_dim(); map = m; specialMap = special; RoomIndex ri; // Boundaries only at the edges of the world. for (ri.across = 0; ri.across < worldRooms.acrossMax + 1; ri.across++) { for (ri.down = 0; ri.down < worldRooms.downMax + 1; ri.down++) { if (ri.across < worldRooms.acrossMax) { if ((ri.down == 0) || (ri.down == worldRooms.downMax)) { horiz[ri.down][ri.across] = True; } else { horiz[ri.down][ri.across] = False; } } if (ri.down < worldRooms.downMax) { //#if 0 if ((ri.across == 0) || (ri.across == worldRooms.acrossMax)) { vert[ri.down][ri.across] = True; } else { //#endif vert[ri.down][ri.across] = False; } } } } // The maze algorithm. if (specialMap != World::ZIG_ZAG) { // ZIG_ZAG takes care of itself in special_map_adjust. fill_random(); } // Any special adjustment for special world maps. special_map_adjust(); assert(W_ROOM_ROW_MAX - 2 * (objectDimMax.rowMax + 1) > 0); assert(W_ROOM_COL_MAX - 2 * (objectDimMax.colMax + 1) > 0); // Compute middles for (int riR = 0; riR < worldRooms.downMax; riR++) { middleRows[riR] = objectDimMax.rowMax + 1 + Utils::choose(W_ROOM_ROW_MAX - 2 * (objectDimMax.rowMax + 1)); } for (int riC = 0; riC < worldRooms.acrossMax; riC++) { middleCols[riC] = objectDimMax.colMax + 1 + Utils::choose(W_ROOM_COL_MAX - 2 * (objectDimMax.colMax + 1)); } } int Blueprints::get_middle_row(int down) { assert (0 <= down && down < worldRooms.downMax); return middleRows[down]; } int Blueprints::get_middle_col(int across) { assert (0 <= across && across < worldRooms.acrossMax); return middleCols[across]; } void Blueprints::room_boundries() { RoomIndex ri; Loc rl; // Walls between rooms. for (ri.across = 0, rl.c = 0; ri.across < worldRooms.acrossMax; ri.across++, rl.c += W_ROOM_COL_MAX) { for (ri.down = 0, rl.r = 0; ri.down < worldRooms.downMax; ri.down++, rl.r += W_ROOM_ROW_MAX) { if (! horiz[ri.down][ri.across]) { missing_top(ri,rl); } else { has_top(ri,rl); } if (! horiz[ri.down + 1][ri.across]) { missing_bottom(ri,rl); } else { has_bottom(ri,rl); } if (! vert[ri.down][ri.across]) { missing_left(ri,rl); } else { has_left(ri,rl); } if (! vert[ri.down][ri.across + 1]) { missing_right(ri,rl); } else { has_right(ri,rl); } } } } void Blueprints::extra_walls() { for (int walls = 0; walls < worldDim.rowMax * worldDim.colMax * WALLS_PERCENT; walls ++) { Boolean ok = True; Loc loc; loc.r = Utils::choose(worldDim.rowMax); loc.c = Utils::choose(worldDim.colMax); int delta = Utils::coin_flip() ? 1 : -1; int horiz = Utils::choose(WALLS_HORIZ_CHANCE); // Special case for SEALS special world, no vertical walls. if (specialMap == World::SEALS) { horiz = 1; } Loc check; for (check.c = loc.c - objectDimMax.colMax; check.c <= loc.c + objectDimMax.colMax; check.c++) { for (check.r = loc.r - objectDimMax.rowMax; check.r <= loc.r + objectDimMax.rowMax; check.r++) { if (!world->open(check,True)) { ok = False; } } } // Horizontal extra wall. if (horiz) { while (ok && Utils::choose(WALL_LENGTH)) { for (check.c = loc.c; check.c != loc.c + delta * (objectDimMax.colMax + 1); check.c += delta) { for (check.r = loc.r - objectDimMax.rowMax; check.r <= loc.r + objectDimMax.rowMax; check.r++) { if (!world->open(check,True)) { ok = False; } } } if (ok) { if (! Utils::choose(LADDER_CHANCE)) { ladder(loc); } else { map[loc.r][loc.c] = Wwall; } loc.c += delta; if (specialMap != World::SEALS && Utils::choose(UP_DOWN_CHANCE) == 0) { loc.r += (Utils::coin_flip() ? 1 : -1); } } } } // Vertical wall, horiz == 0 else { while (ok && Utils::choose(WALL_LENGTH)) { for (check.r = loc.r; check.r != loc.r + delta * (objectDimMax.rowMax + 1); check.r += delta) { for (check.c = loc.c - objectDimMax.colMax; check.c <= loc.c + objectDimMax.colMax; check.c++) { if (!world->open(check,True)) { ok = False; } } } if (ok) { map[loc.r][loc.c] = Wwall; loc.r += delta; } } } } // for walls. } void Blueprints::up_downs() { Loc loc; // Change Wwall to WupDown if a ladder is immediately to left or right. for (loc.c = 0; loc.c < worldDim.colMax; loc.c++) { for (loc.r = 0; loc.r < worldDim.rowMax; loc.r++) { if ((map[loc.r][loc.c] == Wwall) && (((loc.c + 1 < worldDim.colMax) && (map[loc.r][loc.c + 1] == Wladder)) || ((loc.c - 1 >= 0) && (map[loc.r][loc.c - 1] == Wladder)))) { map[loc.r][loc.c] = WupDown; } } } // Change Wwall to WupDown if doesn't have a wall to right AND left. for (loc.c = 0; loc.c < worldDim.colMax; loc.c++) { for (loc.r = 0; loc.r < worldDim.rowMax; loc.r++) { if (map[loc.r][loc.c] == Wwall && !((wall_below(loc.r - 1,loc.c - 1,3) && wall_below(loc.r - 1,loc.c + 1,3)) || wall_below(loc.r - 1,loc.c,1) || wall_below(loc.r + 1,loc.c,1))) { map[loc.r][loc.c] = WupDown; } } } } void Blueprints::print() { RoomIndex ri; for (ri.down = 0; ri.down <= worldRooms.downMax; ri.down++) { // Horizontal boundaries. for (ri.across = 0; ri.across < worldRooms.acrossMax; ri.across++) { cout << ((horiz[ri.down][ri.across]) ? "**" : "*-"); cout << "*" << endl; // Vertical boundaries. if (ri.down < worldRooms.downMax) { for (ri.across = 0; ri.across <= worldRooms.acrossMax; ri.across++) { cout << ((vert[ri.down][ri.across]) ? "* " : "| "); } } cout << endl; } } } Boolean Blueprints::blocked_right(const RoomIndex &ri) { assert(ri.down < worldRooms.downMax && ri.down >= 0); assert(ri.across < worldRooms.acrossMax && ri.across >= 0); return vert[ri.down][ri.across + 1]; } Boolean Blueprints::blocked_bottom(const RoomIndex &ri) { assert(ri.down < worldRooms.downMax && ri.down >= 0); assert(ri.across < worldRooms.acrossMax && ri.across >= 0); return horiz[ri.down + 1][ri.across]; } Boolean Blueprints::blocked_left(const RoomIndex &ri) { assert(ri.down < worldRooms.downMax && ri.down >= 0); assert(ri.across < worldRooms.acrossMax && ri.across >= 0); return vert[ri.down][ri.across]; } Boolean Blueprints::blocked_top(const RoomIndex &ri) { assert(ri.down < worldRooms.downMax && ri.down >= 0); assert(ri.across < worldRooms.acrossMax && ri.across >= 0); return horiz[ri.down][ri.across]; } void Blueprints::fill_random() { // Don't do maze algorithm if the world is too small. if ((worldRooms.acrossMax < 2) || (worldRooms.downMax < 2)) { return; } int strandsNum = (int)(worldRooms.acrossMax * worldRooms.downMax * STRAND_PERCENT); for (int n = 0; n < strandsNum; n++) { // Starting position. RoomIndex ri; ri.across = Utils::choose(worldRooms.acrossMax - 1) + 1; ri.down = Utils::choose(worldRooms.downMax - 1) + 1; Boolean ok = open(ri); // open implies that ri must not be on outer boundaries. while (Utils::choose(STRAND_LENGTH) && ok) { // Move horiz. if (Utils::coin_flip()) { // Increase. if (Utils::coin_flip()) { horiz[ri.down][ri.across] = True; ri.across++; ok = open(ri); } // Decrease. else { horiz[ri.down][ri.across - 1] = True; ri.across--; ok = open(ri); } } // Move vert. else { // Increase. if (Utils::coin_flip()) { vert[ri.down][ri.across] = True; ri.down++; ok = open(ri); } // Decrease. else { vert[ri.down - 1][ri.across] = True; ri.down--; ok = open(ri); } } } } } void Blueprints::special_map_adjust() { switch (specialMap) { case World::SEALS: { // remove all interior vertical walls. RoomIndex ri; for (ri.down = 0; ri.down < worldRooms.downMax; ri.down++) { for (ri.across = 1; ri.across < worldRooms.acrossMax; ri.across++) { vert[ri.down][ri.across] = False; } } } break; case World::ZIG_ZAG: { RoomIndex ri; // Loop over all but top and bottom rows. for (ri.down = worldRooms.downMax - 1; ri.down > 0; ri.down--) { for (ri.across = 0; ri.across < worldRooms.acrossMax; ri.across++) { // Every row alternates having right and left side open // First row on bottom should have right open. Boolean rightOpen = ((worldRooms.downMax - ri.down) % 2 == 1); if ((rightOpen && ri.across != worldRooms.acrossMax - 1) || (!rightOpen && ri.across != 0)) { horiz[ri.down][ri.across] = True; } } } } break; } } Boolean Blueprints::open(const RoomIndex &ri) { assert((ri.across >= 0) && (ri.across <= worldRooms.acrossMax) && (ri.down >= 0) && (ri.down <= worldRooms.downMax)); if ((ri.across > 0) && horiz[ri.down][ri.across - 1]) { return False; } if ((ri.across < worldRooms.acrossMax) && horiz[ri.down][ri.across]) { return False; } if ((ri.down > 0) && vert[ri.down - 1][ri.across]) { return False; } if ((ri.down < worldRooms.downMax) && vert[ri.down][ri.across]) { return False; } return True; } void Blueprints::has_top(const RoomIndex &,const Loc &roomLoc) { for (int c = roomLoc.c; c < roomLoc.c + W_ROOM_COL_MAX; c++) map[roomLoc.r][c] = Wwall; } void Blueprints::missing_top(const RoomIndex &roomIndex, const Loc &roomLoc) { for (int c = roomLoc.c + middleCols[roomIndex.across]; c < roomLoc.c + middleCols[roomIndex.across] + objectDimMax.colMax; c++) { for (int r = roomLoc.r; r < roomLoc.r + W_ROOM_ROW_MAX - 1; r++) { map[r][c] = Wladder; } } } void Blueprints::has_bottom(const RoomIndex &, const Loc &roomLoc) { for (int c = roomLoc.c; c < roomLoc.c + W_ROOM_COL_MAX; c++) { map[roomLoc.r + W_ROOM_ROW_MAX - 1][c] = Wwall; } } void Blueprints::missing_bottom(const RoomIndex &roomIndex, const Loc &roomLoc) { for (int c = roomLoc.c + middleCols[roomIndex.across]; c < roomLoc.c + middleCols[roomIndex.across] + objectDimMax.colMax; c++) { for (int r = roomLoc.r + middleRows[roomIndex.down] - objectDimMax.rowMax; r < roomLoc.r + W_ROOM_ROW_MAX; r++) { map[r][c] = Wladder; } } } void Blueprints::has_left(const RoomIndex &,const Loc &roomLoc) { for (int r = roomLoc.r; r < roomLoc.r + W_ROOM_ROW_MAX; r++) { map[r][roomLoc.c] = Wwall; } } void Blueprints::missing_left(const RoomIndex &roomIndex, const Loc &roomLoc) { for (int c = roomLoc.c; c < roomLoc.c + middleCols[roomIndex.across]; c++) { map[roomLoc.r + middleRows[roomIndex.down]][c] = Wwall; } } void Blueprints::has_right(const RoomIndex &,const Loc &roomLoc) { for (int r = roomLoc.r; r < roomLoc.r + W_ROOM_ROW_MAX; r++) { map[r][roomLoc.c + W_ROOM_COL_MAX - 1] = Wwall; } } void Blueprints::missing_right(const RoomIndex &roomIndex, const Loc &roomLoc) { for (int c = roomLoc.c + middleCols[roomIndex.across] + objectDimMax.colMax; c < roomLoc.c + W_ROOM_COL_MAX; c++) { map[roomLoc.r + middleRows[roomIndex.down]][c] = Wwall; } } void Blueprints::ladder(const Loc &init) { // delta is only -1 and 1. for (int delta = -1; delta <= 1; delta += 2) { Loc loc = init; // To avoid hitting init twice. if (delta == 1) { loc.r++; } // Running directly into wall or ladder. while (world->open(loc,True)) { map[loc.r][loc.c] = Wladder; // Stop when there is a wall to the left or right. Loc left, right; right.r = left.r = loc.r; left.c = loc.c - 1; right.c = loc.c + 1; if ((!world->open(left) || !world->open(right))) { // Extra extension at top. if (delta == -1) { for (int extra = 1; extra <= objectDimMax.rowMax; extra++) { Loc extraLoc; extraLoc.c = loc.c; extraLoc.r = loc.r - extra; if (world->open(extraLoc,True)) { map[extraLoc.r][extraLoc.c] = Wladder; } else { break; } } } break; } loc.r += delta; } // while } // for delta } Boolean Blueprints::wall_below(int rTop,int cTop,int num) { Loc loc; loc.c = cTop; for (loc.r = rTop; loc.r < rTop + num; loc.r++) { if (world->inside(loc) && (map[loc.r][loc.c] == Wwall || map[loc.r][loc.c] == WupDown)) { return True; } } return False; } // Functions for Mover class. Mover::Mover(InStreamP in,WorldP w,LocatorP l) { world = w; locator = l; areaSet = True; timerSet = False; area.read(in); moverId.read(in); physMoverId.read(in); } void Mover::update_from_stream(const Area &a) { assert(areaSet); area = a; } int Mover::get_write_length() { return Area::get_write_length() + // area Identifier::get_write_length() + // moverId Identifier::get_write_length(); // physMoverId } void Mover::write(OutStreamP out) { area.write(out); moverId.write(out); physMoverId.write(out); } void Mover::init(WorldP w,LocatorP l,const Area &a,const Size &v, MoverId mId) { world = w; locator = l; area = a; areaSet = True; vel = v; moverId = mId; timerSet = False; assert(check_area(area)); } void Mover::init_area(const Area &a) { area = a; areaSet = True; } void Mover::init_not_area(WorldP w,LocatorP l,const Size &v,MoverId mId) { world = w; locator = l; vel = v; moverId = mId; timerSet = False; assert(check_area(area)); } void Mover::clock() { // Vel is always valid and gives what the PREVIOUS velocity was. // Should never be off the track. assert(check_area(area)); // not pausing at top or bottom. if (!timerSet) { // Make sure areaNext is still on the track of moverSquares. Area areaNext = area + vel; // Just move along. if (check_area(areaNext)) { area = areaNext; } // change direction. else if (area.wsquare_alligned()) { // Set timer. timer.set(W_MOVER_PAUSE_TIME); timerSet = True; // remember velocity velStored.width = -vel.width; velStored.height = -vel.height; vel.set_zero(); // area doesn't change. } else { areaNext = area.wsquare_allign(vel); // After wsquare_allign(), area shouldn't be touching wsquares it // wasn't already touching. assert(check_area(areaNext) && !(area == areaNext)); assert(areaNext.wsquare_alligned()); vel = areaNext - area; area = areaNext; } } // timerSet // pausing at top or bottom. else { // Reverse direction. if (timer.ready() ) { // Can't use areaNext. // vel = velStored; // hack vel.width = (velStored.width > 0) ? W_MOVER_SPEED : ((velStored.width < 0) ? -W_MOVER_SPEED : 0); vel.height = (velStored.height > 0) ? W_MOVER_SPEED : ((velStored.height < 0) ? -W_MOVER_SPEED : 0); Area areaNext = area + vel; if (check_area(areaNext)) { area = areaNext; } // mover is stuck on a two square wide spot and isn't going anywhere. else { vel.set_zero(); } timerSet = False; } } timer.clock(); // Tell PhysMover that we've been clocked, so can update the Area it // presents to the world. PhysMoverP pM = (PhysMoverP)locator->lookup(physMoverId); if (pM) { pM->mover_clock(); } } // True iff all squares covering area are moverSquares for this Mover. Boolean Mover::check_area(const Area &area) { Loc list[AR_WSQUARES_MAX]; int nItems; area.wsquares(list,nItems); // go through all wsquares on area. for (int m = 0; m < nItems; m++) { const Loc &loc = list[m]; // wsquare outside the world. if (!world->inside(loc)) { return False; } // Mover is friend of World. (might change) UnionSquare *uSquare = world->unionSquares[loc.r][loc.c]; if (!uSquare || uSquare->type != UN_MOVER || uSquare->mSquare.mover != this) return False; } // for return True; } UnionSquare *UnionSquare::read(InStreamP in,WorldP world) { UnionSquare *ret = new UnionSquare; assert(ret); ret->type = (int)in->read_char(); switch (ret->type) { case UN_POSTER: ret->pSquare.poster = in->read_short(); ret->pSquare.loc.read(in); in->read_short(); // padding break; case UN_DOOR: ret->dSquare.topBottom = in->read_short(); ret->dSquare.dest.read(in); in->read_short(); // padding break; case UN_MOVER: { ret->mSquare.orientation = in->read_short(); MoverId mId(in); ret->mSquare.mover = world->lookup(mId); } break; default: cerr << "Received invalid type of UnionSquare." << endl; } return ret; } int UnionSquare::get_write_length() { // Add padding to make Loc the size of Identifier. assert(Identifier::get_write_length() == Loc::get_write_length() + 2); return sizeof(char) + // type sizeof(short) + // poster/topBottom/orientation Identifier::get_write_length(); // loc/dest/moverId } void UnionSquare::write(OutStreamP out) { out->write_char((u_char)type); switch (type) { case UN_POSTER: assert(pSquare.poster <= USHRT_MAX); out->write_short((u_short)pSquare.poster); pSquare.loc.write(out); out->write_short(666); // padding break; case UN_DOOR: assert(dSquare.topBottom <= USHRT_MAX); out->write_short((u_short)dSquare.topBottom); dSquare.dest.write(out); out->write_short(666); // padding break; case UN_MOVER: { assert(mSquare.orientation <= USHRT_MAX); out->write_short((u_short)mSquare.orientation); assert(mSquare.mover); MoverId mId = mSquare.mover->get_mover_id(); mId.write(out); } break; default: assert(0); } } // Functions for World class. World::World() { // Set by World::set_locator(); locator = NULL; // Get pointer to static list of themes. themes = World_themes; objectDimMax.colMax = OBJECT_COL_MAX; objectDimMax.rowMax = OBJECT_ROW_MAX; mapPrint = MAP_PRINT_DEFAULT; rooms.acrossMax = 1; rooms.downMax = 1; roomsNext = rooms; rooms_dim_size_update(); blueprints = NULL; moversNum = 0; uniqueGen = 0; justReset = True; specialMap = specialMapNext = MAP_NONE; worldFile = NULL; xValid = XVARS_VALID_INIT; Loc loc; for (loc.r = 0; loc.r < W_ROW_MAX_MAX; loc.r++) { for (loc.c = 0; loc.c < W_COL_MAX_MAX; loc.c++) { unionSquares[loc.r][loc.c] = NULL; map[loc.r][loc.c] = Wempty; } } // Initialize posterDims for (int n = 0; n < W_ALL_POSTERS_NUM; n++) { assert(posters[n].size.width % WSQUARE_WIDTH == 0 && posters[n].size.width % WSQUARE_HEIGHT == 0); // The scaling factor of 2 is always true, regardless of whether we // are dealing with stretched coordinates or not. posterDims[n].colMax = posters[n].size.width / (WSQUARE_WIDTH * 2); posterDims[n].rowMax = posters[n].size.height / (WSQUARE_HEIGHT * 2); } choose_theme(); // Caller now must explicitly ask for the title_map(). } World::~World() { clear_everything(); Utils::freeif(worldFile); // Generate new map. if (blueprints) { delete blueprints; } } void World::title_map(IViewportInfo* vInfoProvider) { ViewportInfo vInfo = vInfoProvider->get_info(); Dim vDim = vInfo.get_viewport_dim(); // Set to the dimensions of the viewport. clear_everything(); rooms_dim_size_update(&vDim); // Put wall on top and bottom. Loc loc; for (loc.r = 0; loc.r < dim.rowMax; loc.r++) { for (loc.c = 0; loc.c < dim.colMax; loc.c++) { // Top and bottom. if ((loc.r == (dim.rowMax - 1)) || (loc.r == 0)) { map[loc.r][loc.c]= Wwall; } } } // Put title poster in center of screen. // // Title poster is always the last poster in the list. Loc start; start.c = dim.colMax / 2 - posterDims[W_ALL_POSTERS_NUM - 1].colMax / 2; start.r = dim.rowMax / 2 - posterDims[W_ALL_POSTERS_NUM - 1].rowMax / 2; for (loc.c = start.c; loc.c < start.c + posterDims[W_ALL_POSTERS_NUM - 1].colMax; loc.c++) { for (loc.r = start.r; loc.r < start.r + posterDims[W_ALL_POSTERS_NUM - 1].rowMax; loc.r++) { if (! unionSquares[loc.r][loc.c]) { unionSquares[loc.r][loc.c] = new UnionSquare; } assert(unionSquares[loc.r][loc.c]); unionSquares[loc.r][loc.c]->type = UN_POSTER; unionSquares[loc.r][loc.c]->pSquare.poster = W_ALL_POSTERS_NUM - 1; unionSquares[loc.r][loc.c]->pSquare.loc.c = loc.c - start.c; unionSquares[loc.r][loc.c]->pSquare.loc.r = loc.r - start.r; } } } Dim World::get_room_dim() { Dim ret(W_ROOM_ROW_MAX,W_ROOM_COL_MAX); return ret; } Size World::get_room_size() { Size ret; ret.width = W_ROOM_COL_MAX * WSQUARE_WIDTH; ret.height = W_ROOM_ROW_MAX * WSQUARE_HEIGHT; return ret; } Boolean World::check_door(const Loc &loc,Loc &dest) { if (unionSquares[loc.r][loc.c] && unionSquares[loc.r][loc.c]->type == UN_DOOR) { dest = unionSquares[loc.r][loc.c]->dSquare.dest; return True; } return False; } void World::set_rooms_next(const Rooms &r) { Utils::freeif(worldFile); roomsNext.acrossMax = Utils::minimum(W_ACROSS_MAX_MAX,r.acrossMax); roomsNext.downMax = Utils::minimum(W_DOWN_MAX_MAX,r.downMax); } void World::set_special_map_next(WSpecialMap map) { Utils::freeif(worldFile); specialMapNext = map; switch (map) { case SEALS: roomsNext.acrossMax = 4; roomsNext.downMax = 2; break; case ZIG_ZAG: roomsNext.acrossMax = W_ACROSS_MAX_MAX; roomsNext.downMax = 3; // W_DOWN_MAX_MAX; break; case FLAG: roomsNext.acrossMax = 6; roomsNext.downMax = 3; break; case MAP_NONE: break; default: assert(0); } } Boolean World::overlap(const Box &box) { return ((box.loc.c < dim.colMax) && (box.loc.c + box.dim.colMax > 0) && (box.loc.r < dim.rowMax) && (box.loc.r + box.dim.rowMax > 0)); } void World::draw(CMN_DRAWABLE buffer,Xvars &xvars,int dpyNum, const Area &area, Boolean reduceDraw,Boolean background3D) { if (!xvars.is_valid(xValid)) { init_x(xvars,IX_INIT,NULL); } if (!reduceDraw) { draw_background(buffer,xvars,dpyNum,area,background3D); } Pos aPos; Size aSize; area.get_rect(aPos,aSize); int moversFoundNum = 0; MoverP moversFound[MOVERS_MAX]; // Draw squares and create list of movers encountered. Loc loc; for (loc.c = (int)floor((float)aPos.x / (float)WSQUARE_WIDTH); loc.c < (int)ceil((float)(aPos.x + aSize.width) / (float)WSQUARE_WIDTH); loc.c++) { for (loc.r = (int)floor((float)aPos.y / (float)WSQUARE_HEIGHT); loc.r < ceil((float)(aPos.y + aSize.height)/(float)WSQUARE_HEIGHT); loc.r++) { draw_square(buffer,xvars,dpyNum,loc, loc.c * WSQUARE_WIDTH - aPos.x, loc.r * WSQUARE_HEIGHT - aPos.y,reduceDraw); mover_list_add(moversFound,moversFoundNum,loc); } } // Draw movers once. for (int n = 0; n < moversFoundNum; n++) { Pos movPos; Size movSize; const Area &area = moversFound[n]->get_area(); area.get_rect(movPos,movSize); draw_mover(buffer,xvars,dpyNum,moversFound[n], movPos.x - aPos.x,movPos.y - aPos.y); } if (!reduceDraw) { draw_outside(buffer,xvars,dpyNum,area); } } void World::draw_outside(CMN_DRAWABLE buffer,Xvars &xvars,int dpyNum, Area area) { if (!xvars.is_valid(xValid)) { init_x(xvars,IX_INIT,NULL); } // In window coords. area = xvars.stretch_area(area); Pos pos = area.get_pos(); Size size = area.get_size(); Size worldSize = xvars.stretch_size(get_size()); // Yuck, divide by two and stretch. // World::outsides, backgrounds, and posters should // really be in unstretched coordinates. Size imgSize; imgSize.set(xvars.stretch_x(outsides[outsideIndex].size.width >> 1), xvars.stretch_y(outsides[outsideIndex].size.height >> 1)); // Top side, stick out on right and left if (pos.y < 0) { for (int across = Utils::div(pos.x,imgSize.width); across * imgSize.width < pos.x + size.width; across++) { for (int down = Utils::div(pos.y,imgSize.height); down < 0; down++) { // area in window coords Area imgArea(Pos(across * imgSize.width - pos.x,down * imgSize.height - pos.y), imgSize); // Clip to window (0,0,size.width,size.height) Size srcOffset = imgArea.clip(size); draw_outside_offset(buffer,xvars, dpyNum,srcOffset,imgArea); } } } // Left side, stick out on bottom if (pos.x < 0) { for (int down = Utils::maximum(0,Utils::div(pos.y,imgSize.height)); down * imgSize.height < pos.y + size.height; down++) { for (int across = Utils::div(pos.x,imgSize.width); (across * imgSize.width < pos.x + size.width) && (across < 0); across++) { // area in window coords Area imgArea(Pos(across * imgSize.width - pos.x, down * imgSize.height - pos.y),imgSize); // Clip to window (0,0,size.width,size.height) Size srcOffset = imgArea.clip(size); draw_outside_offset(buffer,xvars, dpyNum,srcOffset,imgArea); } } } // Bottom side, stick out on right if (pos.y + size.height > worldSize.height) { for (int across = Utils::maximum(0,Utils::div(pos.x,imgSize.width)); across * imgSize.width < pos.x + size.width; across++) { for (int down = Utils::maximum(Utils::div(pos.y,imgSize.height), worldSize.height / imgSize.height); down * imgSize.height < pos.y + size.height; down++) { // area in window coords Area imgArea(Pos(across * imgSize.width - pos.x,down * imgSize.height - pos.y), imgSize); // Clip to window (0,0,size.width,size.height) Size srcOffset = imgArea.clip(size); // Clip to world. srcOffset += imgArea.clip_top(worldSize.height - pos.y); draw_outside_offset(buffer,xvars, dpyNum,srcOffset,imgArea); } } } // Right side, if (pos.x + size.width > worldSize.width) { for (int down = Utils::maximum(0,Utils::div(pos.y,imgSize.height)); (down * imgSize.height < pos.y + size.height) && (down * imgSize.height < worldSize.height); down++) { for (int across = Utils::maximum(Utils::div(pos.x,imgSize.width), worldSize.width / imgSize.width); across * imgSize.width < pos.x + size.width; across++) { // area in window coords Area imgArea(Pos(across * imgSize.width - pos.x,down * imgSize.height - pos.y), imgSize); // Clip to window (0,0,size.width,size.height) Size srcOffset = imgArea.clip(size); // Clip to world. srcOffset += imgArea.clip_left(worldSize.width - pos.x); draw_outside_offset(buffer,xvars, dpyNum,srcOffset,imgArea); } } } } Boolean World::open(const Loc &loc,Boolean laddersClosed,Boolean postersClosed, Boolean doorsClosed,Boolean outsideClosed) { if (!inside(loc)) { return !outsideClosed; } // a poster isn't closed at loc Boolean posterOpen = (!postersClosed || !(unionSquares[loc.r][loc.c] && unionSquares[loc.r][loc.c]->type == UN_POSTER)); // a door isn't "closed" at loc Boolean doorOpen = (!doorsClosed || !(unionSquares[loc.r][loc.c] && unionSquares[loc.r][loc.c]->type == UN_DOOR)); // a moverSquare isn't "closed" at loc (uses laddersClosed for now) Boolean moverSquareOpen = (!laddersClosed || !(unionSquares[loc.r][loc.c] && unionSquares[loc.r][loc.c]->type == UN_MOVER)); Boolean ret = // map contains an open square at loc (map[loc.r][loc.c] == Wempty || map[loc.r][loc.c] == WtextSquare || map[loc.r][loc.c] == Wsquanch || (map[loc.r][loc.c] == Wladder && !laddersClosed)) && posterOpen && doorOpen && moverSquareOpen; // quick sanity check. if (unionSquares[loc.r][loc.c]) { assert(map[loc.r][loc.c] == Wempty || map[loc.r][loc.c] == Wwall); } return ret; } // The only World::open() that takes movers into account. Boolean World::open(const Area &area,Boolean laddersClosed, Boolean postersClosed,Boolean doorsClosed, Boolean outsideClosed) { /* Avoid a certain type of crash when area is far out of the world. I.e. when area.pos is near overflow. */ if (!inside(area.middle_wsquare())) { // Fix this to deal with outsideClosed. return False; } // Try all wsquares on top of area. Loc list[AR_WSQUARES_MAX]; int nsquares; area.wsquares(list,nsquares); for (int n = 0; n < nsquares; n++) { if (!open(list[n],laddersClosed,postersClosed, doorsClosed,outsideClosed)) { return False; } // Have to add this inside() check because if outsideClosed is False, // we can still get here. if (inside(list[n])) { // Look at movers corresponding to moverSquares that are covered by area. UnionSquare *uSquare = unionSquares[list[n].r][list[n].c]; if (uSquare && uSquare->type == UN_MOVER) { const Area &moverArea = uSquare->mSquare.mover->get_area(); if (moverArea.overlap(area)) { return False; } } } } // for return True; } Boolean World::open(const Box &box,Boolean laddersClosed,Boolean postersClosed, Boolean doorsClosed) { Loc loc; for (loc.c = box.loc.c; loc.c < box.loc.c + box.dim.colMax; loc.c++) { for (loc.r = box.loc.r; loc.r < box.loc.r + box.dim.rowMax; loc.r++) { if (!open(loc,laddersClosed,postersClosed,doorsClosed)) { return False; } } } return True; } Wsig World::open_offset(Size &offset,const Area &areaNew,const Vel &vel) { if (open(areaNew)) { return W_NO_SIG; } // wrap-around disabled. #if 0 // Check for player wrapping around the world. if (check_wrap_around(offset,areaNew)) { return W_CLOSE; } #endif Vel opp = -1.0f * vel; Dir best[4]; Dir others[4]; int bestNum,othersNum; opp.get_dirs_4(best,others,bestNum,othersNum); if (open_try_dirs(offset,areaNew,best,bestNum)) { return W_CLOSE; } if (open_try_dirs(offset,areaNew,others,othersNum)) { return W_CLOSE; } // Special "Hero stuck in corner" case. if (open_try_corners(offset,areaNew)) { return W_CLOSE; } // Big jump. if (open_try_diagonals(offset,areaNew)) { return W_CLOSE_BAD; } return W_FAILURE; } void World::compute_touching_hanging(Touching &touching, Hanging &hanging, MoverP &touchingMover,const Area &area) { Pos apos; Size asize; area.get_rect(apos,asize); touching = CO_air; hanging.corner = CO_air; TouchingList touchingList; area.touching_wsquares(touchingList); TouchingList edgeList; area.edge_wsquares(edgeList); // Set to NULL if not touching a Mover. touchingMover = NULL; // Last one takes priority. Down is highest priority, then // Up, then right, left. th_helper(touching,hanging,touchingMover,touchingList.l,edgeList.l, True,area,apos.y,asize.height, WSQUARE_HEIGHT,CO_l,CO_l_UP,CO_l_DN); th_helper(touching,hanging,touchingMover,touchingList.r,edgeList.r, True,area,apos.y,asize.height, WSQUARE_HEIGHT,CO_r,CO_r_UP,CO_r_DN); th_helper(touching,hanging,touchingMover,touchingList.up,edgeList.up, False,area,apos.x,asize.width, WSQUARE_WIDTH,CO_up,CO_up_L,CO_up_R); th_helper(touching,hanging,touchingMover,touchingList.dn,edgeList.dn, False,area,apos.x,asize.width, WSQUARE_WIDTH,CO_dn,CO_dn_L,CO_dn_R); } void World::demo_reset() { // Don't reuse the nonce because may have old packets // uniqueGen = 0; justReset = True; choose_theme(); } void World::clear_everything() { // Delete old unionSquares. Loc loc; for (loc.r = 0; loc.r < dim.rowMax; loc.r++) { for (loc.c = 0; loc.c < dim.colMax; loc.c++) { if (unionSquares[loc.r][loc.c]) { delete unionSquares[loc.r][loc.c]; unionSquares[loc.r][loc.c] = NULL; } } } // Change rooms,dim,size of world. rooms = roomsNext; specialMap = specialMapNext; rooms_dim_size_update(); // Clear map. for (loc.r = 0; loc.r < dim.rowMax; loc.r++) { for (loc.c = 0; loc.c < dim.colMax; loc.c++) { map[loc.r][loc.c] = Wempty; } } delete_movers(); } void World::close_horiz_mover(const Loc &loc,Boolean &inHorizMover) { if (inHorizMover) { // initialize the mover. MoverId moverId; moverId.index = moversNum; moverId.unique = uniqueGen++; Size vel; vel.set(Utils::coin_flip() ? W_MOVER_SPEED : -W_MOVER_SPEED,0); // Use specified initial position if (movers[moversNum]->is_area_set()) { movers[moversNum]->init_not_area(this,locator,vel,moverId); } // Start at right end of the track. else { // Doesn't check that we have at least two wsquares to the right. Pos pos((loc.c - 2) * WSQUARE_WIDTH,loc.r * WSQUARE_HEIGHT); Area area(AR_RECT,pos,moverSize); movers[moversNum]->init(this,locator,area,vel,moverId); } // Dummy mover object, so mover gets redrawn. PhysMoverP p = new PhysMover(this,locator,movers[moversNum]); assert(p); locator->add(p); movers[moversNum]->set_phys_mover_id(p->get_id()); moversNum++; inHorizMover = False; } } void World::close_vert_movers(const Dim &dim) { Loc l; // Traverse all squares. for (l.c = 0; l.c < (dim.colMax - 1); l.c++) { for (l.r = 0; l.r < dim.rowMax; l.r++) { Loc loc = l; Boolean inVertMover = False; // Go down, filling out mover. // (MoverP)-1 hack is described in read_from_file(). while (loc.r < dim.rowMax && unionSquares[loc.r][loc.c] && unionSquares[loc.r][loc.c]->type == UN_MOVER && (unionSquares[loc.r][loc.c]->mSquare.mover == NULL || unionSquares[loc.r][loc.c]->mSquare.mover == (MoverP)-1) && unionSquares[loc.r][loc.c]->mSquare.orientation == OR_VERT && unionSquares[loc.r][loc.c+1] && unionSquares[loc.r][loc.c+1]->type == UN_MOVER && (unionSquares[loc.r][loc.c+1]->mSquare.mover == NULL || unionSquares[loc.r][loc.c+1]->mSquare.mover == (MoverP)-1) && unionSquares[loc.r][loc.c+1]->mSquare.orientation == OR_VERT) { if (!inVertMover) { // create the mover. inVertMover = True; assert(moversNum < MOVERS_MAX); movers[moversNum] = new Mover; assert(movers[moversNum]); } // If starting position of Mover is given by user. if (unionSquares[loc.r][loc.c]->mSquare.mover == (MoverP)-1 && !movers[moversNum]->is_area_set()) { Pos pos(loc.c * WSQUARE_WIDTH,loc.r * WSQUARE_HEIGHT); Area area(AR_RECT,pos,moverSize); movers[moversNum]->init_area(area); } unionSquares[loc.r][loc.c]->mSquare.mover = movers[moversNum]; unionSquares[loc.r][loc.c+1]->mSquare.mover = movers[moversNum]; loc.r++; } // Close out mover. if (inVertMover) { // initialize the mover. MoverId moverId; moverId.index = moversNum; moverId.unique = uniqueGen++; Size vel; vel.set(0,Utils::coin_flip() ? W_MOVER_SPEED : -W_MOVER_SPEED); // Use specified initial position if (movers[moversNum]->is_area_set()) { movers[moversNum]->init_not_area(this,locator,vel,moverId); } // Start at top. else { Pos pos(l.c * WSQUARE_WIDTH,l.r * WSQUARE_HEIGHT); Area area(AR_RECT,pos,moverSize); movers[moversNum]->init(this,locator,area,vel,moverId); } // Dummy mover object, so mover gets redrawn. PhysMoverP p = new PhysMover(this,locator,movers[moversNum]); assert(p); locator->add(p); movers[moversNum]->set_phys_mover_id(p->get_id()); moversNum++; } } // for } // for } Boolean World::read_from_file(char *filename) { FILE *fp = fopen(filename,"r"); if (!fp) { cerr << "Could not open " << filename << endl; return False; } if (EOF == fscanf(fp,"XEvil World 1.0\n")) { cerr << "Invalid header in world file." << endl; fclose(fp); return False; } Dim dim; if (2 != fscanf(fp,"%dx%d\n",&dim.colMax,&dim.rowMax)) { cerr << "Could not read size of world." << endl; fclose(fp); return False; } if (dim.colMax > W_COL_MAX_MAX) { cerr << "Across size is larger than maximum. Truncating to " << W_COL_MAX_MAX << endl; dim.colMax = W_COL_MAX_MAX; } if (dim.rowMax > W_ROW_MAX_MAX) { cerr << "Down size is larger than maximum. Truncating to " << W_ROW_MAX_MAX << endl; dim.rowMax = W_ROW_MAX_MAX; } Dim halfRoom(W_ROOM_ROW_MAX / 2,W_ROOM_COL_MAX / 2); if (dim.rowMax % halfRoom.rowMax != 0 || dim.colMax % halfRoom.colMax != 0) { cerr << "Dimensions of world must be multiples of " << halfRoom.colMax << " across and " << halfRoom.rowMax << " down." << endl; fclose(fp); return False; } if (dim.rowMax <= 0 || dim.colMax <= 0) { cerr << "Invalid dimension, negative or zero." << endl; fclose(fp); return False; } // No longer need to pad with extra Wwall. this->dim = dim; rooms_dim_size_update(&dim); char buffer[W_COL_MAX_MAX]; Loc loc; for (loc.r = 0; loc.r < this->dim.rowMax; loc.r++) { // dim is the size of the data on file, this.dim is // the size alligned to room boundries, fill rest with Wwall if (loc.r < dim.rowMax) { Boolean badRow = False; if (!fgets(buffer,W_COL_MAX_MAX,fp)) { badRow = True; } if (buffer[0] == ';') { // Hit a comment, ignore the line. loc.r--; continue; } if ((int)strlen(buffer) < dim.colMax) { badRow = True; } if (badRow) { cerr << "Could not read World data." << endl; fclose(fp); return False; } Boolean inHorizMover = False; for (loc.c = 0; loc.c < this->dim.colMax; loc.c++) { if (loc.c < dim.colMax) { char val; switch (buffer[loc.c]) { case '.': val = Wempty; close_horiz_mover(loc,inHorizMover); break; case '#': val = Wwall; close_horiz_mover(loc,inHorizMover); break; case 'H': val = Wladder; close_horiz_mover(loc,inHorizMover); break; case '*': val = WupDown; close_horiz_mover(loc,inHorizMover); break; case '^': case '|': case '&': // sticking in floor. val = Wempty; close_horiz_mover(loc,inHorizMover); if (loc.c + 1 < dim.colMax && (buffer[loc.c+1] == '^' || buffer[loc.c+1] == '|' || buffer[loc.c+1] == '&')) { Boolean markStartPos = (buffer[loc.c] == '^' && buffer[loc.c + 1] == '^'); Boolean stickInFloor = (buffer[loc.c] == '&' && buffer[loc.c + 1] == '&'); // Do two squares. for (int x = 0; x < 2; x++) { unionSquares[loc.r][loc.c] = new UnionSquare; assert(unionSquares[loc.r][loc.c]); unionSquares[loc.r][loc.c]->type = UN_MOVER; // Big hack here. We don't create mover here since we don't know which // mover goes with which wsquare, but we still need to remember where // the initial position is. Set mover to be (MoverP)(-1) for wsquares // that the user specified as initial positions. if (markStartPos) { unionSquares[loc.r][loc.c]->mSquare.mover = (MoverP)-1; } else { unionSquares[loc.r][loc.c]->mSquare.mover = NULL; } unionSquares[loc.r][loc.c]->mSquare.orientation = OR_VERT; if (x == 0) { map[loc.r][loc.c] = stickInFloor ? Wwall : Wempty; loc.c++; } else { assert(x == 1); val = stickInFloor ? Wwall : Wempty; } } } break; case '~': case '-': case '%': if (buffer[loc.c] == '%') { val = Wwall; } else { val = Wempty; } // Make sure at least two next to each other. if ((loc.c + 1 < dim.colMax && (buffer[loc.c+1] == '~' || buffer[loc.c+1] == '-' || buffer[loc.c+1] == '%')) || (loc.c - 1 >= 0 && (buffer[loc.c-1] == '~' || buffer[loc.c-1] == '-' || buffer[loc.c-1] == '%'))) { if (!inHorizMover) { assert(moversNum < MOVERS_MAX); movers[moversNum] = new Mover; assert(movers[moversNum]); } inHorizMover = True; unionSquares[loc.r][loc.c] = new UnionSquare; assert(unionSquares[loc.r][loc.c]); unionSquares[loc.r][loc.c]->type = UN_MOVER; unionSquares[loc.r][loc.c]->mSquare.mover = movers[moversNum]; unionSquares[loc.r][loc.c]->mSquare.orientation = OR_HORIZ; // If starting position of Mover is given by user. if (buffer[loc.c] == '~' && // Need two '~' in a row. loc.c + 1 < dim.colMax && buffer[loc.c + 1] == '~' && // pos not already set. !movers[moversNum]->is_area_set()) { Pos pos(loc.c * WSQUARE_WIDTH,loc.r * WSQUARE_HEIGHT); Area area(AR_RECT,pos,moverSize); movers[moversNum]->init_area(area); } } break; default: cerr << "Error reading map, unknown character " << buffer[loc.c] << endl; val = Wempty; close_horiz_mover(loc,inHorizMover); } map[loc.r][loc.c] = val; } else { // Close out mover. close_horiz_mover(loc,inHorizMover); // Fill rest of row with Wwall map[loc.r][loc.c] = Wwall; } } // for loc.c } else { // Fill remaining rows with Wwall for (loc.c = 0; loc.c < this->dim.colMax; loc.c++) { map[loc.r][loc.c] = Wwall; } } } close_vert_movers(dim); fclose(fp); return True; } void World::read_from_stream(InStreamP in) { Dim dim(in); themeIndex = in->read_int(); themeIndex = Utils::minimum(W_THEME_NUM - 1,themeIndex); backgroundIndex = in->read_int(); #if WIN32 backgroundIndex = Utils::minimum(W_ALL_BACKGROUNDS_NUM - 1,backgroundIndex); #endif outsideIndex = in->read_int(); #if WIN32 outsideIndex = Utils::minimum(W_ALL_OUTSIDES_NUM - 1,outsideIndex); #endif // Take minimum with the max number, just in case the server gives an invalid // number. Only for windows, UNIX client doesn't give a shit about these numbers. if (!in->alive()) { // failure. return; } rooms_dim_size_update(&dim); Loc l; for (l.c = 0; l.c < dim.colMax; l.c++) { for (l.r = 0; l.r < dim.rowMax; l.r++) { map[l.r][l.c] = in->read_char(); } } assert(moversNum == 0); moversNum = in->read_int(); int n; for (n = 0; n < moversNum; n++) { movers[n] = new Mover(in,this,locator); assert(movers[n]); } int uCount = in->read_int(); for (n = 0; n < uCount; n++) { Loc loc; loc.read(in); if (unionSquares[loc.r][loc.c]) { delete unionSquares[loc.r][loc.c]; } unionSquares[loc.r][loc.c] = UnionSquare::read(in,this); assert(unionSquares[loc.r][loc.c]); // Hack to deal with different poster sizes on UNIX vs. Windows. if (unionSquares[loc.r][loc.c]->type == UN_POSTER) { // Weed out posters that aren't there if (unionSquares[loc.r][loc.c]->pSquare.poster >= W_ALL_POSTERS_NUM) { delete unionSquares[loc.r][loc.c]; unionSquares[loc.r][loc.c] = NULL; } else { // Special check to weed out posters that are too big. Loc &pLoc = unionSquares[loc.r][loc.c]->pSquare.loc; int p = unionSquares[loc.r][loc.c]->pSquare.poster; if (pLoc.c >= posterDims[p].colMax || pLoc.r >= posterDims[p].rowMax) { delete unionSquares[loc.r][loc.c]; unionSquares[loc.r][loc.c] = NULL; } } } } } int World::get_write_length() { // Count number of union squares. int uCount = 0; Loc l; for (l.c = 0; l.c < dim.colMax; l.c++) { for (l.r = 0; l.r < dim.rowMax; l.r++) { if (unionSquares[l.r][l.c]) { uCount++; } } } return Dim::get_write_length() + // dim sizeof(int) + // themeIndex sizeof(int) + // backgroundIndex sizeof(int) + // outsideIndex dim.rowMax * dim.colMax * sizeof(char) + // wsquares sizeof(int) + // moversNum moversNum * Mover::get_write_length() + // movers[] sizeof(int) + // uCount uCount * (Loc::get_write_length() + UnionSquare::get_write_length()); // unionSquares[] } void World::write(OutStreamP out) { dim.write(out); out->write_int(themeIndex); out->write_int(backgroundIndex); out->write_int(outsideIndex); if (!out->alive()) { return; } Loc l; for (l.c = 0; l.c < dim.colMax; l.c++) { for (l.r = 0; l.r < dim.rowMax; l.r++) { out->write_char(map[l.r][l.c]); } } // Write movers before union squares so that MoverSquares can refer to // the movers. out->write_int(moversNum); int n; for (n = 0; n < moversNum; n++) { movers[n]->write(out); } // Count number of union squares. int uCount = 0; for (l.c = 0; l.c < dim.colMax; l.c++) { for (l.r = 0; l.r < dim.rowMax; l.r++) { if (unionSquares[l.r][l.c]) { uCount++; } } } out->write_int(uCount); for (l.c = 0; l.c < dim.colMax; l.c++) { for (l.r = 0; l.r < dim.rowMax; l.r++) { if (unionSquares[l.r][l.c]) { l.write(out); unionSquares[l.r][l.c]->write(out); } } } } // For one room. int World::get_write_length(const RoomIndex &) { return W_ROOM_ROW_MAX * W_ROOM_COL_MAX * sizeof(char); } // Write one room. void World::write(OutStreamP outStream,const RoomIndex &idx) { if (!outStream->alive()) { return; } Loc l; for (l.r = idx.down * W_ROOM_ROW_MAX; l.r < (idx.down + 1) * W_ROOM_ROW_MAX; l.r++) { for (l.c = idx.across * W_ROOM_COL_MAX; l.c < (idx.across + 1) * W_ROOM_COL_MAX; l.c++) { if (inside(l)) { outStream->write_char(map[l.r][l.c]); } else { // There's not really any point in writing this. outStream->write_char(Woutside); } } } } // Read one room void World::read(InStreamP in,const RoomIndex &idx) { if (!in->alive()) { return; } Loc l; for (l.r = idx.down * W_ROOM_ROW_MAX; l.r < (idx.down + 1) * W_ROOM_ROW_MAX; l.r++) { for (l.c = idx.across * W_ROOM_COL_MAX; l.c < (idx.across + 1) * W_ROOM_COL_MAX; l.c++) { if (inside(l)) { map[l.r][l.c] = in->read_char(); } else { // just throw it away. in->read_char(); } } } } void World::reset(const Dim *clearDim,InStreamP inStream) { // Don't reuse the nonce because may have old packets // uniqueGen = 0; justReset = True; assert(locator); clear_everything(); // Create empty world of given dimensions. if (clearDim) { rooms_dim_size_update(clearDim); return; } // Read from stream if supplied if (inStream) { read_from_stream(inStream); return; } // Read from file if set. if (specialMap == MAP_NONE && worldFile) { if (!read_from_file(worldFile)) { // Failed to read, go back to default. clear_everything(); // Don't bother to try again. Utils::freeif(worldFile); } } // Create regular world if worldFile is NULL or if world can't be read // in. if (!worldFile) { // Before blueprints if (specialMap == FLAG) { // hack so FireDemon can get flags. objectDimMax.colMax = OBJECT_BIG_COL_MAX; objectDimMax.rowMax = OBJECT_BIG_ROW_MAX; } else { // back to default. objectDimMax.colMax = OBJECT_COL_MAX; objectDimMax.rowMax = OBJECT_ROW_MAX; } // Generate new map. if (blueprints) { delete blueprints; } blueprints = new Blueprints(this,map,objectDimMax,specialMap); assert(blueprints); if (mapPrint) { blueprints->print(); } blueprints->room_boundries(); if (useMovers) { add_movers(); } blueprints->extra_walls(); blueprints->up_downs(); if (specialMap != ZIG_ZAG) {// Can't have people teleporting around, now. add_doors(); } add_posters(); // add_vert_movers(); } choose_theme(); } void World::choose_theme() { // Weigh choice of themes by number of backgrounds in each theme. int themeWeights[W_THEME_NUM]; for (int n = 0; n < W_THEME_NUM; n++) { themeWeights[n] = themes[n].backgroundsNum; } // X11 has no themes, but still maintains these indices if it is acting as // a server. themeIndex = Utils::weighted_choose(W_THEME_NUM,themeWeights); backgroundIndex = Utils::choose(themes[themeIndex].backgroundsNum); // Want index into xdata.backgroundSurfaces backgroundIndex = themes[themeIndex].backgroundIndices[backgroundIndex]; outsideIndex = Utils::choose(themes[themeIndex].outsidesNum); outsideIndex = themes[themeIndex].outsideIndices[outsideIndex]; } MoverP World::lookup(const MoverId &id) { if (id.index != MoverId::INVALID && id.index >= 0 && id.index < moversNum && movers[id.index]->get_mover_id() == id) { return movers[id.index]; } return NULL; } void World::clock() { justReset = False; for (int n = 0; n < moversNum; n++) { movers[n]->clock(); } // for n } Pos World::empty_rect(const Size &s) { int count = 0; // Guard against infinite loop. while (True) { // Bail out, semi-gracefully. if (count >= EMPTY_TRIES_MAX) { cerr << "World::empty_rect failed after " << EMPTY_TRIES_MAX << " iterations" << endl; Pos ret; // (0,0) return ret; } count++; Pos ret; ret.x = Utils::choose(size.width); ret.y = Utils::choose(size.height); Area area(AR_RECT,ret,s); if (open(area,True,False,True)) { return ret; } } } Pos World::empty_touching_rect(const Size &s) { int count = 0; // Guard against infinite loop. while (True) { // Bail out, semi-gracefully. if (count >= EMPTY_TRIES_MAX) { cerr << "World::empty_touching_rect failed after " << EMPTY_TRIES_MAX << " iterations" << endl; Pos ret; // (0,0) return ret; } count++; Pos ret; ret.x = Utils::choose(size.width); ret.y = WSQUARE_HEIGHT * Utils::choose(dim.rowMax) - s.height; Area area(AR_RECT,ret,s); Touching touching; Hanging hanging; MoverP dummy; compute_touching_hanging(touching,hanging,dummy,area); if (open(area,True,False,True) && (touching == CO_dn)) { return ret; } } } Pos World::empty_accessible_rect(const Size &s) { int count = 0; // Guard against infinite loop. while (True) { // Bail out, semi-gracefully. if (count >= EMPTY_TRIES_MAX) { cerr << "World::empty_accessible_rect failed after " << EMPTY_TRIES_MAX << " iterations" << endl; Pos ret; // (0,0) return ret; } count++; // Choose the room. RoomIndex r(Utils::choose(rooms.downMax), Utils::choose(rooms.acrossMax)); Pos ret; if (empty_accessible_rect_one(ret,s,r)) { return ret; } } } Pos World::empty_accessible_rect(const Size &s,const RoomIndex &r) { int count = 0; // Guard against infinite loop. while (True) { // Bail out, semi-gracefully. if (count >= EMPTY_TRIES_MAX) { cerr << "World::empty_accessible_rect<2> failed after " << EMPTY_TRIES_MAX << " iterations" << endl; Pos ret; // (0,0) return ret; } count++; Pos ret; // Use supplied room. if (empty_accessible_rect_one(ret,s,r)) { return ret; } } } Boolean World::empty_accessible_rect_one(Pos &ret,const Size &s, const RoomIndex &r) { Blueprints *bl = blueprints; assert(bl); // Start at right edge of room. ret.x = r.across * W_ROOM_COL_MAX * WSQUARE_WIDTH; // Choose x coord so that on right or left side of ladder, whereever // there is a floor. if (bl->blocked_right(r)) { if (bl->blocked_left(r)) { // Bail out, no suitable rect. return False; } else { // Left half of room. ret.x += Utils::choose(WSQUARE_WIDTH * bl->get_middle_col(r.across)); } } else { if (bl->blocked_left(r)) { // Right half of room. ret.x += WSQUARE_WIDTH * (bl->get_middle_col(r.across) + objectDimMax.colMax) + Utils::choose(WSQUARE_WIDTH * (W_ROOM_COL_MAX - bl->get_middle_col(r.across) - objectDimMax.colMax)); } else { if (Utils::coin_flip()) { // Left half of room. ret.x += Utils::choose(WSQUARE_WIDTH * bl->get_middle_col(r.across)); } else { // Right half of room. ret.x += WSQUARE_WIDTH * (bl->get_middle_col(r.across) + objectDimMax.colMax) + Utils::choose(WSQUARE_WIDTH * (W_ROOM_COL_MAX - bl->get_middle_col(r.across) - objectDimMax.colMax)); } } } // y coord so that area is just touching middle floor. ret.y = (r.down * W_ROOM_ROW_MAX + bl->get_middle_row(r.down)) * WSQUARE_HEIGHT - s.height; Area area(AR_RECT,ret,s); if (open(area,True,False,True)) { return True; } else { return False; } } Boolean World::empty_box(Loc &loc,const Dim &d,Boolean laddersClosed, Boolean postersClosed,Boolean doorsClosed) { int count = 0; // Guard against infinite loop. while (True) { if (count >= EMPTY_TRIES_MAX) { return False; } count++; loc.c = Utils::choose(dim.colMax); loc.r = Utils::choose(dim.rowMax); Box box(loc,d); if (open(box,laddersClosed,postersClosed,doorsClosed)) { return True; } } } Boolean World::empty_touching_box(Loc &loc,const Dim &d, Boolean laddersClosed, Boolean postersClosed, Boolean doorsClosed) { int count = 0; // Guard against infinite loop. while (True) { if (count >= EMPTY_TRIES_MAX) { return False; } count++; loc.c = Utils::choose(dim.colMax); loc.r = Utils::choose(dim.rowMax); Area area(AR_RECT,loc,d); Touching touching; Hanging hanging; MoverP dummy; compute_touching_hanging(touching,hanging,dummy,area); if (open(area,laddersClosed,postersClosed,doorsClosed) && touching == CO_dn) { return True; } } } void World::rooms_dim_size_update(const Dim *newDim) { if (newDim) { // Use newDim to set dim, rooms, and size. dim = *newDim; // Round rooms up. rooms.downMax = (int)ceil((float)dim.rowMax / (float)W_ROOM_ROW_MAX); rooms.acrossMax = (int)ceil((float)dim.colMax / (float)W_ROOM_COL_MAX); } else { // Use this.rooms to set dim and size. dim.colMax = rooms.acrossMax * W_ROOM_COL_MAX; dim.rowMax = rooms.downMax * W_ROOM_ROW_MAX; } size.width = dim.colMax * WSQUARE_WIDTH; size.height = dim.rowMax * WSQUARE_HEIGHT; } void World::th_helper( // Return values. Touching &touching, Hanging &hanging, MoverP &touchingMover, const TouchingListItem &tItem, const TouchingListItem &eItem, // For getting potential Movers. Boolean r_c, // row/column const Area &area, int coord,int length, int wsquare_length, Touching iftouching, Corner ifsmall, Corner iflarge) { // Compute touching. Boolean touchingOk = False; // Get list of all movers touching area on the given side. MoverP touchingMovers[MOVERS_MAX]; int touchingMoversNum = 0; int n; for (n = 0; n < eItem.num; n++) { const Loc &loc = eItem.list[n]; if (inside(loc) && unionSquares[loc.r][loc.c] && unionSquares[loc.r][loc.c]->type == UN_MOVER && area.touches(unionSquares[loc.r][loc.c]->mSquare.mover->get_area(), iftouching)) { Boolean alreadyFound = False; for (int m = 0; m < touchingMoversNum; m++) { if (touchingMovers[m] == unionSquares[loc.r][loc.c]->mSquare.mover) { alreadyFound = True; continue; } } if (!alreadyFound) { touchingMovers[touchingMoversNum] = unionSquares[loc.r][loc.c]->mSquare.mover; touching = iftouching; // May be set again in hanging. touchingMover = touchingMovers[touchingMoversNum]; touchingOk = True; touchingMoversNum++; } } } // Is a mover touching. if (!touchingOk) { // Check all Locs. for (n = 0; n < tItem.num; n++) { if (!open(tItem.list[n])) { touching = iftouching; touchingMover = NULL; touchingOk = True; continue; } } } // Only compute hanging if touching. if (touchingOk) { int hangCutoff = (int)floor(HANGING_PERCENT * length); int n; for (n = 0; n < tItem.num; n++) { if (!open(tItem.list[n])) { break; } } // tItem.list[n] is first blocked wsquare. if ((n < tItem.num) && ((r_c ? tItem.list[n].r:tItem.list[n].c) * wsquare_length - coord >= hangCutoff)) { hanging.corner = ifsmall; hanging.loc = tItem.list[n]; hanging.type = Hanging::LOC; } for (n = tItem.num - 1; n >= 0; n--) { if (! open(tItem.list[n])) { break; } } // tItem.list[n] is last blocked wsquare. if ((n >= 0) && (coord + length - (r_c ? tItem.list[n].r + 1: tItem.list[n].c + 1) * wsquare_length >= hangCutoff)) { hanging.corner = iflarge; hanging.loc = tItem.list[n]; hanging.type = Hanging::LOC; } // Really should sort movers by their areas and then treat them similar // to the Locs, but fuck it. for (n = 0; n < touchingMoversNum; n++) { Pos moverPos; Size moverSize; const Area &moverArea = touchingMovers[n]->get_area(); moverArea.get_rect(moverPos,moverSize); if ((r_c ? moverPos.y : moverPos.x) - coord >= hangCutoff) { hanging.corner = ifsmall; hanging.moverId = touchingMovers[n]->get_mover_id(); hanging.type = Hanging::MOVER; // touchingMover = touchingMovers[n]; } if (coord + length - (r_c ? moverPos.y + moverSize.height : moverPos.x + moverSize.width) >= hangCutoff) { hanging.corner = iflarge; hanging.moverId = touchingMovers[n]->get_mover_id(); hanging.type = Hanging::MOVER; // touchingMover = touchingMovers[n]; } } } // touchingOk } Boolean World::check_wrap_around(Size &offset,const Area &area) { // Only consider wrapping-around if the slot is completely open // except for being partially outside the world. So, pass in False // for the outsideClosed argument of World::open(). */ if (!open(area,False,False,False,False)) { return False; } Pos arPos; Size arSize; area.get_rect(arPos,arSize); // Can't have any objects that are as big as the world. assert(arSize.width < size.width); // Go off left side of screen, appear flush against right wall. if (arPos.x < 0) { offset.width = size.width - arSize.width - arPos.x; offset.height = 0; // Only do wrap-around if the new position is open. Area newArea = area + offset; return open(newArea); } // Go off right side of screen, appear flush against left wall. if (arPos.x + arSize.width > size.width) { offset.width = -arPos.x; offset.height = 0; // Only do wrap-around if the new position is open. Area newArea = area + offset; return open(newArea); } return False; } Boolean World::open_iter(Area &area,int &changed,Dir dir) { int offOne = 0; Loc list[AR_WSQUARES_MAX]; int nsquares; area.wsquares(list,nsquares); for (int n = 0; n < nsquares; n++) { // Support for up_downs. if (inside(list[n]) && (map[list[n].r][list[n].c] == WupDown) && ((dir == CO_R) || (dir == CO_L))) { return False; } // Avoid closed block. if (! open(list[n])) { int temp = area.avoid_wsquare_dir(list[n],dir); offOne = Utils::maximum(offOne,temp); } // Look at mover corresponding to moverSquare at list[n]. if (inside(list[n])) { UnionSquare *uSquare = unionSquares[list[n].r][list[n].c]; if (uSquare && uSquare->type == UN_MOVER) { const Area &moverArea = uSquare->mSquare.mover->get_area(); if (moverArea.overlap(area)) { // Movers always shift you up. if (dir != CO_UP) { return False; } int temp = area.avoid_area_dir(uSquare->mSquare.mover->get_area(),dir); offOne = max(offOne,temp); } } } } if (offOne == 0) { return True; } changed += offOne; area.shift(open_size(offOne,dir)); return False; } Size World::open_size(int offset,Dir dir) { Size ret; ret.width = ret.height = 0; switch (dir) { case CO_R: ret.width = offset; break; case CO_DN: ret.height = offset; break; case CO_L: ret.width = -offset; break; case CO_UP: ret.height = -offset; break; }; return ret; } Size World::open_size(int offset1,Dir dir1,int offset2,Dir dir2) { Size ret; ret.width = ret.height = 0; switch (dir1) { case CO_R: ret.width = offset1; break; case CO_DN: ret.height = offset1; break; case CO_L: ret.width = -offset1; break; case CO_UP: ret.height = -offset1; break; }; switch (dir2) { case CO_R: ret.width = offset2; break; case CO_DN: ret.height = offset2; break; case CO_L: ret.width = -offset2; break; case CO_UP: ret.height = -offset2; break; }; return ret; } Boolean World::open_try_dirs(Size &offset,const Area &area,const Dir dirs[4], int dirsNum) { if (!dirsNum) { return False; } // Trying several directions simultaneously. Area areas[4]; int offsets[4]; for (int n = 0; n < dirsNum; n++) { areas[n] = area; offsets[n] = 0; } for (int iter = 0; iter < OPEN_ITERATIONS; iter++) { Boolean oks[4]; int n; for (n = 0; n < dirsNum; n++) { oks[n] = open_iter(areas[n],offsets[n],dirs[n]); } int offsetOkMin = Utils::minimum(offsets,oks,dirsNum); // Return after first iteration that gives an open area in one of the directions. for (n = 0; n < dirsNum; n++) { if (oks[n] && (offsets[n] == offsetOkMin)) { offset = open_size(offsets[n],dirs[n]); return True; } } } return False; } Boolean World::open_try_corners(Size &offset,const Area &area) { Dir corners[4]; corners[0] = CO_DN_R; corners[1] = CO_DN_L; corners[2] = CO_UP_L; corners[3] = CO_UP_R; // Try all four corners. for (int cNum = 0; cNum < 4; cNum++) { Loc outer[3]; Loc inner; if (area.corner_offset(offset,outer,inner,corners[cNum])) { // Check that all 3 outer wsquares are closed. Boolean validCorner = True; for (int n = 0; n < 3; n++) { if (open(outer[n])) { validCorner = False; break; } } // Check that the inner wsquare of the corner is open. if (!open(inner)) { validCorner = False; } if (validCorner) { // offset is already set. return True; } } } return False; } Boolean World::open_try_diagonals(Size &offset,const Area &area) { Dir dirs[4]; dirs[0] = CO_R; dirs[1] = CO_DN; dirs[2] = CO_L; dirs[3] = CO_UP; int offsets[4]; int n; for (n = 0; n < 4; n++) { offsets[n] = 0; } Loc list[AR_WSQUARES_MAX]; int nsquares; area.wsquares(list,nsquares); for (n = 0; n < nsquares; n++) { if (! open(list[n])) { for (int dIndex = 0; dIndex < 4; dIndex++) { int dOffset = area.avoid_wsquare_dir(list[n],dirs[dIndex]); offsets[dIndex] = Utils::maximum(dOffset,offsets[dIndex]); } } // Look at mover corresponding to moverSquare at list[n]. if (inside(list[n])) { UnionSquare *uSquare = unionSquares[list[n].r][list[n].c]; if (uSquare && uSquare->type == UN_MOVER) { const Area &moverArea = uSquare->mSquare.mover->get_area(); if (moverArea.overlap(area)) { for (int dIndex = 0; dIndex < 4; dIndex++) { int dOffset = area.avoid_area_dir(uSquare->mSquare.mover->get_area(), dirs[dIndex]); offsets[dIndex] = Utils::maximum(dOffset,offsets[dIndex]); } } } } } // if for (int dIndex = 0; dIndex < 4; dIndex++) { Area areaTest = area; offset = open_size(offsets[dIndex],dirs[dIndex], offsets[(dIndex + 1) % 4],dirs[(dIndex + 1) % 4]); areaTest.shift(offset); if (open(areaTest)) { return True; } } return False; } void World::add_posters() { // Put in posters. for (int n = 0; n < POSTERS_ACTUAL_PERCENT * dim.rowMax * dim.colMax; n++) { // Choose poster appropriate for the current theme. int p = Utils::choose(themes[themeIndex].postersNum); p = themes[themeIndex].posterIndices[p]; Loc pLoc; if (!empty_box(pLoc,posterDims[p],True,True,True)) { break; } Loc loc; for (loc.c = pLoc.c; loc.c < pLoc.c + posterDims[p].colMax; loc.c++) { for (loc.r = pLoc.r; loc.r < pLoc.r + posterDims[p].rowMax; loc.r++) { if (! unionSquares[loc.r][loc.c]) { unionSquares[loc.r][loc.c] = new UnionSquare; } assert(unionSquares[loc.r][loc.c]); unionSquares[loc.r][loc.c]->type = UN_POSTER; unionSquares[loc.r][loc.c]->pSquare.poster = p; unionSquares[loc.r][loc.c]->pSquare.loc.c = loc.c - pLoc.c; unionSquares[loc.r][loc.c]->pSquare.loc.r = loc.r - pLoc.r; } } } } void World::add_doors() { // Put in doors. for (int n = 0; n < DOORS_ACTUAL_PERCENT * rooms.downMax * rooms.acrossMax; n++) { Loc loc1; Loc loc2; Dim doorDim(2,1); // Hardwired size of doors. if (!empty_touching_box(loc1,doorDim,True,True,True)) { break; } if (!empty_touching_box(loc2,doorDim,True,True,True)) { break; } // Don't want doors on top of each other. Area area1(AR_RECT,loc1,doorDim); Area area2(AR_RECT,loc2,doorDim); if (area1.overlap(area2)) { break; } // Lower half of doors. Loc loc1d = loc1.move(1,0); Loc loc2d = loc2.move(1,0); // We actually create 4 doors, two pairs. Each apparent door is // actually two DoorSquares. // Cross connect two new doors at loc1 and loc2. unionSquares[loc1.r][loc1.c] = new UnionSquare; assert(unionSquares[loc1.r][loc1.c]); unionSquares[loc1.r][loc1.c]->type = UN_DOOR; unionSquares[loc1.r][loc1.c]->dSquare.dest = loc2; unionSquares[loc1.r][loc1.c]->dSquare.topBottom = W_DOOR_TOP; unionSquares[loc2.r][loc2.c] = new UnionSquare; assert(unionSquares[loc2.r][loc2.c]); unionSquares[loc2.r][loc2.c]->type = UN_DOOR; unionSquares[loc2.r][loc2.c]->dSquare.dest = loc1; unionSquares[loc2.r][loc2.c]->dSquare.topBottom = W_DOOR_TOP; // Cross connect two new doors at loc1d and loc2d. unionSquares[loc1d.r][loc1d.c] = new UnionSquare; assert(unionSquares[loc1d.r][loc1d.c]); unionSquares[loc1d.r][loc1d.c]->type = UN_DOOR; unionSquares[loc1d.r][loc1d.c]->dSquare.dest = loc2d; unionSquares[loc1d.r][loc1d.c]->dSquare.topBottom = W_DOOR_BOTTOM; unionSquares[loc2d.r][loc2d.c] = new UnionSquare; assert(unionSquares[loc2d.r][loc2d.c]); unionSquares[loc2d.r][loc2d.c]->type = UN_DOOR; unionSquares[loc2d.r][loc2d.c]->dSquare.dest = loc1d; unionSquares[loc2d.r][loc2d.c]->dSquare.topBottom = W_DOOR_BOTTOM; } // for } void World::add_movers() { assert(moversNum <= MOVERS_MAX && blueprints); // Movers shouldn't be too big. assert(objectDimMax.colMax * WSQUARE_WIDTH >= moverSize.width); // Number of movers to create. const int moversActual = Utils::choose((int)(rooms.acrossMax * rooms.downMax * MOVERS_PERCENT) + 1); for (int n = 0; n < moversActual && moversNum < MOVERS_MAX; n++) { Boolean which = Utils::coin_flip(); Boolean ok = False; int tries = 0; while (!ok && tries < MOVER_TRIES) { // Decide between horizontal and vertical mover. if (which) { ok = add_vert_mover(); } else { ok = add_horiz_mover(); } tries++; } } } Boolean World::add_horiz_mover() { assert(moversNum <= MOVERS_MAX && blueprints); // Movers shouldn't be too big. assert(objectDimMax.colMax * WSQUARE_WIDTH >= moverSize.width); // loc will walk right or left, filling in track. Loc loc; loc.r = Utils::choose(dim.rowMax); loc.c = Utils::choose(dim.colMax); // Check space surrounding initial choice for minimum track length. int delta = Utils::coin_flip() ? 1 : -1; // right or left. Loc check; for (check.c = loc.c - (delta == -1 ? MOVERS_HORIZ_MIN_TRACK : 1) * objectDimMax.colMax; check.c < loc.c + (delta == 1 ? MOVERS_HORIZ_MIN_TRACK + 1 : 2) * objectDimMax.colMax; // mover track plus blank space check.c++) { for (check.r = loc.r - objectDimMax.rowMax; check.r <= loc.r + objectDimMax.rowMax; check.r++) { if (!open(check,True,True,True)) { return False; } } } // Create mover movers[moversNum] = new Mover; assert(movers[moversNum]); // Start at the right edge of the mover and go left if (delta == -1) { loc.c += objectDimMax.colMax - 1; } // else we are at the left edge going right. // minimum and maximum values of left side of mover, inclusive int mLeft = loc.c; int mRight = loc.c; // Go right/left until hit a wall or decide to stop. // Must do at least MOVERS_HORIZ_MIN_TRACK multiples of the mover width. int n = 0; Boolean ok = True; while (ok && (n <= MOVERS_HORIZ_MIN_TRACK * objectDimMax.colMax || Utils::choose(MOVERS_HORIZ_TRACK_LENGTH))) { // Check if we can put a mover at loc. for (check.c = loc.c; check.c != loc.c + delta * objectDimMax.colMax; check.c += delta) { for (check.r = loc.r - objectDimMax.rowMax; check.r <= loc.r + objectDimMax.rowMax; check.r++) { if (!open(check,True,True,True)) { ok = False; // Our above check of the surrounding space was not correct. assert(n >= MOVERS_HORIZ_MIN_TRACK * objectDimMax.colMax); } if (!ok) { break; } } if (!ok) { break; } } // Add mover track at loc. if (ok) { // Add a mover square. assert(inside(loc) && (map[loc.r][loc.c] == Wempty ) && !unionSquares[loc.r][loc.c]); unionSquares[loc.r][loc.c] = new UnionSquare; assert(unionSquares[loc.r][loc.c]); unionSquares[loc.r][loc.c]->type = UN_MOVER; unionSquares[loc.r][loc.c]->mSquare.mover = movers[moversNum]; unionSquares[loc.r][loc.c]->mSquare.orientation = OR_HORIZ; mLeft = Utils::minimum(mLeft,loc.c); mRight = Utils::maximum(mRight,loc.c); n++; loc.c += delta; } } // while ok // Check again that we got enough track. assert(mRight - mLeft + 1 >= MOVERS_HORIZ_MIN_TRACK * objectDimMax.colMax); // initialize mover. // Choose X position somewhere in range of mover squares. int rangeX = (mRight - mLeft + 1 - objectDimMax.colMax) * WSQUARE_WIDTH + 1; assert(rangeX > 0); // Or not enough room. int startX = Utils::choose(rangeX) + mLeft * WSQUARE_WIDTH; Pos pos(startX,loc.r * WSQUARE_HEIGHT); Area area(AR_RECT,pos,moverSize); Size vel; vel.set(Utils::coin_flip() ? W_MOVER_SPEED : -W_MOVER_SPEED,0); // initialize the mover. MoverId moverId; moverId.index = moversNum; moverId.unique = uniqueGen++; movers[moversNum]->init(this,locator,area,vel,moverId); // Dummy mover object, so mover gets redrawn. PhysMoverP p = new PhysMover(this,locator,movers[moversNum]); assert(p); locator->add(p); movers[moversNum]->set_phys_mover_id(p->get_id()); moversNum++; return True; } // What an ugly function. I should redo this. Boolean World::add_vert_mover() { assert(moversNum <= MOVERS_MAX && blueprints); // Movers shouldn't be too big. assert(objectDimMax.colMax * WSQUARE_WIDTH >= moverSize.width); // Choose a random room, check if its middle is a ladder, if so, change // the ladder to a bunch of mover squares and create a new mover. // Else continue. Loc init; int m; // holder for the down/across value of the room chosen. m = Utils::choose(rooms.acrossMax); init.c = m * W_ROOM_COL_MAX + blueprints->get_middle_col(m); m = Utils::choose(rooms.downMax); init.r = m * W_ROOM_ROW_MAX + blueprints->get_middle_row(m); // Found a ladder, create a new mover and set all the ladder wsquares to be // MoverSquares pointing to the new mover. if (!(map[init.r][init.c] == Wladder && map[init.r][init.c+1] == Wladder)) { return False; } assert(!unionSquares[init.r][init.c]); // All wsquares between mTop and mBottom, exclusive, are part of the // mover. int mTop = init.r; int mBottom = init.r; movers[moversNum] = new Mover; assert(movers[moversNum]); // delta is -1, then 1. Go up, then down.. for (int delta = -1; delta <= 1; delta += 2) { Loc loc = init; // To avoid hitting init twice, skip it when going down. if (delta == 1) { loc.r++; } // Scan up/down depending on value of delta. Boolean bothInside = inside(loc) && inside(loc.r,loc.c+1); Boolean bothLadders = bothInside && (map[loc.r][loc.c] == Wladder && map[loc.r][loc.c+1] == Wladder); Boolean aboveInside = inside(loc.r-1,loc.c) && inside(loc.r-1,loc.c+1); Boolean aboveMoverSq = aboveInside && map[loc.r-1][loc.c] == Wempty && map[loc.r-1][loc.c+1] == Wempty && unionSquares[loc.r-1][loc.c] && unionSquares[loc.r-1][loc.c+1] && unionSquares[loc.r-1][loc.c]->type == UN_MOVER && unionSquares[loc.r-1][loc.c+1]->type == UN_MOVER; Boolean bothWalls = bothInside && (map[loc.r][loc.c] == Wwall && map[loc.r][loc.c+1] == Wwall); // This shit is all so that movers can stick down one square into floor. // CAREFUL!! Crappy code duplicated below. while (bothLadders || // normal case (delta == 1 && aboveMoverSq && bothWalls) ) { // sticking down one // Scan to right. for (; loc.c < init.c + objectDimMax.colMax; loc.c++) { // Add a mover square. assert(inside(loc) && (map[loc.r][loc.c] == Wladder || map[loc.r][loc.c] == Wwall) && !unionSquares[loc.r][loc.c]); unionSquares[loc.r][loc.c] = new UnionSquare; assert(unionSquares[loc.r][loc.c]); unionSquares[loc.r][loc.c]->type = UN_MOVER; unionSquares[loc.r][loc.c]->mSquare.mover = movers[moversNum]; unionSquares[loc.r][loc.c]->mSquare.orientation = OR_VERT; // Still leave overlap of wall and moversquare. if (map[loc.r][loc.c] != Wwall) { map[loc.r][loc.c] = Wempty; } mTop = Utils::minimum(mTop,loc.r); mBottom = Utils::maximum(mBottom,loc.r + 1); } loc.c = init.c; // When up at the top. // Remove annoying ladder sticking up. if (delta == -1 && map[loc.r - objectDimMax.rowMax - 1][loc.c] != Wladder && // Just to be sure we don't kill of some unionSquares. !unionSquares[loc.r - objectDimMax.rowMax - 1][loc.c]) { int locTop = loc.r - objectDimMax.rowMax; for (loc.r--; loc.r >= locTop; loc.r--) { for (loc.c = init.c; loc.c < init.c + objectDimMax.colMax; loc.c++) { map[loc.r][loc.c] = Wempty; } } break; } // annoying ladder sticking up. loc.c = init.c; loc.r += delta; bothInside = inside(loc) && inside(loc.r,loc.c+1); bothLadders = bothInside && (map[loc.r][loc.c] == Wladder && map[loc.r][loc.c+1] == Wladder); aboveInside = inside(loc.r-1,loc.c) && inside(loc.r-1,loc.c+1); aboveMoverSq = aboveInside && map[loc.r-1][loc.c] == Wempty && map[loc.r-1][loc.c+1] == Wempty && unionSquares[loc.r-1][loc.c] && unionSquares[loc.r-1][loc.c+1] && unionSquares[loc.r-1][loc.c]->type == UN_MOVER && unionSquares[loc.r-1][loc.c+1]->type == UN_MOVER; bothWalls = bothInside && (map[loc.r][loc.c] == Wwall && map[loc.r][loc.c+1] == Wwall); // This shit is all so that movers can stick down one square into // the floor. } // while } // for delta // Note: loc is now at the left side of the former ladder, // one square beneath it. assert(mTop < mBottom); // Or no squares were added. // Choose Y position somewhere in range of mover squares. int rangeY = (mBottom - mTop) * WSQUARE_HEIGHT - moverSize.height + 1; assert(rangeY > 0); // or movers are more than one square high. int startY = Utils::choose(rangeY) + mTop * WSQUARE_HEIGHT; Pos pos(init.c * WSQUARE_WIDTH,startY); Area area(AR_RECT,pos,moverSize); Size vel; vel.set(0,Utils::coin_flip() ? W_MOVER_SPEED : -W_MOVER_SPEED); // initialize the mover. MoverId moverId; moverId.index = moversNum; moverId.unique = uniqueGen++; movers[moversNum]->init(this,locator,area,vel,moverId); // Dummy mover object, so mover gets redrawn. PhysMoverP p = new PhysMover(this,locator,movers[moversNum]); assert(p); locator->add(p); movers[moversNum]->set_phys_mover_id(p->get_id()); moversNum++; return True; } void World::delete_movers() { // The locator should take care of killing off the PhysMovers // in Locator::reset(). int n; for (n = 0; n < moversNum; n++) { delete movers[n]; movers[n] = NULL; } moversNum = 0; } void World::mover_list_add(MoverP list[],int &nItems,const Loc &loc) { if (!inside(loc)) { return; } UnionSquare *uSquare = unionSquares[loc.r][loc.c]; if (uSquare && uSquare->type == UN_MOVER) { MoverP mover = uSquare->mSquare.mover; // Only add movers that overlap loc. const Area &area = mover->get_area(); if (!area.overlap(loc)) { return; } // Check for duplicates. for (int n = 0; n < nItems; n++) { if (list[n] == mover) { return; } } // Add to list. assert(nItems < MOVERS_MAX); list[nItems] = mover; nItems++; } } Boolean World::useMovers = True; // On by default. xevil-2.02r2.orig/cmn/xetp_basic.cpp0100644000175000017500000000631407041422206016705 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "xetp_basic.cpp" #if X11 #ifndef NO_PRAGMAS #pragma implementation "xetp_basic.h" #endif #endif #include "stdafx.h" #include "xetp_basic.h" char *XETPBasic::versionStr = "XETP1.00"; // 0.10 released with special RedHat version // 0.12 for 2.0b5 // 0.15 for 2.0b6 // 0.16 for 2.0b7 // 1.00 for 2.0 void XETPBasic::check_sizes() { // If this ever fails, we'll have to put in a bunch of cross-platform // typedefs. assert(sizeof(int) == 4); assert(sizeof(short) == 2); assert(sizeof(char) == 1); assert(sizeof(float) == 4); assert(sizeof(u_int) == 4); assert(sizeof(u_short) == 2); assert(sizeof(u_char) == 1); // If we get to 256, need more than one byte to determine the method. assert(XETP_METHOD_MAX <= 256); } Boolean XETPBasic::receive_header(InStreamP inStream, u_short &method,u_int &length) { method = (u_short)inStream->read_char(); length = (u_int)inStream->read_short(); return inStream->alive(); } void XETPBasic::send_header(OutStreamP out,u_short method,u_int length) { // assert(method <= UCHAR_MAX); out->write_char((u_char)method); assert(length <= USHRT_MAX); out->write_short((u_short)length); } void XETPBasic::send_generic(OutStreamP out,u_short method) { if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETPBasic::add_header(0)); } send_header(out,method,0); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETPBasic::send_int(OutStreamP out,u_short method,u_int val) { int len = sizeof(int); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETPBasic::add_header(len)); } send_header(out,method,len); out->write_int(val); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETPBasic::send_string(OutStreamP out,u_short method,char *msg) { assert(msg); int len = Utils::get_string_write_length(msg); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETPBasic::add_header(len)); } send_header(out,method,len); Utils::string_write(out,msg); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } const CMN_PORT XETPBasic::DEFAULT_PORT = 6066; xevil-2.02r2.orig/cmn/xetp.cpp0100644000175000017500000003220607041422206015543 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "xetp.cpp" #if X11 #ifndef NO_PRAGMAS #pragma implementation "xetp.h" #endif #endif #include "stdafx.h" #include #if X11 #include #endif #if WIN32 #include #endif // Is this include file necessary?? #if WIN32 #include #endif #include "utils.h" #include "intel.h" #include "streams.h" #include "physical.h" #include "world.h" #include "locator.h" #include "xetp.h" void XETP::check_sizes() { XETPBasic::check_sizes(); assert(sizeof(ClassId) == sizeof(int)); assert(sizeof(Dir) == sizeof(int)); assert(sizeof(Health) == sizeof(int)); assert(sizeof(ColorNum) == sizeof(int)); assert(sizeof(ITcommand) == sizeof(int)); assert(sizeof(Mass) == sizeof(int)); assert(sizeof(Turn) == sizeof(int)); assert(sizeof(GameStyleType) == sizeof(int)); assert(sizeof(SoundName) == sizeof(int)); assert(sizeof(ABBitField) == sizeof(int)); // Make sure the element fits in a PtrList. // >= instead of == because on an Alpha, // void* is 8 while int and TickType are 4. assert(sizeof(void *) >= sizeof(TickType)); assert(sizeof(void *) >= sizeof(int)); } void XETP::send_tcp_connect(OutStreamP out,u_short udpPort,char *humanName, const ViewportInfo &vInfo,int skip,Boolean wantSounds) { assert(humanName); // can still be "". u_int len = sizeof(u_short) + // udpPort Utils::get_string_write_length(humanName) + // humanName ViewportInfo::get_write_length(); // vInfo if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } send_header(out,TCP_CONNECT,len); out->write_short(udpPort); Utils::string_write(out,humanName); vInfo.write(out); out->write_int(skip); out->write_char((char)wantSounds); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETP::send_human(OutStreamP out,HumanP human) { u_int len = Identifier::get_write_length() + // intelId human->get_write_length(); // human data if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } send_header(out,HUMAN,len); IntelId intelId = human->get_intel_id(); intelId.write(out); human->write(out); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETP::send_object(OutStreamP out,PhysicalP p,Turn turn,TickType tt) { u_int len = compute_object_length(p); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } _send_object(out,p,turn,tt,len); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETP::send_objects(OutStreamP out,const PtrList &physicals, Turn turn,const PtrList &tickTypes) { assert(physicals.length() == tickTypes.length()); u_int totalLen = 0; int n; for (n = 0; n < physicals.length(); n++) { totalLen += XETP::add_header(compute_object_length((PhysicalP)physicals.get(n))); } // length passed into UDP prepare_packet is bigger than the lengths // passed into each XETP packet. if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(totalLen); } // Send each object in turn. for (n = 0; n < physicals.length(); n++) { PhysicalP p = (PhysicalP)physicals.get(n); // computing object_length twice, but who cares. _send_object(out,p,turn,(TickType)tickTypes.get(n), compute_object_length(p)); } if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } u_int XETP::compute_object_length(PhysicalP p) { u_int len = sizeof(u_short) + // classId Identifier::get_write_length() + // id sizeof(Turn) + // turn sizeof(char) + // TickType p->get_write_length(); // object data return len; } void XETP::_send_object(OutStreamP out,PhysicalP p,Turn turn, TickType tt,u_int len) { // len does not include the XETP header. const PhysicalContext *cx = p->get_context(); // Only send objects that can be read back in. assert(cx->create_from_stream); Id id = p->get_id(); send_header(out,OBJECT,len); assert(p->get_class_id() <= USHRT_MAX); out->write_short((u_short)p->get_class_id()); id.write(out); out->write_int((int)turn); assert(tt <= UCHAR_MAX); out->write_char((char)tt); p->write(out); } void XETP::send_new_world(OutStreamP out,WorldP world,int worldVersion) { u_int len = sizeof(int) + // version world->get_write_length(); // world data if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } send_header(out,NEW_WORLD,len); out->write_int(worldVersion); world->write(out); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETP::send_world_room(OutStreamP out,WorldP world, const RoomIndex &idx,int worldVersion) { u_int len = sizeof(int) + // version Rooms::get_write_length() + // rooms RoomIndex::get_write_length() + // roomIndex Dim::get_write_length() + // dim world->get_write_length(idx); // world room data if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } send_header(out,WORLD_ROOM,len); out->write_int(worldVersion); Rooms rooms = world->get_rooms(); rooms.write(out); idx.write(out); Dim dim = world->get_dim(); dim.write(out); world->write(out,idx); // write one room if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETP::send_rooms_known(OutStreamP out,const Rooms &rooms, int worldVersion,Boolean *map) { int mapSize = rooms.acrossMax * rooms.downMax; u_int len = sizeof(int) + // version Rooms::get_write_length() + // rooms sizeof(char) * mapSize; // map if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } send_header(out,ROOMS_KNOWN,len); out->write_int(worldVersion); rooms.write(out); for (int n = 0; n < mapSize; n++) { out->write_char((u_char)map[n]); } if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETP::send_message(OutStreamP out,char *msg) { assert(msg); u_int len = strlen(msg); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } send_header(out,MESSAGE,len); // signed/unsigned shouldn't matter here, ASCII only. out->write((u_char *)msg,len); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETP::send_arena_message(OutStreamP out,int time,char *msg) { assert(msg); u_int len = sizeof(int) + // time strlen(msg); // string body if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } send_header(out,ARENA_MESSAGE,len); out->write_int(time); // signed/unsigned shouldn't matter here. out->write(msg,len - sizeof(int)); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETP::send_command(OutStreamP out, const IntelId &iId,ITcommand command) { u_int len = Identifier::get_write_length() + // intelId sizeof(char); // command if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } send_header(out,COMMAND,len); iId.write(out); assert(command <= UCHAR_MAX); out->write_char((u_char)command); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETP::send_delete_object(OutStreamP out,const Id &id) { u_int len = Identifier::get_write_length(); // Id if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } send_header(out,DELETE_OBJECT,len); id.write(out); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETP::send_timer_pong(OutStreamP out,Turn pingTurn,Turn localTurn) { u_int len = 2 * sizeof(Turn); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } send_header(out,TIMER_PONG,len); out->write_int((int)pingTurn); out->write_int((int)localTurn); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETP::send_sound_request(OutStreamP out,const SoundRequest &request) { u_int len = SoundRequest::get_write_length(); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } send_header(out,SOUND_REQUEST,len); request.write(out); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETP::send_server_pong(OutStreamP out,GameStyleType gameStyle, int enemiesNum,int humansNum, const char* version, const char* names[],const char* clientNames[], int humanKills[], int enemyKills[],const Id ids[]) { u_int len = sizeof(u_char) + // gameStyle sizeof(u_int) + // enemiesNum sizeof(u_short) + // humansNum Utils::get_string_write_length(version); // version int n; for (n = 0; n < humansNum; n++) { len += Utils::get_string_write_length(names[n]); // name len += Utils::get_string_write_length(clientNames[n]); // name len += sizeof(u_int); // humanKills len += sizeof(u_int); // enemyKills len += Id::get_write_length(); // Id } if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } assert(gameStyle < 256 && enemiesNum >= 0 && humansNum >= 0 && (((u_int)humansNum & 0xffff0000) == 0)); send_header(out,SERVER_PONG,len); out->write_char((u_char)gameStyle); out->write_int((u_int)enemiesNum); out->write_short((u_short)humansNum); Utils::string_write(out,version); // Write out data for each human. for (n = 0; n < humansNum; n++) { Utils::string_write(out,names[n]); Utils::string_write(out,clientNames[n]); out->write_int((u_int)humanKills[n]); out->write_int((u_int)enemyKills[n]); ids[n].write(out); } if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETP::send_chat_request(OutStreamP out,const char* receiver, const char* message) { u_int len = Utils::get_string_write_length(receiver) + // receiverName Utils::get_string_write_length(message); // message if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } send_header(out,CHAT_REQUEST,len); Utils::string_write(out,receiver); Utils::string_write(out,message); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } void XETP::send_chat(OutStreamP out,const char* sender, const IntelId& senderId,const char* message) { u_int len = Utils::get_string_write_length(sender) + // sender IntelId::get_write_length() + // senderId Utils::get_string_write_length(message); // message if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->prepare_packet(XETP::add_header(len)); } send_header(out,CHAT,len); Utils::string_write(out,sender); senderId.write(out); Utils::string_write(out,message); if (out->get_protocol() == GenericStream::UDP) { ((UDPOutStreamP)out)->done_packet(); } } xevil-2.02r2.orig/cmn/actual.h0100644000175000017500000016460007041422166015512 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "actual.h" // Actual objects to be instantiated. #ifndef ACTUAL_H #define ACTUAL_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif // Include Files #include "utils.h" #include "coord.h" #include "world.h" #include "locator.h" #include "physical.h" // Class Declarations // Dummy object, pointer to a Mover in the world, only exists so that // movers get drawn every turn. class PhysMover: public Physical { // Some hacks here to act like a Physical. World::clock() gets called // before Locator::clock(), so we must juggle which Area we return depending // on where we are in the act()-update() phases. public: PhysMover(WorldP,LocatorP,MoverP); DECLARE_LEAF_IO(PhysMover); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual const Area &get_area(); virtual const Area &get_area_next(); /* NOTE: Should only be used by the Locator. */ virtual Boolean collidable(); virtual Boolean corporeal_attack(PhysicalP killer,int damage); virtual void heat_attack(PhysicalP,int heat,Boolean secondary); virtual void act(); virtual void update(); virtual void draw(CMN_DRAWABLE buffer,Xvars &xvars,int dpyNum, const Area &area); void mover_clock(); /* NOTE: More of the hack to act like a Physical. Called when corresponding Mover is clocked. */ /* NOTE: Should only be called by World/Mover. */ const static PhysicalContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); const Area &earlier_area(); const Area &later_area(); /* Return the earlier/later of the two known Areas for the Mover. */ enum State {BeforeAct,BetweenActUpdate,AfterUpdate}; int state; MoverId moverId; Area areaPrev; // Only stored so can return a (const Area &) to something. }; typedef PhysMover *PhysMoverP; class Explosion: public Physical { public: Explosion(WorldP w,LocatorP l,const Pos &middle,const Id &bomber,int radius, int damageMax); DECLARE_LEAF_IO(Explosion); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual Boolean collidable(); virtual const Area &get_area(); virtual const Area &get_area_next(); virtual void draw(CMN_DRAWABLE buffer,Xvars &xvars,int,const Area &area); virtual void act(); const static PhysicalContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); Id bomber; Area area; Pos middle; // Same as in area. int radius; int damageMax; }; class Fire: public Physical { public: Fire(WorldP w,LocatorP l,const Pos &middle,Boolean coll = True); /* NOTE: If coll is False, the Fire will not collide with anything. I.e. Just for decoration. */ DECLARE_LEAF_IO(Fire); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static int get_damage(); virtual const Area &get_area(); virtual const Area &get_area_next(); virtual int get_drawing_level(); virtual Boolean collidable(); virtual Boolean corporeal_attack(PhysicalP,int); virtual void heat_attack(PhysicalP,int,Boolean); virtual void draw(CMN_DRAWABLE buffer,Xvars &xvars,int,const Area &area); virtual void avoid(PhysicalP other); virtual void collide(PhysicalP other); virtual void act(); virtual void update(); const static PhysicalContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ static void init_x(Xvars&,IXCommand command,void* arg); private: Boolean isCollidable; static FireXdata xdata; static const CMN_BITS_ID fireBits; Area area,areaNext; }; class FireExplosion: public Physical { public: FireExplosion(WorldP w,LocatorP l,const Pos &rawPos,const Id &shooter); DECLARE_LEAF_IO(FireExplosion); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual Boolean collidable(); virtual Boolean corporeal_attack(PhysicalP,int); virtual void heat_attack(PhysicalP,int,Boolean); virtual const Area &get_area(); virtual const Area &get_area_next(); virtual void draw(CMN_DRAWABLE buffer,Xvars &xvars,int,const Area &area); virtual void act(); const static PhysicalContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); Timer timer; Id shooter; Area area; }; // Protects from N_PROTECTION_N separate corporeal attacks. class NProtection: public Protection { public: NProtection(WorldP,LocatorP,const Area &); DECLARE_NULL_LEAF_IO(NProtection); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static ProtectionContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: virtual Boolean corporeal_protect(int); virtual Boolean heat_protect(int heat,Boolean); static void init_x(Xvars&,IXCommand command,void* arg); int n; // Number of hits that it can still take. static ProtectionXdata xdata; }; // Protects from heat or corporeal attacks for T_PROTECTION_TIME turns. class TProtection: public Protection { public: TProtection(WorldP,LocatorP,const Area &); DECLARE_NULL_LEAF_IO(TProtection); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void act(); const static ProtectionContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: virtual Boolean corporeal_protect(int); virtual Boolean heat_protect(int heat,Boolean); static void init_x(Xvars&,IXCommand command,void* arg); Timer timer; static ProtectionXdata xdata; }; // Protects from X_PROTECTION_HEALTH total amount of damage. class XProtection: public Protection { public: XProtection(WorldP,LocatorP,const Area &); DECLARE_NULL_LEAF_IO(XProtection); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static ProtectionContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: virtual Boolean corporeal_protect(int); virtual Boolean heat_protect(int heat,Boolean); static void init_x(Xvars&,IXCommand command,void* arg); int health; // amount of damage it can still take. static ProtectionXdata xdata; }; class Rock: public Liftable { public: Rock(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Rock); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static LiftableContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static LiftableXdata xdata; }; class Weight: public Liftable { public: Weight(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Weight); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static LiftableContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static LiftableXdata xdata; }; // Modifiers for AltarOfSin class DoubleSpeed: public Doubler { public: DoubleSpeed(int timed = 0); virtual ModifierId get_modifier_id(); virtual int apply(Attribute attr,int startVal); }; class DoubleJump: public Doubler { public: virtual ModifierId get_modifier_id(); virtual int apply(Attribute attr,int startVal); }; // Should only be added on Creature's modifiers because // of problems with transferring to a new body. class DoubleHealth: public Doubler { public: virtual ModifierId get_modifier_id(); virtual int apply(Attribute attr,int startVal); }; class AltarOfSin: public Heavy { public: AltarOfSin(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(AltarOfSin); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual Boolean corporeal_attack(PhysicalP,int); virtual void heat_attack(PhysicalP,int,Boolean); virtual void collide(PhysicalP); virtual void update(); const static HeavyContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); Boolean turnTaken; // Only do one interesting thing per turn. static HeavyXdata xdata; // For granting powers. // const static HealingContext healingContext; // const static OnFireContext onFireContext; // const static BuiltInContext fireballsContext; }; class Doppel: public AutoUse { // Not a AutoUse because Seals and other funny things get doppelganged. public: Doppel(WorldP,LocatorP,const Pos &); DECLARE_NULL_LEAF_IO(Doppel); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void use(PhysicalP); /* NOTE: Only certain classes may be used as doppelgangers. If the User is not of one of these classes, the doppelganger class will be chosen randomly. */ static Stats &get_stats(void *) {return stats;} const static AutoUseContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: PhysicalP create_physical(const Area &,PhysicalP original); /* EFFECTS: Create a new Physical which is of the same class as original. */ static void init_x(Xvars&,IXCommand command,void* arg); static AutoUseXdata xdata; static Stats stats; }; class Cloak: public Item { public: Cloak(WorldP,LocatorP,const Pos &); DECLARE_NULL_LEAF_IO(Cloak); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void use(PhysicalP); static Stats &get_stats(void *) {return stats;} const static ItemContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void attack_hook(PhysicalP p); static void init_x(Xvars&,IXCommand command,void* arg); static ItemXdata xdata; static Stats stats; }; class Transmogifier: public AutoUse { public: Transmogifier(WorldP,LocatorP,const Pos &); DECLARE_NULL_LEAF_IO(Transmogifier); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void use(PhysicalP); static Stats &get_stats(void *) {return stats;} const static AutoUseContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: PhysicalP new_physical(const Pos &middle,ClassId notThis); /* EFFECTS: Create a new randomly chosen Physical centered at middle for the object using the Transmogifier. Don't create a Physical of class notThis. */ static Boolean transmogify_target_filter(const PhysicalContext *,void *); /* EFFECTS: Filter those classes whose transmogifyTarget flag is True. */ static void init_x(Xvars&,IXCommand command,void* arg); static AutoUseXdata xdata; static Stats stats; }; class MedKit: public AutoUse { public: MedKit(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(MedKit); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void use(PhysicalP); static Stats &get_stats(void *) {return stats;} const static AutoUseContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static AutoUseXdata xdata; static Stats stats; }; class Crack: public Modifier { public: Crack(); virtual ModifierId get_modifier_id(); virtual int apply(Attribute attr,int startVal); }; class CrackPipe: public Drugs { public: CrackPipe(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(CrackPipe); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Stats &get_stats(void *) {return stats;} const static DrugsContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual ModifierP create_modifier(); private: static void init_x(Xvars&,IXCommand command,void* arg); static DrugsXdata xdata; static Stats stats; }; class CaffineM: public Modifier { public: CaffineM(); virtual ModifierId get_modifier_id(); virtual int apply(Attribute attr,int startVal); }; class Caffine: public Drugs { public: Caffine(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Caffine); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Stats &get_stats(void *) {return stats;} const static DrugsContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual ModifierP create_modifier(); private: static void init_x(Xvars&,IXCommand command,void* arg); static DrugsXdata xdata; static Stats stats; }; class PCPM: public Modifier { public: PCPM(); virtual ModifierId get_modifier_id(); virtual int apply(Attribute attr,int startVal); #ifndef PROTECTED_IS_PUBLIC protected: #endif void preDie(PhysicalP p); /* EFFECTS: Whack off half of p's health. */ }; class PCP: public Drugs { public: PCP(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(PCP); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Stats &get_stats(void *) {return stats;} const static DrugsContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual ModifierP create_modifier(); private: static void init_x(Xvars&,IXCommand command,void* arg); static DrugsXdata xdata; static Stats stats; }; class NShield: public Shield { public: NShield(WorldP,LocatorP,const Pos &); DECLARE_NULL_LEAF_IO(NShield); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void use(PhysicalP); static Stats &get_stats(void *) {return stats;} const static ShieldContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: virtual ProtectionP create_protection(const Area &); static void init_x(Xvars&,IXCommand command,void* arg); static ShieldXdata xdata; static Stats stats; }; class TShield: public Shield { public: TShield(WorldP,LocatorP,const Pos &); DECLARE_NULL_LEAF_IO(TShield); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void use(PhysicalP); static Stats &get_stats(void *) {return stats;} const static ShieldContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: virtual ProtectionP create_protection(const Area &); static void init_x(Xvars&,IXCommand command,void* arg); static ShieldXdata xdata; static Stats stats; }; class Bomb: public Animated { public: Bomb(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Bomb); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void use(PhysicalP p); /* NOTE: p can be NULL. */ virtual void act(); virtual Boolean is_bomb(); virtual void set_quiet_death(); virtual void die(); /* EFFECTS: Create an explosion. */ static Stats &get_stats(void *) {return stats;} const static AnimatedContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static AnimatedXdata xdata; Timer timer; Boolean active; Id bomber; // Only valid if active. Frame frame; Boolean defused; static Stats stats; }; class Shell: public Shot { public: Shell(WorldP w,LocatorP l,const Pos &pos, const Id &shooter, Dir dir); DECLARE_NULL_LEAF_IO(Shell); static Size get_size(); // doubles as get_size_max(). static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Stats &get_stats(void *) {return stats;} const static ShotContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static ShotXdata xdata; static Stats stats; }; class SwapShell: public Shot { public: SwapShell(WorldP w,LocatorP l,const Pos &pos, const Id &shooter, const Id& swapper,Dir dir); /* NOTE: shooter is the person who fired it. swapper is the swapper the shell came from. */ DECLARE_NULL_LEAF_IO(SwapShell); static Size get_size(); // Doubles as get_size_max(). static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void collide(PhysicalP); /* NOTE: Does not call up the tree. */ static Stats &get_stats(void *) {return stats;} const static ShotContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static ShotXdata xdata; Id swapper; static Stats stats; }; class Lance: public Shot { public: Lance(WorldP w,LocatorP l,const Pos &pos, const Id &shooter, Dir dir); static Size get_size(Dir); DECLARE_NULL_LEAF_IO(Lance); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Dir compute_weapon_dir(ITcommand); /* EFFECTS: Weapons firing a Lance shoot diagonal shots different than most weapons. */ static Stats &get_stats(void *) {return stats;} const static ShotContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static ShotXdata xdata; static Stats stats; }; class Laser: public Shot { public: Laser(WorldP w,LocatorP l,const Pos &pos, const Id &shooter, Dir dir); static Size get_size(Dir); DECLARE_NULL_LEAF_IO(Laser); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Dir compute_weapon_dir(ITcommand); /* EFFECTS: Weapons firing a Laser shoot diagonal shots different than most weapons. */ static Stats &get_stats(void *) {return stats;} const static ShotContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static ShotXdata xdata; static Stats stats; }; class FrogShell: public Shot { public: FrogShell(WorldP w,LocatorP l,const Pos &pos, const Id &shooter, const Id &frogGun,Dir dir); DECLARE_NULL_LEAF_IO(FrogShell); static Size get_size(); // Doubles as get_size_max(). static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void collide(PhysicalP); /* NOTE: Does not call up the tree. */ static Stats &get_stats(void *) {return stats;} const static ShotContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ const static MorphedContext morphedContext; /* NOTE: public so AltarOfSin can get to it. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static ShotXdata xdata; Id frogGun; static Stats stats; }; class Fireball: public Shot { public: Fireball(WorldP w,LocatorP l,const Pos &pos,const Id &shooter, Dir dir,int heat = -1,int time = -1,Boolean hurtOnFire = False); /* NOTE: Will use heat and time instead of FIREBALL_HEAT and FIREBALL_TIME if they are specified. If hurtOnFire is True, these fireballs will do physical damage to Creatures with the OnFire ability. */ DECLARE_NULL_LEAF_IO(Fireball); static Size get_size(); // Doubles as get_size_max(). static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void collide(PhysicalP other); virtual void act(); const static ShotContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static ShotXdata xdata; Timer timer; int heat; Boolean hurtOnFire; }; // Only seeks after creatures. class Missile: public Shot { public: Missile(WorldP w,LocatorP l,const Pos &pos, const Id &shooter, Dir dir); static Size get_size(Dir); DECLARE_NULL_LEAF_IO(Missile); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void act(); static Stats &get_stats(void *) {return stats;} const static ShotContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); Boolean hasTarget; Id targetId; Timer timer; Timer rotate; Id shooterId; static ShotXdata xdata; static Stats stats; }; class Star: public Shot { public: Star(WorldP w,LocatorP l,const Pos &pos, const Id &shooter, Dir dir); DECLARE_NULL_LEAF_IO(Star); static Size get_size(); // Doubles as get_size_max. static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Stats &get_stats(void *) {return stats;} const static ShotContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static ShotXdata xdata; static Stats stats; }; class Blood: public Droplet { public: DECLARE_NULL_LEAF_IO(Blood); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static DropletContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ static PhysicalP create_and_add_if(WorldP,LocatorP,const Pos &,const Vel &); /* EFFECTS: Create a new blood droplet and add to Locator if possible. Only allow DROPLET_MAX droplets at once. Return new object or NULL.*/ private: static void init_x(Xvars&,IXCommand command,void* arg); Blood(WorldP,LocatorP,const Pos &,const Vel &); /* NOTE: Use create_if(). */ static DropletXdata xdata; }; class GreenBlood: public Droplet { public: DECLARE_NULL_LEAF_IO(GreenBlood); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static PhysicalP create_and_add_if(WorldP,LocatorP,const Pos &,const Vel &); /* EFFECTS: Create a new blood droplet and add to Locator if possible. Only allow DROPLET_MAX droplets at once. Return new object or NULL.*/ const static DropletContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); GreenBlood(WorldP,LocatorP,const Pos &,const Vel &); /* NOTE: Use create_if(). */ static DropletXdata xdata; }; class OilDroplet: public Droplet { public: DECLARE_NULL_LEAF_IO(OilDroplet); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static PhysicalP create_and_add_if(WorldP,LocatorP,const Pos &,const Vel &); /* EFFECTS: Create a new oil droplet and add to Locator if possible. Only allow DROPLET_MAX droplets at once. Return new object or NULL.*/ const static DropletContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); OilDroplet(WorldP,LocatorP,const Pos &,const Vel &); /* NOTE: Use create_if(). */ static DropletXdata xdata; }; #if 0 class Spark: public Droplet { public: DECLARE_NULL_LEAF_IO(Spark); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static PhysicalP create_and_add_if(WorldP,LocatorP,const Pos &,const Vel &); /* EFFECTS: Create a new Spark object and add to Locator if possible. Only allow DROPLET_MAX droplets at once. Return new object or NULL.*/ const static DropletContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: enum {SPARK = CO_R, SPARK_PLUG = CO_DN_R_R, GEAR = CO_DN_R, SPRING = CO_DN_DN_R}; // The different types of sparks will be stored in different pure directions. Spark(WorldP,LocatorP,const Pos &,const Vel &,Dir dir); /* NOTE: Use create_if(). */ static DropletXdata xdata; }; #endif class Trapdoor: public Moving { public: enum {SEALS_MAX = 15}; // for one trapdoor. Used to be 20 Trapdoor(WorldP w,LocatorP l,const Pos &pos,const Id &homeId); DECLARE_NULL_LEAF_IO(Trapdoor); static Size get_size(); // Doubles as get_size_max(). static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual Boolean collidable(); virtual int get_drawing_level(); /* NOTE: Trapdoor drawn behind everything else. */ void append_seals_out(int &num,IntelId *lem); /* MODIFIES: num, lem */ /* EFFECTS: Set lem to be an array of all the IntelIds of the seals that have been generated by this trapdoor, i.e are "out". */ virtual void act(); const static MovingContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); Timer timer; IntelId seals[SEALS_MAX]; int sealsNum; Id homeId; // Generated seals will seek this Home. static MovingXdata xdata; }; typedef Trapdoor *TrapdoorP; class Home: public Moving { public: Home(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Home); static Size get_size(); // Doubles as get_size_max(). static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual Boolean collidable(); virtual int get_drawing_level(); /* NOTE: Home drawn behind everything else. */ int get_seals_safe() {return sealsSafe;} virtual void act(); const static MovingContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); int sealsSafe; static MovingXdata xdata; }; typedef Home *HomeP; class Grenade: public Falling { public: Grenade(WorldP w,LocatorP l,const Pos &pos,const Id &sh, Dir dir,Speed speed); Grenade(WorldP,LocatorP,const Pos &,const Id &,const Vel &); DECLARE_NULL_LEAF_IO(Grenade); static Size get_size(Dir dir); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void set_quiet_death(); virtual void act(); virtual void die(); static Stats &get_stats(void *) {return stats;} const static FallingContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); Timer timer; Id shooter; Boolean defused; static FallingXdata xdata; static Stats stats; }; // Code copied from Grenade, should have common parent. class Napalm: public Falling { public: Napalm(WorldP,LocatorP,const Pos &,const Id &,const Vel &); DECLARE_NULL_LEAF_IO(Napalm); static Size get_size(Dir dir); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void set_quiet_death(); virtual void heat_attack(PhysicalP,int,Boolean); /* NOTE: Don't want NapalmGrenades to set each other off. */ virtual void act(); virtual void die(); static Stats &get_stats(void *) {return stats;} const static FallingContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); Timer timer; Id shooter; Boolean defused; static FallingXdata xdata; static Stats stats; }; class Egg: public Falling { public: Egg(WorldP w,LocatorP l,const Pos &pos, const IntelOptions &ops,ITmask opMask); DECLARE_LEAF_IO(Egg); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual void act(); const static FallingContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); Boolean open; // The intel options for the new Hugger. Should be the same as for an // Alien. IntelOptions intelOptions; ITmask intelOpMask; static FallingXdata xdata; }; // NOTE: Called Xit instead of Exit to avoid naming conflicts with the C // function exit(). class Xit: public Touchable { public: Xit(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Xit); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static TouchableContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static TouchableXdata xdata; }; class Flag: public Touchable { public: Flag(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Flag); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static TouchableContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static TouchableXdata xdata; }; class Chainsaw: public Cutter { public: Chainsaw(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Chainsaw); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static CutterContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static CutterXdata xdata; }; class Pistol: public Gun { public: Pistol(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Pistol); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static GunContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static GunXdata xdata; }; // Machine Gun. class MGun: public Gun { public: MGun(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(MGun); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static GunContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static GunXdata xdata; }; class Lancer: public Gun { public: Lancer(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Lancer); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static GunContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: virtual Size get_shot_size(Dir); virtual Dir compute_weapon_dir(ITcommand); virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir); static void init_x(Xvars&,IXCommand command,void* arg); static GunXdata xdata; }; class AutoLancer: public Gun { public: AutoLancer(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(AutoLancer); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static GunContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: virtual Size get_shot_size(Dir); virtual Dir compute_weapon_dir(ITcommand); virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir); static void init_x(Xvars&,IXCommand command,void* arg); static GunXdata xdata; }; class FThrower: public Gun { public: FThrower(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(FThrower); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir); virtual void fire(const Id &,ITcommand); virtual void act(); const static GunContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); virtual Size get_shot_size(Dir); Timer stopFiring; Id killerId; // Valid iff isFiring. ITcommand fireCommand; // Valid iff isFiring. Boolean isFiring; static GunXdata xdata; }; class Launcher: public Gun { public: Launcher(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Launcher); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static GunContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: virtual Size get_shot_size(Dir); virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir); static void init_x(Xvars&,IXCommand command,void* arg); static GunXdata xdata; }; class Grenades: public Gun { public: Grenades(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Grenades); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static GunContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: virtual Size get_shot_size(Dir); virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir); static void init_x(Xvars&,IXCommand command,void* arg); static GunXdata xdata; }; class Napalms: public Gun { public: Napalms(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Napalms); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static GunContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: virtual Size get_shot_size(Dir); virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir); static void init_x(Xvars&,IXCommand command,void* arg); static GunXdata xdata; }; class Stars: public Gun { public: Stars(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Stars); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static GunContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: virtual Size get_shot_size(Dir); virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir); virtual void fire(const Id &id,ITcommand command); static void init_x(Xvars&,IXCommand command,void* arg); static GunXdata xdata; }; class Swapper: public SingleGun { public: Swapper(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(Swapper); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static SingleGunContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: virtual Size get_shot_size(Dir); virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir); static void init_x(Xvars&,IXCommand command,void* arg); static SingleGunXdata xdata; }; class FrogGun: public SingleGun { public: FrogGun(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(FrogGun); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static SingleGunContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: virtual Size get_shot_size(Dir); virtual PhysicalP create_shot(PhysicalP,WorldP,LocatorP,const Pos &,Dir dir); static void init_x(Xvars&,IXCommand command,void* arg); static SingleGunXdata xdata; }; class DogWhistle: public Whistle { public: DogWhistle(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(DogWhistle); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static WhistleContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual PetP create_pet(IntelP master,Boolean alternatePet,int n); private: static void init_x(Xvars&,IXCommand command,void* arg); static WhistleXdata xdata; }; class DemonSummoner: public Whistle { public: DemonSummoner(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_LEAF_IO(DemonSummoner); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static WhistleContext context; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual PetP create_pet(IntelP master,Boolean alternatePet,int); private: static void init_x(Xvars&,IXCommand command,void* arg); static WhistleXdata xdata; }; class Enforcer: public Creature { // public Grounded, public Suicide, public Prickly public: Enforcer(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_CREATURE_IO(Enforcer); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Stats &get_stats(void *) {return stats;} const static CreatureContext creatureContext; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); const static GroundedContext groundedContext; const static SuicideContext suicideContext; const static PricklyContext pricklyContext; static CreatureXdata creatureXdata; static GroundedXdata groundedXdata; static SuicideXdata suicideXdata; static PricklyXdata pricklyXdata; static Stats stats; }; class Frog: public Creature { // public Hopping, public Suicide, (public Morphed) public: Frog(WorldP w,LocatorP l,const Pos &pos); /* NOTE: Now caller must add the Morphed Ability, if desired. */ DECLARE_NULL_CREATURE_IO(Frog); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Stats &get_stats(void *) {return stats;} const static CreatureContext creatureContext; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ const static HoppingContext hoppingContext; private: static void init_x(Xvars&,IXCommand command,void* arg); const static SuicideContext suicideContext; static CreatureXdata creatureXdata; static HoppingXdata hoppingXdata; static SuicideXdata suicideXdata; static Stats stats; }; class Hero: public Creature { // public Walking, public Fighter, public User, public Healing public: Hero(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_CREATURE_IO(Hero); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Stats &get_stats(void *) {return stats;} const static CreatureContext creatureContext; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ static FighterXdata fighterXdata; const static FighterContext fighterContext; /* NOTE: Similar hack so that Fighter::lookup_context() can get these. */ const static HealingContext healingContext; private: static void init_x(Xvars&,IXCommand command,void* arg); static CreatureXdata creatureXdata; static WalkingXdata walkingXdata; static UserXdata userXdata; static HealingXdata healingXdata; static LifterXdata lifterXdata; const static WalkingContext walkingContext; const static UserContext userContext; const static LifterContext lifterContext; static Stats stats; }; class Ninja: public Creature { // public Sticky, public Fighter, public User public: Ninja(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_CREATURE_IO(Ninja); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Stats &get_stats(void *) {return stats;} const static CreatureContext creatureContext; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ static FighterXdata fighterXdata; const static FighterContext fighterContext; /* NOTE: Similar hack so that Fighter::lookup_context() can get these. */ // Used by AltarOfSin const static StickyContext stickyContext; private: static void init_x(Xvars&,IXCommand command,void* arg); static CreatureXdata creatureXdata; static StickyXdata stickyXdata; static UserXdata userXdata; const static UserContext userContext; static Stats stats; }; class Alien: public Creature { // public Sticky, public Prickly public: Alien(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_CREATURE_IO(Alien); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Stats &get_stats(void *) {return stats;} const static CreatureContext creatureContext; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); const static StickyContext stickyContext; const static PricklyContext pricklyContext; const static HealingContext healingContext; static CreatureXdata creatureXdata; static StickyXdata stickyXdata; static PricklyXdata pricklyXdata; static HealingXdata healingXdata; static Stats stats; }; class RedHugger: public Creature { // public Sticky, public Hugger public: RedHugger(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_CREATURE_IO(RedHugger); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static CreatureContext creatureContext; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); const static StickyContext stickyContext; const static HuggerContext huggerContext; static CreatureXdata creatureXdata; static StickyXdata stickyXdata; static HuggerXdata huggerXdata; }; class GreenHugger: public Creature { // public Sticky, public Hugger public: GreenHugger(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_CREATURE_IO(GreenHugger); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static CreatureContext creatureContext; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ private: static void init_x(Xvars&,IXCommand command,void* arg); const static StickyContext stickyContext; const static HuggerContext huggerContext; static CreatureXdata creatureXdata; static StickyXdata stickyXdata; static HuggerXdata huggerXdata; }; class ChopperBoy: public Creature { // public Flying, public User, public Lifter public: ChopperBoy(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_CREATURE_IO(ChopperBoy); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Stats &get_stats(void *) {return stats;} const static CreatureContext creatureContext; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ const static FlyingContext flyingContext; // Used by AltarOfSin private: static void init_x(Xvars&,IXCommand command,void* arg); static CreatureXdata creatureXdata; static FlyingXdata flyingXdata; static UserXdata userXdata; static LifterXdata lifterXdata; const static UserContext userContext; const static LifterContext lifterContext; static Stats stats; }; class Seal: public Creature { //, public Grounded, public Suicide, public AnimTime public: Seal(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_CREATURE_IO(Seal); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Stats &get_stats(void *) {return stats;} const static CreatureContext creatureContext; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ const static AnimTimeContext animTimeContext; private: static void init_x(Xvars&,IXCommand command,void* arg); const static GroundedContext groundedContext; const static SuicideContext suicideContext; static CreatureXdata creatureXdata; static GroundedXdata groundedXdata; static SuicideXdata suicideXdata; static AnimTimeXdata animTimeXdata; static Stats stats; }; class FireDemon: public Creature { //, public Flying, public BuiltIn, public OnFire, public SwapProtect public: FireDemon(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_CREATURE_IO(FireDemon); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static CreatureContext creatureContext; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ const static BuiltInContext builtInContext; const static OnFireContext onFireContext; static Size get_shot_size(Dir); static PhysicalP create_shot(WorldP,LocatorP,const Pos &,const Id &shooter,Dir dir); /* NOTE: For BuiltIn. */ /* NOTE: Public so that AltarOfSin can use them. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static CreatureXdata creatureXdata; static FlyingXdata flyingXdata; static BuiltInXdata builtInXdata; static OnFireXdata onFireXdata; static SwapProtectXdata swapProtectXdata; const static FlyingContext flyingContext; const static SwapProtectContext swapProtectContext; }; class Dragon: public Creature { //, public Flying, public BuiltIn, public OnFire, public Segmented public: enum {SEGMENTS_NUM = 15}; Dragon(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_CREATURE_IO(Dragon); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); const static CreatureContext creatureContext; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ const static BuiltInContext builtInContext; const static OnFireContext onFireContext; private: static Size get_shot_size(Dir); static PhysicalP create_shot(WorldP,LocatorP,const Pos &,const Id &shooter,Dir dir); static void init_x(Xvars&,IXCommand command,void* arg); static CreatureXdata creatureXdata; static FlyingXdata flyingXdata; static BuiltInXdata builtInXdata; static OnFireXdata onFireXdata; static SegmentedXdata segmentedXdata; const static FlyingContext flyingContext; const static SegmentedContext segmentedContext; }; class Walker: public Creature { //, public Walking, public User, public BuiltIn, public AnimTime public: Walker(WorldP,LocatorP,const Pos &); DECLARE_NULL_CREATURE_IO(Walker); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Stats &get_stats(void *) {return stats;} /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ const static CreatureContext creatureContext; const static AnimTimeContext animTimeContext; // Also used by AltarOfSin const static BuiltInContext builtInContext; private: static PhysicalP create_shot(WorldP,LocatorP,const Pos &,const Id &shooter,Dir); static void init_x(Xvars&,IXCommand command,void* arg); static CreatureXdata creatureXdata; static WalkingXdata walkingXdata; static BuiltInXdata builtInXdata; static UserXdata userXdata; static AnimTimeXdata animTimeXdata; const static WalkingContext walkingContext; const static UserContext userContext; static Stats stats; }; // Also see "Mutt". class Dog: public Creature { // public Walking, public Fighter, public Carrier public: Dog(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_CREATURE_IO(Dog); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual Boolean draw_outline(ColorNum &); /* NOTE: Special hack for X. */ static Stats &get_stats(void *) {return stats;} const static CreatureContext creatureContext; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ static FighterXdata fighterXdata; const static FighterContext fighterContext; /* NOTE: Similar hack so that Fighter::lookup_context() can get these. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static CreatureXdata creatureXdata; static WalkingXdata walkingXdata; static CarrierXdata carrierXdata; const static WalkingContext walkingContext; const static CarrierContext carrierContext; static Stats stats; }; // Just like dog except a little slower and a little tougher. // Sure would be nice to have less code duplication between Dog and Mutt. class Mutt: public Creature { // public Walking, public Fighter, public Carrier public: Mutt(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_CREATURE_IO(Mutt); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); virtual Boolean draw_outline(ColorNum &); /* NOTE: Special hack for X. */ static Stats &get_stats(void *) {return stats;} const static CreatureContext creatureContext; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ static FighterXdata fighterXdata; const static FighterContext fighterContext; /* NOTE: Similar hack so that Fighter::lookup_context() can get these. */ private: static void init_x(Xvars&,IXCommand command,void* arg); static CreatureXdata creatureXdata; static WalkingXdata walkingXdata; static CarrierXdata carrierXdata; const static WalkingContext walkingContext; const static CarrierContext carrierContext; static Stats stats; }; class Yeti: public Creature { // Walking, Prickly public: Yeti(WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_CREATURE_IO(Yeti); static Size get_size_max(); static PhysicalP create(void *,WorldP,LocatorP,const Pos &); static Stats &get_stats(void *) {return stats;} const static CreatureContext creatureContext; /* NOTE: Making this public is a bit of a hack. Locator::register_contexts() needs to get to it and I don't want to have to make a separate accessor function for every class. */ const static AnimTimeContext animTimeContext; private: static void init_x(Xvars&,IXCommand command,void* arg); static CreatureXdata creatureXdata; static WalkingXdata walkingXdata; static PricklyXdata pricklyXdata; static AnimTimeXdata animTimeXdata; static SensitiveXdata sensitiveXdata; const static WalkingContext walkingContext; const static PricklyContext pricklyContext; const static SensitiveContext sensitiveContext; static Stats stats; }; #endif xevil-2.02r2.orig/cmn/area.h0100644000175000017500000002651607041422164015152 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "area.h" #ifndef AREA_H #define AREA_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif // Include Files #include "utils.h" #include "coord.h" #include "streams.h" // Defines #define AR_WSQUARES_MAX 20 enum ARshape {AR_RECT,AR_UNDEFINED}; enum ARsig {AR_NO_SIG, AR_CLOSE, AR_FAILURE, AR_BAD_SHAPE}; // Data structures struct TouchingListItem { Loc list[AR_WSQUARES_MAX]; int num; }; struct TouchingList { TouchingListItem r,dn,l,up; }; class Area; class Avoid; // Class Declarations class Area { public: Size operator - (const Area &) const; /* EFFECTS: Subtract areas according to their upper left corners. */ Boolean operator == (const Area &) const; Area operator + (const Size &) const; Area operator - (const Size &) const; /* EFFECTS: Return new Area with pos shifted by shift. */ Area() {shape = AR_UNDEFINED;} /* EFFECTS: Create undefined area. */ Area(const Pos &p,const Size &s) {shape = AR_RECT,pos = p,size = s;} Area(ARshape sh,const Pos &p,const Size &s) {assert(sh == AR_RECT); shape = AR_RECT; pos = p; size = s; } /* REQUIRES: c is AR_RECT. */ /* EFFECTS: Creates a rectangle area at position p of size s. */ Area(ARshape c,const Loc &loc,const Dim &dim); /* REQUIRES: c is AR_RECT. */ /* EFFECTS: Creates a rectangle area at loc and dim. */ Area(InStreamP); void read(InStreamP); static int get_write_length() {return Pos::get_write_length() + Size::get_write_length();} void write(OutStreamP) const; Boolean is_defined() const {return shape != AR_UNDEFINED;} void get_rect(Pos &p,Size &s) const {assert (shape == AR_RECT); p = pos; s = size;} /* MODIFIES: p,s */ Pos get_pos() const {assert(shape == AR_RECT); return pos;} Size get_size() const {assert(shape == AR_RECT); return size;} Box get_box() const; /* EFFECTS: Returns the box of wsquares that contains the area. */ void set_pos(const Pos &p) {assert(shape == AR_RECT); pos = p;} void set_size(const Size &s) {assert(shape == AR_RECT); size = s;} void wsquares(Loc list[AR_WSQUARES_MAX],int &nitems) const; /* MODIFIES: list, nitems */ /* EFFECTS: After completion, the first nitems of list contain the locations of all the wsquares covered by the area. The initial values of list and nitems are ignored. wsquares are not necessarily inside the world. */ Boolean overlap(const Area &) const; /* EFFECTS: Returns True if *this overlaps with r, False otherwise. */ Boolean overlap(const Loc &loc) const; /* EFFECTS: Returns True if loc overlaps with any of the area. Returns False otherwise. */ Boolean overlap(const Box &box) const; /* EFFECTS: Returns True if box overlaps with any of the area. Returns False otherwise. */ Boolean overlap(const Pos &pos) const; Loc middle_wsquare() const; /* EFFECTS: Returns the location of the middle wsquare in the area. */ ARsig avoid_wsquare(Avoid &avoid,const Loc &loc) const; /* MODIFIES: avoid */ /* EFFECTS: Returns AR_NO_SIG if the wsquare at loc does not overlap with the area. If loc overlaps in the area, but not in a nearby area, returns AR_CLOSE and sets avoid to be the offsets necessary to make the area no longer touch the wsquare. */ int avoid_wsquare_dir(const Loc &loc,Dir dir) const; /* EFFECTS: Returns the amount *this will have to be shited in dir to avoid loc. */ int avoid_area_dir(const Area &area,Dir dir) const; /* EFFECTS: Returns the amount *this will have to be shited in dir to avoid area. */ Size avoid(const Area &area) const; /* EFFECTS: Returns the smallest offset necessary to move *this in order to avoid area. */ Size avoid_no_up(const Area &) const; /* EFFECTS: Like avoid(), but will not avoid in the up direction. */ Pos adjacent_rect(const Size &s,Dir dir) const; /* EFFECTS: Return the upper left corner of the rectangle of size s that touches *this such that the direction from *this to the rectangle is dir. */ Pos get_middle() const{ assert(shape == AR_RECT); return Pos(pos.x+(size.width>>1),pos.y+(size.height>>1));} /* EFFECTS: Returns the middle of the area. */ Boolean touches(const Area &other,Touching touching) const; /* EFFECTS: Does other touch this on this's side specified by touching. */ void touching_wsquares(TouchingList &list) const; /* MODIFIES: list */ /* EFFECTS: Sets list.{r,dn,l,up} to be the lists of all wsquares that are exactly touching the area. The directions are set from the area to the touching wsquare. I.e. A loc listed under list.r would be touching the right side of the area. The list are ordered such that the smallest row and column indexes come first. I.e. top->bottom and left->right. */ void edge_wsquares(TouchingList &list) const; /* MODIFIES: list */ /* EFFECTS: Like touching_wsquares except squares on edge don't have to be exactly touching. They might just overlap area. I.e. returns Area::wsquares() - {all squares entirely inside the Area} */ Boolean corner_offset(Size &offset,Loc list[3],Loc &inner,Dir corner) const; /* MODIFIES: offset, list, inner */ /* EFFECTS: If the corner of the Area in the given direction covers 3 wsquares, set offset to be the amount to shift the Area so it is touching on the corner, set list to be the 3 covered wsquares, set inner to be the wsquare of the inside of the corner, and return True. Else return False. corner is one of {CO_DN_R,CO_DN_L,CO_UP_L,CO_UP_R}. */ void shift(const Size &offset) {assert(shape == AR_RECT); pos = pos + offset;} /* EFFECTS: Shift the area by offset. */ void set_middle(const Pos &pos); /* EFFECTS: Move the area so that pos will be the middle. */ Dir dir_to(const Pos &pos) const; Dir dir_to(const Area &area) const; /* EFFECTS: Returns the direction from this to pos or to area. Will return one of {CO_R .. CO_UP_R, CO_air}. I.e. 8 directions or CO_air. */ Area combine(const Area &a) const; /* EFFECTS: Returns minimum sized rectangular area that contains a and this. */ Area wsquare_allign(const Size &offset) const; /* EFFECTS: For each dimension of offset that is non-zero, wsquare_allign makes sure that the returned Area is wsquare_alligned in that dimension. I.e. the edge of the Area in that direction will be on a wsquare boundary. The returned area will not cover any wsquares that weren't already covered. */ Boolean wsquare_alligned() const; /* EFFECTS: Is the Area alligned in all four directions with wsquares? */ Area grow_by(int delta) const; /* EFFECTS: Increase area by delta on all four sides. I.e. size will increase by 2*delta in both directions. */ Size clip_top(int val); /* REQUIRES: Don't clip everything away. */ /* EFFECTS: Clip top to be <= val. Return offset (width,height) such that height is the amount that was clipped away. */ Size clip_left(int val); /* REQUIRES: Don't clip everything away. */ /* EFFECTS: Clip left to be <= val. Return offset (width,height) such that width is the amount that was clipped away. */ Size clip(const Size &size); /* REQUIRES: Don't clip everything away. */ /* EFFECTS: Clip this to clipper. Return False if nothing left. In the second version, clipper is an area of size size with pos (0,0). */ private: ARshape shape; Pos pos; Size size; }; class Avoid { friend class Area; public: void maximize(const Avoid &avoid); /* EFFECTS: Set all directions of *this to be to max of *this and avoid. */ Size offset_rank(int rank = 0) const; /* REQUIRES: 0 <= rank < 4 */ /* EFFECTS: Return the offset corresponding to the rankth minimum direction of *this using one dimensions. E.g. rank = 0 gives the minimum. rank = 1 gives the second minimum, etc. */ Size offset_dir(Dir d) const; /* REQUIRES: d in {CO_R, CO_DN, CO_L, CO_UP} */ /* EFFECTS: Return the offset corresponding to d. */ int get_dir(Dir d) const; /* REQUIRES: d in {CO_R, CO_DN, CO_L, CO_UP} */ /* EFFECTS: Returns the offset in the specified direction. */ private: /* Direction from area to wsquare. All are positive. r and dn are therefore the negative of the corresponding offsets. */ int r,dn,l,up; // Note: A bit counter-intuitive. }; // All values are world (unstretched) coordinates. class ViewportRegion { friend class ViewportInfo; public: ViewportRegion() {}; /* NOTE: Make the fucking compiler happy. */ Boolean visibleOverlap(const Area &) const; /* EFFECTS: Does the area overlap the visible region of the viewport? */ Boolean peripheralOverlap(const Area &) const; /* EFFECTS: Does the area overlap the peripheral region of the viewport, including the visible subset of that. */ void grow_by(int val); /* EFFECTS: Grow the ViewportRegion by val, visible and peripheral. */ private: ViewportRegion(const Area &a); /* EFFECTS: V_AREA constructor. */ ViewportRegion(const Pos &periphCenter,int periphRadius, const Area &visibleArea); /* EFFECTS: V_DISK constructor. */ enum {V_AREA,V_DISK}; char type; Area area; // both, for V_DISK this gives the inner,visible area Pos pos; // for V_DISK int radius; // for V_DISK }; typedef ViewportRegion *ViewportRegionP; // A Factory for generating ViewportRegions, given a Physical to follow. // // All values are world (unstretched) coordinates. class ViewportInfo { public: ViewportInfo() {} /* EFFECTS: So we can create an uninitialized object to call ViewportInfo::read(). */ ViewportInfo(int radius,const Size &visibleSize); /* EFFECTS: Create smooth scroll ViewportInfo. */ ViewportInfo(int radius,const Size &logicalSize,const Size &extraSize); /* EFFECTS: Create non-smooth scroll ViewportInfo. */ void read(InStreamP in); static int get_write_length(); void write(OutStreamP out) const; ViewportRegion get_viewport_for(const Pos &pos) const; /* EFFECTS: The factory's creation method. pos is the center of the Physical to follow. */ Dim get_viewport_dim() const; /* REQUIRES: Viewport dimensions must be multiples of wsquares. */ /* EFFECTS: Get the dimensions of a viewport in wsquares. */ private: Boolean smoothScroll; // both Size logicalSize; // both Size extraSize; // if !smoothScroll int radius; // both }; typedef ViewportInfo *ViewportInfoP; // An interface to lazily provide a ViewportInfo object. class IViewportInfo { public: virtual ViewportInfo get_info() = 0; }; #endif xevil-2.02r2.orig/cmn/coord.h0100644000175000017500000004722207041422164015345 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "coord.h" Coordinates and directions and the like. #ifndef COORD_H #define COORD_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif // Include Files #include "utils.h" #include "id.h" #include "streams.h" // Defines #define WSQUARE_WIDTH 16 #define WSQUARE_HEIGHT 16 #define WSQUARE_WIDTH_INV (1.0 / WSQUARE_WIDTH) #define WSQUARE_HEIGHT_INV (1.0 / WSQUARE_HEIGHT) // Hack, needed by ui.h #define R_NAME_MAX IT_STRING_LENGTH // Used for defining the name of bitmap files/resource ids in the .bitmaps // files. #if X11 #define CMN_ID(_unix___,_win32___) ((char*)_unix___) #endif #if WIN32 #define CMN_ID(_unix___,_win32___) _win32___ #endif #define W_BLOCKS_NUM 7 #define W_THEME_NUM 6 // Ick. Only here because needed by xdata.h on UNIX. // // The total number of all blocks of all types in all themes. #define W_ALL_BLOCKS_NUM 22 // All the possible backgrounds for all themes. #define W_ALL_BACKGROUNDS_NUM 14 // All the outside pixmaps for all themes. #define W_ALL_OUTSIDES_NUM 6 // twice the number of different doors, e.g. top and bottom #define W_ALL_DOORS_NUM 10 // twice the number of different types, e.g. OR_VERT and OR_HORIZ #define W_ALL_MOVER_SQUARES_NUM 10 // the number of movers, each takes up 2 squares. #define W_ALL_MOVERS_NUM 5 // All the possible posters for all themes, and the title poster. #define W_ALL_POSTERS_NUM 14 // Still used by x11/xdata.h, purged from win32/xdata.h, though. #define PH_ANIM_MAX 10 #define PH_AMMO_UNLIMITED -1 #define UI_ARENA_MESSAGE_TIME 60 // The number of humans may change during the game, ie. client-server game. #define HU_UNSPECIFIED -1 // Order of directions IS guaranteed. #define CO_center_R 0 #define CO_center_L 1 #define CO_air_R 2 #define CO_air_L 3 #define CO_air 4 #define CO_center 5 #define CO_r 6 #define CO_r_DN 7 #define CO_r_UP 8 #define CO_dn 9 #define CO_dn_R 10 #define CO_dn_L 11 #define CO_l 12 #define CO_l_DN 13 #define CO_l_UP 14 #define CO_up 15 #define CO_up_R 16 #define CO_up_L 17 #define CO_climb 18 #define CO_climb_DN 19 #define CO_climb_UP 20 #define CO_air_UP 21 #define CO_air_DN 22 #define CO_climb_R 23 #define CO_climb_L 24 #define CO_R 25 #define CO_DN_R_R 26 #define CO_DN_R 27 #define CO_DN_DN_R 28 #define CO_DN 29 #define CO_DN_DN_L 30 #define CO_DN_L 31 #define CO_DN_L_L 32 #define CO_L 33 #define CO_UP_L_L 34 #define CO_UP_L 35 #define CO_UP_UP_L 36 #define CO_UP 37 #define CO_UP_UP_R 38 #define CO_UP_R 39 #define CO_UP_R_R 40 #define CO_DIR_MAX 41 #define CO_DIR_PURE 16 // "Pure" does not include CO_center. Use CO_air. #define CO_DIR_HALF_PURE 8 typedef int ClassId; // Possible values for a ClassId. There should be an entry for every class // of Physical objects in the game. // Also used as an index into Locator::contexts. // Don't forget to register the class in Locator::register_classes(). // // Note that A_CLASSES_NUM is public and accessible by anyone. // enum { A_Explosion,A_Fire,A_FireExplosion, A_NProtection,A_TProtection,A_XProtection, A_Trapdoor,A_Home, A_Shell,A_SwapShell,A_Lance,A_Laser,A_FrogShell,A_Fireball,A_Missile, A_Star, A_Blood,A_GreenBlood,A_OilDroplet, A_Grenade,A_Napalm,A_Egg, A_Xit,A_Flag, A_Rock,A_Weight,A_AltarOfSin, // Items A_Doppel,A_Cloak,A_Transmogifier,A_MedKit,A_CrackPipe,A_Caffine,A_PCP, A_NShield,A_TShield,A_Bomb, // Weapons A_Chainsaw,A_Pistol,A_MGun,A_Lancer,A_AutoLancer,A_FThrower,A_Launcher, A_Grenades,A_Napalms,A_Stars,A_Swapper,A_FrogGun,A_DogWhistle, A_DemonSummoner, // Creatures A_Enforcer,A_Frog,A_Hero,A_Ninja,A_Alien,A_RedHugger,A_GreenHugger, A_ChopperBoy,A_Seal, A_FireDemon,A_Dragon,A_Walker, A_Dog,A_Mutt, A_Yeti, // Misc A_PhysMover, // The number of "real" classes. A_CLASSES_NUM, // Identifiers for non-existent classes. Add to // Locator::nonExistentClassesItemInfo if you add new ones. A_Fireballs = A_CLASSES_NUM, A_Lasers, A_DropLiftable, A_HandToHand, A_SuicideButton, A_Prickly, // The attack that the Prickly class uses. // Must be last. A_None }; // AbilityId typedef int AbilityId; enum { AB_Grounded = 0, AB_Suicide, AB_Hopping, AB_User, AB_Carrier, AB_Fighter, AB_Walking, AB_Sticky, AB_Flying, AB_BuiltIn, AB_Hugger, AB_Prickly, AB_Healing, AB_Lifter, AB_Morphed, AB_AnimTime, AB_OnFire, AB_SwapProtect, AB_Segmented, AB_Sensitive, // WARNING, The Creature IO code assumes there are <= 32 abilities. // Uses a bit field to write out. AB_MAX, }; typedef u_int ABBitField; typedef int ModifierId; enum {M_Crack,M_CaffineM,M_PCPM,M_Alcohol,M_Heroin, M_DoubleSpeed,M_DoubleJump,M_DoubleHealth, M_LifterSpeed, M_None}; typedef int Capability; typedef int Dir; typedef int Touching; typedef int Stance; typedef int Corner; typedef int Mass; typedef int Health; typedef int Frame; typedef int Speed; typedef int Quanta; typedef u_int Turn; typedef int TeamId; enum RoleType {R_STAND_ALONE, R_CLIENT, R_SERVER, R_NONE}; // R_NONE is just a placeholder. Ui uses it to indicate that // role hasn't been set yet. // Cross-platform sound. typedef int SoundName; class Area; // Moved from intel.h so that xdata.h can get IT_WEAPON_R. // // Possible commands to be given to objects. // Order of directions is guaranteed. (See ui.h and game.cpp) enum { IT_CENTER, IT_R, IT_DN_R, IT_DN, IT_DN_L, IT_L, IT_UP_L, IT_UP, IT_UP_R, IT_WEAPON_CENTER,IT_WEAPON_CHANGE,IT_WEAPON_DROP, IT_ITEM_USE,IT_ITEM_CHANGE,IT_ITEM_DROP, IT_CHAT, // The above are the possible values for user keys in the Ui, // i.e. < UI_KEYS_MAX. IT_WEAPON_R,IT_WEAPON_DN_R,IT_WEAPON_DN,IT_WEAPON_DN_L, IT_WEAPON_L,IT_WEAPON_UP_L,IT_WEAPON_UP,IT_WEAPON_UP_R, IT_NO_COMMAND }; typedef int ITcommand; #define IT_COMMAND_MAX IT_NO_COMMAND class Stats { public: Stats() {creations = 0; uses = 0; deaths = 0; aveLifespan = 0.0f;} long get_creations() const {return creations;} long get_uses() const {return uses;} long get_deaths() const {return deaths;} float get_ave_lifespan() const {return aveLifespan;} /* NOTE: Value returned is in seconds. */ void add_creation() { if (enabled) creations++;} void add_use() {if (enabled) uses++;} void add_death(time_t birthTime); static void enable() {enabled = True;} /* EFFECTS: Stats will only be recorded after the call to enable(). */ /* NOTE: Used so that stats will not be recorded during the demo screen. */ private: long creations; long uses; // use, explosion. long deaths; float aveLifespan; // Valid iff deaths > 0. Boolean static enabled; }; struct Pos { Pos() {x = 0; y = 0;} Pos(int xx,int yy) {x = xx; y = yy;} Pos(InStreamP in) {read(in);} void read(InStreamP in); static int get_write_length(); void write(OutStreamP out) const; int distance(const Pos &) const; /* EFFECTS: Returns distance between two points. */ int distance_2(const Pos&) const; /* EFFECTS: Returns square of distance between two points. */ void set_zero() {x = y = 0;} int x; int y; }; // In pixels struct Vel { Vel() {dx = 0.0f; dy = 0.0f;} Vel(float x,float y) {dx = x; dy = y;} void set_zero() {dx = 0.0f; dy = 0.0f;} void read(InStreamP in); static int get_write_length(); void write(OutStreamP out) const; Vel shrink(float k) const; void damp(float k); Boolean is_zero() const; Dir get_dir() const; void limit(float k); /* REQUIRES: k >= 0 */ /* EFFECTS: Force dx and dy to be <= k. */ void get_dirs_4(Dir in[4],Dir out[4],int &inNum,int &outNum); /* MODIFIES: in, out, inNum, outNum */ /* EFFECTS: Partitions {CO_R, CO_DN, CO_L, CO_UP} into in and out. inNum and outNum are set to the sizes of the respective sets. */ float dx; float dy; }; struct Dim { Dim() {rowMax = colMax = 0;} Dim(int rm,int cm) {rowMax = rm; colMax = cm;} Dim(InStreamP in) {read(in);} void read(InStreamP in); static int get_write_length(); void write(OutStreamP out) const; int rowMax, colMax; // In WSQUARES. }; struct Size { const Size &operator +=(const Size &other) {width += other.width; height += other.height; return *this;} Dir get_dir(); /* EFFECTS: Returns one of {CO_R..CO_UP_R,CO_air}. */ void get_dirs_4(Dir &d1,Dir &d2); /* MODIFIES: d1, d2 */ /* EFFECTS: Gets the two directions of {CO_R,CO_DN,CO_L,CO_UP} that correspond to *this. If there is only one, it is returned as d1 and d2. If *this has zero size, d1 == d2 == CO_air on return. */ void set(int w,int h){width = w; height = h;} void set(const Dim &dim) {width = dim.colMax * WSQUARE_WIDTH; height = dim.rowMax * WSQUARE_HEIGHT;} void read(InStreamP in); static int get_write_length(); void write(OutStreamP out) const; /* EFFECTS: IO for writing each coordinate as a u_char. */ void read_32(InStreamP in); static int get_write_length_32(); void write_32(OutStreamP out) const; /* EFFECTS: IO for writing each coordinate as an int. */ float cross(const Vel &v); /* EFFECTS: z component of the cross product of the size and the Vel. */ float dot(const Vel &); /* EFFECTS: Dot product. */ void set_zero() {width = height = 0;} int abs_2() {return width*width + height*height;} int width; int height; }; // Constructors mess with TouchingList in area.h struct Loc { void read(InStreamP in); static int get_write_length(); void write(OutStreamP out) const; void set(int rr,int cc) {r = rr; c = cc;} Loc move(int dr,int dc) {Loc ret; ret.r = r + dr; ret.c = c + dc; return ret;} /* EFFECTS: Return new Loc that is *this + (dr,dc) */ int r,c; // In WSQUARES. }; struct Box { Box() {}; Box(const Loc &l,const Dim &d) {loc = l; dim = d;} Boolean overlap(const Loc &); Loc loc; Dim dim; // In WSQUARES. }; struct GLoc { int vert, horiz; }; struct RoomIndex { RoomIndex() : down(0), across(0) {} RoomIndex(int d,int a) : down(d), across(a) {} RoomIndex(InStreamP in) {read(in);} void read(InStreamP in) {down = in->read_char(); across = in->read_char();} static int get_write_length() {return 2 * sizeof(char);} void write(OutStreamP out) const {assert(down <= UCHAR_MAX && across <= UCHAR_MAX); out->write_char((u_char)down); out->write_char((u_char)across);} // In rooms. int down; int across; }; struct Rooms { Rooms() {downMax = acrossMax = 0;} Rooms(int dn,int acc) {downMax = dn; acrossMax = acc;} Rooms(InStreamP in) {read(in);} void read(InStreamP in) {downMax = in->read_char(); acrossMax = in->read_char();} static int get_write_length() {return 2 * sizeof(char);} void write(OutStreamP out) const {out->write_char((u_char)downMax); out->write_char((u_char)acrossMax);} int downMax, acrossMax; }; struct Acc { operator Vel() {Vel ret(ddx,ddy); return ret;} /* EFFECTS: Converts from an acceleration to velocity. Assumes initial velocity is 0. */ float ddx, ddy; }; struct Hanging { Hanging() {corner = CO_air;} enum {LOC,MOVER}; Corner corner; int type; // Hanging::LOC or Hanging::MOVER. // Only one of these two is valid. Can't be a union because // MoverId has constructor. Loc loc; // Not meaningful if corner == CO_air. MoverId moverId; }; typedef int Grav; enum Attack {attackNone, attackStuck, attackFree}; // Operators on the geometric primitives Boolean operator == (const Loc &l1, const Loc &l2); Boolean operator == (const Pos &p1, const Pos &p2); Boolean operator == (const Vel &, const Vel &); Boolean operator == (const Size &s1, const Size &s2); Boolean operator == (const GLoc &,const GLoc &); Boolean operator != (const GLoc &,const GLoc &); Boolean operator == (const Dim &,const Dim &); Boolean operator == (const Rooms &,const Rooms &); Pos operator + (const Pos &pos,const Size &size); Pos operator - (const Pos &pos,const Size &size); Size operator - (const Pos &p1,const Pos &p2); Pos operator + (const Pos &pos, const Vel &vel); Size operator * (float k,const Size &size); Vel operator + (const Vel &,const Vel &); Vel operator + (const Vel &, const Acc &acc); Vel operator + (const Vel &, const Size &size); Vel operator * (float k,const Vel &vel); Vel operator / (float k,const Vel &vel); Vel operator + (float k,const Vel &vel); Acc operator * (int k,const Acc &acc); // Useful for adding two offsets. Size operator + (const Size& s1,const Size& s2); class Coord { public: static Boolean is_dir_pure(Dir dir); static Dir dir_opposite(Dir dir); /* REQUIRES: dir must be a pure dir. */ static Dir movement_dir_4(Dir dir); /* EFFECTS: Returns a dir in {CO_air,CO_R,CO_DN,CO_L,CO_UP}. CO_air if the dir corresponds to one where the object is not moving. Otherwise, one of the others. */ static Dir parallel_dir(Stance stance); /* EFFECTS: Returns CO_DN or CO_R such the returned direction is parallel to the wall corresponding to stance. E.g. moving a creature touching a wall (in stance) will still be touching the wall. Return CO_air if stance is CO_air. */ static Pos shot_initial_pos(const Area &area,Touching touching, const Size &shotSize,Dir shotDir); /* EFFECTS: Compute the starting position of the shot. The shot should be flush on the inside of the area, if possible. If the shot is too big, make sure it doesn't stick out the opposite side. Uses touching to adjust location so that shot does not start out in a wall. */ static int pure_to_half_pure(Dir d) {assert (d >= CO_R && d < CO_DIR_MAX); return (d - CO_R) >> 1;} static int half_pure_to_pure(Dir d) {assert (d >= 0 && d < 8); return 2 * d + CO_R;} /* EFFECTS: Convert between "pure" and "half pure" directions. A "pure" dir is 16 directions based at CO_R. A "half pure" direction is 8 directions based at zero. */ static Touching dir_to_touching(Dir d); /* NOTE: Also used as the default "offset_generator", see MovingContext. */ static Touching zero_offset_generator(Dir d); /* EFFECTS: Will make offset of (0,0) for all directions. */ static void generate_offsets(Size offsets[CO_DIR_MAX], const Size sizes[CO_DIR_MAX], const Size &sizeMax, Touching (*dirToTouching)(Dir)); /* MODIFIES: offsets */ /* EFFECTS: Fill offsets with the appropriate offsets for the given set of sizes inside a rect of size sizeMax. dirToTouching is used to determine */ }; // Difficulty levels. struct DifficultyLevel { int reflexes; // For Machine intel int enemiesInitial; // enemies on first level int enemiesIncr; // this many more enemies each level int enemiesMax; // maximum number of enemies (for levels) char *name; // of this difficulty level }; enum {DIFF_TRIVIAL,DIFF_NORMAL,DIFF_HARD,DIFF_BEND_OVER, DIFFICULTY_LEVELS_NUM, DIFF_NONE=DIFFICULTY_LEVELS_NUM}; typedef int TickType; enum {TICK_HUMAN,TICK_NEUTRAL,TICK_ENEMY,TICK_OTHER,TICK_MAX}; class NetData { public: NetData(); /* EFFECTS: Initialize data. */ static void enable_clocked_flag() {gClocked = 0;} static Boolean clocked_flag_enabled() {return gClocked >= 0;} Boolean clocked_this_turn() {assert(gClocked >= 0); return fClocked == gClocked;} void set_clocked_this_turn() {assert(gClocked >= 0); fClocked = gClocked;} static void toggle_clocked_flag() {assert(gClocked >= 0); gClocked = !gClocked;} /* EFFECTS: Simple on/off system for determining if an Object has been clocked yet this turn. Only used by Client. Must call enable_clocked_flag() before using any of the other functions, besides clocked_flag_enabled(). */ TickType get_tick_type() {return tickType;} void set_tick_type(TickType val) {tickType = val;} /* NOTE: TICK_MAX means unspecified. TickType will always be unspecified unless the physical was read in from a stream with a tickType specified. */ Turn get_last_modified() {return lastModified;} /* EFFECTS: When was the last time this object was updated from the net. */ void touch(Turn now) {lastModified = Utils::maximum(lastModified,now);} /* EFFECTS: Inform this that it was updated. Could have Turn as an another argument to update_from_stream(), but I'm not going through all those files again. */ Boolean get_sent_flag() {return sent;} void set_sent_flag(Boolean val) {sent = val;} /* EFFECTS: Server uses this to keep track of whether an object has been sent to a Connection or not. */ private: Turn lastModified; TickType tickType; signed char fClocked; static signed char gClocked; // Start out the same. Boolean sent; // Could also have creationOk. }; typedef NetData *NetDataP; // Transform2D enum TransformType { TR_NONE, TR_RT_1, // Rotate 90 clockwise TR_RT_2, // Rotate 180 clockwise TR_RT_3, // Rotate 270 clockwise TR_RF_X // Reflect in X direction. }; // Used for auto-generating pixmaps for Moving. struct OneTransform { // Max number of 2D transforms to get from a base to any dir. enum {TRANSFORMS_MAX = 2}; int transformsNum; Dir base; TransformType transforms[TRANSFORMS_MAX]; static unsigned int compute_key(const TransformType* transforms,int tNum); /* EFFECTS: Generate a 3-bit key that uniquely represents the transform. */ /* NOTE: This might not be the best place for this function. Moving::init_x() uses it for generating keys for the SurfaceManager. */ }; typedef OneTransform TransformMap[CO_DIR_MAX]; // For an overrid TransformMap, this means don't override. #define TR_USE_DEFAULT -1 class Transform2D { public: // is_base(), get_base(), and get_transforms() all take an optional TransformMap // that will override the default transforms. See "Fighter". static Boolean is_base(Dir d,TransformMap* override); /* EFFECTS: Is the given direction a base direction that can be used to auto-generate other pixmaps. */ static Dir get_base(Dir d,TransformMap* override); /* REQUIRES: d is not a base */ /* EFFECTS: Return the base used to generate the bimap for the given direction. */ static const TransformType* get_transforms(int &tNum,Dir d,TransformMap* override); /* REQUIRES: d is not a base */ /* MODIFIES: tNum */ /* EFFECTS: Return the transformations necessary to get from the appropriate base to d. Set tNum to the number of transformations. Transformations must be applied in the given order. tNum is 0 for the identity transformation. */ static Pos apply(TransformType tt,const Pos &pos,const Size &size); /* EFFECTS: Apply transform tt to pos within a rectangle of the given size. */ static Size apply(TransformType tt,const Size &size); /* EFFECTS: Given the size of a rectangle, return the size of the transformed rectangle. */ static Pos apply_all(Dir d,const Pos &pos,const Size &size,TransformMap* override); /* EFFECTS: Convenience method. Apply all transforms needed to get from pos in the coordinate system of the base of d to dest. */ private: static TransformMap transforms; }; #endif xevil-2.02r2.orig/cmn/game.h0100644000175000017500000004063107637235660015163 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "game.h" #ifndef GAME_H #define GAME_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif // Include Files extern "C" { #include } #include #include "utils.h" #include "ui.h" #include "world.h" #include "locator.h" #include "actual.h" #include "role.h" #include "xdata.h" #include "sound.h" // Class Declarations class Game; typedef Game *GameP; enum RestartEnd {RE_NONE,RE_RESTART,RE_END}; class GameStats { public: GameStats() {reset();} long num_turns() {return numTurns;} void reset() {aveTime = 0; numTurns = 0;} void report(); void clock(); private: long numTurns; time_t prevTime; float aveTime; /* In seconds */ }; // New scalable, way using Locator::filter_contexts. class GameObjects { public: GameObjects(WorldP, LocatorP); ~GameObjects(); void game_reset(const char *oneItem,Boolean noItems, Boolean oneEach); /* EFFECTS: Initialize values for a new game. Does not actually create objects. oneItem not empty means there will be only one item in the world, the value of oneItem. Otherwise, noItems means there will be no items. Otherwise regular items. oneEach will cause one of each item to be used. */ /* NOTE: Must be called once before GameObjects::refill. */ /* REQUIRES: The memory for oneItem is not copied internally, so don't ever delete it. */ void level_reset(const Dim &worldDim,GameStyleP); /* EFFECTS: Choose how many of each class of objects to use for the next level. */ /* IMPLEMENTATION NOTE: Deal with memory for ids[]. */ void refill(); /* EFFECTS: Create and add objects as necessary. */ /* REQUIRES: GameObjects::game_reset has already been called. */ private: void refill_helper(const PhysicalContext *cx,int which); /* EFFECTS: Make it so that actuals[which] of the Item exist. I.e. create (actuals[which] - ) new Items. */ void compute_actuals(const PhysicalContext *weapons[],int weaponsNum, const PhysicalContext *oItems[],int oItemsNum); /* EFFECTS: Compute actuals from maximums. weapons and oItems are the lists of potential weapons and potential otherItems. */ Boolean is_available(const Id &id); /* EFFECTS: Decide whether to count id as still being available for players to use. */ static Boolean potential_weapon_filter(const PhysicalContext*,void*); static Boolean potential_other_item_filter(const PhysicalContext*,void*); /* NOTE: Used for Locator::filter_context. */ WorldP world; LocatorP locator; Boolean resetCalled; int maximums[A_CLASSES_NUM]; // Maximum num that could be created this level. int actuals[A_CLASSES_NUM]; // The actual num that will be here this level int levelAlready[A_CLASSES_NUM]; // Number already generated this level. int levelMaxTimes[A_CLASSES_NUM]; // Maximum number that can be generated this level. (0 == infinity) Id *ids[A_CLASSES_NUM]; const char *oneItem; Boolean noItems; Boolean oneEach; }; // A set of ranks that are of approximate equal worth. struct RankingSet { enum {RANKING_SET_MAX = 8}; // Max number of rankings in a set. int killsMin; // Min number of kills to get this rank. char *rankings[RANKING_SET_MAX + 1]; // Extra for NULL. }; class Game: public IPhysicalManager, public IGameManager { public: enum { // In turns. REPORT_TIME = 200 }; /* NOTE: Actually should be private. Lame-ass Silicon Graphics compiler. */ Game(int *argc,char **argv); ~Game(); static const char* get_version_string(); #if WIN32 int getWindowList(CTypedPtrList&p_windowlist); /* EFFECTS: Get pointers to all windows created by UI. For event handling. */ #endif Boolean quit_game(){return quitGame;} /* NOTE: Role may instruct game to exit. */ #if X11 Display *get_dpy(int dpyNum) {return ui ? ui->get_dpy(dpyNum) : (Display *)NULL;} #endif int get_dpy_max() {return ui ? ui->get_dpy_max() : 0;} Boolean has_ui() {return (ui != NULL);} /* NOTE: We may be playing as Server with no ui. */ Quanta get_quanta() {return quanta;} /* EFFECTS: How often should the game be clocked. (milliseconds) */ // It might be better to hide all the role-specific code inside Game. RoleP get_role() {return role;} Boolean show_stats() {return showStats;} void pre_clock(); /* EFFECTS: Portion of one cycle of game play prior to reading all the events for this turn. */ void post_clock(); /* EFFECTS: Portion of one cycle of game play after reading the events from the queue. */ void yield(CMN_TIME time,int quanta,ITurnStarterP); /* EFFECTS: Yield given amount of time to processor. Process any sockets, etc. */ Boolean process_event(int dpyNum,CMN_EVENTDATA event) #if WIN32 {return ui->process_event(dpyNum,event);} #endif #if X11 {if (ui) ui->process_event(dpyNum,event); return False;} #endif /* WINDOWS NOTE: If didnt process, return False. */ /* UNIX NOTE: Return value is meaningless. */ static ClassId parse_class_name(LocatorP l,const char *name); /* EFFECTS: Given the class name corresponding to a registered PhysicalContext, return the ClassId of the PhysicalContext, or A_None if not found. */ /* NOTE: Pass in Locator so that we can export this as a static function. */ /****************** Implementation for IPhysicalManager ******************/ virtual PhysicalP create_enemy(PhysicalP p,Boolean addToLocator = True); /* EFFECTS: Create enemy player, give it a Physical, register_enemy and add to locator. The Physical will be p if non-NULL. If p is NULL, use enemy_physical() to create a enemy. Return the Physical. */ virtual PhysicalP enemy_physical(); /* EFFECTS: Randmoly choose a Physical for an Enemy. */ virtual PhysicalP enemy_physical(ClassId classId); /* EFFECTS: Create a Physical of class classId. */ virtual PhysicalP enemy_physical(ClassId *classIds,int num); /* EFFECTS: Create a Physical of a class in classIds or choose randomly if num is zero. Otherwise, num is the length of classIds. */ virtual ITmask intel_options_for(IntelOptions &ops,ClassId classId); /* EFFECTS: Return the default IntelOptions and mask for an (Enemy) Intelligence in a body of class classId. */ /* MODIFIES: ops */ virtual void kill_physical(PhysicalP p); /************************* End IPhysicalManager **************************/ /****************** Implementation for IGameManager ******************/ virtual void world_changed(); virtual void manager_reset(GameStyleType); virtual void register_intel(int num,IntelP intel); /* EFFECTS: Associate intel with viewport num. */ virtual void humans_num_incremented(); virtual void humans_num_decremented(const IntelId &); virtual void quit(); virtual void set_humans_playing(int); virtual void set_enemies_playing(int); virtual Quanta manager_get_quanta(); virtual GameStyleType get_game_style_type(); /************************* End IGameManager **************************/ private: enum { WITTY_SAYINGS_NUM = 147, INTEL_NAMES_NUM = 74, RANKING_SETS_NUM = 12, }; void ui_settings_check(RestartEnd &); /* EFFECTS: Process any commands that the Ui has received. */ void set_style_next(GameStyleType); /* EFFECTS: Sets the style in Game and Ui, and send appropriate message. */ void reincarnations_check(); void game_over_check(int humansPlaying,int enemiesPlaying); /* EFFECTS: Set extraTimer if the game over conditions for the current style have been met. Call end_game() when the Timer expires. */ void new_level_check(int enemiesPlaying); /* EFFECTS: Called in clock(). Sets newLevelTimer if the level has been completed. Call new_level() when the Timer expires. */ void refill_check(); /* EFFECTS: Refill items in the game. Depends on style and scenario. */ static Boolean potential_human_filter(const PhysicalContext* pc,void*); /* EFFECTS: Filter those classes whose potentialHuman flag is True. */ PhysicalP human_physical(int humanNum = 0); /* USES: Game::humanClass */ /* EFFECTS: Create a Physical appropriate for a Human. */ /* NOTE: humanNum is something of a hack. */ /* NOTE: Also adds the object(s) to the Locator. Needed so that human_physical can create and add composite objects. */ static Boolean potential_enemy_filter(const PhysicalContext* pc,void*); /* EFFECTS: Filter those classes whose potentialEnemy flag is True. */ char *choose_ranking(int kills); /* EFFECTS: Choose a rank for the player at the end of game based on the number of kills. */ void end_game(Boolean showMessages); /* EFFECTS: End the game immediately. showMessages specifies whether to report ranking/kills/etc. */ void new_level(); /* EFFECTS: Clean up after previous level and start a new level. */ void award_bonuses_now(); /* EFFECTS: Award a bonus to all human players. Put a message up on the screen for each. */ void get_bearings(char* levelTitleStr); /* MODIFIES: levelTitleStr */ /* EFFECTS: Set state to getBearings for the appropriate amount of time. levelTitleStr is the message to display while the user waits for the next level to start. */ /* NOTE: get_bearings() takes ownership for the memory of levelTitleStr. */ void reset(); /* EFFECTS: End the game and start a new one. */ void new_game(); /* EFFECTS: Before reset(), sets NEW_GAME_MESSAGE. */ void process_x_resources(int *argc,char **argv); /* EFFECTS: Read in x resources. Sets default keyset for the Ui. */ void parse_args(int *argc,char **argv); /* EFFECTS: Parses the command line, setting all options except politically correct. */ char **display_names(int *argc,char **argv); /* EFFECTS: Returns an array of length UI_VIEWPORTS_MAX of strings containing the display names for all possible viewports. "" means use the local display. Must delete both the array and the strings contained in it when done. */ char *font_name(int *argc,char **argv); /* EFFECTS: Check for the font name in the argument list. */ void humans_reset(); /* EFFECTS: Create new human players and create/destroy viewports and register the human playsers as necessary. */ void create_human_and_physical(int h); /* EFFECTS: Create human number h and an appropriate physical. */ #if WIN32 void Game::change_screen_mode(Xvars::SCREENMODE p_newmode); /* EFFECTS: destroys current ui and initializes another with p_newmode keeps game state exactly as it was. */ #endif void intro(); /* EFFECTS: Put info messages on cout and on the Locator message queue. */ static Boolean stats_creations_filter(const PhysicalContext*,void*); static Boolean stats_uses_filter(const PhysicalContext*,void*); static Boolean stats_deaths_filter(const PhysicalContext*,void*); /* NOTE: Helpers for print_stats(). */ void print_stats(); /* EFFECTS: Print out current statistics for the Game to cout. */ void demo_setup(); /* EFFECTS: Create enemy players for the demo. */ static Boolean universal_team(LocatorP,PhysicalP,PhysicalP); /* EFFECTS: Put all objects on the same team, used for demo. */ #if WIN32 void start_soundtrack(); /* EFFECTS: Starts soundtrack, sets up soundManager. Will stop current soundtrack first, before starting new one. */ void stop_soundtrack(); /* EFFECTS: Stop current soundtrack. */ #endif // public for GameObjects, probably we should give GameObjects a pointer to // a IPhysicalManager. public: static void off_clock_kill(LocatorP,PhysicalP); /* EFFECTS: Kill a Physical when control is not in Locator::clock(). I.e. not during regular game play. */ private: static Boolean humans_team(LocatorP,PhysicalP,PhysicalP); /* EFFECTS: All humans and their slaves are on the same team. */ static Boolean one_human_team(LocatorP,PhysicalP,PhysicalP); /* EFFECTS: Team for one human and his slaves. */ int limit_humans_num(int); void play_sounds(); /* EFFECTS: plays all sounds located in the sound registry. */ SoundManager soundManager; SoundName currentSoundName; //keeps track of current sound track being played: can be 0 static char *wittySayings[WITTY_SAYINGS_NUM]; static char *intelNames[INTEL_NAMES_NUM]; static DifficultyLevel difficultyLevels[DIFFICULTY_LEVELS_NUM]; static RankingSet rankingSets[RANKING_SETS_NUM]; enum GameState { demoOff, // Before game starts, just showing title screen. demoOn, // Before game starts, playing a demo. demoExtra, // Few extra turns after end of one demo before start of next. newGame, // Starting a new game. getDifficulty, // UNIX only, waiting for user to enter difficulty level. getBearings, // Beginning of new level, let the user see what's going on before starting. gameOn, // Normal game play. levelExtra, // Few extra turns after level is beat, but before starting new level. awardBonus, // Few turns before getBearings to tell users about awarded bonuses. gameExtra, // Few extra turns after game is over. gameOver, // Game is over, everything is frozen. roleFailed, // Role (Client or Server) failed for some reason. prepareConnect, // Client is in the process of connecting to a server. }; Quanta quanta; // Time between each turn in milliseconds. Boolean showStats; World world; Rooms worldRooms; //Value in UI. char *worldFile; // From parse_args(). Locator locator; // Initialized after world. Ui *ui; // Must be initialized after the other two. GameStats stats; int *argc; char **argv; // Careful, pointer to original argv, not a copy. int viewportsNum; int humansNumNext; // Next is mostly just a reflection of the UI. // From -name command line argument. Each will be chosen randomly if "". char *humanNames[Locator::HUMANS_MAX]; int enemiesNumNext; // What appears on the Ui. #if WIN32 UIsettings::SOUNDTRACKTYPE musictype; //play tracks from cd? or MIDI or wav CString mididirectory; #endif Boolean cooperative,cooperativeNext; int sharedLives; // Value shared by all Humans if playing cooperatively. Boolean pause; // Is the game paused. GameState state; Timer timer; // For state transitions. Boolean intelHarmless; int humansPlayingPrev; // Just used for displaying info. int enemiesPlayingPrev; Boolean noItems; // Mostly for testing. Boolean oneEach; char *oneItem; // Only initialize one item if not "". ClassId humanClass; // Choose randomly if A_None. AbilityId humanExtraAbility; Boolean infiniteLives; // the -infinity command-line option Boolean enemiesRefill,enemiesRefillNext; // Keep regenerating enemies. GameObjects gameObjects; Timer refillTimer; GameStyle *style, *styleNext; int enemyNameCount; // Number for next enemy name. E.g. "enemy-8" Boolean quitGame; //set when application must close int level; // Current level. int levelHighest; // Over all games. Boolean noDemo; // Don't do anything during the demo. Boolean startImmediately; // skip the demo completely, start automatically Boolean noLevelTitle; // From command line args. Boolean noUi; // implies observer is True Boolean observer; // No human player for this Role, only for Server. Boolean dedicatedServer; // implies observer is True UIkeyset uiKeyset; Boolean noNewLevel; Boolean fullScreen; int difficulty; // Should never be DIFF_NONE. int difficultyNext; // DIFF_NONE means not specified yet. RoleP role; // client/server/standalone // For choosing names for humans. int intelNamesIndices[INTEL_NAMES_NUM]; // Only used in the awardBonus state. // Stores the string to display on the Ui when the // next level starts. char *levelTitleStored; }; #endif xevil-2.02r2.orig/cmn/game_style.h0100644000175000017500000003774407637233206016410 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // game_style.h #ifndef GAME_STYLE_H #define GAME_STYLE_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif #if X11 #include #endif #if WIN32 #include #endif #include "utils.h" #include "coord.h" #include "world.h" #include "locator.h" #include "intel.h" #define SCENARIO_SEALS_TRAPDOORS 2 #define SCENARIO_BONUS_FROGS 12 #define SCENARIO_FLAG_FLAGS 15 struct IntelOptions; class Human; typedef Human *HumanP; struct PhysicalContext; class IPhysicalManager { public: virtual PhysicalP create_enemy(PhysicalP p,Boolean addToLocator = True) = 0; /* EFFECTS: Create and return new enemy with intelligence. If p is non-NULL, use it as the Physical. Else choose Physical via enemy_physical(void). */ virtual PhysicalP enemy_physical() = 0; virtual PhysicalP enemy_physical(ClassId classId) = 0; virtual PhysicalP enemy_physical(ClassId *classIds,int num) = 0; /* EFFECTS: Ways of creating a Physical for an enemy: 1. Choose randomly. 2. Specify exact class. 3. Choose randomly from a set of classes. */ virtual ITmask intel_options_for(IntelOptions &ops,ClassId classId) = 0; /* EFFECTS: Return appropriate IntelOptions for a specific Class. */ virtual void kill_physical(PhysicalP p) = 0; /* EFFECTS: Remove p from the game silently. */ }; typedef IPhysicalManager *IPhysicalManagerP; class Scenario; typedef Scenario *ScenarioP; class GameStyle { public: GameStyle(); virtual ~GameStyle(); virtual GameStyle *clone() = 0; virtual void describe(ostrstream &) = 0; /* EFFECTS: Write a two-line description of the style to the stream. */ virtual GameStyleType get_type() = 0; static GameStyle *by_type(GameStyleType); /* EFFECTS: Create a new style given the type. */ static Boolean uses_enemies_num(GameStyleType); static Boolean uses_enemies_refill(GameStyleType); /* EFFECTS: Does the specific style use enemiesNum/enemiesRefill? Used for enabling/disabling UI. */ /* NOTE: Sucks that this isn't extendable. */ virtual Boolean class_friends(); /* EFFECTS: Are Enemies classFriends with each other. */ /* DEFAULT: True */ virtual int human_initial_lives(); /* DEFAULT: HUMAN_LIVES */ virtual void set_human_data(HumanP,WorldP,LocatorP); /* DEFAULT: do nothing */ virtual Pos human_initial_pos(WorldP,LocatorP,const Size &s); /* DEFAULT: world.empty_rect(s) */ virtual Boolean can_refill_game_objects(); /* DEFAULT: True */ virtual Boolean need_difficulty(int enemiesNumNext); /* DEFAULT: True */ virtual char *can_reset(int humansNumNext,int enemiesNumNext, Boolean cooperative); /* EFFECTS: Can this GameStyle be used with the given settings. Return error message if not, must free return value. DEFAULT: return NULL. */ virtual void reset(WorldP,LocatorP,const DifficultyLevel &, int enemiesNumNext) = 0; /* EFFECTS: Start a new game. */ virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level, Boolean &lStrChanged,ostrstream &levelStr, Timer &timer, IPhysicalManagerP); /* MODIFIES: lStrChanged */ /* EFFECTS: Return -1 to continue with current level, 0 to immediately start a new level, 1 to start a new level after a few turns. Use levelStr to set Ui::set_level() and mark lStrChanged as True. lStrChanged will always be passed in as False. Timer is the game's Timer for the current state. level is the current level. DEFAULT: Return 0 if Timer has expired, else -1. */ virtual Boolean game_over_check(int humansPlaying,int enemiesPlaying); /* DEFAULT: True if humansPlaying == 0. */ virtual Boolean advance_level(); /* EFFECTS: Should we increment the level number counter when we start the next level. */ /* DEFAUlT: True */ virtual Boolean award_bonus(); /* EFFECTS: Should we award all humans a bonus when they beat this level. A bonus will never be awarded if advance_level() returns False. */ /* DEFAULT: False */ virtual void new_level(int level,WorldP,LocatorP, const DifficultyLevel &dLevel, ostrstream &levelStr,ostrstream &levelTitleStr, IPhysicalManagerP,int humansNum) = 0; /* MODIFIES: level */ /* EFFECTS: Start a new level. Use levelStr levelTitleStr to set the messages for the user. dontAdvance is the result passed out of new_level_check(). Must call world.reset() and clean out any Physicals hanging around from last level. For the very first level, level will be -1 at the start of this call. So, the first level played will be level 0. */ virtual void new_level_set_timer(Timer &timer); /* MODIFIES: timer */ /* EFFECTS: After getBearings time, set a timer for the level if desired. */ /* DEFAULT: timer.set(LEVEL_TIME) */ virtual void refill_enemies(Boolean enemiesRefill,WorldP,LocatorP, IPhysicalManagerP) = 0; /* EFFECTS: Refill enemies in the Game. enemiesRefill is the preference setting. */ virtual void filter_weapons_and_other_items(LocatorP,int &weaponsNum, const PhysicalContext * weapons[A_CLASSES_NUM], int &oItemsNum, const PhysicalContext * oItems[A_CLASSES_NUM]); /* REQUIRES: weapons[] and oItems[] both have space for A_CLASSES_NUM elements. */ /* EFFECTS: The complete set of possible weapons and other items is passed in. Change the lists to determine which weapons/items are acceptable candidates for the level. */ /* MODIFIES: weaponsNum,weapons,oItemsNum,oItems */ /* DEFAULT: Do nothing. */ virtual unsigned int get_soundtrack(); /* DEFAULT: IDW_SOUNDTRACK */ virtual SoundName get_midisoundtrack(); /* DEFAULT: SOUND_RANDOM */ #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual void clean_physicals(Boolean doMinimum,WorldP,LocatorP, IPhysicalManagerP); /* EFFECTS: Deal with existing Physicals in the locator, possibly killing them or moving them to stay inside the world. doMinimum=True means try to leave everything alone, just relocate players if necessary. doMimimum=False means kill everything except human players, relocate humans if necessary. */ private: enum {KILL_OFF,RELOCATE,LEAVE_ALONE}; int partition(PhysicalP p,Boolean doMinimum,WorldP,LocatorP); /* EFFECTS: Return KILL_OFF, RELOCATE, or LEAVE_ALONE to determine what should happen to the Physical during clean_physicals(). Does not deal with followers. */ void get_followers_recursive(PtrList& leaveAlone,PhysicalP p); /* MODIFIES: leaveAlone */ /* EFFECTS: Append to leaveAlone all followers of p and of p's followers. (Does not append p itself.) */ }; typedef GameStyle *GameStyleP; // Levels, except put in a scenario every few levels. class Normal : public GameStyle { public: Normal(); ~Normal(); virtual GameStyleP clone(); virtual void describe(ostrstream &); virtual GameStyleType get_type(); virtual int human_initial_lives(); virtual void set_human_data(HumanP,WorldP,LocatorP); virtual Pos human_initial_pos(WorldP,LocatorP,const Size &s); virtual Boolean can_refill_game_objects(); virtual char *can_reset(int humansNumNext,int enemiesNumNext, Boolean cooperative); virtual void reset(WorldP,LocatorP,const DifficultyLevel &, int enemiesNumNext); virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged, ostrstream &levelStr,Timer &timer, IPhysicalManagerP); virtual Boolean advance_level(); virtual Boolean award_bonus(); virtual void new_level(int level,WorldP,LocatorP,const DifficultyLevel &dLevel, ostrstream &levelStr,ostrstream &levelTitleStr, IPhysicalManagerP,int humansNum); virtual void new_level_set_timer(Timer &timer); virtual void refill_enemies(Boolean enemiesRefill,WorldP,LocatorP,IPhysicalManagerP); virtual unsigned int get_soundtrack(); virtual SoundName get_midisoundtrack(); private: GameStyleP get_delegate() {if (playScenarios) return scenarios; else return levels;} Boolean playScenarios; GameStyleP levels; GameStyleP scenarios; }; class Levels : public GameStyle { public: Levels(); virtual GameStyleP clone(); virtual void describe(ostrstream &); virtual GameStyleType get_type(); virtual char *can_reset(int humansNumNext,int enemiesNumNext,Boolean cooperative); virtual void reset(WorldP,LocatorP,const DifficultyLevel &,int enemiesNumNext); virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP); virtual void new_level(int level,WorldP,LocatorP,const DifficultyLevel &dLevel, ostrstream &levelStr,ostrstream &levelTitleStr, IPhysicalManagerP,int humansNum); virtual void new_level_set_timer(Timer &timer); virtual void refill_enemies(Boolean enemiesRefill,WorldP,LocatorP,IPhysicalManagerP); virtual unsigned int get_soundtrack(); private: int enemiesNum; // Incremented each level. }; class KillKillKill : public GameStyle { public: KillKillKill(); virtual GameStyleP clone(); virtual void describe(ostrstream &); virtual GameStyleType get_type(); virtual Boolean class_friends(); virtual Boolean need_difficulty(int enemiesNumNext); virtual char *can_reset(int humansNumNext,int enemiesNumNext,Boolean cooperative); virtual void reset(WorldP,LocatorP,const DifficultyLevel &dLevel,int ); virtual Boolean game_over_check(int humansPlaying,int enemiesPlaying); virtual void new_level(int level,WorldP,LocatorP,const DifficultyLevel &dLevel, ostrstream &levelStr,ostrstream &levelTitleStr, IPhysicalManagerP,int humansNum); virtual void refill_enemies(Boolean enemiesRefill,WorldP,LocatorP,IPhysicalManagerP); virtual SoundName get_midisoundtrack(); private: Boolean justReset; // After reset(), before new_level(). int enemiesNum; // Stays constant. }; class Duel : public GameStyle { public: Duel(); virtual GameStyleP clone(); virtual void describe(ostrstream &); virtual GameStyleType get_type(); virtual Boolean need_difficulty(int enemiesNumNext); virtual char *can_reset(int humansNumNext,int enemiesNumNext,Boolean cooperative); virtual void reset(WorldP,LocatorP,const DifficultyLevel &dLevel,int ); virtual Boolean game_over_check(int humansPlaying,int enemiesPlaying); virtual void new_level(int level,WorldP,LocatorP,const DifficultyLevel &dLevel, ostrstream &levelStr,ostrstream &levelTitleStr, IPhysicalManagerP,int humansNum); virtual void refill_enemies(Boolean enemiesRefill,WorldP,LocatorP,IPhysicalManagerP); private: Boolean justReset; // After reset(), before new_level(). int enemiesNum; // Stays constant. }; class ExtendedDuel : public GameStyle { public: ExtendedDuel(); virtual GameStyleP clone(); virtual void describe(ostrstream &); virtual GameStyleType get_type(); virtual int human_initial_lives(); virtual Boolean need_difficulty(int enemiesNumNext); virtual char *can_reset(int humansNumNext,int enemiesNumNext,Boolean cooperative); virtual void reset(WorldP,LocatorP,const DifficultyLevel &dLevel,int ); virtual Boolean game_over_check(int humansPlaying,int enemiesPlaying); virtual void new_level(int level,WorldP,LocatorP,const DifficultyLevel &dLevel, ostrstream &levelStr,ostrstream &levelTitleStr, IPhysicalManagerP,int humansNum); virtual void refill_enemies(Boolean enemiesRefill,WorldP,LocatorP,IPhysicalManagerP); private: Boolean justReset; // After reset(), before new_level(). int enemiesNum; // Stays constant. }; class Training : public GameStyle { public: Training(); virtual GameStyleP clone(); virtual void describe(ostrstream &); virtual GameStyleType get_type(); virtual Boolean need_difficulty(int enemiesNumNext); virtual void reset(WorldP,LocatorP,const DifficultyLevel &dLevel,int); virtual void new_level(int level,WorldP,LocatorP,const DifficultyLevel &dLevel, ostrstream &levelStr,ostrstream &levelTitleStr, IPhysicalManagerP,int humansNum); virtual void refill_enemies(Boolean enemiesRefill,WorldP,LocatorP,IPhysicalManagerP); }; class Scenarios : public GameStyle { public: Scenarios(); virtual ~Scenarios(); virtual GameStyleP clone(); virtual void describe(ostrstream &); virtual GameStyleType get_type(); virtual Boolean class_friends(); virtual int human_initial_lives(); virtual void set_human_data(HumanP,WorldP,LocatorP); virtual Pos human_initial_pos(WorldP,LocatorP,const Size &s); virtual Boolean can_refill_game_objects(); virtual char *can_reset(int humansNumNext,int enemiesNumNext,Boolean cooperative); virtual void reset(WorldP,LocatorP,const DifficultyLevel &,int enemiesNumNext); virtual int new_level_check(int enemiesPlaying,WorldP,LocatorP, int level,Boolean &lStrChanged,ostrstream &levelStr,Timer &timer, IPhysicalManagerP); virtual Boolean advance_level(); virtual Boolean award_bonus(); virtual void new_level(int level,WorldP,LocatorP,const DifficultyLevel &dLevel, ostrstream &levelStr,ostrstream &levelTitleStr, IPhysicalManagerP manager,int humansNum); virtual void new_level_set_timer(Timer &timer); virtual void refill_enemies(Boolean enemiesRefill,WorldP,LocatorP,IPhysicalManagerP); static void set_override(char *val); /* EFFECTS: If set, always choose the given scenario. Don't ever delete the passed in value, not copied. */ virtual void filter_weapons_and_other_items(LocatorP,int &weaponsNum, const PhysicalContext *weapons[], int &oItemsNum, const PhysicalContext *oItems[]); virtual unsigned int get_soundtrack(); virtual SoundName get_midisoundtrack(); static Boolean dog_team(LocatorP,PhysicalP p1,PhysicalP p2); /* EFFECTS: Team composed of all enemy dogs. */ /* NOTE: Left public so that Game can reuse this team definition. Not the best place to put it, but slightly better than just making a global function. */ private: void choose_scenario(); /* EFFECTS: Delete old scenario and create a new one. Works even if scenario is NULL. */ ScenarioP scenario; static char *override; }; #endif xevil-2.02r2.orig/cmn/id.h0100644000175000017500000000377607041422162014637 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "id.h" Object locator id. #ifndef ID_H #define ID_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif #include "streams.h" class Identifier { public: void read(InStreamP in); static int get_write_length(); void write(OutStreamP out) const; Boolean operator == (const Identifier &other) const; Boolean operator != (const Identifier &other) const; /* NOTE: Two INVALID Identifiers are not equal to each other. */ void invalidate() {index = INVALID;} /* EFFECTS: Guarantees that the Identifier is invalid. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif Identifier(); Identifier(InStreamP in) {read(in);} enum {INVALID = -1}; int index; int unique; }; class Id: public Identifier { friend class Locator; public: Id() {} Id(InStreamP in) : Identifier(in) {} }; class IntelId: public Identifier { friend class Locator; public: IntelId() {} IntelId(InStreamP in) : Identifier(in) {} }; class MoverId: public Identifier { friend class World; public: MoverId() {} MoverId(InStreamP in) : Identifier(in) {} }; typedef u_int CompositeId; #define COMPOSITE_ID_NONE 0xffffffff; #endif xevil-2.02r2.orig/cmn/intel.h0100644000175000017500000004275107041422162015352 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "intel.h" #ifndef INTEL_H #define INTEL_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif // Include Files #include "utils.h" #include "coord.h" #include "id.h" #include "locator.h" #include "world.h" // Intel options defines #define ITnone 0L #define ITharmless (1L<<0) #define ITclassFriends (1L<<1) #define ITpsychotic (1L<<2) #define ITignoreItems (1L<<3) #define ITlimitedLifespan (1L<<4) typedef unsigned long ITmask; // Defines #define IT_STRING_LENGTH 80 #define IT_INFINITE_LIVES -1 // Range that machine (and human for WIN32) players can see. #define IT_VISION_RANGE 500 class Physical; typedef Physical *PhysicalP; class Holder; typedef Holder *HolderP; class Modifier; typedef Modifier *ModifierP; struct IntelOptions { // Do not attack members of same class. Boolean classFriends; // Will not attack even if it has the ability to do so. Boolean harmless; // Will never run away. harmless overrides psychotic. Boolean psychotic; // Don't try to pick up items. Boolean ignoreItems; // Only for DoppelIntel and children. // If non-zero, kill self after fixed number of turns. int limitedLifespan; }; // IntelStatus used by ui. // Remember Intel::die struct IntelStatus { // strings and ClassIds must be kept consistent. char name[IT_STRING_LENGTH]; ClassId classId; char className[IT_STRING_LENGTH]; Health health; // -1 means dead. Health healthmax;//for health bar in windows version Mass mass; ClassId weaponClassId; char weapon[IT_STRING_LENGTH]; Boolean weaponReady; int ammo; ClassId itemClassId; char item[IT_STRING_LENGTH]; int itemCount; // Number of the item. int lives; // Can be IT_INFINITE_LIVES. int humanKills; int enemyKills; int soups; // Human killed by something other than a human. Only looked at // when game style is UIsettings::DUEL. void read(InStreamP); int get_write_length(); void write(OutStreamP); /* EFFECTS: IO functions. */ Boolean operator == (const IntelStatus&); /* EFFECTS: Member-wise comparison. */ }; // Class Definitions. class Intel { public: Intel(WorldP w,LocatorP l,char *name, const IntelOptions *ops,ITmask opMask); /* EFFECTS: Create a new intel with the options specified in opMakse that are in ops. ops will never be referenced if opMask is ITnone. lives now dealt with in class Human. */ Intel(InStreamP,WorldP,LocatorP); Boolean creation_ok() {return creationOk;} virtual void update_from_stream(InStreamP); virtual int get_write_length(); virtual void write(OutStreamP); virtual ~Intel(); virtual Boolean is_human(); /* NOTE: is_machine() == (!is_human()). */ virtual Boolean is_enemy(); /* NOTE: is_neutral() == (!is_human() && !is_enemy()). */ virtual Boolean is_seal_intel(); virtual Boolean is_pet(); Boolean alive() {return living;} WorldP get_world() {return world;} LocatorP get_locator() {return locator;} const Id &get_id() {return id;} /* NOTE: If dead, return an invalid id. */ Boolean reincarnate_me(); /* EFFECTS: Should *this be reincarnated. */ Boolean intel_status_changed() {return intelStatusChanged;} void make_intel_status_dirty() {intelStatusChanged = True;} /* EFFECTS: Force a redraw on the UI. Used for shared lives. */ const IntelStatus *get_intel_status(); const char *get_name() {return intelStatus.name;} int get_lives() {return _get_lives();} // Can be IT_INFINITE_LIVES. int get_human_kills() {return intelStatus.humanKills;} int get_enemy_kills() {return intelStatus.enemyKills;} int get_soups() {return intelStatus.soups;} /* NOTE: Could achieve the same thing with get_intel_status. Convenience functions. */ Boolean is_playing(); /* EFFECTS: Is the intel still playing in the game, i.e. either living or dead but with extra lives left. */ IntelId get_killer_intel_id() {return killerIntelId;} IntelId get_intel_id() {return intelId;} IntelId get_dont_collide() {return dontCollide;} /* NOTE: Used by Locator. */ ModifierP get_modifiers() {return modifiers;} /* EFFECTS: Return modifier list for this intel. Never returns NULL. This is not a copy, mutate the list to add modifiers to the intel. */ void set_dont_collide(const IntelId &val) {dontCollide = val;} /* EFFECTS: Locator will not allow the physical with this intel to collide with the physical with the intel dontCollide. */ void set_id(const Id &i) {id = i;} /* REQUIRES: i is valid. */ /* NOTE: Only needed for Physical::set_intel. id is updated on every clock. */ void set_lives(int lives) {_set_lives(lives); intelStatusChanged = True;} /* NOTE: Can be IT_INFINITE_LIVES. */ void set_name(char *name); /* NOTE: Used by Server to set the name provided by the client. */ virtual void add_human_kill(); virtual void add_enemy_kill(); virtual void add_soup(); void set_killer_intel_id(const IntelId &k) {killerIntelId = k;} void set_intel_id(const IntelId &i) {intelId = i;} /* NOTE: Should only be used by the Locator. */ static ITcommand dir_to_command(Dir dir); /* REQUIRES: dir is a "pure" direction or CO_air. */ /* NOTE: CO_air -> IT_CENTER. */ static ITcommand dir_to_command_weapon(Dir dir); static Dir command_weapon_to_dir_4(ITcommand); static Dir command_weapon_to_dir_8(ITcommand); /* EFFECTS: If command is a weapon command return the corresponding Dir. */ /* NOTE: Like Gun::compute_weapon_dir. */ static Boolean is_command_weapon(ITcommand command) {return (command >= IT_WEAPON_R && command <= IT_WEAPON_UP_R) || command == IT_WEAPON_CENTER;} static ITcommand center_pos_to_command(const Pos &pos); /* EFFECTS: Returns the command corresponding to the direction from (0,0) to pos. */ /* NOTE: pos can have negative components. */ static Size command_to_size(ITcommand command,int mag); /* EFFECTS: Change all commands to a Size where each coordinate has length -mag,0, or mag. All weapon or item commands give (0,0). E.g. IT_L will return (-mag,0), IT_DN_R gives (mag,mag). */ #if 0 virtual IntelP compatible_composite(IntelP intel) = 0; /* EFFECTS: If intel is a legal intel to be a member of the same composite object as this, return NULL. Else, create and return a new intel that is compatible. */ #endif void die(); /* EFFECTS: Tell *this that it no longer has anything clocking it. */ /* NOTE: This MUST be called at death. Game requires it to refill enemy players. */ void reincarnate(); /* EFFECTS: Tell *this that it will be clocked again. */ virtual void clock(PhysicalP p); /* NOTE: Should be called by Intel's children. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif const IntelOptions &get_intel_options() {return intelOptions;} virtual int _get_lives(); virtual void _set_lives(int); /* EFFECTS: Allow children to override behavior of lives. */ void creation_failed() {creationOk = False;} private: IntelStatus intelStatus; // intelStatus.lives is not used here. Boolean intelStatusChanged; // Since last get_intel_status. Boolean living; WorldP world; LocatorP locator; Id id; IntelId killerIntelId; // Intel that most recently attacked the Intel. IntelId intelId; IntelOptions intelOptions; IntelId dontCollide; ModifierP modifiers; Boolean creationOk; const static IntelOptions intelOptionsDefault; }; typedef Intel *IntelP; // Simply buffers input from a user interface. class Human: public Intel { public: Human(WorldP w,LocatorP l,char *name,int lives, int *sharedLives,ColorNum colorNum); /* NOTE: Uses all default options. intelOptions should be meaningless for a human. If "sharedLives" is non-null, ignore "lives" and share the lives. */ Human(InStreamP,WorldP,LocatorP); virtual void update_from_stream(InStreamP); void _update_from_stream(InStreamP); virtual int get_write_length(); virtual void write(OutStreamP); ColorNum get_color_num() {return colorNum;} virtual Boolean is_human(); void set_command(ITcommand c); /* EFFECTS: Asynchronously set the command for the current turn to be c. Overrides previous settings. */ ITcommand get_command() {return command;} /* EFFECTS: Return the most recently set command. */ virtual void clock(PhysicalP p); /* EFFECTS: Sets the command for p. */ void set_data(void *d) {data = d;} void *get_data() {return data;} /* NOTE: Generic data used by Game. E.g. for depth in ZIG-ZAG. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual int _get_lives(); virtual void _set_lives(int); /* NOTES: Allow for shared lives. */ private: void *data; ITcommand command; ColorNum colorNum; int lives; int *sharedLives; ITcommand noRepeat; // The command that can't be repeated. }; typedef Human *HumanP; class Machine: public Intel { public: Machine(WorldP w,LocatorP l,char *name, const IntelOptions *ops,ITmask opMask); virtual IntelId get_master_intel_id(); /* EFFECTS: If a slave, return the IntelId of the master. Otherwise, return an invalid IntelId. */ virtual void clock(PhysicalP); /* NOTE: Not called by Machine's children. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif enum Strategy { doNothing, toPos, // Move toward targetPos. toTarget, // Move toward Physical targetId awayTarget, // Move away from Physical targetId attackTarget, // like toTarget, but attack if possible retreatTarget, // like awayTarget, but attack if possible toDir, // Move in direction targetDir }; Strategy get_strategy() {return strategy;} Timer &get_strategy_change() {return strategyChange;} /* EFFECTS: Return the timer that controls when to change strategy. */ virtual int _get_reflexes_time(); /* EFFECTS: Override this to set reflexes. */ Boolean strategy_uses_target_id() {return strategy == toTarget || strategy == awayTarget || strategy == attackTarget || strategy == retreatTarget;} Id get_target_id() {assert(strategy_uses_target_id()); return targetId;} void set_doNothing() {strategy = doNothing;} void set_toPos(const Pos &pos) {strategy = toPos; targetPos = pos;} void set_toTarget(const Id &id) {strategy = toTarget; targetId = id;} void set_awayTarget(const Id &id) {strategy = awayTarget; targetId = id;} void set_attackTarget(const Id &id) {strategy = attackTarget; targetId = id;} void set_retreatTarget(const Id &id) {strategy = retreatTarget; targetId = id;} void set_toDir(Dir dir) {strategy = toDir; targetDir = dir;} /* EFFECTS: Mutators to set the strategy. */ /* NOTE: Designed so that no more that one of {targetPos,targetId,targetDir} is set at once. And that one corresponds to the strategy. */ /* NOTE: Not necessarirly called in the choose_strategy phase. */ virtual void choose_strategy(PhysicalP); /* EFFECTS: Sets the strategy. May use or set the strategyChange timer. */ PhysicalP choose_target(Boolean &isEnemy,PhysicalP p,int range); /* MODIFIES: isEnemy */ /* EFFECTS: Return a new target for p (within range distance). Sets isEnemy to True iff returned pointer is an enemy (as opposed to an item). Returns NULL if no suitable target found. */ /* NOTE: Doesn't set targetId or strategy. */ /* NOTE: Not virtual, but can be called by children inside choose_strategy(). */ virtual Boolean filter_target(PhysicalP p); /* EFFECTS: Used by children to filter out things the Machine shouldn't set as the target. Return whether p is a valid target. */ /* NOTE: Can call up the tree. */ static Boolean attack_target(PhysicalP p,PhysicalP target); static Boolean move_target(PhysicalP p,PhysicalP target,Timer &ladderJump); static Boolean away_target(PhysicalP p,PhysicalP target,Timer &ladderJump); static Boolean move_pos(PhysicalP p,const Pos &targetPos,Timer &ladderJump); static Boolean move_dir(PhysicalP p,Dir d,Timer &ladderJump); /* REQUIRES: p and target must be non-NULL. */ /* REQUIRES: d is an element of {CO_R..CO_UP_R,CO_air} */ /* EFFECTS: The above are all utility functions that attempt to set the command for p to do something. Returns whether the command was set or not. */ /* IMPLEMENTATION NOTE: Declared static to ensure that no data members of Machine are used in these utility functions. */ static Boolean has_gun(HolderP); static Boolean has_cutter(HolderP); static Boolean has_shield(HolderP); static Boolean has_drugs(HolderP); static Boolean has_item(HolderP,ClassId); static Boolean weapon_current_is_gun(HolderP); static Boolean weapon_current_is_cutter(HolderP); /* EFFECTS: Return info about a Holder. */ static Boolean weapon_current_is_drop_liftable(PhysicalP); /* NOTE: Semi-hack to check for dropping Liftables. */ private: void use_items(Boolean &commandSet,PhysicalP p); /* EFFECTS: Called in Machine::clock(), choose which item to use and use it. Weapons are used in attack_target(). p is the Physical this is controlling. */ /* MODIFIES: commandSet */ Strategy strategy; Timer strategyChange; // Only one of the following three is valid. Pos targetPos; Id targetId; Dir targetDir; Timer reflexes; Timer ladderJump; // don't get back on ladder immediately after jumping off. }; typedef Machine *MachineP; class Enemy: public Machine { public: Enemy(WorldP w,LocatorP l,char *name, const IntelOptions *ops,ITmask opMask); static void set_reflexes_time(int time) {reflexesTime = time;} static int get_reflexes_time() {return reflexesTime;} /* EFFECTS: How fast machines react. 1 means every turn. 2 is every other turn, etc. */ virtual Boolean is_enemy(); #ifndef PROTECTED_IS_PUBLIC protected: #endif int _get_reflexes_time(); /* NOTE: To pass info to Machine. */ private: static int reflexesTime; }; typedef Enemy *EnemyP; class Neutral: public Machine { public: Neutral(WorldP w,LocatorP l,char *name, const IntelOptions *ops,ITmask opMask); virtual Boolean is_enemy(); }; typedef Neutral *NeutralP; class SealIntel: public Neutral { public: SealIntel(WorldP w,LocatorP l,char *name,const Id &homeId); virtual Boolean is_seal_intel(); #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual void choose_strategy(PhysicalP); /* EFFECTS: Sets the strategy. May use or set the strategyChange timer. */ private: Id homeId; }; class DoppelIntel: public Neutral { public: DoppelIntel(WorldP w,LocatorP l,char *name, const IntelOptions *ops,ITmask opMask, IntelP master = NULL); virtual IntelId get_master_intel_id(); virtual void add_human_kill(); virtual void add_enemy_kill(); virtual void add_soup(); virtual void clock(PhysicalP); static IntelOptions suggestedOptions; static ITmask suggestedMask; #ifndef PROTECTED_IS_PUBLIC protected: #endif void set_master_intel_id(const IntelId &id) {masterIntelId = id;} virtual void choose_strategy(PhysicalP p); /* EFFECTS: Filters out the master or other objects controlled by the same master. */ /* NOTE: p is the Physical this is controlling. */ virtual Boolean filter_target(PhysicalP candidate); PhysicalP lookup_and_compute_dist_2(int &dist_2, PhysicalP p,const Id &id); /* EFFECTS: A helper routine. If both p and Locator::lookup(id) are non-NULL. Return the result of looking up id, and set dist_2 to be the square of the distance between the two. Else return NULL. */ /* MODIFIES: dist_2 */ private: Timer suicideTimer; IntelId masterIntelId; }; // Pet acts like a finite state machine with four states, // Heel, Return, Seek, and Attacking. Transitions are implemented // in choose_strategy() and go_get_em(). class Pet: public DoppelIntel { public: Pet(WorldP w,LocatorP l,char *name, const IntelOptions *ops,ITmask opMask, IntelP master = NULL); Boolean is_pet(); void go_get_em(PhysicalP p,ITcommand command); /* EFFECTS: p is ordering the pet to attack in the specified direction if IT_WEAPON_{some dir}, or to come back to him if command is IT_WEAPON_CENTER. This will also set p to be the new master. */ static char *mode_string(int mode); /* NOTE: For debugging. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual int _get_reflexes_time(); virtual void choose_strategy(PhysicalP p); virtual Boolean filter_target(PhysicalP candidate); private: enum {Heel, Returning, Seek, Attacking}; enum {RETURN_TIME = 500, HEEL_RADIUS = 18, ATTACK_RADIUS = 100, GIVE_UP_ATTACK_RADIUS = 400}; // Squares of distances used for comparisons. enum {HEEL_RADIUS_2 = HEEL_RADIUS * HEEL_RADIUS, ATTACK_RADIUS_2 = ATTACK_RADIUS * ATTACK_RADIUS, GIVE_UP_ATTACK_RADIUS_2 = GIVE_UP_ATTACK_RADIUS * GIVE_UP_ATTACK_RADIUS}; int mode; }; typedef Pet *PetP; #endif xevil-2.02r2.orig/cmn/l_agreement.h0100644000175000017500000000650207041421712016513 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "l_agreement.h" #ifndef L_AGREEMENT_H #define L_AGREEMENT_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif #include "utils.h" class Xvars; // Holds one line of text. class Line { public: Line(const char **textRet,const char *text); /* EFFECTS: Parse text into a line of text, set textRet to be the next char in the "input stream". */ const char* get_text(int &lngth) {lngth = length; return start;} /* MODIFIES: length */ /* EFFECTS: Return the line of text. Not NULL terminated, use "length" instead. */ char* alloc_text(); /* EFFECTS: Returns a new copy of the text for this line, null-terminated. Free memory with "delete []" when done. */ static void set_text_columns(int val) {textColumns = val;} static int get_text_columns() {return textColumns;} private: // Format to this number of columns. static int textColumns; const char *start; int length; }; // One page of the license agreement. class Page { public: Page(const char **textRet,const char *text); /* EFFECTS: Parse text into a page of lines, set textRet to be the next char in the "input stream". If textRet is NULL, put all text in one page. */ ~Page(); static void set_text_rows(int val) {textRows = val;} static int get_text_rows() {return textRows;} const PtrList&get_lines() {return lines;} /* EFFECTS: Return the list of lines in this page. */ private: PtrList lines; static int textRows; }; class LAgreement { public: #if X11 static Boolean check_accepted(Boolean& largeViewport, Boolean& smoothScroll, Boolean& reduceDraw, Xvars&,int dpyNum, int argc,char** argv); /* MODIFIES: largeViewport, smoothScroll, reduceDraw */ /* EFFECTS: Run modal dialog to force the user to read the license agreement and accept/reject it. Initialize checkbox with value of largeViewport, smoothScroll. On return, set largeViewport, smoothScroll to the final value of the checkbox. */ /* NOTE: Body of this function lives in l_agreement_dlg.cpp */ #endif static void comm_line_accepted() {commLineAccepted = True;} /* EFFECTS: User accepted license agreement with the command line. */ static const char *get_text(); /* EFFECTS: Return the text of the license agreement. Guaranteed to be in static memory. */ private: static Boolean commLineAccepted; }; #endif xevil-2.02r2.orig/cmn/locator.h0100644000175000017500000007425507637234622015723 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "locator.h" The object locator. /* Overview: The locator can be seen as the collection of all physical objects in the game. It draws all objects with the draw method. The clock method goes through all the phases of one turn for all objects. This is the only entity in the game that has a list of all the objects. Objects can be mapped and/or collidable. An unmapped object is neither drawn nor collided. An uncollidable object is drawn (if mapped) but not collided. There is a message queue that objects can use to communicate with the ui object. The locator does not need to be clocked for the queue to work. The locator grid is the maximum size of the world. I.e. it can be larger than the world. */ #ifndef LOCATOR_H #define LOCATOR_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif // Include Files #include #include "utils.h" #include "coord.h" #include "id.h" #include "world.h" #include "sound_cmn.h" #include "xdata.h" class Intel; typedef Intel *IntelP; class Physical; typedef Physical *PhysicalP; struct PhysicalContext; class Human; typedef Human *HumanP; class Enemy; typedef Enemy *EnemyP; class Neutral; typedef Neutral *NeutralP; class SoundManager; class SoundRequest; // Maximum number of objects in the game. // Should replace this static size array with the new PtrList class. #define OL_LIST_MAX 2000 #define OL_NEARBY_MAX OL_LIST_MAX #define OL_MESSAGES_MAX 300 // Details of the object grid, each grid cell will have size // (OL_GRID_COL_MAX,OL_GRID_ROW_MAX) in WSQUARES. #define OL_GRID_COL_MAX 4 #define OL_GRID_ROW_MAX 4 #define OL_GRID_WIDTH (OL_GRID_COL_MAX * WSQUARE_WIDTH) // In pixels. #define OL_GRID_HEIGHT (OL_GRID_ROW_MAX * WSQUARE_HEIGHT) // In pixels. #define OL_GRID_SIZE_MAX (Utils::maximum(OL_GRID_WIDTH,OL_GRID_HEIGHT)) #define OL_GRID_SIZE_MIN (Utils::minimum(OL_GRID_WIDTH,OL_GRID_HEIGHT)) // Max size of world in grid squares. #define OL_GRID_HORIZ_MAX (W_COL_MAX_MAX / OL_GRID_COL_MAX + 1) #define OL_GRID_VERT_MAX (W_ROW_MAX_MAX / OL_GRID_ROW_MAX + 1) #define OL_RECENT_SOUNDS_MAX 30 // An entry for one object in the list of all objects currently in the game. class OLentry { friend class Locator; friend class OLgridEntry; #if X11 friend class OLshadowEntry; #endif friend class PhysicalIter; // Only valid if mapped || flash. OLgridEntry *gridEntry; // Set by OLgridEntry::insert. Not nec. valid. GLoc gloc; #if X11 // Only valid if mapped || flash. OLshadowEntry *shadowEntry; // Set by OLshadowEntry::insert. Not nec. valid. GLoc shadowGloc; #endif Boolean valid; Boolean reserved; // Meaningful when !valid. PhysicalP physical; // Set when reserved. Boolean collided; Boolean mapped; // Redundant. Must be same as in object. Boolean flash; // Redundant. Must be same as in object. Boolean collidable; // Used to control the drawing order for Composite objects, in draw_chain(). // Only used one viewport at a time. Boolean alreadyDrawn; }; // The entry in the object grid, mostly a forwarding pointer to the OLentry // for the object. class OLgridEntry { public: OLgridEntry(OLentry *e); OLentry *get_entry() {return entry;} PhysicalP get_physical() {return entry->physical;} Boolean get_collided() {return entry->collided;} Boolean get_mapped() {return entry->mapped;} Boolean get_flash() {return entry->flash;} #if X11 OLshadowEntry *get_shadow_entry() {return entry->shadowEntry;} #endif const Area &get_area(); #if X11 // Used for the merge_draw_areas() algorithm. // Completely different than the alreadyDrawn flag in the OLEntry. Boolean get_was_drawn() {return wasDrawn;} void set_was_drawn(Boolean val) {wasDrawn = val;} #endif int get_drawing_level(); Boolean get_collidable() {return entry->collidable;} OLgridEntry *get_next() {return next;} void set_collided(Boolean val) {entry->collided = val;} void insert(OLgridEntry *grid[OL_GRID_VERT_MAX][OL_GRID_HORIZ_MAX], const GLoc &gl); void remove(); private: OLgridEntry *prev, *next; OLentry *entry; #if X11 // Used for the merge_draw_areas() algorithm. // Completely different than the alreadyDrawn flag in the OLEntry. Boolean wasDrawn; #endif }; #if X11 // An entry in the shadow grid. An object's shadow represents where it was // last turn, so we can clean up junk left on the window when we draw this // turn. Only used with Locator::draw_buffered(). Shadow's don't mean much // when we are redrawing the entire screen each time. class OLshadowEntry { public: OLshadowEntry(); OLshadowEntry(const Area &a,OLentry *e); Boolean get_orphaned() {return orphaned;} OLentry *get_entry() {assert(entry); return entry;} OLgridEntry *get_grid_entry() {assert(entry); return entry->gridEntry;} const Area &get_area() {return area;} Boolean draw_self() {return drawSelf;} OLshadowEntry *get_next() {return next;} /* NOTE: Several require that the shadowEntry is not orphaned. */ Boolean get_was_drawn() {return wasDrawn;} void set_area(const Area &a) {area = a;} void set_draw_self(Boolean val) {drawSelf = val;} void set_orphaned() {orphaned = True; entry = NULL;} void set_was_drawn(Boolean val) {wasDrawn = val;} void insert(OLshadowEntry *shadows[OL_GRID_VERT_MAX][OL_GRID_HORIZ_MAX], const GLoc &gl); void remove(); private: Boolean orphaned; Area area; Boolean drawSelf; OLentry *entry; OLshadowEntry *prev, *next; // Used for the merge_draw_areas() algorithm. // Completely different than the alreadyDrawn flag in the OLEntry. Boolean wasDrawn; }; //typedef #endif // Iterator to extract all humans to be reincarnated. class Incarnator { public: Incarnator(Locator &l) {n = 0; locator = &l;} HumanP operator () (); /* EFFECTS: Extract next object to be reincarnated. Return NULL if none. The returned HumanP can only be extracted once. */ private: int n; Locator *locator; }; class PhysicalIter { public: PhysicalIter(Locator &l) {n = 0; locator = &l;} PhysicalP operator() (); /* EFFECTS: Yield all Physicals managed by the Locator. */ /* REQUIRES: Must be called outside of Locator::clock. The Locator must not be modified while the PhysicalIter is being used. */ private: int n; Locator *locator; }; class ArenaMessageIter { public: ArenaMessageIter(Locator &l,const IntelId &i); /* NOTES: Only return messages that are visible to Intel i. */ char *next(Boolean &propagate); /* MODIFIES: propagate */ /* EFFECTS: Yield all arena messages in the order they would be returned by arena_message_deq(). Memory returned is still the property of Locator, do not free or hold on to it. */ /* REQUIRES: Don't modify Locator while iterating. */ private: int ptr; Locator *locator; IntelId intelId; }; struct ArenaMessage { char *msg; IntelId intelId; // Meaningful iff exclusive. Boolean exclusive; // Only show message to a specific viewport. Quanta time; // -1 means use default. Boolean propagate; // for Server, should this message go to all clients. }; class TeamOptions { public: // Constructor give default values. TeamOptions() { membersDontCollide = True; } Boolean membersDontCollide; // More options here. }; typedef TeamOptions *TeamOptionsP; // Used by Locator::draw_ticks() to render the tick marks. // Not much point on Windows, but on UNIX we have two different // methods of drawing the tick marks. // // USE: For each display // begin_draw(); // draw_tick for each tick on the display // end_draw() // Do not overlap drawing for different displays, different renderers. class ITickRenderer { public: virtual void begin_draw(int dpyNum) = 0; /* EFFECTS: Get ready to draw the tick marks for given display. */ virtual void end_draw(int dpyNum) = 0; /* EFFECTS: Finished drawing all the tick marks, make sure they are visible on the screen. */ virtual Boolean draw_tick(TickType tt,CMN_DRAWABLE window, Xvars &xvars,int dpyNum, const Size &arenaSize, Dir tickDir,int offset) = 0; /* EFFECTS: Draw one tick mark. The arena has size windowSize. Offset is X or Y depending on the direction given by tickDir. Return whether successful. All values are stretched. */ /* NOTE: window does not necessarily have size arenaSize. Window is whatever was passed into Locator::draw_ticks(). */ }; // Internal to Locator. // Each team is more of a "rule" that says that two Physicals are // on the same team. struct OLTeam { TeamId teamId; TeamOptions options; Boolean (*same_team)(LocatorP,PhysicalP,PhysicalP); }; struct OLItemInfo { Boolean isItem; Boolean isWeapon; CMN_BITS_ID iconId; }; class Locator: public ITickRenderer { friend class Incarnator; friend class PhysicalIter; friend class ArenaMessageIter; public: enum { // HUMANS_MAX currently limited by number of available names. HUMANS_MAX = 70, ENEMIES_MAX = 500, NEUTRALS_MAX = 400, DRAWING_LEVELS = 3, // For set_drawing_algorithm(). DRAW_MERGE_AREAS, DRAW_NO_MERGE }; Locator(WorldP world,int drawingAlgorithm,SoundManager *soundManager); ~Locator(); /* EFFECTS: Create a new object locator with no managed objects. */ static Boolean valid(const GLoc &gl) {return ((gl.vert >= 0) && (gl.horiz >= 0) && (gl.vert < OL_GRID_VERT_MAX) && (gl.horiz < OL_GRID_HORIZ_MAX));} /* EFFECTS: Is gl a loc in the grid. */ void add(PhysicalP p); /* REQUIRES: p is not already managed. */ /* EFFECTS: p will be added to the list of managed physicals at the beginning of the next clock. p is initially mapped. canCollide is set from p. If called inside clock, object will not be added until beginning of next clock. You should not add something twice. p is given a valid Id immediately (not at the next clock). */ void add_as(PhysicalP p,const Id &); /* EFFECTS: Add as the given id. Used by the Client. */ void get_nearby(PhysicalP nearby[OL_NEARBY_MAX],int &nitems, PhysicalP p,int radius); /* MODIFIES: nearby,nitems. */ /* EFFECTS: Returns all objects that have their middles within radius of p's middle. (I.e <= ) */ /* NOTE: Expensive. */ PhysicalP lookup(const Id &id,Boolean recentAdditions = False); /* EFFECTS: Return the physical with the given id if it still exists, else NULL. If recentAdditions is False, will return NULL if Locator has not been clocked since the add(), i.e. the object is not in the grid yet. */ IntelP lookup(const IntelId &iId); /* EFFECTS: Return the human or machine (enemy or neutral) Intel for iId if it exists, is registered, and is alive or reincarnating. (Note that only Humans can be reincarnating.) Otherwise, return NULL. */ #if X11 void draw_buffered(CMN_DRAWABLE window,Xvars &xvars,int dpyNum, const Box &box); /* REQUIRES: win is the same size as Box, in WSQUAREs. Either 1) window has not been changed since last call to draw_buffered. or 2) window has just been freshly draw with the world. */ /* EFFECTS: Draw all objects overlapping box (world coordinates) onto window. Uses a floating-backbuffer algorithm, only drawing small patches that have changed. (0,0) of window corresponds to upper-left of box in the world. */ #endif void draw_directly(CMN_DRAWABLE window,Xvars &xvars,int dpyNum, const Area &area); /* REQUIRES: win is the same size as area, in pixels. */ /* EFFECTS: Draw all objects overlapping area (world coordinates) directly onto window. This method does no buffering. Of course, the caller can use draw_directly() to implement its own back buffer. (0,0) of window corresponds to upper-left of area in the world. */ void draw_ticks(CMN_DRAWABLE window,Xvars &xvars,int dpyNum, const Area &area, const Id &id, ITickRenderer* renderer); /* EFFECTS: Draw tick marks for all objects near id. Use renderer to do the actual drawing. area is in world coordinates. */ void reset(); /* EFFECTS: Prepare for a new game, kill all Physicals, Intels, Teams, Humans, Enemies, Neutrals, and unprocessed messages. */ void level_reset(); /* EFFECTS: Right now, this just cleans out the non-persistent teams. */ void clock(); void client_pre_clock(); void client_post_clock(); /* EFFECTS: Clock everything except the objects. Used by Client. The client may change objects between pre and post clock. */ //---------------------- Message Service ------------------------// void message_enq(char *msg); /* EFFECTS: Enqueue msg in the queue of messages for the ui. Locator will free msg when it is done with it. Message will appear in the message bar at the bottom. */ char *message_deq(); /* EFFECTS: Dequeue the next message off the appropriate message queue or return NULL if the queue is empty. */ char *peek_most_recent_message(); /* EFFECTS: Return the message most recently enqued. Memory is still the property of the Locator and may be deleted later. Return NULL if no messages in the queue. */ void arena_message_enq(char *msg,IntelId *intelId = NULL, Quanta time = -1,Boolean propagate = True); /* EFFECTS: Put msg in the queue to be drawn on the Arena, shoved in the user's face. intelId is non-NULL if only that specific viewport should display the message. If time is not -1, it gives the number of clock ticks for which the message should be displayed. propagate indicates whether this message should be propagated to clients if playing over a network. */ void arena_message_enq(char *msg,PhysicalP p); /* EFFECTS: Convience function. If p has an intel, enq a message for the intel. Else, throw message away. */ Boolean arena_message_deq(char **msg,IntelId &intelId, Quanta &time,Boolean &propagate); /* MODIFIES: msg, intelId, time, propagate */ /* EFFECTS: Dequeue the next message off the appropriate message queue or return NULL if the queue is empty. If returns TRUE, only set the message for the viewport of the given IntelId. On FALSE, set on all viewports. Time will be set to the number of clock ticks for which to display the message, or -1 if the default should be used. */ void set_messages_ignore(Boolean msgIg) {messagesIgnore = msgIg;} /* EFFECTS: While set to True, all enques messages will be immediately discarded. Default is False. */ void clear_all_messages(); /* EFFECTS: Wipes out all messages in both message queues. */ //---------------------- Message Service ------------------------// void set_drawing_algorithm(int alg) {drawingAlgorithm = alg;} /* EFFECTS: Choose between DRAW_MERGE_AREAS and DRAW_NO_MERGE. */ void set_draw_rects(Boolean val) {drawRects = val;} /* EFFECTS: Draw rectangles around areas when copying to screen, for debugging drawing algorithm. */ // Player registry service. Takes responsibility for reincarnation. void register_human(HumanP); // Kept until reset. void register_enemy(EnemyP); // Deleted as needed. void register_neutral(NeutralP); // Deleted as needed. void register_human_as(HumanP); // Kept until reset. /* EFFECTS: Register human using existing intelId of human. Used by Client. */ void unregister_human(const IntelId &); int humans_playing(); int enemies_alive(); int neutrals_alive(); int humans_registered(); /* IMPLEMENTATION NOTE: No longer the same as humansMax. */ HumanP get_human(int n); /* REQUIRES: n < the number of humans registered */ /* NOTE: Does not guarantee any particular order. */ //---------------------- Recently Deleted Service ------------------------// // Recently deleted service also records recently unmapped objects. */ void set_remember_deleted(Boolean); /* EFFECTS: Turn on remembering recently deleted objects. Must be called before using any of these functions. If turned on, must keep calling reset_recently_deleted() or the delList will overflow. */ int get_recently_deleted_num() {assert(useDelList); return delNum;} Id get_recently_deleted(int val) {assert(useDelList && val >= 0 && val < delNum); return delList[val];} void reset_recently_deleted() {assert(useDelList); delNum = 0;} /* EFFECTS: Gives all the objects that were just deleted in the last turn. Call reset_just_deleted() to start counting for next time. */ /* NOTE: The reason we don't just do this in Locator::clock() is that clock() gets called in funny places a few times to get objects inserted at the right time. */ //---------------------- Recently Deleted Service ------------------------// //------------------------ Recent Sounds Service -------------------------// void set_remember_sounds(Boolean); /* EFFECTS: Turn on remembering recently sent sounds. Must be called before using any of these functions. If OL_RECENT_SOUNDS_MAX is exceeded, will start dropping sounds. */ int get_sounds_num() {assert(rememberSounds); return soundsNum;} void get_sound(SoundRequest &request,int index) {assert(rememberSounds && index >= 0 && index < soundsNum); request = sounds[index];} /* MODIFIES: request */ void reset_sounds() {assert(rememberSounds); soundsNum = 0;} /* We could do this in Locator::clock() as it is not that big a deal if we lose a sound or two. */ //------------------------ Recent Sounds Service -------------------------// TeamId add_persistent_team(Boolean (*same_team)(LocatorP,PhysicalP,PhysicalP), TeamOptionsP); /* EFFECTS: Persistent teams will last through Locator::level_reset(), will only be removed at Locator::reset(). */ TeamId add_team(Boolean (*same_team)(LocatorP,PhysicalP,PhysicalP), TeamOptionsP); /* EFFECTS: Add new team defined by the member function. Teams are not mutually exclusive, a Physical can belong to multiple teams. All non-persistent teams are cleared out at reset() or level_reset(). */ /* NOTE: TeamId is no longer used, since we shuffle the arrays around in delete_persistent_team(). */ Boolean same_team(PhysicalP p1,PhysicalP p2) {TeamOptions dummy; return same_team(dummy,p1,p2); } /* EFFECTS: Are the two Physicals on the same team, for any of the teams. */ CMN_DRAWABLE get_scratch_buffer(Pos &pos,Xvars&,int dpyNum); /* MODIFIES: pos */ /* EFFECTS: Return the scratch buffer. Set pos to the offset in the returned CMN_DRAWABLE where the scratch area exists. On UNIX, this is always (0,0). The scratch buffer is exported by the locator for any drawing tricks that objects may want to use to draw themselves. E.g. Cloaks use it. Guaranteed to be as large as the largest object. */ /* TODO: CMN_DRAWABLE on Windows should be made to include the Pos. Or make a new CMN_* type. */ Boolean submitSoundRequest(SoundRequest req); //----------------------- Class Registry Service -------------------------// // Note: To iterate over all classes, you loop from 0 to // A_CLASSES_NUM, calling get_context() on each. Make sure to test for // NULL. const PhysicalContext *get_context(ClassId classId); /* EFFECTS: Return the PhyscialContext of the class with the given ClassId. */ int filter_contexts(const PhysicalContext* contextList[A_CLASSES_NUM], ClassId idList[A_CLASSES_NUM], Boolean (* filter)(const PhysicalContext*,void * closure), void *closure); /* MODIFIES: contextList, idList */ /* EFFECTS: Create a list of all the classes/ids of object for which filter returns True. list should be an array of size A_CLASSES_NUM. Returns the size of list. Either of contextList or idList can be NULL, if one is, it will not be filled in. */ void get_item_info(Boolean &isItem,Boolean &isWeapon, CMN_BITS_ID &iconId,ClassId cId); /* MODIFIES: isItem, isWeapon, bitsId */ /* EFFECTS: Gives weapon/item info about the class corresponding to cId. Don't just use get_context(), because that won't work for "non-existent" classes like A_HandToHand. get_item_info() will handle them. isItem and isWeapon tell whether the class derives from Item and Weapon, respectively. iconId gives an icon appropriate for displaying in a status window (WIN32 only for now). iconId will only be meaninful if isItem or isWeapon is True. */ //----------------------- Class Registry Service -------------------------// void explicit_die(PhysicalP p) {del_now(p);} /* EFFECTS: Kill all traces of p from the Locator, and delete p. */ /* NOTE: Will delete enemy or neutral associated with p if registered with the Locator. */ void init_x(Xvars &,IXCommand,void*); /* EFFECTS: Initialize or reinitialize all graphics info */ TickType compute_tick_type(PhysicalP p,IntelP relativeTo); /* EFFECTS: What type of tick, if any, should be displayed for this Physical. The tick type of p from the perspective of "relativeTo". Return TICK_MAX if none. */ #if WIN32 Boolean generate_xpm(Xvars& xvars,const char* genDir,Boolean halfSize); /* EFFECTS: Output all bitmaps as XPM files to the directory (genDir + "world/"). Return if success. */ #endif //----------------------- ITickRenderer -------------------------// // The locator implements ITickRenderer by drawing tick marks on the // inside edges of the window passed to draw_tick(). This is the only // implementation on WIN32. On UNIX, there is another implementation that // draws tick marks in the border around the window. // // NOTE: We should really move this implementation of // ITickRenderer into the Viewport object (UiPlayer on Win32). virtual void begin_draw(int); virtual void end_draw(int); virtual Boolean draw_tick(TickType tt,CMN_DRAWABLE window,Xvars &xvars,int dpyNum, const Size &windowSize, Dir tickDir,int offset); //----------------------- ITickRenderer -------------------------// private: enum { REINCARNATE_TIME = 70, TEAMS_MAX = 3, // Arbitrary, don't need a team for each human anymore. }; void add_now(PhysicalP); void del_now(PhysicalP); Boolean same_team(TeamOptions &ops,PhysicalP p1,PhysicalP p2); /* MODIFIES: ops */ /* NOTES: Private version of same_team(), except returns the TeamOptions of the team if found. May set ops even if False is returned. */ void allign_flash_and_mapped(int n); /* EFFECTS: Checks to see if physical n has changed its mapped or flash attribute. If so, adjust the mapped attribute in *this. */ /* REQUIRES: n is a valid list index. */ Id reserve_list_entry(PhysicalP p); /* EFFECTS: Reserve an entry in the list for p and return an Id for the entry. */ void collision_checks(); /* EFFECTS: Do collision checks between all registered objects. */ GLoc compute_gloc(PhysicalP); GLoc compute_gloc(const Area &); /* EFFECTS: Compute the location in the grid for a physical or an area. */ /* NOTE: Ok to return invalid gloc. */ #if X11 void merge_draw_area(CMN_DRAWABLE window,Xvars &xvars,int dpyNum, const Box &room,const Area &area,const GLoc &gloc); /* REQUIRES: area is centered at gloc. window is the size of room*/ /* EFFECTS: Crux of the DRAW_MERGE_AREAS drawing algorithm. window corresponds to the room. Opportunistically merge area with any nearby areas that need to be drawn, enlarging area to encompass them. Then draw the merged area and mark the was_rawn() flag. */ void draw_area(CMN_DRAWABLE window,Xvars &xvars,int dpyNum,const Box &room, const Area &area,const GLoc &gloc); /* REQUIRES: area is centered at gloc. window is the size of room*/ /* EFFECTS: Draws world and all objects overlapping area. */ /* NOTE: box does not have to be valid. */ #endif void draw_chain(CMN_DRAWABLE window,Xvars &xvars,int dpyNum, const Area &area,PhysicalP p); /* EFFECTS: Draw p and any objects that must be drawn before it. e.g. Composite objects. */ Boolean possible_overlap(const Area &area,const GLoc &gloc); /* EFFECTS: Returns whether area could overlap any of the areas in gloc. */ void delete_team_data(OLTeam &); /* NOTE: Only frees team data, does not affect size of list. */ // Class registry service. void register_contexts(); void register_context(const PhysicalContext *context); /* EFFECTS: All classes of Physical objects must be registered with register_context in order to be seen by the Game. */ //// phases of clock() #if X11 void kill_shadow_del_list(); /* NOTE: Needed for the X11 drawing algorithm. */ /* EFFECTS: Don't want to actually delete the shadows until the beginning of the next turn and we are sure nothing is still pointing to them. */ void shadows_follow_physicals(); /* EFFECTS: The 'shadows' follow one turn behind the current location of the Physicals. So, we know where the physical was last time to redraw the dirty areas. */ #endif void intelligence_and_act(); /* EFFECTS: Intelligence phase and action phase. Set next variables. Externally visible state should not change (although there are some exceptions). */ void kill_outside_world(); /* EFFECTS: If a Physical gets knocked so far through the wall it ends up outside the world, kill it. */ void kill_excess_objects(); /* EFFECTS: If we get close to the maximum number of objects in the game, start killing some off. */ /* NOTE: There is no real good reason for having a static fixed-size array of objects in the Locator. Now that we have PtrList available, we should use it instead. */ void check_for_death(); /* EFFECTS: Check for death. I.e. healthNext < 0. */ /* NOTE: If using kill_self in this phase, an object must manually call die and check for die_called(). */ void update_phase(); /* EFFECTS: Update externally visable state. Set current variables to the values of the next variables. */ void grid_follows_physicals(); /* EFFECTS: Update the locator grid to reflect the new positions of the Physicals. Shift gridEntries around as necessary. */ void add_new_objects(); /* EFFECTS: Add all objects on the add list, i.e. everything just added in this the previous act/update phase. */ void delete_dead(); /* EFFECTS: Actually remove the objects that are dead. Don't want to do this until after the update phase. */ void reincarnate_clock(); /* EFFECTS: Clock all the reincarnate timers. */ //// end phases of clock() void clear_already_drawn_flag(const GLoc &gridStart,const GLoc &gridFinish); /* EFFECTS: Clear the already_drawn() flag in all OLGridEntries in the grid squares between gridStart and gridFinish, exclusive. */ void grid_covering_area(GLoc& start,GLoc& finish,const Area& area); /* MODIFIES: start, finish */ /* EFFECTS: Set start and finish to be the corners of the rectangle of grid squares completely covering area. I.e. loop from start.{vert,horiz} to < finish.{vert,horiz} */ #if WIN32 static void* compute_tick_key(int tickType,Dir dir); /* REQUIRES: Dir should be a "pure" direction, not "half-pure". */ /* EFFECTS: Compute the SurfaceManager key for storing the tick marks. */ #endif ///////////////// Data. WorldP world; SoundManager *soundManager; int uniqueGen; // All valid entries in the list have index < listMax. int listMax; OLentry list[OL_LIST_MAX]; OLgridEntry* grid[OL_GRID_VERT_MAX][OL_GRID_HORIZ_MAX]; #if X11 OLshadowEntry* shadows[OL_GRID_VERT_MAX][OL_GRID_HORIZ_MAX]; OLshadowEntry* shadowDelList[OL_LIST_MAX]; int shadowDelNum; #endif PhysicalP addList[OL_LIST_MAX]; int addNum; // Remember everything that has been deleted. Boolean useDelList; Id delList[OL_LIST_MAX]; int delNum; // Remember recent sounds Boolean rememberSounds; SoundRequest sounds[OL_RECENT_SOUNDS_MAX]; int soundsNum; XvarsValid xValid; OLxdata xdata; // Message service. char *messages[OL_MESSAGES_MAX]; int head,tail; ArenaMessage arenaMessages[OL_MESSAGES_MAX]; int arenaHead,arenaTail; Boolean messagesIgnore; // Player registry service. HumanP humans[HUMANS_MAX]; EnemyP enemies[ENEMIES_MAX]; NeutralP neutrals[NEUTRALS_MAX]; int humansMax; int enemiesNum; int neutralsNum; Boolean reincarnating[HUMANS_MAX]; // Just for humans. Timer reincarnateTimers[HUMANS_MAX]; // Just for humans. // teams and persistent teams now independent. OLTeam teams[TEAMS_MAX]; int teamsNum; OLTeam persistentTeams[TEAMS_MAX]; int persistentTeamsNum; int drawingAlgorithm; Boolean drawRects; // Arrows for tick marks const static CMN_BITS_ID tickPixmapBits[TICK_MAX][CO_DIR_HALF_PURE]; // unstretched coordinates. const static Size tickSizes[CO_DIR_HALF_PURE]; // contextCount is for verification purposes, make sure all the classes are // registered. int contextCount; // List of all classes of Physicals. Indexed by the values for ClassId. // E.g. contexts[A_ChopperBoy] is the PhysicalContext for the class // ChopperBoy. const PhysicalContext *contexts[A_CLASSES_NUM]; // Item info for the "non-existent" classes, like A_HandToHand. // Index starts at ClassId, A_CLASSES_NUM. const static OLItemInfo nonExistentClassesItemInfo[A_None - A_CLASSES_NUM]; }; typedef Locator *LocatorP; #endif xevil-2.02r2.orig/cmn/neth.h0100644000175000017500000000452007041422160015163 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "role.cpp" #ifndef NETH_H #define NETH_H #include "utils.h" // Just used to get all the network headers. // Should only be included by .cpp files. #if X11 #include #include #include #include #include #include #include #endif // For recvfrom() and accept, fucking AIX 2.4 #ifdef USE_ULONG_NET_LENGTH typedef unsigned long CMN_NET_LENGTH; // Red Hat Linux likes unsigned int #elif defined USE_UINT_NET_LENGTH typedef unsigned int CMN_NET_LENGTH; #else typedef int CMN_NET_LENGTH; #endif #if X11 #ifdef SELECT_NEEDS_PROTOTYPES extern "C" { int select(int, fd_set *, fd_set *, fd_set *, struct timeval *); } #endif #ifdef USE_SELECT_H extern "C" { #include } #endif #endif #if WIN32 #include #include #endif // Stuff that might be useful #if 0 struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; #endif #ifdef SELECT_TAKES_INTP #define CMN_SELECT(sockNum,readSock,writeSock,exceptSock,timeout) \ select(sockNum,((int *)readSock),((int *)writeSock),((int *)exceptSock),timeout) #else #define CMN_SELECT(sockNum,readSock,writeSock,exceptSock,timeout) \ select(sockNum,readSock,writeSock,exceptSock,timeout) #endif #if X11 #define CLOSE_SOCKET(sck) close(sck) #endif #if WIN32 #define CLOSE_SOCKET(sck) closesocket(sck) #endif #endif xevil-2.02r2.orig/cmn/physical.h0100644000175000017500000027370207041422160016053 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "physical.h" // Interior nodes of the physical object tree. These classes // are never instantiated. #ifndef PHYSICAL_H #define PHYSICAL_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif // Include Files #include "utils.h" #include "coord.h" #include "xdata.h" #include "area.h" #include "world.h" #include "id.h" #include "intel.h" #include "locator.h" #include "streams.h" // Defines #define PH_WEAPONS_MAX 10 #define PH_ITEMS_MAX 20 //#define PH_AMMO_UNLIMITED in coord.h #define PH_GRAVITY 2 #define PH_PUSH_OFF 3 // PH_AUTO_GEN means generate pixmap bits from another direction // via Transfrom2D. // Assuming that no pixmap bits are 0xffffffff. // Safe on Windows because resource symbols are a max of 65K. #define PH_AUTO_GEN ((CMN_BITS_ID)-1) // Default time to be invisible for cloaks, or for invisible client object // if no new updates come in. #define PH_INVISIBLE_TIME 1500 // One minute. //////////////////////////////////////////////////////////////////////////// //----------------------- MACROS FOR STREAM IO ---------------------------// // Add a ';' after this. #define DECLARE_INTERNAL_NODE_IO(CLASSNAME) \ CLASSNAME(InStreamP,const CLASSNAME ## Context &, \ CLASSNAME ## Xdata &, \ WorldP, \ LocatorP); \ virtual void update_from_stream(InStreamP in); \ void _update_from_stream(InStreamP); \ virtual int get_write_length(); \ virtual void write(OutStreamP) #define DECLARE_ROOT_NODE_IO(CLASSNAME) \ CLASSNAME(InStreamP,const CLASSNAME ## Context &,WorldP,LocatorP); \ virtual void update_from_stream(InStreamP); \ virtual int get_write_length(); \ virtual void write(OutStreamP) #define DECLARE_NULL_INTERNAL_NODE_IO(CLASSNAME) \ CLASSNAME(InStreamP,const CLASSNAME ## Context &, \ CLASSNAME ## Xdata &, \ WorldP,LocatorP) // Appropriate Context will be named "cx" and Xdata named "x_data". #define CONSTRUCTOR_INTERNAL_NODE_IO(CLASSNAME,PARENT,parent) \ CLASSNAME::CLASSNAME(InStreamP in,const CLASSNAME ## Context &cx, \ CLASSNAME ## Xdata &x_data, \ WorldP w,LocatorP l) \ : PARENT(in,cx. ## parent ## Context,x_data,w,l) // Used by internal nodes and leaves. #define DEFINE_UPDATE_FROM_STREAM(CLASSNAME,PARENT) \ void CLASSNAME::update_from_stream(InStreamP in) { \ PARENT::update_from_stream(in); \ _update_from_stream(in); \ } #define DECLARE_ABILITY_IO(CLASSNAME) \ CLASSNAME(InStreamP,CreatureP,const CLASSNAME ## Context &,CLASSNAME ## Xdata &); \ void update_from_stream(InStreamP in); \ int get_write_length(); \ void write(OutStreamP); \ static AbilityP create_from_stream(InStreamP,CreatureP) #define DECLARE_NULL_ABILITY_IO(CLASSNAME) \ CLASSNAME(InStreamP,CreatureP,const CLASSNAME ## Context &,CLASSNAME ## Xdata &); \ static AbilityP create_from_stream(InStreamP,CreatureP) #if 0 // Hack to shut the fucking compiler up about unused variables. #define ABILITY_IO_HACK \ void *dummy; \ dummy = (void *)in; \ dummy = (void *)&cx; \ dummy = (void *)&x_data; // Define several functions. #define DEFINE_NULL_PRE_LEAF_IO(CLASSNAME) \ void CLASSNAME::update_from_stream(InStreamP) { \ } \ int CLASSNAME::get_write_length() { \ return 0; \ } \ void CLASSNAME::write(OutStreamP) { \ } #endif #define DECLARE_NULL_LEAF_IO(CLASSNAME) \ CLASSNAME(InStreamP,WorldP,LocatorP); \ static PhysicalP create_from_stream(InStreamP,WorldP,LocatorP) #define DECLARE_LEAF_IO(CLASSNAME) \ CLASSNAME(InStreamP,WorldP,LocatorP); \ virtual void update_from_stream(InStreamP); \ void _update_from_stream(InStreamP); \ virtual int get_write_length(); \ virtual void write(OutStreamP); \ static PhysicalP create_from_stream(InStreamP,WorldP,LocatorP) // Assumes the appropriate context is named "context". #define CONSTRUCTOR_LEAF_IO(CLASSNAME,PARENT) \ CLASSNAME::CLASSNAME(InStreamP in,WorldP w,LocatorP l) \ : PARENT(in,context,xdata,w,l) #define DEFINE_CREATE_FROM_STREAM(CLASSNAME) \ PhysicalP CLASSNAME::create_from_stream(InStreamP in, \ WorldP w,LocatorP l) { \ PhysicalP p = new CLASSNAME(in,w,l); \ if (p->creation_ok() && in->alive()) { \ return p; \ } \ else { \ delete p; \ return NULL; \ } \ } // Note that defaultContext and defaultXdata are static to CLASSNAME. #define DEFINE_CREATE_ABILITY_FROM_STREAM(CLASSNAME) \ AbilityP CLASSNAME::create_from_stream(InStreamP in,CreatureP creat) { \ AbilityP ret = new CLASSNAME(in,creat,defaultContext,defaultXdata); \ assert(ret); \ return ret; \ } #if 0 #define DECLARE_CREATURE_IO(CLASSNAME) \ CLASSNAME(InStreamP,WorldP,LocatorP); \ virtual void update_from_stream(InStreamP); \ virtual int get_write_length(); \ virtual void write(OutStreamP); \ static PhysicalP create_from_stream(InStreamP,WorldP,LocatorP) #endif #define DECLARE_NULL_CREATURE_IO(CLASSNAME) \ CLASSNAME(InStreamP, WorldP,LocatorP); \ static PhysicalP create_from_stream(InStreamP,WorldP,LocatorP) //--------------------------- END IO MACROS ------------------------------// //////////////////////////////////////////////////////////////////////////// enum PHsig {PH_NO_SIG, PH_NOT_SET, PH_ID_CHANGED}; class Protection; typedef Protection *ProtectionP; class Modifier; typedef Modifier *ModifierP; class Ability; typedef Ability *AbilityP; class Holder; typedef Holder *HolderP; class Locomotion; typedef Locomotion *LocomotionP; class Composite; typedef Composite *CompositeP; ////////// Physical /* Physical is the parent class of all physical objects. */ /* PhysicalContext plays a double role. Like all the other "contexts", MovingContext, CreatureContext, etc., it is a place to specify paramaters for a specific class. E.g. if you look at the PhysicalContext in ninja.bitmaps you will see where the mass, max health, etc, for a Ninja is specified. But, it also plays a role for the Object Locator. All classes of Physical objects (not just the objects, but the classes) are registered with Locator::register_context(). So, the Locator has a list of all the classes in the game. For example, if the Locator wanted to create one of each type of object, it could just go through the list of registed classes and call the PhysicalContext->create() method on each. Only PhysicalContext is used for this extra functionality. MovingContext, ShotContext, etc, only play the first role. */ struct PhysicalContext { Health health; Mass mass; ClassId classId; const char *className; /* Global fields for the Game as a whole. */ // Can a Transmogifier turn something into this class of object. Boolean transmogifyTarget; // Can objects of this class use doppelgangers. E.g. we don't want // FireDemons to start duplicating themselves. This is independent of // whether this class is derived from class User. Boolean doppelUser; // Can a Human player start out as an object of this class. Boolean potentialHuman; // Can an Enemy(Machine) player start out as an object of this class. Boolean potentialEnemy; #if 0 // This needs to be added for Game::intel_options_for() // Only meaningful if potentialEnemy is True. // If an enemy is created of this class, will it receive a psychotic Intel. Boolean enemyIsPsychotic; #endif // This gives the likelihood that an enemy will // be created of this class. For reference Ninja is 3. E.g. if // enemyWeight is 1, then there will be one third as many of these objects // as there are Ninjas. // NOTE: This may be used even if potentialEnemy is False. A Scenario may // specifically request a set of potential enemies, e.g. Seals. int enemyWeight; // Is this a weapon or item that can magically fall out of the sky. // Only one of potentialWeapon, potentialOtherItem should be True. Boolean potentialWeapon; Boolean potentialOtherItem; // If the Physical is a potential item or weapon, this gives a measure of // how many of the object will be created. You can think of this as the // "percent" of the World that is covered by the item/weapon. float objectWorldPercent; // If the Physical is a potential item or weapon, this gives the maximum // number of times the object will appear that level. // 0 means infinity, i.e. no limit. int levelMaxTimes; // The maximum size of the Physical corresponding to this context. Size sizeMax; // A pointer to a function that creates an instance of the Physical // corresponding to this context. PhysicalP (*create)(void *arg,WorldP w,LocatorP l,const Pos &pos); // Flags that determine what statistics will be printed out when XEvil is // exited. You probably only want to set one of these, if any. // E.g. For Shot, we are interested in the number that were // created (fired), so statsCreations would be True. E.g. For MedKit, // we care more about how many were used than how many were created, so we // set statsUses. For Ninja, the most interesting thing is how many of // got killed (and average lifespan), so we set statsDeath. E.g. for Rock // we don't set any of them, (who cares about a rock). Boolean statsCreations; Boolean statsUses; Boolean statsDeaths; // Return the stats for the class. This will be NULL if the class does not // have stats. I.e. a NULL function, NOT a function that returns NULL. // This is non-NULL iff any of the stats{Creations,Uses,Deaths} flags // are set. // // I could probably have put the actual Stats here instead of // every class having to have its own stats. But, I really wanted to keep // all the "Contexts" constant, and Stats obviously have to change during // game play. Stats &(*get_stats)(void *arg); // Not const anymore. // Argument passed to create() and get_stats(). NULL except for templates. void *arg; // A very poorly named function. Multi-purpose graphics function for this // class. See Moving::init_x(). void (*init_x)(Xvars &xvars,IXCommand command,void* arg); // Read in a new Physical from an InStream. Return NULL if failure. PhysicalP (*create_from_stream)(InStreamP,WorldP,LocatorP); // If non-null, will return whether the given class derives from // Item or Weapon. Will also return a bitmap icon suitable for a // status window (WIN32 only for now). // If null, the class is guaranteed not to be an Item or Weapon. void (*get_item_info)(Boolean &isItem,Boolean &isWeapon,CMN_BITS_ID &iconId); //******* This needs to be added in, see Locator::draw_ticks() ********/ // Should always draw the tick marks on the edge of the screen for this // Physical, e.g. Flag, Xit // Boolean alwaysDrawTicks; }; class Physical { public: Physical(const PhysicalContext &,WorldP,LocatorP); /* EFFECTS: Create a new, mapped physical with no Id with undefined area. */ Physical(); /* NOTE: Should never be called. */ Boolean creation_ok() {return creationOk;} /* EFFECTS: Create physical by reading in from stream. Use Physical::creation_ok() to see if it was successfully read in. */ DECLARE_ROOT_NODE_IO(Physical); void _update_from_stream(InStreamP,Boolean alreadyExists); /* NOTE: alreadyExists is used for checking consistency when updating an existing object from a stream. */ virtual ~Physical(); virtual const Area &get_area() = 0; virtual const Area &get_area_next() = 0; /* NOTE: Should only be used by the Locator. */ Health get_health() {return health;} Health get_health_next() {return healthNext;} /* NOTE: Should only be used by the Locator to prepare for death. Somewhat of a hack. */ virtual Health get_health_max(); /* NOTE: Overridden in Creature. */ Mass get_mass() {return mass;} virtual Vel get_vel(); virtual Dir get_dir(); ClassId get_class_id() {return pc->classId;} const char *get_class_name() {return pc->className;} virtual int get_drawing_level(); const PhysicalContext *get_context() {return pc;} Boolean delete_me() {return deleteMe;} Boolean alive() {assert (health >= 0 || dieCalled); return health >= 0;} /* NOTE: Is publicly known that (health >= 0) <=> alive. So this function is just for convenience. */ Boolean die_called() // {assert (healthNext < 0 || !dieCalled); return dieCalled;} {return dieCalled;} /* EFFECTS: Returns whether die() has been called or not. Not clocked. */ /* Should only be used for abstract classes. Actual classes can be tested for with get_class_id(). */ virtual Boolean is_moving(); virtual Boolean is_shot(); virtual Boolean is_item(); virtual Boolean is_shield(); virtual Boolean is_bomb(); virtual Boolean is_weapon(); virtual Boolean is_cutter(); virtual Boolean is_gun(); virtual Boolean is_creature(); virtual Boolean is_auto_use(); virtual Boolean is_drugs(); virtual Boolean is_liftable(); virtual AbilityP get_ability(AbilityId); virtual HolderP get_holder(); virtual LocomotionP get_locomotion(); virtual CompositeP get_composite(); /* NOTE: These are really only meaningful for Creature. Provided here for convenience. */ Boolean get_mapped() {return mapped;} virtual Boolean collidable(); /* NOTE: This value never changes for an object. */ const Acc *get_unit_accs() {return unitAccs;} const Vel *get_unit_vels() {return unitVels;} Id get_id() {return id;} PHsig get_id(Id &id); /* MODIFIES: id */ /* EFFECTS: Set id to be the Id and return PH_NO_SIG if set. Otherwise, return PH_NOT_SET. */ Id get_dont_collide() {return dontCollide;} /* EFFECTS: If there is another object that *this is not allowed to collide with, return it. Otherwise return NULL; */ CompositeId get_dont_collide_composite() {return dontCollideComposite;} /* NOTE: Return COMPOSITE_ID_NONE if the flag isn't set. */ IntelP get_intel() {return intel;} /* NOTE: Can be NULL. */ Boolean get_flash() {return !flashTimer.ready();} Boolean get_quiet_death() {return quietDeath;} virtual void get_followers(PtrList &list); /* EFFECTS: Fill list with all the follower objects of the Creature, e.g. Chainsaws, Shields. list will be a list of PhysicalP. */ /* NOTE: All mapped and unmapped followers. */ /* NOTE: Call up the tree. */ /* WARNING: Careful not to cache the results, as it is a list of PhysicalP, not of Id. */ /* NOTE: Maybe we should be using PtrList::add_unique() instead of add() to fill the list. */ virtual void follow(const Area &followeeArea,Dir followeeDir, Boolean currentAndNext); /* EFFECTS: Follow the followee. If currentAndNext is True, set current and next state, e.g. after reading from a stream. If False, only set next state, e.g. normal clock(). */ /* NOTE: Sure would be nice to have delegation to a IFollowable interface. */ NetDataP get_net_data(); /* EFFECTS: Get the chuck of data specific to network play. Not a copy, do not free results. */ void set_command(ITcommand c) {command = c;} /* EFFECTS: Sets the command to be c, overrides any previous command setting. */ /* NOTE: command is not clocked. */ virtual Boolean command_repeatable(ITcommand c); /* EFFECTS: Given the current state of the Physical, should c be allowed to be sent repeatedly through set_command(). Or must there be a delay after the invocation of set_command(c). Decide whether we can do key repeat or not. */ void set_id(const Id &id); /* REQUIRES: Id not already set. */ /* EFFECTS: Set the Id to be id. */ void set_dont_collide(const Id &other) {dontCollide = other;} /* EFFECTS: *this will not be allowed to collide with other. Any previous value will be overridden. Pass in an invalid Id to disable dontCollide. */ void set_dont_collide_composite(CompositeId compId) {dontCollideComposite = compId;} /* EFFECTS: Similar to set_dont_collide(), but for all members of a composite object. */ virtual void set_intel(IntelP i); /* REQUIRES: Object has been added to locator (has valid id.) */ /* NOTE: Can be NULL. */ /* NOTE: Is virtual so Creature can inform Abilities of change. */ void set_health_next(Health h) {assert(alive()); healthNext = h;} virtual void heal(); /* EFFECTS: Called by MedKit. */ /* NOTE: Calls up the tree. */ virtual void set_mapped_next(Boolean val); /* NOTE: Should be ok to set the value to the previous value. */ /* NOTE: idempotent */ /* Calls up the tree. */ void set_delete_me() {deleteMe = True;} /* NOTE: Should only be called by self and Locator. */ void flash(); /* EFFECTS: Object will be drawn for FLASH_TIME turns. */ void set_no_death_delete() {noDeathDelete = True;} virtual Boolean corporeal_attack(PhysicalP killer,int damage); /* NOTE: negative damage can be passed in, this "superficial damage" will not hurt the object, just causes indications of getting hit. E.g. bleed even though not really hurt. */ virtual void heat_attack(PhysicalP,int heat,Boolean secondary = False); /* NOTE: Sometimes call up the tree. */ /* NOTE: killer is the one responsible for causing the damage. Can be NULL. Adds kills to the killer. */ /* NOTE: Only the last call before the update cycle takes effect. */ virtual Boolean swap_protect(); virtual Boolean frog_protect(); /* EFFECTS: Returns whether the Physical is protected from a swap or frog attack. May have side effects, so call only once per attack. */ /* NOTE: Using a Transmogifier is considered a swap attack. */ virtual void avoid(PhysicalP); virtual void collide(PhysicalP); /* EFFECTS: Collision procedures. avoid is called on the lighter of the two objects. collide is called on both objects. */ /* NOTE: Not always called up the tree. */ void intelligence() {if (intel) intel->clock(this);} void kill_self() {healthNext = -1;} /* NOTE: Called in act/collision_checks phase. Do not call this in the die phase. (or update phase?) */ virtual void set_quiet_death(); /* EFFECTS: When this dies, do not do any funny things like leaving corpses or exploding or any other type of physical evidence. */ /* WARNING: When a User dies, it drops all weapons and items even if set_quiet_death() has been called. This is somewhat of a hack. */ /* NOTE: Calls up the tree. */ void virtual act(); /* EFFECTS: Action phase. All next variables must be set here. Commands are interpreted here.*/ void virtual update(); /* EFFECTS: Set current variables to be the next ones. No interactions between physical objects. */ void virtual draw(CMN_DRAWABLE buffer,Xvars &xvars,int dpyNum, const Area &area) = 0; /* REQUIRES: buffer is at least as big as area. */ /* EFFECTS: Draw the physical object in buffer. buffer represents area. */ /* NOTE: Does not check for overlap */ /* NOTE: X variables initialized in draw. Thus, if draw is never called for a base class, the X variables never need to be initialized. */ void virtual die(); /* EFFECTS: If the *this dies a natural death (I.e. health < 0), then this function is called. Not called if *this is destroyed for any other reason. E.g. end of game. The default is to kill the intel and set_delete_me. */ /* NOTE: Called only in the die phase. */ /* NOTE: Calls up the tree. */ /* NOTE: Guaranteed to be called only once. */ virtual void dr_clock(); /* EFFECTS: Perform one step of dead reckoning on the client. This will only be called on turns where update_from_stream() isn't called. Simulates calls to act() and update(). */ /* NOTE: calls up the tree. */ virtual ClassId get_weapon_string(const char *&str); /* EFFECTS: str is set to point to a static string containing the string for ClassId. */ /* NOTE: BuiltIn returns something for get_weapon_string(), but NULL for get_weapon_current. */ virtual void drop_all(); /* NOTE: Not in Holder since, e.g. Frog::drop_all must be able to call drop_all on the unmapped object. */ void hack_update_area_next() {update_area_next(True);} /* NOTE: Game::off_clock_kill() wants area to match areaNext when killing objects. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif WorldP get_world() {return world;} Boolean alive_next() {return healthNext >= 0;} virtual Dir get_dir_next(); LocatorP get_locator() {return locator;} virtual ITcommand get_command(); /* EFFECTS: Gets the command. */ /* NOTE: command is not clocked. */ Boolean get_mapped_next() {return mappedNext;} void set_mass_next(Mass mss) {massNext = mss;} void creation_failed() {creationOk = False;} /* EFFECTS: Used by children to mark that the creation of the Physical from a stream failed. */ virtual void update_area_next(Boolean currentAndNext); /* EFFECTS: Called to adjust for any change in the size and position of the Physical. Used in two ways. (1) During the act() phase it is called with False anytime something effects the next values affecting area, may be called before or after this->act(). (2) Outside of the clock, e.g. when reading from a stream, it is called with True. Right now this only happens when one object calls follow() on another. */ private: void _update_area_next(Boolean currentAndNext); /* EFFECTS: Handle making object follow(). */ void init_static(); static Boolean staticValid; static Acc unitAccs[CO_DIR_MAX]; static Vel unitVels[CO_DIR_MAX]; Id id; WorldP world; LocatorP locator; ITcommand command; const PhysicalContext *pc; Health health, healthNext; Mass mass, massNext; Id dontCollide; CompositeId dontCollideComposite; IntelP intel; Boolean deleteMe; Boolean mapped,mappedNext; Boolean noDeathDelete; // Should set_delete_me be called at death. Boolean dieCalled; int heat, heatNext; Boolean previousHeatWasSecondary; Timer flashTimer; Boolean quietDeath; NetDataP netData; // Only allocated when needed. Boolean creationOk; }; // PhysicalP defined in locator.h ////////// Protection // Parent: Physical // Created by a Shield. Protects a Moving against various types of attacks. // Not a subclass of Moving because we don't want to worry about hitting // walls. struct ProtectionContext { CMN_COLOR colorName; PhysicalContext physicalContext; }; class Protection : public Physical { public: Protection(const ProtectionContext &,ProtectionXdata &, WorldP,LocatorP,const Area &); DECLARE_INTERNAL_NODE_IO(Protection); virtual Boolean collidable(); virtual const Area &get_area(); virtual const Area &get_area_next(); virtual void follow(const Area &followeeArea,Dir followeeDir, Boolean currentAndNext); ///////// Following comments only apply if currentAndNext is False. /* NOTE: Can be called multiple times in one turn. */ /* EFFECTS: Called in act() phase by the Moving being protected. aNext is the next Area of the Moving. Can be called before or after this->act(). */ virtual Boolean corporeal_protect(int damage) = 0; virtual Boolean heat_protect(int heat,Boolean secondary) = 0; /* EFFECTS: The Moving has received an attack. Return wheter the Protection will protect against the attack. */ virtual void draw(CMN_DRAWABLE,Xvars &,int,const Area &); virtual void act(); virtual void update(); virtual void dr_clock(); #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual void update_area_next(Boolean currentAndNext); static void init_x(Xvars &,IXCommand command,void* arg,const ProtectionContext &,ProtectionXdata &); private: void _act(); enum {DELTA_MIN = -2,DELTA_MAX = 5}; // DELTA_MIN <= delta < DELTA_MAX const ProtectionContext *prc; ProtectionXdata *pXdata; int delta; // When drawn, how far the Protection sticks out. Area areaBaseNext; Area area,areaNext; }; // ProtectionP defined above. ////////// Moving // Parent: Physical // Has all 19 directions. Multiple pixmaps. Can change size and position. // Top speed is VEL_MAX. /* Only sizes[CO_air] and offsets[CO_air] are required to be set. Gives initial size and offset. */ struct MovingContext { CMN_COLOR foreColorName; Boolean foreWhiteDefault; CMN_COLOR backColorName; Boolean backWhiteDefault; int animMax[CO_DIR_MAX]; Size sizes[CO_DIR_MAX]; // in world coords Size depreciated_offsets[CO_DIR_MAX]; CMN_BITS_ID pixmapBits[CO_DIR_MAX][PH_ANIM_MAX]; CMN_BITS_ID maskBits[CO_DIR_MAX][PH_ANIM_MAX]; PhysicalContext physicalContext; // The bitmaps are already in high resolution, don't stretch them. // Only used on Win32. Boolean hiRes; // Used to override behavior for generating offsets. // If NULL, use Moving::offset_generator. Touching (*offsetGenerator)(Dir); // Used to override behavior for auto-generating bitmaps. // Specifies which bitmaps are transformations of other // bitmaps. TransformMap* transformOverride; // The bitmaps are specified as color XPM (X Pixmap). // Only used on X11. Boolean useXPM; // Can this object ever be invisible. Right now, this only applies // to Creatures that use a Cloak. Masks be generated iff this flag // is True. Boolean invisibility; }; class Moving: public Physical { public: Moving(const MovingContext &m_c,MovingXdata &x_data, WorldP world,LocatorP l,const Pos &rawPos, Dir dirInitial = CO_air); Moving(); /* NOTE: Should never be called. */ DECLARE_INTERNAL_NODE_IO(Moving); void patch_size_and_size_next(); /* EFFECTS: Deal with the problem that client and server may have different ideas about the size of a Moving object. */ virtual Boolean is_moving(); virtual const Area &get_area(); virtual const Area &get_area_next(); /* NOTE: Should only be used by the Locator or in a protected context. */ Boolean is_invisible() {return !invisible.ready();} /* NOTE: Invisible as long as the invisibility timer is running. */ virtual Boolean ignore_walls(); /* NOTE: Override this to make something able to "walk through walls." */ virtual Vel get_vel(); const Pos &get_raw_pos() {return rawPos;} virtual Dir get_dir(); virtual Id get_protection(); virtual void get_followers(PtrList &list); Boolean supports_invisibility() {return mc->invisibility;} /* EFFECTS: Can this object be made invisible. */ virtual void follow(const Area &followeeArea,Dir followeeDir, Boolean currentAndNext); void set_vel_next(const Vel &vel) {velNext = vel;} void set_vel_next(int zero) {assert (zero == 0); velNext.set_zero();} /* EFFECTS: Sets the next velocity for the object to be vel. Can be called multiple times before update, only the last call is used. */ void set_middle_next(const Pos &pos); /* EFFECTS: Sets the middle to pos according to the current (not next) values of dir, and area (for size). */ /* NOTE: May be called before or after act phase. */ void relocate(const Pos &p); /* EFFECTS: Moves the raw position of the Moving to p. Can and must be called outside of Locator::clock. */ /* REQUIRES: Must be relocated to an open area of the World. */ /* NOTE: Sets current and next values. */ virtual void set_mapped_next(Boolean val); void set_extra_vel_next(const Vel &vel) {extraVelNext = vel; extraVelNextSet = True;} void set_extra_vel_next(int zero) {assert (zero == 0); velNext.set_zero(); extraVelNextSet = True;} virtual void set_protection(const Id &); void set_invisible_next(int turns); /* EFFECTS: For turns >= 0, sets object to be invisible for at least the given number of turns. For turns == -1, turns off invisibility next turn. */ /* REQUIRES: supports_invisibility() is True. */ void set_attack_hook(void (*hook)(PhysicalP)) {attackHook = hook;} /* NOTE: Overrides previous value if any. */ void attack_hook() {if (attackHook) attackHook(this);} /* EFFECTS: Should be called whenever *this attacks anything. */ virtual Boolean corporeal_attack(PhysicalP killer,int damage); /* EFFECTS: Return False if attack was blocked. */ virtual void heat_attack(PhysicalP,int heat,Boolean secondary = False); virtual int new_anim_num(int animPrev,int animMax); /* EFFECTS: Override to determine behavior of animation. Returns new animNum given the old value and the maximum animNum for that direction. */ virtual void act(); virtual void update(); virtual void draw(CMN_DRAWABLE,Xvars &,int,const Area &); virtual void avoid(PhysicalP); virtual void collide(PhysicalP); virtual void die(); virtual void dr_clock(); const MovingContext *get_moving_context() {return mc;} /* NOTE: Now public so we can tell when we can turn something into a Sticky. Perhaps we should just export the list of animMax. */ static Touching offset_generator(Dir dir); /* EFFECTS: The default offset_generator. Map a direction to the "wall" it touches. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif Boolean hit_wall() {return hitWall;} Boolean hit_wall_next() {return hitWallNext;} virtual Dir get_dir_next(); Vel get_vel_next() {return velNext;} virtual int get_anim_time(); /* EFFECTS: Override this to make objects animate faster or slower. Returns the number of turns per frame. Default is MOVING_ANIM_TIME. */ Size *get_offsets(); /* EFFECTS: Return array of size CO_DIR_MAX with all the offsets for this Moving. */ /* DEFAULT: Compute generic offsets from Coord::generate_offsets(). */ virtual Boolean draw_outline(ColorNum &colorNum); /* MODIFIES: colorNum */ /* EFFETS: Override this to control drawing the four dots in the corners around the object. colorNum should be set if True is returned. */ virtual Boolean generate_masks(); /* EFFECTS: On Windows decide whether to auto-generate masks for this object. */ /* DEFAULT: False */ void set_vel(const Vel &v) {vel = v;} void set_vel(int zero) {assert (zero == 0); vel.set_zero();} void set_dir(const Dir &d) {dir = d;} /* NOTE: Only used by Lance for initialization. */ void set_dir_next(const Dir &d) {dirNext = d;} void _set_middle_next(const Pos &pos); /* NOTE: Nothing special about this, just like set_dir_next() or set_raw_pos_next() in that it just sets the next variables, does not call update_area_next. */ void set_mover_vel(const Size &v) {moverVel = v;} /* EFFECTS: Called in act phase before Moving::act(), only lasts for that turn. Used by Creature::act() to follow a Mover. */ void set_raw_pos_next(const Pos &rpos) {rawPosNext = rpos; rawPosChanged = True;} void update_area_next(Boolean currentAndNext); /* EFFECTS: Compute areaNext and hitWallNext. May modify rawPosNext or dirNext. */ /* NOTE: May be called more than once per turn. */ virtual void get_pixmap_mask(Xvars &xvars,int dpyNum, CMN_IMAGEDATA &imageData, Dir dir,int animNum); /* MODIFIES: imageData */ /* NOTE: Only used so that children of Moving can affect Moving's actions. imageData is basically a pixmap and a mask. */ virtual void get_size_offset_next(Size &size,Size &offset,Dir dirNext); /* MODIFIES: size, offset */ /* NOTE: Only used so that children of Moving can affect Moving's actions. */ void set_size_offset_current_and_next(const Size &size,const Size &offset); /* EFFECTS: Sets immediate and next values of size and offset. */ /* NOTE: Kind of a hack. Only needs to be called if a child uses get_size_offset_next() and does something different on the initial state. Only called in child constructor. */ static void init_x(Xvars &,IXCommand command,void* arg,const MovingContext &,MovingXdata &); /* EFFECTS: Initialize all graphics for the concrete class that derives from Moving. E.g. Ninja::init_x() will call Moving::init_x() to initialize all the graphics in the Moving part of the Ninja. On windows, this is a two-phase process. First init_x() is called with command==IX_ADD. This just adds the requests for surfaces to the SurfaceManager. Later, it is called with command=IX_INIT which actually loads the bitmaps into the surfaces. On UNIX, there is only one phase and command is always IX_INIT. */ /* NOTE: Now called up the tree. */ /* NOTE: This method is now poorly names as we are overloading its use. There is now also an IX_LIST command on Windows. We should really call this gfx_function, or something to indicate that this is a multi-purpose graphics-related function for the class. Have to go through all the .bitmaps files to fix the naming. */ /* NOTE: See the platform-specific definition of IXCommand to see all the commands. */ private: void _act(); void _update(); /* NOTE: Used by act(), update() and by dr_clock(). No special semantics like act(), or update(), or update_area_next(). Consider _act() to be any other method that sets the next dirs, like set_dir_next(). */ void _update_area_next(Boolean currentAndNext); Boolean context_valid(); /* EFFECTS: Returns True if this->cx is valid, False otherwise. */ float compute_collision(Mass m1,float v1,Mass m2,float v2); static void check_generate_offsets(const MovingContext &,MovingXdata *); /* EFFECTS: Make sure offsets have been generated for the MovingContext. */ /* NOTE: Hack here, using movingXdata to store non-graphics-related info. */ static void* compute_key(Dir dir,int animNum,Boolean isMask, const MovingContext *,MovingXdata *); /* EFFECTS: Compute hash key for storing a bitmap in the SurfaceManager. Only used on Windows. */ static void check_auto_generated(const MovingContext&); /* EFFECTS: Check that sizes and animMax match up for auto-generated bitmaps. */ MovingXdata *movingXdata; int movingAnimNum; Timer animTimer; const MovingContext *mc; Pos rawPos,rawPosNext; Boolean rawPosChanged; Area area,areaNext; Dir dir,dirNext; Vel vel,velNext; Boolean extraVelNextSet; Vel extraVel,extraVelNext; // Follows clock in non-standard way. Size moverVel; // Only exists in act() phase. Boolean hitWall,hitWallNext; Id protection; Timer invisible; // Invisible if the timer is running, i.e. !ready(). // Number of turns to be invisible, -1 means turn off invisibilty. int invisibleNext; void (*attackHook)(PhysicalP); }; typedef Moving *MovingP; ////////// Shot // Parent: Moving struct ShotContext { int damage; Speed speed; SoundName soundId; Boolean repeatingSound; MovingContext movingContext; }; typedef MovingXdata ShotXdata ; class Shot: public Moving { public: Shot(const ShotContext &,ShotXdata &,WorldP,LocatorP, const Pos &,const Id &shooter, Dir shotDir,Dir movingDir = CO_air); /* NOTE: compId may be COMPOSITE_ID_NONE */ DECLARE_NULL_INTERNAL_NODE_IO(Shot); const Id &get_shooter() {return shooter;} virtual Boolean is_shot(); virtual void avoid(PhysicalP other); virtual void collide(PhysicalP other); virtual void act(); virtual void update(); #ifndef PROTECTED_IS_PUBLIC protected: #endif int get_damage() {return context->damage;} private: Boolean firstTurn; Id shooter; const ShotContext *context; }; ////////// Droplet // Parent: Moving // Moving with gravity. Sticks to walls. struct DropletContext { int dissolveTime; MovingContext movingContext; }; typedef MovingXdata DropletXdata; enum DropletType { DROPLET_NONE, DROPLET_BLOOD, DROPLET_GREEN_BLOOD, DROPLET_OIL, DROPLET_SPARK = DROPLET_NONE}; // sparks disabled class Droplet: public Moving { public: Droplet(const DropletContext &,DropletXdata &, WorldP world,LocatorP l,const Pos &rawPos, const Vel &vel,Dir dir = CO_air); /* NOTE: If dir is not CO_air, then it specifies the direction of the Droplet in the air. Else, the direction will be the appropriate "pure" directions while in the air. */ DECLARE_NULL_INTERNAL_NODE_IO(Droplet); virtual Boolean collidable(); virtual void act(); static Size get_size_max(DropletType); static PhysicalP create_and_add_if(DropletType,WorldP,LocatorP,const Pos &,const Vel &); /* EFFECTS: Just call appropriate function on child class. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif static int get_available_entry(LocatorP l); /* EFFECTS: Return index for set_entry() or -1 if none available. */ static void set_entry(int index,const Id &); /* EFFECTS: All children of Droplet should call set_entry() on creation. */ private: const DropletContext *context; Timer timer; Boolean inAir; // If True, the dir never changes for the droplet, it is // specified in the constructor. Boolean staticDir; // Max number of droplets of all type in the game. enum {DROPLET_MAX=45}; static Id dropletList[DROPLET_MAX]; static int dropletMax; }; ////////// Falling // Parent: Moving // Moving with gravity. Falls until it is blocked by the world. struct FallingContext { MovingContext movingContext; }; typedef MovingXdata FallingXdata; class Falling: public Moving { public: Falling(const FallingContext &h_c,FallingXdata &x_data, WorldP world,LocatorP l,const Pos &rawPos, Dir dirInitial = CO_air); DECLARE_NULL_INTERNAL_NODE_IO(Falling); virtual void act(); #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual Boolean gravity_on(); /* EFFECTS: Called during act() to see if gravity affects the Falling. */ /* DEFAULT: True */ }; ////////// Touchable // Parent: Falling // Remembers if it has ever been touched by a Human controlled Physical. struct TouchableContext { FallingContext fallingContext; }; typedef FallingXdata TouchableXdata; class Touchable: public Falling { public: Touchable(const TouchableContext &,TouchableXdata &x_data, WorldP,LocatorP,const Pos &); DECLARE_NULL_INTERNAL_NODE_IO(Touchable); virtual int get_drawing_level(); /* EFFECTS: Touchable is drawn behind everything else. */ Boolean wasTouched() {return touched;} /* EFFECTS: Has a Physical with Human intelligence touched the Xit. */ virtual Boolean collidable(); virtual void act(); private: Boolean touched; const TouchableContext *context; }; typedef Touchable *TouchableP; //////////// Heavy // Parent: Falling // Does damage to things it lands on. struct HeavyContext { int damage; FallingContext fallingContext; }; typedef FallingXdata HeavyXdata; class Heavy: public Falling { public: Heavy(const HeavyContext &h_c, HeavyXdata &x_data, WorldP world, LocatorP l, const Pos &rawPos); DECLARE_NULL_INTERNAL_NODE_IO(Heavy); virtual void collide(PhysicalP); /* EFFECTS: Crush things it falls on. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif void set_pusher(const Id &id) {pusher = id;} /* EFFECTS: Used by Liftable to give the Lifter credit for kills. */ private: Id pusher; // Who last touched the heavy. const HeavyContext *context; }; //////////// Liftable // Parent: Heavy // Can be carried by a Lifter struct LiftableContext { HeavyContext heavyContext; }; typedef HeavyXdata LiftableXdata; class Liftable: public Heavy { public: Liftable(const LiftableContext &h_c, LiftableXdata &x_data, WorldP world, LocatorP l, const Pos &rawPos); DECLARE_NULL_INTERNAL_NODE_IO(Liftable); virtual Boolean is_liftable(); virtual int get_drawing_level(); Boolean being_lifted(); /* EFFECTS: Return if something is already lifting this Liftable. */ virtual void update(); virtual void collide(PhysicalP); /* NOTE: Don't hurt anything if being lifted. */ void lift(PhysicalP lifter); /* EFFECTS: A lifter has started lifting the Liftable. */ void release(PhysicalP lifter); /* EFFECTS: A lifter has dropped/thrown the Liftable. */ private: Id lifter; // valid iff being lifted or excludedTime. Timer excludedTimer; Boolean excludedTime; // Was just dropped, don't pick up again. }; typedef Liftable *LiftableP; //////////// Item // Parent: Falling // struct ItemContext { Boolean persists; // Provides ranking for weapons/items when switching. // No two weapons should have the same coolness and no two items // should have the same coolness. // Negative coolness means that the item should never be automatically // selected. int coolness; SoundName useSound; FallingContext fallingContext; }; typedef FallingXdata ItemXdata; class Item: public Falling { public: Item(const ItemContext &c_x, ItemXdata &x_data, WorldP w, LocatorP l, const Pos &pos,Dir dirInitial = CO_air); DECLARE_INTERNAL_NODE_IO(Item); Boolean is_item() {return True;} Boolean is_held() {return held;} Boolean can_take(PhysicalP taker); /* EFFECTS: Returns whether the object can be picked up by taker. */ virtual int get_drawing_level(); Id get_holder_id(); /* EFFECTS: Returns the holder Id if held or an invalid Id if not held. */ virtual int get_coolness(); /* NOTE: Coolness may change for an item. */ void set_quiet_death(); Boolean persists() {return context->persists;} virtual void taken(PhysicalP); /* EFFECTS: The object has been taken by another Physical. */ /* NOTE: Changes immediate externally visible state. Should only be called in the collision phase. */ void dropped(PhysicalP); /* EFFECTS: The object has been dropped by another Physical. */ /* NOTE: Called by another object in the act phase. */ /* NOTE: Called in either the act or update phase. */ /* NOTE: Calls up the tree. */ virtual void use(PhysicalP); /* EFFECTS: p uses *this. */ /* NOTES: Called by another object in act phase. Can also be called in collide phase. (see AutoUse::collide) Calls up the tree. */ virtual void act(); virtual void die(); #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual Boolean gravity_on(); /* NOTE: Don't want to be affected by gravity while held. */ void set_cant_take() {cantTake = True;} private: enum MESSAGE {NONE,USED,DESTROYED}; Boolean held; Id holderId; // Valid iff held. Boolean dieMessage; // Timer canTake; // While excludedTimer is not ready(), excluded cannot take this. Id excluded; Timer excludedTimer; Boolean cantTake; const ItemContext *context; }; typedef Item *ItemP; //////////// AutoUse // Parent: Item // Automatically gets used when it collides with a non-user creature. // WARNING: All children of this class must be able to be used by a non-user. struct AutoUseContext { Boolean humansOnly; // Only automatically used by humans. ItemContext itemContext; }; typedef ItemXdata AutoUseXdata; class AutoUse : public Item { public: AutoUse(const AutoUseContext &c_x, AutoUseXdata &x_data, WorldP w, LocatorP l, const Pos &pos); DECLARE_NULL_INTERNAL_NODE_IO(AutoUse); virtual Boolean is_auto_use(); virtual void collide(PhysicalP); private: const AutoUseContext *context; }; //////////// Drugs // Parent: AutoUse struct DrugsContext { int odChance; // zero means no chance of OD AutoUseContext autoUseContext; }; typedef AutoUseXdata DrugsXdata; class Drugs : public AutoUse { public: Drugs(const DrugsContext &c_x,DrugsXdata &x_data,WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_INTERNAL_NODE_IO(Drugs); virtual Boolean is_drugs(); virtual void taken(PhysicalP); virtual void use(PhysicalP); #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual ModifierP create_modifier() = 0; /* EFFECTS: Override to give drug of your choice. */ const DrugsContext *context; }; //////////// Shield // Parent: AutoUse struct ShieldContext { AutoUseContext autoUseContext; }; typedef AutoUseXdata ShieldXdata; class Shield: public AutoUse { public: Shield(const ShieldContext &,ShieldXdata &, WorldP w,LocatorP l,const Pos &pos); DECLARE_NULL_INTERNAL_NODE_IO(Shield); virtual Boolean is_shield(); virtual void use(PhysicalP); #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual ProtectionP create_protection(const Area&) = 0; /* EFFECTS: Create the type of Protection specific to this type of Shield. */ }; //////////// Animated // Parent: Item // struct AnimatedContext { ItemContext itemContext; }; typedef ItemXdata AnimatedXdata; class Animated: public Item { public: Animated(const AnimatedContext &,AnimatedXdata &, WorldP,LocatorP,const Pos &,Frame frameInitial = CO_R); /* NOTE: CO_R should really be FRAME_BASE, lame compilers. */ DECLARE_NULL_INTERNAL_NODE_IO(Animated); #ifndef PROTECTED_IS_PUBLIC protected: #endif void set_frame(Frame fr) {set_dir(fr + FRAME_BASE);} void set_frame_next(Frame fr) {set_dir_next(fr + FRAME_BASE);} Frame get_frame() {return get_dir() - FRAME_BASE;} private: enum {FRAME_BASE = CO_R}; }; //////////// Weapon // Parent: Item // struct WeaponContext { // Defaultable has been superceeded by using negative values for // ItemContext::coolness. SoundName soundid; ItemContext itemContext; }; typedef ItemXdata WeaponXdata; class Weapon; typedef Weapon *WeaponP; class Weapon: public Item { public: Weapon(const WeaponContext &c_x, WeaponXdata &x_data, WorldP w, LocatorP l, const Pos &pos,Dir dirInitial = CO_air); DECLARE_NULL_INTERNAL_NODE_IO(Weapon); Boolean is_weapon() {return True;} virtual Boolean ready() = 0; /* EFFECTS: Can the weapon be fired now. */ /* NOTE: Sometimes calls up the tree.*/ // Boolean defaultable() {return wc->defaultable;} /* EFFECTS: Is this a type of weapon that can safely be set automatically as the current weapon. E.g. You do not want to set a soul-swapper as the current weapon unless the user explicitly says so. */ virtual int get_ammo() = 0; virtual int get_ammo_max() = 0; /* NOTE: Can return PH_AMMO_UNLIMITED. */ virtual Boolean useful_no_ammo(); /* EFFECTS: Is this weapon useful even if it is out of ammo. (Otherwise User will kill it when it runs out.) */ /* DEFAULT: False */ virtual Boolean fire_repeatedly(); /* EFFECTS: Should this weapon be fired repeatedly if the user holds down the fire key. */ /* DEFAULT: True */ virtual void fire(const Id &id,ITcommand command); /* REQUIRES: command is a weapon command. */ /* EFFECTS: Fire the weapon according to the specified command. id is the physical firing the weapon. */ virtual void use(PhysicalP); /* NOTE: Does nothing. Doesn't even call Item::use(). */ virtual void enter_scope_next(PhysicalP user); virtual void leave_scope_next(PhysicalP user); /* NOTE: Called during act(collide) or update phase. Should be just act(). */ /* NOTE: Calls up the tree. */ /* NOTE: ok to call multiple times in same turn, but must enter/leave scope in proper order. */ virtual void take_ammo_from(WeaponP other); /* EFFECTS: Take as much ammo as possible from the other weapon. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif Boolean entered_scope() {return enteredScope;} virtual void set_ammo(int) = 0; virtual Dir compute_weapon_dir(ITcommand c); /* EFFECTS: Returns the direction the weapon should be fired, {CO_R ... CO_UP_R}, or CO_air. */ private: const WeaponContext *wc; Boolean enteredScope; // not clocked }; // typedef Weapon *WeaponP; Defined above. //////////// Cutter // Parent: Weapon // NOTE: Uses CO_center for cutter directly in front of user. struct CutterContext { int damage; // per turn Size offsets[CO_DIR_MAX]; // From User's middle to Cutter's middle. SoundName cuttingsound; WeaponContext weaponContext; }; typedef WeaponXdata CutterXdata; class Cutter: public Weapon { public: Cutter(const CutterContext &c_x,CutterXdata &x_data, WorldP w,LocatorP l,const Pos &pos); DECLARE_INTERNAL_NODE_IO(Cutter); virtual Boolean is_cutter(); virtual Boolean ready(); virtual int get_ammo(); virtual int get_ammo_max(); virtual Boolean ignore_walls(); /* NOTE: We don't want cutters that are held to get bounced through walls. */ virtual void set_ammo(int); virtual void follow(const Area &,Dir,Boolean); virtual void enter_scope_next(PhysicalP); virtual void leave_scope_next(PhysicalP); virtual void collide(PhysicalP); virtual void update(); virtual void take_ammo_from(WeaponP); /* EFFECTS: "Heal" up the chainsaw as if chainsaws had been switched. */ private: enum {UNHELD_DIR = CO_R}; Dir dir_4_from_user_dir(Dir); Boolean inScope,inScopeNext; Id killerId; // Valid iff inScope. const CutterContext *context; }; //////////// Gun // Parent: Weapon // Shoots shells. Has timer between allowed shots. struct GunContext { int shotTime; int ammoInitial; int ammoMax; WeaponContext weaponContext; }; typedef WeaponXdata GunXdata; class Gun: public Weapon { public: Gun(const GunContext &,GunXdata &,WorldP,LocatorP,const Pos &); DECLARE_INTERNAL_NODE_IO(Gun); virtual Boolean is_gun(); virtual Boolean ready(); int get_ammo(); int get_ammo_max(); virtual void update(); #ifndef PROTECTED_IS_PUBLIC protected: #endif void set_ammo(int); void set_shot_timer() {timer.set();} virtual Size get_shot_size(Dir); virtual void fire(const Id &id,ITcommand command); void _fire(const Id &id,Dir dir,Boolean setTimer = True, Boolean costsAmmo = True); /* NOTE: Only the first of these two functions should be overridden. */ /* EFFECTS: Gun is fired by the shooter id with ITcommand command or in Dir dir. setTimer says whether or not to force a delay between shots. costsAmmo says whether a unit of ammo is subtracted for the shot.*/ virtual PhysicalP create_shot(PhysicalP shooter,WorldP world, LocatorP locator,const Pos &pos,Dir dir); /* EFFECTS: Create the object to be fired out of the gun. E.g. shell, swap_shell. shooter is the object firing the gun. */ /* DEFAULT: Create a Shell. */ private: Timer timer; int ammo; const GunContext *gc; }; //////////// SingleGun // Parent: Gun struct SingleGunContext { GunContext gunContext; }; typedef GunXdata SingleGunXdata; class SingleGun: public Gun { public: SingleGun(const SingleGunContext &,SingleGunXdata &, WorldP,LocatorP,const Pos &); DECLARE_NULL_INTERNAL_NODE_IO(SingleGun); virtual Boolean ready(); private: virtual void fire(const Id &id,ITcommand command); Id shotId; }; //////////// Whistle // Parent: Weapon struct WhistleContext { int coolnessNoAmmo; int ammo; // Must be <= Whistle::PET_MAX. // Chance that the alternate pet will be created, 0 if no alternate // pet is ever created. int alternateChance; WeaponContext weaponContext; }; typedef WeaponXdata WhistleXdata; class Whistle: public Weapon { public: Whistle(const WhistleContext &,WhistleXdata &,WorldP w,LocatorP l,const Pos &pos); DECLARE_INTERNAL_NODE_IO(Whistle); virtual Boolean ready(); virtual int get_ammo(); virtual int get_ammo_max(); /* NOTE: Can return PH_AMMO_UNLIMITED. */ virtual int get_coolness(); virtual Boolean useful_no_ammo(); virtual Boolean fire_repeatedly(); virtual void fire(const Id &id,ITcommand command); /* REQUIRES: command is a weapon command. */ /* EFFECTS: Fire the weapon according to the specified command. id is the physical firing the weapon. */ virtual void act(); #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual void set_ammo(int); virtual PetP create_pet(IntelP master,Boolean alternatePet,int n) = 0; /* EFFECTS: Create the object that the Whistle controls. Whistles may have the ability to create an alternate pet than the ususal one. alternatePet will be True in this case. 0 < n < number of pets created this turn, in case the Whistle wants to do something different for different pets. Create and register Intel and Physical. Return intel. */ private: enum {PET_MAX = 10}; IntelId pets[PET_MAX]; // Must all be class Pet. int petNum; int ammo; const WhistleContext *context; }; ////////// Creature // Parent: Moving // Moving with stances. Can be affected by gravity. Has list of Capabilites. struct CreatureContext { Speed crawlSpeed; Speed centerSpeed; Speed airSpeed; Speed climbSpeed; Speed jump; Speed acceleration; Health corpseHealth; // A positive number. Boolean biological; DropletType dropletType; SoundName deadSoundId; MovingContext movingContext; }; typedef MovingXdata CreatureXdata; // By itself, Modifier is a dummy. typedef int Attribute; class Modifier { public: enum { ACCELERATION,AIR_SPEED,CENTER_SPEED,CLIMB_SPEED,CRAWL_SPEED,JUMP, // creatureContext DAMAGE, // fighter, prickly HIGH, // A Boolean, tells whether Creature is high or not. HEALTH_MAX, // Changes maximum health (not current health) CORPOREAL_ATTACK,HEAT_ATTACK, // Full protection from an attack. ATTRIB_NONE }; /////// Operations acting on this specific Modifier. Modifier(int timed = 0,Boolean head = False); /* EFFECTS: If head is True, this is the start of a new list of modifiers. else, this is a modifier to insert into a list. */ virtual ~Modifier(); /* EFFECTS: Delete self and any modifiers following in the chain. If you want to just delete a single modifier, make sure to remove it from its list first. */ void clear(); /* EFFECTS: Make this an empty list. I.e. only the head. */ /* REQUIRES: This is the head. */ virtual ModifierId get_modifier_id(); // virtual int apply(Attribute attr,int startVal); /* EFFECTS: Apply this Modifier to the attribute. */ virtual void combine(Modifier *other); /* EFFECTS: Combine other modifier into this one. */ /* NOTE: Call up the tree. */ void remove(); /* EFFECTS: Remove self from list. */ /////// List operations, where "this" is the head of the list. // void prepend(Modifier *); /* EFFECTS: Add to front of list. */ void append_unique(Modifier *); /* EFFECTS: Add to end of list if none with same ModifierId, else use combine() to merge them. */ // void remove(Modifier *); /////// List operations on the remainder of list. virtual int apply(Attribute attr,int startVal); /* EFFECTS: Apply all Modifiers in list starting with this. */ virtual void clock(PhysicalP p); /* EFFECTS: Clock all modifiers in list. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual void preDie(PhysicalP p); /* EFFECTS: Called just before modifier kills itself. */ Modifier *next; Modifier *prev; Boolean timed; Timer timer; private: Boolean isHead; // Is this the dummy Modifer at the head of the list. }; // doubles an attribute, then triples, then quadruples as you // combine() more of them. class Doubler: public Modifier { public: Doubler(int timed = 0); void combine(ModifierP); #ifndef PROTECTED_IS_PUBLIC protected: #endif // Children can change these values. float multiplier; float increment; }; class Creature: public Moving { // All template classes must be able to access protected methods of creature. friend class BSticky; friend class BPrickly; public: Creature(const CreatureContext &m_c, CreatureXdata &x_data, PtrList *abilities, WorldP world,LocatorP l,const Pos &rawPos); /* NOTE: Creature owns the memory pointed to by abilities, and will delete it when finished. */ Creature(); /* NOTE: Should never be called. */ // Can't use DECLARE_INTERNAL_NODE_IO() because of the PtrList argument. Creature(InStreamP,const CreatureContext &, CreatureXdata &, WorldP,LocatorP); virtual void update_from_stream(InStreamP in); void _update_from_stream(InStreamP); virtual int get_write_length(); virtual void write(OutStreamP); virtual ~Creature(); virtual Boolean is_creature(); Stance get_stance() {return stance;} Boolean can_climb() {return canClimb;} virtual ITcommand get_command(); /* NOTE: Will return ITnone if the Creature is stunned. */ const Hanging &get_hanging() {return hanging;} /* EFFECTS: Get the corner that the object is hanging off of, or CO_AIR if not hanging off a corner. */ const Touching &get_touching_area() {return touching;} /* EFFECTS: The object's actual touching. I.e. according to its area. */ Grav get_grav() {return grav;} Boolean get_alien_immune() {return !alienImmune.ready();} /* EFFECTS: Is Creature immune to Alien and Hugger attacks. */ ModifierP get_modifiers() {return modifiers;} /* EFFECTS: Returns the modifier list for this Creature. Not a copy. Will never return NULL. */ virtual void get_followers(PtrList &list); /* NOTE: Just for the abilities. */ Boolean stunned() {return !stunTimer.ready();} Boolean biological() {return cc->biological;} /* EFFECTS: Is the Creature a biological organism. E.g. as opposed to a machine. */ Boolean on_door(); /* NOTE: Convenience function to say whether *this is on top of a door. */ Boolean get_want_climb() {return wantClimb;} void set_want_climb(Boolean val) {wantClimb = val;} /* NOTE: Actually, ALL climbing should be in Creature. */ virtual Boolean command_repeatable(ITcommand c); /* EFFECTS: Don't repeat going through doors, or getting up from a crouch. */ Boolean standing_squarely(); /* EFFECTS: Standing squarely on solid ground, not hanging over the edge. */ virtual ClassId get_weapon_string(const char *&str); virtual int get_drawing_level(); /* NOTE: Just for the abilities. */ virtual int get_anim_time(); /* NOTE: Just for the abilities. */ virtual void follow(const Area &followeeArea,Dir followeeDir, Boolean currentAndNext); /* NOTE: Delegate to abilities. */ virtual Boolean swap_protect(); /* NOTE: Just for the abilities. */ virtual Boolean frog_protect(); /* NOTE: Just for the abilities. */ void stun_next(int time); /* EFFECTS: Stun the creature for time turns. */ virtual void set_intel(IntelP i); /* NOTE: Just for informing the abilities. */ void set_alien_immune(int immTime) {alienImmune.set(immTime);} /* EFFECTS: Will be immune to alien and hugger attacks for immTime turns. */ /* NOTE: Immediate. */ virtual void set_quiet_death(); /* NOTE: Calling set_quiet_death on a corpse destroys it. */ virtual void heal(); /* NOTE: Just for informing the abilities. */ virtual void set_mapped_next(Boolean val); /* NOTE: Just for informing the abilities. */ virtual void drop_all(); /* NOTE: Just for informing the abilities. */ virtual Boolean corporeal_attack(PhysicalP,int damage); virtual void heat_attack(PhysicalP,int heat,Boolean secondary); virtual void act(); virtual void update(); virtual void die(); virtual void dr_clock(); /* NOTE: Just to deal with weirdness with Composite objects. */ virtual void collide(PhysicalP); virtual AbilityP get_ability(AbilityId); /* EFFECTS: Return the ability if the Creature has it, else return NULL. */ virtual HolderP get_holder(); /* EFFECTS: Return the Holder ability, if the Creature has it, else NULL. */ virtual LocomotionP get_locomotion(); virtual CompositeP get_composite(); void add_ability(AbilityP); /* REQUIRES: The creature does not already have the ability. */ /* EFFECTS: Add a new abilitity to the Creature. */ /* NOTE: Creature now owns the memory for the ability. */ void remove_ability(AbilityId abilityId); /* REQUIRES: The creature has the ability in question. */ /* EFFECTS: Remove ability from the Creature. Calls the die() method on the ability. */ static const Stats &get_stats() {return stats;} static TransformMap uprightTransformOverride; /* EFFECTS: A convenience object. Not actually used by Creature, but useful for auto-generating pixmaps for creatures that walk upright when they are on the walls or ceiling, e.g. Walker with the Sticky ability. The default in Transform2D is to generate bitmaps for wall and ceiling that are rotations of the crawling bitmaps (CO_dn_*). This lets you generate bitmaps for wall and ceiling that are rotations of the upright walking bitmaps (CO_center_*). */ // Now they must be public so that the children of Ability can // access them. It is not enough to make Ability a friend class. #if 0 #ifndef PROTECTED_IS_PUBLIC protected: #endif #endif enum {DEAD_DIR = CO_R}; virtual Boolean generate_masks(); /* EFFECTS: On Windows decide whether to auto-generate masks for this object. */ Stance get_stance_next() {return stanceNext;} virtual Health get_health_max(); Speed get_acceleration(); Speed get_jump(); // Only used for an assert in Fighter::Fighter Touching (*get_offset_generator())(Dir) {return cc->movingContext.offsetGenerator;} TransformMap* get_transform_override() {return cc->movingContext.transformOverride;} /* NOTE: These methods replace get_creature_context(). Add more if necessary. */ Touching get_touching_stance(); /* EFFECTS: The object's touching according to its stance. */ time_t get_birth_time() {return birthTime;} virtual void get_pixmap_mask(Xvars &,int dpyNum,CMN_IMAGEDATA &imageData, Dir dir,int animNum); /* NOTE: Calls through all abilities. Calls up the tree. */ /* MODIFIES: pixmap, mask */ void _get_pixmap_mask(Xvars &,int dpyNum,CMN_IMAGEDATA &imageData, Dir dir,int animNum); /* EFFECTS: Creature-specific functionality of get_pixmap_mask(), does not call abilities. Does call up the tree. */ /* NOTE: Abilities can use this to implement Ability::get_pixmap_mask(). */ void _heat_attack(PhysicalP killer,int heat,Boolean secondary); /* EFFECTS: Creature-specific functionality of get_pixmap_mask(), does not call abilities. Called after applying modifiers. Does call up the tree. */ /* NOTE: Abilities can use this to implement Ability::heat_attack(). */ virtual void get_size_offset_next(Size &size,Size &offset,Dir dirNext); /* MODIFIES: size, offset */ void _get_size_offset_next(Size &size,Size &offset,Dir dirNext); /* MODIFIES: size, offset */ /* EFFECTS: Creature-specific functionality of get_size_offset_next(), does not call abilities. Does call up the tree. */ /* NOTE: Abilities can use this to implement Ability::get_size_offset_next(). */ Boolean stunned_next() {return stunNext ? True : False;} int compute_droplets_num(int damage); /* EFFECTS: Number of droplets (of blood) to produce when hit with the given amount of damage. */ void set_stance(const Stance &st) {stance = st;} void set_stance_next(const Stance &stance); /* EFFECTS: Sets the next stanceection for the object to be stance. Can be called multiple times before update, only the last call is used. */ void set_grav_next(const Grav &g) {gravNext = g;} /* EFFECTS: Sets the pull of gravity for the next turn to be grav. */ void center_wsquare_x_next(const Loc &loc); /* REQUIRES: loc overlaps with the area, stanceNext set to CO_climb */ /* EFFECTS: Tries to center the x position object on the wsquare at loc. (May be bumped a bit if a wall prevents exact centering.) */ void corner(const Hanging &hanging); /* REQUIRES: stanceNext is set to correspond to h.corner. */ /* EFFECTS: Tries to move the object around the corner it is hanging off of. Note that hanging.corner is the initial corner, not the desired final one. */ int apply_modifiers(Attribute attr,int initial,int maximum = -1); /* EFFECTS: Apply Intel and Creature modifiers to attr, starting with initial. Clamp to maximum if supplied. */ // Must make these public for Ability to get to them. LocatorP get_locator() {return Moving::get_locator();} Boolean get_mapped_next() {return Moving::get_mapped_next();} Boolean alive_next() {return Moving::alive_next();} virtual Dir get_dir_next(); void set_raw_pos_next(const Pos &rpos) {Moving::set_raw_pos_next(rpos);} WorldP get_world() {return Moving::get_world();} void _set_middle_next(const Pos &pos) {Moving::_set_middle_next(pos);} virtual void update_area_next(Boolean currentAndNext); private: virtual Boolean stick_touching(Touching touching); /* EFFECTS: Should the Creature stick to walls in the specified direction. */ static Dir compute_dir(const Stance &stance,const Vel &vel); /* USES: nothing */ /* EFFECTS: Return the dir corresponding to stance and vel. */ Boolean context_valid(); void initialize_abilities(PtrList *caps); void check_abilities(); ABBitField compute_abilities_bit_field(); Touching touching; MoverId touchingMoverId; Hanging hanging; Boolean canClimb; Stance stance,stanceNext; Grav grav,gravNext; const CreatureContext *cc; Timer corpseTimer; Boolean wantClimb; // actually, ALL climbing should be in Creature. // Id killerId; Now in Intel. time_t birthTime; static Stats stats; // If non-zero, indicates how many turns Creature should be stunned for. int stunNext; Timer stunTimer; Timer alienImmune; ModifierP modifiers; // Could make this a PtrList to save space at the cost of lookup time. AbilityP abilities[AB_MAX]; // Don't cache, so we don't have to worry about maintaining the cache. // HolderP holder; // LocomotionP locomotion; }; typedef Creature *CreatureP; typedef AbilityP (*AbilityCreateFunctionType)(InStreamP,CreatureP); class Ability { public: Ability(); virtual ~Ability(); Ability(InStreamP,CreatureP); /* EFFECTS: Stream ctor. */ virtual void initialize(CreatureP); /* EFFECTS: Called immediately after Creature has finished constructing itself. Pass in the Creature. */ /* NOTE: This is not used for the stream constructor. */ virtual void update_from_stream(InStreamP in); /* DEFAULT: do nothing */ virtual int get_write_length(); /* DEFAULT: return 0 */ virtual void write(OutStreamP); /* DEFAULT: do nothing */ virtual AbilityId get_ability_id() = 0; virtual Boolean is_holder(); /* DEFAULT: False */ virtual Boolean is_locomotion(); /* DEFAULT: False */ virtual Boolean is_composite(); /* DEFAULT: False */ virtual Boolean get_pixmap_mask(Xvars &,int dpyNum,CMN_IMAGEDATA &,Dir,int); virtual Boolean get_size_offset_next(Size &size,Size &offset,Dir dirNext); /* DEFAULT: return False */ virtual ClassId get_weapon_string(const char *&str); /* MODIFIES: str */ /* DEFAULT: return A_None */ /* NOTE: Must only modify str if something other than A_None is returned. */ virtual void drop_all(); /* DEFAULT: do nothing */ virtual void get_followers(PtrList &list); /* DEFAULT: do nothing */ virtual Boolean follow(const Area &followeeArea,Dir followeeDir, Boolean currentAndNext); /* DEFAULT: return False */ virtual Boolean command_repeatable(ITcommand); /* DEFAULT: True. */ virtual int get_drawing_level(); /* EFFECTS: Return the drawing level if the Ability wants to override the Creature's behavior, else return -1. */ /* DEFAULT: return -1 */ virtual int get_anim_time(); /* EFFECTS: Return the anim time if the Ability wants to override the Creature's behavior, else return -1. */ /* DEFAULT: return -1 */ virtual Boolean heat_attack(PhysicalP killer,int heat,Boolean secondary); /* DEFAULT: return False */ virtual Boolean swap_protect(); /* DEFAULT: return False */ virtual Boolean frog_protect(); /* DEFAULT: return False */ virtual void set_intel(IntelP i); /* DEFAULT: do nothing. */ virtual void heal(); /* DEFAULT: do nothing */ virtual void set_mapped_next(Boolean val); /* DEFAULT: do nothing */ virtual void act(); /* DEFAULT: do nothing */ virtual void update(); /* DEFAULT: do nothing */ virtual void die(); /* NOTE: Also called when the ability is removed from a Creature. */ /* DEFAULT: do nothing */ virtual Boolean collide(PhysicalP other); /* DEFAULT: return False */ virtual Boolean stick_touching(Touching touching); /* EFFECTS: Does this Ability explicitly give the ability to stick when touching in the specified direction. False means no extra ability is granted. */ /* DEFAULT: return False */ static void register_abilities(); /* EFFECTS: Must be called before any abilities have been read from stream. */ static AbilityP create_from_stream(InStreamP in,AbilityId aId,CreatureP); /* EFFECTS: Create and initialize() an ability of type aId from the stream. The ability will be used for the given Creature. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif CreatureP cre; // short for easy use. // Static list of all create_from_stream() functions. static AbilityCreateFunctionType create_function[AB_MAX]; }; ///////// Locomotion // Gives the ability to move in some fashion. class Locomotion: public Ability { public: Locomotion(); Locomotion(InStreamP,CreatureP); virtual Boolean is_locomotion(); }; ///////// Grounded // Sticks to the ground only. Affected by gravity. Can't climb or jump. struct GroundedContext { int dummy; }; struct GroundedXdata {}; class Grounded: public Locomotion { public: Grounded(const GroundedContext &,GroundedXdata &); DECLARE_NULL_ABILITY_IO(Grounded); virtual AbilityId get_ability_id(); virtual void act(); static GroundedContext defaultContext; static GroundedXdata defaultXdata; }; //////// Suicide // Kills self if the command IT_ITEM_USE is seen. struct SuicideContext { int dummy; }; struct SuicideXdata {}; class Suicide: public Ability { public: Suicide(const SuicideContext &,SuicideXdata &); DECLARE_NULL_ABILITY_IO(Suicide); virtual AbilityId get_ability_id(); virtual void act(); static SuicideContext defaultContext; static SuicideXdata defaultXdata; }; ////////// Hopping // Parent: Creature // struct HoppingContext { int dummy; }; struct HoppingXdata {}; class Hopping: public Locomotion { public: Hopping(const HoppingContext &,HoppingXdata &); DECLARE_NULL_ABILITY_IO(Hopping); virtual AbilityId get_ability_id(); virtual void act(); static HoppingContext defaultContext; static HoppingXdata defaultXdata; }; ///////// Holder // Can hold weapons and/or items. class Holder: public Ability { public: Holder(); Holder(InStreamP,CreatureP); virtual Boolean is_holder(); virtual int get_weapons_num() = 0; virtual int get_items_num() = 0; /* NOTE: Returned value is not valid after current turn. */ virtual PhysicalP get_weapon(int) = 0; virtual PhysicalP get_item(int) = 0; virtual PhysicalP get_weapon_current() = 0; virtual PhysicalP get_item_current() = 0; /* NOTE: Can return NULL. */ /* IMPLEMENTATION: get_item_current() should try to return non-NULL if get_items_num() is > 0. Unlike weapons, there should always be an item ready if possible. We don't quite live up to this right now, as User and Carrier count the items in act() when they should do it in update() to see if any items have been killed that turn. */ virtual int get_item_count() = 0; /* EFFECTS: If get_item() is non-NULL, return the number of that item the Physical is carrying. Elese return 0. */ // already has get_weapon_string. Boolean ok_to_hold(PhysicalP other); /* EFFECTS: Checks a) cre is alive b) other is an Item and can_take() c) no conflicts with other Abilities (important). */ /* NOTE: Now is public, so OnFire knows not to burn stuff. */ }; ////////// User // Holds and uses items and weapons. The items and weapons are made to follow // the User. struct UserContext { Boolean usesWeapons; Boolean usesItems; }; struct UserXdata {}; class User: public Holder { public: User(const UserContext &,UserXdata &); DECLARE_ABILITY_IO(User); virtual AbilityId get_ability_id(); virtual int get_weapons_num(); virtual int get_items_num(); /* NOTE: Returned value is not valid after current turn. */ virtual PhysicalP get_weapon(int); virtual PhysicalP get_item(int); virtual PhysicalP get_weapon_current(); virtual PhysicalP get_item_current(); /* NOTE: Can return NULL. */ virtual int get_item_count(); virtual ClassId get_weapon_string(const char *&str); /* EFFECTS: str is set to point to a static string containing the string for ClassId. */ virtual void get_followers(PtrList &list); virtual Boolean command_repeatable(ITcommand c); virtual void set_mapped_next(Boolean val); /* EFFECTS: Bring current weapon in/out of scope and then change mapped. */ virtual void drop_all(); virtual void act(); virtual void update(); virtual Boolean collide(PhysicalP); virtual void die(); static UserContext defaultContext; static UserXdata defaultXdata; private: Boolean has_weapon(Weapon **weapon,ClassId classId); /* MODIFIES: weapon */ /* EFFECTS: Like has_weapon(ClassId) except will return the weapon in weapon if not NULL. */ int coolest_weapon(); /* EFFECTS: Return index of weapon with highest coolness or weaponsNum if builtIn weapon is coolest. Only consider weapons with nonNegative coolness. */ int coolest_item(); /* EFFECTS: Return index of coolest item or itemsNum. */ int next_coolest_weapon(); /* EFFECTS: Return the coolest weapon (or builtIn weapon) that is less cool than the current weapon. Can be non-negative coolness. If none found, return coolest_weapon(). */ int next_coolest_item(); /* EFFECTS: Return coolest item less cool than current item. Cycle around to coolest_item() if none found. */ // int defaultable_weapon(); /* REQUIRES: weaponsNum and weapons are properly updated. */ /* EFFECTS: Returns the index of a wepon in weapons that is defaultable or weaponsNum if there is none. */ void weapon_use(ITcommand command); void weapon_change(); void weapon_drop(); void item_use(); void item_change(); void item_drop(); /* NOTE: Called in User::_act(). */ int item_class_count(ClassId); /* EFFECTS: Returns the number of items held of the given class. */ Id weapons[PH_WEAPONS_MAX]; int weaponsNum; // weaponCurrent == weaponsNum if using builtIn weapon or no weapon. int weaponCurrent; // If weaponCycleTimer is not ready(), cycle to next weapon on IT_WEAPON_CHANGE. // If ready(), start again from coolest_weapon(). Timer weaponCycleTimer; // Memory of previous weapon dir is now in ui. Id items[PH_ITEMS_MAX]; int itemsNum; // itemCurrent == itemsNum if no selected item. int itemCurrent; // Like weaponCycleTimer. Timer itemCycleTimer; // How many of the current item the User has. int itemCount,itemCountNext; const UserContext *context; }; typedef User *UserP; ////////// Carrier // Holds one item or weapon. The items and weapons are made to follow // the Carrier. Can use items, but not weapons. struct CarrierContext { int dummy; }; struct CarrierXdata {}; class Carrier: public Holder { public: Carrier(const CarrierContext &,CarrierXdata &); DECLARE_NULL_ABILITY_IO(Carrier); virtual AbilityId get_ability_id(); virtual int get_weapons_num(); virtual int get_items_num(); /* NOTE: Returned value is not valid after current turn. */ virtual PhysicalP get_weapon(int); virtual PhysicalP get_weapon_current(); virtual PhysicalP get_item(int); virtual PhysicalP get_item_current(); /* NOTE: Can return NULL. */ virtual int get_item_count(); virtual void get_followers(PtrList &list); virtual void drop_all(); virtual void act(); virtual Boolean collide(PhysicalP); virtual void die(); static CarrierContext defaultContext; static CarrierXdata defaultXdata; private: Boolean hasItem; Id item; }; typedef Carrier *CarrierP; ////////// Fighter // Can attack in different directions. struct FighterContext { CMN_COLOR foreground; // default = black CMN_COLOR background; // default = white int slide; int jumpHorizontal; int jumpVertical; int damageStuck; int damageFree; Size hotSpots[CO_DIR_MAX]; // Must add in offset to use. SoundName attackSound; }; // Bitmaps stored in FighterXdata have all moved to MovingXdata. struct FighterXdata {}; class Fighter: public Ability { public: Fighter(const FighterContext &f_c,FighterXdata &x_data); /* NOTE: This is currently the only Ability that uses its xdata. Also, the only one that needs the correct context if we are a Client. */ DECLARE_ABILITY_IO(Fighter); virtual void initialize(CreatureP); virtual AbilityId get_ability_id(); virtual Boolean get_pixmap_mask(Xvars &,int dpyNum,CMN_IMAGEDATA &imageData, Dir dir,int animNum); virtual Boolean get_size_offset_next(Size &size,Size &offset,Dir dirNext); virtual ClassId get_weapon_string(const char *&str); virtual void act(); virtual void update(); virtual Boolean collide(PhysicalP); static Touching offset_generator(Dir); /* EFFECTS: Used to modify the way Moving generates offsets. It takes into account the mapping of dir to attackDir, i.e. holding the attacking pixmaps in unused slots in MovingContext. */ /* NOTE: All classes that have the fighter ability must have Fighter::offset_generator as the value of MovingContext::offsetGenerator. This will cause problems if we want to be able to dynamically add or remove the Fighter Ability to/from a creature. Fix it when it comes up. */ static TransformMap transformOverride; /* EFFECTS: Similar to offset_generator in that it overrides behavior in Moving to deal with the mapping of dir to attackDir. In this case it is needed to provide info about which bitmaps are transformations of other bitmaps. */ static TransformMap uprightTransformOverride; private: static Attack dir_to_attack(Dir dir); static Dir dir_to_attack_dir(Dir dir); /* REQUIRES: dir has a corresponding attack dir */ /* EFFECTS: Returns the dir used to store the attacking pixmaps given the non-attacking dir. */ static Boolean is_attack_dir(Dir dir); static Dir attack_dir_to_dir(Dir dir); /* REQUIRES: dir is an attack dir */ /* EFFECTS: Inverse of dir_to_attack_dir. */ void attack_stuck(Dir dir,Stance stance); void attack_free_horizontal(Dir dir); /* NOTE: Does not zero vertical velocity. */ void attack_free_vertical(Dir dir); /* NOTE: Vertical velocity only. */ static const FighterContext *lookup_context(ClassId); /* NOTE: Fighter has its own functional registry of all Fighters in the system. Not very extendable right now. Would have to be redone for templates. */ static FighterXdata defaultXdata; const FighterContext *fc; Attack attack, attackNext; Timer stuckTimer; }; ////////// Walking // Sticks to the ground only. Affected by gravity. struct WalkingContext { int dummy; }; struct WalkingXdata {}; class Walking: public Locomotion { public: Walking(const WalkingContext &,WalkingXdata &); DECLARE_NULL_ABILITY_IO(Walking); virtual AbilityId get_ability_id(); virtual void act(); static WalkingContext defaultContext; static WalkingXdata defaultXdata; private: Pos rawPosPrev; Vel velPrev; }; ////////// Sticky // Sticks to and walks on flat surfaces in four directions. Affected by // gravity. struct StickyContext { Speed wallCrawlSpeed; }; struct StickyXdata {}; class Sticky: public Locomotion { public: Sticky(const StickyContext &,StickyXdata &); DECLARE_NULL_ABILITY_IO(Sticky); virtual void initialize(CreatureP); virtual AbilityId get_ability_id(); virtual Boolean stick_touching(Touching touching); virtual void act(); Speed get_wall_crawl_speed() {return context->wallCrawlSpeed;} /* EFFECTS: Returns the maximum speed for crawling on walls and ceiling. */ static Boolean has_required_frames(const MovingContext *); /* EFFECTS: Does a Creature with the given MovingContext have all the animation frames needed for the Sticky Ability. */ static StickyContext defaultContext; static StickyXdata defaultXdata; /* NOTE: Just dummies to create object from a stream. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif Boolean want_corner(const Corner &corner); /* EFFECTS: Returns True if the object should go around the given corner, False otherwise. corner is the initial, not final corner.*/ Stance cornered_stance(const Hanging &h); /* EFFECTS: Returns the stance to take in order to go around the corner of h. */ void set_want_corner(const Corner &c1) {wantCorner1 = c1; wantCorner2 = CO_air;} void set_want_corner(const Corner &c1,const Corner &c2) {wantCorner1 = c1; wantCorner2 = c2;} /* EFFECTS: Tell the object that it should go around a corner if possible. The given values are in effect until changed. */ /* NOTE: set_want_corner(CO_air) should be used to disable cornering. */ private: ///// DISABLED void set_dont_attach(Boolean val) {dontAttach = val;} Boolean get_dont_attach() {return False; /* dontAttach; */} /* NOTE: We may want to make these virtual or methods of Creature later on. */ Corner wantCorner1,wantCorner2; Boolean dontAttach; const StickyContext *context; }; ////////// Flying // Floats around. Can walk on the ground. struct FlyingContext { int gravTime; }; struct FlyingXdata {}; class Flying: public Locomotion { public: Flying(const FlyingContext &,FlyingXdata &); DECLARE_NULL_ABILITY_IO(Flying); virtual AbilityId get_ability_id(); virtual void act(); static FlyingContext defaultContext; static FlyingXdata defaultXdata; private: Timer gravTimer; const FlyingContext *context; }; ////////// BuiltIn // Has a directional built in weapon. // NOTE: BuiltIn depends on existence of Holder, in act() and // get_weapon_string(). struct BuiltInContext { int shotTime; ClassId weaponClassId; const char *weaponStr; int coolness; // of the builtIn weapon. SoundName attackSound; Size (*get_shot_size)(Dir); PhysicalP (*create_shot)(WorldP,LocatorP,const Pos &,const Id &shooter,Dir); Dir (*compute_weapon_dir)(ITcommand); // may be NULL. }; struct BuiltInXdata {}; class BuiltIn: public Ability { public: BuiltIn(const BuiltInContext &,BuiltInXdata &); /* NOTE: Must pass in static functions for get_shot_size, create_shot, and compute_weapon_dir. compute_weapon_dir may be NULL, BuiltIn will use the default. */ DECLARE_NULL_ABILITY_IO(BuiltIn); virtual AbilityId get_ability_id(); virtual ClassId get_weapon_string(const char *&str); /* EFFECTS: str is set to point to a static string containing the string for ClassId. */ virtual void act(); int get_weapon_coolness() {return context->coolness;} /* EFFECTS: Return the coolness of the built-in weapon. */ Boolean ready(); /* EFFECTS: Is the BuiltIn ready to fire. */ /* NOTE: This is not overriding any parent's ready() method anymore. */ static BuiltInContext defaultContext; static BuiltInXdata defaultXdata; private: #if 0 virtual Dir compute_weapon_dir(ITcommand); /* EFFECTS: Returns the direction the weapon should be fired, {CO_R ... CO_UP_R}, or CO_air. */ virtual Size get_shot_size(Dir) = 0; virtual PhysicalP create_shot(const Pos &,Dir) = 0; #endif Timer shotTimer; const BuiltInContext *context; }; typedef BuiltIn *BuiltInP; ////////// Hugger // Hugs onto any creature it collides with (except A_Alien and A_Hugger) // and stuns them, then turns them into an Alien. struct HuggerContext { // Which intel, the hugger's or the huggee's intel is implanted in the new // Alien. Boolean useHuggeeIntel; }; struct HuggerXdata {}; class Hugger: public Ability { public: Hugger(const HuggerContext &,HuggerXdata &); DECLARE_NULL_ABILITY_IO(Hugger); virtual AbilityId get_ability_id(); virtual int get_drawing_level(); virtual void act(); virtual Boolean collide(PhysicalP other); static HuggerContext defaultContext; static HuggerXdata defaultXdata; private: Id huggeeId; const HuggerContext *context; }; ///////// Prickly // Hurts anything it touches. struct PricklyContext { int damage; }; struct PricklyXdata {}; class Prickly: public Ability { public: Prickly(const PricklyContext &,PricklyXdata &); DECLARE_NULL_ABILITY_IO(Prickly); virtual AbilityId get_ability_id(); virtual ClassId get_weapon_string(const char *&str); virtual Boolean collide(PhysicalP); static PricklyContext defaultContext; static PricklyXdata defaultXdata; private: const PricklyContext *context; }; ///////// Healing // Heals up to twice its minimum ever damage. struct HealingContext { float multiplier; int unit; int time; }; // Not used now. struct HealingXdata {}; class Healing: public Ability { public: Healing(const HealingContext &,HealingXdata &); // Ignores the HealingXdata parameter. Important for AltarOfSin. DECLARE_NULL_ABILITY_IO(Healing); virtual void initialize(CreatureP); virtual AbilityId get_ability_id(); virtual void heal(); virtual void act(); static HealingContext defaultContext; static HealingXdata defaultXdata; private: Timer healTimer; Health healthMin; const HealingContext *context; }; ///////// Lifter // Can lift Liftables if there is no current weapon. struct LifterContext { int throwSpeed; // 0 means the Lifter can't throw }; struct LifterXdata {}; class LifterSpeedModifier : public Modifier { public: LifterSpeedModifier(); virtual ModifierId get_modifier_id(); virtual int apply(Attribute attr,int startVal); void set_lifting(Boolean val) {lifting = val;} /* NOTE: Lifter sets data on LifterSpeedModifier instead of vice-versa because we can't easily cast a Physical to a Lifter. C++ virtual base class bullshit. */ /* NOTE about NOTE: We could fix this now with our Ability architecture. */ private: Boolean lifting; }; class Lifter: public Ability { public: Lifter(const LifterContext &,LifterXdata &); DECLARE_NULL_ABILITY_IO(Lifter); virtual void initialize(CreatureP); virtual AbilityId get_ability_id(); virtual ClassId get_weapon_string(const char *&str); virtual void act(); /* NOTE: Make Liftable follow Lifter. */ virtual Boolean collide(PhysicalP); Boolean is_lifting(); static LifterContext defaultContext; static LifterXdata defaultXdata; private: void drop_liftable(PhysicalP liftable); void throw_liftable(PhysicalP liftable,Dir); Id liftable; // lifting something iff this is valid. ModifierP speedModifier; // cleaned up by Creature. const LifterContext *context; }; typedef Lifter *LifterP; ///////// Morphed // Some other object was morphed into this one. Will revert back to the // original one after some time. struct MorphedContext { int revertTime; }; struct MorphedXdata {}; class Morphed: public Ability { public: Morphed(const MorphedContext &,MorphedXdata &,PhysicalP); DECLARE_NULL_ABILITY_IO(Morphed); virtual AbilityId get_ability_id(); virtual void get_followers(PtrList &list); virtual void drop_all(); virtual void act(); virtual void die(); static MorphedContext defaultContext; static MorphedXdata defaultXdata; private: Boolean unmappedSet; Id unmapped; Timer timer; // Only meaningful if unmappedSet. }; ///////// AnimTime // Something with other than MOVING_ANIM_TIME struct AnimTimeContext { int animTime; }; struct AnimTimeXdata {}; class AnimTime: public Ability { public: AnimTime(const AnimTimeContext &,AnimTimeXdata &); DECLARE_NULL_ABILITY_IO(AnimTime); virtual void initialize(CreatureP); virtual AbilityId get_ability_id(); virtual int get_anim_time(); static const AnimTimeContext *lookup_context(ClassId); static AnimTimeXdata defaultXdata; private: const AnimTimeContext *context; }; ///////// OnFire // Constantly spouting flames, resistant to heat attacks, burns those that // touch it. struct OnFireContext { int fires; // How many Fire objects are created per turn. int heat; Boolean deadBurns; // Does a dead object burn. }; struct OnFireXdata {}; class OnFire: public Ability{ public: OnFire(const OnFireContext &,OnFireXdata &); DECLARE_NULL_ABILITY_IO(OnFire); virtual AbilityId get_ability_id(); virtual Boolean heat_attack(PhysicalP,int heat,Boolean secondary); virtual void act(); virtual Boolean collide(PhysicalP other); static OnFireContext defaultContext; static OnFireXdata defaultXdata; private: const OnFireContext *context; }; ///////// SwapProtect // Has limited protection from swap attacks. Unlimited protection from Frog attacks. // struct SwapProtectContext { int swapResistance; }; struct SwapProtectXdata {}; class SwapProtect: public Ability { public: SwapProtect(const SwapProtectContext &,SwapProtectXdata &); DECLARE_NULL_ABILITY_IO(SwapProtect); virtual AbilityId get_ability_id(); virtual Boolean swap_protect(); virtual Boolean frog_protect(); static SwapProtectContext defaultContext; static SwapProtectXdata defaultXdata; private: int swapResistance; }; ///////// Composite // A set of creatures that act like a single creature. // class Composite: public Ability { public: Composite(); Composite(InStreamP,CreatureP); Boolean is_composite(); virtual Boolean is_leader() = 0; /* EFFECTS: Is this object the leader of the rest of the objects. */ CompositeId get_composite_id() {return compositeId;} void set_composite_id(CompositeId cId) {compositeId = cId;} virtual PhysicalP get_draw_before_me(); /* DEFAULT: return NULL */ /* EFFECTS: Override this to control the drawing order of the Composite object. Return an object that must be drawn before this one. */ static void reset_id_generator() {idGenerator = 0;} #if 0 static CompositeId extract_composite_id(PhyscialP p); /* EFFECTS: Helper function to get the compositeId from a physical, or return COMPOSITE_ID_NONE, if p is not a Composite object. */ #endif #ifndef PROTECTED_IS_PUBLIC protected: #endif static CompositeId generate_id() {return idGenerator++;} /* EFFECTS: Create a unique CompositeId for a new composite object. */ private: CompositeId compositeId; static CompositeId idGenerator; }; ///////// Segmented // One segment of a segmented composite creature. Acts like the head if // it is the first in the chain. // // Use it by fully creating each Creature segment, then link them together. // struct SegmentedContext { int followDistance; }; struct SegmentedXdata {}; class Segmented: public Composite { public: Segmented(const SegmentedContext &,SegmentedXdata &); DECLARE_ABILITY_IO(Segmented); /* EFFECTS: Write out prev and next, so can draw properly. */ virtual AbilityId get_ability_id(); virtual void get_followers(PtrList &list); virtual Boolean follow(const Area &followeeArea,Dir followeeDir, Boolean currentAndNext); virtual Boolean get_pixmap_mask(Xvars &,int dpyNum,CMN_IMAGEDATA &imageData, Dir dir,int animNum); /* EFFECTS: Used to decide whether to draw the head or not. */ virtual void set_intel(IntelP i); /* NOTE: All the intel's in the chain must be consistent. */ virtual void act(); virtual void update(); virtual Boolean is_leader(); virtual PhysicalP get_draw_before_me(); Id get_prev() {return prev;} Id get_next() {return next;} /* EFFECTS: Search through chain of segments. */ static void create_and_add_composite(PtrList &ret, WorldP,LocatorP,int segmentsNum,const Pos &, PhysicalP (*create)(void *arg,WorldP w,LocatorP l,const Pos &pos), void *arg); /* MODIFIES: ret */ /* REQUIRES: create() creates something that has the Segmented ability. */ /* EFFECTS: Create a Composite object as a chain of Segments. Add all segments to the locator. Fill ret with all the Physicals of the chain, with the head in element 0. */ /* NOTE: Must return all segments in ret, since we can't traverse the segments via their Id's until after the first Locator::clock(). */ static SegmentedContext defaultContext; static SegmentedXdata defaultXdata; private: // Where to store the bitmaps in MovingContext. enum { LEADER_DIR = CO_DN_R_R, LEADER_ANIM_TIME = 4, }; void insert_before(CreatureP c); /* REQUIRES: c must have the Segmented Ability. */ /* EFFECTS: Insert this object in the chain before c. */ Boolean compatible_prev(PhysicalP); Boolean compatible_next(PhysicalP); /* EFFECTS: Is the object a compatible member of this composite object. */ void assume_leadership(); /* EFFECTS: Called when a non-leader becomes a leader. Not called in the constructor for a leader. */ void map_dir_anim_num(Dir& mappedDir,int& mappedAnimNum,Dir dir,int animNum); /* MODIFIES: mappedDir, mappedAnimNum */ /* EFFECTS: Get the direction and animNum to use to actually display the head, body, or dead pixmap. */ // These should be separated into current and next variables. Boolean isLeader; Id prev; Id next; Timer leaderAnimTimer; int leaderAnimNum; // Chosen randomly. Animation frame to use if leader. const SegmentedContext* context; // Use this followDistance, not the one in context. So, that reading // from stream works properly. int followDistance; }; typedef Segmented* SegmentedP; ///////// Sensitive // Sensitive to certain types of attacks, e.g. Yeti takes extra damage from // heat attacks. Not an ability you really want to have. struct SensitiveContext { int corporealMultiplier; // 0 means no change int heatMultiplier; // 0 means no change }; struct SensitiveXdata {}; class Sensitive: public Ability { public: Sensitive(const SensitiveContext&,SensitiveXdata&); DECLARE_NULL_ABILITY_IO(Sensitive); /* EFFECTS: Write out prev and next, so can draw properly. */ virtual AbilityId get_ability_id(); // virtual Boolean corporeal_attack(PhysicalP killer,int damage); // Implement it when we need it. virtual Boolean heat_attack(PhysicalP killer,int heat,Boolean secondary); static SensitiveContext defaultContext; static SensitiveXdata defaultXdata; private: const SensitiveContext* context; }; typedef Sensitive* SensitiveP; #endif xevil-2.02r2.orig/cmn/role.h0100644000175000017500000005056707041422160015202 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "role.h" #ifndef ROLE_H #define ROLE_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif #include "utils.h" #include "world.h" #include "locator.h" #include "streams.h" #include "intel.h" // Time to show error message if Role fails. #define ROLE_FAILED_TIME 200 #define FREE_TURN_WINDOW 0xFFFFFFFF class IGameManager { public: // virtual void new_world(const Dim&) = 0; virtual void world_changed() = 0; /* NOTE: Really just used to force redraw. */ // virtual void new_world(InStreamP worldStream) = 0; /* EFFECTS: Kill all objects and load new world from stream. */ virtual void manager_reset(GameStyleType) = 0; /* EFFECTS: Start a new game. Set game style to the new value. */ virtual void register_intel(int num,IntelP intel) = 0; /* EFFECTS: Associate intel with viewport num. */ /* NOTE: No corresponding unregister_intel() needed yet. */ virtual void humans_num_incremented() = 0; virtual void humans_num_decremented(const IntelId &) = 0; virtual void quit() = 0; virtual void set_humans_playing(int) = 0; virtual void set_enemies_playing(int) = 0; virtual Quanta manager_get_quanta() = 0; virtual GameStyleType get_game_style_type() = 0; }; typedef IGameManager *IGameManagerP; class ITurnStarter { public: virtual void start_turn() = 0; }; typedef ITurnStarter *ITurnStarterP; class Role { public: Role(); virtual ~Role(); virtual Boolean ok() = 0; virtual RoleType get_type() = 0; virtual int get_humans_num() = 0; virtual GameStyleType get_default_game_style(); /* DEFAULT: LEVELS */ virtual int num_viewports_needed(); /* EFFECTS: The first num_viewports_needed() Humans created will have viewports, the rest will not. */ /* DEFAULT: Return get_humans_num(). */ virtual void set_humans_num(int) = 0; virtual void human_created(IGameManagerP,HumanP human,int num, WorldP,LocatorP); /* EFFECTS: Called for each human created when a new game starts. num gives the order in which the humans are created. It should not be used inside the Role for index information. */ /* DEFAULT: do nothing */ virtual void clock(IGameManagerP,WorldP,LocatorP); /* DEFAULT: Do nothing */ virtual void yield(CMN_TIME,int quanta,IGameManagerP,ITurnStarterP,WorldP, LocatorP) = 0; /* EFFECTS: Throw away time (in ms). Guaranteed to be called every turn. */ virtual void new_level(IGameManagerP,WorldP,LocatorP); /* EFFECTS: Called when a new level is begun. */ /* DEFAULT: Do nothing. */ virtual void reset(IGameManagerP); /* EFFECTS: Called when a new game is started. */ /* DEFAULT: Do nothing. */ virtual void handle_messages(IGameManagerP,LocatorP); /* EFFECTS: Give the Role an oppurtunity to deal with messages and arena_messages in the Locator before they get nuked. */ /* DEFAULT: Do nothing. */ virtual void set_humans_playing(int); virtual void set_enemies_playing(int); /* NOTE: Mostly for updating UI. */ /* DEFAULT: Do nothing. */ virtual void game_quitting(); /* EFFECTS: The game is quitting, perform any shutdown operations necessary. */ /* DEFAULT: Do nothing. */ virtual void send_chat_request(LocatorP,const char* receiver, const char* message); /* REQUIRES: receiver is non-NULL */ /* EFFECTS: The Game (really the Ui) is asking to send a chat message to the named receiver, or to everyone if receiver is "". */ /* DEFAULT: Do nothing. */ static void show_stats() {showStats = True;} static void echo_ping_pong() {echoPingPong = True;} // error() and message() are now public, so Game can use them. void error(const char *msg1,const char *msg2 = NULL, const char *msg3 = NULL); /* EFFECTS: Report that something went wrong. */ void message(const char *msg1,const char *msg2 = NULL, const char *msg3 = NULL); /* EFFECTS: Generic message to the user. */ static Boolean uses_humans_num(RoleType); static Boolean uses_cooperative(RoleType); static Boolean uses_enemies_num(RoleType); static Boolean uses_enemies_refill(RoleType); static Boolean uses_game_style(RoleType); static Boolean uses_difficulty(RoleType); static Boolean uses_chat(RoleType); /* EFFECTS: These are all so the Ui can decide whether to enable certain items or not depending on the RoleType. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif int compute_remaining(struct timeval &waitTime, CMN_TIME startTime,int quanta); /* EFFECTS: Fill waitTime with the amount of time remaining(usec) until quanta has expired. Also return amount remaining in milliseconds. */ virtual void _error(const char *msg1); /* NOTE: Only need to override this function. */ /* DEFAULT: Print to stdout. */ virtual void _message(const char *msg); /* DEFAULT: Call _error(msg) */ void check_show_stats(CMN_TIME startTime); /* EFFECTS: Show statistics for this turn if show_stats() is enabled. */ int quantaToMS(Quanta q,IGameManagerP man) ; Quanta MSToQuanta(int val,IGameManagerP man); /* EFFECTS: Use these for converting between real time and local Quanta. */ void yield_time(CMN_TIME startTime,int quanta); /* EFFECTS: Helper function to throw away time since startTime. */ void display_chat_message(LocatorP,const char* sender, const char* message); /* EFFECTS: Display a chat message to the local user. */ /* NOTE: The method is in Role so that it can be shared by Client and Server. Not used for StandAlone. */ static Boolean echoPingPong; private: static Boolean showStats; static Boolean roleExists; // Only one role should exist at once. }; typedef Role *RoleP; class StandAlone : public Role { public: StandAlone(); Boolean ok(); virtual RoleType get_type(); virtual int get_humans_num(); virtual void set_humans_num(int); virtual void yield(CMN_TIME,int quanta,IGameManagerP,ITurnStarterP,WorldP,LocatorP); private: int humansNum; }; class Locator; class Client : public Role { public: Client(char *serverName,char *portName,CMN_PORT clientPortBase, char *humanName, IViewportInfo*,int skip,LocatorP errorLocator); /* EFFECTS: Create a client that will connect to the given server and port. If portName is NULL, connect to XETP::DEFAULT_PORT. Give error message to cerr if failure and set error flag. Pass in empty string for humanName to use default. clientPortBase is the first local UDP port, Client will try to bind to. Pass in 0 for clientPortBase to use default. */ /* NOTES: Locator is only used for reporting errors. */ virtual ~Client(); void connect_server(); /* EFFECTS: Delay connecting until the rest of XEvil is initialized (especially the graphics), so the server doesn't disconnect for no response. */ /* NOTE: No other metods of Client should be called until after Client::connectServer(). */ virtual RoleType get_type(); virtual int get_humans_num(); virtual void set_humans_num(int); virtual Boolean ok(); virtual void clock(IGameManagerP,WorldP,LocatorP); virtual void yield(CMN_TIME,int,IGameManagerP,ITurnStarterP,WorldP,LocatorP); /* EFFECTS: Look for data from the server. */ virtual void game_quitting(); virtual void send_chat_request(LocatorP,const char* receiver, const char* message); void request_new_human(); /* EFFECTS: Client will ask the Server to give it a new human. Does not start a new game on the server. */ const char *get_server_name() {return serverName;} static void set_human_reflexes(int val) {humanReflexesTimeMS = val;} static void disable_dead_reckoning() {deadReckoning = False;} #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual void _error(const char *msg1); virtual void _message(const char *msg); /* NOTE: These actually do something different for Client. */ private: enum {CONN_FAILED = -1,CONN_PARTIALLY = 0,CONN_SUCCESS = 1}; Boolean receive_tcp_data(IGameManagerP,WorldP,LocatorP); Boolean receive_udp_data(IGameManagerP,WorldP,LocatorP); /* EFFECTS: Read data off socket and return whether we should start a new turn. */ void process_new_world(InStreamP,IGameManagerP,WorldP,LocatorP); void process_reset(InStreamP,IGameManagerP,WorldP,LocatorP); void process_human(InStreamP,OutStreamP,IGameManagerP,WorldP,LocatorP); void process_object(InStreamP,WorldP,LocatorP); void process_delete_object(InStreamP,WorldP,LocatorP); void process_message(InStreamP,int length,LocatorP); void process_arena_message(InStreamP,int length,IGameManagerP,LocatorP); void process_sound_request(InStreamP,LocatorP); void process_chat(InStreamP,LocatorP); void check_alive(IGameManagerP); CMN_SOCKET tcpSock; CMN_SOCKET udpSock; // Server port. Same for TCP and UDP CMN_PORT port; // First port to try, when choosing client UDP port. // Probably should also store the actual clientPort chosen. Don't need it // now, though. CMN_PORT clientPortBase; char hostName[R_NAME_MAX]; char serverName[R_NAME_MAX]; CMN_SOCKADDR_IN serverAddr; // Memory shared by UDPOutStream InStreamP tcpIn; OutStreamP tcpOut; UDPInStreamP udpIn; UDPOutStreamP udpOut; int connected; int worldVersion; IntelId humanIntelId; Timer humanReflexes; static int humanReflexesTimeMS; char *humanName; // empty string means use default. // Has no direct connection to the server's turn. // Keep a count of how long we've been running. Turn turn; // The highest turn we've ever seen from this server. Turn turnMax; IViewportInfo* vInfo; int skip; LocatorP errorLocator; static Boolean deadReckoning; }; typedef Client *ClientP; class Server; typedef Server *ServerP; // Connections coming in to server. class Connection { public: enum { // The magic value for skip that means dynamically adjust the // value of skip. ADJUST_SKIP = 0, }; Connection(ServerP server,LocatorP errorLocator, char *cName,char *hName, CMN_SOCKET tcpSock,InStreamP tcpIn,CMN_SOCKET udpSock, struct sockaddr_in* udpClientAddr,Turn now, const ViewportInfo &,int skip,Boolean wantSounds); /* NOTE: Connection now owns the memory for clientAddr. */ /* TODO: Change all the parameters to a generic structure to be read in from XETP::TCP_CONNECT, say ConnectParameters. */ /* NOTE: skip may be ADJUST_SKIP */ ~Connection(); Boolean alive() {return tcpIn->alive() && tcpOut->alive() && udpOut->alive();} /* EFFECTS: True if all the streams are still alive. */ InStreamP get_tcp_in_stream() {return tcpIn;} OutStreamP get_tcp_out_stream() {return tcpOut;} UDPOutStreamP get_udp_out_stream() {return udpOut;} CMN_SOCKET get_tcp_socket() {return tcpSock;} const char* get_client_name() {return clientName;} char* get_full_client_name(); /* EFFECTS: For server messages, returns something like "billy-bob"@my.host.com". */ /* NOTE: Caller must free returned memory with delete. */ struct sockaddr_in *get_udp_client_address() {return udpClientAddr;} IntelId get_human() {return human;} /* EFFECTS: Return the id of the human associated with this connection. */ // Timer &get_skip_timer() {return skipTimer;} Boolean sent_creation_message() {return sentCreationMessage;} void creation_message_sent() {sentCreationMessage = True;} /* EFFECTS: Have we told everybody that this Client joined the game. */ void set_human(const IntelId &iId) {human = iId;} Turn get_start_turn() {return startTurn;} Turn get_last_activity() {return lastActivity;} void set_last_activity(Turn val) {assert(val >= lastActivity); lastActivity = val;} /* EFFECTS: Get/set the last turn when something came in from this connection. */ char *get_human_name() {return humanName;} /* NOTE: Empty string means it wasn't set. */ Timer &send_human_timer() {return humanTimer;} /* EFFECTS: Send_human whenever this timer is ready. */ const ViewportRegionP get_viewport() {return &viewport;} void set_viewport(const ViewportRegion &v) {viewport = v;} /* EFFECTS: Get/set the viewport the client is looking at. */ const ViewportInfoP get_viewport_info() {return &vInfo;} Boolean want_sounds() {return wantSounds;} /* EFFECTS: Does this client want sounds sent to it? */ Boolean allocate_turn_window(Turn); /* EFFECTS: Try to get a window to send the data for the given Turn. */ void free_turn_windows(Turn turn); /* EFFECTS: Free all turn windows for all turns <= turn. */ static void enable_echo_turn_windows() {echoTurnWindows = True;} static Boolean echo_turn_windows() {return echoTurnWindows;} void process_timer_pong(UDPInStreamP); void clock(Boolean turnWindowAllocated); void borrow_skip_time(); /* EFFECTS: Try to borrow some skip time so that data will be sent next turn. */ static void set_target_delay(Turn val) {targetDelay = val;} private: enum { TURN_WINDOWS_MAX = 1, // Deal with measuring and compensating for network delays. // Unit is turns. ADJUST_SKIP_TIME = 75, // Every 3 seconds. // Max number of delays that we will measure in the period of // HANDLE_DELAYS_TIME. MEASURED_DELAYS_MAX = 2 * ADJUST_SKIP_TIME, }; ServerP server; // For reporting errors. LocatorP errorLocator; char clientName[R_NAME_MAX]; struct sockaddr_in *udpClientAddr; // Address of client IntelId human; Turn lastActivity; Turn startTurn; // streams InStreamP tcpIn; OutStreamP tcpOut; // udpIn is shared by all connections. UDPOutStreamP udpOut; CMN_SOCKET tcpSock; // Name to be used for the Human associated with the Client. char *humanName; // So can follow intel properly. ViewportInfo vInfo; // Variables for implementing skip. int skip; // Always > 0. Timer skipTimer; // Did we borrow some skip time from the next turn. Boolean borrowedSkip; Boolean wantSounds; Boolean sentCreationMessage; Timer humanTimer; ViewportRegion viewport; // the current viewport. // Can be FREE_TURN_WINDOW Turn turnWindows[TURN_WINDOWS_MAX]; static Boolean echoTurnWindows; // Variables for dynamically adjusting skip. Boolean adjustSkip; Turn delays[MEASURED_DELAYS_MAX]; int delaysNum; Timer adjustSkipTimer; static Turn targetDelay; }; class Server : public Role { // So can call message() and error(). Maybe we should just make them // public. friend class Connection; public: Server(Boolean localHuman,char *portName,LocatorP); /* EFFECTS: Create a server that listens for connections on given port. If NULL is passed in, use XETP::DEFAULT_PORT. */ ~Server(); void run(); /* EFFECTS: Start the server running. Should be called after the server is constructed, before any other calls. But not until the game is ready to start clocking the main loop. */ virtual Boolean ok(); virtual RoleType get_type(); virtual int get_humans_num(); Turn get_turn() {return turn;} // Perhaps should move turn up into role. virtual GameStyleType get_default_game_style(); virtual int num_viewports_needed(); virtual void set_humans_num(int); virtual void human_created(IGameManagerP,HumanP,int,WorldP,LocatorP); virtual void clock(IGameManagerP,WorldP,LocatorP); /* EFFECTS: Update all clients. */ virtual void yield(CMN_TIME startTime,int quanta, IGameManagerP,ITurnStarterP,WorldP,LocatorP); virtual void new_level(IGameManagerP,WorldP,LocatorP); virtual void reset(IGameManagerP); virtual void handle_messages(IGameManagerP,LocatorP); virtual void send_chat_request(LocatorP,const char* receiver, const char* message); virtual void set_humans_playing(int); virtual void set_enemies_playing(int); static void disable_auto_disconnect() {autoDisconnect = False;} static void set_no_activity_disconnect(int val) {if (val > 0) noActivityDisconnect = val;} /* EFFECTS: Set time until disconnecting client to val milliseconds. Does nothing if disable_auto_disconnect() was called. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif virtual void _error(const char *msg1); /* NOTE: Calls up the tree. */ void display_chat_message(LocatorP,const char* sender, const char* message); /* EFFECTS: Overrides, so can also log the chat message. */ private: Connection* get_connection(int n) {return (Connection*)connections.get(n);} /* NOTE: Just to reduce some typing. */ void accept_connection(IGameManagerP,WorldP world,LocatorP); void delete_connection(IGameManagerP,WorldP,LocatorP,int); void receive_udp_data(IGameManagerP,WorldP,LocatorP); void process_command(InStreamP in,int connectionNum,WorldP,LocatorP); void process_pong(InStreamP in,int connectionNum); void process_timer_pong(InStreamP in,int connectionNum); void process_request_new_human(IGameManagerP,int h); void process_chat_request(InStreamP,int connectionNum,LocatorP); void _process_chat_request(LocatorP,IntelP sender, const char* receiver,const char* message); /* EFFECTS: The guts of process_chat_request(), but after reading from the stream. Is reused when Server's localHuman "sends" a chat request to itself. i.e. there is no actual XETP::CHAT_REQUEST message sent, just do everything as if we just received one from a client. sender may be NULL, in that case send a message from . */ int find_connection(CMN_SOCKADDR_IN* clientAddr); /* EFFECTS: Return index of connection matching clientAddr or -1 if not found. */ int find_connection(const IntelId&); /* EFFECTS: Return index of connection with given Human IntelId, or -1 if not found. */ void send_udp_server_pong(IGameManager*,LocatorP, CMN_SOCKET udpSock,CMN_SOCKADDR_IN* destAddr); /* EFFECTS: Send all the information of a SERVER_PONG to the given address. Use udpSock which is already open and bound. */ /****** BEGIN PHASES OF CLOCK() ********/ Boolean check_alive(); void delete_dead_connections(IGameManagerP,WorldP,LocatorP); void send_pings(Boolean []); void send_objects(LocatorP,Boolean []); void check_send_object_and_followers(LocatorP,OutStreamP, const ViewportRegionP viewport, PhysicalP p,Turn, PtrList &alreadySent, IntelP relativeTo); /* NOTE: Uses should_send_object() to decide for p and all its followers. */ /* NOTE: Add any objects we send to alreadySent. */ Boolean should_send_object(LocatorP,const ViewportRegionP viewport, PhysicalP p,IntelP relativeTo); void send_sounds(LocatorP,int connectionNum); void send_recently_deleted(LocatorP,Boolean []); void send_humans(LocatorP); void flush_connections(); /****** END PHASES OF CLOCK() ********/ Boolean running; char hostName[R_NAME_MAX]; CMN_PORT port; // same for TCP and UDP CMN_SOCKET tcpSock; // for new incoming connections only CMN_SOCKET udpSock; // for all udp data, in and out UDPInStreamP udpIn; // owns udpSock PtrList connections; int worldVersion; Turn turn; // For reporting errors. LocatorP errorLocator; // Whether there is a human on the server. Boolean localHuman; IntelId localHumanId; static Boolean autoDisconnect; static int noActivityDisconnect; // Number of msec until disconnect. }; #endif xevil-2.02r2.orig/cmn/sound_cmn.h0100644000175000017500000000507307041422160016216 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "sound_cmn.h" Sound code common to Windows and X. #ifndef CMN_SOUND_H #define CMN_SOUND_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif #include "utils.h" #include "coord.h" #include "streams.h" #include "id.h" #include "area.h" class SoundRequest { public: SoundRequest(SoundName s,const Area &area) {pos = area.get_middle(); soundName = s;} SoundRequest(){} void read(InStreamP in); static int get_write_length(); void write(OutStreamP out) const; Pos get_pos() {return pos;} // Use pos instead of Id, so it will still work over the network. */ SoundName get_sound_name() {return soundName;} private: Pos pos; SoundName soundName; }; class SoundNames { public: enum { SOUNDTRACK = 1, // start at 1, 0 is reserved. SOUNDTRACK_LEVELS, SOUNDTRACK_SEAL, CHAINSAW_SOUND, FLAMETHROWER, DEATH, SEAL_DEATH, HUGGER_DEATH, FROG_DEATH, BREAKDOWN, BANG, PISTOL, MGUN, LAUNCHER, EXPLOSION, DOG_DEATH, LASER, HERO_ATTACK, NINJA_ATTACK, DOG_ATTACK, CHOP_DEATH, DOPPEL_USE, CLOAK_USE, TRANS_USE, SHIELD_USE, NINJA_DEATH, FROGGUN, LANCER, SWAPPER, FIRE_SOUNDTRACK, HIVE_SOUNDTRACK, KILL_SOUNDTRACK, SEAL_SOUNDTRACK, ZEEPEEG_SOUNDTRACK, NIGHTSKY_SOUNDTRACK, SWEETDARK_SOUNDTRACK, // TERRAEXM_SOUNDTRACK, NEWSONG_SOUNDTRACK, // Don't change the following. SOUND_MAX, SOUND_RANDOM = -1, }; static unsigned int lookup(SoundName); /* EFFECTS: Return the platform-specific resource name for the SoundName or 0 if not found. */ private: #if WIN32 static unsigned int names[SOUND_MAX]; #endif }; #endif xevil-2.02r2.orig/cmn/streams.h0100644000175000017500000001476207041422156015721 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // streams.h #ifndef STREAMS_H #define STREAMS_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif #include "utils.h" #define UDP_STREAM_HEADER_LEN 12 // + #define UDP_STREAM_BODY_LEN 5000 //2044 should make this some sort of growable array #define UDP_STREAM_BUFFER_LEN (UDP_STREAM_HEADER_LEN + UDP_STREAM_BODY_LEN) typedef u_int Checksum; class GenericStream { public: enum {TCP,UDP}; GenericStream(Boolean ownSock) {ownSocket = ownSock;} /* EFFECTS: ownSock means whether the stream owns the socket or not, i.e whether it will take responsibility for closing it when done. */ virtual ~GenericStream(); virtual int get_protocol() = 0; virtual Boolean alive() = 0; static Boolean get_buggy() {return buggy;} static void set_buggy(Boolean val) {buggy = val;} /* EFFECTS: Simulate a bad network connection. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif Boolean ownSocket; static Boolean buggy; Checksum compute_checksum(u_char *data,int len); }; class InStream : public GenericStream { public: InStream(Boolean ownSock) : GenericStream(ownSock) {} virtual Boolean read(void *buf,int size) = 0; /* EFFECTS: Read size number of bytes from buf. Return True if successful. */ virtual u_char read_char() = 0; virtual int read_signed_char() = 0; virtual u_short read_short() = 0; virtual int read_signed_short() = 0; virtual u_int read_int() = 0; virtual float read_float() = 0; }; typedef InStream *InStreamP; class OutStream : public GenericStream { public: OutStream(Boolean ownSock) : GenericStream(ownSock) {} virtual Boolean write(void *buf,int size) = 0; /* EFFECTS: Write size number of bytes into buf. Return True if successful. */ virtual void write_char(u_char) = 0; virtual void write_signed_char(int) = 0; virtual void write_short(u_short) = 0; virtual void write_signed_short(int) = 0; virtual void write_int(u_int) = 0; virtual void write_float(float) = 0; }; typedef OutStream *OutStreamP; // Non-buffering stream to read from TCP socket. class NetInStream : public InStream { public: NetInStream(CMN_SOCKET sock,Boolean ownSocket); virtual ~NetInStream(); /* NOTE: Closes the socket */ virtual int get_protocol(); virtual Boolean alive(); virtual Boolean read(void *buf,int size); virtual u_char read_char(); virtual int read_signed_char(); virtual u_short read_short(); virtual int read_signed_short(); virtual u_int read_int(); virtual float read_float(); static int get_bytes_in() {return bytesIn;} static void reset_counter() {bytesIn = 0;} /* NOTE: Simple statistics. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif Boolean isAlive; CMN_SOCKET sock; static int bytesIn; }; // Non-buffering stream to write to TCP socket. class NetOutStream : public OutStream { public: NetOutStream(CMN_SOCKET sock,Boolean ownSocket); virtual ~NetOutStream(); /* NOTE: Closes the socket */ virtual int get_protocol(); virtual Boolean alive(); virtual Boolean write(void *buf,int size); virtual void write_char(u_char); virtual void write_signed_char(int); virtual void write_short(u_short); virtual void write_signed_short(int); virtual void write_int(u_int); virtual void write_float(float); static int get_bytes_out() {return bytesOut;} static void reset_counter() {bytesOut = 0;} /* NOTE: Simple statistics. */ #ifndef PROTECTED_IS_PUBLIC protected: #endif Boolean isAlive; CMN_SOCKET sock; static int bytesOut; }; class UDPInStream : public NetInStream { public: UDPInStream(CMN_SOCKET sock,Boolean ownSocket); virtual ~UDPInStream(); virtual int get_protocol(); virtual int prepare_packet(CMN_SOCKADDR_IN *address); /* MODIFIES: address */ /* EFFECTS: Set the address of the packet coming in, return the length of the data. Return -1 if failure. */ virtual void done_packet(); virtual Boolean read(void *buf,int size); int bytes_remaining() {return bufLen - bufPtr;} /* EFFECTS: Number of bytes that can still be read from this UDP packet. */ void revive() {isAlive = True;} /* EFFECTS: Bring this stream back to life. */ static int get_bytes_in() {return bytesIn;} static void reset_counter() {bytesIn = 0;} /* NOTE: Simple statistics. */ private: u_char buffer[UDP_STREAM_BUFFER_LEN]; int bufPtr; // Current location reading in buffer. int bufLen; static int bytesIn; }; typedef UDPInStream *UDPInStreamP; class UDPOutStream : public NetOutStream { public: UDPOutStream(CMN_SOCKET sock,CMN_SOCKADDR_IN *,Boolean ownSocket); /* NOTE: Shares the sockaddr_in struct that is passed in. */ virtual ~UDPOutStream(); virtual int get_protocol(); virtual void prepare_packet(int); virtual void done_packet(); virtual Boolean write(void *buf,int size); void flush(); static float get_average_length_out() { return (float)totalBytesOut / (float)packetCount;} static int get_bytes_out() {return bytesOut;} static void reset_counter() {bytesOut = 0;} /* NOTE: Simple statistics. */ private: int buggy_tests(); /* EFFECTS: Possibly modify data to run tests. Return the number of times to send the data in buffer. */ void create_header(); /* MODIFIES: header */ /* EFFECTS: Compute checksum of data in body and put in header. */ CMN_SOCKADDR_IN *address; u_char buffer[UDP_STREAM_BUFFER_LEN]; int bufPtr; // Current location writing to buffer. int bufLen; // length of the packet to be written static int bytesOut; // For average packet length static int totalBytesOut; static int packetCount; }; typedef UDPOutStream *UDPOutStreamP; #endif xevil-2.02r2.orig/cmn/ui_cmn.h0100644000175000017500000000627407041422156015514 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "ui.h" Code common to all implementations of Ui. #ifndef UI_CMN_H #define UI_CMN_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif #include "utils.h" #include "intel.h" #define UI_KEYS_MAX IT_WEAPON_R typedef unsigned long UImask; // UNIX and Windows. #define UInone 0L #define UInewGame (1L<<0) #define UIquit (1L<<1) #define UIhumansNum (1L<<2) #define UIenemiesNum (1L<<3) #define UIenemiesRefill (1L<<4) #define UIpause (1L<<6) #define UIstyle (1L<<7) #define UIquanta (1L<<8) // Windows only. #define UIrooms (1L<<9) #define UIsoundvol (1L<<10) #define UItrackvol (1L<<11) #define UImusictype (1L<<12) #define UIsound (1L<<13) #define UIscreenmode (1L<<14) // UNIX and Windows. #define UIcooperative (1L<<15) // Windows only. #define UIdifficulty (1L<<16) #define UIconnectServer (1L<<17) #define UIdisconnectServer (1L<<18) #define UIrunServer (1L<<19) #define UIstopServer (1L<<20) // UNIX and Windows. #define UIchatRequest (1L<<21) // This is the only bottleneck restricting the size of the passed message. // Should make this an arbitrary length. #define UI_CHAT_MESSAGE_MAX 160 class IKeyState { public: virtual Boolean key_down(int key,void* closure) = 0; /* REQUIRES: 0 <= key < UI_KEYS_MAX */ /* EFFECTS: Is the specified key currently down. */ }; class IDispatcher { public: virtual void dispatch(ITcommand command,void* closure) = 0; /* EFFECTS: Cause the specified command to be sent. */ }; // The job of this class is to map the state of the keyboard into // ITcommands to be executed. Most of the logic is devoted to handling // weirdness with weapon keys, e.g. holding down the WEAPON_USE key and // pressing to the right causes IT_WEAPON_R to be dispatched. class KeyDispatcher { public: KeyDispatcher(); void clock(IKeyState*,IDispatcher*,void* closure); /* NOTE: closure is a hack, the data should be in the implementation of IKeyState and IDispatcher. When I get around to making Ui have a list of Viewport instead of just a bunch of arrays, Viewport will implement these interfaces instead of Ui and we can get rid of this C-style "closure" bullshit. (Did it on UNIX, now to do it on Windows.) */ private: Boolean weaponKeyDown; ITcommand weaponCommandDefault; // Was dispatch() called since the last weapon key down. Boolean dispatchCalled; }; #endif xevil-2.02r2.orig/cmn/utils.h0100644000175000017500000003344507636130406015406 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "utils.h" Misc. utilities. to be included by ALL files. #ifndef UTILS_H #define UTILS_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif #if WIN32 #define Boolean BOOL #define False FALSE #define True TRUE // Uncomment this to enable modeless dialogs for XEvil. //#define MODELESS_DIALOGS #endif // math.h #ifdef MATH_CLASS_HACK // Lame-ass AIX math.h has a function called class() #define class fakeclass #endif #if X11 #ifndef MATH_H_IS_CC extern "C" { #endif #include #ifndef MATH_H_IS_CC } #endif #endif #ifdef MATH_CLASS_HACK #undef class #endif #if WIN32 #include #endif // For some odd-ball linux machines, needed before #ifdef IO_COOKIE_HACK #define _IO_cookie_io_functions_t int #endif extern "C" { #include #include // For exit(). #include // For seed to srandom and clock(). #if X11 #include // for clock_t and gettimeofday(). #include #include #endif #if WIN32 #include #endif } #include #include // for u_char, u_int, etc. #include #include // Defines #ifndef MSEC_PER_CLOCK #define MSEC_PER_CLOCK (1.0e3 / CLOCKS_PER_SEC) #endif #ifndef max #define max(a,b) (ab ? b : a) #endif #if X11 typedef char Boolean; #endif typedef int ColorNum; #if X11 typedef struct timeval CMN_TIME; #endif #if WIN32 // milliseconds typedef int CMN_TIME; #endif // So we can do "new charP[n]". typedef char *charP; typedef const char* constCharP; // Network stuff. #if X11 #define CMN_SOCKET int #define CMN_PORT u_short #endif #if WIN32 #define CMN_SOCKET SOCKET #define CMN_PORT USHORT #endif #if X11 #include #endif typedef struct sockaddr CMN_SOCKADDR; typedef struct sockaddr_in CMN_SOCKADDR_IN; #ifdef RANDOM_NEEDS_PROTOTYPES extern "C" { long random(); void srandom(int); } #endif class InStream; typedef InStream *InStreamP; class OutStream; typedef OutStream *OutStreamP; typedef int GameStyleType; // Possible values of GameStyleType. enum {SCENARIOS,LEVELS_ONLY,KILL,DUEL,EXTENDED,TRAINING,LEVELS}; // Data Structures class Timer { public: Timer() {remaining = maxx = 0;} // Starts out ready. Timer(int t) {assert (t >= 0); maxx = t; remaining = 0;} Boolean ready() {return remaining == 0;} int get_remaining() {return remaining;} void set() {remaining = maxx;} void set(int time) {remaining = time;} void set_max(int m) {maxx = m; remaining = 0;} void reset() {remaining = 0;} void clock() {if (remaining) remaining--;} private: int remaining; int maxx; }; class Utils { public: static void seed_random(); /* REQUIRES: Must be called at startup. */ /* EFFECTS: Seed the random number generator based on the current time. */ static Boolean coin_flip(); /* EFFECTS: Randomly returns True or False; */ static int choose(int x); /* EFFECTS: Randomly return a number from 0 to x-1. */ static int weighted_choose(int n,int* weights); /* REQUIRES: weights is an array of length n. Each weight is >= 0. */ /* EFFECTS: Randomly choose a number from 0 to n-1. Probabitly of returning m is weights[m]/sum(weights). */ static void insertion_sort(int arry[],int numElements); static void random_list(int arry[],int numElements); /* EFFECTS: Fills arry the first numElements of arry with the numbers in {0..(numElements-1)} in a random order. */ static int minimum(int v1,int v2) {return v1 <= v2 ? v1 : v2;} static int maximum(int v1,int v2) {return v1 >= v2 ? v1 : v2;} static int minimum(int arry[],int size); /* EFFECTS: Return the minimum value in the array arry of size size. */ static int minimum(int arry[],Boolean oks[],int size); /* EFFECTS: Return the minimum value in arry which is ok or -1 if none. */ static Boolean inList(int key,const int list[],int size); /* EFFECTS: Returns whether key is in list list of size size. */ static void freeif(char *&str); /* MODIFIES: str */ /* EFFECTS: Free memory of str if non-NULL. Set str to NULL. */ static char *strdup(const char *str); /* EFFECTS: Copy str, allocating new memory. If str is NULL, return NULL. */ static int strlen(const char* cs) {assert(cs); return ::strlen(cs);} /* REQUIRES: cs is non-NULL */ static int strcmp(const char* str1,const char* str2) {return ::strcmp(str1,str2);} /* EFFECTS: Wrapper for C library strcmp(). Return 0 if strings are the same. */ static char* strchr(const char* cs,int c) {return ::strchr(cs,c);} static char* strrchr(const char* cs,int c) {return ::strrchr(cs,c);} static char* strstr(const char* cs,const char* ct) {return ::strstr(cs,ct);} static void strcpy(char* s,const char* ct) {::strcpy(s,ct);} static void strncpy(char* s,const char* ct,int n) {::strncpy(s,ct,(size_t)n);} static void strcat(char* s,const char* ct) {::strcat(s,ct);} static int atoi(const char*); static const char* getenv(const char*); static int mod(int n,int m) {return (n >= 0) ? (n % m) : (-(-n % m) + m) % m;} /* EFFECTS: Return (n % m), allowing n to be negative. */ static int div(int n,int m) {if (n >= 0) return (n / m); else if (-n % m == 0) return (n / m); else return (n / m) - 1;} /* EFFECTS: Return (n / m), adjust for negative n. */ static int ceil_div(int n,int m); /* EFFECTS: Integer division, rounding up. */ static Boolean string_equals_ignore_case(char *str1,char *str2); /* EFFECTS: Does str1 equal str2 ignoring case. */ static void string_read(InStreamP,char *buffer,int bufLen); /* EFFECTS: Read character string from InStream, put results in buffer. buffer will be null-terminated, even if the string read in is truncated. String will be completely read in from the InStream no matter what. */ static char* string_read(InStreamP in); /* EFFECTS: Read char string from in, return newly allocated string with entire message. Use delete to free string when done. Return empty string if error, never returns NULL. */ static int get_string_write_length(const char *msg); /* EFFECTS: The amount of bytes necessary to write msg to an output stream. */ static void string_write(OutStreamP,const char *msg); /* EFFECTS: Write msg to the output stream. */ static const char* arg_value_check(int& n,int argc,char** argv, const char* name); /* MODIFIES: n */ /* EFFECTS: Helper for parsing command line arguments that are of the form "-name value". Check element n of argv against the supplied name. If match found, return value, else NULL. If a match is found, n will be incremented to skip over the value in the command line list. */ static Boolean arg_name_check(int n,int argc,char** argv, const char* name); /* EFFECTS: Helper for parsing Boolean command line switches, of the form "-name". Check element n of argv against the supplied name. */ // Make X11 versions of these when we need them. #if WIN32 static Boolean is_dir(const char* fName); /* EFFECTS: Return True if fName exists on the filesystem and is a directory. Will work whether fName ends in '\' or not. */ static Boolean mkdir(const char* fName); /* EFFECTS: Create a new directory. Return whether successful. Will only create the last component of fName as a new directory. */ /* NOTE: We could make a version that will make all the new directories necessary for fName. */ #endif static const char* game_style_to_string(GameStyleType); /* EFFECTS: Convert GameStyleType to string, return "Unknown" if unknown or invalid GameStyleType. */ /* NOTE: Is here because the GameStyleType enumeration is here. */ static char* get_OS_info(); /* EFFECTS: Return a platform-dependent string describing the current operating system. Caller must free returned value with delete. */ private: static void string_read_body(InStreamP,u_short len,char *buffer,int bufLen); }; /* A generic untyped growable list. */ typedef void *voidP; class PtrList { public: PtrList(); /* EFFECTS: Create PtrList of zero initial allocation. */ /* NOTE: Guaranteed not to allocate/free any memory if no elements are ever added. */ PtrList(int); /* EFFECTS: Create PtrList of given initial allocation. */ /* NOTE: Guaranteed not to allocate/free any memory if this constructor is called with zero, and no elements are ever added. */ PtrList(void *); PtrList(void *,void *); PtrList(void *,void *,void *); PtrList(void *,void *,void *,void *); PtrList(void *,void *,void *,void *,void *); /* EFFECTS: Create a PtrList with length and allocation equal to the number of arguments. Initialize with the given elements. */ ~PtrList(); /* NOTE: Does not delete the elements pointed to by the list. */ PtrList(const PtrList &) {assert(0);} void operator = (const PtrList &) {assert(0);} //////// PTRLIST IO NOT TESTED ///////// PtrList(InStreamP); /* EFFECTS: Create a list from a stream. */ static int get_write_length(int len); /* EFFECTS: write_length of any list of the given length. */ int get_write_length() const {return get_write_length(len);} /* EFFECTS: write_length of this list */ void write(OutStreamP) const; /* EFFECTS: Write to stream. */ void add(void *); /* EFFECTS: Append new value to the end of list. */ void *get(int) const; /* EFFECTS: I'll give you one guess. */ Boolean contains(void *el) const; /* EFFECTS: Is el in the list, using == for comparison. */ int index(void *el) const; /* EFFECTS: Return the index of the first occurance of el in the list or -1 if not found. Use == for comparison. */ /* NOTE: Simple linear search. */ void add_unique(void *el) {if (!contains(el)) add(el);} /* EFFECTS: Add el to the list if it is not there already. Use == for comparison. */ void set(int i,void *val); /* EFFECTS: Set indexed element to new value. */ /* REQUIRES: i < length() */ int length() const {return len;} /* EFFECTS: Number of elements added to list. */ void del(int i); /* EFFECTS: Delete element i, copy the last element of the list to element i. */ /* NOTE: Be careful when iterating and deleting elements as del() moves elements around. */ void clear() {len = 0;} /* EFFECTS: Empty the list. */ void append(const PtrList &other); /* EFFECTS: Add all elements of other to the list. Does not check for duplicates. */ void fill(int n,void *val = NULL); /* EFFECTS: Append val to the list n times. Useful for initializing a List. */ void set_and_fill(int i,void *val,void *fill = NULL); /* EFFECTS: Set element i to val. Grow the list as necessary, filling in the newly created empty element with "fill". */ private: void commonConstructor(int); void increaseSize(); int len; int allc; void **data; }; // Iterator over an IDictionary. class IDictIterator { public: virtual ~IDictIterator(); virtual void* next(void*& key) = 0; /* MODIFIES: key */ /* EFFECTS: Return the next value in the iteration or NULL if done. Sets key to be the key corresponding to value. */ }; // A key-value lookup system. class IDictionary { public: virtual ~IDictionary(); virtual void* get(void* key) = 0; /* EFFECTS: Return the value assoicated with key, or NULL if none. */ virtual void *getAtIndex(int index) = 0; /* REQUIRES: 0 <= index < size() */ /* EFFECTS: Return the value stored at the given index. */ virtual int length() = 0; /* EFFECTS: Return the number of associations in the dictionary. */ virtual IDictIterator* iterate() = 0; /* REQUIRES: Don't add new assocations or delete the IDictionary before you are done with the IDictIterator. You may change the value of an existing association, however. */ /* EFFECTS: Return an iterator for the values of the Dictionary. */ virtual void* put(void* key,void* value) = 0; /* REQUIRES: Neither key nor value are NULL */ /* EFFECTS: Put (key,value) association into the dictionary. Return the previous value stored at key if any, else return NULL. */ }; IDictionary* HashTable_factory(int startAlloc = -1, int (*hashFntn)(void *key,int length) = 0); /* EFFECTS: Create a HashTable implementation of IDictionary. */ // Print out debug info. class DebugInfo { public: static void initialize(); /* EFFECTS: Call once at startup. */ static Boolean on() {return _on;} /* EFFECTS: Is printing debug info turned on. */ static void turn_on() {_on = True;} /* EFFECTS: Enable printing out debug info. */ static void print(const char *); /* EFFECTS: Print the debug message to the appropriate place if debugging is on. */ private: static Boolean _on; }; #endif //UTILS_H xevil-2.02r2.orig/cmn/world.h0100644000175000017500000004752207041422156015372 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "world.h" /* Overview: A world object is a rectangular region composed of WSQUARES. Internally, it is divided into rooms of constant size. It's upper left corner is at WSQUARE (0,0). World should be draw completely once before just drawing with changes. */ #ifndef WORLD_H #define WORLD_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif // Include Files #include "xdata.h" #include "utils.h" #include "coord.h" #include "area.h" #include "id.h" #include "streams.h" // Defines. // WSQUARES in a room, should be an even number, because we require world read // in from a file to be half-room-size alligned. #define W_ROOM_COL_MAX 26 // 36 #define W_ROOM_ROW_MAX 16 // All the W_ALL_* defines are in coord.h #define W_BACKGROUNDRATE 2 #define W_MOVER_WIDTH_MAX 32 #define W_MOVER_HEIGHT_MAX 16 /* Maximum rooms in world. World may actually be smaller. World starts out at the size of the title screen. */ #define W_ACROSS_MAX_MAX 8 #define W_DOWN_MAX_MAX 5 // Should be odd, for ZIG-ZAG scenario. // WSQUARES in world. #define W_COL_MAX_MAX (W_ROOM_COL_MAX * W_ACROSS_MAX_MAX) #define W_ROW_MAX_MAX (W_ROOM_ROW_MAX * W_DOWN_MAX_MAX) /* The maximum number of wsquares that can be set changed/unchanged in one clock cycle. */ #define W_CHANGES_MAX 5000 /* The blocks composing the world. Represented as integers so that the world map can be initialized easily. Don't change order, e.g. World::blockUseTransparent. */ enum { Wempty, Wwall, Wladder, Woutside, Wsquanch, WupDown, WtextSquare, }; typedef int WSpecialMap; //W_BLOCKS_NUM now in coord.h #define W_TOTAL_PIX_NUM (W_ALL_BLOCKS_NUM + W_ALL_DOORS_NUM + \ W_ALL_MOVER_SQUARES_NUM + 2 * W_ALL_MOVERS_NUM) #define W_TOTAL_PIX_NUMDIV2 int(W_TOTAL_PIX_NUM/2.0f +0.5f) // blocks + doors + moverSquares + mover enum Wsig {W_NO_SIG, W_CLOSE, W_CLOSE_BAD, W_FAILURE}; enum {W_DOOR_TOP, W_DOOR_BOTTOM}; enum {UN_POSTER,UN_DOOR,UN_MOVER}; // W_POSTERS_NUM now in coord.h for X11. Does not exist for WIN32. class Blueprints; class Locator; typedef Locator *LocatorP; class World; typedef World *WorldP; /////////////////////////////////////////////////////////////////////////////// // Class Declarations /////////////////////////////////////////////////////////////////////////////// struct BitmapSpec { CMN_BITS_ID id; // x2 coordinates, should change it to be unstretched some time. Size size; }; struct Theme { int blockIndices[W_BLOCKS_NUM]; int *backgroundIndices; int backgroundsNum; int *outsideIndices; int outsidesNum; int doorBase; int moverSquareBase; int moverIndex; int *posterIndices; int postersNum; }; class Mover { public: Mover() {areaSet = False;} /* NOTE: Not really created yet, still need to call init() to finish construction. */ Mover(InStreamP,WorldP,LocatorP); void update_from_stream(const Area &); // called by PhysMover static int get_write_length(); void write(OutStreamP); void init(WorldP w,LocatorP l,const Area &a,const Size &v, MoverId id); Boolean is_area_set() {return areaSet;} void init_area(const Area &a); void init_not_area(WorldP w,LocatorP l,const Size &v,MoverId id); /* NOTE: Two ways to do it. Just call init() or call both init_area() and init_not_area(). */ void set_phys_mover_id(Id id) {physMoverId = id;} /* NOTE: Should really be a constructor, must be called first. */ const Area &get_area() {return area;} const Size &get_vel() {return vel;} /* NOTE: Delta to get from prev position to current one. */ const MoverId &get_mover_id() {return moverId;} void clock(); /* EFFECTS: Move to next position. */ private: Boolean check_area(const Area &area); /* EFFECTS: True iff all squares covering area are moverSquares for this Mover. */ WorldP world; LocatorP locator; Boolean areaSet; Area area; Size vel; // A Size because it is integer. Size velStored; // To remember vel when pausing at top or bottom. MoverId moverId; // index in list. Id physMoverId; // Id of object simulating a Physical for the Locator. Timer timer; Boolean timerSet; }; typedef Mover *MoverP; struct PosterSquare { int type; int poster; Loc loc; // Inside poster. }; struct DoorSquare { int type; int topBottom; Loc dest; }; enum {OR_HORIZ,OR_VERT}; // Orientation struct MoverSquare { int type; int orientation; Mover *mover; }; union UnionSquare { int type; // UN_POSTER, UN_DOOR, UN_MOVER. PosterSquare pSquare; DoorSquare dSquare; MoverSquare mSquare; static UnionSquare *read(InStreamP,WorldP); static int get_write_length(); void write(OutStreamP); }; class World { friend class Blueprints; friend class Mover; friend class PhysMover; public: World(); /* EFFECTS: Create the title screen world. Fuck politically correct. */ ~World(); /* EFFECTS: Destroys the world, heh, heh. Keep away from children. */ void title_map(IViewportInfo*); /* EFFECTS: Draw the title screen on the map. Need the IViewportInfo to make a title screen appropriate for the given viewport. */ void set_locator(Locator *l) {assert(!locator); locator = l;} /* NOTE: Must be set before first level_reset(). */ Size get_size() {return size;} /* EFFECTS: Size of the world in pixels. */ Dim get_dim() {return dim;} /* EFFECTS: Dimensions of the world in wsquares. */ Dim get_room_dim(); /* EFFECTS: Return the dimensions of a room in wsquares. */ Size get_room_size(); /* EFFECTS: The size of a single room in pixels. */ Rooms get_rooms() {return rooms;} /* EFFECTS: The max number of rooms in across and down direction. */ /* NOTE: The world is no longer necessarily room-alligned, so this may round up. */ Boolean check_door(const Loc &loc1,Loc &dest); /* EFFECTS: Return whether there is a door at loc1. If there is, return the location of the doors destination in dest. */ void set_rooms_next(const Rooms &r); /* EFFECTS: After the next reset, the world will have as many rooms as r. If r is bigger than the maximum, the min of the maximum size and r is used. */ enum {MAP_NONE,SEALS,ZIG_ZAG,FLAG}; void set_special_map_next(WSpecialMap map); /* EFFECTS: Sets world to have a special map on the next reset. Implicitly sets the dimensions of the world. Must set back to World::MAP_NONE to go back to normal. */ void set_file_next(char *filename) {Utils::freeif(worldFile); worldFile = Utils::strdup(filename);} /* EFFECTS: Try to read World from given file. */ void set_map_print(Boolean val) {mapPrint = val;} /* EFFECTS: Sets whether to print each new map of the world at reset. */ Boolean overlap(const Box &box); /* EFFECTS: Does any of box overlap with the wsquares of the world. */ void draw(CMN_DRAWABLE buffer,Xvars &xv,int dpyNum,const Area &area, Boolean reduceDraw,Boolean background3D); /* EFFECTS: Draw all of area that is in the world. If background3D is true, draw background scrolling at a slower rate than the foreground to give a 3d effect. */ Boolean inside(const Loc &l) {return l.r >= 0 && l.c >= 0 && l.r < dim.rowMax && l.c < dim.colMax;} /* EFFECTS: Returns True if loc is a wsquare inside the world, otherwise returns False. */ Boolean inside(int r,int c) {Loc loc; loc.set(r,c); return inside(loc);} Boolean open(const Area &area, Boolean laddersClosed = False, Boolean postersClosed = False, Boolean doorsClosed = False, Boolean outsideClosed = True); /* NOTE: Treats movers as closed. */ Wsig open_offset(Size &offset,const Area &area,const Vel &vel); /* MODIFIES: offset */ /* EFFECTS: Returns W_NO_SIG if the portion of the world covered by initial is open. prev is the previous area occupied before. If the area is blocked, but a nearby area is not, returns W_CLOSE_OK and sets offset to be the offset necessary to unblock initial. Retruns W_CLOSE_BLOCKED if a nearby area is blocked. Stills sets offset for the nearby area. Returns W_FAILURE if initial and all nearby areas are blocked. offset may be modified in any case. */ void compute_touching_hanging(Touching &touching, Hanging &hanging, MoverP &touchingMover,const Area &area); /* REQUIRES: area is AR_RECT. */ /* MODIFIES: touching, hanging, touchingMover */ /* EFFECTS: If area is touching a blocked wsquare, sets touching to be the direction from area to the wsquare. If the area is touching in both the vertical and horizontal direction, the vertical takes precedence. Sets touching to be CO_air if not touching in any direction. If the area is hanging off of the edge of some blocked wsquares, sets hanging appropriately. Otherwise, sets hanging.corner to be CO_air. If touching a mover, touchingMover is set, else set to NULL. */ Boolean can_climb(const Loc &loc) {return inside(loc) ? (map[loc.r][loc.c] == Wladder) : False;} /* EFFECTS: Returns True if loc is a climable square inside the world. I.e. a ladder. False otherwise. */ Pos empty_rect(const Size &size); /* EFFECTS: Return the upper-left position of a randomly choosen empty rectangle of size s. Ladders and doors are not considered empty. Posters are considered empty. */ Pos empty_touching_rect(const Size &size); /* EFFECTS: Like empty_rect except the returned rect will be touching the ground. */ Pos empty_accessible_rect(const Size &size); /* EFFECTS: Like empty_rect except that it guarantees that the rectangle can be reached by all Creatures. Also, the returned rectangle will be touching CO_dn. */ /* REQUIRES: reset() has been called. */ Pos empty_accessible_rect(const Size &size,const RoomIndex &r); /* EFFECTS: Like empty_accessible_rect(const Size &), except restricts search to the given room. */ Boolean empty_box(Loc &loc,const Dim &dim,Boolean laddersClosed, Boolean postersClosed,Boolean doorsClosed); /* MODIFIES: loc */ /* EFFECTS: Returns True iff an empty box of dimension dim can be found and returns its upper-left Loc. */ Boolean empty_touching_box(Loc &loc,const Dim &dim,Boolean laddersClosed, Boolean postersClosed,Boolean doorsClosed); /* MODIFIES: loc */ /* EFFECTS: Like empty_box, except the returned box will be touching the ground. */ void reset(const Dim *clearDim = NULL,InStreamP inStream = NULL); /* EFFECTS: Prepare the world for a new game. Create a new map. If InStream is specified, use it to read in a map, overriding any other settings. If clearDim is non-NULL, create an empty world of given dimensions. */ void demo_reset(); /* EFFECTS: Prepare the world for a new demo. */ Boolean just_reset() {return justReset;} /* EFFECTS: TRUE if no clock() calls since last reset(). */ int get_write_length(); /* EFFECTS: How much data will be written in write_to_stream(). */ void write(OutStreamP outStream); /* EFFECTS: Output all relevant info about the world to outStream. */ // ???? What about movers, io through Physicals or through World? int get_write_length(const RoomIndex &); /* EFFECTS: Amount of data to write out one room. */ void write(OutStreamP out,const RoomIndex &); /* EFFECTS: Write one room. */ void read(InStreamP in,const RoomIndex &idx); /* EFFECTS: Read in one room of the world. */ MoverP lookup(const MoverId &moverId); /* EFFECTS: Return the Mover or NULL. */ void init_x(Xvars &,IXCommand,void*); /* EFFECTS: Initialize all x dependencies. */ void clock(); static void disable_movers() {useMovers = False;} #if WIN32 Boolean generate_xpm(Xvars& xvars,const char* genDir,Boolean halfSize); /* EFFECTS: Output all bitmaps as XPM files to the directory (genDir + "world/"). Return if success. */ #endif private: // Do we use these two versions of World::open() anywhere? Boolean open(const Loc &loc, Boolean laddersClosed = False, Boolean postersClosed = False, Boolean doorsClosed = False, Boolean outsideClosed = True); /* EFFECTS: Returns True if loc is an open square inside the world. Returns False otherwise. Note that wsquares outside the world are treated as if they were closed wsquares. */ /* NOTE: Doesn't take movers into account. */ Boolean open(const Box &box, Boolean laddersClosed = False, Boolean postersClosed = False, Boolean doorsClosed = False); /* EFFECTS: Is the portion of the world covered by area (or box) blocked? laddersClosed implies that ladders and other non-walls are considered to be blocking. */ /* NOTE: Doesn't take movers into account. */ void clear_everything(); void close_horiz_mover(const Loc &loc,Boolean &inHorizMover); void close_vert_movers(const Dim &dim); Boolean read_from_file(char *filename); void read_from_stream(InStreamP inStream); void choose_theme(); /* EFFECTS: Set themeIndex, backgroundIndex, and outsideIndex. */ Boolean empty_accessible_rect_one(Pos &pos,const Size &,const RoomIndex &); /* MODIFIES: pos */ /* NOTE: Helper for both versions of empty_accessible_rect(). */ void draw_outside(CMN_DRAWABLE buffer,Xvars &xvars,int dpyNum, Area area); /* EFFECTS: Draw the outside portions of the world that overlap area. */ void draw_background(CMN_DRAWABLE buffer,Xvars &xvars,int dpyNum, Area area,Boolean background3D); /* EFFECTS: Tiles all of buffer with tDraw the background to the buffer. */ void draw_square(CMN_DRAWABLE buffer,Xvars &xvars,int dpyNum,const Loc &loc, int x,int y,Boolean reduceDraw); /* EFFECTS: Draw the appropriate square from loc to (x,y) on buffer. */ void draw_mover(CMN_DRAWABLE buffer,Xvars &xvars,int dpyNum, MoverP mover, int x,int y); /* EFFECTS: Draw mover to (x,y) on buffer. */ void draw_outside_offset(CMN_DRAWABLE dest,Xvars &xvars,int dpyNum, Size sourceOffset,const Area &destArea); /* REQUIRES: sourceOffset + destArea.get_size() should fit within the source bitmap. destArea should be completely within the destination bitmap. */ /* EFFECTS: Draw outside bitmap number outsideIndex onto dest pixmap at destArea. Grab from sourceOffset on source bitmap. All coordinates are stretched. */ void rooms_dim_size_update(const Dim *newDim = 0); /* EFFECTS: If newDim is NULL, set this.dim and this.size from the current value of this.rooms. Else, set this.dim, this.rooms, and this.size from newDim. */ /* NOTE: Use 0 instead of NULL because some compilers don't have NULL defined yet. */ void th_helper(Touching &touching,Hanging &hanging,MoverP &touchingMover, const TouchingListItem &touchingItem, const TouchingListItem &edgeItem, Boolean r_c, const Area &area, int coord,int length, int wsquare_length, Touching iftouching, Corner ifsmall, Corner iflarge); /* MODIFIES: touching, hanging, touchingMover */ /* EFFECTS: Helper for World::touching. Does touching, hanging for one side. */ Boolean check_wrap_around(Size &offset,const Area &area); /* MODIFIES: offset */ /* EFFECTS: Check whether area should wrap-around to the other side of the world. If so, set offset and return True. */ Boolean open_iter(Area &area,int &changed,Dir dir); /* MODIFIES: area, changed */ /* EFFECTS: Move area as much in dir as necessary to avoid all its wsquares. Increment changed by the distance moved. Return True if the original area is open and nothing is changed.*/ Size open_size(int offset,Dir dir); Size open_size(int offset1,Dir dir1,int offset2,Dir dir2); /* REQUIRES: dir is in {CO_R, CO_DN, CO_L, CO_UP} */ /* EFFECTS: Return the Size corresponding to an offset in one or two directions. */ Boolean open_try_dirs(Size &offset,const Area &area,const Dir dirs[4], int dirsNum); /* MODIFIES: offset */ /* EFFECTS: Sets offset to be the minimum necessary to shift area to an open area in one of the directions of dirs. Returns whether it succeeded. offset may be changed in any case. */ Boolean open_try_corners(Size &offset,const Area &area); /* MODIFIES: offset */ /* EFFECTS: Check if area is wedged in a corner (overlapping 3 closed wsquares). If so, set offset to push the Area inside the corner and return True. */ Boolean open_try_diagonals(Size &offset,const Area &area); /* MODIFIES: offset */ /* EFFECTS: Set offset to shift area to a nearby open one. Max of all two direction combinations for each diagonal direction. Returns whether it succeeded. offset may be changed in any case. */ /* NOTES: Helpers for World::reset. */ void add_posters(); void add_doors(); void add_movers(); Boolean add_horiz_mover(); Boolean add_vert_mover(); /* NOTE: Helpers for add_movers(). Try to add one mover, return whether successful. */ void delete_movers(); /* EFFECTS: Clear out all movers. */ void mover_list_add(MoverP list[],int &nItems,const Loc &loc); /* MODIFIES: list, nItems */ /* EFFECTS: If there is a mover square overlapping loc, add the mover to list, removing duplicates. loc may be outside world. */ enum {MOVERS_MAX = 20}; Rooms rooms,roomsNext; WSpecialMap specialMap,specialMapNext; char *worldFile; Size size; /* For convenience only. */ Dim dim; /* For convenience only. */ Locator *locator; char map[W_ROW_MAX_MAX][W_COL_MAX_MAX]; XvarsValid xValid; Wxdata xdata; Boolean mapPrint; UnionSquare *unionSquares[W_ROW_MAX_MAX][W_COL_MAX_MAX]; Blueprints *blueprints; MoverP movers[MOVERS_MAX]; int moversNum; int uniqueGen; // For generating MoverIds. Boolean justReset; // World will leave enough space for objects of this max size. Dim objectDimMax; Dim posterDims[W_ALL_POSTERS_NUM]; // Used on X, but just to keep things in sync as a server. int themeIndex; int backgroundIndex; // 0 <= backgroundIndex < W_ALL_BACKGROUNDS_NUM int outsideIndex; // 0 <= outsideIndex < W_ALL_OUTSIDES_NUM static Boolean useMovers; // Defined in world.bitmaps. static CMN_BITS_ID *blocksBits; // [W_ALL_BLOCKS_NUM]; static BitmapSpec *backgrounds; // [W_ALL_BACKGROUNDS_NUM]; static BitmapSpec *outsides; // [W_ALL_OUTSIDES_NUM]; static CMN_BITS_ID *doorPixmapBits; //[W_ALL_DOORS_NUM]; static CMN_BITS_ID *moverSquarePixmapBits; //[W_ALL_MOVER_SQUARES_NUM]; static CMN_BITS_ID *moverPixmapBits; //[W_ALL_MOVERS_NUM]; static BitmapSpec *posters; //[W_ALL_POSTERS_NUM]; // Needed by X11 to act as a server. Theme *themes; // Just a pointer to World_themes in world.bitmaps. // Don't use "static Theme themes[W_THEME_NUM]", because then we'd // need to recompile everytime W_THEME_NUM changed. // Really should separate the World interface from implementation. // Unstretched coordinates. static const Size moverSize; // Which blocks to draw using transparent background. static Boolean blockUseTransparent[W_BLOCKS_NUM]; }; #endif xevil-2.02r2.orig/cmn/xetp_basic.h0100644000175000017500000001275507041422154016362 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "xetp_basic.h" // A restricted subset of XETP. Only contains simple methods that require // no information about Physical, Intel, World, Locator, or any other // major XEvil module. xetp_basic.h is used for utility programs dealing // with XETP. #ifndef XETP_BASIC_H #define XETP_BASIC_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif #include "utils.h" #include "streams.h" class XETPBasic { public: // All methods are proceeded by header of form // // // // OLD was.....XETP // // Where LENGTH does not include length of header. // All values are big-endian enum {HEADER_LENGTH = 3}; // 8 enum {VERSION_LENGTH = 8}; // streams.h depends on this value. static char *versionStr; // The ':' syntax gives the size in bytes of each component. :String means // use Utils::string_read(), Utils::string_write(), etc. // Methods for XETP enum { CONNECT = 1, // null ACCEPT, // null TCP_CONNECT, // // // Human must be the same as human after the HUMAN, // OBJECT, // NEW_TURN, // null NEW_WORLD, // // Start a new game. RESET, // // Unused. WORLD_ROOM, // MESSAGE, // ARENA_MESSAGE, // ROOMS_KNOWN, // COMMAND, // DELETE_OBJECT, // // Server asking Client to confirm existence PING, // null // Client responding to PING // Also sent by client everytime it sees a new maximum turn. PONG, // null TIMER_PING, // TIMER_PONG, // // Server explicitly killing Client connection. DISCONNECT, // null // Server informing the client of some UI info. HUMANS_PLAYING, // // Server informing the client of some UI info. ENEMIES_PLAYING, // // Client is begging to start a new game with a new human. REQUEST_NEW_HUMAN, // null // Server tells client to play a sound effect. SOUND_REQUEST, // // Ask a server to give information about itself. SERVER_PING, // null // Server responding to a SERVER_PING. // human_kills is the value after taking soups into account. SERVER_PONG, // // // (humans_num * ( // )) // A client asks the server to send a CHAT packet to the named receiver. // Send to everyone if receiverName is "". CHAT_REQUEST, // // Server passing on a CHAT message to a specific client. // IntelId is that of the sender. CHAT, // // Must be last. XETP_METHOD_MAX, }; // The default port to use for XEvil servers. static const CMN_PORT DEFAULT_PORT; static void check_sizes(); /* EFFECTS: Runtime check that our assumptions about the sizes of primitive data types are correct. */ static int add_header(int bodyLen) {return HEADER_LENGTH + bodyLen;} /* EFFECTS: Returns the entire size of a packet to be sent. */ ////////// SEND METHODS static void send_server_ping(OutStreamP out) {send_generic(out,SERVER_PING);} ////////// RECEIVE METHODS static Boolean receive_header(InStreamP inStream, u_short &method,u_int &length); /* EFFECTS: Look for XETP header coming in from inStream, return method and length of body. */ /* MODIFIES: method, length */ /* NOTE: Does not call prepare_packet() or done_packet(). */ #ifndef PROTECTED_IS_PUBLIC protected: #endif static void send_header(OutStreamP,u_short method,u_int length); /* NOTE: Does not call prepare_packet() or done_packet(). */ static void send_generic(OutStreamP,u_short method); /* EFFECTS: Send a method with no data. */ static void send_int(OutStreamP,u_short method,u_int val); /* EFFECTS: Send a method with an integer data. */ static void send_string(OutStreamP,u_short method,char *msg); /* EFFECTS: Send a method with String data. */ }; #endif xevil-2.02r2.orig/cmn/xetp.h0100644000175000017500000001144407041422154015213 0ustar aaronlaaronl/* * XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge * http://www.xevil.com * satan@xevil.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program, the file "gpl.txt"; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA, or visit http://www.gnu.org. */ // "xetp.h" #ifndef XETP_H #define XETP_H #if X11 #ifndef NO_PRAGMAS #pragma interface #endif #endif #include "utils.h" #include "coord.h" #include "world.h" #include "locator.h" #include "streams.h" #include "sound.h" #include "intel.h" #include "xetp_basic.h" // Static class with info for reading/writing XETP (XEvil Transport Protocol) class XETP: public XETPBasic { public: static void check_sizes(); /* EFFECTS: Runtime check that our assumptions about the sizes of primitive data types are correct. */ ////////// SEND METHODS static void send_connect(OutStreamP out) {send_generic(out,CONNECT);} static void send_accept(OutStreamP out) {send_generic(out,ACCEPT);} static void send_tcp_connect(OutStreamP,u_short udpPort,char *humanName, const ViewportInfo &,int skip, Boolean wantSounds); /* EFFECTS: Send by client immediately after connecting to server to give startup information. Connection is not complete until TCP_CONNECT received. humanName should be empty string for default. */ static void send_human(OutStreamP,HumanP); /* EFFECTS: Update human or tell the client which intelId it is associated with. */ static void send_object(OutStreamP,PhysicalP,Turn turn,TickType tt); static void send_objects(OutStreamP,const PtrList &physicals, Turn turn,const PtrList &tickTypes); /* EFFECTS: Like send object, but guarantees to send all the objects in the same UDP packet. */ static void send_new_turn(OutStreamP out) {send_generic(out,NEW_TURN);} static void send_new_world(OutStreamP,WorldP,int worldVersion); static void send_reset(OutStreamP out,GameStyleType t) {send_int(out,RESET,(u_int)t);} static void send_world_room(OutStreamP,WorldP, const RoomIndex &,int worldVersion); static void send_rooms_known(OutStreamP,const Rooms &, int worldVersion,Boolean *map); static void send_message(OutStreamP,char *msg); static void send_arena_message(OutStreamP,int timeMS,char *msg); static void send_command(OutStreamP,const IntelId &,ITcommand); static void send_delete_object(OutStreamP,const Id &); static void send_ping(OutStreamP out) {send_generic(out,PING);} static void send_pong(OutStreamP out,Turn turn) {send_int(out,PONG,(int)turn);} static void send_timer_ping(OutStreamP out,Turn turn) {send_int(out,TIMER_PING,(int)turn);} static void send_timer_pong(OutStreamP out,Turn pingTurn,Turn localTurn); static void send_disconnect(OutStreamP out) {send_generic(out,DISCONNECT);} static void send_humans_playing(OutStreamP out,u_int num) {send_int(out,HUMANS_PLAYING,num);} static void send_enemies_playing(OutStreamP out,u_int num) {send_int(out,ENEMIES_PLAYING,num);} static void send_request_new_human(OutStreamP out) {send_generic(out,REQUEST_NEW_HUMAN);} static void send_sound_request(OutStreamP,const SoundRequest &); static void send_server_pong(OutStreamP out,GameStyleType,int enemiesNum, int humansNum, const char* version, const char* names[], const char* clientNames[], int humanKills[], int enemyKills[], const Id[]); /* NOTE: Arrays are all of length humansNum. */ static void send_chat_request(OutStreamP out,const char* receiver, const char* message); static void send_chat(OutStreamP out,const char* sender, const IntelId& senderId,const char* message); private: static u_int compute_object_length(PhysicalP); static void _send_object(OutStreamP,PhysicalP, Turn turn,TickType tt,u_int len); /* EFFECTS: Helpers for send_object() and send_objects(). */ }; #endif xevil-2.02r2.orig/cmn/makefile0100644000175000017500000001477007041424626015575 0ustar aaronlaaronl# # XEvil(TM) Copyright (C) 1994,2000 Steve Hardt and Michael Judge # http://www.xevil.com # satan@xevil.com # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or (at # your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program, the file "gpl.txt"; if not, write to the Free # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA, or visit http://www.gnu.org. # # cmn directory Makefile DEPTH = .. include $(DEPTH)/config.mk OBJS = \ $(OBJ_DIR)/area.o \ $(OBJ_DIR)/role.o \ $(OBJ_DIR)/utils.o \ $(OBJ_DIR)/actual.o \ $(OBJ_DIR)/streams.o $(OBJ_DIR)/xetp_basic.o $(OBJ_DIR)/xetp.o \ $(OBJ_DIR)/locator.o \ $(OBJ_DIR)/world.o \ $(OBJ_DIR)/ui_cmn.o \ $(OBJ_DIR)/game.o $(OBJ_DIR)/physical.o \ $(OBJ_DIR)/intel.o \ $(OBJ_DIR)/coord.o $(OBJ_DIR)/game_style.o \ $(OBJ_DIR)/id.o $(OBJ_DIR)/sound_cmn.o $(OBJ_DIR)/l_agreement.o ALL_INCL_DIRS = -I$(DEPTH)/cmn -I$(DEPTH)/x11 -I$(DEPTH)/x11/bitmaps $(INCL_DIRS) ALL_CFLAGS = -DX11=1 $(CFLAGS) xevil: $(OBJS) @echo "Directory cmn finished." #### XEvil modules $(OBJ_DIR)/utils.o: utils.cpp utils.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/utils.o -c utils.cpp $(OBJ_DIR)/coord.o: coord.cpp utils.h coord.h streams.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/coord.o -c coord.cpp $(OBJ_DIR)/area.o: area.cpp utils.h coord.h area.h streams.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/area.o -c area.cpp $(OBJ_DIR)/world.o: world.cpp utils.h coord.h area.h world.h locator.h \ bitmaps/world/world.bitmaps ../x11/xdata.h actual.h streams.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/world.o -c world.cpp $(OBJ_DIR)/intel.o: intel.cpp utils.h coord.h area.h world.h id.h intel.h \ actual.h streams.h \ locator.h physical.h ../x11/xdata.h xetp.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/intel.o -c intel.cpp $(OBJ_DIR)/locator.o: locator.cpp utils.h coord.h area.h world.h id.h intel.h \ physical.h locator.h actual.h ../x11/xdata.h ../x11/sound.h streams.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/locator.o -c locator.cpp $(OBJ_DIR)/physical.o: physical.cpp utils.h coord.h area.h world.h id.h intel.h \ locator.h physical.h ../x11/xdata.h streams.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/physical.o -c physical.cpp $(OBJ_DIR)/actual.o: actual.cpp utils.h coord.h area.h world.h id.h intel.h \ locator.h physical.h actual.h ../x11/xdata.h streams.h \ bitmaps/altar_of_sin/altar_of_sin.bitmaps bitmaps/bomb/bomb.bitmaps \ bitmaps/chainsaw/chainsaw.bitmaps bitmaps/enforcer/enforcer.bitmaps \ bitmaps/f_thrower/f_thrower.bitmaps bitmaps/fireball/fireball.bitmaps \ bitmaps/frog/frog.bitmaps bitmaps/frog_gun/frog_gun.bitmaps \ bitmaps/frog_shell/frog_shell.bitmaps bitmaps/hero/hero.bitmaps \ bitmaps/lance/lance.bitmaps bitmaps/lancer/lancer.bitmaps \ bitmaps/laser/laser.bitmaps \ bitmaps/m_gun/m_gun.bitmaps bitmaps/med_kit/med_kit.bitmaps \ bitmaps/ninja/ninja.bitmaps bitmaps/pistol/pistol.bitmaps \ bitmaps/rock/rock.bitmaps bitmaps/shell/shell.bitmaps \ bitmaps/swap_shell/swap_shell.bitmaps bitmaps/swapper/swapper.bitmaps \ bitmaps/alien/alien.bitmaps \ bitmaps/weight/weight.bitmaps \ bitmaps/launcher/launcher.bitmaps \ bitmaps/missile/missile.bitmaps bitmaps/grenades/grenades.bitmaps \ bitmaps/grenade/grenade.bitmaps \ bitmaps/chopper_boy/chopper_boy.bitmaps \ bitmaps/n_protection/n_protection.bitmaps \ bitmaps/n_shield/n_shield.bitmaps \ bitmaps/t_protection/t_protection.bitmaps \ bitmaps/t_shield/t_shield.bitmaps \ bitmaps/transmogifier/transmogifier.bitmaps bitmaps/xit/xit.bitmaps \ bitmaps/flag/flag.bitmaps bitmaps/doppel/doppel.bitmaps \ bitmaps/home/home.bitmaps bitmaps/trapdoor/trapdoor.bitmaps \ bitmaps/fire_demon/fire_demon.bitmaps \ bitmaps/stars/stars.bitmaps bitmaps/star/star.bitmaps \ bitmaps/walker/walker.bitmaps bitmaps/hugger/hugger.bitmaps \ bitmaps/dog/dog.bitmaps bitmaps/dog_whistle/dog_whistle.bitmaps \ bitmaps/dragon/dragon.bitmaps \ bitmaps/blood/blood.bitmaps bitmaps/green_blood/green_blood.bitmaps \ bitmaps/caffine/caffine.bitmaps \ bitmaps/oil_droplet/oil_droplet.bitmaps bitmaps/p_c_p/p_c_p.bitmaps \ bitmaps/seal/seal.bitmaps $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/actual.o -c actual.cpp $(OBJ_DIR)/game.o: game.cpp utils.h coord.h area.h world.h id.h intel.h \ physical.h actual.h locator.h game_style.h role.h ../x11/ui.h game.h \ ../x11/sound.h ../x11/xdata.h ../x11/viewport.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/game.o -c game.cpp $(OBJ_DIR)/game_style.o: game_style.cpp game_style.h utils.h coord.h world.h locator.h physical.h actual.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/game_style.o -c game_style.cpp $(OBJ_DIR)/role.o: role.cpp role.h streams.h utils.h xetp.h locator.h world.h intel.h coord.h physical.h neth.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/role.o -c role.cpp $(OBJ_DIR)/streams.o: streams.cpp utils.h streams.h neth.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/streams.o -c streams.cpp $(OBJ_DIR)/xetp.o: xetp.cpp utils.h xetp.h xetp_basic.h streams.h intel.h physical.h world.h locator.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/xetp.o -c xetp.cpp $(OBJ_DIR)/xetp_basic.o: xetp_basic.cpp utils.h xetp_basic.h streams.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/xetp_basic.o -c xetp_basic.cpp $(OBJ_DIR)/id.o: id.cpp id.h utils.h streams.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/id.o -c id.cpp $(OBJ_DIR)/sound_cmn.o: sound_cmn.cpp sound_cmn.h utils.h streams.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/sound_cmn.o -c sound_cmn.cpp $(OBJ_DIR)/ui_cmn.o: ui_cmn.cpp ui_cmn.h utils.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/ui_cmn.o -c ui_cmn.cpp $(OBJ_DIR)/l_agreement.o: l_agreement.cpp l_agreement.h utils.h ../x11/xdata.h $(CC) $(DEBUG_OPT) $(ALL_CFLAGS) $(ALL_INCL_DIRS) -o $(OBJ_DIR)/l_agreement.o -c l_agreement.cpp xevil-2.02r2.orig/instructions/0040755000175000017500000000000007637441102016055 5ustar aaronlaaronlxevil-2.02r2.orig/instructions/instructions.html0100644000175000017500000012140207041407724021505 0ustar aaronlaaronl XEvil Instruction Manual

The XEvil 2.X Instruction Manual

Copyright © 1999 Steve Hardt

Last Modified 1/19/2000
Most recent version is at http://www.xevil.com/docs/instructions.html.
Visit www.xevil.com for downloads, source code, screen shots, and more documentation.

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the General Public License for more details.


Introduction

XEvil is a side-view, single or network-multiplayer, fast-action, kill-everything, game for Windows and UNIX.

You have sinned in life.  Now, you die and go to Hell.  XEvil is the contest that determines your fate in Hell for all eternity.  At the end of a game, you receive one of many possible rankings.  A poor player, for example, may spend the rest of time as "Satan's Earwax Remover", while a good one might achieve a prestigious title such as "VP of Hell Marketing" or even "Lead Software Engineer of Hell".


Contents

  1. User Interface
  2. Game Play
  3. Appendix



Part I: User Interface

The XEvil user interface is designed to be as simple and direct as possible.  We're not trying to win any awards for fancy GUI gizmos, we just want to get you to the death-and-gore of XEvil itself.
 

UNIX and Windows Differences

Although game play, graphics, networking, and pretty much everything else is the same between the UNIX and Windows versions, the user interfaces are quite different.  From here on, we will mark sections that apply only to UNIX or only to Windows with with "UNIX:" or "Windows:", respectively.

UNIX:
Menu Bar
UNIX Menu

Windows:
Options Dialog
Windows Options Dialog
 


Graphics Options

At startup, the XEvil License Agreement Dialog appears and gives you several graphics options.  XEvil is designed to run on a variety of machines, with widely varying graphics capabilities.  So, most of these options are meant to allow fast machines to use all the whiz-bang graphics features, while still allowing slow machines to play full speed (with fewer features enabled).

UNIX:

  1. [Large Viewport] chooses between large- and small-viewport modes.  Large-viewport mode is the default, playing XEvil in full resolution.  Small-viewport plays XEvil at half-resolution (similar to XEvil 1.x), shrinking all graphics to half normal size.  Two uses: With small-viewport, you can fit two XEvil windows on one display to play two players on the same machine.  And, small-viewport mode is much faster on machines with slow graphics.
  2. [Smooth Scroll] chooses between smooth-scroll and discrete-scroll modes.  In smooth-scroll, your character is always at the center of the screen, with the world scrolling to follow you.  However, smooth-scroll requires a machine with very fast graphics, so discrete-scroll is the default.  In the latter, the viewport shifts in discrete chunks, only scrolling when your character gets to the edge of the screen.
  3. Turn off [Draw Background] to speed up smooth-scroll mode.  Instead of the appropriate world-background, the background will be solid black.  This switch does nothing in discrete-scroll mode.
Windows:
  1. [Full Screen] chooses between full-screen and windowed modes.  Full-screen is generally faster, running in 800x600, 256-color mode.  But, windowed mode allows you to easily switch between XEvil and other applications.
  2. Turn off [Draw Background] to speed up drawing.  Instead of the appropriate world-background, the background will be solid black.

Controls

XEvil uses keyboard controls, 9 keys for movement, 3 keys each for weapons and items, and one key for network chat.  We use the same default keyboard layout on both UNIX and Windows to assist multi-platform users.   The default setting uses the 9-key number pad for movement, the "insert-home-pageup-delete-end-pagedn" block of six keys for weapons and items, and the space bar for network chat.

Movement:
For Walking characters, press right-left to walk.  Up and up-diagonals to jump, down and down-diagonals to duck and crawl.  Middle key to stop moving.
For Sticky (wall-crawling) characters, press the appropriate diagonal towards the wall to climb, away-diagonal to jump off the wall.
Press up-down to climb ladders.  If you are jumping through the air, you can grab a ladder by pressing up or down while passing over the ladder.
For Flying characters, press the direction you would like to fly.  Middle key to stop in place.

Weapons/Items:
To fire a weapon, or attack hand-to-hand, hold down the weapon-use key and tap the direction you would like to attack.  Movement will not be affected as long as the weapon-use key is held down.  Thus, you can move in one direction while firing in another.
Tap weapon-change to cycle through available weapons, and weapon-drop to drop your current weapon.
Item use, change, and drop keys allow you to use items, cycle through available items, and drop items, respectively.

Network chat is described in the Network XEvil section.
 

Windows:

The [Settings | Keyboard Controls...] menu activates the Keyboard Controls Dialog:
Windows Keyboard Controls
Click on a button to set the key for that command.  On Windows, keyboard controls are saved persistently between sessions.
 

UNIX:

Keyboard controls set via user interface are not saved between sessions.  However, they can be set permanently via X Resources.

To pause, hit F1, then any key to resume.

UNIX: Viewing current keyboard controls

Cllick the [Show Controls] button on the menu to view the current keyboard controls.
UNIX Show Controls
A few tricky things.  On UNIX, you can have a two player game on a single machine, by sharing the same keyboard.  The first player uses the right side of the keyboard, the second player the left.  If you are playing one-player, or are connecting to a server as a client, you only need to think about keys on the right side.

Another tricky things is that UNIX XEvil allows you to map one-or-two different keys to each function.  Here's why.  The default left keyboard mapping use nine-keys centered on the 'L' key.  Put your right hand on the keyboard with middle finger on 'L' and you'll notice that up-right and down-left both have two nearby possible keys.  So, XEvil allows you to hit either 'P' or '[' for up-right and either 'M' or '<' for down-left.  In these cases, two different keys are mapped to the same function.

And, yet another tricky thing (YATT) is the X Window System key naming convention.  Most of the key names, e.g. "period" or "comma", are obvious.  But, some are more obscure.  "Prior" and "Next" generally mean "Page Up" and "Page Down".  Anything starting with "KP_" means a key on the numeric keypad.  If you are really stuck, read "/usr/include/X11/keysymdef.h" or the "X" man pages.

UNIX: Setting Keyboard Controls via User Interface

Click the [Set Controls] button to change the keyboard controls.
UNIX Set Controls
The dialog will ask you, in order, for all keyboard controls.  Click on the Set Controls Dialog, and type in the requested keys.  Now, there is the whole two-keys-to-one-function thing described above, so you have the option to enter two different keys for each function.  But, most of the time, you will just hit the same key twice.

Changes take effect immediately, so you don't always have to cycle through all controls.  In particular, if you are playing one-player, dismiss the dialog after setting controls for the right side.  To dismiss the dialog, click the close-window button (usually) in the upper-right corner, or unselect [Set Controls] from the XEvil menu.  If you type an incorrect key, dismiss the dialog and start again.
 

UNIX: Setting Keyboard Controls via X Resources

If you're sick of going through the [Set Controls] dialog every time you run XEvil, set the controls once via X Resources (part of the X Window System). Generally, you add lines to the ".Xdefaults" or ".Xresources" file in your home directory.  See the man pages for X(1) and xrdb(1) to learn more about setting/viewing X resources.

Remember, there are separate sets of controls for the right and left sides of the keyboard.  If you are playing one-player mode, or running as a client connecting to a server, you only need think about the right hand set.  Also remember, up to two keys can be mapped to each function.

The easiest way to show this is with a few examples. The possible values for each function are the keys in "/usr/include/X11/keysymdef.h" with the "XK_" prefix stripped, e.g. "XK_asterisk" becomes "asterisk".

"XEvil.right_weapon_use:    Insert"
The keysym for weapon-use on the right side controls is the insert key.

"XEvil.right_left:    KP_Left"
The keysym for move-left on the right side controls is the left-arrow key on the numerical keypad ("KP_" means numerical keypad).

"XEvil.left_up_right_2:    bracketleft"
The second keysym for move-up-right on the left side controls is the left-square-bracket.
 

A sample resource file.  Further examples are in the "x11/app-defaults" directory in the XEvil source distribution.

! XEvil resources for a sun4 SPARC station 1
!
! Right side of keyboard
XEvil.right_center:                     F31
XEvil.right_right:                      Right
XEvil.right_down_right:                 F35
XEvil.right_down:                       Down
XEvil.right_down_left:                  F33
XEvil.right_left:                       Left
XEvil.right_up_left:                    F27
XEvil.right_up:                         Up
XEvil.right_up_right:                   F29
XEvil.right_weapon_use:                 F21
XEvil.right_weapon_change:              F22
XEvil.right_weapon_drop:                F23
XEvil.right_item_use:                   F24
XEvil.right_item_change:                F25
XEvil.right_item_drop:                  F26
! Left side of keyboard
XEvil.left_center:                      l
XEvil.left_right:                       semicolon
XEvil.left_down_right:                  slash
XEvil.left_down:                        period
XEvil.left_down_left:                   m
XEvil.left_down_left_2:                 comma
XEvil.left_left:                        k
XEvil.left_up_left:                     i
XEvil.left_up:                          o
XEvil.left_up_right:                    p
XEvil.left_up_right_2:                  bracketleft
XEvil.left_weapon_use:                  a
XEvil.left_weapon_change:               s
XEvil.left_weapon_drop:                 d
XEvil.left_item_use:                    z
XEvil.left_item_change:                 x
XEvil.left_item_drop:                   c

Game Style

There are six "Styles" of XEvil game play, controlled by the "Game Style" toggle buttons.
    Levels
    The default style for single-player games.  Kill all enemies on each level to advance to the next more difficult level.  Every five levels, you must complete a scenario.  A scenario is a mission with a specific goal, e.g. "Capture the Flag", "Hive"-find the exit before the hoards of Aliens kill you, "Kill the Baby Seals", or "The Pound"-survive an onslaught of rabid dogs.
    Scenarios Only
    No normal levels, you only play scenarios.
    Kill, Kill, Kill
    Everything attacks everything, machine players even attack each other. Game is over when there is one (or fewer) survivors.  Also makes a good screen-saver, set zero human players and watch the machines fight it out.
    Duel
    Good for multi-player tournaments.  Each player has three lives.
    Extended Duel
    The default "Death Match" style for multi-player network games.  Humans have infinite lives and the game keeps track of the number of kills per player.
    Training
    No enemies, good for learning the controls (and debugging).
You can further specify the type of game by setting values for [Human Players], [Enemy Players], [Regenerate Enemies], and [Cooperative].  Depending on the Game Style setting, certain of these controls will be ghosted out because their values are unused.
    [Human Players]
    Set the number of players on this machine.  On Windows, this is zero or one.  You can set zero players then sit back and watch the machines kill each other.  On UNIX, this can be zero to six.  Two players can share the same machine, each using half of the keyboard.  Or, you can open windows on multiple X Displays with the -display<N> command line option, to play up to six players.  Note: multiplayer by opening multiple X Displays is different than true client/server network play, described in the "Network XEvil" section.  This control is unused for true network play, because the value is set implicitly by the number of machines connected to the server.
    [Enemy Players]
    Only used for certain Game Styles, set the number of enemy players in the game.  E.g. for a human vs. human duel, you may or may not want to have computer players running around in the game.
    [Regenerate Enemies]
    Only used for certain Game Styles, choose whether enemy players are automatically regenerated.  E.g. if [Enemy Players] is set to ten, and all but four have been killed, six new ones will soon appear to take the place of their fallen comrades.
    [Cooperative]
    You can choose a [Cooperative] game, where all humans work together.  Your dogs and doppelgangers will not attack other humans, human-fired missiles will not track other humans, humans will not bump into each other, and you all share the same set of lives.


Network XEvil

For ease of use and distribution, the XEvil client, server, and standalone games are bundled in the same executable.

XETP, the XEvil Transport Protocol, is platform independent. You can connect Windows clients to UNIX servers and vice versa.  Even though UNIX XEvil has no sound (yet), Windows clients connected to UNIX servers will get correct sound effects.  XETP works over standard TCP/IP connections (using UDP and TCP packets), so XEvil can be played over the internet, a LAN, or a dialup connection.

Network XEvil provides a simple chat mode, facilitating taunts and other important modes of inter-player communication.  On either Client or Server, press the chat key (default is spacebar), enter your message, then "Enter" to send the message or "Esc" to abort the message and return to normal controls.
 

Client

Windows:
You can run an XEvil client from the user interface at run time.  Select the "Network | Connect to Server..." menu.  Enter the hostname or IP address of the server along with the port number (if different than the default port 6066).  Optionally, enter a player name.  If you do not choose a player name, your name will be chosen randomly each game.  Hit "OK" to connect.

UNIX:
Use the command line options described below.

Windows and UNIX:
You can run an XEvil client from the command line.  Type "xevil -connect <server_name> {server_port}" to connect to a specific server, optionally specifying the server port number, e.g. "xevil -connect xevil.notgod.com".

While connected, you can hit [New Game] to restart.  The server will end your old game and start you with a new character.
 

Server

The server has the option to either be a regular "Player" in the game, or to run in "Observer" mode with a scrollable window watching the action.  "Player" mode makes it very easy to set up, say, two player games.  One machine runs the server, the other connects to it, done.

Windows:
You can run an XEvil server from the user interface at run time.  Select the "Network | Run as Server..." menu.  You may change the port number to run on a port other than the default, 6066.  Choose either "Player" or "Observer" mode and hit "OK".  Clients can  now to connect to your machine.

UNIX:
Use the command line options described below to run a UNIX XEvil server.

Windows and UNIX:
You can run an XEvil server from the command line.  Type "xevil -server {port_number}" to run an XEvil server in "Player" mode, optionally specifying a server port number.  Add the "-observer" flag to run in "Observer" mode.

Windows:
Windows XEvil provides a dedicated server mode, with a small window to control game options and view server logs.  Dedicated-Server mode performs no drawing, so inflicts little slowdown on other applications.
Run "xevil -server -dedicated" from the command line.  Dedicated servers are always in "Observer" mode.

UNIX:
UNIX XEvil provides a non-graphical command-line-only server interface.  This allows XEvil servers to be run in startup scripts or remotely via telnet when no graphical interface is available.
Run "xevil -server -no_ui" from the command line.  Command-line servers are always in "Observer" mode.

You can record a server log by redirecting the output to a file, say "log.txt".
"xevil -server -no_ui > log.txt"
or
"xevil -server -no_ui | tee log.txt"
The second form will copy the log to "log.txt" while still displaying it on the command line.

Remote Server Monitoring

You can remotely monitor an XEvil server with the "serverping" utility program.  serverping queries a server for certain information, including the list of players on the server, and their kills.  serverping can be used to make web pages that actively monitor XEvil servers.

Currently the only way to obtain serverping is to download the XEvil source code and compile it on a UNIX machine.  serverping will be generated in the same directory as the XEvil executable.  I haven't tried building serverping.cpp on a Windows machine, but it is all cross-platform code and shouldn't be too hard to make it work.


Difficulty

There are four levels of difficulty, "Trivial", "Normal", "Hard", and "Bend Over".

UNIX:
You will be prompted for the level of difficulty at the start of the first game.  Press the key for the desired level of difficulty.  Or, hit space or click a mouse button as a shortcut for "Normal".

Windows:
The [Settings | Keyboard Controls...] menu will activate the Difficulty dialog.  Changing level of difficulty will not effect a game currently in progress.  Start a new game to play with the new level of difficulty.


Game Speed

UNIX:
The [Speed] control in the upper-right corner sets the time (in milliseconds) between turns, e.g. 40ms implies a frame rate of 25 fps.  A little counter-intuitive in that smaller numbers give higher speeds.  Set [Speed] to zero to play at the max speed supported by your machine.

Windows:
Move the [Game Speed] slider in the Options Dialog to the right to go faster, left to go slower.

UNIX and Windows:
Run "xevil -speed <speed_in_ms>" to set the exact speed in milliseconds, similar to the UNIX [Speed] control.

If playing a network game, it's best to leave the speed at default.  If a client and server are running at different speeds, the client-side dead-reckoning algorithm will be off, resulting in objects jumping around the screen more than necessary.


Sound (Windows only)

The Options Dialog provides several options for controlling XEvil sound:
  1. Set the volume of the background music with the "Soundtrack" slider.
  2. Set the volume of the sound effects (gunshots, screams, and the like) with the "Effects" slider.
  3. Turn sound on/off altogether with the "Sound" toggle button.
  4. Set background music to play from the built-in MIDI files (default).
  5. Set background music to play random tracks from an audio CD.
In general, changes will take effect when you click "OK" on the Options Dialog.

Sometimes, even with the "Soundtrack" slider all the way up, the MIDI sound is still too quiet.  Two ways to deal with this:

  1. Open the Windows Volume Controls by right-clicking on the speaker icon in the lower-right corner of your screen.  Then crank the "Synth Volume" all the way up.
  2. Turn down the "Effect" volume in the XEvil Options Dialog.  Then increase the master volume on your speakers.


UNIX XEvil has no sound.  But, with the source freely available, I'm sure some industrious soul could write it (hint, hint).


Part II: Game Play

World

The XEvil World is a randomly generated two-dimensional map composed of walls, floors, ladders, horizontal and vertical movers(elevators), and doors.  The maze algorithm guarantees every character that can at least walk and climb ladders can get from any room to any other room.  Each level randomly chooses one of several graphical "themes",  e.g. a "Mayan" theme, a "Medieval" theme, an "Industrial" theme.
 

Characters

XEvil characters walk, climb ladders, climb on walls and ceilings, fly, use weapons and items, and/or fight hand-to-hand depending on their specific set of abilities.  At the start of each life, you are randomly given one of the characters to play.  One time you may be a "Ninja", next time a "Chopper-Boy". To succeed in XEvil, you need to learn all the major characters.  The XEvil Character Profiles gives a full description of each.

You can build up characters with more powerful weapon and items, with shields, or by earning bonuses like double health, double speed, hellfire powers (light enemies on fire by touching them), or healing powers.  But, life is cheap, and often very short.  A much less pumped character, controlled by a clever and fast opponent, might just find the right weapon/item combination to nail you where you least expect it.
 

Weapons and Items

Next to the characters themselves, weapons and items are the heart of XEvil gameplay.  We include many of the standard video game weapons and items (hand-to-hand combat, melee weapons, projectile weapons, throwing weapons, shields, MedKit), but also a number of more creative devices (Soul-Swapper, Frog-Gun, Transmogifier, Doppelganger, Dog-Whistle, drugs, Cloak, and heat weapons).  The XEvil Armory lists all the weapons and items in XEvil.

We implemented a system where it is fairly easy to find weapons, but not too easy, and where it is impossible to hoard weapons from other players.  If you pick up a weapon you already have, your character will take the ammunition from the new weapon.  After killing an opponent, you may loot all the weapons and items from the corpse (assuming you didn't blow up the entire area with a Bomb or Grenade).

Don't get too attached to your body, you never know when it might get snatched from under you.  The XEvil Soul-Swapper lets you swap souls between your body and someone else's.  The Soul-Swapper is good for taking over powerful enemies, or getting rid of your current near-death body.  The frog-gun temporarily turns an enemy into a harmless, hopping, little amphibian.  Be sure to catch and nail the critter before he turns back.  The Transmogifier (based on "transmogrify"), randomly turns its user into a different Creature.  It's good if your current body is weak or wounded, or if you just feel like a change.

Doppelgangers and Dog-Whistles give you followers.  Your followers help you out, protecting you and attacking your enemies.  And, you even get the credit for all your followers' kills.  Using a Doppelganger generates a copy of your current body.  It is largely independent, wandering around the world attacking your enemies.  Blowing a Dog-Whistle summons two loyal and obedient Dogs.  Unless ordered otherwise, Dogs follow nearby protecting their master, attacking nearby targets and fetching weapons and items.  You can use the Dog-Whistle to order your Dogs to seek in a certain direction or to return to your side.

XEvil has more drugs than a elementary school playground.  Caffine is the legal drug, keeps you awake and makes you go faster.  No really bad side-effects, although the shaking may make you fall off ladders and such.  Crack and PCP make you faster and stronger.  But, they come with a chance of overdose.  If you do drugs and die, well, you should've listened to Nancy Reagan.  As long as you keep constantly high, feeding your habit with more drugs, you won't suffer the negative effects of the come-down.  If you see your opponents shaking, twitching, and jumping all over the place, be careful, they may be strung out on Crack.

The "Cloak" gives limited invisibility.  The background shimmers in the shape of your character, so only very observant players can see you.  Cloaking effects last for quite a while (not infinite, don't want cowards to hide in the corners forever), but end as soon as you fire a weapon.  Cloak is perfect for ambush attacks.

Now, what would Hell be without fire?  Flame-Throwers, Napalm-Grenades, and Fireballs allow you to have a barbecue with your unwanted guests.  The more you hit 'em, the hotter they get, the longer they burn, and the more damage they take.  Sometimes you can hit someone with enough fire so that after they kill you, they still burn to death.  Vengeance from the grave.  Of course, all Demons and Demonic objects are immune to heat attacks.  "Gee, that tickles."

XEvil has no personal hand-held or built-in teleporters.  I hate games where your quarry magically beams away right before you kill them.  Stationary teleporters are ok.  Doors and teleportation booths set into in the world background move you instantly from one fixed location to another.


Part III: Appendix

Title

The title, "XEvil", reflects the game's early UNIX roots, the X Window naming convention of  applications like XTerm, XClock, XTrek, and XEmacs.  Now, with cross-platform support, the title is read as "XEvil" == "eXtremely Evil", "eXceptionally Evil", "eXcessively Evil", "eXtraordinarily Evil", "eXclusively Evil", "eXquisitely Evil", "eXorbitantly Evil", etc, etc.

Hints

The combination of weapons and items in XEvil allows for a number of creative, "classy" kills and strategies, many we never thought of while writing the game.  Here are a few examples:
  1. While an enemy is shooting at you, hit him with the Soul-Swapper.  After switching bodies, his own bullets will kill him.
  2. Drop a Transmogifier on an Alien or some other tough enemy.  It will probably turn him into something easier to kill.
  3. Trigger a Bomb, but don't drop it.  Then soul-swap an enemy.  He will find himself holding the hot-potato when it goes off.
  4. Activate Doppelgangers and Dogs as living shields when being pursued by a really nasty enemy, say a FireDemon.
  5. Drop drugs on your enemies until they die from overdose.
  6. Use a Transmogifier to change bodies when missiles are tracking you.  They will lose the lock-on and fly into a wall.


Command Line Arguments

Throughout the bulk of this manual, we mention command line arguments only when they are especially relevant. Here we give an exhaustive list of all  XEvil command line arguments.

Values in <> are required, values in {} are optional.  Arguments that say (UNIX) or (Windows), are only meaningful for that platform.

Windows:
UNIX users, of course, are intimately familiar with the command line.  Some Windows users may not be.  On Win 95/98/NT, there are several ways to run a program from the command line.

  1. From the "Start" menu, click "Run...".  In the dialog, type the command line to run XEvil,

  2. e.g. "c:\xevil2.0\xevil <some_list_of_command_line_arguments>"
  3. "Start | Programs | MS-DOS Prompt".  Then type the command line in the MS-DOS window.
  4. Create a shortcut to XEvil.  Right-click on the shortcut icon and bring up the Properties dialog.  Choose the "Shortcut" tab, then add any command line arguments to the "Target" field.  Click "OK", then double click the shortcut to execute.


UNIX and Windows:

  • Arguments applicable to all modes of playing, StandAlone, Client, or Server.
    • -debug_info

    • Extra debugging information.  On Windows this adds a menu for debugging the SurfaceManager.
    • -name <player_name>

    • Set the name for the first player, i.e. player number 0.
    • -name<N> <player_name>

    • Set the name for player number N, N starts at 0,
      e.g. "xevil -name0 bob -name1 fred -name2 jane".
    • -reduce_draw

    • Don't draw backgrounds.
    • -speed <time_in_ms>

    • Set the time for each turn in milliseconds.
    • -display <display_name>

    • (UNIX) Run all XEvil windows on the given X Display.  See the "X" man pages for info on display names.  Remember to include the ":<screen_number>" after the machine name, e.g. "somemachine:0".
    • -display<N> <display_name>

    • (UNIX) Associate player number N with the given X Display.  N starts at zero.
      E.g. "xevil -display0 chainsaw.domain.com:0 -display1 fthrower.anotherdomain.edu:0" will play a game where player number 0 is on the machine "chainsaw" while player 1 is on the machine "fthrower".
    • -draw_rects

    • (UNIX) Debugging tool for discrete-scroll mode.  Show the exact rectangles being drawn.
    • -help or -h

    • (UNIX) Print out a help message.
    • -info

    • (UNIX) Print out license agreement text, including credits.
    • -keys <keyset_name>

    • (UNIX) Use one of the built-in default keyboard settings.  Possible values are "alpha", "decmips", 'iris", "linux", "mac", "ncd", "rsaix", "sun3", "sun4", "sun4_sparc", "tektronix".  The default is set at compile-time with the -DXEVIL_KEYSET flag.
    • -large_viewport

    • (UNIX) Start in large-viewport mode.
    • -no_buffer

    • (UNIX) Don't use double-buffer for smooth-scroll mode.
    • -no_smooth_scroll

    • (UNIX) Turn smooth scroll off.
    • -old_draw

    • (UNIX) Use an older drawing algorithm.
    • -small_viewport

    • (UNIX) Start in small-viewport mode.
    • -smooth_scroll

    • (UNIX) Turn smooth scroll on.
    • -stats

    • (UNIX) Periodically print out a few useful statistics about timing and events.
    • -use_averaging

    • (UNIX) For small viewport mode, set the image reduction algorithm to take the average of the source pixels.  Default is sub-sampling.
    • -use_buffer

    • (UNIX) Use a double-buffer for smooth-scroll mode.
    • -cd

    • (Windows) Set soundtrack to play an audio CD.
    • -full_screen

    • (Windows) Run XEvil in full-screen mode.
    • -gen_xpm <directory_name>

    • (Windows) Auto-generate UNIX XPM images for XEvil into the given directory.  Used for development work.
    • -midi

    • (Windows) Set soundtrack to play the built-in MIDI music
    • -no_init_graphics

    • (Windows) Don't initialize all graphics at startup.  Initialize graphics lazily, load images when they are first needed.
    • -no_soundtrack

    • (Windows) Turn off the soundtrack.
    • -window_screen

    • (Windows) Run XEvil in windowed mode.
  • Arguments for StandAlone or Server.
    • -cooperative

    • Turn on "Cooperative" mode.
    • -difficulty <difficulty_level>

    • Set difficulty level, possible values are "trivial", "normal", "hard", or "bend-over".
    • -duel

    • Set game style to "Duel".
    • -extended

    • Set game style to "Extended Duel".
    • -enemies <enemies_num>

    • Set number of enemy players.
    • -kill

    • Set game style to "Kill, Kill, Kill".
    • -levels

    • Set game style to "Levels".
    • -no_demo

    • Don't show a demo at game startup.  Mostly for debugging.
    • -no_items

    • No weapons or items will be added to the XEvil world.  Mostly for debugging.
    • -no_level_title

    • Don't pause at the beginning of each level, displaying the level title.
    • -no_movers

    • No horizontal or vertical movers(elevators) in the game.
    • -no_new_level

    • Never advance to the next level.  Only useful for debugging.
    • -one_item <item_name>

    • Only put one item in the XEvil world, an instance of the named class.  For debugging.
    • -regenerate_enemies

    • Turn on auto-regenerate enemies.
    • -rooms <N>x<M>

    • Set the dimensions of the XEvil world to be N rooms across and M rooms down.  Only used for certain game styles and scenarios.
    • -scenario <scenario_name>

    • For the "Scenarios" game style, always play the named scenario.
    • -scenarios

    • Set game style to "Scenarios".
    • -training

    • Set game style to "Training".
  • Arguments for Client Only.
    • -connect <server_name> {server_port}

    • Run XEvil as a client, connecting to the given server.  Server port number may optionally be specified, default is 6066.
    • -client_port <port_number>

    • Manually specifiy the UDP port used on the client side.  Use this if you get an error like "Could not bind local UDP port".
    • -no_dead_reckoning

    • Disable client-side dead reckoning.  Objects will jump around on the screen more.
    • -skip <skip_turns>

    • Manually specify the rate of data flow from the connected XEvil server.  "-skip 1" means send data at full rate no matter what.  "-skip 2" means only send every other turn, "-skip 3" means only send every three turns, etc.  "-skip 0" means automatically adjust the rate (default).
  • Arguments for Server Only.
    • -server {server_port}

    • Run an XEvil server.  Optionally specify the server port number, default is 6066.
    • -disconnect_time <time_in_ms>

    • Specify time in milliseconds before disconnecting clients that do not respond.
    • -no_adjust_skip

    • Don't adjust the data flow rate to clients.
    • -no_disconnect

    • Never disconnect clients, even if they don't respond.  Useful for debugging.
    • -observer

    • Run the server in "Observer" mode.  Default is "Player" mode.
    • -target_delay <num_turns>

    • Server will adjust rate of data flow to Clients to keep latency <= this number of turns.
    • -no_ui

    • (UNIX) Run a command-line XEvil server.  Implies "-observer".
    • -dedicated

    • (Windows) Run a dedicated XEvil server. Implies "-observer".
  • Arguments for Client or Server.
    • -buggy

    • Purposely drop packets, scramble packets, and send duplicate packets.  Simulate a crappy network connection to assist debugging.
    • -net_stats

    • Print out stats on network packets.
xevil-2.02r2.orig/instructions/keysdlg.gif0100644000175000017500000001307106652512272020210 0ustar aaronlaaronlGIF89a?,?I8ͻ`(dihl; tmx|pH,Ȥrl0aJZجvzxL.zn@~qRQs?trP6t2xǺ}]uɌ4yUSؐTe' ۱nhɣTyz#$R`ÆjYUZ)ַm*]QϿG9(j_&fFVhQv(H(*I4b8(:#<(IHgdL6ݒNF)%tPNiU\e`bi&_&im)qiuީyg})j艅.腍>*)NjiĦs)Nj -@i؇:bd~ngjbҊ򪤯*ݮk\ƢlОàWTc@rF޴XTnqԮz[:νc>f;橆Z/\C\VĒ(w ,$l22n/+Jl1c|[0`q?SpPG)kr4Su\l,_l4b[$X wsXY0Eӝ.G܈ v.ZG>x؁}*KmZ=֭Jn3sO^x˂s9[>)Vkyܟ x=9r{xq Gv{޺2+,~}o|=Xl^T6<s[>oŭsC R$nLܵ@59_# 0?\NA^g1ziNBτAKȡ8̡w8>Gā!}H ~pNC$"<%QdbO$$O" 74*R`8"EE+~WB5\n4Bs7E>=TYFtq(i>.cr )*9}|qyzu$-l8d(J0҈M'pJGU_X(YVizu:^2 lC(kIJbv|\s^nB0WW \-זq/9L3h^!jf c/ 'elYhWq~ f7itFAEvAtR7ٓræ5E-s47XtYDHMm6. 0k ?Mw<~+-IN*t'l 7ozt{FAM"ƛİM=&_UU:n1P*Z֙aYuH*,Km'XD‹)= ыlihUWiv+ڠի|5_4te(+cZDZRa -E6-0a>vejI[)ice\+>2`)PW&!Uf֏qcZ.x uq- bfhWQZ^%/%s{^Jwb/Lm{C ;5s=b}VɥpOոMl͢]n_8az%^ps{cWp uv~-߻˜&VMzG/ޭ2L'UkruBV ۝?|'Nte2+'ܬ\ 3W/-t[ I͹iirЪ#@Y<_ԧxA~tG ؗ2@+`YGkPwXhX۔uHR~gj3֚ōmhB6q*>sl^pfx13cmWj3ٖp9Pr9'l[}{vɭyΜ‘kd*#ꂗPtcnf#/[lxVxK8:5=ˆP戛Xuq&`qϧv{nHV;de4WoNg|z]8p겊XxƉ뱋؋azsG_h_b.b_whXx4-5O!fXUtՌxUܨ.XFh9%wdea8[5|lS 9WHbJcaȘ3vc93LLGhY6lpYcSxUau5+6UuSs#hbDžEHnH7 k"cUt)fQdƊ|h0K6bXBirCfeg')9gSN~(fYU碕(gvGeƶ y-)zhsŖZfX&)yqɗ9xt?4Uy"_֔Topv2)PAv0ք&B }w"هiVhē牵XZ"8x`ԹɚY՝kHŚ*YĹx,y9Ji"ii1Z)é̉avB8h)C ^ Cڂ m: 40i-?]}_8rNʩA5*~ߙJ(Jڤ֒P8ԣȢi yK%Rچ\:X^)mXd8{:gJ"5*~:/xD}d9_@b;9 7Ji^ħ$YOHCb$zӪ M>Fp<`D9f]33go:Xgs_Gu"J WS %9f> 癎JcjF[xzqgx4ix *"CAbYZl5FJJWi> pFڗY5OI7s?Z̪*kTJުJʝ$K&۲4ð ʲ3:? z';/j]ꩮ(QJ۴IB2 ˯Z+);a%gA++v:yyGۥ-Bʳr˵-_[c[jX*.f۵TwkҸ &7{ {\8l*;J_Az \yZxȫ;x ;lff|fDT&R, y,7{蝊{98_1J)oٙYk+=x$ەn6ЙudE+K`浗z<+{#Yn귳[g)zəQ) \/)Ye˿1{8;Kh+(J:7K aJ u[de[˻14!‹ƸX{.Wz+;•Fk{}l> Cw z̴ZƑƤz{zvwU,I۩{O#첏|lX G ;s u}{iKF藣莮D2(~銒n('>zRn'r&jn&^br&I>짢'îB%Ǝ.~^~x)Q5.An!юD#@m~h ,%^ް\2}|zmZmsNQV} / n%ox YrȞ>I xg0'f6tbe} ,tp9(6>߮?%onb w4ToU3FN?!^ЮH/[Mcs;pOl*#Ud%vo-\}Iv~^p+mN^|??R#9/]='_6B꺿?>ğ'q؟ڿڠ?_;xevil-2.02r2.orig/instructions/optionsdlg.gif0100644000175000017500000001364606652512272020740 0ustar aaronlaaronlGIF89a?,?I8ͻ`(dihjp,tmx|pH,ȤqШtJZجvzxL.h2E(|N~kNMm=nlLn3z0}YotҪQOǷrPܶ12ikg;y)Sh/.zGEHEq džtHɓ(6p[nAʌ$C)si-9y&ȑ5e\_"71W҆EINlʵTުϫٳ)N,ڷp @]/7%˿طa0+^[ǐ#KL˘/̹ϠCe3ӨS^ڳְc˞M{ڸsͻ 7ȓ+7c|С7Nӯk]tË}iJϾ}˟O~},@RX~ UX`DU E܄5iWXωx_?zکXHނkHHO`C0V#L*'Dj==)F<2FKb)foZM@$Vo^AR9_ hfN y.Iݑ9Z[a)U@hTXzܣ*OieH fN-b6FqZ$PiʪM^ljwU(l?g+Vkm]5:l:F{[n*[.  ~}m_-ښ/kƮc%iӫ3 bApŜޫpƽB,ăjrƤ(Dz"7bsͼ.=\Йڬ>^ @BK/$[ Z-FɻQ=}p-ۘܚn_whs.|ߞNjvM&# 6JN#͜/3ڟW8z{c5:c%(~, u_z;^CxeDF|?? װ,~|zW}Ѷ=L`V/>ovzm# SĨe6ۜ(#9 J` 9G Fy ( #8ITbQTp2c0DX 5=%DU%-\3"JCOJ\b&f4)FL"^-ыa`P)BG#'D!G-c!1`wbL6N,8š%Rle4;VD[ig~$C"ё;;e+iLYu~62Ffi$x4eQsZױ2,-ճgL0YysT gH\0A%nbufΰPuU]}GC%j d :rbIRպ&V3cv6eVc'1ϊLի-* N:Q%#SKvR2ye,3/bS<#*X-`<ASX3Msؾ܇qOZzTff>縱74$)+0[1F6bL7"<ĩz3G$gL}mjh3Rnz/ `cRcYE}gG{S>&m{Y4>ǹm8@K0*X텯⻿wrr-7Gen='s ÇIvLT O( h&w/NIҁ|اk'_vkmsZ]HpI* +YWwՑ WL]9Z(pyX"hqEX\m5aIU_gZHxtx5FOȇaa*"jB(YՔOxPr_Ǘ)j9;(Fwig$95XٷVYy_RE渃UHVipY`tGx/r5vJ9r 4mB5)?8Й5E97csD9t1灱ǔɜ]ɑ9v|#HKYN7&ُ+`ht x8hb:苜)QhYi#m&Z- STd^x5jm}󑢉;؇Rs KȺq(Y) n]8LҜuEX|O42}&}@0ו|U:=(MjLlrԑcJ`rYYģ]\E{~(. ؔ27R+Rr- ך9 86$bxm1픂4}@Bz7.侵P*-X1ʰE!-Jp7f')хI,iSw @<ģ{;yԔ0E:L;ET]X-ܾp7\½,ϗ̦Cr-6 ݯJâ,ݭ-z5:Ľ%2*ۤMΞ}b H~Sr}A >mᚱڋHb.n,)M'PZ2 m0n7>ؖ}FL:X f@>Nx5=o%۶[~ 1~;^ѿ=mmTm~q]D=#Xvђ-Yol>uu{oaǪz r}+/Rrn:;zc׈5A#n'?e>"G>=Zݏ s#xkl;kx)rkM4?/>nmYb;&뇭촾tYeMPg`R?>&X_E^ЙޗQNݾ☸wFSհN_&#_.%/Fs}^#O6SlO;XV_=S9fnwjS/pl' /ܾ^(OSs8P=~;r\'EM5woo]uObGVo!"/Rͣ 8^Y!~?q-ۮo? :͈NH$uZIqՙ[N> u_8go;> DEFǖ5J˷MNOȚR#PUVWWYZ[ I\^_``baef3gijH]lmhopVorshluvrxyyz}rj~X ..CFXD5A$I@dI `K1eΤYM9uOA%Zth I.eSQNZUYnפ;xevil-2.02r2.orig/instructions/UNIXmenu.gif0100644000175000017500000000644006652513754020226 0ustar aaronlaaronlGIF89a&@@@`d`hnu@.g/if' ?>@Ԕ68/2@/@|`L @/e@8/64,>>@|`L @{`// /4>|`/L @ac//@6/\/L/ `e@le7@@h56l6\L @LL/ //4/>45>6!@/GL @aec@@<76LL @@/8/l<4>56L/tOverwit exi@stngfil'/home/aLr d@t9sc/x@evil2'.h0/@U,&H*\ȰÇ#JHŋ3jȱǏ CIIR\ɲ˕I͛8sϟ@)ѣ:"]ʴNNJS)իXZʵϭ^Ê% ٳ,cB;t-[`v+MvūoM~LX+f\(AC*yrʖ 3gC9iHQG^@k_k. l{iDyW)o&ش9/ʇלի?@nuOo={ڽ7 }IYT>Dzĥj-`݀-7=XFyǡxf^kܭ'}maA]Y^v bXx6(bXGTB.e"SiM"b#zHeOv[vQn[id}SInRj#zVݚ g) f٦z5'a$行.(~|"fgwv_)j*t%gޥXakW+fJri& Ǧx)(YmL©$6lks2Ժ񾸭vz nYoΔoj&,6/MVzV deƯ:Z"1ꪚ2q loY2r>;FάnvΒ7g./rr0ʹN*[\ْϦ._;7j 1U 8K"Or15Slf $ۦL8oC+ut+?fmi@qVG~6Yi_zݴ }̻V޴ێb]|Ћ{Ɨ j;ѻl0]7<7x~k߰|Ꟃ>gOqֶ۹~*s_^fhk}*7?[8:!{^oz~:f@k7"%Cqe u%/1O *RqKZe nW99vZ\NU zXdg)1rэ+Q87͉bڈG2qjtJʍQzGBia$Ƽ!&`V<#Nȓ;™J-~ @JPzD-MBІ:@ z+Z jFHGJҒ(MJWQiʓ*- 87z4(Mw6Ӧ JJԢ()4_M撧qj;*BQcJ"` XyCU2Ȝ)VYbmRժYJL#XlSWeR*[GQ$jCt˗$&9ua9:VZ2V.5%]kjZ5__T$R*oDmqtb1IH7Jp<'g]粥7J+`ߕkk2ޗT)[Y_1-a#5ic]?=r[It( ]L^ջHͲjCZC2x\Dw1 %_Ǣ iC赁,ooLEr.ŗM8&5l+<֗ԉX&B ^Wᕜ7USyX cn5^-M} b;:6D&a fُz罒~5E.%x>)X^Ǵv-3\g7oq|$z}dR2PfDCU_Ƙ]-eb}[qKcŰjih;JRrW4C[[vĆuGLTЈ|dxڛ~zT$m#[t?>RWC6Minz纗/U!K)y[~+o)CNO=ܻ|kW8qmׄOS7vݯX3{yV`f|=Ư=ŭ䇽cߜi6vbޚU"ۋK*ozt>lV^=խ^VQlssn 간+;ު M{^7ƽ`a B;kۘ~w56p\{\k>W5lʚYb9r2k;ds%{?|XjF>i2~hhv4qFC=S&*X0oerY{dtHTqhGV|އpU8N^5V '*UVgJmZ19_]Ճo(kuW@O.Hh4L؄6xQP2f<8eMVx B8k%VJ؄b8_PQiUgKb\xU^GYaHvxI5rhHL؅|\sPUxP;xevil-2.02r2.orig/instructions/UNIXSetControls.gif0100644000175000017500000000701506652512170021527 0ustar aaronlaaronlGIF87aN8@@@@@PPP`````d` @`D2@$@|'`Lh @@//8 />4>>6@7| `>{6`/q @z @|w`/L7 @ace@@Bj66/q@\z L/ @`w le7@@56lt6j\/LL @@ z/45>x6!f@/G 6eq@<7_!@L @=/e8/\<4>!c/| f>`8!L @sR )n8 >#|@@`d97  >`L`a'ch/,NH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0͛8sɳϟ@ JѣH*]ʴӧPJJUjʵׯ`ÊKѫfӪ]˶۷pʽ650߿ L8gݛ ]W@ǐ#KLh˘3ksfΞ=ӥy3o$(p:b9{lCk]Fp@8_NW'U"pu @0㟄g^;NBڨ2x魸JTm htxpv^`=*i*zMr zx  Hj:>fF:-uFG"9.:@luJl2` Wl\X%."q ^b񪧷߹8L벬n/o'7G/=^Ow/o~/˟NyW?@wtm @C ~w5ΖVP0Bᕰ|̠Ch.,^ 7Րv7l!C.8 "No4Y {C!6a ъ" 'EuAH2BqXF!{ft'hF1K H\cxB 2D2Q:"!9JҐ+!;{c(3@Ejꑏ0td+x'~)%Xĥ,KGRiD&'h1꒒y$#1Ga|(Jm4&57rnJd D@z(`2Tf3c7Sbs,c ,r󔛜$>}NҜ:;Hu*4>9ғ"5iReU*PQzTh@A:Q}bM!PtM6Q"2dNo˝ԩ*|LSC'P_FovըfHVX.ӡ'TV^G]Tg_-aPUӚ;Nj;, [>3{8GLb(N{0VacL۸wo>'1{DN\`#ÑP2M^ qen5[bxJٮT#!˜1O͑53jB0˹UJ[89~ie 9wnz>[gsms O趲) j>׸#nHTHe=Zӕҕ.#Z?tU-εf_cMlZْͶCO*{н+Z:{W;y,vV9G v#]y v2+azZm2xYi+wc!Mnr tQos :Îgl]rjdMuhj?vnGrX'4q{r1>̘|tf[tzZUwϛ@Ӊ~]֋\JpU;]7+ޘrmлZfkWvym oC/ތoᕫ<,K<1_sқc'WTzS/~wOnO~Ώ/ÞϾs/Oѯ'/ۘXF ؀ ƀXE؁{"XH& *؂Ȃ.2XH6:؃{>ŁBXCFۃJ؄ÄNRXCVZ؅Å^KŃbXGHfKj؆OȆnSrXWHv[z؇_ȇ~cX(>6(X.x&؉(8x(؊8X((XwȨ~ʸ׌(~7Ԩ}x֗(}؍|8WH|蘎؈8:؏99c8 ِ9i7S6ձ I3Q$Y&y(*,ْl;xevil-2.02r2.orig/instructions/UNIXShowControls.gif0100644000175000017500000002466606652512176021735 0ustar aaronlaaronlGIF87a+8@@@@@PPP```` @`D2@$@|'`Lh @@//8 />4>>6@7| `>{6`/q @B @|?`/L7 @ace@@Bj66/q@\B L/ @`? le7@@56lt6j\/LL @@ B/45>@6! @/G 6eq@<7_,@L @=/e8/\<4>,c/| >X8,L @sR )n8 >#|@@`98  >`L`a'ch/,+H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI&ɳϟ@ JѣH*]ʴӧPJJիXjʵS KٳhӪ]˶۷mKݻx˷S>+^̸ǐi@˅D̹ϠCK@;O6zjuhLh?#E޻УKBسc'ZuZ=ؖ XoA2{~ o9(EGv5@܂%x`;6m Pm܆ѷquaOy!&Ӊ"0ƨ7ނAxdSwa{+v!}!6V8\vix蝙di@' v{GWQe~U$#NI) 案&hTbڡ頂Õۛ@aYx=)Z瞄 h.w~'xBGj}\Zh[N'F+]gHcٙ+-w~!챬z%.Rkrf*hرɦ߆S A Tx!n,L.%f (n\b ,2_)L'_jN G n /8Cc< x1/`ÆPoY.t /`}@=tYk H p-7`xZ|߽w|om,7G.Wngw砇.褗n騧ꬷ띻 n/o'7G/Wo?= ?~觯}ğO>c&+? Kػ{# GAN $z#5܍~ SA04 g p~7_mXo/ܠ O(Ds₈"1t"H*ЈRb D1\ gCL# 1C5bh:O9] [8-qdc8H; E@1_#H~81tdCJDvxc$$ S#%'YIIp&_Xa%hC9S`ܤ(8]N)S A92Fhj\.6Ʋ<8YKib&!# 6sdg6N$rS_)/xFxDWN}.t?4g+[yErh2ϒ$J'jȃR4]C;I hJ ,S2fC Lth,IҜVT8KC:Rbџ=ծNP/3(- |[ݪJPAjKT 51R֊`iX)nT_ONQJp &eQ36U(=*Қʫ->֢}lgK[Wͭb ny+M!:Ѝn+ZU.uze.f7򕗟%z^w{9߇ů}wpFp[_;Xf%` /8 [81?O$NU<0e x4αu@1c"76٦{l+?{$D)ж4KF34da:Z:0b m]D7hLت2DUziѤ >Q׫5 \[V͡Idd묇kVG;Nu)gUX=rz۸Jۉ膬}yzrӗ{d盬Xmv6v3]n+³*}ҔOj[_-Y2.PݙrX&l7<%*3qp[lZiӑxΕ}\GϞB(m~s0VO;)[6mЙV \Gzװ?Q.[5w >EەF !l:<#s=x8Us}_e u3zb_'.}^Zy۞c߾n#7 {$'qǎq}{C2σӥu'ҷ{7_ek ؀g&cwXZ耋~uij6Vf }A6Ϸ~ w'8yU#f%HւGf=Xq|zy'wwo,Jxu7_tz*'o'HXSxGBEnFg'UcGsJGihDkS zBtRw{wyNo{1vvut~6r,nVwVtzGuBXf|dž'yꔈx7vmZ&K%spGHwm'Xwu ӶwjvnHNo~ektdvȌWw{9y8jt茣VW8̧sg8y䧍{Lx|zM؎;4Jz+zwq(|zʘnY{ǁ(gvfk_[}}}7Wryi)ju O=gyYD䔢ũ:TzZ ^Zz'SUayJe?Y̪G\ >b٫ډڧT*O' zڙKsʬGoڜmxVQ^XTʯQpKˎR:< 9*jJ>U,OGp˜,:1^ɡhy|Zʲ9-D+&jyT~ .9vH8~UwИOhT;{U ;W}9D{LOz}Y=kOEאR9|i8gk۱j:z#iFZTIɧ/+kAWmnW:EpʭƮ꟱>O+{eYG>{HKf>htJʁL):pIZK5 ^B@ۺ%y2 !滿(%Q[\+S ຤J[ٯVkɐ ކٮڋ芼 /)_kȽ֤e xC"ꩌG{ȫ9zJX+)Uut{\7,6=*M7<(Xe>ܗ)xAS QjH ucQM_0Ní)>y)^Ja.W#G o:.N+ô't[JZߨ.98?y}C_v R_ٟx=]7ŘÚZrnjMbEgܽx婍igTtDҿiBf~^mǫPJE +ڗ[./ک@ݣƧm1K_ՠYVÙl|sgT}LbՇIx:NoW~WNljgor?Wxn3@@ D!*x(0'FPƊ =dX1dH#3&bÎ iңI.męSN:80 U>Lˣ:|ړbS-c Ukˤ\IV(د^fݸuش^ej֬TSµ;6-ۤlqn^H= /N?9ϠC6ba Gݼoܒ;83τYz3֪YE;:n<;*[n*M0C β*>٘"OGlAd,\EV\h0GlDHnCyEkJ"1< K rcLm ) K5gBsM7sKE|#%ڬ:L>qՌ`vZg;D[SOe$6]#2,$v]{÷mTl-S@ksFu8`EspكXa ';V{YxԑI96o7 1_{I͜^ps_ [tU?JyG?~矮}Ɲ)OD @ `%8A 䁘Z`WAjӣN: R*U& n/ \auJ8k].a%-=>ԡd.Ofw|U25wG!2D䕱kd,H;1K*/NNJK$ti7BD|R^JPҕtdd+MX" Hj2|XK/ͬ0ye2u>raDҸU3QL6KIm*]6.'3lo\lw!q-r''Eԍ ':L\̉.Mu.ԂThuD}UEDfzsMH.AîO(W~<37O}m=g~"eРW y͝ a&&n){zt2s M %qgv :g2X0//':*$+%e;:J ߌ}Yg 1c5aM^W׵Z0Lje42,$Bv){>Jڢ}*?\%VgbTv,b|\=Р+4hF7g>?xs?;8}8whKk˚*jOuV'Wh_X]UVsFҬ+B[*N)? ].e[kL6֜2Öj$-xnL[=Vf"%ktVtGa8S0nQ;;a o}hj{qecc6;epԥ_1Y-]q0rpDf3"Plo|7;(6w]xÜ? L%Mktܛ쌫- %.oNOjۑ.<;4Q8F6Y xpԯ%{ `*;ݮTgf)yW}c,Y=Xe>fo~;⩟usoB Z}gjM?>'Ytlkt'཭a7OJv]>q }n{4F)ߌ[s.? #r>  2h>[̹,S@yS9ʹ=A1#9@M:J"`9YGZv(`7ӭ;%?"@A`&7乎"8,k04/!4B (A੷&t(/@9R!5;B"2<3 ';o!|-CCϋC@,>JĨK?LDIMąQP4TTEșI|EۣCN,;.4R!UE[gA-`<]t*P4bE?E?^ p 3ۯ El|9L܋əc.\FDc1s>ĕ 6@*H Lz iB8<Ɲ.1?R62d:$JH\B(b` 4 &Bܡ,+655J=+#;G9_J:+J{D"u1EN"y/A‡\L3$ɔr֔%kO1@<d.6!Ƌ?5 M?< P < QQGCl4MM%ML%J P!M%# D#E%O!e'}L%)Iˤ+Q'-P+/J)1 kbr^:]Ku%ST< "?-=eC\M_EU6-uT1` ]4;X^ҵ;ظS"َIP+c[q[iVCB`֑yLW>֨V |dOm\߭M;Pu'Z|-DmŤ]Z0b +j\+\M-I9*Z8:ێ0m,5KrMY[mO"cTgC=`|9#߃67%A2\b.F=1KFdMR]F*9>L-[9Zl ˠ0JX V[U:;2Ji::up1۟52y%5œWe]4<\04N~5 0ۃ%Xt\u[b+[gK5%]UReJ_Ӏ:#hPfv臆舖艦芶&6FVfh}陦隶&6FVfv꧆ꨖ&j[& FVfv뷆븖빦뺮;xevil-2.02r2.orig/world1.xew0100644000175000017500000001172706666625742015272 0ustar aaronlaaronlXEvil World 1.0 91x48 ; ; A brief description of the syntax for "xew" (XEvil World) files. ; The file must start with "XEvil World 1.0" on the first line ; and the size of the world, in wsquares, on the second line. ; Lines beginning with ; are comments ; For XEvil 2.0, dimensions must be multiples of 13 across and 8 down. ; ; Run "xevil -world ". ; ; The possible wsquares: ; . empty ; # wall ; H ladder ; * up/down block ; | vertical mover ; ^^ initial position of vert mover ; & wall with vert mover ; - horizontal mover ; ~~ initial position of horiz mover ; % wall with horiz mover ; ########################################################################################### #.........#.......H.................................................H.....................# #.........#.......H################################################*H.....................# #....H....#.......H#....................H...........................H.....................# #####H##############...................#H...........................H.....................# #....H.................................#H...........................H.....................# #....H.................................#H............H..............H.....................# #################*^^*################################H###################*||..............# #.................||.................................H....................||..............# #.................||.................................H....................||..............# #.................||.................................H....................||..............# #.................||................................#H#...................||..............# #&&*#############*||................................#H#...................||..............# #||...............||................................#H#...................||..............# #||...............||................................#H#...................^^..............# #||...............||*################################H#########################...........# #&&*#############*||.................................HH...................................# #.................||.................................HHHHHHHHHHHHHH.......................# #.................||.................................HHHHHHHHHHHHHH.......................# #.................||.................................HH..........HH.......................# #.................||.................................HH....##....HH.......................# #.................||---------------~~----------------------%%------------------...........# #.................||.................................HH....##....HH.......................# #.................||.................................HH....##....HH.......................# #.................&&*##########################################################...........# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# ##################||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# #.................||......................................................................# ##################&&####################################################################### xevil-2.02r2.orig/world2.xew0100644000175000017500000000241606666626354015266 0ustar aaronlaaronlXEvil World 1.0 52x24 #################################################### #........HH......#.................................# #........HH......#.................................# #########HH#*||*##.................................# #........HH..||..#.................................# #........HH..||..#.................H...............# #~~------HH..^^..#.................H...............# #........HH..||..#...---------~~*##H###............# #........HH..||..#.................H...............# #........HH..||..#...........H.....H...............# #........HH..||..#...........H.....H...............# #........HH..||..###########*H.....H...............# #........HH..||..............H.....H...............# #--------HH..||..............H.....H...............# #........HH..||....H.........H.....H...............# #........HH..||....H.........H.....H...............# #........HH..||*###H##########*....H...............# #############&&####H...............H...............# ##################.H...............H...............# ###################H###################............# #....------.-------H---------~~--------............# #...--------.......H...............................# #..................H...............................# ###----------####################################### xevil-2.02r2.orig/dist.bat0100644000175000017500000000213506670025472014746 0ustar aaronlaaronlREM Windows batch file to package up all the source code. REM We always delete the old zip. del xevilsrc.zip IF "%1" == "-no_resources" goto noResources IF "%1" == "-cmn_only" goto cmnOnly REM Bitmaps, sounds, tools zip -9 -r xevilsrc.zip win32\res\* zip -9 -r xevilsrc.zip x11\bitmaps\* zip -9 -r xevilsrc.zip x11\gen_xpm\* zip -9 xevilsrc.zip win32\sounds\* REM Everything else :noResources zip -9 xevilsrc.zip * -x *.zip -x *.exe zip -9 -r xevilsrc.zip instructions\* zip -9 -r xevilsrc.zip cmn\bitmaps\* zip -9 xevilsrc.zip win32\*.cpp zip -9 xevilsrc.zip win32\*.h zip -9 xevilsrc.zip win32\*.mak zip -9 xevilsrc.zip win32\*.mdp zip -9 xevilsrc.zip win32\*.dsp zip -9 xevilsrc.zip win32\*.lib zip -9 xevilsrc.zip win32\*.rc zip -9 xevilsrc.zip win32\*.pal zip -9 xevilsrc.zip win32\*.cpp zip -9 xevilsrc.zip win32\*.dsw zip -9 xevilsrc.zip x11\*.cpp zip -9 xevilsrc.zip x11\*.h zip -9 xevilsrc.zip x11\*.c zip -9 xevilsrc.zip x11\makefile zip -9 xevilsrc.zip x11\app-defaults\* REM Only the common files :cmnOnly zip -9 xevilsrc.zip cmn\*.cpp zip -9 xevilsrc.zip cmn\*.h zip -9 xevilsrc.zip cmn\makefile xevil-2.02r2.orig/gpl.txt0100644000175000017500000003542407041373174014643 0ustar aaronlaaronl GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS xevil-2.02r2.orig/compiling.html0100644000175000017500000002166007041424154016157 0ustar aaronlaaronl Compiling XEvil 2.X

Compiling XEvil 2.X

Steve Hardt
last modified 01/17/2000


Windows (NT,95,98)

Requires Microsoft Visual C++ to compile.  If you have version 5.0, you can use the workspace file already in the distribution. I've successfully built XEvil with Visual C++ 4.2.  You'll have to make your own project, though.  Other compilers should work, but I haven't tried them.
  1. Download xevilsrc.zip and unzip it somewhere.
  2. At a command prompt, type:
    1. subst x: <directory where you put the source>
    If the directory name has spaces in it, put quote marks around the directory name, e.g,
      subst x: "e:\my files\xevil2.0b7"
  3. If you have VC++ 5.0,
    1. Run VC++ 5.0
    2. Open the project, "x:\win32\xevil.dsw".
  4. If you have VC++ 4.2, or the .dsw file doesn't work for some reason.
    1. Make a new project called xevil in the directory "x:\win32".
    2. Add all the cpp files in x:\win32 and x:\cmn.  (Don't add the ones in x:\x11, they are for UNIX.)
    3. Add the libraries "x:\win32\ddraw.lib", "x:\win32\dsound.lib"
    4. Go to the "Projects | Settings" dialog.  Switch to the "Link" tab.  Look at the "Object/libraries modules" text field.  Add "winmm.lib ole32.lib" if they aren't already there.
  5. Select the "Tools | Options" menu.
    1. Go to the "Directories" tab and look at directories for "Include Files".  Add "x:\cmn" and "x:\win32" to the list of include directories.
    2. Go to the "Tabs" tab.  Set the toggle to "Insert spaces" and set "Tab size" and "Indent size" to 2.  This is not strictly necessary, but helps make the formatting look right.  This also helps if you want to contribute code back to xevil.com.  We disallow tab characters in your code, use spaces instead.  See the coding standards documentation on www.xevil.com for more details.
  6. Compile and run.


UNIX/X

Requires:
  • C++ compiler.  I've used a variety of compilers, g++, CC, cfront, etc.
    • Must have the C++ iostream libraries, i.e. iostream.h, strstream.h, etc.  These will generally be installed along with your C++ compiler.
  • Xlib libraries and include files.  Does not require Motif or any widget set.
    • Include files are often somewhere like /usr/X11R6/include or /usr/openwin/include.
    • libX11.a or libX11.so are often somewhere like /usr/lib or /usr/X11/lib
  • The X Pixmap libraries (XPM).  You should be able to get these on the net.  You may have to compile XPM source to generate libraries for your machine.
    • xpm.h and libXpm.a (or libXpm.so)
I have built and run XEvil on the following UNIX platforms:
  • Red Hat Linux
  • SGI IRIX
  • Sun, Solaris and SunOS
  • HPUX
  • AIX
  • FreeBSD
  • Open Caldera Linux
  • Alpha OSF
  • Solaris x86
XEvil should build without much trouble on other UNIX system that meet the above requirements.  I only have certain UNIX machines at my disposal.  So, one benefit of distributing XEvil source is that other people can build XEvil on platforms not available to me.

Building XEvil on UNIX

  1. Unzip xevilsrc.zip to some directory
    1. There's a trick here. All the text files are Windows-style, with CRLF for line breaks (as opposed to just LF which is standard UNIX).  In emacs, you'll see a bunch of '^M' in the code.  You can use "unzip -a" to auto-convert text files.  But, this corrupts several of the binary files.  The binary files are just needed for the Windows build, so you might not care about them at all.  You can use the csh script unzipxevil to convert the text files without corrupting the binary files.
  2. Look at the value of your HOSTTYPE environment variable and look for a corresponding entry in config.mk.  Set the HOSTTYPE environment variable if necessary, make a new entry in config.mk if necessary.  As described below, set the symbols in config.mk to correspond to your specific machine.
  3. Type "make".  The new executable will be built in the directory given by OBJ_DIR.

Meanings of symbols in config.mk

CC
C++ compiler to use.  Probably g++ or CC.
LIBS
 Libraries to use.  Usually "-lXpm -lX11 -lm".  For some odd reason  I needed to add "-ldnet_stub" for the Alpha I was using and  "-lsocket -lnsl" for Sun 4 machines on Project Athena.
INCL_DIRS
Where to look for the include files.
LIBS_DIRS
Where to look for libraries.
LINK_FLAGS
Command line options for the link phase of compiling.  I generally try to build XEvil with static linking.
CFLAGS
Command line options for compiling.  You can use any flags your compiler understands as well as the XEvil-specific ones given in the next section.
OBJ_DIR
Output directory for building the executable and object files.  You can build XEvil for several UNIX platforms in the same directory tree by assigning different values to OBJ_DIR for different platforms.
PCKG_NAME
Used to tar up the executable for distribution.  E.g. if PCKG_NAME="irix", then create xevil2.0.irix.tar.Z.

Additional options for CFLAGS

-DUSE_RANDOM
Use the random() function instead of rand() to generate random numbers.  random() is a better pseudo-number generator than rand().  Use this unless random() is not available on your machine.
-DRANDOM_NEEDS_PROTOTYPES
If you are using random() and for some reason the prototypes for random() and srandom() do not appear in <math.h>.
-DUSE_SELECT_H
Use if you need <sys/select.h> for the prototypes for select().
-DSELECT_NEEDS_PROTOTYPES
Use if the prototypes for select() still do not show up after trying -DUSE_SELECT_H.
-DXEVIL_KEYSET=<keyset-name>
Different UNIX/X machines have different keyboard layouts.  Use -DXEVIL_KEYSET to specify at compile-time one of the sets of keyboard controls for XEvil.   This gives the default value that can be overridden with the -keys command line option or with the "Set Controls" button at run-time.  Look in x11/ui.h at the UIkeyset enum for possible values.
-DPROTECTED_IS_PUBLIC
Some compilers have a broken idea of what "protected" means in an inherited class.  Try this flag if you get an error like "method <some method> is protected in this context".  It makes (ick) all protected class members into public members.
-DCLOCKS_PER_SEC=<clocks-per-sec>
In some cases, the symbol CLOCKS_PER_SEC is not defined anywhere and you must manually define it.  This is the conversion from the unit of time given by the clock() function to seconds.  If you don't know what the value is for your system, try -DCLOCKS_PER_SEC=1000000L  This is the most common value.
-DMATH_H_IS_CC
Use this if you get strange errors from the include file math.h.  Usually math.h is written in C, so the XEvil source includes it as a C include file.  Sometimes, however, math.h is in C++, so it should be included as a C++ include file.
-DNO_PRAGMAS
g++ uses "#pragma interface" and "#pragma implementation" compiler directives to do some code optimization.  In theory, other C/C++ compilers should ignore unknown pragmas.  But, some compilers whine about it, so use -DNO_PRAGMAS to avoid these warning messages.
-DUSE_UINT_NET_LENGTH
-DUSE_ULONG_NET_LENGTH
Use "unsigned int" or "unsigned long" for the type of the last argument to accept() and recvfrom().  Default is "int".
-DNO_SETPRECISION
Only for setting the number of significant digits in the statistics printed when XEvil exits.  Would you believe that some HP systems actually crash if you set the number of significant digits in an output stream.
-DIO_COOKIE_HACK
Some really weird linux system needs a type defined for _IO_cookie_io_functions_t.  Don't ask me, I just work here.

Steve Hardt
satan@xevil.com
http://www.xevil.com xevil-2.02r2.orig/xevil-2.0.spec0100644000175000017500000000457507041423640015615 0ustar aaronlaaronlSummary: A fast-action, explicitly violent game for X Name: xevil Version: 2.02 Release: 1 Copyright: GPL Group: X11/Games/Video Source: ftp://ftp.xevil.com/stable/xevilsrc2.0r2.zip Patch: xevil2.0-config.patch Buildroot: /var/tmp/xevilroot Summary(de): Ein schnelles, extrem gewaltttiges Actionspiel fr X Summary(fr): Un jeu d'action rapide et trs violent sous X Summary(tr): Hzl ve iddet ykl bir X oyunu %changelog * Mon Jan 25 1999 Steve Hardt - updated for XEvil 2.0 - more accurate description, need new translations of description * Thu May 07 1998 Prospector System - translations modified for de, fr, tr * Thu Oct 09 1997 Erik Troan - updated to work on non Intel platforms (silly Makefile hack) - uses a buildroot and %attr tags * Fri Aug 22 1997 Erik Troan - built against glibc %description Death, blood, drugs, fire, ninjas, and chainsaws. XEvil is a side-view, fast-action, single or network-multiplayer, anti-social, kill-everything game for UNIX and Windows. You have died and gone to Hell. XEvil is the contest that determines your fate in Hell for all eternity. %prep # Don't use %setup because the source is not a compressed tar file. rm -rf $RPM_BUILD_DIR/xevil-2.0 mkdir $RPM_BUILD_DIR/xevil-2.0 cd $RPM_BUILD_DIR/xevil-2.0 # Text and binary files, auto-convert CRLF /usr/bin/unzip -a $RPM_SOURCE_DIR/xevilsrc2.0r2.zip -x win32/res/\*.bmp -x win32/\*.dsp # Binary files, don't convert CRLF /usr/bin/unzip -b $RPM_SOURCE_DIR/xevilsrc2.0r2.zip win32/res/\*.bmp win32/\*.dsp chown -R root.root . chmod -R a+rX,g-w,o-w . %patch -p1 %build cd $RPM_BUILD_DIR/xevil-2.0 make %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/usr/X11R6/bin mkdir -p $RPM_BUILD_ROOT/etc/X11/wmconfig cd $RPM_BUILD_DIR/xevil-2.0 install -m 755 x11/REDHAT_LINUX/xevil $RPM_BUILD_ROOT/usr/X11R6/bin cat > $RPM_BUILD_ROOT/etc/X11/wmconfig/xevil <