├── .gitignore ├── .nojekyll ├── .ok ├── CNAME ├── about.html ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── index.html ├── privacypolicy.html ├── readme.md ├── script.js ├── script.ts ├── site.webmanifest ├── style.css ├── todo.md ├── tsconfig.json └── workadventure_gettingstarted.png /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode -------------------------------------------------------------------------------- /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/secretGeek/devShop/2fd012e0c62588c4ce76091c6590314314e48667/.nojekyll -------------------------------------------------------------------------------- /.ok: -------------------------------------------------------------------------------- 1 | tsc script.ts 2 | code . 3 | n index.html 4 | todo: n todo.md # todo -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | devshop.secretgeek.net -------------------------------------------------------------------------------- /about.html: -------------------------------------------------------------------------------- 1 | 2 | DevShop: About 3 | 4 |

Coming soon

5 | -------------------------------------------------------------------------------- /android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/secretGeek/devShop/2fd012e0c62588c4ce76091c6590314314e48667/android-chrome-192x192.png -------------------------------------------------------------------------------- /android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/secretGeek/devShop/2fd012e0c62588c4ce76091c6590314314e48667/android-chrome-512x512.png -------------------------------------------------------------------------------- /apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/secretGeek/devShop/2fd012e0c62588c4ce76091c6590314314e48667/apple-touch-icon.png -------------------------------------------------------------------------------- /favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/secretGeek/devShop/2fd012e0c62588c4ce76091c6590314314e48667/favicon-16x16.png -------------------------------------------------------------------------------- /favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/secretGeek/devShop/2fd012e0c62588c4ce76091c6590314314e48667/favicon-32x32.png -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/secretGeek/devShop/2fd012e0c62588c4ce76091c6590314314e48667/favicon.ico -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 18 | 19 | DevShop 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 42 | 43 | 44 |
45 | 46 |

DevShop

47 | 48 |
🌟 start
49 | 50 | 51 | 52 | 53 |

Mailing List

54 |
55 | 56 | 57 | 58 | 59 | privacy policy 60 |
61 | 62 |
63 | 64 | 106 | 107 | 176 | 177 | 178 | 179 | 180 | 248 | 301 | 302 | 307 | Press '🌟 start' to begin. 308 | 309 | 310 | about 311 | help 312 | 313 | 314 | 315 | -------------------------------------------------------------------------------- /privacypolicy.html: -------------------------------------------------------------------------------- 1 | 2 | DevShop: Privacy Policy 3 | 4 |

Coming soon

5 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # DevShop! 2 | 3 | I had this idea 10 years ago for a game called [DevShop](http://www.secretgeek.net/devshop_i) and finally decided to implement a minimal version of it. 4 | 5 | It's a kind of 'lemonade stand' game, but instead of buying lemons 🍋 and making lemonade 🍹, you hire developers 💻, testers 🔬 and business analysts 🗣, and complete tasks on a kanban board. 6 | 7 | Play it online here: 8 | 9 | 10 | 11 | 12 | ## Walkthrough 13 | 14 | - click "🌟 start" 15 | - click "🎁 find project ($100)" 16 | - Select on the newly created project in the `Inbox` column of the kanban board. 17 | - Select the "🤔 Founder". (In the animated version this would cause the Founder to walk to the board, grab the card, take it back to their desk, work on it, create a bunch of story cards, and take them back to the board, putting them in the `backlog` column.) 18 | - Once the story cards are in the `backlog` column, click a card to select it. 19 | - Select the "🤔 Founder" again. This causes the Founder to begin developing the card. (In the animated version, they would walk over, get the card, take it back to their desk, swear a lot, etc.) 20 | - The story card eventually ends up in the `Test` column. Now the card needs to be tested. 21 | - The founder is capable of developing, testing, and acting as a BA. They don't do any of these things *particularly well...* 22 | - Select the card in the `test` column, then select the Founder, so it can be tested. 23 | - If it passes testing it is done... and you make money 💲. (It's possible a bug 🐛 is found during testing... or if the bug is missed by the tester, the customer can find the bug 🐞 once they receive the card.) 24 | - when the project is completed you get a completion bonus 💲. 25 | - And you can begin another project... 26 | 27 | Repeat this until you have enough money to buy a dev or a tester or a ba. 28 | 29 | Features include: 30 | 31 | - upskilling people 📕 📗 32 | - training people to increase their efficiency 33 | - giving them 'initiative' so they can sometimes grab cards for themselves. 34 | - ☕ coffee and donuts 🍩 35 | - 🐶 dogs and cats 😸 36 | - inflation. (i.e. things will cost more and be higher stakes as the game progresses.) 37 | - (People will get faster as you increase their skills, but jobs will be bigger... thus creating a steady state, a hedonic treadmill, a red queen's race 👑.) 38 | 39 | 40 | 41 | 42 | ## Tips 43 | 44 | Some keystrokes.... 45 | 46 | 1. Press 1 to select the first available item in the `Inbox` column 47 | 2. Press 2 to select the first available item in the `Backlog` column 48 | 4. Press 4 to select the first available item in the `Test` column 49 | 50 | ..thanks to [Richard Mason](https://github.com/rikware). 51 | 52 | Make sure to buy "⭐initiative⭐" from the store (when it is available) -- once the workers have initiative you are free to manage the work at a higher level. 53 | 54 | ## Lessons 55 | 56 | If you consider it as a tutorial on Kanban or Lean, there are some lessons you can learn by playing this game. These include the following: 57 | 58 | 59 | * If work took no time to complete, you would only need 1 worker. 60 | * The earlier in the process a bug is found and fixed, the cheaper it is to rectify. 61 | * Bugs should be removed before they get to the customer. 62 | * Work should flow left to right. 63 | * You need higher proportions of workers for steps that take longer (e.g. development in this game) 64 | * The smaller the stories the better. They are less likely to have bugs, and faster to work with. 65 | * Multi-skilled workers are helpful for alleviating bottlenecks. 66 | * In a system where bugs and irregular work happen, bottlenecks can appear anywhere. 67 | * Throughput is a more useful measure than idle time. 68 | * Good teams are self-organizing, and this requires *initiative*. 69 | * A newbie thinks "I wish I could hire a manager to assign the tasks automatically" -- a wise person thinks "I wish the workers had enough initiative to select the tasks for themselves." 70 | * The system needs to have some slack in it, or there will be no way to respond to bottlenecks. 71 | * A founder, in the early days, needs to be able to do *anything*. Later employees can be increasingly specialised. 72 | * To state the above more generally: in a small company, or when work is volatile or sporadic, generalists are very valuable (even if their skill levels are not very high). In a larger company, or when work is more predictable, certain specialists are very valuable (and busy). 73 | * Resource levels need to be appropriately balanced. 74 | * Given a choice between doing something well or doing it quickly, it's better to do it well. It saves time soon enough. 75 | * People can only work on one thing at a time. If they worked on more than one thing at a time, it would decrease throughput. Multi-tasking is a waste of time. (But multi-skilling is not!) 76 | * A functioning and growing business can afford to pay a *lot* for good coffee ☕. 77 | 78 | 79 | 80 | ## Non-lessons 81 | 82 | There are many features of the real world, and of workplaces, that are not modelled in this game. 83 | 84 | > "All models are wrong, some models are useful." 85 | 86 | 87 | 88 | In the real world: 89 | 90 | * not all bugs are so easily dealt with: a single bug can do *unlimited* damage. That's a vital feature of real bugs, but isn't modelled in the game. 91 | * workers are not machines. They have good days and bad days, they have real lives. All of this is abstracted away. 92 | * customers don't pay immediately, sometimes they don't pay at all, *even when you've done good work*. Life isn't fair like that. 93 | * you have to pay workers after you hire them. Recurring paychecks aren't modelled in the game because they're not the problem I'm trying to demonstrate. But this isn't a sufficient answer to use in the real world. 94 | * skill levels are not a simple ladder, "dev skill == 7". They would be better modelled as a bifurcating directed acyclic graph, where every node represents a different atom of skill or knowledge. But there's no emoji for that currently. 95 | * before you hire a person, you don't accurately know their skill level. Often you don't know afterward either. 96 | * training takes time and it doesn't have a consistent outcome. 97 | * sometimes workers leave. 98 | * projects never really finish. If they went well there will be ongoing support and changes, indefinitely. If they went badly, the lawsuits can also drag on. 99 | * a situation where "any developer can develop any card" is not achievable. But you can take steps to move in that direction. 100 | * procurement of goods in the enterprise is not as simple as clicking a "buy" button. 101 | * workers spend non-zero amounts of their time in meetings, not shown in this game. 102 | * some related practices I find useful are Daily Standups, Retrospectives, Project Pre-Mortems and Code-reviews. There was no way to integrate these into the game without disturbing the flow. 103 | * context-switching takes time and effort. 104 | * some projects are not worth doing at all. 105 | * some bugs are not worth fixing at all. 106 | * some bugs are not bugs. 107 | 108 | Regarding the risk of skilled employees leaving, I love this: 109 | 110 | > "What if we train them and they leave?
111 | > What if we don't train them and they stay?" 112 | 113 | 114 | ## Contributions 115 | 116 | **Pull requests not actually welcome at this moment.** I may take this commercial, and haven't thought through the implications of accepting PRs on it prior to that. 117 | 118 | I love PRs normally. Please send PRs to other projects. 119 | 120 | -------------------------------------------------------------------------------- /site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"DevShop","short_name":"DevShop","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | .emojicon { text-shadow:0 1px 2px black, 0 2px 4px black; } 2 | 3 | xbody { 4 | scrollbar-color: #666 #201c29; 5 | overflow-x: auto; 6 | scrollbar-color: #666 #201c29; 7 | -webkit-overflow-scrolling: touch; 8 | min-width: 0!important 9 | } 10 | * { xoutline:1px solid red; } 11 | a{ 12 | background-color:var(--main-bg); 13 | color:var(--main); 14 | text-decoration:underline; 15 | } 16 | input[type=email]{ 17 | background-color:var(--main-bg); 18 | color:var(--main); 19 | box-shadow:2px 2px 2px inset var(--main-tr-shadow); 20 | } 21 | 22 | input[type=submit] { 23 | -webkit-border-radius:0px; 24 | -webkit-appearance:none; 25 | border-radius: 0; 26 | } 27 | 28 | .pp{ 29 | max-width:70ch; 30 | padding:2ch; 31 | margin:auto; 32 | font-size:1.2em; 33 | font-family:sans-serif; 34 | } 35 | 36 | .wtf { 37 | display:none; 38 | } 39 | :root { 40 | --main:#333; 41 | --main-bg:#EEE; 42 | --main-button-shadow:#AAA; 43 | --column-count-bg:#DDD; 44 | --column-count-updn-bg:#AAA; 45 | --main-button-bg:#D8D8D8; 46 | --main-button-hint-bg:#D0F0FF; 47 | --main-border:#666; 48 | --main-th:#666; 49 | --main-shadow:#CCC; 50 | --main-avatar-bg:#DEF; 51 | --main-avatar-border:#8AF; 52 | --main-message:#333; 53 | --main-message-bg:#FFC; 54 | --main-negative-money:#E00; 55 | --main-tr-shadow:#EEE; 56 | --main-helplink-border:#666; 57 | --main-helplink-bg:#CDF; 58 | --main-helplink-inset-shadow:#ACF; 59 | --main-title-shadow:#AAA; 60 | --main-title-shadow1:#FF0; 61 | --main-title-shadow2:#48F; 62 | --main-title-shadow3:#4F8; 63 | --main-title-shadow4:#F00; 64 | } 65 | 66 | @media (prefers-color-scheme: dark) { 67 | :root { 68 | --main:#CCC; 69 | --main-bg:#222; 70 | --main-button-shadow:#000; 71 | --column-count-bg:#333; 72 | --column-count-updn-bg:#555; 73 | --main-button-bg:#333; 74 | --main-button-hint-bg:#203066; 75 | --main-button-hint:#EEE; 76 | --main-border:#666; 77 | --main-th:#AAA; 78 | --main-shadow:#444; 79 | --main-avatar-bg:#DEF; 80 | --main-avatar-border:#8AF; 81 | --main-message:#111; 82 | --main-message-bg:gold; 83 | --main-negative-money:#E00; 84 | --main-tr-shadow:#000; 85 | --main-helplink-border:#444; 86 | --main-helplink-bg:#235; 87 | --main-helplink-inset-shadow:#46A; 88 | --main-title-shadow:#555; 89 | --main-title-shadow1:#880; 90 | --main-title-shadow2:#248; 91 | --main-title-shadow3:#284; 92 | --main-title-shadow4:#800; 93 | } 94 | } 95 | 96 | .up, .dn { 97 | padding:7px; 98 | display:inline-block; 99 | opacity:0.8; 100 | background-color:var(--column-count-updn-bg); 101 | } 102 | 103 | .up:hover, .dn:hover { 104 | background-color:#AAA; 105 | cursor:pointer; 106 | } 107 | 108 | .count.limited { 109 | right: 50%; 110 | transform:translateX(50%); 111 | margin-left: auto; 112 | margin-right: auto; 113 | display:inline-block; 114 | white-space: nowrap; 115 | padding:0 0; 116 | } 117 | 118 | .pulse { 119 | animation: pulse 1s infinite cubic-bezier(0.66, 0, 0, 1); 120 | } 121 | 122 | @keyframes pulse {to { 123 | box-shadow:2px 2px 0 10px rgba(212, 175, 55, 0);}} 124 | 125 | #start { 126 | box-shadow:2px 2px 0 var(--main-button-shadow), 0 0 10px gold,0 0 10px gold; 127 | } 128 | 129 | .elapsed { 130 | position:absolute; 131 | background-color:red; 132 | display:inline-block; 133 | width:2px; 134 | min-width:2px; 135 | max-width:2px; 136 | padding:0; 137 | margin:0; 138 | bottom:0; 139 | right:0; 140 | } 141 | 142 | .time-bars { 143 | position:absolute; 144 | right:0; 145 | height:100%; 146 | width:2px; 147 | top:0; 148 | min-width:2px; 149 | max-width:2px; 150 | } 151 | 152 | .count { 153 | position:absolute; 154 | bottom:0; 155 | right:0; 156 | background-color:var(--column-count-bg); 157 | padding:2px 6px 1px 6px; 158 | margin:2px 0 0 2px; 159 | opacity:0.7; 160 | z-index:2; 161 | } 162 | 163 | .count[data-count='0'],.count[data-count='1'],.count[data-count='2'],.count[data-count='3'],.count[data-count='4']{ 164 | display:none; 165 | } 166 | 167 | .count.limited[data-count] { 168 | display:inline-block; 169 | } 170 | 171 | .skill,.icon { 172 | max-width:20px; 173 | display:inline-block; 174 | max-height:20px; 175 | position:relative; 176 | white-space:nowrap; 177 | padding:0 !important; 178 | position:relative; 179 | } 180 | 181 | .button .icon { 182 | font-size:10px; 183 | } 184 | 185 | .skill[data-level]:after,.icon[data-level]:after { 186 | content: attr(data-level); 187 | font-size:10px; 188 | position:relative; 189 | top:-9px; 190 | right:4px; 191 | background-color:var(--main-bg); 192 | border-radius:50%; 193 | width:11px; 194 | height:11px; 195 | display:inline-block; 196 | margin-right:-11px; 197 | } 198 | 199 | .item-enabled { 200 | /* enabled item in store */ 201 | opacity:1.0; 202 | } 203 | 204 | .item-disabled { 205 | opacity: 0.4; 206 | filter: grayscale(100%); 207 | } 208 | 209 | body { 210 | background-color:var(--main-bg); 211 | font-family: 'lucida console', monospace; 212 | max-width:calc(100vw - 4ch); 213 | padding:2ch; 214 | margin:auto; 215 | color:var(--main); 216 | font-size:1.0em; 217 | xheight:100%; 218 | height:calc(100% - 8ch); 219 | } 220 | 221 | #debug { 222 | clear:both; 223 | font-size:0.7em; 224 | position:absolute; 225 | top:calc(100vh - 4ch); 226 | } 227 | 228 | h1,th,.twop { 229 | font-family: 'Press Start 2P', monospace; 230 | font-size:14pt; 231 | color:var(--main); 232 | text-shadow:2px 2px var(--main-button-shadow); 233 | margin-block-start:0; 234 | margin-block-end:5px; 235 | } 236 | .twop{ 237 | font-size:12pt; 238 | } 239 | 240 | h1, .twop{ 241 | text-shadow:1px 1px var(--main-title-shadow3), 2px 2px var(--main-title-shadow4); 242 | 243 | } 244 | 245 | .button, .story, .storeItem { 246 | font-size:0.7em; 247 | border:1px solid var(--main-border); 248 | font-family: 'lucida console', monospace; 249 | border-radius:0; 250 | min-height:40px; 251 | max-width:100px; 252 | min-width:100px; 253 | 254 | display: -webkit-box; 255 | display: -moz-box; 256 | display: -ms-flexbox; 257 | display: -webkit-flex; 258 | display: inline-flex; 259 | vertical-align:top; 260 | 261 | -webkit-box-align: center; 262 | -moz-box-align: center; 263 | -ms-flex-align: center; 264 | -webkit-align-items: center; 265 | align-items: center; 266 | 267 | -webkit-box-pack: center; 268 | -moz-box-pack: center; 269 | -ms-flex-pack: center; 270 | -webkit-justify-content: center; 271 | justify-content: center; 272 | text-align:center; 273 | padding:5px; 274 | } 275 | 276 | .button { 277 | background-color:var(--main-button-bg); 278 | box-shadow:2px 2px 0 var(--main-button-shadow); 279 | } 280 | 281 | .hint { 282 | box-shadow:2px 2px 0 var(--main-button-shadow), 0 0 2px cyan inset; 283 | background-color:var(--main-button-hint-bg); 284 | color: var(--main-button-hint); 285 | } 286 | 287 | .story { 288 | box-shadow:2px 2px 0 var(--main-button-shadow); 289 | border:1px solid var(--main-border); 290 | } 291 | 292 | .person { 293 | box-shadow:2px 2px 0 var(--main-button-shadow); 294 | } 295 | 296 | th { 297 | color:var(--main-th); 298 | font-size:10pt; 299 | padding:7px 4px 4px 4px; 300 | text-shadow:2px 2px var(--main-shadow); 301 | } 302 | 303 | #kanbanboard { 304 | margin-top:5px; 305 | border:1px solid var(--main-border); 306 | border-collapse: collapse; 307 | width:calc(100vw - 4ch); 308 | table-layout: fixed; 309 | height:30vh; 310 | min-height:30vh; 311 | max-height:30vh; 312 | box-shadow:2px 2px 0 var(--main-button-shadow); 313 | } 314 | 315 | #kanbanboard th, #kanbanboard td { 316 | border:1px solid var(--main-border); 317 | position:relative; 318 | 319 | } 320 | #kanbanboard tr td { 321 | box-shadow:2px 2px 2px inset var(--main-tr-shadow); 322 | } 323 | #kanbanboard tr th { 324 | xbox-shadow:2px 2px 2px inset var(--main-tr-shadow); 325 | } 326 | 327 | #kanbanboard td { 328 | min-height:30vh; 329 | height:30vh; 330 | max-height:30vh; 331 | vertical-align:top; 332 | } 333 | 334 | #kanbanboard td .inner { 335 | padding:0; 336 | margin:0; 337 | min-height:30vh; 338 | height:30vh; 339 | max-height:30vh; 340 | width:100%; 341 | overflow-y: hidden; 342 | } 343 | 344 | .selected.possible, .selected { 345 | box-shadow:0 0 1px #80F,0 0 2px #80F,0 0 3px #80F,0 0 4px #80F,0 0 5px #80F; 346 | } 347 | 348 | .possible { 349 | box-shadow:0 0 1px #FF0,0 0 2px #FF0,0 0 3px #FF0,0 0 4px #FF0,0 0 5px #FF0; 350 | } 351 | 352 | .person { 353 | display:inline-block; 354 | vertical-align:top; 355 | margin:5px; 356 | padding:5px; 357 | width:100px; 358 | max-width:100px; 359 | min-height:50px; 360 | text-align:center; 361 | border:1px solid var(--main-border); 362 | border-radius:10px; 363 | } 364 | 365 | .story,.storeItem { 366 | position:relative; 367 | margin:3px 3px 0 3px; 368 | } 369 | 370 | .storeItem-catalog { 371 | font-family: 'lucida console', monospace; 372 | font-size: 8pt; 373 | border:1px solid var(--main-border); 374 | position:relative; 375 | margin:4px 0; 376 | width:calc(100vw - 9ch); 377 | display:block; 378 | float:none; 379 | clear:both; 380 | } 381 | 382 | .item-name { 383 | display:inline-block; 384 | white-space:pre-wrap; 385 | max-width:calc(100% - 170px); 386 | position:absolute; 387 | left:125px; 388 | top:50%; 389 | transform:translateY(-50%); 390 | } 391 | 392 | .storeItem-catalog { 393 | position:relative; 394 | } 395 | 396 | .storeIcon{ 397 | position:absolute; 398 | top:50%; 399 | transform:translateY(-50%); 400 | } 401 | 402 | .storeItem-catalog .button { 403 | font-size:1.2em; 404 | min-height:40px; 405 | max-width:60px; 406 | min-width:60px; 407 | margin:5px; 408 | } 409 | 410 | .storeitem-icon { 411 | font-size:1.6em; 412 | padding:2px; 413 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; 414 | } 415 | 416 | .busy, #done .inner .story { 417 | opacity:0.4; 418 | border:1px solid var(--main-border); 419 | } 420 | 421 | .doer:not(.busy):hover, .receiver:not(.busy):hover, .button { 422 | cursor:pointer; 423 | } 424 | 425 | #money { 426 | text-shadow:0 2px 2px var(--main-shadow); 427 | float:right; 428 | margin:0 0; 429 | } 430 | 431 | #xp, #level, #rate { 432 | text-shadow:0 2px 2px var(--main-shadow); 433 | float:right; 434 | margin:0 20px 0 0; 435 | } 436 | 437 | .hidden { 438 | display:none; 439 | } 440 | 441 | .person .summary { 442 | display:block; 443 | font-size:8pt; 444 | } 445 | 446 | .summary { 447 | margin-top:5px; 448 | } 449 | 450 | .person .skills, .person .itemList { 451 | display:block; 452 | } 453 | 454 | .skills,.itemList { 455 | margin-bottom:3px; 456 | } 457 | 458 | .skills .skill, .itemList .icon{ 459 | font-size:10pt; 460 | margin:3px; 461 | padding:3px; 462 | } 463 | 464 | .skills .skill { 465 | border:1px solid var(--main-border); 466 | border-radius:4px; 467 | } 468 | 469 | .logo, .avatar, .avatar2, .secrets, .icon, .skill, #message, #storeMessage { 470 | font-family: arial; 471 | font-size:12pt; 472 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; 473 | } 474 | 475 | h1 .icon { 476 | font-size:inherit; 477 | text-shadow:none; 478 | } 479 | 480 | .secrets { 481 | background-color:var(--main-button-shadow); 482 | opacity:0.5; 483 | } 484 | 485 | .avatar { 486 | border:1px solid var(--main-avatar-border); 487 | background-color:var(--main-avatar-bg); 488 | border-radius:7px; 489 | padding:2px 0; 490 | } 491 | 492 | .avatar2 { 493 | display:block; 494 | text-align:center; 495 | } 496 | xbody { 497 | xdisplay: flex; 498 | } 499 | 500 | xhtml, xbody { 501 | xheight: 100%; 502 | } 503 | 504 | #message,#storeMessage { 505 | xposition:sticky; 506 | position:absolute; 507 | xalign-self; 508 | bottom:2ch; 509 | border:1px solid var(--main-border); 510 | xwidth: 20px; 511 | xmax-width:20px; 512 | xmin-width:20px; 513 | left: 50%; 514 | xleft: calc(50% - 70px); 515 | transform:translateX(-50%); 516 | xtransform:translateX(-150%); 517 | background-color:var(--main-message-bg); 518 | color:var(--main-message); 519 | padding:1ch; 520 | box-shadow:2px 2px var(--main-button-shadow); 521 | font-size:12pt; 522 | } 523 | 524 | #message,#storeMessage { 525 | 526 | } 527 | 528 | #helpLink,#aboutLink { 529 | position:absolute; 530 | bottom:7px; 531 | border:0.25px solid var(--main-helplink-border); 532 | background-color:var(--main-helplink-bg); 533 | box-shadow:0 0 2px var(--main-shadow), 0 0 5px var(--main-helplink-inset-shadow) inset, 0 0 2px var(--main-helplink-inset-shadow) inset; 534 | padding:3px 7px; 535 | border-radius:10px; 536 | text-decoration:none; 537 | color:var(--main); 538 | } 539 | 540 | #aboutLink 541 | { 542 | left:0%; 543 | margin-left:5px; 544 | } 545 | 546 | #helpLink{ 547 | right: 0%; 548 | margin-right:5px; 549 | } 550 | 551 | .story-detail { 552 | display:inline-block; 553 | white-space:pre-wrap; 554 | overflow-y: hidden; 555 | overflow-x:hidden; 556 | margin-left:3px; 557 | } 558 | 559 | .points { 560 | position:absolute; 561 | bottom:1px; 562 | left:3px; 563 | } 564 | 565 | .negative { 566 | color:var(--main-negative-money); 567 | } 568 | 569 | #items { 570 | margin:20px 0; 571 | 572 | } 573 | 574 | 575 | /* shop's #items scroll */ 576 | 577 | #store::-webkit-scrollbar-track { 578 | border-radius: 10px; 579 | background-color: transparent; 580 | } 581 | 582 | #store::-webkit-scrollbar-thumb { 583 | border-radius: 10px; 584 | background-color: var(--main-border); 585 | } 586 | 587 | #store::-webkit-scrollbar-thumb:hover { 588 | background-color: var(--main); 589 | } 590 | 591 | #store::-webkit-scrollbar-corner { 592 | background-color: transparent; 593 | border-color: transparent; 594 | } 595 | 596 | #store::-webkit-scrollbar { 597 | width: 10px; 598 | height: 10px; 599 | background-color: transparent; 600 | } 601 | 602 | /* end - store scrollbar */ 603 | 604 | 605 | /* PAGE Scrollbar - whole app */ 606 | 607 | ::-webkit-scrollbar-track { 608 | border-radius: 10px; 609 | background-color: transparent; 610 | } 611 | 612 | ::-webkit-scrollbar-thumb { 613 | border-radius: 10px; 614 | background-color: var(--main-border); 615 | } 616 | 617 | ::-webkit-scrollbar-thumb:hover { 618 | background-color: var(--main); 619 | } 620 | 621 | ::-webkit-scrollbar-corner { 622 | background-color: transparent; 623 | border-color: transparent; 624 | } 625 | 626 | body { 627 | scrollbar-color: #666 #201c29; 628 | } 629 | 630 | ::-webkit-scrollbar { 631 | width: 10px; 632 | height: 10px; 633 | background-color: transparent; 634 | } 635 | 636 | /* end whole page/app's scrollbar */ 637 | 638 | 639 | 640 | .describe { 641 | display:inline-block; 642 | font-size:2em; 643 | box-shadow:0 0 5px #FCA inset; 644 | cursor:pointer; 645 | border-radius:5px; 646 | padding:5px; 647 | margin:5px; 648 | min-width:20px; 649 | position:absolute; 650 | right:5px; 651 | top:50%; 652 | transform:translateY(-50%); 653 | } 654 | 655 | .storeIcon { 656 | font-size:3em; 657 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; 658 | } 659 | 660 | #store, #office, #startscreen, #loadscreen { 661 | position:absolute; 662 | max-height:calc(100vh - 60px); 663 | height:calc(100vh - 60px); 664 | overflow-y:auto; 665 | overflow-x:hidden; 666 | max-width:calc(100vw - 4ch); 667 | width:calc(100vw - 4ch); 668 | } 669 | 670 | /* tablet/large phone layout */ 671 | @media screen and (max-width: 720px) 672 | { 673 | body { 674 | padding:1ch; 675 | } 676 | th,.story,.storeItem { 677 | font-size:7pt; 678 | text-shadow:1px 1px var(--main-shadow); 679 | } 680 | #message,#storeMessage { 681 | font-size:10pt; 682 | } 683 | } 684 | 685 | @media screen and (max-height: 500px) 686 | { 687 | #kanbanboard td .inner { 688 | padding:0; 689 | margin:0; 690 | min-height:150px; 691 | height:150px; 692 | max-height:150px; 693 | } 694 | } 695 | 696 | /* small phone layout */ 697 | @media screen and (max-width: 480px) 698 | { 699 | body { 700 | padding:1ch; 701 | } 702 | .count{ 703 | font-size:6pt; 704 | margin:0; 705 | } 706 | .up, .dn { 707 | padding:4px; 708 | } 709 | th,.story,.storeItem { 710 | font-size:6pt; 711 | text-shadow:1px 1px var(--main-shadow); 712 | } 713 | #message,#storeMessage { 714 | font-size:8pt; 715 | } 716 | #buttons { font-size:0;} 717 | .button,.story { 718 | max-width:50px; 719 | min-width:50px; 720 | font-size:8pt; 721 | } 722 | .button { 723 | margin:2px; 724 | } 725 | .story-detail { 726 | font-size:6pt; 727 | } 728 | .person { 729 | width:80px; 730 | max-width:80px; 731 | } 732 | .metrics { 733 | font-size:7pt; 734 | } 735 | #xp, #level, #rate { 736 | margin-right:4px; 737 | } 738 | } 739 | 740 | 741 | /* startscreen (the email sign up screen shown when the app starts) */ 742 | 743 | #startscreen h1 { 744 | text-align:center; 745 | font-size:38pt; 746 | margin:30px auto; 747 | transform: rotate(-12deg); 748 | text-shadow:1px 1px var(--main-title-shadow1), 2px 2px var(--main-title-shadow2), 3px 3px var(--main-title-shadow3), 4px 4px var(--main-title-shadow4); 749 | } 750 | #startscreen h1:after { 751 | content: '🥓'; 752 | text-transform: rotate(120deg); 753 | margin-left:-12px; 754 | } 755 | 756 | #startscreen h2 { 757 | text-align:center; 758 | margin:30px auto; 759 | padding-bottom:5px;margin-bottom:0; 760 | } 761 | 762 | #startscreen input[type=email]{ 763 | text-align:center; 764 | margin:0 auto; 765 | border:1px solid var(--main-border); 766 | padding:3pt; 767 | display:block; 768 | width:200px; 769 | } 770 | 771 | #startscreen a { 772 | text-align:center; 773 | margin:0 auto; 774 | display:block; 775 | font-size:small; 776 | text-decoration:none; 777 | width:200px; 778 | background-color:var(--main-bg); 779 | color:var(--main); 780 | text-decoration:underline; 781 | 782 | } 783 | 784 | #startscreen .button { 785 | display:flex; 786 | margin:20px auto; 787 | } 788 | 789 | #startscreen .hidden, #startscreen input[type=email].hidden { 790 | display:none; 791 | } 792 | 793 | #startscreen .button#joinemail, #startscreen .button.joinemail { 794 | margin-top:10px; 795 | color:var(--main); 796 | white-space:normal; 797 | box-sizing:content-box; 798 | } 799 | 800 | /* end - startscreen */ 801 | .hint { position:relative} 802 | .hint::after { 803 | right: -1ch; 804 | position: absolute; 805 | top: -15%; 806 | content: "\279F"; 807 | font-size: 2.5rem; 808 | text-shadow: -1px -1px 1px var(--main-title-shadow4); 809 | transform: rotate(160deg); 810 | color:yellow; 811 | } -------------------------------------------------------------------------------- /todo.md: -------------------------------------------------------------------------------- 1 | # TODO 2 | 3 | ## Ranked 4 | 5 | - [ ] add class 'hint' to find project button at start... and when first project is completed... 6 | - consider: hint could add a yellow arrow pointing right (via a "::after") 7 | - [x] Wrong color scrollbar on entire screen in dark mode. 8 | - [x] BUG! In the shop - scroll down but message isn't pinned to bottom. 9 | 10 | 11 | 12 | ## Unranked 13 | 14 | ### From script.ts 15 | 16 | // Definitely 17 | 18 | [ ] Place limit on all columns 19 | [ ] Starting limit should be the value of a new project / 2 20 | [ ] height of buttons at top must be consistent. Table layout maybe? 21 | [ ] sorting workers 22 | [ ] ?? ? requires a notification modal. 😡 23 | modal: Some projects are time critical. You get a bonus for completing them early. Notice the green bar on their right edge: that's the count down. 24 | ? also could show a modal near the start "So much rework needed... visit the store to upskill your team members" 25 | [ ] populate load screen 26 | [ ] about screen (content) 27 | [ ] join mailing list functionality joinemail 28 | [ ] privacy policy content -- mailing list, google analytics 29 | [ ] How to exit the game, and when/how to save. 30 | ? Your high scores? 31 | ? Time Challenge 32 | [ ] add google analytics 33 | [ ] size on ipad: too wide. why? 34 | [x] 🐛Words wrap in store 35 | [ ] 🐛Icons and help icon are not vertically centered in store (other content is not either) 36 | [ ] Multi-skilled person choosing task to do could be based on: 37 | total number of points in a column divided by number of people with that skill. 38 | Worst ratio? Do that next. In case of tie-break, go with right most column. 39 | No -- if any are worse than the threshold -- do the worst. 40 | if all are better than the threshold, choose from the right. 41 | [ ] show (but disabled) buy dev / buy tester button when first starting 42 | [ ] keybinding -- letters to people 43 | [ ] keybinding -- multiple presses of a number will cycle through the cards in that column 44 | [no] Consider: have a slow loop that checks if any one with selfStart who is not selected or busy has a triggerTime that's stale by > 2* maxtriggertime and if so call 'trySelfStart' 45 | [ ] more technical names for tasks 46 | [ ] add to store: 47 | - Games console 🕹 48 | - Deluxe Games console 🎮 49 | - Desk A/C ❄ 50 | - pingpong table 🏓 51 | - cityscape at dusk 🌆 52 | 53 | [ ] front page: 54 | -> Start 55 | -> (later: Resume -- saved games) 56 | -> About -> link to wiki that describes each item in the store. 57 | -> Mailing List [________: Join ] __privacy policy__ 58 | -> game itself needs a way to exit then. 59 | fire people? 60 | limited people? 61 | 62 | "Overcooked" is a multiplayer time management game originally on the sony playstation network. 63 | 64 | 65 | [ ] Microdose lsd in store: shadertoy.com effects -- or other animated bg effects. 66 | [ ] seasonal mods: 67 | [ ] st patricks day whiskey/green beer. 68 | [ ] halloween products 🎃 🦇. 69 | [ ] xmas items 🎄 🎅. thanksgiving turkey 🦃 70 | [ ] valentines 💟; 71 | [ ] wear it purple 72 | 73 | [ ] chaos monkey 🐒 74 | 75 | stats button lower right 📈 : each person's skills and description. point per minute described for every minute of the game (excluded minutes with 0 points) 76 | [ ] achievement when a thing is done for the first time? 77 | 78 | 79 | 80 | 81 | - [ ] Person emojis -- emoji skin tone modifiers 82 | - see https://emojipedia.org/modifiers/ -- i TRIED + ("🤔" + "\u200B" + "🏾") and ("🤔" + "‍" +"🏾"); no luck yet -- and same without the zwj at all... no luck! 83 | 84 | - [ ] Some items can only be purchased if you have the necessary target. 85 | - // e.g. advanced developer training requires a dedicated developer (not just the founder) 86 | 87 | - [ ] BUY button .... 88 | - [x] hides main "screen" 89 | - [x] new screen has: 90 | `<< leave shop` 91 | 92 | THings to purchase (potentially scrollable) 93 | (An array of objects... ) 94 | - courses 95 | - skills 96 | - items: 97 | - coffee machine 98 | - new chair 99 | - pot plant 100 | - monitor upgrade 101 | - desk fridge 102 | - software courses 103 | (Items are only shown if at least one of your people is eligible for that item) 104 | 105 | [ ] more are added as level increases. 106 | [ ] costs of a thing go up by a percentage each time a thing is purchased 107 | TRAIN >> 108 | Printed materials 109 | Books (many many titles) 110 | Magazine subscriptions (ever dwindling list!) 111 | Developer training courses (too many to list) 112 | Code Reuse 113 | Writing courses 114 | Topics in usability 115 | Scalability 116 | Secure code 117 | Literate code 118 | Defensive coding 119 | (and thousands more: 120 | always 'general' topics) 121 | Tester training (sample) 122 | Effective repro 123 | A Lesson in Regression 124 | Eliminating the irrelevant 125 | Automation for fun and profit 126 | Rattle testing: the dying art 127 | Load testing for one 128 | Overcoming developer envy 129 | Usability Testing 130 | Accesibility Testing 131 | Performance Testing 132 | Automating the Impossible 133 | Agile Testing: Fact or Fiction 134 | - BA/Project management Traning 135 | Handling difficult people 136 | Required reading in reading Requirements 137 | 'What are you really wanting to achieve?' 138 | 'What's it gonna cost if you don't have that feature?' 139 | An analysis of the cost and benefit of cost benefit analysis 140 | Business Process Re-engineering from 20,000 feet 141 | - BLING 142 | - better seat 💺 143 | - a plant 🌳 144 | - a personal coffee machine ☕️ 145 | - Office decoration s 🎣 146 | - a fan 147 | - a robot 🤖 148 | - a printer 🖨 149 | - a mechanical keyboard ⌨️ 150 | - A games console 🕹 151 | - a fax machine 📠??? 152 | - Artworks 🌄 153 | - another games console 🎮 154 | 155 | 156 | - [ ] PROJECT! BIG PROJECT! PROJECT HERE! Webview 2 based embedded browser app with save/load 157 | 158 | 159 | [ ] Training button... buy dev training... buy tester training... buy BA training... 160 | - when you buy a training course, anyone can grab it... potentially 161 | - able to give new skills to existing workers. 162 | - able to increase efficiency of existing workers 163 | SKILL: 164 | observation. (when completing a task, looks for another task of the same type.) 165 | pro-active. while idle, independently decides to look for a task they can do. 166 | courage. 167 | 168 | It should say and show what it is they now do... 169 | SPECIFIC and real technical lessons 170 | 171 | 172 | Learns to write SQL "SELECT" queries 173 | Learns to write SQL JOINS queries 174 | Learns to write SQL insert and update queries 175 | 176 | ... The person's SKILL COUNT goes up. 177 | 178 | 179 | Learns to write CRUD SQL queries - create, read, update, delete. 180 | 181 | Learns 182 | 183 | 184 | Thomas ideas: 185 | 186 | A few ideas 187 | 188 | **definitely** 189 | 190 | - Change request event, like the current bug event, which pulls a card from its current position, even finished, back to start. 191 | --> difference is, it is an added story, not a recycled story, it takes BA time, it doesn't have a money decrease, but rather an increase.... although it does delay the completion bonus. Has different symbology/description. (How to trigger it, without worrying about a race condition regarding completion bonus?) 192 | 193 | - Special abilities which you unlock over time and obtain charges of in some way, purchasing or as rewards, such as Bug Bash to rapidly get through a stack of bugs, or Mercenary which brings in a high-level super contractor for a single sprint. 194 | 195 | --> bug bash... like a bonus round 196 | --> 197 | 198 | - Occasional Tenders, which are like boss fights compared to normal projects. You have to put together the tender somehow, perhaps it's like a normal project but instead of rewarding money it rewards a tender application score that determines whether you win the tender. The tender itself is then a bigger more challenging version of a project with better rewards. 199 | 200 | --> a tender item pays no money along the way, and only pays money if you win the tender and complete the project, but the project pays a premium (to make up for the tender cost) 201 | 202 | 203 | ** time management ideas ** 204 | 205 | if it was implemented as a time management system then there would be little modal tasks that pop up 206 | 207 | for example to create cards: 208 | 209 | As a ..... 210 | I want a ..... 211 | So that. 212 | 213 | where role:= 214 | User 215 | Sophisticated user 216 | Teacher 217 | 218 | Adjective-profession or role 219 | 220 | People win chess 221 | Astronauts solve problem 222 | Life becomes wonderful 223 | 224 | 225 | When there's Code to be written 226 | 227 | —- Tao tap tap -- code gets written 228 | 229 | Front end to be tested.... 230 | 231 | tap each element -- see if a bug emerges... 232 | 233 | Bugs to be fixed 234 | 235 | Front end - tap each bug 236 | Code - tap each bug 237 | 238 | 239 | **probably not** 240 | 241 | - At the end of each project you choose a go live party option (random multiple activities with different costs), the option you pick determines the morale boost each employee gets in the first sprint of the next project. 242 | 243 | - Adding complexity to above: each employee has activities they like (extra boost) and dislike (no boost). 244 | 245 | 246 | - Traits for employees, so when choosing employees to hire you have to balance their salary, traits and current level. For example devs can have a Cowboy trait that increases dev speed but also bug chance. No stats like Game Dev Story, an employee just has a level and their traits. 247 | 248 | NO: only one dog in the office. 249 | No: only one cat in the office. 250 | 251 | No: cat poops 252 | No: dog poops 253 | No: rename to 'tinykanban' 254 | 255 | 256 | 257 | # DEFER 258 | 259 | 260 | [ ] defer: Once limits are enabled: - detect + and - (plus and minus) keys and use them to alter limits... (this would only work if the limits were only on one columns) 261 | 262 | 263 | 264 | 265 | show scores and levels in hexadecimal???? 266 | 267 | 268 | 269 | store game state in local storage 270 | 271 | 272 | [ ] graphics version 273 | - original idea was to build a graphical version with little characters moving around an initially bare office which becomes slowly ever more populated with people and things. 274 | - the pixel art at 275 | 276 | https://workadventu.re/getting-started 277 | 278 | ...is certainly very similar to what I'd pictured. 279 | 280 | ![workadventure](workadventure_gettingstarted.png) -- see https://workadventu.re/getting-started 281 | 282 | 283 | 284 | ## Defer/Maybe 285 | 286 | 287 | [ ] Employee of the day 288 | [ ] More celebration/reward when cards are paid 289 | [ ] More celebrating when projects are finished 290 | [ ] More celebrating when upgrading 291 | [ ] Celebrating could be done via some css animations 292 | 293 | 294 | [ ] Training should have a time cost (? increases at higher levels of training) 295 | 296 | [ ] Cumulative flow diagrams 297 | [ ] ability to re-arrange workers 298 | [done] How to do determine if a job has become too stale? has taken too long to complete? and if determind, how to show it visually? 299 | [done] Self-start... also randomly fire if unallocated for too long. 300 | [done] Dark mode 301 | [done] drawMessage "You gave Alan a developer upgrade" 302 | [ ] drawMessage "Founder is enjoying that donut" 303 | [ ] StoreItem: Master BA: breaks a project into two smaller projects. (applies if the project size > half of the current points per project level) 304 | calls them {original name} A and {original name} B. 305 | can only be given to a person once. (How to do selection/highlighting?) 306 | [no](buy bot instead) Hire a scrum master... once you hire them -- they take over for you, basically... and you can then open a second DevShop... 307 | [ ] how to show attributes/stats sheet of a person? (see stats button) 308 | ? limited number of slots for people. cannot hire more than level number... until 309 | ? dual-skill cannot be better than "4/5" at either skill 310 | finesse: 311 | - buy dev button is visible but disabled is < (cost of dev) 312 | - if no activity detected for long time... show tip 313 | - non-prop font for level etc. 314 | 315 | 316 | 317 | ## Won't do 318 | 319 | no: Personal robot 🤖: ?? If I had a good use for the robot, then yes. But can't see one. Maybe adds level 1 to all? 320 | no: add a random timer of sick/vacation unavailability for each resource -- although "realistic" this is a model not reality, it's okay to avoid most of reality. I feel it would be painful. I also thought about having them spontaneous quit but avoided it. Same with managing their moods/energy levels. Nah, too detailed. 321 | no: resources gain experience/competence with each task they finish -- too nuanced. not able to be shown visually. 322 | no: A worker sometimes gets distracted. (Often). -- the dog/cat might decrease that. 323 | no: When you add something to the board. If it's the only thing on the board, then select that thing automatiucally. 324 | no: button hover should be light blue 325 | no: do we have an id issue when selecting storeitem's in store versus inbox? clash of id's? 326 | no: test-management suite -- test level up 327 | no: powerful IDE -- dev level up 328 | no: spreadsheet skills -- be a better BA 329 | no: email etiquette course -- be a better BA 330 | no: when you buy a self-starter card (or any card) that should not be enough to kick off the self-starting behaviour. (or should it!?) (yes it should) 331 | no: Add icons to columns to make required skill clearer (tried it, couldn't make it work neatly on small mobile screens) 332 | no: Limit dog/cat numbers 333 | no: chain observations onto each self start. REMOVING observation 334 | no: are observations now chained with self-start? seems too extreme. REMOVING observation 335 | 336 | 337 | 338 | # DONE 339 | 340 | 1:42 AM Saturday, 3 September 2022 341 | 342 | [x] headphone "LEVEL" 343 | [x] items worth 1000000 should be written 1M 344 | [x] refactor selfstart to initiative 345 | 346 | [x] size of +/- on iphone 347 | 348 | 349 | 350 | === OLDER === 351 | 352 | [x] limit should be placed on the next column not the current column 353 | [x] limit should show points/max points and not show number of cards at all 354 | [x] customer finds bug -- logo should be 👿 - remove angry face with horns from emojis of staff 355 | [x] make expired timebar full RED. 356 | [x] have time flag turn itself on at about level 7 or 8 357 | at first it is on for 20% of projects... grows by a further 20% every level 358 | do we first have to wait for them to add initiative to a player? 359 | 360 | 361 | * Selecting the buy bot: 362 | [x] Must be assigned to someone who has initiative. No: I just give the person minimum initiative 363 | [x] If selected from inbox and no one possible to assign: a display message will explain why no target recipients. No, see above. 364 | [x] Robo-Caller skill: if all columns have less than N*2 + 4 items (where N = # with that skill) *and* cash-on-hand > 2 * proj cost... then buy proj. 365 | includes... column limits based on # points with + and - buttons on them, shown as [+| 29/3 points|-] ... and have it affect behavior of upstream people 366 | [x] emoji font not used for message areas - 🖼 doesn't look right 367 | [x] show # 📍 -- points in the column labels. 368 | [x] robot 🤖 buy-bot: robo-caller -- A robot at your desk! The buy-bot buys new projects for you (unless the backlog is over its limit) 369 | [x] only 1 buy bot allowed. 370 | [x] Buying the buy bot...... 371 | [x] it does not refresh the display right away 372 | [x] it says "out of stock is not available until a higher level" 373 | [x] select skill from inbox, a worker is highlighted. but when their initiative ticks over, they lose their highlight. 374 | 375 | 376 | [x] all dogs have same icon after first choice (no, there just weren't enough icons for dogs, so i broadened by canine definition) 377 | [x] move initiative up. 378 | [x] have starting initiative be much much slower ?? 379 | [x] bugs repeat too much in early levels when you only have 1/2 people. A re-cycled card should have less and less chance of having new bugs. 380 | [x] start button 381 | [x] load button (Or replace 'load' with 'resume' and have it say "12 🥑 153 🥓" .. and perhaps a time you last opened it??) 382 | [x] exit load screen 383 | [x] about button 384 | [x] exit about 385 | [x] mailing list controls 386 | [x] donut machine 🏭 - similar effects to coffee machine. Doesn't seem advisable though. 387 | [x] cards and projects age. After X minutes, they are worth 0. progress bar along the side. 388 | [x] show 💲/min 389 | [x] things in the done column should always appear faded out like their busy, but basically unselectable 390 | [x] When person returns from completing a self-started task, they should highlight themselves if there is a selected object of consequence 391 | [x] dog: consistent icon (random choice at first) 392 | [x] dog to have a name 393 | [x] cat: consistent icon (random choice at first) 394 | [x] cat to have a name 395 | [x] Add to store: 396 | [x] headphones 🎧 397 | [x] Desk plant 🌳 398 | [x] Desk cactus 🌵 399 | [x] cookie 🍪 ($1, not unlocked until level 100) 400 | [x] for dev/ba/test: If level > 9 -- use infinity symbol not a number 401 | [x] if person is the selected doer then they cannot self-start at that moment. 402 | [x] Dogs, cats and store items shouldn't count towards number of items in column, only stories. 403 | [x] cat nerd doesn't render correctly (on iOS at least) 404 | 405 | [x] remove observation skill 406 | [x] rename self-start to initiative 407 | [x] Self-starter -- should be infinite but with a big delay. Delay is smaller at higher levels. 408 | [x] 🐛when in the store: only store messages should be shown 409 | [x] tending to cat/dog takes too long as you progress. 410 | [x] keyboard icon not rendered correctly when added to person 'has' -- add .icon class 411 | [x] level of observation training should be shown.... 412 | [x] level of self-starter behaviour should be shown... 413 | [x] indicate # items in a column if more than a minimum 414 | [x] help button doesn't work 415 | [x] slower increase in cost for store items. 416 | [x] ensure chance of CREATING a bug or spec bug is lower for rework 417 | [x] ensure level of skills is visible 418 | [x] icon to indicate has seat after seat upgrade: should show up on the person 419 | [x] seat upgrade should make you more effective 420 | [x] chance of finding a bug or specBug -- need to be same mathematical model as creating bug or spec bug 421 | [x] if > 1, show skill level number top right of skill icon on person card. 422 | [x] consider: the store should show level n+1 items, disabled. 423 | [x] show next level items (disabled) before they are available (buttons in office, and in store) 424 | [x] when new items added to store, show a little icon on the store button 425 | [x] highlight store button to indicate when there are new things added to it. Unhighlight it when it is pressed. 426 | [x] highlight button when enabled -- do this for all buttons that are created during level up. (e.g. buy dev) 427 | [x] ability to see skill level 428 | [x] dog/cat never seem to return! 429 | [x] there is a 0% chance of finding it (spec bug) 430 | [x] starting price of tester and dev should be 200 not 300 431 | [x] add "piece of toast 🍞 $10" 432 | [x] BA retained message after stopping rework on a specbug 433 | [x] ensure Dog and cat are for "any" not just "ba" or "dev" 434 | [x] every time you buy something it triples in price. Better idea! Not triple, but high price. 435 | [x] store... put ICON before name 436 | [x] Add statue 🗽 437 | [x] Add statue2 🗿 438 | [x] mechanical keyboard should be an early level item -- level up anyone 439 | [x] When a .button is clicked at top, deselect doer or receiver and possible 440 | [x] mech keyboard should be added 441 | [x] Price of staff should double each time. At least. If not 5x. Or 3x 442 | 443 | Memory management: 444 | When a project is complete: 445 | [x] Delete each of its stories from game.stories 446 | [x] Delete it from projects. 447 | [x] Initial dog cat duration double 448 | [x] And double it every time there after 449 | [x]If money is negative then XP is not added to XP. Instead it is multiplied by -1 and added to money 450 | [x] And lock in the per point price of the story (lead) when it is purchased then pass it into the children when. They are spawned. 451 | [x] When the customer finds a bug... the return of the card is immediately halved. 452 | 453 | 454 | 455 | [x] Don't say idle if they are just waiting to self start 456 | [x] Show self start icon 457 | 458 | 459 | [x] Shouldn't be able to select items that are in the done column 460 | [x] instead of efficiency... have their skill level map so 1-10 is 0.3 0.4 ,0.5 ,0.6 ,0.77 ,0.83 ,0.90 ,0.95 ,0.99 461 | 462 | [x] if have cat... less errors. 463 | [x] if have dog... work faster. 464 | [x] is there inflation? 465 | each time a thing is purchased, that thing becomes x% more expensive. i.e. compounding interest on prices. 466 | levels: 467 | each time an action is performed, you receive an experience point. 468 | ? the person also receives an experience point for that skill. 469 | 470 | [x] guillotine bug on iOS (table too tall basically) 471 | [x] bugs can exist before level 2 - just can't be found by tester or customer (avoids a way of cheating/missing the point) 472 | [x] rework on a bug should be quicker than original work. 473 | [x] button text smaller, particularly at smaller sizes 474 | [x] vertical-center content in .button 475 | [x] store items should have an info icon that reveals their description. 476 | [x] bugs don't exist until level 2... 477 | [x] store: buy observation skills. 478 | [x] replace 'var ' with 'let ' 479 | [x] bug: shouldn't be able to select a 'busy' receiver or doer. 480 | [x] when something is selected and it's wrong then de-select the previous thing. (be it doer or receiver) 481 | [x] Board height should be limited. 482 | [x] short series of tool tips for showing/hiding "next action" 483 | - start the game 484 | - buy a sales lead 485 | - click the founder, then click the lead (or vice versa). 486 | - click the founder then click a story 487 | 488 | [x] when to show "buy person" button(s) ? When money first reaches minimum... 489 | 490 | [x] select names from an array 491 | [x] updating person: update card in place, don't remove. 492 | [x] restore delay time factor. (avgDuration) 493 | 494 | [x] when someone is busy, say what they are doing. (could be creative later.) 495 | [x] give people names 496 | 497 | [x] if something is delivered that has a bug... the customer finds it and gives it back... to be started over. gets angry customer icon. 498 | [x] when developing, chance of finding a bug should be related to: 1. presence of bug, effectiveness of worker. 499 | [x] when developing, chance of *creating* a bug should be related to: effectiveness of worker, size of card. 500 | 501 | [x] each project... should also have a project logo. (random emoji) 502 | [x] that logo is displayed on its lead and subsequent stories 503 | [x] instead of random time to move things... have it relate to # points / effectiveness of worker. 504 | [x] project names could be generated using an algo. ()-(). 505 | [x] show the cash amount. 506 | [x] when person is busy show that they are busy 507 | [x] when person is busy they cannot be selected for task 508 | [x] when task is busy it cannot be selected as receiver 509 | [x] when things are 'done' they are delivered... get cash as a result. (Every time! not only when project is completed) 510 | [x] dollar is shown next to card... it dissappears off board after a few seconds. at which time money appears on board. 511 | ? how do leads arrive? randomly? via advertising? 512 | [x] you buy them. 513 | [x] top align cards in columns. 514 | 515 | 516 | Answered/resolved (in a different topic) 517 | ? when purchasing a project... cannot go more than $100 * level into the red (?) or 100* #people ?? 518 | ? When is interest added to the loan!? 519 | after a certain amount of time.... (is it a turn based game or a time-based game?) 520 | some things about it are time based... delays for example 521 | whenever levelling up... whenever a story is finished? whenever an action occurs 522 | 523 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict":true, 4 | "plugins": [ 5 | { 6 | "name": "typescript-tslint-plugin" 7 | } 8 | ] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /workadventure_gettingstarted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/secretGeek/devShop/2fd012e0c62588c4ce76091c6590314314e48667/workadventure_gettingstarted.png --------------------------------------------------------------------------------