Intelligent ragdolls? Sounds intriguing!
Update on my typing game (now called 'Word Panic!'):
(Needs 5.8, and sorry the code is in such a mess - it's all over the place, and there's even a goto in there for good measure!)
` *** N.B. This program requires DBPro5.8 because of the memblock format
createsound("laser",1,1500,500,5000,0.01,0.2,0,0,0,0)
createsound("explosion",2,6200,700,2000,20,0.2,0,0,0,0)
createsound("explosion2",3,1200,1400,3000,10,0.1,0,0,0,0)
createsound("powerup",4,800,700,8000,-0.02,0.2,0,0,0,0)
createsound("warning",5,800,1000,3000,0.5,0.1,0,0,0,0)
createsound("vibrato1",6,500,2000,8000,0,0.1,0.05,0.2,0,0)
createsound("vibrato2",7,400,2000,8000,0,0.1,0.05,0.2,0,0)
createsound("vibrato3",8,600,2000,8000,0,0.1,0.05,0.2,0,0)
createsound("bass hit",9,20,200,14000,0.00,1.2,.0,0,0,0)
createsound("hihat",10,800,200,5000,60.06,2.2,.1,0,0,0)
createsound("door knock",11,200,200,8000,.1,4.0,2.1,10,9.2,9.2)
createsound("vinyl scratch",12,500,200,8000,0.06,0.2,.1,0,0,0)
createsound("cb1",13,250,500,2500,0.00001,0.2,4.0,0.4,0,0)
createsound("cb2",14,500,500,2500,0.00001,0.2,4.0,0.4,0,0)
createsound("cb3",15,437.5,1500,1500,0.0001,0.2,0.0,4.0,0.4,0)
createsound("cb4",16,573.75,1500,1500,0.0,0.2,4.0,0.4,0,0)
createsound("bubble burst",17,100,800,6000,-.4,2.0,0.1,10,1.2,0.2)
autocam off
position camera 0,0,-10
color backdrop rgb(255,255,255)
make object cube 5000,1
hide object 5000
set text font "times new roman"
set text size 100
ink rgb(200,200,255),0
text 0,60,"Word Panic! "
get image 1000,0,0,450,200
ink rgb(255,255,255),0
box 0,0,10,10
ink rgb(0,0,250),0
line 0,0,0,10
line 0,0,10,0
get image 2000,0,0,10,10
ink rgb(250,0,0),0
line 0,0,0,10
line 0,0,10,0
get image 3000,0,0,10,10
make object plain 1000,14,3
texture object 1000,1000
make object plain 2000,14,3
texture object 2000,1000
position object 2000,0.1,-0.1,-0.01
set object transparency 1000,3
set object transparency 2000,3
set alpha mapping on 2000,50
make object plain 3000,14,3
texture object 3000,1000
position object 3000,0.1,-0.1,-0.01
set object transparency 3000,3000
set alpha mapping on 3000,30
make object plain 4000,15,3
`texture object 4,3
scale object texture 4000,50,10
position object 4000,0,0,0
`set object light 4,0
set object emissive 4000,rgb(0,0,250)
`set image colorkey 255,255,255
`set object transparency 4,1
ghost object on 4000,2
make object sphere 6000,-100,30,30
texture object 6000,2000
scale object texture 6000,50,50
sync on
color backdrop 0
read disallowedcharacterlist$
numberofdisallowedcharacters=len(disallowedcharacterlist$)
dim disallowedcharacter$(numberofdisallowedcharacters)
for checkdisallowedcharacters=1 to numberofdisallowedcharacters
disallowedcharacter$(checkdisallowedcharacters)=right$(left$(disallowedcharacterlist$,checkdisallowedcharacters),1)
next checkdisallowedcharacters
read wordbank$
numberofwords=1
dim word$(numberofwords)
length=len(wordbank$)
for checkforspaces=1 to length
checkcharacter$=right$(left$(wordbank$,checkforspaces),1)
if checkcharacter$=" "
inc numberofwords
dim word$(numberofwords)
else
proceed=1
for checkdisallowedcharacters=1 to numberofdisallowedcharacters
if checkcharacter$=disallowedcharacter$(checkdisallowedcharacters)
proceed=0
endif
next checkdisallowedcharacters
if proceed=1
word$(numberofwords)=word$(numberofwords)+checkcharacter$
endif
endif
next checkforspaces
restart:
total=0
score=0
correct=2
inputword$=""
undim randomword$(500)
undim stackedboxes(500)
dim randomword$(500)
dim stackedboxes(500)
currentword=1
nextword=1
topstackedbox=0
target=10
for image=1 to 200
if image exist (image) then delete image image
if object exist (image) then delete object image
next image
set text size 26
create bitmap 1,screen width(),screen height()
set current bitmap 0
firsttime=1
starttime=timer()
set text size 50
do
time=(timer()-starttime)/1000
if time>6
newword=1
starttime=timer()
endif
if firsttime=1
firsttime=0
newword=1
endif
scroll object texture 1000,0.001,0.0007
scroll object texture 2000,0.0008,0.0002
scroll object texture 3000,-0.0005,-0.0002
scroll object texture 6000,0,0.02
if newword=1
do
randomword$(nextword)=lower$(word$(rnd(numberofwords-1)+1))
if len(randomword$(nextword))>3 then exit
loop
set current bitmap 1
cls
ink rgb(255,255,255),0
box 0,0,300,60
ink rgb(0,0,255),0
text 0,0,randomword$(nextword)
get image nextword,0,0,300,60
set current bitmap 0
make object box nextword,6,1,1
position object nextword,0,5,0
if (nextword-1)>0
if object position y(nextword-1)>4 then position object nextword,0,object position y(nextword-1)+1,0
endif
texture object nextword,nextword
inc total
inc nextword
newword=0
endif
`text 0,0,randomword$(nextword-1)
for object=1 to total
if object exist(object)
if stackedboxes(object)=0 or stackedboxes(object)=2 then position object object,0,object position y(object)-0.011,-0.5
if object position y(currentword)<-5
stackedboxes(currentword)=1
topstackedbox=currentword
play sound 1
inc currentword
endif
if topstackedbox>0
if stackedboxes(object)=0
if object position y(currentword)<object position y(topstackedbox)+1
stackedboxes(currentword)=1
topstackedbox=currentword
play sound 1
inc currentword
endif
endif
endif
if object=currentword then set object emissive object,rgb(255,50,50) else set object emissive object,rgb(10,10,10)
endif
next object
if topstackedbox>0
set object emissive topstackedbox,rgb(55,50,250)
if object position y(topstackedbox)>5 then goto gameover
endif
if score>target
play sound 4
inc target,10
for stacked=1 to topstackedbox
stackedboxes(stacked)=2
next stacked
endif
newletter$=inkey$()
if returnkey()=0 then lockreturnkey=0
if newletter$=oldletter$
else
if returnkey()=0
inputletter$=inkey$()
oldletter$=inputletter$
inputword$=inputword$+inputletter$
endif
if returnkey()=1 and lockreturnkey=0
lockreturnkey=1
if inputword$=randomword$(currentword)
newword=1
inc score,1
inc currentword
inputword$=""
correct=1
play sound 17
else
correct=0
play sound 2
inputword$=""
endif
endif
endif
if currentword>=nextword then newword=1
ink rgb(255,255,255),0
text 0,150,inputword$
if correct=1
text 0,60,"Correct"
endif
if correct=0
text 0,60,"Incorrect"
endif
text 0,90,"Score: "+str$(score)
sync
loop
gameover:
wait 1000
cls
ink rgb(0,0,255),0
print "Game over. You scored ",score," points."
sync
wait 2000
cls
print "Game over. You scored ",score," points."
print "Press any key to restart"
sync
wait key
goto restart
data ".,:;1234567890/?!£$%^&*()-=+_{}[]#@<>"
data "In key stage 3, in accordance with the whole school ICT policy, and in order to fulfil the requirements for the key stage 3 ICT curriculum, the emphasis of using ICT in science is to provide pupils with opportunities to make use of datalogging devices. Pupils in key stage 3 are to be assessed on their ability to use such apparatus, to manipulate and analyse the data recorded using computer software, and to evaluate the effectiveness of such methods, culminating in an ICT level being awarded to all year 9 pupils in accordance with the ICT marking policy . In key stages 3 and 4 and at AS and A level, pupils are to be provided with opportunities where possible to make use of all forms of ICT which may assist in their learning and presentation of science."
function createsound(name$,soundnumber,frequency#,length#,loudness#,bend#,decay#,vibratospeed#,vibratodepth#,tremelospeed#,tremelodepth#)
outWord as word
dword1 as dword: dword2 as dword: dword3 as dword: dword4 as dword
dword5 as dword: dword6 as dword: dword7 as dword
samples=int((length#/1000)*44100)
if memblock exist(1) then delete memblock 1
make memblock 1,samples*2+28
` write 28 memblock header bytes
dword1=1 ` gg query: is this the number of channels?
dword2=2 ` gg query: is this the number of bytes per sample?
dword3=22050 ` gg query: seems to be half the number of samples per second - why?
dword4=88200 ` gg query: is this the number of bytes per second?
dword5=4 ` gg query: what does this represent?
dword6=16 ` gg query: (ditto) ?
dword7=0 ` gg query: (ditto) ?
position=0
write memblock dword 1, position, dword1 : inc position,4
write memblock dword 1, position, dword2 : inc position,4
write memblock dword 1, position, dword3 : inc position,4
write memblock dword 1, position, dword4 : inc position,4
write memblock dword 1, position, dword5 : inc position,4
write memblock dword 1, position, dword6 : inc position,4
write memblock dword 1, position, dword7 : inc position,4
rem generate and write wave
for x=1 to samples
outInteger=int(sin((x/122.5)*(frequency#+vibratodepth#*sin(theta#)))*(loudness#+tremelodepth#*sin(phi#)))*3.0
if outInteger <-32767 then outInteger=-32767 ` gg query: is this the valid range?
if outInteger>32767 then outInteger=32767 ` gg query: (ditto) ?
outWord=outInteger
inc theta#,vibratospeed#
inc phi#,tremelospeed#
dec frequency#,bend#
if loudness#>0 then dec loudness#,decay#
write memblock word 1, position, outWord : inc position,2
next x
make sound from memblock 999, 1 ` assumes you won't need sound number 999!
clone sound soundnumber, 999
delete sound 999
` memblock no longer required
delete memblock 1
endfunction
Rules are slightly different, but still very obvious - you type like hell before the word reaches the bottom of the screen. If you don't make it, they pile up tetris style. The screen will clear, though, for every 10 correct words you type.
I improved the 'typing engine' (
) to prevent keypresses being missed when another key is depressed, and to prevent keypresses getting registered more than once. Also added sound!
Any suggestions for improvement, or bugs, please let me know.