Hello everyone... I was just curious if anyone had a more efficient and equally as quick of a way to do an inventory system for my online rpg. My biggest concern is the ability to add special attributes. I sorta have that covered with the effects of each item... 5 effects, with separate values. The problem lies with the sheer number of them. In order to have a lot of unique weapons for example, I need slots. I have increase the memory allocation from $FFFF to higher and code some sort of automated indexing app to make and balance weapons. The problem is that it kinda limits the number and uniqueness of them. Any help is greatly appreciated.
; * note, icons and drawing were removed to make
; this executable without 5mb of images haha ;)
Type item
Field index%
Field name$
Field item_type%
Field icon_image
Field model_index%
Field texture_index%
Field rarity%
Field cost%
Field REQ_LVL%
Field REQ_RACE%
Field REQ_STR%
Field REQ_AGL%
Field REQ_INT%
Field Hides_hair
Field Hides_legs
Field Weapon_class
Field Base_DMG
Field Max_DMG
Field Range
Field Speed
Field Armor_class
Field Base_Def
Field effect1%
Field effect1_var%
Field effect2%
Field effect2_var%
Field effect3%
Field effect3_var%
Field effect4%
Field effect4_var%
Field effect5%
Field effect5_var%
End Type
Dim item_index($FFFF)
Type inventory
Field name$
Field row
Field col
Field index%
Field window_x%
Field window_y%
Field active
Field tot_rows%
Field tot_cols%
End Type
Global mouse_has_item=False
Global mouse_grab_item=0
Global inv_picked_name$=""
Global inv_picked_row%=""
Global inv_picked_col%=""
Global inventory_window_open=-1
; ##########################################
;
; Erase this non-important carp
;
; ##########################################
Graphics3D 800,600,32,2
Global cube=CreateCube()
Global camera=CreateCamera()
Global light=CreateLight()
RotateEntity light,45,0,0
PositionEntity cube,0,0,5
;load_icons()
Temp_Setup()
While KeyDown(1)=False
time=MilliSecs()
RenderWorld()
test_carp()
If inventory_window_open=True Then Display_Inventory("My Inventory")
If inventory_window_open=True Then Display_Inventory("Chest Inventory")
If KeyHit(23)=True Then inventory_window_open=inventory_window_open * -1
Do_mouse()
ctime=MilliSecs() - time
Text 0,0,ctime
Flip
Wend
Function test_carp()
TurnEntity cube,0.5,0.5,0.5
End Function
Function Temp_setup()
For Makeshit=0 To $FFFF
A.item=New item
a\index%=makeshit
a\name$="Item #" + Makeshit
item_index(makeshit) = Handle(a)
If makeshit > 0 Then a\icon_image=Rand(0,$FF) Else A\icon_image=0
Next
; For randomizer =1 To $FFFF
; get$= item_name$(Rand(1,$FFFF))
; Next
new_inventory("My Inventory",4,5,15,100)
new_inventory("Chest Inventory",2,2,400,250)
add_inventory("My Inventory",1,1,$0013)
add_inventory("My Inventory",1,4,$0022)
add_inventory("My Inventory",2,1,$FFFF)
End Function
; ##########################################
;
; Client Interaction
;
; ##########################################
Function Do_mouse()
Local Mx=MouseX()
Local My=MouseY()
If inventory_window_open=True Then
Item% = mouse_over_item("index")
If item% <> 0 And mouse_has_item=False Then show_item_details(item%)
If mouse_in_use=False Then
If MouseHit(1)=True Then
in_row%=mouse_over_item("row")
in_col%=mouse_over_item("col")
in_inventory$=Str$(mouse_over_item("inventory"))
If mouse_has_item=False Then
; mouse_in_use=True
Text 10,550,"Item selected:" + item_name(item%)
DebugLog in_inventory$ + ", " + in_row% + ", " + in_col%
If mouse_over_item("index") > 0 Then
freeze_inventory(in_inventory$,in_row%,in_col%)
mouse_has_item=True
mouse_grab_item=mouse_over_item("index")
inv_picked_name$=in_inventory$
inv_picked_row%=in_row%
inv_picked_col%=in_col%
DebugLog "Mouse has item? " + mouse_has_item + " and item is: " + mouse_grab_item
End If
Else
If mouse_over_item("index") = 0 Then
add_inventory(in_inventory$,in_row%,in_col%,mouse_grab_item)
mouse_has_item=False
remove_inventory(inv_picked_name$,inv_picked_row%,inv_picked_col%)
inv_picked_name$=""
inv_picked_row%=""
inv_picked_col%=""
End If
End If
End If
If MouseHit(2)=True Then
mouse_in_use=True
in_row%=mouse_over_item("row")
in_col%=mouse_over_item("col")
in_inventory$=Str$(mouse_over_item("inventory"))
DebugLog in_inventory$ + ", " + in_row% + ", " + in_col%
remove_inventory(in_inventory$,in_row%,in_col%)
End If
mouse_in_use=False
End If
If mouse_has_item=True And mouse_grab_item > 0 Then
Color 255,255,0
Rect Mx,My,50,50,1
; DrawImage icon(item_icon(mouse_grab_item)),Mx,My
End If
End If
End Function
Function show_item_details(index%)
Local Mx=MouseX()
Local My=MouseY()
Local I.item
I = Object.item( item_index(index%) )
Color 50,50,50
Rect Mx,My,200,75,1
Color 255,255,255
Text Mx + 5, My + 5, "Item name: " + I\name$
Color 190,190,190
Text Mx + 5, My + 15, "Item index: " + I\index%
Text Mx + 5, My + 25, "Item type: " + I\item_type%
Text Mx + 5, My + 35, "Sell Value: " + I\cost%
End Function
Function mouse_over_item$(Need$)
Local mx=MouseX()
Local my=MouseY()
For I.inventory=Each inventory
IX = I\row * 50 - 50 + I\window_X
IY = I\col * 50 - 50 + I\window_Y
If Mx > IX And Mx < IX + 50 And My > IY And My < IY + 50 Then
Color 255,0,0
Rect IX,IY,50,50,1
If Need$="index" Then Return I\index
If Need$="row" Then Return I\row
If Need$="col" Then Return I\col
If Need$="inventory" Then Return I\name$
End If
Next
End Function
Function remove_inventory(Name$,row%,col%)
For I.inventory=Each inventory
If I\name$ = Name$ And I\row%=row% And I\col%=col% Then
I\index%=0
End If
Next
End Function
Function add_inventory(Name$,row%,col%,index%)
For I.inventory=Each inventory
If I\name$ = Name$ And I\row%=row% And I\col%=col% Then
I\index%=index%
I\row%=row%
I\col%=col%
I\name$=Name$
End If
Next
End Function
Function freeze_inventory(Name$,row%,col%)
For I.inventory=Each inventory
If I\name$ = Name$ And I\row%=row% And I\col%=col%
I\active = True
End If
Next
End Function
Function Display_Inventory(name$)
For I.inventory=Each inventory
If I\Name$ = name$ Then
Color 0,255,255
Rect I\window_x% + I\row * 50 - 50,I\window_y% + I\col * 50 - 50,50,50,1
; DrawImage icon(item_icon(I\index%)),I\window_x% + I\row * 50 - 50,I\window_y% + I\col * 50 - 50
End If
Next
End Function
Function new_inventory(name$,across%,down%,winx%,winy%)
For rows%=1 To across%
For cols% = 1 To down%
I.inventory = New Inventory
I\name$=name$
I\row=rows%
I\col=cols%
I\index$=0;Rand($00,$FFFF)
I\window_x% = winx%
I\window_y% = winy%
I\Tot_rows% = across%
I\Tot_cols% = down%
Next
Next
End Function
Function item_icon(index%)
Local I.item
I = Object.item( item_index(index%) )
Return I\icon_image%
End Function
Function icon(index%)
; Local I.icon
; I = Object.icon( icon_index(index%) )
; Return I\image
End Function
Function item_name$(index%)
Local I.item
I = Object.item( item_index(index%) )
Return I\name$
End Function
|