# Rainbet Originals for NumWorks
# Mines, Dice, Blackjack, Crash for NumWorks
from kandinsky import fill_rect as R,draw_string as S
from ion import *
from time import sleep
from random import random,randint
BG=(15,24,36);P=(25,37,54);G=(255,196,0);W=(255,255,255)
D=(130,145,165);GR=(0,210,110);RD=(240,70,80);DK=(60,40,45)
bal=1000.0;bt=10
OK=(KEY_OK,KEY_EXE)
PL=((238,241,225),(222,191,193),(144,192,175),(31,196,112),(254,112,67),(168,127,155),(23,137,126),(27,111,137),(250,95,44),(240,72,34),(218,47,63),(220,34,96),(160,64,189),(170,37,150),(79,78,138),(125,36,198))
CV=('bJdCbAdAbIbIdDbAdDbFbGdFbBdEbDbFdHbAdCbFbFdHbAdAbEdAbBbCdAbBdAeA5BeB2A5AbBdFbBbCdAbA1A2E7B2A1AdFbCbD5A2F7C2BdEbCbC5A0B2H7BeB5BdAbCbC2B0A2D1A2C7AeEbDbCdAeA2E1A2DeEbDbDdAeA2F0A2AeEdAbDbEdAeA2C1A2BeFaAbDbFdAeA2B1A2AeGaAbDbHeA2CeGaAbDbIeA2AeGaCbCbIaA5AaCeCaDbCbJaMbAbIaObDaTaXaXaMbA4AaA4AaGaF4A0B1B0A1EaGaF4A1H5A1AaGaXaXaH4AaB4EaHaH5A4B5C4BaHaXaXaX', '4B9M4I4B9L8A4I4B8A9K8E4E4B8A9I8A4A1A4D8A4A8C4B8B9G4A1A5A0B5A1A0A4A9D4C8B9E8A1A5A0B5A0BeA5A9D8A4B8B4A8D1A2A0B2A1A0B1B9D8G4A8A1A2A1A0A1A2A0A1A0C4A9C8E4A5B1A0A1A0A1A0B2A5A1A2A0A1A9C8A9A8A9A8A1A0A5A0B5A1A0A5B0B2A5A1AeA4A9B8A4B8A1AeA1A0A5A1A0A2B1A5A0D1A2A9C8A9C1A0D5A1A0A1A5A0A1A0D4A9C9C4A0C1D0B1A0A2A0A5A2A5A9D9C1A0A5B1A5A0A1EeA1A0A5A9E9B8A5B1A5A0B5AeA1BeA5D9F9C1A0C1G4A9C8A4A8B9B9A8A9A8A1J9A8E4B8B8C9A8A1A5A1A5B1A5C9A8I8D9A4A1B5B1A5B8K8G4E8A9A8J8X8X8H4H8H8G4A1E4A0A1A8H8G4A1E4A0A1A8H8F4L8F8E4C8B4B8D4D8D8E4P8C8D4D1G4H8A8D4T8C4U8C4U', 'fXfXfL1C5BcBfEfBcAfAcG5A0IcAfBcBeA5C2C7C2A0H5AfBfAeB2A7I0HeBfAeBcA2A7I1A0B5A0DcAeBeAcB5A7I1A0A1A5A0DfAcAeAcBfA5A7I2A0A2A5A1A0B1AfAcAfAcBfA5A7I2A0B1B0B1AfCcD7B2A7C2AeA2B0A1A0D5AfCcD2J1AeA5A0C5AfCcD2EeC7A2A1A5B0CcAfCcD2A7EeD1A0B1CcCfAcD5A7CeF1A0A1DcCfAfAcC5A7BeG1A0A1DcCfAcEeI5AcB5CcDcEeGcA5BcIfAcBfAcA2AeAcQfBcAfAcTfBcBfEcLfAcBfKcAfLfAcDfAcBfAcDfAcAfAcAfAcEfAfAcA0A1BfA1BcA1AcA0A1AfA1AcA0AcA1AcA0A1AfBfAcA0A1GcA1BcA1EcA1BfBfBcAfAcBfCcBfAcCfCcBfDfXfGcIfHfGcA5AcC1BcBfHfXfXfX', '6C3U6D3N2B3D6E3K2A1A4AaA3D6F3I0CaB3D6F3H0B7A6A2AeA3D6D3B6B3E2A0A7C2B3D6D3A6C3C5AaA0B7C2B3D6H3BaB5A0A1A2AeA7A2A3C1A2A6H3A5A9B1B5A2AeA2A3C2A1A3A7A6F3B4A3A2A5AaAeC3D2A3B7B6E3D1A8AaA5AaB5A3B2A3B6A7C6E3A4A1A0A1A4A5A9AaA3C2A3A6B7C6E3A4A0C2A3A9AeA3A2B3A6C7C6E4A1A0B4A3BeA3A2B3A6D7B6E4B0A1A4A3D2A3B6E7B6D1A4A1B8A5A3A2C3A6F7A2A6A7A2A0D1A4B3A2A3C6F7B2C1E4A1A2B3B6D7A6B7C1C0A1E3C6F7F2A0B1B2A3D6E7B6A7F2E3D6F2B7A6A7E2A3B0B2B0C6A0B6A2A0B2A0A2B0A7B3A6A0B2A0A2A0A2A0A6A0B2B0A2A6A0A1A2A0A7B6B0A2A7A6A2A0B2A5A0A1B7A2A0A5A1A0C6A7A6B0A2B1A2A0B2B0C2B1A0A2A0A2A0A6A7A7A6A0C2F3A6A2B0B2B0AeA0A2A7A7B2B3A7A6B7A6B7B6A7A6B7A6C2A6B7K6D7B6A7D6B7E6C2A6B2D6I7A6W7B6V7B6V')
LG='86W/1149V/04135391:3>/24829374>/2482919211:22/24828292;23/1672C3:23/1222632422152534151/023262122212222212221221223/024233123122222212221212214/02472222221312222214224/024542131312221312133322/0332124=2G/03222342212221322343422/1633X/245331S/<6S/>4S'
KS=(KEY_UP,KEY_DOWN,KEY_LEFT,KEY_RIGHT,KEY_OK,KEY_EXE,KEY_BACKSPACE)
def T(t,x,y,c=W,b=BG):S(t,x,y,c,b)
def C(t,y,c=W,b=BG):T(t,160-5*len(t),y,c,b)
def cover(n,x,y):
 d=CV[n];px=0;py=0
 for i in range(0,len(d),2):
  l=ord(d[i+1])-64;R(x+px*3,y+py*3,l*3,3,PL[int(d[i],16)]);px+=l
  if px>23:px=0;py+=1
def logo(x,y):
 r=0
 for row in LG.split("/"):
  px=0;on=0
  for ch in row:
   l=ord(ch)-48
   if on:R(x+px,y+r,l,1,W)
   px+=l;on=1-on
  r+=1
def hdr():
 R(0,0,320,22,P);logo(6,2)
 s="$%.2f"%bal;w=10*len(s);R(306-w,2,w+12,18,BG);T(s,312-w,2,GR)
def cls():
 R(0,0,320,222,BG);hdr()
def key():
 while 1:
  for k in KS:
   if keydown(k):
    while keydown(k):sleep(.01)
    return k
  sleep(.02)
def getbet(n,ci):
 global bt
 if bal<1:return 0
 while 1:
  bt=max(1,min(bt,int(bal)))
  cls();cover(ci,20,50);T(n,112,50,G);T("Bet: $%d"%bt,112,85)
  T("U/D  +-10",112,125,D);T("L/R  /2 x2",112,147,D);T("OK play <x back",112,169,D)
  k=key()
  if k==KEY_UP:bt+=10
  elif k==KEY_DOWN:bt-=10
  elif k==KEY_RIGHT:bt*=2
  elif k==KEY_LEFT:bt//=2
  elif k==KEY_BACKSPACE:return 0
  elif k in OK:return bt
def dice():
 global bal
 b=getbet("DICE",1)
 if not b:return
 t=50;rs=None
 while 1:
  m=99/(100-t)
  cls();T("DICE",10,30,G);T("Bet $%d"%b,180,30)
  T("Roll over  %d"%t,10,60);T("Payout     %.2fx"%m,10,85)
  T("Win chance %d%%"%(100-t),10,110)
  R(10,145,3*t,8,RD);R(10+3*t,145,300-3*t,8,GR)
  if rs:
   R(8+int(3*rs[0]),135,5,28,W);C(rs[1],170,rs[2])
  T("L/R +-1 U/D +-10 OK roll <x",5,198,D)
  k=key()
  if k==KEY_LEFT:t=max(2,t-1);rs=None
  elif k==KEY_RIGHT:t=min(98,t+1);rs=None
  elif k==KEY_UP:t=min(98,t+10);rs=None
  elif k==KEY_DOWN:t=max(2,t-10);rs=None
  elif k==KEY_BACKSPACE:return
  elif k in OK:
   if b>bal:return
   bal-=b;r=randint(0,9999)/100
   if r>t:
    bal+=b*m;rs=(r,"WIN +$%.2f  rolled %.2f"%(b*m-b,r),GR)
   else:rs=(r,"LOSE  rolled %.2f"%r,RD)
def cell(i,v,cur):
 x=12+i%5*36;y=30+i//5*37;c=(P,GR,RD,DK)[v]
 R(x-2,y-2,36,36,G if cur else BG);R(x,y,32,32,c)
 if v==1:R(x+11,y+11,10,10,W)
 if v>1:T("*",x+11,y+7,W,c)
def mpan(m,b,n):
 R(196,24,124,198,BG)
 T("Mines %d"%n,200,40,D);T("%.2fx"%m,200,70,G)
 T("$%.2f"%(b*m),200,95,GR)
 T("OK pick",200,150,D);T("EXE cash",200,172,D)
def mines():
 global bal
 b=getbet("MINES",0)
 if not b or b>bal:return
 n=3
 while 1:
  cls();C("MINES  bet $%d"%b,40,G);C("Mines: %d"%n,90)
  C("L/R change  OK start",150,D)
  k=key()
  if k==KEY_LEFT:n=max(1,n-1)
  elif k==KEY_RIGHT:n=min(24,n+1)
  elif k==KEY_BACKSPACE:return
  elif k in OK:break
 bal-=b;mn=[]
 while len(mn)<n:
  i=randint(0,24)
  if i not in mn:mn.append(i)
 op=[];c=12;q=1.0;m=1.0
 cls()
 for i in range(25):cell(i,0,i==c)
 mpan(m,b,n)
 while 1:
  k=key();o=c
  if k==KEY_LEFT and c%5:c-=1
  elif k==KEY_RIGHT and c%5<4:c+=1
  elif k==KEY_UP and c>4:c-=5
  elif k==KEY_DOWN and c<20:c+=5
  elif k==KEY_OK and c not in op:
   if c in mn:
    for i in mn:cell(i,2 if i==c else 3,0)
    T("BOOM!",200,120,RD);key();return
   i=len(op);q=q*(25-i)/(25-n-i);m=q*.99;op.append(c)
   if len(op)==25-n:k=KEY_EXE
  if k in(KEY_EXE,KEY_BACKSPACE):
   if not op:bal+=b;return
   bal+=b*m;hdr()
   for i in mn:cell(i,3,0)
   T("+$%.2f"%(b*m-b),200,120,GR);key();return
  cell(o,1 if o in op else 0,0);cell(c,1 if c in op else 0,1)
  mpan(m,b,n);hdr()
NM="A23456789TJQK"
def cv(h):
 s=0;a=0
 for c in h:
  s+=min(c,10)
  if c==1:a=1
 return s+10 if a and s<12 else s
def hand(h,y,hide):
 for i in range(len(h)):
  x=10+i*38;R(x,y,32,46,W)
  if hide and i==1:R(x+3,y+3,26,40,G)
  else:T(NM[h[i]-1],x+11,y+14,RD if h[i]%2 else BG,W)
def bjd(p,h,hide,b):
 cls();T("Dealer "+("?" if hide else str(cv(h))),10,26,D)
 hand(h,46,hide);T("You %d   bet $%d"%(cv(p),b),10,100,D)
 hand(p,120,0);T("UP hit  DOWN stand  R dbl",10,198,D)
def bj():
 global bal
 b=getbet("BLACKJACK",2)
 if not b or b>bal:return
 bal-=b
 p=[randint(1,13),randint(1,13)];h=[randint(1,13),randint(1,13)]
 while cv(p)<21:
  bjd(p,h,1,b);k=key()
  if k==KEY_UP:p.append(randint(1,13))
  elif k==KEY_DOWN:break
  elif k==KEY_RIGHT and len(p)==2 and bal>=b:
   bal-=b;b*=2;p.append(randint(1,13));break
 pv=cv(p)
 if pv==21 and len(p)==2:
  w=1 if cv(h)==21 else 2.5
 else:
  if pv<=21:
   while cv(h)<17:h.append(randint(1,13))
  hv=cv(h)
  if pv>21:w=0
  elif hv>21 or pv>hv:w=2
  elif pv==hv:w=1
  else:w=0
 bal+=b*w;bjd(p,h,0,b)
 C(("BUST" if pv>21 else {0:"LOSE",1:"PUSH",2:"WIN",2.5:"BLACKJACK!"}[w])+"  OK",174,GR if w>1 else(D if w else RD))
 key()
def crash():
 global bal
 b=getbet("CRASH",3)
 if not b or b>bal:return
 bal-=b;cp=max(1.0,.99/(1-random()))
 m=1.0;out=0;x=10
 cls();R(10,42,300,150,P);T("OK = cash out   bet $%d"%b,10,198,D);hdr()
 while m<cp:
  if not out and(keydown(KEY_OK) or keydown(KEY_EXE)):
   out=m;bal+=b*m;hdr();T("Cashed %.2fx +$%.2f"%(m,b*m-b),10,23,GR)
  R(x,190-min(145,int((m-1)*40)),3,3,G);x=min(305,x+2)
  T("%.2fx"%m,130,100,GR if out else W,P)
  sleep(.05);m*=1.012
 T("CRASHED @ %.2fx"%cp,80,100,RD,P)
 if not out:T("Lost $%d"%b,10,23,RD)
 sleep(.5);key()
def menu():
 global bal
 s=0;N=("MINES","DICE","BLACKJACK","CRASH");F=(mines,dice,bj,crash);d=1
 while 1:
  if d:
   cls();T("Rainbet Originals",10,26)
   for i in range(4):cover(i,7+i*78,52)
   d=0
  for i in range(4):
   c=G if i==s else BG;x=4+i*78
   R(x,49,78,3,c);R(x,149,78,3,c);R(x,49,3,103,c);R(x+75,49,3,103,c)
  R(0,160,320,62,BG);C(N[s],168,G);C("< > choose   OK play",196,D)
  k=key()
  if k==KEY_LEFT:s=(s-1)%4
  elif k==KEY_RIGHT:s=(s+1)%4
  elif k in OK:
   F[s]();d=1
   if bal<1:bal=1000.0
menu()
