Official Fulqrum Publishing forum

Official Fulqrum Publishing forum (http://forum.fulqrumpublishing.com/index.php)
-   FMB, Mission & Campaign builder Discussions (http://forum.fulqrumpublishing.com/forumdisplay.php?f=203)
-   -   Online War - FMB scripting (http://forum.fulqrumpublishing.com/showthread.php?t=21518)

Ataros 05-12-2011 08:23 AM

Great thread on searchlights and adding AA to trains and trucks

http://forum.1cpublishing.eu/showthr...t=22740&page=2

335th_GRAthos 05-13-2011 11:58 AM

Quote:

Originally Posted by Ataros (Post 282006)
Great thread on searchlights and adding AA to trains and trucks

http://forum.1cpublishing.eu/showthr...t=22740&page=2



WOW!

I start getting depressed that flying at 400kmh, jinking like mad, the last thing I will want to do is looking a the detail of the AAA shooting at me.... :-)

It looks as if the mission builders will have as much fun as the pilots with this sim...

Great job, we will go throgh hell finding out about the details but, great job!


Nice week end to all !

Groundhog 05-13-2011 04:46 PM

Ataros

thanks for all the scripting info.
I am trying your tmp script with three sub missions.
It gets as far as loading the first sub mission and then my plane explodes.
The text message is shown in cockpit then boom!
Please help.

Disregard..pilot error :)
GH

TheEnlightenedFlorist 05-14-2011 09:16 PM

Thanks for the thread Ataros. Very helpful.

Is there a reason you guys are using "ticks" to measure time. C# has a few different ways of keeping track of time. Here's an example using the Stopwatch class. Don't get me wrong, modulus is great but this stopwatch is probably more accurate and it's a heck of a lot more readable. :)

Code:

using System;
using maddox.game;
using maddox.game.world;
using System.Collections.Generic;
using System.Diagnostics;  //contains Stopwatch class

public class Mission : AMission
{
    int timesRun = 0;  //count how many times sub-mission has been run

    Stopwatch timer = new Stopwatch();  //timer. Counts... time...

    public override void OnTickGame()
    {
       
        //if sub-mission has never been run, run it
        if (timesRun == 0)
        {
            //start timer
            timer.Start();

            GamePlay.gpPostMissionLoad("missions/Multi/MyMissions/mission1.mis");
            timesRun++;

            // prints message on screen after mission load
            GamePlay.gpHUDLogCenter("Hello, world! Mission1.mis loaded!");
        }

        //if five or more minutes have elapsed since the timer was started, run sub-mission
        if (timer.Elapsed.Minutes >= 5)
        {
            GamePlay.gpPostMissionLoad("missions/Multi/MyMissions/mission1.mis");
            timesRun++;

            GamePlay.gpHUDLogCenter("Hello, world! Mission1.mis loaded!");

            //reset timer to zero and restart it
            timer.Restart();
        }
    }
}


ZaltysZ 05-14-2011 09:58 PM

Quote:

Originally Posted by TheEnlightenedFlorist (Post 283300)
Don't get me wrong, modulus is great but this stopwatch is probably more accurate and it's a heck of a lot more readable. :)

The problem with external timing is that you will get time according to your system and not to game. Simulation can slow down because of lag, and external timer won't take that into account, i.e. briefing can say that bombers start at 9:00, however you may see that start greatly off its planned time (according to game clock), if you use external timer.

If you want to get rid of counting ticks, you can use this:
Code:

        //Runs once, when mission is loaded
        public override void Init(maddox.game.ABattle battle, int missionNumber)
        {
                base.Init(battle,missionNumber);
                //Planned missions
                MissionLoader(30,10,"missions/Multi/Dogfight/bombers1.mis");  // 10s from main mission start and repeatedly every 30s
                MissionLoader(100,60,"missions/Multi/Dogfight/bombers2.mis"); // 60s from main mission start and repeatedly every 100s
        }
       
        public void MissionLoader(int period, int offset, string mission)
        {
                if (offset > 0)
                        Timeout(offset, () => {MissionLoader(period,0,mission);});
                else
                        {
                                GamePlay.gpPostMissionLoad(mission);       
                                Timeout(period, () => {MissionLoader(period,0,mission);});               
                        }
        }


TheEnlightenedFlorist 05-15-2011 11:19 PM

Oh, I'm sorry. I thought that you guys wanted to base the intervals that missions run on on real time not on game time.

TheEnlightenedFlorist 05-16-2011 07:09 AM

1 Attachment(s)
Okay. I think I've got a handle on how to create and manipulate "MissionMarkers" aka Front Markers in a script. I've attached a simple, commented example. Shoot down the bomber in front of you and the southwest airfield's front marker changes to blue.

Quote:

Originally Posted by Ataros (Post 279210)
Can someone program a small 3 airfields battle based on it? Say a middle airfield becomes red or blue based on which tanks remain alive after taking the airfield. Then spawn new groups of tanks in say 20 minutes for a new round.

I'm confident that if you gave me a mission with an appropriate trigger, I could move and change front markers, but I don't have much experience with the FMB. I've only created single player missions thus far. I don't know how to create an airfield where multiple players can choose an aircraft and spawn at, and I certainly don't know how to change who can spawn at an airfield in a script. Does the code you posted do this? I see mention of "BirthPlaces" in the script, but I don't see any "BirthPlaces" in the FMB.

Do you have a link to a tutorial on how to create multiplayer missions?

Ataros 05-16-2011 11:42 AM

1 Attachment(s)
Quote:

Originally Posted by TheEnlightenedFlorist (Post 283813)
Does the code you posted do this? I see mention of "BirthPlaces" in the script, but I don't see any "BirthPlaces" in the FMB.

Do you have a link to a tutorial on how to create multiplayer missions?

MP missions are different from SP only by this FMB object called "birthplace" (at least in Russian version) or spawnpoint in English I guess. You find it in Object Browser the same way as other objects like an airfield or a tank. In its property window you can select side it belongs to and list of aircraft available for players. In a mission consisting of many submissions you place birthplaces in the 1st 'main' mission. See my mission as example attached.

When new submission is loaded it can contain a new moved frontline and a new birthplace (e.g. red one) in the location where the blue one used to be. The problem is the old birthplace is not removed by loading a new submission and blue aircraft still can be created in the newly captured red airfield. That is why you need to destroy an old blue birthplace with a script I guess:
Code:

foreach (AiBirthPlace bp in GamePlay.gpBirthPlaces())
        {
            if (bp != null)
                bp.destroy();
       
        }

E.g. in my Repka mission we have both red and blue airfields in D3. The main mission loads 3 (will be 4 soon) relatively big submissions in itself and 2 small ones.

Ideally I would like to move the frontline and change side of these 2 birthplaces based on results of a recent submission. Say if reds loose more aircrafts or tanks (or more then say 70%) in recent mission reds loose an airfield in D3. If they win next mission they take it back, etc. and repeat it forever.

In the future I believe this script can be used to move frontline across the whole map to create an ongoing war.

Please find a recent version of my mission attached.

Ataros 05-16-2011 06:49 PM

Could some C# experts check this part of script for errors. Trying to randomize submission loading here. Thanks to Groundhog for idea.

Intended to run in cycle forever. Does not work for me (
Need help please.

Code:

using System;
using maddox.game;
using maddox.game.world;
using System.Collections.Generic;

public class Mission : AMission
{
 
 
// loading sub-missions
public override void OnTickGame()
{
   
    if (Time.tickCounter() % 54000 == 12600) // 54000=30 min repeat. 12600=7 min delay.
  {
        // randomly selects 1 of several submissions
        Random RandomIncident = new Random();

        switch (RandomIncident.Next(1, 3))
        {
            case 1:
                GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis");
                // GamePlay.gpHUDLogCenter("mis1 loaded!");

                double initTime = 0.0;
                Timeout(initTime += 600, () =>
                {
                    GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!");
                });
                Timeout(initTime += 600, () =>
                {
                    GamePlay.gpHUDLogCenter("Attention! Help is needed at E3/D4!");
                });
            break;
            case 2:
                GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_sea01.mis");
                // GamePlay.gpHUDLogCenter("mis2 loaded");

                double initTime = 0.0;
                Timeout(initTime += 500, () =>
                {
                    GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!");
                });
           
                Timeout(initTime += 300, () =>
                {
                    GamePlay.gpHUDLogCenter("Attention! Ships are under attack at C4!");
                });
            break;
            case 3:
                GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis");
                // GamePlay.gpHUDLogCenter("mis3 loaded!");

                double initTime = 0.0;
                Timeout(initTime += 600, () =>
                {
                    GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E2!");
                });
                Timeout(initTime += 300, () =>
                {
                    GamePlay.gpHUDLogCenter("Attention! All airgroups please proceed to E2/D3!");
                });
            break;
        }
    }

    ///////////////////////

    //loads small submissions w/o messages
   
    if (Time.tickCounter() % 216000 == 108000) // 216000=120 min repeat. 108000=60 min delay.
    {
        GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small01.mis");
    }

    if (Time.tickCounter() % 216000 == 215999) // 216000=120 min repeat. 215999=120 min delay.
    {
        GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small02.mis");
    }
}     
}


TheEnlightenedFlorist 05-16-2011 11:06 PM

Thanks for the help Ataros, I'll start experimenting with that right away.

As for your code, what exactly isn't working? I can tell you right now that case 3 will never run because the Next(int, int) method returns an integer greater than or equal to the smaller number, but only less than the larger number. In other words, it will never return three, just one or two. It should look like this:

switch (RandomIncident.Next(1, 4))

See here: http://msdn.microsoft.com/en-us/library/2dx6wyd4.aspx


All times are GMT. The time now is 05:39 AM.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Copyright © 2007 Fulqrum Publishing. All rights reserved.