├── .gitignore ├── DEVLOG.md ├── Epidemic.cabal ├── LICENSE ├── README.md ├── THANKS ├── TODO ├── android-icons ├── drawable-hdpi │ └── ic_launcher.png ├── drawable-mdpi │ └── ic_launcher.png ├── drawable-xhdpi │ └── ic_launcher.png └── drawable-xxhdpi │ └── ic_launcher.png ├── assets ├── font.ttf ├── music.ogg └── slime-splash.wav ├── cairo-interactive.sh ├── cs-view ├── design-log ├── 2015-01-11-letter-boxing.png ├── 2015-01-21-antibiotics.png ├── 2015-01-22-mutation.png ├── 2015-01-24-score.png ├── 2015-01-25-gradients.png ├── 2015-01-28-freetype.png ├── 2015-02-01-better-fonts.png ├── 2015-02-28-flasks-added.png ├── README.md ├── flask-0.png ├── flask-1.png └── flask-2.png ├── extra-src └── font-test │ ├── FontTest.hs │ ├── FreeType.hs │ ├── freetype_util.c │ └── run.sh ├── html ├── android-1.png ├── android-2.png ├── android-install.html ├── background.png ├── computer-1.png ├── computer-2.png ├── computer-3.png ├── deploy.sh ├── font.ttf ├── index.html └── jquery-2.1.1.min.js ├── ios-aarch64-build.sh ├── ios-arm-build.sh ├── ios-full-build.sh ├── ios-i386-build.sh ├── run-macosx.sh ├── src ├── AndroidMain.hs ├── Backend │ ├── Events.hs │ └── SDL.hs ├── CUtil.hs ├── CairoInteractive.hs ├── Coordinate.hs ├── Foreign.hs ├── FrameRateBuffer.hs ├── FreeType.hs ├── Game.hs ├── Game │ └── Types.hs ├── GameEvent.hs ├── GameM.hs ├── GenerateIcons.hs ├── Graphics.hs ├── GraphicsGL.hs ├── GraphicsGL │ ├── GLM.hs │ ├── GLSLPrograms │ │ ├── OneBigShader.hs │ │ └── SeparateShaders.hs │ └── Util.hs ├── HipM.hs ├── IOSMain.hs ├── Main.hs ├── Platform.hs ├── ProceduralMusic.hs ├── ProfileGraphics.hs ├── Types.hs ├── Types │ ├── Basic.hs │ └── Constants.hs ├── Util.hs ├── freetype_util.c ├── objc_util.m └── util.c ├── stack.yaml └── txt ├── talk-notes.txt └── time-spent.txt /.gitignore: -------------------------------------------------------------------------------- 1 | *.o 2 | *.hi 3 | .cabal-sandbox 4 | cabal.sandbox.config 5 | epidemic 6 | *.trace 7 | Main 8 | dist/ 9 | dist-*/ 10 | *~ 11 | *.aux 12 | *.hp 13 | *.prof 14 | *.ps 15 | run.sh 16 | sounds/ 17 | extra-src/Events 18 | Epidemic.app/ 19 | ProfileGraphics.app/ 20 | .DS_Store 21 | liba.a 22 | .stack-work 23 | -------------------------------------------------------------------------------- /Epidemic.cabal: -------------------------------------------------------------------------------- 1 | name: Epidemic 2 | version: 0.0.1 3 | license: BSD3 4 | license-file: LICENSE 5 | author: Sean Seefried 6 | maintainer: Sean Seefried 7 | synopsis: A game about exponential growth 8 | description: A game about exponential growth 9 | category: Web 10 | stability: Experimental 11 | cabal-version: >= 1.16 12 | build-type: Simple 13 | homepage: http://seanseefried.com 14 | 15 | Flag android 16 | Description: Build for Android 17 | Default: False 18 | 19 | Flag nosound 20 | Description: No sound 21 | Default: False 22 | 23 | Flag ios 24 | Description: Build for iOS 25 | Default: False 26 | 27 | Flag debug-game 28 | Description: debug the game 29 | Default: False 30 | 31 | Flag debug-system 32 | Description: Print debug info about the system on the screen 33 | Default: False 34 | 35 | Flag profile-graphics 36 | Description: Whether to profile graphics or not 37 | Default: False 38 | 39 | Flag profile 40 | Description: Run at highest frame rate for profiling 41 | Default: False 42 | 43 | library 44 | hs-source-dirs: src 45 | default-language: Haskell2010 46 | 47 | Exposed-Modules: AndroidMain, Backend.SDL, Backend.Events, Game, Game.Types 48 | , GameM, Types, Types.Basic, Types.Constants, Platform 49 | , Graphics, GraphicsGL, GraphicsGL.Util, GraphicsGL.GLM 50 | , HipM 51 | , GraphicsGL.GLSLPrograms.SeparateShaders 52 | , GraphicsGL.GLSLPrograms.OneBigShader 53 | , ProfileGraphics 54 | , CUtil, Util, FrameRateBuffer, FreeType 55 | , Coordinate, GameEvent 56 | exposed: True 57 | if flag(android) 58 | cpp-options: -DANDROID 59 | cc-options: -DANDROID 60 | 61 | c-sources: src/util.c src/freetype_util.c 62 | 63 | if flag(android) 64 | ghc-options: -O2 -static 65 | Buildable: True 66 | build-depends: Hipmunk == 5.2.0.16 67 | , MonadRandom == 0.3 68 | , SDL2 == 0.1.0 69 | , sdl2-mixer == 0.1.0.0 70 | , cairo == 0.13.0.5 71 | , control-monad-free == 0.5.3 72 | , OpenGLRaw == 1.5.0.0 73 | -- everything below this line is a dependency of above 74 | -- the line. We fix to specific versions 75 | , base >= 4.7.0.0 76 | , containers == 0.5.5.1 77 | , time == 1.4.2 78 | , StateVar == 1.0.0.0 79 | , mtl == 2.2.1 80 | , primitive == 0.5.4.0 81 | , random == 1.1 82 | , text == 1.2.0.0 83 | , transformers == 0.4.1.0 84 | , utf8-string == 0.3.8 85 | , vector == 0.10.12.1 86 | , array == 0.5.0.0 87 | , directory == 1.2.1.0 88 | 89 | else 90 | Buildable: False 91 | if flag(debug-game) 92 | cpp-options: -DDEBUG_GAME 93 | cc-options: -DDEBUG_GAME 94 | if flag(debug-system) 95 | cpp-options: -DDEBUG_SYSTEM 96 | cc-options: -DDEBUG_SYSTEM 97 | if flag(profile-graphics) 98 | cpp-options: -DPROFILE_GRAPHICS 99 | cc-options: -DPROFILE_GRAPHICS 100 | if flag(ios) 101 | cpp-options: -DIOS 102 | cc-options: -DIOS 103 | 104 | executable EpidemicStaticLib 105 | hs-source-dirs: src 106 | default-language: Haskell2010 107 | ghc-options: -W -O2 -staticlib -threaded -no-hs-main 108 | cpp-options: -DIOS 109 | main-is: IOSMain.hs 110 | 111 | c-sources: src/util.c src/freetype_util.c src/objc_util.m 112 | pkgconfig-depends: freetype2, cairo 113 | 114 | build-depends: Hipmunk 115 | , MonadRandom 116 | , SDL2 117 | , sdl2-mixer 118 | , cairo 119 | , control-monad-free 120 | , OpenGLRaw 121 | -- everything below this line is a dependency of above 122 | -- the line. We fix to specific versions 123 | , base 124 | , array 125 | , containers 126 | , time 127 | , StateVar 128 | , mtl 129 | , primitive 130 | , random 131 | , text 132 | , transformers 133 | , utf8-string 134 | , vector 135 | , directory 136 | if flag(ios) 137 | Buildable: True 138 | else 139 | Buildable: False 140 | if flag(debug-game) 141 | cpp-options: -DDEBUG_GAME 142 | cc-options: -DDEBUG_GAME 143 | if flag(debug-system) 144 | cpp-options: -DDEBUG_SYSTEM 145 | cc-options: -DDEBUG_SYSTEM 146 | if flag(profile-graphics) 147 | cpp-options: -DPROFILE_GRAPHICS 148 | cc-options: -DPROFILE_GRAPHICS 149 | 150 | 151 | executable Epidemic 152 | hs-source-dirs : src 153 | default-language: Haskell2010 154 | ghc-options: -W -threaded -O2 155 | ghc-prof-options: -prof -auto-all 156 | 157 | main-is: Main.hs 158 | hs-source-dirs: . 159 | 160 | if flag(nosound) 161 | cpp-options: -DNOSOUND 162 | if os(linux) 163 | cpp-options: -DLINUX 164 | if os(darwin) 165 | cpp-options: -DMACOSX 166 | if flag(ios) 167 | ghc-options: -staticlib 168 | 169 | build-depends: Hipmunk 170 | , MonadRandom 171 | , SDL2 172 | , OpenGLRaw 173 | , sdl2-mixer 174 | , cairo 175 | , control-monad-free 176 | -- everything below this line is a dependency of above 177 | -- the line. We fix to specific versions 178 | , base 179 | , array 180 | , containers 181 | , time 182 | , StateVar 183 | , mtl 184 | , primitive 185 | , random 186 | , text 187 | , transformers 188 | , utf8-string 189 | , vector 190 | , directory 191 | c-sources: src/util.c src/freetype_util.c 192 | if flag(ios) || os(darwin) 193 | c-sources: src/objc_util.m 194 | 195 | pkgconfig-depends: freetype2, cairo 196 | 197 | if flag(android) || flag(ios) 198 | Buildable: False 199 | else 200 | Buildable: True 201 | 202 | if flag(debug-game) 203 | cpp-options: -DDEBUG_GAME 204 | cc-options: -DDEBUG_GAME 205 | if flag(debug-system) 206 | cpp-options: -DDEBUG_SYSTEM 207 | cc-options: -DDEBUG_SYSTEM 208 | if flag(profile-graphics) 209 | cpp-options: -DPROFILE_GRAPHICS 210 | cc-options: -DPROFILE_GRAPHICS 211 | if flag(profile) 212 | cpp-options: -DPROFILE 213 | cc-options: -DPROFILE 214 | 215 | 216 | executable GenerateIcons 217 | hs-source-dirs: src 218 | default-language: Haskell2010 219 | ghc-options: -threaded -O2 -framework Foundation 220 | 221 | main-is: GenerateIcons.hs 222 | hs-source-dirs: . 223 | 224 | c-sources: src/util.c 225 | 226 | build-depends: Hipmunk 227 | , OpenGLRaw 228 | , MonadRandom 229 | , cairo 230 | -- everything below this line is a dependency of above 231 | -- the line. We fix to specific versions 232 | , base 233 | , containers 234 | , time 235 | , StateVar 236 | , mtl 237 | , primitive 238 | , random 239 | , text 240 | , transformers 241 | , utf8-string 242 | , vector 243 | if flag(android) || flag(ios) 244 | Buildable: False 245 | else 246 | Buildable: True 247 | 248 | executable ProceduralMusic 249 | hs-source-dirs: src 250 | ghc-options: -threaded -O2 251 | main-is: ProceduralMusic.hs 252 | default-language: Haskell2010 253 | 254 | build-depends: SDL2 255 | , sdl2-mixer 256 | , base 257 | , containers 258 | , time 259 | if flag(android) || flag(ios) 260 | Buildable: False -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/LICENSE -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Epidemic -- a game about exponential growth written in Haskell 2 | 3 | ## Introduction 4 | 5 | In 2014 I worked on a simple mobile game written in Haskell. This repo contains everything that came 6 | out of that effort. It is my gift to the Haskell community and I hope it inspires some of you to 7 | write more games in Haskell for mobile devices. 8 | 9 | ## Credits 10 | 11 | While the programming was done solely by me I had some help. First, the music was done by a talented 12 | composer/musician called Anton Kholomiov using his 13 | Haskell library [`csound-expression`](https://github.com/anton-k/csound-expression), 14 | a fantastic combinator library that uses [Csound](http://en.wikipedia.org/wiki/Csound) as a backend. 15 | 16 | The artistic style of the game was inspired by the work of [Rauri Rochford](http://esquemedia.com/). 17 | All failings are mine alone. Had he been further involved it would doubtless have been stunning. 18 | 19 | 20 | ## Installation 21 | 22 | Epidemic was designed to be be built for several targets: 23 | * Android 24 | * iOS 25 | * Mac OS X 26 | * Linux 27 | 28 | However, you're probably here to build it for Android. In that case see the next section. 29 | 30 | Building on Mac OS X is fairly straightforward but building for iOS was always a long and 31 | detailed process that I did not get around to automating in the same way that I automated the 32 | Android build process. 33 | 34 | ### Building for Android 35 | 36 | A complete development environment for Android has been developed with the aid of 37 | [Docker](https://www.docker.com/). The complete instructions are available in the `README.md` files 38 | of the following two repos: 39 | 40 | * [`docker-game-build-env`](https://github.com/sseefried/docker-game-build-env) 41 | * [`android-build-game-apk`](https://github.com/sseefried/android-build-game-apk) 42 | 43 | The `config.json` file you should use will be something like the following: 44 | 45 | ```JSON 46 | { 47 | "repo": "/home/androidbuilder/host-code/open-epidemic-game", 48 | "haskell_package": "Epidemic", 49 | "title": "Epidemic", 50 | "package": "com.test.game.epidemic", 51 | "version": { "code": "1", "name": "Build 1" }, 52 | "build_type": "debug", 53 | "orientation": "landscape", 54 | "assets_dir": "/home/androidbuilder/host-code/open-epidemic-game/assets", 55 | "icons_dir": "/home/androidbuilder/host-code/open-epidemic-game/android-icons" 56 | } 57 | ``` 58 | 59 | 60 | ### Building for iOS 61 | 62 | I may add instructions for doing this one day, but at the moment it seems unlikely. 63 | 64 | ### Building for Mac OS X and Linux 65 | 66 | We are using [`stack`](http://docs.haskellstack.org/en/stable/README/) to build all the 67 | requisite libraries. 68 | 69 | It should be as simple as 70 | 71 | $ stack build 72 | $ stack exec Epidemic 73 | -------------------------------------------------------------------------------- /THANKS: -------------------------------------------------------------------------------- 1 | THANKS 2 | 3 | Anyone I need to thank for helping this happen. 4 | 5 | Rauri Rochford - For designing the look of the germs. 6 | Ivan Perez - for pointing me towards GHC ARM cross compiler build scripts. 7 | -------------------------------------------------------------------------------- /TODO: -------------------------------------------------------------------------------- 1 | High priority 2 | ------------- 3 | 4 | [ ] Have blur turn off after blurEndTime to consume no resources. 5 | 6 | [ ] Find out why glBindBuffer gl_ARRAY_BUFFER 0 is so important on iOS 7 | 8 | [ ] For profiling have the tick happen *before* the swap in order to 9 | determine true frame rate. 10 | 11 | [ ] Try to get blur running on Android faster than 52 fps. 12 | 13 | [ ] Create a profiling harness to test the GLSL shaders. These *must* be fast. 14 | Write a tutorial about how you do it on the game blog. 15 | 16 | [ ] Add main menu. Allow control of things like SFX volume and music volume. 17 | 18 | [ ] Bug: Show all the new germs before you show game over screen. 19 | I'm pretty sure this is not working. 20 | 21 | [ ] Create a small chance that mutated germs lose their immunity. 22 | 23 | [ ] Add blobs to centres of germs. 24 | 25 | [ ] Centre the level finished text? 26 | 27 | [ ] Fix the memory leak 28 | 29 | [ ] Only draw what is absolutely necessary on the non-playing state screens. 30 | Try to keep gsRenderDirty False as much as possible. 31 | 32 | [ ] Cache the antibiotic graphic so it's not redrawn every time. 33 | 34 | [ ] Look at the battery usage of the game on Android. 35 | 36 | [ ] Add liquid from bottle sound effect for antibiotics 37 | 38 | [ ] Change the z-index on the germ being dragged! 39 | 40 | ------------ 41 | Low priority 42 | ------------ 43 | [ ] Refactor the setup-ios-*-wrapper.sh scripts and the .rc files. 44 | Basic idea is that to use any of these scripts a special 45 | "ghc-ios.rc" file must exist which sets a whole bunch of environment 46 | variables that are required. Things such as: 47 | - $HOME 48 | - path LLVM 3.0 49 | - path to LLVM 3.6 50 | - paths to sysroots 51 | 52 | 53 | [ ] Refactor the GameState to be opaque so that you can hide annoying 54 | stuff like the gsRenderDirty/gsRender pair behind one concept. 55 | 56 | [ ] Android: Rethink using external storage to decompress assets. It requires 57 | a permission. 58 | 59 | [ ] add an effect where the screen cracks when you get infected. 60 | 61 | [ ] Create a script to do what GHC flag -staticlib does on Mac OS X. 62 | See Ivan Perez's email. 63 | 64 | [ ] Art: Make it looks like we're looking through a microscope. 65 | 66 | [ ] Start using lenses. e.g. for enabling antibiotics 67 | 68 | [ ] Art: Add a "dirty screen" effect via a shader 69 | 70 | [ ] Rename Physics event to Idle event. 71 | 72 | [ ] Turn GLScript into a free monad too. 73 | 74 | [ ] Speed up the algorithm to search and kill germs 75 | 76 | 77 | [ ] Blur effect: I'd like to add a blur effect to the game to make it truly look like 78 | a petrie dish. It's going to be hard to get the performance acceptable. 79 | After just a little preliminary reading I don't think I just want to do 80 | a Guassian blur but rather to use a more sophisticated depth of field 81 | effect or "bokeh" effect. 82 | 83 | 84 | 85 | ---- 86 | DONE 87 | ---- 88 | [X] Remove the status bar on iOS version 89 | 90 | [X] Remove modelView matrix from from blur Program 91 | 92 | [X] Focussing microscope effect. Blur to different extent finally coming into 93 | focus. 94 | 95 | 96 | [X] Game does not save state when you hit home button to pause. Reported 97 | by Andy. Check. 98 | 99 | 100 | [X] Start respecting AppDidEnterBackground events and put the game in a 101 | quiescent state. 102 | 103 | 104 | [X] Increase the doubling speed so you can't just stay in level 1 105 | 106 | [X] Make sure germ being dragged stays in bounds! 107 | 108 | [X] BUG: Solve the problem of the "action bar" showing on the game. 109 | 110 | [X] Only kill germs affected by antibiotic 111 | 112 | 113 | [X] Figure out loading of assets on Android. Unzip and load. 114 | 115 | [X] Put a delay in when it's running at 60fps. Don't want to consume too 116 | much power. 117 | 118 | [X] Add Score field 119 | 120 | [X] Keep antibiotics showing when you've finished the level 121 | 122 | [X] Get iOS build going. Update for TestFlight 123 | 124 | [X] Fix GLFun type to use pre-defined attribute locations instead of 125 | re-calculating each time. (See GraphicsGL.hs) 126 | 127 | [X] When handling multiple events Step as far as FSM state change and then 128 | wipe the rest. 129 | 130 | 131 | [X] Make the type Either Quit [Event] not Maybe [Event] 132 | 133 | 134 | [X] Refactor runPhysicsHandler. Was previously updating state with 135 | old state. Pattern 136 | 137 | bes <- readIORef besRef 138 | writeIORef $ ... 139 | 140 | is inherently dangerous 141 | [X] Don't cache the germ's position 142 | 143 | [X] Build and deploy to Android. Have a look at this: 144 | https://github.com/neurocyte/ghc-android 145 | (Took approximately a week of hell. Perhaps 70+ hours) 146 | -------------------------------------------------------------------------------- /android-icons/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/android-icons/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android-icons/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/android-icons/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android-icons/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/android-icons/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android-icons/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/android-icons/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /assets/font.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/assets/font.ttf -------------------------------------------------------------------------------- /assets/music.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/assets/music.ogg -------------------------------------------------------------------------------- /assets/slime-splash.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/assets/slime-splash.wav -------------------------------------------------------------------------------- /cairo-interactive.sh: -------------------------------------------------------------------------------- 1 | DIR=dist/build/Epidemic/Epidemic-tmp/src 2 | 3 | ln -s /System/Library/Frameworks/Foundation.framework/Foundation $DIR/Foundation.o 4 | 5 | cd src 6 | ghci -W ../$DIR/util.o ../$DIR/Foundation.o ../$DIR/freetype_util.o \ 7 | ../$DIR/objc_util.o CairoInteractive.hs -------------------------------------------------------------------------------- /cs-view: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | unless ARGV.length > 0 4 | puts "Usage: #{File.basename($0)} " 5 | exit 1 6 | end 7 | 8 | CAIRO_DIR="/Users/sseefried/build/cairo-1.12.16" 9 | ANY2PPM="#{CAIRO_DIR}/test/any2ppm" 10 | PERF="#{CAIRO_DIR}/perf/cairo-perf-trace" 11 | 12 | file = ARGV[0] 13 | tmp_file = "/tmp/#{file}.cs" 14 | 15 | File.open(tmp_file, "w") do |f| 16 | File.open(file, "r").each do |line| 17 | f.write(line.gsub(/image dup.*/,"surface context").gsub(/.*undef.*/,"")) 18 | end 19 | end 20 | 21 | system("EXPORT CAIRO_TRACE_DIR=/tmp") 22 | system("#{PERF} #{file}") 23 | system("#{ANY2PPM} #{tmp_file} > #{file}.ppm") 24 | system("convert #{file}.ppm #{file}.png") 25 | system("rm -f #{file}.ppm") 26 | system("open #{file}.png") -------------------------------------------------------------------------------- /design-log/2015-01-11-letter-boxing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/design-log/2015-01-11-letter-boxing.png -------------------------------------------------------------------------------- /design-log/2015-01-21-antibiotics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/design-log/2015-01-21-antibiotics.png -------------------------------------------------------------------------------- /design-log/2015-01-22-mutation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/design-log/2015-01-22-mutation.png -------------------------------------------------------------------------------- /design-log/2015-01-24-score.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/design-log/2015-01-24-score.png -------------------------------------------------------------------------------- /design-log/2015-01-25-gradients.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/design-log/2015-01-25-gradients.png -------------------------------------------------------------------------------- /design-log/2015-01-28-freetype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/design-log/2015-01-28-freetype.png -------------------------------------------------------------------------------- /design-log/2015-02-01-better-fonts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/design-log/2015-02-01-better-fonts.png -------------------------------------------------------------------------------- /design-log/2015-02-28-flasks-added.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sseefried/open-epidemic-game/ed623269022edc056dab3fd6d424295c984febec/design-log/2015-02-28-flasks-added.png -------------------------------------------------------------------------------- /design-log/README.md: -------------------------------------------------------------------------------- 1 | # Design Log 2 | 3 | ## Introduction 4 | 5 | This directory contains screen shots. I explain each shot and the design decisions behind it here. 6 | 7 | It's in reverse order so you might want to scroll down to the bottom to see how the game looked 8 | at the beginning. 9 | 10 | ## *2015-03-01* Increased birth rate of germs 11 | 12 | It was possible to "game" the game by killing off all germs but one and then just killing its 13 | child as soon as it was born. You could get an unlimited score this way. I have now changed 14 | the mechanics of the game to prevent this from being a viable strategy. The germs now increase 15 | their birth rate as their generation increases. 16 | 17 | You can watch a video of this [here](https://www.youtube.com/watch?v=x8anPTr0C88). 18 | 19 |