v50 Steam/Premium information for editors
- v50 information can now be added to pages in the main namespace. v0.47 information can still be found in the DF2014 namespace. See here for more details on the new versioning policy.
- Use this page to report any issues related to the migration.
This notice may be cached—the current version can be found here.
Difference between revisions of "User:Button/ModestMod"
Jump to navigation
Jump to search
(updated current work) |
|||
| Line 69: | Line 69: | ||
<pre> | <pre> | ||
| + | import os | ||
| − | + | template_tree = None | |
| − | + | runconfig = 'resources/run.config' | |
| − | + | ascii_codes = None | |
| − | + | graphics_tokens_by_file = {} | |
| − | |||
| − | + | properties = { | |
| − | + | 'target':['dir'], | |
| − | + | 'source':['dir'], | |
| − | + | 'output':['dir'], | |
| − | + | 'save':['dir'], | |
| − | + | 'templates':['file'], | |
| − | + | 'ascii':['file'] | |
| − | + | } | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | def load_graphics_source(): | |
| − | def | + | global properties |
| − | + | if properties['source'][1] == None: | |
| − | + | # TODO error handling | |
| − | + | print("Undefined graphics source file. Please add a 'source' property in ",runconfig,".") | |
| − | + | else: | |
| − | + | for root, dirs, files in os.walk(properties['source'][1]): | |
| − | + | for rawfile in files: | |
| − | + | global template_tree | |
| − | + | curr_template_node = template_tree | |
| − | + | curr_graphics_node = None | |
| − | + | tarpath = os.path.join(root,rawfile) | |
| − | + | for line in open(tarpath,encoding='cp437'): | |
| − | + | for tag in tags(line): | |
| − | + | matching_node = curr_template_node.find_template_match(tag) | |
| − | + | if matching_node != None: | |
| − | + | curr_template_node = matching_node | |
| − | + | if curr_graphics_node == None or matching_node in template_tree._children: | |
| − | + | curr_graphics_node = TagNode(rawfile,None,matching_node,tag) | |
| − | + | else: | |
| − | + | while matching_node._tag_template not in curr_graphics_node._template._children: | |
| − | + | curr_graphics_node = curr_graphics_node._parent | |
| − | + | curr_graphics_node = TagNode(rawfile,curr_graphics_node,matching_node,tag) | |
| − | + | ||
| − | + | class TemplateNode: | |
| − | + | ||
| − | + | #self._tag_template #string | |
| − | + | #self._children # list of TemplateNodes | |
| − | + | #self._parent # TemplateNode | |
| − | + | #self._is_graphics_tag # Boolean | |
| − | + | ||
| − | + | #string does not contain the character '|'. | |
| − | + | def __init__(self, parent, string=""): | |
| − | + | self._is_graphics_tag = False | |
| − | + | global template_tree | |
| − | + | if parent == None: | |
| + | self._parent = None | ||
| + | template_tree = self | ||
| + | self._children={} | ||
| + | else: | ||
| + | if template_tree == None: | ||
| + | self._parent = TemplateNode(None, "") | ||
| + | else: | ||
| + | self._parent = parent | ||
| − | + | self._tag_template = string | |
| − | def | + | self._children = {} |
| − | + | ||
| − | + | parent.add_child(self) | |
| − | + | ||
| − | + | def add_child(self, node): | |
| − | + | if node._tag_template in self._children.keys(): | |
| − | + | return self._children[node._tag_template] | |
| − | + | else: | |
| − | + | self._children[node._tag_template] = node | |
| − | + | return node | |
| − | + | ||
| − | + | def find_template_match(self, tag): | |
| − | + | curr_node = self | |
| − | + | matching_node = None | |
| − | + | out_of_parents = False | |
| − | + | while matching_node == None and not out_of_parents: | |
| − | + | matching_node = curr_node.get_child_matching(tag) | |
| − | + | if curr_node._parent == None: | |
| − | + | out_of_parents = True | |
| − | + | else: | |
| − | + | curr_node = curr_node._parent | |
| − | + | return matching_node | |
| − | + | ||
| − | + | ||
| − | + | def get_child_matching(self, tag): | |
| − | + | if tag in self._children.keys(): | |
| − | + | return self._children[tag] | |
| − | + | else: | |
| − | + | return_possibilities = [] | |
| − | + | for child in self._children: | |
| − | + | return_node = self._children[child].get_template_match(tag) | |
| − | + | if return_node != None: | |
| − | + | return_possibilities.append(self._children[child]) | |
| − | # | + | if len(return_possibilities) == 1: |
| − | + | return return_possibilities[0] | |
| − | + | elif len(return_possibilities) == 0: | |
| − | + | return None | |
| − | + | else: | |
| − | + | # TODO error handling | |
| − | + | print("Found more than one matching child. You put it together wrong. Matching children are: ") | |
| − | + | for poss in return_possibilities: | |
| − | # | + | print(poss) |
| − | + | return return_possibilities[0] | |
| − | + | ||
| − | + | # This tells if a single tag matches a single tag; that is, it assumes we've got one element of the |-separated list | |
| − | + | def get_template_match(self, tag_to_compare): | |
| − | + | template_token_bag = [] | |
| − | + | template_token_bag.append(self._tag_template.split(':')) | |
| − | + | candidate_tokens = tag_to_compare.split(':') | |
| − | # | + | |
| − | + | ii = 0 | |
| − | + | while ii < len(candidate_tokens) and len(template_token_bag) > 0: | |
| − | + | for var in template_token_bag: | |
| − | + | # I decided this isn't necessarily true, as ranges might have 0's | |
| − | + | #if len(var) > len(candidate_tokens): | |
| − | + | # template_token_bag.remove(var) | |
| − | + | if '&' == var[ii] or '?' == var[ii] or '$' == var[ii] or var[ii] == candidate_tokens[ii]: | |
| − | + | # This case is an auto-pass | |
| − | == | + | ii = ii+1 |
| − | + | else: | |
| − | + | if '&' in var[ii] or '?' in var[ii] or '$' in var[ii]: | |
| − | + | varii_type = var[ii][0] | |
| − | + | varii_range = var[ii][2:var[ii].index(')')].split(',') | |
| − | + | # If len(varii_range) == 1 then we have a range of format (x,), indicating any number of :'s | |
| − | + | if len(varii_range) == 1: | |
| − | + | varii_range[1] = len(candidate_tokens)-len(var) | |
| − | + | # For every possible length (the +1 is because range is exclusive-end and my notation is inclusive-end) | |
| − | + | for jj in range(varii_range[0],varii_range[1]+1): | |
| − | + | # Make a copy of var | |
| − | + | new_var = var.copy() | |
| − | + | # Remove the range item | |
| − | + | del new_var[ii] | |
| − | + | # Replace it with (one of the possible lengths) times the multiplied symbol | |
| − | + | # If jj is 0 the range item is just removed | |
| − | + | for kk in range(0,jj): | |
| − | + | new_var.insert(ii,varii_type) | |
| − | + | # Place the new variant in the token bag for evaluation | |
| − | + | template_token_bag.append(new_var) | |
| − | + | # No counting, there is a new template_token_bag[ii] | |
| − | + | template_token_bag.remove(var) | |
| − | + | if ii < len(candidate_tokens): | |
| − | + | return None | |
| − | + | elif len(template_token_bag) == 1: | |
| − | + | return template_token_bag[0] | |
| − | + | else: | |
| − | + | # TODO error handling | |
| − | + | print("Button, there's a problem, more than one template matched.\nTag: ",tag_to_compare,"Matches:") | |
| − | + | for template in template_token_bag: | |
| − | + | print(template) | |
| − | + | # Technically this does in fact have a matching template | |
| − | + | return template_token_bag[0] | |
| − | + | ||
| − | + | def how_many_generations(self): | |
| − | + | temp_node = self | |
| − | + | count = -1 | |
| − | + | global template_tree | |
| − | + | while temp_node != template_tree: | |
| − | + | temp_node = temp_node._parent | |
| − | + | count = count + 1 | |
| − | + | return count | |
| − | + | ||
| − | + | class TagNode: | |
| − | + | ||
| − | + | def __init__(self,filename,parent,template,tag): | |
| − | + | self._tag = tag | |
| − | + | self._filename = filename | |
| − | + | self._parent = parent | |
| − | + | self._template = template | |
| − | + | self._children = {} | |
| − | + | ||
| − | + | global graphics_tokens_by_file | |
| − | + | if filename not in graphics_tokens_by_file.keys(): | |
| − | + | graphics_tokens_by_file[filename] = [] | |
| − | + | if parent == None: | |
| − | + | graphics_tokens_by_file[filename].append(self) | |
| − | + | else: | |
| − | + | parent._children.append(self) | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
</pre> | </pre> | ||
Revision as of 13:42, 5 May 2015
This is a directory page for my Modest Mod work.
I feel a little bad for clogging up the wiki with this stuff, but sometimes I get bored and I'm not at my home computer.
Plans
- Moving the no-fear-of-commitment orientation mods out into a pair of creature variations, in c_variation_modest. May make a Module applying them to sapients as well. Eternal Lovers are kind of frustrating.
- Could probably just make the plant growths that I currently have wrapping tree nuts, edible or pressable or whatever in their own right, and never have to deal with the seeds. OTOH, that might mess up grinding them to paste/pressing them? And would still need the hulling reaction for plantable legumes.
- Could change implementation of all plants, including those brewed 'whole', into growths. Then would be able to share reactions better, and do seed/no seed on a purely FAKESEED basis.
- Probably not worth it in vanilla, but maybe fore plant features, since we'll be needing to mill "whole plants" (e.g. cassava, whip vines) and also to mill seedheads.
- Need to move Plump Helmets back to a usable plant instead of a fruit. Save it as fruit for the Basic Adventurer's Pack.
- Need to look at the expanded creature variation replacement tokens in preparation for the vampire anti-sobriety module.
Accelerated
- Need to look at the old Accelerated Modest Mod and see how much of it is applicable to the current version.
- Need to see about thinning down plant materials, like a lot.
- Need to remove useless plant growths, like cherry blossoms etc. Leaves? Or would that be too ugly?
- Could probably reduce grass to a single species? Or would that make pandas shitty?
Plant Features
- Could probably make grain use the fruit(like?) reactions for brewing, milling, etc.
- Kahlua & Chajun & possibly the plant products that are used to make them could give a temporary [NOSLEEP] tag? Followed by a 'crash' of a drowsiness syndrome?
- Jellies? Preserves? Juices?
- More variation in material values
Basic Adventurer's Pack
This needs to be a basic pack. Don't get cocky.
Must include
- Plump helmet to fruit
- Backpacks, bags, quivers, waterskins.
- Tanning
- Stone knife
- Spinning & weaving
- Spindle
- Tanning
- Bone ammo
- Stone chisel
- Arrow bamboo?
- Trophy jewelry/crafts for trading
Might want to include
- Leather armor.
- Bone & shell armor.
- Bone bows, crossbows, blowguns
- Bamboo?
- Plant fiber thread. Rope reeds, pig tail stalks, others?
- For the merge with Plant Features, abaca/banana/pineapple leaves, cotton bolls, etc. A lot of the plant fabric stuff is Plant Features-necessary.
Probably going too far
- Enable a whole bunch of sapients playable as outsiders. Not just the ones in the gear-already-exists size range.
- Hahaha, fairies as a playable outsider race |D That would be silly
- Cooking. Just biscuits? Or full-on recipes?
- Flour? Oil? Good use for mortar & pestle...
- Maybe a balanced meal would require a veg, a protein, & a sugar/starch, & would provide minor (temporary) attribute boosts?
- Self-buff "cheats"?
Raws
- creature_subterranean
- c_variation_default
- body_modest_pearl
- c_variation_modest
- plant_crops
- plant_garden
- plant_standard
- plant_new_trees
import os
template_tree = None
runconfig = 'resources/run.config'
ascii_codes = None
graphics_tokens_by_file = {}
properties = {
'target':['dir'],
'source':['dir'],
'output':['dir'],
'save':['dir'],
'templates':['file'],
'ascii':['file']
}
def load_graphics_source():
global properties
if properties['source'][1] == None:
# TODO error handling
print("Undefined graphics source file. Please add a 'source' property in ",runconfig,".")
else:
for root, dirs, files in os.walk(properties['source'][1]):
for rawfile in files:
global template_tree
curr_template_node = template_tree
curr_graphics_node = None
tarpath = os.path.join(root,rawfile)
for line in open(tarpath,encoding='cp437'):
for tag in tags(line):
matching_node = curr_template_node.find_template_match(tag)
if matching_node != None:
curr_template_node = matching_node
if curr_graphics_node == None or matching_node in template_tree._children:
curr_graphics_node = TagNode(rawfile,None,matching_node,tag)
else:
while matching_node._tag_template not in curr_graphics_node._template._children:
curr_graphics_node = curr_graphics_node._parent
curr_graphics_node = TagNode(rawfile,curr_graphics_node,matching_node,tag)
class TemplateNode:
#self._tag_template #string
#self._children # list of TemplateNodes
#self._parent # TemplateNode
#self._is_graphics_tag # Boolean
#string does not contain the character '|'.
def __init__(self, parent, string=""):
self._is_graphics_tag = False
global template_tree
if parent == None:
self._parent = None
template_tree = self
self._children={}
else:
if template_tree == None:
self._parent = TemplateNode(None, "")
else:
self._parent = parent
self._tag_template = string
self._children = {}
parent.add_child(self)
def add_child(self, node):
if node._tag_template in self._children.keys():
return self._children[node._tag_template]
else:
self._children[node._tag_template] = node
return node
def find_template_match(self, tag):
curr_node = self
matching_node = None
out_of_parents = False
while matching_node == None and not out_of_parents:
matching_node = curr_node.get_child_matching(tag)
if curr_node._parent == None:
out_of_parents = True
else:
curr_node = curr_node._parent
return matching_node
def get_child_matching(self, tag):
if tag in self._children.keys():
return self._children[tag]
else:
return_possibilities = []
for child in self._children:
return_node = self._children[child].get_template_match(tag)
if return_node != None:
return_possibilities.append(self._children[child])
if len(return_possibilities) == 1:
return return_possibilities[0]
elif len(return_possibilities) == 0:
return None
else:
# TODO error handling
print("Found more than one matching child. You put it together wrong. Matching children are: ")
for poss in return_possibilities:
print(poss)
return return_possibilities[0]
# This tells if a single tag matches a single tag; that is, it assumes we've got one element of the |-separated list
def get_template_match(self, tag_to_compare):
template_token_bag = []
template_token_bag.append(self._tag_template.split(':'))
candidate_tokens = tag_to_compare.split(':')
ii = 0
while ii < len(candidate_tokens) and len(template_token_bag) > 0:
for var in template_token_bag:
# I decided this isn't necessarily true, as ranges might have 0's
#if len(var) > len(candidate_tokens):
# template_token_bag.remove(var)
if '&' == var[ii] or '?' == var[ii] or '$' == var[ii] or var[ii] == candidate_tokens[ii]:
# This case is an auto-pass
ii = ii+1
else:
if '&' in var[ii] or '?' in var[ii] or '$' in var[ii]:
varii_type = var[ii][0]
varii_range = var[ii][2:var[ii].index(')')].split(',')
# If len(varii_range) == 1 then we have a range of format (x,), indicating any number of :'s
if len(varii_range) == 1:
varii_range[1] = len(candidate_tokens)-len(var)
# For every possible length (the +1 is because range is exclusive-end and my notation is inclusive-end)
for jj in range(varii_range[0],varii_range[1]+1):
# Make a copy of var
new_var = var.copy()
# Remove the range item
del new_var[ii]
# Replace it with (one of the possible lengths) times the multiplied symbol
# If jj is 0 the range item is just removed
for kk in range(0,jj):
new_var.insert(ii,varii_type)
# Place the new variant in the token bag for evaluation
template_token_bag.append(new_var)
# No counting, there is a new template_token_bag[ii]
template_token_bag.remove(var)
if ii < len(candidate_tokens):
return None
elif len(template_token_bag) == 1:
return template_token_bag[0]
else:
# TODO error handling
print("Button, there's a problem, more than one template matched.\nTag: ",tag_to_compare,"Matches:")
for template in template_token_bag:
print(template)
# Technically this does in fact have a matching template
return template_token_bag[0]
def how_many_generations(self):
temp_node = self
count = -1
global template_tree
while temp_node != template_tree:
temp_node = temp_node._parent
count = count + 1
return count
class TagNode:
def __init__(self,filename,parent,template,tag):
self._tag = tag
self._filename = filename
self._parent = parent
self._template = template
self._children = {}
global graphics_tokens_by_file
if filename not in graphics_tokens_by_file.keys():
graphics_tokens_by_file[filename] = []
if parent == None:
graphics_tokens_by_file[filename].append(self)
else:
parent._children.append(self)