Ok here we go:
Rem Project: AI Challenge
Rem Created: 03/04/2005 14:52:41
Rem Best viewed in a 800x600 window
Rem Do I really need to tell you?
set window on : set window title "AI Challenge" : set window size 800,600
sync on : sync rate 0 : autocam off
Rem Constants for images made from memblocks, for the gui
#constant GUI_IMAGE_1 2
#constant GUI_IMAGE_2 3
#constant GUI_IMAGE_3 4
#constant GUI_IMAGE_4 5
#constant GUI_IMAGE_5 6
#constant GUI_IMAGE_6 7
#constant GUI_IMAGE_7 8
#constant GUI_IMAGE_8 9
#constant GUI_IMAGE_9 10
Rem Pet guis
#constant OB_PET 1000
#constant OB_PET_IMAGE 1
Rem Constants for the Gui
#constant GUI_WINDOW 1 : Rem Constant for a window..
#constant GUI_BUTTON 2 : Rem Is a button
#constant GUI_PROGRESS 3 : Rem A progress bar
Rem The UDT for the widgets
type widget_GUI
gui_draw as integer : Rem Draw it or not
gui_number as integer : Rem The number of sprites to start from, this is the main limitation
gui_title as string : Rem The widgets title or caption
gui_position_x as integer : Rem The x position
gui_position_y as integer : Rem ^ y
gui_width as integer : Rem The width...duh
gui_height as integer : Rem The height..ffs thats obvious
gui_type as integer : Rem The type, defined by constants
gui_action as integer : Rem If the widget is acting or not. So far only buttons act.
gui_parent as integer : Rem The widgets parent, where it belongs. 0 is the background.
gui_extra as string : Rem Anything else needed for the widget. Depends on type.
endtype
Rem The array using the above type
dim gui_widget(100) as widget_GUI
Rem Define the window data. The first few bits will be commented :|
gui_widget(1).gui_draw = 1
gui_widget(1).gui_number = 100
gui_widget(1).gui_title = "AI Challenge"
gui_widget(1).gui_position_x = 0
gui_widget(1).gui_position_y = 0
gui_widget(1).gui_width = 110
gui_widget(1).gui_height = 48
gui_widget(1).gui_type = GUI_WINDOW
gui_widget(1).gui_action = 0
gui_widget(1).gui_parent = 0
gui_widget(1).gui_extra = "STATIC" : Rem Means teh bastage trying to break my GUI cant (it can't be moved)..
gui_widget(2).gui_draw = 1
gui_widget(2).gui_number = 104
gui_widget(2).gui_title = "Exit"
gui_widget(2).gui_position_x = 4
gui_widget(2).gui_position_y = 4
gui_widget(2).gui_width = 102
gui_widget(2).gui_height = 21
gui_widget(2).gui_type = GUI_BUTTON
gui_widget(2).gui_action = 0
gui_widget(2).gui_parent = 1
gui_widget(2).gui_extra = "EXIT" : Rem The action is to quit
gui_widget(6).gui_draw = 1
gui_widget(6).gui_number = 200
gui_widget(6).gui_title = "Pet Data"
gui_widget(6).gui_position_x = 0
gui_widget(6).gui_position_y = 47
gui_widget(6).gui_width = 110
gui_widget(6).gui_height = 125
gui_widget(6).gui_type = GUI_WINDOW
gui_widget(6).gui_action = 0
gui_widget(6).gui_parent = 0
gui_widget(6).gui_extra = "STATIC"
gui_widget(7).gui_draw = 1
gui_widget(7).gui_number = 204
gui_widget(7).gui_title = "Health"
gui_widget(7).gui_position_x = 4
gui_widget(7).gui_position_y = 4
gui_widget(7).gui_width = 102
gui_widget(7).gui_height = 21
gui_widget(7).gui_type = GUI_PROGRESS
gui_widget(7).gui_action = 0
gui_widget(7).gui_parent = 6
gui_widget(7).gui_extra = str$(GUI_IMAGE_5) : Rem The background image it should use.
gui_widget(8).gui_draw = 1
gui_widget(8).gui_number = 208
gui_widget(8).gui_title = "Stanima"
gui_widget(8).gui_position_x = 4
gui_widget(8).gui_position_y = 29
gui_widget(8).gui_width = 102
gui_widget(8).gui_height = 21
gui_widget(8).gui_type = GUI_PROGRESS
gui_widget(8).gui_action = 0
gui_widget(8).gui_parent = 6
gui_widget(8).gui_extra = str$(GUI_IMAGE_6)
gui_widget(9).gui_draw = 1
gui_widget(9).gui_number = 212
gui_widget(9).gui_title = "Level [1]"
gui_widget(9).gui_position_x = 4
gui_widget(9).gui_position_y = 54
gui_widget(9).gui_width = 102
gui_widget(9).gui_height = 21
gui_widget(9).gui_type = GUI_PROGRESS
gui_widget(9).gui_action = 0
gui_widget(9).gui_parent = 6
gui_widget(9).gui_extra = str$(GUI_IMAGE_8)
gui_widget(10).gui_draw = 1
gui_widget(10).gui_number = 216
gui_widget(10).gui_title = "Happiness"
gui_widget(10).gui_position_x = 4
gui_widget(10).gui_position_y = 79
gui_widget(10).gui_width = 102
gui_widget(10).gui_height = 21
gui_widget(10).gui_type = GUI_PROGRESS
gui_widget(10).gui_action = 0
gui_widget(10).gui_parent = 6
gui_widget(10).gui_extra = str$(GUI_IMAGE_9)
gui_widget(11).gui_draw = 1
gui_widget(11).gui_number = 300
gui_widget(11).gui_title = "Actions"
gui_widget(11).gui_position_x = 0
gui_widget(11).gui_position_y = 171
gui_widget(11).gui_width = 110
gui_widget(11).gui_height = 125
gui_widget(11).gui_type = GUI_WINDOW
gui_widget(11).gui_action = 0
gui_widget(11).gui_parent = 0
gui_widget(11).gui_extra = "STATIC"
gui_widget(12).gui_draw = 1
gui_widget(12).gui_number = 304
gui_widget(12).gui_title = "Add Food"
gui_widget(12).gui_position_x = 4
gui_widget(12).gui_position_y = 4
gui_widget(12).gui_width = 102
gui_widget(12).gui_height = 21
gui_widget(12).gui_type = GUI_BUTTON
gui_widget(12).gui_action = 0
gui_widget(12).gui_parent = 11
gui_widget(12).gui_extra = "FOOD"
Rem Define the type for the pet. I'm not going over this..
type petData
health as integer
stamina as integer
level as integer
level_exp as integer
happy as integer
x as integer
y as integer
endtype
Rem Data var
global pet_data as petData
pet_data.health = 500
pet_data.stamina = 100
pet_data.level = 1
pet_data.happy = 250
pet_data.x = 200
pet_data.y = 200
type fooodness
exists as integer
x as integer
y as integer
endtype
food as fooodness
Rem Globals for mouse positions, allows me to take them into functions, without being gay.
global mox : global moy
Rem For the AI
global loops2
Rem Create the images for the GUI
createGuiSprites()
Rem Environment set up:
backdrop on
color backdrop 0,rgb(70,122,175)
Rem pet set up:
sprite OB_PET,pet_data.x,pet_data.y,OB_PET_IMAGE
stretch sprite OB_PET,3500,3500
set sprite OB_PET,0,0
Rem Sync all this to screen and begin the loop.
sync
do
Rem Update the mouse position
mox = mousex() : moy = mousey()
Rem Print dt and the FPS to the screen.
set cursor 200,200 : ink rgb(255,255,255),0
print screen FPS();" ";pet_data.happy
Rem Control the pet
if loops=0
pet()
inc loops
else
loops=0
endif
Rem Handle the gui
handleGui()
Rem Draw him!
sprite OB_PET,pet_data.x,pet_data.y,OB_PET_IMAGE
set sprite OB_PET,0,0
Rem Sync and loop
sync
loop
Rem End. The short and sweet command..
end
REM --------------------------------------
REM GENERAL FUNCTIONS
REM --------------------------------------
function lose()
exit prompt "Next time round you better treat your poor, little, well-coloured, square pet better, otherwise it'll be a case of Mr Psycotic-Neofish on your back!!1","You lose!!!!!11onetwo!"
end
endfunction
REM --------------------------------------
REM AI FUNCTIONS
REM --------------------------------------
function pet()
Rem You lose if pet has no health
if pet_data.health = 0 then lose()
Rem Move it away if in the last 20 pixels of screen:
if pet_data.x > 760 then dec pet_data.x,5
if pet_data.x < 5 then inc pet_data.x,5
if pet_data.y < 5 then inc pet_data.y,5
if pet_data.y > 560 then dec pet_data.y,5
Rem Basic, non script control - makes pet tired as it struggles
if rightkey()=1
inc pet_data.x,5
forcedMovement()
endif
if leftkey()=1
dec pet_data.x,5
forcedMovement()
endif
if upkey()=1
dec pet_data.y,5
forcedMovement()
endif
if downkey()=1
inc pet_data.y,5
forcedMovement()
endif
Rem These things must happen less than other stuff
if loops2<>6 then inc loops2
select loops2
case 1:
Rem Inc the experience
if pet_data.happy > 250 then inc pet_data.level_exp
if spacekey()=1 then inc pet_data.happy,2
if pet_data.level_exp > (100 * pet_data.level)-1 or pet_data.happy > 499
Rem Give him level, reset exp, life and stamina
inc pet_data.level
pet_data.level_exp = 0
pet_data.health = 500
pet_data.stamina = 100
pet_data.happy = 200
Rem Change the level progress bar's caption, and delete the image so it updates
gui_widget(9).gui_title = "Level ["+str$(pet_data.level)+"]"
num = gui_widget(9).gui_number + 3
if image exist(num)=1 then delete image num
endif
endcase
case 3:
Rem Make his stamina go up if its down :)
if pet_data.stamina <> 100 then inc pet_data.stamina
endcase
case 6
Rem revert it so those pieces of gay go get to cycle more than once
loops2 = 0
endcase
endselect
endfunction
Rem Pet grows tired and gets hurt, teh poor thing.
function forcedMovement()
if pet_data.stamina <> 0 then dec pet_data.stamina
if pet_data.stamina = 0
if pet_data.health <> 0 then dec pet_data.health
if pet_data.happy <> 0 then dec pet_data.happy
if pet_data.health = 0 and pet_data.health > 1 then dec pet_data.health
endif
endfunction
Rem Adds food that the pet should run to :)
function addFood()
food.exists = 1
x = rnd (300)+200
y = rnd (200)+100
food.x = x
food.y = y
endfunction
REM --------------------------------------
REM GUI FUNCTIONS
REM --------------------------------------
Rem Loads the images for the sprites.
function createGuiSprites()
Remstart
Memblock images: 3 dwords and 4 bytes (for a 1 pixel image)
which makes 4x3 + 4 = 16
Remend
size = 16
Rem GUI_IMAGE_1 - Blue
make memblock GUI_IMAGE_1,size
write memblock dword GUI_IMAGE_1,0,1 : `width
write memblock dword GUI_IMAGE_1,4,1 : `height
write memblock dword GUI_IMAGE_1,8,32 : `depth
write memblock byte GUI_IMAGE_1,12,204 : `blue
write memblock byte GUI_IMAGE_1,13,102 : `green
write memblock byte GUI_IMAGE_1,14,0 : `red
write memblock byte GUI_IMAGE_1,15,255 : `alpha
make image from memblock GUI_IMAGE_1,GUI_IMAGE_1 : Rem Make the image
Rem GUI_IMAGE_2 - Grey
make memblock GUI_IMAGE_2,size
write memblock dword GUI_IMAGE_2,0,1 : `width
write memblock dword GUI_IMAGE_2,4,1 : `height
write memblock dword GUI_IMAGE_2,8,32 : `depth
write memblock byte GUI_IMAGE_2,12,221 : `blue
write memblock byte GUI_IMAGE_2,13,221 : `green
write memblock byte GUI_IMAGE_2,14,221 : `red
write memblock byte GUI_IMAGE_2,15,255 : `alpha
make image from memblock GUI_IMAGE_2,GUI_IMAGE_2
Rem GUI_IMAGE_3 - Black
make memblock GUI_IMAGE_3,size
write memblock dword GUI_IMAGE_3,0,1 : `width
write memblock dword GUI_IMAGE_3,4,1 : `height
write memblock dword GUI_IMAGE_3,8,32 : `depth
write memblock byte GUI_IMAGE_3,12,0 : `blue
write memblock byte GUI_IMAGE_3,13,0 : `green
write memblock byte GUI_IMAGE_3,14,0 : `red
write memblock byte GUI_IMAGE_3,15,255 : `alpha
make image from memblock GUI_IMAGE_3,GUI_IMAGE_3
Rem GUI_IMAGE_4 - Light Grey
make memblock GUI_IMAGE_4,size
write memblock dword GUI_IMAGE_4,0,1 : `width
write memblock dword GUI_IMAGE_4,4,1 : `height
write memblock dword GUI_IMAGE_4,8,32 : `depth
write memblock byte GUI_IMAGE_4,12,241 : `blue
write memblock byte GUI_IMAGE_4,13,241 : `green
write memblock byte GUI_IMAGE_4,14,241 : `red
write memblock byte GUI_IMAGE_4,15,255 : `alpha
make image from memblock GUI_IMAGE_4,GUI_IMAGE_4
Rem GUI_IMAGE_4 - Bright Red
make memblock GUI_IMAGE_5,size
write memblock dword GUI_IMAGE_5,0,1 : `width
write memblock dword GUI_IMAGE_5,4,1 : `height
write memblock dword GUI_IMAGE_5,8,32 : `depth
write memblock byte GUI_IMAGE_5,12,0 : `blue
write memblock byte GUI_IMAGE_5,13,0 : `green
write memblock byte GUI_IMAGE_5,14,240 : `red
write memblock byte GUI_IMAGE_5,15,255 : `alpha
make image from memblock GUI_IMAGE_5,GUI_IMAGE_5
Rem GUI_IMAGE_6 - Bright Blue
make memblock GUI_IMAGE_6,size
write memblock dword GUI_IMAGE_6,0,1 : `width
write memblock dword GUI_IMAGE_6,4,1 : `height
write memblock dword GUI_IMAGE_6,8,32 : `depth
write memblock byte GUI_IMAGE_6,12,240 : `blue
write memblock byte GUI_IMAGE_6,13,0 : `green
write memblock byte GUI_IMAGE_6,14,0 : `red
write memblock byte GUI_IMAGE_6,15,255 : `alpha
make image from memblock GUI_IMAGE_6,GUI_IMAGE_6
Rem GUI_IMAGE_7 - White
make memblock GUI_IMAGE_7,size
write memblock dword GUI_IMAGE_7,0,1 : `width
write memblock dword GUI_IMAGE_7,4,1 : `height
write memblock dword GUI_IMAGE_7,8,32 : `depth
write memblock byte GUI_IMAGE_7,12,255 : `blue
write memblock byte GUI_IMAGE_7,13,255 : `green
write memblock byte GUI_IMAGE_7,14,255 : `red
write memblock byte GUI_IMAGE_7,15,255 : `alpha
make image from memblock GUI_IMAGE_7,GUI_IMAGE_7
Rem GUI_IMAGE_8 - Bright Green
make memblock GUI_IMAGE_8,size
write memblock dword GUI_IMAGE_8,0,1 : `width
write memblock dword GUI_IMAGE_8,4,1 : `height
write memblock dword GUI_IMAGE_8,8,32 : `depth
write memblock byte GUI_IMAGE_8,12,0 : `blue
write memblock byte GUI_IMAGE_8,13,255 : `green
write memblock byte GUI_IMAGE_8,14,0 : `red
write memblock byte GUI_IMAGE_8,15,255 : `alpha
make image from memblock GUI_IMAGE_8,GUI_IMAGE_8
Rem GUI_IMAGE_9 - Bright Orange
make memblock GUI_IMAGE_9,size
write memblock dword GUI_IMAGE_9,0,1 : `width
write memblock dword GUI_IMAGE_9,4,1 : `height
write memblock dword GUI_IMAGE_9,8,32 : `depth
write memblock byte GUI_IMAGE_9,12,0 : `blue
write memblock byte GUI_IMAGE_9,13,255 : `green
write memblock byte GUI_IMAGE_9,14,255 : `red
write memblock byte GUI_IMAGE_9,15,255 : `alpha
make image from memblock GUI_IMAGE_9,GUI_IMAGE_9
Rem OB_PET_IMAGE - Black
make memblock OB_PET_IMAGE,size
write memblock dword OB_PET_IMAGE,0,1 : `width
write memblock dword OB_PET_IMAGE,4,1 : `height
write memblock dword OB_PET_IMAGE,8,32 : `depth
write memblock byte OB_PET_IMAGE,12,0 : `blue
write memblock byte OB_PET_IMAGE,13,0 : `green
write memblock byte OB_PET_IMAGE,14,0 : `red
write memblock byte OB_PET_IMAGE,15,255 : `alpha
make image from memblock OB_PET_IMAGE,OB_PET_IMAGE
endfunction
Rem Handle the gui...duh
function handleGui()
Rem Repeat through the array items, drawing them and making them act if necessary
a=1
repeat
if gui_widget(a).gui_draw = 1 then drawGui(a)
guiAction(a)
inc a
until a=array count(gui_widget(0))+1
endfunction
Rem Draw a window based on the info passed in. This will be tedious :'(
function drawGui(index as integer)
Rem Don't go be calling the array all the time (shorter names).
num = gui_widget(index).gui_number
title$ = gui_widget(index).gui_title
x = gui_widget(index).gui_position_x
y = gui_widget(index).gui_position_y
width = gui_widget(index).gui_width
height = gui_widget(index).gui_height
wtype = gui_widget(index).gui_type
parent = gui_widget(index).gui_parent
extra$ = gui_widget(index).gui_extra
Rem Select a case based on what it wants to draw (a pony!).
select wtype
case GUI_WINDOW
Rem If the image for the caption/title of the widget doesn't exist, create it.
if image exist(num+3)=0
Rem Set the text teh right
ink rgb(255,255,255),0 : set text opaque : set text font "verdana" : set text size 14
text x,y,title$ : set image colorkey 0,0,0
Rem Get the image
get image num+3,x,y,x+text width(title$),y+text height(title$),1
endif
Rem Make the black background sprite
sprite num,x,y,GUI_IMAGE_3
Rem Make it faster
set sprite num,0,0
Rem Stretch it to the right size
stretch sprite num,100*width,100*height
Rem Make the blue title sprite
sprite num+1,x+1,y+1,GUI_IMAGE_1
set sprite num+1,0,0
stretch sprite num+1,100*(width-2),1900
Rem Make the grey main bit sprite
sprite num+2,x+1,y+21,GUI_IMAGE_2
set sprite num+2,0,0
stretch sprite num+2,100*(width-2),100*(height-22)
Rem Make the title sprite
sprite num+3,x+4,y+4,num+3
set sprite num+3,0,1
endcase
case GUI_BUTTON
Rem I'm only going to comment bits that have changed!
if image exist(num+2)=0
ink rgb(10,10,10),0 : set text opaque : set text font "verdana" : set text size 14
text x,y,title$ : set image colorkey 0,0,0
get image num+2,x,y,x+text width(title$),y+text height(title$),1
endif
Rem Get teh parent positions, so the position is relative.
parent_x = gui_widget(parent).gui_position_x
parent_y = gui_widget(parent).gui_position_y + 20
x = x + parent_x
y = y + parent_y
Rem Rollover image
if (mox => x and mox <= x+width) and (moy => y and moy <= y+20)
image = GUI_IMAGE_7
else
image = GUI_IMAGE_4
endif
sprite num,x,y,GUI_IMAGE_3
set sprite num,0,0
stretch sprite num,100*width,100*height
sprite num+1,x+1,y+1,image
set sprite num+1,0,0
stretch sprite num+1,100*(width-2),100*(height-2)
sprite num+2,x+4,y+4,num+2
set sprite num+2,0,1
endcase
case GUI_PROGRESS
Rem This one is the hard one: progress bars
if image exist(num+3)=0
ink rgb(10,10,10),0 : set text opaque : set text font "verdana" : set text size 14
text x,y,title$ : set image colorkey 0,0,0
get image num+3,x,y,x+text width(title$),y+text height(title$),1
endif
parent_x = gui_widget(parent).gui_position_x
parent_y = gui_widget(parent).gui_position_y + 20
x = x + parent_x
y = y + parent_y
Rem Get the correct image for the particular bar and the right data
image = val(extra$)
select image
case GUI_IMAGE_5:
prog = pet_data.health / 5
endcase
case GUI_IMAGE_6:
prog = pet_data.stamina
endcase
case GUI_IMAGE_8:
prog = pet_data.level_exp / pet_data.level
endcase
case GUI_IMAGE_9:
prog = pet_data.happy / 5
endcase
endselect
sprite num,x,y,GUI_IMAGE_3
set sprite num,0,0
stretch sprite num,100*width,100*height
Rem Draw the coloured bar bit
sprite num+1,x+1,y+1,image
set sprite num+1,0,0
stretch sprite num+1,100*prog,100*(height-2)
Rem Draw the grey bar to fill the gap
sprite num+2,x+1+prog,y+1,GUI_IMAGE_2
set sprite num+2,0,0
stretch sprite num+2,100*(100-prog),100*(height-2)
sprite num+3,x+4,y+4,num+3
set sprite num+3,0,1
endcase
endselect
endfunction
Rem Run the widget actions.
function guiAction(index as integer)
Rem Load the widget data
x = gui_widget(index).gui_position_x
y = gui_widget(index).gui_position_y
width = gui_widget(index).gui_width
Rem if its a button find its actual position
if gui_widget(index).gui_type = GUI_BUTTON
parent = gui_widget(index).gui_parent
parent_x = gui_widget(parent).gui_position_x
parent_y = gui_widget(parent).gui_position_y + 20
x = x + parent_x
y = y + parent_y
endif
Rem Left clicking on the widget will activate it.
if (mox => x and mox <= x+width) and (moy => y and moy <= y+20) and mouseclick()=1
gui_widget(index).gui_action = 1
endif
Rem Run the button's action
if gui_widget(index).gui_action = 1 and gui_widget(index).gui_type = GUI_BUTTON
Rem Exit the piece of gay
if gui_widget(index).gui_extra = "EXIT" then end
Rem Reset the action
gui_widget(index).gui_action = 0
endif
endfunction
Rem Well I'm finished and off for a coffee. You're welcome to join me if you so wish, or just bask in the 133bness of this code O_o
I can't be bothered to make instructions for it as its incomplete
And you have to cheat by pressing the space bar because I was about to put food adding in (it doesn't work atm) and ai to get it...basically if you push him he dont like it and gets hurt
Also don't forget to admire my sarcastic, tired comments
Join the "C# is for programmers who are too stupid to use C++" club!