forked from KolibriOS/kolibrios
392 lines
7.5 KiB
NASM
392 lines
7.5 KiB
NASM
|
; HANG PROGRAMMER
|
||
|
|
||
|
WINDOW.W=720
|
||
|
WINDOW.H=512
|
||
|
|
||
|
include 'a.inc'
|
||
|
include 'include/words.txt'
|
||
|
|
||
|
text title.t(32)='Hang Programmer'
|
||
|
text t(256), t2(256)
|
||
|
|
||
|
integer scene
|
||
|
numeric SCENE.*, TITLE, PLAY, GAME.OVER
|
||
|
|
||
|
integer guesses, word.index
|
||
|
BOX my.box
|
||
|
|
||
|
text word.t(64), used.letters(16)
|
||
|
|
||
|
align
|
||
|
|
||
|
IMAGE8 \
|
||
|
board.i='board', logo.i='logo',\
|
||
|
stand1.i='stand1', stand2.i='stand2',\
|
||
|
head.i='head', body.i='body',\
|
||
|
arm1.i='arm1', arm2.i='arm2',\
|
||
|
leg1.i='leg1', leg2.i='leg2',\
|
||
|
smile.i='smile', money.i='money',\
|
||
|
prize.i='1000'
|
||
|
|
||
|
IMAGE close.i='x'
|
||
|
|
||
|
text abc='ABCDEFGHIJKLM', xyz='NOPQRSTUVWXYZ'
|
||
|
|
||
|
text help.t='CLICK TO START',\
|
||
|
winner.t='WINNER', looser.t='LOOSER'
|
||
|
|
||
|
text example.t='DYNAMIC BINARY TRANSLATION'
|
||
|
|
||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
|
|
||
|
function reset.game
|
||
|
. guesses=0
|
||
|
text.zero used.letters
|
||
|
text.zero word.t
|
||
|
. r0=word.index, r0*4, r0+words.pa
|
||
|
. (u32) r0=*r0
|
||
|
text.copy word.t, r0
|
||
|
. word.index++
|
||
|
if word.index>=(N.WORDS-1)
|
||
|
. word.index=0
|
||
|
end
|
||
|
endf
|
||
|
|
||
|
; exchange pointer array elements.
|
||
|
; words.pa[a] and [b]
|
||
|
|
||
|
function exchange.words, a, b
|
||
|
alias pa=r0, i=r0, p=r1, q=r2, x=r3
|
||
|
. pa=words.pa
|
||
|
. p=a, p*4, p+pa, q=b, q*4, q+pa
|
||
|
. (u32) i=*p, (u32) x=*q
|
||
|
. (u32) *p=x, (u32) *q=i
|
||
|
endf
|
||
|
|
||
|
; do this once when game begins.
|
||
|
; initialize pointer array to words[0-n]
|
||
|
; then randomize indices
|
||
|
|
||
|
function initialize
|
||
|
locals i, n, j
|
||
|
alias p=r0, x=r1
|
||
|
. p=words.pa, i=0, n=N.WORDS
|
||
|
loop n, x=i, (u32) x=*(words.ta+r1*4)
|
||
|
. (u32) *p++=x, i++
|
||
|
endl
|
||
|
. i=N.WORDS
|
||
|
loop i
|
||
|
get j=random (N.WORDS-1)
|
||
|
exchange.words i, j
|
||
|
endl
|
||
|
. word.index=0 ; random (N.WORDS-1)
|
||
|
endf
|
||
|
|
||
|
; is winner? if all characters in
|
||
|
; word.t have been used. return
|
||
|
; winner.t/looser.t
|
||
|
|
||
|
function is.winner
|
||
|
locals i, q, n, win
|
||
|
alias p=r0, c=r1
|
||
|
. q=word.t
|
||
|
get n=text.n q
|
||
|
. win=1
|
||
|
loop n, p=q, c=*p++
|
||
|
if c<>' '
|
||
|
text.find used.letters, c
|
||
|
if false
|
||
|
. win=0, break
|
||
|
end
|
||
|
end
|
||
|
. q++
|
||
|
endl
|
||
|
if win, r0=winner.t
|
||
|
else, r0=looser.t, end
|
||
|
endf
|
||
|
|
||
|
function on.create
|
||
|
initialize
|
||
|
reset.game
|
||
|
endf
|
||
|
|
||
|
function insert.c, c
|
||
|
if c>='a', c-32, end
|
||
|
if c<'A', return, end
|
||
|
if c>'Z', return, end
|
||
|
text.find used.letters, c
|
||
|
if true, return, end
|
||
|
text.attach.c used.letters, c
|
||
|
is.winner
|
||
|
if r0=winner.t
|
||
|
go .reset
|
||
|
end
|
||
|
text.find word.t, c
|
||
|
if true, return, end
|
||
|
. guesses++
|
||
|
if guesses=6
|
||
|
.reset: . scene=SCENE.GAME.OVER
|
||
|
end
|
||
|
endf
|
||
|
|
||
|
; special "my" font
|
||
|
|
||
|
align
|
||
|
alphabet.p: dd \
|
||
|
a.i, b.i, c.i, d.i, e.i, f.i, g.i, h.i, i.i,\
|
||
|
j.i, k.i, l.i, m.i, n.i, o.i, p.i, q.i, r.i,\
|
||
|
s.i, t.i, u.i, v.i, w.i, x.i, y.i, z.i
|
||
|
|
||
|
irps _,\
|
||
|
a b c d e f g h i j k l m \
|
||
|
n o p q r s t u v w x y z {
|
||
|
IMAGE8 _#.i='a/'#`_
|
||
|
}
|
||
|
|
||
|
function index.my.c, c
|
||
|
. r0=c, r0-'A', r0*4, r0+alphabet.p
|
||
|
. (u32) r0=*r0
|
||
|
endf
|
||
|
|
||
|
function get.my.cw, c
|
||
|
if c=' ', return 0, end
|
||
|
index.my.c c
|
||
|
. (u32) r0=*(r0+?image.w)
|
||
|
endf
|
||
|
|
||
|
function get.my.tw, t
|
||
|
locals n, w
|
||
|
alias p=r0, c=r1
|
||
|
get n=text.n t
|
||
|
. w=0
|
||
|
loop n, p=t, c=*p
|
||
|
get.my.cw c
|
||
|
. w+r0, t++
|
||
|
endl
|
||
|
endf w
|
||
|
|
||
|
function draw.my.c, c, x, y, co
|
||
|
locals im, w
|
||
|
if c=' ', return, end
|
||
|
get im=index.my.c c
|
||
|
. (u32) r1=*(r0+?image.w), w=r1
|
||
|
draw.image.v8 im, x, y, co
|
||
|
endf w
|
||
|
|
||
|
function draw.my.text, t, x, y
|
||
|
locals p, n
|
||
|
get n=text.n t
|
||
|
. p=t
|
||
|
loop n, r0=p, r0=*r0
|
||
|
draw.my.c r0, x, y, WHITE
|
||
|
. x+r0, x+4, p++
|
||
|
endl
|
||
|
endf
|
||
|
|
||
|
function draw.my.word, t, x, y
|
||
|
locals p, n, w, c, co
|
||
|
get n=text.n t
|
||
|
. p=t
|
||
|
loop n, r0=p, r0=*r0, c=r0
|
||
|
get w=get.my.cw c
|
||
|
text.find used.letters, c
|
||
|
if true
|
||
|
. r0=x, r0+18, r1=w, r1/2, r0-r1
|
||
|
draw.my.c c, r0, y, WHITE
|
||
|
end
|
||
|
. r0=x, r0+2, r1=y, r1+48
|
||
|
draw.box r0, r1, 32, 3, WHITE
|
||
|
. r0=36, x+r0, p++
|
||
|
endl
|
||
|
endf
|
||
|
|
||
|
function draw.message
|
||
|
locals n, x, y, w
|
||
|
get n=text.count.w word.t
|
||
|
if n=0, n=1, end
|
||
|
set.source word.t
|
||
|
set.token t
|
||
|
. x=250, y=80
|
||
|
loop n
|
||
|
skip.space
|
||
|
copy.until C.SPACE
|
||
|
set.box my.box, 250, 65, 390, 220
|
||
|
text.n t
|
||
|
. r0*36, w=r0, r0=my.box.x, r0+195
|
||
|
. r1=w, r1/2, r0-r1
|
||
|
draw.my.word t, r0, y
|
||
|
. y+70
|
||
|
endl
|
||
|
endf
|
||
|
|
||
|
function draw.letters, t, x, y
|
||
|
locals n, p, c, co
|
||
|
get n=text.n t
|
||
|
. p=t
|
||
|
loop n, r0=p, r0=*r0, c=r0
|
||
|
index.my.c c
|
||
|
. r0+?image.box
|
||
|
memory.copy my.box, r0, 16
|
||
|
. my.box.x=x, my.box.y=y
|
||
|
if.select my.box
|
||
|
if mouse.1
|
||
|
insert.c c
|
||
|
end
|
||
|
end
|
||
|
. co=WHITE
|
||
|
text.find used.letters, c
|
||
|
if true, co=409040h, end
|
||
|
draw.my.c c, x, y, co
|
||
|
. r0+4, x+r0, p++
|
||
|
endl
|
||
|
endf
|
||
|
|
||
|
function draw.alphabet
|
||
|
draw.letters abc, 255, 308
|
||
|
draw.letters xyz, 248, 370
|
||
|
endf
|
||
|
|
||
|
function draw.man
|
||
|
locals x, y
|
||
|
. x=40, y=62
|
||
|
. alpha.bias=A.DARK
|
||
|
draw.image.v.8 stand1.i, x, y, WHITE
|
||
|
. r0=x, r0+27
|
||
|
draw.image.v.8 stand2.i, r0, y, WHITE
|
||
|
. alpha.bias=A.DARKER
|
||
|
if guesses>0
|
||
|
. r0=x, r0+80, r1=y, r1+40
|
||
|
draw.image.v.8 head.i, r0, r1, WHITE
|
||
|
end
|
||
|
if guesses>1
|
||
|
. r0=x, r0+95, r1=y, r1+150
|
||
|
draw.image.v.8 body.i, r0, r1, WHITE
|
||
|
end
|
||
|
if guesses>2
|
||
|
. r0=x, r0+70, r1=y, r1+150
|
||
|
draw.image.v.8 arm1.i, r0, r1, WHITE
|
||
|
end
|
||
|
if guesses>3
|
||
|
. r0=x, r0+143, r1=y, r1+150
|
||
|
draw.image.v.8 arm2.i, r0, r1, WHITE
|
||
|
end
|
||
|
if guesses>4
|
||
|
. r0=x, r0+87, r1=y, r1+228
|
||
|
draw.image.v.8 leg1.i, r0, r1, WHITE
|
||
|
end
|
||
|
if guesses>5
|
||
|
. r0=x, r0+118, r1=y, r1+228
|
||
|
draw.image.v.8 leg2.i, r0, r1, WHITE
|
||
|
end
|
||
|
. alpha.bias=0
|
||
|
endf
|
||
|
|
||
|
function draw.hang.man
|
||
|
. guesses=6
|
||
|
draw.man
|
||
|
. guesses=0
|
||
|
endf
|
||
|
|
||
|
function draw.winner
|
||
|
locals x, y
|
||
|
. alpha.bias=A.DARKER
|
||
|
. x=40, y=62
|
||
|
. r0=x, r0+80, r1=y, r1+40
|
||
|
draw.image.v.8 head.i, r0, r1, WHITE
|
||
|
. r0=x, r0+95, r1=y, r1+150
|
||
|
draw.image.v.8 body.i, r0, r1, WHITE
|
||
|
. r0=x, r0+67, r1=y, r1+87
|
||
|
draw.image.viy.8 arm1.i, r0, r1, WHITE
|
||
|
. r0=x, r0+147, r1=y, r1+87
|
||
|
draw.image.viy.8 arm2.i, r0, r1, WHITE
|
||
|
. r0=x, r0+87, r1=y, r1+228
|
||
|
draw.image.v.8 leg1.i, r0, r1, WHITE
|
||
|
. r0=x, r0+118, r1=y, r1+228
|
||
|
draw.image.v.8 leg2.i, r0, r1, WHITE
|
||
|
. alpha.bias=A.LIGHT
|
||
|
draw.image.v.8 smile.i, 547, 307, WHITE
|
||
|
draw.image.v.8 smile.i, 310, 307, WHITE
|
||
|
. alpha.bias=A.DARK
|
||
|
draw.image.v.8 money.i, 547, 342, 0DDFFDDh
|
||
|
draw.image.v.8 prize.i, 367, 377, WHITE
|
||
|
. alpha.bias=0
|
||
|
endf
|
||
|
|
||
|
function draw.title.scene
|
||
|
draw.my.text help.t, 237, 100
|
||
|
draw.hang.man
|
||
|
endf
|
||
|
|
||
|
function draw.play.scene
|
||
|
draw.message
|
||
|
draw.alphabet
|
||
|
draw.man
|
||
|
endf
|
||
|
|
||
|
function draw.game.over
|
||
|
locals p
|
||
|
get p=is.winner
|
||
|
draw.my.text p, 362, 308
|
||
|
draw.message
|
||
|
if p=winner.t
|
||
|
draw.winner
|
||
|
else
|
||
|
draw.hang.man
|
||
|
end
|
||
|
endf
|
||
|
|
||
|
function on.draw
|
||
|
clear.screen 283D25h
|
||
|
draw.image.8 board.i, 0, 0
|
||
|
. alpha.bias=A.DARKER
|
||
|
draw.image.v.8 logo.i, 240, 32, WHITE
|
||
|
. alpha.bias=0
|
||
|
if scene=SCENE.TITLE
|
||
|
draw.title.scene
|
||
|
else.if scene=SCENE.PLAY
|
||
|
draw.play.scene
|
||
|
else.if scene=SCENE.GAME.OVER
|
||
|
draw.game.over
|
||
|
end
|
||
|
draw.image close.i, 663, 28
|
||
|
endf
|
||
|
|
||
|
function on.key
|
||
|
if key.event='k'
|
||
|
if scene=SCENE.PLAY
|
||
|
insert.c key
|
||
|
else.if scene=SCENE.TITLE
|
||
|
reset.game
|
||
|
. scene=SCENE.PLAY
|
||
|
else.if scene=SCENE.GAME.OVER
|
||
|
reset.game
|
||
|
. scene=SCENE.TITLE
|
||
|
end
|
||
|
render
|
||
|
end
|
||
|
endf
|
||
|
|
||
|
function on.mouse
|
||
|
if mouse.event='c'
|
||
|
. r0=&close.i.x
|
||
|
if.select r0
|
||
|
exit
|
||
|
end
|
||
|
if scene=SCENE.TITLE
|
||
|
reset.game
|
||
|
. scene=SCENE.PLAY
|
||
|
else.if scene=SCENE.GAME.OVER
|
||
|
reset.game
|
||
|
. scene=SCENE.TITLE
|
||
|
end
|
||
|
render
|
||
|
end
|
||
|
endf
|
||
|
|
||
|
function on.timer
|
||
|
; ...
|
||
|
endf
|
||
|
|
||
|
function on.exit
|
||
|
; ...
|
||
|
endf
|