1
- import { useState , useEffect } from 'react' ;
2
- import { MineralDepositList } from './Structures/Mining/Deposits' ;
3
- import { ControlPanel } from './Structures/Mining/ControlPanel' ;
4
- // import { TerrainMap } from './terrain-map';
5
- import { Inventory } from './Inventory' ;
1
+ import { useState , useEffect } from 'react'
2
+ import { MineralDepositList } from './MineralDepositList'
3
+ import { TopographicMap } from './TopographicMap'
4
+ import { TerrainMap } from './TerrainMap'
5
+ import { Inventory } from './Inventory'
6
+ import { Button } from "@/components/ui/button"
6
7
7
8
type MineralDeposit = {
8
9
id : string
9
10
name : string
10
11
amount : number
11
- availableAmount : number
12
- level : number
13
- uses : string [ ]
14
12
position : { x : number ; y : number }
15
- } ;
13
+ }
16
14
17
15
type Rover = {
18
16
id : string
19
17
name : string
20
18
speed : number
21
19
efficiency : number
22
20
miningLevel : number
23
- } ;
21
+ }
24
22
25
23
type InventoryItem = {
26
24
id : string
27
25
name : string
28
26
amount : number
29
- } ;
27
+ }
28
+
29
+ type Landmark = {
30
+ id : string
31
+ name : string
32
+ description : string
33
+ position : { x : number ; y : number }
34
+ isOpen : boolean
35
+ }
36
+
37
+ const MINERALS = [ 'Iron' , 'Copper' , 'Coal' , 'Nickel' ]
38
+
39
+ const LANDMARKS : Landmark [ ] = [
40
+ { id : '1' , name : 'Base Camp' , description : 'Main operations center for the mining colony.' , position : { x : 10 , y : 10 } , isOpen : false } ,
41
+ { id : '2' , name : 'Power Plant' , description : 'Generates power for the entire mining operation.' , position : { x : 80 , y : 30 } , isOpen : false } ,
42
+ { id : '3' , name : 'Research Lab' , description : 'Conducts studies on Martian geology and potential life.' , position : { x : 30 , y : 70 } , isOpen : false } ,
43
+ ]
30
44
31
45
export function MiningComponentComponent ( ) {
32
46
const [ mineralDeposits , setMineralDeposits ] = useState < MineralDeposit [ ] > ( [ ] )
33
- const [ rovers , setRovers ] = useState < Rover [ ] > ( [ ] )
47
+ const [ rover , setRover ] = useState < Rover | null > ( null )
34
48
const [ selectedDeposit , setSelectedDeposit ] = useState < MineralDeposit | null > ( null )
35
- const [ selectedRover , setSelectedRover ] = useState < Rover | null > ( null )
36
49
const [ roverPosition , setRoverPosition ] = useState < { x : number ; y : number } | null > ( null )
37
50
const [ inventory , setInventory ] = useState < InventoryItem [ ] > ( [ ] )
38
51
const [ isMining , setIsMining ] = useState ( false )
39
52
const [ activeMap , setActiveMap ] = useState < '2D' | '3D' > ( '2D' )
53
+ const [ landmarks , setLandmarks ] = useState < Landmark [ ] > ( LANDMARKS )
40
54
41
55
useEffect ( ( ) => {
42
- setMineralDeposits ( [
43
- { id : '1' , name : 'Iron' , amount : 1000 , availableAmount : 500 , level : 1 , uses : [ 'Construction' , 'Tools' ] , position : { x : 200 , y : 150 } } ,
44
- { id : '2' , name : 'Copper' , amount : 800 , availableAmount : 400 , level : 2 , uses : [ 'Electronics' , 'Wiring' ] , position : { x : 400 , y : 300 } } ,
45
- { id : '3' , name : 'Gold' , amount : 500 , availableAmount : 200 , level : 3 , uses : [ 'Electronics' , 'Jewelry' ] , position : { x : 300 , y : 200 } } ,
46
- { id : '4' , name : 'Titanium' , amount : 600 , availableAmount : 300 , level : 2 , uses : [ 'Aerospace' , 'Medical' ] , position : { x : 500 , y : 250 } } ,
47
- { id : '5' , name : 'Platinum' , amount : 400 , availableAmount : 150 , level : 4 , uses : [ 'Catalysts' , 'Electronics' ] , position : { x : 150 , y : 350 } } ,
48
- ] )
49
- setRovers ( [
50
- { id : '1' , name : 'Rover A' , speed : 10 , efficiency : 0.8 , miningLevel : 1 } ,
51
- { id : '2' , name : 'Rover B' , speed : 15 , efficiency : 0.7 , miningLevel : 2 } ,
52
- { id : '3' , name : 'Rover C' , speed : 12 , efficiency : 0.9 , miningLevel : 3 } ,
53
- { id : '4' , name : 'Rover D' , speed : 18 , efficiency : 0.6 , miningLevel : 4 } ,
54
- ] )
55
- setInventory ( [
56
- { id : '1' , name : 'Iron' , amount : 0 } ,
57
- { id : '2' , name : 'Copper' , amount : 0 } ,
58
- { id : '3' , name : 'Gold' , amount : 0 } ,
59
- { id : '4' , name : 'Titanium' , amount : 0 } ,
60
- { id : '5' , name : 'Platinum' , amount : 0 } ,
61
- ] )
56
+ const generateDeposits = ( ) => {
57
+ const deposits : MineralDeposit [ ] = [ ]
58
+ for ( let i = 0 ; i < 4 ; i ++ ) {
59
+ const mineral = MINERALS [ Math . floor ( Math . random ( ) * MINERALS . length ) ]
60
+ deposits . push ( {
61
+ id : `${ i + 1 } ` ,
62
+ name : mineral ,
63
+ amount : Math . floor ( Math . random ( ) * 500 ) + 500 ,
64
+ position : { x : Math . random ( ) * 80 + 10 , y : Math . random ( ) * 80 + 10 } ,
65
+ } )
66
+ }
67
+ return deposits
68
+ }
69
+
70
+ setMineralDeposits ( generateDeposits ( ) )
71
+ setRover ( { id : '1' , name : 'Mars Rover' , speed : 15 , efficiency : 0.8 , miningLevel : 2 } )
72
+ setInventory ( MINERALS . map ( ( mineral , index ) => ( { id : `${ index + 1 } ` , name : mineral , amount : 0 } ) ) )
62
73
} , [ ] )
63
74
64
75
const handleDepositSelect = ( deposit : MineralDeposit ) => {
65
76
setSelectedDeposit ( deposit )
66
77
}
67
78
68
- const handleRoverSelect = ( rover : Rover ) => {
69
- setSelectedRover ( rover )
70
- }
71
-
72
79
const handleStartMining = ( ) => {
73
- if ( selectedDeposit && selectedRover ) {
80
+ if ( selectedDeposit && rover ) {
74
81
setIsMining ( true )
75
- setRoverPosition ( { x : 50 , y : 50 } ) // Start position
82
+ setRoverPosition ( { x : 5 , y : 5 } ) // Start position
76
83
77
84
const duration = 5000 // 5 seconds to reach deposit
78
85
const startTime = Date . now ( )
@@ -82,18 +89,19 @@ export function MiningComponentComponent() {
82
89
const progress = Math . min ( elapsedTime / duration , 1 )
83
90
84
91
setRoverPosition ( {
85
- x : 50 + ( selectedDeposit . position . x - 50 ) * progress ,
86
- y : 50 + ( selectedDeposit . position . y - 50 ) * progress
92
+ x : 5 + ( selectedDeposit . position . x - 5 ) * progress ,
93
+ y : 5 + ( selectedDeposit . position . y - 5 ) * progress
87
94
} )
88
95
89
96
if ( progress < 1 ) {
90
97
requestAnimationFrame ( animateRover )
91
98
} else {
92
99
// At deposit, start mining
93
100
setTimeout ( ( ) => {
94
- setRoverPosition ( { x : 50 , y : 50 } ) // Return to base
101
+ setRoverPosition ( { x : 5 , y : 5 } ) // Return to base
95
102
setIsMining ( false )
96
103
updateInventory ( selectedDeposit . name , 50 ) // Add mined resources to inventory
104
+ setSelectedDeposit ( null ) // Reset selected deposit
97
105
} , 5000 ) // 5 seconds at deposit
98
106
}
99
107
}
@@ -112,53 +120,69 @@ export function MiningComponentComponent() {
112
120
setActiveMap ( prev => prev === '2D' ? '3D' : '2D' )
113
121
}
114
122
123
+ const handleLandmarkClick = ( id : string ) => {
124
+ setLandmarks ( prev => prev . map ( landmark =>
125
+ landmark . id === id ? { ...landmark , isOpen : ! landmark . isOpen } : landmark
126
+ ) )
127
+ }
128
+
115
129
return (
116
- < div className = "flex flex-col h-screen bg-gray-100 text-[#2C4F64]" >
117
- < div className = "flex-1 p-4 overflow-hidden flex flex-col" >
118
- < div className = "mb-4 flex-shrink-0" >
119
- < div className = "flex justify-between items-center mb-2" >
120
- < h2 className = "text-2xl font-bold" > Mars Mining Operation</ h2 >
121
- < button
122
- onClick = { toggleMap }
123
- className = "px-4 py-2 bg-[#5FCBC3] text-white rounded hover:bg-[#5FCBC3]/80"
124
- >
125
- Switch to { activeMap === '2D' ? '3D' : '2D' } Map
126
- </ button >
127
- </ div >
128
- { /* {activeMap === '2D' ? (
130
+ < div className = "relative h-screen w-full overflow-hidden bg-gray-100 text-[#2C4F64] flex flex-col" >
131
+ < div className = "flex justify-between items-center p-4" >
132
+ < h2 className = "text-2xl font-bold" > Mars Mining Operation</ h2 >
133
+ < Button
134
+ onClick = { toggleMap }
135
+ variant = "outline"
136
+ className = "text-[#2C4F64] hover:bg-[#5FCBC3]/20"
137
+ >
138
+ Switch to { activeMap === '2D' ? '3D' : '2D' } Map
139
+ </ Button >
140
+ </ div >
141
+ < div className = "flex-grow flex flex-col md:flex-row overflow-hidden" >
142
+ < div className = "w-full md:w-3/4 h-1/2 md:h-full relative" >
143
+ { activeMap === '2D' ? (
129
144
< TopographicMap
130
145
deposits = { mineralDeposits }
131
146
roverPosition = { roverPosition }
132
147
selectedDeposit = { selectedDeposit }
148
+ landmarks = { landmarks }
149
+ onLandmarkClick = { handleLandmarkClick }
133
150
/>
134
151
) : (
135
152
< TerrainMap
136
153
deposits = { mineralDeposits }
137
154
roverPosition = { roverPosition }
138
155
selectedDeposit = { selectedDeposit }
156
+ landmarks = { landmarks }
157
+ onLandmarkClick = { handleLandmarkClick }
139
158
/>
140
- )} */ }
159
+ ) }
141
160
</ div >
142
- < div className = "grid grid-cols-2 gap-4 flex-grow overflow-hidden" >
143
- { /* <div className="bg-white rounded-lg p-4 shadow overflow-hidden flex flex-col">
144
- <MineralDepositList
145
- deposits={mineralDeposits}
146
- onSelect={handleDepositSelect}
147
- selectedDeposit={selectedDeposit}
148
- />
161
+ < div className = "w-full md:w-1/4 h-1/2 md:h-full overflow-y-auto bg-white bg-opacity-90 p-4" >
162
+ < div className = "space-y-4" >
163
+ { selectedDeposit ? (
164
+ < div >
165
+ < h3 className = "text-lg font-semibold mb-2" > Selected Deposit: { selectedDeposit . name } </ h3 >
166
+ < p > Amount: { selectedDeposit . amount } units</ p >
167
+ < Button
168
+ onClick = { handleStartMining }
169
+ disabled = { isMining }
170
+ className = "w-full mt-4"
171
+ >
172
+ { isMining ? 'Mining...' : 'Start Mining' }
173
+ </ Button >
174
+ </ div >
175
+ ) : (
176
+ < MineralDepositList
177
+ deposits = { mineralDeposits }
178
+ onSelect = { handleDepositSelect }
179
+ selectedDeposit = { selectedDeposit }
180
+ />
181
+ ) }
149
182
</ div >
150
- <div className="bg-white rounded-lg p-4 shadow overflow-hidden flex flex-col">
151
- <ControlPanel
152
- rovers={rovers}
153
- selectedRover={selectedRover}
154
- onRoverSelect={handleRoverSelect}
155
- onStartMining={handleStartMining}
156
- isMining={isMining}
157
- />
158
- </div> */ }
159
183
</ div >
160
184
</ div >
161
- < div className = "h-24 bg-white p-4 shadow flex-shrink-0 " >
185
+ < div className = "bg-white bg-opacity-90 p-4 border-t border-gray-200 " >
162
186
< Inventory inventory = { inventory } />
163
187
</ div >
164
188
</ div >
0 commit comments