From e2607a94c0b961071692405b292c45ca527485af Mon Sep 17 00:00:00 2001 From: Cesar Gimenes Date: Sat, 18 Sep 2021 14:10:47 -0300 Subject: [PATCH] Initial commit --- assets/awake.png | Bin 0 -> 1945 bytes assets/down1.png | Bin 0 -> 1870 bytes assets/down2.png | Bin 0 -> 1927 bytes assets/downclaw1.png | Bin 0 -> 1910 bytes assets/downclaw2.png | Bin 0 -> 1899 bytes assets/downleft1.png | Bin 0 -> 1944 bytes assets/downleft2.png | Bin 0 -> 1931 bytes assets/downright1.png | Bin 0 -> 1957 bytes assets/downright2.png | Bin 0 -> 1925 bytes assets/fp_down.png | Bin 0 -> 1657 bytes assets/fp_downleft.png | Bin 0 -> 1640 bytes assets/fp_downright.png | Bin 0 -> 1649 bytes assets/fp_left.png | Bin 0 -> 1656 bytes assets/fp_right.png | Bin 0 -> 1667 bytes assets/fp_up.png | Bin 0 -> 1667 bytes assets/fp_upleft.png | Bin 0 -> 1639 bytes assets/fp_upright.png | Bin 0 -> 1637 bytes assets/left1.png | Bin 0 -> 1951 bytes assets/left2.png | Bin 0 -> 1897 bytes assets/leftclaw1.png | Bin 0 -> 1909 bytes assets/leftclaw2.png | Bin 0 -> 1906 bytes assets/right1.png | Bin 0 -> 1930 bytes assets/right2.png | Bin 0 -> 1914 bytes assets/rightclaw1.png | Bin 0 -> 1924 bytes assets/rightclaw2.png | Bin 0 -> 1899 bytes assets/scratch1.png | Bin 0 -> 1927 bytes assets/scratch2.png | Bin 0 -> 1899 bytes assets/sleep1.png | Bin 0 -> 1834 bytes assets/sleep2.png | Bin 0 -> 1837 bytes assets/up1.png | Bin 0 -> 1875 bytes assets/up2.png | Bin 0 -> 1909 bytes assets/upclaw1.png | Bin 0 -> 1948 bytes assets/upclaw2.png | Bin 0 -> 1942 bytes assets/upleft1.png | Bin 0 -> 1905 bytes assets/upleft2.png | Bin 0 -> 1958 bytes assets/upright1.png | Bin 0 -> 1930 bytes assets/upright2.png | Bin 0 -> 1958 bytes assets/wash2.png | Bin 0 -> 1937 bytes assets/yawn2.png | Bin 0 -> 1882 bytes assets/yawn3.png | Bin 0 -> 1923 bytes catsound/Sound.txt | 8 + catsound/awake.wav | Bin 0 -> 17922 bytes catsound/idle1.wav | Bin 0 -> 17178 bytes catsound/idle2.wav | Bin 0 -> 10656 bytes catsound/idle3.wav | Bin 0 -> 28906 bytes catsound/sleep.wav | Bin 0 -> 39448 bytes go.mod | 14 + go.sum | 67 ++ main.go | 139 +++++ nkosrc4/.DS_Store | Bin 0 -> 8196 bytes nkosrc4/Neko98/.DS_Store | Bin 0 -> 10244 bytes nkosrc4/Neko98/AlwaysOnTopPet.cpp | 411 ++++++++++++ nkosrc4/Neko98/AlwaysOnTopPet.h | 63 ++ nkosrc4/Neko98/DesktopHack.cpp | 131 ++++ nkosrc4/Neko98/DesktopHack.h | 31 + nkosrc4/Neko98/DesktopPet.cpp | 75 +++ nkosrc4/Neko98/DesktopPet.h | 29 + nkosrc4/Neko98/Neko.cpp | 651 +++++++++++++++++++ nkosrc4/Neko98/Neko.h | 81 +++ nkosrc4/Neko98/Neko95.rc | 169 +++++ nkosrc4/Neko98/Neko98.cpp | 246 ++++++++ nkosrc4/Neko98/Neko98.dsp | 323 ++++++++++ nkosrc4/Neko98/Neko98.dsw | 41 ++ nkosrc4/Neko98/NekoCFG/NekoCFG.cpp | 657 ++++++++++++++++++++ nkosrc4/Neko98/NekoCFG/NekoCFG.dsp | 175 ++++++ nkosrc4/Neko98/NekoCFG/NekoCFG.h | 69 ++ nkosrc4/Neko98/NekoCFG/NekoCFG.rc | 373 +++++++++++ nkosrc4/Neko98/NekoCFG/NekoCFG_Tabs.cpp | 607 ++++++++++++++++++ nkosrc4/Neko98/NekoCFG/NekoCFG_resource.h | 126 ++++ nkosrc4/Neko98/NekoCFG/NekoCFG_resource.hm | 31 + nkosrc4/Neko98/NekoCFG/Res/AppIcon.ico | Bin 0 -> 1078 bytes nkosrc4/Neko98/NekoCFG/Res/displayi.ico | Bin 0 -> 318 bytes nkosrc4/Neko98/NekoCFG/Res/independence.ico | Bin 0 -> 318 bytes nkosrc4/Neko98/NekoCFG/Res/movement.ico | Bin 0 -> 318 bytes nkosrc4/Neko98/NekoCFG/Res/play.bmp | Bin 0 -> 154 bytes nkosrc4/Neko98/NekoCFG/Res/playing.cur | Bin 0 -> 326 bytes nkosrc4/Neko98/NekoCFG/Res/sounds.ico | Bin 0 -> 318 bytes nkosrc4/Neko98/NekoCFG/Res/tab_effects.ico | Bin 0 -> 318 bytes nkosrc4/Neko98/NekoCommon.h | 56 ++ nkosrc4/Neko98/NekoHelp/Neko98.GID | Bin 0 -> 10829 bytes nkosrc4/Neko98/NekoHelp/Neko98.HPJ | 23 + nkosrc4/Neko98/NekoHelp/Neko98.RTF | 180 ++++++ nkosrc4/Neko98/NekoSettings.cpp | 73 +++ nkosrc4/Neko98/NekoSettings.h | 28 + nkosrc4/Neko98/Pet.cpp | 159 +++++ nkosrc4/Neko98/Pet.h | 63 ++ nkosrc4/Neko98/Res/Awake.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/Down1.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/Downleft2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/Downright1.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/Right1.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/Rightclaw2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/Up1.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/Up2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/Upleft1.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/Upleft2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/Upright1.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/Upright2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/down2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/downclaw1.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/downclaw2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/downleft1.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/downright2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/fp_down.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/fp_downleft.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/fp_downright.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/fp_left.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/fp_right.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/fp_up.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/fp_upleft.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/fp_upright.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/left1.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/left2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/leftclaw1.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/leftclaw2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/right2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/rightclaw1.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/scratch1.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/scratch2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/sleep1.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/sleep2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/upclaw1.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/upclaw2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/wash2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/yawn2.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Res/yawn3.ico | Bin 0 -> 766 bytes nkosrc4/Neko98/Tray.cpp | 76 +++ nkosrc4/Neko98/Tray.h | 35 ++ nkosrc4/Neko98/resource.h | 61 ++ nkosrc4/classes.doc | Bin 0 -> 97280 bytes nkosrc4/license.txt | 41 ++ 131 files changed, 5312 insertions(+) create mode 100644 assets/awake.png create mode 100644 assets/down1.png create mode 100644 assets/down2.png create mode 100644 assets/downclaw1.png create mode 100644 assets/downclaw2.png create mode 100644 assets/downleft1.png create mode 100644 assets/downleft2.png create mode 100644 assets/downright1.png create mode 100644 assets/downright2.png create mode 100644 assets/fp_down.png create mode 100644 assets/fp_downleft.png create mode 100644 assets/fp_downright.png create mode 100644 assets/fp_left.png create mode 100644 assets/fp_right.png create mode 100644 assets/fp_up.png create mode 100644 assets/fp_upleft.png create mode 100644 assets/fp_upright.png create mode 100644 assets/left1.png create mode 100644 assets/left2.png create mode 100644 assets/leftclaw1.png create mode 100644 assets/leftclaw2.png create mode 100644 assets/right1.png create mode 100644 assets/right2.png create mode 100644 assets/rightclaw1.png create mode 100644 assets/rightclaw2.png create mode 100644 assets/scratch1.png create mode 100644 assets/scratch2.png create mode 100644 assets/sleep1.png create mode 100644 assets/sleep2.png create mode 100644 assets/up1.png create mode 100644 assets/up2.png create mode 100644 assets/upclaw1.png create mode 100644 assets/upclaw2.png create mode 100644 assets/upleft1.png create mode 100644 assets/upleft2.png create mode 100644 assets/upright1.png create mode 100644 assets/upright2.png create mode 100644 assets/wash2.png create mode 100644 assets/yawn2.png create mode 100644 assets/yawn3.png create mode 100644 catsound/Sound.txt create mode 100644 catsound/awake.wav create mode 100644 catsound/idle1.wav create mode 100644 catsound/idle2.wav create mode 100644 catsound/idle3.wav create mode 100644 catsound/sleep.wav create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100755 nkosrc4/.DS_Store create mode 100755 nkosrc4/Neko98/.DS_Store create mode 100755 nkosrc4/Neko98/AlwaysOnTopPet.cpp create mode 100755 nkosrc4/Neko98/AlwaysOnTopPet.h create mode 100755 nkosrc4/Neko98/DesktopHack.cpp create mode 100755 nkosrc4/Neko98/DesktopHack.h create mode 100755 nkosrc4/Neko98/DesktopPet.cpp create mode 100755 nkosrc4/Neko98/DesktopPet.h create mode 100755 nkosrc4/Neko98/Neko.cpp create mode 100755 nkosrc4/Neko98/Neko.h create mode 100755 nkosrc4/Neko98/Neko95.rc create mode 100755 nkosrc4/Neko98/Neko98.cpp create mode 100755 nkosrc4/Neko98/Neko98.dsp create mode 100755 nkosrc4/Neko98/Neko98.dsw create mode 100755 nkosrc4/Neko98/NekoCFG/NekoCFG.cpp create mode 100755 nkosrc4/Neko98/NekoCFG/NekoCFG.dsp create mode 100755 nkosrc4/Neko98/NekoCFG/NekoCFG.h create mode 100755 nkosrc4/Neko98/NekoCFG/NekoCFG.rc create mode 100755 nkosrc4/Neko98/NekoCFG/NekoCFG_Tabs.cpp create mode 100755 nkosrc4/Neko98/NekoCFG/NekoCFG_resource.h create mode 100755 nkosrc4/Neko98/NekoCFG/NekoCFG_resource.hm create mode 100755 nkosrc4/Neko98/NekoCFG/Res/AppIcon.ico create mode 100755 nkosrc4/Neko98/NekoCFG/Res/displayi.ico create mode 100755 nkosrc4/Neko98/NekoCFG/Res/independence.ico create mode 100755 nkosrc4/Neko98/NekoCFG/Res/movement.ico create mode 100755 nkosrc4/Neko98/NekoCFG/Res/play.bmp create mode 100755 nkosrc4/Neko98/NekoCFG/Res/playing.cur create mode 100755 nkosrc4/Neko98/NekoCFG/Res/sounds.ico create mode 100755 nkosrc4/Neko98/NekoCFG/Res/tab_effects.ico create mode 100755 nkosrc4/Neko98/NekoCommon.h create mode 100755 nkosrc4/Neko98/NekoHelp/Neko98.GID create mode 100755 nkosrc4/Neko98/NekoHelp/Neko98.HPJ create mode 100755 nkosrc4/Neko98/NekoHelp/Neko98.RTF create mode 100755 nkosrc4/Neko98/NekoSettings.cpp create mode 100755 nkosrc4/Neko98/NekoSettings.h create mode 100755 nkosrc4/Neko98/Pet.cpp create mode 100755 nkosrc4/Neko98/Pet.h create mode 100755 nkosrc4/Neko98/Res/Awake.ico create mode 100755 nkosrc4/Neko98/Res/Down1.ico create mode 100755 nkosrc4/Neko98/Res/Downleft2.ico create mode 100755 nkosrc4/Neko98/Res/Downright1.ico create mode 100755 nkosrc4/Neko98/Res/Right1.ico create mode 100755 nkosrc4/Neko98/Res/Rightclaw2.ico create mode 100755 nkosrc4/Neko98/Res/Up1.ico create mode 100755 nkosrc4/Neko98/Res/Up2.ico create mode 100755 nkosrc4/Neko98/Res/Upleft1.ico create mode 100755 nkosrc4/Neko98/Res/Upleft2.ico create mode 100755 nkosrc4/Neko98/Res/Upright1.ico create mode 100755 nkosrc4/Neko98/Res/Upright2.ico create mode 100755 nkosrc4/Neko98/Res/down2.ico create mode 100755 nkosrc4/Neko98/Res/downclaw1.ico create mode 100755 nkosrc4/Neko98/Res/downclaw2.ico create mode 100755 nkosrc4/Neko98/Res/downleft1.ico create mode 100755 nkosrc4/Neko98/Res/downright2.ico create mode 100755 nkosrc4/Neko98/Res/fp_down.ico create mode 100755 nkosrc4/Neko98/Res/fp_downleft.ico create mode 100755 nkosrc4/Neko98/Res/fp_downright.ico create mode 100755 nkosrc4/Neko98/Res/fp_left.ico create mode 100755 nkosrc4/Neko98/Res/fp_right.ico create mode 100755 nkosrc4/Neko98/Res/fp_up.ico create mode 100755 nkosrc4/Neko98/Res/fp_upleft.ico create mode 100755 nkosrc4/Neko98/Res/fp_upright.ico create mode 100755 nkosrc4/Neko98/Res/left1.ico create mode 100755 nkosrc4/Neko98/Res/left2.ico create mode 100755 nkosrc4/Neko98/Res/leftclaw1.ico create mode 100755 nkosrc4/Neko98/Res/leftclaw2.ico create mode 100755 nkosrc4/Neko98/Res/right2.ico create mode 100755 nkosrc4/Neko98/Res/rightclaw1.ico create mode 100755 nkosrc4/Neko98/Res/scratch1.ico create mode 100755 nkosrc4/Neko98/Res/scratch2.ico create mode 100755 nkosrc4/Neko98/Res/sleep1.ico create mode 100755 nkosrc4/Neko98/Res/sleep2.ico create mode 100755 nkosrc4/Neko98/Res/upclaw1.ico create mode 100755 nkosrc4/Neko98/Res/upclaw2.ico create mode 100755 nkosrc4/Neko98/Res/wash2.ico create mode 100755 nkosrc4/Neko98/Res/yawn2.ico create mode 100755 nkosrc4/Neko98/Res/yawn3.ico create mode 100755 nkosrc4/Neko98/Tray.cpp create mode 100755 nkosrc4/Neko98/Tray.h create mode 100755 nkosrc4/Neko98/resource.h create mode 100755 nkosrc4/classes.doc create mode 100755 nkosrc4/license.txt diff --git a/assets/awake.png b/assets/awake.png new file mode 100644 index 0000000000000000000000000000000000000000..18487c8c31ed5f7d7e09165d2f151cdd1e423b53 GIT binary patch literal 1945 zcmY*Z2{>En8a_fTu}(`3(>v0nN|D4;MIt5CR=a5}QyPX@BjVJ|D4O-p3cf(Z7=`; z%C0UBKH?D~dE{lqZ+cSF2LO;!A=}$~N7*~uQ=_T0ld&OTL}wy}NF#^&INJe$Wp=hN zjR9sAE(p5dWaY++GRu8PR~9~IF)J?R6pA|fwl$cPhNVVl#w@HU@(*lc3^A^8Ya z-BzvX@hE3>C$LHHU}W)P7W{sN_k9_*{$}?_=X<|tD$LiK@%WsYsD{p=Kc@4RQ)Y(g zOT&seHAaCqhIK(k+NJQR*W|oDM1ObFTK3H%EuF z_;;*8<5qV24^8Qb3mV43`y6s0s^sLr;0KSu+Owp4vxTI4n{P%JMw*ZOAp)vTMT*+y zXM2q8igsWt-A|jBNxraprIbWcaa^}Tcq~k4;)-<5Wp5sUawd(n4nBb7>b0LFTp{$J z+*Hh8-hk2x?`wO6iBd2hu0>XT)@*`pt0;nSYqX-P#f@vB*5B3N71eRQj}nApQT(&` zPJUc|FZ~_kP=t0QoY6KQ%%^qjG~;Lb%J4H5XOu*8DblI)gMQWK^GAR21GDO=fdc3E z7*7JW5bhft!h3N4w7K6$kWMGSs%7%!BV+@&CpX${a--Tea&-=;P7F_C$6nF7H164v zv^Lx*f`+Hz&+5>*&XK~z<)cwc&mQ~?o+jTsF~qey(+@}M6EZN(FPaJNUb7k((-lIH zN%0oN`?580eA$;}R6;SUBu(=PeSuQK>m9Q><#a<DWL3}sbw?ORrE=7FtLzG=gL}c>sfD{sj^ZX zEs^ftB6S{1i9+%yl28o*;AtWch~uqRHP&yQ^4del3tm(H#c*lN*9|wmv1X z-b)KdfSQ6G=^b6BVoO+Wr}ziqKn!pV_wWD=#8@5xN$mxs#Yjqg1DD8v%q|9i!{QMD zKn0+$45UE%FD#i1U*Euq3r~|z1uz0Uj-$e;F^CWXHI#^8#>7el0Gf#s!x$nX1j3Ao zrqEGL40Kn45@QLCghF;Dj3^8=z{4A2Po)td#}LK{V<;93fk4nSLO9CD!Rbr6_zMFi zF&MEZBr+i(0g+&apwc3cCRSEfNMlo^sVQ8nfYTExj1VTALWg}e`LB-yksd}P$1=!N z3Pj=?5=xC@V4zS*(AVqpIvM2fzmh2QFKvk%L`r6mCJ1BXS8s7CTEe2dXk?-|S>lg1 zLGLR6kNc8?MoPl}XEC2U-DSnCV!>$S*KNaswSvav#G8E0)xq{ufWo40CrtoRg5`^L zkkoG~(WUqt#=vV@KxU3^NIA!37`EJKcquhwxVHpskoT_qlM?KCK5I-d%#WD|{ZC2@ z&RnO&XgX@#cGTLwQ8&>0f|J#^1=bpS4A_t$nF{n;7;tN)VoXq#8x=v*zS{cXJEb3R zlpL3OGZ*Qtw3G7axswUWb8|Bw!J--mPTlK<89Bf2=d-xlpp1n3vuV_j(%~n0%X^SA zo9^~Ha3-ei!rYSK(4(@hH|`{>x~hcZX2J0urY2Z_I?2^BZ&UceKY*vZ;FsziyWjbs z=dbrz7C>Z$ausYnX)jLrFvu&&PQEbo!WJgpgY9+qs-Beh@e>-k6eg$fHR$waMT*Ti zisP@J47-ADmnndTvYTw$*dfG2Gr6%zaKU6CUyxuEI{aI_RPW`fqvXtvblhy@wGzd$ zU$pS)9ms=;N)Ff+go9?<9aP|nJ)D*!s)dWy5NnU|K0D!K7hkzv*2JN=Wc^oGW@oj> sFi%An&)>SND4WgSc3Ns!>-yU!sKc$U&*Ku$MRLwv9X%aN?Se1-32WI@@Bjb+ literal 0 HcmV?d00001 diff --git a/assets/down1.png b/assets/down1.png new file mode 100644 index 0000000000000000000000000000000000000000..39dbb01389f91dc8aad4e08be38b8289869ad418 GIT binary patch literal 1870 zcmY*Z3p`tAA3hO9LRCAatgAGcYb9~1k~Cs&Rqd#zb!invLgJEW5`?*JSZ!{dtkrfb z%0!EnuMwA`s|bSricQN(iMtj-TbGu`67AQ0-#Nc?-se2;^M9WA|Nh?J`O(AOWhYb@ z3IM=P*JDlu*$9(ADoV09BR>8O04S?jC+SU9gxm zGs2LJs9vr&^}RZxuVAWs7diFUIIm+`D8w>b5_@+h_974FTrs&~0QzD=@W-=-MOgdD zz-ryvR_NSa4;N6z^Yp<=n=be`36N^F-SbOPwBHax27=Zh!Xps{u<<>ue879}Z@ZT6 z^<4kiA|t@r)Tlg5DjdpCo~zaFYFn#zi9!F9DuoHqI90R_`4Z zCLiv2m9btw{dtH&q68UA!4C9dN<)6KHo27DYzYEp2C4&Qtk0=Qm6O29b3baHzw(X?X#-y+8N6cxE(!WH)e$0w``{05Fh^ z0H9E$@QHyHf&azw$&l4GKUv{f${8P~kJ~rcU|J+9kVp$6p;(boashy2VP!Cq#0-S7 zA|t2_EXx+Yt-#8#oJPZ8+Y)BDE!@Y=1LjDhlVFEYW+*c_9twlOaCBk_mf&>sW4Y|h z7EWd|qp)anY-}tl))Gadhoa3f7!2CX0&QV|lqrymI4U!cg`_eNA58x1<3wTv(u@eL0XD;Ui4s28we!Y@oTL4YOlwxZQJRrn_H=Ds# zllJk}{*rVw(dOr`t9B zc^CmOef<3$h-T=9h|N>JP@Aj>Vi@O)`fKBW{`|i!J$|g&3#!HVTmpHdoV`I5d*osi z#X3tPI9;9Ho$fkZ`2HVl@h_YJ literal 0 HcmV?d00001 diff --git a/assets/down2.png b/assets/down2.png new file mode 100644 index 0000000000000000000000000000000000000000..283c8b6eb06fa5d6b301262e8267098706e96523 GIT binary patch literal 1927 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 literal 0 HcmV?d00001 diff --git a/assets/downleft1.png b/assets/downleft1.png new file mode 100644 index 0000000000000000000000000000000000000000..beeb4680d0a9c0ad0e2fd1e4e32272e73f50214e GIT binary patch literal 1944 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 Xk$TtA6=ei|$Py literal 0 HcmV?d00001 diff --git a/assets/fp_down.png b/assets/fp_down.png new file mode 100644 index 0000000000000000000000000000000000000000..4fa350f53eaefb4cd5a51a139ad6ccb3964f25f2 GIT binary patch literal 1657 zcmY*Z3piA17(R@YN!TKhC(}$W$z0sRG&8MRvua6li)CD9%p8{)&5R5gv?v?8m`b%Y zN~ox8L(ynMliTbQHpL<)gw`#!VWXKnqqcU>dCvLY^ZxJmzW?_>|8suw@+7Z;8^Qqq zSmXYkt2Zw=`U?Qmv_KaZuV@#t3oC}j-X9khK_k zV1|*eF6rl5(Y7s5(z{Aa^R(o4XR2bnJ2QI6!j0gO(u{jf*Q;=N0m=yqpwtXT~SLnU+DNizWlqs#zd`+NGzy{ejx4td$eFCWo&>m zJ+S&zjb+fe0TWeA!&~TAPlrU!qY??8+raNw!|y(OnZkFaZa^#Y}td(P^xj?m*oHu2Lq%VE% zNfC~(I|!?p%eP>kdwEPp=sVKS&AN>NMUQn9v|3PO76k;0>oVE!S&}5e_i&xjIQRMu z`_B4pWnCBOI)mxF_y$5-)3obSwH2iR9-rb}pgF3&36Kq0pevK+QJX3~K#MGCu0LaY z^V_V2n$h){nce0$$9)A0cUl~c_fBjOv^G6E$o^F!~@n}eaCbtC_ zzx4jYA^*Y)tA_F%^;a9_m|*>?XPsM8{j1Hc>QL@-Q%?@{w|Mjk+Ej!Og@&)Z1jd4? zA4n3t^SQ0xHe@7D>fu7yxt>C3gULam#bt2AamMBG62|3)XR^t`#;t$LfqOnt@|KD5 zPMmY80`;cjM&k^_7geX3lE^5J@6d>hLv>lXW8L%87mSdC5uCy1Vnm)<>wanuwG+Qv z%dYtxl0$u0+u4<D2SGs`kgbh4wl@U|zA<5<;wuO2{644}O96f@PrQn*9<($v-?}p|x^+I!*fe!`V1)GY2}j5l9vn<- z36^2l6gK6cF-J&_>Pnokjh?<;{0n>(%-`29bPnu66U?cZ#KuRB)IEF0^^Rs}gkh5o z*_W@&)ejb{H&?Q#<@|~?{p*}bW`*ea%bh;E&Z(Ovmk!U^z&x4587TLi2FT1a;henpW{G)zfVhN2SRCic1+c6(_*HK$m z0qa;~NVliahab!U6{J$$oHx%*5(%E`#N`CzE<0O%9I4e2`PALEgJUj$rY1}XbFE)nB z!Sjg7Wd$C>N*aqqEK9i2L}Y-67s7?brXjXta2Ont1VQ+tQ7`_{o)Ok5|k`{FB_ym$x45c6=7NV zKkjo50jmuE&tg7xy39hYlHdgFmu(}#4MJY7gm&_vyQ`B=fX38mCwM(VQ|+cgA#%f2 z!tFM!ID9_DHg7Tm+@1fBE}&3JXY>rCyfXVXNfZAtWfe*{YG>cbd{MDEDa0aR$HRf@ zGBG*jh*O;iR*2CJnF$m|)+VYaYy|58bzGW?W+(vL0KpVcw!(X@_M+K+yz)E%?rxs0 Jx12+N{0Dtk#r^;Q literal 0 HcmV?d00001 diff --git a/assets/fp_downleft.png b/assets/fp_downleft.png new file mode 100644 index 0000000000000000000000000000000000000000..00bd0bf3abef0345237727daee3fc1f8bb5f4b28 GIT binary patch literal 1640 zcmY*Z3piA17(R?0%_M9oB~PZAT*6!^G1HjVt=Xw{$-S(`WrjInMl(l-HP}VjqzhZB zRa1#Bqp}S}v@wRrK4DWl5i&wMuGvsDvuD)S?m5pn|9js5{oeQg{{MN-&puxCWoQ#L z007Gv-@5z4BS!NqLBelAa`N8*pra4Ex%tGn(cO5lJicFicqE(7=Cb)#p|a_p3wdEZ6UojOE}jmHS-M$*`Jhdr!akr!h)dwMkl?Um0`1rRUvH;Y8|i zuVB1)>G4Y2kW;?(^!Sk^ROk;27 z%-vaawDP78T`T)VR#&OhBkTYhP_1mZ9h$D=GT(&ijF>~ox5gG?2A0=X070wI8%*AA zJ#)f7o9SU|b^VA+-kq&GjGNh`qbr!~K1y}CdSfHD#iMzPq7C~pgb8)jM~&m|3l(%ULc zq#S7{xt6GLlWo^!6Py5Cjb3UJN0QKnii*c|*fEHVyo@jd+*!sPcHE<<(oIFADZ2yjIw&{)5r`JuK1uB;zquAB?+`irE4&(rLkR>+GI8 zWP|=vMB6;4WlMUr;{F6sN-Gi0_zErM5q;WDPc!Q4g1k*yC1%REAwsTsFVK~8f3JG} zL$YWZ(a{G~UQi>{=E9{7kT{a zE|x2x2%WKu3JQ!hG!ctglt3}g*kDf|j2n;7#%v*w2qY{Gjlp23d{z|2*M0k^a`?*` z%YmSH3XzzYm`F(6MBwqGiFRZ%nMkrH+S}t{1zwQEg~Ek+t^oJZF zi_!RoNAMCLXDn6|^!fU@P6&+plEf8!Y71_VsF@+!5lF<(-f$^Z!&1EYARA8B_|xpD zi^~6TpK_=~P56Hn^Rd%K7H*Y>rV>AI8x6f??@L{HC&L)-F8;x&u@iP^0HcSH%&Cbs zXxFTJ;Jw0}yt<{v(m_A@!niOeG;~r)zPPT2Y~yFtRXZ8zP1-43Yp;q!ww&&_dLj$& uJ!JoMLNbj*lG3&G!T`kTS^!C!?5+hC4x@CPoNfp;$HwsRa=+;s_R~M>B*P2< literal 0 HcmV?d00001 diff --git a/assets/fp_downright.png b/assets/fp_downright.png new file mode 100644 index 0000000000000000000000000000000000000000..d226763e98278647f8ffe84e4bd266f71a0d58b2 GIT binary patch literal 1649 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 It_Obp2g(u3n*aa+ literal 0 HcmV?d00001 diff --git a/assets/fp_right.png b/assets/fp_right.png new file mode 100644 index 0000000000000000000000000000000000000000..963e5caa4912bf02d9253556ec3a35dc440620df GIT binary patch literal 1667 zcmY*Z3piA17(QksCdn3AwkOj}h|I+;Of%DBWNBTJTdXF`Fvn#^Gb2OBWl=V%mXM+m zkz!**XtITI-zU@*PlOQ4Eo(#3%$`xJ-E*FE{`b89`@Qe~{r~fvUtFB*HY2nU003;Z z|AFEPjY!#}r~th=(b0bcfV>K5W8)HHV`sw(WwDQh`vuVL=uA2r3~;rx1^|n+GP#wy8MPtxodX}nbLV0w2062X zn=aNG`eY62zzntSU|v5Rscan=i3r>Ve)nd6H)ikoOoL2ax$j0BAHJBGL$(a|F4inb zgQo7d*vX~5OztbQ=s=Co0f~C^UEg?ltCcpTUjJn!(f-g};8X z=h5Dq;+!DWp+sIp1F@rJmaS*>?Nm3ogGcVT3p&9OhDLr(Bep!M1%Lpx*U zC$dQWa$5WM4M|bc>iFZ^C>N1iz!;z7g*OpelZ@+=MU3mq&xWUm8udR&fEu@8N!!$9 z58k?1ihkF9yK#=;j((sV8^tJ%=vE30M~jW@arWtn%R5jRV|dM7g~)Wh_9L`&v>t+k zidkzGibGqd>k&uEpoBduB_LA1-mRb9;v0&~^AuD-62j?7->F#@0InJPT! zArL<2yy5N+(hA0K+g^zC*j>^_>O^k^b;8_RS+X$}9yitRQDZh``lknif1l+evRfcI z(a1#@_fWse!h)k_9v@-aodCa%CsYhl@L3&OYCn)3(!P|gts6HwI7WW;m?K~dP7KAj z`3_^*R5ta5Hb-C=ERLEp4Vf)3{2eh4W*;69SbO(jh-3^m4-tahL=JW+Ef^^e2T^J4a!yPYZ{=fJ$G>ML*0Hnoq9 z`XkDX4Yn)4ew4pw>i(o~M^CXzbvENQP;tuGqLF1U`J~YwRYd0q6f9Qt_Ahzgv)nRV z2Jc>Bbnc4}8m*rL%E-mMMOU7l$bSfC@hq{a!P8l*t5kdHy$_G6GYIs>)E|?se2V5T zz{NvAZN3yP)!}Vw4tU-P{U9iGFZ)18N5BBWiU3S*D*%U(9CQO`KtO&C1As0x0st%@ zw$32);a{>FG0KqUi*AK}H3uST$ zJQ8Y6L4dG~#-WgF5^e|y<>lytv|+L7$bDEm7LOt$kVqtvO$#KrQVxD8hrUQC2A3O7 zz~LezBe9VtSQa}7XJlzg=7a{YK1CI|i5W?gV+qb|kPaow{K-bdHRb=f zFF8bpBtnTtj$kC4i6P%549P|hlI zP}&WD8*WHZZJkeRNC4!KK!Wx*p40Tn4Z6&o@8zFJ7EB`o%2$qPI25g1`5=7TTr#+n z*H(3D_C~cd6O%u7e+7HBBS-u+y56#2aC;GFq2%VQhuiX2Tm2c;_%%B|3|F6^0yHHg R!(=CFZ|g+4V}1PRe*lv=)QbQB literal 0 HcmV?d00001 diff --git a/assets/fp_up.png b/assets/fp_up.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc2211708ad5c1900b84b21bc94f9934136cd95 GIT binary patch literal 1667 zcmY*Z3piA17(Rw|8NwFXY)__{T+COdN?INW_v!J!N?gU#TApl?Zv&0VI-AP++}iNll7aW*d9z8+2YEAt znkQ;415OPZ!z>N2qn|w-sk}cf7UTJi!p>E~PPE0bljbKkD}6uObf<567SS@;GheeH zXHH)CBr9b+N$)MQZ%2+W0Ga;18-Xb*jvre!dO{X8#M>hB5F@Lbs{!hF7j$0T=s5eU zbq3AV(zGN?ChpHrdybm-S5f1=>OV%Xz52TuQsUaSwe*}j>f!CwkI6S(pM;D1Q$3DX z;)Hrb%C+;S&AF$Z9?=!~j1BNJ$}wQ&JzY7Y4%C=K0fF@m>0J06NgV2v(6D}jf33u> z>#oHW=~<@kP^uuhk(6ah65SCQKJ&~q%ANj^ zB-THZ-L|7KEpAF5cVLan34{)q7;xay6}aI9t8k)-Rk-+QcxtH0?7a-A@jfVPot)^x zITg!MuR2SbW?4R{2CbwxR%vvnMpzU|YDK|Pa#9!9BXh@a>o#6Ov#H! z>brR__?wu92hsf2K50I;L*7Jt-cvz)Zs)HhQ%h1#p6vInv7OxVmoHp+ixVIwzahHQ zNkwR%h~Uag7x&xxet;QC0AZb=UY)5Lur#*Nwmm1jZ6U{KbMolm80qN)o`@?tG?daB zIE>-axU@q?JQ4YzG;VfF_)PhwKj7ow>AeFYC;whF!IYj(Y-(cy!iA*_}O_hN5g=hfI&Gk58L^ zR~(bHo7h+WQwwh{g78g9A}w(XNpE{oRO-5+%s=-|%}Kd0Zb-C8vcUYR>T@rTHn)w9 zhQQ0M&DUx@yIWv7d26D6eOIw|^=Z~Kpd!KAzKKJTeKP2eD`N0Os`g7J+ZOz9I_M0S zDR+KkNw%giM{mypWu#)kyqCa495Mv6f0WwXNcAx6C^edV7a(984+6c3w}a##KgA2* zC`*Tc+5)+<+*qJ_FSJ_%{UBTzev~jbH^3ai>Hth>HJ}V3CFll@fPl&}27t}b2mr7G z*b0LvQ2vS)lVS4Wmwj36>fApi&hJOm>d{9uG2GJ?&+ z3y8>N1s=i*8jD0MOZeeLq@SB7!kNQmAhu#~7#xxWM<5UcE3N$Z{%?}o!**w%|lYf0&7`#v}7{v!UY=pu$ zID`|;CnAxGpq1Y!66r8#%RW9$)G2+v}zPDhNPHeFp&3O}VS1{Dg)ygs<&4OHb-oNF;^mG?D z#`;z)^Hr%cOJZJbTb>Z@WxEF~I(I=|I#AQsEs>?M{f_mo@i?}tu*8;<{I&r&9JLB2 TjoIj-I8lnLyUTT_13&)*UOLel literal 0 HcmV?d00001 diff --git a/assets/fp_upleft.png b/assets/fp_upleft.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff58f988c6146ecc565636bc04f2f89ad680ccd GIT binary patch literal 1639 zcmY*Z3piA17(On!3^5g1wr5QJhXHJ+(A~e zM%Lc$&*)$At<~KcS}>V{y;kaaO_ry(*!IEU>Yo~lPQ=C-NBB$7%X`@Di9E%T5j8VZX0&zne+PRw@ZCHRQITBavIgp+c96h zuo5zU$JIe9`E^ofp?NcUkOqj=pWO31A#44yQL!U%QBhzSo`o9RSYHNseRD;1=3eWi zUyPC|_6B1P^*}~m&Y@JnINu}JZy~fq^sAzq^s9?6`zQM9cDxq@)kf3p!(%ptc#%j)+hV;X2{Og&epKz^BoL-BA4NnQnlBU zU-gRp2HF;)6^ex#yM)=S)|EQSSVu8s%*;nwEFUkEFy8H1ZZf{>4^IU50n=CD@XpGa zO1_Ep2oET^e(kV{=Lc!+7JysHsZt1$^IaNVXxg0~*0hkWy***5cbGizoXuzPkM^Bt z^y|m5C@jiRZ8qN_R2Vb8D{QLh`d!2*n0c^=Z{yR6CFxOL(Kw1MsoO z%nCN8Y4}yiJuPNZ3%G?RH1gOJjKY#v1H0Y#UXas`%N?3FmT_hbC1Mt5@3-nI`mupM8%|mm7)OcQMONEg7s=D?OL=&3Vphm{bFW2ZFcr)$ExY{p>H4PO zp+H2Dk^W}ok;gfD;}1ktTiSC~$};IAK=E-S^E#%Zcv+)6<|d8Jmos0|wOsJIZ=u>> zDAV?l-eP(pWT<8uC?w}{=G{2Dg1|m$^OwB(S}zx^)&lMEIbRM#rx)mqtMOm?xE#xU zCnM|wDson2R&+Q@Pl8^xz&{8(nzv)HlM|p1V+BB3Y9k;6BPsX>PJw{zDh7b<@C*Rb zInrwkDo5rkmMjL(FZjWQhe3C5$lK`vF^Cy~3!pLsX*f z1_UyrAS*Ol60~-G+9w1Ce@$YrKeq)ph?lJ34RHkgnm1fZlCVS<7D$7WCH`bX(yH=* z+~*t;UK0MF&3x)~m4#a+BS`qQVS-X2HPPRWo07zug!Qo}fU#)6> zI+oFMPE7|kXJT{^QnJWBz?Wf0sdR&dm;2#oW6KIJ3-ft-t(V!#u`_r3mM|F0hkM?e nka|TGk2k$oUZ>yx{Gly0b4XEMcyiyk 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 literal 0 HcmV?d00001 diff --git a/assets/left2.png b/assets/left2.png new file mode 100644 index 0000000000000000000000000000000000000000..992c8547f03c075055577d02ec629cbf88cc6abd GIT binary patch literal 1897 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 G;(q`VqB{rx literal 0 HcmV?d00001 diff --git a/assets/right1.png b/assets/right1.png new file mode 100644 index 0000000000000000000000000000000000000000..5befb8d8a02fce359e226af532cc66757d7741fa GIT binary patch literal 1930 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 PJ;)wzUat3?&z%1c8W~29 literal 0 HcmV?d00001 diff --git a/assets/rightclaw1.png b/assets/rightclaw1.png new file mode 100644 index 0000000000000000000000000000000000000000..3b918da8205cd3cf76bb73579a44e0b9735129a2 GIT binary patch literal 1924 zcmY*Z3p|s1AAgMFGD0pnmQU7}NM@siH7iWB$|d*mGM9}lY}$sAA>(jDIh?3o&J^i{ zP;(8(ZEiUyoD}7LNjmPQLZ$89)Z2OA=lML(|NDIZ-{1H9|NTGz&-0_RBYp=M0tNtJ z2f-faA|9cVM_yL^X2!(40{|Iis;#Yah%Mfh9!h7phWiJS@njmAK@D`l+W>$?Muxi& zMaNwO`|o=G!F^A-gT=*J%0jcBt3q7{l3vaW$^5WUqwLTs>&%|Tv3%WOimjjDq}X_dnz5MhN-<7o|Ge9 zf2VHN&Fu;Tah4ImRP<24<(;6*)<(-|Gk@>&xQi8d-uorj<}(pdtI?@v^@DGo5~~{( zvGx9Aq-XvO`ROc6Ek#JW9@3+F&89ovvs%AMl~}`yzdAkI?J$!4Sc=!ogS>Li*3Dk} z7gnHoJ)`G%Yf|*0CdyA8mkCv&#(Mh|-UUPEDYxeDP;PBLn_Qe|JMcjW)ViG)b}!5i zplpgo@YVj3wiSvyyiqAGno=6kuMiXtA2cB#30d4t9a#1(N_%f1G)uq7m6T2zK%Z1L z>&k&KNpI^12BW3mErP=X>H1_7Jy)^Ngu z*YKSAhP5vkavs6zemR)W=o7UOUk_ChUz?v(63WF%$1jX{)S4|E{@nx2c|`XX;NMy~ zlCXCW?xFtt!rN!fJU)VSdjU>8yFor!)_ZGqqvu#wNY6%=?*90h@mcKD6DE(ryD*W^ z?K5f2ATo#-beTN-`N8Ow!y(HRg%7}U)Z8 zy)TZ8J7x8<;!-DbEfn)zKrAu#FjnJOTR2yHBJH;`i)(|7HxGN2r_-tVRn<5Dy4>C~ zI}-q|Fg4tz^s1%6VByhxgU&#)a&<1{6;OH6)S`_}5PsGgiM~T-@? zER*j4MCm<}5Iobg0+eBk+3PNBeL=tk$l@8dz17nR(pRdx@ZOtE(;EkdW1D(MKntY*!IH_K^$j0!;aRGi7t71xG&+zTX6#R*2at`~Vc`-1fMKJ>FpSLdhqA*$ zX-qWR3bw64i?M`8!l2s{R)`hM%fT6HOJ|UwM~qR%C>RzDg+eh5QV`k&cj9Zg_{$1L zVX?x|NMux0lyTG{V>%-kX<}(%%yZ%FS$N2>Z_U5bKd1o`5ly9A@7xA=l-Io z!}9Fv_dMJqdv#D5=cf-^&x>jaWr^HGwFD8&wiw)c-L~0PJpzf}r>gGiE_1lN@L0)& zK}+(-2>0Rpj)_T~Zxri)P9oYOAfXzS_{%Yu6EB9h+P{eSs}7Q1?@OtUtLQXeclWCR ZIn|%e-GR}&Ek5i3K(KSfmD~6w{s%OmMjikF literal 0 HcmV?d00001 diff --git a/assets/rightclaw2.png b/assets/rightclaw2.png new file mode 100644 index 0000000000000000000000000000000000000000..1ab5b4796f5b19bd44dab129c2bb347f91883085 GIT binary patch literal 1899 zcmY*Z2~<mn7afj3S|s~7-a}Z87fMCg4X{3-g@uux9>iC-*eYp?~=Etn+Dhb z3;=+J`@iu%vJoPGRF!3KW>V6h0HCBvadq{ky1Kd2qv?#3v0)KJHzJM5phWn%xd4D; zPL6Ldd7rNi?mrCzivv&72l@P5&277%YNCAxxFh0iq9A6>GB3Ku`AYY~crnG;X6F4Z ziWyGFS*zuaC{H8}YBAX#Rk4@_FRk$|RZ2JA?0@HW^LIV9`34(7Q(ir_xp(ZZxgtr* zs|n`P#I7s#mO=RwMv9gORq&V3rUjjILLr*f!s*xG^usMKUp2pKtgv^c_1BR_38Z6U zXuWPjN}8|oc2me4zc^g!*aMv=0^7Rn4};T`oVU8vhQc@1ga@OGAk%x=Y61VRZtPxu z*mwO$>&(z2mZtZzw}qpbDz9Mcfl4aO<2suGENna zrhEM$Kyh>?LG|ke=8XKQ@3eTnvtz8x`v{7lT}w)Aps20DfZ(Rb7a8CcoG`-o+~a*> z*4=v!15Yf<2d|T~CezvREtsB;CH(tZtI#5Fe2Pzz`rPiX0nxNMygF$E_I0%f#XPe& z$DeH9`8IR2e(uXiMa~kOL_rVrJKc`_-q~^~Yv%12e&sl!|J@q}E+0bSbvhkJ*o=@O zbygQD{{7m!v;M``Ri|^E^mZ9!8zKE_S6sSM{cBBbX@x#wrT#EI*5xsp*Q3Dum1pqM zJI^q0@ib1Tdo8E?a0@qaK^JvK8-E3|o01%KrmP%nAST}w-zMMOd@fp;Y&H998>l-K zwcRx@9zeP9rLg7xd#w_(FYK{;N+P);zF#de7B*<*j&#pW-`oeyn?>pGFN5Tobe|+- z69&-7H0?U`p-jSR!@yvo0?dc!ko7oAoZ#HCO(I+q)%3L=<2h&z_YL<^d#(=ALeLzV ze^%2`KVH)d=4;jgl0g)l)ip9$%;=N0hQ1oA4t?bisJ^X|0!p19^{ca+xBblz%xRz(jF+^4v zgdG!2W1`tu=#By{!*Uu4h3rUJR4g>W!yDpCXAmLw2owSZ#epFZ2!=t3MEl^6ekzxJ zVWDIeD;AAJCL|;v5^NB31_^295*T;3TD3Sjp(U_mwk~N5w&mgT3DCB2vSt&-&qP-XtqAXeN zkF&z;DF2W9l!HOa!~bV7A3NP)Wv$}C806<|!-4ffrc`8`9N~_4J{6$0_|w3{bci~B z%~L8Zh{m37 z1UE=5i!8Eac*ys}HL;|0pla+i>e*U&w$56G`Yq8yXJP#+?11FiYpIuayP=Ku31W+6 zHV(AD8TO`%D&C8rKKa8*`{`Hx7WgkR*M$%IE@Q9N+SHw4cbeI+@*h+xP)aDt8RZR1 z$AJZS1cZBXxeKy-)}-h8rNBy){bPJZl(p4`GF)Q@#gPjnK)8#C1s-ibDg+f3ntWr6 zE~7d==ae<7{C3Hl)%fo_q@o?8QR zi_H3bp>2_J<8ttwkyV8HAU%#l&QN>g+hJOIu37uM+TLv|!r=+dd y?AP1M35y&z@9<4Bh$~!r`i441e|zwJr>97RDmr&Sr|iwn(RDxKiLY`wbK$=LdQ3$C literal 0 HcmV?d00001 diff --git a/assets/scratch1.png b/assets/scratch1.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6a81f2a853f52da8e8aa49a97797a189dc2dc8 GIT binary patch literal 1927 zcmY*Z30PBC8huHSC9K6D1H(v63Mh~TkS&HV?4>PBkxeLjLK2n)lOSOe6r?Di0u>7d z!&0y;MQT8y!OFf)1u6;xvIPNU6O~1lqzO89=DqK|d)~R{Kj;4UyWhL)>g*s7Rfhrq zAn*8vt($0siyvu8(VH0;_YMFg6sR^fuHiNgHuMNO<8)L|2+4s&BQdBUZVuJ}V3w8T z;YZQ%fDwLd;_7|=C}p^!B1b`B{C$0d+feG*qJYGWoY2pWsJFV_yZpR}s%^yI`-ysj z0JBnR{dqcfTIk!Vb1bZSB?DDj?^-I6a(sJm$D!m;RhgwGBQ7tuG5kUQ#QXWewet&; z%+*QR>y7%pd6QaTef3(@i^sFv?)i=m9IG{PP(E=GrFZp)?hS3wKlyDB$5z(hU6Ui5 z_qT-PrCL`9Q2O&rqcvuIh*=UKQ0ctumn>nm+aog)ye-plDxwfRtK8lIc>Uv+;_JHu z`Pqi)0e1Swt1<;0s8Zx9c^jE^tOZevq=8bkFX2c*l5( z%QY@G5jF*B+`OsF$ea02iQ_Rh!Aie_rgA%#grp{_%sLYA<27GmK-UQ!As+F~8jGyT zD$}7Bz1ze2WTmMTc62MguWQwIufZUo5E^~ntx#@W@hC7otBb0O+d>|#bE4{|_h)%g zOuFBsZ#T{#2?ZyvqR3R-$e?+7=oKsd)eQcd&pdAvI=m`x-L&2hK;4IRX<4NC7s|1E zu+e)PJLkNL@}*~U%vEL8Gqo_D4eQoDNnQ;)KPd&=VJW2_X6O)dzheS zX>kZ^T_Hri9;|9xqj(^j<<7@as-p*GLZgtw296lVoRn=1MD83`?N}K+N2m8RF_Soi z`%=NUI}gDmzHJ&Bjs+pzIHnoR8H+JiT>>)khw1u(&M!HpN}~g#1L1u)Mri)HM4DFy z&)$>6d&+#t`kbsDhGO-M4Hq#6glz!}BXt1_rap24sq>JerE$;u#!Dyv;|Wdtjqcmw z@YceaNGL~nLfy5>@Pns<0yEnJhYncOTdW9e?6C#jQA!Cy0iIMev4NJmRG#HC1H zTNxyFY(ri!X)RxaZ zbH(Wz$lxxe-z1sLf3ODB5GvT4Zfu>7;3=@#la%&WFBkQJYR#n$Up7r^5*ST*;4j?W zk4tWa#FWpQ!K*)!m!r?esM+gdT|wBGQ9NXm(_jSODPJI1!8_v4Y_2 z$Osw}$F@KmC~zVyrZEWkfrJ%qf$(;6h1<{>B)AD0i^d`dP&gcpXAnbiZnpLx%SB%n z2nvf8g~MQCVq(xSMrb;Nj4?1bH^*QNF@}aHkpjhxrLlt8C>j&_!Q{U_wj^c|AJ)mDhW?#IV}5K))F4JYgE2s3F`v9erFb!mb74?PqGYi@ z!2o}t{6Fqv4jv;8|DVNt==6XUwMu~EF`u@L09Es!krHiklB2DaySL1W$C=u8xRUG> zp76%$%&6caT-(H?%P=c)#5Dttc#XBU+I4v?YC-HIL4v2sfYBeqrtCTj{Lw>*^h~MW zk9I|p_X?8@gY1=uo^A@VLC&8Yj=@KuYt@5LZtvbfnoX>gFw1j!C&}SiZD(Zv47N4z|i)DO&?vcGy));gBz^##WB(XR%gKMV7mjnH&~KNUd}d@c1A~r4&!J`1tJbmk@qaW|Tz7#PLlwCx6`<+mf;unY z*zb&smD!PeNGHt7Ww0nGnxeqAd(|lwQqh!g%d81Iv-2#_;ITjG5FZK-&~wJ8g)7(a zqB{X)id)o0-bVffcJaDm-z)0BXhgXD!sS4TYljiEKQXJCh1sAme?6yf4{OckH_f5}tj~*h!FOXBrf$HEh-GRT15Rj|OU0{FtqX}tU3jXC237yTm bLZ@k2iI;g=-d^xD@u_ySbGEIu4!rmm=srwI literal 0 HcmV?d00001 diff --git a/assets/scratch2.png b/assets/scratch2.png new file mode 100644 index 0000000000000000000000000000000000000000..3075f39c302d4fbb26b9db4f19c298933d4888a5 GIT binary patch literal 1899 zcmY*Z2{>En8a_!>NfpyFD&vkcDOzMfZ9xpux|v!siYS*9NhFqpBr4Q4r8B1JbePt( zrJ)N|rZu&ch8ZHZW}aeXF!rKoZB^IO(&Q%E+qw6g=bZmN@Be=9`+xuQKj%A=m-}8Q z3R=C-pmv( zr_PRXm&W#7sy7e1GG+uehuud#@0+adm=TL{yq1)ny(v8?vx}EaFB^kCn-cvtw73j! z9~)SIv>}g}zfW=pWsRO6th9TAn4|$R-L{9p=_)Q;o$3Q&o9beR=tB79zSdfReBg%G ztB2iJf3VD=95X+BFGnUG&e}bTTn|*)&3!d|(b4+u&qolFV_h~C*SwH@O&MEhb;m}d z#KRfh-&bQ(bjBg|>jkEqE6={w7Whq%@UkADnbmFDa#{mZeFX^w3meaKpeuNBxZl}E zgE?OLJ=@-9voh(`2<`CZbc^*JyxX^N^!+CY9@<;gV7 zlH`&ZHXX0CHtT0TrGrzJP!UYrK#%<$`UMyBrR=HKpZJ&I#pLoE1+MQXs7E^OMo!;^ z6l(A~vGLn$Z_kj6uBuJu+3W3r;)+^PhkOzX@Q^ zN%@BPi~qulb$`n3`l2N>aX}Y*dOzV3T#K0;boy2q6gI~wnY+U%+5B^2VO(_NjSP6? z8!79YpXLO^r?CpFQOY zID)wG^v>W3G>5{W#2Io0?vc{O<)cwc4{rSeonaPyH6m~g97H)Drk-~awTh@GyytYk z$y5);B%QIX*q^HxEL82NVpA(pD%17KxeKhy>i%cWzQ?bqnk1J_En7jnSW}ruqO(5Y ze2g$Db8)ToOzH`zp$A{Lb627rcZDTWl8@qboJFx2`s3NZezmY7<-B+((VWa-7S+^V zdwHR?YkDdS`oPlkQ;p}%#fRq~&j}5BOEqf?7|(&KvzB%uHc|FYZ#eM|jVn;K+ct67 z2&}W$ny7^IY%wG@=@C;+%RnW*l)vu7HxY-8gYEvzXl)^T!@4UB=huSxETb`CFu5s2 zzV$9CWfdYF2kMLE5V;Y5Pg{7uMDc?l&;p2bPfx&9fz<#oXdeJkAdun)zGVU`I~V|r z6(azEi@_fmcroN}tem8;Zv-m}PceN1cmbXsxNvq1I+V%|qoMgRu}T5p$j2#Q42>5G z=f^~|xH!HOVn=~fU?q(~z;`6PC?`aKCkgJx=Fs3aXe=6wz(e71xFd&3$N3PBe<)Xc zIUyK4UMvoSNk~XQCs?7`oCu7Cy}dmKYl*S6L@5*~ZX$~p%15!d$oD4y^&!x>;T&cx zkI81imA;{2?0B9N0-+50c)edIk4gVKiN*cUmZCw7at338#$rBtD@q-eEY6$5q$!e> z{&)+=9p(RVA95Tq%JBbL%==DvSVgONs3Yd%w&9`rAJZVv;=fkBSBiWSghtk| zv4qRi$0a=et`d>Tg{$9HV#@9}OGKL&D^96ubLow^RA$bo->Qkh0e`qhyLaWnNem7| zzb75n`Wbe%wQ@Z(zZ6VR)AGvoyD2W;Vy>E`s++l^a$i?8dtNHUZ5uMX5(0iFi>tzV4U=*3yo y#X)XLtd>tx>P*&Z&tPC?Z+`7x60FHhUV+M6ie-Pzot;&lT;ee=!hP4%=l%mAeLw90 literal 0 HcmV?d00001 diff --git a/assets/sleep1.png b/assets/sleep1.png new file mode 100644 index 0000000000000000000000000000000000000000..6fe6212dba93a29fe12b967752854abef98cf910 GIT binary patch literal 1834 zcmY*Z2{>En8a@)Wq^jD{Dx)KkQ5v#XVo4+RnoP$srok|pA|XK%lSG9IdZXozY7H&Z z4vn^|3xnHG)Y2lfQ(caFz=RD{9?|J|Cd*A>2pZ__3_xJVQ z1u=pE0I-Yrm1lr*gsL7b4dt7YocwP9P}ik8j|}j3 z2LQ*M98ws~n50kmwLxV0`;Yc4@^b{(y;ve$^NLv{|r`_Q2~! ztXL}WyC}l&^~b>VtAz-5!9=E>kTf;I&8kAtMICwyY6D$+1rCHYHl1ZdRtVxq(&;AS zS?=9?4g-%ZZ%eL3>x~I`39a~^&PC77T5EC!Fvqv^Q8ey3YeKe<^gW>3D^6L^~-4!V1-(0z-Htkdr_b3S*X zNQc{nN!Wb%{!~!$6)jnwlfh1-^JeJ4+7VpmFSh6MAoB!{ z&kV|LJQ^r$e9n2r{W97p2FdLjmK3x56m8^}gVp4h4k0>n%~WvOoHVcwJ7@RLKnVXK zD^%?L*4dXrxP>Ieg^O<9_#PYh9%RxB@EdrITG1Mzn^SAuE_t!tYk4Mz(k4fz2ot|^ zglyrDW9eOC<0v+nP5#k@BlM1uBrVy+E>_+A2V{m``0a?$J!A-px1gMLZfkF&9P^vq zcP>La9G!g1q5QKPgRn-8C)F%UIlm&^;4WvLSs{8p;d1l#oH? zhC_LbI3@?jbB1jza7wJA(J<(?gd6J&3-e+SugJ{(Z+8TvHfAUtA;#Dlpk4>j4 zlU4o%Yy7tI|G1Aic(f|~e-`th(`{DSDglB=f7&(z#PGy~rgD>EL{GQl!P*O#CUgZ* zos5J(HXhxdE?nrir)*0Iv29Mi4JhvzyIMWz9)7Q|p>~e5(UcR1{?kE5DADFQsp8x;= literal 0 HcmV?d00001 diff --git a/assets/sleep2.png b/assets/sleep2.png new file mode 100644 index 0000000000000000000000000000000000000000..c8bf0a0df0428670ea241bc207d3a56781c4d6c8 GIT binary patch literal 1837 zcmY*Z4?L6kAAgu5OSmFOj-|mb7sf<(|KWLR3SL1R?JUdiKH9s)E@iTQF zPR~WR<<4mCs64dAV)u!%xh(jt8p16#?%vg|HT=!r4K!yO4pcYh*2gw?48EHxSV)^5 zX3h_9y;N@%dUe=L)yk*>KKXpCx@}4*M6+5rUE4Ta@ckFBSY9z#*)=ZsWngXr(mLF? zT(=@8&r}fbD!if0{&L55=okr*=|6oCc3RD4U8LC;wW=vR7*_xp+y0~$2>RlN&Z`HV z*Dl-eB0Q}2-n$?ZN_ZO6u;man4dyG!MU35@`}?3B9%B2l>)x>E&D{0$haN+*LJ8OB zhiVi@Zv<4ooNvjv`r@1}KVV{z#j8Y6tDox1NexuZMHmp)*p$ftFXDvJ0jHXbrL4R6 z9J(LxFYUQT)*a!p6I(Ftt@G|1wbl^@;KVfF0<9?>6JT`A5?+-1X9uxG;yv{)ik z;>O#xlR<^owv6RC8EiGWV1^8=U33+t2i02qtQ+x=mHxxnpvX&-+pfa@g>N)T$TiKK z`xYnE|1n$qRZB+ltUl`a4);qC9cpUm@!O?fBPr#kw3u>p^^ein5y8H9GN8`?giJIe z?MAtl$YHO#?g$|Kk%>Q!)^t8S!gtW^@9gi4ZNJh-3rBNkL0OH5 z0{M--%$KY^WTO*smS~`-kkKg@L`?TpMNB({Xvs9vKaOZvEr2+Q}guk;R)P}XG}hW|J}%G zQP?Pg5y6P~&Xmc=pXfJ1N*R#>)$^RNyUus>*f%q(CZ)0i2@(YMU4U%oQ^L zs1~VyVjxAJf3R{fW_cw{QTPqjKbRHlbrc;+bAkq~x# z9F2))W1*W0v;r$>BowkKVZ~yh!CnN28=XOd*dtH~6ch)BKp+?fF$V4He&}Pl;tdO> zuviIbBr+)}36XRFL1&PW)=o}NNR$oI#s;oXz?sQ3RwNrvW5Pa|{O#jTVn#El2`nm| z22uJ(M$r>lSSVB(^y&JrPZl-ipClUdV_S*_k;)aMH3EhF%c3d87q- zdqt`7zG9C&t99$c-xkkt2!)b|z1JWAJ(4V{wqh$1ng#8tk@<;Yn^=f1?{)S~Ly%r% zxhQ$fc*q18*8eNT@AEU5Vm1FOI+QM^?aZ1~4cOWIrL)FxmVId^N# kSKXw%ug&DM^)`vlZ)Y#QUDF_@DZf2W4{!Gh*W>^CFAAI~8UO$Q literal 0 HcmV?d00001 diff --git a/assets/up1.png b/assets/up1.png new file mode 100644 index 0000000000000000000000000000000000000000..66cae79999c4eabcf7fa842beb78cd6711c5c9f9 GIT binary patch literal 1875 zcmY*Z30PBC8htDc5CKu44Af6TB8xy4Km^hdWRp?^BL%`z_5>1^Bu#<@O4x#mjZgZCm$h-M;#=8Gt$!D0)VPE+06}?;O6N@O{CI)phd+HJ&6<|ogCxm=?VZ2 z`S}51q`d*U*nc|VHK!Fh}Grb^#T2ps!Fej>y*xQk<Auu2iLdrPzXgVeGUHFJN+*nOBV<^B?JK5gW)FOE4fz(0Gy#Uc!oE0)B4X zJHxEFWiM{FyeYX9rz7RCl3OrcZ42(3b=DCj;N%Ry63ywI`+(7L3wTZ1Dr{ek57{EG zJ0DLv)c$AQTK)9bvC8ZPcpMqs-|KiI_7@kc1@6S3y8>@wMfi#<#jYPB;P-XgOq@=I zmuNCOP|2I`)=%IsUs4}0bkyHrc-90NShwWbk%_M}yRH*)kD2-F_;82MP*Il>?;+1{ z3Rh%QH2))3q<1mD^KeUU>YN@ba*z8t$WC&4Xk^(dXz&)wRCSIjQi#dl_)w zKVH@`J0nK9mT$q{^xhIKk^*3jni;92%H&>+SQ<=X?S=Fza3XLbxqF4KFqgb}a$Ya(9RhiJ;wGE_2WhXU{0%^rLl2xdQ^ zhKf9woqP${8}NX{D1O%e3<7NG62Vz6HYn_TZIJgV>5cE zay6omX(#L}_vGt`2|(>NR6-@YDoekDF-NK5KOb}UKXL(NmR>%wXshB&naG8CIU7Jv zCJEAV=iil|$nbU=tj=y@EG1&TicXJ6KZwH?-S#c9hi$E2&oVDV|G808hl^yyxtu6RthCP)=v+qJ#6q6BPAiXJk zYvV&2ds#&y1?o$;RJKf5J08V6@0R}{+=)S6u|7V4g&eB`%1XNd6**Fp-@s`ypt_9# zz*Ig0fO4twX9iNL@&zjzg+ibb>+^L7%UW>tvE+za&u@pW2c)h*ZoVtq~~XXK#5aM!}+w(aA)4 zvcey0joDWIANMH-gH(k7Z80A^-Dc&jV!;^X=WWA+4Z_FNn6^^b%P>g&1f-X*AAmd5+(^AYe$ufVF?mD+Hw_Y~+wFgTLNO9_J~ zt_-34rrE(ck?>oB`jimSsTM6GS_Q4I8Q-bL4JHIcvt9sZVUE?qec|h6!t)vC1~tOt zXT)kC=e~;+?Q5ZyxYyYksCnB^?ozh+O!>iYo}5WFez(?SSyK+`tOH@9df=DdzsN#6 za)WL6ccC7;!N!jC42z8SD_`W;85(%E{dk+a$Mu{B?0A9qzTB3U4GhmPax`pN(ky<~ zYK~X3rXJNIn7sXNSLNh`e5D-hiGnxAI#yQ-!qtaEN!C{C!Chp+n`*T|gz0W}*rfdBvi literal 0 HcmV?d00001 diff --git a/assets/up2.png b/assets/up2.png new file mode 100644 index 0000000000000000000000000000000000000000..32f5add8cbba5c649e914f515ddecb1255478056 GIT binary patch literal 1909 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 literal 0 HcmV?d00001 diff --git a/assets/upclaw2.png b/assets/upclaw2.png new file mode 100644 index 0000000000000000000000000000000000000000..51f02b1fe04be3288f79d8786d35a96fae7bb846 GIT binary patch literal 1942 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 Ge)$jXH(v|@ literal 0 HcmV?d00001 diff --git a/assets/upright1.png b/assets/upright1.png new file mode 100644 index 0000000000000000000000000000000000000000..576d7818725b2950926f23a580f62b3713253ed3 GIT binary patch literal 1930 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 F{0H~sRagK3 literal 0 HcmV?d00001 diff --git a/assets/wash2.png b/assets/wash2.png new file mode 100644 index 0000000000000000000000000000000000000000..c74e9b922b08e4f31d87656572a55a6f9c4deeab GIT binary patch literal 1937 zcmY*Z2{>En8a|e4rK;Le<+>x2)KWxZCyf~U&9s&pTWjozB$k9E2o>5!JB+0*(-xNr zRjRm{S{g!2q}F>!Tn4p^wPSCmXldL;dpq}@^PKa)=l$RBegE%&{^z8+Iy)W%se%9i zIEML~ottO`i=QJhqBk`@{tp0^H5{^O)c5}1=0P~Ct z4_|_sha&p#jkUUGe`OAqmS)KdO@68ick53cT@vDIBgXZz!|SZ?bgxVl5H*cv_Z|_? zp%twa+RCQ0r}ur@w7w3lSWSaHtaE)R&D7rEe{d}Nx3cVVqfsp08AJ<5f-Gl~XbOZHe}z z+^oM<_wisZUSWz!k8VTtbgbF!)f@QdgQ64N^5qtee+5hnbYL~{+t9CSoQOIpy%}Bv z)6O?3JM4wiA(D(W7@mk6=3A76{AjJWmNxt5gy&;4&+Ez04{SdA!=5R2XjtCz%a@~d zA)@!*eTeZY$UP#+vQR#%nyvx&tlzZhO7g1LdZggrKufwU81Hf#%kGh2yqGQ~ajUI;vM4;6MT zFZCmAO821~{BrI(!2{YXml#K=h~~?NL_!A*FmOy3b4Lx5J%>>Fx)_|L)%_hd9ovum zR^FuZK7@*W+t@!CCjoV1nWZ(SEyY@Q2=UmQ>AJp`-?GdUM*2qj!g}rvll+hjl2;nX z!IQ-qqQ0h`#jA$GXkDX&1(d#huK(h2jsK$A6*=MIM5(0ZG0$fv%f|oo1TmV(K0L>_ zmd;po3Ctrru(tT&WfRX2lIpzxqmj-zf|v2xo7?WT$_ne=&QjM*nw^|O&-_YdQCLw^ z*SdVC^(p=o|0s1T%Q18?ZrwO+t-AOZ&;s$nrE!+cl@S<98++4|+s?&aa9L8il`I2{IF+I7%aQ4#j?hf~5v=T~Z*Nvo{NwdjNjFk%HW&|fb zdG%dsOyUL0(dz3R)Xi|zp`Zl+1Y@+K6*rQpGL`oH(#qx_<@M8Ec|kg{psqge_aEE4 z=VpUI)rLB!<>p%pwU?WgIBNZ+^7Ri0^FYm2Lvt<}BmAg57FU9!vSiHnw9ao|X|Omx zT`9%iCG?tJ!_T&?1C{7f`j#7Aix)H{Y5p6tz0J!-wXZ^b`JE4)q%jGMB((VL?|zJD zyp$mK=oBr$z!|uz({B;f97Vkpf1IBhdosFcKB|$>hI2b~tJO4K=|UmmM9E@* zv;pcs`G4H!928s}{y&TP)ad~$Y84Ga!M|)98l>Vkb6B*=sTezJcW>EMkJZd}u$+&} zwy?UnUC&xmU84rGjlX9Kjt+I5W4@!X_PMY}$ zV%)mv;Aq$scm771AZPeRrqW|IbE*VP{*+MN?j*<7`OeNClYL!Ey}H2~lbtgm5HrWL moU^Z(!OARGM*BYhy45c_CCAQ&^ literal 0 HcmV?d00001 diff --git a/assets/yawn2.png b/assets/yawn2.png new file mode 100644 index 0000000000000000000000000000000000000000..62555df6cd5b6a759d0c909137494d0dadb57011 GIT binary patch literal 1882 zcmY*Z3p|wR9{ya8n1n=1PG)Bok-1QA)0o^f<(Ay7`wTNNGnyG0)3kvTK!wC8-^@B7~8d*0{&Jn#Sgy}$1tULLNyK)N6R z0Cr(dIC)D)un7I?Y4)EXillt3- z{Wq_fXNEbO9=e~s#TR7mn1!weDej=X6va;9%`n-j;k^0E_RV-h? z^33HRnOZ`HhSeeyYT@h48f@RGF?!|$IFa*MLxOK4sw_i+5N`7&DrgzQkMjM#S#OSh z@4nSw+u@3#n=u+f79*h@-P^h7v{`2sRsu@6;9a6Rqka&Wm^6XaB(Fga*0>W*GW&A; z36@>&GS?es_D0Jy7hy3()X0F%-RLX!ri)pkcf0*6Fns@eKNUHA3WL>absE@agqEn% zyO9Z-??0aRFTJTenQx=BQ#acH;a9ip(4FdEXY{j1*duys?&MgvyP%*~j@`=Eo%Slw zFIe~v!`Hr%(_`13o;0tG4Bz9F2UaJh1c#SZfOO{wx99E>Zm<6_F)!p9f7k-*ea>!m zi{}QB4&@T)+kyMMC4w)sS@l8^p)z4WB|08DWQIjx^I7Y9kb)`X{%^{_`9?iwaM`#) z)JZjqu0jY6x6(K`lq3iBW?N-7XU!$rcW%YtZcNnnKR(H}(irU@?T_ufK0*#fG0FZ} zTo*q!cbN8u{%wrzSs1f#&$hBl(cj-cJV>kZ=e}s(djX^L(nJ;eF%5Sme;|gi1C( zB{NqPhJ--FEs27}fU)y&)Nr5l2jPSdz(%{f113_e49LrA0t!+jC%u8oL_l#H1Aw7) z1OWM4@?RP7Erq|ZY%+RvEks%vNc0Jy2e`YTq9`PI1dbAkhcig=G68^Qprnw5r$>Mp zq&PAS#ju5JD^OA_qY)7BwuByQ3kh)d0y|Quc(5fL2}eROATSt=rsASe-cBxG%B5en z5CWYZk3t|46BFTyN8l7{48qLD#s+~jN0^(#qzV`IN@ngRAM}x zNFjq|z7dg>1iCE*A`AL@eO@P>82wignf9eEX@dya48jbKM11v@mZD`W%9BdOOOs{( z7&G*?^8dImIcS6|{C^hnxzlY{+A0QwMtt2i3}}Do>mAZf_QpEd`vj;g_zJ2!z^cI& zE0Wf+YuX&U(gV+uZX7-6qNyoR>^+z(T<58kT$~{=O;SBV=SxT@3Y|5774Ew)KMrIl z=Lt_V+d116w`rV6@KJOFc4C9Z6rYt;0l8`8mz^hik8QR_koJ}0%HEyHUudhi6WDdm z4WoDXYJw$2CESkt+mcpzX^Zw+)0w99kJUWCMD>KmHQ z8Sf6HwpWAliU*Zm?Pj92$DaLNW7QIztlY?ZUJUwR*tS`-F*uqk-Q-6s-oM%BIHS`1JY6BoxwP% zNzM~Mc2(KC=IwidHck-AJvzXf%}5(87>4T=rilkw_4*U$!CaS;>Do~uGo#X*QuM>= ko{@mPtxrF^kO(g7Xtx)<5h)=4B|E5CXAh@phwvZ%1K5f_vH$=8 literal 0 HcmV?d00001 diff --git a/assets/yawn3.png b/assets/yawn3.png new file mode 100644 index 0000000000000000000000000000000000000000..fce6e4cce2e06fe5ad4fc5e9a4982914b7325165 GIT binary patch literal 1923 zcmY*Z2{>En8a@eQ3AMCTxqT{=2(@HE6=|fkHPzZiZDrIN5lcc6gbL=OVo-+Lc4}0# zN)=Pa(lTLc34(izq2;mfbZpg5(U#;U+UeYT&U4QHp7(#h_x->B`Ja>F>_|8S(SQH| zaLDe0jf-f6iXRy%(VHG0|0e)QDv+(Mox`jN*3@t+?Q*1lAdx_%5NYH<7lIW4m}O_X z`Gg#IQ^Eh#RHv`?JY~47EKfmT@~`@Em%-Gr6#=m>V!|LlyxuamXKnH>S=)Gi?*UmC zuVSgxRz8zIBlK?5`8u?6JrjAq-ub>{%E{e<4}^QatI4i58P{?18^c=qCf+XfgAjcT*emkNNgzW9ysHuBnmj zr#nK@>SJdDh&`D$T4mM?n)QT1 zKNzunZ4FLVWC?iVZ0TkAwwI(d{q^__oJsl5y0AXmp3{{Dj_{$Dl#fYIY$wBb<0(!# zbr_b)v_#|fZ9Uqp*>ok2+rk8cU5z5wbt(yoO=Q_EIN-x=PNPA#@Vr2`Yt6@37>_DU z2V3qq^U~n&Ee$p@=iey1Kg9Dq9u?iT+V@31Rp~-lT)$c<&){RC z_uhSo@wj_OW-iZMO->^Vfp%}$vf?LsH0V4~@_oWc%9)$sJB;V|f;i7O8jH^Pn)&PB z;(4k+X7`+HOO0Do#rPeu$%QJC6TJOO9zrx$Lhh}UhTPkIF|#(^uKQj9Jar8f@K;v` zF;-d3W1b5+>W;SQ8#9DRq_olF>(I@*6agVO-!x~Ny>X~VW;P8URcjgo~Cxv{L}(|_BowH<3vp- z^L=JeG+&x;lqQ`+2px{wJQcQ4UGfWLiG2H;367Q5C=z!vD9xh1qdn-7(~9c#R9Sy? ze2i)3k!&>|u2gpoHK>wRm8|xNzDB94dpUd7_53XZ^sR8*R{;sW38(NXXWJuF)Tc9l`(|xxnD(l+Phl>Le7C-#;E(S+ zdKTsbAk{{CN97k=i%+ipy23p^Sf20n)LolYjrw`>Ac_%i0U3sZ*|Fby_)kjn@K@T0iy{mSA`$< z<5_PdhNpqXVxfc(!IbL^eAy@ZLD&#I?SdT~06h_w0l=WcfP@HvL^qI51|$zK0BDOw z000+*zcA2ZiNCRUGI)E(M^t!)?CQzzbg;(;QX^3QLDT>uiWw0p763RVRsS3aki=X*3LaAYp`Az&stCq1IFy5qcVhL1AEc2ows%(Sm}pE;i>smy5nE zU?B`fBo>X1jg3Xc8l$K*657z*+#HQDLK_(&MG7Q6j>7O~A}MtECzHQ?Y>4zg8aa|d zrc$6{U;hAVG{XW069;{{KCP2M4*oldLjT;Bs6n)N25pGKpuc#FN^xQq>qH|HMag1+ zydmyD`G4H!92{C4{y&TP)ad~$Y84N`p}%Y!9-@AAR$8>l*X(R8T|H&jUHcq)7iw3Y zH_A-EoP`Ze^u%O(vrG*Vz%6%lo5w zsPUCIR1zpmJ7%u@#v%E=TUZPh@<6|2`NXlb7g~fQH=AfM>OCB0Bm`l@R-48i<) zWWID)`Osyv7%(LrCD=cz+)AEY*NCbt>wZ3IGJFx4$df5?$-#TY?$s_4g`1LzAcvdv VS0Mh0SHvgU&eqZ9v6bIH{|lRgPJjRa literal 0 HcmV?d00001 diff --git a/catsound/Sound.txt b/catsound/Sound.txt new file mode 100644 index 0000000..0f3c528 --- /dev/null +++ b/catsound/Sound.txt @@ -0,0 +1,8 @@ +Sounds +-------- + +This set of five sounds is for neko95. to use these sounds, +go to the neko configuration program, click on the "sounds" +tab, and set each event to its corresponding .wav file. + + Matt \ No newline at end of file diff --git a/catsound/awake.wav b/catsound/awake.wav new file mode 100644 index 0000000000000000000000000000000000000000..25ac2833715a393177541c0440c25fe913e2fde6 GIT binary patch literal 17922 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

t9{nL}9p(X>#t+(@LuVxM= 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 literal 0 HcmV?d00001 diff --git a/catsound/idle1.wav b/catsound/idle1.wav new file mode 100644 index 0000000000000000000000000000000000000000..e92279ff64ed2aa7578506f6642190909cbdec1d GIT binary patch literal 17178 zcmZ{s?~5W?y65Y@+n3A!11QA3KK?D&*kc31?5)wfYL`V{fgrcCif5(2l&k3`OVQ$P+byYp*JU_nA zkMo=pC-Q%s|N7Ve?pJT#{NsPg{n!8bzrrv6?VC4m{*M3s``jD*^>=Un&70r;Cj8Ct z?VC4^#`ipp^!efR2m9|YlplD0A?e?F>>vI$ivIm?&-p9L_utofjGLpJW+A}{$bk^Y zuk0LwIU>Y7rx}=1|L!{@G*W^iiPLvHHbpaD=X_51QBTTDoWAAxuHI^4 zweMHI`L^-XU%G$!^H1-^>HBZ~?^plZtCY(X&kw?S(rmSw&8C!#YPB%%eb4hD)EY?> zF%U(nN7Ya?QL0hgZ0l(yaomWas8$szV2&uAcBj*BiUdP9OQd?z>hQE%Myl7UB0;Dc zrQ3Zaxk*77BBvz)cDr`6`T&8ZU>AKgY{LC__d89C76U!P7)@?O(>?FY?9ux zN!rD&Zm(xFDK3&}Cmoudo=7P>10q!%c18jS)6Vfb*_2ND96f;tKNHn%A_CGhH1HPaNr3Jrk$Hj_i=adkvX6y+&Q;+zv@M4Z8nF@+8>Fv2l zIRRwYoq{qT@bD5aoF=_m>%8Q&6Lw;k;$W`rLo#FQ1~?>ikmAlHi}94=Nxfv(B^o4U<7Nusb;3&-ULdNca|~ zOA`DrsyBdPr)`LvZ;j;a?GFa{9gxyIgXGyPv>2ixvg*n~>=lLFfMKUU9R4-QS&XdV zaB!L>l#HPq($uU$uY-mzsXrri2g4DhmLfK_OR_B4dc%=~C8ttwVn`lJnDj_z1tQ^M zRS<+R4PjzvNL3v24W|9V(UF*CS!x_dsru=x3Uw?+aWoqCOqfW4R}slVt@nyZ^p-0qJi zlTpuTCrw__5^dOR#Zk5T*R;-HJcZV5h^1690|1$t(H)GXiqRkk9`#!xM`Sg-!|`-% zsxY>e(lo7}&P&xyX@cuC4>e^Sf46xUE>cua&;^=-5>W;u&uBGjd}lbBj(bg69#K6) z>7sdH)MyVT(@`%WzM;kSs#h*m0T2hAuHxN#f>l~UQSM))KQ>+RumHtsg4 z0t9dp*Zgvcys_M?HoD{aY}l@mwI?DI>sCE$Nq;(@_LI=7_^f701CdCi$3UNYb2yt% zyLG?JOqRMBqK9JgCw_uB=|qf&7&FtacyLu9VB~1An6$;rWQyq5OdYuP=j+8F_Ra3N znP7<*qK*KG+oR=b+Nok2`kN)`L=Z`sxE#iQNyJ7X2#`p=p-;U%UTx;xS_PtCvx#01 z*%AS+-PvY6X@%ut32x{bdPsB=qhzqytVW4nEHX0!*w8zn6V_Uj&1T+<%7sF)j7aQ& zt12WOk2F`=ohXFB@tBwtLemQ zGQQcahOw6t8}gf=V`5lqFYfM^{d)NteFF5sZ-FCL!&+x~w_Wz5k|RoFsw~-1@2&2) zi(ajmzb-J-^Z^3u2e60r{$_VKZ~NDxhDHTpsLTwj?Zv~xdRQ+(EctZ%|#+Q2Eo))rvst>u2V?jsc#(y4d_zJz_)Ti@T`PLonDn=i>2a?gU6i1z(j z@8)p09XDiZDTteb9%{Na#q<5~VcDtV^4Ixd7&Em}A{L0uDnPf_$K(AxF66GSuPdf- zrL15;ddyZp1tY%co%wjrY&{ zb)IcT1UkAzzA`WFtzMSe1updU)Qg+Qm$sxlm2zx*)D% zTFl(tx?K>p(h$`v`(PrN!=N^N_;A?t${A@@O&Y+5+_*t3na+1l$L-L|Q*@%-aj4g2IY$! zIM))Wz6qwPQJpHu>hQE*HFB2#EhuYY#llA`pkIlmyQjmpSG>F`Cj{Sa-xa?@2JVHbAP{lAz@EZV$)DMVQH4 z*O*)dOsVaaqWKOt4~kH8UJ_IFee|lcMA1f8D$V8Yc-R0Z84(g0Q4OOA0B2OP zcwlm`kjZ6pK6uq48ATmZh*W~!?c>vNSeIXZ(|%OWWG*w6*z^KySR2@WZ?iibR#7gK%@iX1C`78nkAlcAGx_nj z8^I*!v5|4@qXkHVYyO0Ms!%gXz^}DzSmsb@6r1@o6F=wQqJ^dt%bL0ay-A^ z?+C!lTrN-a*6I7$XdL%V4>&j;tY}9>L0ky8|EdXV9x7)9k8URjT zDKel?n<>1$m(1^WyJbCxKd!5^C~+NsKxQ#OGrzrLwlK?OuBlQ{98q?wfz7UYL3f4O zQ%jCwoz67IU7`G;4xmyUZ0;W)MwLu9n=PYwy#b`8E-QHwhvn*U^YC~-D3e)4N&=Eb zRzur_9QN1ud&rt?6KQls1~?;aoLA)+%UvPYjN)gYIX*>-o>#QALY@~S4o@TUwDnMA9PZypX*luY(A z7t(gejTBUo%cW$x**$Gr#a!k*M}1}m^&Ko6UNro2G+f^w?t7(7<|2c~m>tmb(YFb6 z%IM@~cigrL*~^P7W+U6prmaG@-iEpCs8v7gVLUwV{g;)@1X(IAgi!tUbkaF~VJ z%*ADi$kl8qZXIZ)l8hF2&%3^tzj&9WNRzY7ren}-d>eL`_ssU0eNk%QZ#qa9s5Fy7 zsoI~j1Wbc`=G}Rj*o^m-VuFR|$juUH)}x5wky%U!;^@HtCJ5;71n z+i?=5=(VTo{nI8cWX{g6>zpW1(D4f8gG3@L0>gbC5-=AfS|>D?*Vqz^Q^{*h)<{p7 z{_Z+bv_|;MDc_7Lm3TPEtHU67_BO++PMpw1aG+xWM`$)i>xbh#OW?&>uF9sCK=D~a z4OxX$e?~}6!>fyTgp>{xpq;d1zfd18?^wr*ne%tqs%$speRdrHRjD+3j{V2?%osVubSzrpxUUPu>+jjX?JUvqy7|qx(hMn>H_`Gfuh0l3?%1_YKPlnw! zan~zc(4B-$g|$lx*2|<0c)juM^I=lEzL0OE9^z3D@Q8Z99Cqg0<6#zLFUV(-P+8%8 z2c24-3>CNCGI2?%5x5}hB11XnCu2f`Qj|GAQ_g9zf-dm!WKas))0@N7DgwRpqT-s} z8>@q?PnvZ(XTE(pP=qheE0L+W}i~HyOumU|3 z5crm~j=$)oS`YeR?Ad%cf{yB}B3p%4{PE7PLTtH0%Tf%TvsLIUboKsX_hCP%V1AaY zCht-@v6oPC;^A`t;hq-$>|HJ*>w!m!qr)UNs=(V@K0H0rI$oShKb1@N?zUZTHi5U% z*ZjVhJv++|P}Q?Cq<3YPGieWMkS^(nr+r&(mR|=)d$0e?`C1m7L|Ui~o;P`S;|1M_272JgZ$w z3nf3N+Mw`cTc_}~n$Mz0_})D|EkfuQWjLlqUGn)G`;pFU3%z!Ac}8U;e%yLwwTC68 z95lzbPo!7=;_SR=O@JII2dHuerLaBTJbhT#uSrjxgm|>tf82G7D42^{RF4MENdX|gaPV^XVF$pfjjTFy0JV`{tROTb$&dip z^=;j7gWW;>&Ek&6-$eO(ew)Ao`S` zLwN!~EKa6hVpdcys(D02o)x6sS1{j1(bR)>U?rKAkNfP%Bt> z3yP5Em!)~ILd{SG&~Y8DJszkOf{rQJD3C%$%1d1lLRXG~R)NYOL<$T%mKR#BI=f&z z0D>xzw0u?qK0K+bP>A9IQj`saMF1&SVD-BN0b4u^^c1wPpvU@Z3V21YIa(iH?y&Iu z%sOCdfE2J00f7?h*Y4wSSh>1 zRls^5=3`H#R2wYrUOr5N>&)A8wy{w!sVA2>bKRMk!8w4hfsHR^ZaQO6>?|qC?kpy1sMhiA-@!M z3Br#zaWVVuU6CTpJ_Z-2bPx_Y)AjMwEhkK8Z`Ix@NSy(Ay8(hNdefhGt>V@Bmw9I( zSz>7p!lCG^{m+k`5_HxXd5A1Dy1*=z8W{LOjO8!ix)>wN3?O2JGE_7Vyv&1q_T9P1 zv9@_oF{b^DLI4AwKAM4NWh%cjfDlo8tTK>HHiu8UZizaUuXCPmDXbXMeu)^228OUN z1wtzWhOkyDZCQ%dJ_x?d!$Ou2Q0I?u9fMn*)~O?$oE~3po28t^Alq?;fDO>1Z7bCy zg|MtbN*e35i5ERqX_JOxc(gqJeBbe}SP3~I#MUfA)qqA znG}nO&S|w$OmB`KZyLobxj5zwMFxmog&vlr;Nj{RmS zQh^>d(l{}TWsu-_Q0Wbg!*_oC|!X@*&-t{>xKKk22ptYPmB{51F zTJHblu?zpdzvAEnx`hz$1XVFuX@>KMpN|8-aPjw9$yW&KJXV_sw%Q&m!A|sRlh4tX z3sI9FYo!{_?>{|{!s6wZ8R=&sEd6x4tu}lx+kSkR*Gk#97d`-6P>kIop^h7 z|M;}vSn=}QZ#O{K4_U)FnFL6d`c{AT_~~I-FJfRo9jAs;VFUmIIDBdhW+dS(DrM-! z2mr+|%ZXd<)k}1zx6dz|q?|iDFWJ#8(CT%n5TqBZb%yKbkGF&XOO+1bnEDyQ<)AfM z9)8{rLJ+<}b)&P{KmaGfA_`_sFR&x@E|{j#FdL862I zK*t3jRO^h1@td}ff(2o(5Of0A26E)qv^qJe70%!00-bpp9R~6ti+Q6ry?c3HO29># zV>%76Oi{zjQB|!wzWE>vbMMZJI_RT>vQMq@K9pQw3)>#8pFTYd!u;7;J|qRuokLEJ z$Js{nswUu#$o}JD-Y8;WMFkM-=xK2gzEn5go8W?FtHM6A1gH!kda1UYFGLY8Xb(5f zAGf{m>fQOZyl?avG1?EYa|`|M?QXZ5Rya(`2F-}2-luKhcTUCWzIYMWT0cJA&g+@W ze4Y&r&;^{rv(oZYO>C_T!!Tx6IL5@9T64r|eAoB0=NH#iEW-(PIuX56Ljf!pE+0QW5{8%TC}jX)%$g(! z@wp(FJiI(@x@=l5i)6Ys`pyC!c$1Y$e|h-0mxgC~g&DA#hP+*4$>+4QJ-Yqya@%9W zeo@deru~||9+L!CmZYaJnI+}Rvnw5g8w1;Ia+t~nu+|!^o<80UqigoW3IhUIZ)w1& z!m{HBac_G6^1N=duemH)nfFy?^%e&k5!W1;jZuM)!dIz=DeWF0!hnQ`+Vtfgwmm!2`^x;}o~jiLe|Fhj41SgA+? zy#-|l#EVQAtW3o+aln9IRHU|5Tf@}>HwZ=f8I+|W3vapPlTfvma_PA4R4&gmC0A*U zK~O;e+^Q}5!jJoL1cNJ3(OVm5BP#NGv(XvSSwF6tB@X!jiKf=4EGp750fTC7R-BKI zFpwLVFR3olDn2K;y!~DCE@sWCP$oktvle^2i2*$ru*nK3C$!G@BR2o%j=>4#av2jU zVVm9Kr{ki@_A*meQ%xGvk8rBM3sW$P`?I?bAMb}^kk=ugK-2*T@1RLGKWwqP`SiSM z;ik*7wjJ_YXs)T}c22c!5B>IXoZMZF)oM1#~pP1T^3!El<>*+#EhU&Kh(cS&v-A3ssI@ zc&AY+!=uq2al-MqfdOyKG+W49tP^PfTJKD5dCxb6!DX(Z#Uu@+pj<4Kc(c|Xb9N^N z*Sr_|oBJzii8>^Yp{5D;)Nm-E(ZIh2g#P1kByO2v4|VIz}av&u9tW_;t>T%sB=396$|)5HH(e> z@dg`kgKoFU1_sbNN(F8#j8?m+$7LG{nG$qE5gn@)21o*-c6hp<#1&vh1%)3fsC6sp zu1i&s!W-g2O-2eOT&Y7KR48!+1(eLlwT#S21%pvKdb$Q66^85Gafb?mQ97zHI~B-i z9Mv9e_J{jfLMY_Q3LaG86i_;9KnMyqkH_t}QORYlh;LK~>dlsP1O-*;F0pdhj_anQ z=4${b1abt;M6<<#)o#nH_k50*;3`VUm6cp%;I0ohsc6J^cZ*I?-~}0uLJM~41cO&9 zal?i6akSn)-p$~Uy^>Zuaup2_u7X?K8S{$mj#u=u0;*YIKyv$lMk1lj5r<|44rK`- zOA@TGTNvUd4tmL7zRKoG8h~l$3MolECY{k{x7$v|!3{7D0Hv%|E72aVFmu-O3%M)2 z{h1YZk&>G)8gMsn$xP>q&_vKBnHBYBe{r|FTXw_Z6&!>ErWusFTSH&f>Q8U?4=e6J z@V3u+Gi-1Xk2i({3`)>R+&tWGMhz14ntG^*TP=pQWC)1${lo1fLCd@$l?DW9LBN=u z8Zd2o*O*~4V9P~G4S)km3>Mpm?W`S^&{Eghgp|Ub#F8^GV|H_o8MSgAEr~)GwYaMy z7Gc!vO>geG#!>gKuSkC4o;P>gfPEc6Os%(f>tVw$UR_rd_X1lHLB}F3arkO`w;3e? zmp#h5^@E*o&;V&!YtYi%-rdf)5ObZ{3E0w73x$rlG2`}byWl!a;i{*i`DA1DTt)lLL=3~Czm=ehFOa?~9G44o)#U0ntkf9v~EGn#0{po7Gnqh}qitwn86m&x2 zlt>Lt?NHY0Mw^oX3nyc>T8!I7V$mYg$xtWdQ?F==ddOH#dzA54LySj9|xvb=yeQ@ugTyB-FmecwIbOew1L9Z)W*W>z+vm9GxP)|Cl`8MW_BnAmr{b4 zuFhd82Vn&Z%P^Ff4-)4vXQ-5LSSe~;Y_snx7gcJc#AgG-hP1>TCoL8HYzsN;c-2zw zP~6Go7W~c(hXk=rjtVO7F0!DpjB^Zzoz4uPqU`|7)rz=NkLZGivtXS#IjFSAni*<7 zigx!@TJo?DR?t-408*4DQDB>vGDAw>4I6+%86a;^v+12>23u{eVU@TY)|o6dpeYVo z*`*~)fRuXYR0LJP2BZmS171ZaB5Z(jxRRX12p$UwaRBSpoH{};UC{!^0EsXT(xE#^ zIq1@v)(xE&q_OWpX1qw1)YVWe9Xj?XnuV82Ct5FENsI~sErl{-n+adYQ@!z;GEK*h?yE@m=c zu4X;;VdgHTax$o!TdGCW_3mV`Tqt?KUh6blehzkdNH4`LVaWhX9yv#+wjiMq?DJeP zL(QcsQEG>_thz;|y|a*DWtc6N^HJM2pctyVaIXWjbdWp?uCR6}(qO4$PgpQtJ5L&9 zt{L{l87v*vhPwgyH}$v%2uiuj zdf@qDVNeoO3W?95WB^_CY`&ON0_+~8)RV6PLbnUiK?8tt+_v7pg39S&dvqOSwH${w zYmx2?W2YV|p?a!z1P;qN9Eb=leks(*`(q3u`;_;7vxeCk~j&9*0i}RHP(d4@gpWn|*PZ^f=>6MVyf4&;lLYfSJAo z&;UuW#1RL~ghL_`vq_J5ptEO+i8s19(8=~jlc{}600+bA7ZD0cmQDsB!s#Fe5+N;3 z2bAm%C$m=_NIh{+2WSP-fbmHLYcC5UFA5l8hf5AgKD*%ii592U4$0IC7ANCC=V=1~ zN+n4mUPq{-V0X#K5?CP)3@~3H!Zg()rvaFO2o`wg3@|gLD^*oyrUTl%$wf&l=W#*| zDBL}C9JHQGgtJq2oCY`%#=&$@&ZyD}DMav93SX>@2W_B~68w|sVqo610W5oijs^gf z69EV(5iy_h*!M8(l-M2@uOoOi(9R%h7|7PqZwrIDG^!%jof82`(PpD{A_!r|KE6k-t zoxX14L#hEE8?i(XRN^2Y92ERbAGv{qSb)DN;TBGVLNfSPkq^)`fLBW{Cd7lsp~)wU zV!_vI9HEK_De49|HQ8y}H*terkH`cbm!YNxEF_YH8aYHCo?(a{#g!Q%9%jhtTQ~M{ zHb*unD&!CiKMCPeEuGv846$%%s2SGxofv`;c9h`hgqS6o;LtKt?MpBeWuGiVq^Zt` z6&Lo^B&N1-iBnV}SmQBFCk&sBU?XKi(Csz)%xU%^r+8qBMwr{xX)w_8^dtqZ(Q-1t zp&?roT_%N(D*O5xl=BY$Q6uOyOjGHtO~3nIR39S3T4G)Yy&{%=0;&<>qLQQl~CjQV{2{gi4Q~gBOeO4+k8Z<&x^&yJ(40#G{l&o%4vub zWs)?;Qq;Kcg)mGw+^_~vj1&Z@`wN%XZ(QHs3*WP9tyyo|F|ExZny7 zfto;vDtvlvyH$a!6&NzVu?dN>xry2O%-WePu#hDb@v$8g!32YO5F~h|f{h_^93M_l z7}MkKCdIPF#ybkhowqClv}Lb=YQ?ZJ*EvHvB&wC8H!tvYct`u(;`` zM_i;28!oYtyKNjCkqsXchd?k!Ww}^y+)dll2n|cs=F||_q^8CRL*{75s2kL#QNn-t z&cuWvO8D53jT@sOiU}QO34OB%%Mh%KHtfO0#~FqNfWsim7NjA}_SjBwMx{DS7FjP@ z_=9j`l(Zu4KuAY~Jf@SJp+_4~9?6q!hLD{r$!CTks7sbql6__z(Vk9(9b6>Q#@HxG zKfLG11ib&jeq=-XBM}((9X~Lk@uT~p0{lroe!>04DWM+?!H)qz3KLI1eL+8n!N|Wz z)L%dUn*nNrzSj?2u-_a<$rmgB`t29R+81ZO_uGH`O||r&zIgrP7ysn{pW0WyEB|x&#eewKfBfQC T|NPbOe*eX6d>=VHEQp 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 Uzy0wy3vns^_#5$dIsf7R08<#DBLDyZ literal 0 HcmV?d00001 diff --git a/catsound/idle3.wav b/catsound/idle3.wav new file mode 100644 index 0000000000000000000000000000000000000000..92e961e638ea07afa3e9f3ad404288d5630cce90 GIT binary patch literal 28906 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 D5%OkF literal 0 HcmV?d00001 diff --git a/catsound/sleep.wav b/catsound/sleep.wav new file mode 100644 index 0000000000000000000000000000000000000000..a43773ad629163a0b776bc7041fe223a4e2ace4d GIT binary patch literal 39448 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 d 247.5: + m.y-- + m.sprite = "up" + case a < 337.5 && a > 292.5: + m.x++ + m.y-- + m.sprite = "upright" + case a < 22.5 || a > 337.5: + m.x++ + m.sprite = "right" + case a < 67.5 && a > 22.5: + m.x++ + m.y++ + m.sprite = "downright" + case a < 112.5 && a > 67.5: + m.y++ + m.sprite = "down" + case a < 157.5 && a > 112.5: + m.x-- + m.y++ + m.sprite = "downleft" + case a < 202.5 && a > 157.5: + m.x-- + m.sprite = "left" + case a < 247.5 && a > 202.5: + m.x-- + m.y-- + m.sprite = "upleft" + } + + return nil +} + +func (m *mascot) Draw(screen *ebiten.Image) { + img := mSprite["up1"] + switch { + case m.count >= 0 && m.count <= 7: + img = mSprite[m.sprite+"1"] + case m.count >= 8 && m.count <= 16: + img = mSprite[m.sprite+"2"] + default: + m.count = 0 + } + op := &ebiten.DrawImageOptions{} + screen.DrawImage(img, op) +} + +func main() { + rand.Seed(time.Now().UnixNano()) + mSprite = make(map[string]*ebiten.Image) + + a, _ := fs.ReadDir(f, "assets") + for _, v := range a { + data, _ := f.ReadFile("assets/" + v.Name()) + img, _, err := image.Decode(bytes.NewReader(data)) + if err != nil { + log.Fatal(err) + } + name := strings.TrimSuffix(v.Name(), filepath.Ext(v.Name())) + mSprite[name] = ebiten.NewImageFromImage(img) + + //fmt.Printf("%q\n", name) + } + + sw, sh := ebiten.ScreenSizeInFullscreen() + n := &mascot{ + x: sw / 2, + y: sh / 2, + } + + ebiten.SetScreenTransparent(true) + ebiten.SetWindowDecorated(false) + ebiten.SetWindowFloating(true) + ebiten.SetWindowSize(width, height) + if err := ebiten.RunGame(n); err != nil { + log.Fatal(err) + } +} diff --git a/nkosrc4/.DS_Store b/nkosrc4/.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..2ee67b1532876fb6f49206cb7e0aab8d0b4cdade GIT binary patch literal 8196 zcmeHM%T5$Q6ukwgGosQUFNr1{CnhEu0!oZ74DEnXG!e9kf`CI$cQJJAshV^*jEI=| z0@vy{n7D9bjB#U3`~wp=Ze6%=_sHV2S|Wo>4gCJrfAb(6fg=H1&jhl0i(dbpa7oP!ZO>O z`>NN}MggP1f2n|YKG;|UIvQ&V<)Z^DnF1g-VY4*!F%OU&Tce|~rchFGOqD$lO(iPDh@;TdMggP1W(7p<-V8oO;9=&zK7aQ| zBJLL>Uc?CTrMiHn_q#Oo1S^6NnG~4h^+F2wAl<-vzJawHt|8+tz8^RTXX|6hkzd6Y zt4T$#=6$geg-P1i_klDtHtpKICzH))viq|$?mVx$sh2J!c`u$4S7Tl}U)26M=h2$) z6>o;LTCm!OI7_{d(O8nhfMUq>t&j!0n&%5FNaQ%K>W~u^tghwdfm5eX+5`P7C++2P zr~1%6GqAFf&2$~>KR+^CUb?^hVCCUsArn4|^dk#e)b(2Z1id;vLVr>3k-S;m<0s2n z+vVQoeftlzSgmabTiaVZIy<_$I}Y{q94=S~i=KbC6pQr^@rcLyXn{_IK4)%tpH8Io zUMie|)wUt-1`Y1~Y#LvxU`+eZ207NHm{K-Xio;-ZZZ4teM8RrF{Fq147*E19FiqUW* zV=)yY$(h`W=ZCD68~m!I%sFGL&T-{fkW&so&MDNSpRvd|~}0iaU3mkpM61 zKG~?$@A|x4kwJ~GUv2C!^WkBAcW0~@@n^R9R(#*;#whdPw=tFZb@S|T#B_CIEV?m^ zI4fcM>e@xj)+QosECL;kHHDIll{|$J&H0bI7&8j&Bn2APV!K8De{uWw|2t_*X01j6 zqre|3K$?c#;XIP$slEkSoboo7SuDatTuq^*U{&`+0I%2nFht+RP{DCD))Zn3nt2f* MWiXXd;IAt11Nti#B&LNl06Fz24ZXtanzs z>zFj8@?XG#8$EF4f<%u!Avkd0g6OFd7x)7Z>WM47nH@X3>$Ty8P?@oI-`kn@n|bdy zAG`~64+1%+Gi~@BmW3oc# zh3o{9L$S_a_do=ch%E*Q;8>nz<|y+*b^;l|fdp_MqGcj>D1^6;xGXmZk`JW3O9mtZ z{S2_Z`y5;c3)-MX_U{gCf&o4(f({Ni8y3~87OkQ^n_}1TTKtnI)L7o|IvO$j*D?GI z6tOiA_OV5Z?X9CXIzA<~PF{+krv{?q?J~c=2>Cr7Lk^3X`5eYh4#39R5z|OA^TX}fIdZRGdFt--r+BWlfg`aR@T%-X6it2%8u*lXy@>Jz-jESj`f6l0pbJ{~=L8zvx~$J-?I3XUi>OwNqjId{yL78f#W`PH`JfgL+}Y4MzG_pGIJdty8g)h+{p;s@nD(F}{ANI+p4AOG{5lYGm}(*mydVNoS@qchm-L ztG?#9yn^QLvZqbWZ&Za|rqt@`TJ@G`v@6Q|8nu1Rv<;Vo&62t3vU){LZJiLGO$?=2FS)OZ@S_AqA0xpCr(dJP0uK^b7yAfXBW;coIAhp!i5VjR+KYU zP2aD(%+)n&QMX{VjBQh=wrbutwteGcpD7h(E@ro7)b5^Sl@A@XnLo+kb=`0c!``jC zX05ch=NbNXMVaw*ms-{)^-SNS_D-mD=eCE8Z}>)Y!``FV;sG*Ta+sNS%WyrEefaGi z&2=@qZWIphSX$MvN_K(zK5a5fRvQMg=^Csi-jeEQx@p&Q*PaC&=JK0e<+VUjAQvbA zx%_88aXqb&vQ2FxlgZ`Z7o};qh>PBPph5#**Pp^e_zE7w_wY0P27i!Ia+bVIE|OJp zm0Tn1aey& z$${$H7Pae`!@Qfo7Z&>rpwMEkF4X&$OFntSQ!{x(;X*r z#Flv~lVm_LAQ_MhNCuuO21bHtvh4i-9sFD$@c;jF6|)RRG9VdO7&IX9~(rAW_5gum2e!_y2PL M&rb*bzx)5c0IiBVe*gdg literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/AlwaysOnTopPet.cpp b/nkosrc4/Neko98/AlwaysOnTopPet.cpp new file mode 100755 index 0000000..99b5481 --- /dev/null +++ b/nkosrc4/Neko98/AlwaysOnTopPet.cpp @@ -0,0 +1,411 @@ +// AlwaysOnTopPet.cpp: implementation of the CAlwaysOnTopPet class. +// +////////////////////////////////////////////////////////////////////// + +#include "AlwaysOnTopPet.h" + +//class name constant +static const char* g_szOnTopClassName = "NekoOnTop_Wnd"; + +//forward declaration +LRESULT CALLBACK WndProc_OnTop( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + +//static member +BOOL CAlwaysOnTopPet::m_fRegisteredClass = FALSE; + +//external global variable +extern HINSTANCE g_hInstance; + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CAlwaysOnTopPet::CAlwaysOnTopPet() : CPet() +{ + //clear regions + m_hRgns = NULL; + + //initialise members + m_fBeingDragged = FALSE; + m_hWndOnTop = NULL; + + //register class + if( m_fRegisteredClass == FALSE ) + { + WNDCLASS wc; + + wc.style = CS_OWNDC|CS_DBLCLKS|CS_SAVEBITS; + wc.lpfnWndProc = (WNDPROC)WndProc_OnTop; + wc.cbClsExtra = 0; + wc.cbWndExtra = sizeof(LPVOID); + wc.hInstance = g_hInstance; + wc.hIcon = NULL; + wc.hCursor = LoadCursor( NULL, MAKEINTRESOURCE(IDC_ARROW) ); + wc.hbrBackground = NULL; + wc.lpszMenuName = NULL; + wc.lpszClassName = g_szOnTopClassName; + + m_fRegisteredClass = RegisterClass(&wc); + } + + //set bounding rectangle + SetRect( &m_rcBounds, 0, 0, GetSystemMetrics(SM_CXSCREEN)-1, GetSystemMetrics(SM_CYSCREEN)-1 ); + + //move this pet off-screen to start with + m_ptPosition.x = m_rcBounds.right; + m_ptPosition.y = m_rcBounds.bottom; +} + +CAlwaysOnTopPet::~CAlwaysOnTopPet() +{ + DestroyWindow( m_hWndOnTop ); +} + + + +////////////////////////////////////////////////////////////////////// +// Member Functions +////////////////////////////////////////////////////////////////////// + +void CAlwaysOnTopPet::Draw( int nImage ) +{ + //only draw if it's different && not being dragged + if( nImage != m_nLastIcon && m_fBeingDragged == FALSE ) + { + //clip the window to the shape of the icon + HRGN hRgnCopy = CreateRectRgn( 0, 0, m_sizeImage.cx, m_sizeImage.cy ); + CombineRgn( hRgnCopy, m_hRgns[nImage], NULL, RGN_COPY ); + SetWindowRgn( m_hWndOnTop, hRgnCopy, TRUE ); + + //draw the current frame on the window + HDC hDC = GetDC( m_hWndOnTop ); + DrawIconEx( hDC, 0, 0, m_hIcons[nImage], m_sizeImage.cx, m_sizeImage.cy, 0, NULL, DI_NORMAL ); + ReleaseDC( m_hWndOnTop, hDC ); + } +} + +void CAlwaysOnTopPet::Erase() +{ + //do nothing +} + +void CAlwaysOnTopPet::SetImages(HICON * hIconTable, int nIcons ) +{ + //remove current region handles + DestroyRegions(); + + //call base class + CPet::SetImages( hIconTable, nIcons ); + + //prepare region handles + BuildRegions(); + + //create the window if it doesn't exist already + if( m_hWndOnTop == NULL ) + { + m_hWndOnTop = CreateWindowEx( WS_EX_TOPMOST|WS_EX_TOOLWINDOW, g_szOnTopClassName, NULL, WS_POPUP, m_ptPosition.x, m_ptPosition.y, m_sizeImage.cx, m_sizeImage.cy, NULL, NULL, g_hInstance, NULL ); + + if( m_hWndOnTop ) + { + SetWindowLong( m_hWndOnTop, 0, (LONG)this ); + ShowWindow( m_hWndOnTop, SW_SHOWNA ); + UpdateWindow( m_hWndOnTop ); + } + } + + //FIXME: don't change it in the whole class, just this window!!! + //change it's default icon + //SetClassLong( m_hWndOnTop, GCL_HICON, m_hIcons[0] ); +} + +void CAlwaysOnTopPet::DestroyImages() +{ + //call base class + CPet::DestroyImages(); + + //delete regions + DestroyRegions(); +} + +void CAlwaysOnTopPet::DrawOnTarget( int x, int y, HICON hIcon ) +{ + //grab the device context of the display + HDC hDC = GetDC( NULL ); + + //draw the icon on it + DrawIconEx( hDC, x, y, hIcon, 0, 0, 0, NULL, DI_NORMAL ); + + //release the device context + ReleaseDC( NULL, hDC ); +} + + + + + +////////////////////////////////////////////////////////////////////// +// On Top Window Procedure +////////////////////////////////////////////////////////////////////// + +LRESULT CALLBACK WndProc_OnTop( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch( uMsg ) + { + case WM_PAINT: + { + //draw the most recent icon if the window is being dragged + CAlwaysOnTopPet* pPet = (CAlwaysOnTopPet*)GetWindowLong( hWnd, 0 ); + if( pPet->m_fBeingDragged ) + { + //draw the current icon onto the window (we can't call draw because it checks for icon index and changes the window's region + HDC hDC = GetDC( hWnd ); + DrawIconEx( hDC, 0, 0, pPet->m_hIcons[pPet->m_nLastIcon], pPet->GetSize().cx, pPet->GetSize().cy, 0, NULL, DI_NORMAL ); + ReleaseDC( hWnd, hDC ); + } + ValidateRect( hWnd, NULL ); + break; + } + + case WM_SYSCOMMAND: + //if the user alt+F4s us or (somehow) minimises or maximises us, ignore it + if( LOWORD(wParam) != SC_CLOSE && LOWORD(wParam) != SC_MINIMIZE && LOWORD(wParam) != SC_MAXIMIZE ) + return DefWindowProc( hWnd, uMsg, wParam, lParam ); + break; + + case WM_ERASEBKGND: + return TRUE; //don't erase the background + + //pass mouse messages onto the class + case WM_LBUTTONDOWN: ((CAlwaysOnTopPet*)GetWindowLong( hWnd, 0 ))->OnLButtonDown(); break; + case WM_LBUTTONUP: ((CAlwaysOnTopPet*)GetWindowLong( hWnd, 0 ))->OnLButtonUp(); break; + case WM_LBUTTONDBLCLK: ((CAlwaysOnTopPet*)GetWindowLong( hWnd, 0 ))->OnLButtonDblClk(); break; + + case WM_MBUTTONDOWN: ((CAlwaysOnTopPet*)GetWindowLong( hWnd, 0 ))->OnMButtonDown(); break; + case WM_MBUTTONUP: ((CAlwaysOnTopPet*)GetWindowLong( hWnd, 0 ))->OnMButtonUp(); break; + case WM_MBUTTONDBLCLK: ((CAlwaysOnTopPet*)GetWindowLong( hWnd, 0 ))->OnMButtonDblClk(); break; + + case WM_RBUTTONDOWN: ((CAlwaysOnTopPet*)GetWindowLong( hWnd, 0 ))->OnRButtonDown(); break; + case WM_RBUTTONUP: ((CAlwaysOnTopPet*)GetWindowLong( hWnd, 0 ))->OnRButtonUp(); break; + case WM_RBUTTONDBLCLK: ((CAlwaysOnTopPet*)GetWindowLong( hWnd, 0 ))->OnRButtonDblClk(); break; + + //window is being dragged + case WM_ENTERSIZEMOVE: + { + CAlwaysOnTopPet* pPet = (CAlwaysOnTopPet*)GetWindowLong( hWnd, 0 ); + pPet->m_fBeingDragged = TRUE; + break; + } + + //window is being dropped + case WM_EXITSIZEMOVE: + { + CAlwaysOnTopPet* pPet = (CAlwaysOnTopPet*)GetWindowLong( hWnd, 0 ); + pPet->m_fBeingDragged = FALSE; + RECT rc; + GetWindowRect( hWnd, &rc ); + pPet->MoveTo( rc.left, rc.top ); + break; + } + + default: + return DefWindowProc( hWnd, uMsg, wParam, lParam ); + } + return 0; +} + +void CAlwaysOnTopPet::OnLButtonDown() +{ + //default left button handler - begin window dragging + SendMessage( m_hWndOnTop, WM_SYSCOMMAND, SC_MOVE+2, 0 ); +} + +void CAlwaysOnTopPet::DestroyRegions() +{ + if( m_hRgns ) + { + //delete all regions and free the array + for( int i = 0; i < m_nIcons; i++ ) if( m_hRgns[i] ) DeleteObject( m_hRgns[i] ); + delete[] m_hRgns; + m_hRgns = NULL; + } +} + +void CAlwaysOnTopPet::MoveTo(int nNewX, int nNewY) +{ + if( m_fBeingDragged == FALSE ) + { + //store current position + m_ptOldPosition.x = m_ptPosition.x; + m_ptOldPosition.y = m_ptPosition.y; + + //change current position + m_ptPosition.x = nNewX; + m_ptPosition.y = nNewY; + + //move the window if it's not being moved by something else + MoveWindow( m_hWndOnTop, nNewX, nNewY, m_sizeImage.cx, m_sizeImage.cy, TRUE ); + } +} + + +void CAlwaysOnTopPet::SetImageAndMoveTo(int nImage, int nNewX, int nNewY) +{ + if( m_fBeingDragged == FALSE ) + { + //move + MoveTo( nNewX, nNewY ); + + //change image + Draw( nImage ); + m_nLastIcon = nImage; + } +} + +void CAlwaysOnTopPet::SetImage( int nImage ) +{ + if( m_fBeingDragged == FALSE ) CPet::SetImage( nImage ); +} + + + +//This function was based on the BitmapToRegion function found in www.codeguru.com's "bitmaps and palettes" section +// Author : Jean-Edouard Lachand-Robert (http://www.geocities.com/Paris/LeftBank/1160/resume.htm), June 1998. +void CAlwaysOnTopPet::BuildRegions() +{ + //create a memory DC inside which we will scan the bitmap content + HDC hMemDC = CreateCompatibleDC(NULL); + + //create a 32 bits depth bitmap and select it into the memory DC + BITMAPINFOHEADER bi = { sizeof(BITMAPINFOHEADER), int(m_sizeImage.cx/m_fScale), int(m_sizeImage.cy/m_fScale), 1, 16, BI_RGB, 0, 0, 0, 0, 0 }; + VOID* pBitsDib; + HBITMAP hBmDib = CreateDIBSection( hMemDC, (BITMAPINFO*)&bi, DIB_RGB_COLORS, &pBitsDib, NULL, 0 ); + HBITMAP hOldMemBmp = (HBITMAP)SelectObject( hMemDC, hBmDib ); + + //create a DC just to copy the bitmap into the memory DC + HDC hDC = CreateCompatibleDC( hMemDC ); + + //get how many bytes per row we have for the bitmap bits (rounded up to 32 bits) + BITMAP bmDib; + GetObject( hBmDib, sizeof(bmDib), &bmDib ); + while( bmDib.bmWidthBytes % 4 ) bmDib.bmWidthBytes++; + + //calculate scaling matrix + XFORM xForm = { m_fScale, 0.0, 0.0, m_fScale, 0.0, 0.0 }; + + //allocate the region array + m_hRgns = new HRGN[m_nIcons]; + + //build all regions + for( int i = 0; i < m_nIcons; i++ ) + { + HRGN hRgn = NULL; + + //extract icon mask image + ICONINFO ii; + GetIconInfo( m_hIcons[i], &ii ); + DeleteObject( ii.hbmColor ); + + //get bitmap size + BITMAP bm; + GetObject( ii.hbmMask, sizeof(bm), &bm ); + + //copy the bitmap into the memory DC + HBITMAP hOldBmp = (HBITMAP)SelectObject( hDC, ii.hbmMask ); + BitBlt( hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, hDC, 0, 0, SRCCOPY ); + + //For better performances, we will use the ExtCreateRegion() function to create the + //region. This function take a RGNDATA structure on entry. We will add rectangles by + //amount of ALLOC_UNIT number in this structure. + #define ALLOC_UNIT 100 + DWORD dwMaxRects = ALLOC_UNIT; + HANDLE hData = GlobalAlloc( GMEM_MOVEABLE, sizeof(RGNDATAHEADER) + (sizeof(RECT) * dwMaxRects) ); + RGNDATA* pData = (RGNDATA *)GlobalLock( hData ); + pData->rdh.dwSize = sizeof(RGNDATAHEADER); + pData->rdh.iType = RDH_RECTANGLES; + pData->rdh.nCount = pData->rdh.nRgnSize = 0; + SetRect( &pData->rdh.rcBound, MAXLONG, MAXLONG, 0, 0 ); + + //scan each bitmap row from bottom to top (the bitmap is inverted vertically) + BYTE* pDib = (BYTE*)bmDib.bmBits + (bmDib.bmHeight - 1) * bmDib.bmWidthBytes; + for( int y = 0; y < bm.bmHeight; y++ ) + { + //scan each bitmap pixel from left to right + for( int x = 0; x < bm.bmWidth; x++ ) + { + //search for a continuous range of "non transparent pixels" + int x0 = x; + WORD* p = (WORD*)pDib + x; + while( x < bm.bmWidth) + { + if( *p != 0 ) + //This pixel is "transparent" + break; + + p++; + x++; + } + + if( x > x0 ) + { + //Add the pixels (x0, y) to (x, y+1) as a new rectangle in the region + if( pData->rdh.nCount >= dwMaxRects ) + { + GlobalUnlock(hData); + dwMaxRects += ALLOC_UNIT; + hData = GlobalReAlloc( hData, sizeof(RGNDATAHEADER) + (sizeof(RECT) * dwMaxRects), GMEM_MOVEABLE ); + pData = (RGNDATA*)GlobalLock(hData); + } + RECT* pr = (RECT*)&pData->Buffer; + SetRect(&pr[pData->rdh.nCount], x0, y, x, y+1); + if (x0 < pData->rdh.rcBound.left) pData->rdh.rcBound.left = x0; + if (y < pData->rdh.rcBound.top) pData->rdh.rcBound.top = y; + if (x > pData->rdh.rcBound.right) pData->rdh.rcBound.right = x; + if (y+1 > pData->rdh.rcBound.bottom) pData->rdh.rcBound.bottom = y+1; + pData->rdh.nCount++; + + //On Windows98, ExtCreateRegion() may fail if the number of rectangles is too + //large (ie: > 4000). Therefore, we have to create the region by multiple steps. + if( pData->rdh.nCount == 2000 ) + { + HRGN h = ExtCreateRegion( &xForm, sizeof(RGNDATAHEADER) + (sizeof(RECT) * dwMaxRects), pData); + if( hRgn ) + { + CombineRgn( hRgn, hRgn, h, RGN_OR ); + DeleteObject(h); + } + else + hRgn = h; + + pData->rdh.nCount = 0; + SetRect( &pData->rdh.rcBound, MAXLONG, MAXLONG, 0, 0 ); + } + } + } + + //go to next row (remember, the bitmap is inverted vertically) + pDib -= bmDib.bmWidthBytes; + } + + //create or extend the region with the remaining rectangles + HRGN h = ExtCreateRegion( &xForm, sizeof(RGNDATAHEADER) + (sizeof(RECT) * dwMaxRects), pData ); + if( hRgn ) + { + CombineRgn( hRgn, hRgn, h, RGN_OR ); + DeleteObject(h); + } + else + hRgn = h; + + //clean up + DeleteObject( SelectObject( hDC, hOldBmp ) ); + GlobalFree(hData); + + //store the region + m_hRgns[i] = hRgn; + } + + //clean up + DeleteDC(hDC); + DeleteObject( SelectObject( hMemDC, hOldMemBmp ) ); + DeleteDC( hMemDC ); +} diff --git a/nkosrc4/Neko98/AlwaysOnTopPet.h b/nkosrc4/Neko98/AlwaysOnTopPet.h new file mode 100755 index 0000000..1a3f313 --- /dev/null +++ b/nkosrc4/Neko98/AlwaysOnTopPet.h @@ -0,0 +1,63 @@ +// AlwaysOnTopPet.h: interface for the CAlwaysOnTopPet class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_ALWAYSONTOPPET_H__A69EBAA4_385D_11D2_9FF9_00001C192944__INCLUDED_) +#define AFX_ALWAYSONTOPPET_H__A69EBAA4_385D_11D2_9FF9_00001C192944__INCLUDED_ + +#if _MSC_VER >= 1000 +#pragma once +#endif // _MSC_VER >= 1000 + +#include "Pet.h" + +class CAlwaysOnTopPet : virtual public CPet +{ +public: + virtual void MoveTo( int nNewX, int nNewY ); + virtual void SetImage( int nImage ); + virtual void SetImageAndMoveTo( int nImage, int nNewX, int nNewY ); + virtual void SetImages( HICON* hIconTable, int nIcons ); + CAlwaysOnTopPet(); + virtual ~CAlwaysOnTopPet(); + + virtual void DrawOnTarget( int x, int y, HICON hIcon ); + + //virtual callback functions - these can all be overridden to perform different actions + //depending on the various mouse clicks. Note: CAlwaysOnTopPet::OnLButtonDown() handles + //the dragging - if this is overridden, OnLButtonUp is not called. + + virtual void OnLButtonDown(); //implementation is in .cpp file + virtual void OnLButtonUp() {}; + virtual void OnLButtonDblClk() {}; + virtual void OnMButtonDown() {}; + virtual void OnMButtonUp() {}; + virtual void OnMButtonDblClk() {}; + virtual void OnRButtonDown() {}; + virtual void OnRButtonUp() {}; + virtual void OnRButtonDblClk() {}; + + //class information functions + inline BOOL IsDragging() { return m_fBeingDragged; }; + +protected: + HWND m_hWndOnTop; + BOOL m_fBeingDragged; + HRGN IconMaskToRegion( HICON hIcon ); + virtual void DestroyImages(); + HRGN* m_hRgns; + virtual void Erase(); + virtual void Draw( int nImage ); + +private: + void BuildRegions(); + void DestroyRegions(); + static BOOL m_fRegisteredClass; + +friend + LRESULT CALLBACK WndProc_OnTop( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); + + +}; + +#endif // !defined(AFX_ALWAYSONTOPPET_H__A69EBAA4_385D_11D2_9FF9_00001C192944__INCLUDED_) diff --git a/nkosrc4/Neko98/DesktopHack.cpp b/nkosrc4/Neko98/DesktopHack.cpp new file mode 100755 index 0000000..2d79b53 --- /dev/null +++ b/nkosrc4/Neko98/DesktopHack.cpp @@ -0,0 +1,131 @@ +// DesktopHack.cpp: implementation of the CDesktopHack class. +// +////////////////////////////////////////////////////////////////////// + +#define WIN32_LEAN_AND_MEAN +#include +#include "DesktopHack.h" + +//constants used by callback function +#define ENUM_ALLWINDOWS 1 +#define ENUM_SHELLDEFVIEW 2 +#define ENUM_GETDESKTOP 3 + +//variables used by callback function +HWND g_hWndDesktop = NULL; +HWND g_hWndShellDefView = NULL; +BOOL g_fActiveDesktop = FALSE; + +//callback function prototype +BOOL CALLBACK DesktopHunter( HWND hWnd, LPARAM lParam ); + + + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CDesktopHack::CDesktopHack() +{ + //find the desktop + FindDesktopHandle(); +} + +CDesktopHack::~CDesktopHack() +{ + +} + + + +////////////////////////////////////////////////////////////////////// +// Member Functions +////////////////////////////////////////////////////////////////////// + +void CDesktopHack::FindDesktopHandle() +{ + //reset everything + g_hWndDesktop = NULL; + g_hWndShellDefView = NULL; + g_fActiveDesktop = FALSE; + m_fNoChicagoDesktop = FALSE; + + //enumerate all of the windows + EnumWindows( (WNDENUMPROC)DesktopHunter, ENUM_ALLWINDOWS ); + + //if no desktop was found, we're running on a non-chicago style shell (win32s/NT3) + if( g_hWndDesktop == NULL ) + { + m_fNoChicagoDesktop = TRUE; + g_hWndDesktop = GetDesktopWindow(); + } + + //store the handle and whether it's an active desktop or not + m_hWndDesktop = g_hWndDesktop; + m_fActiveDesktop = g_fActiveDesktop; +} + +void CDesktopHack::GetDesktopRect( RECT& rcDesktop ) +{ + //retrieve the screen rect of the desktop + SystemParametersInfo( SPI_GETWORKAREA, 0, &rcDesktop, FALSE ); +} + + + + +////////////////////////////////////////////////////////////////////// +// Callback Function +////////////////////////////////////////////////////////////////////// + +BOOL CALLBACK DesktopHunter( HWND hWnd, LPARAM lParam ) +{ + char szBuffer[26]; + + switch( lParam ) + { + case ENUM_ALLWINDOWS: + //try and find program manager window + GetClassName( hWnd, szBuffer, 25 ); + if( stricmp( szBuffer, "Progman" ) == 0 ) + { + EnumChildWindows( hWnd, (WNDENUMPROC)DesktopHunter, ENUM_SHELLDEFVIEW ); + return ( g_hWndDesktop == NULL ); //keep looking if it's not found + } + break; + + case ENUM_SHELLDEFVIEW: + GetClassName( hWnd, szBuffer, 25 ); + if( stricmp( szBuffer, "SHELLDLL_DefView" ) == 0 ) + { + g_hWndShellDefView = hWnd; + EnumChildWindows( hWnd, (WNDENUMPROC)DesktopHunter, ENUM_GETDESKTOP ); + return FALSE; + } + break; + + case ENUM_GETDESKTOP: + //only look at child windows of the shell default view + if( GetParent( hWnd ) != g_hWndShellDefView ) break; + + GetClassName( hWnd, szBuffer, 25 ); + + //check for normal desktop + if( stricmp( szBuffer, "SysListView32" ) == 0 ) + { + //store handle but continue looking + g_hWndDesktop = hWnd; + return TRUE; + } + + //check for IE4 + if( stricmp( szBuffer, "Internet Explorer_Server" ) == 0 ) + { + g_hWndDesktop = hWnd; + g_fActiveDesktop = TRUE; + return FALSE; + } + break; + } + return TRUE; +} diff --git a/nkosrc4/Neko98/DesktopHack.h b/nkosrc4/Neko98/DesktopHack.h new file mode 100755 index 0000000..797374a --- /dev/null +++ b/nkosrc4/Neko98/DesktopHack.h @@ -0,0 +1,31 @@ +// DesktopHack.h: interface for the CDesktopHack class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_DESKTOPHACK_H__A69EBAA1_385D_11D2_9FF9_00001C192944__INCLUDED_) +#define AFX_DESKTOPHACK_H__A69EBAA1_385D_11D2_9FF9_00001C192944__INCLUDED_ + +#if _MSC_VER >= 1000 +#pragma once +#endif // _MSC_VER >= 1000 + +#define WIN32_LEAN_AND_MEAN +#include + +class CDesktopHack +{ +public: + void GetDesktopRect( RECT& rcDesktop ); + void FindDesktopHandle(); + CDesktopHack(); + virtual ~CDesktopHack(); + +protected: + HWND m_hWndDesktop; + + BOOL m_fActiveDesktop; //the desktop is an active (web) desktop + BOOL m_fNoChicagoDesktop; //the desktop is not a windows 95/nt4 desktop + +}; + +#endif // !defined(AFX_DESKTOPHACK_H__A69EBAA1_385D_11D2_9FF9_00001C192944__INCLUDED_) diff --git a/nkosrc4/Neko98/DesktopPet.cpp b/nkosrc4/Neko98/DesktopPet.cpp new file mode 100755 index 0000000..243eab0 --- /dev/null +++ b/nkosrc4/Neko98/DesktopPet.cpp @@ -0,0 +1,75 @@ +// DesktopPet.cpp: implementation of the CDesktopPet class. +// +////////////////////////////////////////////////////////////////////// + +#include "DesktopPet.h" + +//constants +#define UPDATE_COUNTER_MAX 50 //number of redraws until desktop handle is recalculated + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CDesktopPet::CDesktopPet() : CDesktopHack(), CPet() +{ + //clear the update counter + m_nUpdateHWndCounter = 0; + + //set bounds + GetDesktopRect( m_rcBounds ); +} + +CDesktopPet::~CDesktopPet() +{ + RedrawWindow( m_hWndDesktop, NULL, NULL, RDW_INVALIDATE|RDW_ERASE ); +} + + + +////////////////////////////////////////////////////////////////////// +// Member Functions +////////////////////////////////////////////////////////////////////// + +void CDesktopPet::Draw( int nImage ) +{ + //grab the device context of the desktop + HDC hDC = GetDC( m_hWndDesktop ); + + //draw the icon on it + DrawIconEx( hDC, m_ptPosition.x, m_ptPosition.y, m_hIcons[nImage], m_sizeImage.cx, m_sizeImage.cy, 0, NULL, DI_NORMAL ); + + //release the device context + ReleaseDC( m_hWndDesktop, hDC ); + + //increment the update counter and update if required + if( ++m_nUpdateHWndCounter > UPDATE_COUNTER_MAX ) + { + FindDesktopHandle(); + GetDesktopRect( m_rcBounds ); + } +} + +void CDesktopPet::Erase() +{ + //set up rect to be erased + RECT rcErase = { m_ptOldPosition.x, m_ptOldPosition.y, + m_ptOldPosition.x + m_sizeImage.cx, m_ptOldPosition.y + m_sizeImage.cy }; + + //invalidate it and tell it to update + InvalidateRect( m_hWndDesktop, &rcErase, TRUE ); + UpdateWindow( m_hWndDesktop ); +} + +void CDesktopPet::DrawOnTarget( int x, int y, HICON hIcon ) +{ + //grab the device context of the desktop + HDC hDC = GetDC( m_hWndDesktop ); + + //draw the icon on it + DrawIconEx( hDC, x, y, hIcon, 0, 0, 0, NULL, DI_NORMAL ); + + //release the device context + ReleaseDC( m_hWndDesktop, hDC ); +} + diff --git a/nkosrc4/Neko98/DesktopPet.h b/nkosrc4/Neko98/DesktopPet.h new file mode 100755 index 0000000..7bafefe --- /dev/null +++ b/nkosrc4/Neko98/DesktopPet.h @@ -0,0 +1,29 @@ +// DesktopPet.h: interface for the CDesktopPet class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_DESKTOPPET_H__A69EBAA3_385D_11D2_9FF9_00001C192944__INCLUDED_) +#define AFX_DESKTOPPET_H__A69EBAA3_385D_11D2_9FF9_00001C192944__INCLUDED_ + +#if _MSC_VER >= 1000 +#pragma once +#endif // _MSC_VER >= 1000 + +#include "Pet.h" +#include "DesktopHack.h" + +class CDesktopPet : public CDesktopHack, virtual public CPet +{ +public: + CDesktopPet(); + virtual ~CDesktopPet(); + + virtual void DrawOnTarget( int x, int y, HICON hIcon ); + +protected: + int m_nUpdateHWndCounter; + virtual void Erase(); + virtual void Draw( int nImage ); +}; + +#endif // !defined(AFX_DESKTOPPET_H__A69EBAA3_385D_11D2_9FF9_00001C192944__INCLUDED_) diff --git a/nkosrc4/Neko98/Neko.cpp b/nkosrc4/Neko98/Neko.cpp new file mode 100755 index 0000000..518e3fb --- /dev/null +++ b/nkosrc4/Neko98/Neko.cpp @@ -0,0 +1,651 @@ +// Neko.cpp: implementation of the CNeko class. +// +////////////////////////////////////////////////////////////////////// + +#include +#include "NekoCommon.h" +#include "NekoSettings.h" +#include "Neko.h" +#include "resource.h" +#include + +//maths calculations +#define g_dSinPiPer8 0.3826834323651 // sin [pi/8] +#define g_dSinPiPer8Times3 0.9238795325113 // sin ( [pi/8] x 3 ) + +//misc. constants +#define MAX_TICK 9999 //Odd Only + +//animation control constants +#define STOP_TIME 4 +#define WASH_TIME 10 +#define SCRATCH_TIME 4 +#define YAWN_TIME 3 +#define AWAKE_TIME 3 +#define CLAW_TIME 10 + +//external system variable +extern HINSTANCE g_hInstance; + + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CNeko::CNeko( char* lpszName ) +{ + //store pet + m_pPet = NULL; + + //plug icons into animation table + m_nAnimation[STOP][0] = 28; m_nAnimation[STOP][1] = 28; + m_nAnimation[WASH][0] = 25; m_nAnimation[WASH][1] = 28; + m_nAnimation[SCRATCH][0] = 26; m_nAnimation[SCRATCH][1] = 27; + m_nAnimation[YAWN][0] = 29; m_nAnimation[YAWN][1] = 29; + m_nAnimation[SLEEP][0] = 30; m_nAnimation[SLEEP][1] = 31; + m_nAnimation[AWAKE][0] = 0; m_nAnimation[AWAKE][1] = 0; + m_nAnimation[U_MOVE][0] = 1; m_nAnimation[U_MOVE][1] = 2; + m_nAnimation[D_MOVE][0] = 9; m_nAnimation[D_MOVE][1] = 10; + m_nAnimation[L_MOVE][0] = 13; m_nAnimation[L_MOVE][1] = 14; + m_nAnimation[R_MOVE][0] = 5; m_nAnimation[R_MOVE][1] = 6; + m_nAnimation[UL_MOVE][0] = 15; m_nAnimation[UL_MOVE][1] = 16; + m_nAnimation[UR_MOVE][0] = 3; m_nAnimation[UR_MOVE][1] = 4; + m_nAnimation[DL_MOVE][0] = 11; m_nAnimation[DL_MOVE][1] = 12; + m_nAnimation[DR_MOVE][0] = 7; m_nAnimation[DR_MOVE][1] = 8; + m_nAnimation[U_CLAW][0] = 17; m_nAnimation[U_CLAW][1] = 18; + m_nAnimation[D_CLAW][0] = 23; m_nAnimation[D_CLAW][1] = 24; + m_nAnimation[L_CLAW][0] = 21; m_nAnimation[L_CLAW][1] = 22; + m_nAnimation[R_CLAW][0] = 19; m_nAnimation[R_CLAW][1] = 20; + + //set variables + m_nDX = m_nDY = 0; + strcpy( m_szName, lpszName ); + m_dwSpeed = 16; + m_dwIdleSpace = 6; + m_Action = CHASE_MOUSE; + m_nActionCount = 0; + *m_szFootprintLibname = '\0'; + *m_szLibname = '\0'; + m_bFootprints = FALSE; + + strcpy( m_szSndIdle1, "" ); + strcpy( m_szSndIdle2, "" ); + strcpy( m_szSndIdle3, "" ); + strcpy( m_szSndSleep, "" ); + strcpy( m_szSndAwake, "" ); + m_dwSndFrequency = 0; + m_dwScale = 100; + + //build configuration registry key + char szKey[1024]; + strcpy( szKey, szNekoRegKey ); + if( strlen( m_szName ) > 0 ) + { + strcat( szKey, "\\" ); + strcat( szKey, m_szName ); + } + + //load configuration + CNekoSettings NekoSettings( szKey, (strlen(m_szName) == 0) ); + if( NekoSettings.IsOpen() ) + { + //load in all of the settings + NekoSettings.GetInt( szNekoScaleKey, &m_dwScale ); + NekoSettings.GetInt( szNekoSpeedKey, &m_dwSpeed ); + NekoSettings.GetInt( szNekoSenseKey, &m_dwIdleSpace ); + NekoSettings.GetString( szNekoLibraryKey, m_szLibname, MAX_PATH-1 ); + NekoSettings.GetString( szNekoSndIdle1Key, m_szSndIdle1, MAX_PATH-1 ); + NekoSettings.GetString( szNekoSndIdle2Key, m_szSndIdle2, MAX_PATH-1 ); + NekoSettings.GetString( szNekoSndIdle3Key, m_szSndIdle3, MAX_PATH-1 ); + NekoSettings.GetString( szNekoSndSleepKey, m_szSndSleep, MAX_PATH-1 ); + NekoSettings.GetString( szNekoSndAwakeKey, m_szSndAwake, MAX_PATH-1 ); + NekoSettings.GetInt( szNekoSndFreqKey, &m_dwSndFrequency ); + NekoSettings.GetBool( szNekoFootprintKey, &m_bFootprints ); + NekoSettings.GetString( szNekoFootprintLibKey, m_szFootprintLibname, MAX_PATH-1 ); + + DWORD dwAction = m_Action; + NekoSettings.GetInt( szNekoActionKey, &dwAction ); + m_Action = dwAction; + + + DWORD bAlwaysOnTop = FALSE; + NekoSettings.GetInt( szNekoOnTopKey, &bAlwaysOnTop ); + + //create the correct pet + if( bAlwaysOnTop ) + m_pPet = new CAlwaysOnTopPet(); + else + m_pPet = new CDesktopPet(); + + } + else + { + //configuration didn't open... create a desktop pet only + m_pPet = new CDesktopPet(); + } + + //initialse footprint icons + for( int i = 0; i < 8; i++ ) m_hIconFootprints[i] = NULL; + + //apply scaling + m_pPet->SetScale( ((float)m_dwScale / 100.0f ) ); + + //load the images + BOOL fLoadProblems = FALSE; + if( m_szLibname == NULL || *m_szLibname == '\0' || ((int)ExtractIcon( g_hInstance, m_szLibname, -1 ) < 32 )) + { + //use default images if there is no file or not enough icons + GetModuleFileName( NULL, m_szLibname, MAX_PATH ); + fLoadProblems = !LoadImages(); + } + else + { + //load all the icons in the file + fLoadProblems = !LoadImages(); + if( fLoadProblems ) + { + //use default images if it fails with the user's choice + GetModuleFileName( NULL, m_szLibname, MAX_PATH ); + fLoadProblems = !LoadImages(); + } + } + + /* FIXME: + + It appears that Windows offers no support for ExtractIcon + on icons that are not 32x32 - this means that all icon + libraries selected by the user to use will have their icons + scaled down to 32x32. I have tried the following: + + 1) Used LoadLibrary() to load the icon library chosen. This + worked on some, but not all. I then used LoadLibraryEx() + and passed it the 'don't call DllMain' flags. This caused + the libraries that weren't working to work, and vice-versa. + + 2) After LoadLibrary(), attempting to load all resource IDs + until 32 valid icons were loaded. This nearly worked, but + took ages and was therefor unacceptable. It also failed + with LoadLibrary() as in 1. + + 3) Tried EnumResourceNames() for all icons. It only loaded some + of them and then gave up. At this point, so did I. + + Result: It is only possible to use 32x32 icons in Neko, although + these can be scaled up or down as required, resulting in blockyness + etc. + + */ + + //set initial state + SetState( STOP ); + + //set initial action + m_nActionX = m_pPet->GetBoundsRect().left + ( rand() % (m_pPet->GetBoundsRect().right-(m_dwSpeed * 8)) ); + m_nActionY = m_pPet->GetBoundsRect().top + ( rand() % (m_pPet->GetBoundsRect().bottom-(m_dwSpeed * 8)) ); + m_nActionDX = ((( rand() % 2 ) ? 1 : -1) * (m_dwSpeed/2)) + 1; + m_nActionDY = ((( rand() % 2 ) ? 1 : -1) * (m_dwSpeed/2)) + 1; + + //set initial position (random) + m_nToX = m_pPet->GetBoundsRect().left + ( rand() % ( (m_pPet->GetBoundsRect().right- m_pPet->GetSize().cx) - m_pPet->GetBoundsRect().left ) ) ; + m_nToY = m_pPet->GetBoundsRect().top + ( rand() % ( (m_pPet->GetBoundsRect().bottom - m_pPet->GetSize().cy) - m_pPet->GetBoundsRect().top ) ); + + m_pPet->MoveTo( m_nToX, m_nToY ); + + //deal with error (fixme?) + /* + if( fLoadProblems ) + throw ICON_EXCEPTION; + */ +} + +CNeko::~CNeko() +{ + delete m_pPet; + for( int i = 0; i < 8; i++ ) if( m_hIconFootprints[i] ) DestroyIcon( m_hIconFootprints[i] ); +} + +BOOL CNeko::MoveStart() +{ + return( !(( m_nOldToX >= m_nToX-(int)m_dwIdleSpace ) && + ( m_nOldToX <= m_nToX+(int)m_dwIdleSpace ) && + ( m_nOldToY >= m_nToY-(int)m_dwIdleSpace ) && + ( m_nOldToY <= m_nToY+(int)m_dwIdleSpace ))); +} + +void CNeko::CalcDirection() +{ + State NewState; + double LargeX, LargeY, Length, SinTheta; + + if( (m_nDX == 0) && (m_nDY == 0) ) + NewState = STOP; + else + { + LargeX = (double)m_nDX; + LargeY = (double)(-m_nDY); + Length = sqrt(LargeX * LargeX + LargeY * LargeY); + SinTheta = LargeY / Length; + + if( m_nDX > 0 ) + { + if( SinTheta > g_dSinPiPer8Times3 ) + NewState = U_MOVE; + else + if( (SinTheta <= g_dSinPiPer8Times3 ) && ( SinTheta > g_dSinPiPer8 ) ) + NewState = UR_MOVE; + else + if( (SinTheta <= g_dSinPiPer8) && (SinTheta > -(g_dSinPiPer8) ) ) + NewState = R_MOVE; + else + if( (SinTheta <= -(g_dSinPiPer8) ) && (SinTheta > -(g_dSinPiPer8Times3) ) ) + NewState = DR_MOVE; + else + NewState = D_MOVE; + } + else + { + if( SinTheta > g_dSinPiPer8Times3 ) + NewState = U_MOVE; + else + if( (SinTheta <= g_dSinPiPer8Times3) && (SinTheta > g_dSinPiPer8) ) + NewState = UL_MOVE; + else + if( (SinTheta <= g_dSinPiPer8) && (SinTheta > -(g_dSinPiPer8) ) ) + NewState = L_MOVE; + else + if( (SinTheta <= -(g_dSinPiPer8)) && (SinTheta > -(g_dSinPiPer8Times3) ) ) + NewState = DL_MOVE; + else + NewState = D_MOVE; + } + } + + if( m_State != NewState ) SetState( NewState ); + +} + +void CNeko::RunTowards(int nX, int nY) +{ + //store old and new target + m_nOldToX = m_nToX; m_nOldToY = m_nToY; + m_nToX = nX; m_nToY = nY; + + //calculate distance to target and set delta positions + double dLargeX, dLargeY, dDoubleLength, dLength; + dLargeX = (double)(m_nToX - m_pPet->GetPosition().x - (int)m_pPet->GetSize().cx / 2); //stop in middle of cursor + dLargeY = (double)(m_nToY - m_pPet->GetPosition().y - (int)m_pPet->GetSize().cy + 1); //...and just above + dDoubleLength = dLargeX * dLargeX + dLargeY * dLargeY; + + if( dDoubleLength != 0.0 ) + { + dLength = sqrt( dDoubleLength ); + if( dLength <= (int)m_dwSpeed ) + { + //less than top speed - jump the gap! + m_nDX = (int)dLargeX; + m_nDY = (int)dLargeY; + } + else + { + //more than top speed - run at top speed towards target + m_nDX = (int)(((int)m_dwSpeed * dLargeX) / dLength ); + m_nDY = (int)(((int)m_dwSpeed * dLargeY) / dLength ); + } + } + else //we're at the target - stop + m_nDX = m_nDY = 0; + + //increment animation counter + if ( ++m_uTickCount >= MAX_TICK ) m_uTickCount = 0; + + if ( m_uTickCount%2 == 0 ) + if (m_uStateCount < MAX_TICK) m_uStateCount++; + + //change state + switch( m_State ) + { + case STOP: + if( MoveStart() ) + SetState( AWAKE ); + else + if( m_uStateCount >= STOP_TIME ) + if( m_nDX < 0 && m_pPet->GetPosition().x <= 0 ) SetState( L_CLAW ); + else + if( m_nDX > 0 && m_pPet->GetPosition().x >= ( m_pPet->GetBoundsRect().right - m_pPet->GetBoundsRect().left ) - m_pPet->GetSize().cx ) SetState( R_CLAW ); + else + if( m_nDY < 0 && m_pPet->GetPosition().y <= 0 ) SetState( U_CLAW ); + else + if( m_nDY > 0 && m_pPet->GetPosition().y >= ( m_pPet->GetBoundsRect().bottom - m_pPet->GetBoundsRect().top ) - m_pPet->GetSize().cy ) SetState( D_CLAW ); + else SetState( WASH ); + m_pPet->SetImage( GetStateAnimationFrameIndex() ); + break; + + case WASH: + if( MoveStart() ) SetState( AWAKE ); + else if( m_uStateCount >= WASH_TIME ) SetState( SCRATCH ); + m_pPet->SetImage( GetStateAnimationFrameIndex() ); + break; + + case SCRATCH: + if( MoveStart() ) SetState( AWAKE ); + else if (m_uStateCount >= SCRATCH_TIME ) SetState( YAWN ); + m_pPet->SetImage( GetStateAnimationFrameIndex() ); + break; + + case YAWN: + if( MoveStart() ) SetState( AWAKE ); + else if (m_uStateCount >= YAWN_TIME) SetState( SLEEP ); + m_pPet->SetImage( GetStateAnimationFrameIndex() ); + break; + + case SLEEP: + if( MoveStart() ) SetState( AWAKE ); + m_pPet->SetImage( GetStateAnimationFrameIndex() ); + break; + + case AWAKE: + if( m_uStateCount >= (UINT)(AWAKE_TIME + (rand()%20)) ) CalcDirection(); + m_pPet->SetImage( GetStateAnimationFrameIndex() ); + break; + + case U_MOVE: + case D_MOVE: + case L_MOVE: + case R_MOVE: + case UL_MOVE: + case UR_MOVE: + case DL_MOVE: + case DR_MOVE: + { + //make sure Neko does not go outside boundary area + int nX = m_pPet->GetPosition().x, nY = m_pPet->GetPosition().y; + int nNewX = nX + m_nDX, nNewY = nY + m_nDY; + int nWidth = ( m_pPet->GetBoundsRect().right - m_pPet->GetBoundsRect().left ) - m_pPet->GetSize().cx; + int nHeight = ( m_pPet->GetBoundsRect().bottom - m_pPet->GetBoundsRect().top ) - m_pPet->GetSize().cy; + BOOL fOutside = ( nNewX <= 0 || nNewX >= nWidth || nNewY <= 0 || nNewY >= nHeight ); + + //change the image and move Neko + CalcDirection(); + + //clip new x and y positions and see if we've moved anywhere + if( nNewX < 0 ) nNewX = 0; else if( nNewX > nWidth ) nNewX = nWidth; + if( nNewY < 0 ) nNewY = 0; else if( nNewY > nHeight ) nNewY = nHeight; + BOOL fNotMoved = ( nNewX == nX ) && ( nNewY == nY ); + + //stop if we can't go any further + if( fOutside && fNotMoved ) + SetState(STOP); + else + { + m_pPet->SetImageAndMoveTo( GetStateAnimationFrameIndex(), nNewX, nNewY ); + if( m_bFootprints ) + { + int iFpAnim = -1; + switch( m_State ) + { + case U_MOVE: iFpAnim = 0; break; + case D_MOVE: iFpAnim = 4; break; + case L_MOVE: iFpAnim = 6; break; + case R_MOVE: iFpAnim = 2; break; + case UL_MOVE: iFpAnim = 7; break; + case UR_MOVE: iFpAnim = 1; break; + case DL_MOVE: iFpAnim = 5; break; + case DR_MOVE: iFpAnim = 3; break; + } + if( iFpAnim != -1 ) + { + if( m_uTickCount & 1 ) + m_pPet->DrawOnTarget( nX-(m_nDY/2), nY, m_hIconFootprints[iFpAnim] ); + else + m_pPet->DrawOnTarget( nX, nY-(m_nDX/2), m_hIconFootprints[iFpAnim] ); + } + } + } + break; + } + + case U_CLAW: + case D_CLAW: + case L_CLAW: + case R_CLAW: + if( MoveStart() ) SetState( AWAKE ); + else if( m_uStateCount >= CLAW_TIME ) SetState( SCRATCH ); + m_pPet->SetImage( GetStateAnimationFrameIndex() ); + break; + + default: + //something bad has happened! + MessageBeep( 0xFFFFFFFF ); + SetState( STOP ); + m_pPet->SetImage( GetStateAnimationFrameIndex() ); + break; + } +} + +int CNeko::GetStateAnimationFrameIndex() +{ + if ( m_State != SLEEP ) + return m_nAnimation[m_State][m_uTickCount & 0x1]; + else + return m_nAnimation[m_State][(m_uTickCount>>2) & 0x1]; + +} + +void CNeko::SetState( State state ) +{ + //reset the animation counters + m_uTickCount = 0; + m_uStateCount = 0; + + //update the state + m_State = state; +} + + +BOOL CNeko::LoadImages() +{ + /* Note: The icons should be in the following order in the file: + + Awake + Up 1 + Up 2 + Up Right 1 + Up Right 2 + Right 1 + Right 2 + Down Right 1 + Down Right 2 + Down 1 + Down 2 + Down Left 1 + Down Left 2 + Left 1 + Left 2 + Up Left 1 + Up Left 2 + Up Claw 1 + Up Claw 2 + Right Claw 1 + Right Claw 2 + Left Claw 1 + Left Claw 2 + Down Claw 1 + Down Claw 2 + Wash 2 + Scratch 1 + Scratch 2 + Yawn 1 + Yawn 2 + Sleep 1 + Sleep 2 + */ + + //load the icons + int n; + HICON hIcons[32]; + for( n = 0; n < 32; n++ ) + hIcons[n] = ExtractIcon( g_hInstance, m_szLibname, n ); + + //check last icon + if( (UINT)hIcons[31] <= 1 ) + { + //error - delete all icons + for( n = 0; n < 32; n++ ) DestroyIcon( hIcons[n] ); + + char szBuffer[1024]; + wsprintf( szBuffer, "There are not enough icons in this icon library\n%s\nIt must contain at least 32 icons", m_szLibname ); + MessageBox( NULL, szBuffer, "Error", MB_ICONERROR|MB_TASKMODAL ); + return FALSE; + } + + //apply icons + m_pPet->SetImages( hIcons, 32 ); + + //destroy icon table + for( n = 0; n < 32; n++ ) DestroyIcon( hIcons[n] ); + + //load footprints + if( m_bFootprints ) + { + if( *m_szFootprintLibname ) + for( n = 0; n < 8; n++ ) m_hIconFootprints[n] = ExtractIcon( g_hInstance, m_szFootprintLibname, n ); + else + { + UINT uID[] = { IDI_FP_UP, IDI_FP_UPRIGHT, IDI_FP_RIGHT, IDI_FP_DOWNRIGHT, IDI_FP_DOWN, IDI_FP_DOWNLEFT, IDI_FP_LEFT, IDI_FP_UPLEFT }; + for( n = 0; n < 8; n++ ) m_hIconFootprints[n] = LoadIcon( g_hInstance, MAKEINTRESOURCE(uID[n]) ); + } + } + + return TRUE; +} + +/********************************************************************************************************/ + +void CNeko::Update() +{ + //apply VVPAI (very, very poor artificial intelligence!!!) + switch( m_Action ) + { + default: + case CHASE_MOUSE: + { + POINT pt; + GetCursorPos( &pt ); + RunTowards( pt.x, pt.y ); + break; + } + + case RUN_AWAY_FROM_MOUSE: + { + POINT pt; + int xdiff, ydiff; + GetCursorPos( &pt ); + DWORD dwLimit = m_dwIdleSpace*16; + + xdiff = ( m_pPet->GetPosition().x + (m_pPet->GetSize().cx/2) ) - pt.x; + ydiff = ( m_pPet->GetPosition().y + (m_pPet->GetSize().cy/2) ) - pt.y; + + if( abs(xdiff) < (int)dwLimit && abs(ydiff) < (int)dwLimit ) + { + //mouse cursor is too close + int x, y; + double dLength = sqrt(xdiff*xdiff + ydiff*ydiff); + if( dLength != 0.0 ) + { + x = m_pPet->GetPosition().x + (int)((xdiff / dLength) * dwLimit); + y = m_pPet->GetPosition().y + (int)((ydiff / dLength) * dwLimit); + } + else + x = y = 32; + + //make Neko run away from the mouse + RunTowards( x, y ); + if( m_State == AWAKE ) CalcDirection(); //don't show awake animation + } + else + RunTowards( m_nToX, m_nToY ); //keep running... + break; + } + + case RUN_AROUND_RANDOMLY: + { + if( m_State == SLEEP) m_nActionCount++; + if( m_nActionCount > (int)m_dwIdleSpace*10 ) + { + m_nActionCount = 0; + RunTowards( m_pPet->GetBoundsRect().left + (rand() % (m_pPet->GetBoundsRect().right-m_pPet->GetBoundsRect().left)), m_pPet->GetBoundsRect().top + (rand() % (m_pPet->GetBoundsRect().bottom-m_pPet->GetBoundsRect().top)) ); + } + else + RunTowards( m_nToX, m_nToY ); + break; + } + + case PACE_AROUND_SCREEN: + { + if( (m_nDX == 0) && (m_nDY == 0) ) m_nActionCount = ( m_nActionCount + 1 ) % 4; + switch( m_nActionCount ) + { + case 0: RunTowards( m_pPet->GetBoundsRect().left + m_pPet->GetSize().cx, m_pPet->GetBoundsRect().top + m_pPet->GetSize().cy ); break; + case 1: RunTowards( m_pPet->GetBoundsRect().left + m_pPet->GetSize().cx, m_pPet->GetBoundsRect().bottom - m_pPet->GetSize().cy ); break; + case 2: RunTowards( m_pPet->GetBoundsRect().right - m_pPet->GetSize().cx, m_pPet->GetBoundsRect().bottom - m_pPet->GetSize().cy ); break; + case 3: RunTowards( m_pPet->GetBoundsRect().right - m_pPet->GetSize().cx, m_pPet->GetBoundsRect().top + m_pPet->GetSize().cy ); break; + } + break; + } + + case RUN_AROUND: + { + //bounding box repel border + DWORD dwBoundingBox = m_dwSpeed * 8; + + //move invisible ball + m_nActionX += m_nActionDX; + m_nActionY += m_nActionDY; + + //repel invisible ball from the edges of the screen. + if( m_nActionX < (int)(m_pPet->GetBoundsRect().left + dwBoundingBox) ) + if( m_nActionX > m_pPet->GetBoundsRect().left ) m_nActionDX++; else m_nActionDX = -m_nActionDX; + else + if( m_nActionX > (int)(m_pPet->GetBoundsRect().right - dwBoundingBox) ) + if( m_nActionX < m_pPet->GetBoundsRect().right ) m_nActionDX--; else m_nActionDX = -m_nActionDX; + + if( m_nActionY < (int)(m_pPet->GetBoundsRect().top + dwBoundingBox) ) + if( m_nActionY > m_pPet->GetBoundsRect().top ) m_nActionDY++; else m_nActionDY = -m_nActionDY; + else + if( m_nActionY > (int)(m_pPet->GetBoundsRect().bottom - dwBoundingBox) ) + if( m_nActionY < m_pPet->GetBoundsRect().bottom ) m_nActionDY--; else m_nActionDY = -m_nActionDY; + + //tell Neko to run towards the new point + RunTowards( m_nActionX, m_nActionY ); + break; + } + } + + //play idle sounds + if( m_dwSndFrequency ) + { + if( (DWORD)(rand()%100) <= m_dwSndFrequency ) + { + switch( GetState() ) + { + case AWAKE: + PlaySound( m_szSndAwake, NULL, SND_NOSTOP|SND_NOWAIT|SND_FILENAME|SND_NODEFAULT|SND_ASYNC ); + break; + + case SLEEP: + PlaySound( m_szSndSleep, NULL, SND_NOSTOP|SND_NOWAIT|SND_FILENAME|SND_NODEFAULT|SND_ASYNC ); + break; + + default: + switch( rand()%3 ) + { + case 0: PlaySound( m_szSndIdle1, NULL, SND_NOSTOP|SND_NOWAIT|SND_FILENAME|SND_NODEFAULT|SND_ASYNC ); break; + case 1: PlaySound( m_szSndIdle2, NULL, SND_NOSTOP|SND_NOWAIT|SND_FILENAME|SND_NODEFAULT|SND_ASYNC ); break; + default: PlaySound( m_szSndIdle3, NULL, SND_NOSTOP|SND_NOWAIT|SND_FILENAME|SND_NODEFAULT|SND_ASYNC ); break; + } + break; + } + } + } +} + diff --git a/nkosrc4/Neko98/Neko.h b/nkosrc4/Neko98/Neko.h new file mode 100755 index 0000000..3f864ff --- /dev/null +++ b/nkosrc4/Neko98/Neko.h @@ -0,0 +1,81 @@ +// Neko.h: interface for the CNeko class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_NEKO_H__A69EBAA5_385D_11D2_9FF9_00001C192944__INCLUDED_) +#define AFX_NEKO_H__A69EBAA5_385D_11D2_9FF9_00001C192944__INCLUDED_ + +#if _MSC_VER >= 1000 +#pragma once +#endif // _MSC_VER >= 1000 + +#include "DesktopPet.h" +#include "AlwaysOnTopPet.h" +#include "NekoCommon.h" + +class CNeko { + +public: + CNeko( char* pszName = "" ); + virtual ~CNeko(); + + //public interface + virtual void Update(); + virtual void RunTowards( int nX, int nY ); + +protected: + + //states. (note: I know that the numbering is unnecessary, but you never know... - these MUST go from 0-17) + enum State { STOP = 0, WASH = 1, SCRATCH = 2, YAWN = 3, SLEEP = 4, AWAKE = 5, U_MOVE = 6, + D_MOVE = 7, L_MOVE = 8, R_MOVE = 9, UL_MOVE = 10, UR_MOVE = 11, DL_MOVE = 12, + DR_MOVE = 13, U_CLAW = 14, D_CLAW = 15, L_CLAW = 16, R_CLAW = 17 }; + + //position info + int m_nDX, m_nDY; + int m_nOldToX, m_nOldToY; + int m_nToX, m_nToY; + + //size info + DWORD m_dwScale; + + //state info + UINT m_uTickCount, m_uStateCount; + State m_State; + + //action info + int m_Action; + int m_nActionCount; + int m_nActionX, m_nActionY, m_nActionDX, m_nActionDY; + + //attributes + DWORD m_dwSpeed; + DWORD m_dwIdleSpace; + char m_szLibname[MAX_PATH]; + char m_szFootprintLibname[MAX_PATH]; + BOOL m_bFootprints; + + //sound stuff + char m_szSndIdle1[MAX_PATH], m_szSndIdle2[MAX_PATH], m_szSndIdle3[MAX_PATH]; + char m_szSndSleep[MAX_PATH], m_szSndAwake[MAX_PATH]; + DWORD m_dwSndFrequency; + + //named Neko stuff + char m_szName[MAX_NEKO_NAME]; + + //animation lookup table + int m_nAnimation[18][2]; + + State GetState() { return m_State; } + + HICON m_hIconFootprints[8]; + +private: + CPet* m_pPet; + BOOL LoadImages(); + int GetStateAnimationFrameIndex(); + void CalcDirection(); + BOOL MoveStart(); + void SetState( State state ); +}; + +#endif // !defined(AFX_NEKO_H__A69EBAA5_385D_11D2_9FF9_00001C192944__INCLUDED_) diff --git a/nkosrc4/Neko98/Neko95.rc b/nkosrc4/Neko98/Neko95.rc new file mode 100755 index 0000000..d17ee4f --- /dev/null +++ b/nkosrc4/Neko98/Neko95.rc @@ -0,0 +1,169 @@ +//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 + +///////////////////////////////////////////////////////////////////////////// +// Neutral resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) +#ifdef _WIN32 +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +#pragma code_page(1252) +#endif //_WIN32 + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "080904b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "DHSoft\0" + VALUE "FileDescription", "Neko for Windows\0" + VALUE "FileVersion", "4.0h\0" + VALUE "InternalName", "Neko\0" + VALUE "LegalCopyright", "Copyright © 1999\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "Neko98.exe\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "Neko98\0" + VALUE "ProductVersion", "4.0h\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x809, 1200 + END +END + +#endif // !_MAC + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_AWAKE ICON DISCARDABLE "Res\\Awake.ico" +IDI_UP1 ICON DISCARDABLE "Res\\Up1.ico" +IDI_UP2 ICON DISCARDABLE "Res\\Up2.ico" +IDI_UPRIGHT1 ICON DISCARDABLE "Res\\Upright1.ico" +IDI_UPRIGHT2 ICON DISCARDABLE "Res\\Upright2.ico" +IDI_RIGHT1 ICON DISCARDABLE "Res\\Right1.ico" +IDI_RIGHT2 ICON DISCARDABLE "Res\\right2.ico" +IDI_DOWNRIGHT1 ICON DISCARDABLE "Res\\Downright1.ico" +IDI_DOWNRIGHT2 ICON DISCARDABLE "Res\\downright2.ico" +IDI_DOWN1 ICON DISCARDABLE "Res\\Down1.ico" +IDI_DOWN2 ICON DISCARDABLE "Res\\down2.ico" +IDI_DOWNLEFT1 ICON DISCARDABLE "Res\\downleft1.ico" +IDI_DOWNLEFT2 ICON DISCARDABLE "Res\\Downleft2.ico" +IDI_LEFT1 ICON DISCARDABLE "Res\\left1.ico" +IDI_LEFT2 ICON DISCARDABLE "Res\\left2.ico" +IDI_UPLEFT1 ICON DISCARDABLE "Res\\Upleft1.ico" +IDI_UPLEFT2 ICON DISCARDABLE "Res\\Upleft2.ico" +IDI_UPCLAW1 ICON DISCARDABLE "Res\\upclaw1.ico" +IDI_UPCLAW2 ICON DISCARDABLE "Res\\upclaw2.ico" +IDI_RIGHTCLAW1 ICON DISCARDABLE "Res\\rightclaw1.ico" +IDI_RIGHTCLAW2 ICON DISCARDABLE "Res\\Rightclaw2.ico" +IDI_LEFTCLAW1 ICON DISCARDABLE "Res\\leftclaw1.ico" +IDI_LEFTCLAW2 ICON DISCARDABLE "Res\\leftclaw2.ico" +IDI_DOWNCLAW1 ICON DISCARDABLE "Res\\downclaw1.ico" +IDI_DOWNCLAW2 ICON DISCARDABLE "Res\\downclaw2.ico" +IDI_WASH2 ICON DISCARDABLE "Res\\wash2.ico" +IDI_SCRATCH1 ICON DISCARDABLE "Res\\scratch1.ico" +IDI_SCRATCH2 ICON DISCARDABLE "Res\\scratch2.ico" +IDI_YAWN2 ICON DISCARDABLE "Res\\yawn2.ico" +IDI_YAWN3 ICON DISCARDABLE "Res\\yawn3.ico" +IDI_SLEEP1 ICON DISCARDABLE "Res\\sleep1.ico" +IDI_SLEEP2 ICON DISCARDABLE "Res\\sleep2.ico" +IDI_FP_UP ICON DISCARDABLE "Res\\fp_up.ico" +IDI_FP_UPRIGHT ICON DISCARDABLE "Res\\fp_upright.ico" +IDI_FP_RIGHT ICON DISCARDABLE "Res\\fp_right.ico" +IDI_FP_DOWNRIGHT ICON DISCARDABLE "Res\\fp_downright.ico" +IDI_FP_DOWN ICON DISCARDABLE "Res\\fp_down.ico" +IDI_FP_DOWNLEFT ICON DISCARDABLE "Res\\fp_downleft.ico" +IDI_FP_LEFT ICON DISCARDABLE "Res\\fp_left.ico" +IDI_FP_UPLEFT ICON DISCARDABLE "Res\\fp_upleft.ico" +#endif // Neutral resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (U.K.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK +#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 + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.K.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/nkosrc4/Neko98/Neko98.cpp b/nkosrc4/Neko98/Neko98.cpp new file mode 100755 index 0000000..b7d8ede --- /dev/null +++ b/nkosrc4/Neko98/Neko98.cpp @@ -0,0 +1,246 @@ +/************************************ + Neko for Windows + *************************************/ + +#include +#include +#include +#include +#include "Tray.h" +#include "NekoSettings.h" +#include "NekoCommon.h" +#include "resource.h" +#include "Neko.h" + +//global variables +HINSTANCE g_hInstance = NULL; +HWND g_hWndMain = NULL; +BOOL g_fTaskbar = TRUE; +CTray * Tray = NULL; + +int g_nNumCats = 0; +typedef CNeko* PNeko; +PNeko* g_NekoArray = NULL; //array of CNeko pointers +DWORD g_dwSleepTime = 100; + +BOOL g_fNeedReinit = TRUE; + + +/* ExecuteConfigProcess - runs the configuration program *******************************/ +void ExecuteConfigProcess() +{ + if( (int)ShellExecute( NULL, "open", "NekoCFG.EXE", 0, "", SW_SHOWNORMAL ) <= 32 ) + MessageBox( NULL, "Neko was unable to start the configuration program\n'NekoCFG.EXE'\n\nMake sure that this file is in the same folder as the main Neko program.", "Configure Neko", MB_ICONEXCLAMATION ); +} + + + +/* LoadConfiguration - reloads the program configuration *******************************/ +void LoadConfiguration() +{ + //load in the new global settings + CNekoSettings * NekoSettings = new CNekoSettings( szNekoRegKey ); + NekoSettings->GetBool( szNekoTaskbarKey, &g_fTaskbar ); + + //delete all existing Nekos + int i; + for( i = 0; i < g_nNumCats; i++ ) delete g_NekoArray[i]; + delete[] g_NekoArray; + + //load in new cats list + DWORD dwNumCats = 0; + NekoSettings->GetInt( szNekoNumCatsKey, &dwNumCats ); + g_nNumCats = dwNumCats; + + if( g_nNumCats == 0 ) + { + //the user hasn't run the config program, or there are no Nekos - use default + g_NekoArray = new PNeko[1]; + g_NekoArray[0] = new CNeko(); + g_nNumCats = 1; + } + else + { + g_NekoArray = new PNeko[g_nNumCats]; + for( i = 0; i < g_nNumCats; i++ ) + { + //build the key index + char szSubKey[MAX_PATH], szName[MAX_NEKO_NAME]; + sprintf( szSubKey, "%d", i ); + + //load this cat's name from the registry + NekoSettings->GetString( szSubKey, szName, MAX_NEKO_NAME-1 ); + + //add this Neko to the array + g_NekoArray[i] = new CNeko( szName ); + } + } + + //erase the Neko settings + delete NekoSettings; + + //calculate new sleep time + g_dwSleepTime = 100; + if( g_nNumCats <= 20 ) g_dwSleepTime = 200 - ( 5 * g_nNumCats ); + + //update task bar + if( g_fTaskbar ) + { + if( Tray->GetCount() == 0 ) + Tray->AddIcon( g_hWndMain, LoadIcon( g_hInstance, MAKEINTRESOURCE( IDI_AWAKE )), 1 ); + } + else + { + if( Tray->GetCount() > 0 ) + Tray->RemoveIcon( g_hWndMain, 1 ); + } + +} + + +/* WndProc - message processing function for the hidden Neko window ********************/ +LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) +{ + switch( message ) + { + case WM_DESTROY: + //terminate the program + PostQuitMessage( 0 ); + break; + + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case ID_SETTINGS: + ExecuteConfigProcess(); + break; + + case ID_EXIT: + PostQuitMessage( 0 ); + break; + } + break; + + case WM_DEVMODECHANGE: + case WM_DISPLAYCHANGE: + case WM_SETTINGCHANGE: + case MY_UPDATENEKO: + g_fNeedReinit = TRUE; + break; + + case MY_NOTIFYICON: + switch( lParam ) + { + case WM_LBUTTONDBLCLK: + ExecuteConfigProcess(); + break; + + case WM_RBUTTONUP: + //this line is needed to make the menu go away! + //(from Windows Developer FAQ [Robert Mashlan]) + SetForegroundWindow( hWnd ); + + //show the context menu + Tray->ShowPopupMenu( hWnd ); + break; + } + break; + + case WM_TIMER: + { + //check to see if stuff needs reinitialisation + if( g_fNeedReinit ) + { + LoadConfiguration(); + g_fNeedReinit = FALSE; + } + + //update all Nekos + for( int i = 0; i < g_nNumCats; i++ ) g_NekoArray[i]->Update(); + break; + } + + default: + return DefWindowProc( hWnd, message, wParam, lParam ); + } + + return 0; +} + + +/* InitApplication - program initialisation function ***********************************/ +BOOL InitApplication( HINSTANCE hInstance ) +{ + //store the instance handle + g_hInstance = hInstance; + + //create the (hidden) window + WNDCLASS wc; + wc.style = 0; + wc.lpfnWndProc = (WNDPROC)WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = NULL; + wc.hCursor = NULL; + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wc.lpszMenuName = NULL; + wc.lpszClassName = szNekoClassName; + + if( RegisterClass(&wc) ) + { + //create the window + g_hWndMain = CreateWindow( szNekoClassName, szNekoWindowTitle, WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, NULL, NULL, hInstance, NULL); + + if( g_hWndMain == NULL ) return FALSE; + } + else + return FALSE; + + //initialise random number generator + srand( GetTickCount() ); + return TRUE; +} + + +/* WinMain - program entry point *******************************************************/ +int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) +{ + //check for previous version & unload both if it's found + HWND hWndOld = FindWindow( szNekoClassName, szNekoWindowTitle ); + if( hWndOld != NULL ) + { + PostMessage( hWndOld, WM_QUIT, 0, 0 ); + return FALSE; + } + + //initialise the program + if( !InitApplication( hInstance ) ) return FALSE; + + //create the tray object + Tray = new CTray( hInstance ); + + //set a timer to update Neko + SetTimer( g_hWndMain, ID_TIMER_NEKO, 200, NULL ); + + MSG msg; + while( GetMessage( &msg, NULL, 0, 0 ) ) + { + //pass the message onto our WndProc + TranslateMessage( &msg ); + DispatchMessage( &msg ); + } + + //remove the timer + KillTimer( g_hWndMain, ID_TIMER_NEKO ); + + //delete all Nekos + for( int i = 0; i < g_nNumCats; i++ ) delete g_NekoArray[i]; + delete[] g_NekoArray; + + //remove the taskbar icon + if( g_fTaskbar ) Tray->RemoveIcon( g_hWndMain, 1 ); + delete Tray; + + return msg.wParam; +} diff --git a/nkosrc4/Neko98/Neko98.dsp b/nkosrc4/Neko98/Neko98.dsp new file mode 100755 index 0000000..62d0709 --- /dev/null +++ b/nkosrc4/Neko98/Neko98.dsp @@ -0,0 +1,323 @@ +# Microsoft Developer Studio Project File - Name="Neko98" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=Neko98 - 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 "Neko98.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 "Neko98.mak" CFG="Neko98 - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Neko98 - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "Neko98 - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Neko98 - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# 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 /W3 /GX /O2 /Ob2 /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 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /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 odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /machine:I386 + +!ELSEIF "$(CFG)" == "Neko98 - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# 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 /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 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /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 odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "Neko98 - Win32 Release" +# Name "Neko98 - Win32 Debug" +# Begin Group "Resources" + +# PROP Default_Filter ".ico;.bmp;.rc" +# Begin Source File + +SOURCE=.\Res\Awake.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\Down1.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\down2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\downclaw1.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\downclaw2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\downleft1.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\Downleft2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\Downright1.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\downright2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\fp_down.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\fp_downleft.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\fp_downright.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\fp_left.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\fp_right.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\fp_up.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\fp_upleft.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\fp_upright.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\left1.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\left2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\leftclaw1.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\leftclaw2.ico +# End Source File +# Begin Source File + +SOURCE=.\Neko95.rc +# End Source File +# Begin Source File + +SOURCE=.\Res\Right1.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\right2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\rightclaw1.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\Rightclaw2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\scratch1.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\scratch2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\sleep1.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\sleep2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\Up1.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\Up2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\upclaw1.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\upclaw2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\Upleft1.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\Upleft2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\Upright1.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\Upright2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\wash2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\yawn2.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\yawn3.ico +# End Source File +# End Group +# Begin Source File + +SOURCE=.\AlwaysOnTopPet.cpp +# End Source File +# Begin Source File + +SOURCE=.\AlwaysOnTopPet.h +# End Source File +# Begin Source File + +SOURCE=.\DesktopHack.cpp +# End Source File +# Begin Source File + +SOURCE=.\DesktopHack.h +# End Source File +# Begin Source File + +SOURCE=.\DesktopPet.cpp +# End Source File +# Begin Source File + +SOURCE=.\DesktopPet.h +# End Source File +# Begin Source File + +SOURCE=.\Neko.cpp +# End Source File +# Begin Source File + +SOURCE=.\Neko.h +# End Source File +# Begin Source File + +SOURCE=.\Neko98.cpp +# End Source File +# Begin Source File + +SOURCE=.\NekoCommon.h +# End Source File +# Begin Source File + +SOURCE=.\NekoSettings.cpp +# End Source File +# Begin Source File + +SOURCE=.\NekoSettings.h +# End Source File +# Begin Source File + +SOURCE=.\Pet.cpp +# End Source File +# Begin Source File + +SOURCE=.\Pet.h +# End Source File +# Begin Source File + +SOURCE=.\Tray.cpp +# End Source File +# Begin Source File + +SOURCE=.\Tray.h +# End Source File +# End Target +# End Project diff --git a/nkosrc4/Neko98/Neko98.dsw b/nkosrc4/Neko98/Neko98.dsw new file mode 100755 index 0000000..ad84ba6 --- /dev/null +++ b/nkosrc4/Neko98/Neko98.dsw @@ -0,0 +1,41 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Neko98"=".\Neko98.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "NekoCFG"=".\NekoCFG\NekoCFG.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/nkosrc4/Neko98/NekoCFG/NekoCFG.cpp b/nkosrc4/Neko98/NekoCFG/NekoCFG.cpp new file mode 100755 index 0000000..7314c1a --- /dev/null +++ b/nkosrc4/Neko98/NekoCFG/NekoCFG.cpp @@ -0,0 +1,657 @@ +/**************** + NekoCFG + + Configuration + program for + Neko95 v4.0 + +*****************/ + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include "NekoCFG.h" +#include "..\NekoCommon.h" +#include "..\NekoSettings.h" +#include "NekoCFG_resource.h" +#include "NekoCFG_resource.hm" + +/*************************************************************************************************/ + +const char* szWindowTitle = "Configure Neko"; +const char* szDefaultName = "Neko (default)"; +const char* szHelpFile = "Neko98.hlp"; + +/* help ID lookup table */ +static DWORD dwHelpID[] = { + IDC_NAME, HIDC_NAME, + IDC_NEW, HIDC_NEW, + IDC_DELETE, HIDC_DELETE, + IDC_TASKBAR, HIDC_TASKBAR, + IDC_ABOUT, HIDC_ABOUT, + IDOK, HIDOK, + IDCANCEL, HIDCANCEL, + IDC_APPLY, HIDC_APPLY, + IDC_HELP, HIDC_HELP, + IDC_TABS, HIDC_TABS, + 0,0 +}; + +//global variables +HINSTANCE g_hInstance = NULL; +HWND g_hWndNeko = NULL; + + +//global settings +BOOL g_fShowTaskbar = TRUE; + +//list of all cats +LPCATSETTINGS catSettings = NULL; + +//function forward declaration +void WINAPI WriteSettings(); + +/*************************************************************************************************/ + +/* DeleteCatSettings - removes the given cat from the list */ +BOOL WINAPI DeleteCatSettings( LPCATSETTINGS cat ) +{ + cat->fDeleted = TRUE; + return TRUE; +} + +/* DlgProc_NewNeko - dialog box procedure to add a neko */ +BOOL CALLBACK DlgProc_NewNeko( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch( uMsg ) + { + case WM_INITDIALOG: + { + //make sure the user isn't adding *too* many Nekos! + LPCATSETTINGS cat = catSettings; + int nCats = 0; + while( cat ) + { + if( cat->fDeleted == FALSE ) nCats++; + cat = cat->next; + } + + if( nCats > 5 ) + { + char szBuffer[128]; + sprintf( szBuffer, "You already have %d Nekos!\nAdding more is likely to slow down your computer - do you want to add one anyway?", nCats ); + if( IDNO == MessageBox( hDlg, szBuffer, "Add Neko", MB_YESNO|MB_ICONQUESTION ) ) + { + EndDialog( hDlg, FALSE ); + return TRUE; + } + } + + //initialise the text box + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_LIMITTEXT, IDC_NEWNEKONAME-2, 0 ); + + //add some demo items + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Arthur" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Boris" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Kitty" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Lucy" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Garfield" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Tom" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Bast" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Ginger" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Bob" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Tabs" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Tigger" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"James" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Cooper" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Hey You" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Greebo" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Furball" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Sylvester" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Buffy" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Willow" ); + SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Sarah" ); + //SendDlgItemMessage( hDlg, IDC_NEWNEKONAME, CB_ADDSTRING, 0, (LPARAM)"Vicious Bastard" ); + break; + } + + case WM_COMMAND: + switch( LOWORD(wParam) ) + { + case IDOK: + { + char szName[MAX_NEKO_NAME]; + GetDlgItemText( hDlg, IDC_NEWNEKONAME, szName, MAX_NEKO_NAME ); + char* lpszPtr = szName; + + //make sure it's not empty + if( strlen( szName ) == 0 ) + { + MessageBox( hDlg, "Invalid Name: You must type a name", "New Neko", MB_ICONINFORMATION ); + return TRUE; + } + + //make sure it only has letters, numbers and spaces in + while( lpszPtr && *lpszPtr != '\0' ) + { + if( !( isalpha(*lpszPtr) || isdigit(*lpszPtr) || *lpszPtr == ' ' ) ) + { + MessageBox( hDlg, "Invalid Name: Sorry - a name can only contain letters, numbers and spaces", "Add Neko", MB_ICONINFORMATION ); + return TRUE; + } + lpszPtr++; + } + + //make sure it's unique + LPCATSETTINGS cat = catSettings; + while( cat ) + { + if( !cat->fDeleted && (stricmp( cat->szName, szName ) == 0 || stricmp( cat->szName, szDefaultName ) == 0 )) + { + MessageBox( hDlg, "Invalid Name: This neko already exists!", "New Neko", MB_ICONINFORMATION ); + return TRUE; + } + cat = cat->next; + } + + + //create a new neko + cat = new CATSETTINGS; + strcpy( cat->szName, szName ); + + //set defaults + strcpy( cat->szLibrary, "" ); + cat->uScale = 100; + cat->uSpeed = 16; + cat->uMouseSensitivity = 6; + strcpy( cat->szSndIdle1, "" ); + strcpy( cat->szSndIdle2, "" ); + strcpy( cat->szSndIdle3, "" ); + strcpy( cat->szSndSleep, "" ); + strcpy( cat->szSndAwake, "" ); + cat->uSndFrequency = 0; + cat->uAction = CHASE_MOUSE; + cat->fAlwaysOnTop = FALSE; + cat->bFootprints = FALSE; + *cat->szFootprintLib = '\0'; + + //link it in + cat->fDeleted = FALSE; + cat->next = catSettings; + catSettings = cat; + + //add it to the list box & select it + int i = SendDlgItemMessage( GetParent(hDlg), IDC_NAME, LB_ADDSTRING, 0, (LPARAM)szName ); + SendDlgItemMessage( GetParent(hDlg), IDC_NAME, LB_SETCURSEL, i, 0 ); + PostMessage( GetParent(hDlg), WM_COMMAND, MAKEWPARAM(IDC_NAME, CBN_SELCHANGE), 0 ); + + //close the dialog + EndDialog( hDlg, TRUE ); + break; + } + + case IDCANCEL: + EndDialog( hDlg, FALSE ); + break; + } + break; + + default: + return FALSE; + } + return TRUE; +} + +/* DlgProc_About - dialog box procedure for about dialog */ +BOOL CALLBACK DlgProc_About( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + if( ( uMsg == WM_CLOSE ) || ( uMsg == WM_COMMAND && LOWORD(wParam)==IDOK ) ) EndDialog( hDlg, TRUE ); else return FALSE; + return TRUE; +} + +/* DlgProc_Config - dialog box procedure for configuration dialog */ +BOOL CALLBACK DlgProc_Config( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch( uMsg ) + { + case WM_INITDIALOG: + { + SendDlgItemMessage( hDlg, IDC_TASKBAR, BM_SETCHECK, g_fShowTaskbar, 0 ); + + LPCATSETTINGS cat = catSettings; + while( cat ) + { + if( !cat->fDeleted ) SendDlgItemMessage( hDlg, IDC_NAME, LB_ADDSTRING, 0, ( strcmp( cat->szName, "" ) == 0 ) ? (LPARAM)szDefaultName : (LPARAM)cat->szName ); + cat = cat->next; + } + SendDlgItemMessage( hDlg, IDC_NAME, LB_SELECTSTRING, 0, (LPARAM)szDefaultName ); + EnableWindow( GetDlgItem( hDlg, IDC_DELETE ), FALSE ); + EnableWindow( GetDlgItem( hDlg, IDC_APPLY ), (g_hWndNeko != NULL ) ? TRUE : FALSE ); + + InitialisePropertyDialog( GetDlgItem( hDlg, IDC_TABS ) ); + SendMessage( hDlg, WM_COMMAND, MAKEWPARAM(IDC_NAME, LBN_SELCHANGE), 0 ); + return TRUE; + } + + case WM_DESTROY: + break; + + case WM_COMMAND: + switch( LOWORD(wParam) ) + { + case IDOK: + SetCursor( LoadCursor( NULL, IDC_WAIT ) ); + g_fShowTaskbar = ( IsDlgButtonChecked( hDlg, IDC_TASKBAR ) == BST_CHECKED ); + WriteSettings(); + if( IsWindow( g_hWndNeko ) == FALSE ) g_hWndNeko = FindWindow( szNekoClassName, szNekoWindowTitle ); + SendMessage( g_hWndNeko, MY_UPDATENEKO, 0, 0 ); + SetCursor( LoadCursor( NULL, IDC_ARROW ) ); + EndDialog( hDlg, TRUE ); + break; + + case IDCANCEL: + EndDialog( hDlg, FALSE ); break; + + case IDC_APPLY: + SetCursor( LoadCursor( NULL, IDC_WAIT ) ); + g_fShowTaskbar = ( IsDlgButtonChecked( hDlg, IDC_TASKBAR ) == BST_CHECKED ); + WriteSettings(); + if( IsWindow( g_hWndNeko ) == FALSE ) g_hWndNeko = FindWindow( szNekoClassName, szNekoWindowTitle ); + SendMessage( g_hWndNeko, MY_UPDATENEKO, 0, 0 ); + SetCursor( LoadCursor( NULL, IDC_ARROW ) ); + break; + + case IDC_ABOUT: + DialogBox( g_hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), hDlg, (DLGPROC)DlgProc_About ); + break; + + case IDC_NEW: + DialogBox( g_hInstance, MAKEINTRESOURCE(IDD_NEWNEKO), hDlg, (DLGPROC)DlgProc_NewNeko ); + break; + + case IDC_DELETE: + { + int iItem = SendDlgItemMessage( hDlg, IDC_NAME, LB_GETCURSEL, 0, 0 ); + char szDoomed[MAX_NEKO_NAME] = ""; + + //get string + SendDlgItemMessage( hDlg, IDC_NAME, LB_GETTEXT, iItem, (LPARAM)szDoomed ); + if( strcmp( szDoomed, szDefaultName ) == 0 ) strcpy( szDoomed, "" ); + + //find it in the settings list and continue + LPCATSETTINGS cat = catSettings; + while( cat ) + { + if( !cat->fDeleted ) + if( strcmp( cat->szName, szDoomed ) == 0 ) break; + + cat = cat->next; + } + + if( cat ) + { + //remove it from the list box + SendDlgItemMessage( hDlg, IDC_NAME, LB_DELETESTRING, iItem, 0 ); + + //select another item + SendDlgItemMessage( hDlg, IDC_NAME, LB_SETCURSEL, (iItem ? iItem-1 : 0), 0 ); + SendMessage( hDlg, WM_COMMAND, MAKEWPARAM(IDC_NAME,LBN_SELCHANGE), 0 ); + + //remove it from memory + if( DeleteCatSettings( cat ) == FALSE ) + MessageBox( hDlg, "Internal Error: Could not delete cat!", szWindowTitle, MB_ICONERROR ); + } + else + MessageBox( hDlg, "Internal Error: Dropped off the end of the cat list!", szWindowTitle, MB_ICONERROR ); + + break; + } + + case IDC_HELP: + WinHelp( hDlg, szHelpFile, HELP_FINDER, 0 ); + break; + + case IDC_NAME: + if( HIWORD(wParam) == LBN_SELCHANGE ) + { + int iNew = SendDlgItemMessage( hDlg, IDC_NAME, LB_GETCURSEL, 0, 0 ); + char szNew[MAX_NEKO_NAME] = ""; + + //get string and enable delete if it's not the default item (first) + SendDlgItemMessage( hDlg, IDC_NAME, LB_GETTEXT, iNew, (LPARAM)szNew ); + if( strcmp( szNew, szDefaultName ) == 0 ) + { + strcpy( szNew, "" ); + EnableWindow( GetDlgItem( hDlg, IDC_DELETE ), FALSE ); + } + else EnableWindow( GetDlgItem( hDlg, IDC_DELETE ), TRUE ); + + //the user has selected a different name - find it in the settings list and continue + LPCATSETTINGS cat = catSettings; + while( cat ) + { + if( !cat->fDeleted ) + if( strcmp( cat->szName, szNew ) == 0 ) break; + + cat = cat->next; + } + + if( cat ) + SetActiveCat( cat ); + else + MessageBox( hDlg, "Internal Error: Dropped off the end of the cat list!", szWindowTitle, MB_ICONERROR ); + } + break; + } + break; + + case WM_NOTIFY: + { + LPNMHDR nmhdr = (LPNMHDR)lParam; + switch( nmhdr->idFrom ) + { + case IDC_TABS: + if( nmhdr->code == TCN_SELCHANGE ) OnSelChanged( GetDlgItem( hDlg, IDC_TABS ) ); + break; + } + break; + } + + /* help stuff */ + case WM_HELP: + if( ((LPHELPINFO)lParam)->iCtrlId != (-1) ) + WinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, szHelpFile, HELP_WM_HELP, (DWORD)(LPSTR)dwHelpID ); + else + return FALSE; + break; + + case WM_CONTEXTMENU: + WinHelp( (HWND)wParam, szHelpFile, HELP_CONTEXTMENU, (DWORD)(LPVOID)dwHelpID ); + break; + + default: + return FALSE; + } + return TRUE; +} + +/*************************************************************************************************/ + +/* WriteCatSetting - write a cat from the registry with the given cat settings block */ +void WINAPI WriteCatSettings( LPCATSETTINGS cat, LPCSTR szName ) +{ + //see if this cat is flagged as deleted + if( cat->fDeleted == TRUE ) + { + //remove this item from the registry + if( strlen( szName ) > 0 ) + { + HKEY hKey; + char szKeyName[MAX_PATH]; + strcpy( szKeyName, szNekoRegKey ); + if( RegOpenKeyEx( HKEY_CURRENT_USER, szKeyName, 0, KEY_WRITE, &hKey ) == ERROR_SUCCESS ) + { + LONG l = RegDeleteKey( hKey, cat->szName ); + if( l != ERROR_SUCCESS ) + { +/* + LPVOID lpMsgBuf; + + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + l, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL + ); + // Display the string. + MessageBox( NULL, (char*)lpMsgBuf, "Can't Delete Key", MB_OK|MB_ICONINFORMATION ); + + // Free the buffer. + LocalFree( lpMsgBuf ); +*/ + + } + RegCloseKey( hKey ); + } + else + MessageBox( NULL, "Internal Error: Couldn't open registry key!", 0, MB_TASKMODAL ); + } + else + MessageBox( NULL, "Internal Error: Tried to delete default Neko!", 0, MB_TASKMODAL ); + } + else + { + //build & open key + char szKey[1024]; + strcpy( szKey, szNekoRegKey ); + if( strlen( szName ) > 0 ) + { + strcat( szKey, "\\" ); + strcat( szKey, szName ); + } + + //write cat to the registry + CNekoSettings NekoSettings( szKey ); + + //display + NekoSettings.SetString( szNekoLibraryKey, cat->szLibrary ); + NekoSettings.SetInt( szNekoScaleKey, cat->uScale ); + NekoSettings.SetInt( szNekoOnTopKey, cat->fAlwaysOnTop ); + + //movement + NekoSettings.SetInt( szNekoSpeedKey, cat->uSpeed ); + NekoSettings.SetInt( szNekoSenseKey, cat->uMouseSensitivity ); + + //sounds + NekoSettings.SetString( szNekoSndIdle1Key, cat->szSndIdle1 ); + NekoSettings.SetString( szNekoSndIdle2Key, cat->szSndIdle2 ); + NekoSettings.SetString( szNekoSndIdle3Key, cat->szSndIdle3 ); + NekoSettings.SetString( szNekoSndSleepKey, cat->szSndSleep ); + NekoSettings.SetString( szNekoSndAwakeKey, cat->szSndAwake ); + NekoSettings.SetInt( szNekoSndFreqKey, cat->uSndFrequency ); + + //independence + NekoSettings.SetInt( szNekoActionKey, cat->uAction ); + + //effects + NekoSettings.SetBool( szNekoFootprintKey, cat->bFootprints ); + NekoSettings.SetString( szNekoFootprintLibKey, cat->szFootprintLib ); + } +} + + +/* WriteSettings - writes all of the settings to the registry */ +void WINAPI WriteSettings() +{ + //tell all dialogs to write what they've got so far into the data structure + GetDialogSettings(); + + //write global settings + CNekoSettings NekoSettings( szNekoRegKey ); + NekoSettings.SetBool( szNekoTaskbarKey, g_fShowTaskbar ); + + int nNumCats = 0; + LPCATSETTINGS cat = catSettings; + while( cat ) + { + //write this cat's settings + WriteCatSettings( cat, cat->szName ); + + //unlink it if it's been deleted, or write out the name index key if not + if( cat->fDeleted == FALSE ) + { + //build the key index + char szSubKey[MAX_PATH]; + sprintf( szSubKey, "%d", nNumCats ); + + //write this cat's name to the registry + NekoSettings.SetString( szSubKey, cat->szName ); + + //advance the list + nNumCats++; + cat = cat->next; + } + else + { + cat = cat->next; + } + } + + NekoSettings.SetInt( szNekoNumCatsKey, nNumCats ); +} + +/* ReadCatSetting - loads a cat from the registry into the given cat settings block */ +void WINAPI ReadCatSettings( LPCATSETTINGS cat, LPCSTR szName ) +{ + strcpy( cat->szName, szName ); + + //set defaults + strcpy( cat->szLibrary, "" ); + cat->uScale = 100; + cat->uSpeed = 16; + cat->uMouseSensitivity = 6; + strcpy( cat->szSndIdle1, "" ); + strcpy( cat->szSndIdle2, "" ); + strcpy( cat->szSndIdle3, "" ); + strcpy( cat->szSndSleep, "" ); + strcpy( cat->szSndAwake, "" ); + cat->uSndFrequency = 0; + cat->uAction = CHASE_MOUSE; + cat->fDeleted = FALSE; + cat->fAlwaysOnTop = FALSE; + cat->bFootprints = FALSE; + *cat->szFootprintLib = '\0'; + + //build & open key + char szKey[1024]; + strcpy( szKey, szNekoRegKey ); + if( strlen( szName ) > 0 ) + { + strcat( szKey, "\\" ); + strcat( szKey, szName ); + } + + CNekoSettings NekoSettings( szKey ); + + //display + NekoSettings.GetString( szNekoLibraryKey, cat->szLibrary, MAX_PATH-1 ); + NekoSettings.GetInt( szNekoScaleKey, &cat->uScale ); + DWORD fAlwaysOnTop = cat->fAlwaysOnTop; + NekoSettings.GetInt( szNekoOnTopKey, &fAlwaysOnTop ); + cat->fAlwaysOnTop = fAlwaysOnTop; + + //movement + NekoSettings.GetInt( szNekoSpeedKey, &cat->uSpeed ); + NekoSettings.GetInt( szNekoSenseKey, &cat->uMouseSensitivity ); + + //sounds + NekoSettings.GetString( szNekoSndIdle1Key, cat->szSndIdle1, MAX_PATH-1 ); + NekoSettings.GetString( szNekoSndIdle2Key, cat->szSndIdle2, MAX_PATH-1 ); + NekoSettings.GetString( szNekoSndIdle3Key, cat->szSndIdle3, MAX_PATH-1 ); + NekoSettings.GetString( szNekoSndSleepKey, cat->szSndSleep, MAX_PATH-1 ); + NekoSettings.GetString( szNekoSndAwakeKey, cat->szSndAwake, MAX_PATH-1 ); + NekoSettings.GetInt( szNekoSndFreqKey, &cat->uSndFrequency ); + + //independence + NekoSettings.GetInt( szNekoActionKey, &cat->uAction ); + + NekoSettings.GetBool( szNekoFootprintKey, &cat->bFootprints ); + NekoSettings.GetString( szNekoFootprintLibKey, cat->szFootprintLib, MAX_PATH-1 ); +} + +/* ReadSettings - reads all of the settings from the registry and creates the global settings array */ +void WINAPI ReadSettings() +{ + LPCATSETTINGS cat; + + CNekoSettings * NekoSettings = new CNekoSettings( szNekoRegKey ); + NekoSettings->GetBool( szNekoTaskbarKey, &g_fShowTaskbar ); + + //load in new cats list + DWORD nNumCats = 0; + NekoSettings->GetInt( szNekoNumCatsKey, &nNumCats ); + + if( nNumCats == 0 ) + { + //the user hasn't run the config program, or there are no Nekos - use default + cat = new CATSETTINGS; + cat->next = NULL; + ReadCatSettings( cat, "" ); + + catSettings = cat; + } + else + { + for( DWORD i = 0; i < nNumCats; i++ ) + { + //build the key index + char szSubKey[MAX_PATH], szName[MAX_NEKO_NAME]; + sprintf( szSubKey, "%d", i ); + + //load this cat's name from the registry + NekoSettings->GetString( szSubKey, szName, MAX_NEKO_NAME-1 ); + + //create a new setting for it and put the object into the list + cat = new CATSETTINGS; + cat->next = catSettings; + ReadCatSettings( cat, szName ); + catSettings = cat; + } + } + + delete NekoSettings; +} + +/* DeleteConfigList - deletes the list of settings from memory */ +void WINAPI DeleteConfigList() +{ + LPCATSETTINGS cat = catSettings; + while( catSettings ) + { + cat = catSettings; + catSettings = catSettings->next; + delete cat; + } +} + + +/* FindAndActivateOldInstance - activates the old instance of the configuration program + if it has been loaded twice */ +BOOL FindAndActivateOldInstance() +{ + HWND hWnd = FindWindow( NULL, szWindowTitle ); + if( hWnd ) + { + OpenIcon(hWnd); + SetForegroundWindow(hWnd); + return TRUE; + } + + return FALSE; +} + +/* WinMain - main program start point */ +int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) +{ + //see if the configuration program is loaded already + if( FindAndActivateOldInstance() ) return 0; + + //ensure the common control library is loaded + InitCommonControls(); + + //store the instance handle and find the Neko window + g_hInstance = hInstance; + g_hWndNeko = FindWindow( szNekoClassName, szNekoWindowTitle ); + + //initialise program and display dialog + ReadSettings(); + DialogBox( g_hInstance, MAKEINTRESOURCE(IDD_CONFIG), NULL, (DLGPROC)DlgProc_Config ); + DeleteConfigList(); + ShutdownPropertyDialog(); + return 0; +} diff --git a/nkosrc4/Neko98/NekoCFG/NekoCFG.dsp b/nkosrc4/Neko98/NekoCFG/NekoCFG.dsp new file mode 100755 index 0000000..a8c9859 --- /dev/null +++ b/nkosrc4/Neko98/NekoCFG/NekoCFG.dsp @@ -0,0 +1,175 @@ +# Microsoft Developer Studio Project File - Name="NekoCFG" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=NekoCFG - 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 "NekoCFG.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 "NekoCFG.mak" CFG="NekoCFG - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "NekoCFG - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "NekoCFG - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "NekoCFG - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# 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 /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 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /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 odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib winmm.lib /nologo /subsystem:windows /machine:I386 + +!ELSEIF "$(CFG)" == "NekoCFG - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# 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 /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 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /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 odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "NekoCFG - Win32 Release" +# Name "NekoCFG - Win32 Debug" +# Begin Group "Resource" + +# PROP Default_Filter ".ico;.bmp;.rc;.cur" +# Begin Source File + +SOURCE=.\Res\AppIcon.ico +# End Source File +# Begin Source File + +SOURCE=..\Res\Awake.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\displayi.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\independence.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\movement.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\play.bmp +# End Source File +# Begin Source File + +SOURCE=.\Res\playing.cur +# End Source File +# Begin Source File + +SOURCE=.\Res\sounds.ico +# End Source File +# Begin Source File + +SOURCE=.\Res\tab_effects.ico +# End Source File +# End Group +# Begin Group "Help" + +# PROP Default_Filter ".hpj;.rtf" +# Begin Source File + +SOURCE=..\NekoHelp\Neko98.HPJ +# End Source File +# Begin Source File + +SOURCE=..\NekoHelp\Neko98.RTF +# End Source File +# End Group +# Begin Source File + +SOURCE=.\NekoCFG.cpp +# End Source File +# Begin Source File + +SOURCE=.\NekoCFG.h +# End Source File +# Begin Source File + +SOURCE=.\NekoCFG.rc +# End Source File +# Begin Source File + +SOURCE=.\NekoCFG_resource.h +# End Source File +# Begin Source File + +SOURCE=.\NekoCFG_Tabs.cpp +# End Source File +# Begin Source File + +SOURCE=..\NekoCommon.h +# End Source File +# Begin Source File + +SOURCE=..\NekoSettings.cpp +# End Source File +# Begin Source File + +SOURCE=..\NekoSettings.h +# End Source File +# End Target +# End Project diff --git a/nkosrc4/Neko98/NekoCFG/NekoCFG.h b/nkosrc4/Neko98/NekoCFG/NekoCFG.h new file mode 100755 index 0000000..8e0301d --- /dev/null +++ b/nkosrc4/Neko98/NekoCFG/NekoCFG.h @@ -0,0 +1,69 @@ +#ifndef _NEKOCFG_H +#define _NEKOCFG_H + +#include "..\NekoCommon.h" + +//structures +typedef struct tagTABINITDATA { + char* szTitle; + UINT uIDDialog; + DLGPROC lpfnDlgProc; + UINT uIDIcon; + HWND hDlg; +} TABINITDATA, *LPTABINITDATA; + +typedef struct tagCATSETTINGS { + char szName[MAX_NEKO_NAME]; + + //display + char szLibrary[MAX_PATH]; + DWORD uScale; + BOOL fAlwaysOnTop; + + //movement + DWORD uSpeed; + DWORD uMouseSensitivity; + + //sounds + char szSndIdle1[MAX_PATH]; + char szSndIdle2[MAX_PATH]; + char szSndIdle3[MAX_PATH]; + char szSndSleep[MAX_PATH]; + char szSndAwake[MAX_PATH]; + DWORD uSndFrequency; + + //independence + DWORD uAction; + + //effects + BOOL bFootprints; + char szFootprintLib[MAX_PATH]; + + //list items + BOOL fDeleted; + struct tagCATSETTINGS* next; + +} CATSETTINGS, *LPCATSETTINGS; + +//ranges for slider bars +#define MIN_SPEED 2 +#define MAX_SPEED 48 +#define MIN_SENSE 1 +#define MAX_SENSE 64 +#define MIN_SNDFREQ 0 +#define MAX_SNDFREQ 100 +#define MIN_SCALE 10 +#define MAX_SCALE 400 + +//external functions +extern void WINAPI InitialisePropertyDialog( HWND hWnd ); +extern void WINAPI ShutdownPropertyDialog(); +extern void WINAPI OnSelChanged( HWND hWnd ); +extern void WINAPI SetActiveCat( LPCATSETTINGS lpCat ); +extern void WINAPI GetDialogSettings(); + +//external variables +extern HINSTANCE g_hInstance; +extern const char* szHelpFile; + +#endif //_NEKOCFG_H diff --git a/nkosrc4/Neko98/NekoCFG/NekoCFG.rc b/nkosrc4/Neko98/NekoCFG/NekoCFG.rc new file mode 100755 index 0000000..7ea6f9b --- /dev/null +++ b/nkosrc4/Neko98/NekoCFG/NekoCFG.rc @@ -0,0 +1,373 @@ +//Microsoft Developer Studio generated resource script. +// +#include "NekoCFG_resource.h" + +// Generated Help ID header file +#define APSTUDIO_HIDDEN_SYMBOLS +#include "NekoCFG_resource.hm" +#undef APSTUDIO_HIDDEN_SYMBOLS + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.K.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APPICON ICON DISCARDABLE "res\\appicon.ico" +IDI_DEFAULT ICON DISCARDABLE "..\\res\\Awake.ico" +IDI_TAB_SOUNDS ICON DISCARDABLE "Res\\sounds.ico" +IDI_TAB_MOVEMENT ICON DISCARDABLE "Res\\movement.ico" +IDI_TAB_DISPLAY ICON DISCARDABLE "Res\\displayi.ico" +IDI_TAB_INDEPENDENCE ICON DISCARDABLE "res\\independence.ico" +IDI_TAB_EFFECTS ICON DISCARDABLE "res\\tab_effects.ico" + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "DHSoft\0" + VALUE "FileDescription", "NekoCFG\0" + VALUE "FileVersion", "4.0g\0" + VALUE "InternalName", "NekoCFG\0" + VALUE "LegalCopyright", "Copyright © 1998\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "NekoCFG.exe\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "Neko Configuration Program\0" + VALUE "ProductVersion", "4.0g\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // !_MAC + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_CONFIG DIALOGEX 0, 0, 312, 210 +STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | DS_CONTEXTHELP | + WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Configure Neko" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Na&me:",IDC_STATIC,7,7,22,8 + PUSHBUTTON "&Add A New Neko...",IDC_NEW,13,108,75,14,0,0,HIDC_NEW + PUSHBUTTON "&Delete",IDC_DELETE,93,108,41,14,0,0,HIDC_DELETE + GROUPBOX "&General",IDC_STATIC,5,140,125,40 + CONTROL "Show &icon in taskbar",IDC_TASKBAR,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,15,160,80,10,0,HIDC_TASKBAR + PUSHBUTTON "Abo&ut...",IDC_ABOUT,7,189,50,14,0,0,HIDC_ABOUT + CONTROL "Tab1",IDC_TABS,"SysTabControl32",TCS_MULTILINE | + WS_TABSTOP,146,7,159,178,0,HIDC_TABS + DEFPUSHBUTTON "OK",IDOK,145,189,50,14,0,0,HIDOK + PUSHBUTTON "Cancel",IDCANCEL,200,189,50,14,0,0,HIDCANCEL + PUSHBUTTON "&Apply",IDC_APPLY,255,189,50,14,0,0,HIDC_APPLY + PUSHBUTTON "&Help",IDC_HELP,62,189,50,14,0,0,HIDC_HELP + LISTBOX IDC_NAME,7,18,127,85,LBS_SORT | LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP,0,HIDC_NAME +END + +IDD_MOVEMENT DIALOGEX 0, 0, 155, 151 +STYLE DS_CONTROL | WS_CHILD +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + GROUPBOX "&Speed",IDC_STATIC,7,7,141,48 + CONTROL "Slow",IDC_STATIC,"Static",SS_SIMPLE | WS_GROUP,12,23,15, + 8 + CONTROL "Slider1",IDC_SPEEDSLIDER,"msctls_trackbar32", + TBS_NOTICKS | WS_TABSTOP,12,34,130,17,0,HIDC_SPEEDSLIDER + CONTROL "Fast",IDC_STATIC,"Static",SS_SIMPLE | WS_GROUP,127,23, + 15,8 + GROUPBOX "&Mouse sensitivity",IDC_STATIC,7,65,141,45 + CONTROL "Low",IDC_STATIC,"Static",SS_SIMPLE | WS_GROUP,12,80,15, + 8 + CONTROL "Slider1",IDC_SENSESLIDER,"msctls_trackbar32", + TBS_NOTICKS | WS_TABSTOP,12,90,130,17,0,HIDC_SENSESLIDER + CONTROL "High",IDC_STATIC,"Static",SS_SIMPLE | WS_GROUP,127,80, + 15,8 +END + +IDD_SOUND DIALOGEX 0, 0, 155, 151 +STYLE DS_CONTROL | WS_CHILD +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + GROUPBOX "&Frequency",IDC_STATIC,8,7,140,63 + LTEXT "None",IDC_STATIC,14,18,20,8 + CONTROL "Slider1",IDC_SOUNDFREQ,"msctls_trackbar32",TBS_NOTICKS | + WS_TABSTOP,15,27,125,17,0,HIDC_SOUNDFREQ + LTEXT "Always",IDC_STATIC,118,18,23,8 + LTEXT "&Event:",IDC_STATIC,10,77,22,8 + LISTBOX IDC_SOUNDSAVAIL,32,76,116,43,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP,0,HIDC_SOUNDSAVAIL + LTEXT "Na&me:",IDC_STATIC,9,121,22,8 + EDITTEXT IDC_SOUNDNAME,35,121,113,12,ES_AUTOHSCROLL | ES_READONLY | + NOT WS_BORDER,0,HIDC_SOUNDNAME + PUSHBUTTON "",IDC_PREVIEW,10,134,15,14,BS_BITMAP,0,HIDC_PREVIEW + PUSHBUTTON "&None",IDC_NONE,43,134,50,14,0,0,HIDC_NONE + PUSHBUTTON "&Browse...",IDC_BROWSE,99,134,50,14,0,0,HIDC_BROWSE + LTEXT "(Performance may be affected if this is much above 10%)", + IDC_STATIC,15,47,130,20,0,WS_EX_TRANSPARENT + LTEXT "Some",IDC_STATIC,66,18,20,8 +END + +IDD_NEWNEKO DIALOG DISCARDABLE 0, 0, 213, 66 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "New Neko" +FONT 8, "MS Sans Serif" +BEGIN + ICON IDI_DEFAULT,IDC_STATIC,7,9,20,20 + LTEXT "Enter the &name for your new Neko:",IDC_STATIC,38,7,111, + 8 + COMBOBOX IDC_NEWNEKONAME,38,16,168,78,CBS_DROPDOWN | CBS_SORT | + WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,102,45,50,14 + PUSHBUTTON "Cancel",IDCANCEL,156,45,50,14 +END + +IDD_ABOUTBOX DIALOGEX 0, 0, 182, 101 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "About Neko" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "OK",IDOK,65,80,50,14 + ICON IDI_DEFAULT,IDC_STATIC,5,10,21,20 + LTEXT "This program is proud to be FREEWARE!",IDC_STATIC,25,60, + 131,8 + LTEXT "Neko for Windows v4.0g\nPorted by David Harvey from\nX-Windows source code by Masayuki Koba", + IDC_STATIC,35,10,142,25,0,WS_EX_TRANSPARENT + LTEXT "http://www.geocities.com/siliconvalley/haven/4173/", + IDC_STATIC,5,40,170,8 +END + +IDD_DISPLAY DIALOGEX 0, 0, 155, 151 +STYLE DS_CONTROL | WS_CHILD +FONT 8, "MS Sans Serif" +BEGIN + GROUPBOX "&Size",IDC_STATIC,7,7,136,65 + LTEXT "Smaller",IDC_STATIC,12,20,24,8 + LTEXT "Larger",IDC_STATIC,122,20,21,8 + CONTROL "Slider1",IDC_SCALESLIDER,"msctls_trackbar32", + TBS_NOTICKS | WS_TABSTOP,15,30,125,15,0,HIDC_SCALESLIDER + LTEXT "Scale:",IDC_STATIC,36,55,21,8 + LTEXT "100%",IDC_SCALEDISPLAY,62,55,25,8,0,0,HIDC_SCALEDISPLAY + PUSHBUTTON "Use &Default",IDC_SET100,92,52,50,14,0,0,HIDC_SET100 + GROUPBOX "&Image library",IDC_STATIC,7,76,136,54 + LTEXT "&File name:",IDC_STATIC,15,88,33,8 + EDITTEXT IDC_IMAGELIB,15,98,125,12,ES_AUTOHSCROLL | ES_READONLY | + NOT WS_BORDER,0,HIDC_IMAGELIB + PUSHBUTTON "&Change...",IDC_CHANGE,36,112,50,15,0,0,HIDC_CHANGE + PUSHBUTTON "&Use Default",IDC_DEFAULT,92,112,50,15,0,0,HIDC_DEFAULT + CONTROL "Alwa&ys On Top",IDC_ALWAYSONTOP,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,134,64,10,0, + HIDC_ALWAYSONTOP +END + +IDD_INDEPENDENCE DIALOGEX 0, 0, 155, 149 +STYLE DS_CONTROL | WS_CHILD +FONT 8, "MS Sans Serif", 0, 0, 0x1 +BEGIN + GROUPBOX "&Behaviour",IDC_STATIC,7,7,141,58 + LTEXT "&Action:",IDC_STATIC,15,23,23,8 + COMBOBOX IDC_ACTION,40,19,100,66,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP,0,HIDC_ACTION + LTEXT "(none)",IDC_ACTIONDESC,15,35,125,25,0,0,HIDC_ACTIONDESC +END + +IDD_EFFECTS DIALOGEX 0, 0, 155, 151 +STYLE DS_CONTROL | WS_CHILD +FONT 8, "MS Sans Serif" +BEGIN + GROUPBOX "&Footprint Images",IDC_STATIC,7,7,141,74 + CONTROL "&Enable Footprints",IDC_FOOTPRINTS,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,14,18,71,10,0, + HIDC_FOOTPRINTS + LTEXT "&File name:",IDC_STATIC,14,33,33,8 + EDITTEXT IDC_IMAGELIB,14,43,125,12,ES_AUTOHSCROLL | ES_READONLY | + NOT WS_BORDER,0,HIDC_IMAGELIB + PUSHBUTTON "&Change...",IDC_CHANGE,35,59,50,15,0,0,HIDC_CHANGE + PUSHBUTTON "&Use Default",IDC_DEFAULT,91,59,50,15,0,0,HIDC_DEFAULT +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_CONFIG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 305 + TOPMARGIN, 7 + BOTTOMMARGIN, 203 + END + + IDD_MOVEMENT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 148 + TOPMARGIN, 7 + BOTTOMMARGIN, 144 + END + + IDD_SOUND, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 148 + VERTGUIDE, 10 + TOPMARGIN, 7 + BOTTOMMARGIN, 149 + HORZGUIDE, 137 + END + + IDD_NEWNEKO, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 206 + VERTGUIDE, 38 + TOPMARGIN, 7 + BOTTOMMARGIN, 59 + HORZGUIDE, 29 + END + + IDD_ABOUTBOX, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 175 + TOPMARGIN, 7 + BOTTOMMARGIN, 94 + END + + IDD_DISPLAY, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 148 + TOPMARGIN, 7 + BOTTOMMARGIN, 144 + END + + IDD_INDEPENDENCE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 148 + TOPMARGIN, 7 + BOTTOMMARGIN, 142 + END + + IDD_EFFECTS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 148 + TOPMARGIN, 7 + BOTTOMMARGIN, 144 + END +END +#endif // APSTUDIO_INVOKED + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "NekoCFG_resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Cursor +// + +IDC_PLAYING CURSOR DISCARDABLE "res\\playing.cur" + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDR_PLAYBITMAP BITMAP DISCARDABLE "res\\play.bmp" +#endif // English (U.K.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/nkosrc4/Neko98/NekoCFG/NekoCFG_Tabs.cpp b/nkosrc4/Neko98/NekoCFG/NekoCFG_Tabs.cpp new file mode 100755 index 0000000..78e9c6c --- /dev/null +++ b/nkosrc4/Neko98/NekoCFG/NekoCFG_Tabs.cpp @@ -0,0 +1,607 @@ +/* property sheet functions */ +#include +#include +#include +#include "NekoCFG.h" +#include "..\NekoCommon.h" +#include "NekoCFG_resource.h" +#include "NekoCFG_resource.hm" + + +/* help ID lookup table */ +static DWORD dwHelpID[] = { + IDC_SCALESLIDER, HIDC_SCALESLIDER, + IDC_SCALEDISPLAY, HIDC_SCALEDISPLAY, + IDC_SET100, HIDC_SET100, + IDC_IMAGELIB, HIDC_IMAGELIB, + IDC_CHANGE, HIDC_CHANGE, + IDC_DEFAULT, HIDC_DEFAULT, + + IDC_SPEEDSLIDER, HIDC_SPEEDSLIDER, + IDC_SENSESLIDER, HIDC_SENSESLIDER, + + IDC_SOUNDFREQ, HIDC_SOUNDFREQ, + IDC_SOUNDSAVAIL, HIDC_SOUNDSAVAIL, + IDC_SOUNDNAME, HIDC_SOUNDNAME, + IDC_PREVIEW, HIDC_PREVIEW, + IDC_NONE, HIDC_NONE, + IDC_BROWSE, HIDC_BROWSE, + + IDC_ACTION, HIDC_ACTION, + IDC_ACTIONDESC, HIDC_ACTIONDESC, + + IDC_ALWAYSONTOP, HIDC_ALWAYSONTOP, + IDC_FOOTPRINTS, HIDC_FOOTPRINTS, + 0,0 +}; + + +/**************************************************************************************/ + +//cat settings +LPCATSETTINGS g_lpCurrentCat = NULL; +#define MY_WRITESETTINGS (WM_USER+32) +#define MY_READSETTINGS (WM_USER+33) + +/**************************************************************************************/ +//tab control data + +#define NUM_PAGES 5 +BOOL CALLBACK PropPage_Display( HWND hPage, UINT uMsg, WPARAM wParam, LPARAM lParam ); +BOOL CALLBACK PropPage_Movement( HWND hPage, UINT uMsg, WPARAM wParam, LPARAM lParam ); +BOOL CALLBACK PropPage_Sound( HWND hPage, UINT uMsg, WPARAM wParam, LPARAM lParam ); +BOOL CALLBACK PropPage_Independence( HWND hPage, UINT uMsg, WPARAM wParam, LPARAM lParam ); +BOOL CALLBACK PropPage_Effects( HWND hPage, UINT uMsg, WPARAM wParam, LPARAM lParam ); +TABINITDATA tibTabs[NUM_PAGES] = { + { "Display", IDD_DISPLAY, (DLGPROC)PropPage_Display, IDI_TAB_DISPLAY, NULL }, + { "Movement", IDD_MOVEMENT, (DLGPROC)PropPage_Movement, IDI_TAB_MOVEMENT, NULL }, + { "Sound", IDD_SOUND, (DLGPROC)PropPage_Sound, IDI_TAB_SOUNDS, NULL }, + { "Independence", IDD_INDEPENDENCE, (DLGPROC)PropPage_Independence, IDI_TAB_INDEPENDENCE, NULL }, + { "Effects", IDD_EFFECTS, (DLGPROC)PropPage_Effects, IDI_TAB_EFFECTS, NULL }, +}; + +HWND g_hDlgDisplay = NULL; //current child dialog +HWND g_hWndTab = NULL; //tab control +RECT g_rcTabStart; //offset in dialog to draw tab pages + +HIMAGELIST g_himgTabIcons = NULL; + +/**************************************************************************************/ + + +/* InitialisePropertyDialog - loads all of the property sheet pages into the property sheet control */ +void WINAPI InitialisePropertyDialog( HWND hWnd ) +{ + int i; + + //create the image list + g_himgTabIcons = ImageList_Create( 16, 16, ILC_COLOR4|ILC_MASK, NUM_PAGES, 0 ); + for( i = 0; i < NUM_PAGES; i++ ) + { + HICON hIcon = (HICON)LoadImage( g_hInstance, MAKEINTRESOURCE(tibTabs[i].uIDIcon), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE ); + tibTabs[i].uIDIcon = ImageList_AddIcon( g_himgTabIcons, hIcon ); + DestroyIcon( hIcon ); + } + TabCtrl_SetImageList( hWnd, g_himgTabIcons ); + + + //insert tabs for each of the dialog items and create the (hidden) dialog + TC_ITEM tie; + tie.mask = TCIF_TEXT | TCIF_IMAGE; + for( i = 0; i < NUM_PAGES; i++ ) + { + tie.iImage = tibTabs[i].uIDIcon; + tie.pszText = tibTabs[i].szTitle; + TabCtrl_InsertItem( hWnd, i, &tie ); + + tibTabs[i].hDlg = CreateDialog( g_hInstance, MAKEINTRESOURCE(tibTabs[i].uIDDialog), GetParent(hWnd), tibTabs[i].lpfnDlgProc ); + } + + //calculate where to stick each dialog + GetWindowRect( hWnd, &g_rcTabStart ); + ScreenToClient( GetParent(hWnd), (LPPOINT)&g_rcTabStart.left ); + ScreenToClient( GetParent(hWnd), (LPPOINT)&g_rcTabStart.right ); + g_rcTabStart.top += 42; + g_rcTabStart.left += 3; + + //store the handle and show the first page + g_hWndTab = hWnd; + OnSelChanged( hWnd ); +} + +/* ShutdownPropertyDialog - releases any resources owned by the propery sheet */ +void WINAPI ShutdownPropertyDialog() +{ + ImageList_Destroy( g_himgTabIcons ); +} + +/* OnTabSelection - updates the tabs when one is selected */ +void WINAPI OnSelChanged( HWND hWnd ) +{ + int iSel = TabCtrl_GetCurSel( hWnd ); + + //destroy the current child dialog box, if any. + if( g_hDlgDisplay != NULL) ShowWindow( g_hDlgDisplay, SW_HIDE ); + + //create the new child dialog box. + g_hDlgDisplay = tibTabs[iSel].hDlg; + ShowWindow( g_hDlgDisplay, SW_SHOW ); + +} + +/* SetActiveCat - selects which cat to configure */ +void WINAPI SetActiveCat( LPCATSETTINGS lpCat ) +{ + GetDialogSettings(); + g_lpCurrentCat = lpCat; + for( int i = 0; i < NUM_PAGES; i++ ) SendMessage( tibTabs[i].hDlg, MY_READSETTINGS, 0, 0 ); +} + +/* GetDialogSettings - causes all property pages to write their settings into the data structure */ +void WINAPI GetDialogSettings() +{ + if( g_lpCurrentCat ) + for( int i = 0; i < NUM_PAGES; i++ ) SendMessage( tibTabs[i].hDlg, MY_WRITESETTINGS, 0, 0 ); +} + +/**************************************************************************************/ + +/* PropPage_Display - message processsing function for the 'display' property page */ +BOOL CALLBACK PropPage_Display( HWND hPage, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch( uMsg ) + { + case WM_INITDIALOG: + SendDlgItemMessage( hPage, IDC_SCALESLIDER, TBM_SETRANGE, FALSE, MAKELPARAM(MIN_SCALE/10,MAX_SCALE/10) ); + break; + + case MY_WRITESETTINGS: + g_lpCurrentCat->uScale = SendDlgItemMessage( hPage, IDC_SCALESLIDER, TBM_GETPOS, 0, 0 ) * 10; + GetDlgItemText( hPage, IDC_IMAGELIB, g_lpCurrentCat->szLibrary, MAX_PATH ); + g_lpCurrentCat->fAlwaysOnTop = IsDlgButtonChecked( hPage, IDC_ALWAYSONTOP ); + break; + + case MY_READSETTINGS: + SendDlgItemMessage( hPage, IDC_SCALESLIDER, TBM_SETPOS, TRUE, g_lpCurrentCat->uScale / 10 ); + SetDlgItemText( hPage, IDC_IMAGELIB, g_lpCurrentCat->szLibrary ); + CheckDlgButton( hPage, IDC_ALWAYSONTOP, g_lpCurrentCat->fAlwaysOnTop ); + SendMessage( hPage, WM_HSCROLL, 0, 0 ); + break; + + case WM_HSCROLL: + { + //update the % indicator + char szBuffer[32]; + sprintf( szBuffer, "%d%%", SendDlgItemMessage( hPage, IDC_SCALESLIDER, TBM_GETPOS, 0, 0 ) * 10 ); + SetDlgItemText( hPage, IDC_SCALEDISPLAY, szBuffer ); + break; + } + + case WM_COMMAND: + + switch( LOWORD(wParam) ) + { + case IDC_SET100: + SendDlgItemMessage( hPage, IDC_SCALESLIDER, TBM_SETPOS, TRUE, 10 ); + SendMessage( hPage, WM_HSCROLL, 0, 0 ); + break; + + case IDC_DEFAULT: + SetDlgItemText( hPage, IDC_IMAGELIB, "" ); + break; + + case IDC_CHANGE: + { + OPENFILENAME ofn; + char lpstrLibrary[MAX_PATH]; + LPCTSTR lpstrFileMasks = "Icon Libraries\0*.icl;*.exe;*.dll\0All Files (*.*)\0*.*\0\0"; + + //get the current file + GetDlgItemText( hPage, IDC_IMAGELIB, lpstrLibrary, MAX_PATH-1 ); + + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = hPage; + ofn.hInstance = NULL; + ofn.lpstrFilter = lpstrFileMasks; + ofn.lpstrCustomFilter = NULL; + ofn.nFilterIndex = 1; + ofn.lpstrFile = lpstrLibrary; + ofn.nMaxFile = MAX_PATH-1; + ofn.lpstrFileTitle = NULL; + ofn.nMaxFileTitle = 0; + ofn.lpstrInitialDir = NULL; + ofn.lpstrTitle = "Select Image Library"; + ofn.Flags = OFN_EXPLORER|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; + ofn.lpstrDefExt = "icl"; + if( GetOpenFileName( &ofn ) ) + { + //check to make sure it's got enough icons in... + if( (UINT)ExtractIcon( g_hInstance, ofn.lpstrFile, (UINT)-1 ) < 32 ) + MessageBox( hPage, "That file does not have enough icons in it - it must have at least 32", "Change Image Library", MB_ICONEXCLAMATION ); + else + SetDlgItemText( hPage, IDC_IMAGELIB, ofn.lpstrFile ); + } + break; + } + } + break; + + case WM_SHOWWINDOW: + if( wParam ) SetWindowPos( hPage, HWND_TOP, g_rcTabStart.left, g_rcTabStart.top, 0, 0, SWP_NOSIZE ); + break; + + /* help stuff */ + case WM_HELP: + if( ((LPHELPINFO)lParam)->iCtrlId != (-1) ) + WinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, szHelpFile, HELP_WM_HELP, (DWORD)(LPSTR)dwHelpID ); + else + return FALSE; + break; + + case WM_CONTEXTMENU: + WinHelp( (HWND)wParam, szHelpFile, HELP_CONTEXTMENU, (DWORD)(LPVOID)dwHelpID ); + break; + + default: + return FALSE; + } + return TRUE; +} + + +/* PropPage_Movement - message processsing function for the 'movement' property page */ +BOOL CALLBACK PropPage_Movement( HWND hPage, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch( uMsg ) + { + case WM_INITDIALOG: + SendDlgItemMessage( hPage, IDC_SPEEDSLIDER, TBM_SETRANGE, FALSE, MAKELPARAM(MIN_SPEED,MAX_SPEED) ); + SendDlgItemMessage( hPage, IDC_SENSESLIDER, TBM_SETRANGE, FALSE, MAKELPARAM(MIN_SENSE,MAX_SENSE) ); + break; + + case MY_WRITESETTINGS: + g_lpCurrentCat->uSpeed = SendDlgItemMessage( hPage, IDC_SPEEDSLIDER, TBM_GETPOS, 0, 0 ); + g_lpCurrentCat->uMouseSensitivity = MAX_SENSE - SendDlgItemMessage( hPage, IDC_SENSESLIDER, TBM_GETPOS, 0, 0 ); + break; + + case MY_READSETTINGS: + SendDlgItemMessage( hPage, IDC_SPEEDSLIDER, TBM_SETPOS, TRUE, g_lpCurrentCat->uSpeed ); + SendDlgItemMessage( hPage, IDC_SENSESLIDER, TBM_SETPOS, TRUE, MAX_SENSE - g_lpCurrentCat->uMouseSensitivity ); + break; + + + case WM_SHOWWINDOW: + if( wParam ) SetWindowPos( hPage, HWND_TOP, g_rcTabStart.left, g_rcTabStart.top, 0, 0, SWP_NOSIZE ); + break; + + /* help stuff */ + case WM_HELP: + if( ((LPHELPINFO)lParam)->iCtrlId != (-1) ) + WinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, szHelpFile, HELP_WM_HELP, (DWORD)(LPSTR)dwHelpID ); + else + return FALSE; + break; + + case WM_CONTEXTMENU: + WinHelp( (HWND)wParam, szHelpFile, HELP_CONTEXTMENU, (DWORD)(LPVOID)dwHelpID ); + break; + + default: + return FALSE; + } + return TRUE; +} + +/* PropPage_Sound - message processsing function for the 'sound' property page */ +BOOL CALLBACK PropPage_Sound( HWND hPage, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + static HCURSOR s_hcPlaying = NULL; + + switch( uMsg ) + { + case WM_INITDIALOG: + SendDlgItemMessage( hPage, IDC_PREVIEW, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)LoadImage( g_hInstance, MAKEINTRESOURCE(IDR_PLAYBITMAP), IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS ) ); + SendDlgItemMessage( hPage, IDC_SOUNDFREQ, TBM_SETRANGE, FALSE, MAKELPARAM(MIN_SNDFREQ,MAX_SNDFREQ) ); + + SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_ADDSTRING, 0, (LPARAM)"Idle One" ); + SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_ADDSTRING, 0, (LPARAM)"Idle Two" ); + SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_ADDSTRING, 0, (LPARAM)"Idle Three" ); + SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_ADDSTRING, 0, (LPARAM)"Sleep" ); + SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_ADDSTRING, 0, (LPARAM)"Awake" ); + + //load the playing cursor + s_hcPlaying = LoadCursor( g_hInstance, MAKEINTRESOURCE(IDC_PLAYING) ); + + //select first item in the list & update + SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_SETCURSEL, 0, 0 ); + break; + + case WM_DESTROY: + DestroyCursor( s_hcPlaying ); + break; + + case MY_WRITESETTINGS: + g_lpCurrentCat->uSndFrequency = SendDlgItemMessage( hPage, IDC_SOUNDFREQ, TBM_GETPOS, 0, 0 ); + break; + + case MY_READSETTINGS: + SendDlgItemMessage( hPage, IDC_SOUNDFREQ, TBM_SETPOS, TRUE, g_lpCurrentCat->uSndFrequency ); + + SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_SETITEMDATA, 0, (LPARAM)g_lpCurrentCat->szSndIdle1 ); + SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_SETITEMDATA, 1, (LPARAM)g_lpCurrentCat->szSndIdle2 ); + SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_SETITEMDATA, 2, (LPARAM)g_lpCurrentCat->szSndIdle3 ); + SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_SETITEMDATA, 3, (LPARAM)g_lpCurrentCat->szSndSleep ); + SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_SETITEMDATA, 4, (LPARAM)g_lpCurrentCat->szSndAwake ); + PostMessage( hPage, WM_COMMAND, MAKEWPARAM( IDC_SOUNDSAVAIL, 0 ), 0 ); + break; + + case WM_COMMAND: + switch( LOWORD(wParam) ) + { + case IDC_SOUNDSAVAIL: + { + int iCurSel = SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_GETCURSEL, 0, 0 ); + char * lpszFile = (char*)SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_GETITEMDATA, iCurSel, 0 ); + + if( strcmp( lpszFile, "" ) == 0 ) + { + SetDlgItemText( hPage, IDC_SOUNDNAME, "" ); + EnableWindow( GetDlgItem( hPage, IDC_PREVIEW ), FALSE ); + EnableWindow( GetDlgItem( hPage, IDC_NONE ), FALSE ); + } + else + { + SetDlgItemText( hPage, IDC_SOUNDNAME, lpszFile ); + EnableWindow( GetDlgItem( hPage, IDC_PREVIEW ), TRUE ); + EnableWindow( GetDlgItem( hPage, IDC_NONE ), TRUE ); + } + + break; + } + + case IDC_PREVIEW: + { + int iCurSel = SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_GETCURSEL, 0, 0 ); + char * lpszFile = (char*)SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_GETITEMDATA, iCurSel, 0 ); + + if( strcmp( lpszFile, "" ) != 0 ) + { + SetCursor( s_hcPlaying ); + if( !PlaySound( lpszFile, NULL, SND_FILENAME|SND_NODEFAULT|SND_SYNC ) ) MessageBox( hPage, "Unable to start playing wave file!", "Preview Sound", MB_ICONEXCLAMATION ); + SetCursor( LoadCursor( NULL, MAKEINTRESOURCE(IDC_ARROW) ) ); + } + break; + } + + case IDC_NONE: + { + int iCurSel = SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_GETCURSEL, 0, 0 ); + + strcpy( (char*)SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_GETITEMDATA, iCurSel, 0 ), "" ); + + //update the display + PostMessage( hPage, WM_COMMAND, MAKEWPARAM( IDC_SOUNDSAVAIL, 0 ), 0 ); + break; + } + + case IDC_BROWSE: + { + OPENFILENAME ofn; + char szPrompt[256] = "Browse for ", szSoundName[256]; + LPCTSTR lpstrFileMasks ="Sounds (*.wav)\0*.wav\0All Files (*.*)\0*.*\0\0"; + int iCurSel = SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_GETCURSEL, 0, 0 ); + + //build browse dialog prompt + SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_GETTEXT, iCurSel, (LPARAM)szSoundName ); + strcat( szPrompt, szSoundName ); + strcat( szPrompt, " sound" ); + + strcpy( szSoundName, (char*)SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_GETITEMDATA, iCurSel, 0 ) ); + + //get the current file + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = hPage; + ofn.hInstance = NULL; + ofn.lpstrFilter = lpstrFileMasks; + ofn.lpstrCustomFilter = NULL; + ofn.nFilterIndex = 1; + ofn.lpstrFile = szSoundName; + ofn.nMaxFile = MAX_PATH-1; + ofn.lpstrFileTitle = NULL; + ofn.nMaxFileTitle = 0; + ofn.lpstrInitialDir = NULL; + ofn.lpstrTitle = szPrompt; + ofn.Flags = OFN_EXPLORER|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; + ofn.lpstrDefExt = "WAV"; + if( GetOpenFileName( &ofn ) ) + { + //update everything with the new sound + SetDlgItemText( hPage, IDC_SOUNDNAME, ofn.lpstrFile ); + strcpy( (char*)SendDlgItemMessage( hPage, IDC_SOUNDSAVAIL, LB_GETITEMDATA, iCurSel, 0 ), szSoundName ); + + //update the display + PostMessage( hPage, WM_COMMAND, MAKEWPARAM( IDC_SOUNDSAVAIL, 0 ), 0 ); + + //make sure it will make a sound + if( SendDlgItemMessage( hPage, IDC_SOUNDFREQ, TBM_GETPOS, 0, 0 ) == 0 ) + SendDlgItemMessage( hPage, IDC_SOUNDFREQ, TBM_SETPOS, TRUE, 2 ); + + } + break; + } + } + break; + + case WM_SHOWWINDOW: + if( wParam ) SetWindowPos( hPage, HWND_TOP, g_rcTabStart.left, g_rcTabStart.top, 0, 0, SWP_NOSIZE ); + break; + + /* help stuff */ + case WM_HELP: + if( ((LPHELPINFO)lParam)->iCtrlId != (-1) ) + WinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, szHelpFile, HELP_WM_HELP, (DWORD)(LPSTR)dwHelpID ); + else + return FALSE; + break; + + case WM_CONTEXTMENU: + WinHelp( (HWND)wParam, szHelpFile, HELP_CONTEXTMENU, (DWORD)(LPVOID)dwHelpID ); + break; + + default: + return FALSE; + } + return TRUE; +} + + +/* PropPage_Independence - message processsing function for the 'independence' property page */ +BOOL CALLBACK PropPage_Independence( HWND hPage, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch( uMsg ) + { + case WM_INITDIALOG: + SendDlgItemMessage( hPage, IDC_ACTION, CB_ADDSTRING, 0, (LPARAM)"Chase the mouse (default)" ); + SendDlgItemMessage( hPage, IDC_ACTION, CB_ADDSTRING, 0, (LPARAM)"Run away from the mouse"); + SendDlgItemMessage( hPage, IDC_ACTION, CB_ADDSTRING, 0, (LPARAM)"Run around randomly"); + SendDlgItemMessage( hPage, IDC_ACTION, CB_ADDSTRING, 0, (LPARAM)"Pace around the screen"); + SendDlgItemMessage( hPage, IDC_ACTION, CB_ADDSTRING, 0, (LPARAM)"Run around the screen"); + break; + + case MY_WRITESETTINGS: + g_lpCurrentCat->uAction = SendDlgItemMessage( hPage, IDC_ACTION, CB_GETCURSEL, 0, 0 ); + break; + + case MY_READSETTINGS: + SendDlgItemMessage( hPage, IDC_ACTION, CB_SETCURSEL, g_lpCurrentCat->uAction, 0 ); + SendMessage( hPage, WM_COMMAND, MAKEWPARAM(IDC_ACTION, CBN_SELCHANGE), 0 ); + break; + + case WM_SHOWWINDOW: + if( wParam ) SetWindowPos( hPage, HWND_TOP, g_rcTabStart.left, g_rcTabStart.top, 0, 0, SWP_NOSIZE ); + break; + + case WM_COMMAND: + switch( LOWORD(wParam) ) + { + case IDC_ACTION: + if( HIWORD(wParam) == CBN_SELCHANGE ) + { + const char* szActionDesc[] = { + "Neko will follow the mouse cursor wherever it goes", + "Neko will run away when the mouse cursor gets too near, and sleep when it isn't near", + "Neko will run to a random spot on the desktop, sleep for a while, and then continue running around", + "Neko will run around the outside of the desktop", + "Neko will run around the desktop, without stopping" + }; + + SetDlgItemText( hPage, IDC_ACTIONDESC, szActionDesc[SendDlgItemMessage( hPage, IDC_ACTION, CB_GETCURSEL, 0, 0 )] ); + } + break; + } + break; + + /* help stuff */ + case WM_HELP: + if( ((LPHELPINFO)lParam)->iCtrlId != (-1) ) + WinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, szHelpFile, HELP_WM_HELP, (DWORD)(LPSTR)dwHelpID ); + else + return FALSE; + break; + + case WM_CONTEXTMENU: + WinHelp( (HWND)wParam, szHelpFile, HELP_CONTEXTMENU, (DWORD)(LPVOID)dwHelpID ); + break; + + default: + return FALSE; + } + return TRUE; +} + + + + +/* PropPage_Effects - message processsing function for the 'effects' property page */ +BOOL CALLBACK PropPage_Effects( HWND hPage, UINT uMsg, WPARAM wParam, LPARAM lParam ) +{ + switch( uMsg ) + { + case MY_WRITESETTINGS: + GetDlgItemText( hPage, IDC_IMAGELIB, g_lpCurrentCat->szFootprintLib, MAX_PATH ); + g_lpCurrentCat->bFootprints = IsDlgButtonChecked( hPage, IDC_FOOTPRINTS ); + break; + + case MY_READSETTINGS: + SetDlgItemText( hPage, IDC_IMAGELIB, g_lpCurrentCat->szFootprintLib ); + CheckDlgButton( hPage, IDC_FOOTPRINTS, g_lpCurrentCat->bFootprints ); + break; + + case WM_COMMAND: + + switch( LOWORD(wParam) ) + { + case IDC_DEFAULT: + SetDlgItemText( hPage, IDC_IMAGELIB, "" ); + break; + + case IDC_CHANGE: + { + OPENFILENAME ofn; + char lpstrLibrary[MAX_PATH]; + LPCTSTR lpstrFileMasks = "Icon Libraries\0*.icl;*.exe;*.dll\0All Files (*.*)\0*.*\0\0"; + + //get the current file + GetDlgItemText( hPage, IDC_IMAGELIB, lpstrLibrary, MAX_PATH-1 ); + + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = hPage; + ofn.hInstance = NULL; + ofn.lpstrFilter = lpstrFileMasks; + ofn.lpstrCustomFilter = NULL; + ofn.nFilterIndex = 1; + ofn.lpstrFile = lpstrLibrary; + ofn.nMaxFile = MAX_PATH-1; + ofn.lpstrFileTitle = NULL; + ofn.nMaxFileTitle = 0; + ofn.lpstrInitialDir = NULL; + ofn.lpstrTitle = "Select Footprint Image Library"; + ofn.Flags = OFN_EXPLORER|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; + ofn.lpstrDefExt = "icl"; + if( GetOpenFileName( &ofn ) ) + { + //check to make sure it's got enough icons in... + if( (UINT)ExtractIcon( g_hInstance, ofn.lpstrFile, (UINT)-1 ) < 8 ) + MessageBox( hPage, "That file does not have enough icons in it - it must have at least 8", "Change Image Library", MB_ICONEXCLAMATION ); + else + { + SetDlgItemText( hPage, IDC_IMAGELIB, ofn.lpstrFile ); + CheckDlgButton( hPage, IDC_FOOTPRINTS, TRUE ); + } + } + break; + } + } + break; + + case WM_SHOWWINDOW: + if( wParam ) SetWindowPos( hPage, HWND_TOP, g_rcTabStart.left, g_rcTabStart.top, 0, 0, SWP_NOSIZE ); + break; + + /* help stuff */ + case WM_HELP: + if( ((LPHELPINFO)lParam)->iCtrlId != (-1) ) + WinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle, szHelpFile, HELP_WM_HELP, (DWORD)(LPSTR)dwHelpID ); + else + return FALSE; + break; + + case WM_CONTEXTMENU: + WinHelp( (HWND)wParam, szHelpFile, HELP_CONTEXTMENU, (DWORD)(LPVOID)dwHelpID ); + break; + + default: + return FALSE; + } + return TRUE; +} diff --git a/nkosrc4/Neko98/NekoCFG/NekoCFG_resource.h b/nkosrc4/Neko98/NekoCFG/NekoCFG_resource.h new file mode 100755 index 0000000..3beb1f8 --- /dev/null +++ b/nkosrc4/Neko98/NekoCFG/NekoCFG_resource.h @@ -0,0 +1,126 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by NekoCFG.rc +// +#define IDS_DESC1 1 +#define IDS_DESC2 2 +#define IDS_DESC3 3 +#define IDS_DESC4 4 +#define IDS_DESC5 5 +#define IDS_DESC6 6 +#define IDI_APPICON 101 +#define ID_SETTINGS 101 +#define IDC_SPEEDSLIDER 102 +#define ID_EXIT 102 +#define IDC_SENSESLIDER 103 +#define ID_NEKOUPDATETIMER 103 +#define IDC_IMAGELIB 104 +#define IDC_PREVIEW 105 +#define IDC_TASKBAR 106 +#define IDC_CHANGE 107 +#define IDC_DEFAULT 108 +#define IDD_GENERAL 109 +#define IDD_MOVEMENT 109 +#define IDD_INDEPENDENCE 110 +#define IDD_DISPLAY 112 +#define IDI_AWAKE 113 +#define IDI_UP1 114 +#define IDI_UP2 115 +#define IDI_UPRIGHT1 116 +#define IDI_UPRIGHT2 117 +#define IDI_RIGHT1 118 +#define IDI_RIGHT2 119 +#define IDI_DOWNRIGHT1 120 +#define IDI_DOWNRIGHT2 121 +#define IDI_DOWN1 122 +#define IDI_DOWN2 123 +#define IDI_DOWNLEFT1 124 +#define IDI_DOWNLEFT2 125 +#define IDI_LEFT1 126 +#define IDI_LEFT2 127 +#define IDI_UPLEFT1 128 +#define IDI_UPLEFT2 129 +#define IDI_UPCLAW1 130 +#define IDI_UPCLAW2 131 +#define IDI_RIGHTCLAW1 132 +#define IDI_RIGHTCLAW2 133 +#define IDI_LEFTCLAW1 134 +#define IDI_LEFTCLAW2 135 +#define IDI_DOWNCLAW1 136 +#define IDI_DOWNCLAW2 137 +#define IDI_WASH2 138 +#define IDI_SCRATCH1 139 +#define IDI_SCRATCH2 140 +#define IDI_YAWN2 141 +#define IDI_YAWN3 142 +#define IDI_SLEEP1 143 +#define IDI_SLEEP2 144 +#define IDI_TASKBAR 145 +#define IDI_DEFAULT 146 +#define IDI_DISPLAYICON 147 +#define IDI_MOVEMENTICON 148 +#define IDI_ABOUTICON 149 +#define IDD_ABOUT 150 +#define IDI_SOUNDSICON 151 +#define IDD_SOUNDS 152 +#define IDB_TASKBAR 155 +#define IDB_CATCLOCK 156 +#define IDI_IE4 157 +#define IDD_CONFIG 158 +#define IDD_IMAGELIB 159 +#define IDD_SCALE 160 +#define IDD_SOUND 162 +#define IDD_NEWNEKO 163 +#define IDD_ABOUTBOX 164 +#define IDC_PLAYING 165 +#define IDD_EFFECTS 165 +#define IDI_TAB_SOUNDS 168 +#define IDI_TAB_MOVEMENT 169 +#define IDI_TAB_DISPLAY 170 +#define IDI_TAB_INDEPENDENCE 171 +#define IDR_PLAYBITMAP 172 +#define IDI_TAB_EFFECTS 172 +#define IDC_CHANCESLIDER 1000 +#define IDC_CHANCE 1002 +#define IDC_CHASECOMBO 1003 +#define IDC_CHASERANDOM 1007 +#define IDC_DESCRIPTION 1009 +#define IDC_WEBPAGE 1011 +#define IDC_EMAIL 1013 +#define IDC_LIST1 1014 +#define IDC_SOUNDSAVAIL 1014 +#define IDC_SOUNDNAME 1029 +#define IDC_BROWSE 1030 +#define IDC_SOUNDFREQ 1033 +#define IDC_NONE 1034 +#define IDC_CHEESE 1035 +#define IDC_SCALESCLIDE 1036 +#define IDC_SCALESLIDER 1036 +#define IDC_SCALEDISPLAY 1037 +#define IDC_IE4MODE 1039 +#define IDC_SET100 1040 +#define IDC_APPLY 1041 +#define IDC_TABS 1042 +#define IDC_NEWNEKO 1043 +#define IDC_NEW 1043 +#define IDC_DELETE 1044 +#define IDC_NAME 1045 +#define IDC_NEWNEKONAME 1048 +#define IDC_ABOUT 1049 +#define IDC_QUEUEDRAWING 1052 +#define IDC_HELP 1053 +#define IDC_ACTION 1054 +#define IDC_ACTIONDESC 1055 +#define IDC_ALWAYSONTOP 1056 +#define IDC_FOOTPRINTS 1058 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 174 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1059 +#define _APS_NEXT_SYMED_VALUE 104 +#endif +#endif diff --git a/nkosrc4/Neko98/NekoCFG/NekoCFG_resource.hm b/nkosrc4/Neko98/NekoCFG/NekoCFG_resource.hm new file mode 100755 index 0000000..0121ceb --- /dev/null +++ b/nkosrc4/Neko98/NekoCFG/NekoCFG_resource.hm @@ -0,0 +1,31 @@ +// Microsoft Developer Studio generated Help ID include file. +// Used by NekoCFG.rc +// +#define HIDCANCEL 0x809e0002 // IDD_CONFIG +#define HIDC_ABOUT 0x809e0419 // IDD_CONFIG +#define HIDC_ACTION 0x806e041e // IDD_INDEPENDENCE +#define HIDC_ACTIONDESC 0x806e041f // IDD_INDEPENDENCE +#define HIDC_ALWAYSONTOP 0x80700420 // IDD_DISPLAY +#define HIDC_APPLY 0x809e0411 // IDD_CONFIG +#define HIDC_BROWSE 0x80a20406 // IDD_SOUND +#define HIDC_CHANGE 0x8070006b // IDD_DISPLAY +#define HIDC_DEFAULT 0x8070006c // IDD_DISPLAY +#define HIDC_DELETE 0x809e0414 // IDD_CONFIG +#define HIDC_FOOTPRINTS 0x80a50422 // IDD_EFFECTS +#define HIDC_HELP 0x809e041d // IDD_CONFIG +#define HIDC_IMAGELIB 0x80700068 // IDD_DISPLAY +#define HIDC_NAME 0x809e0415 // IDD_CONFIG +#define HIDC_NEW 0x809e0413 // IDD_CONFIG +#define HIDC_NONE 0x80a2040a // IDD_SOUND +#define HIDC_PREVIEW 0x80a20069 // IDD_SOUND +#define HIDC_SCALEDISPLAY 0x8070040d // IDD_DISPLAY +#define HIDC_SCALESLIDER 0x8070040c // IDD_DISPLAY +#define HIDC_SENSESLIDER 0x806d0067 // IDD_MOVEMENT +#define HIDC_SET100 0x80700410 // IDD_DISPLAY +#define HIDC_SOUNDFREQ 0x80a20409 // IDD_SOUND +#define HIDC_SOUNDNAME 0x80a20405 // IDD_SOUND +#define HIDC_SOUNDSAVAIL 0x80a203f6 // IDD_SOUND +#define HIDC_SPEEDSLIDER 0x806d0066 // IDD_MOVEMENT +#define HIDC_TABS 0x809e0412 // IDD_CONFIG +#define HIDC_TASKBAR 0x809e006a // IDD_CONFIG +#define HIDOK 0x809e0001 // IDD_CONFIG diff --git a/nkosrc4/Neko98/NekoCFG/Res/AppIcon.ico b/nkosrc4/Neko98/NekoCFG/Res/AppIcon.ico new file mode 100755 index 0000000000000000000000000000000000000000..19eba7dbecbb9a381501624f059cddf085460d88 GIT binary patch literal 1078 zcmb7DJ!{-R5FL39XE^ZQ4+vOQa4Fa#g$w21xOEvwku_IDkmCM|;F^GolX2n3KjMNL zcV18-fsVYqSxF}qHpFv!JM(rvG}@gLN#sP*bR{Y;CnBGzSF4_1CL-rX#k^hzT;->r*?VK_+Nd#b{6us^<6f+52(A}jn^7c zSke{W{Mrv(6V5PZbJOz6ip}Wl`NZ_g5hl)Zl!*sn$1(*(_bdT{=^x>-z`P#cFw3{J z=kM3<6-QA%rAusW&X0i~Hh{wq;OQFhrWJ)G2UZ#JmmH}W?1>-?v}YGMe7Znb?65aL zl`xgvzlZ7;xW5PfJOIznK-2W6IjlP8D2iAmgeb{bnOTD3xcCdt&q9}9jue|D_lFe8E`7}QyknBmwI0+ zxcHKLPu_cJ5(+4eFbp9vQ@}__No7hY^yq-~{?FKvrnN2TT*5g=N~7@;O(QFcLrP-b z(2X(Kgh~F?+d_)_@|gH$G$0Sgq-B!f6vuI-$YEXI%G|Sxbj!3P?{!tQc@6I45uFRk x%ih-v+Az*9-s1x<;IsQHxc(B4U=7>l2mA*=b>>iG=9=Pz)s9@istp|XegJJyP3Qms literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/NekoCFG/Res/independence.ico b/nkosrc4/Neko98/NekoCFG/Res/independence.ico new file mode 100755 index 0000000000000000000000000000000000000000..8ad75385126fe59d65a951612a9a4c1154f64516 GIT binary patch literal 318 zcmZvXAr8Vo5Ji6p301TT3lawo*(-1mM3V{xf{{)34!s1TVnez|=@D==Dar6>iy<(( z|G(Y&vtogSE6;OSZ4+Q+q^z@{63pp z@+)(`ig(u@jH&mPM7Hgobe+H0fKwj_oR0B9+Nrl3ZoG*xt!u-lR2z9+fuTr_LvbgU Zc&tGQ`mCf*2n+rts*ygkY?@Ww&E5`HNYwxU literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/NekoCFG/Res/movement.ico b/nkosrc4/Neko98/NekoCFG/Res/movement.ico new file mode 100755 index 0000000000000000000000000000000000000000..cb2691a4876540ad459cd1f1873e8cb02fa7f941 GIT binary patch literal 318 zcmZvUp$@`842D}qayX{2AaRUG7-k_^5DR_|jk|Mq4%}Yp9%U~;g4+b4{M{f3Xs`d* zzip0)k!hNe#+r#1N|a7kD5fctC=B{fu+e1*BcNz0#t7;{hDRdWp^!RK`NqY%pw4&J z0mjRRorSj|O7o`m@VK)MJmWLlh@Lf_x3Dx5cLmUl82Vp%n$zi#(5>e(@3}tQ`B=3~ gS>%iYa~YDN4kq8lIc4o~OF_8wQq*3meIuL63wDQ4K>z>% literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/NekoCFG/Res/play.bmp b/nkosrc4/Neko98/NekoCFG/Res/play.bmp new file mode 100755 index 0000000000000000000000000000000000000000..0184de5abf06826341ec63d000284d53bfcbbb7d GIT binary patch literal 154 zcmZvRyA^;i3LQ~6 literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/NekoCFG/Res/playing.cur b/nkosrc4/Neko98/NekoCFG/Res/playing.cur new file mode 100755 index 0000000000000000000000000000000000000000..e77a64b74bc1532fe5eced4d6cdb81d7fddb7629 GIT binary patch literal 326 zcmZY3F%E(-6vpwd5Fv4?lPipl+yEwLkH7&O92tz|CL9Hi;ph<@9SF~V2`>7YUmxFV z+8`xzDoZU@Icd+=0VNtZR;+&6|2H%H8Mfp*7aJ*|Z%)$oA$fWl=ZNQO<$5AgQk3C{ zGp-0d=(ja@^b1-v_!j@L)c#Om!*x30&`jkGQW2K@7J4J#4 zJH9(Rv7-ct*t0By*fs)I!W>fBa70)z0u=BcIDi+Nn~9Mn+O`FebosF0y(kWLDG7W{ zC9~c&1eVHrN(j)gml?`2Gu=iAYvYoXtku^sPC2iP3w5Q(pYx&Lnt9%{L9qSjo{&uD rgjaRJus)+NYIHfjv*fMvPT>Q}=z#J8%9rR0pkEV)>c~AcCR5`LkM~E4 literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/NekoCFG/Res/tab_effects.ico b/nkosrc4/Neko98/NekoCFG/Res/tab_effects.ico new file mode 100755 index 0000000000000000000000000000000000000000..ae4505ef79e33a893cdb0967bc24c39e7900d124 GIT binary patch literal 318 zcmZurAr1mD5S*qYxa%n_NF)vt1R+5nc?jYX6hW|P#QlIb@BxxL$1_OIU+Tb>nFB?b z?aXv%+q8gV<#`Ta?0|usR5BtRdQ`wV{U@AgX!bEGx2UR$u0iS+QqqoODU$pmF!K}R zFxosABBH+@*~fS;*oWi~MQOS=RZjR>zjN#iy%mrtB(eu(g|=c5S;;cej9qcrwAn zf1vRnXkt8h^AC9N;?bkO!HWsLH``s>(nJj*A!J@y_RV|q-t2tY&VFwuTIhpl0N?;6 zeH|czdI&F=zvc%Bq;^p~A_oUP@WBY$fBHvcs1Nm&UgU&B+ow%FXQ$lNSEYq{oT!%L~m-MXe5 zm_Ug_;EW^SE*Ak@E&>qPo#{1SXStxCyK8WC`p zi+^Ajv|Q9$%LTCu`kLdH)+HBK0l9@_4j!363z7+<3|*!}eo$!V2a<9WTHM5;1&#^7 z_+?Y;U;zb>1)N4$)iWss&LRR4oK%P=<`g5lTIVFGW+8E{qo~lbfwhSv5o8o0Vihtz zn7rDucibFyLa~L5qmrG(Hbm2wnP|0n`?6wq+oGjOxP?h%&O<5S>-quU2Lty9%60i=Aj34OQ`Aa zWMn#g)AP}U9^YtrJFJMQ5`}<5Kp~(IPzWdl6aoqXg@8gpA)pXY2pkuI2o~)jD%|CE zfj>3V>+sXrE}&k*=l9M&FGYWSk>`y^&Ia$qZ?EI#;Zt6;t@UKnU|G9aDy=))new*8 zYmHW$P7fhCfyqm+zW-O?;%e@=(^v8Thrl2mWz)4!TTCc)Al`la@gx=OZSF(%aT13~f``{)G4U-2=4sQ>sGXq!1V$8w-w);~!q~eU|UE{`te< Z?(0bnt@0`a6aoqXg@8gpA#j=y_ye{JPtE`U literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/NekoHelp/Neko98.HPJ b/nkosrc4/Neko98/NekoHelp/Neko98.HPJ new file mode 100755 index 0000000..d46ebb7 --- /dev/null +++ b/nkosrc4/Neko98/NekoHelp/Neko98.HPJ @@ -0,0 +1,23 @@ +; This file is maintained by HCW. Do not modify this file directly. + +; This file is maintained by WHD. Copyright (c) Nick Ameladiotis +[OPTIONS] +COMPRESS=12 Hall Zeck +ERRORLOG=Neko98.LOG +LCID=0x809 0x0 0x0 ; English (United Kingdom) +REPORT=Yes +CONTENTS=Neko98 +TITLE=Neko98 +CNT=Neko98.CNT +COPYRIGHT=© 1998 DHSoft +PREFIX=HIDC_ +HLP=Neko98.hlp + +[FILES] +Neko98.RTF + +[MAP] +#include ..\NekoCFG\NekoCFG_resource.hm + +[WINDOWS] +main="Neko98",(640,109,384,682),27648,(r14811135),(r12632256),1 diff --git a/nkosrc4/Neko98/NekoHelp/Neko98.RTF b/nkosrc4/Neko98/NekoHelp/Neko98.RTF new file mode 100755 index 0000000..1f651eb --- /dev/null +++ b/nkosrc4/Neko98/NekoHelp/Neko98.RTF @@ -0,0 +1,180 @@ +{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;} +{\f11\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}MS Sans Serif;}{\f27\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;}{\f32\froman\fcharset238\fprq2 Times New Roman CE;}{\f33\froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f35\froman\fcharset161\fprq2 Times New Roman Greek;}{\f36\froman\fcharset162\fprq2 Times New Roman Tur;}{\f37\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f38\froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f39\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f248\fswiss\fcharset238\fprq2 Tahoma CE;}{\f249\fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f251\fswiss\fcharset161\fprq2 Tahoma Greek;}{\f252\fswiss\fcharset162\fprq2 Tahoma Tur;} +{\f253\fswiss\fcharset177\fprq2 Tahoma (Hebrew);}{\f254\fswiss\fcharset178\fprq2 Tahoma (Arabic);}{\f255\fswiss\fcharset186\fprq2 Tahoma Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0; +\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128; +\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \snext0 Normal;}{\s1\ql \li0\ri0\keepn\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 +\b\f11\fs11\cf1\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 1;}{\*\cs10 \additive Default Paragraph Font;}{\s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext15 endnote text;}{\s16\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext16 footnote text;}{\*\cs17 +\additive \super \sbasedon10 footnote reference;}{\*\cs18 \additive \super \sbasedon10 endnote reference;}{\s19\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \cbpat9 \f27\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 +\sbasedon0 \snext19 Document Map;}{\*\cs20 \additive \ul\cf2 \sbasedon10 Hyperlink;}{\s21\ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \f11\fs11\cf1\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext21 Body Text;}{ +\s22\ql \li0\ri0\widctlpar\tqc\tx4153\tqr\tx8306\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext22 header;}{\s23\ql \li0\ri0\widctlpar\tqc\tx4153\tqr\tx8306\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext23 footer;}}{\*\listtable{\list\listtemplateid134807567\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'00.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li360\jclisttab\tx360 }{\listname ;}\listid33046753}{\list\listtemplateid134807553\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li360\jclisttab\tx360 }{\listname ;}\listid349258629}{\list\listtemplateid134807553\listsimple +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li360\jclisttab\tx360 }{\listname +;}\listid857964170}{\list\listtemplateid134807553\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\chbrdr\brdrnone\brdrcf1 +\chshdng0\chcfpat1\chcbpat1\fbias0 \fi-360\li360\jclisttab\tx360 }{\listname ;}\listid1845120029}}{\*\listoverridetable{\listoverride\listid1845120029\listoverridecount0\ls1}{\listoverride\listid349258629\listoverridecount0\ls2} +{\listoverride\listid33046753\listoverridecount0\ls3}{\listoverride\listid857964170\listoverridecount0\ls4}}{\info{\title #Click these tabs to see more options}{\author David Harvey}{\operator David Harvey}{\creatim\yr1999\mo12\dy23\hr21\min21} +{\revtim\yr1999\mo12\dy23\hr21\min22}{\version3}{\edmins0}{\nofpages36}{\nofwords941}{\nofchars5369}{\*\company }{\nofcharsws6593}{\vern8247}}\margl1880\margr1880 +\widowctrl\endnotes\aendnotes\ftnnrlc\aftnnar\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind4\viewscale190\nolnhtadjtbl \fet1{\*\aftnsep +\pard\plain \ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\chftnsep +\par }}\sectd \linex0\headery709\footery709\colsx709\sectdefaultcl {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4 +\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (} +{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\f11\fs11\super #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ +\f11\lang1031\langfe1033\cgrid0\langnp1031 HIDC_TABS}}}{\f11\fs11\cf1\cgrid0 Click these tabs to see more options.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_NAME}}}{\f11\fs11\cf1\cgrid0 Select the name of the Neko that you would like to configure.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain +\s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_NEW}}}{\f11\fs11\cf1\cgrid0 Click this button to create a new Neko.\page }{\cs18\f11\fs11\cf1\super\cgrid0 # +{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_DELETE}}}{\f11\fs11\cf1\cgrid0 +Click this button to remove the currently selected Neko. You cannot remove the default Neko.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_ABOUT}}}{\f11\fs11\cf1\cgrid0 Click this button to see the program version information and copyright. +\par \page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_HELP}}}{\f11\fs11\cf1\cgrid0 +Click this button to display the Neko help.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDOK} +}}{\f11\fs11\cf1\cgrid0 Click this button to close this program and save the settings.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDCANCEL}}}{\f11\fs11\cf1\cgrid0 Click this button to close the program without saving settings.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain +\s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_APPLY}}}{\f11\fs11\cf1\cgrid0 Click this button to save settings without exiting.\page }{\cs18\f11\fs11\super # +{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{\f11\lang1031\langfe1033\cgrid0\langnp1031 HIDC_TASKBAR}}}{\f11\fs11\cf1\cgrid0 +This option will display a small icon in the taskbar to allow you to exit Neko or display the configuration program.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_NONE}}}{\f11\fs11\cf1\cgrid0 This button will remove any sound associated with the current event.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain +\s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_SPEEDSLIDER}}}{\f11\fs11\cf1\cgrid0 This will set how fast Neko runs.\page }{\cs18\f11\fs11\cf1\super\cgrid0 # +{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_SET100}}}{\f11\fs11\cf1\cgrid0 This will set Neko back to normal size.\page }{ +\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_SCALEDISPLAY}}}{\f11\fs11\cf1\cgrid0 +This shows Neko's current scale.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_SENSESLIDER} +}}{\f11\fs11\cf1\cgrid0 This slider sets Neko's sensitivity to the mouse moving when sleeping. The higher this is, the further the mouse must be moved to wake Neko up.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain +\s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_IMAGELIB}}}{\f11\fs11\cf1\cgrid0 This displays the current image library that this Neko will use. \page }{ +\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_SCALESLIDER}}}{\f11\fs11\cf1\cgrid0 +This slider sets how large or small Neko will be.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ + HIDC_DEFAULT}}}{\f11\fs11\cf1\cgrid0 This button will use the default image library for Neko.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_SOUNDSAVAIL}}}{\f11\fs11\cf1\cgrid0 This lists the events available\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain +\s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_BROWSE}}}{\f11\fs11\cf1\cgrid0 This option will let you browse for a new sound for the selected event.\page }{ +\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_SOUNDFREQ}}}{\f11\fs11\cf1\cgrid0 +This slider sets how frequently Neko plays sounds. Your system may run slowly if this is much above 10%. To turn sounds off without selecting "none" for each one, move this slider to "none".\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt +\pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_SOUNDNAME}}}{\f11\fs11\cf1\cgrid0 This shows the .wav file being used for the current event.\page }{ +\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_CHANGE}}}{\f11\fs11\cf1\cgrid0 +This will let you browse for a new image library to change how Neko looks. You can download more image libraries.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_PREVIEW}}}{\f11\fs11\cf1\cgrid0 This button will play the sound for the current event. +\par \page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_ACTION}}}{\f11\fs11\cf1\cgrid0 +This lists all of the available actions that this Neko can perform while on the desktop.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_ALWAYSONTOP}}}{\f11\fs11\cf1\cgrid0 This causes this Neko to run on top of other Windows. +\par Note: Having too many on top Nekos may degrade system performance.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 +{\cs18\super #}{ HIDC_ACTIONDESC}}}{\f11\fs11\cf1\cgrid0 This gives a more detailed description of an individual action. +\par \page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ HIDC_FOOTPRINTS}}}{\f11\fs11\cf1\cgrid0 +Causes Neko to leave footprints. This option doesn't work too well with Always On Top mode.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ Extending_Neko}}${\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super $}{ + Extending Neko}}K{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super K}{ More Image Libraries & Sounds}}}{\f11\fs11\cf1\cgrid0 +\par }\pard\plain \s1\ql \li0\ri0\keepn\nowidctlpar\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \b\f11\fs11\cf1\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {Image Libraries and Sounds +\par }\pard\plain \ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\f11\fs11\cf1\cgrid0 You can download more image libraries and sounds for Neko from the Neko home page at: +\par http://www.geocities.com/SiliconValley/Haven/4173/ +\par +\par }\pard\plain \s1\ql \li0\ri0\keepn\nowidctlpar\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \b\f11\fs11\cf1\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {Create Your Own +\par }\pard\plain \ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\f11\fs11\cf1\cgrid0 +Alternatively, you can create your own by using any icon library editor, such as Microangelo from Impact Software, which is available at: +\par http://www.impactsoft.com/\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ Other_Versions}}$ +{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super $}{ Other Versions}}K{\footnote\ftnalt \pard\plain +\s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super K}{ Windows 3.0/3.1; X-Windows; Mac; Java; OS/2}}}{\f11\fs11\cf1\cgrid0 +\par }\pard\plain \s1\ql \li0\ri0\keepn\nowidctlpar\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \b\f11\fs11\cf1\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {Other Versions +\par }\pard\plain \ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\f11\fs11\cf1\cgrid0 Neko is not just available for Windows 95/98. +\par +\par }\pard\plain \s1\ql \li0\ri0\keepn\nowidctlpar\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \b\f11\fs11\cf1\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {Windows 3.0/3.1 +\par }\pard\plain \ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\f11\fs11\cf1\cgrid0 +This was written by a different author than this version and developed long before Neko95. It's designed for Windows 3.0 and the archive name is 'Neko20.zip'. You should be able to find it on most Windows 3.0 shareware sites, or from: +\par ftp://ftp.cdrom.com/.2/games/windows/jokes/neko20.zip +\par +\par }\pard\plain \s1\ql \li0\ri0\keepn\nowidctlpar\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \b\f11\fs11\cf1\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {X-Windows +\par }\pard\plain \ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\f11\fs11\cf1\cgrid0 The Neko source files are available for most X-Windows UNIX variants etc. This is th +e original version and it should be on almost every X-Windows site in the world! +\par +\par }\pard\plain \s1\ql \li0\ri0\keepn\nowidctlpar\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \b\f11\fs11\cf1\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {Mac +\par }\pard\plain \ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\f11\fs11\cf1\cgrid0 It is rumoured that a Mac version exists, but it isn't known where it can be downloaded. +\par +\par The author is not going to write a Mac version of Neko, mainly because he doesn't have a Mac. If you would like to port Neko to the Mac, feel free to use the Neko95 source files in any way you like! +\par +\par }\pard\plain \s1\ql \li0\ri0\keepn\nowidctlpar\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \b\f11\fs11\cf1\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {OS/2 +\par }\pard\plain \ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\f11\fs11\cf1\cgrid0 An OS/2 version of Neko was released with one versi +on of OS/2 - it is believed that it was called "Boris" and chased a butterfly. Little else is known about this and it is not believed that it is available on the Internet for free. +\par +\par }\pard\plain \s1\ql \li0\ri0\keepn\nowidctlpar\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \b\f11\fs11\cf1\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {Java +\par }\pard\plain \ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\f11\fs11\cf1\cgrid0 There are a couple of implementations of Neko for Java around the web... some better than others. +\par The best that the author has seen is at: +\par http://acm.cs.umn.edu/~chaz/html/jneko.htm. +\par +\par Alternatively, you can use the term "applet:neko" on http://www.altavista.digital.com to search for Neko Java Applets.\page }{\cs18\f11\fs11\cf1\super\cgrid0 #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ Other_Programs}}${\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super $}{ + Other Programs}}K{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super K}{ Freeware; By The Same Author}}}{\f11\fs11\cf1\cgrid0 +\par }{\b\f11\fs11\cf1\cgrid0 Other Programs}{\f11\fs11\cf1\cgrid0 +\par The author has written other }{\f11\fs11\cf6\cgrid0 freeware}{\f11\fs11\cf1\cgrid0 programs, which are available from: +\par http://www.geocities.com/SiliconValley/Haven/4173/ +\par +\par \page }{\cs18\f11\fs11\super #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{\f11\lang1031\langfe1033\cgrid0\langnp1031 Neko98}}$ +{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super $}{\f11\lang1031\langfe1033\cgrid0\langnp1031 Neko98}}K{\footnote\ftnalt \pard\plain +\s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super K}{\f11\lang1031\langfe1033\cgrid0\langnp1031 License;Terms Of Use;About}}}{\f11\fs11\cf1\cgrid0 +\par }{\b\f11\fs11\cf1\cgrid0 Neko95/98}{\f11\fs11\cf1\cgrid0 was ported by David Harvey from the original X-Windows source code by Masayuki Koba. +\par +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 {\b\f11\fs11\cf1\cgrid0 License +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 {\f11\fs11\cf1\cgrid0 This program is FREEWARE. This means that yo +u can distribute it to anyone you like, as long as no fee is charged (except for a small disk-copying fee) and that every file is passed on. +\par +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 {\b\f11\fs11\cf1\cgrid0 Terms Of Use +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 {\f11\fs11\cf1\cgrid0 This program is totally unsupported and you use it at your own risk. Neither the author nor anyone in +volved in the distribution of this program can be held responsible for any damage or loss of revenue that the use of this program may cause. +\par }\pard\plain \s21\ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \f11\fs11\cf1\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 { +As this program is unsupported, the author is under no obligation to read or reply to any questions regarding the operation of this program. +\par \page }{\cs18\super #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ Whats_New}}${\footnote\ftnalt \pard\plain +\s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super $}{ What's New}}K{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super K}{ New in version 4.0g}}}{ +\par }{\b What's New +\par }{New in Neko for Windows 95/98 version 4g: +\par +\par {\pntext\pard\plain\s21 \f3\fs11\cf1\lang2057\langfe1033\langnp2057 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \s21\ql \fi-360\li360\ri0\nowidctlpar\jclisttab\tx360{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent360\pnsp120\pnhang{\pntxtb \'b7}} +\faauto\ls1\adjustright\rin0\lin360\itap0 {Footprints +\par {\pntext\pard\plain\s21 \f3\fs11\cf1\lang2057\langfe1033\langnp2057 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \s21\ql \fi-360\li360\ri0\nowidctlpar\jclisttab\tx360{\*\pn \pnlvlblt\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent360\pnsp120\pnhang{\pntxtb \'b7}} +\faauto\ls1\adjustright\rin0\lin360\itap0 {Always on top bug fix. This should (hopefully!!!) squash the always on top crash bug. +\par }\pard \s21\ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 { +\par \page }{\cs18\super #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ Active_Desktop}}${\footnote\ftnalt \pard\plain +\s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super $}{ Active Desktop}}K{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super K}{ Active Desktop; Flicker}}}{ +\par }{\b Active Desktop Flicker}{ +\par If you have chosen an animated .gif file as your wallpaper, Neko will flicker quite badly. It is recommended that instead of selecting the animated .gif as wallpaper, you add it as an activ +e desktop component, via the 'web' tab in your display properties. This will mean that Neko will not flicker unless running directly over the picture. +\par If you have selected to 'tile' the animated .gif, rather than 'center' it, it is not possible to eliminate the flickering. +\par +\par }{\b Technical Description of the Cause +\par }{The flickering is due to the fact that Windows is drawing the desktop at the same time as Neko is being drawn. Because Windows doesn't control Neko, these two drawings are out of sync, and Windows erase +s the picture of Neko on the desktop and Neko then erases himself as well. These two factors combine to make Neko appear and disappear quickly, causing the flicker. +\par \page }{\cs18\super #{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super #}{ Common_Problems}}${\footnote\ftnalt \pard\plain +\s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super $}{ Common Problems}}K{\footnote\ftnalt \pard\plain \s15\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 +\fs20\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cs18\super K}{ Sounds Don\rquote t Work; FAQ; Common Problems}}}{ +\par }{\b Common Problems}{ +\par +\par }{\ul I can't get the sounds to work! +\par {\pntext\pard\plain\s21 \f3\fs11\cf1\lang2057\langfe1033\langnp2057 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \s21\ql \fi-360\li360\ri0\nowidctlpar\jclisttab\tx360{\*\pn \pnlvlblt\ilvl0\ls2\pnrnot0\pnf3\pnstart1\pnindent360\pnsp120\pnhang{\pntxtb \'b7}} +\faauto\ls2\adjustright\rin0\lin360\itap0 {Make sure that the frequency slider is not set to "none". +\par {\pntext\pard\plain\s21 \f3\fs11\cf1\lang2057\langfe1033\langnp2057 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \s21\ql \fi-360\li360\ri0\nowidctlpar\jclisttab\tx360{\*\pn \pnlvlblt\ilvl0\ls2\pnrnot0\pnf3\pnstart1\pnindent360\pnsp120\pnhang{\pntxtb \'b7}} +\faauto\ls2\adjustright\rin0\lin360\itap0 {Make sure that you have a valid .wav file selected for each event - download the sample sound pack from the Neko home page. +\par }\pard \s21\ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 { +\par }{\ul How can I make Neko start when I start my computer?}{ +\par Follow these steps: +\par {\pntext\pard\plain\s21 \f11\fs11\cf1\lang2057\langfe1033\langnp2057 \hich\af11\dbch\af0\loch\f11 1.\tab}}\pard \s21\ql \fi-360\li360\ri0\nowidctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec\pnstart1\pnindent360\pnsp120\pnhang{\pntxta .}} +\faauto\ls3\adjustright\rin0\lin360\itap0 {Click on the start button. +\par {\pntext\pard\plain\s21 \f11\fs11\cf1\lang2057\langfe1033\langnp2057 \hich\af11\dbch\af0\loch\f11 2.\tab}}\pard \s21\ql \fi-360\li360\ri0\nowidctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec\pnstart1\pnindent360\pnsp120\pnhang{\pntxta .}} +\faauto\ls3\adjustright\rin0\lin360\itap0 {Select settings, followed by taskbar. +\par {\pntext\pard\plain\s21 \f11\fs11\cf1\lang2057\langfe1033\langnp2057 \hich\af11\dbch\af0\loch\f11 3.\tab}}\pard \s21\ql \fi-360\li360\ri0\nowidctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec\pnstart1\pnindent360\pnsp120\pnhang{\pntxta .}} +\faauto\ls3\adjustright\rin0\lin360\itap0 {Click the "Start Menu Programs" tab on the window that appears. +\par {\pntext\pard\plain\s21 \f11\fs11\cf1\lang2057\langfe1033\langnp2057 \hich\af11\dbch\af0\loch\f11 4.\tab}}\pard \s21\ql \fi-360\li360\ri0\nowidctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec\pnstart1\pnindent360\pnsp120\pnhang{\pntxta .}} +\faauto\ls3\adjustright\rin0\lin360\itap0 {Click the "Add..." button. +\par {\pntext\pard\plain\s21 \f11\fs11\cf1\lang2057\langfe1033\langnp2057 \hich\af11\dbch\af0\loch\f11 5.\tab}}\pard \s21\ql \fi-360\li360\ri0\nowidctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec\pnstart1\pnindent360\pnsp120\pnhang{\pntxta .}} +\faauto\ls3\adjustright\rin0\lin360\itap0 {Click "Browse", select the Neko program and click "Next" +\par {\pntext\pard\plain\s21 \f11\fs11\cf1\lang2057\langfe1033\langnp2057 \hich\af11\dbch\af0\loch\f11 6.\tab}}\pard \s21\ql \fi-360\li360\ri0\nowidctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec\pnstart1\pnindent360\pnsp120\pnhang{\pntxta .}} +\faauto\ls3\adjustright\rin0\lin360\itap0 {In the list of folders, choose "StartUp" and click "Next" +\par {\pntext\pard\plain\s21 \f11\fs11\cf1\lang2057\langfe1033\langnp2057 \hich\af11\dbch\af0\loch\f11 7.\tab}}\pard \s21\ql \fi-360\li360\ri0\nowidctlpar\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pndec\pnstart1\pnindent360\pnsp120\pnhang{\pntxta .}} +\faauto\ls3\adjustright\rin0\lin360\itap0 {Click "Finish" +\par }\pard \s21\ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 { +\par }{\ul I can't delete the Neko configuration program or the main Neko program - it says that it's being used by Windows +\par {\pntext\pard\plain\s21 \f3\fs11\cf1\lang2057\langfe1033\langnp2057 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \s21\ql \fi-360\li360\ri0\nowidctlpar\jclisttab\tx360{\*\pn \pnlvlblt\ilvl0\ls4\pnrnot0\pnf3\pnstart1\pnindent360\pnsp120\pnhang{\pntxtb \'b7}} +\faauto\ls4\adjustright\rin0\lin360\itap0 {Make sure that the program isn't running. +\par {\pntext\pard\plain\s21 \f3\fs11\cf1\lang2057\langfe1033\langnp2057 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \s21\ql \fi-360\li360\ri0\nowidctlpar\jclisttab\tx360{\*\pn \pnlvlblt\ilvl0\ls4\pnrnot0\pnf3\pnstart1\pnindent360\pnsp120\pnhang{\pntxtb \'b7}} +\faauto\ls4\adjustright\rin0\lin360\itap0 {If Neko is running, run the program a second time - this will close Neko. +\par }\pard \s21\ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 { +\par }} \ No newline at end of file diff --git a/nkosrc4/Neko98/NekoSettings.cpp b/nkosrc4/Neko98/NekoSettings.cpp new file mode 100755 index 0000000..55e4849 --- /dev/null +++ b/nkosrc4/Neko98/NekoSettings.cpp @@ -0,0 +1,73 @@ +/************************************ + + Neko's configuration + + *************************************/ + +#define WIN32_LEAN_AND_MEAN +#include +#include "NekoSettings.h" + +CNekoSettings::CNekoSettings( LPCSTR key, BOOL fCreate /*TRUE*/ ) +{ + m_hKey = NULL; + if( fCreate ) + { + DWORD dwDisposition; + RegCreateKeyEx( HKEY_CURRENT_USER, key, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &m_hKey, &dwDisposition ); + } + else + { + if( RegOpenKeyEx( HKEY_CURRENT_USER, key, 0, KEY_READ|KEY_WRITE, &m_hKey ) != ERROR_SUCCESS ) + m_hKey = NULL; + } +} + +CNekoSettings::~CNekoSettings() +{ + if( m_hKey ) RegCloseKey( m_hKey ); +} + +BOOL CNekoSettings::IsOpen() +{ + return( m_hKey != NULL ); +} + +BOOL CNekoSettings::GetString( LPCSTR keyname, LPSTR result, ULONG size ) +{ + DWORD dwType; + return ( RegQueryValueEx( m_hKey, keyname, NULL, &dwType, (LPBYTE)result, &size ) == ERROR_SUCCESS ); +} + +BOOL CNekoSettings::GetInt( LPCSTR keyname, DWORD * result ) +{ + DWORD dwType; + ULONG ulSize = sizeof(DWORD); + return ( RegQueryValueEx( m_hKey, keyname, NULL, &dwType, (LPBYTE)result, &ulSize ) == ERROR_SUCCESS ); +} + +BOOL CNekoSettings::GetBool( LPCSTR keyname, BOOL * result ) +{ + DWORD dwType; + ULONG ulSize = sizeof(BOOL); + return ( RegQueryValueEx( m_hKey, keyname, NULL, &dwType, (LPBYTE)result, &ulSize ) == ERROR_SUCCESS ); +} + + +BOOL CNekoSettings::SetString( LPCSTR keyname, LPSTR value ) +{ + ULONG ulSize = strlen( value ) + 1; + return ( RegSetValueEx( m_hKey, keyname, NULL, REG_SZ, (LPBYTE)value, ulSize) == ERROR_SUCCESS ); +} + +BOOL CNekoSettings::SetInt( LPCSTR keyname, DWORD value ) +{ + ULONG ulSize = sizeof(DWORD); + return ( RegSetValueEx( m_hKey, keyname, NULL, REG_DWORD, (LPBYTE)&value, ulSize ) == ERROR_SUCCESS ); +} + +BOOL CNekoSettings::SetBool( LPCSTR keyname, BOOL value ) +{ + ULONG ulSize = sizeof(BOOL); + return ( RegSetValueEx( m_hKey, keyname, NULL, REG_BINARY, (LPBYTE)&value, ulSize ) == ERROR_SUCCESS ); +} diff --git a/nkosrc4/Neko98/NekoSettings.h b/nkosrc4/Neko98/NekoSettings.h new file mode 100755 index 0000000..1d778f6 --- /dev/null +++ b/nkosrc4/Neko98/NekoSettings.h @@ -0,0 +1,28 @@ +/************************************ + + Neko's configuration header file + + *************************************/ + +#define WIN32_LEAN_AND_MEAN +#include +#include "NekoCommon.h" + +class CNekoSettings { +public: + CNekoSettings( LPCSTR key, BOOL fCreate = TRUE ); + ~CNekoSettings(); + + BOOL IsOpen(); + + BOOL GetString( LPCSTR keyname, LPSTR result, ULONG size ); + BOOL GetInt( LPCSTR keyname, DWORD * result ); + BOOL GetBool( LPCSTR keyname, BOOL * result ); + + BOOL SetString( LPCSTR keyname, LPSTR value ); + BOOL SetInt( LPCSTR keyname, DWORD value ); + BOOL SetBool( LPCSTR keyname, BOOL value ); + +private: + HKEY m_hKey; +}; diff --git a/nkosrc4/Neko98/Pet.cpp b/nkosrc4/Neko98/Pet.cpp new file mode 100755 index 0000000..b5fcfd9 --- /dev/null +++ b/nkosrc4/Neko98/Pet.cpp @@ -0,0 +1,159 @@ +// Pet.cpp: implementation of the CPet class. +// +////////////////////////////////////////////////////////////////////// + +#include "Pet.h" + +////////////////////////////////////////////////////////////////////// +// Construction/Destruction +////////////////////////////////////////////////////////////////////// + +CPet::CPet() +{ + //prepare empty icon table + m_nIcons = 0; + m_nLastIcon = -1; + m_hIcons = NULL; + + //set initial and old position + m_ptPosition.x = 0; + m_ptPosition.y = 0; + m_ptOldPosition.x = -1; + m_ptOldPosition.y = -1; + + //set initial size and scale + m_sizeImage.cx = 0; + m_sizeImage.cy = 0; + m_fScale = 1.0f; + + //set initial bounding box (none) + SetRect( &m_rcBounds, -1, -1, -1, -1 ); +} + + + +CPet::~CPet() +{ + //delete the images + DestroyImages(); +} + + +////////////////////////////////////////////////////////////////////// +// Member Functions +////////////////////////////////////////////////////////////////////// + + +void CPet::SetImages( HICON* hIconTable, int nIcons ) +{ + //delete current images + DestroyImages(); + + //we can't have 0 images + if( nIcons <= 0 ) + { + nIcons = 1; +#ifdef DEBUG + OutputDebugString( "WARNING: CPet::SetImages() passed 0 as nIcons\n" ); +#endif + } + + //FIXME: it might be possible to use CopyImage() passing it the *scaled* width and height + //in combination with the LR_COPYFROMRESOURCE. This might fix the non-32x32 icon problem + + //allocate icon table and clear all entries + m_hIcons = new HICON[nIcons]; + for( int i = 0; i < nIcons; i++ ) m_hIcons[i] = CopyIcon(hIconTable[i]); + + //store icon table size and set last drawn icon index + m_nIcons = nIcons; + m_nLastIcon = -1; + + //get size of first icon + ICONINFO ii; + GetIconInfo( m_hIcons[0], &ii ); + + BITMAP bm; + GetObject( ii.hbmMask, sizeof(BITMAP), &bm ); + DeleteObject( ii.hbmMask ); + DeleteObject( ii.hbmColor ); + + //calculate scaled size + m_sizeImage.cx = int( bm.bmWidth * m_fScale ); + m_sizeImage.cy = int( bm.bmHeight * m_fScale ); +} + + + +void CPet::DestroyImages() +{ + //delete all images, if any + if( m_nIcons > 0 ) + { + //delete all icons in the table + for( int i = 0; i < m_nIcons; i++ ) DestroyIcon( m_hIcons[i] ); + + //delete the table + delete[] m_hIcons; + m_hIcons = NULL; + } +} + + + +void CPet::SetImage( int nImage ) +{ + //only draw if the image has changed + if( nImage != m_nLastIcon ) + { + Erase(); + Draw( nImage ); + m_nLastIcon = nImage; + } +} + + + +void CPet::MoveTo(int nNewX, int nNewY) +{ + if( m_ptOldPosition.x == -1 ) + { + //set old position to the current position as we've not been moved before + m_ptOldPosition.x = nNewX; + m_ptOldPosition.y = nNewY; + } + else + { + //store current position + m_ptOldPosition.x = m_ptPosition.x; + m_ptOldPosition.y = m_ptPosition.y; + } + + //remove current + Erase(); + + //change current position + m_ptPosition.x = nNewX; + m_ptPosition.y = nNewY; + + //redraw + Draw( m_nLastIcon ); +} + +void CPet::SetImageAndMoveTo(int nImage, int nNewX, int nNewY) +{ + //change image + m_nLastIcon = nImage; + + //move + MoveTo( nNewX, nNewY ); +} + + +void CPet::SetScale(float fScale) +{ + if( fScale != 0.0f ) + m_fScale = fScale; + else + m_fScale = 1.0f; +} diff --git a/nkosrc4/Neko98/Pet.h b/nkosrc4/Neko98/Pet.h new file mode 100755 index 0000000..b2bb8b3 --- /dev/null +++ b/nkosrc4/Neko98/Pet.h @@ -0,0 +1,63 @@ +// Pet.h: interface for the CPet class. +// +////////////////////////////////////////////////////////////////////// + +#if !defined(AFX_PET_H__A69EBAA0_385D_11D2_9FF9_00001C192944__INCLUDED_) +#define AFX_PET_H__A69EBAA0_385D_11D2_9FF9_00001C192944__INCLUDED_ + +#if _MSC_VER >= 1000 +#pragma once +#endif // _MSC_VER >= 1000 + +#define WIN32_LEAN_AND_MEAN +#include + +class CPet { + +public: + //constructor/destructor + CPet(); + virtual ~CPet(); + + //public configuration functions + virtual void SetImages( HICON* hIconTable, int nIcons ); + virtual void SetScale( float fScale ); + + //public interface + virtual void SetImageAndMoveTo( int nImage, int nNewX, int nNewY ); + virtual void MoveTo( int nNewX, int nNewY ); + virtual void SetImage( int nImage ); + + virtual void DrawOnTarget( int x, int y, HICON hIcon ) {}; //no default implementation + + //data member access + inline RECT GetBoundsRect() { return m_rcBounds; }; + inline POINT& GetPosition() { return m_ptPosition; }; + inline POINT& GetOldPosition() { return m_ptOldPosition; }; + inline SIZE GetSize() { return m_sizeImage; }; + +protected: + + //pure virtual functions + virtual void Erase() = 0; + virtual void Draw( int nImage ) = 0; + + //image destruction + virtual void DestroyImages(); + + //icon information + HICON* m_hIcons; + int m_nIcons; + int m_nLastIcon; + + //position & size information + POINT m_ptPosition; + POINT m_ptOldPosition; + SIZE m_sizeImage; + float m_fScale; + + //bounding box information + RECT m_rcBounds; +}; + +#endif // !defined(AFX_PET_H__A69EBAA0_385D_11D2_9FF9_00001C192944__INCLUDED_) diff --git a/nkosrc4/Neko98/Res/Awake.ico b/nkosrc4/Neko98/Res/Awake.ico new file mode 100755 index 0000000000000000000000000000000000000000..b42362f2afd56ef58f469a56ec4d85c763b3b7f6 GIT binary patch literal 766 zcmbtPJ5ob24BSUDLx)q*zE^UKa1~AxbCMh-&TtUIqzI+EybK}B%D)$8XaLzOOY&M? z0iD(`EMWG21KjI;5C-8<=rEU;>F#IqfHu6(hrB|B5OmrF(*|jgpk*a<|2Idv2upk8`e}IOwY!a%(JGct&rM)PBm6nYqh&wByHP)#fxhAb zEIDAsoe<|sj(0uJeb0Ei;ciBTj`UJr;5^=HeDYWy!t-Ih-JbaL!pnZY`aB*tALMKO F_X{dR+H3#- literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/Down1.ico b/nkosrc4/Neko98/Res/Down1.ico new file mode 100755 index 0000000000000000000000000000000000000000..085d86e9cb8ba0c5eaba25e8b8feacc0280a8c0d GIT binary patch literal 766 zcmchVJCeg75JX#RS8a$Rr&74L@ZL;18b@*HkkElj<2S(A_1=vzhKaw6+`=Mi^SBjw2hUca?b27Se-KS6JYq2FaKldxe}GF+$&qMI^(8T zLAKI)QRiwGG~e_T4xWyPP7`Y7z2+xQPLi|^62%KK(WCP=LNCto=p9#YB6>Yi@c{7P zt$}!;t60eO!^14G@h^K|mU-QW8|G>Mgqgfuj!+DcVSNaL8(&%U3U*WzTGqGk1 QIr7fz{B5?L-m%Sg16McdmjD0& literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/Downleft2.ico b/nkosrc4/Neko98/Res/Downleft2.ico new file mode 100755 index 0000000000000000000000000000000000000000..b646a5f1b37cc9e81886764ec47f517b06b5f653 GIT binary patch literal 766 zcmcJLF;>Gs3`EC}eyM2VGPejf!$;eWjx&TuLCP&t@DN{G#oq8JXplXYMp}*Jl_s8f zevsSwPI|;2zzm+iq#a+3+V8eVyjqs-_!6qtiuZ!WD>IJ(kEi_eUseWTpHJdgWd2%r9_@Ml2lrbU>jUoty&MX8d&YvX z;+3nfL@s`>sdSCxBy-2@MqG0%=YjRU2yUuTaE(nMM8}4|#y?Z&PfT*XVGE zv(c?qxOKmgt(#R3vnW>w1`*EJeCFKnAkS8pw_EkMV6(zK*~-n^^>Q9lY(gq(4VPr9 zv2d3yq8zC5+I{8qu!UEu#A>z~-5|<2oto{1fkz<|=W7TST1IRvezJbECrK1L!A<6F_hxQ) zLZpso9M9!=J&`WhufYfopwlTU0rz`M60fGIZLFlKwX&Otd==pg@c78fKSh~$g9`aJ zx+n@xRzaCVK3Ic;*hF%4MBQ@SFAX4C@1ggfTv_R2Cj5eJOv!>U+wy(8zJKrPP zJjNCKaGjPoNGc1c6qqN_u68J$XZ>Y8b6;qN+NW&wMyFt3rm0l^eMzT3mzS%E#}dan w#8ExyhDGW@2V~rkUxG960Cy)16+D4i-TjC9XYRf)8e+-cNzZy4@%DY#CmOl^ZU6uP literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/Rightclaw2.ico b/nkosrc4/Neko98/Res/Rightclaw2.ico new file mode 100755 index 0000000000000000000000000000000000000000..af0245021715fedd6440fed714e8860124cf5680 GIT binary patch literal 766 zcmcgoITFG!4BP}}pfeS9N*=*X_!<5IU-DB@Ql_L}SXRDbj-f=hENOKc=yZl*2cv5b z>?IH4L3|Q-SnCzZ_nkbT3-6QAD-|IGNpmn>kfw=s46^4hq)xswIv_+4OUcCY~f>zdpH{g5+ eM&pMK0y#Z;1;vdi!xzd>XY!kqVX-XSc9x=}|cO@)NnCV1tD5T{#3rkz~pC72i3S)GufU+`g znY^$4Ot%vT=g%F(k_i0`M<15-?ft2vG?%E9cX=sLd9a0}lzabjg^}|7L{~>t9ZJ3U z8efWCeI%`aD+fxm=H!2A+i129EuI&%sgrWsfU(933`Zy*@2e))sW!r6+MSpE-Za4N ATmS$7 literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/Up2.ico b/nkosrc4/Neko98/Res/Up2.ico new file mode 100755 index 0000000000000000000000000000000000000000..0bf3326d392764cf80cfec144ad4a5acae06dd39 GIT binary patch literal 766 zcmbtQITFG!4BP-Sl%k?e$uGjs$WQo6o0huuOKb%%^HDw3zhM2ArP?3*Jh#$MtkdJ4k1DRr=I2}d()QxM9^9MW@4)Gk Taz6E}y1X|6-8a>JA3J{lMbY>7 literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/Upleft1.ico b/nkosrc4/Neko98/Res/Upleft1.ico new file mode 100755 index 0000000000000000000000000000000000000000..67caa8325f2f72bd6908fd51cde240f3de9f6316 GIT binary patch literal 766 zcmcJLJ#xb!5QU#&&$!%FX{9oyZ{XZ4Izo=5qqs~-Y0r3qzhwbg9=BO|ERVN8fHW|s z>0NHWZ_)?;6HMR>4BE3|Xs>OSn40HstZcO`3*LoXrgHWjVEBa}=}UwLgG!M$A9d$}4A;Vrs% z_XBc5Rb*|te1-g&rE;|L}&|LyiQ}zscA;JKl#AY2X>h zC)vL5q-XY5FoHKQ=z$eO``fa_tDLuu6<5A{;%f$n%jDt$NCzsM(V&0Jxh-d-YDHonPp-?N#y zJFMhy>y$%o-?F>QucyMu5dD<$UQyI-Lyyiv~fHVs9=ee{uL~m tf&bEQ!L0k3m?A5!(o1D#21v7p&j~5((NcVXivI-`;uWlVZ?~aYvtLlF0?+^e literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/Upright1.ico b/nkosrc4/Neko98/Res/Upright1.ico new file mode 100755 index 0000000000000000000000000000000000000000..3a6eef5983dadc6953e52a58388e195c8b44bb11 GIT binary patch literal 766 zcmcJMF>b>!3`M`206~EQ?9??LdyC{|^-X#eA0=Z)j~RlpkCLd^Mb^;%qQ3Y=Qj#?A zjpMt*eqN*x{3jT}84TJpV#FTXB=KvSs$*oTd7kkR@bb$&W`Hl2Vt9_3FEz0h?@0x> zg}Rn?X#u`e9g9RuV{N~TF0s3ya_<|Gx3e^TJ!#~794{9TJ!HJM*z}!uL7pfD*yX8wIKe`Eh1 pOa%v@wQCsg2{D&nO1-Elze=Z@bo>PbjfKR4`71br6ZrD0`yX&F1}y*p literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/Upright2.ico b/nkosrc4/Neko98/Res/Upright2.ico new file mode 100755 index 0000000000000000000000000000000000000000..1702c9df112c204ec35ce31bfaa9b8a45a92d725 GIT binary patch literal 766 zcmb7>JyHZA5QX2URU5XE>5P%yV!YXM6R*Ni3=J_evi%wcWXmn9?3o8VUjG5o!nbYr z3VXki9+;oO2429TJ4Oucx+RHUDYc1_rE<>9A$a}e9xK2XTQOWQE0>#pal>`iV{KE~ z#@&0$(2T;}#ZYD*O;z3l;3fPgUL9sW>uTYnfXr(ANbt*{2OJp>_fgUc{ge_(`n4P_ zj+8BAI(Mt6ABS3_Jwhb0izCEK#7;j_<@gLv192~d*DEZVxD1Eh-hXC)C2?Fh*ue@+ zXR!N8D>+wB^fDvsL@&2s@lWYYA3Ly*gpd*55JD_^WW9qY_E)g`7s=~ssEK_8QStO0 literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/down2.ico b/nkosrc4/Neko98/Res/down2.ico new file mode 100755 index 0000000000000000000000000000000000000000..1ad46ca858f60eb4d3a25f0075d387a2150b57d5 GIT binary patch literal 766 zcmb7>F>b>!3`M_-?CO-+W5?W}y+O~@$sTer1Ko3nOzlXZQs@F0_)G;;&ETEzsZfquk{nXQek}{JdfH?vf#Eh zm_iL|UeP^*#{brjY*@|zpIfr-1JN$U+I{>Acwc|ROS1J>8zJV#KEB-FuMIQXTSyZR Zn0}<^Z|ODGyQt@O^W)^_ldrhE`7c>M@kRgu literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/downclaw1.ico b/nkosrc4/Neko98/Res/downclaw1.ico new file mode 100755 index 0000000000000000000000000000000000000000..fe7892d993615ac68fb908eb24cd989364d66265 GIT binary patch literal 766 zcmbV}y;1`)421UxGbx>lHdpc%;mx=%uXS%g3eu;fbVJ8v`DEWO$uI-5*SfVm;VSt~ype)%QI<0xnZ_d;vym#qxj4>(ulcPu4Qd z&Catv+06MkXTmpp*4Oxg$9et>&on>i$xIYeN+?@Si5@DgKdTCd_csO1HYz-APiz zXxk@c`@EB$*bj0S2VAD?>;XnT%FBN&U0u3Pv*lrR zl&I_~NwAqq(tsdU0?2Ki^VRx4dE)V7189R26=;ueFn h%b@n-Svq`6#|boWDt9_^3_JULu)n}?WIw@O><6F>?Zf~8 literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/downleft1.ico b/nkosrc4/Neko98/Res/downleft1.ico new file mode 100755 index 0000000000000000000000000000000000000000..81ad62a5752829b0cd5f87fb1500d664e18ff9cc GIT binary patch literal 766 zcmb7=Jx&8L5QWDq5*l zNvv_)h{@NT$P@Y*j9?Fv+;bxM{+3CEEz=Z=ldF_c(B@FzqG~t5GLs#*O0H3B$#aga zi52d-#rJ*kuYhV}tN|ISYE?sWR!p@8826OkFS)ghd@>e))N3Qm^;L%h9U>B16!TIo+*ms0iA$gmjl?nh-}}$w*{X;1sB8Ppmj)kNk_d7OH0>3FBI*v literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/downright2.ico b/nkosrc4/Neko98/Res/downright2.ico new file mode 100755 index 0000000000000000000000000000000000000000..2415acec358bba9ab9cabd4e62338556bf487c56 GIT binary patch literal 766 zcmcJKF>b>!3`M`203Ma8Ydm)A5z;&50P)sqdCNgMq@zX;LD)yhvXr1ex|G(Z`1xs) zk~+R&*vaktMSA6a0|WQ~owj%k?ROg`j>a)xctTCn#O;EmBQuWxpQqgYi^cn{AubCn zX&)b~7FmGVnh1&47W^Kmw-|B`MzvdNfx>YM54_QNEp3aQ8a(4PO!K(Qz{>N;!hJc` zEA?qRh86C+nWFOk%d*Y$vz{O4-g%XCVpaY3J5djGt^7-nMz`(@G95u@HtGZpJmVeo iH)(UNP!snvdV^2mGq_yU+fBh{?OF3+^M?NWI`9V?dHs3- literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/fp_down.ico b/nkosrc4/Neko98/Res/fp_down.ico new file mode 100755 index 0000000000000000000000000000000000000000..bb42428aba1974953d0495493ea4a81f4547bff3 GIT binary patch literal 766 zcmeH_u@Qqn3}c9DKIym=G1Ku$#Yr0sg=bdE0AeFQdK9_R-sWdnso4 E0H|J&9{>OV literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/fp_downleft.ico b/nkosrc4/Neko98/Res/fp_downleft.ico new file mode 100755 index 0000000000000000000000000000000000000000..eca0e732e3933d910c4030fec659cf16619f3a47 GIT binary patch literal 766 zcmeH_u?>JQ3raDTR!MpDp*8fQqBAU!Q&f{=nPXxnPC`HW+SJ(huiRlGp$M literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/fp_downright.ico b/nkosrc4/Neko98/Res/fp_downright.ico new file mode 100755 index 0000000000000000000000000000000000000000..50a72641327794b7798b87ba047da5cd6ffdf5fa GIT binary patch literal 766 zcmeH_u?>JQ3YcW09` literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/fp_up.ico b/nkosrc4/Neko98/Res/fp_up.ico new file mode 100755 index 0000000000000000000000000000000000000000..e3a661b3310e25f44be834f928bbc5e63264fc6a GIT binary patch literal 766 zcmeH_D-wf15JVd)2Z+M5GL9pF<5=0F?Qw7v7AQJzz{W;}p6O3byRDTfCZ(qWQ!O?4 z3nnZW E0J{{B9{>OV literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/fp_upleft.ico b/nkosrc4/Neko98/Res/fp_upleft.ico new file mode 100755 index 0000000000000000000000000000000000000000..a71d62324399ad652058ed18924730a1b860581e GIT binary patch literal 766 zcmeH_u?>JQ3QU;|(;A!a{gZegT0TniY#G>Gmy~`x-=cPpD+$pp*Qcn($ vVT7a>N8Fxe5-qbUa7L9<$T;}fa*qk9ScU!i^b7C@e1Yj^CU;n&!rM9kChL=o literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/left1.ico b/nkosrc4/Neko98/Res/left1.ico new file mode 100755 index 0000000000000000000000000000000000000000..72d7ac07714b483176521bece0a7dbb0b71f675b GIT binary patch literal 766 zcmchTJx;_x429nkB+8*ebfl!@07!wOaFWaoxYAHja)n3~P^R2!&1XBin@Cg?c;?yj z?D!{^cAUPymdp2rbc4MIJ$M2;U7`_Uze|<4sx=Lor&?=R4_I88`3rE|A%6x#%IwbQNhXfq(GiY>;sbAU;!!grp^r=B zgRDoX*xFK0ObMq(7UUNcV|hgv4;M$$9O%r?8^}13MKa;Yu=$AE*oUkvid;CxzVak^yey+zn5u*%pDE{5xz>l7qCJK)-8y

Q~oPfmDDwAGA!EOUhPKwK|`TzinPm{=7c<%j#Y~_#&U~ba%M`PcZp| literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/leftclaw1.ico b/nkosrc4/Neko98/Res/leftclaw1.ico new file mode 100755 index 0000000000000000000000000000000000000000..14f751d96c96c9f7ba17585dac3fea3abae2f6ba GIT binary patch literal 766 zcmchUv2DaK3`M_l0j|_l*T!W=ND&|&0To*i{mSth}gvBc}j{uKvx%&r8-l=N^ zFJ@)eIqfQ9z^=lxZtI!K@J*v}bp3(}^)Mm|l6P~1l&VyHRf|mIJ29WQH7f{o>2;K~ zb#lqlYEgi&(WIP5^NrWx{^s$my7TdyHhB(mpY3??9j%w{wo(`W2;D8(%-~6aWAK literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/leftclaw2.ico b/nkosrc4/Neko98/Res/leftclaw2.ico new file mode 100755 index 0000000000000000000000000000000000000000..1a16e32e429f33da25aa803a85f43ccdb7ad9a19 GIT binary patch literal 766 zcmcgnK@x&65DVfA$Mxh@jy}Q}_?dkgPvPjX-W}JZEg<4}G$n1*Zj%M5INJ6A;kE;g zT+d`n_GE=UXM%U%5deM&AupV{#V`z9b>ZoQyLKdpjx_xNrlhwh>gXO<$(Aan!>9&5 zT6tu;6{a^?EuKXeN27Z})}}O}yrx<9TXZfc&sCb@vzAQwD(S@9I5h^gtm0w?7?Ss* zb91xCM!#jHD(Tr?Cm&LgE7+=9E&M=A`b>!3_RBXG%8b9dF(Her}QT=kcadu%9Jrrh{ui^GX!OhCpoo&ZXH7DNF7O0 zlmv7f!?1R5 zKvYi=^ht^-To8+QTB1`#_ma9OO$*VwkqKr}3$D2K>(-T0d&-meV#z)9l zj=YW^Idghdw{cMwkiYiTs&iirdxce)3FIo#GW@BQyt)5nR<~b~`}tzGK3ER;)Gs9- pv?C6=B1}L}biWw;(&fGcVmF0}pLVi)I@(VPW{FSqmCUZoV;)E$^Oyht literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/rightclaw1.ico b/nkosrc4/Neko98/Res/rightclaw1.ico new file mode 100755 index 0000000000000000000000000000000000000000..5402c8416c2bfd46c62cdb9b594464b330df22f8 GIT binary patch literal 766 zcmchVF>b>!3`J?TNIONDGG*}CLj*~W=A-E-88Zs#(xEW(NSd~TcJ7zI#7~M8C0L|m z48uVT_g>`4`T+;{2|IaZ2E_ixD8eV>7z;C|)LL0Bp#F)fS&(5aoBjoyq-8y+pf;Ld zTZ2M0`gETuL+%L092v!~;+SDQg5YitC)vQ>+Gu)M) zLVmL&6DHRRQG;d|Sc&KTzx8H&yvmY|vD_z}dB4=#>h9ZgmwWQD@T^3;JNZa3~xR)tLxKCg8bpB=>Xo6krpGLAtxNppUQ@KUd0(pT~5MN&-HISisj zqoc6=7S36vxeJ%IANiRc7fbz|kJ9`v@At(o%;%(hk*rznArJmfi(1OfYImdcC%+sR oz~Qd%)q{6{%~>HQaljtH8x%?D0welbckXonbU%SJxPTw>0A&;E;s5{u literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/scratch2.ico b/nkosrc4/Neko98/Res/scratch2.ico new file mode 100755 index 0000000000000000000000000000000000000000..abf109101cbc922ed2b29d8f6a92cf5479e6e976 GIT binary patch literal 766 zcmcJNJ#ND=429_;Ku31!YLC4|dX(OzKAMk`F{82>ND$_GR3!*Ox1yAv#6R&p!#0~( z%kpNj^NZO#=LcB8Cz$NOj#2yFRx=)3*Ltwy+O}<+DnvdOArG*W()M@r2ro$yQ8dmY zSNa*&xUqQ@)l)*U%O&}9TPc)1#l^>WSBDkQq8Fgh^ zs8RH{<}PNei>$@8%KH6EHO4ujwVRlSc5^BzxOWiuX*H>y|FJ5*?z^qi4$X~U4$Q(` o;udg9kxtI(5oU1QN$>XBQHT>?bClCDF6BF}e7d-R>&RC92SM84rvLx| literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/sleep1.ico b/nkosrc4/Neko98/Res/sleep1.ico new file mode 100755 index 0000000000000000000000000000000000000000..940a52d435081699ba56c89552c637495f79df83 GIT binary patch literal 766 zcmds!F%H5o3`Kt_f-y|2bmRzZa4;l#v>t_#F(X4&^X#@%MFMo8KgkTFP-65{>%qO3)0F za`L)!;5zbbS?tMiotOAeNOkjLOfCu7+)<9jWiFZBAR>$LBr{SbJf(d*lSKQXmB>(^b literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/upclaw1.ico b/nkosrc4/Neko98/Res/upclaw1.ico new file mode 100755 index 0000000000000000000000000000000000000000..bba2bab0dd9f6b0942f6467e9cc575e15203e689 GIT binary patch literal 766 zcmbVIu@S;B4E%81QJRX1J3_|@bg%&ehsBPp6?Mq%r49lI84^{E)R6kn=UKz(SXV6EHDc kfZZKv5~N7BRfPAT7!{Q_G@g&Wsm5v}?yDtv*b7HK0N5++rvLx| literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/upclaw2.ico b/nkosrc4/Neko98/Res/upclaw2.ico new file mode 100755 index 0000000000000000000000000000000000000000..3f30c6236a91f1f29bd091e362e0ce719d2e6674 GIT binary patch literal 766 zcmbVKF%p6>5M0z5ow10Ol`~NC1WSM5li(i~K7dc~6iZ9S%EDpY3j_k%=p~!W-W{7u z1|ZSMvK`Fs3t%sw3z={d60Ee!l>2Tapoy~VoK|g7*R{MQ=qE_q2^to%-Zj)1 zc;C+$nCX3<-;m)sOhsxjchaA5(ed``)}CZIT|7G3!gCsS_brK!$Z;gynyBcDJj oDR%?bh6iwNfg-^FLS;f4d=KUmDsL#_n8k@@hfPjyEAmqD4a9Qi?f?J) literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/wash2.ico b/nkosrc4/Neko98/Res/wash2.ico new file mode 100755 index 0000000000000000000000000000000000000000..8473b37c3f752168f8e5cd17dcd3191f2657ba64 GIT binary patch literal 766 zcmbu7J#ND=427TL03DU7YdrQA>CK{}`6wAX3h1K22>VfvWC`d{pp>2{^6^iGrHQpH z7rA_$q<8cOSimQkbmm0hewQe*72~crxoTZkv=dgg%=`ve?(*aR63jyKVzpW@7G8zo zah}!qU}>=TX>g`C3$dM5CauLwOjm8s@scf@i#HhU-tt*G-ltDCbZ>9*wAcK#0`rrf zTKzH%F$Z7hkte9~{gm;e9( literal 0 HcmV?d00001 diff --git a/nkosrc4/Neko98/Res/yawn2.ico b/nkosrc4/Neko98/Res/yawn2.ico new file mode 100755 index 0000000000000000000000000000000000000000..b1ae17702e8fa9aa44c2b724f354833c4c97a322 GIT binary patch literal 766 zcmbtSL2kk@5S#!~kKx3X9Q%v*XEi@F;v-aCdd!U+P^U8+M>tVYRk6VO$n;Dt0FvYP=Z5Q6yy}RiRj7aZT*wiTQC$D3v8G@Pf~DHKA|QV=kxez+R{l z_$Lnjnok|7dcRxU-)d)yjql|MX*Hf-_CF|;l`tSRgNkqZ<>Y(&H}J-8^}+L6ieJb< ek9FIRbFbxwOj7^I^MO1b$2gKHWX2DjbAke~zV*Im*Q*19 z&Nyyh`dR_ck}u*>{3Z@q>lP{YGetljVk| +#include +#include "tray.h" +#include "resource.h" + +BOOL CTray::AddIcon( HWND hWnd, HICON hIcon, UINT uID ) +{ + BOOL res; + NOTIFYICONDATA tnid; + + //fill in the structure + tnid.cbSize = sizeof(NOTIFYICONDATA); + tnid.hWnd = hWnd; + tnid.uID = uID; + tnid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP; + tnid.uCallbackMessage = MY_NOTIFYICON; + tnid.hIcon = hIcon; + strncpy( tnid.szTip, "Neko", sizeof(tnid.szTip) ); + + //give the command + res = Shell_NotifyIcon( NIM_ADD, &tnid ); + + //delete the icon + DestroyIcon( tnid.hIcon ); + + //increment the counter + if( res ) m_uIconCount++; + + return res; +} + +BOOL CTray::RemoveIcon( HWND hWnd, UINT uID ) +{ + BOOL res; + NOTIFYICONDATA tnid; + + //fill in the structure + tnid.cbSize = sizeof(NOTIFYICONDATA); + tnid.hWnd = hWnd; + tnid.uID = uID; + + //give the notify command + res = Shell_NotifyIcon( NIM_DELETE, &tnid ); + + //decrement the counter + if( res ) m_uIconCount--; + + return res; +} + +void CTray::ShowPopupMenu( HWND hWnd ) +{ + //get the mouse position + POINT mouse; + GetCursorPos( &mouse ); + + //create the popup menu + HMENU hMenu = CreatePopupMenu(); + AppendMenu( hMenu, MF_STRING, ID_SETTINGS,"&Settings" ); + AppendMenu( hMenu, MF_STRING, ID_EXIT, "E&xit" ); + SetMenuDefaultItem( hMenu, ID_SETTINGS, FALSE ); + + //display the menu + TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, mouse.x, mouse.y, 0, hWnd, NULL ); + + //destroy it + DestroyMenu(hMenu); +} + diff --git a/nkosrc4/Neko98/Tray.h b/nkosrc4/Neko98/Tray.h new file mode 100755 index 0000000..a6a61a7 --- /dev/null +++ b/nkosrc4/Neko98/Tray.h @@ -0,0 +1,35 @@ +/************************************ + + Tray Class: Very simple interface + onto the system tray + + *************************************/ + +#ifndef _TRAY_HPP +#define _TRAY_HPP + +#define WIN32_LEAN_AND_MEAN +#include + +//taskbar notification message +#define MY_NOTIFYICON (WM_USER+32) + + +class CTray { + +public: + CTray( HINSTANCE hInstance ) { m_uIconCount = 0; m_hInstance = hInstance; }; + + BOOL AddIcon( HWND hWnd, HICON hIcon, UINT uID ); + BOOL RemoveIcon( HWND hWnd, UINT uID ); + + void ShowPopupMenu( HWND hWnd ); + + UINT GetCount() { return m_uIconCount; }; + +private: + UINT m_uIconCount; + HINSTANCE m_hInstance; +}; + +#endif diff --git a/nkosrc4/Neko98/resource.h b/nkosrc4/Neko98/resource.h new file mode 100755 index 0000000..47606eb --- /dev/null +++ b/nkosrc4/Neko98/resource.h @@ -0,0 +1,61 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by Neko95.rc +// +#define IDI_AWAKE 101 +#define ID_SETTINGS 101 +#define IDI_UP1 102 +#define ID_EXIT 102 +#define IDI_UP2 103 +#define ID_TIMER_NEKOUPDATE 103 +#define IDI_UPRIGHT1 104 +#define ID_TIMER_NEKO 104 +#define IDI_UPRIGHT2 105 +#define IDI_RIGHT1 106 +#define IDI_RIGHT2 107 +#define IDI_DOWNRIGHT1 108 +#define IDI_DOWNRIGHT2 109 +#define IDI_DOWN1 110 +#define IDI_DOWN2 111 +#define IDI_DOWNLEFT1 112 +#define IDI_DOWNLEFT2 113 +#define IDI_LEFT1 114 +#define IDI_LEFT2 115 +#define IDI_UPLEFT1 116 +#define IDI_UPLEFT2 117 +#define IDI_UPCLAW1 118 +#define IDI_UPCLAW2 119 +#define IDI_RIGHTCLAW1 120 +#define IDI_RIGHTCLAW2 121 +#define IDI_LEFTCLAW1 122 +#define IDI_LEFTCLAW2 123 +#define IDI_DOWNCLAW1 124 +#define IDI_DOWNCLAW2 125 +#define IDI_WASH2 126 +#define IDI_SCRATCH1 127 +#define IDI_SCRATCH2 128 +#define IDI_YAWN2 129 +#define IDI_YAWN3 130 +#define IDI_SLEEP1 131 +#define IDI_SLEEP2 132 + +#define IDI_FP_UP 133 +#define IDI_FP_UPRIGHT 134 +#define IDI_FP_RIGHT 135 +#define IDI_FP_DOWNRIGHT 136 +#define IDI_FP_DOWN 137 +#define IDI_FP_DOWNLEFT 138 +#define IDI_FP_LEFT 139 +#define IDI_FP_UPLEFT 140 + + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 141 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 105 +#endif +#endif diff --git a/nkosrc4/classes.doc b/nkosrc4/classes.doc new file mode 100755 index 0000000000000000000000000000000000000000..509f50ece9490e2f1348287d33fac82fb2519c31 GIT binary patch literal 97280 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 literal 0 HcmV?d00001 diff --git a/nkosrc4/license.txt b/nkosrc4/license.txt new file mode 100755 index 0000000..8a2a9c1 --- /dev/null +++ b/nkosrc4/license.txt @@ -0,0 +1,41 @@ +Neko 95/98 Source Code License + +Note: Because Neko was originally written by +Masayuki Koba, and ported from his X-Windows +source code by David Harvey, different portions +of the Neko source code carry different licenses. + + +IF YOU WANT TO CHARGE FOR YOUR SOFTWARE +--------------------------------------- +If you use any of the following files in your software, +you MAY NOT charge for it as it is covered by the GNU +public license: + Neko.h Neko.cpp + Neko98.h Neko98.cpp + + +If you use any of the following files in your software, +you MAY charge for it, but must send 20% of the profit or +from that software, or $1000 to the author (address at the bottom). + Pet.h Pe1t.cpp + DesktopHack.h DesktopHack.cpp + DesktopPet.h DesktopPet.cpp + AlwaysOnTopPet.h AlwaysOnTopPet.cpp + + +All other files can be used freely as long as credit is given. + + +IF YOU DO NOT WANT TO CHARGE FOR YOUR SOFTWARE +---------------------------------------------- +You are free to use the source files in any way you wish, +as long as credit is given. + + +AUTHOR'S ADDRESS +---------------- +dharvey@btinternet.com +For security reasons, mail me and I'll give out my address. + +