wasliebob

BeeBreeder

Aug 3rd, 2013
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.18 KB | None | 0 0
  1. local targetSpecies = { ... }
  2.  
  3. local currslot = 1
  4. local princess = 0
  5. local bestDrone = 0
  6. local data={}
  7. local currData = {}
  8. local princessData = {}
  9. local droneData = {}
  10. local countBees = 0
  11. local beeTable = {}
  12. local currScore = 0
  13. local toleranceTable = {}
  14. local toleranceString = {}
  15. local needsUpdate = ""
  16. local needPrincess = false
  17.  
  18. c = peripheral.wrap("left")
  19.  
  20. -- Basic Bees
  21. beeTable["Forest"] = 1
  22. beeTable["Meadows"] = 1
  23. beeTable["Modest"] = 1
  24. beeTable["Tropical"] = 2
  25. beeTable["Wintry"] = 1
  26. beeTable["Marshy"] = 1
  27. beeTable["Embittered"] = 1
  28.  
  29. -- End Branch
  30. beeTable["Ender"] = 64
  31.  
  32. -- Common Branch
  33. beeTable["Common"] = 2
  34. beeTable["Cultivated"] = 4
  35.  
  36. -- Noble Branch
  37. beeTable["Noble"] = 8
  38. beeTable["Majestic"] = 16
  39. beeTable["Imperial"] = 32
  40.  
  41. -- Industrious Branch
  42. beeTable["Diligent"] = 8
  43. beeTable["Unweary"] = 16
  44. beeTable["Industrious"] = 32
  45.  
  46. -- Heroic Branch
  47. beeTable["Steadfast"] = 8
  48. beeTable["Valiant"] = 16
  49. beeTable["Heroic"] = 32
  50.  
  51. -- Infernal Branch
  52. beeTable["Sinister"] = 8
  53. beeTable["Fiendish"] = 16
  54. beeTable["Demonic"] = 32
  55.  
  56. -- Austere Branch
  57. beeTable["Frugal"] = 16
  58. beeTable["Austere"] = 32
  59.  
  60. -- Tropical Branch
  61. beeTable["Exotic"] = 16
  62. beeTable["Edenic"] = 32
  63.  
  64. -- Wintry Branch
  65. beeTable["Icy"] = 16
  66. beeTable["Glacial"] = 32
  67. beeTable["Frigid"] = 16
  68. beeTable["Absolute"] = 32
  69.  
  70. -- Festive Branch
  71. beeTable["Leporine"] = 32
  72. beeTable["Merry"] = 32
  73. beeTable["Tipsy"] = 32
  74. beeTable["Celebratory"] = 64
  75.  
  76. -- Agrarian Branch
  77. beeTable["Rural"] = 8
  78. beeTable["Farmed"] = 16
  79.  
  80. -- Boggy Branch
  81. beeTable["Swamp"] = 16
  82. beeTable["Boggy"] = 32
  83. beeTable["Fungal"] = 64
  84.  
  85. -- Extra Bees
  86.  
  87. -- Agricultural Branch
  88. beeTable["Fermented"] = 16
  89. beeTable["Bovine"] = 16
  90. beeTable["Caffeine"] = 16
  91. beeTable["Citrus"] = 32
  92. beeTable["Minty"] = 32
  93.  
  94. -- Barren Branch
  95. beeTable["Arid"] = 8
  96. beeTable["Barren"] = 16
  97. beeTable["Desolate"] = 32
  98.  
  99. -- Hostile Branch
  100. beeTable["Decaying"] = 64
  101. beeTable["Skeletal"] = 64
  102. beeTable["Creepy"] = 64
  103.  
  104. -- Rocky Branch
  105. beeTable["Rocky"] = 2
  106. beeTable["Tolerant"] = 8
  107. beeTable["Hardy"] = 16
  108. beeTable["Resilient"] = 64
  109.  
  110. -- Rusty Branch
  111. beeTable["Rusty"] = 8
  112. beeTable["Corroded"] = 64
  113. beeTable["Tarnished"] = 64
  114. beeTable["Leaden"] = 32
  115.  
  116. -- Metallic Branch
  117. beeTable["Lustered"] = 64
  118. beeTable["Galvanized"] = 128
  119. beeTable["Invincible"] = 64
  120.  
  121. -- Alloyed Branch
  122. beeTable["Impregnable"] = 128
  123. beeTable["Resolute"] = 128
  124. beeTable["Brazen"] = 256
  125. beeTable["Fortified"] = 128
  126. beeTable["Lustrous"] = 64
  127.  
  128. -- Precious Branch
  129. beeTable["Shining"] = 128
  130. beeTable["Glittering"] = 256
  131. beeTable["Precious"] = 512
  132. beeTable["Valuable"] = 512
  133.  
  134. -- Mineral Branch
  135. beeTable["Lapis"] = 64
  136. beeTable["Sodalite"] = 128
  137. beeTable["Pyrite"] = 128
  138. beeTable["Bauxite"] = 64
  139. beeTable["Cinnabar"] = 64
  140. beeTable["Sphalerite"] = 128
  141.  
  142. -- Gemstone Branch
  143. beeTable["Emerald"] = 128
  144. beeTable["Ruby"] = 256
  145. beeTable["Sapphire"] = 128
  146. beeTable["Olivine"] = 128
  147. beeTable["Diamond"] = 512
  148.  
  149. -- Nuclear Branch
  150. beeTable["Unstable"] = 64
  151. beeTable["Nuclear"] = 128
  152. beeTable["Radioactive"] = 256
  153.  
  154. -- Historic Branch
  155. beeTable["Ancient"] = 16
  156. beeTable["Primeval"] = 32
  157. beeTable["Prehistoric"] = 64
  158. beeTable["Relic"] = 128
  159.  
  160. -- Fossilized Branch
  161. beeTable["Fossiled"] = 64
  162. beeTable["Resinous"] = 64
  163. beeTable["Oily"] = 64
  164. beeTable["Preserved"] = 64
  165.  
  166. -- Refined Branch
  167. beeTable["Distilled"] = 128
  168. beeTable["Refined"] = 256
  169. beeTable["Tarry"] = 512
  170. beeTable["Elastic"] = 512
  171.  
  172. -- Aquatic Branch
  173. beeTable["Water"] = 2
  174. beeTable["River"] = 8
  175. beeTable["Ocean"] = 8
  176. beeTable["Stained"] = 16
  177.  
  178. -- Saccharine Branch
  179. beeTable["Sweetened"] = 16
  180. beeTable["Sugary"] = 32
  181. beeTable["Fruity"] = 64
  182.  
  183. -- Classical Branch
  184. beeTable["Marbled"] = 2
  185. beeTable["Gothic"] = 64
  186. beeTable["Renaissance"] = 128
  187. beeTable["Classical"] = 256
  188.  
  189. -- Volcanic Branch
  190. beeTable["Angry"] = 16
  191. beeTable["Furious"] = 32
  192. beeTable["Volcanic"] = 64
  193. beeTable["Glowering"] = 64
  194.  
  195. -- Viscous Branch
  196. beeTable["Viscous"] = 32
  197. beeTable["Glutinous"] = 64
  198. beeTable["Sticky"] = 128
  199.  
  200. -- Virulent Branch
  201. beeTable["Malicious"] = 16
  202. beeTable["Infectious"] = 32
  203. beeTable["Virulent"] = 64
  204.  
  205. -- Caustic Branch
  206. beeTable["Corrosive"] = 128
  207. beeTable["Caustic"] = 256
  208. beeTable["Acidic"] = 512
  209.  
  210. -- Energetic Branch
  211. beeTable["Excited"] = 32
  212. beeTable["Energetic"] = 64
  213. beeTable["Ecstatic"] = 128
  214.  
  215. -- Shadow Branch
  216. beeTable["Shadowed"] = 64
  217. beeTable["Darkened"] = 128
  218. beeTable["Abyssmal"] = 256
  219.  
  220. -- Primary Branch
  221. beeTable["Maroon"] = 32
  222. beeTable["Saffron"] = 32
  223. beeTable["Prussian"] = 32
  224. beeTable["Natural"] = 32
  225. beeTable["Ebony"] = 32
  226. beeTable["Bleached"] = 32
  227. beeTable["Sepia"] = 32
  228.  
  229. -- Secondary Branch
  230. beeTable["Amber"] = 64
  231. beeTable["Turquoise"] = 64
  232. beeTable["Indigo"] = 64
  233. beeTable["Slate"] = 64
  234. beeTable["Azure"] = 64
  235. beeTable["Lavender"] = 64
  236. beeTable["Lime"] = 64
  237.  
  238. -- Tertiary Branch
  239. beeTable["Fuchsia"] = 128
  240. beeTable["Ashen"] = 128
  241.  
  242. -- Hungry Branch
  243. beeTable["Hungry"] = 16
  244. beeTable["Starved"] = 32
  245. beeTable["Ravenous"] = 64
  246.  
  247. -- Confused Branch
  248. beeTable["Dazed"] = 64
  249. beeTable["Irrational"] = 128
  250. beeTable["Delirious"] = 256
  251.  
  252. -- Forestry Branch
  253. beeTable["Pulped"] = 32
  254. beeTable["Spoiled"] = 64
  255. beeTable["Decomposed"] = 128
  256.  
  257. -- Wooden Branch
  258. beeTable["Wooden"] = 16
  259. beeTable["Lumbered"] = 32
  260. beeTable["Timbered"] = 64
  261.  
  262. -- Beastly Branch
  263. beeTable["Jaded"] = 256
  264.  
  265. -- Thaumic Bees
  266.  
  267. -- Arcane Branch
  268. beeTable["Esoteric"] = 64
  269. beeTable["Mysterious"] = 128
  270. beeTable["Arcane"] = 256
  271.  
  272. -- Supernatural Branch
  273. beeTable["Charmed"] = 32
  274. beeTable["Enchanted"] = 64
  275. beeTable["Supernatural"] = 128
  276.  
  277. -- Scholarly Branch
  278. beeTable["Pupil"] = 512
  279. beeTable["Scholarly"] = 1024
  280. beeTable["Savant"] = 2048
  281.  
  282. -- Thaumic Branch
  283. beeTable["Stark"] = 512
  284. beeTable["Aura"] = 1024
  285. beeTable["Ignis"] = 1024
  286. beeTable["Aqua"] = 1024
  287. beeTable["Solum"] = 1024
  288. beeTable["Praecantatio"] = 1024
  289.  
  290. -- Skulking Branch
  291. beeTable["Skulking"] = 256
  292. beeTable["Brainy"] = 512
  293. beeTable["Gossamer"] = 512
  294. beeTable["Wispy"] = 1024
  295. beeTable["Batty"] = 512
  296. beeTable["Ghastly"] = 512
  297.  
  298. -- Aware Branch
  299. beeTable["Aware"] = 64
  300. beeTable["Vis"] = 128
  301. beeTable["Pure"] = 256
  302. beeTable["Flux"] = 256
  303. beeTable["Node"] = 512
  304. beeTable["Rejuvenating"] = 256
  305.  
  306. -- Time Branch
  307. beeTable["Timely"] = 128
  308. beeTable["Lordly"] = 256
  309. beeTable["Doctoral"] = 512
  310.  
  311. -- Soulful Branch
  312. beeTable["Spirit"] = 128
  313. beeTable["Soul"] = 256
  314.  
  315. -- Alchemical Branch
  316. beeTable["Minium"] = 256
  317.  
  318. -- Metallic Branch
  319. beeTable["Iron"] = 64
  320. beeTable["Copper"] = 64
  321. beeTable["Tin"] = 64
  322. beeTable["Silver"] = 64
  323. beeTable["Lead"] = 64
  324. beeTable["Gold"] = 128
  325.  
  326. -- Gem Branch
  327. beeTable["Diamond"] = 512
  328. beeTable["Emerald"] = 128
  329.  
  330. -- Fleshy Branch
  331. beeTable["Poultry"] = 512
  332. beeTable["Beefy"] = 512
  333. beeTable["Porcine"] = 512
  334.  
  335. function fixName(name)
  336. return name:gsub("bees%.species%.",""):gsub("^.", string.upper)
  337. end
  338.  
  339. function getBees()
  340. io.write("waiting for bees.")
  341. -- catalog bees in own inventory
  342. local free = {}
  343. for i = 1,16 do
  344. turtle.select(i)
  345. if turtle.getItemCount(i) > 0 then
  346. countBees = countBees + 1
  347. if #free > 0 then
  348. j = table.remove(free, 1)
  349. turtle.transferTo(j)
  350. table.insert(free, i)
  351. end
  352. else
  353. table.insert(free, i)
  354. end
  355. end
  356. -- get any bees from the apiary
  357. if countBees < 2 or needPrincess then
  358. turtle.select(1)
  359. while not turtle.suck() do
  360. sleep(10)
  361. io.write(".")
  362. end
  363. countBees = countBees + 1
  364. end
  365. for i = 1,6 do
  366. if turtle.suck() then countBees = countBees + 1 end
  367. end
  368. print()
  369. end
  370.  
  371. function returnBees()
  372. turtle.select(princess)
  373. s.dropSneaky(1,1)
  374. turtle.select(bestDrone)
  375. s.dropSneaky(0,1)
  376. end
  377.  
  378. function ditchCombs()
  379. turtle.turnLeft()
  380. m = peripheral.wrap("front")
  381. for i = 1,8 do
  382. turtle.suck()
  383. while (not m.isBee()) and (turtle.getItemCount(i) > 0) do
  384. turtle.select(i)
  385. turtle.drop()
  386. if not m.isBee() then
  387. turtle.suck()
  388. turtle.dropDown()
  389. turtle.select(countBees)
  390. turtle.transferTo(i, 1)
  391. countBees = countBees - 1
  392. end
  393. end
  394. end
  395. turtle.turnRight()
  396. end
  397.  
  398.  
  399. function scanBees()
  400. turtle.turnLeft()
  401. turtle.turnLeft()
  402. for i = 1, countBees do
  403. turtle.select(i)
  404. turtle.drop()
  405. end
  406. end
  407.  
  408.  
  409. function determineBest(slot)
  410. local primScore = beeTable[data["speciesPrimary"]]
  411. local secScore = beeTable[data["speciesSecondary"]]
  412. if primScore == nil or secScore == nil then
  413. needsUpdate = data["speciesPrimary"]..":"..data["speciesSecondary"]
  414. end
  415. primScore = (primScore ~= nil and primScore or 0)
  416. secScore = (secScore ~= nil and secScore or 0)
  417. local useNew = false
  418. local score = 0
  419. score = primScore + secScore
  420. if(bestDrone == 0) then
  421. useNew = true
  422. else
  423. if (score > currScore) then
  424. useNew = true
  425. elseif (score == currScore) then
  426. if data["fertility"] > currData["fertility"] then
  427. useNew = true
  428. elseif data["fertility"] < currData["fertility"] then
  429. useNew = false
  430.  
  431. elseif data["speed"] > currData["speed"] then
  432. useNew = true
  433. elseif data["speed"] < currData["speed"] then
  434. useNew = false
  435.  
  436. elseif data["nocturnal"] and not currData["nocturnal"] then
  437. useNew = true
  438. elseif not data["nocturnal"] and currData["nocturnal"] then
  439. useNew = false
  440.  
  441. elseif data["tolerantFlyer"] and not currData["tolerantFlyer"] then
  442. useNew = true
  443. elseif not data["tolerantFlyer"] and currData["tolerantFlyer"] then
  444. useNew = false
  445.  
  446. elseif data["caveDwelling"] and not currData["caveDwelling"] then
  447. useNew = true
  448. elseif not data["caveDwelling"] and currData["caveDwelling"] then
  449. useNew = false
  450.  
  451. elseif toleranceTable[data["toleranceTemperature"]] > toleranceTable[currData["toleranceTemperature"]] then
  452. useNew = true
  453. elseif toleranceTable[data["toleranceTemperature"]] < toleranceTable[currData["toleranceTemperature"]] then
  454. useNew = false
  455.  
  456. elseif toleranceTable[data["toleranceHumidity"]] > toleranceTable[currData["toleranceHumidity"]] then
  457. useNew = true
  458. elseif toleranceTable[data["toleranceHumidity"]] < toleranceTable[currData["toleranceHumidity"]] then
  459. useNew = false
  460.  
  461. end
  462. end
  463. end
  464. if useNew then
  465. bestDrone = slot
  466. currScore = score
  467. currData = data
  468. end
  469. return score, useNew
  470. end
  471.  
  472. function log2(num)
  473. return num == 0 and 0.0 or math.log(num)/math.log(2)
  474. end
  475.  
  476. function analyzeBees()
  477. print("analyzing "..countBees.." bees...")
  478. local score = 0
  479. local useNew = false
  480. print()
  481. print("typ species f spd n f c tmp hmd score")
  482. print("-|-|-------|-|---|-|-|-|---|---|-----")
  483. for i = 1, countBees do
  484. turtle.select(i)
  485. while not s.suckSneaky(0,1) do
  486. sleep(5)
  487. end
  488. turtle.turnRight()
  489. turtle.drop()
  490. m = peripheral.wrap("front")
  491. data = m.analyze()
  492. data["speciesPrimary"] = fixName(data["speciesPrimary"])
  493. data["speciesSecondary"] = fixName(data["speciesSecondary"])
  494. io.write(i.." ")
  495. if (data["type"] == "princess") then
  496. princess = i
  497. princessData = data
  498. io.write("P ")
  499. useNew = false
  500. score = 0
  501. else
  502. io.write("d ")
  503. score, useNew = determineBest(i)
  504. end
  505. io.write(data["speciesPrimary"]:gsub("bees%.species%.",""):sub(1,3)..":"..data["speciesSecondary"]:gsub("bees%.species%.",""):sub(1,3).." ")
  506. io.write(tostring(data["fertility"]).." ")
  507. io.write(data["speed"] == 1 and "1.0 " or tostring(data["speed"]).." ")
  508. if data["nocturnal"] then
  509. io.write("n ")
  510. else
  511. io.write(" ")
  512. end
  513. if data["tolerantFlyer"] then
  514. io.write("f ")
  515. else
  516. io.write(" ")
  517. end
  518. if data["caveDwelling"] then
  519. io.write("c ")
  520. else
  521. io.write(" ")
  522. end
  523. io.write(toleranceString[data["toleranceTemperature"]])
  524. io.write(toleranceString[data["toleranceHumidity"]])
  525. io.write(string.format("%5.1d", log2(score)).." ")
  526. if useNew then
  527. io.write("*")
  528. droneData = data
  529. end
  530. print()
  531. turtle.suck()
  532. turtle.turnLeft()
  533. end
  534. if princess ~= 0 then
  535. print("breeding princess ("..princess..") with drone ("..bestDrone..")")
  536. else
  537. print("no princess")
  538. end
  539. print()
  540. end
  541.  
  542. function dropExcess()
  543. for i = 1, 16 do
  544. turtle.select(i)
  545. turtle.dropDown()
  546. end
  547. end
  548.  
  549. -- Drop same drones so they won't interfere
  550. function dropDupe()
  551. for i = 1, countBees do
  552. turtle.select(i)
  553. local count = turtle.getItemCount(i)
  554. if count > 1 then
  555. print("dropping "..tostring(turtle.getItemCount(i)-1).." excess drones...")
  556. turtle.dropDown(count - 1)
  557. end
  558. end
  559. turtle.select(1)
  560. end
  561.  
  562. function isPurebred()
  563. if princessData["speciesPrimary"] ~= princessData["speciesSecondary"] then
  564. return false
  565. end
  566. for key, value in pairs(princessData) do
  567. if value ~= droneData[key] and key ~= "territory" and key ~= "type" then
  568. return false
  569. end
  570. end
  571. return true
  572. end
  573. ------=============================
  574.  
  575. -- clear out system
  576. while turtle.detect() do
  577. turtle.turnRight()
  578. end
  579. local i = 1
  580. turtle.select(i)
  581. while turtle.getItemCount(i) > 0 do
  582. i = i + 1
  583. turtle.select(i)
  584. end
  585. turtle.turnRight()
  586. while s.suckSneaky(0,1) do
  587. i = i + 1
  588. turtle.select(i)
  589. end
  590. turtle.turnRight()
  591. turtle.suck()
  592. turtle.turnRight()
  593. while turtle.suck() do
  594. end
  595.  
  596. -- start breeding loop
  597. while true do
  598. currslot = 1
  599. princess = 0
  600. bestDrone = 0
  601. data = {}
  602. currData = {}
  603. princessData = {}
  604. droneData = {}
  605. countBees = 0
  606. currScore = 0
  607.  
  608. getBees()
  609. ditchCombs()
  610. if (turtle.getItemCount(2) > 0) then
  611. dropDupe()
  612. scanBees()
  613. analyzeBees()
  614. if countBees <= 2 and isPurebred() then
  615. print("Bees are purebred")
  616. turtle.turnLeft()
  617. return
  618. end
  619. if needsUpdate == "" then
  620. turtle.turnRight()
  621. turtle.turnRight()
  622. if princess ~= 0 then
  623. returnBees()
  624. dropExcess()
  625. else
  626. needPrincess = true
  627. end
  628. else
  629. turtle.turnLeft()
  630. print("Please add new species to bee table: "..needsUpdate)
  631. return
  632. end
  633. end
  634. sleep(5)
  635. end
Advertisement
Add Comment
Please, Sign In to add comment