Jump to content

IA v6 Final


Recommended Posts

My suggestion is that we keep the topic to IA's content, gameplay, tactics, item locations, flaws, tweaks, loopholes and possible new ideas which may come out of this. If I wanted to make money on the Internet, I'd choose something else over advertising/testing a free-has-to-be tactical mod for an old game. And there are a lot more ways (like working a real job, for example, like I do) to earn a decent sum of money rather than spending several years to create a tactical mod and afterwards eventually to gain $300-500 in about another year.

 

his polygonal super-intelligent AI

This bit has always puzzled me. I'm not modding-savvy, so I'm asking: does "polygonal scripting system" actually MEAN something? What's different from "normal" scripting?

 

The AI isn't THAT intelligent. After all, we're talking about computers here. No matter how Sikret tweaked it, there are always ways to trick the computer-controlled enemies. Example: No matter how badly an enemy IA mage/cleric is pressed, if PC casts an Improved Invisibility or Mirror Image spell (and the enemy is not running True Sight), enemy's first priority would be a True Sight casting, instead, for example, defending himself with proper buffs like proMW. Another example: although an enemy mage will immediately cast a weapon-protection spell(like ProMW) when a character simply stands near him (not even needed to engage in combat), the same mage will not make attempt to defend himself with the same spell if shot from a distance with projectiles.

 

In fact, as far as I can see from IA 5.0 and a little from 6.0, Sikret relies far more on improving monsters with permanent immunities and buffs, great resistances, regeneration and cheesy activated or 'on successful hit' abilities rather than focusing that much on increasing enemy intelligence. If a battle is hard, it's due to numerous such buffed enemies with powerful innate abilities rather than due to enemy's good AI.

Link to comment
This bit has always puzzled me. I'm not modding-savvy, so I'm asking: does "polygonal scripting system" actually MEAN something? What's different from "normal" scripting?

When DavidW asked about that, Sikret didn't answer. As far as anybody can tell, it's a remix of Detectable Spells with some background scripts that run additional checks, so it's not anything ground-breaking. Hilarious example: IA doesn't fix kit.ids. As such, rather than Kit(PLayer1,NECROMANCER), he needs to use the necro's CLAB file to set a scripting state for necros, and check against that for the necro-only items.

 

The longest script in IA ("Limak", a 37/31/39 F/M/C) is ~4800 lines.. which sounds less impressive when you figure out that it takes 400 lines to cast PW:Kill.

Link to comment
his polygonal super-intelligent AI

This bit has always puzzled me. I'm not modding-savvy, so I'm asking: does "polygonal scripting system" actually MEAN something? What's different from "normal" scripting?

 

The AI isn't THAT intelligent. After all, we're talking about computers here. No matter how Sikret tweaked it, there are always ways to trick the computer-controlled enemies. Example: No matter how badly an enemy IA mage/cleric is pressed, if PC casts an Improved Invisibility or Mirror Image spell (and the enemy is not running True Sight), enemy's first priority would be a True Sight casting, instead, for example, defending himself with proper buffs like proMW. Another example: although an enemy mage will immediately cast a weapon-protection spell(like ProMW) when a character simply stands near him (not even needed to engage in combat), the same mage will not make attempt to defend himself with the same spell if shot from a distance with projectiles.

 

Another case in point is enemy mages in IA v6. They're easily exploitable in at least one regard - if you have spell protections and they have some means to remove them, they WILL try to do so at the expense of using offensive spells on your warriors.

 

I used this to good effect many times, engaging in "mage duels" using my mages to keep the enemy mages busy while my warriors killed them (or their minions.) Every time I'd get stripped of Spell Immunity, I'd simply cast another one.

 

As one gets higher in levels, the protections and needs increase in complexity, but the concept remains the same: give them something to de-buff, and they'll try to do it. Killing Zallanora was easy as pie using these tactics.

 

In fact, as far as I can see from IA 5.0 and a little from 6.0, Sikret relies far more on improving monsters with permanent immunities and buffs, great resistances, regeneration and cheesy activated or 'on successful hit' abilities rather than focusing that much on increasing enemy intelligence. If a battle is hard, it's due to numerous such buffed enemies with powerful innate abilities rather than due to enemy's good AI.

 

I've been saying this for some time, and others have known about it for years. A cursory examination of Sikret's monsters in a utility like Shadowkeeper or Near Infinity reveals that the vast majority of them rely far more on these inherent, cheesy "qualities" than any sort of superior scripting or intelligence.

 

To be fair (yes, even to you, Sikret honey) our favorite professional modder has put a lot of effort and attention into certain encounters, very narrowly scripting precisely what the enemy will do. These scripts are extremely detailed and complex in many cases; his effort to improve these battles definitely shows.

 

Of course, in these minutely scripted encounters it's often only possible to win by very closely following Sikret's personal notion of how the battle should be fought. It's possible to win using means that Sikret didn't plan on or doesn't approve of, but he's put a great deal of effort into making that as difficult as he could.

 

An example: I did a very detailed set of testing reports on a Necromancer-only battle late in SoA called "The Story of the Old Ones", in which you fight 3 enemy Grave Liches with the help of a high level NPC. The battle is fought without the remainder of the group (just the protagonist and the NPC) and is a very good example of one in which Sikret has deliberately tried to engineer the outcome with only one plausible tactic for success.

 

After about 10 tries, I ultimately beat the battle without needing this "Old One" at all. He was present and did participate, but provided very little meaningful assistance. I beat all 3 liches with what turned out to be a very simple set of tactics:

 

1) Use powerful defenses to survive everything the liches could throw at me;

2) Make the enemy liches expend ALL of their dangerous spells, primarily on summons. Once they were out of spells, they were easily destroyed by the summons that I had remaining. And I didn't even use a Wish spell.

 

Once I'd beaten the battle, Sikret dismissed my achievement, insulted me for ignoring his tactics on how to win (in other words, he wasn't interested in anyone coming up with a non-sanctioned way of winning), and proceeded to change the parameters of the fight in an effort to try to prevent a player from winning in any way other than how he wanted it. His way tries to force the player to instead have to depend on the Old One to defeat the liches for you.

 

All that being said, as far as the scripting goes, he did an extremely detailed job of it. I give him credit for that.

 

These test reports and subsequent discussions are VERY long and detailed, but if anyone is interested in seeing them, send me a PM. Or perhaps I'll post it here if anyone asks me to.

Link to comment

I haven't gotten very far in IA 6 (decided to restart a party without a thief, since it has become obvious to me that thieves are utterly useless in IA6. Worse, they're a liabilty now, even Swashbucklers) but as far as i can see the AI hasn't been improved much, compared to IA 5. The AI is ok (certainly a lot better than vanilla), but it's not better in any way than - for example - SCS.

As saros said, IA's difficulty is caused by the often absurd resistances/immunities and blatant cheating, not by the AI. As for polygonal scripting: god knows what that means, if it does mean anything at all. Perhaps David W. and/or the Bigg have any clue what it means.

Someone allready noted somewhere in this thread that with IA you're no longer playing a AD&D game. A red dragon in IA has nothing whatsoever to do with the red dragon in the Monster Manual.

Link to comment

Since the_bigg mentioned him...

 

Limak was another example of easily exploiting a mage's scripting. In my initial attempts to beat him I really didn't consider what he'd do in response to what I was doing. I just tried various ways to attack him en masse and got slaughtered.

 

The winning strategy was to simply wait him out.

 

1) I gave him lots (and lots) of summons to think about - but only one at a time, to best absorb the most summons-killing spells

2) one PC stepped right up next to him as a "target" to keep his attention (my R/C dual, who had tons of Ironskins memorized)

3) and a mage "target" (my Necromancer) who could refresh Spell Immunity faster than Limak could Ruby Ray it. (trust me, he tried.)

 

Everyone else just spread out and waited until Limak's own Spell Immunity wore off and I'd dispelled his Improved Invisibility. From then on it was just a breach-and-hack battle. No problem for a group that powerful; I didn't even have a party death.

Link to comment

QUOTE (Guest! @ Oct 31 2010, 12:34 PM)

This bit has always puzzled me. I'm not modding-savvy, so I'm asking: does "polygonal scripting system" actually MEAN something? What's different from "normal" scripting?

When DavidW asked about that, Sikret didn't answer. As far as anybody can tell, it's a remix of Detectable Spells with some background scripts that run additional checks, so it's not anything ground-breaking. Hilarious example: IA doesn't fix kit.ids. As such, rather than Kit(PLayer1,NECROMANCER), he needs to use the necro's CLAB file to set a scripting state for necros, and check against that for the necro-only items.

 

The longest script in IA ("Limak", a 37/31/39 F/M/C) is ~4800 lines.. which sounds less impressive when you figure out that it takes 400 lines to cast PW:Kill.

 

 

You mean to say "polygonal scripting' is just a load of pretentious bollocks?

Link to comment
You mean to say "polygonal scripting' is just a load of pretentious bollocks?

Most likely yes. I didn't run an in-depth analysis of the scripts (and don't plan to), so there might be more to it than it appears in a ten-minute browsing, but signs point to this just being loads of hot air (of course, that'd be par for the point for Sikret).

Link to comment

Just tested the revised Alchemy (mage) HLA. The potions are unsellable (as stated in the readme) but what made some impression is that the Alchemy creates 2 different types of Oil of Speed, both with identical description and icon while in the inventory. Apparently, one of those was poisonous. However, Sikret obviously missed the fact that when equipped on quick-slot, the poisonous oil of speed icon changes to the generic game icon (rainbow-colored bottle), so it can be distinguished from the real one.

 

Edit: From the revised Wish spell (sorcerer choices):

 

Breach on everyone in the area except party members and improved invisible enemies - so where's the point in that choice anymore ;) it was mainly used in IA 5.0 to breach high-level mages under SI:D & II.

Protection from Magical Energy on all party members - that one's actually very good

'Magic Resistance' on everyone in the area - no longer works as offensive spell since it adds 30% MR on top of the current MR value instead of setting it to 40%. But it's a very good party buff, since clerics cannot cast MR on anyone but themselves anymore.

 

Will have to check Wands of Spell Striking for some usefulness. As they're now (casting Pierce magic only), they're absolutely useless. They would be useful if they can target Improved invisible enemies in order to strip their SI:D. However, I don't think that's possible anymore.

Link to comment
When DavidW asked about that, Sikret didn't answer. As far as anybody can tell, it's a remix of Detectable Spells with some background scripts that run additional checks, so it's not anything ground-breaking. Hilarious example: IA doesn't fix kit.ids. As such, rather than Kit(PLayer1,NECROMANCER), he needs to use the necro's CLAB file to set a scripting state for necros, and check against that for the necro-only items.

 

The longest script in IA ("Limak", a 37/31/39 F/M/C) is ~4800 lines.. which sounds less impressive when you figure out that it takes 400 lines to cast PW:Kill.

 

did Sikret quietly fix the 'enemies don't respond to Player2-6 paladins but only to player1 and keldorn' turning issue, or does he still maintain it's not a bug, but an intentional feature?

Link to comment
You mean to say "polygonal scripting' is just a load of pretentious bollocks?

 

I interpreted bigg's post as saying that Sikret's enemy AI is placed in the center of an imaginary polygon where the party members, their summons and other allies are visualized as vertices in an encompassing convex hull, and has to use a variation of Floyd–Warshall's algorithm to determine the shortest path from the AI to the most "dangerous threat." Mind you, these "dangerous threats" are first worked out using your everyday point-in-polygon algorithms. Most of this involves computational geometry - you should have no problems with such elementary stuff once you've graduated from the Academy of Tactics where monolithic modding reigns supreme. jacksono.gif

 

 

Hmmm....

 

but now that I think about it, your interpretation makes more sense.

Link to comment
did Sikret quietly fix the 'enemies don't respond to Player2-6 paladins but only to player1 and keldorn' turning issue, or does he still maintain it's not a bug, but an intentional feature?

Is that a rhetorical question? ;)

 

Spot the duplicated blocks:

IF
 Allegiance(Myself,ENEMY)
 !GlobalTimerNotExpired("Iaspell","LOCALS")
 !GlobalTimerNotExpired("Iaturntime","LOCALS")
 GlobalLT("Iaturning","LOCALS",2)
 See(Player1)
 LevelLT(Player1,37)
 Class(Player1,PALADIN_ALL)
 Range(Player1,12)
 !StateCheck(Player1,STATE_PANIC)
 !StateCheck(Player1,STATE_CONFUSED)
 !StateCheck(Player1,STATE_HELPLESS)
 !StateCheck(Player1,STATE_STUNNED)
 !StateCheck(Player1,STATE_CHARMED)
 !HasItemEquiped("hamm11",Player1)
 !HasItemEquiped("sw1h32",Player1)
 !HasItemEquiped("S!sw04",Player1)
 !HasItemEquiped("S!sw11",Player1)
 !HasItemEquiped("S!halb01",Player1)
THEN
 RESPONSE #100
   IncrementGlobal("Iaturning","LOCALS",1)
   SetGlobalTimer("Iaspell","LOCALS",6)
   SetGlobalTimer("Isturning","LOCALS",6)
   ApplySpellRES("SPINI66",Player1)
   Turn()
END

IF
 Allegiance(Myself,ENEMY)
 !GlobalTimerNotExpired("Iaspell","LOCALS")
 !GlobalTimerNotExpired("Iaturntime","LOCALS")
 GlobalLT("Iaturning","LOCALS",2)
 See("keldorn")
 !Dead("keldorn")
 LevelLT("keldorn",37)
 Class("keldorn",PALADIN_ALL)
 Range("keldorn",12)
 !StateCheck("keldorn",STATE_PANIC)
 !StateCheck("keldorn",STATE_CONFUSED)
 !StateCheck("keldorn",STATE_HELPLESS)
 !StateCheck("keldorn",STATE_STUNNED)
 !HasItemEquiped("hamm11","keldorn")
 !HasItemEquiped("sw1h32","keldorn")
 !HasItemEquiped("S!sw04","keldorn")
 !HasItemEquiped("S!sw11","keldorn")
 !HasItemEquiped("S!halb01","keldorn")
THEN
 RESPONSE #100
   IncrementGlobal("Iaturning","LOCALS",1)
   SetGlobalTimer("Iaspell","LOCALS",6)
   SetGlobalTimer("Isturning","LOCALS",6)
   ApplySpellRES("SPINI66","keldorn")
   Turn()
END

IF
 Allegiance(Myself,ENEMY)
 !GlobalTimerNotExpired("Iaspell","LOCALS")
 !GlobalTimerNotExpired("Iaturntime","LOCALS")
 GlobalLT("Iaturning","LOCALS",2)
 See(NearestEnemyOfType([PC.0.0.PALADIN_ALL]))
 LevelLT(LastSeenBy(Myself),37)
 Range(LastSeenBy(Myself),12)
 !StateCheck(LastSeenBy(Myself),STATE_PANIC)
 !StateCheck(LastSeenBy(Myself),STATE_CONFUSED)
 !StateCheck(LastSeenBy(Myself),STATE_HELPLESS)
 !StateCheck(LastSeenBy(Myself),STATE_STUNNED)
 !StateCheck(LastSeenBy(Myself),STATE_CHARMED)
 !HasItemEquiped("hamm11",LastSeenBy(Myself))
 !HasItemEquiped("sw1h32",LastSeenBy(Myself))
 !HasItemEquiped("S!sw04",LastSeenBy(Myself))
 !HasItemEquiped("S!sw11",LastSeenBy(Myself))
 !HasItemEquiped("S!halb01",LastSeenBy(Myself))
THEN
 RESPONSE #100
   IncrementGlobal("Iaturning","LOCALS",1)
   SetGlobalTimer("Iaspell","LOCALS",6)
   SetGlobalTimer("Isturning","LOCALS",6)
   ApplySpellRES("SPINI66",LastSeenBy(Myself))
   Turn()
END

IF
 Allegiance(Myself,ENEMY)
 !GlobalTimerNotExpired("Iaspell","LOCALS")
 !GlobalTimerNotExpired("Iaturntime","LOCALS")
 GlobalLT("Iaturning","LOCALS",2)
 See(SecondNearestEnemyOfType([PC.0.0.PALADIN_ALL]))
 LevelLT(LastSeenBy(Myself),37)
 Range(LastSeenBy(Myself),12)
 !StateCheck(LastSeenBy(Myself),STATE_PANIC)
 !StateCheck(LastSeenBy(Myself),STATE_CONFUSED)
 !StateCheck(LastSeenBy(Myself),STATE_HELPLESS)
 !StateCheck(LastSeenBy(Myself),STATE_STUNNED)
 !StateCheck(LastSeenBy(Myself),STATE_CHARMED)
 !HasItemEquiped("hamm11",LastSeenBy(Myself))
 !HasItemEquiped("sw1h32",LastSeenBy(Myself))
 !HasItemEquiped("S!sw04",LastSeenBy(Myself))
 !HasItemEquiped("S!sw11",LastSeenBy(Myself))
 !HasItemEquiped("S!halb01",LastSeenBy(Myself))
THEN
 RESPONSE #100
   IncrementGlobal("Iaturning","LOCALS",1)
   SetGlobalTimer("Iaspell","LOCALS",6)
   SetGlobalTimer("Isturning","LOCALS",6)
   ApplySpellRES("SPINI66",LastSeenBy(Myself))
   Turn()
END

IF
 Allegiance(Myself,ENEMY)
 !GlobalTimerNotExpired("Iaspell","LOCALS")
 !GlobalTimerNotExpired("Iaturntime","LOCALS")
 GlobalLT("Iaturning","LOCALS",2)
 See(NearestEnemyOfType([GOODCUTOFF.0.0.SKELETON_WARRIOR.0.SUMMONED]))
 Range(LastSeenBy(Myself),12)
THEN
 RESPONSE #100
   IncrementGlobal("Iaturning","LOCALS",1)
   SetGlobalTimer("Iaspell","LOCALS",6)
   SetGlobalTimer("Isturning","LOCALS",6)
   Turn()
END

IF
 Allegiance(Myself,ENEMY)
 !GlobalTimerNotExpired("Iaspell","LOCALS")
 !GlobalTimerNotExpired("Iaturntime","LOCALS")
 GlobalLT("Iaturning","LOCALS",2)
 See(NearestEnemyOfType([GOODCUTOFF.0.SKELETON.SKELETON.0.SUMMONED]))
 Range(LastSeenBy(Myself),12)
THEN
 RESPONSE #100
   IncrementGlobal("Iaturning","LOCALS",1)
   SetGlobalTimer("Iaspell","LOCALS",6)
   SetGlobalTimer("Isturning","LOCALS",6)
   Turn()
END

IF
 Allegiance(Myself,ENEMY)
 Global("Iaturning","LOCALS",2)
THEN
 RESPONSE #100
   SetGlobalTimer("Iaturntime","LOCALS",30)
   SetGlobal("Iaturning","LOCALS",0)
END

Link to comment

Ah, that's ma boy, Sikret the Stealthy! bears.gif

 

Vehemently insist it's not a bug, but quietly fix when no one's looking... laugh2.giflaugh2.gif

 

 

 

See(NearestEnemyOfType([PC.0.0.PALADIN_ALL]))

 

unless I misunderstood, doesn't "PC" include both player1 and keldorn (in addition to player2-6)? Why would you want to prioritize turning player1 and keldorn first? ;) What if the other paladin PCs are of a higher level (i.e more dangerous) than both?

Link to comment
A red dragon in IA has nothing whatsoever to do with the red dragon in the Monster Manual.

Funny thing. Firkraag in BG2 also has nothing to do with him. Well, I will just post stats of OLDEST Red Dragon considered by Monster Manual for AD&D.

 

Age: 12

AC: -11

Breath Weapon: 24d10+12

Wizard/Priest spells: 2 2 2 2 /2 1

Magic Resistance: 65%

XP Value: 24,000

 

And I'm not sure if Firkraag (even if he's old) deserves to be treated as the oldest dragon, because there are still dragons in ToB.

Link to comment

Temujin: I didn't even think too much that oddity (which is even sort-of exploitable: if CHARNAME is a Paladin and another Paladin is under Remove Fear, the latter will never be dispelled or turned). I was wondering what the duplication of the Skeleton Warrior block was for - did the Distinguished Developer forget to use SecondNearest rather than Nearest ;) ?

 

BTW @geth et al: a paladin wielding the Dragon Slayer sword (or the Runehammer +5, Dragon Lord +5, Judgment Day +5 , or Warlord's Blade +5) will never be dispelled & turned in IA. I don't know if that makes them passable in actual play.

Link to comment

Archived

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

×
×
  • Create New...