• New Horizons on Maelstrom
    Maelstrom New Horizons


    Visit our website www.piratehorizons.com to quickly find download links for the newest versions of our New Horizons mods Beyond New Horizons and Maelstrom New Horizons!

WIP Improve Baldewyn Coffier & Arnaud/Sabine Matton Sidequests

She has NEGATIVE skills and abilities?
Should depend on her character init entry. Does she have quest char set?
I thought I slightly tweaked her skills a while back.

Would it be a good idea to allow hiding a "town girl" model?
How well do they work?
 
Her skills are as init file but rank is not, she does have ch.questchar = true; but also

ch.quest.officertype = OFFIC_TYPE_SHOPKEEPER;

which is good for the interface screen but might be causing problems?? Anyway not a major problem unless you REALLY want to use her as an officer rather than just let her hang about.
seadogs2_0002.jpg
 
Maybe try adding 6 points worth of skills to her? I'm guessing that one level is worth about two points of skill, and perhaps the levelling system is disregarding the 'ch.questchar = true' and assigning her a level based on her skills. In that case, 6 points might put her up 3 levels, i.e. from -2 to +1.
 
The way "questchar" works is that the SKILLS are kept, but the Character Level is calculated to match with the skills.
A Level 1 character normally has 10 skill points, all of them at "1".

Looks like the problem with Sabine is that she has only 6 points, which is LESS than a Level 1 character.
Therefore she gets also a calculated level lower than 1. Which is unintentional, of course.

Actually, I thought I already fixed this before to prevent characters' levels EVER going below 1.
Apparently that no longer works. Two solution:
1. Re-fixing that problem
2. Changing all her "0" skills to "1"

"0" (used to?) mean that the character cannot gain any XP in that skill, which gives Sabine quite limited use.

But re-fixing the problem definitely sounds like a good idea, because we've had pretty nasty quest problems related to negative levels (AND HP!) before.
So I'd really rather NOT have those problems return again.... :wp
 
PROGRAM\Characters\Leveling.c find:
Code:
int ResetSkillsandPerks(ref chref)
{
   //Reset the Character to level 1
   if(DEBUG_EXPERIENCE>1) trace("XP LOG: Character "+GetMySimpleName(chref)+" has been reset to 0"); //Show these always
   string skill;
   int skillrank = 0;
   for(int n = 0; n < 10; n++)
   {
     skill = GetSkillName(n);
     skillrank += (sti(chref.skill.(skill))-1);
     if(!CheckAttribute(chref,"questchar")) //Don't reset skills for questchars
     {
       chref.skill.(skill) = 1;
       chref.skill.(skill).bonus = 1.0;
     }
   }
   chref.perks.FreePoints = 1;
   chref.skill.freeskill = 0;
   if(!CheckAttribute(chref,"quest.NoRaise")) chref.officerprice = 0;
   chref.Experience = 0;
   ResetHP(chref);
   DeleteAttribute(chref,"perks");
   DeleteAttribute(chref,"ContribList");
   chref.rank = 1;
   return makeint(skillrank/ADD_SKILLPOINTS_PERLEVEL);
}
Replace with:
Code:
int ResetSkillsandPerks(ref chref)
{
   //Reset the Character to level 1
   if(DEBUG_EXPERIENCE>1) trace("XP LOG: Character "+GetMySimpleName(chref)+" has been reset to 0"); //Show these always
   string skill;
   int skillrank = 0;
   for(int n = 0; n < 10; n++)
   {
     skill = GetSkillName(n);
     skillrank += (sti(chref.skill.(skill))-1);
     if(!CheckAttribute(chref,"questchar")) //Don't reset skills for questchars
     {
       chref.skill.(skill) = 1;
       chref.skill.(skill).bonus = 1.0;
     }
   }
   chref.perks.FreePoints = 1;
   chref.skill.freeskill = 0;
   if(!CheckAttribute(chref,"quest.NoRaise")) chref.officerprice = 0;
   chref.Experience = 0;
   ResetHP(chref);
   DeleteAttribute(chref,"perks");
   DeleteAttribute(chref,"ContribList");
   chref.rank = 1;
   skillrank = makeint(skillrank/ADD_SKILLPOINTS_PERLEVEL);
   if (skillrank < 1) skillrank = 1; // PB: Fix to prevent negative character levels
   return skillrank;
}
Last THREE lines in the function are different.

This is what I get for her now:
upload_2016-3-16_19-21-6.png


No more negative level nor ability points.

Her HP is still weird (should be 40 for a level 1 character) and it seems I still get error logs about "divide by 0".
 
I did some quick tests on levelling her up manually as an NPC and that seems to behave itself reasonably now.

Also made a change to the officer interface to avoid the error logs.
Will be in the next update.

I can also confirm that "skills of zero" indeed do not increase, which makes Sabine not a particularly good officer.
So you might want to consider changing her character init entry. But at least she behaves herself now.
 
@Pieter Boelen thanks for the quick work on re-establishing a negative rank check :).

I had in the meantime also upped the zeros to 1 level in the init file, which also "solved" the problem by increasing the skill sum and thus the recalculated rank (as both you and @Grey Roger correctly noted). Not an issue if you just deliver her or ransom her but more so if you keep her.

I had neglected to add in a change to give her officer dialogue if you renege on ransom so that is added here. It's still rough and ready because there is no dialogue/quest entry etc (potentially WIP for after beta 4) to explain the change so you would have to stumble across the fact that she is now "removable" as a passenger and can be given a role but at least it means you can fire her to get rid of her - or use her as battle fodder, or nurture her
a good deal since she works for nothing having left the no salary increase attribute!
as your mood takes.
 

Attachments

  • matton2.7z
    10.5 KB · Views: 155
Build 14 -1 WIP -- 16 May

Save game compatibility 14.932

Playing as a Male player character

If you do not hand Sabine Matton to the lady in Puerto Rico -- but take her back to Arnaud in St Pierre & ransom her then:-

1 - If you ransom her in the Store - Sabine stays as a passenger - cannot be allocated to the shore party on the Passenger screen - occupation remains as Shop Merchant - has F2> Character screen ( so I assume she does not become an officer ).

2 - If you ransom her on the Beach & Keep Sabine - then Sabine stays on Passenger screen & can be allocated to Shore Party as an officer ( has the standard officer dialog ) -but on the F2>Character screen - her occupation remains Shop Merchant..

Saves attached are : ( apologies that they are from an old version - it is the only one I have installed at the moment )

1 - About to talk to Arnaud matton in Store & ransom Sabine

2 - About to talk to Arnaud matton on Beach & ransom Sabine

:drunk
 

Attachments

  • compile_SabineM_1.log
    66.4 KB · Views: 140
  • system_SabineM_1.log
    16.3 KB · Views: 149
  • POTC_Sabine_Officer.jpg
    POTC_Sabine_Officer.jpg
    153.6 KB · Views: 135
  • -=Player=- Martinique.7z
    653.9 KB · Views: 156
  • -=Player=- Martinique. Octopus Bay. May 10th, 1741.7z
    655.4 KB · Views: 168
Last edited:
I think sabine has the attribute set which locks there occupation so you can't change it. Also probably this is why you can't remove her as an officer.
But would need to look into it more ..
 
:ahoyPerchance a timely moment for me to be having a look-see how things progress. :keithI am busy with my summer activities for another couple of weeks but could then perhaps install the latest version and see what mess I apparently left Sabine in. However if someone wants to fix it in the meantime that's perfectly fine too since I would be back at the bottom of the learning curve anyway.
 
:ahoyPerchance a timely moment for me to be having a look-see how things progress. :keithI am busy with my summer activities for another couple of weeks but could then perhaps install the latest version and see what mess I apparently left Sabine in. However if someone wants to fix it in the meantime that's perfectly fine too since I would be back at the bottom of the learning curve anyway.
Ahoy there, @pedrwyth! Good to see you in these waters again. :cheers

Things have changed a bit around here the past two months or so and it is actually quite active again.
Exciting times! :woot
 
:ahoyPerchance a timely moment for me to be having a look-see how things progress. :keithI am busy with my summer activities for another couple of weeks but could then perhaps install the latest version and see what mess I apparently left Sabine in. However if someone wants to fix it in the meantime that's perfectly fine too since I would be back at the bottom of the learning curve anyway.
Good to see you again :aar
 
Just finished playing this through as a Female character ( instead of Male ) - it plays through exactly the same, except for small dialog changes to take account of the fact that I am Danielle.

All the additional dialog for Sabine Matton is not used. :(

I was wondering if in
Sabine Matton_dialog.c

the code marked should have 2 = instead of just the 1 =
Code:
case "First time":
       Dialog.defAni = "dialog_stay1";
       Dialog.defCam = "1";
       Dialog.defSnd = "dialogs\0\017";
       Dialog.defLinkAni = "dialog_1";
       Dialog.defLinkCam = "1";
       Dialog.defLinkSnd = "dialogs\woman\024";
       Dialog.ani = "dialog_stay2";
       Dialog.cam = "1";      

       if (npchar.quest.meeting == "0")
       {
         Dialog.snd = "voice\SAMA\SAMA001";
         Dialog.Text = DLG_TEXT[0] + GetMyFullName(NPChar) + DLG_TEXT[1] + npchar.nickname + DLG_TEXT[2];
         Link.l1 = pcharrepphrase(DLG_TEXT[3] + GetMyName(NPChar) + DLG_TEXT[4] + GetMyFullName(PChar) + DLG_TEXT[5], DLG_TEXT[6] + GetMyFullName(PChar) + DLG_TEXT[7] + GetMyName(Pchar) + DLG_TEXT[8]);
         Link.l1.go = "exit";
         link.l2 = pcharrepphrase(DLG_TEXT[9], DLG_TEXT[10]);
         link.l2.go = "first_time_01";
         npchar.quest.meeting = "1";
         NextDiag.TempNode = "First time";
         if (pchar.id == "Blaze")   npchar.quest.hire = "blaze_begin";       <<<-- should the same apply here ??
         else             npchar.quest.hire = "danielle_begin";    <<<-------  should this be 2 =  so it is the same as in case Second time ??
       }
       else
       {
         Dialog.snd = "voice\SAMA\SAMA002";
         Dialog.Text = DLG_TEXT[11] + GetMyName(Pchar) + DLG_TEXT[12];
         if (makeint(pchar.rank) > 3)
         {
           Dialog.snd = "voice\SAMA\SAMA003";
           Dialog.text = Dialog.text + DLG_TEXT[13];
         }
         Link.l1 = pcharrepphrase(DLG_TEXT[14], DLG_TEXT[15]);
         Link.l1.go = "exit";
         NextDiag.TempNode = "Second time";
       }
     break;

So that it agrees with this in Sabine Matton_dialog.c:

Code:
case "Second Time":
       dialog.text = DLG_TEXT[16];
       link.l1 = DLG_TEXT[17];
       link.l1.go = "exit";
       if (npchar.quest.hire == "blaze_on_ship")
       {
         link.l1 = DLG_TEXT[18];
         link.l1.go = "exit";
       }
       if (npchar.quest.hire == "captured_by_blaze")
       {
         link.l1 = DLG_TEXT[19];
         link.l1.go = "exit";
       }
       if (npchar.quest.love == "1")
       {
         link.l1 = DLG_TEXT[20];
         link.l1.go = "exit";
       }
       if (npchar.quest.hire == "danielle_begin")   <<<<------ to  agree with this !!
       {
         Dialog.snd = "voice\SAMA\SAMA004";
         dialog.text = DLG_TEXT[21] + GetMyName(Pchar) + DLG_TEXT[22];
         link.l1 = pcharrepphrase(DLG_TEXT[23], DLG_TEXT[24] + GetMyFullName(PChar) + DLG_TEXT[25]);
         link.l1.go = "danielle_1";
       }
       if (npchar.quest.hire == "request")
       {
         Dialog.snd = "voice\SAMA\SAMA005";
         dialog.text = DLG_TEXT[26];
         link.l1 = pcharrepphrase(DLG_TEXT[27], DLG_TEXT[28] + GetMyFullName(PChar) + DLG_TEXT[29]);
         link.l1.go = "danielle_1";
       }
     break;

:shrug
 
no it looks to be alright ..
A attribute is set for the npchar which later is checked to see which one is set.

What is the problem exactly?
 
What is the problem exactly?

For some reason Sabine Matton does not use a lot of the dialog that she has, - which explains her back story - I just thought it would be nice if it could be reactivated.

So I was checking to see if there was something simple I could fix. :read

These cases in Sabine Matton_dialog.c are the ones that are not used

Code:
     case "danielle_1":
       Dialog.snd = "voice\SAMA\SAMA006";
       dialog.text = DLG_TEXT[30] + GetMyAddressForm(NPChar, PChar, ADDR_CIVIL, false, false) + DLG_TEXT[31];
       link.l1 = pcharrepphrase(DLG_TEXT[32], DLG_TEXT[33]);
       link.l1.go = "danielle_2";
     break;

     case "danielle_2":
       Dialog.snd = "voice\SAMA\SAMA007";
       dialog.text = DLG_TEXT[34];
       link.l1 = pcharrepphrase(DLG_TEXT[35], DLG_TEXT[36]);
       link.l1.go = "danielle_3";
       link.l2 = pcharrepphrase(DLG_TEXT[37], DLG_TEXT[38]);
       link.l2.go = "exit";
     break;

     case "danielle_3":
       Dialog.snd = "voice\SAMA\SAMA008";
       dialog.text = DLG_TEXT[39];
       link.l1 = pcharrepphrase(DLG_TEXT[40], DLG_TEXT[41]);
       link.l1.go = "danielle_4";
       link.l2 = pcharrepphrase(DLG_TEXT[42], DLG_TEXT[43]);
       link.l2.go = "danielle_5";
     break;

     case "danielle_4":
       Dialog.snd = "voice\SAMA\SAMA009";
       dialog.text = DLG_TEXT[44];
       link.l1 = pcharrepphrase(DLG_TEXT[45], DLG_TEXT[46]);
       link.l1.go = "danielle_5";
     break;

     case "danielle_5":
       Dialog.snd = "voice\SAMA\SAMA010";
       dialog.text = DLG_TEXT[47];
       link.l1 = pcharrepphrase(DLG_TEXT[48], DLG_TEXT[49]);
       link.l1.go = "danielle_6";
       link.l2 = pcharrepphrase(DLG_TEXT[50], DLG_TEXT[51]);
       link.l2.go = "exit";
       npchar.quest.hire= "request";
     break;

     case "danielle_6":
       Dialog.snd = "voice\SAMA\SAMA011";
       dialog.text = DLG_TEXT[52];
       link.l1 = pcharrepphrase(DLG_TEXT[53], DLG_TEXT[54]);
       link.l1.go = "danielle_7";
       link.l2 = pcharrepphrase(DLG_TEXT[55], DLG_TEXT[56]);
       link.l2.go = pcharrepphrase("danielle_end_1", "danielle_end_2");
     break;

     case "danielle_7":
       Dialog.snd = "voice\SAMA\SAMA012";
       dialog.text = DLG_TEXT[57];
       link.l1 = pcharrepphrase(DLG_TEXT[58], DLG_TEXT[59]);
       link.l1.go = "danielle_8";
       link.l2 = pcharrepphrase(DLG_TEXT[60], DLG_TEXT[61]);
       link.l2.go = "danielle_end_1";
     break;

     case "danielle_8":
       Dialog.snd = "voice\SAMA\SAMA013";
       dialog.text = DLG_TEXT[62] + GetMyName(Pchar) + DLG_TEXT[63];
       link.l1 = pcharrepphrase(DLG_TEXT[64], DLG_TEXT[65]);
       link.l1.go = "exit";
       npchar.quest.hire = "danielle_on_ship";
       AddPassenger(pchar, npchar, 0);
       ChangeCharacterAddress(npchar, "none", "none");
     break;

     case "danielle_end_1":
       Dialog.snd = "voice\SAMA\SAMA014";
       dialog.text = DLG_TEXT[66];
       link.l1 = DLG_TEXT[67];
       link.l1.go = "exit";
       npchar.quest.hire = "done";
       if(AUTO_SKILL_SYSTEM)
       {
         AddPartyExpChar(pchar, "Leadership", 500);
         AddPartyExpChar(pchar, "Sneak", 5);
       }
       else { AddPartyExp(pchar, 500); }
     break;

     case "danielle_end_2":
       Dialog.snd = "voice\SAMA\SAMA015";
       dialog.text = DLG_TEXT[68] + GetMyAddressForm(NPChar, PChar, ADDR_CIVIL, false, false) + DLG_TEXT[69];
       link.l1 = DLG_TEXT[70];
       link.l1.go = "exit";
       npchar.quest.hire = "escape";
       npchar.location = "none";
       //именно так. »счезает при следующем входе в локацию.
     break;



:drunk
 
:ahoy

Blaze/Danielle - in the original game.

Could someone confirm the following:-

When the original game was being made, it was originally intended that the player could be either a male (Blaze) or a female ( Danielle) character.

When the game was finally released the female (Danielle) character option had been removed – though some of the code for it still remained in the game.

Therefore the game treats all characters as “Blaze” and any “Danielle” code does not work.

This would mean that in Sabine Matton_dialog.c in case "First time":


This code won’t work:

Code:
if (pchar.id == "Blaze")   npchar.quest.hire = "blaze_begin";
else         npchar.quest.hire = "danielle_begin";

This code - has been in the file since the original game.

OR

In Arnaud Matton_dialog.c

case "quests":

Code:
if (characters[GetCharacterIndex("Sabine Matton")].quest.hire == "blaze_begin" && makeint(pchar.reputation) > 40) // NK bugfix
{
         Link.l6 = DLG_TEXT[163];
         link.l6.go = "daughter";

Is it possible to activate the :- npchar.quest.hire = "danielle_begin"; that is in Sabine Matton_dialog.c from here?

Or do my comments about the female playable character still apply?

:drunk
 
Last edited:
Your interpretation is completely correct. All player characters in the game are "Blaze", even the female ones.
You can try to check the player gender instead of the player ID.
 
Your interpretation is completely correct. All player characters in the game are "Blaze", even the female ones.
You can try to check the player gender instead of the player ID.
so changing model would give you other dialog options ... interesting
 
Back
Top