Today I repurposed one of my python random text generators to use as a grotto page generator. Pulling from a corpus made of these dungeon descriptions , this spits out 20 html pages, with hashid filenames and titles from a master color list I’ve compiled (part of which I scraped from Joyce’s Ulysses with another python script). Then I try to detect major color words in those names and assign a background-color to the page body (this is one of those times it would be great to know how to use more advanced machine learning 😒). For not a ton of work, this is creating some pretty cool results! The room descriptions are mushed up rpg-inspired poetry which I like, since this game wouldn’t have any room interactions really, just moving from room to room, looking for/avoiding other people.
room_generator.py
import markovify
import spacy
import re
import io
import random
import webcolors
from unidecode import unidecode
from hashids import Hashids
hashids = Hashids ()
title = " "
index = 0
codexList = []
nlp = spacy . load ( "en_core_web_sm" )
with open ( "rooms.txt" ) as f :
text = f . read ()
text_model = markovify . Text ( text )
text_model = text_model . compile ()
class POSifiedText ( markovify . Text ):
def word_split ( self , sentence ):
return [ "::" . join (( word . orth_ , word . pos_ )) for word in nlp ( sentence )]
def word_join ( self , words ):
sentence = " " . join ( word . split ( "::" )[ 0 ] for word in words )
return sentence
def getElaborateColor ():
colorFO = io . open ( "word_lists/colors.txt" , encoding = "utf-8" )
colorList = list ( colorFO )
selection = random . randint ( 0 , len ( colorList ) - 1 )
elaborateColor = colorList [ selection ]
elaborateColor = elaborateColor . rstrip ( " \n " )
return elaborateColor
def getColor ( elaborateColor ):
red = random . randint ( 0 , 255 )
green = random . randint ( 0 , 255 )
blue = random . randint ( 0 , 255 )
color = []
if "red" in elaborateColor :
red = random . randint ( 100 , 255 )
if "green" in elaborateColor :
green = random . randint ( 100 , 255 )
red -= random . randint ( 100 , 255 )
blue -= random . randint ( 100 , 255 )
if "blue" in elaborateColor :
blue = random . randint ( 100 , 255 )
red -= random . randint ( 100 , 255 )
green -= random . randint ( 100 , 255 )
if "violet" in elaborateColor :
blue = random . randint ( 100 , 255 )
red = random . randint ( 100 , 255 )
green -= random . randint ( 100 , 255 )
if "orange" in elaborateColor :
green = random . randint ( 100 , 255 )
red = random . randint ( 200 , 255 )
blue -= random . randint ( 100 , 255 )
if "tangerine" in elaborateColor :
green = random . randint ( 100 , 255 )
red = random . randint ( 200 , 255 )
blue -= random . randint ( 100 , 255 )
if "yellow" in elaborateColor :
green = random . randint ( 200 , 255 )
red = random . randint ( 200 , 255 )
blue -= random . randint ( 100 , 255 )
if "gold" in elaborateColor :
green = random . randint ( 220 , 255 )
red = random . randint ( 220 , 255 )
blue = random . randint ( 0 , 20 )
if "cyan" in elaborateColor :
red -= random . randint ( 100 , 255 )
green = random . randint ( 200 , 255 )
blue = random . randint ( 200 , 255 )
if "aqua" in elaborateColor :
red = 0
green = random . randint ( 200 , 255 )
blue = random . randint ( 200 , 255 )
if "azure" in elaborateColor :
blue = random . randint ( 200 , 255 )
red = 0
if "brown" in elaborateColor :
red = random . randint ( 200 , 255 )
green = 75
blue = 0
if "chocolate" in elaborateColor :
red = random . randint ( 200 , 255 )
green = 75
blue = 0
if "pink" in elaborateColor :
red = 255
green = random . randint ( 100 , 200 )
blue = random . randint ( 100 , 200 )
if "coral" in elaborateColor :
red = 255
green = random . randint ( 100 , 200 )
blue = random . randint ( 50 , 100 )
if "crimson" in elaborateColor :
red = random . randint ( 200 , 255 )
blue = 38
green = 54
if "fuchsia" in elaborateColor :
red = 145
blue = 92
green = 131
if "gray" in elaborateColor :
red = 100
green = 100
blue = 100
if "black" in elaborateColor :
if ( red > 0 ):
red -= 200
if ( green > 0 ):
green -= 200
if ( blue > 0 ):
blue -= 200
if "white" in elaborateColor :
if ( red < 255 ):
red += 200
if ( green < 255 ):
green += 200
if ( blue < 255 ):
blue += 200
#oh god I don't know how to clamp in python
if ( red > 255 ):
red = 255
if ( green > 255 ):
green = 255
if ( blue > 255 ):
blue = 255
if ( red < 0 ):
red = 0
if ( green < 0 ):
green = 0
if ( blue < 0 ):
blue = 0
color . append ( red )
color . append ( green )
color . append ( blue )
return color
print ( "generating..." )
for i in range ( 8 ):
elaborateColor = getElaborateColor ()
colorhex = webcolors . rgb_to_hex ( getColor ( elaborateColor ))
try :
title = text_model . make_short_sentence ( 60 )
title = title [: - 1 ]
except :
title = text_model . make_short_sentence ( 120 )
hashids = Hashids ( salt = title )
id = hashids . encode ( i )
myfile = "rooms/room-" + str ( i ) + id + ".html"
with open ( myfile , "a" ) as myfile :
myfile . write ( "<html><head><meta charset='UTF-8'><link rel='stylesheet' href='stylesheet.css' type='text/css' media='screen' charset='utf-8'> <title>" + elaborateColor + " room</title></head>" )
myfile . write ( "<body style='background-color:" + colorhex + ";'>" )
myfile . write ( "<section class='description'><h1>" + elaborateColor + " room</h1> <p>" )
for number in range ( 5 ):
myfile . write ( " \n " + text_model . make_sentence () + " " )
myfile . write ( "</p></section>" )
myfile . close ()