mirror of
https://github.com/ilyakooo0/urbit.git
synced 2024-12-24 15:34:10 +03:00
Merge branch 'demo' of https://github.com/urbit/urbit into demo
This commit is contained in:
commit
4ba5415077
@ -1,152 +0,0 @@
|
|||||||
|
|
||||||
Commands
|
|
||||||
|
|
||||||
[from URL bar]
|
|
||||||
***TBD - Galen/Anton please fill in
|
|
||||||
|
|
||||||
[from unix]
|
|
||||||
For A, to build and boot:
|
|
||||||
git clone https://github.com/urbit/urbit
|
|
||||||
cd urbit
|
|
||||||
make
|
|
||||||
bin/urbit -T $A -c $A
|
|
||||||
|
|
||||||
For A, to kill and restart from checkpoint:
|
|
||||||
[in new terminal] killall -9 urbit
|
|
||||||
[in old terminal] urbit $A
|
|
||||||
|
|
||||||
For A, to kill, delete checkpoint, and rerun events:
|
|
||||||
[in new terminal] killall -9 urbit; rm -rf $A/.urb/chk
|
|
||||||
[in old terminal] urbit $A
|
|
||||||
|
|
||||||
For B, to edit /foo/bar/hoon:
|
|
||||||
*** Philip/anyone, add directions to install vim style
|
|
||||||
|
|
||||||
vim urbit/$B/$B/in/$DEMO/foo/bar.hoon
|
|
||||||
|
|
||||||
|
|
||||||
[from talk]
|
|
||||||
For A, to private-message B (who defaults to talking back):
|
|
||||||
|
|
||||||
;~B
|
|
||||||
|
|
||||||
To create a channel '%foobar':
|
|
||||||
|
|
||||||
;create channel %foobar 'channel description'
|
|
||||||
|
|
||||||
[from hood, #]
|
|
||||||
|
|
||||||
For A or B, to start tictactoe:
|
|
||||||
|
|
||||||
*demo/tictactoe
|
|
||||||
|
|
||||||
For A or B, to log in to X's tictactoe:
|
|
||||||
|
|
||||||
+~X/
|
|
||||||
|
|
||||||
To log out:
|
|
||||||
|
|
||||||
-~X/tictactoe
|
|
||||||
|
|
||||||
[from dojo]
|
|
||||||
|
|
||||||
For B, to create a %demo desk for this project:
|
|
||||||
|
|
||||||
:+merge %demo ~B %home
|
|
||||||
|
|
||||||
For A, to sync and follow B's demo desk:
|
|
||||||
|
|
||||||
:+sync %demo ~B %demo
|
|
||||||
|
|
||||||
[to send bitcoin]
|
|
||||||
Start the dæmon(from sole):
|
|
||||||
*bit
|
|
||||||
|
|
||||||
Auth in (from dojo):
|
|
||||||
:bit+auth [reacted-see-asana] 'f771f6dc08910095b2476b033dca62ddcb302b6617e6a7d4d66e194a2a9bd605'
|
|
||||||
|
|
||||||
In webtalk, click on the link and auth in. The password for coinbase account anton.dyudin@tlon.io has been communicated privately.
|
|
||||||
|
|
||||||
Click authorize and then return to the command line.
|
|
||||||
|
|
||||||
To send:
|
|
||||||
|
|
||||||
:bit+send 0c[bitcoin-address] '[qty-of-bitcoin]'
|
|
||||||
|
|
||||||
I recommend sending about .0001 bitcoin (2¢) because it's just over their minimum and it's an account with limited funds.
|
|
||||||
With this protocol, the recipient will obviously have to provide their btc address over chat.
|
|
||||||
|
|
||||||
Lastly, on https://blockchain.info/ there is a search bar that allows you to search by address, assuming you wish to display the address
|
|
||||||
|
|
||||||
[files in script, clay and unix]
|
|
||||||
|
|
||||||
The tictactoe app, all three versions:
|
|
||||||
|
|
||||||
/=demo=/ape/tictactoe/core/hook
|
|
||||||
urbit/$X/$X/in/$DEMO/ape/tictactoe/core/hook
|
|
||||||
|
|
||||||
version 1 (centralized):
|
|
||||||
$DEMO/files/1-ape-tictactoe.hoon
|
|
||||||
|
|
||||||
version 2 (distributed):
|
|
||||||
$DEMO/files/2-ape-tictactoe.hoon
|
|
||||||
|
|
||||||
version 3 (webified)
|
|
||||||
$DEMO/files/3-ape-tictactoe.hoon
|
|
||||||
|
|
||||||
Helper files needed for version 2:
|
|
||||||
|
|
||||||
The %octo-game mark, for game update diffs:
|
|
||||||
|
|
||||||
/=demo=/mar/octo-game/door/hook
|
|
||||||
urbit/$X/$X/in/$DEMO/mar/octo-game/door.hook
|
|
||||||
$DEMO/files/mar-octo-game.hoon
|
|
||||||
|
|
||||||
Helper files needed for version 3:
|
|
||||||
|
|
||||||
The %octo-move mark, for moves from the web:
|
|
||||||
|
|
||||||
/=demo=/mar/octo-move/door/hook
|
|
||||||
urbit/$X/$X/in/$DEMO/mar/octo-move/door.hook
|
|
||||||
$DEMO/files/mar-octo-move.hoon
|
|
||||||
|
|
||||||
The HTML generator:
|
|
||||||
|
|
||||||
/=demo=/pub/octo/fab/hymn/hook
|
|
||||||
urbit/$X/$X/in/$DEMO/pub/octo/fab/hymn.hook
|
|
||||||
$DEMO/files/pub-octo-hymn.hoon
|
|
||||||
|
|
||||||
The CSS:
|
|
||||||
|
|
||||||
/=demo=/pub/octo/src/main/css
|
|
||||||
urbit/$X/$X/in/$DEMO/pub/octo/src/main.css
|
|
||||||
$DEMO/files/pub-octo-main.css
|
|
||||||
|
|
||||||
The JS:
|
|
||||||
|
|
||||||
/=demo=/pub/octo/src/main/js
|
|
||||||
urbit/$X/$X/in/$DEMO/pub/octo/src/main.js
|
|
||||||
$DEMO/files/pub-octo-main.js
|
|
||||||
|
|
||||||
[from tictactoe]
|
|
||||||
|
|
||||||
To move:
|
|
||||||
|
|
||||||
X/Y where X is row, Y is column.
|
|
||||||
|
|
||||||
To connect to a remote server (in versions 2 and 3),
|
|
||||||
specifying the side you will play:
|
|
||||||
|
|
||||||
~X x
|
|
||||||
~X o
|
|
||||||
|
|
||||||
To disconnect from a remote server (versions 2 and 3)
|
|
||||||
|
|
||||||
~ *** - not well tested
|
|
||||||
|
|
||||||
[scripts, to run from branch root directory]
|
|
||||||
|
|
||||||
$DEMO/install1.sh - copy in all version 1 (centralized) files
|
|
||||||
$DEMO/install2.sh - copy in all version 2 (distributed) files
|
|
||||||
$DEMO/install3.sh - copy in all version 3 (webby) files
|
|
||||||
|
|
@ -1,123 +0,0 @@
|
|||||||
:: :: ::
|
|
||||||
:::: /hook/core/acto/ape :: :: dependencies
|
|
||||||
:: :: ::
|
|
||||||
/- *sole :: structure
|
|
||||||
/+ sole :: library
|
|
||||||
:: :: ::
|
|
||||||
:::: :: :: structures
|
|
||||||
!: :: ::
|
|
||||||
=> |% :: board logic
|
|
||||||
++ board ,@ :: one-player bitfield
|
|
||||||
++ point ,[x=@ y=@] :: coordinate
|
|
||||||
++ game ,[who=? box=board boo=board] :: game state
|
|
||||||
++ icon |=(? ?:(+< 'X' 'O')) :: display at
|
|
||||||
++ bo :: per board
|
|
||||||
|_ bud=board ::
|
|
||||||
++ get |=(point =(1 (cut 0 [(off +<) 1] bud))) :: get point
|
|
||||||
++ off |=(point (add x (mul 3 y))) :: bitfield address
|
|
||||||
++ set |=(point (con bud (bex (off +<)))) :: set point
|
|
||||||
++ win %- lien :_ |=(a=@ =(a (dis a bud))) :: test for win
|
|
||||||
(rip 4 0wl04h0.4A0Aw.4A00s.0e070) ::
|
|
||||||
-- ::
|
|
||||||
:: :: ::
|
|
||||||
:::: :: :: semantics
|
|
||||||
:: :: ::
|
|
||||||
++ go :: per game
|
|
||||||
|_ game ::
|
|
||||||
++ at |_ point :: per point
|
|
||||||
++ g +>+< :: game
|
|
||||||
++ k !|(x o) :: ok move
|
|
||||||
++ m ?.(k [| g] [& g:t:?:(who y p)]) :: move
|
|
||||||
++ o (~(get bo boo) +<) :: old at o
|
|
||||||
++ p .(boo (~(set bo boo) +<)) :: play at o
|
|
||||||
++ t .(who !who) :: take turn
|
|
||||||
++ v ?:(x (icon &) ?:(o (icon |) '.')) :: view
|
|
||||||
++ x (~(get bo box) +<) :: old at x
|
|
||||||
++ y .(box (~(set bo box) +<)) :: play at x
|
|
||||||
-- ::
|
|
||||||
++ res ?: ~(win bo box) `"{~[(icon &)]} wins" :: result
|
|
||||||
?: ~(win bo boo) `"{~[(icon |)]} wins" ::
|
|
||||||
?: =(511 (con boo box)) `"tie :-(" ~ ::
|
|
||||||
++ row |= y=@ :~ (add y '1') :: print row
|
|
||||||
' ' ~(v at y 0) ::
|
|
||||||
' ' ~(v at y 1) ::
|
|
||||||
' ' ~(v at y 2) ::
|
|
||||||
== ::
|
|
||||||
++ tab ~["+ 1 2 3" (row 0) (row 1) (row 2)] :: print table
|
|
||||||
-- ::
|
|
||||||
-- ::
|
|
||||||
:: :: ::
|
|
||||||
:::: :: :: server
|
|
||||||
:: :: ::
|
|
||||||
=> |% :: arvo structures
|
|
||||||
++ axle ,[%0 eye=face gam=game] :: agent state
|
|
||||||
++ card ,[%diff lime] :: update
|
|
||||||
++ face (pair (list ,@c) (map bone sole-share)) :: interface
|
|
||||||
++ lime ,[%sole-effect sole-effect] :: console update
|
|
||||||
++ move (pair bone card) :: cause and action
|
|
||||||
-- ::
|
|
||||||
=> |% :: parsers
|
|
||||||
++ colm (cook |=(a=@ (sub a '1')) (shim '1' '3')) :: row or column
|
|
||||||
++ come ;~(plug colm ;~(pfix fas colm)) :: coordinate
|
|
||||||
-- ::
|
|
||||||
|_ [hid=hide moz=(list move) axle] :: per agent
|
|
||||||
++ et ::
|
|
||||||
|_ [from say=sole-share] :: per console
|
|
||||||
++ abet +>(q.eye (~(put by q.eye) ost say)) :: continue
|
|
||||||
++ amok +>(q.eye (~(del by q.eye) ost)) :: discontinue
|
|
||||||
++ beep (emit %bel ~) :: bad user
|
|
||||||
++ delt |= cal=sole-change :: input line change
|
|
||||||
=^ cul say (remit:sole cal good) ::
|
|
||||||
?~ cul (park:abet(p.eye buf.say) | ~) ::
|
|
||||||
abet:beep:(emit det/u.cul) ::
|
|
||||||
++ emit |= fec=sole-effect ^+ +> :: send effect
|
|
||||||
+>(moz [[ost %diff %sole-effect fec] moz]) ::
|
|
||||||
++ emil |= fex=(list sole-effect) :: send effects
|
|
||||||
?~(fex +> $(fex t.fex, +> (emit i.fex))) ::
|
|
||||||
++ good |=((list ,@c) -:(rose (tufa +<) come)) :: valid input
|
|
||||||
++ kick |= point :: move command
|
|
||||||
=^ dud gam ~(m ~(at go gam) +<) ::
|
|
||||||
?. dud abet:beep =+ mus=~(res go gam) ::
|
|
||||||
(park:abet(gam ?^(mus *game gam)) %2 mus) ::
|
|
||||||
++ line =^ cal say (transmit:sole set/p.eye) :: update command
|
|
||||||
(emit %det cal) ::
|
|
||||||
++ make =+ dur=(rust (tufa p.eye) come) ::
|
|
||||||
?~ dur abet:beep ::
|
|
||||||
(kick:line(p.eye ~) +.dur) ::
|
|
||||||
++ mean |=((unit tape) ?~(+< +> (emit txt/+<+))) :: optional message
|
|
||||||
++ play |= lev=?(%0 %1 %2) :: update by level
|
|
||||||
?-(lev %0 +>, %1 line, %2 line:show:prom) ::
|
|
||||||
++ plow |= [lev=?(%0 %1 %2) mus=(unit tape)] :: complete print
|
|
||||||
abet:(mean:(play lev) mus) ::
|
|
||||||
++ prom %^ emit %pro %& :- %tictactoe :: update prompt
|
|
||||||
": {~[(icon who.gam)]} to move (row/col): " ::
|
|
||||||
++ rend (turn `wall`~(tab go gam) |=(tape txt/+<)) :: table print
|
|
||||||
++ show (emit %mor rend) :: update board
|
|
||||||
++ sole ~(. cs say) :: console library
|
|
||||||
++ work |= act=sole-action :: console input
|
|
||||||
?:(?=(%det -.act) (delt +.act) make) ::
|
|
||||||
-- ::
|
|
||||||
++ abet [(flop moz) .(moz ~)] :: resolve core
|
|
||||||
++ flet |=(from ~(. et +< (~(got by q.eye) ost))) :: in old client
|
|
||||||
++ fret |=(from ~(. et +< *sole-share)) :: in new client
|
|
||||||
++ pals %+ turn (pale hid (prix /sole)) |= sink :: per console
|
|
||||||
[[p=p.+< q=q.+<] r=(~(got by q.eye) p.+<)] ::
|
|
||||||
++ park |= [lev=?(%0 %1 %2) mus=(unit tape)] :: general update
|
|
||||||
=+ pals |- ^+ +>.^$ ?~ +< +>.^$ ::
|
|
||||||
$(+< t.+<, +>.^$ (~(plow et i.+<) lev mus)) ::
|
|
||||||
:: :: ::
|
|
||||||
:::: :: :: events
|
|
||||||
:: :: ::
|
|
||||||
++ peer-sole :: console subscribe
|
|
||||||
|= [from *] =< abet ::
|
|
||||||
(plow:(fret +<-) %2 ~) ::
|
|
||||||
++ poke-sole-action :: console input
|
|
||||||
|= [from act=sole-action] =< abet ::
|
|
||||||
(work:(flet +<-) act) ::
|
|
||||||
++ prep |= [from old=(unit ,[(list move) axle])] :: initialize
|
|
||||||
=< abet ?~ old +> =< (park %2 ~) ::
|
|
||||||
+>(+<+ u.old) ::
|
|
||||||
++ pull-sole :: disconnect console
|
|
||||||
|= [from *] =< abet ::
|
|
||||||
amok:(flet +<-) ::
|
|
||||||
--
|
|
@ -1,174 +0,0 @@
|
|||||||
:: :: ::
|
|
||||||
:::: /hook/core/acto/ape :: :: dependencies
|
|
||||||
:: :: ::
|
|
||||||
/- *sole :: structures
|
|
||||||
/+ sole :: libraries
|
|
||||||
:: :: ::
|
|
||||||
:::: :: :: structures
|
|
||||||
!: :: ::
|
|
||||||
=> |% :: board logic
|
|
||||||
++ board ,@ :: one-player bitfield
|
|
||||||
++ point ,[x=@ y=@] :: coordinate
|
|
||||||
++ game ,[who=? box=board boo=board] :: game state
|
|
||||||
++ icon |=(? ?:(+< 'X' 'O')) :: display at
|
|
||||||
++ bo :: per board
|
|
||||||
|_ bud=board ::
|
|
||||||
++ get |=(point =(1 (cut 0 [(off +<) 1] bud))) :: get point
|
|
||||||
++ off |=(point (add x (mul 3 y))) :: bitfield address
|
|
||||||
++ set |=(point (con bud (bex (off +<)))) :: set point
|
|
||||||
++ win %- lien :_ |=(a=@ =(a (dis a bud))) :: test for win
|
|
||||||
(rip 4 0wl04h0.4A0Aw.4A00s.0e070) :: with bitmasks
|
|
||||||
-- ::
|
|
||||||
++ go :: per game
|
|
||||||
|_ game ::
|
|
||||||
++ at |_ point :: per point
|
|
||||||
++ g +>+< :: game
|
|
||||||
++ k !|(x o) :: ok move
|
|
||||||
++ m ?.(k [| g] [& g:t:?:(who y p)]) :: move
|
|
||||||
++ o (~(get bo boo) +<) :: old at o
|
|
||||||
++ p .(boo (~(set bo boo) +<)) :: play at o
|
|
||||||
++ t .(who !who) :: take turn
|
|
||||||
++ v ?:(x (icon &) ?:(o (icon |) '.')) :: view
|
|
||||||
++ x (~(get bo box) +<) :: old at x
|
|
||||||
++ y .(box (~(set bo box) +<)) :: play at x
|
|
||||||
-- ::
|
|
||||||
++ res ?: ~(win bo box) `"{~[(icon &)]} wins" :: result
|
|
||||||
?: ~(win bo boo) `"{~[(icon |)]} wins" ::
|
|
||||||
?: =(511 (con boo box)) `"tie :-(" ~ ::
|
|
||||||
++ row |= y=@ :~ (add y '1') :: print row
|
|
||||||
' ' ~(v at y 0) ::
|
|
||||||
' ' ~(v at y 1) ::
|
|
||||||
' ' ~(v at y 2) ::
|
|
||||||
== ::
|
|
||||||
++ tab ~["+ 1 2 3" (row 0) (row 1) (row 2)] :: print table
|
|
||||||
-- ::
|
|
||||||
-- ::
|
|
||||||
:: :: ::
|
|
||||||
:::: :: :: server
|
|
||||||
:: :: ::
|
|
||||||
=> |% :: arvo structures
|
|
||||||
++ axle ,[%1 eye=face but=tube gam=game] :: agent state
|
|
||||||
++ axon $?(axle [%0 eye=face gam=game]) :: historical state
|
|
||||||
++ card $% [%diff lime] :: update
|
|
||||||
[%quit ~] :: cancel
|
|
||||||
[%peer wire dock path] :: subscribe
|
|
||||||
[%pull wire dock ~]
|
|
||||||
== ::
|
|
||||||
++ face (pair (list ,@c) (map bone sole-share)) :: interface
|
|
||||||
++ lime $% [%sole-effect sole-effect] :: :sole update
|
|
||||||
[%octo-game game] :: :octo update
|
|
||||||
== ::
|
|
||||||
++ move (pair bone card) :: cause and action
|
|
||||||
++ mote (pair ship ,?) :: remote binding
|
|
||||||
++ tube (unit (pair ,? mote)) :: alive, remote
|
|
||||||
-- ::
|
|
||||||
=> |% :: parsers
|
|
||||||
++ colm (cook |=(a=@ (sub a '1')) (shim '1' '3')) :: row or column
|
|
||||||
++ come ;~(plug colm ;~(pfix fas colm)) :: coordinate
|
|
||||||
++ comb (pick come ;~(pfix sig (punt comp))) :: all command input
|
|
||||||
++ comp ;~(plug fed:ag ;~(pfix ace (flag %x %o))) :: login command
|
|
||||||
++ cope |=(? ?:(+< (stag %| (cold ~ sig)) comb)) :: with wait mode
|
|
||||||
-- ::
|
|
||||||
|_ [hid=hide moz=(list move) axle] :: per agent
|
|
||||||
++ et ::
|
|
||||||
|_ [from say=sole-share] :: per console client
|
|
||||||
++ abet +>(q.eye (~(put by q.eye) ost say)) :: continue
|
|
||||||
++ amok +>(q.eye (~(del by q.eye) ost)) :: discontinue
|
|
||||||
++ beep (emit %bel ~) :: bad user
|
|
||||||
++ cusp (cope wait) :: parsing rule
|
|
||||||
++ delt |= cal=sole-change :: input line change
|
|
||||||
=^ cul say (remit:sole cal good) ::
|
|
||||||
?~ cul (park:abet(p.eye buf.say) | ~) ::
|
|
||||||
abet:beep:(emit det/u.cul) ::
|
|
||||||
++ emit |= fec=sole-effect ^+ +> :: send effect
|
|
||||||
+>(moz [[ost %diff %sole-effect fec] moz]) ::
|
|
||||||
++ emil |= fex=(list sole-effect) :: send effects
|
|
||||||
?~(fex +> $(fex t.fex, +> (emit i.fex))) ::
|
|
||||||
++ good |=((list ,@c) -:(rose (tufa +<) cusp)) :: valid input
|
|
||||||
++ kick |= point :: move command
|
|
||||||
=^ dud gam ~(m ~(at go gam) +<) ::
|
|
||||||
?. dud abet:beep =+ mus=~(res go gam) ::
|
|
||||||
(park:abet(gam ?^(mus *game gam)) %2 mus) ::
|
|
||||||
++ line =^ cal say (transmit:sole set/p.eye) :: update command
|
|
||||||
(emit %det cal) ::
|
|
||||||
++ make =+ dur=(rust (tufa p.eye) comb) ::
|
|
||||||
?~ dur abet:beep ::
|
|
||||||
=. + line(p.eye ~) ::
|
|
||||||
?-(+<.dur & (kick +>.dur), | (plan +>.dur)) ::
|
|
||||||
++ mean |=((unit tape) ?~(+< +> (emit txt/+<+))) :: optional message
|
|
||||||
++ play |= lev=?(%0 %1 %2) :: update by level
|
|
||||||
?-(lev %0 +>, %1 line, %2 line:show:prom) ::
|
|
||||||
++ plow |= [lev=?(%0 %1 %2) mus=(unit tape)] :: complete print
|
|
||||||
abet:(mean:(play lev) mus) ::
|
|
||||||
++ prom %^ emit %pro %& :- %octo :: update prompt
|
|
||||||
?: wait "(their turn) " ::
|
|
||||||
": {~[(icon who.gam)]} to move (row/col): " ::
|
|
||||||
++ plan |= mut=(unit mote) :: peer command
|
|
||||||
?~ mut ?~(but abet:beep stop:abet) ::
|
|
||||||
?^(but abet:beep (link:abet u.mut)) ::
|
|
||||||
++ rend (turn `wall`~(tab go gam) |=(tape txt/+<)) :: table print
|
|
||||||
++ show (emit %mor rend) :: update board
|
|
||||||
++ sole ~(. cs say) :: console library
|
|
||||||
++ wait &(?=(^ but) !=(q.q.u.but who.gam)) :: waiting turn
|
|
||||||
++ work |= act=sole-action :: console input
|
|
||||||
?:(?=(%det -.act) (delt +.act) make) ::
|
|
||||||
-- ::
|
|
||||||
++ abet [(flop moz) .(moz ~)] :: resolve core
|
|
||||||
++ dump |=(mov=move %_(+> moz [mov moz])) :: send move
|
|
||||||
++ dish |=(cad=card (dump 0 cad)) :: forward move
|
|
||||||
++ flet |=(from ~(. et +< (~(got by q.eye) ost))) :: in old client
|
|
||||||
++ fret |=(from ~(. et +< *sole-share)) :: in new client
|
|
||||||
++ like |=(a=ship |*(* [/octo [a %tictactoe] +<])) :: to friend
|
|
||||||
++ link |= mot=mote %+ dish(but `[| mot]) %peer :: subscribe to friend
|
|
||||||
((like p.mot) /octo/net/[?:(q.mot %x %o)]) ::
|
|
||||||
++ pals %+ turn (pale hid (prix /sole)) |= sink :: per console
|
|
||||||
[[p=p.+< q=q.+<] r=(~(got by q.eye) p.+<)] ::
|
|
||||||
++ park |= [lev=?(%0 %1 %2) mus=(unit tape)] :: update all
|
|
||||||
=. +> ?:(=(%2 lev) push +>) ::
|
|
||||||
=+ pals ::
|
|
||||||
|- ^+ +>.^$ ?~ +< +>.^$ ::
|
|
||||||
$(+< t.+<, +>.^$ (~(plow et i.+<) lev mus)) ::
|
|
||||||
++ push =+ pey=(pale hid (prix /octo)) |- ^+ +> :: update friends
|
|
||||||
?~(pey +> $(pey t.pey, +> (sell p.i.pey))) ::
|
|
||||||
++ sell |=(ost=bone (dump ost %diff %octo-game gam)) :: update friend
|
|
||||||
++ stop (dish(but ~) pull/((like +>-.but) ~)) :: cancel subscribe
|
|
||||||
:: :::::::::::::::
|
|
||||||
:::: :: :: :: hooks
|
|
||||||
:: :::::::::::::::
|
|
||||||
++ diff-octo-game :: friend update
|
|
||||||
|= [then gam=game] =< abet ::
|
|
||||||
?. &(?=([~ %& *] but) =(src p.q.u.but)) +> ::
|
|
||||||
?: =(^gam gam) +> ::
|
|
||||||
(park(gam gam) %2 ~) ::
|
|
||||||
++ peer-octo-net :: urbit peer
|
|
||||||
|= [from pax=path] =< abet ::
|
|
||||||
=+ who==(%x -.pax) ::
|
|
||||||
?^ but (park %2 ~) ::
|
|
||||||
(park:(link src !who) %2 `"net from {<src>}") ::
|
|
||||||
++ peer-sole :: console subscribe
|
|
||||||
|= [from pax=path] =< abet ::
|
|
||||||
(plow:(fret +<-) %2 ~) ::
|
|
||||||
++ poke-sole-action :: console input
|
|
||||||
|= [from act=sole-action] =< abet ::
|
|
||||||
(work:(flet +<-) act) ::
|
|
||||||
++ prep |= [from old=(unit ,[(list move) axon])] :: initialize
|
|
||||||
=< abet ?~ old +> ::
|
|
||||||
=< (park %2 ~) ::
|
|
||||||
?- -.+>.old ::
|
|
||||||
%1 +>(+<+ u.old) ::
|
|
||||||
%0 +>(eye.+< eye.+>.old, gam.+< gam.+>.old)::
|
|
||||||
== ::
|
|
||||||
++ pull-octo ::
|
|
||||||
|= [from *] =< abet ::
|
|
||||||
(park(but ~) %2 `"dropped") ::
|
|
||||||
++ pull-sole :: disconnect console
|
|
||||||
|= [from *] =< abet ::
|
|
||||||
amok:(flet +<-) ::
|
|
||||||
++ quit-octo :: unlinked by friend
|
|
||||||
|=([then ~] abet:(park(but ~) %0 `"removed")) ::
|
|
||||||
++ reap-octo :: linked to friend
|
|
||||||
|= [then saw=(unit tang)] =< abet ::
|
|
||||||
?> ?=([~ %| *] but) ::
|
|
||||||
?^ saw (park:stop %0 `"fail to {<src>}") ::
|
|
||||||
(park(p.u.but %&) %0 `"link to {<src>}") ::
|
|
||||||
--
|
|
@ -1,185 +0,0 @@
|
|||||||
:: :: ::
|
|
||||||
:::: /hook/core/acto/ape :: :: dependencies
|
|
||||||
:: :: ::
|
|
||||||
/- *sole :: structures
|
|
||||||
/+ sole :: libraries
|
|
||||||
:: :: ::
|
|
||||||
:::: :: :: structures
|
|
||||||
!: :: ::
|
|
||||||
=> |% :: board logic
|
|
||||||
++ board ,@ :: one-player bitfield
|
|
||||||
++ point ,[x=@ y=@] :: coordinate
|
|
||||||
++ game ,[who=? box=board boo=board] :: game state
|
|
||||||
++ icon |=(? ?:(+< 'X' 'O')) :: display at
|
|
||||||
++ bo :: per board
|
|
||||||
|_ bud=board ::
|
|
||||||
++ get |=(point =(1 (cut 0 [(off +<) 1] bud))) :: get point
|
|
||||||
++ off |=(point (add x (mul 3 y))) :: bitfield address
|
|
||||||
++ set |=(point (con bud (bex (off +<)))) :: set point
|
|
||||||
++ win %- lien :_ |=(a=@ =(a (dis a bud))) :: test for win
|
|
||||||
(rip 4 0wl04h0.4A0Aw.4A00s.0e070) :: with bitmasks
|
|
||||||
-- ::
|
|
||||||
++ go :: per game
|
|
||||||
|_ game ::
|
|
||||||
++ at |_ point :: per point
|
|
||||||
++ g +>+< :: game
|
|
||||||
++ k !|(x o) :: ok move
|
|
||||||
++ m ?.(k [| g] [& g:t:?:(who y p)]) :: move
|
|
||||||
++ o (~(get bo boo) +<) :: old at o
|
|
||||||
++ p .(boo (~(set bo boo) +<)) :: play at o
|
|
||||||
++ t .(who !who) :: take turn
|
|
||||||
++ v ?:(x (icon &) ?:(o (icon |) '.')) :: view
|
|
||||||
++ x (~(get bo box) +<) :: old at x
|
|
||||||
++ y .(box (~(set bo box) +<)) :: play at x
|
|
||||||
-- ::
|
|
||||||
++ res ?: ~(win bo box) `"{~[(icon &)]} wins" :: result
|
|
||||||
?: ~(win bo boo) `"{~[(icon |)]} wins" ::
|
|
||||||
?: =(511 (con boo box)) `"tie :-(" ~ ::
|
|
||||||
++ row |= y=@ :~ (add y '1') :: print row
|
|
||||||
' ' ~(v at y 0) ::
|
|
||||||
' ' ~(v at y 1) ::
|
|
||||||
' ' ~(v at y 2) ::
|
|
||||||
== ::
|
|
||||||
++ tab ~["+ 1 2 3" (row 0) (row 1) (row 2)] :: print table
|
|
||||||
-- ::
|
|
||||||
-- ::
|
|
||||||
:: :: ::
|
|
||||||
:::: :: :: server
|
|
||||||
:: :: ::
|
|
||||||
=> |% :: arvo structures
|
|
||||||
++ axle ,[%1 eye=face but=tube gam=game] :: agent state
|
|
||||||
++ axon $?(axle [%0 eye=face gam=game]) :: historical state
|
|
||||||
++ card $% [%diff lime] :: update
|
|
||||||
[%quit ~] :: cancel
|
|
||||||
[%peer wire dock path] :: subscribe
|
|
||||||
[%pull wire dock ~]
|
|
||||||
== ::
|
|
||||||
++ face (pair (list ,@c) (map bone sole-share)) :: interface
|
|
||||||
++ lime $% [%sole-effect sole-effect] :: :sole update
|
|
||||||
[%octo-game game] :: :octo update
|
|
||||||
== ::
|
|
||||||
++ move (pair bone card) :: cause and action
|
|
||||||
++ mote (pair ship ,?) :: remote binding
|
|
||||||
++ tube (unit (pair ,? mote)) :: alive, remote
|
|
||||||
-- ::
|
|
||||||
=> |% :: parsers
|
|
||||||
++ colm (cook |=(a=@ (sub a '1')) (shim '1' '3')) :: row or column
|
|
||||||
++ come ;~(plug colm ;~(pfix fas colm)) :: coordinate
|
|
||||||
++ comb (pick come ;~(pfix sig (punt comp))) :: all command input
|
|
||||||
++ comp ;~(plug fed:ag ;~(pfix ace (flag %x %o))) :: login command
|
|
||||||
++ cope |=(? ?:(+< (stag %| (cold ~ sig)) comb)) :: with wait mode
|
|
||||||
-- ::
|
|
||||||
|_ [hid=hide moz=(list move) axle] :: per agent
|
|
||||||
++ et ::
|
|
||||||
|_ [from say=sole-share] :: per console client
|
|
||||||
++ abet +>(q.eye (~(put by q.eye) ost say)) :: continue
|
|
||||||
++ amok +>(q.eye (~(del by q.eye) ost)) :: discontinue
|
|
||||||
++ beep (emit %bel ~) :: bad user
|
|
||||||
++ cusp (cope wait) :: parsing rule
|
|
||||||
++ delt |= cal=sole-change :: input line change
|
|
||||||
=^ cul say (remit:sole cal good) ::
|
|
||||||
?~ cul (park:abet(p.eye buf.say) | ~) ::
|
|
||||||
abet:beep:(emit det/u.cul) ::
|
|
||||||
++ emit |= fec=sole-effect ^+ +> :: send effect
|
|
||||||
+>(moz [[ost %diff %sole-effect fec] moz]) ::
|
|
||||||
++ emil |= fex=(list sole-effect) :: send effects
|
|
||||||
?~(fex +> $(fex t.fex, +> (emit i.fex))) ::
|
|
||||||
++ good |=((list ,@c) -:(rose (tufa +<) cusp)) :: valid input
|
|
||||||
++ kick |= point :: move command
|
|
||||||
=^ dud gam ~(m ~(at go gam) +<) ::
|
|
||||||
?. dud abet:beep =+ mus=~(res go gam) ::
|
|
||||||
(park:abet(gam ?^(mus *game gam)) %2 mus) ::
|
|
||||||
++ line =^ cal say (transmit:sole set/p.eye) :: update command
|
|
||||||
(emit %det cal) ::
|
|
||||||
++ make =+ dur=(rust (tufa p.eye) comb) ::
|
|
||||||
?~ dur abet:beep ::
|
|
||||||
=. + line(p.eye ~) ::
|
|
||||||
?-(+<.dur & (kick +>.dur), | (plan +>.dur)) ::
|
|
||||||
++ mean |=((unit tape) ?~(+< +> (emit txt/+<+))) :: optional message
|
|
||||||
++ play |= lev=?(%0 %1 %2) :: update by level
|
|
||||||
?-(lev %0 +>, %1 line, %2 line:show:prom) ::
|
|
||||||
++ plow |= [lev=?(%0 %1 %2) mus=(unit tape)] :: complete print
|
|
||||||
abet:(mean:(play lev) mus) ::
|
|
||||||
++ prom %^ emit %pro %& :- %octo :: update prompt
|
|
||||||
?: wait "(their turn) " ::
|
|
||||||
": {~[(icon who.gam)]} to move (row/col): " ::
|
|
||||||
++ plan |= mut=(unit mote) :: peer command
|
|
||||||
?~ mut ?~(but abet:beep stop:abet) ::
|
|
||||||
?^(but abet:beep (link:abet u.mut)) ::
|
|
||||||
++ rend (turn `wall`~(tab go gam) |=(tape txt/+<)) :: table print
|
|
||||||
++ show (emit %mor rend) :: update board
|
|
||||||
++ sole ~(. cs say) :: console library
|
|
||||||
++ wait &(?=(^ but) !=(q.q.u.but who.gam)) :: waiting turn
|
|
||||||
++ work |= act=sole-action :: console input
|
|
||||||
?:(?=(%det -.act) (delt +.act) make) ::
|
|
||||||
-- ::
|
|
||||||
++ abet [(flop moz) .(moz ~)] :: resolve core
|
|
||||||
++ dump |=(mov=move %_(+> moz [mov moz])) :: send move
|
|
||||||
++ dish |=(cad=card (dump 0 cad)) :: forward move
|
|
||||||
++ flet |=(from ~(. et +< (~(got by q.eye) ost))) :: in old client
|
|
||||||
++ fret |=(from ~(. et +< *sole-share)) :: in new client
|
|
||||||
++ like |=(a=ship |*(* [/octo [a %tictactoe] +<])) :: to friend
|
|
||||||
++ link |= mot=mote %+ dish(but `[| mot]) %peer :: subscribe to friend
|
|
||||||
((like p.mot) /octo/net/[?:(q.mot %x %o)]) ::
|
|
||||||
++ pals %+ turn (pale hid (prix /sole)) |= sink :: per console
|
|
||||||
[[p=p.+< q=q.+<] r=(~(got by q.eye) p.+<)] ::
|
|
||||||
++ park |= [lev=?(%0 %1 %2) mus=(unit tape)] :: update all
|
|
||||||
=. +> ?:(=(%2 lev) push +>) ::
|
|
||||||
=+ pals ::
|
|
||||||
|- ^+ +>.^$ ?~ +< +>.^$ ::
|
|
||||||
$(+< t.+<, +>.^$ (~(plow et i.+<) lev mus)) ::
|
|
||||||
++ push =+ pey=(pale hid (prix /octo)) |- ^+ +> :: update friends
|
|
||||||
?~(pey +> $(pey t.pey, +> (sell p.i.pey))) ::
|
|
||||||
++ sell |=(ost=bone (dump ost %diff %octo-game gam)) :: update friend
|
|
||||||
++ stop (dish(but ~) pull/((like +>-.but) ~)) :: cancel subscribe
|
|
||||||
:: :::::::::::::::
|
|
||||||
:::: :: :: :: hooks
|
|
||||||
:: :::::::::::::::
|
|
||||||
++ diff-octo-game :: friend update
|
|
||||||
|= [then gam=game] =< abet ::
|
|
||||||
?. &(?=([~ %& *] but) =(src p.q.u.but)) +> ::
|
|
||||||
?: =(^gam gam) +> ::
|
|
||||||
(park(gam gam) %2 ~) ::
|
|
||||||
++ peer-octo-net :: urbit peer
|
|
||||||
|= [from pax=path] =< abet ::
|
|
||||||
=+ who==(%x -.pax) ::
|
|
||||||
?^ but (park %2 ~) ::
|
|
||||||
(park:(link src !who) %2 `"net from {<src>}") ::
|
|
||||||
++ peer-octo-web :: web peer
|
|
||||||
|= [from pax=path] =< abet ::
|
|
||||||
~& [%peer-web +<] ::
|
|
||||||
?^ but (park %2 ~) ::
|
|
||||||
%+ park(but `[%& src !who.gam]) %2 ::
|
|
||||||
`"web from {<src>}" ::
|
|
||||||
++ peer-sole :: console subscribe
|
|
||||||
|= [from pax=path] =< abet ::
|
|
||||||
(plow:(fret +<-) %2 ~) ::
|
|
||||||
++ poke-sole-action :: console input
|
|
||||||
|= [from act=sole-action] =< abet ::
|
|
||||||
(work:(flet +<-) act) ::
|
|
||||||
++ poke-octo-move ::
|
|
||||||
|= [from wha=point] =< abet ::
|
|
||||||
=^ dud gam ~(m ~(at go gam) wha) ::
|
|
||||||
?> dud =+ mus=~(res go gam) ::
|
|
||||||
(park(gam ?^(mus *game gam)) %2 mus) ::
|
|
||||||
++ prep |= [from old=(unit ,[(list move) axon])] :: initialize
|
|
||||||
=< abet ?~ old +> ::
|
|
||||||
=< (park %2 ~) ::
|
|
||||||
?- -.+>.old ::
|
|
||||||
%1 +>(+<+ u.old) ::
|
|
||||||
%0 +>(eye.+< eye.+>.old, gam.+< gam.+>.old)::
|
|
||||||
== ::
|
|
||||||
++ pull-octo ::
|
|
||||||
|= [from *] =< abet ::
|
|
||||||
(park(but ~) %2 `"dropped") ::
|
|
||||||
++ pull-sole :: disconnect console
|
|
||||||
|= [from *] =< abet ::
|
|
||||||
amok:(flet +<-) ::
|
|
||||||
++ quit-octo :: unlinked by friend
|
|
||||||
|=([then ~] abet:(park(but ~) %0 `"removed")) ::
|
|
||||||
++ reap-octo :: linked to friend
|
|
||||||
|= [then saw=(unit tang)] =< abet ::
|
|
||||||
?> ?=([~ %| *] but) ::
|
|
||||||
?^ saw (park:stop %0 `"fail to {<src>}") ::
|
|
||||||
(park(p.u.but %&) %0 `"link to {<src>}") ::
|
|
||||||
--
|
|
@ -1,26 +0,0 @@
|
|||||||
::
|
|
||||||
:::: /hook/door/octo-game/mar
|
|
||||||
::
|
|
||||||
/? 310
|
|
||||||
!:
|
|
||||||
|%
|
|
||||||
++ rip9
|
|
||||||
=+ b=0
|
|
||||||
|= a=@ ^- (list ,@A)
|
|
||||||
?: =(b 9) ~
|
|
||||||
[(cut 0 [b 1] a) $(b +(b))]
|
|
||||||
--
|
|
||||||
!:
|
|
||||||
|_ cod=[who=? box=@ boo=@] :: game state
|
|
||||||
::
|
|
||||||
++ grab :: convert from
|
|
||||||
|%
|
|
||||||
++ noun ,[who=? box=@ boo=@] :: clam from %noun
|
|
||||||
--
|
|
||||||
++ grow
|
|
||||||
|%
|
|
||||||
++ json ^- ^json
|
|
||||||
=> |=(bor=@ `^json`a/(turn (rip9 bor) |=(a=@A [%b =(1 a)])))
|
|
||||||
(jobe who/s/?:(who.cod %x %o) box/(. box.cod) boo/(. boo.cod) ~)
|
|
||||||
--
|
|
||||||
--
|
|
@ -1,16 +0,0 @@
|
|||||||
::
|
|
||||||
:::: /hook/door/octo-move/mar
|
|
||||||
::
|
|
||||||
/? 314
|
|
||||||
!:
|
|
||||||
::::
|
|
||||||
::
|
|
||||||
=+ point=,[x=@ y=@]
|
|
||||||
|_ point
|
|
||||||
::
|
|
||||||
++ grab :: convert from
|
|
||||||
|%
|
|
||||||
++ json (corl need (at ni ni ~):jo) :: reparse from %json
|
|
||||||
++ noun point :: clam from %noun
|
|
||||||
--
|
|
||||||
--
|
|
@ -1,32 +0,0 @@
|
|||||||
::
|
|
||||||
::
|
|
||||||
:::: /hook/hymn/fab/octo/pub/
|
|
||||||
::
|
|
||||||
^- manx
|
|
||||||
;html
|
|
||||||
;head
|
|
||||||
;meta(charset "utf-8");
|
|
||||||
;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.js");
|
|
||||||
;script(type "text/javascript", src "/~/at/base/lib/urb.js");
|
|
||||||
;link(type "text/css", rel "stylesheet", href "/home/lib/base.css");
|
|
||||||
;link(type "text/css", rel "stylesheet", href "/home/pub/octo/src/main.css");
|
|
||||||
;title: :octo
|
|
||||||
==
|
|
||||||
;body
|
|
||||||
;div#what
|
|
||||||
;div#ship
|
|
||||||
;div.sig: ~
|
|
||||||
;div.ship;
|
|
||||||
;div.as;
|
|
||||||
==
|
|
||||||
;div#vs: vs
|
|
||||||
;div#user
|
|
||||||
;div.sig: ~
|
|
||||||
;div.ship;
|
|
||||||
;div.as;
|
|
||||||
==
|
|
||||||
==
|
|
||||||
;div#bord;
|
|
||||||
;script(type "text/javascript", src "/home/pub/octo/src/main.js");
|
|
||||||
==
|
|
||||||
==
|
|
@ -1,102 +0,0 @@
|
|||||||
#what,
|
|
||||||
#bord {
|
|
||||||
width: 600px;
|
|
||||||
text-align: center;
|
|
||||||
position: absolute;
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#what {
|
|
||||||
height: 36px;
|
|
||||||
top: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#bord {
|
|
||||||
height: 600px;
|
|
||||||
position: absolute;
|
|
||||||
top: 111px;
|
|
||||||
opacity: .6;
|
|
||||||
}
|
|
||||||
|
|
||||||
.turn #bord {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#what {
|
|
||||||
font-family: "bau";
|
|
||||||
}
|
|
||||||
|
|
||||||
#what div {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
#what .ship {
|
|
||||||
font-weight: 400;
|
|
||||||
letter-spacing: 1px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
.turn #what #ship,
|
|
||||||
#what #user {
|
|
||||||
border: 2px solid #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#what #ship,
|
|
||||||
.turn #what #user {
|
|
||||||
border: 2px solid red;
|
|
||||||
}
|
|
||||||
|
|
||||||
#what #ship,
|
|
||||||
#what #user {
|
|
||||||
padding: .6rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
#what .as {
|
|
||||||
width: 1.6rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
#vs {
|
|
||||||
margin: 0 1rem;
|
|
||||||
padding: .3rem;
|
|
||||||
color: #fff;
|
|
||||||
background-color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.spac {
|
|
||||||
font-size: 100px;
|
|
||||||
line-height: 200px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.spac {
|
|
||||||
width: 198px;
|
|
||||||
height: 198px;
|
|
||||||
border: 1px solid #000;
|
|
||||||
text-align: center;
|
|
||||||
float: left;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.spac[data-index="0-0"],
|
|
||||||
.spac[data-index="1-0"],
|
|
||||||
.spac[data-index="2-0"] {
|
|
||||||
border-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.spac[data-index="0-0"],
|
|
||||||
.spac[data-index="0-1"],
|
|
||||||
.spac[data-index="0-2"] {
|
|
||||||
border-top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.spac[data-index="2-0"],
|
|
||||||
.spac[data-index="2-1"],
|
|
||||||
.spac[data-index="2-2"] {
|
|
||||||
border-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.spac[data-index="0-2"],
|
|
||||||
.spac[data-index="1-2"],
|
|
||||||
.spac[data-index="2-2"] {
|
|
||||||
border-right: 0;
|
|
||||||
}
|
|
@ -1,62 +0,0 @@
|
|||||||
$(function() {
|
|
||||||
$bord = $('#bord')
|
|
||||||
$whom = $('#whom')
|
|
||||||
|
|
||||||
lett = ["x","o"]
|
|
||||||
symb = [" ","✕","◯"]
|
|
||||||
draw = function(state) {
|
|
||||||
space = function(_state,y,x) {
|
|
||||||
return "<div class='spac' data-index='"+y+"-"+x+
|
|
||||||
"'>"+symb[_state]+"</div>"
|
|
||||||
}
|
|
||||||
s = ""
|
|
||||||
x = 0
|
|
||||||
y = 0
|
|
||||||
for(i=0;i<9;i++) {
|
|
||||||
j = [0,3,6,1,4,7,2,5,8][i] // XX math
|
|
||||||
s += space((state.box[j] ? 1 : 0)+(state.boo[j] ? 2 : 0),y,x)
|
|
||||||
x++
|
|
||||||
if((i+1)%3 == 0) {
|
|
||||||
y++
|
|
||||||
x=0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$bord.html(s)
|
|
||||||
turn(state.who)
|
|
||||||
}
|
|
||||||
|
|
||||||
which = null
|
|
||||||
turn = function(who) {
|
|
||||||
$('body').toggleClass('turn',(who == which))
|
|
||||||
}
|
|
||||||
|
|
||||||
assign = function(who) {
|
|
||||||
which = who
|
|
||||||
turn(who)
|
|
||||||
$('#ship .as').text(symb[Number(!lett.indexOf(who))+1])
|
|
||||||
$('#user .as').text(symb[lett.indexOf(who)+1])
|
|
||||||
}
|
|
||||||
|
|
||||||
urb.appl = 'tictactoe'
|
|
||||||
urb.bind('/octo/web', function(err,res) {
|
|
||||||
if(which == null) { assign(res.data.who) }
|
|
||||||
draw(res.data)
|
|
||||||
})
|
|
||||||
|
|
||||||
// draw({
|
|
||||||
// box:[false,false,false,false,false,false,false,false,false],
|
|
||||||
// boo:[false,false,false,false,false,false,false,false,false]
|
|
||||||
// })
|
|
||||||
|
|
||||||
$bord.on('click', function(e) {
|
|
||||||
if(!$('body').hasClass('turn')) { return false }
|
|
||||||
$t = $(e.target).closest('.spac')
|
|
||||||
data = $.map(
|
|
||||||
$t.attr('data-index').split('-'),
|
|
||||||
function(i) { return Number(i); })
|
|
||||||
urb.send({mark:'octo-move',data:data})
|
|
||||||
})
|
|
||||||
|
|
||||||
$('#ship .ship').text(window.urb.ship)
|
|
||||||
$('#user .ship').text(window.urb.user)
|
|
||||||
})
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
X=$1
|
|
||||||
DEMO=demo
|
|
||||||
COLD=$DEMO/files
|
|
||||||
DESK=test/$X/$X/in/base
|
|
||||||
|
|
||||||
echo "cp -f $COLD/1-ape-tictactoe.hoon $DESK/ape/tictactoe/core.hook"
|
|
||||||
mkdir -p $DESK/ape/tictactoe
|
|
||||||
cp -f $COLD/1-ape-tictactoe.hoon $DESK/ape/tictactoe/core.hook
|
|
@ -1,14 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
X=$1
|
|
||||||
DEMO=demo
|
|
||||||
COLD=$DEMO/files
|
|
||||||
DESK=test/$X/$X/in/base
|
|
||||||
|
|
||||||
echo "cp -f $COLD/2-ape-tictactoe.hoon $DESK/ape/tictactoe/core.hook"
|
|
||||||
mkdir -p $DESK/ape/tictactoe
|
|
||||||
cp -f $COLD/1-ape-tictactoe.hoon $DESK/ape/tictactoe/core.hook
|
|
||||||
|
|
||||||
echo "cp -f $COLD/mar-octo-game.hoon $DESK/mar/octo-game/door.hook"
|
|
||||||
mkdir -p $DESK/mar/octo-game
|
|
||||||
cp -f $COLD/mar-octo-game.hoon $DESK/mar/octo-game/door.hook
|
|
@ -1,25 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
X=$1
|
|
||||||
DEMO=demo
|
|
||||||
COLD=$DEMO/files
|
|
||||||
DESK=test/$X/$X/in/base
|
|
||||||
|
|
||||||
echo "cp -f $COLD/3-ape-tictactoe.hoon $DESK/ape/tictactoe/core.hook"
|
|
||||||
mkdir -p $DESK/ape/tictactoe
|
|
||||||
cp -f $COLD/3-ape-tictactoe.hoon $DESK/ape/tictactoe/core.hook
|
|
||||||
|
|
||||||
echo "cp -f $COLD/mar-octo-game.hoon $DESK/mar/octo-game/door.hook"
|
|
||||||
mkdir -p $DESK/mar/octo-game
|
|
||||||
cp -f $COLD/mar-octo-game.hoon $DESK/mar/octo-game/door.hook
|
|
||||||
|
|
||||||
echo "cp -f $COLD/pub-octo-hymn.hoon $DESK/pub/octo/fab/hymn.hook"
|
|
||||||
mkdir -p $DESK/pub/octo/fab
|
|
||||||
cp -f $COLD/pub-octo-hymn.hoon $DESK/pub/octo/fab/hymn.hook
|
|
||||||
|
|
||||||
echo "cp -f $COLD/pub-octo-main.css $DESK/pub/octo/src/main.css"
|
|
||||||
mkdir -p $DESK/pub/octo/src
|
|
||||||
cp -f $COLD/pub-octo-main.css $DESK/pub/octo/src/main.css
|
|
||||||
|
|
||||||
echo "cp -f $COLD/pub-octo-main.js $DESK/pub/octo/src/main.js"
|
|
||||||
cp -f $COLD/pub-octo-main.js $DESK/pub/octo/src/main.js
|
|
@ -1,27 +0,0 @@
|
|||||||
script:
|
|
||||||
~tasfyn-partyv and ~talsur-todres decide to build a tic-tac-toe game
|
|
||||||
|
|
||||||
tasfyn-partyv: would you like to play a game of thermonuclear war?
|
|
||||||
|
|
||||||
talsur-todres: no. how about some tic-tac-toe?
|
|
||||||
|
|
||||||
tasfyn-partyv: sure. but wait, do we have a server?
|
|
||||||
|
|
||||||
talsur-todres:
|
|
||||||
features of the game:
|
|
||||||
(0) we build one-computer two-player TTT
|
|
||||||
(1) we build console tic-tac-toe
|
|
||||||
(2) we install it over the network
|
|
||||||
|
|
||||||
+ 1 2 3
|
|
||||||
1 X X
|
|
||||||
2 O O
|
|
||||||
3 X O X
|
|
||||||
|
|
||||||
? 1/3
|
|
||||||
|
|
||||||
(3) we update it to change the characters
|
|
||||||
|
|
||||||
(4) maybe cheating with some pretyped assets, we make a web view
|
|
||||||
|
|
||||||
(5)
|
|
@ -1,147 +0,0 @@
|
|||||||
A == ~tasfyn-partyv
|
|
||||||
B == ~talsur-todres
|
|
||||||
|
|
||||||
A and B, on unix terminals on different machines, clone and
|
|
||||||
build urbit from scratch, cutting over the build.
|
|
||||||
|
|
||||||
Each screen is divided into two logical columns. A's
|
|
||||||
screen is filled with two shells. B's screen has a shell
|
|
||||||
on the left and is empty on the right.
|
|
||||||
|
|
||||||
At the unix prompt, both run
|
|
||||||
|
|
||||||
urbit -c myship
|
|
||||||
|
|
||||||
type in an invisible ticket, and begin their ships. All
|
|
||||||
diagnostic messages are suppressed. Both users land
|
|
||||||
initially in :talk.
|
|
||||||
|
|
||||||
A: is this thing on?
|
|
||||||
|
|
||||||
B: who am i? why am i here?
|
|
||||||
|
|
||||||
A: would you like to play a game of global thermonuclear war?
|
|
||||||
|
|
||||||
B: wouldn't you prefer tic-tac-toe?
|
|
||||||
|
|
||||||
A: sure, but i'll have to write it. hang on...
|
|
||||||
|
|
||||||
A switches to :dojo and runs
|
|
||||||
|
|
||||||
:+merge %tic-tac-a ~tasfyn-partyv %home
|
|
||||||
|
|
||||||
In the other window, A runs vim and edits, occasionally
|
|
||||||
hitting :w to save the file:
|
|
||||||
|
|
||||||
demo/file1.txt -> A/in/base/ape/tictactoe/core.hook
|
|
||||||
|
|
||||||
After ++bo,
|
|
||||||
|
|
||||||
A: the board state is a bitfield
|
|
||||||
|
|
||||||
A: btw, you can watch me code at <URL>.
|
|
||||||
|
|
||||||
B opens a browser and points it at <URL>, showing the
|
|
||||||
tree with live update every time A saves.
|
|
||||||
|
|
||||||
After ++go:
|
|
||||||
|
|
||||||
A: game semantics are not that complex...
|
|
||||||
|
|
||||||
After ++move:
|
|
||||||
|
|
||||||
A: basic console io, kinda boilerplaty
|
|
||||||
|
|
||||||
After ++come:
|
|
||||||
|
|
||||||
A: if you can infer the type of the product
|
|
||||||
A: of a combinator parser, you are probably
|
|
||||||
A: a typed functional language even if you
|
|
||||||
A: leave category theory to the real math nerds...
|
|
||||||
|
|
||||||
After ++park:
|
|
||||||
|
|
||||||
A: a fairly vanilla console server. probably some
|
|
||||||
A: of this should be sucked out into a library -
|
|
||||||
A: you can never completely beat the boilerplate.
|
|
||||||
A: also note that this is a two-way console with
|
|
||||||
A: operational transformation that cancels syntax
|
|
||||||
A: errors as you type, just like how :talk violates
|
|
||||||
A: your human rights by lowercasing your capitals.
|
|
||||||
A: finally, while the style is perfectly readable
|
|
||||||
A: for a hoon programmer, we don't normally go in
|
|
||||||
A: for this kind of mildly contrived topiary.
|
|
||||||
|
|
||||||
After ++pull-sole:
|
|
||||||
|
|
||||||
A: those were the event hooks where arvo calls us,
|
|
||||||
A: expecting a new state and a list of actions.
|
|
||||||
A: anyway, this should work - let's try it.
|
|
||||||
A: do this:
|
|
||||||
|
|
||||||
:+sync %tic-tac-a ~tasfyn-partyv %tic-tac-a
|
|
||||||
:+start %tic-tac-a %tictactoe
|
|
||||||
|
|
||||||
B does this. it puts him straight into TTT.
|
|
||||||
|
|
||||||
A: now hang on, I'll join you.
|
|
||||||
|
|
||||||
A uses ^V to pop the hood and types +~B/
|
|
||||||
|
|
||||||
A: bear in mind, this is a very crude shared space.
|
|
||||||
A: your server is just exporting a console interface
|
|
||||||
A: which we both can access. so essentially i'm
|
|
||||||
A: ssh-ed into your game world.
|
|
||||||
|
|
||||||
They play a couple of moves.
|
|
||||||
|
|
||||||
A: it's important to note that your urbit is also
|
|
||||||
A: in a sense, a database. try this from unix:
|
|
||||||
|
|
||||||
killall -9 urbit
|
|
||||||
urbit myship
|
|
||||||
|
|
||||||
B does this, comes back and plays a move.
|
|
||||||
|
|
||||||
B: we don't seem to have lost any data.
|
|
||||||
A: we didn't even come close to losing data,
|
|
||||||
A: so let's come a little closer:
|
|
||||||
|
|
||||||
killall -9 vere
|
|
||||||
rm -rf $checkpoint
|
|
||||||
urbit myship
|
|
||||||
|
|
||||||
B does this, comes back and plays a move.
|
|
||||||
|
|
||||||
B: whoa, that was heavy.
|
|
||||||
A: yeah, your life flashed before your eyes. or at least,
|
|
||||||
A: your event history. this system of checkpoint
|
|
||||||
A: and transaction log is actually how normal dbs work,
|
|
||||||
A: though urbit is designed as a personal computer and
|
|
||||||
A: hardly up for a normal db workload.
|
|
||||||
|
|
||||||
B: it's a little odd that either of us could play X or O.
|
|
||||||
A: or even have an edit war in the command line.
|
|
||||||
|
|
||||||
They have an edit war in the command line.
|
|
||||||
|
|
||||||
B: it might be right for some things. not tictactoe.
|
|
||||||
A: then we'll have to change it! often when someone
|
|
||||||
A: installs your software, later you find out it's not
|
|
||||||
A: perfect and sometimes actually needs to be changed.
|
|
||||||
B: i've had that experience a number of times.
|
|
||||||
A: but it's always tricky to operate on a beating heart,
|
|
||||||
A: so let's try it in a small way first...
|
|
||||||
|
|
||||||
A edits the source file and changes X to Z, or
|
|
||||||
maybe to a Unicode symbol. When he saves, the
|
|
||||||
change propagates to both consoles and also the
|
|
||||||
tree view on B's screen, even to the prompt UI.
|
|
||||||
|
|
||||||
B: i've seen that sort of thing before.
|
|
||||||
A: really? in any case, let's do it for real. the next
|
|
||||||
A: version is a genuine distributed tictactoe with
|
|
||||||
A: its own peer-to-peer move protocol. surely this
|
|
||||||
A: is some fancy technology...
|
|
||||||
|
|
||||||
A edits the source file into
|
|
@ -1,162 +0,0 @@
|
|||||||
For dialogue: start with dialogue ad-libbed by whoever is
|
|
||||||
doing the production. Later, copy it into a script and
|
|
||||||
edit that script.
|
|
||||||
|
|
||||||
For operation details, see commands.txt. Fill in the script
|
|
||||||
with literal operations *only once you have tested them
|
|
||||||
yourself*.
|
|
||||||
|
|
||||||
A: build and boot A
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
A: private-message B
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
B: create demo desk
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
B: vim in application version 1, just typing, very fast
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
A: sync A's demo desk to B
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
B: log in to A's tictactoe (intentionally reversed)
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
A: start tictactoe on A
|
|
||||||
|
|
||||||
A/B: play ONE full game of tictactoe, moves interleaved with
|
|
||||||
these subdemos:
|
|
||||||
|
|
||||||
B changes X to Z in the source, then changes it back
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
A or B enters an invalid move, beep sound is heard
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
A kills and restarts the vere process:
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
A kills the vere process, deletes the checkpoint, restarts:
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
A or B enters an invalid move, beep sound is heard:
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
A and B tussle humorously over weird shared command line
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
B edits version 1 into version 2, automagically upgrading A
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
B logs out of A's tictactoe
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
B starts local tictactoe
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
B connects local tictactoe to A's server
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
B edits in version 3 ape, with web support
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
A: watch editing of application
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
B edits in mar, pub (very fast)
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
A: logs in to game url
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
A: brings up web talk
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
B: creates a local channel to talk about TTT
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
A: subscribes from the web UI to B's channel
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
C, D, and E: join the channel and give humorous advice
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
A: loses the game
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
B: sends bitcoin payment to A
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
A: points browser at blockchain.info, shows real payment
|
|
||||||
|
|
||||||
...
|
|
||||||
""
|
|
||||||
|
|
||||||
close:
|
|
||||||
credit screen 1:
|
|
||||||
|
|
||||||
*everyone who has ever worked/for at Tlon, in alphabetical
|
|
||||||
order*,
|
|
||||||
|
|
||||||
credit screen 2:
|
|
||||||
|
|
||||||
*every non Tlon github uid that has contributed to our repository*
|
|
||||||
|
|
||||||
credit screen 3:
|
|
||||||
|
|
||||||
~, huge
|
|
||||||
|
|
@ -51,10 +51,6 @@ struct telnet_parser {
|
|||||||
|
|
||||||
#line 53 "src/parser.c"
|
#line 53 "src/parser.c"
|
||||||
static const int telnet_parser_start = 7;
|
static const int telnet_parser_start = 7;
|
||||||
static const int telnet_parser_first_final = 7;
|
|
||||||
static const int telnet_parser_error = -1;
|
|
||||||
|
|
||||||
static const int telnet_parser_en_main = 7;
|
|
||||||
|
|
||||||
|
|
||||||
#line 130 "src/parser.rl"
|
#line 130 "src/parser.rl"
|
||||||
|
Loading…
Reference in New Issue
Block a user