social.solarpunk.au

social.solarpunk.au

(u w u) | @uwu@social.solarpunk.au

the official project page of the UWU virtual pet project.

BASIC - https://git.sr.ht/~vidak/UWU.BAS
Common Lisp - https://git.sr.ht/~vidak/uwu.lisp
Emacs Lisp - https://git.sr.ht/~vidak/uwu.el

re: big reply, game mock up drafts (warning, long)

@shufei

PASTURE (OATS) PHASE


REM # PASTURE PHASE

PRINT "XXXXXXXXXXXXXXX"
PRINT "X.............X"
PRINT "X......T......X"
PRINT "X.............X"
PRINT "X.............X"
PRINT "X.............X"
PRINT "X..F..........X"
PRINT "X.........I...X"
PRINT "X.............X"
PRINT "X.............X"
PRINT "X.............X"
PRINT "X......@......X"
PRINT "X..........QL.X"
PRINT "X..M..........X"
PRINT "XXXXXXXXXXXXXXX"

REM # PET PHASE

REM ## PET GRAPHICS

REM ***** EGG *****


"."
"。"
"ₒ"
"o"
"O"

REM ***** BABY *****

"( .◎. )"
"(。◎。  )"
"(  。◎。)"
"(_ 。◎。)_"
"_(。◎。 _)"

"~:0"
"o:~"
"~:o"
"~:v"
"c:~"

REM ***** CHILD *****

"(^▽^)"
"(^▽^ )"
"( ^▽^)"
"(>^▽^)>"
"<(^▽^<)"

"(✿^‿^✿)"
"(^‿^✿ )"
"( ✿^‿^)"
"(>✿^‿^)>"
"<(^‿^✿<)")

"( 。v ° )"
"(。v ° )☆"
"☆( 。v °)"
"☆( >。v °)>"
"<(。v °< )☆"
          
"( o v o )"
"(o v o )"
"( o v o)"
"( ┘o v o)┘"
"┌(o v o┌ )")
     
REM ***** TEEN *****
     
"(°□°)" ;; forward       
"(°□° )" ;; left-facing       
"( °□°)" ;; right-facing       
"(╯°□°)╯" ;; right-moving       
"╰(°□°╰)") ;; left-moving

"(>.<)" ;; forward       
"(<.<)" ;; left-facing       
"(>.>)" ;; right-facing       
"(>.>)//" ;; right-moving       
"\\(<.<)") ;; left-moving

" ¯\(°_o)/¯" ;; forward       
"(°_o )" ;; left-facing       
"( o_°)" ;; right-facing       
" (/¯o_°)/¯" ;; right-moving       
" ¯\(°_o¯\)") ;; left-moving

" (•̀_•́)" ;; forward       
" (•̀_•́ )" ;; left-facing       
" ( •̀_•́)" ;; right-facing       
" (ง •̀_•́)ง" ;; right-moving       
" ლ(•̀_•́ლ)") ;; left-moving

"( *°▽°* )" ;; forward
"(*°▽°* )" ;; left-facing      
"( *°▽°*)" ;; right-facing      
"(>*°▽°*)>" ;; right-moving      
"<(*°▽°*<)") ;; left-moving

"(u w u)" ;; forward      
"(u w u )" ;; left-facing      
"( u w u)" ;; right-facing      
"(> u w u)>" ;; right-moving      
"<( u w u <)") ;; left-moving

"(•˘v˘•)" ;; forward      
"(•˘v˘n )" ;; left-facing      
"( ˘v˘•)" ;; right-facing      
"(n˘v˘•)¬" ;; right-moving      
"~(•˘v˘n)") ;; left-moving

"(o w o)" ;; forward      
"(o w o )" ;; left-facing      
"( o w o)" ;; right-facing      
"(> o w o)>" ;; right-moving
"<( o w o <)") ;; left-moving

"\(´◓ Д ◔)/" ;; forward	
"(´◓ Д ◔ )" ;; left-facing	
"( ´◔ Д ◓)" ;; right-facing	
"(/ ´◔ Д ◓)/" ;; right-moving	
"\(´◓ Д ◔ \)") ;; left-moving
	
"(`▽´)" ;; forward
"(`▽´ )" ;; left-facing
"( `▽´)" ;; right-facing
"(o `▽´ )oΨ" ;; right-moving
"Ψo(`▽´ o)");; left-moving

"(゚ Д ゚)" ;; forward
"(゚ Д ゚ )" ;; left-facing
"( ゚ Д ゚)" ;; right-facing
"(> ゚ Д ゚)>" ;; right-moving
"<(゚ Д ゚ <)");; left-moving

"(⌐■_■¬)" ;; forward	
"(■_■¬ )" ;; left-facing	
"( ⌐■_■)" ;; right-facing	
"(>⌐■_■)>" ;; right-moving	
"<(■_■¬<)");; left-moving

"(▼皿▼)" ;; forward
"(▼皿▼。 )" ;; left-facing
"( 。▼皿▼)" ;; right-facing
"(- 。▼皿▼)-" ;; right-moving
"-(▼皿▼。 -)");; left-moving

"(*Φ ω Φ*)" ;; forward
"(*Φ ω Φ* )" ;; left-facing
"( *Φ ω Φ*)" ;; right-facing
"(∿*Φ ω Φ*)∿" ;; right-moving
"∿(*Φ ω Φ*∿)");; left-moving

"('ڡ')" ;; forward
"('ڡ' )" ;; left-facing
"( 'ڡ')" ;; right-facing
"(ง 'ڡ')ง" ;; right-moving
"ლ('ڡ'ლ)");; left-moving

"(`▽´)" ;; forward
"(`▽´ )" ;; left-facing
"( `▽´)" ;; right-facing
"(o `▽´ )oΨ" ;; right-moving
"Ψo(`▽´ o)");; left-moving

"(⊙_◎)" ;; forward
"(⊙_◎ )" ;; left-facing
"( ⊙_◎)" ;; right-facing
"(> ⊙_◎)>" ;; right-moving
"<(⊙_◎ <)");; left-moving

"(Φ‿Φ)" ;; forward	
"(Φ‿Φ )" ;; left-facing	
"( Φ‿Φ)" ;; right-facing	
"Ψ( ;Φ‿Φ)_↑" ;; right-moving	
"↑_(Φ‿Φ;)Ψ");; left-moving
	
"(ʘ∀ʘ)" ;; forward
"(๑ʘ∀ʘ )" ;; left-facing
"( ๑ʘ∀ʘ)" ;; right-facing
"ε=┌(๑ʘ∀ʘ)┘" ;; right-moving
"┗(ʘ∀ʘ๑)┐┘=3");; left-moving

"(ì_í)" ;; forward
"(ì_í )" ;; left-facing
"( ì_í)" ;; right-facing
"(ó ì_í)=ó" ;; right-moving
"ò=(ì_í ò)");; left-moving

"(≧∇≦)" ;; forward
"(≧∇≦ )" ;; left-facing
"( ≧∇≦)" ;; right-facing
"(~ ≧∇≦)~" ;; right-moving
"~(≧∇≦ ~)");; left-moving

"(▼∀▼)" ;; forward
"(▼∀▼ )" ;; left-facing      
"( ▼∀▼)" ;; right-facing
"( >▼∀▼)>" ;; right-moving
"<(▼∀▼< )");; left-moving

"(。々°)" ;; forward       
"(。々° )" ;; left-facing       
"( 。々°)" ;; right-facing       
"(> 。々°)>" ;; right-moving       
"<(。々° <)");; left-moving

"(◕ヮ◕)" ;; forward       
"(◕ヮ◕ )" ;; left-facing       
"( ◕ヮ◕)" ;; right-facing       
"(/◕ヮ◕)/" ;; right-moving
"\\(◕ヮ◕\\)");; left-moving

"(´◡‿|◡`)" ;; forward       
"(´◡/‿◡` )" ;; left-facing       
"( ´◡‿|◡`)" ;; right-facing       
"(>´◡‿|◡`)>" ;; right-moving       
"<(´◡/‿◡`<)");; left-moving

"@(・ω・)@" ;; forward       
"@(・ω・o )@" ;; left-facing       
"@( o・ω・)@" ;; right-facing       
"@( >o・ω・)@>" ;; right-moving       
"<@(・ω・o< )@");; left-moving
 
"(●ᴥ●)"	   ;; forward
"(●ᴥ● )"	   ;; left-facing
"( ●ᴥ●)"	   ;; right-facing
"(> ●ᴥ●)>"  ;; right-moving
"<(●ᴥ● <)") ;; left-moving

"(๑ÒωÓ๑)" ;; forward       
"(๑ÒωÓ๑ )" ;; left-facing       
"( ๑ÒωÓ๑)" ;; right-facing       
"( >๑ÒωÓ๑)>" ;; right-moving       
"<(๑ÒωÓ๑< )");; left-moving

"(≧∀≦)" ;; forward       
"(≧∀≦ )" ;; left-facing       
"( ≧∀≦)" ;; right-facing       
"(/≧∀≦)/" ;; right-moving       
"\\(≧∀≦\\)");; left-moving

"(•̀◡•́)"	     ;; forward
"✧(-◡•́。)"     ;; left-facing
"(。•̀◡-)✧"     ;; right-facing
"(> 。•̀◡-)>✧"  ;; right-moving
"✧<(-◡•́。 <)") ;; left-moving

"(° ͜ʖ °)" ;; forward       
"(° c͜ ° )" ;; left-facing       
"( ° ͜ʖ °)" ;; right-facing       
"(☞ ° ͜ʖ °)☞" ;; right-moving       
"☜( ° c͜ °☜)");; left-moving

"(ˆ⌣ˆ)" ;; forward       
"(ˆ⌣ˆc)" ;; left-facing       
"(ↄˆ⌣ˆ)" ;; right-facing       
"(>ↄˆ⌣ˆ)>" ;; right-moving       
"<(ˆ⌣ˆc<)");; left-moving
pet-gfx.bas mock-up.bas

Beep.

This thing is still on.

This project is no longer trying to recreate a Tamagotchi in BASIC or Lisp.

First complete program run! WOO!

And it's usable on the
CYBER HOLE
https://cyberhole.online/

HN TinyBasicWeb 0.1
READY
1'Testing
1:':Testing
2 REM a test program for TinyBasicWeb
2:REM:a test program for TinyBasicWeb
3 ?"Hello, world!"
3:?:"Hello, world!"
4 PRINT 1,2,3,"easy as ABC"
4:PRINT:1:,:2:,:3:,: "easy as ABC"
9 END
9: END
RUN
RUN
Hello, world!
1, 2 3 easy as ABC
READY
[]

Have been playing "it takes two", a two controller cooperative multiplayer game.

The original focus of the Tamagotchi rewrite in BASIC was to write and explore mini games.

There is a whack-a-mole mini game in "it takes two", the idea is one player must hit the other, who is hiding.

I think something entertaining could also be written for two players on one keyboard in BASIC.

Web dev protip:
console.log("foo: ", p);
displays p in console as a live object. If it updates, every console entry of it updates.

console.log("foo: "+JSON.stringify(p) );
dumps the current state to console so you can figure out what changed over time.

In related news, my little BASIC parser now parses at least a couple tokens correctly (the colon lines are parsed tokens)

10'what
10: ': what

@goosey yes. I suspected something similar myself. Please consider this particular code just a bit of noodling. I was quite amused that it worked for me.

Thank you very much for your response, it lets me know if I stick little code snippets here, that people will take an interest ( :

Good morning!

I have been thinking a lot about the project.

The one of the other components of the project is called "uwu.el". It is a Tamagotchi written in Emacs Lisp.

Version 2 of the project contained many different evolutions of the pet. I think there are far too many in that version to carry over into the BASIC rewrite of the program. It will become far too long, and, really, be almost impossible to type in.

I am not sure how many kaomoji pet evolutions will be able to fit into the BASIC rewrite.

In some ways it makes my life easier, because I do not have to spend a long time figuring out the different evolution pathways of the large number of different pets.

Perhaps what I will do is make a "Pocket Pikachu", and not a "Tamagotchi"?

5 DATA "(u w u)","(u w u )","( u w u)","(> u w u)>","<( u w u <)"
10 FOR I=1 TO 100
15     DELAY 1000
20     F=INT(RND(1)*5)+1
30     RESTORE F
40     READ P$:PRINT P$
50 NEXT I

( :

UTF-8 seems to work in the serial console through to the rapsi pico running BASIC, so i have started processing the S-expressions that contained the graphics of uwu.el version 2.

it is my hope i can fit all the kaomoji into memory (:

started sketching out the code!

@purple i'm not that concerned about execution drift--is that the only problem this code will have?

for some reason i was worried, quite anxious, about writing a timer in such a simple way.

but after doing a quick calculation, i can see fifteen minutes is only 900 seconds.

this gives me quite a bit of relief.

i think a simple FOR loop can be written:

FOR H=1 TO 900

REM DUTIES PERFORMED EVERY SECOND

DELAY 1000

NEXT H

REM WE FALL INTO THIS CODE HERE

REM DUTIES PERFORMED EVERY 15 MIN

Been thinking a lot about the project.

The BASIC rewrite is going to improve on the Emacs Lisp version.

All improvements made to the BASIC version will be reflected into the version 4 rewrite of the Emacs Lisp version.

The timer mechanism will be very simple this time. It will be structured around a loop that counts the seconds up to fifteen minutes. The one second 'strobe' will be called the "heartbeat". The fifteen minute strobe will be called the "tick".

Every tick, hunger will increase, and other biorhythm logic will be assessed.

Been thinking and day dreaming a lot about writing the Tamagotchi.

This has been a project that I have worked on for a few years now.

I got very stuck about 18 months ago on uwu.el version 4.

Many people have asked -- why BASIC? There are two reasons: first, I want the program to be typed in. It is my hope that the joy I feel when I code this toy carries over to others.

Second, this is a project I started as a child, on a computer running BASIC. I have always wanted to see if I could do a job that satisfied me.

BASIC tamagotchi devlog

it's gotten to the point where i cannot write a mini game without having some general concept first of what the structure of the program should look like in BASIC

so, here we go. time to start drafting the tamagotchi in BASIC.

i will have a look at what the most common BASIC-enabled pocket calculator is, because i want this to be able to run on them. there is a facebook group full of people who would be very interested to have a virtual pet on their device.

laying down the code is going to be easy, and i imagine the thing will all fit into one .BAS file.

these are the mini games i'm going to draft for the tamagotchi:

  • bump

tap buttons to avoid obstacles.

  • flag

remember a sequence of flags.

  • heading

control the tamagotchi to head a ball.

  • memory

memorise and repeat button presses.

  • sprint

control the tamagotchi to run and collect items.

  • higher or lower

guess if next number is higher or lower.

  • piano

tap buttons to play musical notes.

  • balloon

pop balloons by pressing buttons.

  • apple

catch apples in a basket.

Created

@uwu

To allow people to follow along with the Tamagotchi clone project.

UWU.BAS design document

UWU.BAS

vidak.

2025

Main loop handles:

  • Time progression
  • User input
  • Pet behavior (based on hunger, mood, etc.)
  • Display logic

High level structure

Global pet state

Store the core state in variables:

AGE
HUNGER
HAPPINESS
SICKNESS
LAST ACTION TIME
EVOLUTION STAGE
IS ALIVE

Main loop

  1. Initialise pet
  2. Main menu or startup
  3. Main loop
    1. Alive?
    2. Time passes
    3. Check for events or needs
    4. Display pet
    5. Get player input (if any)
    6. Return to top of loop

Main loop structure

Subroutines

  • Time passing

Aging Hunger increasing Mood changing

  • Logic and branching

Pet evolves Pet dies Gets sick

  • Display

Idle animation, status, etc.

  • Input

Feed Play Heal

Event timing

Use time counters.

Every N cycles or ticks, age increases or hunger changes.

Structuring view as a mode

VIEW MODE="IDLE"
IF NEEDS ATTENTION THEN VIEW MODE="CRY"
IF USER SELECTS FEED THEN VIEW MODE = "EAT"

Dislay subroutine renders based on VIEW MODE. Detaches display from behaviour.

»