1- import { getGameState , setGameState } from './utils/gameState' ;
1+ import { getGameState , saveGameState , setGameState } from './utils/gameState' ;
22import { k } from './kplayCtx' ;
3-
3+ import { updateEnergyUI } from './utils/energyUpdate' ;
44const backpackBtn = document . getElementById ( 'backpack-btn' ) ;
55
66let isOpened = false ;
7+ let selectedItem = null ;
8+
9+ function consumeInteraction ( energyQty ) {
10+ const gameState = getGameState ( ) ;
11+ gameState . player . energy += energyQty ;
12+ setGameState ( gameState ) ;
13+ updateEnergyUI ( gameState . player . energy ) ;
14+ }
15+
16+ const itemsMap = {
17+ banana : ( ) => consumeInteraction ( 10 ) ,
18+ } ;
719
820export class Backpack {
9- constructor ( state , maxSlots = 20 ) {
21+ constructor ( maxSlots = 20 ) {
1022 this . maxSlots = maxSlots ;
11- this . inventory = state ;
23+ }
24+
25+ get inventory ( ) {
26+ const gameState = getGameState ( ) ;
27+ return gameState . player . backpack . items ;
1228 }
1329
1430 getInventorySlotHtml ( item ) {
15- return `<div class="inventory-slot">
31+ return `<div class="inventory-slot ${ selectedItem === item . itemName ? 'selected' : '' } " data-id=" ${ item . itemName } ">
1632 <img src="${ item . assetUrl } " with="100%" alt="" />
1733 <span class="quantity-badge">${ item . qty || 1 } </span>
1834 <div class="tooltip">${ item . itemName } ×${ item . qty || 1 } </div>
@@ -54,11 +70,57 @@ export class Backpack {
5470 ) ;
5571 }
5672 }
73+ this . saveInventoryState ( this . inventory ) ;
74+ }
75+
76+ saveInventoryState ( ) {
5777 const newState = getGameState ( ) ;
5878 newState . player . backpack . items = this . inventory ;
5979 setGameState ( newState ) ;
6080 }
6181
82+ selectItem ( slotEl ) {
83+ const itemId = slotEl . getAttribute ( 'data-id' ) ;
84+ selectedItem = itemId ;
85+ // deselect others
86+ const slots = document . querySelectorAll (
87+ '#backpack-content .inventory-slot:not(.empty)'
88+ ) ;
89+ slots . forEach ( ( item ) => {
90+ item . classList . remove ( 'selected' ) ;
91+ } ) ;
92+ //higlight selected item
93+ slotEl . classList . add ( 'selected' ) ;
94+ }
95+
96+ decreaseItemQty ( itemId ) {
97+ const ind = this . inventory . findIndex (
98+ ( item ) => item . itemName === itemId
99+ ) ;
100+
101+ if ( ind != - 1 ) {
102+ if ( this . inventory [ ind ] . qty >= 2 ) {
103+ -- this . inventory [ ind ] . qty ;
104+ } else {
105+ //remove item
106+ this . inventory . splice ( ind , 1 ) ;
107+ selectedItem = null ;
108+ }
109+ this . saveInventoryState ( ) ;
110+ this . render ( ) ;
111+ }
112+ }
113+
114+ useItem ( ) {
115+ if ( ! selectedItem ) return ;
116+ const action = itemsMap [ selectedItem ] ;
117+ action ?. ( ) ;
118+ // Decrease the qty
119+ this . decreaseItemQty ( selectedItem ) ;
120+ }
121+
122+ dropItem ( ) { }
123+
62124 render ( ) {
63125 const backpack = document . getElementById ( 'backpack-content' ) ;
64126 backpack . style . display = 'flex' ;
@@ -79,10 +141,7 @@ export class Backpack {
79141 static getInstance ( ) {
80142 const gameState = getGameState ( ) ;
81143 if ( gameState . player . backpack ) {
82- return new Backpack (
83- gameState . player . backpack . items ,
84- gameState . player . backpack . maxSlots
85- ) ;
144+ return new Backpack ( gameState . player . backpack . maxSlots ) ;
86145 }
87146 return false ;
88147 }
@@ -99,46 +158,72 @@ export class Backpack {
99158 items : [ ] ,
100159 maxSlots : 20 ,
101160 } ;
161+ saveGameState ( gameState ) ;
102162 }
103163
104- handleCloseBackpack ( ) {
105- if ( ! k . isFocused ( ) ) {
106- k . pressButton ( 'backpack' ) ;
107- k . canvas . focus ( ) ;
164+ handleDocumentKeypress ( e ) {
165+ if ( e . key == 'i' ) {
166+ //workaround for press backpack key if canvas lose the focus
167+ if ( ! k . isFocused ( ) ) {
168+ k . canvas . focus ( ) ;
169+ k . pressButton ( 'backpack' ) ;
170+ }
171+ } else if ( e . key == 'r' ) {
172+ this . useItem ( ) ;
108173 }
109174 }
110175
111176 openBackpack ( ) {
112177 this . render ( ) ;
113- document . addEventListener ( 'keypress' , this . handleCloseBackpack ) ;
114- const inventoryCloseBtn = document . getElementById (
115- 'inventory-close-btn'
178+ document . addEventListener (
179+ 'keypress' ,
180+ this . handleDocumentKeypress . bind ( this )
116181 ) ;
117- inventoryCloseBtn . addEventListener ( 'click' , this . handleCloseBackpack ) ;
118182 isOpened = true ;
119183 }
120184
121185 hideBackpack ( ) {
122186 this . hide ( ) ;
123- document . removeEventListener ( 'keypress' , this . handleCloseBackpack ) ;
124- const inventoryCloseBtn = document . getElementById (
125- 'inventory-close-btn'
126- ) ;
127- inventoryCloseBtn . removeEventListener (
128- 'click' ,
129- this . handleCloseBackpack
187+ document . removeEventListener (
188+ 'keypress' ,
189+ this . handleDocumentKeypress . bind ( this )
130190 ) ;
131191 isOpened = false ;
132192 }
133193
134194 static init ( ) {
135195 const instance = Backpack . getInstance ( ) ;
136196 if ( instance ) {
137- backpackBtn . style . display = 'block' ;
197+ Backpack . showButton ( ) ;
138198
139199 backpackBtn . addEventListener ( 'click' , ( ) => {
140200 instance . openBackpack ( ) ;
141201 } ) ;
202+
203+ const inventoryCloseBtn = document . getElementById (
204+ 'inventory-close-btn'
205+ ) ;
206+ const useItem = document . getElementById ( 'item-use-btn' ) ;
207+ const dropItem = document . getElementById ( 'item-drop-btn' ) ;
208+ inventoryCloseBtn . addEventListener (
209+ 'click' ,
210+ instance . hideBackpack . bind ( instance )
211+ ) ;
212+ useItem . addEventListener ( 'click' , instance . useItem . bind ( instance ) ) ;
213+ dropItem . addEventListener (
214+ 'click' ,
215+ instance . dropItem . bind ( instance )
216+ ) ;
217+
218+ document
219+ . getElementById ( 'backpack-content' )
220+ . addEventListener ( 'click' , ( e ) => {
221+ const slot = e . target . closest (
222+ '.inventory-slot:not(.empty)'
223+ ) ;
224+ if ( ! slot ) return ;
225+ instance . selectItem ( slot ) ;
226+ } ) ;
142227 }
143228 }
144229
@@ -157,11 +242,6 @@ export class Backpack {
157242
158243 static showButton ( ) {
159244 backpackBtn . style . display = 'block' ;
160-
161- const instance = Backpack . getInstance ( ) ;
162- backpackBtn . addEventListener ( 'click' , ( ) => {
163- instance . openBackpack ( ) ;
164- } ) ;
165245 }
166246
167247 static removeButton ( ) {
0 commit comments