SHOW:
|
|
- or go back to the newest paste.
| 1 | -- ComputerCraft D20 (or whatever-sided however-many dice) | |
| 2 | -- pastebin get ZYKQkUPB die | |
| 3 | ||
| 4 | - | local range = {1,20}
|
| 4 | + | |
| 5 | local scr_x, scr_y = term.getSize() | |
| 6 | - | local dice = paintutils.loadImage("dice.nfp")
|
| 6 | + | local vantage = 0 |
| 7 | - | local tc = term.current().setVisible |
| 7 | + | local useQuips = false |
| 8 | - | function render(x,y,number) |
| 8 | + | |
| 9 | - | tc(false) |
| 9 | + | local dices = 1 |
| 10 | - | for a = 1, scr_y do |
| 10 | + | |
| 11 | - | term.setCursorPos(1,a) |
| 11 | + | local range = {1,20} -- determines die size, basically random range
|
| 12 | - | if a > scr_y/2 then |
| 12 | + | |
| 13 | - | term.setBackgroundColor(colors.brown) |
| 13 | + | local dice = {{0,512,512,8,8,512,512,0},{512,512,8,8,8,8,512,512},{2048,8,8,8,8,8,8,2048},{2048,512,8,8,8,8,512,2048},{0,2048,512,512,512,512,2048,0},{0,0,0,512,512,0,0,0}}
|
| 14 | - | else |
| 14 | + | local nums = { --numnumnum...
|
| 15 | - | term.setBackgroundColor(colors.yellow) |
| 15 | + | [0] = {{1,1,1},{1,0,1},{1,0,1},{1,0,1},{1,1,1}},
|
| 16 | - | end |
| 16 | + | [1] = {{1,1},{0,1},{0,1},{0,1},{1,1,1}},
|
| 17 | - | term.clearLine() |
| 17 | + | [2] = {{1,1},{0,0,1},{0,1},{1},{1,1,1}},
|
| 18 | - | end |
| 18 | + | [3] = {{1,1},{0,0,1},{1,1},{0,0,1},{1,1,1}},
|
| 19 | - | paintutils.drawImage(dice,x-dx,y-(dy-1)) |
| 19 | + | [4] = {{1,0,1},{1,0,1},{1,1,1},{0,0,1},{0,0,1}},
|
| 20 | - | term.setCursorPos(x,y) |
| 20 | + | [5] = {{1,1,1},{1},{1,1,1},{0,0,1},{1,1,1}},
|
| 21 | - | term.setTextColor(colors.black) |
| 21 | + | [6] = {{1,1,1},{1},{1,1,1},{1,0,1},{1,1,1}},
|
| 22 | - | term.setBackgroundColor(colors.lightBlue) |
| 22 | + | [7] = {{1,1,1},{0,0,1},{0,1},{0,1},{0,1}},
|
| 23 | - | term.write(tostring(number)) |
| 23 | + | [8] = {{1,1,1},{1,0,1},{0,1},{1,0,1},{1,1,1}},
|
| 24 | - | tc(true) |
| 24 | + | [9] = {{1,1,1},{1,0,1},{1,1,1},{0,0,1},{0,0,1}},
|
| 25 | } | |
| 26 | local quips = { --witty quips for your die!
| |
| 27 | [1] = {"Rocks fall, everybody dies","You've ran out of dumb luck.","Goddamn it.","Hope you have a tampon for that stab wound.","Your dice hate you.","You miss and chop off your arm by mistake.","YOU HAVE NO CHANCE TO SURVIVE MAKE YOUR TIME .","HA HA HA HA ..."},
| |
| 28 | [2] = {"Man, this sucks.","Let's hope that wasn't a dodge roll.","One is the loneliest number...","Stupid prime numbers.","That's as much as two ones. And that's terrible.","What is this, a roll for ants??"},
| |
| 29 | [3] = {"Eh, this, uh, isn't good.","I hope that was a 'try to die' roll.","Honestly, two can be as bad as one.","Stupid primes."},
| |
| 30 | [4] = {"TWO TIMES FOUR IS HALF OF SIXTEEN","You're a fifth there...!","Bad luck to all chinese players!"},
| |
| 31 | - | local evt, key = os.pullEvent("key")
|
| 31 | + | [5] = {"You're a quarter there!","You are caught between vier and sechs.","Not a-good, no!","Stupid primes."},
|
| 32 | - | if key == keys.space then |
| 32 | + | [6] = {"Your accuracy stat better be great.","Not as bad as it could've been...","Hahaha six sounds like sex hahaha."},
|
| 33 | - | for a = -2, (scr_y/2)+1 do |
| 33 | + | [7] = {"A magical number...and it's mediocre.","I hate seven! Annoying to do math with.","Stupid primes."},
|
| 34 | - | render(scr_x/2,a,math.random(range[1],range[2])) |
| 34 | + | [8] = {"gr8 m8 i r8 8/8","Eight. Eight. Eight.","Not a two, but...","It's a power of two, but..."},
|
| 35 | - | sleep(0) |
| 35 | + | [9] = {"NEIN NEIN NEIN NEIN","You're getting there.","Your sword grazes the enemy!","Your sword glazes the enemy!"},
|
| 36 | - | end |
| 36 | + | [10] = {"Ooohhh, you're halfway there...","Four tens, and you've stolen a lot of cake.","...passable."},
|
| 37 | - | end |
| 37 | + | [11] = {"HEY IT'S A PALINDROME","Eleven is up there with 7 in terms of math.","Stupid primes."},
|
| 38 | [12] = {"Twelve...now THAT'S a number not to trifle with.","That's a solid number.","Good enought, I guess."},
| |
| 39 | [13] = {"Stupid primes.","I'd call you unlucky, but this isn't a bad throw.","Amount of nobodies in Org. XIII"},
| |
| 40 | [14] = {"What's worse than a seven? TWO sevens!!","Okay, now you're dealin' some damage","Statistically better than a 13."},
| |
| 41 | [15] = {"Three quarters there!","You done pretty good for yourself!","Your sword stabs the enemy! YOU WIN!"},
| |
| 42 | [16] = {"TWO TIMES FOUR IS HALF OF SIXTEEN","A nice, even power of two!","Fuck yes!","Hey, that's my age...","No cooler a number...besides "..range[2]},
| |
| 43 | [17] = {"Goddamn primes!","Your arrow hits the orc from afar!","Hey-you're a lucky man!","Great scott!"},
| |
| 44 | [18] = {"Your cleaver hits the ant, it drops 40 GOLD.","You perceive a small crack 600 feet away.","yay"},
| |
| 45 | [19] = {"That's really good!","Don't despair! You've no need, honestly.","Noice.","Aren't you glad you're using CC?","Stupid primes."},
| |
| 46 | [20] = {"You're a natural! (twenty)","Damn right!!","Nice...throw!","All your dreams...realized!","SMAAAAAAASH!!","You shot an ant from a mile away!","Fuck yeah!!","Eat shit, monster!!"},
| |
| 47 | } | |
| 48 | ||
| 49 | local cwrite = function(txt,x,y) | |
| 50 | local _x,_y = term.getCursorPos() | |
| 51 | term.setCursorPos((x or math.ceil(scr_x/2))-(#txt/2),y or _y) | |
| 52 | write(txt) | |
| 53 | end | |
| 54 | ||
| 55 | local choice = function(input,verbose) | |
| 56 | if not input then | |
| 57 | input = "yn" | |
| 58 | end | |
| 59 | if verbose then | |
| 60 | write("[")
| |
| 61 | for a = 1, #input do | |
| 62 | write(input:sub(a,a):upper()) | |
| 63 | if a < #input then | |
| 64 | write(",")
| |
| 65 | end | |
| 66 | end | |
| 67 | write("]?")
| |
| 68 | end | |
| 69 | local evt,char | |
| 70 | repeat | |
| 71 | evt,char = os.pullEvent("char")
| |
| 72 | until string.find(input:lower(),char:lower()) | |
| 73 | if verbose then | |
| 74 | print(char:upper()) | |
| 75 | end | |
| 76 | local pos = string.find(input:lower(),char:lower()) | |
| 77 | return pos, char:lower() | |
| 78 | end | |
| 79 | ||
| 80 | local tc = function(value) | |
| 81 | if term.current().setVisible then | |
| 82 | term.current().setVisible(value) | |
| 83 | end | |
| 84 | end | |
| 85 | ||
| 86 | local render = function(x,y,number) | |
| 87 | tc(false) | |
| 88 | for a = 1, scr_y do | |
| 89 | term.setCursorPos(1,a) | |
| 90 | if a > scr_y/2 then | |
| 91 | term.setBackgroundColor(colors.brown) | |
| 92 | else | |
| 93 | term.setBackgroundColor(colors.yellow) | |
| 94 | end | |
| 95 | term.clearLine() | |
| 96 | end | |
| 97 | paintutils.drawImage(dice,x-dx,y-(dy-1)) | |
| 98 | term.setTextColor(colors.black) | |
| 99 | term.setBackgroundColor(colors.lightBlue) | |
| 100 | cwrite(tostring(number),x+1,y) | |
| 101 | term.setCursorPos(1,scr_y-3) | |
| 102 | term.setBackgroundColor(colors.brown) | |
| 103 | term.setTextColor(colors.white) | |
| 104 | print("(1) "..range[2].." sides")
| |
| 105 | print("(2) "..dices.." dice")
| |
| 106 | write("(3) ")
| |
| 107 | if vantage == 0 then | |
| 108 | write("Adds all dice")
| |
| 109 | elseif vantage == 1 then | |
| 110 | write("Advantage")
| |
| 111 | elseif vantage == -1 then | |
| 112 | write("Disadvantage")
| |
| 113 | end | |
| 114 | tc(true) | |
| 115 | end | |
| 116 | ||
| 117 | local displayNum = function(number) | |
| 118 | local x,y = term.getCursorPos() | |
| 119 | local len = 4 | |
| 120 | for a = 1, #tostring(number) do | |
| 121 | local n = tonumber(tostring(number):sub(a,a)) | |
| 122 | if nums[n] then | |
| 123 | paintutils.drawImage(nums[n],x,y) | |
| 124 | x = x + len | |
| 125 | end | |
| 126 | end | |
| 127 | end | |
| 128 | ||
| 129 | local flash = function(times) | |
| 130 | local bg = term.getBackgroundColor() | |
| 131 | local flashes = {
| |
| 132 | colors.black, | |
| 133 | colors.gray, | |
| 134 | colors.red, | |
| 135 | colors.lightGray, | |
| 136 | colors.white, | |
| 137 | colors.red, | |
| 138 | colors.gray, | |
| 139 | } | |
| 140 | for a = 1, times do | |
| 141 | for b = 1, #flashes do | |
| 142 | term.setBackgroundColor(flashes[b]) | |
| 143 | term.clear() | |
| 144 | sleep(0) | |
| 145 | end | |
| 146 | end | |
| 147 | term.setBackgroundColor(colors.black) | |
| 148 | term.clear() | |
| 149 | sleep(0) | |
| 150 | term.setBackgroundColor(bg) | |
| 151 | end | |
| 152 | ||
| 153 | --os.queueEvent("key", keys.space)
| |
| 154 | render(scr_x/2,-6,"") | |
| 155 | ||
| 156 | local lastnum | |
| 157 | local outcome | |
| 158 | while true do | |
| 159 | local evt, key = os.pullEvent() | |
| 160 | if (evt == "key" and (key == keys.space or key == keys.enter) or evt == "mouse_click") then | |
| 161 | if vantage == 0 then | |
| 162 | outcome = 0 | |
| 163 | else | |
| 164 | outcome = {}
| |
| 165 | end | |
| 166 | for d = 1, dices do | |
| 167 | for a = -2, math.floor(scr_y/2) do | |
| 168 | lastnum = math.random(range[1],range[2]) | |
| 169 | render(scr_x/2,a,lastnum) | |
| 170 | sleep(0) | |
| 171 | end | |
| 172 | lastnum = math.random(range[1],range[2]) | |
| 173 | if vantage == 0 then | |
| 174 | outcome = outcome + lastnum | |
| 175 | else | |
| 176 | table.insert(outcome,lastnum) | |
| 177 | end | |
| 178 | render(scr_x/2,(scr_y/2)-1,lastnum) | |
| 179 | term.setCursorPos(scr_x/2-2,scr_y/2+3) | |
| 180 | term.setBackgroundColor(colors.brown) | |
| 181 | write("*tck*")
| |
| 182 | end | |
| 183 | sleep(0) | |
| 184 | render(scr_x/2,(scr_y/2),lastnum) | |
| 185 | if vantage == 1 then | |
| 186 | outcome = math.max(unpack(outcome)) | |
| 187 | elseif vantage == -1 then | |
| 188 | outcome = math.min(unpack(outcome)) | |
| 189 | end | |
| 190 | if outcome == range[2]*dices then | |
| 191 | flash(2) | |
| 192 | render(scr_x/2,math.floor(scr_y/2),lastnum) | |
| 193 | end | |
| 194 | term.setBackgroundColor(colors.yellow) | |
| 195 | if useQuips and (range[2] == 20) then | |
| 196 | if quips[lastnum] then | |
| 197 | term.setTextColor(colors.black) | |
| 198 | cwrite(quips[lastnum][math.random(1,#quips[lastnum])],nil,2) | |
| 199 | end | |
| 200 | elseif range[2] == 6 then | |
| 201 | if dices == 3 then | |
| 202 | term.setTextColor(colors.black) | |
| 203 | cwrite("For krist's sake...",nil,2)
| |
| 204 | end | |
| 205 | end | |
| 206 | term.setCursorPos((scr_x/2)-(#tostring(lastnum)*2)+2,scr_y-5) | |
| 207 | displayNum(outcome) | |
| 208 | elseif key == keys.q then | |
| 209 | term.setBackgroundColor(colors.black) | |
| 210 | term.clear() | |
| 211 | term.setCursorPos(1,1) | |
| 212 | sleep(0) | |
| 213 | return lastnum | |
| 214 | elseif key == keys.one then | |
| 215 | render(scr_x/2,-6,"") | |
| 216 | term.setCursorPos(1,1) | |
| 217 | term.setTextColor(colors.black) | |
| 218 | term.setBackgroundColor(colors.yellow) | |
| 219 | write("# of sides? ")
| |
| 220 | sleep(0) | |
| 221 | range[2] = tonumber(read()) or range[2] | |
| 222 | render(scr_x/2,-6,"") | |
| 223 | sleep(0) | |
| 224 | elseif key == keys.two then | |
| 225 | render(scr_x/2,-6,"") | |
| 226 | term.setCursorPos(1,1) | |
| 227 | term.setTextColor(colors.black) | |
| 228 | term.setBackgroundColor(colors.yellow) | |
| 229 | write("# of dice? ")
| |
| 230 | sleep(0) | |
| 231 | dices = tonumber(read()) or dices | |
| 232 | if dices <= 0 then | |
| 233 | dices = 0 | |
| 234 | elseif dices >= 100 then | |
| 235 | dices = 1 | |
| 236 | end | |
| 237 | render(scr_x/2,-6,"") | |
| 238 | sleep(0) | |
| 239 | elseif key == keys.three then | |
| 240 | render(scr_x/2,-6,"") | |
| 241 | term.setCursorPos(1,1) | |
| 242 | term.setTextColor(colors.black) | |
| 243 | term.setBackgroundColor(colors.yellow) | |
| 244 | print("(1) Advantage")
| |
| 245 | print("(2) Disadvantage")
| |
| 246 | print("(3) Add")
| |
| 247 | local utt | |
| 248 | sleep(0) | |
| 249 | repeat | |
| 250 | uut = choice("123",false)
| |
| 251 | until uut >= 1 and uut <= 3 | |
| 252 | if uut == 1 then | |
| 253 | vantage = 1 | |
| 254 | elseif uut == 2 then | |
| 255 | vantage = -1 | |
| 256 | else | |
| 257 | vantage = 0 | |
| 258 | end | |
| 259 | render(scr_x/2,-6,"") | |
| 260 | sleep(0.15) | |
| 261 | end | |
| 262 | end |