Tamagotchi emulator: Difference between revisions

Content added Content deleted
No edit summary
(Added EchoLisp)
Line 13: Line 13:


But, above of all, have fun!
But, above of all, have fun!

=={{header|EchoLisp}}==
The tamagotchi status is saved in permanent storage. The tamagotchi cycles can be started manually, or in the '''preferences''' function, or at predefined intervals : '''every''' function. The following code may be loaded from the EchoLisp library : (load 'tamagotchi). This tamagotchi does not play, but gets bored, and needs to talk. It must be feed two times between each cycle. It will die at age around 42 (42 cycles).
<lang scheme>

(define-constant CYCLE_TIME 30000)
(string-delimiter "")
(struct tamagotchi (name age food poop bored))

;; utility : display tamagotchi thoughts : transitive verb + complement
(define (tama-talk tama)
(writeln (string-append
"๐Ÿ˜ฎ : "
(word-random #:any '( verbe trans inf -vintran)))
" les "
(word-random #:any '(nom pluriel))))

;; load tamagotchi from persistent storage into *tama* global
(define (run-tamagotchi)
(if (null? (local-get '*tama*))
(writeln "Please (make-tamagotchi <name>)")
(begin
(make-tamagotchi (tamagotchi-name *tama*) *tama*)
(tama-cycle *tama*)
(writeln (tama-health *tama*)))))
;; make a new tamagotchi
;; or instantiate an existing
;; tama : instance ot tamagotchi structure
(define (make-tamagotchi name (tama null))
(when (null? tama)
(set! tama (tamagotchi name 0 2 0 0))
(define-global '*tama* tama)
(local-put '*tama*))
;; define the <name> procedure :
;; perform user action / save tamagotchi / display status

(define-global name
(lambda (action)
(define tama (local-get '*tama*))
[case action
((feed) (set-tamagotchi-food! tama (1+ (tamagotchi-food tama))))
((talk) (tama-talk tama) (set-tamagotchi-bored! tama (max 0 (1- (tamagotchi-bored tama)))))
((clean) (set-tamagotchi-poop! tama (max 0 (1- (tamagotchi-poop tama)))))
((look) #t)
;; debug actions
((_cycle) (tama-cycle tama))
((_reset) (set! *tama* null) (local-put '*tama*))
((_kill) (set-tamagotchi-age! tama 44))
((_self) (writeln tama))
(else (writeln "actions: feed/talk/clean/look"))]
(local-put '*tama*)
(tama-health tama))))
;; every n msec : get older / eat food / get bored / poop
(define (tama-cycle tama)
(when (tama-alive tama)
(set-tamagotchi-age! tama (1+ (tamagotchi-age tama)))
(set-tamagotchi-bored! tama (+ (tamagotchi-bored tama) (random 2)))
(set-tamagotchi-food! tama (max 0 (- (tamagotchi-food tama) 2)))
(set-tamagotchi-poop! tama (+ (tamagotchi-poop tama) (random 2))))
(local-put '*tama*))
;; compute sickness (too much poop, too much food, too much bored)
(define (tama-sick tama)
(+ (tamagotchi-poop tama)
(tamagotchi-bored tama)
(max 0 (- (tamagotchi-age tama) 32)) ;; die at 42
(abs (- (tamagotchi-food tama) 2))))
;; alive if sickness <= 10
(define (tama-alive tama)
(<= (tama-sick tama) 10))
;; display num icons from a list
(define (icons list num)
(for/fold (str " ") ((i [in-range 0 num] ))
(string-append str (list-ref list (random (length list))))))
;; display boredom/food/poops icons
(define (tama-status tama)
(if (tama-alive tama)
(string-append
" [ "
(icons '(๐Ÿ’ค ๐Ÿ’ญ โ“ ) (tamagotchi-bored tama))
(icons '(๐Ÿผ ๐Ÿ” ๐ŸŸ ๐Ÿฐ ๐Ÿœ ) (tamagotchi-food tama))
(icons '(๐Ÿ’ฉ) (tamagotchi-poop tama))
" ]")
" R.I.P" ))
;; display health status = f(sickness)
(define (tama-health tama)
(define sick (tama-sick tama))
;;(writeln 'health:sickยฐ= sick)
(string-append
(format "%a (๐ŸŽ‚ %d) " (tamagotchi-name tama)(tamagotchi-age tama))
(cond
([<= sick 2] (icons '(๐Ÿ˜„ ๐Ÿ˜ƒ ๐Ÿ˜€ ๐Ÿ˜Š ๐Ÿ˜Ž๏ธ ๐Ÿ‘ ) 1 )) ;; ok <= 2
([<= sick 4] (icons '(๐Ÿ˜ช ๐Ÿ˜ฅ ๐Ÿ˜ฐ ๐Ÿ˜“ ) 1))
([<= sick 6] (icons '(๐Ÿ˜ฉ ๐Ÿ˜ซ ) 1))
([<= sick 10] (icons '(๐Ÿ˜ก ๐Ÿ˜ฑ ) 1)) ;; very bad
(else (icons '(โŒ ๐Ÿ’€ ๐Ÿ‘ฝ ๐Ÿ˜‡ ) 1))) ;; dead
(tama-status tama)))
;; timer operations
;; run tama-proc = cycle every CYCLE_TIME msec

(define (tama-proc n)
(define tama (local-get '*tama*))
(when (!null? tama)
(tama-cycle tama)
(writeln (tama-health tama))))
;; boot
;; manual boot or use (preferences) function
(every CYCLE_TIME tama-proc)
(run-tamagotchi)

</lang>
{{out}}
<pre>
(lib 'struct)
(lib 'sql) ;; for words
(lib 'words)
(lib 'timer)
(lib 'dico.fr);; will talk in french
(load 'tamagotchi)
Please (make-tamagotchi <name>)
(make-tamagotchi 'albert)

albert (๐ŸŽ‚ 1) ๐Ÿ˜“ [ ๐Ÿ’ญ ]
albert (๐ŸŽ‚ 2) ๐Ÿ˜ฐ [ ๐Ÿ’ญโ“ ] ;; needs to talk
(albert 'talk)
๐Ÿ˜ฎ : dรฉlรฉaturer les fidรจles
albert (๐ŸŽ‚ 2) ๐Ÿ˜“ [ โ“ ]
(albert 'talk)
๐Ÿ˜ฎ : facetter les dรฉcorations
albert (๐ŸŽ‚ 2) ๐Ÿ˜ƒ [ ]
albert (๐ŸŽ‚ 3) ๐Ÿ˜ฅ [ ๐Ÿ’ค ๐Ÿ’ฉ ]
(albert 'feed)
albert (๐ŸŽ‚ 3) ๐Ÿ˜ช [ ๐Ÿ’ค ๐Ÿ” ๐Ÿ’ฉ ] ;; needs cleaning
(albert 'clean)
albert (๐ŸŽ‚ 3) ๐Ÿ˜Š [ ๐Ÿ’ญ ๐ŸŸ ]
(albert 'talk)
๐Ÿ˜ฎ : manifester les canyons
albert (๐ŸŽ‚ 3) ๐Ÿ˜ƒ [ ๐Ÿฐ ] ;; all is ok
albert (๐ŸŽ‚ 4) ๐Ÿ‘ [ ]
albert (๐ŸŽ‚ 5) ๐Ÿ˜ƒ [ ]
albert (๐ŸŽ‚ 6) ๐Ÿ˜ฅ [ โ“ ๐Ÿ’ฉ ]
(albert 'clean)
albert (๐ŸŽ‚ 6) ๐Ÿ˜ช [ ๐Ÿ’ค ]
albert (๐ŸŽ‚ 7) ๐Ÿ˜ฐ [ ๐Ÿ’ญ ๐Ÿ’ฉ ]
albert (๐ŸŽ‚ 8) ๐Ÿ˜“ [ ๐Ÿ’ญ ๐Ÿ’ฉ ]
(for ((i 10)) (albert 'feed))
albert (๐ŸŽ‚ 8) ๐Ÿ˜ฑ [ ๐Ÿ’ญ ๐Ÿ”๐Ÿผ๐Ÿ”๐Ÿผ๐Ÿœ๐Ÿผ๐ŸŸ๐Ÿ”๐Ÿ”๐ŸŸ ๐Ÿ’ฉ ] ;; very sick
albert (๐ŸŽ‚ 9) ๐Ÿ˜ฑ [ โ“ ๐Ÿฐ๐Ÿฐ๐ŸŸ๐ŸŸ๐Ÿผ๐ŸŸ๐Ÿœ๐Ÿœ ๐Ÿ’ฉ๐Ÿ’ฉ ]
(albert 'talk)
๐Ÿ˜ฎ : assortir les dรฉchiffrages
albert (๐ŸŽ‚ 9) ๐Ÿ˜ฑ [ ๐Ÿผ๐Ÿผ๐ŸŸ๐ŸŸ๐Ÿœ๐Ÿ”๐Ÿผ๐Ÿฐ ๐Ÿ’ฉ๐Ÿ’ฉ ]
albert (๐ŸŽ‚ 10) ๐Ÿ˜ก [ ๐Ÿ’ญ ๐Ÿฐ๐ŸŸ๐ŸŸ๐ŸŸ๐ŸŸ๐Ÿœ ๐Ÿ’ฉ๐Ÿ’ฉ๐Ÿ’ฉ ]
(for ((i 14)) (albert 'feed)) ;; do'nt feed it too much .. it will die
albert (๐ŸŽ‚ 10) ๐Ÿ˜‡ R.I.P ;; died at age 10
albert (๐ŸŽ‚ 10) โŒ R.I.P
albert (๐ŸŽ‚ 10) ๐Ÿ‘ฝ R.I.P
albert (๐ŸŽ‚ 10) ๐Ÿ˜‡ R.I.P
albert (๐ŸŽ‚ 10) ๐Ÿ˜‡ R.I.P
(make-tamagotchi 'simon)
simon
simon (๐ŸŽ‚ 1) ๐Ÿ˜“ [ ๐Ÿ’ค ๐Ÿ’ฉ ]
</pre>