├── .gitignore
├── README.md
├── pom.xml
└── src
└── main
├── java
└── io
│ └── silvicky
│ ├── Koshka
│ ├── Koshka.java
│ ├── KoshkaManager.java
│ └── KoshkaTemplate.java
│ └── String
│ ├── CommandParser.java
│ ├── ExpressionErr.java
│ └── HexParser.java
└── resources
├── META-INF
└── MANIFEST.MF
└── io
└── silvicky
└── Koshka
├── audio
├── audio.txt
├── hit.wav
├── meow.wav
├── scared.wav
└── sleep.wav
└── images
├── 0.png
├── 1.png
├── 10.png
├── 11.png
├── 12.png
├── 2.png
├── 3.png
├── 4.png
├── 5.png
├── 6.png
├── 7.png
├── 8.png
├── 9.png
├── Thumbs.db
└── images.txt
/.gitignore:
--------------------------------------------------------------------------------
1 | target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 | !**/src/main/**/target/
4 | !**/src/test/**/target/
5 |
6 | ### IntelliJ IDEA ###
7 | .idea/modules.xml
8 | .idea/jarRepositories.xml
9 | .idea/compiler.xml
10 | .idea/libraries/
11 | *.iws
12 | *.iml
13 | *.ipr
14 |
15 | ### Eclipse ###
16 | .apt_generated
17 | .classpath
18 | .factorypath
19 | .project
20 | .settings
21 | .springBeans
22 | .sts4-cache
23 |
24 | ### NetBeans ###
25 | /nbproject/private/
26 | /nbbuild/
27 | /dist/
28 | /nbdist/
29 | /.nb-gradle/
30 | build/
31 | !**/src/main/**/build/
32 | !**/src/test/**/build/
33 |
34 | ### VS Code ###
35 | .vscode/
36 |
37 | ### Mac OS ###
38 | .DS_Store
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Koshka
2 | Koshka is a desktop pet program based on Java.
3 | ## How to use?
4 | Go to the project root, type `mvn clean package` then go to target/, copy main jar and jars in dependency/ to the same place, now you can execute the main jar.
5 | ## How to develop?
6 | First, you should manage to import Koshka.jar.
7 |
8 | Then, create a class that extends KoshkaTemplate, just like Koshka do, and now you can develop!
9 |
10 | And, finally, create a pull request in https://github.com/silvicky/Koshka-extra to make it public.
11 | ## Requirement
12 | Koshka needs Java 8 or higher to run.
13 | ## Operating Systems status
14 | In theory it can run on any platform that supports Java and behaves the same, but the truth is cruel.
15 |
16 | - Windows (ver. 7~11): Works fine.
17 | - ReactOS (ver. 0.4.15 debug): Obvious visual glitch, see [CORE-18256](https://jira.reactos.org/browse/CORE-18256).
18 | - Linux (ver. Debian Sid): Unable to repaint, I use the resize glitch to temporarily fix it.
19 |
20 | If you have tested it, you're welcome to edit this section.
21 | ## About
22 | I design it to bring fun to my desktop.
23 |
24 | It's inspired by Neko, a pet program that is designed for Windows 9X.
25 |
26 | Koshka(Russian: Кошка) means cat, just like Neko(Japanese: 猫) , so don't feel confused about whether it's a cat or a dog.
27 |
28 | Contributions are welcomed!
29 |
30 | This program is far from it's final stage, I'm adding many things to it.
31 |
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | io.silvicky.Koshka
8 | Koshka
9 | jar
10 | 0.6
11 | Koshka
12 |
13 |
14 |
15 |
16 | org.apache.maven.plugins
17 | maven-jar-plugin
18 | 3.0.2
19 |
20 |
21 |
22 | true
23 | io.silvicky.Koshka.KoshkaManager
24 |
25 |
26 |
27 |
28 |
29 | org.apache.maven.plugins
30 | maven-dependency-plugin
31 | 2.10
32 |
33 |
34 | copy-dependencies
35 | package
36 |
37 | copy-dependencies
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | 8
46 | 8
47 |
48 |
49 |
50 | com.google.guava
51 | guava
52 | 31.1-jre
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/src/main/java/io/silvicky/Koshka/Koshka.java:
--------------------------------------------------------------------------------
1 | package io.silvicky.Koshka;
2 |
3 | import io.silvicky.String.ExpressionErr;
4 |
5 | import javax.sound.sampled.Clip;
6 | import javax.sound.sampled.LineUnavailableException;
7 | import javax.sound.sampled.UnsupportedAudioFileException;
8 | import java.awt.*;
9 | import java.io.IOException;
10 |
11 | import static java.lang.Math.random;
12 |
13 | public class Koshka extends KoshkaTemplate{
14 | int vX,vY;
15 | int lastFrame;
16 | int framesInThisState;
17 | public Koshka(GraphicsConfiguration gc) throws IOException, UnsupportedAudioFileException, LineUnavailableException {
18 | setGender();
19 | init(gc);
20 | }
21 | public Koshka(GraphicsConfiguration gc,String val) throws IOException, UnsupportedAudioFileException, LineUnavailableException, ExpressionErr {
22 | setGender(val);
23 | init(gc);
24 | }
25 | int ran()
26 | {
27 | return (int) (random()*10000);
28 | }
29 | public void migrate() {
30 | int sran;
31 | switch(curImage) {
32 | case 0:
33 | case 1:
34 | curImage = 1 - curImage;
35 | windowX -= 10;
36 | if (windowX < minX) {
37 | windowX = minX;
38 | if (ran() < 2000) {
39 | curImage = 2;
40 | setDelay(500);
41 | } else curImage = 6;
42 | break;
43 | }
44 | if (ran() < 100) play(0);
45 | sran=ran();
46 | if (sran < 1)
47 | {
48 | curImage = 17;
49 | lastFrame=0;
50 | framesInThisState=0;
51 | setDelay(500);
52 | break;
53 | }
54 | else if(sran<20)
55 | {
56 | curImage = 19;
57 | lastFrame=0;
58 | framesInThisState=0;
59 | setDelay(2000);
60 | break;
61 | }
62 | else if(sran<40)
63 | {
64 | curImage=29;
65 | lastFrame=0;
66 | framesInThisState=0;
67 | setDelay(2000);
68 | break;
69 | }
70 | break;
71 | case 2:
72 | case 3:
73 | curImage = 5 - curImage;
74 | windowY -= 10;
75 | if (windowY >= minY && ran() < 100) {
76 | startFall(false);
77 | break;
78 | }
79 | if (windowY < minY) {
80 | windowY = minY;
81 | startFall(false);
82 | break;
83 | }
84 | if (ran() < 100) play(0);
85 | break;
86 | case 4:
87 | case 5:
88 | curImage = 9 - curImage;
89 | windowY -= 10;
90 | if (windowY >= minY && ran() < 100) {
91 | startFall(true);
92 | break;
93 | }
94 | if (windowY < minY) {
95 | windowY = minY;
96 | startFall(true);
97 | break;
98 | }
99 | if (ran() < 100) play(0);
100 | break;
101 | case 6:
102 | case 7:
103 | curImage = 13 - curImage;
104 | windowX += 10;
105 | if (windowX > maxX) {
106 | windowX = maxX;
107 | if (ran() < 2000) {
108 | curImage = 4;
109 | setDelay(500);
110 | } else curImage = 0;
111 | break;
112 | }
113 | if (ran() < 100) play(0);
114 | sran=ran();
115 | if (sran < 1)
116 | {
117 | curImage = 17;
118 | lastFrame=6;
119 | framesInThisState=0;
120 | setDelay(500);
121 | }
122 | else if(sran<20)
123 | {
124 | curImage = 22;
125 | lastFrame=6;
126 | framesInThisState=0;
127 | setDelay(2000);
128 | break;
129 | }
130 | else if(sran<40)
131 | {
132 | curImage=30;
133 | lastFrame=6;
134 | framesInThisState=0;
135 | setDelay(2000);
136 | break;
137 | }
138 | break;
139 | case 16:
140 | windowX+=vX;
141 | windowY+=vY;
142 | vY+=10;
143 | if(windowY>maxY)
144 | {
145 | windowY=maxY;
146 | if(vX>0)curImage=6;
147 | else curImage=0;
148 | play(2);
149 | setDelay(200);
150 | }
151 | break;
152 | case 17:
153 | play(0);
154 | case 18:
155 | curImage=35-curImage;
156 | framesInThisState++;
157 | if(framesInThisState>=20)
158 | {
159 | curImage=lastFrame;
160 | setDelay(200);
161 | }
162 | break;
163 | case 19:
164 | case 20:
165 | curImage=39-curImage;
166 | framesInThisState++;
167 | if(framesInThisState>=10)
168 | {
169 | curImage=21;
170 | break;
171 | }
172 | break;
173 | case 21:
174 | curImage=0;
175 | setDelay(200);
176 | break;
177 | case 22:
178 | case 23:
179 | curImage=45-curImage;
180 | framesInThisState++;
181 | if(framesInThisState>=10)
182 | {
183 | curImage=24;
184 | break;
185 | }
186 | break;
187 | case 24:
188 | curImage=6;
189 | setDelay(200);
190 | break;
191 | case 25:
192 | case 26:
193 | if(ran()<1000)play(3);
194 | curImage=51-curImage;
195 | framesInThisState++;
196 | if(framesInThisState>=15)
197 | {
198 | lastFrame=25;
199 | curImage=29;
200 | break;
201 | }
202 | break;
203 | case 27:
204 | case 28:
205 | if(ran()<1000)play(3);
206 | curImage=55-curImage;
207 | framesInThisState++;
208 | if(framesInThisState>=15)
209 | {
210 | lastFrame=27;
211 | curImage=30;
212 | break;
213 | }
214 | break;
215 | case 29:
216 | if(lastFrame==0)curImage=25;
217 | else
218 | {
219 | curImage=0;
220 | setDelay(200);
221 | }
222 | break;
223 | case 30:
224 | if(lastFrame==6)curImage=27;
225 | else
226 | {
227 | curImage=6;
228 | setDelay(200);
229 | }
230 | break;
231 | }
232 | }
233 | void startFall(boolean side) {
234 | curImage=16;
235 | vX=side?-2:2;
236 | vY=10;
237 | play(1);
238 | setDelay(50);
239 | }
240 | public void mouseClick(){
241 | switch (curImage)
242 | {
243 | case 2:
244 | case 3:
245 | case 10:
246 | case 11:
247 | startFall(false);
248 | break;
249 | case 4:
250 | case 5:
251 | case 12:
252 | case 13:
253 | startFall(true);
254 | break;
255 | case 25:
256 | case 26:
257 | curImage=0;
258 | setDelay(200);
259 | break;
260 | case 27:
261 | case 28:
262 | curImage=6;
263 | setDelay(200);
264 | break;
265 | default:
266 | play(0);
267 | }
268 | }
269 | public void mouseEnter()
270 | {
271 | if(curImage>=0&&curImage<=7)
272 | {
273 | curImage+=8;
274 | setDelay(50);
275 | }
276 | }
277 | public void mouseExit()
278 | {
279 | if(curImage>=8&&curImage<=15)
280 | {
281 | curImage-=8;
282 | setDelay(200);
283 | }
284 | }
285 | }
286 |
--------------------------------------------------------------------------------
/src/main/java/io/silvicky/Koshka/KoshkaManager.java:
--------------------------------------------------------------------------------
1 | package io.silvicky.Koshka;
2 |
3 |
4 | import com.google.common.reflect.ClassPath;
5 |
6 | import javax.swing.*;
7 | import javax.swing.GroupLayout.ParallelGroup;
8 | import javax.swing.GroupLayout.SequentialGroup;
9 | import java.awt.*;
10 | import java.awt.event.ActionEvent;
11 | import java.awt.event.ActionListener;
12 | import java.io.IOException;
13 | import java.io.PrintWriter;
14 | import java.io.StringWriter;
15 | import java.lang.reflect.Constructor;
16 | import java.lang.reflect.Modifier;
17 | import java.util.ArrayDeque;
18 | import java.util.List;
19 | import java.util.Queue;
20 | import java.util.stream.Collectors;
21 |
22 |
23 | public class KoshkaManager extends JFrame {
24 | JComboBox classList;
25 | JTextField genderInput;
26 | JTextArea debugOutput;
27 | JScrollPane scrollPane;
28 | JButton addButton,delButton;
29 | Queue