@@ -35,6 +35,7 @@ const GAME_ENGINE_ABI = [
3535 'function getScore(uint256) view returns (uint256)' ,
3636 'function hexCount(uint256) view returns (uint256)' ,
3737 'function getAgentHexKeys(uint256) view returns (bytes32[])' ,
38+ 'function getAllHexKeys() view returns (bytes32[])' ,
3839 'function getHex(bytes32) view returns (uint256 ownerId, uint256 locationId, int32 q, int32 r, uint256 mineCount, uint256 arsenalCount, uint256 lastHarvest, uint256 reserve, uint256 happiness, uint256 happinessUpdatedAt)' ,
3940 'function orePool(uint256) view returns (uint256)' ,
4041] ;
@@ -56,9 +57,7 @@ function parseBoardResult(raw: any): BoardState {
5657}
5758
5859export function useGameEngine ( ) {
59- const setAgents = useGameStore ( ( s ) => s . setAgents ) ;
60- const setLocations = useGameStore ( ( s ) => s . setLocations ) ;
61- const setHexes = useGameStore ( ( s ) => s . setHexes ) ;
60+ const setWorldData = useGameStore ( ( s ) => s . setWorldData ) ;
6261 const setAgentHexes = useGameStore ( ( s ) => s . setAgentHexes ) ;
6362 const setMemories = useGameStore ( ( s ) => s . setMemories ) ;
6463 const setLocationBoard = useGameStore ( ( s ) => s . setLocationBoard ) ;
@@ -131,35 +130,37 @@ export function useGameEngine() {
131130 const newAgents : Record < number , Agent > = { } ;
132131 for ( const agent of agentResults ) newAgents [ agent . id ] = agent ;
133132
134- // Fetch hex data per agent + boards in parallel
133+ // Fetch all hex data + boards in parallel
135134 const allHexes : Record < string , HexData > = { } ;
136135
137136 await Promise . all ( [
138- // Agent hex territories
139- Promise . all ( agentIds . map ( async ( aId : bigint ) => {
140- const id = Number ( aId ) ;
141- try {
142- const keys : string [ ] = await gameEngine . getAgentHexKeys ( id ) ;
143- const hexList : HexData [ ] = [ ] ;
144- for ( const k of keys ) {
145- const [ ownerId , locationId , q , r , mineCount , arsenalCount , lastHarvest , reserve , happiness , happinessUpdatedAt ] =
146- await gameEngine . getHex ( k ) ;
147- const hd : HexData = {
148- hexKey : k , ownerId : Number ( ownerId ) , locationId : Number ( locationId ) ,
149- q : Number ( q ) , r : Number ( r ) ,
150- mineCount : Number ( mineCount ) , arsenalCount : Number ( arsenalCount ) ,
151- lastHarvest : Number ( lastHarvest ) ,
152- reserve : Number ( reserve ) ,
153- happiness : Number ( happiness ) ,
154- usedSlots : Number ( mineCount ) + Number ( arsenalCount ) , totalSlots : 6 ,
155- defense : Number ( arsenalCount ) * 5 ,
156- } ;
157- hexList . push ( hd ) ;
158- allHexes [ k ] = hd ;
137+ // All hexes (global list — includes unowned/rebelled)
138+ ( async ( ) => {
139+ const keys : string [ ] = await gameEngine . getAllHexKeys ( ) ;
140+ const agentHexMap : Record < number , HexData [ ] > = { } ;
141+ await Promise . all ( keys . map ( async ( k : string ) => {
142+ const [ ownerId , locationId , q , r , mineCount , arsenalCount , lastHarvest , reserve , happiness , happinessUpdatedAt ] =
143+ await gameEngine . getHex ( k ) ;
144+ const hd : HexData = {
145+ hexKey : k , ownerId : Number ( ownerId ) , locationId : Number ( locationId ) ,
146+ q : Number ( q ) , r : Number ( r ) ,
147+ mineCount : Number ( mineCount ) , arsenalCount : Number ( arsenalCount ) ,
148+ lastHarvest : Number ( lastHarvest ) ,
149+ reserve : Number ( reserve ) ,
150+ happiness : Number ( happiness ) ,
151+ usedSlots : Number ( mineCount ) + Number ( arsenalCount ) , totalSlots : 6 ,
152+ defense : Number ( arsenalCount ) * 5 ,
153+ } ;
154+ allHexes [ k ] = hd ;
155+ if ( hd . ownerId > 0 ) {
156+ if ( ! agentHexMap [ hd . ownerId ] ) agentHexMap [ hd . ownerId ] = [ ] ;
157+ agentHexMap [ hd . ownerId ] . push ( hd ) ;
159158 }
160- setAgentHexes ( id , hexList ) ;
161- } catch { /* agent may have 0 hexes */ }
162- } ) ) ,
159+ } ) ) ;
160+ for ( const [ id , hexList ] of Object . entries ( agentHexMap ) ) {
161+ setAgentHexes ( Number ( id ) , hexList ) ;
162+ }
163+ } ) ( ) ,
163164 // Memories
164165 Promise . all ( agentIds . map ( async ( aId : bigint ) => {
165166 const id = Number ( aId ) ;
@@ -180,9 +181,7 @@ export function useGameEngine() {
180181 } ) ) ,
181182 ] ) ;
182183
183- setHexes ( allHexes ) ;
184- setLocations ( newLocs ) ;
185- setAgents ( newAgents ) ;
184+ setWorldData ( newAgents , newLocs , allHexes ) ;
186185 } catch ( err ) {
187186 console . error ( "RPC Error:" , err ) ;
188187 } finally {
@@ -193,5 +192,5 @@ export function useGameEngine() {
193192 pullData ( ) ;
194193 const interval = setInterval ( pullData , 5000 ) ;
195194 return ( ) => clearInterval ( interval ) ;
196- } , [ setAgents , setLocations , setHexes , setAgentHexes , setMemories , setLocationBoard , setInbox ] ) ;
195+ } , [ setWorldData , setAgentHexes , setMemories , setLocationBoard , setInbox ] ) ;
197196}
0 commit comments