sbsheriff/bingo.py

169 lines
5.5 KiB
Python

from cgi import test
from cmath import pi
from tkinter import CENTER
from PIL import Image, ImageDraw, ImageFont, ImagePath
import textwrap
import botOptions
import random
import math
import time
watermarkFont = ImageFont.truetype('Roboto-Bold.ttf',120)
textFont = ImageFont.truetype('Roboto-Bold.ttf',23)
def generate_bingo(playerName,seed):
random.seed(seed)
background = Image.open('background.png')
midground = Image.open('midground.png')
draw = ImageDraw.Draw(background)
#Draw Watermark
draw.text((500,1000),playerName,font=watermarkFont,fill=(100,0,0),anchor='mb')
background.paste(midground,(0,0),midground)
selectedTasks = random.sample(botOptions.alternatives,25)
for x in range(0,5):
for y in range(0,5):
wrapText = textwrap.fill(text=selectedTasks.pop(),width=13)
draw.multiline_text((137+(180*x),267+(180*y)),wrapText,font=textFont,fill=(0,0,0,),anchor='mm',align=CENTER)
return background
def generate_gif_test(displayname,tier):
images = []
frameCount = 80
startAngle = random.random()*720
im = Image.new("RGBA", (582, 582), (44, 47, 51,255))
wheelGenResult = drawWheel(tier)
wheel = wheelGenResult[0]
endAngle = (startAngle+(10*(frameCount-1)))%360
#print(endAngle)
targetAngle = 180-endAngle
#Calculate winning segment
if endAngle > 180:
targetAngle = 360 - endAngle + 180
#print(wheelGenResult)
#print(targetAngle)
for n,seg in enumerate(wheelGenResult[1]):
if seg[0]+seg[1] > targetAngle:
reward = getTierAwards(tier)[n][2]
#print(reward)
break
dot = Image.open('dot.png')
for n in range(0,frameCount):
frame = im.copy()
draw = ImageDraw.Draw(frame)
rotwheel = wheel.rotate(startAngle+(n*10))
rotwheel.paste(dot,(0,0),dot)
frame.paste(rotwheel,(0,0),rotwheel)
images.append(frame)
c=im.width/2
#draw.line((c,c)+(c+250*math.sin((endAngle)/180*pi),c+250*math.cos((endAngle)/180*pi)))
images[0].save(displayname+'.gif',
save_all=True,
append_images=images[1:],
duration=22,
loop=1)
return reward
def getTierAwards(number):
#imageIcons
#Tier one
tier1 = [
(0,Image.open('resources/1kweps.png'),"1000 Weapons"),
(0,Image.open('resources/250kgold.png'),"250k Parish Gold"),
(0,Image.open('resources/250cat.png'),"250 Catapults"),
(0,Image.open('resources/100kpitch.png'),"100k Pitch"),
(0,Image.open('resources/fullbanquet.png'),"2700 Banqueting Goods"),
(10,Image.open('resources/t2.png'),"T2")
]
#Tier two
tier2 = [
(0,Image.open('resources/500kgold.png'),"500k Parish Gold"),
(0,Image.open('resources/500cat.png'),"500 Catapults"),
(0,Image.open('resources/2kweps.png'),"2000 Weapons"),
(6,Image.open('resources/t3.png'),"T3")
]
#Tier three
tier3 = [
(0,Image.open('resources/1mgold.png'),"1MILLION GOLD"),
(0,Image.open('resources/1kcat.png'),"1000 Catapults"),
(0,Image.open('resources/3kweps.png'),"3000 Weapons"),
(0,Image.open('resources/5crowns.png'),"$5 Crown Gift")
]
if number >= 3:
return tier3
elif number == 2:
return tier2
else:
return tier1
def drawWheel(tier):
awards = getTierAwards(tier)
im = Image.new("RGBA", (582, 582), (44, 47, 51,0))
c = im.width/2
radius = 290
segments = []
#generate segment sizes
fairChance = 100
specials = 0
circleCheck = 0
for a in awards:
if a[0] > 0:
fairChance -= a[0]
specials +=1
for award in awards:
#set arclengths
if award == awards[-1]:
arc = 360-circleCheck
circleCheck += arc
segments.append((arc,award))
break
if award[0] == 0:
arc = int((361*fairChance/100)/(len(awards)-specials))
circleCheck += arc
segments.append((arc,award))
else:
arc = int(361*award[0]/100)
circleCheck += arc
segments.append((arc,award))
polygons = []
iconPositions = []
sectorAreas = []
sectorStart = 0
for seg in segments:
sectorSize = seg[0]
polygons.append(drawSegmentVector(sectorStart,sectorSize,c,radius))
sectorAreas.append((sectorStart,sectorSize))
iconPositions.append(int(sectorStart+(sectorSize/2)))
sectorStart += seg[0]
imdraw = ImageDraw.Draw(im)
#selectedColors = random.sample(circleColors,len(polygons))
for polys in polygons:
imdraw.polygon(polys,fill=random.choice(botOptions.circleColors),outline='black')
#add icons to center of segment
for index,iconArc in enumerate(iconPositions):
icon = awards[index][1]
rotIcon = icon.rotate(iconArc-180)
imgSize = icon.size
im.paste(rotIcon,(int(c+(radius*0.75)*math.sin((iconArc)/180*pi))-int(imgSize[0]/2),int(c+(radius*0.75)*math.cos((iconArc)/180*pi))-int(imgSize[1]/2)),mask=rotIcon)
#im.show()
return((im,sectorAreas))
def drawSegmentVector(arcStart,arcLength,center,radius):
vectors = []
vectors.append((center,center)) #Start in center
for a in range(0,arcLength+1):
vectors.append((center+radius*math.sin((a+arcStart)/180*pi),center+radius*math.cos((a+arcStart)/180*pi)))
vectors.append((center,center)) #End in center
return vectors
#generate_gif_test("test",1)