add scripts/locate-ore
							parent
							
								
									135289e89a
								
							
						
					
					
						commit
						a7bd2e97ab
					
				| @ -0,0 +1,83 @@ | |||||||
|  | # scan the map for ore veins | ||||||
|  | 
 | ||||||
|  | target_ore = $script_args[0] | ||||||
|  | 
 | ||||||
|  | def find_all_ore_veins | ||||||
|  |     $ore_veins = {} | ||||||
|  |     seen_mat = {} | ||||||
|  |     df.each_map_block { |block| | ||||||
|  |         block.block_events.grep(DFHack::BlockSquareEventMineralst).each { |vein| | ||||||
|  |             mat_index = vein.inorganic_mat | ||||||
|  |             if not seen_mat[mat_index] or $ore_veins[mat_index] | ||||||
|  |                 seen_mat[mat_index] = true | ||||||
|  |                 if df.world.raws.inorganics[mat_index].flags[:METAL_ORE] | ||||||
|  |                     $ore_veins[mat_index] ||= [] | ||||||
|  |                     $ore_veins[mat_index] << [block.map_pos.x, block.map_pos.y, block.map_pos.z] | ||||||
|  |                 end | ||||||
|  |             end | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     df.onstatechange_register_once { |st| | ||||||
|  | 	    if st == :MAP_LOADED | ||||||
|  | 		    $ore_veins = nil	# invalidate veins cache | ||||||
|  | 		    true | ||||||
|  | 	    end | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     $ore_veins | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | $ore_veins ||= find_all_ore_veins | ||||||
|  | 
 | ||||||
|  | if not target_ore or target_ore == 'help' | ||||||
|  |     puts <<EOS | ||||||
|  | Scan the map to find one random tile of unmined ore. | ||||||
|  | It will center the game view on that tile and mark it for digging. | ||||||
|  | Only works with metal ores. | ||||||
|  | 
 | ||||||
|  |   Usage: | ||||||
|  | locate_ore list       list all existing vein materials (including mined ones) | ||||||
|  | locate_ore hematite   find one tile of unmined hematite ore | ||||||
|  | locate_ore iron       find one tile of unmined ore you can smelt into iron | ||||||
|  | EOS | ||||||
|  | 
 | ||||||
|  | elsif target_ore and mats = $ore_veins.keys.find_all { |k| | ||||||
|  |     ino = df.world.raws.inorganics[k] | ||||||
|  |     ino.id =~ /#{target_ore}/i or ino.metal_ore.mat_index.find { |m| | ||||||
|  |         df.world.raws.inorganics[m].id =~ /#{target_ore}/i | ||||||
|  |     } | ||||||
|  | } and not mats.empty? | ||||||
|  |     pos = nil | ||||||
|  |     dxs = (0..15).sort_by { rand } | ||||||
|  |     dys = (0..15).sort_by { rand } | ||||||
|  |     if found_mat = mats.sort_by { rand }.find { |mat| | ||||||
|  |         $ore_veins[mat].sort_by { rand }.find { |bx, by, bz| | ||||||
|  |             dys.find { |dy| | ||||||
|  |                 dxs.find { |dx| | ||||||
|  |                     tile = df.map_tile_at(bx+dx, by+dy, bz) | ||||||
|  |                     if tile.tilemat == :MINERAL and tile.designation.dig == :No and tile.shape == :WALL and | ||||||
|  |                             tile.mat_index_vein == mat and | ||||||
|  |                             # ignore map borders | ||||||
|  |                             bx+dx > 0 and bx+dx < df.world.map.x_count-1 and by+dy > 0 and by+dy < df.world.map.y_count-1 | ||||||
|  |                         pos = [bx+dx, by+dy, bz] | ||||||
|  |                     end | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |         df.center_viewscreen(*pos) | ||||||
|  |         df.map_tile_at(*pos).dig | ||||||
|  |         puts "Here is some #{df.world.raws.inorganics[found_mat].id}" | ||||||
|  |     else | ||||||
|  |         puts "Cannot find unmined #{mats.map { |mat| df.world.raws.inorganics[mat].id }.join(', ')}" | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  | else | ||||||
|  |     puts "Available ores:", $ore_veins.sort_by { |mat, pos| pos.length }.map { |mat, pos| | ||||||
|  |         ore = df.world.raws.inorganics[mat] | ||||||
|  |         metals = ore.metal_ore.mat_index.map { |m| df.world.raws.inorganics[m] } | ||||||
|  |         '  ' + ore.id.downcase + ' (' + metals.map { |m| m.id.downcase }.join(', ') + ')' | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | end | ||||||
		Loading…
	
		Reference in New Issue