Login Register
Frontpage Code library Pastebin

Yksinkertaisen inventoryn hallinta

Author: aXu
Added: 27. kesäkuuta 2012 kello 18.16
Edited: 27. kesäkuuta 2012 kello 19.01
Category: Sekalaiset

Description

Tässä yksinkertaiset funktiot inventoryn hallintaan. Tämä on lähinnä rungoksi, tästä puuttuu mm. tavaroiden valitseminen ja järjestäminen. Inventoryn tulostusfunktio todennäköisesti kannattaa kuitenkin tehdä joka pelille erikseen, että tulee oikeannäköinen. Lista funktioista ja niiden käytöstä: AddItem(ItemName [, Count, AllowZero, AllowNegative]) -Lisää tai vähentää tavaraa inventorysta. Jos Count on negatiivinen, tavaraa vähennetään. Oletuksena lisää yhden tavaran. -AllowZero määrää, voiko inventory sisältää tavaraa nolla kappaletta. Jos AllowZero on asetettu epätodeksi, tavara tuhotaan inventorysta sen loppuessa -AllowNegative määrää, voiko tavaraa olla vähempää kuin nolla. Jos AllowNegative on asetettu epätodeksi (False), funktio palauttaa -1 jos tavara loppui kesken ItemCount(ItemName) -Palauttaa haetun tavaran määrän DrawInventory([X, Y, Height, Scroll, RowHeight]) -Tulostaa inventoryn sisällön annettuihin koordinaatteihin. Oletuksena inventory piirretään koko ikkunalle. -Scroll määrää ensimmäisen tavaran järjestysnumeron. Oletuksena lista näytetään ensimmäisestä tavarasta lähtien. -RowHeight määrää rivinkorkeuden. SaveInventory([FileName]) -Tallentaa inventoryn, oletuksena "Inventory.dat"-nimiseen tiedostoon. LoadInventory([FileName]) -Lataa inventoryn, oletuksena "Inventory.dat"-tiedostosta.

Code

Select all
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
SAFEEXIT OFF
AddItem("Gold", 1000)

Repeat
	Scroll = Max(0, Scroll - MouseMoveZ())
	
	If KeyHit(cbKey1) Then
		AddItem("Gold", -300, True, True)
		AddItem("Potion")
	EndIf
	If KeyHit(cbKey2) Then
		AddItem("Potion", -1)
	EndIf
	If KeyHit(cbKey3) Then
		AddItem("Gold", Rand(-500, -200), True, True)
		AddItem("Letter " + Chr(Rand(65, 90)))
	EndIf
	
	If KeyHit(cbKeyS) Then SaveInventory()
	If KeyHit(cbKeyL) Then LoadInventory()
	
	Text 1, 1, "Press 1 to buy potion for 300G, 2 to drink potion."
	Text 1, 15, "Press 3 to buy random letter at random price."
	If ItemCount("Gold") <= 0 Then
		Text 1, 30, "You have no money, but shopkeeper gives you credit."
	EndIf
	
	DrawInventory(10, 50, 200, Scroll)
	Box 9, 49, 380, 200, 0
	
	Text 1, 280, "Press S to save inventory, L to load." 
	DrawScreen
Until EscapeKey()
//Poistetaan tallennustiedosto, tämä on vain esimerkkiä varten ettei jää ylimääräisiä tiedostoja lojumaan, tietenkään varsinaisessa pelissä moista ei tehdä
If FileExists("Inventory.dat") Then DeleteFile "Inventory.dat"
End


//Tästä alkaa varsinainen inventoryn hallintaosuus:
Type InventoryItem
	Field Name$
	Field Count
EndType


//Lisää tai vähentää tavaraa inventorysta. Jos Count on negatiivinen, tavaraa vähennetään. Oletuksena lisää yhden tavaran.
//AllowZero määrää, voiko inventory sisältää tavaraa nolla kappaletta. Jos AllowZero on asetettu epätodeksi, tavara tuhotaan inventorysta sen loppuessa
//AllowNegative määrää, voiko tavaraa olla vähempää kuin nolla. Jos AllowNegative on asetettu epätodeksi (False), funktio palauttaa -1 jos tavara loppui kesken
Function AddItem(ItemName$, Count = 1, AllowZero = 0, AllowNegative = 0)
	//Käydään tavarat läpi ja tutkitaan, löytyykö tavaraa valmiiksi inventorysta
	For iI.InventoryItem = Each InventoryItem
		If iI\Name = ItemName Then
			//Merkataan tavara löytyneeksi
			ItemExists = True
			
			//Lisätään tavaran määrää
			iI\Count = iI\Count + Count
			
			//Jos saldo menee miinukselle ja sitä ei ole sallittu, asetetaan määrä nollaksi ja palautusarvo -1:ksi
			If iI\Count < 0 And AllowNegative = False Then
				iI\Count = 0
				//Asetetaan palautusarvoksi -1
				RetVal = -1
			EndIf
			
			If iI\Count = 0 And AllowZero = False Then
				//Jos tavara loppuu, tuhotaan se inventorysta
				Delete iI
			EndIf
			
			//Ei jatketa etsintää
			Exit
		EndIf
	Next iI
	
	//Jos tavaraa ei löytynyt inventorysta, luodaan se
	If ItemExists = False Then
		//Jos olematonta tavaraa yritetään vähentää ja sitä ei ole olemassa, ei vähennetä
		If Count < 0 And AllowNegative = False Then
			Count = 0
			//Asetetaan palautusarvoksi -1
			RetVal = -1
		EndIf
		
		//Tavaraa ei luoda, jos sitä on nolla kpl ja sitä ei ole sallittu
		If Not (Count = 0 And AllowZero = False) Then
			nI.InventoryItem = New(InventoryItem)
			nI\Name = ItemName
			nI\Count = Count
		EndIf
	EndIf
	
	Return RetVal
EndFunction

//Palauttaa haetun tavaran määrän
Function ItemCount(ItemName$)
	//Etsitään inventorysta tavaraa nimeltä ja palautetaan sen määrä
	For iI.InventoryItem = Each InventoryItem
		If iI\Name = ItemName Then Return iI\Count
	Next iI
	//Jos tavaraa ei löytynyt, palautetaan nolla
	Return 0
EndFunction

//Tulostaa inventoryn sisällön annettuihin koordinaatteihin. Oletuksena inventory piirretään koko ikkunalle.
//Scroll määrää ensimmäisen tavaran järjestysnumeron. Oletuksena lista näytetään ensimmäisestä tavarasta lähtien.
//RowHeight määrää rivinkorkeuden.
Function DrawInventory(X = 0, Y = 0, Height = 0, Scroll = 0, RowHeight = 0)
	//Jos korkeutta ei ole määritetty, tulostetaan ruudun alalaitaan saakka
	If Height = 0 Then Height = ScreenHeight() - Y

	//Jos rivinkorkeutta ei olla kerrottu, asetetaan se tekstin korkeudeksi
	If RowHeight = 0 Then RowHeight = TextHeight("A")
	
	//Tulostetaan listaa vain niin paljon kuin mahtuu ruudulle
	ItemsToShow = RoundDown(Float(Height) / RowHeight)
	
	ItemNo = 1
	For iI.InventoryItem = Each InventoryItem
		If ItemNo > Scroll Then
			Text X, Y + (ItemNo - Scroll - 1) * RowHeight, iI\Count + "x " + iI\Name
		EndIf
		
		ItemNo = ItemNo + 1
		If ItemNo > Scroll + ItemsToShow Then Exit
	Next iI
EndFunction

//Tallentaa inventoryn, oletuksena "Inventory.dat"-nimiseen tiedostoon.
Function SaveInventory(FileName$ = "Inventory.dat")
	//Tallennetaan inventoryn sisältö tiedostoon
	f = OpenToWrite(FileName)
		//Käydään läpi jokainen tavara ja kirjoitetaan se tiedostoon
		For iI.InventoryItem = Each InventoryItem
			WriteString f, iI\Name
			WriteInt f, iI\Count
		Next iI
	CloseFile f
EndFunction

//Lataa inventoryn, oletuksena "Inventory.dat"-tiedostosta.
Function LoadInventory(FileName$ = "Inventory.dat")
	//Tyhjennetään ensin inventory, ettei tavaroita voida kloonata lataamalla peli
	For iI.InventoryItem = Each InventoryItem
		Delete iI
	Next iI
	
	If FileExists(FileName) Then
		//Luetaan inventoryn sisältö tiedostosta
		f = OpenToRead(FileName)
			While Not EOF(f)
				nI.InventoryItem = New(InventoryItem)
				nI\Name = ReadString(f)
				nI\Count = ReadInt(f)
			Wend
		CloseFile f
	EndIf
EndFunction

Comments

No comments. You can be first!

Leave a comment

You must be logged in to comment.