SHOW:
|
|
- or go back to the newest paste.
| 1 | -- setup is turtle facing apiary, with a (large, maybe dimensional storage) chest beneath the turtle | |
| 2 | -- another chest on top is used for produce and extra drones | |
| 3 | ||
| 4 | - | -- LfQiYjp4 |
| 4 | + | -- HvTT104d |
| 5 | -- gXa8k1tJ | |
| 6 | -- fKC8kx5b | |
| 7 | -- H0CppXue | |
| 8 | -- QTRQHPhM | |
| 9 | -- RwTbaqpP | |
| 10 | ||
| 11 | local apiary = peripheral.wrap("front")
| |
| 12 | local chest = peripheral.wrap("bottom")
| |
| 13 | local maxDrones = 6 | |
| 14 | local minDrones = 3 | |
| 15 | ||
| 16 | bees = {}
| |
| 17 | stacks = {}
| |
| 18 | shutdownMsg = nil | |
| 19 | ||
| 20 | function addParent(parent, offspring) | |
| 21 | if not bees[parent] then | |
| 22 | bees[parent] = {
| |
| 23 | --name = parent, | |
| 24 | score = 0, | |
| 25 | mutateFrom = {}
| |
| 26 | } | |
| 27 | end | |
| 28 | end | |
| 29 | ||
| 30 | function addOffspring(offspring, parentss) | |
| 31 | if bees[offspring] then | |
| 32 | for i, parents in ipairs(parentss) do | |
| 33 | table.insert(bees[offspring].mutateFrom, parents) | |
| 34 | end | |
| 35 | else | |
| 36 | bees[offspring] = {
| |
| 37 | score = 0, | |
| 38 | mutateFrom = parentss | |
| 39 | } | |
| 40 | end | |
| 41 | for i, parents in ipairs(parentss) do | |
| 42 | for i, parent in ipairs(parents) do | |
| 43 | addParent(parent, offspring) | |
| 44 | end | |
| 45 | end | |
| 46 | end | |
| 47 | ||
| 48 | ||
| 49 | ||
| 50 | ||
| 51 | -- produce combinations from 1 or 2 lists | |
| 52 | function choose(list, list2) | |
| 53 | local newList = {}
| |
| 54 | if list2 then | |
| 55 | for i = 1, #list2 do | |
| 56 | for j = 1, #list do | |
| 57 | if list[j] ~= list[i] then | |
| 58 | table.insert(newList, {list[j], list2[i]})
| |
| 59 | end | |
| 60 | end | |
| 61 | end | |
| 62 | else | |
| 63 | for i = 1, #list do | |
| 64 | for j = i, #list do | |
| 65 | if list[i] ~= list[j] then | |
| 66 | table.insert(newList, {list[i], list[j]})
| |
| 67 | end | |
| 68 | end | |
| 69 | end | |
| 70 | end | |
| 71 | return newList | |
| 72 | end | |
| 73 | ||
| 74 | ||
| 75 | --bee list from Master Apiarist Database v3.1 | |
| 76 | --Forestry v2.3.0.7 (683) | |
| 77 | --Extra Bees v1.8-dev2 | |
| 78 | --Magic Bees v2.1.7 (build 78) | |
| 79 | ||
| 80 | addOffspring("Common", choose({"Forest", "Meadows", "Modest", "Wintry", "Tropical", "Marshy", "Water", "Rocky", "Mystical", "Sorcerous", "Unusual", "Attuned"}))
| |
| 81 | addOffspring("Cultivated", choose({"Common"}, {"Forest", "Meadows", "Modest", "Wintry", "Tropical", "Marshy", "Water", "Rocky", "Mystical", "Sorcerous", "Unusual", "Attuned"}))
| |
| 82 | ||
| 83 | addOffspring("Noble", {{"Common", "Cultivated"}})
| |
| 84 | addOffspring("Majestic", {{"Noble", "Cultivated"}})
| |
| 85 | addOffspring("Imperial", {{"Noble", "Majestic"}})
| |
| 86 | addOffspring("Diligent", {{"Common", "Cultivated"}})
| |
| 87 | addOffspring("Unweary", {{"Diligent", "Cultivated"}})
| |
| 88 | addOffspring("Industrious", {{"Diligent", "Unweary"}})
| |
| 89 | addOffspring("Heroic", {{"Steadfast", "Valiant"}})
| |
| 90 | addOffspring("Sinister", choose({"Cultivated"}, {"Modest", "Tropical"}))
| |
| 91 | addOffspring("Fiendish", choose({"Sinister"}, {"Cultivated", "Modest", "Tropical"}))
| |
| 92 | addOffspring("Frugal", choose({"Modest"}, {"Sinister", "Fiendish"}))
| |
| 93 | addOffspring("Demonic", {{"Sinister", "Fiendish"}})
| |
| 94 | addOffspring("Austere", {{"Modest", "Frugal"}})
| |
| 95 | addOffspring("Exotic", {{"Austere", "Tropical"}})
| |
| 96 | addOffspring("Edenic", {{"Exotic", "Tropical"}})
| |
| 97 | addOffspring("Spectral", {{"Hermitic", "Ender"}})
| |
| 98 | addOffspring("Phantasmal", {{"Spectral", "Ender"}})
| |
| 99 | addOffspring("Icy", {{"Industrious", "Wintry"}})
| |
| 100 | addOffspring("Glacial", {{"Icy", "Wintry"}})
| |
| 101 | addOffspring("Vindictive", {{"Monastic", "Demonic"}})
| |
| 102 | addOffspring("Vengeful", choose({"Vindictive"}, {"Demonic", "Monastic"}))
| |
| 103 | addOffspring("Avenging", {{"Vengeful", "Vindictive"}})
| |
| 104 | addOffspring("Leporine", {{"Meadows", "Forest"}})
| |
| 105 | addOffspring("Merry", {{"Wintry", "Forest"}})
| |
| 106 | addOffspring("Tipsy", {{"Wintry", "Meadows"}})
| |
| 107 | addOffspring("Tricky", {{"Sinister", "Common"}})
| |
| 108 | addOffspring("Rural", {{"Meadows", "Diligent"}})
| |
| 109 | addOffspring("Secluded", {{"Monastic", "Austere"}})
| |
| 110 | addOffspring("Hermitic", {{"Monastic", "Secluded"}})
| |
| 111 | addOffspring("Arid", {{"Meadows", "Modest"}})
| |
| 112 | addOffspring("Barren", {{"Arid", "Common"}})
| |
| 113 | addOffspring("Desolate", {{"Arid", "Barren"}})
| |
| 114 | addOffspring("Decaying", {{"Desolate", "Modest"}})
| |
| 115 | addOffspring("Skeletal", {{"Desolate", "Frugal"}})
| |
| 116 | addOffspring("Creepy", {{"Desolate", "Austere"}})
| |
| 117 | addOffspring("Decomposing", {{"Gnawing", "Common"}})
| |
| 118 | addOffspring("Tolerant", {{"Rocky", "Diligent"}})
| |
| 119 | addOffspring("Robust", {{"Rocky", "Tolerant"}})
| |
| 120 | addOffspring("Resilient", {{"Imperial", "Robust"}})
| |
| 121 | addOffspring("Corroded", {{"Resilient", "Forest"}})
| |
| 122 | addOffspring("Tarnished", {{"Resilient", "Marshy"}})
| |
| 123 | addOffspring("Rusty", {{"Resilient", "Meadows"}})
| |
| 124 | addOffspring("Leaden", {{"Resilient", "Unweary"}})
| |
| 125 | addOffspring("Galvanized", {{"Tarnished", "Cultivated"}})
| |
| 126 | addOffspring("Impregnable", {{"Resilient", "Noble"}})
| |
| 127 | addOffspring("Invincible", {{"Resilient", "Ender"}})
| |
| 128 | addOffspring("Glittering", {{"Corroded", "Imperial"}})
| |
| 129 | addOffspring("Shining", {{"Rusty", "Imperial"}})
| |
| 130 | addOffspring("Valuable", {{"Glittering", "Shining"}})
| |
| 131 | addOffspring("Lapis", {{"Resilient", "Water"}})
| |
| 132 | addOffspring("Emerald", {{"Lapis", "Noble"}})
| |
| 133 | addOffspring("Ruby", {{"Emerald", "Austere"}})
| |
| 134 | addOffspring("Sapphire", {{"Emerald", "Ocean"}})
| |
| 135 | addOffspring("Diamond", {{"Lapis", "Imperial"}})
| |
| 136 | addOffspring("Unstable", {{"Austere", "Rocky"}})
| |
| 137 | addOffspring("Nuclear", {{"Unstable", "Rusty"}})
| |
| 138 | addOffspring("Radioactive", {{"Nuclear", "Glittering"}})
| |
| 139 | addOffspring("Ancient", {{"Noble", "Diligent"}})
| |
| 140 | addOffspring("Primeval", {{"Ancient", "Noble"}})
| |
| 141 | addOffspring("Prehistoric", {{"Primeval", "Majestic"}})
| |
| 142 | addOffspring("Relic", {{"Prehistoric", "Imperial"}})
| |
| 143 | addOffspring("Fossilised", {{"Primeval", "Growing"}})
| |
| 144 | addOffspring("Resinous", {{"Primeval", "Fungal"}})
| |
| 145 | addOffspring("Oily", {{"Primeval", "Ocean"}})
| |
| 146 | addOffspring("Distilled", {{"Oily", "Industrious"}})
| |
| 147 | addOffspring("Refined", {{"Oily", "Distilled"}})
| |
| 148 | addOffspring("Elastic", {{"Refined", "Resinous"}})
| |
| 149 | addOffspring("River", {{"Water", "Common"}})
| |
| 150 | addOffspring("Ocean", {{"Water", "Diligent"}})
| |
| 151 | addOffspring("Stained", {{"Ebony", "Ocean"}})
| |
| 152 | addOffspring("Growing", {{"Diligent", "Forest"}})
| |
| 153 | addOffspring("Thriving", {{"Growing", "Rural"}})
| |
| 154 | addOffspring("Blooming", {{"Thriving", "Growing"}})
| |
| 155 | addOffspring("Sweetened", {{"Valiant", "Diligent"}})
| |
| 156 | addOffspring("Sugary", {{"Sweetened", "Diligent"}})
| |
| 157 | addOffspring("Ripening", {{"Sugary", "Forest"}})
| |
| 158 | addOffspring("Fruity", {{"Ripening", "Rural"}})
| |
| 159 | addOffspring("Farmed", {{"Cultivated", "Rural"}})
| |
| 160 | addOffspring("Bovine", {{"Rural", "Water"}})
| |
| 161 | addOffspring("Caffeinated", {{"Tropical", "Rural"}})
| |
| 162 | addOffspring("Minty", {{"Tropical", "Farmed"}})
| |
| 163 | addOffspring("Damp", {{"Common", "Marshy"}})
| |
| 164 | addOffspring("Boggy", {{"Damp", "Marshy"}})
| |
| 165 | addOffspring("Fungal", {{"Boggy", "Damp"}})
| |
| 166 | addOffspring("Furious", {{"Embittered", "Sinister"}})
| |
| 167 | addOffspring("Volcanic", {{"Embittered", "Furious"}})
| |
| 168 | addOffspring("Malicious", {{"Sinister", "Tropical"}})
| |
| 169 | addOffspring("Infectious", {{"Malicious", "Tropical"}})
| |
| 170 | addOffspring("Virulent", {{"Malicious", "Infectious"}})
| |
| 171 | addOffspring("Viscous", {{"Water", "Exotic"}})
| |
| 172 | addOffspring("Glutinous", {{"Viscous", "Exotic"}})
| |
| 173 | addOffspring("Sticky", {{"Viscous", "Glutinous"}})
| |
| 174 | addOffspring("Corrosive", {{"Virulent", "Sticky"}})
| |
| 175 | addOffspring("Caustic", {{"Corrosive", "Fiendish"}})
| |
| 176 | addOffspring("Acidic", {{"Corrosive", "Caustic"}})
| |
| 177 | addOffspring("Excited", {{"Cultivated", "Valiant"}})
| |
| 178 | addOffspring("Energetic", {{"Excited", "Valiant"}})
| |
| 179 | addOffspring("Frigid", {{"Wintry", "Diligent"}})
| |
| 180 | addOffspring("Absolute", {{"Ocean", "Frigid"}})
| |
| 181 | addOffspring("Shadowed", {{"Tolerant", "Sinister"}})
| |
| 182 | addOffspring("Darkened", {{"Shadowed", "Embittered"}})
| |
| 183 | addOffspring("Abyssal", {{"Shadowed", "Darkened"}})
| |
| 184 | addOffspring("Maroon", {{"Forest", "Valiant"}})
| |
| 185 | addOffspring("Saffron", {{"Meadows", "Valiant"}})
| |
| 186 | addOffspring("Prussian", {{"Water", "Valiant"}})
| |
| 187 | addOffspring("Natural", {{"Tropical", "Valiant"}})
| |
| 188 | addOffspring("Ebony", {{"Rocky", "Valiant"}})
| |
| 189 | addOffspring("Bleached", {{"Wintry", "Valiant"}})
| |
| 190 | addOffspring("Sepia", {{"Marshy", "Valiant"}})
| |
| 191 | addOffspring("Amber", {{"Maroon", "Saffron"}})
| |
| 192 | addOffspring("Turquoise", {{"Natural", "Prussian"}})
| |
| 193 | addOffspring("Indigo", {{"Maroon", "Prussian"}})
| |
| 194 | addOffspring("Slate", {{"Ebony", "Bleached"}})
| |
| 195 | addOffspring("Azure", {{"Prussian", "Bleached"}})
| |
| 196 | addOffspring("Lavender", {{"Maroon", "Bleached"}})
| |
| 197 | addOffspring("Lime", {{"Natural", "Bleached"}})
| |
| 198 | addOffspring("Fuchsia", {{"Indigo", "Lavender"}})
| |
| 199 | addOffspring("Ashen", {{"Slate", "Bleached"}})
| |
| 200 | addOffspring("Celebratory", {{"Austere", "Excited"}})
| |
| 201 | addOffspring("Jaded", {{"Ender", "Relic"}})
| |
| 202 | addOffspring("Glowering", {{"Furious", "Excited"}})
| |
| 203 | addOffspring("Hazardous", {{"Austere", "Desolate"}})
| |
| 204 | addOffspring("Lustered", {{"Resilient", "Unweary"}})
| |
| 205 | addOffspring("Abnormal", {{"Secluded", "Ender"}})
| |
| 206 | addOffspring("Spatial", {{"Abnormal", "Hermitic"}})
| |
| 207 | addOffspring("Quantum", {{"Spatial", "Spectral"}})
| |
| 208 | addOffspring("Eldritch", choose({"Cultivated"}, {"Mystical", "Sorcerous", "Unusual", "Attuned"}))
| |
| 209 | addOffspring("Esoteric", {{"Cultivated", "Eldritch"}})
| |
| 210 | addOffspring("Mysterious", {{"Eldritch", "Esoteric"}})
| |
| 211 | addOffspring("Arcane", {{"Esoteric", "Mysterious"}})
| |
| 212 | addOffspring("Charmed", {{"Cultivated", "Eldritch"}})
| |
| 213 | addOffspring("Enchanted", {{"Eldritch", "Charmed"}})
| |
| 214 | addOffspring("Supernatural", {{"Charmed", "Enchanted"}})
| |
| 215 | addOffspring("Ethereal", {{"Arcane", "Supernatural"}})
| |
| 216 | addOffspring("Watery", {{"Supernatural", "Ethereal"}})
| |
| 217 | addOffspring("Earthen", {{"Supernatural", "Ethereal"}})
| |
| 218 | addOffspring("Firey", {{"Supernatural", "Ethereal"}})
| |
| 219 | addOffspring("Windy", {{"Supernatural", "Ethereal"}})
| |
| 220 | addOffspring("Pupil", {{"Monastic", "Arcane"}})
| |
| 221 | addOffspring("Scholarly", {{"Arcane", "Pupil"}})
| |
| 222 | addOffspring("Savant", {{"Pupil", "Scholarly"}})
| |
| 223 | addOffspring("Aware", {{"Ethereal", "Attuned"}})
| |
| 224 | addOffspring("Spirit", choose({"Aware"}, {"MystEtherealical", "Attuned"}))
| |
| 225 | addOffspring("Soul", {{"Aware", "Spirit"}})
| |
| 226 | addOffspring("Skulking", {{"Modest", "Eldritch"}})
| |
| 227 | addOffspring("Ghastly", {{"Skulking", "Ethereal"}})
| |
| 228 | addOffspring("Spidery", {{"Tropical", "Skulking"}})
| |
| 229 | addOffspring("Smouldering", {{"Skulking", "Hateful"}})
| |
| 230 | addOffspring("Timely", {{"Imperial", "Ethereal"}})
| |
| 231 | addOffspring("Lordly", {{"Imperial", "Timely"}})
| |
| 232 | addOffspring("Doctoral", {{"Timely", "Lordly"}})
| |
| 233 | addOffspring("Infernal", {{"Infernal", "ves"}})
| |
| 234 | addOffspring("Hateful", {{"Infernal", "Eldritch"}})
| |
| 235 | addOffspring("Spiteful", {{"Infernal", "Hateful"}})
| |
| 236 | addOffspring("Withering", {{"Demonic", "Spiteful"}})
| |
| 237 | addOffspring("Oblivion", {{"Oblivion", "ves"}})
| |
| 238 | addOffspring("Nameless", {{"Ethereal", "Oblivion"}})
| |
| 239 | addOffspring("Abandoned", {{"Oblivion", "Nameless"}})
| |
| 240 | addOffspring("Forlorn", {{"Nameless", "Abandoned"}})
| |
| 241 | addOffspring("Draconic", {{"Imperial", "Abandoned"}})
| |
| 242 | addOffspring("Ferrous", {{"Common", "Industrious"}})
| |
| 243 | addOffspring("Auric", {{"Minium", "Plumbum"}})
| |
| 244 | addOffspring("Cuprum", {{"Industrious", "Meadows"}})
| |
| 245 | addOffspring("Stannum", {{"Industrious", "Forest"}})
| |
| 246 | addOffspring("Argentum", {{"Imperial", "Modest"}})
| |
| 247 | addOffspring("Plumbum", {{"Stannum", "Common"}})
| |
| 248 | addOffspring("Aluminum", {{"Industrious", "Cultivated"}})
| |
| 249 | addOffspring("Ardite", {{"Industrious", "Infernal"}})
| |
| 250 | addOffspring("Cobalt", {{"Imperial", "Infernal"}})
| |
| 251 | addOffspring("Manyullyn", {{"Ardite", "Cobalt"}})
| |
| 252 | addOffspring("Diamandi", {{"Austere", "Auric"}})
| |
| 253 | addOffspring("Esmeraldi", {{"Austere", "Argentum"}})
| |
| 254 | addOffspring("Apatine", {{"Rural", "Cuprum"}})
| |
| 255 | addOffspring("Mutable", {{"Unusual", "Eldritch"}})
| |
| 256 | addOffspring("Transmuting", {{"Unusual", "Mutable"}})
| |
| 257 | addOffspring("Crumbling", {{"Unusual", "Mutable"}})
| |
| 258 | addOffspring("Invisible", {{"Mystical", "Mutable"}})
| |
| 259 | addOffspring("Aer", {{"Windy", "Windy"}})
| |
| 260 | addOffspring("Ignis", {{"Firey", "Firey"}})
| |
| 261 | addOffspring("Aqua", {{"Watery", "Watery"}})
| |
| 262 | addOffspring("Solum", {{"Earthen", "Earthen"}})
| |
| 263 | addOffspring("Ordered", {{"Ethereal", "Arcane"}})
| |
| 264 | addOffspring("Chaotic", {{"Ethereal", "Supernatural"}})
| |
| 265 | addOffspring("Brainy", {{"Skulking", "Pupil"}})
| |
| 266 | addOffspring("Batty", {{"Skulking", "Windy"}})
| |
| 267 | addOffspring("Poultry", {{"Common", "Skulking"}})
| |
| 268 | addOffspring("Beefy", {{"Common", "Skulking"}})
| |
| 269 | addOffspring("Porcine", {{"Common", "Skulking"}})
| |
| 270 | addOffspring("Minium", {{"Frugal", "Eldritch"}})
| |
| 271 | ||
| 272 | ||
| 273 | ||
| 274 | --find the highest level bee i own that is a parent to species (of type "Princess" or "Drone" if type ~= nil) | |
| 275 | --returns parent, offspring, score | |
| 276 | --offspring is the next step after parent | |
| 277 | --score is the depth of the search | |
| 278 | ||
| 279 | function findAvailableParent(species, score, type) | |
| 280 | ||
| 281 | for i, stack in pairs(stacks) do | |
| 282 | if stack.beeInfo.displayName == species then | |
| 283 | if type then | |
| 284 | if string.find(stack.name, type) then | |
| 285 | return species, nil, score | |
| 286 | end | |
| 287 | else | |
| 288 | return species, nil, score | |
| 289 | end | |
| 290 | end | |
| 291 | end | |
| 292 | ||
| 293 | local aScore, aParent, aOffspring | |
| 294 | local beeScore = 99999 | |
| 295 | local beeParent = nil | |
| 296 | local beeOffspring = nil | |
| 297 | ||
| 298 | for i, parents in ipairs(bees[species].mutateFrom) do | |
| 299 | aParent, aOffspring, aScore = findAvailableParent(parents[1], score + 1, type) | |
| 300 | if aScore < beeScore then | |
| 301 | beeScore = aScore | |
| 302 | beeParent = aParent | |
| 303 | beeOffspring = aOffspring | |
| 304 | end | |
| 305 | aParent, aOffspring, aScore = findAvailableParent(parents[2], score + 1, type) | |
| 306 | if aScore < beeScore then | |
| 307 | beeScore = aScore | |
| 308 | beeParent = aParent | |
| 309 | beeOffspring = aOffspring | |
| 310 | end | |
| 311 | end | |
| 312 | if beeOffspring == nil then | |
| 313 | beeOffspring = species | |
| 314 | end | |
| 315 | return beeParent, beeOffspring, beeScore | |
| 316 | end | |
| 317 | ||
| 318 | --finds a princess and drone of the given species if they exist | |
| 319 | local function findSpecies(species) | |
| 320 | local princessIndex = nil | |
| 321 | local droneIndex = nil | |
| 322 | ||
| 323 | for i, stack in pairs(stacks) do | |
| 324 | if stack.beeInfo.displayName == species then | |
| 325 | if string.find(stack.name, "Princess") then | |
| 326 | princessIndex = i | |
| 327 | end | |
| 328 | if string.find(stack.name, "Drone") then | |
| 329 | droneIndex = i | |
| 330 | end | |
| 331 | end | |
| 332 | end | |
| 333 | return princessIndex, droneIndex | |
| 334 | end | |
| 335 | ||
| 336 | --breed these two species, they must exists and have a breeding pair | |
| 337 | local function breedSpecies(parent1, parent2) | |
| 338 | local princess1 = nil | |
| 339 | local princess2 = nil | |
| 340 | local drone1 = nil | |
| 341 | local drone2 = nil | |
| 342 | ||
| 343 | princess1, drone1 = findSpecies(parent1) | |
| 344 | princess2, drone2 = findSpecies(parent2) | |
| 345 | ||
| 346 | if not (princess1 and drone2) then | |
| 347 | princess1 = princess2 | |
| 348 | drone2 = drone1 | |
| 349 | end | |
| 350 | ||
| 351 | print("Breeding " .. parent1 .. " with " .. parent2)
| |
| 352 | ||
| 353 | if princess1 and drone2 then | |
| 354 | chest.pushItem("up", princess1, 1)
| |
| 355 | turtle.drop() | |
| 356 | chest.pushItem("up", drone2, 1)
| |
| 357 | turtle.drop() | |
| 358 | return true | |
| 359 | end | |
| 360 | return false | |
| 361 | end | |
| 362 | ||
| 363 | --finds the most common species of type Drone or Princess | |
| 364 | local function findExtraBee(type, msg) | |
| 365 | local counts = {}
| |
| 366 | local bestcount = 0 | |
| 367 | local bestspecies = nil | |
| 368 | ||
| 369 | for i, stack in pairs(stacks) do | |
| 370 | if string.find(stack.name, type) then | |
| 371 | if counts[stack.beeInfo.displayName] then | |
| 372 | counts[stack.beeInfo.displayName] = counts[stack.beeInfo.displayName] + stack.qty | |
| 373 | else | |
| 374 | counts[stack.beeInfo.displayName] = stack.qty | |
| 375 | end | |
| 376 | if counts[stack.beeInfo.displayName] > bestcount then | |
| 377 | bestcount = counts[stack.beeInfo.displayName] | |
| 378 | bestspecies = stack.beeInfo.displayName | |
| 379 | end | |
| 380 | end | |
| 381 | end | |
| 382 | if bestcount < 2 then | |
| 383 | shutdownMsg = "Need more " .. type .. "s!"; | |
| 384 | else | |
| 385 | if msg == "Used" then | |
| 386 | print("Used Extra " .. bestspecies .. " " .. type)
| |
| 387 | end | |
| 388 | end | |
| 389 | return bestspecies, bestcount | |
| 390 | end | |
| 391 | ||
| 392 | --attempt to create a princess and minDrones of species, which i own one of | |
| 393 | --returns true if already purebred, else begins a breeding cycle | |
| 394 | ||
| 395 | local function purebreed(species) | |
| 396 | local princessCount = 0 | |
| 397 | local droneCount = 0 | |
| 398 | ||
| 399 | --count how many i have | |
| 400 | ||
| 401 | for i, stack in pairs(stacks) do | |
| 402 | if stack.beeInfo.displayName == species then | |
| 403 | if string.find(stack.name, "Princess") then | |
| 404 | princessCount = princessCount + stack.qty | |
| 405 | end | |
| 406 | if string.find(stack.name, "Drone") then | |
| 407 | droneCount = droneCount + stack.qty | |
| 408 | end | |
| 409 | end | |
| 410 | end | |
| 411 | ||
| 412 | if princessCount >= 1 and droneCount >= minDrones then | |
| 413 | return true | |
| 414 | end | |
| 415 | ||
| 416 | print("Attempting to purebreed " .. species)
| |
| 417 | ||
| 418 | if princessCount >= 1 and droneCount >= 1 then | |
| 419 | breedSpecies(species, species) | |
| 420 | return false | |
| 421 | end | |
| 422 | ||
| 423 | --find something to breed it with, an available parent, or an extra bee | |
| 424 | ||
| 425 | local parent1, offspring, score | |
| 426 | if(princessCount >= 1) then | |
| 427 | parent1, offspring, score = findAvailableParent(species, 0, "Drone") | |
| 428 | if score == 99999 then | |
| 429 | parent1, score = findExtraBee("Drone", "Used")
| |
| 430 | else | |
| 431 | --the purebreeding code sometimes gets stuck on low fertility bees | |
| 432 | --local princess1, drone1 = findSpecies(parent1) | |
| 433 | --if princess1 and drone2 and not purebreed(parent1) then | |
| 434 | -- return false | |
| 435 | --end | |
| 436 | end | |
| 437 | else | |
| 438 | parent1, offspring, score = findAvailableParent(species, 0, "Princess") | |
| 439 | if score == 99999 then | |
| 440 | parent1, score = findExtraBee("Princess", "Used")
| |
| 441 | else | |
| 442 | --local princess1, drone1 = findSpecies(parent1) | |
| 443 | --if princess1 and drone2 and not purebreed(parent1) then | |
| 444 | -- return false | |
| 445 | --end | |
| 446 | end | |
| 447 | end | |
| 448 | if shutdownMsg then | |
| 449 | return false | |
| 450 | end | |
| 451 | ||
| 452 | breedSpecies(species, parent1) | |
| 453 | return false | |
| 454 | end | |
| 455 | ||
| 456 | --the main breeding function | |
| 457 | --uses findavailableparent, then tries to create the designated offspring | |
| 458 | ||
| 459 | local function targetSpecies(species) | |
| 460 | local parent1 | |
| 461 | local parent2 = nil | |
| 462 | ||
| 463 | --find the highest level bee i have that is a parent to species | |
| 464 | --offspring is the next step after parent on the way to species | |
| 465 | ||
| 466 | local parent1, offspring, score = findAvailableParent(species, 0, nil) | |
| 467 | if score == 0 then | |
| 468 | --found species | |
| 469 | return true | |
| 470 | end | |
| 471 | if score == 99999 then | |
| 472 | shutdownMsg = "No available parents for " .. species | |
| 473 | return false | |
| 474 | end | |
| 475 | ||
| 476 | print("Targeting Species " .. offspring)
| |
| 477 | ||
| 478 | local princess1, drone1 = findSpecies(parent1) | |
| 479 | local princess2, drone2 | |
| 480 | ||
| 481 | --find which bee i need to breed parent1 with to get offspring, showing preference for bees that i own | |
| 482 | ||
| 483 | for i, parents in ipairs(bees[offspring].mutateFrom) do | |
| 484 | if parents[1] == parent1 then | |
| 485 | princess2, drone2 = findSpecies(parents[2]) | |
| 486 | if (princess1 and drone2) or (princess2 and drone1) then | |
| 487 | parent2 = parents[2] | |
| 488 | break | |
| 489 | end | |
| 490 | if not parent2 then | |
| 491 | parent2 = parents[2] | |
| 492 | end | |
| 493 | if princess2 or drone2 then | |
| 494 | parent2 = parents[2] | |
| 495 | end | |
| 496 | end | |
| 497 | if parents[2] == parent1 then | |
| 498 | princess2, drone2 = findSpecies(parents[1]) | |
| 499 | if (princess1 and drone2) or (princess2 and drone1) then | |
| 500 | parent2 = parents[1] | |
| 501 | break | |
| 502 | end | |
| 503 | if not parent2 then | |
| 504 | parent2 = parents[1] | |
| 505 | end | |
| 506 | if princess2 or drone2 then | |
| 507 | parent2 = parents[1] | |
| 508 | end | |
| 509 | end | |
| 510 | ||
| 511 | end | |
| 512 | ||
| 513 | princess2, drone2 = findSpecies(parent2) | |
| 514 | ||
| 515 | if (princess1 and drone2) or (princess2 and drone1) then | |
| 516 | --i have both bees i need so breed it now | |
| 517 | --the purebreeding code sometimes gets stuck on low fertility bees | |
| 518 | --if princess1 and drone1 and not purebreed(parent1) then | |
| 519 | -- return false | |
| 520 | --end | |
| 521 | --if princess2 and drone2 and not purebreed(parent2) then | |
| 522 | -- return false | |
| 523 | --end | |
| 524 | breedSpecies(parent1, parent2) | |
| 525 | return false | |
| 526 | end | |
| 527 | ||
| 528 | --i have the species but not princess or drone, so purebreed it | |
| 529 | if princess2 or drone2 then | |
| 530 | purebreed(parent2) | |
| 531 | return false | |
| 532 | end | |
| 533 | ||
| 534 | --i dont have the species i need to breed with parent, so target it | |
| 535 | targetSpecies(parent2) | |
| 536 | return false | |
| 537 | end | |
| 538 | ||
| 539 | local function dropExtraDrones() | |
| 540 | ||
| 541 | local species, count = findExtraBee("Drone", "Dropping")
| |
| 542 | shutdownMsg = nil | |
| 543 | ||
| 544 | if count <= maxDrones then | |
| 545 | return | |
| 546 | end | |
| 547 | ||
| 548 | for i, stack in pairs(stacks) do | |
| 549 | if stack.beeInfo.displayName == species and string.find(stack.name, "Drone") then | |
| 550 | chest.pushItem("up", i, 1)
| |
| 551 | turtle.dropUp() | |
| 552 | count = count - 1 | |
| 553 | if count <= maxDrones then | |
| 554 | return | |
| 555 | end | |
| 556 | end | |
| 557 | end | |
| 558 | ||
| 559 | end | |
| 560 | ||
| 561 | local function dropExtraItems() | |
| 562 | stacks = chest.getAllStacks() | |
| 563 | for i, stack in pairs(stacks) do | |
| 564 | if (not string.find(stack.name, "Drone")) and (not string.find(stack.name, "Princess")) then | |
| 565 | chest.pushItem("up", i, stack.qty)
| |
| 566 | turtle.dropUp() | |
| 567 | end | |
| 568 | end | |
| 569 | ||
| 570 | end | |
| 571 | ||
| 572 | local function main(species) | |
| 573 | ||
| 574 | for slot = 1, 16 do | |
| 575 | if turtle.getItemCount(slot) > 0 then | |
| 576 | turtle.select(slot) | |
| 577 | turtle.dropDown() | |
| 578 | end | |
| 579 | end | |
| 580 | turtle.select(1) | |
| 581 | ||
| 582 | local apiarystacks | |
| 583 | ||
| 584 | while(1) do | |
| 585 | ||
| 586 | --test for breeding in progress | |
| 587 | apiarystacks = apiary.getAllStacks() | |
| 588 | while apiarystacks[1] do | |
| 589 | sleep(1) | |
| 590 | while(turtle.suck()) do | |
| 591 | turtle.dropDown() | |
| 592 | end | |
| 593 | ||
| 594 | apiarystacks = apiary.getAllStacks() | |
| 595 | end | |
| 596 | ||
| 597 | --clear apiary | |
| 598 | while(turtle.suck()) do | |
| 599 | turtle.dropDown() | |
| 600 | end | |
| 601 | ||
| 602 | dropExtraItems() | |
| 603 | ||
| 604 | --get the list of all items in the chest | |
| 605 | stacks = chest.getAllStacks() | |
| 606 | ||
| 607 | if targetSpecies(species) then | |
| 608 | if purebreed(species) then | |
| 609 | shutdownMsg = "Breeding complete: " .. species | |
| 610 | end | |
| 611 | end | |
| 612 | ||
| 613 | if(shutdownMsg) then | |
| 614 | print(shutdownMsg) | |
| 615 | break | |
| 616 | end | |
| 617 | ||
| 618 | dropExtraDrones() | |
| 619 | ||
| 620 | sleep(1) | |
| 621 | end | |
| 622 | end | |
| 623 | ||
| 624 | local species = ... | |
| 625 | if species == nil then | |
| 626 | print("Usage")
| |
| 627 | print(" programname species")
| |
| 628 | return | |
| 629 | end | |
| 630 | if bees[species] == nil then | |
| 631 | print("Species does not exist in database")
| |
| 632 | end | |
| 633 | ||
| 634 | main(species) |