I can provide a tp2 chunk that modifies also the HPs of every creature (EG Minsc and Jaheira get both something like 20 HP)
Hadn't considered this idea, to be honest. If there is interest in this, it should be simple enough to implement. Giving max HP to opponents, though, may be a better idea for Tactics.
Almost all opponents have max
HP anyway
The benefits are almost only for party members.
Just some random (?) opponents get really more powerful, EG, bodhi gets 200 (from 120, 185 with tactics) while, with tactics installed, liches also get 200... It's lust up to tweaking the numbers a bit
Implementation isn't 100% simple, since this is the work I've done:
//other stuff, need to apply these two patches:
SET "chpraisedto" = 0
SET "hpraisedto" = 0
PRINT "Updating all creature's HPs. It will take a lot of time. If you read the actual code, you'll ask yourself why it didn't take longer;-)"
COPY_EXISTING_REGEXP GLOB ~.*\.cre~ ~override~
READ_BYTE 0x0272 "race"
READ_BYTE 0x0010 "dual1"
READ_BYTE 0x0011 "dual2"
READ_SHORT 0x0024 "currenthp"
READ_SHORT 0x0026 "maxhp"
READ_BYTE 0x0234 "level1" // If dual-classed, this value is put in the next field, and this field is set to 1.
READ_BYTE 0x0235 "level2" // Highest attained level in secondary class (0-100)
READ_BYTE 0x0236 "level3" // Highest attained level in tertiary class (0-100)
// 0 is Dual Classed cre (if 0x0235 is non-zero, >0 is multi-classed)
READ_LONG 0x0244 "kit" //0x00004000 = barbarian
READ_BYTE 0x0273 "class"/*1 MAGE 2 FIGHTER 3 CLERIC 4 THIEF 5 BARD 6 PALADIN 7 FIGHTER_MAGE 8 FIGHTER_CLERIC 9 FIGHTER_THIEF 10 FIGHTER_MAGE_THIEF 11 DRUID 12 RANGER 13 MAGE_THIEF 14 CLERIC_MAGE 15 CLERIC_THIEF 16 FIGHTER_DRUID 17 FIGHTER_MAGE_CLERIC 18 CLERIC_RANGER 19 SORCERER 20 MONK*/
SET "firstdice" = 0
SET "firstlast" = 0
SET "firstpostdice" = 0
SET "seconddice" = 0
SET "secondlast" = 0
SET "secondpostdice" = 0
SET "thirddice" = 0
SET "thirdlast" = 0
SET "thirdpostdice" = 0
SET "divide" = 1
SET "noloop" = 0
WHILE ("%noloop%" = 0) BEGIN
//this while determines how will the dice work for a non-dualclass
//dual classes get extra treatment later
//non standard classed get treated later
WHILE (("%firstdice%" = 0) AND (("%class%" = 1) AND ("%kit%" = 0x00004000))) BEGIN //class = barbarian
SET "firstdice" = 12
SET "firstlast" = 9
SET "firstpostdice" = 3
SET "seconddice" = 0
SET "thirddice" = 0
END
WHILE (("%firstdice%" = 0) AND (("%class%" = 1) OR ("%class%" = 19))) BEGIN //class = MA/S
SET "firstdice" = 4
SET "firstlast" = 10
SET "firstpostdice" = 1
SET "seconddice" = 0
SET "thirddice" = 0
END
WHILE (("%firstdice%" = 0) AND ((("%class%" = 2) OR ("%class%" = 6))OR ("%class%" = 12))) BEGIN //class = F/R/P
SET "firstdice" = 10
SET "firstlast" = 9
SET "firstpostdice" = 3
SET "seconddice" = 0
SET "thirddice" = 0
END
WHILE (("%firstdice%" = 0) AND ((("%class%" = 3) OR ("%class%" = 11)) OR ("%class%" = 20))) BEGIN //class = C/D/MO
SET "firstdice" = 8
SET "firstlast" = 9
SET "firstpostdice" = 2
SET "seconddice" = 0
SET "thirddice" = 0
END
WHILE (("%firstdice%" = 0) AND (("%class%" = 4) OR ("%class%" = 5))) BEGIN //class = T/B SET "firstdice" = 4
SET "firstdice" = 6
SET "firstlast" = 10
SET "firstpostdice" = 1
SET "seconddice" = 0
SET "thirddice" = 0
END
WHILE (("%firstdice%" = 0) AND ("%class%" = 7)) BEGIN //class = FM
SET "firstdice" = 10
SET "firstlast" = 9
SET "firstpostdice" = 3
SET "seconddice" = 1
SET "secondlast" = 10
SET "secondpostdice" = 1
SET "thirddice" = 0
SET "divide" = 2
END
WHILE (("%firstdice%" = 0) AND ("%class%" = 9)) BEGIN //class = FT
SET "firstdice" = 10
SET "firstlast" = 9
SET "firstpostdice" = 3
SET "seconddice" = 4
SET "secondlast" = 10
SET "secondpostdice" = 2
SET "thirddice" = 0
SET "divide" = 2
END
WHILE (("%firstdice%" = 0) AND ("%class%" = 8)) BEGIN //class = FC
SET "firstdice" = 10
SET "firstlast" = 9
SET "firstpostdice" = 3
SET "seconddice" = 8
SET "secondlast" = 9
SET "secondpostdice" = 2
SET "thirddice" = 0
SET "divide" = 2
END
WHILE (("%firstdice%" = 0) AND ("%class%" = 13)) BEGIN //class = MT
SET "firstdice" = 4
SET "firstlast" = 10
SET "firstpostdice" = 1
SET "seconddice" = 6
SET "secondlast" = 10
SET "secondpostdice" = 2
SET "thirddice" = 0
SET "divide" = 2
END
WHILE (("%firstdice%" = 0) AND ("%class%" = 15)) BEGIN //class = CT
SET "firstdice" = 8
SET "firstlast" = 9
SET "firstpostdice" = 2
SET "seconddice" = 6
SET "secondlast" = 10
SET "secondpostdice" = 2
SET "thirddice" = 0
SET "divide" = 2
END
WHILE (("%firstdice%" = 0) AND ("%class%" = 14)) BEGIN //class = CM
SET "firstdice" = 8
SET "firstlast" = 9
SET "firstpostdice" = 2
SET "seconddice" = 4
SET "secondlast" = 10
SET "secondpostdice" = 1
SET "thirddice" = 0
SET "divide" = 2
END
WHILE (("%firstdice%" = 0) AND ("%class%" = 16)) BEGIN //class = FD
SET "firstdice" = 10
SET "firstlast" = 9
SET "firstpostdice" = 3
SET "seconddice" = 8
SET "secondlast" = 9
SET "secondpostdice" = 2
SET "thirddice" = 0
SET "divide" = 2
END
WHILE (("%firstdice%" = 0) AND ("%class%" = 18)) BEGIN //class = CR
SET "firstdice" = 8
SET "firstlast" = 9
SET "firstpostdice" = 2
SET "seconddice" = 10
SET "secondlast" = 9
SET "secondpostdice" = 3
SET "thirddice" = 0
SET "divide" = 2
END
WHILE (("%firstdice%" = 0) AND ("%class%" = 10)) BEGIN //class = FMT
SET "firstdice" = 10
SET "firstlast" = 9
SET "firstpostdice" = 3
SET "seconddice" = 4
SET "secondlast" = 10
SET "secondpostdice" = 1
SET "thirddice" = 6
SET "thirdlast" = 10
SET "thirdpostdice" = 2
SET "divide" = 3
END
WHILE (("%firstdice%" = 0) AND ("%class%" = 17)) BEGIN //class = FMC
SET "firstdice" = 10
SET "firstlast" = 9
SET "firstpostdice" = 3
SET "seconddice" = 4
SET "secondlast" = 10
SET "secondpostdice" = 1
SET "thirddice" = 8
SET "thirdlast" = 9
SET "thirdpostdice" = 2
SET "divide" = 3
END
//finished setting the dices for single and multi classes)
SET "noloop" = 1
END
//dual classes fixes
SET "noloop" = 0
WHILE (("%race%" = 1) AND (("%noloop%" = 0) AND ((NOT(("%dual1%" BAND 0b1111000) = 0b00000000)) OR (NOT("%dual2%" BAND 0b00000001) = 0b00000000)))) BEGIN // I'm a dual-class
SET "divide" = 1
WHILE (("%noloop%" = 0) AND (("%dual1%" BAND 0b10000000) = 0b10000000)) BEGIN //FD from D
SET "level1" = ("%level1%" <= "%level2%") ? 0 : ("%level1%" - "%level2%")
SET "firstlast" = ("%level2%" >= "%firstlast%") ? 0 : ("%firstlast%" - "%level2%")
SET "noloop" = 1
//this is easier since D comes always after F in the level list (same for R (last), F (first) and T (last). M and C are trickier
END
WHILE (("%noloop%" = 0) AND (("%dual1%" BAND 0b01000000) = 0b01000000)) BEGIN //?T from T;
SET "level1" = ("%level1%" <= "%level2%") ? 0 : ("%level1%" - "%level2%")
SET "firstlast" = ("%level2%" >= "%firstlast%") ? 0 : ("%firstlast%" - "%level2%")
SET "noloop" = 1
//T is always after all classes he's dualled to
END
WHILE (("%noloop%" = 0) AND (("%dual1%" BAND 0b00100000) = 0b00100000)) BEGIN //?C or C? from C
WHILE (("%noloop%" = 0 ) AND ("%class%" = 8)) BEGIN //FC from C
SET "level1" = ("%level1%" <= "%level2%") ? 0 : ("%level1%" - "%level2%")
SET "firstlast" = ("%level2%" >= "%firstlast%") ? 0 : ("%firstlast%" - "%level2%")
SET "noloop" = 1
END
WHILE (("%noloop%" = 0 ) AND (("%class%" = 14) OR ("%class%" = 15))) BEGIN //CM or CT from C
SET "level2" = ("%level2%" <= "%level1%") ? 0 : ("%level2%" - "%level1%")
SET "secondlast" = ("%level1%" >= "%secondlast%") ? 0 : ("%secondlast%" - "%level1%")
SET "noloop" = 1
END
SET "noloop" = 1
END
WHILE (("%noloop%" = 0) AND (("%dual1%" BAND 0b00010000) = 0b00010000)) BEGIN //?M or M? from M
WHILE (("%noloop%" = 0 ) AND (("%class%" = 7) OR ("%class%" = 14))) BEGIN //FM or CM from M
SET "level1" = ("%level1%" <= "%level2%") ? 0 : ("%level1%" - "%level2%")
SET "firstlast" = ("%level2%" >= "%firstlast%") ? 0 : ("%firstlast%" - "%level2%")
SET "noloop" = 1
END
WHILE (("%noloop%" = 0 ) AND ("%class%" = 13) ) BEGIN //MT from M
SET "level2" = ("%level2%" <= "%level1%") ? 0 : ("%level2%" - "%level1%")
SET "secondlast" = ("%level1%" >= "%secondlast%") ? 0 : ("%secondlast%" - "%level1%")
SET "noloop" = 1
END
SET "noloop" = 1
END
WHILE (("%noloop%" = 0) AND (("%dual1%" BAND 0b00001000) = 0b00001000)) BEGIN //F? from F SET "level2" = ("%level2%" <= "%level1%") ? 0 : ("%level2%" - "%level1%")
SET "level2" = ("%level2%" <= "%level1%") ? 0 : ("%level2%" - "%level1%")
SET "secondlast" = ("%level1%" >= "%secondlast%") ? 0 : ("%secondlast%" - "%level1%")
SET "noloop" = 1
//F is always first
END
WHILE (("%noloop%" = 0) AND (("%dual2%" BAND 0b00000001) = 0b00000001)) BEGIN //CR from R
SET "level1" = ("%level1%" <= "%level2%") ? 0 : ("%level1%" - "%level2%")
SET "firstlast" = ("%level2%" >= "%firstlast%") ? 0 : ("%firstlast%" - "%level2%")
SET "noloop" = 1
//again, R is always after C
END
SET "noloop" = 1
END
//non standard class guys haven't already set their dice sizes
WHILE ("%firstdice%" = 0) BEGIN /*class = not standard, so dice sizes aren't already set; PnP DM's Manual states that HD's are d8's. */
WHILE ("%noloop%" = 0) BEGIN
SET "firstdice" = 8
SET "firstlast" = 50
SET "firstpostdice" = 0
SET "seconddice" = 0
SET "thirddice" = 0
SET "noloop" = 1
SET "divide" = 1
END
/*the original code is waay to schizophrenic, in particular many guys have all 3 level
fields set, and, if the *real* level is in the second field, I'll use the first, instead.
Usually, the first is higher, and anyway HP's aren't lowered, only upped, so...*/
END
SET "noloop" = 0
//actual setting HP's to the max (if current are bigger than theorical max, skip 'em)
WHILE ("%noloop%" = 0) BEGIN
SET "duehp" = 0
SET "done1st" = 0
SET "done2nd" = 0
SET "done3rd" = 0
WHILE (("%level1%" <= "%firstlast%") AND ("%done1st%" = 0 )) BEGIN
SET "duehp" = ("%duehp%" + ("%level1%" * "%firstdice%"))
SET "done1st" = 1
END
WHILE (("%level2%" <= "%secondlast%") AND ("%done2nd%" = 0 )) BEGIN
SET "duehp" = ("%duehp%" + ("%level2%" * "%seconddice%"))
SET "done2nd" = 1
END
WHILE (("%level3%" <= "%thirdlast%") AND ("%done3rd%" = 0 )) BEGIN
SET "duehp" = ("%duehp%" + ("%level3%" * "%thirddice%"))
SET "done3rd" = 1
END
WHILE (("%level1%" > "%firstlast%") AND ("%done1st%" = 0 )) BEGIN
SET "duehp" = (("%duehp%" + ("%firstlast%" * "%firstdice%")) + ("%firstpostdice%" * ("%level1%" - "%firstlast%")))
SET "done1st" = 1
END
WHILE (("%level2%" > "%secondlast%") AND ("%done2nd%" = 0 )) BEGIN
SET "duehp" = (("%duehp%" + ("%secondlast%" * "%seconddice%")) + ("%secondpostdice%" * ("%level2%" - "%secondlast%")))
SET "done2nd" = 1
END
WHILE (("%level3%" > "%thirdlast%") AND ("%done3rd%" = 0 )) BEGIN
SET "duehp" = (("%duehp%" + ("%thirdlast%" * "%thirddice%")) + ("%thirdpostdice%" * ("%level3%" - "%thirdlast%")))
SET "done3rd" = 3
END
SET "duehp" = "%duehp%" / "%divide%"
//done calculating due HP's
SET "noloop" = 0
WHILE (("%noloop%" = 0) AND (NOT("%currenthp%" = "%maxhp%"))) BEGIN //if cre is set to be already hurt, so be it
WHILE (("%duehp%" > "%maxhp%") AND ("%noloop%" = 0)) BEGIN //cre may already have perfect or cheesy HP's
WRITE_SHORT 0x0026 "%duehp%"
SET "noloop" = 1
SET "hpraisedto" = 1 + "%hpraisedto%"
END
SET "noloop" = 1
END
WHILE (("%noloop%" = 0) AND ("%currenthp%" = "%maxhp%")) BEGIN //if cre is at 100% health
WHILE (("%duehp%" > "%maxhp%") AND ("%noloop%" = 0)) BEGIN //cre may already have perfect or cheesy HP's
WRITE_SHORT 0x0026 "%duehp%"
WRITE_SHORT 0x0024 "%duehp%"
SET "noloop" = 1
SET "hpraisedto" = 1 + "%hpraisedto%"
SET "chpraisedto" = 1 + "%chpraisedto%"
END
SET "noloop" = 1
END
SET "noloop" = 1
END
BUT_ONLY_IF_IT_CHANGES
PRINT "I have raised the Current HP of %chpraisedto% Creatures"
PRINT "I have raised the Max HP of %hpraisedto% Creatures"
Edited by the bigg, 10 June 2004 - 11:45 PM.