123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- #!/usr/bin/env python3
- from PIL import Image
- from PIL import ImageFont
- from PIL import ImageDraw
- import csv
- import random
- import os
- fileDir = os.path.dirname(os.path.abspath(__file__))
- fileDir = fileDir +"/"
- def replaceText(text):
- """This function replace $WILDCARD with a word found in subs.csv
- subs.csv definition is 1st colum $WILDCARD, subsequent columns, possible values (chosen at random), delimiter is ;"""
- with open(fileDir+"subs.csv") as rtext:
- csvReader = csv.reader(rtext,delimiter=";")
- for row in csvReader:
- if text.find(row[0]) != -1:
- text = text.replace(row[0],row[random.randint(1,len(row)-1)])
- return text
- def fetchText(indText):
- """This function fetch the text for the image with just only one character
- rtext.csv definition is: 1st column the name of the file (i.e. A001.png), 2nd x-coord, 3rd y-coord, 4th and subsequent, the possible outcomes
- Delimiter is ; and line feeds @, if there aren't any options, it returns 0 (no text)
- It returns a tuple (x,y,text)"""
- with open(fileDir+"rtext.csv") as rtext:
- csvReader = csv.reader(rtext,delimiter=';')
- for row in csvReader:
- if row[0]==indText:
- if len(row)>2:
- return row[1],row[2],row[random.randint(3,len(row)-1)].replace('@','\n')
- else:
- return 0
- def fetch2Text(indText):
- """This function fetch the text for the image with two characters
- rtext.csv definition is: 1st column the name of the file (i.e. B001.png), 2nd x-coord, 3rd y-coord of the first string
- 4th x-coord, 5th y-coord of the second string, 6th and subsequent are the outcomes, alternated as the odd one is an
- answer to the even one
- Delimiter is ; and line feeds @, if there aren't any options, it returns 0 (no text)
- It returns a tuple(x1,y1,x2,y2,text1,text2)"""
- with open(fileDir+"r2text.csv") as rtext:
- csvReader = csv.reader(rtext,delimiter=';')
- for row in csvReader:
- if row[0]==indText:
- if len(row)>2:
- rand1 = random.randint(5,len(row)-1)
- if rand1 %2 == 0:
- rand1 -=1
- rand2 = rand1+1
- return row[1],row[2],row[3],row[4],row[rand1].replace('@','\n'),row[rand2].replace('@','\n')
- else:
- return 0
-
- def fetchVign():
- """This functions fetch an image, randomly, chosen from a markov tree defined in ram.csv
- ram.csv definition is: 1st column the name of the image (without extension), subsequent columns, possible outcomes chosen randomly
- It returns an array with the file names"""
- starts = []
- startdest = []
- nvign = 0
- currVign = "000"
- story = []
- with open(fileDir+"ram.csv") as ram:
- csvReader = csv.reader(ram)
- for row in csvReader:
- starts.append(row[0])
- startdest.append(row)
- while nvign <= 3:
- story.append(startdest[starts.index(currVign)][random.randint(1,len(startdest[starts.index(currVign)])-1)])
- currVign = story[nvign]
- if story[nvign] == "B00":
- story[nvign] += "."
- story[nvign] += str(random.randint(0,2))
- story[nvign]+=".png"
- nvign +=1
- return story
-
- def addThing(indVign):
- """This function adds a small image (object) to a larger image
- obj.csv definition is: name of the image (i.e. A001.png), x-coord, y-coord, subsequent columns possible outcomes
- It returns a tuple (object file name, x, y)"""
- with open(fileDir+"obj.csv") as obj:
- csvReader = csv.reader(obj)
- for row in csvReader:
- if row[0] == indVign:
- return row[random.randint(3,len(row)-1)],row[1],row[2]
- return 0
- def writeStrip(story):
- """This function creates the strip returning an image object that could be saved or viewed. It takes an array with filenames as parameter
- The first image is always 000, then appends to strip the files, then decorates it fetching text and adding objects"""
- strip = []
- for indVign in story:
- if indVign!="000":
- vign = Image.open(fileDir+indVign).convert('RGBA')
- addtext = ImageDraw.Draw(vign)
- fnt = ImageFont.truetype(fileDir+"ubuntu.ttf",16)
- if indVign[0] == 'A':
- textVign = fetchText(indVign)
- if textVign !=0:
- text1 = textVign[2]
- if text1.find('$') != -1:
- text1 = replaceText(text1)
- addtext.multiline_text((int(textVign[0]),int(textVign[1])),text1,fill="#000000",font=fnt,align="center")
- else:
- textVign = fetch2Text(indVign)
- if textVign!=0:
- text1 = textVign[4]
- text2 = textVign[5]
- if text1.find('$') != -1:
- text1 = replaceText(text1)
- if text2.find('$') != -1:
- text2 = replaceText(text2)
- addtext.multiline_text((int(textVign[0]),int(textVign[1])),text1,fill="#000000",font=fnt,align="center")
- addtext.multiline_text((int(textVign[2]),int(textVign[3])),text2,fill="#000000",font=fnt,align="center")
- obj = addThing(indVign)
- if obj!=0:
- objImg = Image.open(fileDir+obj[0])
- vign.paste(objImg,(int(obj[1]),int(obj[2])))
- strip.append(vign)
- image = Image.new('RGBA',(2400,500))
- xshift=0
- for vign in strip:
- image.paste(vign,(xshift,0))
- xshift += 600
- return image
- def createStrip(name):
- """Create strip and save it
- createStrip(str path/filename)"""
- try:
- story = fetchVign()
- finalStrip = writeStrip(story)
- finalStrip.save(name)
- return 0
- except Exception as err:
- return err
- if __name__ == "__main__":
- story = fetchVign()
- finalStrip = writeStrip(story)
- finalStrip.show()
|