# create first necessity items under cursor category = $script_args[0] || 'help' mat_raw = $script_args[1] || 'list' count = $script_args[2] category = df.match_rawname(category, ['help', 'bars', 'boulders', 'plants', 'logs', 'webs', 'anvils']) || 'help' if category == 'help' puts <<EOS Create first necessity items under the cursor. Usage: create-items [category] [raws token] [number] Item categories: bars, boulders, plants, logs, webs, anvils Raw token: Either a full token (PLANT_MAT:ADLER:WOOD) or the middle part only (the missing part is autocompleted depending on the item category) Use 'list' to show all possibilities Exemples: create-items boulders hematite 30 create-items bars CREATURE_MAT:CAT:SOAP 10 create-items web cave_giant create-items plants list EOS throw :script_finished elsif mat_raw == 'list' # allowed with no cursor elsif df.cursor.x == -30000 puts "Please place the game cursor somewhere" throw :script_finished elsif !(maptile = df.map_tile_at(df.cursor)) puts "Error: unallocated map block !" throw :script_finished elsif !maptile.shape_passablehigh puts "Error: impassible tile !" throw :script_finished end def match_list(tok, list) if tok != 'list' tok = df.match_rawname(tok, list) if not tok puts "Invalid raws token, use one in:" tok = 'list' end end if tok == 'list' puts list.map { |w| w =~ /[^\w]/ ? w.inspect : w }.join(' ') throw :script_finished end tok end case category when 'bars' # create metal bar, eg createbar INORGANIC:IRON cls = DFHack::ItemBarst if mat_raw !~ /:/ and !(df.decode_mat(mat_raw) rescue nil) list = df.world.raws.inorganics.find_all { |ino| ino.material.flags[:IS_METAL] }.map { |ino| ino.id } mat_raw = match_list(mat_raw, list) mat_raw = "INORGANIC:#{mat_raw}" puts mat_raw end customize = lambda { |item| item.dimension = 150 item.subtype = -1 } when 'boulders' cls = DFHack::ItemBoulderst if mat_raw !~ /:/ and !(df.decode_mat(mat_raw) rescue nil) list = df.world.raws.inorganics.find_all { |ino| ino.material.flags[:IS_STONE] }.map { |ino| ino.id } mat_raw = match_list(mat_raw, list) mat_raw = "INORGANIC:#{mat_raw}" puts mat_raw end when 'plants' cls = DFHack::ItemPlantst if mat_raw !~ /:/ and !(df.decode_mat(mat_raw) rescue nil) list = df.world.raws.plants.all.find_all { |plt| plt.material.find { |mat| mat.id == 'STRUCTURAL' } }.map { |plt| plt.id } mat_raw = match_list(mat_raw, list) mat_raw = "PLANT_MAT:#{mat_raw}:STRUCTURAL" puts mat_raw end when 'logs' cls = DFHack::ItemWoodst if mat_raw !~ /:/ and !(df.decode_mat(mat_raw) rescue nil) list = df.world.raws.plants.all.find_all { |plt| plt.material.find { |mat| mat.id == 'WOOD' } }.map { |plt| plt.id } mat_raw = match_list(mat_raw, list) mat_raw = "PLANT_MAT:#{mat_raw}:WOOD" puts mat_raw end when 'webs' cls = DFHack::ItemThreadst if mat_raw !~ /:/ and !(df.decode_mat(mat_raw) rescue nil) list = df.world.raws.creatures.all.find_all { |cre| cre.material.find { |mat| mat.id == 'SILK' } }.map { |cre| cre.creature_id } mat_raw = match_list(mat_raw, list) mat_raw = "CREATURE_MAT:#{mat_raw}:SILK" puts mat_raw end count ||= 1 customize = lambda { |item| item.flags.spider_web = true item.dimension = 15000 # XXX may depend on creature (this is for GCS) } when 'anvils' cls = DFHack::ItemAnvilst if mat_raw !~ /:/ and !(df.decode_mat(mat_raw) rescue nil) list = df.world.raws.inorganics.find_all { |ino| ino.material.flags[:IS_METAL] }.map { |ino| ino.id } mat_raw = match_list(mat_raw, list) mat_raw = "INORGANIC:#{mat_raw}" puts mat_raw end count ||= 1 end mat = df.decode_mat mat_raw count ||= 20 count.to_i.times { item = cls.cpp_new item.id = df.item_next_id item.stack_size = 1 item.mat_type = mat.mat_type item.mat_index = mat.mat_index customize[item] if customize df.item_next_id += 1 item.categorize(true) df.world.items.all << item item.pos = df.cursor item.flags.on_ground = true df.map_tile_at.mapblock.items << item.id df.map_tile_at.occupancy.item = true } # move game view, so that the ui menu updates if df.cursor.z > 5 df.curview.feed_keys(:CURSOR_DOWN_Z) df.curview.feed_keys(:CURSOR_UP_Z) else df.curview.feed_keys(:CURSOR_UP_Z) df.curview.feed_keys(:CURSOR_DOWN_Z) end