Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2 relaction class improvement #3

Merged
merged 3 commits into from
Jul 24, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .vscode/NQTR-CharacterInfo.code-snippets
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"DRincs Get Relation Name By Character": {
"scope": "renpy",
"prefix": "DR_RelationGet",
"body": [
"$ ${1:relaction} = ${2:mc}I.getRelationNameByCharacter(${3:friend})",
"",
],
"description": "Get Relation Name By Character"
},
"DRincs Set Relation Name By Character": {
"scope": "renpy",
"prefix": "DR_RelationSetOrAdd",
"body": [
"$ ${1:mc}I.setRelationNameByCharacter(character= ${2:friend})",
"",
],
"description": "Set Relation Name By Character"
},
}
4 changes: 2 additions & 2 deletions game/screens.rpy
Original file line number Diff line number Diff line change
Expand Up @@ -538,7 +538,7 @@ style return_button:

## About screen ################################################################
##
## This screen gives credit and copyright information about the game and Ren'Py.
## This screen gives credit and copyright CharacterInfo about the game and Ren'Py.
##
## There's nothing special about this screen, and hence it also serves as an
## example of how to make a custom screen.
Expand Down Expand Up @@ -966,7 +966,7 @@ style history_label_text:

## Help screen #################################################################
##
## A screen that gives information about key and mouse bindings. It uses other
## A screen that gives CharacterInfo about key and mouse bindings. It uses other
## screens (keyboard_help, mouse_help, and gamepad_help) to display the actual
## help.

Expand Down
49 changes: 31 additions & 18 deletions game/script.rpy
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,22 @@ image bg blue = "#b1e3ff"
# Declare characters used by this game. The color argument colorizes the
# name of the character.

default mcI = Information(name = "Liam", sname = "Johnson", age = 20, active = True, rel_status = rel.get('engaged'), rel_partner = girl)
default mcI = CharacterInfo(name = "Liam", sname = "Johnson", age = 20, relationships = {
girl : relactions["girlfriend"],
friend : relactions["friend"],
})
define mc = Character("{b}[mcI.name]{/b}", color="#37b3f3", who_outlines=[(2,"#000000")], what_prefix="\"", what_suffix="\"", what_outlines=[(2,"#000000")])

default friendI = Information(name = "Nick", sname = "Valentine", age = 26, active = True)
define friend = Character("{b}[friendI.name]{/b}", color="#37c68f", who_outlines=[(2,"#000000")], what_prefix="\"", what_suffix="\"", what_outlines=[(2,"#000000")])
default friendR = Relationship("friend", "friend", active = True)
default friendI = CharacterInfo(name = "Nick", sname = "Valentine", age = 26, relationships = {
mc : relactions["friend"],
})
define friend = Character("{b}[friendI.name] C.J.{/b}", color="#37c68f", who_outlines=[(2,"#000000")], what_prefix="\"", what_suffix="\"", what_outlines=[(2,"#000000")])
image friend normal = "/friend.webp"

default girlI = Information(name = "Eileen", sname = "Fisher", age = 18, active = True, rel_status = rel.get('engaged'), rel_partner = mc, story = __("She has always been before class."))
default girlI = CharacterInfo(name = "Eileen", sname = "Fisher", age = 18, story = __("She has always been before class."), relationships = {
mc : relactions["boyfriend"],
})
define girl = Character("{b}[girlI.name]{/b}", color="#f337ba", who_outlines=[(2,"#000000")], what_prefix="\"", what_suffix="\"", what_outlines=[(2,"#000000")])
default girlR = Relationship("girlfriend", "boyfriend", active = True)

# Clothes
default girl_dress = "-homesuit"
Expand Down Expand Up @@ -72,26 +77,34 @@ label character:
"Her name is:"
$ girlI.changeName()
"She is my:"
$ girlR.changeNPClabel()
$ girlI.setRelationNameByCharacter(character= mc)
"I'm [girl]'s:"
$ girlR.changeMClabel()
girl "Hi my [girlR.MClabel]"
mc "Hi my [girlR.NPClabel]"
$ mcI.setRelationNameByCharacter(character= girl)
$ relaction = mcI.getRelationNameByCharacter(girl)
girl "Hi my [relaction]"
$ relaction = mcI.getRelationNameByCharacter(girl)
mc "Hi my [relaction]"
"Speaks [girl]":
girl "Hi my [girlR.MClabel]"
mc "Hi my [girlR.NPClabel]"
$ relaction = mcI.getRelationNameByCharacter(girl)
girl "Hi my [relaction]"
$ relaction = mcI.getRelationNameByCharacter(girl)
mc "Hi my [relaction]"
"Change label [friend]":
"His name is:"
$ friendI.changeName()
"He is my:"
$ friendR.changeNPClabel()
$ friendI.setRelationNameByCharacter(character= mc)
"I'm [friend]'s:"
$ friendR.changeMClabel()
friend "Hi my [friendR.MClabel]"
mc "Hi my [friendR.NPClabel]"
$ mcI.setRelationNameByCharacter(character= friend)
$ relaction = mcI.getRelationNameByCharacter(friend)
friend "Hi my [relaction]"
$ relaction = friendI.getRelationNameByCharacter(mc)
mc "Hi my [relaction]"
"Speaks [friend]":
friend "Hi my [friendR.MClabel]"
mc "Hi my [friendR.NPClabel]"
$ relaction = mcI.getRelationNameByCharacter(friend)
friend "Hi my [relaction]"
$ relaction = friendI.getRelationNameByCharacter(mc)
mc "Hi my [relaction]"
if (stats["friend"].is_friend()):
friend "We are friends"
else:
Expand Down
147 changes: 59 additions & 88 deletions game/tool/characters_handler.rpy
Original file line number Diff line number Diff line change
@@ -1,30 +1,46 @@
# Wiki: https://github.com/DRincs-Productions/DS-toolkit/wiki/Relaction
define relactions = {
"mom": __("Mom"),
"dad": __("Dad"),
"son": __("Son"),
"daughter": __("Daughter"),
"brother": __("Brother"),
"sister": __("Sister"),
"uncle": __("Uncle"),
"aunt": __("Aunt"),
"cousin": __("Cousin"),
"friend": __("Friend"),
"girlfriend": __("Girlfriend"),
"boyfriend": __("Boyfriend"),
}

init python:
# Multi Game Persistent Character Names
# Recommended: male_fname, male_sname, female_fname, female_sname, futa_fname, futa_sname, other_fname or other_sname (or any, or all of these).
# Other recommendations: bigsis_fname, lilsis_fname, bigbro_fname, lilbro_fname, mom_fname, dad_fname, malebff_fname or femalebff_fname. (Again, use any or use none).
mp_ndata = MultiPersistent("namedata.f95zone.to")

class Information():
"""Information about a character
to use: default ... = Information("NPC name", age)
from typing import Optional

class CharacterInfo():
"""CharacterInfo about a character
to use: default ... = CharacterInfo("NPC name", age)
exemple:
default girlI = Information("Eileen", 18, "university student" [or job.university_student if it is a registered job], rel.get('engaged'), mc,
default girlI = CharacterInfo("Eileen", 18, "university student" [or job.university_student if it is a registered job], rel.get('engaged'), mc,
"she has always been before class. as a child they made fun of her because she had the appliance. ...")
default boyI = Information("Unknown Boy")"""
default boyI = CharacterInfo("Unknown Boy")"""

def __init__(self,
name,
sname = None,
age = None,
active = True,
rel_status = None,
rel_partner = None,
story = None,
other_values = {}):
name,
sname=None,
age=None,
story=None,
relationships=None,
other_values={}):
# I use a dictionary because it is the best solution for compatibility and not to create variables that may not be used.
self.memory = {}
self.memory.update(other_values)
# Great for reporting that a character has not yet been discovered
self.active = active

self.name = name
self.sname = sname
Expand All @@ -34,116 +50,71 @@ init python:
self.set("sname_default", sname)
self.set("age_default", age)
# default values
self.set("rel_status", rel_status)
self.set("rel_partner", rel_partner)
self.relationships = relationships
self.set("story", story)

def changeName(self):
"""Rename character name"""
self.name = renpy.input("{i}(Default: " + self.get("name_default") + "){/i}")
self.name = renpy.input(
"{i}(Default: " + self.get("name_default") + "){/i}")
self.name = self.name.strip() or self.get("name_default")
if (self.get("name_default") == "Unknown"):
self.set("name_default", self.name)

def changeSurname(self):
"""Rename the character's last name"""
self.sname = renpy.input("{i}(Default: " + self.get("sname_default") + "){/i}")
self.sname = renpy.input(
"{i}(Default: " + self.get("sname_default") + "){/i}")
self.sname = self.sname.strip() or self.get("sname_default")
if (self.get("sname_default") == "Unknown"):
self.set("sname_default", self.sname)

def changeAge(self):
"""Age changes"""
self.age = renpy.input("{i}(Default: " + str(self.get("age_default")) + "){/i}")
self.age = renpy.input(
"{i}(Default: " + str(self.get("age_default")) + "){/i}")
self.age = self.age.strip() or self.get("age_default")
if (self.get("age_default") == "Unknown"):
self.set("age_default", self.age)

def get(self, text):
"""Returns the value "text", in case it does not exist returns \"Unknown\""""
if text in self.memory:
return self.memory[text]
else:
return "Unknown"

def set(self, text, value):
"""Function to set or add a new value"""
if (text != None and text != ""):
self.memory[text] = value
else:
remove(text)
self.remove(text)

def remove(self, text):
"""Delete the text value"""
del memory[text]
del self.memory[text]

def setActive(self, amt):
"""Cabia the active value according to the parameter (Tip: True/False)"""
self.active = amt
def getRelStatus(self, amt):
"""Returns the state of the character relationship (I recommend using rel values)"""
return self.get("rel_status")
def getRelPartner(self, amt):
"""It recalls the name of the character with whom it has a relationship"""
return self.get("rel_partner")
def is_engaged(self):
"""Return True if the character is currently in a romantic relationship with someone"""
return (rel_status == rel.get('engaged') or rel_status == rel.get('married'))

class Relationship():
"""Type fi relationship between you (MClabel) and NPC NPClabel
to use: default ... = Relationship("type of relationship that NCP has with MC",
"type of relationship that MC has with NCP", boolean (if this relationship is active))
exemple:
default girlR = Relationship("girlfriend", "boyfriend", True)"""
def __init__(self,
NPClabel = None,
MClabel = None,
active = True):

self.memory = {}
# nickname by which MC calls NCP
self.NPClabel = NPClabel
# nickname by which NCP calls MC
self.MClabel = MClabel
# default values
self.set("NPClabel_default", NPClabel)
self.set("MClabel_default", MClabel)

self.active = active
def changeNPClabel(self):
"""Change the nickname of the PCN"""
self.NPClabel = renpy.input("{i}(Default: " + self.get("NPClabel_default") + "){/i}")
self.NPClabel = self.NPClabel.strip() or self.get("NPClabel_default")
if (self.get("NPClabel_default") == "Unknown"):
self.set("NPClabel_default", self.NPClabel)
def changeMClabel(self):
"""Edit the nickname of the MC"""
self.MClabel = renpy.input("{i}(Default: " + self.get("MClabel_default") + "){/i}")
self.MClabel = self.MClabel.strip() or self.get("MClabel_default")
if (self.get("MClabel_default") == "Unknown"):
self.set("MClabel_default", self.MClabel)
def get(self, text):
"""Returns the value "text", in case it does not exist returns \"Unknown\""""
if text in self.memory:
return self.memory[text]
else:
return "Unknown"
def set(self, text, value):
"""Function to set or add a new value"""
if (text != None and text != ""):
self.memory[text] = value
def getRelationNameByCharacter(self, character: Character) -> Optional[str]:
"""Wiki: https://github.com/DRincs-Productions/DS-toolkit/wiki/Relaction#get-relation-name-by-character """
if character in self.relationships:
return self.relationships[character]
else:
remove(text)
def remove(self, text):
"""Delete the text value"""
del memory[text]
def setActive(self, amt):
"""Change the active value according to the parameter (Tip: True/False)"""
self.active = amt

define rel = {
'rel_single' : 0,
'rel_engaged' : 1,
'rel_married' : 2,
'rel_divorced' : 3,
'rel_widow' : 4,
}
return None

def setRelationNameByCharacter(self, character: Character, relation: str = None) -> None:
"""Wiki: https://github.com/DRincs-Productions/DS-toolkit/wiki/Relaction#set-relation-name-by-character """
if IsNullOrWhiteSpace(relation):
value = renpy.input(self.name+" is:")
self.relationships[character] = value
del value
else:
self.relationships[character] = relation
return

label renaming_mc:
# allow default name(s) to be saved across multiple games
Expand Down