Developer Store
Support
Member Forums

Screenshots
FAQ
Documentation
License
Known Issues
Downloads

MMOWorkshop.com Store Opened!
Torque MMO Kit - Open Sourced!
Torque MMO Kit - 1.5.2 Port Alpha Test
Torque MMO Kit - OSX Status

GarageGames.com irc.prairiegames.com
#mmoworkshop

PyTorque
TGB Web Browser


Boaal

hallsofvalhalla - After a long epiphany
Leathel - FoHO pre-Alpha 2.42
OldRod - More Musings on the MMO Industry
xapken - nice
J.C. Smith - 0.0.4.1 Build Notes
Wolf Dreamer - Pointless blog of pointless things
AthlonJedi2 - Server Nuked !!!!!
gamer_goof - New character model GIRL1 available only $4
... MORE BLOGS!

My other project
A Message to all the new people.
MyGame
changing the primary class
See Ya Classes, Hello Skills!
XP Based Skills
fxFoliageReplicator zone loading...
Is it just me, or is it slow in ...
Places where NPC quest-givers ha...
TalentRaspel Grid

Epic Battles

****WARNING: Not for the feint of heart!****

In this tutorial we are going to create a small battle between Wolves and Humans that takes place in the City of Jorfu around /coords 556 -277 51. This battle will be for the Fellowship of Light, therefore we'll tip the scale a bit in the Humans' favor so that FoL players have a better chance of winning this battle.

STEP ONE: Rough Layout of Battle

First, I am going to write a rough layout of who spawns on each side, their names, levels, the number of each I want to spawn, and how many sequences will be in this battle. Doing this now will help us in the next steps. Mine looks like this:

FoL side - HumansOpposing side - Wolves
Side 1, Sequence 1Side 2, Sequence 1
(B1_S1_#)(B1_S2_#)
1. Human Destroyer1. Wolf Crusader
Lvl 34 - 4Lvl 25 - 4
2. Human Punisher2. Wolf Protector
Lvl 36 - 2Lvl 28 - 2
Side 1, Sequence 2Side 2, Sequence 2
(B1_S1_#)(B1_S2_#)
3. Human Deathbinder3. Wolf Crusader
Lvl 38 - 2Lvl 25 - 1
4. Ororcali4. Wolf Protector
Lvl 38 - 1Lvl 28 - 2
0. Taskmaster Duro0. Captain Flamehorn
Lvl 40 - 1Lvl 33 - 1

Taskmaster Duro and Captain Flamehorn are the leaders of each side and whomever survives the battle is the winner. If either one dies during the battle, the other side automatically wins.

Note: B1_S1_# means battle 1, side 1 and is used to define the spawngroups in Python and in the Mission editor. We'll delve into these numbers later on in the tutorial.

Before we proceed, let's get our file setup to begin creating the battle. Load Python. Create a new file and save it as: ~\my.mmorpg\genesis\battle\jorfubattle.py

Add the following text to the top of the file and save:

from mud.world.battle import BattleGroup,BattleSequence,BattleResult,BattleMustSurvive,BattleProto
from genesis.dbdict import *

Now we need to import this new module, open ~\my.mmorpg\genesis\battle\__init__.py add the following line, save and close this file:

import jorfubattle



STEP TWO: Spawns

In this step we'll create our spawns that we defined in the previous step.

1. Create a new file and save it as: ~\my.mmorpg\genesis\spawns\humans.py, add the following to the top of the file and save:

from genesis.dbdict import *
from mud.world.defines import *
from mud.world.spawn import SpawnSoundProfile

2. Open ~\my.mmorpg\genesis\spawns\spawnmain.py add the following text and save:

import humans

3. Now let's create our spawns inside of: ~\my.mmorpg\genesis\spawns\humans.py. Here is how my layout of the spawns looks. If you want a more detailed explanation of spawns see the NPC and Monster Creation Tutorial.

#--- Taskmaster Duro
spawn = DBSpawn()
spawn.name = "Taskmaster Duro"
spawn.race = "Human"
spawn.sex = "Female"
spawn.pclass = "Doom Knight"
spawn.plevel = 40
spawn.difficultyMod = 2
spawn.isMonster = False
spawn.flags = RPG_SPAWN_UNIQUE
spawn.desc = ""
spawn.textureBody = "BODY/BODY1"
spawn.textureArms = "ARMS/ARMS1"
spawn.textureLegs = "LEGS/LEGS1"
spawn.textureFeet = "FEET/FEET1"
spawn.textureHands = "HANDS/HANDS1"
spawn.vocalSet = 'A'
spawn.dialog = ""

#--- Ororcali
spawn = spawn.clone()
spawn.name = "Ororcali"
spawn.sex = "Male"
spawn.pclass = "Warrior"
spawn.plevel = 38
spawn.difficultyMod = 1
spawn.dialog = ""

#--- Human Deathbinder
spawn = spawn.clone()
spawn.name = "Human Deathbinder"
spawn.pclass = "Assassin"
spawn.flags = 0

#--- Human Punisher
spawn = spawn.clone()
spawn.name = "Human Punisher"
spawn.pclass = "Wizard"
spawn.plevel = 36

#--- Human Destroyer
spawn = spawn.clone()
spawn.name = "Human Destroyer"
spawn.pclass = "Barbarian"
spawn.plevel = 34

Note: I created a dialog parameter but left it blank, the battle dialog will get inserted here in a later step.

Save the file.

2. Now, we'll create the wolf spawns. Open ~\my.mmorpg\genesis\spawns\animal.py and create the 3 wolf spawns. Here is how mine looks:

#--- Captain Flamehorn
spawn = DBSpawn()
spawn.name = "Captain Flamehorn"
spawn.race = "Animal"
spawn.sex = "Male"
spawn.pclass = "Paladin"
spawn.plevel = 33
spawn.difficultyMod = 2
spawn.isMonster = False
spawn.flags = RPG_SPAWN_UNIQUE
spawn.desc = ""
spawn.model = "animal/wolf.dts"
spawn.animation = "wolf"
spawn.textureSingle = "single/wolf_grey"
spawn.sndProfile = sounds

#--- Wolf Protector
spawn = spawn.clone()
spawn.name = "Wolf Protector"
spawn.pclass = "Warrior"
spawn.plevel = 28
spawn.difficultyMod = 1
spawn.flags = 0

#--- Wolf Crusader
spawn = spawn.clone()
spawn.name = "Wolf Crusader"
spawn.pclass = "Cleric"
spawn.plevel = 25

Save the file.

3. Run genesis.py


STEP THREE: Spawngroups

Now, we'll assign the newly created spawns to spawngroups. We want each spawn to have its own spawngroup.

1. Open ~\my.mmorpg\genesis\battle\jorfubattle.py and add the following text:

#--- Human vs. Wolf
#---  Human Spawngroups
o1 = DBSpawnInfo(spawn="Human Destroyer")
sg = DBSpawnGroup(zone="jorfu",groupName="DESTROYER")
sg.addSpawnInfo(o1)

o1 = DBSpawnInfo(spawn="Human Punisher")
sg = DBSpawnGroup(zone="jorfu",groupName="PUNISHER")
sg.addSpawnInfo(o1)

o1 = DBSpawnInfo(spawn="Human Deathbinder")
sg = DBSpawnGroup(zone="jorfu",groupName="DEATHBINDER")
sg.addSpawnInfo(o1)

o1 = DBSpawnInfo(spawn="Ororcali")
sg = DBSpawnGroup(zone="jorfu",groupName="ORORCALI")
sg.addSpawnInfo(o1)

o1 = DBSpawnInfo(spawn="Taskmaster Duro")
sg = DBSpawnGroup(zone="jorfu",groupName="TASKMASTER")
sg.addSpawnInfo(o1)

#---  Wolf Spawngroups
e1 = DBSpawnInfo(spawn="Wolf Crusader")
sg = DBSpawnGroup(zone="jorfu",groupName="CRUSADER")
sg.addSpawnInfo(e1)

e1 = DBSpawnInfo(spawn="Wolf Protector")
sg = DBSpawnGroup(zone="jorfu",groupName="PROTECTOR")
sg.addSpawnInfo(e1)

e1 = DBSpawnInfo(spawn="Captain Flamehorn")
sg = DBSpawnGroup(zone="jorfu",groupName="CAPTAIN")
sg.addSpawnInfo(e1)

Note: do not forget that groupName must be a unique identifier for the zone.

2. Save the file. Run genesis.py


STEP FOUR: Dialog

In this step we will write 2 dialogs, one for the questgiver and the other for the reward giver.

1. First, let's assign the quest giving dialog to Guard Andarry. Open ~\my.mmorpg\genesis\zone\jorfu\spawn.py and add update his dialog to look like this:

spawn.dialog = "HumanWolfSkirmish"

We'll create his dialog in the next step.

Note: you may want to move his spawnpoint closer to the battle location so that the player is near where the battle begins.

2. We'll write Guard Andarry a simple dialog. He has heard rumors of wolves amassing near the city's center, planning an attack. Make sure the dialog is named HumanWolfSkirmish as defined above in his spawn information. Add the dialog to ~\my.mmorpg\genesis\battles\jorfubattle.py and save. Here is how my dialog looks:

#--- HumanWolfSkirmish Dialog
action1 = DBDialogAction()
action1.endInteraction = True

action2 = DBDialogAction()
#action2.addCheckItem("Captain Flamehorn's Attack Plans")
#action2.triggerBattle = "HumanWolfSkirmish"
action2.endInteraction = True
   
choice = DBDialogChoice(text=r'Show Guard Andarry the attack plans.')        
choice.successLine = DBDialogLine(text="Make haste to the battle!")
choice.successLine.addAction(action2)

choice2 = DBDialogChoice(text=r'I will let you know if I find anything.')        
choice2.successLine = DBDialogLine(text="Be careful!")
choice2.successLine.addAction(action1)

dialog = DBDialog()
dialog.name = "HumanWolfSkirmish"
dialog.greeting = DBDialogLine()
dialog.greeting.text = """Be watchful around these parts.  There are rumors of wolf packs mobilizing along the city's border!  Please report back to me if you come across any useful information!\\n"""
dialog.greeting.addChoice(choice)
dialog.greeting.addChoice(choice2)

Note: I commented out the item check line and the trigger battle line, we'll add these in once they have been set up.

Save the file and run genesis.py to check for errors.

3. Now, we'll setup Taskmaster Duro's reward dialog upon a successful defeat of Captain Flamehorn's wolves. Add this dialog to the same file as above and save. Here is how my dialog looks:

#--- HumanWolfSkirmishReward Dialog
action = DBDialogAction()
#action.addTakeItem("Captain Flamehorn's Attack Plans")
#action.addGiveItem("Battle Chain of Jorfu")
action.despawn = True

choice = DBDialogChoice(text=r'Give Captain Flamehorn\'s Attack Plans.')        
choice.successLine = DBDialogLine(text="""Thanks for alerting us to the Captain's plan!  Please accept this 
gift in gratitude! Goodbye.""")
choice.successLine.addAction(action)

dialog = DBDialog()
dialog.name = "HumanWolfSkirmishReward"
dialog.greeting = DBDialogLine()
dialog.greeting.text = """Thank you for helping us defeat the legions of Captain Flamehorn!\\n"""
dialog.greeting.addChoice(choice)

Note: I commented out the give and take item lines since these items still need to be created.

This dialog needs to be assigned to Taskmaster Duro's spawn. Open ~\genesis\spawn\humans.py, add the following line to his spawn info and save the file:

spawn.dialog = "HumanWolfSkirmishReward"


STEP FIVE: Items

Let's create the 2 items that we reference in the above dialogs. For more information, see the Items and Loot Tutorial on creating items.

1. Open ~\my.mmorpg\genesis\battles\jorfubattle.py and add the following text and save:

#--- Items
#---  Captain Flamehorn's Attack Plans
item = DBItemProto(name = "Captain Flamehorn's Attack Plans")
item.bitmap = "STUFF/2"
item.flags = RPG_ITEM_SOULBOUND|RPG_ITEM_ARTIFACT
item.desc = "Captain Flamehorn's forces are on the move!  Bring these plans to Guard Andarry immediately!"

#---  Battle Chain of Jorfu
item = DBItemProto(name = "Battle Chain of Jorfu")
item.level = 25
item.flags = RPG_ITEM_SOULBOUND|RPG_ITEM_UNIQUE|RPG_ITEM_ARTIFACT
item.armor = 50
item.bitmap = "EQUIPMENT/NECK/1"
item.slots = (RPG_SLOT_NECK,)
item.addStat("str",40)
item.addStat("mnd",20)
item.addStat("mys",20)
item.addStat("bdy",40)
item.addStat("maxHealth", 100)
item.addStat("resistMagical", 20)
item.desc = "This chain commemorates your victory over Captain Flamehorn."

*********add some item icons to my.mmorpg****************

2. Make sure the give/check/take item lines in the above dialog entries are no longer commented out(remove the pound sign in front of each line).

Note: do not remove the # from the trigger battle line yet.

3. We need to add the attack plans to someone's loot table in order for the player to be able to retrieve this item. Let's add it to the wolf Radothe. Open ~\my.mmorpg\genesis\zone\jorfu\spawns.py, add the following line to his loot table, and save:

loot.addItem("Captain Flamehorn's Attack Plans", RPG_FREQ_ALWAYS)

4. Run genesis.py and check for errors.


STEP SIX: Battle Sequences

Now for the fun part! We'll layout the battle sequences in Python next. Open ~\my.mmorpg\genesis\battles\jorfubattle.py

1. First, we'll set up a battle prototype. Let's give it a name and define the zone it will take place in:

battle = BattleProto(name="HumanWolfSkirmish",zoneName = "jorfu")

Now, we'll define a zone-wide message and sound effect that is displayed/heard so everyone knows that this battle is about to begin.

battle.zoneMessage = "Great armies of humans and wolves are amassed!  The battle will soon be fought!"
battle.zoneSound = "sfx/College_DrumCadence07.ogg"

As we laid out above, we now need to define the 2 parties that must survive the battle. These are the leaders of both sides of the battle.

BattleMustSurvive(name="Taskmaster Duro",battleProto=battle)
BattleMustSurvive(name="Captain Flamehorn",battleProto=battle)

2. Now, we'll layout the waves of mobs for each side of the battle.

As laid out in the chart in STEP ONE, each side has two battle sequences. We'll start by laying out the Human sequences.

In the first sequence we have Human Destroyers and Human Punishers. When they join the battle we want to trigger a sound effect and we want them to have a delay before they begin their attack. Add the following text:

#--- SIDE 1 SEQUENCE 1
bs = BattleSequence()
bs.zoneSound = "sfx/College_DrumCadence03.ogg"

battle.side1StartSequence = bs

bg = BattleGroup()
bg.triggerSpawnGroup = "B1_S1_1"
bg.spawnGroup = "DESTROYER"
bg.attackDelay = 60*6
bg.battleSequence=bs

bg = BattleGroup()
bg.triggerSpawnGroup = "B1_S1_2"
bg.spawnGroup = "PUNISHER"
bg.attackDelay = 65*6
bg.battleSequence=bs

Note: each spawngroup has a unique numerical identifier and is using the spawnGroup as laid out in STEP THREE.

Once this group is entirely defeated, the second wave of Humans needs to spawn. This group has Human Deathbinders, Ororcali, and Taskmaster Duro. When they join the battle we want to trigger a sound effect and message alerting the enemy that they have joined and we should add a delay to their attack as well. Add the following text:

#--- SIDE 1 SEQUENCE 2
bs.nextSequence = bs = BattleSequence()
bs.zoneSound = "sfx/College_DrumCadence25.ogg"
bs.zoneMessage = "Taskmaster Duro and his troopers have joined the battle!"

bg = BattleGroup()
bg.triggerSpawnGroup = "B1_S1_3"
bg.spawnGroup = "DEATHBINDER"
bg.battleSequence=bs

bg = BattleGroup()
bg.triggerSpawnGroup = "B1_S1_4"
bg.spawnGroup = "ORORCALI"
bg.battleSequence=bs

bg = BattleGroup()
bg.triggerSpawnGroup = "B1_S1_0"
bg.spawnGroup = "TASKMASTER"
bg.battleSequence=bs

Now we need to create spawngroups for the wolves, mine look like this:

#--- SIDE 2 SEQUENCE 1
bs = BattleSequence()
bs.zoneSound = "sfx/College_DrumCadence11.ogg"
battle.side2StartSequence = bs

bg = BattleGroup()
bg.triggerSpawnGroup = "B1_S2_1"
bg.spawnGroup = "CRUSADER"
bg.attackDelay = 65*6
bg.battleSequence=bs

bg = BattleGroup()
bg.triggerSpawnGroup = "B1_S2_2"
bg.spawnGroup = "PROTECTOR"
bg.attackDelay = 70*6
bg.battleSequence=bs

#--- SIDE 2 SEQUENCE 2
bs.nextSequence = bs = BattleSequence()
bs.zoneSound = "sfx/College_DrumCadence25.ogg"
bs.zoneMessage = "Captain Flamehorn has joined the battle!"

bg = BattleGroup()
bg.triggerSpawnGroup = "B1_S2_3"
bg.spawnGroup = "CRUSADER"
bg.battleSequence=bs

bg = BattleGroup()
bg.triggerSpawnGroup = "B1_S2_4"
bg.spawnGroup = "PROTECTOR"
bg.attackDelay = 5*6
bg.battleSequence=bs

bg = BattleGroup()
bg.triggerSpawnGroup = "B1_S2_0"
bg.spawnGroup = "CAPTAIN"
bg.attackDelay = 15*6
bg.passive = True
bg.battleSequence=bs

3. Next, we'll define the defeat and victory messages depending upon the outcome of the battle. We need to create a Battle Result prototype, display a zone-wide message, trigger the victor, and play a sound. We'll set up victories for both sides of the battle, they should look something like this:

#--- end results
s1victory = BattleResult()
s1victory.zoneMessage = "Taskmaster Duro's legions are victorious!"
s1victory.triggerSpawnGroup = "B1_S1_0"
s1victory.spawnGroup = "TASKMASTER"
s1victory.zoneSound = "sfx/College_DrumCadence07.ogg"

s2victory = BattleResult()
s2victory.zoneMessage = "Captain Flamehorn has prevailed!"
s2victory.triggerSpawnGroup = "B1_S2_0"
s2victory.spawnGroup = "CAPTAIN"
s2victory.zoneSound = "sfx/College_DrumCadence07.ogg"

battle.side1VictoryResult = s1victory
battle.side2VictoryResult = s2victory

4. Finally, we need to remove the comment on the following line of dialog so that the battle will now be triggered:

action2.triggerBattle = "HumanWolfSkirmish"

5. Save your files. Run genesis.py and check for errors.


STEP SEVEN: Laying out SpawnPoints in Mission File

1. Load your single player world and use /imm tp jorfu to teleport to The City of Jorfu. Hit Ctrl-F11 to enter editor mode. Create a new SimGroup and call it 'Battle_1'. Alt-left click on the new folder to add your spawns to this folder.

Note: Use the skills you learned in previous tutorials about placing spawnpoints.

2. As we laid out in our chart above, let's first place the 4 Human Destroyer spawns. Rename their SpawnPoint and change their SpawnGroup parameter to B1_S1_1. Then place the 2 Human Punisher spawns. Rename their SpawnPoint and change their SpawnGroup parameter to B1_S1_2.

3. Now we'll place the opposing wolf spawns. First, place the 4 Wolf Crusader spawns. Rename their SpawnPoint and change their SpawnGroup parameter to B1_S2_1. Then place the 2 Wolf Protector spawns. Rename their SpawnPoint and change their SpawnGroup parameter to B1_S2_2.

4. Next, let's lay out the second wave of Human spawns as defined above. Place the 2 Human Deathbinder spawns, rename their SpawnPoint, and change their SpawnGroup parameter to B1_S1_3. Place Ororcali's spawn, rename his SpawnPoint and change his SpawnGroup parameter to B1_S1_4. Finally, place the Taskmaster Duro spawn, rename her SpawnPoint and change her SpawnGroup parameter to B1_S1_0.

5. Finally, lay out the second wave of wolf spawns as defined above. Place 1 Wolf Crusader, rename its SpawnPoint, and change its SpawnGroup parameter to B1_S2_3. Place 1 Wolf Protector, rename its SpawnPoint, and change its SpawnGroup parameter to B1_S2_4. Finally, place the Captain Flamehorn, rename his SpawnPoint and change his SpawnGroup parameter to B1_S2_0.

6. Save your mission file and close the game.

Here is how my mission file looks:

   new SimGroup(Battle_1) {

      new rpgSpawnPoint(B1_S1_1) {
         position = "561.362 -272.771 50";
         rotation = "0.135341 -0.0892285 0.986773 67.4953";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S1_1";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S1_1) {
         position = "553.134 -278.403 50";
         rotation = "0.169029 -0.16921 0.970977 91.7486";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S1_1";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S1_1) {
         position = "551.719 -265.443 50";
         rotation = "0.161899 -0.169416 0.972156 94.2143";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S1_1";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S1_2) {
         position = "540.26 -284.356 50";
         rotation = "0.127492 -0.151654 0.980177 101.022";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S1_2";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S1_1) {
         position = "538.74 -271.084 50";
         rotation = "0.131779 -0.157765 0.978644 101.471";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S1_1";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S1_2) {
         position = "541.47 -256.36 50";
         rotation = "0.136881 -0.160747 0.977458 100.456";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S1_2";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S2_1) {
         position = "594.848 -276.527 50";
         rotation = "0.214439 0.17073 -0.9617 79.2412";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S2_1";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S2_1) {
         position = "604.087 -271.086 50";
         rotation = "0.206614 0.171025 -0.963359 81.3405";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S2_1";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S2_1) {
         position = "602.878 -285.372 50";
         rotation = "0.230347 0.182208 -0.955898 79.2158";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S2_1";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S2_2) {
         position = "610.009 -292.526 50";
         rotation = "0.20955 0.198303 -0.957478 89.3287";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S2_2";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S2_1) {
         position = "614.29 -279.398 50";
         rotation = "0.238532 0.1849 -0.95337 78.2274";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S2_1";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S2_2) {
         position = "617.142 -268.098 50";
         rotation = "0.234169 0.185103 -0.954412 79.2646";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S2_2";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S1_3) {
         position = "520.109 -273.712 50";
         rotation = "0.134282 -0.14574 0.980167 95.8296";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S1_3";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S1_3) {
         position = "521.167 -265.31 50";
         rotation = "0.103027 -0.143176 0.98432 109.38";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S1_3";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S1_0) {
         position = "511.66 -267.77 50";
         rotation = "0.105049 -0.143146 0.984111 108.326";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S1_0";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S1_4) {
         position = "526.516 -270.569 50";
         rotation = "0.108793 -0.124389 0.986251 98.4383";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S1_4";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S2_3) {
         position = "628.38 -282.05 50";
         rotation = "0.188659 0.119895 -0.974696 66.2098";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S2_3";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S2_4) {
         position = "631.225 -272.431 50";
         rotation = "0.18838 0.129148 -0.973568 70.3054";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S2_4";
         WanderGroup = "-1";
      };
      new rpgSpawnPoint(B1_S2_0) {
         position = "635.583 -280.178 50";
         rotation = "0.171839 0.101643 -0.979867 62.2354";
         scale = "1 1 1";
         dnStartTime = "-1";
         dnEndTime = "-1";
         dataBlock = "rpgSpawnPointMarker";
         SpawnGroup = "B1_S2_0";
         WanderGroup = "-1";
      };
   };

7. Run genesis.py.

STEP EIGHT: Testing the Battle

Verify that all dialogs and actions work as intended. Test the difficulty of the battle and make adjustments to numbers of spawns and/or their levels as necessary.




Return to Tutorials