|
|
|
|
|
|
|
|
import random as r |
|
|
import random as r |
|
|
import argparse |
|
|
import argparse |
|
|
import sys |
|
|
import sys |
|
|
|
|
|
import adversaries |
|
|
|
|
|
|
|
|
beg = ["a","e","i","o","u","ba","be","bi","bo","bu","by","y","da","de","di","do","du","dy","fa","fi","fo","fe","fu","ga","ge","gi","go","gu","ka","ke","ki","ko","ku","ky","ma","me","mi","mo","mu","na","ne","ni","no","nu","pa","pe","pi","po","pu","ra","re","ri","ro","ru","ry","sa","se","si","so","su","ta","te","ti","to","tu","ty","wa","we","wi","wo","wy","za","ze","zi","zo","zu","zy"] |
|
|
beg = ["a","e","i","o","u","ba","be","bi","bo","bu","by","y","da","de","di","do","du","dy","fa","fi","fo","fe","fu","ga","ge","gi","go","gu","ka","ke","ki","ko","ku","ky","ma","me","mi","mo","mu","na","ne","ni","no","nu","pa","pe","pi","po","pu","ra","re","ri","ro","ru","ry","sa","se","si","so","su","ta","te","ti","to","tu","ty","wa","we","wi","wo","wy","za","ze","zi","zo","zu","zy"] |
|
|
mid = beg + ["l","x","n","r"] |
|
|
mid = beg + ["l","x","n","r"] |
|
|
|
|
|
|
|
|
loc1 = ["friendly","hostile","derelict","airless","poison-filled/covered","overgrown","looted","burning","frozen","haunted","infested"] |
|
|
loc1 = ["friendly","hostile","derelict","airless","poison-filled/covered","overgrown","looted","burning","frozen","haunted","infested"] |
|
|
loc2 = ["asteroid","moon","space station","spaceship","ringworld","Dyson sphere","planet","Space Whale","pocket of folded space","time vortex","Reroll"] |
|
|
loc2 = ["asteroid","moon","space station","spaceship","ringworld","Dyson sphere","planet","Space Whale","pocket of folded space","time vortex","Reroll"] |
|
|
miss = ["explore","loot everything not bolted down too securely","find the last group of kobolds who came here","find a rumored secret weapon","find a way to break someone else's secret weapon","claim this place in the name of the Kobold Empire","make friends","rediscover lost technology","find lost magical items","find and defeat a powerful enemy"] |
|
|
miss = ["explore","loot everything not bolted down too securely","find the last group of kobolds who came here","find a rumored secret weapon","find a way to break someone else's secret weapon","claim this place in the name of the Kobold Empire","make friends","rediscover lost technology","find lost magical items","find and defeat a powerful enemy"] |
|
|
prob = [ |
|
|
|
|
|
{ |
|
|
|
|
|
"id": 0, |
|
|
|
|
|
"name": "an Undead Sample Pack (swarm of zombies and skeletons)", |
|
|
|
|
|
"shortname": "undead", |
|
|
|
|
|
"stats": [0,5,2,6], |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"id": 1, |
|
|
|
|
|
"name": "a rival band of kobolds", |
|
|
|
|
|
"shortname": "kobold rivals", |
|
|
|
|
|
"stats": [3,3,4,4], |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"id": 2, |
|
|
|
|
|
"name": "a detachment from the Elf Armada", |
|
|
|
|
|
"shortname": "elves", |
|
|
|
|
|
"stats": [4,3,5,4], |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"id": 3, |
|
|
|
|
|
"name": "refugees with parasites. Big parasites", |
|
|
|
|
|
"shortname": "refugees", |
|
|
|
|
|
"stats": [2,4,0,0], |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"id": 4, |
|
|
|
|
|
"name": "an artificial intelligence bent on multi-world domination", |
|
|
|
|
|
"shortname": "AI", |
|
|
|
|
|
"stats": [4,1,6,3], |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"id": 5, |
|
|
|
|
|
"name": "robot spiders", |
|
|
|
|
|
"shortname": "spiders", |
|
|
|
|
|
"stats": [3,3,2,4], |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"id": 6, |
|
|
|
|
|
"name": "semi-intelligent metal eating slime", |
|
|
|
|
|
"shortname": "slime", |
|
|
|
|
|
"stats": [0,2,1,5], |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"id": 7, |
|
|
|
|
|
"name": "a living asteroid that intends to follow the kobolds home like the largest puppy", |
|
|
|
|
|
"shortname": "asteroid", |
|
|
|
|
|
"stats": [2,3,1,6], |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"id": 8, |
|
|
|
|
|
"name": "an old lich that wants everyone to stay off of their 'lawn'", |
|
|
|
|
|
"shortname": "lich", |
|
|
|
|
|
"stats": [5,2,6,3], |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"id": 9, |
|
|
|
|
|
"name": "elder gods hailing from the dark spaces between the stars", |
|
|
|
|
|
"shortname": "gods", |
|
|
|
|
|
"stats": [0,6,6,6], |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
"id": 10, |
|
|
|
|
|
"name": "a Flying Brain Monster", |
|
|
|
|
|
"shortname": "Flying Brain Monster", |
|
|
|
|
|
"stats": [2,3,6,1], |
|
|
|
|
|
}, |
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
prob = adversaries.prob |
|
|
|
|
|
# [ |
|
|
|
|
|
# { |
|
|
|
|
|
# "id": 0, |
|
|
|
|
|
# "name": "an Undead Sample Pack (swarm of zombies and skeletons)", |
|
|
|
|
|
# "shortname": "undead", |
|
|
|
|
|
# "stats": [0,5,2,6], |
|
|
|
|
|
# }, |
|
|
|
|
|
# { |
|
|
|
|
|
# "id": 1, |
|
|
|
|
|
# "name": "a rival band of kobolds", |
|
|
|
|
|
# "shortname": "kobold rivals", |
|
|
|
|
|
# "stats": [3,3,4,4], |
|
|
|
|
|
# }, |
|
|
|
|
|
# { |
|
|
|
|
|
# "id": 2, |
|
|
|
|
|
# "name": "a detachment from the Elf Armada", |
|
|
|
|
|
# "shortname": "elves", |
|
|
|
|
|
# "stats": [4,3,5,4], |
|
|
|
|
|
# }, |
|
|
|
|
|
# { |
|
|
|
|
|
# "id": 3, |
|
|
|
|
|
# "name": "refugees with parasites. Big parasites", |
|
|
|
|
|
# "shortname": "refugees", |
|
|
|
|
|
# "stats": [2,4,0,0], |
|
|
|
|
|
# }, |
|
|
|
|
|
# { |
|
|
|
|
|
# "id": 4, |
|
|
|
|
|
# "name": "an artificial intelligence bent on multi-world domination", |
|
|
|
|
|
# "shortname": "AI", |
|
|
|
|
|
# "stats": [4,1,6,3], |
|
|
|
|
|
# }, |
|
|
|
|
|
# { |
|
|
|
|
|
# "id": 5, |
|
|
|
|
|
# "name": "robot spiders", |
|
|
|
|
|
# "shortname": "spiders", |
|
|
|
|
|
# "stats": [3,3,2,4], |
|
|
|
|
|
# }, |
|
|
|
|
|
# { |
|
|
|
|
|
# "id": 6, |
|
|
|
|
|
# "name": "semi-intelligent metal eating slime", |
|
|
|
|
|
# "shortname": "slime", |
|
|
|
|
|
# "stats": [0,2,1,5], |
|
|
|
|
|
# }, |
|
|
|
|
|
# { |
|
|
|
|
|
# "id": 7, |
|
|
|
|
|
# "name": "a living asteroid that intends to follow the kobolds home like the largest puppy", |
|
|
|
|
|
# "shortname": "asteroid", |
|
|
|
|
|
# "stats": [2,3,1,6], |
|
|
|
|
|
# }, |
|
|
|
|
|
# { |
|
|
|
|
|
# "id": 8, |
|
|
|
|
|
# "name": "an old lich that wants everyone to stay off of their 'lawn'", |
|
|
|
|
|
# "shortname": "lich", |
|
|
|
|
|
# "stats": [5,2,6,3], |
|
|
|
|
|
# }, |
|
|
|
|
|
# { |
|
|
|
|
|
# "id": 9, |
|
|
|
|
|
# "name": "elder gods hailing from the dark spaces between the stars", |
|
|
|
|
|
# "shortname": "gods", |
|
|
|
|
|
# "stats": [0,6,6,6], |
|
|
|
|
|
# }, |
|
|
|
|
|
# { |
|
|
|
|
|
# "id": 10, |
|
|
|
|
|
# "name": "a Flying Brain Monster", |
|
|
|
|
|
# "shortname": "Flying Brain Monster", |
|
|
|
|
|
# "stats": [2,3,6,1], |
|
|
|
|
|
# }, |
|
|
|
|
|
# ] |
|
|
|
|
|
|
|
|
def __init__(self, loc_desc=None, locIndex=None, battlefield=None, location=None, missIndex=None, oops=None, mission=None, probIndex=None, problem=None, probName=None, secProblem=None, thirdProblem=None): |
|
|
def __init__(self, loc_desc=None, locIndex=None, battlefield=None, location=None, missIndex=None, oops=None, mission=None, probIndex=None, problem=None, probName=None, secProblem=None, thirdProblem=None): |
|
|
self.loc_desc = loc_desc if loc_desc != None else Plot.loc1[r.randint(0, len(Plot.loc1)-1)] |
|
|
self.loc_desc = loc_desc if loc_desc != None else Plot.loc1[r.randint(0, len(Plot.loc1)-1)] |
|
|
|
|
|
|
|
|
self.mission = Plot.miss[self.missIndex] |
|
|
self.mission = Plot.miss[self.missIndex] |
|
|
self.probIndex = probIndex if probIndex != None else r.randint(0, len(Plot.prob)-1) |
|
|
self.probIndex = probIndex if probIndex != None else r.randint(0, len(Plot.prob)-1) |
|
|
self.problem = Plot.prob[self.probIndex] |
|
|
self.problem = Plot.prob[self.probIndex] |
|
|
if secProblem != None: |
|
|
|
|
|
try: |
|
|
|
|
|
self.secProblem = [x for x in Plot.prob if x["id"] == secProblem][0] |
|
|
|
|
|
except: |
|
|
|
|
|
self.secProblem = None |
|
|
|
|
|
else: |
|
|
|
|
|
self.secProblem = None |
|
|
|
|
|
self.thirdProblem = [x for x in Plot.prob if x["id"] == thirdProblem][0] if (thirdProblem != None and thirdProblem in list(filter(lambda x:x["id"], Plot.prob))) else None |
|
|
|
|
|
self.problem["givenname"] = probName if probName != None else gen_name() |
|
|
|
|
|
if self.problem["id"] == 3 and self.secProblem == None: |
|
|
|
|
|
self.secProblem = {"name": "Parasites", "shortname": "parasites", "stats": [3,4,2,3]} |
|
|
|
|
|
if self.problem["id"] == 10 and self.secProblem == None: |
|
|
|
|
|
self.secProbIndex = r.randint(0, len(Plot.prob)-2) |
|
|
|
|
|
self.secProblem = Plot.prob[self.secProbIndex] |
|
|
|
|
|
if self.secProbIndex == 3 and self.thirdProblem == None: |
|
|
|
|
|
self.thirdProblem = {"name": "Parasites", "shortname": "parasites", "stats": [3,4,2,3]} |
|
|
|
|
|
self.fullProblem = self.problem["givenname"] + ", " + self.problem["name"] |
|
|
|
|
|
if self.secProblem and self.secProblem["name"] != "Parasites": |
|
|
|
|
|
self.fullProblem += " and its minion, " + self.secProblem["name"] |
|
|
|
|
|
|
|
|
if type(self.problem["name"]) != str: |
|
|
|
|
|
self.problem["name"] = self.problem["name"]() |
|
|
|
|
|
if self.problem["hasMinion"]: |
|
|
|
|
|
if secProblem != None: |
|
|
|
|
|
try: |
|
|
|
|
|
self.secProblem = Plot.prob[self.secProblem] |
|
|
|
|
|
except: |
|
|
|
|
|
self.secProblem = r.choice(self.problem["potentialMinions"]) |
|
|
|
|
|
else: |
|
|
|
|
|
self.secProblem = r.choice(self.problem["potentialMinions"]) |
|
|
|
|
|
self.fullProblem = "" |
|
|
|
|
|
if self.problem["needsName"]: |
|
|
|
|
|
self.problem["givenname"] = probName if probName != None else gen_name() |
|
|
|
|
|
self.fullProblem += self.problem["givenname"] + ", " |
|
|
|
|
|
if not self.problem["isPlural"]: |
|
|
|
|
|
if self.problem["name"][0].lower() in ["a","e","i","o","u"]: |
|
|
|
|
|
self.fullProblem += "an " |
|
|
|
|
|
else: |
|
|
|
|
|
self.fullProblem += "a " |
|
|
|
|
|
self.fullProblem += self.problem["name"] |
|
|
|
|
|
if self.problem["hasMinion"]: |
|
|
|
|
|
self.fullProblem += " and its minion, " |
|
|
|
|
|
# if self.secProblem["name"][0].lower() in ["a","e","i","o","u"]: |
|
|
|
|
|
# self.fullProblem += "an " |
|
|
|
|
|
# else: |
|
|
|
|
|
# self.fullProblem += "a " |
|
|
|
|
|
self.fullProblem += self.secProblem["name"] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Character: |
|
|
class Character: |
|
|
|
|
|
|
|
|
op = bin(self.params.oops)[2:] |
|
|
op = bin(self.params.oops)[2:] |
|
|
ms = bin(self.params.missIndex)[2:] |
|
|
ms = bin(self.params.missIndex)[2:] |
|
|
pb1 = bin(self.params.probIndex)[2:] |
|
|
pb1 = bin(self.params.probIndex)[2:] |
|
|
if self.params.probIndex == 10: |
|
|
|
|
|
|
|
|
if self.params.problem["hasMinion"]: |
|
|
pb2 = bin(self.params.secProbIndex)[2:] |
|
|
pb2 = bin(self.params.secProbIndex)[2:] |
|
|
else: |
|
|
else: |
|
|
pb2 = bin(127)[2:] |
|
|
pb2 = bin(127)[2:] |
|
|
pbname = self.encode_name(self.params.problem["givenname"]) |
|
|
|
|
|
|
|
|
if self.params.problem["needsName"]: |
|
|
|
|
|
pbname = self.encode_name(self.params.problem["givenname"]) |
|
|
|
|
|
else: |
|
|
|
|
|
pbname = self.encode_name("yyyyyyyy") |
|
|
n1 = bin(Ship.NAME1.index(self.ship.name1))[2:] |
|
|
n1 = bin(Ship.NAME1.index(self.ship.name1))[2:] |
|
|
n2 = bin(Ship.NAME2.index(self.ship.name2))[2:] |
|
|
n2 = bin(Ship.NAME2.index(self.ship.name2))[2:] |
|
|
gq = bin(Ship.GQUAL.index(self.ship.gqual))[2:] |
|
|
gq = bin(Ship.GQUAL.index(self.ship.gqual))[2:] |
|
|
|
|
|
|
|
|
else: |
|
|
else: |
|
|
oops = "" |
|
|
oops = "" |
|
|
mission = oops + self.params.mission |
|
|
mission = oops + self.params.mission |
|
|
|
|
|
pl = "s" if self.params.problem["isPlural"] else "" |
|
|
|
|
|
note = self.params.problem["note"] |
|
|
lines = [ |
|
|
lines = [ |
|
|
f"The Kobolds of the {self.ship.fullname}", |
|
|
f"The Kobolds of the {self.ship.fullname}", |
|
|
f"have been sent out to {self.art} {self.params.loc_desc} {self.params.location}!", |
|
|
f"have been sent out to {self.art} {self.params.loc_desc} {self.params.location}!", |
|
|
f"in order to {mission}", |
|
|
f"in order to {mission}", |
|
|
f"but they're challenged by {self.params.fullProblem}!", |
|
|
f"but they're challenged by {self.params.fullProblem}!", |
|
|
f"The stats of the {self.params.problem['shortname']}", |
|
|
|
|
|
|
|
|
f"{note}", |
|
|
|
|
|
f"The stats of the {self.params.problem['shortname']}{pl}", |
|
|
f"{cst}" |
|
|
f"{cst}" |
|
|
] |
|
|
] |
|
|
if self.params.secProblem: |
|
|
|
|
|
|
|
|
if self.params.problem["hasMinion"]: |
|
|
mst = ", ".join([" ".join(y) for y in list(zip(st, [str(x) for x in self.params.secProblem["stats"]]))]) |
|
|
mst = ", ".join([" ".join(y) for y in list(zip(st, [str(x) for x in self.params.secProblem["stats"]]))]) |
|
|
lines.append(f"The stats of the {self.params.secProblem['shortname']}") |
|
|
|
|
|
|
|
|
spl = "s" if self.params.secProblem["isPlural"] else "" |
|
|
|
|
|
lines.append(f"The stats of the {self.params.secProblem['shortname']}{spl}") |
|
|
lines.append(f"{mst}") |
|
|
lines.append(f"{mst}") |
|
|
if self.params.thirdProblem: |
|
|
|
|
|
pst = ", ".join([" ".join(y) for y in list(zip(st, [str(x) for x in self.params.thirdProblem["stats"]]))]) |
|
|
|
|
|
lines.append(f"The stats of the {self.params.thirdProblem['shortname']}") |
|
|
|
|
|
lines.append("{pst}") |
|
|
|
|
|
if html: |
|
|
if html: |
|
|
out = ( |
|
|
out = ( |
|
|
f"<div id='theship' class='firstrow'>\n" |
|
|
f"<div id='theship' class='firstrow'>\n" |
|
|
|
|
|
|
|
|
f" <span class='head'>The Adversary</span>\n" |
|
|
f" <span class='head'>The Adversary</span>\n" |
|
|
f" They're challenged by <span id='advname'>{self.params.fullProblem}</span>!\n" |
|
|
f" They're challenged by <span id='advname'>{self.params.fullProblem}</span>!\n" |
|
|
f" <br>\n" |
|
|
f" <br>\n" |
|
|
|
|
|
f" <span id='problemnote'>\n" |
|
|
|
|
|
f" {self.params.problem['note']}" |
|
|
|
|
|
f" </span>" |
|
|
f" <span id='problemstats'>\n" |
|
|
f" <span id='problemstats'>\n" |
|
|
f" The stats of the {self.params.problem['shortname']}:<br>\n" |
|
|
f" The stats of the {self.params.problem['shortname']}:<br>\n" |
|
|
f" {cst}\n" |
|
|
f" {cst}\n" |
|
|
f" </span>\n" |
|
|
f" </span>\n" |
|
|
) |
|
|
) |
|
|
if self.params.secProblem: |
|
|
|
|
|
|
|
|
if self.params.problem["hasMinion"]: |
|
|
out += ( |
|
|
out += ( |
|
|
f" <br><span id='secprobstats'>\n" |
|
|
f" <br><span id='secprobstats'>\n" |
|
|
f" The stats of the {self.params.secProblem['shortname']}:<br>\n" |
|
|
f" The stats of the {self.params.secProblem['shortname']}:<br>\n" |
|
|
f" {mst}\n" |
|
|
f" {mst}\n" |
|
|
f" </span>\n" |
|
|
f" </span>\n" |
|
|
) |
|
|
) |
|
|
if self.params.thirdProblem: |
|
|
|
|
|
out += ( |
|
|
|
|
|
f" <br><span id='thirdprobstats'>\n" |
|
|
|
|
|
f" The stats of the {self.params.thirdProblem['shortname']}:<br>\n" |
|
|
|
|
|
f" {pst}\n" |
|
|
|
|
|
f" </span>\n" |
|
|
|
|
|
) |
|
|
|
|
|
out += f"</div>\n" |
|
|
out += f"</div>\n" |
|
|
print(out) |
|
|
print(out) |
|
|
print(f"<br clear='all'>\n") |
|
|
print(f"<br clear='all'>\n") |
|
|
else: |
|
|
else: |
|
|
print(f"{lines[0]} {lines[1]} {lines[2]} -- {lines[3]}") |
|
|
print(f"{lines[0]} {lines[1]} {lines[2]} -- {lines[3]}") |
|
|
print(f"{lines[4]}: {lines[5]}") |
|
|
|
|
|
if self.params.secProblem: |
|
|
|
|
|
print(f"- {lines[6]}: {lines[7]}") |
|
|
|
|
|
if self.params.thirdProblem: |
|
|
|
|
|
print(f"- - {lines[8]}: {lines[9]}") |
|
|
|
|
|
|
|
|
print(f"{lines[4]}") |
|
|
|
|
|
print(f"{lines[5]}: {lines[6]}") |
|
|
|
|
|
if self.params.problem["hasMinion"]: |
|
|
|
|
|
print(f"- {lines[7]}: {lines[8]}") |
|
|
print() |
|
|
print() |
|
|
self.ship.print(html=html) |
|
|
self.ship.print(html=html) |
|
|
|
|
|
|