![]() |
|
![]() |
|
|
Thread Tools | Display Modes |
|
|
#1 |
|
Programming Guru
![]() |
A Battle Screen where the monsters and attacks and spells are programmed from a text file! :eek:
I made a translator program that will read a dat file (text file) and translate it into Python to become an enemy object, or a spell, or an attack. I'm soon to do items and abilities too. data/spells.dat Translator module programmed by JDI. Add spells in the format: [SpellName_Advantage_Weakness_Power_RandomFactor_MPUse] <Fire/Ice/Water/2/1/4> <Ice/Thunder/Fire/2/1/4> data/monsters_2.dat Translator module programmed by JDI. Add monsters in the format: [Name_Level_HP_MP_Strength_Magic_Defense_MagicDefense_Speed_Accuracy_Evasion_Luck_Attack_Spell_Element] <Goblin/1/random[140|160]/random[100|110]/2/5/3/5/4/4/2/1/:Slash:Stab:Rapid Punch:/:Fire:/None> data/attacks.dat Translator module programmed by JDI. Add attacks in the format: [AttackName_Power_RandomFactor] <Kakumei Strike/4/3> <Ice Sword/4/3> <Rapid Punch/1/3> <Slash/3/1> battle__screen.py from battle_screen_data import*
class battle_object (object):
def __init__(self, stats):
self.name = stats[0]
self.level = stats[1]
if len(stats) == 19:
self.curHP = stats[3]
self.maxHP = stats[2]
self.curMP = stats[5]
self.maxMP = stats[4]
self.strength = stats[6]
self.magic = stats[7]
self.defense = stats[8]
self.magdefense = stats[9]
self.speed = stats[10]
self.luck = stats[11]
self.accuracy = stats[12]
self.evasion = stats[13]
self.experience = stats[14]
self.weapon = stats[15]
self.armor = stats[16]
self.spells = stats[17]
self.attacks = stats[18]
self.element = "None"
elif len(stats) == 15:
self.experience = ''
self.weapon = ''
self.armor = ''
self.curHP = stats[2]
self.maxHP = stats[2]
self.curMP = stats[3]
self.maxHP = stats[3]
self.strength = stats[4]
self.magic = stats[5]
self.defense = stats[6]
self.speed = stats[8]
self.luck = stats[11]
self.accuracy = stats[9]
self.evasion = stats[10]
self.spells = stats[13]
self.attacks = stats[12]
self.magdefense = stats[7]
self.element = stats[14]
else:
print len(stats)
def strike(self, target, attack):
"""Check HitMiss"""
if Figure.HitMiss("Strike",[self, target]) == "Hit":
"""Declare Attack"""
PHYSICAL.retreive(attack)
print "%s attacks %s"%(self.name, target.name)
"""Do Damage"""
damage = Figure.f_damage("Strike",[self, target], attack)
if damage < 1:
damage = "no" ; print "%s was %s"%(attack, random.choice(["useless against %s's %s!"%(target.name, target.weapon),"useless against %s!"%(target.name),"a pointless attempt.","SPLOITZAR"]))
else:
target.curHP -= damage
"""Wrap It Up"""
if target.curHP < 1:
target.curHP = 0
print "%s has %s HP remaining after taking %s damage from %s!"%(target.name, target.curHP, damage, attack)
else:
print "%s's %s missed %s"%(self.name, attack, target.name)
def cast(self, target, spell):
"""Check HitMiss"""
if Figure.HitMiss("Cast",[self, target]) == "Hit":
"""Declare Attack"""
MAGIC.retreive(spell)
if self.curMP - MAGIC.MPuse < 0:
print "%s Does Not Have Enough MP To Cast %s"%(self.name, spell)
else:
print "%s casts %s on %s"%(self.name, spell, target.name)
"""Do Damage"""
damage = Figure.f_damage("Cast",[self, target], spell)
if damage < 1:
damage = "no" ; print "%s was %s"%(spell, random.choice(["useless against %s's %s!"%(target.name, target.armor),"useless against %s!"%(target.name),"a pointless attempt.","SPLOITZ"]))
else:
target.curHP -= damage
"""Wrap Up"""
if target.curHP < 1:
target.curHP = 0
self.curMP -= MAGIC.MPuse
print "%s has %s HP remaining after taking %s damage from %s!"%(target.name, target.curHP, damage, spell)
else:
print "%s's %s missed %s"%(self.name, spell, target.name)
class DEC_party (object):
def __init__(self, MEMBERS, TYPE):
self.members = MEMBERS
self.type = TYPE
if len(self.members) > 0: self.member1 = "T"
if len(self.members) > 1: self.member2 = "T"
if len(self.members) > 2: self.member3 = "T"
if len(self.members) > 3: self.member4 = "T"
if len(self.members) > 4: self.member5 = "T"
if len(self.members) > 5: self.member6 = "T"
self.status = "T"
def Status(self):
if self.type == "E":
if len(self.members)> 0:enemy4 = self.members[0]
if len(self.members)> 1:enemy5 = self.members[1]
if len(self.members)> 2:enemy6 = self.members[2]
if len(self.members)> 3:enemy7 = self.members[3]
if len(self.members)> 4:enemy8 = self.members[4]
if len(self.members)> 5:enemy9 = self.members[5]
if len(self.members) > 0:
if self.member1 == "T":
if enemy4.curHP < 1:
self.member1 = "F"
if len(self.members) > 1:
if self.member2 == "T":
if enemy5.curHP < 1:
self.member2 = "F"
if len(self.members) > 2:
if self.member3 == "T":
if enemy6.curHP < 1:
self.member3 = "F"
if len(self.members) > 3:
if self.member4 == "T":
if enemy7.curHP < 1:
self.member4 = "F"
if len(self.members) > 4:
if self.member5 == "T":
if enemy8.curHP < 1:
self.member5 = "F"
if len(self.members) > 5:
if self.member6 == "T":
if enemy9.curHP < 1:
self.member6 = "F"
if self.type == "P":
if len(self.members)> 0:character0 = self.members[0]
if len(self.members)> 1:character1 = self.members[1]
if len(self.members)> 2:character2 = self.members[2]
if len(self.members)> 3:character3 = self.members[3]
if len(self.members) > 0:
if self.member1 == "T":
if character0.curHP < 1:
self.member1 = "F"
if len(self.members) > 1:
if self.member2 == "T":
if character1.curHP < 1:
self.member2 = "F"
if len(self.members) > 2:
if self.member3 == "T":
if character2.curHP < 1:
self.member3 = "F"
if len(self.members) > 3:
if self.member4 == "T":
if character3.curHP < 1:
self.member4 = "F"
temp = 0
for a in range(1, len(self.members)+1):
if a == 1:
if self.member1 == "F": temp += 1
if a == 2:
if self.member2 == "F": temp += 1
if a == 3:
if self.member3 == "F": temp += 1
if a == 4:
if self.member4 == "F": temp += 1
if a == 5:
if self.member5 == "F": temp += 1
if a == 6:
if self.member6 == "F": temp += 1
if a == 7:
if self.member7 == "F": temp += 1
if a == 8:
if self.member8 == "F": temp += 1
if a == 9:
if self.member9 == "F": temp += 1
if temp == len(self.members):
self.status = "F"
def battle (party, enemy, area):
"""Figure and Declare Amount of Players on Screen"""
p = [];p2 = [];e = [];e2 = []
if len(party) > 0: character0 = battle_object(party[0]);p.append([0, character0.speed]);p2.append(character0)
if len(party) > 1: character1 = battle_object(party[1]);p.append([1, character1.speed]);p2.append(character1)
if len(party) > 2: character2 = battle_object(party[2]);p.append([2, character2.speed]);p2.append(character2)
if len(party) > 3: character3 = battle_object(party[3]);p.append([3, character3.speed]);p2.append(character3)
if len(enemy) > 0: enemy4 = battle_object(enemy[0]);e.append([4, enemy4.speed]);e2.append(enemy4)
if len(enemy) > 1: enemy5 = battle_object(enemy[1]);e.append([5, enemy5.speed]);e2.append(enemy5)
if len(enemy) > 2: enemy6 = battle_object(enemy[2]);e.append([6, enemy6.speed]);e2.append(enemy6)
if len(enemy) > 3: enemy7 = battle_object(enemy[3]);e.append([7, enemy7.speed]);e2.append(enemy7)
if len(enemy) > 4: enemy8 = battle_object(enemy[4]);e.append([8, enemy8.speed]);e2.append(enemy8)
if len(enemy) > 5: enemy9 = battle_object(enemy[5]);e.append([9, enemy9.speed]);e2.append(enemy9)
"""Declare Individual Party and Status"""
CharacterParty = DEC_party(p2, "P")
EnemyParty = DEC_party(e2, "E")
"""Choose the Order of Turns, Based on Speed"""
ra=5 #larger the ratio, the more severe of a difference between duplicate turns
turns = return_turns(p, e, ra)
print "You are against a Level %d %s!"%(enemy4.level, enemy4.name)
"""Main Loop"""
battle_return = "0"
while battle_return == "0":
"""Your Turns"""
if turns[0] == 0:
print"Player 1 Turn"
a = raw_input("Who do you attack?")
if a == "enemy4": a = enemy4
"""Make Sure No Dead Target Is Selected"""
while a.curHP < 1:
a = raw_input("Who do you attack?")
if a == "enemy4": a = enemy4
b = raw_input("Strike or Cast?")
if b.lower() == "strike": character0.strike(a, character0.attacks[0])
if b.lower() == "cast": character0.cast(a, character0.spells[0])
if turns[0] == 1: print"Player 2 Turn"
if turns[0] == 2: print"Player 3 Turn"
if turns[0] == 3: print"Player 4 Turn"
"""AI Turns"""
if turns[0] > 3:
target = random.choice(p2)
"""Make Sure No Dead Target Is Selected"""
while target.curHP < 1:
target = random.choice(p2)
"""Select Computer Action"""
if area.upper() == "AREA_2":
if turns[0] == 4:
if enemy4.curMP > 4: enemy4.cast(target, random.choice(enemy4.spells))
else: enemy4.strike(target, random.choice(enemy4.attacks))
if turns[0] == 5: enemy5.cast(target)
if turns[0] == 6: enemy6.cast(target)
if turns[0] == 7: enemy7.cast(target)
if turns[0] == 8: enemy8.cast(target)
if turns[0] == 9: enemy9.cast(target)
"""Check Status"""
CharacterParty.Status()
EnemyParty.Status()
if CharacterParty.status == "F":
battle_return = 'You Died'
if EnemyParty.status == "F":
battle_return = 'You Won'
"""If A Short of Turns is Found, Add More. Otherwise, Advance one Turn"""
if len(turns) < 15: temp_turns = return_turns(p, e, ra) ; turns = turns + temp_turns
else: turns = turns[1:]
"""Wrap Up Battle"""
print battle_return
if battle_return == 'You Won':
gain = random.randrange(40, 60)*enemy4.level
if len(party) > 0:
if CharacterParty.member1 == "T":
party[0][13] += gain
print "%s gained %d experience to reach %d experienced."%(party[0][0], gain, party[0][13])
Figure.f_exp(party[0][1]+1)
print "%d left to Level %d"%(Figure.exp_f-party[0][13], party[0][1]+1)
if len(party) > 1:
if CharacterParty.member2 == "T":
party[1][13] += gain
print "%s gained %d experience to reach %d experienced."%(party[1][0], gain, party[1][13])
Figure.f_exp(party[1][1]+1)
print "%d left to Level %d"%(Figure.exp_f-party[1][13], party[1][1]+1)
if len(party) > 2:
if CharacterParty.member3 == "T":
party[2][13] += gain
print "%s gained %d experience to reach %d experienced."%(party[2][0], gain, party[2][13])
Figure.f_exp(party[2][1]+1)
print "%d left to Level %d"%(Figure.exp_f-party[2][13], party[2][1]+1)
if len(party) > 3:
if CharacterParty.member4 == "T":
party[3][13] += gain
print "%s gained %d experience to reach %d experienced."%(party[3][0], gain, party[3][13])
Figure.f_exp(party[3][1]+1)
print "%d left to Level %d"%(Figure.exp_f-party[3][13], party[3][1]+1)
gain = random.randrange(1000, 2000)*enemy4.level
money.give(gain)
print "You now have %d much money after gaining %d from the victory!"%(money.amount, gain)
elif battle_return == 'You Died':
quit_game()
return party
##########################################
name="Turk"
lvl = 5
Figure.f_hp(lvl+1)
maxhp = Figure.hp_f
curhp = Figure.hp_f
maxmp = 250
curmp = 250
stn = 15
magic = 4
defn = 10
magdefn = 10
spd = 6
luck = 10
acc = 5
eva = 6
Figure.f_exp(lvl)
exp = Figure.exp_f
weapon = "Diamond Sword"
armor = "Shining Armor"
spells = ["Ice"]
attacks = ["Kakumei Strike", "Slash"]
Turk = [name, lvl, maxhp, curhp, maxmp, curmp, stn, magic, defn, magdefn, spd, luck, acc, eva, exp, weapon, armor, spells, attacks]
party = [Turk]
area = "area_2"
e_lvl = (random.randrange(1, 4))
Figure.f_hp(e_lvl+1)
enemy = [random.choice(Area2Monsters.Monsters)]
party = battle(party, enemy, area)
##########################################batle_screen_data.py import random
"""MONSTERS"""
class Monsters(object):
def check_rand(self, range1, range2):
if len(self.contents[range1:range2]) > 5:
for c in range(range1,range2):
if self.contents[c] == "|":
bar = c
return random.randrange(int(self.contents[range1+7:bar]), int(self.contents[bar+1:range2-1]))
else:
return self.contents[range1:range2]
def check_array(self, range1, range2):
colin = [];z = []
for d in range(range1,range2):
if self.contents[d] == ":":
colin.append(d)
for d in range(1,len(colin)):
z.append(str(self.contents[colin[d-1]+1:colin[d]]))
return z
def __init__(self, Area):
the_file=open("data/monsters_"+str(Area)+".dat",'r')
the_contents = the_file.read()
self.contents = the_contents
dashes = []
newline = []
endline = []
for a in range(len(the_contents)):
if the_contents[a] == "/":
dashes.append(a)
if the_contents[a] == "<":
newline.append(a)
if the_contents[a] == ">":
endline.append(a)
x = [];b = 15
for a in range(len(newline)):
y = []
y.append(str(the_contents[newline[a]+1:dashes[a*b]]))
y.append(int(self.check_rand( dashes[a*b]+1, dashes[a*b+1] )))
y.append(int(self.check_rand( dashes[a*b+1]+1, dashes[a*b+2] )))
y.append(int(self.check_rand( dashes[a*b+2]+1, dashes[a*b+3] )))
y.append(int(self.check_rand( dashes[a*b+3]+1, dashes[a*b+4] )))
y.append(int(self.check_rand( dashes[a*b+4]+1, dashes[a*b+5] )))
y.append(int(self.check_rand( dashes[a*b+5]+1, dashes[a*b+6] )))
y.append(int(self.check_rand( dashes[a*b+6]+1, dashes[a*b+7] )))
y.append(int(self.check_rand( dashes[a*b+7]+1, dashes[a*b+8] )))
y.append(int(self.check_rand( dashes[a*b+8]+1, dashes[a*b+9] )))
y.append(int(self.check_rand( dashes[a*b+9]+1, dashes[a*b+10] )))
y.append(int(self.check_rand( dashes[a*b+10]+1, dashes[a*b+11] )))
y.append(self.check_array( dashes[a*b+11]+1, dashes[a*b+12] ))
y.append(self.check_array( dashes[a*b+12]+1, dashes[a*b+13] ))
y.append(str(self.check_rand( dashes[a*b+13]+1, endline[a] )))
x.append(y)
self.Monsters = x
"""RANDOM BATTLE SCREEN ALGORITHMS"""
class Figure(object):
def f_exp(self, object_level):
experience = 0
for a in range(1, object_level+1):experience += (a/2*500 + a*10)
self.exp_f = experience
def f_hp(self, object_level):
HP = random.randrange(150, 200)
for a in range(1, object_level+1):HP += a**2
self.hp_f = HP
def HitMiss(self, situation, classes):
self = classes[0];target = classes[1]
if situation.lower() == "strike":
chance = int(round((float(100)/(target.luck+target.evasion*2))))*((self.accuracy*2)+(self.luck/2))
if random.randrange(0, 101) < chance:
return "Hit"
else:
return "Miss"
if situation.lower() == "cast":
chance = int(round((float(100)/(target.luck*2))*((self.accuracy*2)+(self.luck/2))))
if random.randrange(0, 101) < chance:
return "Hit"
else:
return "Miss"
def f_damage(self, situation, classes, move):
self = classes[0];target = classes[1]
if situation.lower() == "strike":
damage = ( ((self.strength/3 + PHYSICAL.phATK/2))/3*(self.strength*2+(random.randrange(0,self.luck))+random.randrange(0, self.luck)+PHYSICAL.phATK*2) - ((target.defense*2+(random.randrange(target.luck, target.luck*2+1)))/2) )
elif situation.lower() == "cast":
MAGIC.retreive(move)
if target.element != "None":
if MAGIC.advantage == target.element[0]:offset = 2
elif MAGIC.weakness == target.element[0]:offset = -2
else:offset = 0
else: offset = 0
damage = ((self.magic/3+(MAGIC.spATK)+offset)*(self.magic*2+(random.randrange(0,self.luck))+random.randrange(0, self.luck)+MAGIC.spATK*2) - ((target.magdefense*2+(random.randrange(target.luck, target.luck*2+1)))/2) )
return damage
"""TURNS"""
def return_turns(party, enemy, ratio):
SpeedSet = []
Set = []
for a in range(len(party)):
Set.append(10*party[a][1]+party[a][0])
b= Set[a]
SpeedSet.append(b)
Set = []
for a in range(len(enemy)):
Set.append(10*enemy[a][1]+enemy[a][0])
b= Set[a]
SpeedSet.append(b)
SpeedSet.sort()
SpeedSet.reverse()
NewSet = []
for a in range(len(SpeedSet)):
NewSet.append( int((( float( int( str(max(SpeedSet)) [:len(str(max(SpeedSet)))-1] ) - int( str(SpeedSet[a]) [:len(str(SpeedSet[a]))-1] )) / (int(max(SpeedSet))/ratio)+1) *100)+1 ))
for a in range(len(NewSet)):
if NewSet[a]%2 == 0:
NewSet[a]+=1
Turns = []
for b in range(10000):
for a in range(len(NewSet)):
if (b+1)%NewSet[a] == 0: Turns.append(int(str(SpeedSet[a])[len(str(SpeedSet[a]))-1]))
return Turns
"""PHYSICAL ATTACKS"""
class Physical(object):
def retreive(self, attack):
for a in range(len(self.Attacks)):
if attack == self.Attacks[a][0]:
self.phATK = random.randrange(self.Attacks[a][1], self.Attacks[a][1]+self.Attacks[a][2])
def translate_data(self):
the_file=open("data/attacks.dat",'r')
the_contents = the_file.read()
dashes = []
newline = []
endline = []
for a in range(len(the_contents)):
if the_contents[a] == "/":
dashes.append(a)
if the_contents[a] == "<":
newline.append(a)
if the_contents[a] == ">":
endline.append(a)
x = []
for a in range(len(newline)):
y = []
y.append(str(the_contents[newline[a]+1:dashes[a*2]]))
y.append(int(the_contents[dashes[a*2]+1:dashes[a*2+1]]))
y.append(int(the_contents[dashes[a*2+1]+1:endline[a]]))
x.append(y)
self.Attacks = x
"""MAGIC ATTACKS"""
class Magic(object):
def retreive(self, spell):
for a in range(len(self.Spells)):
if spell == self.Spells[a][0]:
self.spATK = random.randrange(self.Spells[a][3], self.Spells[a][3]+self.Spells[a][4])
self.MPuse = self.Spells[a][5]
self.advantage = self.Spells[a][1]
self.weakness = self.Spells[a][2]
def translate_data(self):
the_file=open("data/spells.dat",'r')
the_contents = the_file.read()
dashes = []
newline = []
endline = []
for a in range(len(the_contents)):
if the_contents[a] == "/":
dashes.append(a)
if the_contents[a] == "<":
newline.append(a)
if the_contents[a] == ">":
endline.append(a)
x = []; b = 5
for a in range(len(newline)):
y = []
y.append(str(the_contents[newline[a]+1:dashes[a*b]]))
y.append(str(the_contents[dashes[a*b]+1:dashes[a*b+1]]))
y.append(str(the_contents[dashes[a*b+1]+1:dashes[a*b+2]]))
y.append(int(the_contents[dashes[a*b+2]+1:dashes[a*b+3]]))
y.append(int(the_contents[dashes[a*b+3]+1:dashes[a*b+4]]))
y.append(int(the_contents[dashes[a*b+4]+1:endline[a]]))
x.append(y)
self.Spells = x
"""MONEY"""
class money(object):
def __init__(self, money):
self.amount = money
def give(self, amou):
self.amount += amou
def take(self, amou):
self.amount -= amou
###################################
"""Declare Money"""
money = money(1000)
"""Declare Monsters"""
Area2Monsters = Monsters(2)
"""Declare Attacks"""
PHYSICAL = Physical()
PHYSICAL.translate_data()
MAGIC = Magic()
MAGIC.translate_data()
"""Declare Statistic Algorithms"""
Figure = Figure()
##################################The monsters data file is for addressing all the possible combinations of monsters to their various areas, by managing it in a single simple text file. Which is later called randomly into battle when the def battle is called, depending on the area (only one is exemplified however). The spells data file is for translating all the spells into their MP Use, Strength, Randomness, and element attributes. Then when someone casts a spell, it contacts the def retreive to retreive those attributes and formulate them into damage. The attack data file is the same idea as the spells, just different arguments, and for a different purpose. Programmed all by myself. The trickiest part was probably accepting the random[x|x2] and turning it over into a random integer (from txt > python). And same with the : signifying an array of attacks. Some pretty loopy code up there (battle_screen_data > class Monsters). This RPG is going to be awesome, from a programmer's standpoint, I now have so much control over what I want to happen with certain enemies and attacks and everything. This is turning out awesome. Not bragging, just excited my short term with Python has gone somewhere. Last edited by Sane; May 9th, 2005 at 10:10 PM. |
|
|
|
|
|
#2 |
|
Expert Programmer
|
Def. very nice
you've far surpassed my abilities with the language, bt then again I havn't picked it up ever since I started trying to teach myself c#. Seeing your code though puts me in the mood to start using Python again. |
|
|
|
|
|
#3 |
|
Programming Guru
![]() |
Thanks lol. You should.
Right now, I'm trying to convince my tech teacher to make Python our programming language next year. That would totally own. Just hand in my RPG for the final summative. XD |
|
|
|
![]() |
| Bookmarks |
| Currently Active Users Viewing This Thread: 1 (0 members and 1 guests) | |
| Thread Tools | |
| Display Modes | |
|
|