Hi Andgalf,
I’m not 100% sure of what you want to achieve. I won’t comment about the blind effect, others have covered it or MP campaign specific issues (I know nothing about).
I did something like that for the Al Andalus’ murder quest in Alexandria (module AA_Fustat)
During the conversation with the quest giver (cv_fu_nabil):
1/ We remove/despawn the party members : ga_roster_party_remove_all(1, 1)
2/ We generate a temporary companion Madjouline according to the player’s choice and spawn her from the relevant blueprint:
- She is an expert in hand to hand fighting [Monk].
- She sneaks in everywhere without being spotted [Shadow Thief of Amn].
- She prefers easily concealed light weapons and catching her enemy by surprise [Invisible Blade].
3/we add her to the party, a marker carried by the PC being set:
- aa_add_companion(“madjouline”, 6)
- ga_local_int(“Madjouline”, 1, $PC)
After some research, the PC and Madjouline find out that a NPC, Umm, is involved. Madjouline and the PC are ordered to spy on her. She can often be found at the hamman. Umm, tagged plot, carries the in hamman, mission in progress flag.
If the party enters the hamman while the mission is not in progress, full party, nothing specific happens, you can talk with the manager (Rachida), but can’t get to the baths.
If the mission is in progress the following script aa_fu_init_hamman is run. Basically, the PC is moved to a cell box (isolated), and control is given to Madjouline.
// init hammam, move PC, undress and move Madjouline, set her in stealthy mode, set Madjouline controlled.
void MoveTo(object oC, string sWP)
{
AssignCommand(oC, ClearAllActions());
AssignCommand(oC, ActionJumpToObject(GetWaypointByTag(sWP)));
}
void main()
{
object oPC = GetFirstPC();
object oMadjouline = GetObjectByTag("madjouline");
object oUmm = GetObjectByTag("umm");
SetLocalInt(oUmm, "Hammam", 1);
SetOwnersControlledCompanion(GetFirstPC(FALSE), oMadjouline);
MoveTo(oPC, "WP_PC_hammam");
object oSuit = GetItemInSlot(INVENTORY_SLOT_CHEST, oMadjouline); AssignCommand(oMadjouline, ClearAllActions());
AssignCommand(oMadjouline, ActionUnequipItem(oSuit));
DelayCommand(0.1f, MoveTo(oMadjouline, "WP_madjouline_hammam"));
DelayCommand(0.15f,SetActionMode(oMadjouline, ACTION_MODE_STEALTH, TRUE));
}
Madjouline must remain unnoticed, find Umm and hear a clue (the 4th line of the poem). Yes, pervs, the poet and the poem are historically true
The script aa_fu_umm (Umm’s Heartbeat) is used for that purpose :
// recurrent Umm - anim + specific
void main()
{
object oUmm = OBJECT_SELF;
if (!GetLocalInt(oUmm, "Hammam")) return; // hammam mission not started or ended
object oMadjouline = GetObjectByTag("madjouline");
ClearAllActions(); // play animation
SetFacing(IntToFloat(GetLocalInt(oUmm,"Bearing")));
PlayCustomAnimation(oUmm, GetLocalString(oUmm, "Anim"), 1, 1.0);
if (!GetObjectSeen(oUmm, oMadjouline)) return; // Madjouline can't see Umm
if (!GetObjectHeard(oUmm, oMadjouline)) return; // Madjouline can't hear Umm
object oPC = GetFirstPC();
int c = GetLocalInt(oUmm, "Count");
string s;
if (GetGlobalInt("FR")) //speak string, (perhaps) hear clue
switch(c)
{
case 0 : s = "Avances ta main : gras et saillant,"; break;
case 1 : s = "Son sexe généreux emplira toute ta main."; break;
case 2 : s = "Ainsi parlait le poète Nabigha Dubyani."; break;
case 3 : s = "Mais j'y pense ... Le bois a-t-il bien été amnené à la déesse cobra?"; break;
case 4 : s = "Caresses plus bas et plus profond, imbécile!"; break;
}
else
switch(c)
{
case 0 : s = "Move your hand forward : oily and protudent,"; break;
case 1 : s = "His generous genitals your hand will fill."; break;
case 2 : s = "So talked poet Nabigha Dubyani."; break;
case 3 : s = "Well, I'm thinking ... Has the wood been brought to cobra Godess?"; break;
case 4 : s = "Fondle me lower and deeper, you idiot!"; break;
}
SpeakString(s);
if ( (c == 3) && (GetJournalEntry("q_murder", oPC) < 70) ) AddJournalQuestEntry("q_murder", 70, oPC); // Clue heard, update journal
c++; if (c > 4) c = 0;
SetLocalInt(oUmm, "Count", c);
}
If Madjouline is spotted and kills someone, you lose prestige but can complete the quest. Script aa_fu_killed_hamman (OnDeath of every civvie).
// kill a civvie in the hammam, mark mission failed
void main()
{
object oUmm = GetObjectByTag("umm");
SetLocalInt(oUmm, "Fail", 1);
}
As a safety measure, in case the player reloads while in the hamman, the following script aa_fu_enter_hamman (onEnterConnect) is run whenever the party enters the hamman. If the mission is in progress, the PC is warped to the cell box and Madjouline to her starting position. She is set in stealth mode and gets control again.
// safety : if reloading during the hammam mission, place actors (OnEnter hammam)
void MoveTo(object oC, string sWP)
{
AssignCommand(oC, ClearAllActions());
AssignCommand(oC, ActionJumpToObject(GetWaypointByTag(sWP)));
}
void main()
{
object oUmm = GetObjectByTag("umm");
if (GetLocalInt(oUmm, "Hammam") < 1) return; // not in mission
object oPC = GetFirstPC();
object oMadjouline = GetObjectByTag("madjouline");
SetOwnersControlledCompanion(GetFirstPC(FALSE), oMadjouline);
MoveTo(oPC, "WP_PC_hammam");
DelayCommand(0.1f, MoveTo(oMadjouline, "WP_madjouline_hammam"));
DelayCommand(0.15f,SetActionMode(oMadjouline, ACTION_MODE_STEALTH, TRUE));
}
@tsongo : about your companions as prisoners issue, you should remove/despawn them from the party, then spawn them in the cells. Whenever the PC gets to them, you add them to the party thru convo or whatever means.