github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/examples/gno.land/p/demo/tamagotchi/tamagotchi.gno (about) 1 package tamagotchi 2 3 import ( 4 "time" 5 6 "gno.land/p/demo/ufmt" 7 ) 8 9 // Tamagotchi structure 10 type Tamagotchi struct { 11 name string 12 hunger int 13 happiness int 14 health int 15 age int 16 maxAge int 17 sleepy int 18 created time.Time 19 lastUpdated time.Time 20 } 21 22 func New(name string) *Tamagotchi { 23 now := time.Now() 24 return &Tamagotchi{ 25 name: name, 26 hunger: 50, 27 happiness: 50, 28 health: 50, 29 maxAge: 100, 30 lastUpdated: now, 31 created: now, 32 } 33 } 34 35 func (t *Tamagotchi) Name() string { 36 t.update() 37 return t.name 38 } 39 40 func (t *Tamagotchi) Hunger() int { 41 t.update() 42 return t.hunger 43 } 44 45 func (t *Tamagotchi) Happiness() int { 46 t.update() 47 return t.happiness 48 } 49 50 func (t *Tamagotchi) Health() int { 51 t.update() 52 return t.health 53 } 54 55 func (t *Tamagotchi) Age() int { 56 t.update() 57 return t.age 58 } 59 60 func (t *Tamagotchi) Sleepy() int { 61 t.update() 62 return t.sleepy 63 } 64 65 // Feed method for Tamagotchi 66 func (t *Tamagotchi) Feed() { 67 t.update() 68 if t.dead() { 69 return 70 } 71 t.hunger = bound(t.hunger-10, 0, 100) 72 } 73 74 // Play method for Tamagotchi 75 func (t *Tamagotchi) Play() { 76 t.update() 77 if t.dead() { 78 return 79 } 80 t.happiness = bound(t.happiness+10, 0, 100) 81 } 82 83 // Heal method for Tamagotchi 84 func (t *Tamagotchi) Heal() { 85 t.update() 86 87 if t.dead() { 88 return 89 } 90 t.health = bound(t.health+10, 0, 100) 91 } 92 93 func (t Tamagotchi) dead() bool { return t.health == 0 } 94 95 // Update applies changes based on the duration since the last update 96 func (t *Tamagotchi) update() { 97 if t.dead() { 98 return 99 } 100 101 now := time.Now() 102 if t.lastUpdated == now { 103 return 104 } 105 106 duration := now.Sub(t.lastUpdated) 107 elapsedMins := int(duration.Minutes()) 108 109 t.hunger = bound(t.hunger+elapsedMins, 0, 100) 110 t.happiness = bound(t.happiness-elapsedMins, 0, 100) 111 t.health = bound(t.health-elapsedMins, 0, 100) 112 t.sleepy = bound(t.sleepy+elapsedMins, 0, 100) 113 114 // age is hours since created 115 t.age = int(now.Sub(t.created).Hours()) 116 if t.age > t.maxAge { 117 t.age = t.maxAge 118 t.health = 0 119 } 120 if t.health == 0 { 121 t.sleepy = 0 122 t.happiness = 0 123 t.hunger = 0 124 } 125 126 t.lastUpdated = now 127 } 128 129 // Face returns an ASCII art representation of the Tamagotchi's current state 130 func (t *Tamagotchi) Face() string { 131 t.update() 132 return t.face() 133 } 134 135 func (t *Tamagotchi) face() string { 136 switch { 137 case t.health == 0: 138 return "😵" // dead face 139 case t.health < 30: 140 return "😷" // sick face 141 case t.happiness < 30: 142 return "😢" // sad face 143 case t.hunger > 70: 144 return "😫" // hungry face 145 case t.sleepy > 70: 146 return "😴" // sleepy face 147 default: 148 return "😃" // happy face 149 } 150 } 151 152 // Markdown method for Tamagotchi 153 func (t *Tamagotchi) Markdown() string { 154 t.update() 155 return ufmt.Sprintf(`# %s %s 156 157 * age: %d 158 * hunger: %d 159 * happiness: %d 160 * health: %d 161 * sleepy: %d`, 162 t.name, t.Face(), 163 t.age, t.hunger, t.happiness, t.health, t.sleepy, 164 ) 165 } 166 167 func bound(n, min, max int) int { 168 if n < min { 169 return min 170 } 171 if n > max { 172 return max 173 } 174 return n 175 }