View difference between Paste ID: ZYKQkUPB and bqZEKaj1
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