2 # GemRB - Infinity Engine Emulator
3 # Copyright (C) 2003-2004 The GemRB Project
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 # character generation end
24 from GUIDefines
import *
25 from ie_slots
import *
26 from ie_stats
import *
27 from ie_spells
import *
28 from ie_restype
import RES_2DA
31 # Lay on hands, turn undead and backstab multiplier get set by the core
33 MyChar
= GemRB
.GetVar ("Slot")
34 Class
= GemRB
.GetPlayerStat (MyChar
, IE_CLASS
)
35 ClassIndex
= CommonTables
.Classes
.FindValue (5, Class
)
36 ClassName
= CommonTables
.Classes
.GetRowName (ClassIndex
)
37 IsMulti
= GUICommon
.IsMultiClassed (MyChar
, 1)
38 Levels
= [GemRB
.GetPlayerStat (MyChar
, IE_LEVEL
), GemRB
.GetPlayerStat (MyChar
, IE_LEVEL2
), \
39 GemRB
.GetPlayerStat (MyChar
, IE_LEVEL3
)]
41 # weapon proficiencies
42 # set the base number of attacks; effects will add the proficiency bonus
43 # 2 means 1 attack, because this is the number of attacks in 2 rounds
44 GemRB
.SetPlayerStat (MyChar
, IE_NUMBEROFATTACKS
, 2)
46 #lore, thac0, hp, and saves
47 GemRB
.SetPlayerStat (MyChar
, IE_MAXHITPOINTS
, 0)
48 GemRB
.SetPlayerStat (MyChar
, IE_HITPOINTS
, 0)
49 LUCommon
.SetupSavingThrows (MyChar
)
50 LUCommon
.SetupThaco (MyChar
)
51 LUCommon
.SetupLore (MyChar
)
52 LUCommon
.SetupHP (MyChar
)
55 TableName
= CommonTables
.ClassSkills
.GetValue (Class
, 2, 0)
59 #find out which class gets mage spells
60 for i
in range (IsMulti
[0]):
61 if CommonTables
.ClassSkills
.GetValue (IsMulti
[i
+1], 2, 0) != "*":
64 GUICommon
.SetupSpellLevels(MyChar
, TableName
, IE_SPELL_TYPE_WIZARD
, Levels
[index
])
66 # apply class/kit abilities
67 KitIndex
= GUICommon
.GetKitIndex (MyChar
)
69 #get the class abilites for each class
70 for i
in range (IsMulti
[0]):
71 TmpClassName
= CommonTables
.Classes
.GetRowName (CommonTables
.Classes
.FindValue (5, IsMulti
[i
+1]) )
72 ABTable
= CommonTables
.ClassSkills
.GetValue (TmpClassName
, "ABILITIES")
73 if ABTable
!= "*" and GemRB
.HasResource (ABTable
, RES_2DA
, 1):
74 GUICommon
.AddClassAbilities (MyChar
, ABTable
, Levels
[i
], Levels
[i
])
77 ABTable
= CommonTables
.KitList
.GetValue (str(KitIndex
), "ABILITIES")
79 ABTable
= CommonTables
.ClassSkills
.GetValue (ClassName
, "ABILITIES")
80 if ABTable
!= "*" and GemRB
.HasResource (ABTable
, RES_2DA
, 1):
81 GUICommon
.AddClassAbilities (MyChar
, ABTable
, Levels
[0], Levels
[0])
83 # apply starting (alignment dictated) abilities
84 # pc, table, new level, level diff, alignment
85 AlignmentTable
= GemRB
.LoadTable ("aligns")
86 AlignmentAbbrev
= AlignmentTable
.FindValue (3, GemRB
.GetPlayerStat (MyChar
, IE_ALIGNMENT
))
87 GUICommon
.AddClassAbilities (MyChar
, "abstart", 6,6, AlignmentAbbrev
)
89 # setup starting gold (uses a roll dictated by class
90 TmpTable
= GemRB
.LoadTable ("strtgold")
91 temp
= GemRB
.Roll (TmpTable
.GetValue (Class
, 1),TmpTable
.GetValue (Class
, 0), TmpTable
.GetValue (Class
, 2))
92 GemRB
.SetPlayerStat (MyChar
, IE_GOLD
, temp
* TmpTable
.GetValue (Class
, 3))
95 GUICommon
.SetColorStat (MyChar
, IE_HAIR_COLOR
, GemRB
.GetVar ("HairColor") )
96 GUICommon
.SetColorStat (MyChar
, IE_SKIN_COLOR
, GemRB
.GetVar ("SkinColor") )
97 GUICommon
.SetColorStat (MyChar
, IE_MAJOR_COLOR
, GemRB
.GetVar ("MajorColor") )
98 GUICommon
.SetColorStat (MyChar
, IE_MINOR_COLOR
, GemRB
.GetVar ("MinorColor") )
99 #GUICommon.SetColorStat (MyChar, IE_METAL_COLOR, 0x1B )
100 #GUICommon.SetColorStat (MyChar, IE_LEATHER_COLOR, 0x16 )
101 #GUICommon.SetColorStat (MyChar, IE_ARMOR_COLOR, 0x17 )
102 GemRB
.SetPlayerStat (MyChar
, IE_EA
, 2 )
104 # save the name and starting xp (can level right away in game)
105 GemRB
.SetPlayerName (MyChar
, GemRB
.GetToken ("CHARNAME"), 0)
108 LargePortrait
= GemRB
.GetToken ("LargePortrait")
109 SmallPortrait
= GemRB
.GetToken ("SmallPortrait")
110 GemRB
.FillPlayerInfo (MyChar
, LargePortrait
, SmallPortrait
)
112 playmode
= GemRB
.GetVar ("PlayMode")
114 if GemRB
.GetVar("GUIEnhancements"):
115 GemRB
.SaveCharacter ( MyChar
, "gembak" )
118 GemRB
.ExecuteString ("EquipMostDamagingMelee()", MyChar
)
120 #leaving multi player pregen
122 CharGenWindow
.Unload ()
123 #when export is done, go to start
124 if GUICommon
.HasTOB():
125 GemRB
.SetToken ("NextScript","Start2")
127 GemRB
.SetToken ("NextScript","Start")
128 GemRB
.SetNextScript ("ExportFile") #export
131 def GiveEquipment(MyChar
, ClassName
, KitIndex
):
132 # get the kit (or use class if no kit) to load the start table
134 EquipmentColName
= ClassName
135 # sorcerers are missing from the table, use the mage equipment instead
136 if EquipmentColName
== "SORCERER":
137 EquipmentColName
= "MAGE"
139 EquipmentColName
= CommonTables
.KitList
.GetValue (KitIndex
, 0)
141 EquipmentTable
= GemRB
.LoadTable ("25stweap")
143 # a map of slots in the table to the real slots
144 # SLOT_BAG is invalid, so use the inventory (first occurence)
145 # SLOT_INVENTORY: use -1 instead, that's what CreateItem expects
146 RealSlots
= [ SLOT_ARMOUR
, SLOT_SHIELD
, SLOT_HELM
, -1, SLOT_RING
, \
147 SLOT_RING
, SLOT_CLOAK
, SLOT_BOOT
, SLOT_AMULET
, SLOT_GLOVE
, \
148 SLOT_BELT
, SLOT_QUIVER
, SLOT_QUIVER
, SLOT_QUIVER
, \
149 SLOT_ITEM
, SLOT_ITEM
, SLOT_ITEM
, SLOT_WEAPON
, SLOT_WEAPON
, SLOT_WEAPON
]
150 inventory_exclusion
= 0
152 #loop over rows - item slots
153 for slot
in range(0, EquipmentTable
.GetRowCount ()):
154 slotname
= EquipmentTable
.GetRowName (slot
)
155 item_resref
= EquipmentTable
.GetValue (slotname
, EquipmentColName
)
157 # no item - go to next
158 if item_resref
== "*":
161 # the table has typos for kitted bard's armor
162 if item_resref
== "LEATH14":
163 item_resref
= "LEAT14"
165 # get empty slots of the requested type
166 realslot
= GemRB
.GetSlots (MyChar
, RealSlots
[slot
], -1)
167 if RealSlots
[slot
] == SLOT_WEAPON
:
168 # exclude the shield slot, so the offhand stays empty
169 realslot
= realslot
[1:]
171 if realslot
== (): # fallback to the inventory
172 realslot
= GemRB
.GetSlots (MyChar
, -1, -1)
174 if realslot
== (): # this shouldn't happen!
175 print "Eeek! No free slots for", item_resref
178 # if an item contains a comma, the rest of the value is the stack
179 if "," in item_resref
:
180 item_resref
= item_resref
.split(",")
181 count
= int(item_resref
[1])
182 item_resref
= item_resref
[0]
186 targetslot
= realslot
[0]
187 SlotType
= GemRB
.GetSlotType (targetslot
, MyChar
)
189 item
= GemRB
.GetItem (item_resref
)
191 if inventory_exclusion
& item
['Exclusion']:
192 # oops, too many magic items to equip, so just dump it to the inventory
193 targetslot
= GemRB
.GetSlots (MyChar
, -1, -1)[0]
196 # if there are no free slots, CreateItem will create the item on the ground
197 while not GemRB
.CanUseItemType (SlotType
["Type"], item_resref
, MyChar
) \
198 and i
< len(realslot
):
199 targetslot
= realslot
[i
]
200 SlotType
= GemRB
.GetSlotType (targetslot
, MyChar
)
203 GemRB
.CreateItem(MyChar
, item_resref
, targetslot
, count
, 0, 0)
204 GemRB
.ChangeItemFlag (MyChar
, targetslot
, IE_INV_ITEM_IDENTIFIED
, OP_OR
)
205 inventory_exclusion |
= item
['Exclusion']
207 # grant the slayer change ability to the protagonist
209 GemRB
.LearnSpell (MyChar
, "SPIN822", LS_MEMO
)