Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[TODO LIST
- 1. make prompts blink/countdown to make them stand out to the user --temp solution implemented
- 4. modify menu routine to have +duration/+effect/splash sub menus for each of the primary potions
- 5. make the apothecary double sided for increased capacity
- 6. allow for choosing of build position above/in/below ground
- 7. break up Main() into simpler functions ie select, build, brew
- 8. turtle identifies a fully stocked apothecary and sleeps longer
- ]]
- --[[THOUGHTS
- 5. need to give instruction for usage RE: end chest (probably on the CC page)
- ]]
- function Main() --Control center for the program DONE
- --potion selection
- local ApothecarySize
- if DoesOldSaveExist() then
- if IsNewSetWanted() then
- ApothecarySize = GetSize()
- potionList = RunMenu(ApothecarySize)
- SaveFile(potionList)
- else
- potionList = LoadFile()
- ApothecarySize = #potionList
- end
- else
- ApothecarySize = GetSize()
- potionList = RunMenu(ApothecarySize)
- SaveFile(potionList)
- end
- --construction
- if IsBuilderWanted() then
- WaitForInventory(ApothecarySize)
- SurveySite(ApothecarySize)
- AutoBuilder(ApothecarySize)
- end
- inventory, reservedSlots = DefineInventory(potionList)
- --potion brewing
- FindHome(ApothecarySize)
- CleanUp(reservedSlots)
- shelfNo = 1
- while true do
- if IsShelfFull(shelfNo,reservedSlots) then
- --Do nothing
- else
- if IsEnoughIngredients(potionList[shelfNo],inventory) then
- FillBottles(reservedSlots)
- BrewPotion(potionList[shelfNo],inventory)
- RestockShelf(shelfNo)
- else
- RestockTurtle(reservedSlots)
- end
- end
- if shelfNo >= ApothecarySize then
- Rest(60,"sleep","Cycle complete.")
- shelfNo = 1
- else
- shelfNo = shelfNo + 1
- end
- end
- end
- function DoesOldSaveExist() --Is there an old save file existing? DONE
- print("Searching for existing save file..")
- local fileName = os.getComputerID()..".potions" --computer ID with the extension .potions
- local file = io.open(fileName,"r")
- if file == nil then
- return false
- else
- file:close()
- return true
- end
- end
- function IsNewSetWanted() --do you need to choose a new potion set? DONE
- term.clear() term.setCursorPos(1,1)
- print("Would you like to select a new set of potions?? \nYou have 20 seconds to respond (Y/N)")
- local timer = os.startTimer(20) --#The interval that you would like to wait
- while true do
- local event, result = os.pullEvent()
- if event == "timer" then --#If a timer event is pulled and its ID matches the one returned by startTimer
- return false
- elseif event == "key" then
- if result == keys.enter or result == keys.y then return true
- elseif result == keys.n then return false
- end
- end
- end
- end
- function GetSize() --ask user what size the apothecary should be DONE
- term.clear() term.setCursorPos(1,1)
- local maximum = 9 --maximum due to building materials is 17
- local minimum = 4
- local default = minimum
- while true do
- print("How many different types of potion do you wish to have in stock?")
- print("NOTE: this will change the size of the apothecary")
- print("Max = "..maximum..". Min = "..minimum..". Default = "..default)
- local userInput = string.lower(read())
- if tonumber(userInput) ~= nil then
- if tonumber(userInput) >= minimum and tonumber(userInput) <= maximum then
- return tonumber(userInput)
- else
- term.clear() term.setCursorPos(1,1)
- print("Outside of limits. Try again")
- end
- else
- term.clear() term.setCursorPos(1,1)
- print("Not an integer. Try again")
- end
- end
- end
- function RunMenu(size) --run the menu program to read a users selection DONE
- local potion = {}
- potion[01] = {"N.V. 3:00","g.carrot "} --Night Vision
- potion[02] = {"N.V. 8:00","g.carrot ","redstone "} --Night Vision
- potion[03] = {"Inv. 3:00","g.carrot ","f.s.eye "} --Invisibility
- potion[04] = {"Inv. 8:00","g.carrot ","f.s.eye ","redstone "} --Invisibility
- potion[05] = {"F.R. 3:00","m. cream "} --Fire Resist
- potion[06] = {"F.R. 8:00","m. cream ","redstone "} --Fire Resist
- potion[07] = {"Sl(s) 1:30","m. cream ","f.s.eye ","gunpowder"} --Slowness
- potion[08] = {"Sl(s) 4:00","m. cream ","f.s.eye ","redstone ","gunpowder"} --Slowness
- potion[09] = {"Sw I 3:00","sugar "} --Swiftness
- potion[10] = {"Sw I 8:00","sugar ","redstone "} --Swiftness
- potion[11] = {"Sw II 1:30","sugar ","glowstone"} --Swiftness
- potion[12] = {"Hp I +6 ","gl.melon "} --Healing
- potion[13] = {"Hp II +12 ","gl.melon ","glowstone"} --Healing
- potion[14] = {"Hm1(s)-6 ","spidereye","f.s.eye ","gunpowder"} --Harming
- potion[15] = {"Hm2(s)-12 ","spidereye","f.s.eye ","glowstone","gunpowder"} --Harming
- potion[16] = {"Ps1(s)0:45","spidereye","redstone ","gunpowder"} --Poison
- potion[17] = {"Ps1(s)2:00","spidereye","glowstone","gunpowder"} --Poison
- potion[18] = {"Ps2(s)0:22","spidereye","glowstone","f.s.eye ","gunpowder"}
- potion[19] = {"RgnI 0:45","ghastTear"}
- potion[20] = {"RgnI 2:00","ghastTear","redstone "}
- potion[21] = {"RgnII 0.22","ghastTear","glowstone"}
- potion[22] = {"Weak 1:30","f.s.eye ","gunpowder"}
- potion[23] = {"Weak 4:00","f.s.eye ","redstone ","gunpowder"}
- potion[24] = {"St I 3:00","blz.pwdr "}
- potion[25] = {"St I 8:00","blz.pwdr ","glowstone"}
- potion[26] = {"St II 1:30","blz.pwdr ","redstone "}
- local choice={} --vector storing the users selection
- for i = 1,size do choice[i] = 1 end
- local itemsPP = 9 --number of potions that can fit in a column
- local column = 1 --starting column (i think it needs a better variable name)
- local pageStart = 4 --the first row that you can print a potion on
- repeat
- term.clear() term.setCursorPos(1,1)
- --Print the headings
- print("Select potions from the choice: (UDLR)")
- print(" <<< Shelf "..column.." of "..#choice.." >>> ")
- --Print the potions
- for potionID = 1,#potion do
- colIndex = math.ceil(potionID/itemsPP)-1
- rowIndex = potionID - colIndex*itemsPP
- term.setCursorPos(colIndex*13 + 1, rowIndex + pageStart-1)
- if choice[column] == potionID then
- print(">>"..potion[potionID][1].."|")
- else
- print(" "..potion[potionID][1].."|")
- end
- end
- --Print indicators
- for i = #choice,1,-1 do
- colIndex = math.ceil(choice[i]/itemsPP)-1
- rowIndex = choice[i] - colIndex*itemsPP
- term.setCursorPos(colIndex*13 + 1, rowIndex + pageStart-1)
- print(i)
- end
- --Recieve and process keyboard input
- local eventtype, key = os.pullEvent() --get keyboard input
- if key == 200 and choice[column] == 1 then choice[column] = #potion --up
- elseif key == 200 then choice[column] = choice[column] - 1 --up
- elseif key == 208 and choice[column] == #potion then choice[column] = 1 --down
- elseif key == 208 then choice[column] = choice[column] + 1 --down
- elseif key == 205 and column == size then column = 1 --right
- elseif key == 205 then column = column + 1 --right
- elseif key == 203 and column == 1 then column = size --left
- elseif key == 203 then column = column - 1 --left
- end
- until key == 28 --if keypress = 'enter' then continue the program
- --print the user choice
- term.clear() term.setCursorPos(1,1)
- print("You have selected:")
- for i = 1,#choice do
- print(" Shelf "..i..": "..potion[choice[i]][1])
- end
- print("Are you happy with this selection?\n(Y/N)")
- local input = read()
- if input == "n" or input == "N" then
- return RunMenu()
- else
- --reduce the potionlist to just the 4 choices stored in a 2D array
- local potionShortList = {}
- for i = 1,#choice do
- potionShortList[i] = potion[choice[i]]
- end
- term.clear() term.setCursorPos(1,1)
- return potionShortList
- end
- end
- function SaveFile(potionShortList) --saves the potion list as an 8 bit number in a file DONE
- print("Saving potion set to file..")
- local fileName = os.getComputerID()..".potions" --computer ID with the extension .potions
- local file = fs.open(fileName,"w")
- for potionNo = 1,#potionShortList do
- local potionString = ""
- for potionItem = 1,#potionShortList[potionNo],1 do
- potionString = potionString..potionShortList[potionNo][potionItem]
- end
- file.writeLine(potionString)
- end
- file:close()
- end
- function LoadFile() --loads the data from file and returns the potion list DONE
- print("Loading potions set from existing file..")
- local fileName = os.getComputerID()..".potions" --computer ID with the extension .potions
- local file = fs.open(fileName,"r")
- local potionShortList = {}
- local dataString = file.readLine()
- local potionNumber = 0
- while dataString ~= null do
- potionNumber = potionNumber + 1
- potionShortList[potionNumber] = {}
- potionShortList[potionNumber][1] = dataString:sub(1,10) --record the potion name
- for potionItem = 1,(dataString:len()-10)/9 do
- local startChar = potionItem*9 + 1 + 1
- local endChar = potionItem*9 + 1 + 9
- potionShortList[potionNumber][potionItem+1] = dataString:sub(startChar,endChar)
- end
- dataString = file.readLine()
- end
- file:close()
- return potionShortList
- end
- function IsBuilderWanted() --Ask the user if they require instructions DONE
- term.clear() term.setCursorPos(1,1)
- print("Would you like to use the builder program??\nYou have 20 seconds to respond (Y/N)")
- local timer = os.startTimer(20) --#The interval that you would like to wait
- while true do
- local event, result = os.pullEvent()
- if event=="timer" then --#If a timer event is pulled and its ID matches the one returned by startTimer
- return false
- elseif event == "key" then
- if result == keys.enter or result == keys.y then return true
- elseif result == keys.n then return false
- end
- end
- end
- end
- function WaitForInventory(size) --Waits for the required building materials DONE
- repeat
- term.clear() term.setCursorPos(1,1)
- local inventory = "good"
- turtle.select(1) --building material
- if turtle.getItemCount(1) ~= 11 + 3*size then
- print(" - Put exactly "..(11+3*size).." blocks of a building material in slot 1")
- inventory = "bad"
- end
- turtle.select(2) --dispensers
- if turtle.getItemCount(2) ~= size then
- print(" - Put exactly "..size.." dispensers or droppers in slot 2")
- inventory = "bad"
- end
- turtle.select(3) --chest
- if turtle.getItemCount(3) ~= 2 then
- print(" - Put exactly 2 chests in slot 3")
- inventory = "bad"
- end
- turtle.select(4) --brewing stand
- if turtle.getItemCount(4) ~= 1 then
- print(" - Put exactly one brewing stand in slot 4")
- inventory = "bad"
- end
- turtle.select(5) --fuel
- turtle.refuel()
- if turtle.getFuelLevel() < 90 then
- print(" - Put at least 2 coal worth of fuel in slot 5")
- inventory = "bad"
- end
- if inventory == "bad" then sleep(3) end
- until inventory == "good"
- end
- --[[possible graphics for possible build styles
- [][][][]
- _____[][][][]_____ above ground
- _____[][][][]_____ in ground
- [][][][]
- _____ _____ below ground
- [][][][]
- [][][][]
- ]]
- function SurveySite(size) --starting at brewing stand end DONE
- term.clear() term.setCursorPos(1,1)
- print("Surveying site. Stand well back.")
- --survey the main volume
- for layer = 1,2 do
- for i = 1,size+1 do
- while turtle.detect() == true do
- print("Remove this block. TimeStamp = " ..os.clock())
- term.clear() term.setCursorPos(1,1)
- sleep(2)
- end
- turtle.turnLeft()
- while turtle.detect() == true do
- print("Remove this block. TimeStamp = " ..os.clock())
- term.clear() term.setCursorPos(1,1)
- sleep(2)
- end
- TurnAround()
- while turtle.detect() == true do
- print("Remove this block. TimeStamp = " ..os.clock())
- term.clear() term.setCursorPos(1,1)
- sleep(2)
- end
- turtle.turnLeft()
- turtle.forward()
- end
- turtle.forward()
- turtle.turnLeft()
- while turtle.detect() == true do
- print("Remove this block. TimeStamp = " ..os.clock())
- term.clear() term.setCursorPos(1,1)
- sleep(2)
- end
- TurnAround()
- while turtle.detect() == true do
- print("Remove this block. TimeStamp = " ..os.clock())
- term.clear() term.setCursorPos(1,1)
- sleep(2)
- end
- turtle.turnLeft()
- if layer == 1 then
- while turtle.detectUp() == true do
- print("Remove the block above. TimeStamp = " ..os.clock())
- term.clear() term.setCursorPos(1,1)
- sleep(2)
- end
- turtle.up()
- TurnAround()
- end
- end
- turtle.down()
- TurnAround()
- --survey the water well
- turtle.forward() turtle.forward()
- while turtle.detectDown() == true do
- print("Remove the block below and fill it with water. TimeStamp = " ..os.clock())
- term.clear() term.setCursorPos(1,1)
- sleep(2)
- end
- turtle.back() turtle.back()
- end
- function AutoBuilder(size) --starting at brewing stand end DONE
- BM = 1 DISP = 2 CH = 3 BS = 4
- print("Laying bottom layer")
- turtle.select(BM)
- turtle.turnLeft() --build brewing end
- turtle.place()
- TurnAround()
- turtle.place()
- turtle.turnRight()
- turtle.back()
- turtle.place()
- turtle.turnRight()
- turtle.place()
- TurnAround()
- turtle.place()
- turtle.turnRight()
- turtle.back()
- turtle.select(BS)
- turtle.place()
- turtle.select(BM)
- turtle.turnRight()
- turtle.place()
- TurnAround()
- turtle.place()
- turtle.turnLeft()
- for i = 1,size-1 do
- turtle.forward()
- turtle.turnLeft()
- turtle.place()
- TurnAround()
- turtle.place()
- turtle.turnLeft()
- end
- print("Laying top layer layer")
- turtle.up()
- turtle.placeDown()
- turtle.turnLeft()
- turtle.place()
- TurnAround()
- turtle.place()
- turtle.turnLeft()
- turtle.back()
- turtle.select(CH)
- turtle.place()
- turtle.placeDown()
- TurnAround()
- for i = 1,size do
- turtle.turnLeft()
- turtle.select(DISP)
- turtle.place()
- TurnAround()
- turtle.select(BM)
- turtle.place()
- turtle.turnLeft()
- turtle.forward()
- end
- turtle.turnLeft()
- turtle.place()
- TurnAround()
- turtle.place()
- turtle.turnLeft()
- turtle.back()
- turtle.place()
- end
- function DefineInventory(potionShortList) --gives instruction on inventory layout and returns the inventory array DONE
- local inventory = {"bottles ","n. wart "} --establish the inventory
- for potID = 1,#potionShortList do --loop through all potions
- for ingredient = 2,#potionShortList[potID] do --loop through all the ingredients
- local listed = false --assume the current ingredient not in the inventory array
- for slot = 1,#inventory do
- if inventory[slot] == potionShortList[potID][ingredient] then
- listed = true
- end
- end
- if listed == false then
- inventory[#inventory+1] = potionShortList[potID][ingredient] --append the array
- end
- end
- end
- local resSlotNum = #inventory --calculates the number of reserved slots
- for slot = resSlotNum+1,16 do inventory[slot] = "[empty] " end --mark the empty slots
- --prints the inventory and scans the inventory ensuring it is at least minimally stocked
- local stocked
- repeat
- term.clear() term.setCursorPos(1,1)
- print("Stock the inventory to continue.\n\n")
- for x = 0,3 do
- print(inventory[x*4+1].." "..inventory[x*4+2].." "..inventory[x*4+3].." "..inventory[x*4+4].."")
- end
- sleep(1)
- stocked = true
- for slot = 1,resSlotNum do
- turtle.select(slot)
- if turtle.getItemCount(slot) == 0 then
- stocked = false
- end
- end
- until stocked
- term.clear() term.setCursorPos(1,1)
- return inventory, resSlotNum
- end
- function FindHome(size) --Navigates to home base DONE
- print("\nGetting my bearings...")
- --turtle will find the position above the water and then move to be above the brewing stand
- local runCount = 4
- --orient turtle in the axis of the apothecary
- while turtle.detect() == true do
- turtle.turnLeft()
- runCount = runCount - 1
- if runCount == 0 then error("NAVIGATION ERROR\nTurtle is lost\nForcing quit\n") end
- end
- --check if it on the top layer or bottom layer based on the length
- for i = 1,size do turtle.forward() end --go to end
- TurnAround()
- for i = 1,size-3 do turtle.forward() end
- if turtle.detect() == false then --the turtle is on the top layer
- turtle.down()
- turtle.forward()
- end
- if turtle.detectDown() == true then --if it is at the far end
- TurnAround()
- for i = 1,size-3 do turtle.forward() end
- end
- if turtle.detectDown() == true then error("NAVIGATION ERROR\nTurtle is lost!\nForcing quit\n") end
- turtle.up()
- turtle.forward()
- end
- function CleanUp(reservedSlotCount) --Clears away any leftovers from the previous run DONE
- print("Cleaning up from last time")
- turtle.suckDown()
- turtle.back()
- turtle.down()
- for i = 1,3 do turtle.suck() end
- TurnAround()
- GoToEnd()
- for slot = reservedSlotCount+1,16 do
- turtle.select(slot)
- turtle.drop(64)
- end
- TurnAround()
- turtle.up()
- GoToEnd()
- term.clear() term.setCursorPos(1,1)
- end
- function IsShelfFull(shelfID,reservedSlotCount) --counts the contents of a shelf and returns true or false DONE
- print("Inspecting shelf #"..shelfID.."..")
- --move into position and face the shelf
- while shelfID > 1 do
- turtle.back()
- shelfID = shelfID - 1
- end
- turtle.turnLeft()
- --attempt to withdraw as many potions as possible
- turtle.select(reservedSlotCount+1)
- for slot = reservedSlotCount+1,16 do
- turtle.suck()
- end
- --count the potions and put them back
- local potionCount = 0
- for slot = reservedSlotCount+1,16 do
- turtle.select(slot)
- if turtle.getItemCount(slot) == 1 then --if there's a potion
- potionCount = potionCount + 1
- elseif turtle.getItemCount(slot) == 0 then --if there's nothing
- break
- else
- print("ERROR: Detected non-potion item. Proceeding regardless")
- end
- turtle.drop()
- end
- --go home
- turtle.turnRight()
- GoToEnd()
- --return a result
- local emptySlotCount = 16-reservedSlotCount
- if potionCount < emptySlotCount then --if less than maximum count
- if potionCount > 6 then --if no room for more potions (max:9)
- print("Shelf is full.")
- return true
- else
- print("Shelf is NOT full.")
- return false
- end
- else
- print("Shelf is full.")
- return true
- end
- end
- function IsEnoughIngredients(potionRecipe, inventoryList) --ensures enough supply of raw materials for brewing DONE
- print("Checking internal storage..")
- turtle.select(1) --contains bottles
- if turtle.getItemCount(1) <= 3 then return false end
- turtle.select(2)
- if turtle.getItemCount(2) <= 1 then return false end
- for slot = 3,16 do
- turtle.select(slot)
- if turtle.getItemCount(slot) <= 1 then --check item count first. more likely to be false. saves time
- for ingredient = 2,#potionRecipe do
- if inventoryList[slot] == potionRecipe[ingredient] then
- print("Insufficient internal storage.")
- return false
- end
- end
- end
- end
- if turtle.getFuelLevel() < 200 then return false end
- print("Internal storage is sufficient.")
- return true
- end
- function FillBottles(reservedSlotCount) --DONE
- print("Filling bottles..")
- turtle.back()
- turtle.down()
- for i = 1,3 do
- turtle.select(1) --slot 1 contains empty bottles
- turtle.placeDown()
- turtle.select(reservedSlotCount + 1)
- turtle.drop()
- end
- turtle.up()
- turtle.forward()
- end
- function BrewPotion(potionRecipe, inventoryList) --brews the potion corresponding to the shelfID DONE
- local potionSize = #potionRecipe
- turtle.select(2) --this slot contains netherwart
- turtle.dropDown(1)
- sleep(1) --this is just a buffer in case it takes longer than 20s to brew a step
- term.clear() term.setCursorPos(1,1)
- Rest(20,"brew","Brewing step 1 of "..potionSize.." for "..potionRecipe[1])
- --find the next ingredient in the recipe in the inventory and put it in the stand
- for ingredient = 2,potionSize do --for each ingredient in the potion
- for slot = 3,16 do --for each slot in the inventory
- if inventoryList[slot] == potionRecipe[ingredient] then --compare the recipe step to the inventory slot
- turtle.select(slot)
- turtle.dropDown(1)
- sleep(1) --this is just a buffer in case it takes longer than 20s to brew a step
- term.clear() term.setCursorPos(1,1)
- Rest(20,"brew","Brewing step "..ingredient.." of "..potionSize.." for "..potionRecipe[1])
- end
- end
- end
- end
- function RestockShelf(shelfID) --puts freshly brewed potions on the shelf DONE
- print("Restocking Shelves...")
- --move to the brewing stand
- turtle.back()
- turtle.down()
- --extract potions
- for i = 1,3 do
- turtle.suck()
- end
- --move to home
- turtle.up()
- turtle.forward()
- --move to shelf
- while shelfID > 1 do
- turtle.back()
- shelfID = shelfID - 1
- end
- turtle.turnLeft()
- --identify which slots the potions are stored in
- local slot = 16
- turtle.select(slot)
- while turtle.getItemCount(slot) == 0 do
- slot = slot - 1
- turtle.select(slot)
- end
- --put the potions away
- for i = 1,3 do
- turtle.drop()
- slot = slot - 1
- turtle.select(slot)
- end
- --move to home
- turtle.turnRight()
- GoToEnd()
- end
- function RestockTurtle(reservedSlotCount) --restocks the turtle from the storage chests DONE
- print("Restocking turtle...")
- TurnAround()
- GoToEnd()
- turtle.select(reservedSlotCount+1)
- while turtle.suck() == true do --get a stack of items
- for slot = 1,reservedSlotCount do turtle.transferTo(slot,64) end --shove it in the working inventory
- turtle.refuel() --attempt to refuel with the item
- turtle.dropDown() --dump the item in the temp chest
- end
- while turtle.suckDown() == true do --move items from temp to perm chest
- turtle.drop()
- end
- TurnAround()
- GoToEnd()
- if turtle.getFuelLevel() < 100 then
- Rest(300,"sleep","Low on fuel. Slowing down work rate..")
- elseif turtle.getFuelLevel() < 200 then
- Rest(100,"sleep","Low on fuel. Slowing down work rate..")
- end
- end
- function Rest(restTime, restType, heading) --makes the turtle sleep for a time with animations DONE
- term.clear() term.setCursorPos(1,1)
- print(heading)
- local restStep
- while restTime > 0 do
- term.setCursorPos(1,2)
- if restType == "brew" then
- restStep = 1 --must be an odd number
- print("Brewing for "..restTime.."s \n")
- if math.fmod(restTime,2) == 0 then
- print[[
- \
- } \ {
- |O \o |
- | o \ |
- \_____/
- ]]
- else
- print[[
- /
- } / {
- | o / O |
- | / o |
- \_____/
- ]]
- end
- elseif restType == "sleep" then
- restStep = 1 --must be an odd number
- print("Sleeping for "..restTime.."s \n")
- if math.fmod(restTime,2) == 0 then
- print[[
- ==== ====
- // // === ===
- // // // //
- ==== ==== === ===
- ]]
- else
- print[[
- ==== ==== === ===
- // // // //
- // // === ===
- ==== ====
- ]]
- end
- end
- restTime = restTime - restStep
- sleep(restStep)
- end
- term.clear() term.setCursorPos(1,1)
- end
- function TurnAround() --turtle performs a 180 leftwise turn DONE
- turtle.turnLeft() turtle.turnLeft()
- end
- function GoToEnd() --turtle moves until it hits something (break after 8 paces)
- local runCount = 8
- while turtle.forward() == true do
- turtle.forward()
- runCount = runCount - 1
- if runCount == 0 then
- error("\nTurtle is lost!\nForcing quit\n")
- end
- end
- end
- term.clear() term.setCursorPos(1,1)
- print("NAVIGATION ERROR\nStarting program 'Potion Robot v1.2' by YardKing42 aka YK7942\n")
- Main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement