Using the push-sprites hack
Animal Husbandry is a short game to showcase some of the features of the push-sprites hack in Bitsy.
Below I will explain how to achieve the key game behaviours using the hack.
behaviour | You can push the animals but not the sign. |
explanation | All sprites except the sign are pushable by the player, so I added a flag to the sign name. |
game data | SPR g 11111111 10000001 10000001 10000001 11111111 00011000 00011000 00000000 NAME sign_IMMOVABLE DLG SPR_0 POS 0 3,2 |
hackOptions | playerPushesSprite: function (spr) { if(!spr.name) return true; else return spr.name.indexOf('IMMOVABLE') == -1; } |
behaviour | Bigger animals can push smaller ones. |
explanation | Sprites have names starting with the animal name, which is checked in the push logic. |
game data | SPR s 00000000 00000000 00000000 01111100 11111110 11111110 11111100 10001000 NAME pig1 POS 0 9,7 |
hackOptions | spritePushesSprite: function (spr1,spr2) { if(spr1.name){ //... if(spr1.name.startsWith("pig")){ if(spr2.name){ if( spr2.name.startsWith("pig") || spr2.name.startsWith("dog") || spr2.name.startsWith("sheep") || spr2.name.startsWith("cat") || spr2.name.startsWith("chicken") ){ return true; } } } //... } return false; } |
behaviour | Animals turn in the direction they are pushed. |
explanation | push-sprites includes some sprite-flipping code borrowed from the directional avatar hack. I just need to specify that horizontal flipping is turned on. |
hackOptions | horizontalFlipsAllowed: true, verticalFlipsAllowed: false |
behaviour | Putting animals on the targets opens the door. |
explanation | The target positions are specified in the hackOptions and linked to a _true dialog that will fire when they are all covered by a sprite. The dialog fires on every move as long as the targets are covered, so I use a variable to flag when the door is already open. The sound effect only occurs when the door opens. The _false dialog replaces the hedge when the condition is no longer satisfied. |
game data | DLG 0_complete_true """ { - open_0 == 1 ? - else ? (js "room[0].tilemap[6][15] = null") (soundeffectNow "pig3") {open_0 = 1} } """ DLG 0_complete_false """ { - open_0 == 0 ? - else ? (js "room[0].tilemap[6][15] = 'a'") {open_0 = 0} } """ |
hackOptions | conditions: { '0_complete':{ 'anything':[[[0,5,10],[0,7,10],[0,9,10]]] }, //... } |
behaviour | Some targets need specific animals. |
explanation | The hackOptions provide a lot of expressive power to set up specific target conditions. Here, I provide the animal names (sprite prefixes) for individual targets that must all be covered before the door will open. |
hackOptions | conditions: { //... '1_complete':{ 'chicken':[[[1,9,5]]], 'cat':[[[1,9,7]]], 'dog':[[[1,9,9]]] }, //... } |
behaviour | The long grass stops the sheep. |
explanation | Items are not pushable themselves, but they can be set up to block sprites. |
hackOptions | itemStopsSprite: function (itm,spr) { return true; } |
behaviour | The sheep can pass the electric fence, but the player cannot. |
explanation | Although the fence is marked as a wall, sprites can be pushed onto specified tiles. |
game data | TIL v 11111111 00000000 00000000 00000000 00000000 00000000 00000000 00000000 > 01010101 10101010 00000000 00000000 00000000 00000000 00000000 00000000 NAME electric_NONSTOPPING WAL true |
hackOptions | tileStopsSprite: function (til,spr) { if(til.name && til.name.indexOf('NONSTOPPING') !== -1) return false; else return til.isWall; } |
behaviour | Sprites can be pushed from one room to another. |
explanation | I have set hackOptions to allow all sprites to move through all exits. This behaviour can be specified in more detail if required. |
hackOptions | spriteCanExit: function (spr,ext){ return true; } |
Leave a comment
Log in with itch.io to leave a comment.