phordicus Posted November 11, 2010 Share Posted November 11, 2010 can you disable Shouts if the creature is affected by Silence? also, in the same vein, can you add a slight delay between the AI seeing [PC] or being attacked before giving the Shout? this would allow for backstabs that one-shot an enemy without their gurgling, dying breath raising the same alarm as if they were engaged in a normal combat. Link to comment
Ardanis Posted November 11, 2010 Share Posted November 11, 2010 I absolutely support both ideas. Link to comment
Guest! Posted November 11, 2010 Share Posted November 11, 2010 I like the idea. Also, what about adding a floating text on creatures who call for help? Eg, a soldier might cry "Men! To me! We're under attack!", etc. Link to comment
Jarno Mikkola Posted November 11, 2010 Share Posted November 11, 2010 I like the idea. Also, what about adding a floating text on creatures who call for help? Eg, a soldier might cry "Men! To me! We're under attack!", etc. That's a little excessive, as every one of the soldiers would have that at every AI pass(which is at least once in a second). Link to comment
Ardanis Posted November 11, 2010 Share Posted November 11, 2010 It's all perfectly scriptable. Take a look at Big Picture, the prime example of how floating shouts must be done. Reminds me... I really loved how BP's enemies talked to each other. David, if by any chance you decide to do it for SCS then you'll have my eternal graditute Link to comment
Guest! Posted November 11, 2010 Share Posted November 11, 2010 The Shadowstalkers in The Ritual also did something like this. Link to comment
cmorgan Posted November 11, 2010 Share Posted November 11, 2010 Wow - interesting idea - serves me right for not fully exploring AI folks for ideas. Just the regular BPSHOUT.baf IF OR(3) HitBy([GOODCUTOFF],CRUSHING) AttackedBy([GOODCUTOFF],DEFAULT) Die() Allegiance(Myself,NEUTRAL) THEN RESPONSE #100 Shout(79) Enemy() END IF OR(2) Heard([NEUTRAL],79) Heard([EVILCUTOFF],79) !Allegiance(Myself,ENEMY) !Allegiance(Myself,GOODCUTOFF) THEN RESPONSE #100 Shout(79) Enemy() END IF !Allegiance(Myself,ENEMY) THEN RESPONSE #100 END IF OR(2) General(Myself,HUMANOID) General(Myself,GIANTHUMANOID) HPPercentLT(Myself,40) HPGT(Myself,0) Global("whined","LOCALS",0) See(NearestMyGroupOfType) Allegiance(Myself,ENEMY) HPGT(LastSeenBy(Myself),20) THEN RESPONSE #50 SetGlobal("whined","LOCALS",1) DisplayStringHead(Myself,46151) // ~help!~ Shout(123) RESPONSE #50 SetGlobal("whined","LOCALS",1) DisplayStringHead(Myself,49763) // ~I require assistance~ Shout(123) RESPONSE #50 SetGlobal("whined","LOCALS",1) DisplayStringHead(Myself,49764) // ~Defend me!~ Shout(123) RESPONSE #50 SetGlobal("whined","LOCALS",1) DisplayStringHead(Myself,49765) // ~Slay my attacker!~ Shout(123) END IF HPPercentLT(Myself,50) OR(5) AttackedBy([PC],DEFAULT) AttackedBy([FAMILIAR],DEFAULT) AttackedBy([ALLY],DEFAULT) AttackedBy([CONTROLLED],DEFAULT) AttackedBy([CHARMED],DEFAULT) Allegiance(Myself,ENEMY) ActionListEmpty() THEN RESPONSE #100 Shout(124) END IF AttackedBy([ANYONE],DEFAULT) DamageTakenGT(5) Global("Whined","LOCALS",0) THEN RESPONSE #100 SetGlobal("Whined","LOCALS",1) Shout(124) END IF BreakingPoint() Global("Panic","LOCALS",0) THEN RESPONSE #50 SetGlobal("Panic","LOCALS",1) DisplayStringHead(Myself,49766) // ~I can't take this~ RESPONSE #50 SetGlobal("Panic","LOCALS",1) DisplayStringHead(Myself,49767) // ~No more~ RESPONSE #50 SetGlobal("Panic","LOCALS",1) DisplayStringHead(Myself,49768) // ~Mercy!~ END IF Heard([EVILCUTOFF],69) !HaveAnySpells() Range(LastHeardBy(Myself),30) HPPercentGT(Myself,50) !GlobalTimerNotExpired("BPSH","LOCALS") THEN RESPONSE #60 DisplayStringHead(Myself,25337) // ~Don't worry...I'll be here to protect you.~ MoveToObject(LastHeardBy(Myself)) ProtectObject(LastHeardBy(Myself),12) SetGlobalTimer("BPSH","LOCALS",THREE_ROUNDS) RESPONSE #80 DisplayStringHead(Myself,25337) // ~Don't worry...I'll be here to protect you.~ ProtectObject(LastHeardBy(Myself),40) SetGlobalTimer("BPSH","LOCALS",THREE_ROUNDS) RESPONSE #40 SetGlobalTimer("BPSH","LOCALS",TWO_ROUNDS) END IF Heard([EVILCUTOFF],124) Range(LastHeardBy(Myself),20) HPGT(LastHeardBy(Myself),0) !HaveAnySpells() !GlobalTimerNotExpired("BPH","LOCALS") Global("MeleeMan","LOCALS",1) THEN RESPONSE #20 SetGlobalTimer("BPH","LOCALS",FOUR_ROUNDS) ProtectObject(LastHeardBy(Myself),20) RESPONSE #40 SetGlobalTimer("BPH","LOCALS",THREE_ROUNDS) MoveToObject(LastAttackerOf(LastHeardBy(Myself))) Attack(LastAttackerOf(LastHeardBy(Myself))) RESPONSE #40 SetGlobalTimer("BPH","LOCALS",FOUR_ROUNDS) MoveToObject(LastHitter(LastHeardBy(Myself))) AttackOneRound(LastHitter(LastHeardBy(Myself))) AttackOneRound(LastHitter(LastHeardBy(Myself))) RESPONSE #60 MoveToObject(LastHeardBy(Myself)) SetGlobalTimer("BPH","LOCALS",FOUR_ROUNDS) ProtectObject(LastHeardBy(Myself),10) RESPONSE #20 SetGlobalTimer("BPH","LOCALS",TWO_ROUNDS) END IF Heard([EVILCUTOFF],123) !GlobalTimerNotExpired("BP_Cure","LOCALS") HPPercentLT(LastHeardBy(Myself),60) !Died(LastHeardBy(Myself)) !HasItem("POTN52",LastHeardBy(Myself)) // ~Potion of Extra Healing~ !HasItem("POTN55",LastHeardBy(Myself)) // ~Potion of Superior Healing~ HasItem("POTN52",Myself) // ~Potion of Extra Healing~ DamageTakenLT(27) CheckStatGT(LastHeardBy(Myself),600,XPVALUE) THEN RESPONSE #100 SetGlobalTimer("BP_Cure","LOCALS",ONE_ROUND) DisplayStringHead(Myself,72809) // ~Here! Catch!~ GiveItem("POTN52",LastHeardBy(Myself)) // ~Potion of Extra Healing~ ActionOverride(LastHeardBy(Myself),SetGlobal("Whined","LOCALS",0)) END IF Heard([EVILCUTOFF],123) !GlobalTimerNotExpired("BP_Cure","LOCALS") HPPercentLT(LastHeardBy(Myself),50) !Died(LastHeardBy(Myself)) !HasItem("POTN52",LastHeardBy(Myself)) // ~Potion of Extra Healing~ !HasItem("POTN55",LastHeardBy(Myself)) // ~Potion of Superior Healing~ HasItem("POTN55",Myself) // ~Potion of Superior Healing~ DamageTakenLT(40) CheckStatGT(LastHeardBy(Myself),1200,XPVALUE) THEN RESPONSE #100 SetGlobalTimer("BP_Cure","LOCALS",ONE_ROUND) DisplayStringHead(Myself,72809) // ~Here! Catch!~ GiveItem("POTN55",LastHeardBy(Myself)) // ~Potion of Superior Healing~ ActionOverride(LastHeardBy(Myself),SetGlobal("Whined","LOCALS",0)) END IF Heard([EVILCUTOFF],123) HPGT(LastHeardBy(Myself),0) !HaveAnySpells() !HasItem("POTN55",Myself) // ~Potion of Superior Healing~ !HasItem("POTN52",Myself) // ~Potion of Extra Healing~ !GlobalTimerNotExpired("BP_Helper","LOCALS") Global("MeleeMan","LOCALS",1) THEN RESPONSE #80 ProtectObject(LastHeardBy(Myself),15) SetGlobalTimer("BP_Helper","LOCALS",THREE_ROUNDS) RESPONSE #20 SetGlobalTimer("BP_Helper","LOCALS",TWO_ROUNDS) END IF Heard([EVILCUTOFF],123) HPGT(LastHeardBy(Myself),0) !HaveAnySpells() !HasItem("POTN55",Myself) // ~Potion of Superior Healing~ !HasItem("POTN52",Myself) // ~Potion of Extra Healing~ !GlobalTimerNotExpired("BP_Helper","LOCALS") !Global("MeleeMan","LOCALS",1) THEN RESPONSE #80 Attack(LastAttackerOf(LastHeardBy(Myself))) SetGlobalTimer("BP_Helper","LOCALS",THREE_ROUNDS) RESPONSE #20 SetGlobalTimer("BP_Helper","LOCALS",TWO_ROUNDS) END IF HitBy(Myself,CRUSHING) THEN RESPONSE #100 RunAwayFrom(NearestEnemyOf(Myself),15) END There are some great ideas in there, that is for sure. Link to comment
Salk Posted November 11, 2010 Share Posted November 11, 2010 I absolutely support both ideas. I also agree fully. Link to comment
DavidW Posted November 11, 2010 Share Posted November 11, 2010 Some of this is possible, but there are various issues. - getting people to delay their shout for a second (to allow backstabs) has the potential to mess with timings. I'll see what can be done (don't hold your breath) - the problem with DisplayStringHead calls for help is that the core Help scripts are used by a vast number of creatures. Either they'd all end up using the same string (or same short set of strings), or I'd have to provide help scripts separately for everything in the game, which is a fairly dramatic amount of work. Also, there is a lot of backstage calling-for-help, so the screen might get a bit crowded... Link to comment
phordicus Posted November 12, 2010 Author Share Posted November 12, 2010 Some of this is possible, but there are various issues. - getting people to delay their shout for a second (to allow backstabs) has the potential to mess with timings. I'll see what can be done (don't hold your breath) would this not work? IF AttackedBy([GOODCUTOFF],DEFAULT) OR(3) Allegiance(Myself,GOODBUTBLUE) Allegiance(Myself,NEUTRAL) Allegiance(Myself,0) Delay(15) THEN RESPONSE #100 Shout(151) Enemy() END - the problem with DisplayStringHead calls for help is that the core Help scripts are used by a vast number of creatures. Either they'd all end up using the same string (or same short set of strings), or I'd have to provide help scripts separately for everything in the game, which is a fairly dramatic amount of work. Also, there is a lot of backstage calling-for-help, so the screen might get a bit crowded... exactly. i don't know if it adds anything by turning this into dragon-age-everything's-a-cutscene b.s. on top of that reading the same lines over and over and over would get irritating after the shiny wears off. Link to comment
Ardanis Posted November 12, 2010 Share Posted November 12, 2010 exactly. i don't know if it adds anything by turning this into dragon-age-everything's-a-cutscene b.s. on top of that reading the same lines over and over and over would get irritating after the shiny wears off.I've played BP for about three months and it never felt repetitive. Link to comment
Recommended Posts
Archived
This topic is now archived and is closed to further replies.