RPG Game

Blitz3D Forums/Blitz3D Programming/RPG Game

Zach3D(Posted 2006) [#1]
Here is the actual game if you want to download:
http://www.freewebs.com/attotheriveronus/Game.zip
Right click the link and save link as

The code is:
AppTitle "Game Test"

Const width=900,height=700

Graphics3D width,height,32,2

Global T = LoadTerrain("Terrain.png")
Ttex = LoadTexture("TerrainTex.jpg")
Global Panel = LoadImage("Panel.png")
Global goldicon = LoadImage("goldicon.png")
Global poticon = LoadImage("poticon.png")
Global deathsound = LoadSound("death.wav")
Global losesound = LoadSound("lose.wav")
Global zapsound = LoadSound("zap.wav")
Global lvlupsound = LoadSound("lvlup.wav")
Global hitsound = LoadSound("hit.wav")
Global goldsound = LoadSound("gold.wav")
ScaleTexture Ttex,256,256
EntityTexture T,Ttex
ScaleEntity T,2,100,2
Sky = CreateSphere(44)
ScaleEntity Sky,700,700,700
FlipMesh Sky
EntityColor Sky,180,180,245

;Setup Camera
Global Camera = CreateCamera()
CameraViewport Camera,0,0,width,height
CameraRange Camera,1,9000


;======================================
;Setup Player
;======================================



Type Player
	Field model,hp,attack,maxhp,experience,nextlvl,lvl,maxattack,cooled,Current#,maxtime#
End Type

player.Player = New Player
player\lvl = 1
player\nextlvl = 100
player\experience = 0
player\model = CreateSphere(44)
EntityColor player\model,255,105,0

MoveEntity player\model,50,0,50
player\hp = 15
player\maxhp = 15
player\attack = 1
player\maxattack = 2
player\cooled = True
player\maxtime# = 3
player\current# = 3.0




;======================================
;Update Hostile
;======================================
Global IDLE,CONFRONT,DEAD,FLEE
IDLE = 1
CONFRONT = 2
DEAD = 3
FLEE = 4

Type Hostile
	Field model,hp,attack,attackrange,state,target.player,ox,oz,fleepivot,cooled,Current#,maxtime#
End Type

Function CreateHostile.hostile(spec,x,z)
		A.hostile = New hostile
		
		Select spec
			Case 1
				A\model = CreateSphere(22)
				A\hp = 5
				A\attack = 2
				A\attackrange = 20
				A\state = IDLE
				A\maxtime# = 5.0
				A\cooled = True
				A\current# = 0.0
		End Select
		
		A\ox = x
		A\oz = z
		A\fleepivot = CreatePivot()
		PositionEntity A\fleepivot,x,TerrainY(t,x,0,z),z
		PositionEntity A\model,x,0,z
		Return A
				
End Function

Function UpdateHostile()
	
	For A.hostile = Each hostile
		A\current# = A\current# + 0.1
		If A\maxtime# <= A\current#
			A\cooled = True
			A\current# = 0.0
		EndIf
		PositionEntity A\model,EntityX(A\model),3+TerrainY(T,EntityX(A\model),0,EntityZ(a\model)),EntityZ(A\model)
		If A\hp < 1
			A\state = DEAD
			For P.player = Each player
				P\experience = P\experience + 15
			Next
		EndIf
		Select A\state
			Case IDLE
				For P.player = Each player
					If EntityDistance(A\model,P\model) < A\attackrange And P\hp > 0
						A\target.player = P
						A\state = CONFRONT
					EndIf
				Next
			Case CONFRONT
				If EntityDistance(A\model,A\target\model) < 4
					If A\cooled = True
						A\target\hp = A\target\hp - A\attack
						A\cooled = False
					
							If A\target\hp < 1
								A\state = flee
							EndIf
					EndIf
				Else
					PointEntity A\model,A\target\model
					MoveEntity A\model,0,0,1
				EndIf
				
				If (Abs(EntityX(A\model) + EntityZ(A\model)- A\ox-A\oz)) > 120
					A\state = FLEE
				EndIf
			Case DEAD
				Display("Gray Ball has died.",500,35,255,0,0,5)
				PlaySound deathsound
				CreateItem(Rand(1,2),EntityX(A\model),EntityZ(A\model))
				FreeEntity A\model
				Delete A
			Case FLEE
				PointEntity A\model,A\fleepivot
				MoveEntity A\model,0,0,1
				
				If EntityDistance(A\model,A\fleepivot) < 3
					A\state = IDLE
				EndIf
		End Select
		

		
		
	Next
	
End Function
;======================================
;Setup Items
;======================================
Type Item
	Field model,increase$,amount,spec,used,name$,tooltip$,icon,inv
End Type

Function CreateItem.Item(spec,x,z)
	
	A.Item = New Item
	A\spec = spec
	A\used = False
	Select spec
		Case 1
			A\model = CreateCone()
			EntityColor A\model,255,0,0
			A\increase$ = "health"
			A\amount = 5
			A\icon = poticon
			A\name$ = "Potion I"
			A\tooltip$ = "Heals for 5 health."
		Case 2
			A\model = CreateCylinder()
			EntityColor A\model,205,160,0
			ScaleEntity A\model,1,.01,1
			RotateEntity A\model,90,0,0
			A\increase$ = "gold"
			A\amount = Rand(1,4)
			A\icon = goldicon			
			A\name$ = "Gold coins"
			A\tooltip$ = A\amount + " gold coins."
	End Select
	
	PositionEntity A\model,x,3+TerrainY(T,x,0,z),z
	EntityShininess A\model,1
	A\inv = False
	Return A
End Function

Function UpdateItem()
	
	For A.Item = Each Item
		If A\inv = False	
		For P.player = Each player
			If EntityDistance(P\model,A\model) < 2
				PickUpItem(A)
			EndIf
		Next
		
		EndIf
	Next
	.skip
End Function	

;======================================
Global RESETR = False
Global GOLD = 0
Global INVENTORYITEMS = 0
Dim inventory(9)
For A = 1 To 9
Inventory(A) = False
Next
SeedRnd MilliSecs()

.reset
CreateHostile(1,25,25)
CreateItem(1,50,25)
CreateItem(1,25,50)

For X = 1 To 25
	CreateHostile(1,65+Rand(0,200),65+(Rand(0,200)))
Next

;======================================
;======================================
;======================================
;======================================
;======================================
;======================================
;======================================

While Not KeyDown(1)
	
	Cls
	If RESETR = True
		RESETR = False
		Goto reset
	EndIf
	UpdateCamera(Camera,player\model)
	UpdateHostile()
	UpdateItem()
	UpdatePlayer()
	
	If MouseHit(1)
		DebugLog MouseX() + "," + MouseY()
	EndIf
	
	
	UpdateWorld
	RenderWorld
	UpdateText()
	
	Color 0,0,0
	Rect 495,32,150,15
	Color 100,100,100
	Rect 500,35,150,13
	
	Color 0,0,0
	Rect 24,24,102,7
	Color 255,0,0
	Rect 25,25,player\hp*(100.0/player\maxhp),5
	
	Text 25,10,"Health"
	Text 25,55,"Press A while next to an enemy (gray ball) to attack."
	Text 25,65,"The red cones restore health."
	DrawImage Panel,750,0
	UpdateInventory()
	Text 807,418,GOLD
	Color 0,0,0
	Rect 0,100,150,500
	Color 255,0,0
	Text 5,100,"        Level " + player\lvl
	Text 5,115,"HP: " + player\hp + "/" + player\maxhp
	Text 5,130,"Dmg: " + player\attack + " - " + player\maxattack
	Text 5,150,"Exp: " + player\experience + "/" + player\nextlvl
	
	Flip
Wend

End
;======================================
;======================================
;======================================
;======================================
;======================================
;======================================

Function UpdateCamera(cam,pID)

		If KeyDown(200)
			MoveEntity pID,0,0,0.45
		EndIf
		
		If KeyDown(203)
			TurnEntity pID,0,1,0
		EndIf
		
		If KeyDown(208)
			MoveEntity pID,0,0,-0.45
		EndIf
		
		If KeyDown(205)
			TurnEntity pID,0,-1,0
		EndIf
		
		PositionEntity pID,EntityX(pID),3+TerrainY(T,EntityX(pID),0,EntityZ(pID)),EntityZ(pID)
		PositionEntity cam,EntityX(pID),EntityY(pID),EntityZ(pID)
		RotateEntity cam,EntityRoll(pID),EntityYaw(pID),EntityPitch(pID)
		MoveEntity cam,0,8,-16

End Function
;================================================
;================================================
;================================================
Function UpdatePlayer()

	For P.player = Each player
		P\current# = P\current# + 0.1
		If P\maxtime# <= P\current#
			P\cooled = True
			P\current# = 0.0
		EndIf
		If P\hp > P\maxhp
			P\hp = P\maxhp
		EndIf
		
		If P\hp < 1
			For A.Item = Each Item
				If A\inv = False
				FreeEntity A\model
				EndIf
				Delete A
			Next
			For H.hostile = Each hostile
				FreeEntity H\model
				Delete H
			Next
			
			For I.icon = Each icon
				Delete I
			Next
			INVENTORYITEMS = 0
			RESETR = True
			Cls
			Flip
			Color 255,0,0
			Text 200,200,"You have died!"
			PlaySound losesound
			Flip
			Delay(500)
			Text 200,250,"Reloading the game.."
			Flip
			P\hp = P\maxhp
			PositionEntity P\model,50,0,50
			RotateEntity P\model,0,0,0
			Delay(2000)
		EndIf
		
		If KeyHit(30)
			For H.hostile = Each hostile
				If EntityDistance(H\model,P\model) < 5 And P\cooled = True
					PlaySound hitsound
					P\cooled = False
					H\hp = H\hp - Rand(P\attack,P\maxattack)
				EndIf
			Next
		EndIf
		If P\experience >= P\nextlvl
		
			LevelUpPlayer(P)
		EndIf
	Next
End Function

Function LevelUpPlayer(p.player)

	Display("Level up!.",500,35,255,0,0,5)
	PlaySound lvlupsound
	p\nextlvl = p\nextlvl + (30*p\lvl)
	p\maxhp = p\maxhp + (5*p\lvl)
	p\attack = p\attack + 1
	p\maxattack = p\maxattack + 1
	p\lvl = p\lvl + 1
	p\experience = 0

End Function

;================================================
;Text Display
;================================================


Type DisplayText
	Field x,y,r,g,b,tex$,current#,max#
End Type

Function Display.DisplayText(tex$,x,y,r,g,b,time#)
	
	Te.DisplayText = New DisplayText
	Te\x = x
	Te\y = y
	Te\r = r
	Te\g = g
	Te\b = b
	Te\current# = 0.0
	Te\max# = time#
	Te\tex$ = tex$
	Return Te
End Function


Function UpdateText()
	
	For Te.DisplayText = Each DisplayText
		Te\current# = Te\current# + .1
		R = ColorRed()
		G = ColorGreen()
		B = ColorBlue()
		Color Te\r,Te\g,Te\b
		Text Te\x,Te\y,Te\tex$
		Color R,G,B
		If Te\current# >= Te\max#
			Delete Te
		EndIf
	Next
	
End Function


;=================================================
;Inventory
;=================================================

Type icon
	Field I.item,slot,img,x,y,name$
End Type

Function MouseOverIcon(I.icon)
	If MouseX() > I\x And MouseY() > I\y
		If MouseX() < I\x + 50 And MouseY() < I\y + 50
			Return True
		Else
			Return False
		EndIf
	EndIf
End Function

Function UpdateInventory()


	
	
	For A.icon = Each icon
		DrawImage A\img,A\x,A\y
		If MouseOverIcon(A)
		Text 763,465,A\I\name$
		Text 763,480,A\I\tooltip$
	  EndIf
    Next	
	
	If MouseHit(1)
		For A.icon = Each icon
			If MouseOverIcon(A)
				UseItem(slot)
			EndIf
		Next
	EndIf
	
End Function


Function PickupItem(A.item)
	If INVENTORYITEMS < 9
		C.icon = New icon
		C\I = A
		C\I\inv = True
		FreeEntity C\I\model
		C\slot = INVENTORYITEMS + 1
		C\img = C\I\icon
		C\name$ = C\I\name$
		C\x = GetIconX(C\slot)
		C\y = GetIconY(C\slot)
		INVENTORYITEMS = INVENTORYITEMS + 1
	EndIf
End Function 

Function UseItem(slot)
For C.icon = Each icon
	If MouseOverIcon(C)
		Select C\name$
			Case "Gold coins"
				GOLD = GOLD + C\I\amount
			Case "Potion I"
				For P.player = Each player
						P\hp = P\hp + C\I\amount
				Next
		End Select
		
		Delete C\I
		Delete C
		INVENTORYITEMS = INVENTORYITEMS - 1
	EndIf
Next
				
End Function
		
		
		
Function GetIconX(slot)

Select Slot
	Case 1
		Return 759
	Case 2
		Return 813
	Case 3
		Return 864
	Case 4
		Return 759
	Case 5
		Return 811
	Case 6
		Return 863
	Case 7
		Return 758
	Case 8
		Return 809
	Case 9
		Return 858
End Select

End Function

Function GetIconY(slot)

Select Slot
	Case 1
		Return 549
	Case 2
		Return 549
	Case 3
		Return 549
	Case 4
		Return 599
	Case 5
		Return 599
	Case 6
		Return 599
	Case 7
		Return 649
	Case 8
		Return 649
	Case 9
		Return 649
End Select

End Function




My code is mostly functional right now.. but does anyone have any suggestions or have any changes I should make in the code, thanks.


Baystep Productions(Posted 2006) [#2]
Broken ZIP file.

I'd tell you but it doesn't work.


YellBellzDotCom(Posted 2006) [#3]
The download link opens this same page in a new winder. Please, please fix it. I have to check this puppy out.

Thanks!!


Zach3D(Posted 2006) [#4]
Ill fix it later.. i cant get it to work now


kevin8084(Posted 2006) [#5]
Just highlight the address, paste it into your address text field and go.


puki(Posted 2006) [#6]
Well, it is the beginning of a RPG game - keep it up.


Tranz(Posted 2006) [#7]
Worked fine for me, thanks for sharing!


YellBellzDotCom(Posted 2006) [#8]
Ok, I loved it, nice demo of a few of the requirements for any RPG. Great Job! and thanks for the Demo!