Recently, I've been trying to add RPG aspects to my game. Currently, I'm making a test code with filler assets and am having difficulty in creating a "party" option that's frequently available in RPG's. I'm not quite sure if the rest of my coding is working outside of the party option, since its error is barricading the rest of it from working to be tested, but based on the fact that the guide I based it off of worked fine, I assume it's fine?
The main problem is I want Ren'Py to be able to read the stats of a character based off of their location in the party as opposed to the character directly, so that way the same character can be moved from slot 1 to slot 2 by the player while retaining the same information. Currently, to the shortest possible extent I could make it, this is the failing code I have.
Code: Select all
init python:
class EnemyChar:
def __init__(self, hp, sp, atk, dfn, int, res, spd, level=1, char=""):
self.char = char
self.hp = hp
self.max_hp = hp
self.sp = sp
self.max_sp = sp
self.atk = atk
self.dfn = dfn
self.int = int
self.res = res
self.spd = spd
self.level = level
self.hand = {"right": None, "left": None}
self.acc = {"neck": None, "arm": None}
self.armor = {"head": None, "chest": None}
class PlayChar:
def __init__(self, hp, sp, atk, dfn, int, res, spd, level=1, char="", job=""):
self.char = char
self.job = job
self.hp = hp
self.max_hp = hp
self.sp = sp
self.max_sp = sp
self.atk = atk
self.dfn = dfn
self.int = int
self.res = res
self.spd = spd
self.level = level
self.hand = {"right": None, "left": None}
self.acc = {"neck": None, "arm": None}
self.armor = {"head": None, "chest": None}
class Party:
def __init__(self):
self.place = {"one": None, "two": None, "three": None, "four": None}
define corrin = Character("Corrin")
default corr = EnemyChar(19,12,3,8,5,6,6,1,char="Corrin")
define azura = Character("Azura")
default azu = EnemyChar(18,16,4,4,1,6,7,1,char="Azura")
define robin = Character("Robin", image="robin")
default robi = PlayChar(18,15,1,7,7,7,6,1,char="Robin",job="Mage")
define lucina = Character("Lucina (Not Marth)", image="lucina")
default luci = PlayChar(19,13,8,6,0,4,10,1,char="Lucina",job="Mercenary")
define party = Party()
default party.place = {"one": robi, "two": luci}
define enemy = Party()
default enemy.place = {"one": corr, "two": azu}
label start:
if party.place["two"].spd >= ['[enemy.place["one"].spd]','[enemy.place["two"].spd]','[enemy.place["three"].spd]','[enemy.place["four"].spd]','[party.place["one"].spd]','[party.place["three"].spd]','[party.place["four"].spd]']:
menu battlelist2:
"What will [party.place['two'].char] do?"
"Attack":
$ d20roll = renpy.random.randint(1, 20)
if ([enemy.place["one"]],[enemy.place["two"]]) != None:
menu:
"Who will [party.place['two'].char] attack?"
"[enemy.place['one'].char]":
if d20roll >= 20:
$ damage = math.ceil((party.place["two"].atk - enemy.place["one"].dfn)*2)
else:
$ damage = math.ceil(party.place["two"].atk - enemy.place["one"].dfn)
$ enemy.place["one"].hp -= damage
"[enemy.place['two'].char]":
if d20roll >= 20:
$ damage = math.ceil((party.place["two"].atk - enemy.place["two"].dfn)*2)
else:
$ damage = math.ceil(party.place["two"].atk - enemy.place["two"].dfn)
$ enemy.place["two"].hp -= damage
if [enemy.place["one"]] != None:
menu:
"Who will [party.place['two'].char] attack?"
"[enemy.place['one'].char]":
if d20roll >= 20:
$ damage = math.ceil((party.place["two"].atk - enemy.place["one"].dfn)*2)
else:
$ damage = math.ceil(party.place["two"].atk - enemy.place["one"].dfn)
$ enemy.place["one"].hp -= damage
"Dealt [damage] damage."
if enemy.place["one"].hp < 0:
$ enemy.place["one"].hp = 0
if enemy.place["two"].hp < 0:
$ enemy.place["two"].hp = 0
if [[enemy.place["one"].hp],[enemy.place["two"].hp]] == 0:
jump battle_1_ending
label battle_1_ending:
"The end."
return
Code: Select all
enemy.place["one"].dfn
Code: Select all
I'm sorry, but an uncaught exception occurred.
While running game code:
File "game/script.rpy", line 265, in script
if [party.place["one"]].spd > ['[[enemy.place["one"]].spd]','[[enemy.place["two"]].spd]','[[enemy.place["three"]].spd]','[[enemy.place["four"]].spd]','[[party.place["two"]].spd]','[[party.place["three"].spd]]','[[party.place["four"]].spd]']:
File "game/script.rpy", line 265, in <module>
if [party.place["one"]].spd > ['[[enemy.place["one"]].spd]','[[enemy.place["two"]].spd]','[[enemy.place["three"]].spd]','[[enemy.place["four"]].spd]','[[party.place["two"]].spd]','[[party.place["three"].spd]]','[[party.place["four"]].spd]']:
AttributeError: 'RevertableList' object has no attribute 'spd'
-- Full Traceback ------------------------------------------------------------
Full traceback:
File "game/script.rpy", line 265, in script
if [party.place["one"]].spd > ['[[enemy.place["one"]].spd]','[[enemy.place["two"]].spd]','[[enemy.place["three"]].spd]','[[enemy.place["four"]].spd]','[[party.place["two"]].spd]','[[party.place["three"].spd]]','[[party.place["four"]].spd]']:
File "C:\Users\name\Desktop\Renpy\renpy-7.1.3-sdk\renpy\ast.py", line 1762, in execute
if renpy.python.py_eval(condition):
File "C:\Users\name\Desktop\Renpy\renpy-7.1.3-sdk\renpy\python.py", line 1944, in py_eval
return py_eval_bytecode(code, globals, locals)
File "C:\Users\name\Desktop\Renpy\renpy-7.1.3-sdk\renpy\python.py", line 1937, in py_eval_bytecode
return eval(bytecode, globals, locals)
File "game/script.rpy", line 265, in <module>
if [party.place["one"]].spd > ['[[enemy.place["one"]].spd]','[[enemy.place["two"]].spd]','[[enemy.place["three"]].spd]','[[enemy.place["four"]].spd]','[[party.place["two"]].spd]','[[party.place["three"].spd]]','[[party.place["four"]].spd]']:
AttributeError: 'RevertableList' object has no attribute 'spd'
Windows-8-6.2.9200
Ren'Py 7.1.3.1092
test rpg 1.0
Fri Jan 25 20:52:35 2019]
Is there a way I can have the associated stats be pulled up from the character in the associated party slot without having to specifically write what character is in that slot a thousand times based on where the player places them?
Thank you in advance to anyone willing to read through this and help me. I hope my question isn't too difficult to understand. I'm willing to clarify anything if it is.