CP - Alien Breed Remake - 7

Miscellaneous Forums/Blitz Showcase/CP - Alien Breed Remake - 7

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

I'm really sorry guys, I've been incredibly busy. I've added player inventories. Don't forget to include it as inventory.bb. It's a start... you can move around and select certain items.

Whenever you pick up an item, use: InvItem_Create(name$,weight,p.player,image,frame)
to add it to a player's inventory. You can specify an image and frame to be drawn.

Players have backpack sizes. Items have sizes as well.

; inventory
Const INVITEM_WIDTH = 70

Type invItem
	Field owner.player
	Field name$,weight
	Field x,y,image,imageFrame
End Type


Function useInventoryItem(p.player,i.invItem)
End Function


Function InvItem_Create(name$,weight,p.player,image,frame)
	i.invitem=New invItem
	i\name=name
	i\weight=weight	
	i\image=image
	i\imageFrame=frame
	addInvItem(p,i)		
End Function

Function setPlayerInvLevels(p.player,maxWeight)
	p\maxWeight=maxWeight
	p\weight=0
	p\itemsCarrying=0	
	p\showingInv=0
	p\overWait=MilliSecs()
End Function

Function showInventory(p.player)
	p\showingInv=1-p\showingInv
End Function

Function UpdateInventories(p.player)
	; this handles the controls
	If p=First player
		max=(GraphicsWidth()/2)-10
	Else
		max=(GraphicsWidth())
	EndIf
	
	If (MilliSecs()-p\overWait) > 200
		If control(pright,p\id)
			p\over=p\over+1
			p\overWait=MilliSecs()
			
		ElseIf control(pleft,p\id)
			p\over=p\over-1
			p\overWait=MilliSecs()
		EndIf	
	EndIf
	If p\over<0 Then p\over=p\itemsCarrying-1
	If p\over>p\itemsCarrying-1 Then p\over=0
End Function

Function addInvItem(p.player,item.invItem)
	If p=Null Then Return
	
	If item= Null Then
		DebugLog "Inv Item is NULL"
		Return		
	EndIf
	
	If p\weight+item\weight <= p\maxWeight
		; pickup
		item\owner=p
		p\inv[p\itemsCarrying]=item
		p\weight=p\weight+item\weight
		p\itemsCarrying=p\itemsCarrying+1
		refreshInvItems()	
	Else
		DebugLog "Cannot pick up "+item\name+". It's too heavy"
		Return
	EndIf	
End Function

Function refreshInvItems()

	For p.player=Each player
		If p = First player
			min=5
			x=min
			max=(GraphicsWidth()/2)-10
		Else
			min=(GraphicsWidth()/2)+10
			x=min
			max=(GraphicsWidth())
		EndIf
	
		y=10
		If p\itemsCarrying>0
			For i=0 To p\itemsCarrying-1
				inv.invItem=p\inv[i]
				If inv<>Null								
					If x > max-INVITEM_WIDTH
						x=min
						y=y+INVITEM_WIDTH
					EndIf
					inv\x=x
					inv\y=y	
					x=x+INVITEM_WIDTH
				EndIf
			Next
		EndIf
	Next
End Function

Function drawInvItems(p.player)
	If p\showingInv=0 Then Return
	
	If p=First player
		max=(GraphicsWidth()/2)-10
		; player one
		Color 150,150,150:Rect 0,0,max,GraphicsHeight()
		Color 200,200,200:Rect max,0,1,GraphicsHeight()
		btext 10,GraphicsHeight()-10,p\weight+" / "+p\maxWeight
	Else
		max=(GraphicsWidth()/2)-10
		Color 150,150,150:Rect max,0,GraphicsWidth()/2,GraphicsHeight()
		Color 200,200,200:Rect max,0,GraphicsWidth()/2,GraphicsHeight()
		btext (GraphicsWidth()/2)+10,GraphicsHeight()-10,p\weight+" / "+p\maxWeight
	EndIf

	If p\itemsCarrying>0
		For i=0 To p\itemsCarrying-1
			inv.invItem=p\inv[i]
			If inv<>Null
				If inv\image<>0
					DrawImage inv\image,inv\x,inv\y,inv\imageFrame
				EndIf
				Color 255,255,255
				Rect inv\x,inv\y,INVITEM_WIDTH,INVITEM_WIDTH,0
				Color 0,0,0
				bText inv\x+INVITEM_WIDTH/2,inv\y+INVITEM_WIDTH/2,inv\name,1,1
				If i=p\over
					Color 255,0,0
					Rect inv\x,inv\y,INVITEM_WIDTH,INVITEM_WIDTH,0
				EndIf
			EndIf
		Next
	EndIf	
End Function


And to see it in action I'm using the action button to open/close it.

Add this to the start of the player_create function as it'll set the player's backpack size and add some temporary objects. The size could be set using the readItem functions.
	setPlayerInvLevels(pl,500)
	For i=1 To 5
		InvItem_Create("A_"+i,"50",First player,0,0)		
	Next

Change this in player.bb->Player_UpdateAll() function.
	If control(paction,pl\id) Then showInventory(pl)

	If pl\showingInv=0

		; get input
		If control(pright,pl\id) And pl\x<7552 Then mr=True
		If control(pleft,pl\id) And pl\x>0 Then ml=True
		If control(pup,pl\id) And pl\y>0 Then mu=True
		If control(pdown,pl\id) And pl\y<7552 Then md=True
			
		; weapons (player specific)
		If control(p_weapon1,pl\id) Then EquipWeapon(pl\id,getWeaponFromName("Machine Gun"))
		If control(p_weapon2,pl\id) Then EquipWeapon(pl\id,getWeaponFromName("Shot Gun"))
		If control(p_weapon3,pl\id) Then EquipWeapon(pl\id,getWeaponFromName("Flame Thrower"))
		If control(p_weapon4,pl\id) Then EquipWeapon(pl\id,getWeaponFromName("Grenade Launcher"))
		If control(p_weapon5,pl\id) Then EquipWeapon(pl\id,getWeaponFromName(weaponStyrling))
		If control(p_weapon6,pl\id) Then EquipWeapon(pl\id,getWeaponFromName(weaponImpact))
		
		If control(pAction,pl\id) Then runActionScript(pl) ; action key
					
		If control(pfire1,pl\id)
			fireWeapon(pl,pl\dir*22.5)
			firing = True		
		EndIf
	Else
		UpdateInventories(pl)
	EndIf


By the way, nice new weapon graphics, rob. very nice.