December 22, 2024, 14:36:05

Author Topic: Freespace modding issues  (Read 11985 times)

Offline nips

  • Recruit
  • *
  • Posts: 15
  • Karma: 0
    • View Profile
    • http://
Freespace modding issues
« on: February 14, 2011, 00:17:23 »
So yesterday I posted a thread where I had an issue, which only was the result of my own stupidity. Now I face another one which I can't really get around with, every time I play this mission at the very same moment the game crashes with no error message (when playing it via the mission editor or the normal game) there's no error logged whatsoever. The game crashes when the SendActium event is called from the AgrippaArrives event and the Actium arrives. If you use ctrl 3 the actium warps in and everything is fine

Another issue is that from time to time I get an error saying (I don't remember exactly) but something about wrong docking points. I kinda figured it was the artemis bombers pulling that thing but the game still gives me those errors with other ships (I can't really figure out which ships cause that error)

Another issue is that the AI seems to not send out any fighters, neither from the ships or the dispensers, I tried using the WeaponMode function but they only send out one squad and not all of the fighters/bombers

Here's the mission script, you have to comment out the playmusic functions as well as dialogues, and change the DefLocation


MISSION 1
Name "Sirius Blockade"
DefLocation "Deneb-Sirius Node"

OBJECTIVES
   1
   2
END


RULES
   RULE    event sceneInit
         :action
       SelectEx(s.ship,
         MakeFullyKnown(S.this);
         FreezeReconState(S.this,1);
      );
                  
            PreCacheNPC(#NPC_commando);
            PreCacheNPC(#NPC_Dispatcher);
            PreCacheNPC(#NPC_Francis);
            PreCacheNPC(#NPC_Amanda);

            SetRelation(#race_player, #race_ntf, 2);
            SetRelation(#race_ntf, #race_player, 2);
            M.Comm:=Disappear(GetSceneObj("Command"));

            M.Lys := GetSceneObj("GTCv Lysander");
            M.Act := Disappear(GetSceneObj("GTCv Actium"));
            M.Orf := GetSceneObj("GTC Orff");
            
            M.Nau := Disappear(GetSceneObj("GVC Naunet"));

            M.Cor := Disappear(GetSceneObj("NTCv Coriolanus"));
            M.For := Disappear(GetSceneObj("NTC Fortune"));
            M.Obe := Disappear(GetSceneObj("NTC Oberon"));
            M.Agr := Disappear(GetSceneObj("NTCv Agrippa"));
            M.Virgo :=Disappear(GetSceneObj("Virgo Wing"));
            M.Leo :=Disappear(GetSceneObj("Leo Wing"));
            PlayMusic(#music_ambient02);
            M.Sirius:=GetSceneObj("Sirius Jump Node");
            GetMachine("MissionScript"):ChangeState(default, 0);
            
         :end
   END

   MACHINE "MissionScript"

      STATE default

         RULE   event In
            :action
               StartTimer(PlayDialog, 1, E.dialog := "_02begin");
               Timer(CoriolanusArrives,10,0);
            :end   
         END
         
         RULE event CoriolanusArrives
            :action
               PlayEfx(#EFX_ALARM1, 1, M.Cor:position, 0, 0);
               StartTimer(PlayDialog,3,E.dialog:="_02CorInbound");
               M.Cor:damage:=25;
               M.Cor :=Appear(M.Cor);
                       MEvent(MakeShipWarpIn, E.Ship :=M.Cor);
               M.Cor:tMoveTo(M.Lys,2,0);
               M.Cor:tFireTo(M.Lys,2);
               PlayMusic(#music_battle06);
               M.Virgo:=Appear(M.Virgo);
               M.Leo:=Appear(M.Leo);                        :end
         END

         
         RULE event FortuneArrives
            :action
               M.For:damage:=30;
               PlayEfx(#EFX_ALARM1, 1,M.For:position,0,0);
               StartTimer(PlayDialog,3,E.dialog:="_02FortuneInbound");
               PlayMusic(#music_battle04);
               M.For :=Appear(M.For);
               MEvent(MakeShipWarpIn, E.Ship :=M.For);
               M.For:tMoveto(M.Sirius,2,0);
               M.For:tFireto(M.Orf,2);
            :end
         END
   
         
         RULE event AgrippaArrives
            :action
               PlayEfx(#EFX_ALARM1,1,M.Agr:position,0,0);
               
               PlayMusic(#music_battle01);
               M.Agr:damage:=15;
               M.Agr:=Appear(M.Agr);
               MEvent(MakeShipWarpIn,E.Ship:=M.Agr);
               M.Agr:tMoveto(M.Sirius,2,0);
               M.Agr:tFireto(M.Lys,2);
               StartTimer(PlayDialog,1,E.dialog:="_02Agrippa");
               StartTimer(PlayDialog,3,E.dialog:="_02NoWorry");
               Timer(SendActium,10,0);
            :end
         END      
         
         RULE event Oberon
            :action
               M.Obe:damage:=25;
               M.Obe:=Appear(M.Obe);
               MEvent(MakeShipWarpIn,E.Ship:=M.Obe);
               M.Obe:tMoveto(M.Sirius,2,0);
               M.Obe:tFireto(M.Lys,2);   
            :end
         END   

         RULE event SendActium
            :action   
               
               M.Act:damage:=13;
               M.Act:=Appear(M.Act);
               //PutShipRel(M.Act,M.Lys,150,0,0,0);
               MEvent(MakeShipWarpIn,E.Ship:=M.Act);
               StartTimer(PlayDialog,2,E.dialog:="_02ActiumArrives");
            :end
         END   

         //When the Corelsdl is down
         RULE event FatalDamaged
            condition E.Ship=M.Cor
            :action
               StartTimer(PlayDialog,2,E.dialog:="_02CorDead");
               Timer(FortuneArrives,10,0);
            :end
         END

         //When the Fortune is down
         RULE event FatalDamaged
            condition E.Ship=M.For
            :action
               PlayMusic(#music_ambient02);
               StartTimer(PlayDialog,1,E.dialog:="_02ForDead");
               StartTimer(PlayDialog,2,E.dialog:="_02NotSo");
               //Timer(VirgoWingDispatched,15,0);
               Timer(AgrippaArrives,45,0);
            :end
         END

         //Orff is down
         RULE event FatalDamaged
            condition E.Ship=M.Orf
            :action
               StartTimer(PlayDialog,1,E.dialog:="_02OrfDead");
               
            :end
         END

         RULE event Cheat2
         :action
            Terminate(M.For);
         :end
         END

         RULE event Cheat1
         :action
            Terminate(M.Cor);
         :end
         END

         RULE event Cheat3
         :action
            LocalEvent(SendActium);
         :end
         END
            
      END
   END
   

   #include "includes\_include_me.inc"
         
                        
END


ENTITIES

   SHIP
      Name "GTC Orff"
      Race #race_Player
      ShipType #styp_gtc_fenris
      Position -3241.98 1878.35 -9084.02
      Orientation -19.5716 4.98181 -23.6752
      Devices #weap_gtf_myrmidon ;

      NPC
         Name "Cmdr. Donemberg"

         ID 31
         Rank 4
         Medals ;
         CrewLevel 3
         Skill 1 2
         Skill 2 2
         Skill 3 3
         XP 0
      END
   END

   SHIP
      Name "GTCv Actium"
      Race #race_Player
      ShipType #styp_gtcv_deimos
      Position -1827.82 1701.6 -6500.52
      Orientation 147.555 3.69988 25.6712
      Devices #weap_gtf_myrmidon #weap_gtf_hercules_mk2 #weap_gtb_medusa ;

      NPC
         Name "Cmdr. Donaghy"

         ID 3
         Medals ;
         CrewLevel 3
         Skill 1 2
         Skill 2 2
         Skill 3 3
         XP 0
      END
   END

   SHIP
      Name "GTCv Lysander"
      Race #race_Player
      ShipType #styp_gtcv_deimos
      Position -2398.7 1596.61 -9527.93
      Orientation 12.7495 -9.86259 9.71468
      Devices #weap_gtf_myrmidon #weap_gtf_hercules_mk2 #weap_gtb_medusa ;

      NPC
         Name "Cmdr. Thombaugh"

         ID 13
         Medals ;
         CrewLevel 3
         Skill 1 2
         Skill 2 2
         Skill 3 3
         XP 0
      END
   END

   SHIP
      Name "GVC Naunet"
      Race #race_Player
      ShipType #styp_gvc_aten
      Position -900.465 2615.06 -3507.13
      Orientation 113.72 24.3554 82.9499
      Devices #weap_gvf_horus ;
   END

   SHIP
      Name "Command"
      Race #race_GTA
      ShipType #styp_gtc_leviathan
      Position -991.465 1451.01 2262.36
      Orientation 0 0 0

      NPC

         ID 26
         Medals ;
         CrewLevel 3
         Skill 1 2
         Skill 2 2
         Skill 3 3
         XP 0
      END
   END

   SHIP
      Name "NTC Oberon"
      Race #race_NTF
      ShipType #styp_gtc_fenris
      Position -7670.13 3169.83 -5797.34
      Orientation -143.76 -12.6765 17.3805
   END

   SHIP
      Name "NTC Fortune"
      Race #race_NTF
      ShipType #styp_gtc_aeolus
      Position -4139.44 1339.59 -3681.43
      Orientation 171.906 -34.4308 19.2274
   END

   SHIP
      Name "NTCv Agrippa"
      Race #race_NTF
      ShipType #styp_gtcv_deimos
      Position -8324.72 3219.81 -3515.17
      Orientation -143.76 -12.6765 17.3805
      Devices #weap_gtf_hercules #weap_gtf_myrmidon #weap_gtf_hercules_mk2 #weap_gtb_zeus #weap_gtb_zeus ;
   END

   SHIP
      Name "NTCv Coriolanus"
      Race #race_NTF
      ShipType #styp_gtcv_deimos
      Position -3035.56 -277.26 -2650.77
      Orientation 176.361 22.5792 3.99487
   END

   SHIP
      Name "Leo Wing"
      Race #race_NTF
      Class #cls_fighter_dispenser
      Position -3301.92 1939.09 -4577.66
      Orientation 0 0 0
      Devices #weap_gtf_hercules #weap_gtf_hercules #weap_gtf_hercules_mk2 ;
   END

   SHIP
      Name "Virgo Wing"
      Race #race_NTF
      Class #cls_fighter_dispenser
      Position -3301.92 1939.09 -4577.66
      Orientation 0 0 0
      Devices #weap_gtb_zeus #weap_gtb_medusa ;
   END

   SHIP
      Name "Sirius Jump Node"
      Class #cls_subspacenode
      Behaviour 5
      Position -2932.5 1745.32 -10553.8
      Orientation 0 0 0
   END

END

« Last Edit: February 14, 2011, 00:22:54 by nips »

Offline Arparso

  • Administrator
  • Lieutenant
  • *****
  • Posts: 558
  • Karma: 14
  • I can see you...
    • View Profile
    • http://arparso.de/nexus
Re: Freespace modding issues
« Reply #1 on: February 14, 2011, 01:44:02 »
The game crashes when the SendActium event is called from the AgrippaArrives event and the Actium arrives.
To be honest: I have no idea. The error seems to be triggered somewhere in the "WarpIn" machine in "_include_me.inc", but I wasn't able to find anything problematic there. I added Debug() commands everywhere to get to pinpoint the exact moment of the crash, but the WarpIn-related events all seem to work as expected and finish properly... the crash doesn't seem to happen directly in any of these events, but yet it only crashes, if you trigger the warpin sequence. Don't using the WarpIn for the Actium works just fine without any crash.

I'll need to investigate this further, but right now I don't have a clue why the game crashes.

Another issue is that from time to time I get an error saying (I don't remember exactly) but something about wrong docking points.
Yeah, that's normal. This error only happens in the editor, because the GetDockPoint() function fails for some odd reason, if you're playing the mission in the editor. This function is being called to get the correct location for the subspace warp effect when a fighter is "docking" (=> warping out).

Just ignore the error - it'll only happen once in a running mission (because the script recognizes the failed function call and uses a different method next time). Alternatively you can set in_editor := 1; in your mission's SceneInit event to avoid the crash. Just remember to remove that line again before releasing the mission to the public.

Another issue is that the AI seems to not send out any fighters, neither from the ships or the dispensers, I tried using the WeaponMode function but they only send out one squad and not all of the fighters/bombers
WeaponMode() only DOES send out a single squad. You'll need to call WeaponMode() for each squad. I did that in the Patrol Duty mission, for example:

Code: [Select]
SelectEx(s.device & InSet(s.this, 22) & s.owner:race = #race_shivan,
WeaponMode(s.this, #SQUAD_PATROL, 0);
);

To break it down:
SelectEx - selects a number of objects based on the given criteria and executes the given code on each one
s.device - limits the selected objects to devices (squads ARE technically devices, e.g. #weap_gtf_hercules)
InSet(s.this, 22) - limits the selected objects to fighters (bombers are in set 21)
s.owner:race = #race_shivan - limites the selected objects to those being stationed on a Shivan ship

This'll select all Shivan fighter squads currently in the scene and order each one to fly a patrol by using WeaponMode(s.this, #SQUAD_PATROL, 0)

And that's it.

Offline nips

  • Recruit
  • *
  • Posts: 15
  • Karma: 0
    • View Profile
    • http://
Re: Freespace modding issues
« Reply #2 on: February 14, 2011, 04:16:31 »
The game crashes when the SendActium event is called from the AgrippaArrives event and the Actium arrives.
To be honest: I have no idea. The error seems to be triggered somewhere in the "WarpIn" machine in "_include_me.inc", but I wasn't able to find anything problematic there. I added Debug() commands everywhere to get to pinpoint the exact moment of the crash, but the WarpIn-related events all seem to work as expected and finish properly... the crash doesn't seem to happen directly in any of these events, but yet it only crashes, if you trigger the warpin sequence. Don't using the WarpIn for the Actium works just fine without any crash.
I'll need to investigate this further, but right now I don't have a clue why the game crashes.
Isn't there a way around this? Like timing or some other thing? Cause it's really specific :P

Another issue is that from time to time I get an error saying (I don't remember exactly) but something about wrong docking points.
Yeah, that's normal. This error only happens in the editor, because the GetDockPoint() function fails for some odd reason, if you're playing the mission in the editor. This function is being called to get the correct location for the subspace warp effect when a fighter is "docking" (=> warping out).

Just ignore the error - it'll only happen once in a running mission (because the script recognizes the failed function call and uses a different method next time). Alternatively you can set in_editor := 1; in your mission's SceneInit event to avoid the crash. Just remember to remove that line again before releasing the mission to the public.
So let me get this straight, if I play the game normally I wont get that error, right? if so then all is good
Another issue is that the AI seems to not send out any fighters, neither from the ships or the dispensers, I tried using the WeaponMode function but they only send out one squad and not all of the fighters/bombers
WeaponMode() only DOES send out a single squad. You'll need to call WeaponMode() for each squad. I did that in the Patrol Duty mission, for example:

Code: [Select]
SelectEx(s.device & InSet(s.this, 22) & s.owner:race = #race_shivan,
WeaponMode(s.this, #SQUAD_PATROL, 0);
);

To break it down:
SelectEx - selects a number of objects based on the given criteria and executes the given code on each one
s.device - limits the selected objects to devices (squads ARE technically devices, e.g. #weap_gtf_hercules)
InSet(s.this, 22) - limits the selected objects to fighters (bombers are in set 21)
s.owner:race = #race_shivan - limites the selected objects to those being stationed on a Shivan ship

This'll select all Shivan fighter squads currently in the scene and order each one to fly a patrol by using WeaponMode(s.this, #SQUAD_PATROL, 0)

And that's it.
Well the thing is that the AI used to warp the fighters but stopped doing so... Weird :/

Anyways, thanks for the help! To be honest, this is my first scripted mission ever :P

Offline Arparso

  • Administrator
  • Lieutenant
  • *****
  • Posts: 558
  • Karma: 14
  • I can see you...
    • View Profile
    • http://arparso.de/nexus
Re: Freespace modding issues
« Reply #3 on: February 14, 2011, 04:30:51 »
Isn't there a way around this? Like timing or some other thing? Cause it's really specific :P
I don't know - I didn't yet find a solution other than not using the WarpIn effect for the ship and it didn't seem related to the timing as well... there was no difference between starting the WarpIn almost immediately or two minutes after the Agrippa arrived.

So let me get this straight, if I play the game normally I wont get that error, right? if so then all is good
Yes, it won't happen when playing the game normally outside the editor.

Offline nips

  • Recruit
  • *
  • Posts: 15
  • Karma: 0
    • View Profile
    • http://
Re: Freespace modding issues
« Reply #4 on: February 14, 2011, 23:14:39 »
I've found another error

***** SCRIPT ERROR
Bad function parameter passed.

File: universe\mod_missions\includes\_include_me.inc
Line: 50

Rule: event Tick

Expression: E.squad:target
Parameter 0: Not an object
   E.squad  ==>  0
*****


***** SCRIPT ERROR
Bad function parameter passed.

File: universe\mod_missions\includes\_include_me.inc
Line: 46

Rule: event Tick

Expression: S.owner:launcherWeapon:mode
Parameter 0: Not an object
   S.owner:launcherWeapon  ==>  0
*****

This happens when fighters/bombers get orphaned (like their carriers die, in this case the coriolanus) and after a while, when the Fortune arrives the game crashes with that error. I was wondering if I should use the fighter dispensers instead of carriers.


Also is there a way to make the AI kind of override its survival instinct? Like if a damaged cruiser warps in, I want it to get to the node no matter what, instead of running away like a wuss.

Offline Arparso

  • Administrator
  • Lieutenant
  • *****
  • Posts: 558
  • Karma: 14
  • I can see you...
    • View Profile
    • http://arparso.de/nexus
Re: Freespace modding issues
« Reply #5 on: February 15, 2011, 00:01:50 »
I've found another error

Thanks for reporting. Try to replace the first "Tick" rule in the "_include_me.inc" with this one:
(didn't test it much, but should at least fix the crash)

Code: [Select]
            // periodically check, if AA weapons need to be activated again
            RULE event Tick
            :action
                // select all fighter-carried anti-fighter weapons
                SelectEx(s.weapon & Purpose(s.this, 5) & InSet(s.this, 37) & s.owner:boat,

                    // check, if we're shooting at a valid target in range right now
                    If(!IsValid(s.target) | Distance(s.owner, s.target) > #FCAA_MAXDISTANCE,           
                        // disable weapon (may be re-enabled again, see below)
                        s.this:active := 0;
                   
// the squad the fighter belongs to
                        E.squad := s.owner:launcherWeapon;

// squad might be 0, because the carrier left the scene and the
// launcherWeapon doesn't exist anymore
If(E.squad != 0,
// the current attack mode of the squadron (attack, guard, etc.)
E.weaponMode := E.squad:mode;
// the targetted squad of this fighter's squad
E.squadTarget := E.squad:target;

// handle all relevant cases for the attack mode of the squadron
ChooseFirst(
// squad guards something and fighter tries to intercept an enemy boat
E.weaponMode = 3 & IsValid(s.this:owner:target) & s.this:owner:target:boat & GetRelation(s.this:owner:race, s.this:owner:target:race) = #UREL_ENEMY,
// Debug("Guarding", E.squadTarget, ",current target", s.this:owner:target);
If(Distance(s.owner, s.this:owner:target) <= #FCAA_MAXDISTANCE,
s.this:active := 1;
s.this:target := s.this:owner:target;
);
,
// squad patrols somewhere and fighter tries to intercept an enemy boat
E.weaponMode = 4 & IsValid(s.this:owner:target) & s.this:owner:target:boat & GetRelation(s.this:owner:race, s.this:owner:target:race) = #UREL_ENEMY,
If(Distance(s.owner, s.this:owner:target) <= #FCAA_MAXDISTANCE,
s.this:active := 1;
s.this:target := s.this:owner:target;
);
,
// squad attacks another squad (targets a "weapon")
E.weaponMode = 5 & E.squad:target:weapon & IsValid(s.this:owner:target) & s.this:owner:target:boat & GetRelation(s.this:owner:race, s.this:owner:target:race) = #UREL_ENEMY,

// // disable device, if target is out of range
// If(IsValid(s.target) & Distance(s.owner, s.target) > #FCAA_MAXDISTANCE,
// s.this:active := 0;
// );
If(Distance(s.owner, s.this:owner:target) <= #FCAA_MAXDISTANCE,
s.this:active := 1;
s.this:target := s.this:owner:target;
);

// device isn't active (has been disabled before?)
// If(s.this:active = 0,
// E.aaWeapon := s.this;

// // loop through all fighters of the targetted squadron
// SelectEx(s.boat & s.launcherWeapon = E.squadTarget,
// // if an enemy fighter has entered firing range,
// // activate the device again and assign a target
// If(Distance(E.aaWeapon:owner, s.this) <= #FCAA_MAXDISTANCE,
// E.aaWeapon:active := 1;
// E.aaWeapon:target := s.this;
// );
// );
// );
);
);
                    );
                );
            :end
            END



Also is there a way to make the AI kind of override its survival instinct? Like if a damaged cruiser warps in, I want it to get to the node no matter what, instead of running away like a wuss.
Sure, just give it a move order and a high enough intensity to override its survival instinct:

Code: [Select]
ship:tMoveTo(x, y, z, stealth);
ship:tMoveToIntensity(intensity);

(intensity > 100 should be more than enough)

Offline nips

  • Recruit
  • *
  • Posts: 15
  • Karma: 0
    • View Profile
    • http://
Re: Freespace modding issues
« Reply #6 on: February 15, 2011, 18:55:05 »
It works! Thank you so much!


I have another question... How does PutShipRel works? I tried calling it like this

M.Agr:=Appear(M.Agr);
PutShipRel(M.Agr,M.Lys,1000,250,0,0);
MEvent(MakeShipWarpIn,M.Agr);


The only thing that putshiprel changes is the ship's orientation :/

Offline nips

  • Recruit
  • *
  • Posts: 15
  • Karma: 0
    • View Profile
    • http://
Re: Freespace modding issues
« Reply #7 on: February 25, 2011, 00:18:21 »
sad bump

Offline Mularac

  • Lieutenant
  • ***
  • Posts: 531
  • Karma: 11
    • View Profile
Re: Freespace modding issues
« Reply #8 on: February 25, 2011, 19:00:16 »
Damn... I totally missed that one.

In my previous tests using the PutShipRel command I could only make it to work properly if both ships, the one you'd be moving and the one you'd be moving in relation to, have the same position.

So, your code should be like this:

M.Agr:=Appear(M.Agr);
PutShip(M.agr,M.lyz:positionX, M.lyz:positiony, M.lyz:positionZ, m.agr:heading, m.agr:pitch, m.agr:bank);
PutShipRel(M.Agr,M.Lys,1000,250,0,0);
MEvent(MakeShipWarpIn,M.Agr);

That should do it, I think.
« Last Edit: February 25, 2011, 19:02:54 by Mularac »