Jump to content

Natural weapons of Spirit Animals are non-magical yet enchanted


Recommended Posts

A weapon's enchantment level has no effect on its THAC0 bonus. For reference, see the Staff of the Magi (STAF11.ITM). It has a +5 enchantment level yet it only provides a +1 THAC0 bonus.

 

EDIT - I'd just add that a summoned Mountain Bear should not outperform a supposedly much more powerful Spirit Bear in terms of "weapon" enchantment. As it stands right now, a summoned Mountain Bear (obtainable via Animal Summoning II) wields +3 claws, but the ultra-special Spirit Bear wields unenchanted claws? :band: Come on guys, use some common sense here, even if that means shafting this fix into OBC. ;)

Link to comment

Agreed. Non-magical & unenchanted are a bit daft in this case... then they can't even hurt each other if you set these ghostly things to whack each other for amusement value. :band:

 

I vote for the +2 tweak.

Link to comment

I'd like too to have spirit animals scaling with caster's level: they're very powerful in the beginning but became too weak later on. Furthmore they're probably overpowered if used in BG with Tutu but that has nothing to do with fixpack i presume.

Anyway i also think +3 enchantement would be the last acceptable "upgrade" because more than that would be too powerful imo.

I vote +3 because that would bring the Spirit Animals on pair with the strongest of the regular summoned animals. Going over that would upset the game balance IMO.
Basically i agree with it.
Link to comment

Please be directing tweak requests to more appropriate fora.

 

But since I'm a subjective hypocrite who was going to do something like this anyway...

OUTER_SPRINT el placeholder
OUTER_WHILE NOT IS_AN_INT el OR el > 0x06 OR el < 0x00 BEGIN
 PRINT ~Select an enchantment level from 0 to 5, or enter 6 for level-scaling critters.~
 ACTION_READLN el
END
ACTION_IF el != 0x06 THEN BEGIN
 COPY_EXISTING bearspir.itm override
			lionspir.itm override
			snakspir.itm override
			wolfspir.itm override
PATCH_IF SOURCE_SIZE > 0x71 BEGIN
  READ_LONG  0x18 fl
  WRITE_LONG 0x18 el > 0x00 ? fl | 0x40 : fl & ` 0x40
  WRITE_LONG 0x60 el
  READ_LONG  0x64 ho
  FOR (READ_SHORT 0x68 hc; hc > 0x00; hc -= 0x01) BEGIN
	READ_SHORT  ho + hc * 0x38 - 0x38 ty
	PATCH_IF ty = 0x01 BEGIN
	  WRITE_SHORT ho + hc * 0x38 - 0x24 el
	  WRITE_SHORT ho + hc * 0x38 - 0x1e el
	  WRITE_SHORT ho + hc * 0x38 - 0x0e 0x01
	END
  END
END
 BUT_ONLY
END ELSE BEGIN
 ACTION_FOR_EACH critter IN spirbear spirlion spirsnak spirwolf BEGIN
OUTER_PATCH_SAVE weapres ~%critter%~ BEGIN
  READ_ASCII   0x00 t1 (0x04)
  READ_ASCII   0x04 t2 (0x04)
  WRITE_ASCIIE 0x00 ~%t2%~
  WRITE_ASCIIE 0x04 ~%t1%~
END
OUTER_FOR (i1 = 0x00; i1 < 0x0a; i1 += 0x01) BEGIN
  OUTER_SET dx = i1 + 0x30
  OUTER_PATCH_SAVE weapnew ~%weapres%~ BEGIN
	WRITE_BYTE 0x07 dx
  END
  OUTER_PATCH_SAVE destres ~%critter%~ BEGIN
	READ_BYTE  0x04 n // 0x62 0x6c 0x73 0x77
	WRITE_BYTE 0x07 dx
  END
  COPY_EXISTING ~%critter%.cre~ ~override/%destres%.cre~
	PATCH_IF SOURCE_SIZE > 0x2d3 BEGIN
	  PATCH_FOR_EACH hpoff IN 0x24 0x26 BEGIN
		WRITE_SHORT hpoff (n = 0x62 ? (i1 + 0x01) * 0x14 : n = 0x6c ? (i1 + 0x01) * 0x10 : n = 0x73 ? (i1 + 0x01) * 0x0a : (i1 + 0x01) * 0x0c)
	  END
	  PATCH_FOR_EACH acoff IN 0x46 0x48 BEGIN
		WRITE_SHORT acoff (n = 0x62 ? 0x04 - i1 / 0x02 : n = 0x6c ? 0x03 - i1 / 0x02 : n = 0x73 ? 0x01 - i1 / 0x02 : 0x02 - i1 / 0x02)
	  END
	  WRITE_BYTE 0x052 (n = 0x62 ? 0x13 - (i1 * 0x02)  : n = 0x6c ? 0x11 - (i1 * 0x02)  : n = 0x73 ? 0x12 - (i1 * 0x02) : 0x12 - (i1 * 0x02))
	  WRITE_BYTE 0x053 (i1 < 0x02 ? 0x01 : i1 < 0x04 ? 0x03 : i1 < 0x06 ? 0x03 : 0x04)
	  WRITE_BYTE 0x054 0x0e - i1 * 0x02 > 0x03 ? 0x0e - i1 * 0x02 : 0x03
	  WRITE_BYTE 0x055 0x10 - i1 * 0x02 > 0x05 ? 0x10 - i1 * 0x02 : 0x05
	  WRITE_BYTE 0x056 0x0f - i1 * 0x02 > 0x04 ? 0x0f - i1 * 0x02 : 0x04
	  WRITE_BYTE 0x057 0x11 - i1 * 0x02 > 0x04 ? 0x11 - i1 * 0x02 : 0x04
	  WRITE_BYTE 0x058 0x11 - i1 * 0x02 > 0x06 ? 0x11 - i1 * 0x02 : 0x06
	  WRITE_BYTE 0x234 i1 * 0x02 + 0x01
	  WRITE_BYTE 0x23f 0x0a
	  WRITE_BYTE 0x240 0x00
	  WRITE_BYTE 0x242 0x00
	  REPLACE_CRE_ITEM helmnoan	#0 #0 #0 NONE HELMET
	  REPLACE_CRE_ITEM ~%weapnew%~ #0 #0 #0 NONE WEAPON1
	  PATCH_IF		  i1 < 0x01 BEGIN
		REPLACE_CRE_ITEM ring01  #0 #0 #0 ~UNSTEALABLE&UNDROPPABLE~ LRING
	  END ELSE PATCH_IF i1 < 0x03 BEGIN
		REPLACE_CRE_ITEM immune1 #0 #0 #0 NONE LRING
	  END ELSE PATCH_IF i1 < 0x07 BEGIN
		REPLACE_CRE_ITEM immune2 #0 #0 #0 NONE LRING
	  END
	END
  //BUT_ONLY_IF_IT_SUCKS
  COPY_EXISTING ~%weapres%.itm~ ~override/%weapnew%.itm~
	PATCH_IF SOURCE_SIZE > 0x71 BEGIN
	  READ_LONG   0x18 fl
	  WRITE_LONG  0x18 (i1 / 0x02) > 0x00 OR n = 0x6c ? fl | 0x40 : fl & ` 0x40
	  WRITE_ASCII 0x22 ~  ~
	  WRITE_LONG  0x60 n = 0x6c ? (i1 + 0x02) / 0x02 : i1 / 0x02
	  READ_LONG   0x64 ho
	  READ_SHORT  0x68 hc
	  READ_LONG   0x6a eo
	  READ_SHORT  0x6e gi
	  READ_SHORT  0x70 gc
	  FOR (i2 = hc; i2 > 0x00; i2 -= 0x01) BEGIN
		READ_SHORT  ho + i2 * 0x38 - 0x38 ty
		PATCH_IF ty = 0x01 BEGIN
		  WRITE_SHORT ho + i2 * 0x38 - 0x24 (n = 0x62 ? (i1 / 0x02) : n = 0x6c ? ((i1 + 0x02) / 0x02) : n = 0x73 ? (i1 / 0x02) : (i1 / 0x02))
		  WRITE_SHORT ho + i2 * 0x38 - 0x22 (n = 0x62 ? 0x0a : n = 0x6c ? 0x08 : n = 0x73 ? 0x08 : 0x04)
		  WRITE_SHORT ho + i2 * 0x38 - 0x20 0x01
		  READ_SHORT  ho + i2 * 0x38 - 0x18 ei
		  WRITE_SHORT ho + i2 * 0x38 - 0x1e (n = 0x62 ? (i1 / 0x02) : n = 0x6c ? ((i1 + 0x02) / 0x02) : n = 0x73 ? (i1 / 0x02) : (i1 / 0x02))
		  WRITE_SHORT ho + i2 * 0x38 - 0x0e 0x01
		  PATCH_IF n = 0x6c BEGIN
			READ_SHORT  ho + i2 * 0x38 - 0x1a ec
			WRITE_SHORT ho + i2 * 0x38 - 0x1a ec + 0x03
			INSERT_BYTES (eo + 0x30 * ei + 0x00) 0x90
			FOR (i3 = 0x00; i3 < 0x03; i3 += 0x01) BEGIN
			  WRITE_LONG   (eo + 0x30 * (ei + i3) + 0x0e) 0x12
			  WRITE_BYTE   (eo + 0x30 * (ei + i3) + 0x02) 0x02
			  WRITE_BYTE   (eo + 0x30 * (ei + i3) + 0x12) 0x21
			END
			WRITE_SHORT  (eo + 0x30 * ei + 0x00) 0x19
			WRITE_LONG   (eo + 0x30 * ei + 0x04) 0x06
			WRITE_LONG   (eo + 0x30 * ei + 0x08) 0x03
			WRITE_SHORT  (eo + 0x30 * ei + 0x30) 0x8e
			WRITE_LONG   (eo + 0x30 * ei + 0x38) 0x89
			WRITE_SHORT  (eo + 0x30 * ei + 0x60) 0x8b
			WRITE_BYTE   (eo + 0x30 * ei + 0x62) 0x01
			SAY		  (eo + 0x30 * ei + 0x64) ~Claw Rake~
		  END ELSE PATCH_IF n = 0x77 BEGIN
			READ_SHORT  ho + i2 * 0x38 - 0x1a ec
			WRITE_SHORT ho + i2 * 0x38 - 0x1a ec + 0x01
			INSERT_BYTES (eo + 0x30 * ei + 0x00) 0x30
			WRITE_SHORT  (eo + 0x30 * ei + 0x00) 0x8b
			WRITE_LONG   (eo + 0x30 * ei + 0x04) 0xa217
			WRITE_BYTE   (eo + 0x30 * ei + 0x12) i1 < 0x03 ? 0x00 : 0x64
			WRITE_LONG   (eo + 0x30 * ei + 0x24) 0x01
			WRITE_LONG   (eo + 0x30 * ei + 0x28) 0x04 - i1 / 0x02
		  END
		  READ_SHORT  ho + i2 * 0x38 - 0x1a ec
		  FOR (i3 = 0x00; i3 < ec; i3 += 0x01) BEGIN
			READ_SHORT (eo + 0x30 * (ei + i3) + 0x00) op
			READ_SHORT (eo + 0x30 * (ei + i3) + 0x08) p2
			PATCH_IF op = 0xd8 BEGIN
			  WRITE_BYTE (eo + 0x30 * (ei + i3) + 0x12) i1 < 0x03 ? 0x00 : 0x64
			  WRITE_LONG (eo + 0x30 * (ei + i3) + 0x24) 0x01
			  WRITE_LONG (eo + 0x30 * (ei + i3) + 0x28) 0x04 - i1 / 0x02
			END ELSE PATCH_IF op = 0x0c AND p2 = 0x20000 BEGIN
			  WRITE_LONG (eo + 0x30 * (ei + i3) + 0x0e) 0x00
			  WRITE_LONG (eo + 0x30 * (ei + i3) + 0x1c) 0x01
			  WRITE_LONG (eo + 0x30 * (ei + i3) + 0x20) (i1 < 0x02 ? 0x02 : i1 < 0x04 ? 0x04 : 0x06)
			END ELSE PATCH_IF (op = 0x19 AND p2 = 0x02) OR (op = 0x8e AND p2 = 0x06) BEGIN
			  WRITE_LONG (eo + 0x30 * (ei + i3) + 0x24) 0x04
			  WRITE_LONG (eo + 0x30 * (ei + i3) + 0x28) 0x04 - i1
			END ELSE PATCH_IF op = 0x18 BEGIN
			  WRITE_LONG (eo + 0x30 * (ei + i3) + 0x24) 0x04
			  WRITE_LONG (eo + 0x30 * (ei + i3) + 0x28) 0x03 - i1 / 0x02
			END
		  END
		END
	  END
	  READ_SHORT 0x70 ec
	  READ_SHORT 0x6e ei
	  FOR (i2 = 0x00; i2 < hc; i2 += 0x01) BEGIN
		SET ei += ec
		READ_SHORT  ho + i2 * 0x38 - 0x1a ec
		WRITE_SHORT ho + i2 * 0x38 - 0x20 ei
	  END
	END
  //BUT_ONLY_IF_IT_SUCKS
END
 END
 OUTER_FOR (i1 = 0x00; i1 < 0x0a; i1 += 0x01) BEGIN
COPY_EXISTING spirsumm.2da ~override/spirsum%i1%.2da~
  PATCH_IF SOURCE_SIZE BEGIN
	REPLACE_TEXTUALLY ~spir\(bea\|wol\|sna\|lio\)[rfkn]~ ~spir\1%i1%~
  END
//BUT_ONLY
COPY_EXISTING spirsumm.eff ~override/spirsum%i1%.eff~
  PATCH_IF SOURCE_SIZE = 0x110 BEGIN
	WRITE_LONG   0x18 0x00
	WRITE_ASCIIE 0x30 ~spirsum%i1%~
  END
//BUT_ONLY
 END
 COPY_EXISTING spcl621.spl override
PATCH_IF SOURCE_SIZE > 0x71 BEGIN
  WRITE_SHORT 0x25 0x00
  WRITE_BYTE  0x27 0x00
  READ_LONG   0x64 ho
  READ_SHORT  0x68 hc
  READ_LONG   0x6a eo
  FOR (i2 = hc; i2 > 0x00; i2 -= 0x01) BEGIN
	READ_SHORT   (ho + 0x28 * i2 - 0x0a) ec
	WRITE_SHORT  (ho + 0x28 * i2 - 0x0a) 0x0a
	READ_SHORT   (ho + 0x28 * i2 - 0x08) ei
	READ_ASCII   (eo + ei * 0x30) ef (0x30)
	INSERT_BYTES (eo + ei * 0x30) 0x30 * 0x0a
	DELETE_BYTES (eo + ei * 0x30) ec * 0x30
	INNER_PATCH_SAVE ef ~%ef%~ BEGIN
	  WRITE_SHORT 0x00 0xb1
	  WRITE_BYTE  0x02 0x01
	  WRITE_BYTE  0x03 0x00
	  WRITE_LONG  0x04 0x00
	  WRITE_LONG  0x08 0x02
	  WRITE_BYTE  0x0c 0x00
	  WRITE_BYTE  0x0d 0x00
	  WRITE_LONG  0x0e 0x168
	  WRITE_BYTE  0x12 0x64
	  WRITE_BYTE  0x13 0x00
	  WRITE_ASCII 0x14 ~spirsum~ #8
	  WRITE_LONG  0x1c 0x00
	  WRITE_LONG  0x20 0x01
	END
	FOR (i3 = 0x00; i3 < 0x0a; i3 += 0x01) BEGIN
	  WRITE_ASCIIE eo + (ei + i3) * 0x30 + 0x00 ~%ef%~
	  WRITE_BYTE   eo + (ei + i3) * 0x30 + 0x1b i3 + 0x30
	  WRITE_LONG   eo + (ei + i3) * 0x30 + 0x1c i3 != 0x09 ? i3 * 0x02 + 0x02 : 0x00
	  WRITE_LONG   eo + (ei + i3) * 0x30 + 0x20 i3 * 0x02 + 0x01
	END
  END
  READ_SHORT 0x70 ec
  READ_SHORT 0x6e ei
  FOR (i2 = 0x00; i2 < hc; i2 += 0x01) BEGIN
	SET ei += ec
	READ_SHORT  ho + i2 * 0x28 + 0x1a ec
	WRITE_SHORT ho + i2 * 0x28 + 0x20 ei
  END
END
 BUT_ONLY
END

Link to comment

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...