Emergent game design tips from Daniel Cook (@danctheduck):

Every object in the game has both a utility and a cost.

Make as many objects as you can have secondary or tertiary uses via interactions with other objects.

Put the player under pressure (time, resource, space, etc) so that they are always forced to choose between

Loosely couple object interactions using generic interfaces or resources. Objects become generalized tools.