├── .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 queue; 30 | Queue> classQueue; 31 | public KoshkaManager() throws IOException { 32 | setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 33 | setTitle("Koshka Manager"); 34 | classList=new JComboBox<>(findAllClasses("io.silvicky.Koshka").toArray(new Class[0])); 35 | genderInput=new JTextField("",16); 36 | debugOutput=new JTextArea("Welcome to Koshka!\n",10,40); 37 | scrollPane=new JScrollPane(debugOutput); 38 | addButton=new JButton("+"); 39 | delButton=new JButton("-"); 40 | addButton.addActionListener(new ActionListener() { 41 | public void actionPerformed(ActionEvent e) { 42 | try { 43 | Class requiredClass= (Class) classList.getSelectedItem(); 44 | Constructor constructor; 45 | Object object; 46 | if(genderInput.getText().length()==0) { 47 | constructor = requiredClass.getConstructor(GraphicsConfiguration.class); 48 | object = constructor.newInstance(getGraphicsConfiguration()); 49 | } 50 | else { 51 | constructor = requiredClass.getConstructor(GraphicsConfiguration.class,String.class); 52 | object = constructor.newInstance(getGraphicsConfiguration(),genderInput.getText()); 53 | } 54 | queue.add(object); 55 | classQueue.add(requiredClass); 56 | } catch (Exception ex) { 57 | StringWriter sw=new StringWriter(); 58 | PrintWriter pw=new PrintWriter(sw); 59 | ex.printStackTrace(pw); 60 | debugOutput.append(sw.toString()); 61 | } 62 | } 63 | }); 64 | delButton.addActionListener(new ActionListener() { 65 | public void actionPerformed(ActionEvent e) { 66 | if(!queue.isEmpty()) { 67 | classQueue.remove().cast(queue.peek()).exit(); 68 | queue.remove(); 69 | } 70 | } 71 | }); 72 | queue=new ArrayDeque<>(); 73 | classQueue=new ArrayDeque<>(); 74 | GroupLayout layout = new GroupLayout(getContentPane()); 75 | getContentPane().setLayout(layout); 76 | ParallelGroup hGroup = layout.createParallelGroup(GroupLayout.Alignment.LEADING); 77 | SequentialGroup h1 = layout.createSequentialGroup(); 78 | SequentialGroup h2 = layout.createSequentialGroup(); 79 | h1.addContainerGap(); 80 | h1.addComponent(addButton); 81 | h1.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED); 82 | h1.addComponent(classList, GroupLayout.DEFAULT_SIZE, 256, Short.MAX_VALUE); 83 | h1.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED); 84 | h1.addComponent(genderInput, GroupLayout.DEFAULT_SIZE, 128, Short.MAX_VALUE); 85 | h1.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED); 86 | h1.addComponent(delButton); 87 | h1.addContainerGap(); 88 | h2.addContainerGap(); 89 | h2.addComponent(scrollPane); 90 | h2.addContainerGap(); 91 | hGroup.addGroup(GroupLayout.Alignment.TRAILING, h1); 92 | hGroup.addGroup(GroupLayout.Alignment.TRAILING, h2); 93 | layout.setHorizontalGroup(hGroup); 94 | ParallelGroup vGroup = layout.createParallelGroup(GroupLayout.Alignment.LEADING); 95 | SequentialGroup v1 = layout.createSequentialGroup(); 96 | v1.addContainerGap(); 97 | ParallelGroup v2 = layout.createParallelGroup(GroupLayout.Alignment.BASELINE); 98 | ParallelGroup v3=layout.createParallelGroup(GroupLayout.Alignment.BASELINE); 99 | v2.addComponent(addButton); 100 | v2.addComponent(classList, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE); 101 | v2.addComponent(genderInput, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE); 102 | v2.addComponent(delButton); 103 | v3.addComponent(scrollPane); 104 | v1.addGroup(v2); 105 | v1.addContainerGap(); 106 | v1.addGroup(v3); 107 | v1.addContainerGap(); 108 | vGroup.addGroup(v1); 109 | layout.setVerticalGroup(vGroup); 110 | pack(); 111 | setVisible(true); 112 | } 113 | public List findAllClasses(String packageName) throws IOException { 114 | return ClassPath.from(ClassLoader.getSystemClassLoader()) 115 | .getAllClasses() 116 | .stream() 117 | .map(c->c.load()) 118 | .filter(c->KoshkaTemplate.class.isAssignableFrom(c)) 119 | .filter(c-> !Modifier.isAbstract(c.getModifiers())) 120 | .collect(Collectors.toList()); 121 | } 122 | public static void main(String[] args) throws IOException { 123 | KoshkaManager koshkaManager=new KoshkaManager(); 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /src/main/java/io/silvicky/Koshka/KoshkaTemplate.java: -------------------------------------------------------------------------------- 1 | package io.silvicky.Koshka; 2 | 3 | import io.silvicky.String.ExpressionErr; 4 | 5 | import javax.imageio.ImageIO; 6 | import javax.sound.sampled.AudioSystem; 7 | import javax.sound.sampled.Clip; 8 | import javax.sound.sampled.LineUnavailableException; 9 | import javax.sound.sampled.UnsupportedAudioFileException; 10 | import javax.swing.*; 11 | import java.awt.*; 12 | import java.awt.event.MouseEvent; 13 | import java.awt.event.MouseListener; 14 | import java.awt.geom.AffineTransform; 15 | import java.awt.image.AffineTransformOp; 16 | import java.awt.image.BufferedImage; 17 | import java.io.BufferedInputStream; 18 | import java.io.BufferedReader; 19 | import java.io.IOException; 20 | import java.io.InputStreamReader; 21 | import java.util.Random; 22 | 23 | import static io.silvicky.String.HexParser.parseHex; 24 | 25 | public abstract class KoshkaTemplate extends JWindow{ 26 | ImageIcon[] images; 27 | Clip[] clips; 28 | boolean isAudioInited; 29 | long gender; 30 | int windowWidth,windowHeight; 31 | int windowX,windowY; 32 | int minX,minY,maxX,maxY; 33 | int curImage; 34 | double delayRatio=1; 35 | Timer timer; 36 | JLabel imageLabel; 37 | String readLine(BufferedReader in) throws IOException { 38 | String tmp="#"; 39 | while(tmp.startsWith("#"))tmp=in.readLine(); 40 | return tmp; 41 | } 42 | public void setGender() 43 | { 44 | gender=new Random().nextLong(); 45 | } 46 | public void setGender(String val) throws ExpressionErr 47 | { 48 | gender=parseHex(val); 49 | } 50 | public long getGender(){return gender;} 51 | public boolean getGender(int x) 52 | { 53 | return (gender>>x<<63>>63)!=0; 54 | } 55 | void readImages() throws IOException { 56 | int imageCount; 57 | BufferedReader in=new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("images/images.txt"))); 58 | imageCount=Integer.parseInt(readLine(in)); 59 | windowWidth=Integer.parseInt(readLine(in)); 60 | windowHeight=Integer.parseInt(readLine(in)); 61 | images=new ImageIcon[imageCount]; 62 | int rot; 63 | boolean isFlipped; 64 | String fileName; 65 | for(int i=0;i 120 | { 121 | migrate(); 122 | setLocation(windowX,windowY); 123 | imageLabel.setIcon(images[translatePic(curImage)]); 124 | setSize(windowWidth,windowHeight+1); 125 | repaint(); 126 | setSize(windowWidth,windowHeight); 127 | repaint(); 128 | }); 129 | timer.setRepeats(true); 130 | timer.start(); 131 | } 132 | void setDelay(int ms) 133 | { 134 | timer.setDelay((int) (ms/delayRatio)); 135 | } 136 | void play(int i) { 137 | if(!isAudioInited)return; 138 | clips[i].stop(); 139 | clips[i].setFramePosition(0); 140 | clips[i].start(); 141 | } 142 | public abstract void migrate(); 143 | class FormListener implements MouseListener { 144 | FormListener() {} 145 | public void mouseClicked(MouseEvent evt) { 146 | if (evt.getSource() == imageLabel) { 147 | mouseClick(); 148 | } 149 | } 150 | 151 | public void mouseEntered(MouseEvent evt) { 152 | if (evt.getSource() == imageLabel) { 153 | mouseEnter(); 154 | } 155 | } 156 | 157 | public void mouseExited(MouseEvent evt) { 158 | if (evt.getSource() == imageLabel) { 159 | mouseExit(); 160 | } 161 | } 162 | 163 | public void mousePressed(MouseEvent evt) { 164 | if (evt.getSource() == imageLabel) { 165 | 166 | } 167 | } 168 | 169 | public void mouseReleased(MouseEvent evt) { 170 | if (evt.getSource() == imageLabel) { 171 | 172 | } 173 | } 174 | } 175 | public abstract void mouseClick(); 176 | public abstract void mouseEnter(); 177 | public abstract void mouseExit(); 178 | public int translatePic(int src) 179 | { 180 | return src; 181 | } 182 | public void exit() 183 | { 184 | timer.stop(); 185 | dispose(); 186 | } 187 | } 188 | -------------------------------------------------------------------------------- /src/main/java/io/silvicky/String/CommandParser.java: -------------------------------------------------------------------------------- 1 | package io.silvicky.String; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class CommandParser { 7 | public static List parseStr(String s) throws ExpressionErr { 8 | List ans=new ArrayList<>(); 9 | String cur=""; 10 | boolean isQuote=false; 11 | for(int i=0;i16)throw new ExpressionErr("Too large!"); 8 | for(int i=0;i='0'&&c<='9')ans+=c-'0'; 13 | else if(c>='a'&&c<='f')ans+=c-'a'+10; 14 | else if(c>='A'&&c<='F')ans+=c-'A'+10; 15 | else throw new ExpressionErr("Invalid HEX value!"); 16 | } 17 | return ans; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 8.0 2 | Main-Class: io.silvicky.Koshka.KoshkaManager 3 | Class-Path: guava.jar 4 | -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/audio/audio.txt: -------------------------------------------------------------------------------- 1 | 4 2 | meow.wav 3 | scared.wav 4 | hit.wav 5 | sleep.wav -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/audio/hit.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/audio/hit.wav -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/audio/meow.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/audio/meow.wav -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/audio/scared.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/audio/scared.wav -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/audio/sleep.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/audio/sleep.wav -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/images/0.png -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/images/1.png -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/images/10.png -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/images/11.png -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/images/12.png -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/images/2.png -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/images/3.png -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/images/4.png -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/images/5.png -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/images/6.png -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/images/7.png -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/images/8.png -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/images/9.png -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/silvicky/Koshka/97a2b72b0b0732f1059bc13bcf888ca85376b070/src/main/resources/io/silvicky/Koshka/images/Thumbs.db -------------------------------------------------------------------------------- /src/main/resources/io/silvicky/Koshka/images/images.txt: -------------------------------------------------------------------------------- 1 | 31 2 | 128 3 | 128 4 | #Normal 0...7 5 | 0.png 6 | 0 7 | false 8 | 1.png 9 | 0 10 | false 11 | 0.png 12 | 90 13 | false 14 | 1.png 15 | 90 16 | false 17 | 0.png 18 | 90 19 | true 20 | 1.png 21 | 90 22 | true 23 | 0.png 24 | 0 25 | true 26 | 1.png 27 | 0 28 | true 29 | #Watch 8...15 30 | 2.png 31 | 0 32 | false 33 | 3.png 34 | 0 35 | false 36 | 2.png 37 | 90 38 | false 39 | 3.png 40 | 90 41 | false 42 | 2.png 43 | 90 44 | true 45 | 3.png 46 | 90 47 | true 48 | 2.png 49 | 0 50 | true 51 | 3.png 52 | 0 53 | true 54 | #Fall 16 55 | 4.png 56 | 0 57 | false 58 | #Flag 17...18 59 | 5.png 60 | 0 61 | false 62 | 6.png 63 | 0 64 | false 65 | #Fish 19...24 66 | 7.png 67 | 0 68 | false 69 | 8.png 70 | 0 71 | false 72 | 9.png 73 | 0 74 | false 75 | 7.png 76 | 0 77 | true 78 | 8.png 79 | 0 80 | true 81 | 9.png 82 | 0 83 | true 84 | #Sleep 25...28 85 | 10.png 86 | 0 87 | false 88 | 11.png 89 | 0 90 | false 91 | 10.png 92 | 0 93 | true 94 | 11.png 95 | 0 96 | true 97 | #Sigh 29...30 98 | 12.png 99 | 0 100 | false 101 | 12.png 102 | 0 103 | true --------------------------------------------------------------------------------