Ejemplo n.º 1
0
        public StarlingGameSpriteBeta2()
        {
            var textures_beta = new_tex96(new BetaBanner());

            //var textures_map = new StarlingGameSpriteWithMapTextures(new_tex_crop);

            //var textures_ped = new StarlingGameSpriteWithPedTextures(this.new_tex_crop);
            //var textures_jeep = new StarlingGameSpriteWithJeepTextures(this.new_tex_crop);

            //var textures_hind = new StarlingGameSpriteWithHindTextures(this.new_tex_crop);
            //var textures_tank = new StarlingGameSpriteWithTankTextures(this.new_tex_crop);
            //var textures_cannon = new StarlingGameSpriteWithCannonTextures(this.new_tex_crop);
            //var textures_bunker = new StarlingGameSpriteWithBunkerTextures(this.new_tex_crop);

            this.disablephysicsdiagnostics = true;
            this.disable_enter_and_space   = true;

            this.onbeforefirstframe += (stage, s) =>
            {
                #region other
                Func <string, RemoteGame> other = __egoid =>
                {
                    // that other game has sent us a sync frame!

                    var already_known_other = others.FirstOrDefault(k => k.__egoid == __egoid);

                    if (already_known_other == null)
                    {
                        already_known_other = new RemoteGame
                        {
                            __egoid = __egoid,

                            // this
                            __syncframeid = this.syncframeid
                        };

                        others.Add(already_known_other);
                    }


                    return(already_known_other);
                };
                #endregion


                #region :ego
                var ego = this.current as PhysicalPed;

                ego.Identity = sessionid + ":ego";

                ego.SetPositionAndAngle(
                    random.NextDouble() * -8,
                    random.NextDouble() * -8,
                    random.NextDouble() * Math.PI
                    );

                current = ego;
                #endregion


                #region __at_sync
                __at_sync += __egoid =>
                {
                    // that other game has sent us a sync frame!

                    var o = other(__egoid);

                    o.__syncframeid++;
                    // move on!
                };
                #endregion

                #region __at_SetVerticalVelocity
                __at_SetVerticalVelocity +=
                    (string __sessionid, string identity, string value) =>
                {
                    var o = other(__sessionid);

                    var u = this.units.FirstOrDefault(k => k.Identity == identity);

                    if (u == ego)
                    {
                        // discard, only we are allowed to move
                        // ourselves for now
                        return;
                    }

                    (u as PhysicalHind).With(hind1 => hind1.VerticalVelocity = double.Parse(value));

                    (u as PhysicalPed).With(
                        physical0 =>
                    {
                        //                                  BCL needs another method, please define it.
                        //Cannot call type without script attribute :
                        //System.Convert for Boolean ToBoolean(Double) used at

                        var LayOnTheGround = double.Parse(value);

                        if (LayOnTheGround == 1)
                        {
                            physical0.visual.LayOnTheGround = true;
                        }
                        else
                        {
                            physical0.visual.LayOnTheGround = false;
                        }
                    }
                        );
                };
                #endregion

                #region __at_SetVelocityFromInput
                __at_SetVelocityFromInput +=
                    (
                        string __egoid,
                        string __identity,
                        string __KeySample,
                        string __fixup_x,
                        string __fixup_y,
                        string __fixup_angle

                    ) =>
                {
                    var o = other(__egoid);

                    #region u PhysicalPed
                    var u = this.units.FirstOrDefault(k => k.Identity == __identity);

                    if (u == null)
                    {
                        if (o.ego == null)
                        {
                            // the only object we can be creating implicitly is
                            // the remote ego

                            u = new PhysicalPed(textures_ped, this)
                            {
                                Identity            = __identity,
                                RemoteGameReference = o
                            };

                            u.SetPositionAndAngle(
                                double.Parse(__fixup_x),
                                double.Parse(__fixup_y),
                                double.Parse(__fixup_angle)
                                );

                            o.ego = u;
                        }
                    }
                    #endregion

                    if (u == ego)
                    {
                        // discard, only we are allowed to move
                        // ourselves for now
                        return;
                    }

                    // set the input!


                    u.SetVelocityFromInput(
                        new KeySample
                    {
                        value = int.Parse(__KeySample),

                        fixup = true,

                        x     = double.Parse(__fixup_x),
                        y     = double.Parse(__fixup_y),
                        angle = double.Parse(__fixup_angle)
                    }
                        );
                };
                #endregion


                #region __at_enterorexit
                __at_enterorexit += (__egoid, __from, __to) =>
                {
                    var o = other(__egoid);

                    var ufrom = this.units.FirstOrDefault(k => k.Identity == __from);
                    var uto   = this.units.FirstOrDefault(k => k.Identity == __to);

                    (ufrom as PhysicalPed).With(
                        candidatedriver =>
                    {
                        if (uto != null)
                        {
                            if (uto.driverseat != null)
                            {
                                if (uto.driverseat.driver == null)
                                {
                                    // and the devil enters
                                    uto.RemoteGameReference = o;

                                    candidatedriver.body.SetActive(false);

                                    uto.driverseat.driver         = candidatedriver;
                                    candidatedriver.seatedvehicle = uto;
                                }
                            }
                        }
                    }
                        );

                    (uto as PhysicalPed).With(
                        driver =>
                    {
                        if (ufrom != null)
                        {
                            if (ufrom.driverseat != null)
                            {
                                if (ufrom.driverseat.driver == driver)
                                {
                                    // relinguish that vehicle. no longer posessed :)
                                    ufrom.RemoteGameReference = null;

                                    // stop the vehicle
                                    ufrom.SetVelocityFromInput(new KeySample());

                                    // get out of the lift..
                                    ufrom.driverseat.driver = null;

                                    driver.seatedvehicle = null;
                                    driver.body.SetActive(true);
                                }
                            }
                        }
                    }
                        );
                };
                #endregion



                this.units.WithEachIndex(
                    (u, i) =>
                {
                    if (u.Identity == null)
                    {
                        u.Identity = "#" + i;
                    }
                }
                    );



                #region beta
                var beta = new Image(textures_beta()).AttachTo(this);

                onframe +=
                    delegate
                {
                    #region beta
                    {
                        var cm = new Matrix();

                        cm.translate(
                            stage.stageWidth - 96,
                            0);

                        beta.transformationMatrix = cm;
                    }
                    #endregion
                };
                #endregion


                bool entermode_changepending = false;
                bool mode_changepending      = false;
                onsyncframe += delegate
                {
                    #region entermode_changepending
                    if (!__keyDown[System.Windows.Forms.Keys.Enter])
                    {
                        // space is not down.
                        entermode_changepending = true;
                    }
                    else
                    {
                        if (entermode_changepending)
                        {
                            entermode_changepending = false;

                            // enter another vehicle?

                            var candidatedriver = current as PhysicalPed;
                            if (candidatedriver != null)
                            {
                                var target =
                                    from candidatevehicle in units
                                    where candidatevehicle.driverseat != null

                                    // can enter if the seat is full.
                                    // unless we kick them out before ofcourse
                                    where candidatevehicle.driverseat.driver == null

                                    let distance = new __vec2(
                                        (float)(candidatedriver.body.GetPosition().x - candidatevehicle.body.GetPosition().x),
                                        (float)(candidatedriver.body.GetPosition().y - candidatevehicle.body.GetPosition().y)
                                        ).GetLength()

                                                   where distance < 6

                                                   orderby distance ascending
                                                   select new { candidatevehicle, distance };

                                target.FirstOrDefault().With(
                                    x =>
                                {
                                    Console.WriteLine(new { x.distance });

                                    __raise_enterorexit(
                                        "" + this.sessionid,
                                        candidatedriver.Identity,
                                        x.candidatevehicle.Identity
                                        );

                                    //current.loc.visible = false;
                                    current.body.SetActive(false);


                                    x.candidatevehicle.driverseat.driver = candidatedriver;
                                    candidatedriver.seatedvehicle        = x.candidatevehicle;

                                    current = x.candidatevehicle;

                                    if (current is PhysicalJeep)
                                    {
                                        sb.snd_jeepengine_start.play();
                                    }
                                    else if (current is PhysicalBunker)
                                    {
                                        if ((current as PhysicalBunker).visual_shopoverlay.visible)
                                        {
                                            sb.snd_its_a_shop.play();
                                            if (ShopEnter != null)
                                            {
                                                ShopEnter(candidatedriver);
                                            }
                                        }
                                        else
                                        {
                                            if (random.NextDouble() > 0.8)
                                            {
                                                sb.haarp.play();
                                            }
                                            else
                                            {
                                                if (random.NextDouble() > 0.5)
                                                {
                                                    sb.snd_itsempty.play();
                                                }
                                                else
                                                {
                                                    sb.snd_nothinghere.play();
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        sb.snd_dooropen.play(
                                            sndTransform: new SoundTransform(
                                                0.3
                                                )
                                            );
                                    }

                                    //if (current is PhysicalHind)
                                    //{
                                    //    nightvision_on();
                                    //}

                                    hud_update();


                                    //switchto(x.x);
                                    move_zoom = 1;

                                    // fast start
                                    //(current as PhysicalHind).With(
                                    //    hind => hind.VerticalVelocity = 1
                                    //);
                                }
                                    );
                            }
                            else
                            {
                                (current.driverseat.driver as PhysicalPed).With(
                                    driver =>
                                {
                                    // get out of the lift..

                                    //nightvision_off();

                                    current.driverseat.driver = null;
                                    driver.seatedvehicle      = null;
                                    current.SetVelocityFromInput(new KeySample());

                                    if (current is PhysicalBunker)
                                    {
                                        if ((current as PhysicalBunker).IsShop)
                                        {
                                            if (ShopExit != null)
                                            {
                                                ShopExit();
                                            }
                                        }
                                    }

                                    // crashland?
                                    (current as PhysicalHind).With(
                                        hind =>
                                    {
                                        if (hind.visual.Altitude > 0)
                                        {
                                            hind.VerticalVelocity = -1;
                                            sb.snd_touchdown.play();
                                        }
                                    }

                                        );

                                    sb.snd_dooropen.play(
                                        sndTransform: new SoundTransform(
                                            0.3
                                            )
                                        );
                                    //if (current.body.GetType() != Box2D.Dynamics.b2Body.b2_dynamicBody)
                                    //{
                                    //    sb.snd_letsgo.play();
                                    //}

                                    __raise_enterorexit(
                                        "" + this.sessionid,
                                        current.Identity,
                                        driver.Identity
                                        );

                                    current = driver;
                                    driver.body.SetActive(true);
                                    driver.body.SetAngularVelocity(-11);

                                    hud_update();
                                    move_zoom = 1;
                                }
                                    );
                            }
                        }
                    }
                    #endregion


                    #region Space
                    if (!__keyDown[System.Windows.Forms.Keys.Space])
                    {
                        // space is not down.
                        mode_changepending = true;
                    }
                    else
                    {
                        if (mode_changepending)
                        {
                            (current as PhysicalHind).With(
                                hind1 =>
                            {
                                if (hind1.visual.Altitude == 0)
                                {
                                    nightvision_on();
                                    hind1.VerticalVelocity = 1.0;
                                }
                                else
                                {
                                    nightvision_off();

                                    hind1.VerticalVelocity = -0.4;

                                    sb.snd_touchdown.play();
                                }

                                __raise_SetVerticalVelocity(
                                    "" + this.sessionid,
                                    hind1.Identity,
                                    "" + hind1.VerticalVelocity
                                    );
                            }
                                );

                            (current as PhysicalPed).With(
                                physical0 =>
                            {
                                if (physical0.visual.LayOnTheGround)
                                {
                                    physical0.visual.LayOnTheGround = false;

                                    sb.snd_letsgo.play(
                                        sndTransform: new SoundTransform(
                                            0.3 * (0.15 + 0.15 * random.NextDouble())
                                            )
                                        );
                                }
                                else
                                {
                                    physical0.visual.LayOnTheGround = true;

                                    sb.snd_ped_hit.play(
                                        sndTransform: new SoundTransform(
                                            0.3 * (0.15 + 0.15 * random.NextDouble())
                                            )
                                        );
                                }

                                var value = 0;
                                if (physical0.visual.LayOnTheGround)
                                {
                                    value = 1;
                                }

                                __raise_SetVerticalVelocity(
                                    "" + this.sessionid,
                                    physical0.Identity,
                                    "" + value
                                    );
                            }
                                );



                            mode_changepending = false;
                        }
                    }
                    #endregion



                    __raise_SetVelocityFromInput(
                        "" + sessionid,
                        current.Identity,
                        "" + current.CurrentInput.value,
                        "" + current.body.GetPosition().x,
                        "" + current.body.GetPosition().y,
                        "" + current.body.GetAngle()

                        );


                    // tell others this sync frame ended for us
                    __raise_sync("" + sessionid);
                };
            };
        }
        public StarlingGameSpriteWithTestDriversSync()
        {
            var textures_map = new StarlingGameSpriteWithMapTextures(new_tex_crop);

            var textures_ped    = new StarlingGameSpriteWithPedTextures(this.new_tex_crop, this.new_texsprite_crop);
            var textures_jeep   = new StarlingGameSpriteWithJeepTextures(this.new_tex_crop);
            var textures_tank   = new StarlingGameSpriteWithTankTextures(new_texsprite_crop);
            var textures_hind   = new StarlingGameSpriteWithHindTextures(this.new_tex_crop);
            var textures_rocket = new StarlingGameSpriteWithRocketTextures(this.new_tex_crop);

            var textures_bunker = new StarlingGameSpriteWithBunkerTextures(this.new_tex_crop);

            this.onbeforefirstframe += (stage, s) =>
            {
                #region :ego
                var ego = new PhysicalPed(textures_ped, this)
                {
                    Identity = sessionid + ":ego"
                };

                ego.SetPositionAndAngle(
                    random.NextDouble() * -8,
                    random.NextDouble() * -8,
                    random.NextDouble() * Math.PI
                    );

                current = ego;
                #endregion


                #region KeySample
                var __keyDown = new KeySample();

                stage.keyDown +=
                    e =>
                {
                    // http://circlecube.com/2008/08/actionscript-key-listener-tutorial/
                    if (e.altKey)
                    {
                        __keyDown[System.Windows.Forms.Keys.Alt] = true;
                    }

                    __keyDown[(System.Windows.Forms.Keys)e.keyCode] = true;
                };

                stage.keyUp +=
                    e =>
                {
                    if (!e.altKey)
                    {
                        __keyDown[System.Windows.Forms.Keys.Alt] = false;
                    }

                    __keyDown[(System.Windows.Forms.Keys)e.keyCode] = false;
                };

                #endregion

                new PhysicalBunker(textures_bunker, this)
                {
                    Identity = "bunker:0"
                }.SetPositionAndAngle(0, -24);

                var hind0 = new PhysicalHindWeaponized(textures_hind, textures_rocket, this)
                {
                    Identity = ":1",

                    AutomaticTakeoff   = true,
                    AutomaticTouchdown = true
                };

                hind0.SetPositionAndAngle(-12, -12);

                new Image(textures_map.touchdown()).AttachTo(Content).y = 256;

                new PhysicalJeep(textures_jeep, this)
                {
                    Identity = ":2"
                }.SetPositionAndAngle(0, -12);
                new PhysicalTank(textures_tank, this)
                {
                    Identity = ":3"
                }.SetPositionAndAngle(12, -12);



                #region other
                Func <string, RemoteGame> other = __egoid =>
                {
                    // that other game has sent us a sync frame!

                    var already_known_other = others.FirstOrDefault(k => k.__egoid == __egoid);

                    if (already_known_other == null)
                    {
                        already_known_other = new RemoteGame
                        {
                            __egoid = __egoid,

                            // this
                            __syncframeid = this.syncframeid
                        };

                        others.Add(already_known_other);
                    }


                    return(already_known_other);
                };
                #endregion


                #region __at_sync
                __at_sync += __egoid =>
                {
                    // that other game has sent us a sync frame!

                    var o = other(__egoid);

                    o.__syncframeid++;
                    // move on!
                };
                #endregion

                #region __at_SetVerticalVelocity
                __at_SetVerticalVelocity +=
                    (string __sessionid, string identity, string value) =>
                {
                    var o = other(__sessionid);

                    var u = this.units.FirstOrDefault(k => k.Identity == identity);

                    (u as PhysicalHind).With(hind1 => hind1.VerticalVelocity = double.Parse(value));

                    (u as PhysicalPed).With(
                        physical0 =>
                    {
                        //                                  BCL needs another method, please define it.
                        //Cannot call type without script attribute :
                        //System.Convert for Boolean ToBoolean(Double) used at

                        var LayOnTheGround = double.Parse(value);

                        if (LayOnTheGround == 1)
                        {
                            physical0.visual.LayOnTheGround = true;
                        }
                        else
                        {
                            physical0.visual.LayOnTheGround = false;
                        }
                    }
                        );
                };
                #endregion

                #region __at_SetVelocityFromInput
                __at_SetVelocityFromInput +=
                    (
                        string __egoid,
                        string __identity,
                        string __KeySample,
                        string __fixup_x,
                        string __fixup_y,
                        string __fixup_angle

                    ) =>
                {
                    var o = other(__egoid);

                    var u = this.units.FirstOrDefault(k => k.Identity == __identity);

                    if (u == null)
                    {
                        if (o.ego == null)
                        {
                            // the only object we can be creating implicitly is
                            // the remote ego

                            u = new PhysicalPed(textures_ped, this)
                            {
                                Identity            = __identity,
                                RemoteGameReference = o
                            };

                            u.SetPositionAndAngle(
                                double.Parse(__fixup_x),
                                double.Parse(__fixup_y),
                                double.Parse(__fixup_angle)
                                );

                            o.ego = u;
                        }
                    }


                    // set the input!


                    u.SetVelocityFromInput(
                        new KeySample
                    {
                        value = int.Parse(__KeySample),

                        fixup = true,

                        x     = double.Parse(__fixup_x),
                        y     = double.Parse(__fixup_y),
                        angle = double.Parse(__fixup_angle)
                    }
                        );
                };
                #endregion


                #region __at_enterorexit
                __at_enterorexit += (__egoid, __from, __to) =>
                {
                    var o = other(__egoid);

                    var ufrom = this.units.FirstOrDefault(k => k.Identity == __from);
                    var uto   = this.units.FirstOrDefault(k => k.Identity == __to);

                    (ufrom as PhysicalPed).With(
                        candidatedriver =>
                    {
                        if (uto != null)
                        {
                            if (uto.driverseat != null)
                            {
                                if (uto.driverseat.driver == null)
                                {
                                    // and the devil enters
                                    uto.RemoteGameReference = o;

                                    candidatedriver.body.SetActive(false);

                                    uto.driverseat.driver         = candidatedriver;
                                    candidatedriver.seatedvehicle = uto;
                                }
                            }
                        }
                    }
                        );

                    (uto as PhysicalPed).With(
                        driver =>
                    {
                        if (ufrom != null)
                        {
                            if (ufrom.driverseat != null)
                            {
                                if (ufrom.driverseat.driver == driver)
                                {
                                    // relinguish that vehicle. no longer posessed :)
                                    ufrom.RemoteGameReference = null;

                                    // stop the vehicle
                                    ufrom.SetVelocityFromInput(new KeySample());

                                    // get out of the lift..
                                    ufrom.driverseat.driver = null;

                                    driver.seatedvehicle = null;
                                    driver.body.SetActive(true);
                                }
                            }
                        }
                    }
                        );
                };
                #endregion



                bool entermode_changepending = false;
                bool mode_changepending      = false;

                onsyncframe += delegate
                {
                    #region mode
                    if (!__keyDown[System.Windows.Forms.Keys.Space])
                    {
                        // space is not down.
                        mode_changepending = true;
                    }
                    else
                    {
                        if (mode_changepending)
                        {
                            (current as PhysicalHind).With(
                                hind1 =>
                            {
                                if (hind1.visual.Altitude == 0)
                                {
                                    hind1.VerticalVelocity = 1.0;
                                }
                                else
                                {
                                    hind1.VerticalVelocity = -0.4;
                                }

                                __raise_SetVerticalVelocity(
                                    "" + this.sessionid,
                                    hind1.Identity,
                                    "" + hind1.VerticalVelocity
                                    );
                            }
                                );

                            (current as PhysicalPed).With(
                                physical0 =>
                            {
                                if (physical0.visual.LayOnTheGround)
                                {
                                    physical0.visual.LayOnTheGround = false;
                                }
                                else
                                {
                                    physical0.visual.LayOnTheGround = true;
                                }


                                //                                     BCL needs another method, please define it.
                                //Cannot call type without script attribute :
                                //System.Convert for Double ToDouble(Boolean) used at

                                var value = 0;
                                if (physical0.visual.LayOnTheGround)
                                {
                                    value = 1;
                                }

                                __raise_SetVerticalVelocity(
                                    "" + this.sessionid,
                                    physical0.Identity,
                                    "" + value
                                    );
                            }
                                );



                            mode_changepending = false;
                        }
                    }
                    #endregion



                    #region entermode_changepending
                    if (!__keyDown[System.Windows.Forms.Keys.Enter])
                    {
                        // space is not down.
                        entermode_changepending = true;
                    }
                    else
                    {
                        if (entermode_changepending)
                        {
                            entermode_changepending = false;

                            // enter another vehicle?

                            var candidatedriver = current as PhysicalPed;
                            if (candidatedriver != null)
                            {
                                var target =
                                    from candidatevehicle in units
                                    where candidatevehicle.driverseat != null

                                    // can enter if the seat is full.
                                    // unless we kick them out before ofcourse
                                    where candidatevehicle.driverseat.driver == null

                                    let distance = new __vec2(
                                        (float)(candidatedriver.body.GetPosition().x - candidatevehicle.body.GetPosition().x),
                                        (float)(candidatedriver.body.GetPosition().y - candidatevehicle.body.GetPosition().y)
                                        ).GetLength()

                                                   where distance < 6

                                                   orderby distance ascending
                                                   select new { candidatevehicle, distance };

                                target.FirstOrDefault().With(
                                    x =>
                                {
                                    Console.WriteLine(new { x.distance });

                                    __raise_enterorexit(
                                        "" + this.sessionid,
                                        candidatedriver.Identity,
                                        x.candidatevehicle.Identity
                                        );

                                    //current.loc.visible = false;
                                    current.body.SetActive(false);

                                    x.candidatevehicle.driverseat.driver = candidatedriver;
                                    candidatedriver.seatedvehicle        = x.candidatevehicle;

                                    move_zoom = 1;
                                    current   = x.candidatevehicle;



                                    //if (current.body.GetType() == Box2D.Dynamics.b2Body.b2_dynamicBody)
                                    //{
                                    //    hud.texture = textures_ped.hud_look_goggles();
                                    //}
                                    //else
                                    //{
                                    //    hud.texture = textures_ped.hud_look_building();
                                    //}

                                    //switchto(x.x);

                                    // fast start
                                    //(current as PhysicalHind).With(
                                    //    hind => hind.VerticalVelocity = 1
                                    //);
                                }
                                    );
                            }
                            else
                            {
                                (current.driverseat.driver as PhysicalPed).With(
                                    driver =>
                                {
                                    // stop the vehicle
                                    current.SetVelocityFromInput(new KeySample());

                                    // get out of the lift..
                                    current.driverseat.driver = null;

                                    driver.seatedvehicle = null;
                                    driver.body.SetActive(true);


                                    // crashland?
                                    //(current as PhysicalHind).With(
                                    //    hind => hind.VerticalVelocity = -1
                                    //);

                                    __raise_enterorexit(
                                        "" + this.sessionid,
                                        current.Identity,
                                        driver.Identity
                                        );

                                    current = driver;
                                    //hud.texture = textures_ped.hud_look();
                                    move_zoom = 1;
                                }
                                    );
                            }
                        }
                    }
                    #endregion



                    current.SetVelocityFromInput(__keyDown);

                    #region simulate a weapone!
                    if (__keyDown[System.Windows.Forms.Keys.ControlKey])
                    {
                        if (syncframeid % 3 == 0)
                        {
                            (this.current as PhysicalHindWeaponized).With(
                                h =>
                            {
                                //sb.snd_missleLaunch.play();

                                h.FireRocket();
                            }
                                );
                        }
                    }
                    #endregion

                    __raise_SetVelocityFromInput(
                        "" + sessionid,
                        current.Identity,
                        "" + current.CurrentInput.value,
                        "" + current.body.GetPosition().x,
                        "" + current.body.GetPosition().y,
                        "" + current.body.GetAngle()
                        );


                    // tell others this sync frame ended for us
                    __raise_sync("" + sessionid);
                };
            };
        }
        public StarlingGameSpriteBeta2()
        {
            var textures_beta = new_tex96(new BetaBanner());

            //var textures_map = new StarlingGameSpriteWithMapTextures(new_tex_crop);

            //var textures_ped = new StarlingGameSpriteWithPedTextures(this.new_tex_crop);
            //var textures_jeep = new StarlingGameSpriteWithJeepTextures(this.new_tex_crop);

            //var textures_hind = new StarlingGameSpriteWithHindTextures(this.new_tex_crop);
            //var textures_tank = new StarlingGameSpriteWithTankTextures(this.new_tex_crop);
            //var textures_cannon = new StarlingGameSpriteWithCannonTextures(this.new_tex_crop);
            //var textures_bunker = new StarlingGameSpriteWithBunkerTextures(this.new_tex_crop);

            this.disablephysicsdiagnostics = true;
            this.disable_enter_and_space = true;

            this.onbeforefirstframe += (stage, s) =>
             {

                 #region other
                 Func<string, RemoteGame> other = __egoid =>
                 {
                     // that other game has sent us a sync frame!

                     var already_known_other = others.FirstOrDefault(k => k.__egoid == __egoid);

                     if (already_known_other == null)
                     {
                         already_known_other = new RemoteGame
                         {
                             __egoid = __egoid,

                             // this
                             __syncframeid = this.syncframeid
                         };

                         others.Add(already_known_other);
                     }


                     return already_known_other;
                 };
                 #endregion


                 #region :ego
                 var ego = this.current as PhysicalPed;

                 ego.Identity = sessionid + ":ego";

                 ego.SetPositionAndAngle(
                     random.NextDouble() * -8,
                     random.NextDouble() * -8,
                     random.NextDouble() * Math.PI
                 );

                 current = ego;
                 #endregion


                 #region __at_sync
                 __at_sync += __egoid =>
                 {
                     // that other game has sent us a sync frame!

                     var o = other(__egoid);

                     o.__syncframeid++;
                     // move on!
                 };
                 #endregion

                 #region __at_SetVerticalVelocity
                 __at_SetVerticalVelocity +=
                     (string __sessionid, string identity, string value) =>
                     {
                         var o = other(__sessionid);

                         var u = this.units.FirstOrDefault(k => k.Identity == identity);

                         if (u == ego)
                         {
                             // discard, only we are allowed to move
                             // ourselves for now
                             return;
                         }

                         (u as PhysicalHind).With(hind1 => hind1.VerticalVelocity = double.Parse(value));

                         (u as PhysicalPed).With(
                               physical0 =>
                               {
                                   //                                  BCL needs another method, please define it.
                                   //Cannot call type without script attribute :
                                   //System.Convert for Boolean ToBoolean(Double) used at

                                   var LayOnTheGround = double.Parse(value);

                                   if (LayOnTheGround == 1)
                                       physical0.visual.LayOnTheGround = true;
                                   else
                                       physical0.visual.LayOnTheGround = false;




                               }
                           );

                     };
                 #endregion

                 #region __at_SetVelocityFromInput
                 __at_SetVelocityFromInput +=
                     (
                         string __egoid,
                         string __identity,
                         string __KeySample,
                         string __fixup_x,
                         string __fixup_y,
                         string __fixup_angle

                         ) =>
                     {
                         var o = other(__egoid);

                         #region u PhysicalPed
                         var u = this.units.FirstOrDefault(k => k.Identity == __identity);

                         if (u == null)
                             if (o.ego == null)
                             {
                                 // the only object we can be creating implicitly is
                                 // the remote ego

                                 u = new PhysicalPed(textures_ped, this)
                                 {
                                     Identity = __identity,
                                     RemoteGameReference = o
                                 };

                                 u.SetPositionAndAngle(
                                     double.Parse(__fixup_x),
                                     double.Parse(__fixup_y),
                                     double.Parse(__fixup_angle)
                                 );

                                 o.ego = u;
                             }
                         #endregion

                         if (u == ego)
                         {
                             // discard, only we are allowed to move
                             // ourselves for now
                             return;
                         }

                         // set the input!


                         u.SetVelocityFromInput(
                             new KeySample
                             {
                                 value = int.Parse(__KeySample),

                                 fixup = true,

                                 x = double.Parse(__fixup_x),
                                 y = double.Parse(__fixup_y),
                                 angle = double.Parse(__fixup_angle)

                             }
                         );

                     };
                 #endregion


                 #region __at_enterorexit
                 __at_enterorexit += (__egoid, __from, __to) =>
                 {
                     var o = other(__egoid);

                     var ufrom = this.units.FirstOrDefault(k => k.Identity == __from);
                     var uto = this.units.FirstOrDefault(k => k.Identity == __to);

                     (ufrom as PhysicalPed).With(
                         candidatedriver =>
                         {
                             if (uto != null)
                                 if (uto.driverseat != null)
                                     if (uto.driverseat.driver == null)
                                     {
                                         // and the devil enters
                                         uto.RemoteGameReference = o;

                                         candidatedriver.body.SetActive(false);

                                         uto.driverseat.driver = candidatedriver;
                                         candidatedriver.seatedvehicle = uto;
                                     }
                         }
                     );

                     (uto as PhysicalPed).With(
                         driver =>
                         {
                             if (ufrom != null)
                                 if (ufrom.driverseat != null)
                                     if (ufrom.driverseat.driver == driver)
                                     {
                                         // relinguish that vehicle. no longer posessed :)
                                         ufrom.RemoteGameReference = null;

                                         // stop the vehicle
                                         ufrom.SetVelocityFromInput(new KeySample());

                                         // get out of the lift..
                                         ufrom.driverseat.driver = null;

                                         driver.seatedvehicle = null;
                                         driver.body.SetActive(true);
                                     }
                         }
                     );

                 };
                 #endregion








                 this.units.WithEachIndex(
                     (u, i) =>
                     {
                         if (u.Identity == null)
                             u.Identity = "#" + i;
                     }
                 );





                 #region beta
                 var beta = new Image(textures_beta()).AttachTo(this);

                 onframe +=
                      delegate
                      {

                          #region beta
                          {
                              var cm = new Matrix();

                              cm.translate(
                                 stage.stageWidth - 96,
                                  0);

                              beta.transformationMatrix = cm;
                          }
                          #endregion
                      };
                 #endregion


                 bool entermode_changepending = false;
                 bool mode_changepending = false;
                 onsyncframe += delegate
                 {






                     #region entermode_changepending
                     if (!__keyDown[System.Windows.Forms.Keys.Enter])
                     {
                         // space is not down.
                         entermode_changepending = true;
                     }
                     else
                     {
                         if (entermode_changepending)
                         {
                             entermode_changepending = false;

                             // enter another vehicle?

                             var candidatedriver = current as PhysicalPed;
                             if (candidatedriver != null)
                             {
                                 var target =
                                      from candidatevehicle in units
                                      where candidatevehicle.driverseat != null

                                      // can enter if the seat is full.
                                      // unless we kick them out before ofcourse
                                      where candidatevehicle.driverseat.driver == null

                                      let distance = new __vec2(
                                          (float)(candidatedriver.body.GetPosition().x - candidatevehicle.body.GetPosition().x),
                                          (float)(candidatedriver.body.GetPosition().y - candidatevehicle.body.GetPosition().y)
                                      ).GetLength()

                                      where distance < 6

                                      orderby distance ascending
                                      select new { candidatevehicle, distance };

                                 target.FirstOrDefault().With(
                                     x =>
                                     {
                                         Console.WriteLine(new { x.distance });

                                         __raise_enterorexit(
                                              "" + this.sessionid,
                                              candidatedriver.Identity,
                                              x.candidatevehicle.Identity
                                          );

                                         //current.loc.visible = false;
                                         current.body.SetActive(false);


                                         x.candidatevehicle.driverseat.driver = candidatedriver;
                                         candidatedriver.seatedvehicle = x.candidatevehicle;

                                         current = x.candidatevehicle;

                                         if (current is PhysicalJeep)
                                         {
                                             sb.snd_jeepengine_start.play();
                                         }
                                         else if (current is PhysicalBunker)
                                         {
                                             if ((current as PhysicalBunker).visual_shopoverlay.visible)
                                             {
                                                 sb.snd_its_a_shop.play();
                                                 if (ShopEnter != null)
                                                     ShopEnter(candidatedriver);
                                             }
                                             else
                                             {
                                                 if (random.NextDouble() > 0.8)
                                                 {
                                                     sb.haarp.play();
                                                 }
                                                 else
                                                 {
                                                     if (random.NextDouble() > 0.5)
                                                     {
                                                         sb.snd_itsempty.play();
                                                     }
                                                     else
                                                     {
                                                         sb.snd_nothinghere.play();
                                                     }

                                                 }
                                             }
                                         }
                                         else
                                         {
                                             sb.snd_dooropen.play(
                                               sndTransform: new SoundTransform(
                                                  0.3
                                               )
                                            );
                                         }

                                         //if (current is PhysicalHind)
                                         //{
                                         //    nightvision_on();
                                         //}

                                         hud_update();


                                         //switchto(x.x);
                                         move_zoom = 1;

                                         // fast start
                                         //(current as PhysicalHind).With(
                                         //    hind => hind.VerticalVelocity = 1
                                         //);
                                     }
                                 );
                             }
                             else
                             {
                                 (current.driverseat.driver as PhysicalPed).With(
                                     driver =>
                                     {
                                         // get out of the lift..

                                         //nightvision_off();

                                         current.driverseat.driver = null;
                                         driver.seatedvehicle = null;
                                         current.SetVelocityFromInput(new KeySample());

                                         if (current is PhysicalBunker)
                                         {
                                             if ((current as PhysicalBunker).IsShop)
                                             {
                                                 if (ShopExit != null)
                                                     ShopExit();
                                             }
                                         }

                                         // crashland?
                                         (current as PhysicalHind).With(
                                             hind =>
                                             {
                                                 if (hind.visual.Altitude > 0)
                                                 {
                                                     hind.VerticalVelocity = -1;
                                                     sb.snd_touchdown.play();
                                                 }
                                             }

                                         );

                                         sb.snd_dooropen.play(
                                           sndTransform: new SoundTransform(
                                              0.3
                                           )
                                        );
                                         //if (current.body.GetType() != Box2D.Dynamics.b2Body.b2_dynamicBody)
                                         //{
                                         //    sb.snd_letsgo.play();
                                         //}

                                         __raise_enterorexit(
                                             "" + this.sessionid,
                                             current.Identity,
                                             driver.Identity
                                         );

                                         current = driver;
                                         driver.body.SetActive(true);
                                         driver.body.SetAngularVelocity(-11);

                                         hud_update();
                                         move_zoom = 1;
                                     }
                                 );
                             }

                         }
                     }
                     #endregion


                     #region Space
                     if (!__keyDown[System.Windows.Forms.Keys.Space])
                     {
                         // space is not down.
                         mode_changepending = true;
                     }
                     else
                     {
                         if (mode_changepending)
                         {
                             (current as PhysicalHind).With(
                                 hind1 =>
                                 {
                                     if (hind1.visual.Altitude == 0)
                                     {
                                         nightvision_on();
                                         hind1.VerticalVelocity = 1.0;


                                     }
                                     else
                                     {
                                         nightvision_off();

                                         hind1.VerticalVelocity = -0.4;

                                         sb.snd_touchdown.play();
                                     }

                                     __raise_SetVerticalVelocity(
                                        "" + this.sessionid,
                                        hind1.Identity,
                                        "" + hind1.VerticalVelocity
                                    );
                                 }
                             );

                             (current as PhysicalPed).With(
                              physical0 =>
                              {
                                  if (physical0.visual.LayOnTheGround)
                                  {
                                      physical0.visual.LayOnTheGround = false;

                                      sb.snd_letsgo.play(
                                          sndTransform: new SoundTransform(
                                              0.3 * (0.15 + 0.15 * random.NextDouble())
                                          )
                                      );
                                  }
                                  else
                                  {
                                      physical0.visual.LayOnTheGround = true;

                                      sb.snd_ped_hit.play(
                                           sndTransform: new SoundTransform(
                                               0.3 * (0.15 + 0.15 * random.NextDouble())
                                           )
                                       );
                                  }

                                  var value = 0;
                                  if (physical0.visual.LayOnTheGround)
                                      value = 1;

                                  __raise_SetVerticalVelocity(
                                      "" + this.sessionid,
                                      physical0.Identity,
                                      "" + value
                                  );
                              }
                          );




                             mode_changepending = false;



                         }
                     }
                     #endregion







                     __raise_SetVelocityFromInput(
                          "" + sessionid,
                          current.Identity,
                          "" + current.CurrentInput.value,
                          "" + current.body.GetPosition().x,
                          "" + current.body.GetPosition().y,
                          "" + current.body.GetAngle()

                      );


                     // tell others this sync frame ended for us
                     __raise_sync("" + sessionid);
                 };
             };

        }
        public StarlingGameSpriteWithTestDriversSync()
        {
            var textures_map = new StarlingGameSpriteWithMapTextures(new_tex_crop);

            var textures_ped = new StarlingGameSpriteWithPedTextures(this.new_tex_crop, this.new_texsprite_crop);
            var textures_jeep = new StarlingGameSpriteWithJeepTextures(this.new_tex_crop);
            var textures_tank = new StarlingGameSpriteWithTankTextures(new_texsprite_crop);
            var textures_hind = new StarlingGameSpriteWithHindTextures(this.new_tex_crop);
            var textures_rocket = new StarlingGameSpriteWithRocketTextures(this.new_tex_crop);

            var textures_bunker = new StarlingGameSpriteWithBunkerTextures(this.new_tex_crop);

            this.onbeforefirstframe += (stage, s) =>
            {
                #region :ego
                var ego = new PhysicalPed(textures_ped, this)
                {
                    Identity = sessionid + ":ego"
                };

                ego.SetPositionAndAngle(
                    random.NextDouble() * -8,
                    random.NextDouble() * -8,
                    random.NextDouble() * Math.PI
                );

                current = ego;
                #endregion


                #region KeySample
                var __keyDown = new KeySample();

                stage.keyDown +=
                   e =>
                   {
                       // http://circlecube.com/2008/08/actionscript-key-listener-tutorial/
                       if (e.altKey)
                           __keyDown[System.Windows.Forms.Keys.Alt] = true;

                       __keyDown[(System.Windows.Forms.Keys)e.keyCode] = true;
                   };

                stage.keyUp +=
                 e =>
                 {
                     if (!e.altKey)
                         __keyDown[System.Windows.Forms.Keys.Alt] = false;

                     __keyDown[(System.Windows.Forms.Keys)e.keyCode] = false;
                 };

                #endregion

                new PhysicalBunker(textures_bunker, this) { Identity = "bunker:0" }.SetPositionAndAngle(0, -24);

                var hind0 = new PhysicalHindWeaponized(textures_hind, textures_rocket, this)
                {
                    Identity = ":1",

                    AutomaticTakeoff = true,
                    AutomaticTouchdown = true

                };

                hind0.SetPositionAndAngle(-12, -12);

                new Image(textures_map.touchdown()).AttachTo(Content).y = 256;

                new PhysicalJeep(textures_jeep, this) { Identity = ":2" }.SetPositionAndAngle(0, -12);
                new PhysicalTank(textures_tank, this) { Identity = ":3" }.SetPositionAndAngle(12, -12);





                #region other
                Func<string, RemoteGame> other = __egoid =>
                {
                    // that other game has sent us a sync frame!

                    var already_known_other = others.FirstOrDefault(k => k.__egoid == __egoid);

                    if (already_known_other == null)
                    {
                        already_known_other = new RemoteGame
                        {
                            __egoid = __egoid,

                            // this
                            __syncframeid = this.syncframeid
                        };

                        others.Add(already_known_other);
                    }


                    return already_known_other;
                };
                #endregion


                #region __at_sync
                __at_sync += __egoid =>
                {
                    // that other game has sent us a sync frame!

                    var o = other(__egoid);

                    o.__syncframeid++;
                    // move on!
                };
                #endregion

                #region __at_SetVerticalVelocity
                __at_SetVerticalVelocity +=
                    (string __sessionid, string identity, string value) =>
                    {
                        var o = other(__sessionid);

                        var u = this.units.FirstOrDefault(k => k.Identity == identity);

                        (u as PhysicalHind).With(hind1 => hind1.VerticalVelocity = double.Parse(value));

                        (u as PhysicalPed).With(
                              physical0 =>
                              {
                                  //                                  BCL needs another method, please define it.
                                  //Cannot call type without script attribute :
                                  //System.Convert for Boolean ToBoolean(Double) used at

                                  var LayOnTheGround = double.Parse(value);

                                  if (LayOnTheGround == 1)
                                      physical0.visual.LayOnTheGround = true;
                                  else
                                      physical0.visual.LayOnTheGround = false;




                              }
                          );

                    };
                #endregion

                #region __at_SetVelocityFromInput
                __at_SetVelocityFromInput +=
                    (
                        string __egoid,
                        string __identity,
                        string __KeySample,
                        string __fixup_x,
                        string __fixup_y,
                        string __fixup_angle

                        ) =>
                    {
                        var o = other(__egoid);

                        var u = this.units.FirstOrDefault(k => k.Identity == __identity);

                        if (u == null)
                            if (o.ego == null)
                            {
                                // the only object we can be creating implicitly is
                                // the remote ego

                                u = new PhysicalPed(textures_ped, this)
                                {
                                    Identity = __identity,
                                    RemoteGameReference = o
                                };

                                u.SetPositionAndAngle(
                                    double.Parse(__fixup_x),
                                    double.Parse(__fixup_y),
                                    double.Parse(__fixup_angle)
                                );

                                o.ego = u;
                            }


                        // set the input!


                        u.SetVelocityFromInput(
                            new KeySample
                            {
                                value = int.Parse(__KeySample),

                                fixup = true,

                                x = double.Parse(__fixup_x),
                                y = double.Parse(__fixup_y),
                                angle = double.Parse(__fixup_angle)

                            }
                        );

                    };
                #endregion


                #region __at_enterorexit
                __at_enterorexit += (__egoid, __from, __to) =>
                {
                    var o = other(__egoid);

                    var ufrom = this.units.FirstOrDefault(k => k.Identity == __from);
                    var uto = this.units.FirstOrDefault(k => k.Identity == __to);

                    (ufrom as PhysicalPed).With(
                        candidatedriver =>
                        {
                            if (uto != null)
                                if (uto.driverseat != null)
                                    if (uto.driverseat.driver == null)
                                    {
                                        // and the devil enters
                                        uto.RemoteGameReference = o;

                                        candidatedriver.body.SetActive(false);

                                        uto.driverseat.driver = candidatedriver;
                                        candidatedriver.seatedvehicle = uto;
                                    }
                        }
                    );

                    (uto as PhysicalPed).With(
                        driver =>
                        {
                            if (ufrom != null)
                                if (ufrom.driverseat != null)
                                    if (ufrom.driverseat.driver == driver)
                                    {
                                        // relinguish that vehicle. no longer posessed :)
                                        ufrom.RemoteGameReference = null;

                                        // stop the vehicle
                                        ufrom.SetVelocityFromInput(new KeySample());

                                        // get out of the lift..
                                        ufrom.driverseat.driver = null;

                                        driver.seatedvehicle = null;
                                        driver.body.SetActive(true);
                                    }
                        }
                    );

                };
                #endregion



                bool entermode_changepending = false;
                bool mode_changepending = false;

                onsyncframe += delegate
                {

                    #region mode
                    if (!__keyDown[System.Windows.Forms.Keys.Space])
                    {
                        // space is not down.
                        mode_changepending = true;
                    }
                    else
                    {
                        if (mode_changepending)
                        {
                            (current as PhysicalHind).With(
                                hind1 =>
                                {
                                    if (hind1.visual.Altitude == 0)
                                        hind1.VerticalVelocity = 1.0;
                                    else
                                        hind1.VerticalVelocity = -0.4;

                                    __raise_SetVerticalVelocity(
                                        "" + this.sessionid,
                                        hind1.Identity,
                                        "" + hind1.VerticalVelocity
                                    );
                                }
                            );

                            (current as PhysicalPed).With(
                                 physical0 =>
                                 {
                                     if (physical0.visual.LayOnTheGround)
                                         physical0.visual.LayOnTheGround = false;
                                     else
                                         physical0.visual.LayOnTheGround = true;


                                     //                                     BCL needs another method, please define it.
                                     //Cannot call type without script attribute :
                                     //System.Convert for Double ToDouble(Boolean) used at

                                     var value = 0;
                                     if (physical0.visual.LayOnTheGround)
                                         value = 1;

                                     __raise_SetVerticalVelocity(
                                         "" + this.sessionid,
                                         physical0.Identity,
                                         "" + value
                                     );

                                 }
                             );




                            mode_changepending = false;



                        }
                    }
                    #endregion



                    #region entermode_changepending
                    if (!__keyDown[System.Windows.Forms.Keys.Enter])
                    {
                        // space is not down.
                        entermode_changepending = true;
                    }
                    else
                    {
                        if (entermode_changepending)
                        {
                            entermode_changepending = false;

                            // enter another vehicle?

                            var candidatedriver = current as PhysicalPed;
                            if (candidatedriver != null)
                            {
                                var target =
                                     from candidatevehicle in units
                                     where candidatevehicle.driverseat != null

                                     // can enter if the seat is full.
                                     // unless we kick them out before ofcourse
                                     where candidatevehicle.driverseat.driver == null

                                     let distance = new __vec2(
                                         (float)(candidatedriver.body.GetPosition().x - candidatevehicle.body.GetPosition().x),
                                         (float)(candidatedriver.body.GetPosition().y - candidatevehicle.body.GetPosition().y)
                                     ).GetLength()

                                     where distance < 6

                                     orderby distance ascending
                                     select new { candidatevehicle, distance };

                                target.FirstOrDefault().With(
                                    x =>
                                    {
                                        Console.WriteLine(new { x.distance });

                                        __raise_enterorexit(
                                           "" + this.sessionid,
                                           candidatedriver.Identity,
                                           x.candidatevehicle.Identity
                                       );

                                        //current.loc.visible = false;
                                        current.body.SetActive(false);

                                        x.candidatevehicle.driverseat.driver = candidatedriver;
                                        candidatedriver.seatedvehicle = x.candidatevehicle;

                                        move_zoom = 1;
                                        current = x.candidatevehicle;





                                        //if (current.body.GetType() == Box2D.Dynamics.b2Body.b2_dynamicBody)
                                        //{
                                        //    hud.texture = textures_ped.hud_look_goggles();
                                        //}
                                        //else
                                        //{
                                        //    hud.texture = textures_ped.hud_look_building();
                                        //}

                                        //switchto(x.x);

                                        // fast start
                                        //(current as PhysicalHind).With(
                                        //    hind => hind.VerticalVelocity = 1
                                        //);
                                    }
                                );
                            }
                            else
                            {
                                (current.driverseat.driver as PhysicalPed).With(
                                    driver =>
                                    {
                                        // stop the vehicle
                                        current.SetVelocityFromInput(new KeySample());

                                        // get out of the lift..
                                        current.driverseat.driver = null;

                                        driver.seatedvehicle = null;
                                        driver.body.SetActive(true);


                                        // crashland?
                                        //(current as PhysicalHind).With(
                                        //    hind => hind.VerticalVelocity = -1
                                        //);

                                        __raise_enterorexit(
                                             "" + this.sessionid,
                                             current.Identity,
                                             driver.Identity
                                         );

                                        current = driver;
                                        //hud.texture = textures_ped.hud_look();
                                        move_zoom = 1;
                                    }
                                );
                            }

                        }
                    }
                    #endregion



                    current.SetVelocityFromInput(__keyDown);

                    #region simulate a weapone!
                    if (__keyDown[System.Windows.Forms.Keys.ControlKey])
                        if (syncframeid % 3 == 0)
                        {
                            (this.current as PhysicalHindWeaponized).With(
                                h =>
                                {
                                    //sb.snd_missleLaunch.play();

                                    h.FireRocket();
                                }
                            );

                        }
                    #endregion

                    __raise_SetVelocityFromInput(
                         "" + sessionid,
                         current.Identity,
                         "" + current.CurrentInput.value,
                         "" + current.body.GetPosition().x,
                         "" + current.body.GetPosition().y,
                         "" + current.body.GetAngle()
                     );


                    // tell others this sync frame ended for us
                    __raise_sync("" + sessionid);
                };


            };
        }