public void InitializeCompass() { var compass = Assets.Default.compasscolor; var container = new Sprite(); container.alpha = 0; CompassContainer = container; compass.AttachTo(container); container.AttachTo(HudContainer); Action Update = delegate { // compass must show us where the goal is var delta = new Point(maze.Width - 1.5 - EgoView.ViewPositionX, maze.Height - 1.5 - EgoView.ViewPositionY); container.rotation = (delta.GetRotation() - EgoView.ViewDirection).RadiansToDegrees(); }; EgoView.ViewDirectionChanged += Update; EgoView.ViewPositionChanged += Update; Update(); compass.scaleX = 0.5; compass.scaleY = 0.5; compass.x = -compass.width / 2; compass.y = -compass.height / 2; container.filters = new[] { new ScriptCoreLib.ActionScript.flash.filters.DropShadowFilter() }; container.x = DefaultControlWidth - compass.width / 2; container.y = compass.height / 2; }
public void Update(double x, double y, double left, double right) { RelativePosition = new Point { x = Sprite.Position.x - x, y = Sprite.Position.y - y }; Direction = RelativePosition.GetRotation(); Distance = RelativePosition.length; ViewInfo.Left = left; ViewInfo.Right = right; ViewInfo.Target = Direction; ViewInfo.Update(); }
public FlashTowerDefenseSized(int DefaultWidth, int DefaultHeight) { var bg = new Sprite { x = 0, y = 0 }; //bg.graphics.beginFill(0xffffff); //bg.graphics.beginFill(0x808080); //bg.graphics.drawRect(0, 0, Width / 2, Height); var warzone = new Sprite { x = 0, y = 0 }; warzone.graphics.beginFill(ColorWhite); warzone.graphics.drawRect(-OffscreenMargin, -OffscreenMargin, DefaultWidth + 2 * OffscreenMargin, DefaultHeight + 2 * OffscreenMargin); warzone.mouseChildren = false; GetWarzone = () => warzone; bg.AttachTo(GetWarzone()); warzone.AttachTo(this); #region create aim this.Aim = new Shape(); Aim.graphics.lineStyle(4, 0, 1); Aim.graphics.moveTo(-8, 0); Aim.graphics.lineTo(8, 0); Aim.graphics.moveTo(0, -8); Aim.graphics.lineTo(0, 8); Aim.filters = new[] { new DropShadowFilter() }; Aim.AttachTo(GetWarzone()); #endregion #region BlurWarzoneOnHover this.BlurWarzoneOnHover = (txt, HideAim) => { txt.mouseOver += delegate { if (!txt.mouseEnabled) return; txt.textColor = ColorBlue; txt.filters = null; if (CanFire) { warzone.filters = new[] { new BlurFilter() }; if (HideAim) Aim.visible = false; } }; txt.mouseOut += delegate { txt.filters = new[] { new BlurFilter() }; txt.textColor = ColorBlack; if (CanFire) { warzone.filters = null; if (HideAim) Aim.visible = true; } }; }; #endregion #region ScoreBoard var ScoreBoard = new TextField { x = 24, y = 24, defaultTextFormat = new TextFormat { size = 12 }, autoSize = TextFieldAutoSize.LEFT, text = "Defend yourself by shooting those mad sheep.", filters = new[] { new BlurFilter() }, selectable = false, }; //ScoreBoard.AttachTo(this); BlurWarzoneOnHover(ScoreBoard, true); #endregion Action<double, Action> Times = (m, h) => (DefaultWidth * DefaultHeight * m).Times(h); Action<double, Func<BitmapAsset>> AddDoodads = (m, GetImage) => Times(m, () => GetImage().AttachTo(bg).SetCenteredPosition(DefaultWidth.Random(), DefaultHeight.Random())); AddDoodads(0.0001, () => Images.grass1.ToBitmapAsset()); AddDoodads(0.00005, () => Images.bump2.ToBitmapAsset()); Action StartIngameMusic = delegate { if (this.IngameMusic != null) this.IngameMusic.stop(); this.IngameMusic = Sounds.snd_world.ToSoundAsset().play(0, 999, new SoundTransform(IngameMusicVolume)); }; StartIngameMusic(); Func<Animation> AddCactus = () => new Animation(null, Images.img_cactus) { FrameRate = 1000 / 7, AnimationEnabled = true }; Action<double> AddCactusAt = y => { var x = DefaultWidth.Random(); AddCactus().AttachTo(GetWarzone()).MoveTo( x, y + Math.Cos(x + y) * DefaultHeight * 0.03); }; (3 + 3.Random()).Times(AddCactusAt.FixParam(DefaultHeight * 0.06)); (3 + 3.Random()).Times(AddCactusAt.FixParam(DefaultHeight * 0.94)); PrebuiltTurret = new Animation(Images.img_turret1_gunfire_180, Images.img_turret1_gunfire_180_frames); PrebuiltTurret.x = (DefaultWidth - PrebuiltTurret.width) * 0.9; PrebuiltTurret.y = (DefaultHeight - PrebuiltTurret.height) / 2; PrebuiltTurret.AttachTo(GetWarzone()); #region Messages var ActiveMessages = new List<TextField>(); var ShowMessageNow = default(Action<string, Action>); ShowMessageNow = (MessageText, Done) => { var p = new TextField { textColor = ColorWhite, background = true, backgroundColor = ColorBlack, filters = new[] { new GlowFilter(ColorBlack) }, autoSize = TextFieldAutoSize.LEFT, text = MessageText, mouseEnabled = false }; var y = DefaultHeight - p.height - 32; p.AddTo(ActiveMessages).AttachTo(this).MoveTo((DefaultWidth - p.width) / 2, DefaultHeight); Sounds.snd_message.ToSoundAsset().play(); var MessagesToBeMoved = (from TheMessage in ActiveMessages select new { TheMessage, y = TheMessage.y - TheMessage.height }).ToArray(); (1000 / 24).AtInterval( t => { foreach (var i in MessagesToBeMoved) { if (i.TheMessage.y > i.y) i.TheMessage.y -= 4; } p.y -= 4; if (p.y < y) { t.stop(); if (Done != null) Done(); 9000.AtDelayDo( () => p.RemoveFrom(ActiveMessages).FadeOutAndOrphanize(1000 / 24, 0.21) ); } } ); }; var QueuedMessages = new Queue<string>(); this.ShowMessage = Text => { if (QueuedMessages.Count > 0) { QueuedMessages.Enqueue(Text); return; } // not busy QueuedMessages.Enqueue(Text); var NextQueuedMessages = default(Action); NextQueuedMessages = () => ShowMessageNow(QueuedMessages.Peek(), delegate { QueuedMessages.Dequeue(); if (QueuedMessages.Count > 0) NextQueuedMessages(); } ); NextQueuedMessages(); }; #endregion var StatusBar = new Sprite { mouseEnabled = false, mouseChildren = false, }.MoveTo(DefaultWidth - 96, DefaultHeight - 64).AttachTo(this); #region WeaponBar var WeaponBar = new Sprite { }.AttachTo(StatusBar); var AmmoAvatar = new Sprite().MoveTo(38, 24).AttachTo(WeaponBar); Images.Avatars.avatars_ammo.ToBitmapAsset().MoveToCenter().AttachTo(AmmoAvatar); var AmmoText = new TextField { defaultTextFormat = new TextFormat { bold = true, size = 20, font = "_sans" }, text = "200000", filters = new[] { new GlowFilter(ColorBlack, 0.5) }, autoSize = TextFieldAutoSize.RIGHT, x = 0, width = 0 }.AttachTo(AmmoAvatar); var WeaponAvatar = new Sprite().AttachTo(WeaponBar); #endregion var CurrentTarget = default(Point); var CurrentTargetTimer = default(Timer); #region Ego Ego = new PlayerWarrior { filters = new[] { new GlowFilter(ColorGreen) } }; EgoIsOnTheField = () => Ego.parent != null; EgoIsAlive = () => Ego.IsAlive; Func<bool> EgoCanManTurret = () => !PrebuiltTurretInUse; // look up if there is somebody else in it Func<bool> EgoIsCloseToTurret = () => new Point { x = Ego.x - PrebuiltTurret.x, y = Ego.y - PrebuiltTurret.y }.length < 32; var EgoAimDistance = 48; var EgoAimMoveSpeed = 0.1; var EgoMoveSpeed = 3.0; var EgoMoveToMouseTarget = false; UpdateEgoAim = delegate { Aim.MoveTo(Ego.x + Math.Cos(EgoAimDirection) * EgoAimDistance, Ego.y + Math.Sin(EgoAimDirection) * EgoAimDistance); }; EgoMovedSlowTimer = new Timer(200, 1); Ego.FoundNewWeapon += weapon => ShowMessage("You found " + weapon.Name); Ego.FoundMoreAmmo += weapon => ShowMessage("Got ammo for " + weapon.Name); Action Reorder = delegate { #if Z GetWarzone().Children().OrderBy(i => (double)i.y). ForEach( (k, i) => k.parent.setChildIndex(k, i) ); #endif }; Action ReorderThrottle = Reorder.ThrottleTo(1000); var EgoMoveUpTimer = (1000 / 30).AtInterval( delegate { if (EgoMoveToMouseTarget) { var p = new Point { x = CurrentTarget.x - Ego.x, y = CurrentTarget.y - Ego.y }; if (p.length <= EgoMoveSpeed) { // run one the pointer return; } Ego.MoveToArc(p.GetRotation(), EgoMoveSpeed); } else Ego.MoveToArc(EgoAimDirection, EgoMoveSpeed); Ego.x = Math.Min(Math.Max(Ego.x, 0), DefaultWidth); Ego.y = Math.Min(Math.Max(Ego.y, 0), DefaultHeight); ReorderThrottle(); UpdateEgoAim(); EgoMovedSlowTimer.start(); // we moved now let's check for boxes foreach (var BoxToTake in from ss in Boxes where new Point { x = Ego.x - ss.x, y = Ego.y - ss.y }.length < 32 select ss) { BoxToTake.RemoveFrom(Boxes).Orphanize(); Sounds.sound20.ToSoundAsset().play(); if (BoxToTake.WeaponInside == null) { // add stuff, so the player doesn't get bored:D // maybe implment them too? see Diablo. var PowerUps = new[] { // gta "Double Damage", "Fast Reload", "Respect", "Armour", // diablo "Defense", "Mana", "Dexerity", "Experience", "Stamina", "Strength", "Life", "Replenish Life" }; ShowMessage("+1 " + PowerUps.Random()); } else { Ego.AddWeapon(BoxToTake.WeaponInside); } if (NetworkTakeCrate != null) NetworkTakeCrate(BoxToTake.NetworkId); } }); EgoMoveUpTimer.stop(); var EgoAimMoveTimer = (1000 / 30).AtInterval( delegate { EgoAimDirection += EgoAimMoveSpeed * EgoMoveSpeed; if (EgoAimDirection < 0) EgoAimDirection += Math.PI * 4; EgoAimDirection %= Math.PI * 2; UpdateEgoAim(); }); EgoAimMoveTimer.stop(); #endregion Ego.CurrentWeaponChanged += delegate { Sounds.SelectWeapon.ToSoundAsset().play(); if (WeaponAvatar.numChildren > 0) WeaponAvatar.getChildAt(0).Orphanize(); Ego.CurrentWeapon.Type.Avatar.ToBitmapAsset().MoveToCenter().AttachTo(WeaponAvatar); WeaponBar.filters = new[] { new GlowFilter(Ego.CurrentWeapon.Color) }; }; Ego.CurrentWeaponAmmoChanged += () => AmmoText.text = "" + Ego.CurrentWeapon.Ammo; SetDefaultWeapon(); Ego.Die += () => { ShowMessage("Meeeediiic!"); ShowMessage("You died a painful death"); PlayerWarrior.AutoResurrectDelay.AtDelayDo( delegate { Ego.Revive(); if (EgoResurrect != null) EgoResurrect(); } ); }; #region HealthBar var HealthBar = new Sprite { filters = new[] { new GlowFilter(ColorRed) } }.MoveTo(-20, 0).AttachTo(StatusBar); var Hearts = new[] { Images.Avatars.avatars_heart.ToBitmapAsset().MoveToArc(20.DegreesToRadians(), 90).AttachTo(HealthBar), Images.Avatars.avatars_heart.ToBitmapAsset().MoveToArc(7.DegreesToRadians(), 90).AttachTo(HealthBar), Images.Avatars.avatars_heart.ToBitmapAsset().MoveToArc(353.DegreesToRadians(), 90).AttachTo(HealthBar), Images.Avatars.avatars_heart.ToBitmapAsset().MoveToArc(340.DegreesToRadians(), 90).AttachTo(HealthBar), }; var EgoHeartBeat = default(SoundChannel); Ego.HealthChanged += delegate { if (EgoHeartBeat == null) { EgoHeartBeat = Sounds.heartbeat3.ToSoundAsset().play(); EgoHeartBeat.soundComplete += e => { EgoHeartBeat = null; }; } if (Ego.Health > 0) { var z = (Ego.Health / Ego.MaxHealth) * Hearts.Length; var f = Math.Floor(z).ToInt32(); var a = z % 1; for (int i = 0; i < f; i++) { Hearts[i].alpha = 1; } if (f < Hearts.Length) { Hearts[f].alpha = a; for (int i = f + 1; i < Hearts.Length; i++) { Hearts[i].alpha = 0; } } } else { for (int i = 0; i < Hearts.Length; i++) { Hearts[i].alpha = 0; } } //ShowMessage("h: " + f + " " + a); }; #endregion var PrebuiltTurretSound = default(SoundChannel); var runaways = 0; var score = 0; Action UpdateScoreBoard = delegate { if (!CanFire) return; ScoreBoard.text = new { runaways, gore = (100 * (double)BadGuys.Count(i => !i.IsAlive) / (double)BadGuys.Count()).Round() + "%", score, level = CurrentLevel }.ToString(); }; Action<Point> DoMachineGunFire = e => { if (Ego.CurrentWeapon.Ammo <= 0) return; Ego.CurrentWeapon.Ammo--; var DamagePointOfOrigin = new Point { x = PrebuiltTurret.x, y = PrebuiltTurret.y }; var DamageDirection = new Point { x = e.x - PrebuiltTurret.x, y = e.y - PrebuiltTurret.y }.GetRotation(); DoSomeDamage(DamagePointOfOrigin, DamageDirection, WeaponInfo.Machinegun); if (Ego.CurrentWeapon.Ammo <= 0) { Sounds.OutOfAmmo.ToSoundAsset().play(); PrebuiltTurret.AnimationEnabled = false; return; } }; PrebuiltTurret.AnimationEnabledChanged += delegate { if (PrebuiltTurret.AnimationEnabled) { if (PrebuiltTurretSound == null) PrebuiltTurretSound = Sounds.gunfire.ToSoundAsset().play(0, 999); PrebuiltTurret.filters = new[] { new GlowFilter() }; } else { if (PrebuiltTurretSound != null) PrebuiltTurretSound.stop(); PrebuiltTurretSound = null; PrebuiltTurret.filters = null; } }; GetWarzone().mouseDown += e => { if (!CanFire) return; // the turret cannot fire without a man behind it if (EgoIsOnTheField()) return; if (Ego.CurrentWeapon.Ammo <= 0) { Sounds.OutOfAmmo.ToSoundAsset().play(); return; } PrebuiltTurret.AnimationEnabled = true; var p = new Point { x = e.stageX, y = e.stageY, }; CurrentTarget = this.globalToLocal(p); CurrentTargetTimer = (1000 / 10).AtInterval( delegate { if (!PrebuiltTurret.AnimationEnabled) { CurrentTargetTimer.stop(); return; } DoMachineGunFire(CurrentTarget); } ); }; GetWarzone().mouseUp += e => { PrebuiltTurret.AnimationEnabled = false; }; GetWarzone().mouseOut += delegate { PrebuiltTurret.AnimationEnabled = false; }; GetWarzone().mouseMove += e => { if (!CanFire) return; var p = new Point { x = e.stageX, y = e.stageY, }; CurrentTarget = this.globalToLocal(p); if (EgoIsOnTheField()) { Mouse.show(); return; } Mouse.hide(); Aim.x = CurrentTarget.x; Aim.y = CurrentTarget.y; }; Func<double> GetEntryPointY = () => (DefaultHeight * 0.8).FixedRandom() + DefaultHeight * 0.1; #region AttachRules Func<Actor, Actor> AttachRules = a => { if (a == null) throw new Exception("AttachRules"); var an = a; //Console.WriteLine("attached KilledByLocalPlayer"); a.KilledByLocalPlayer += delegate { //Console.WriteLine("KilledByLocalPlayer: " + an.ScoreValue); if (NetworkAddKillScore != null) NetworkAddKillScore(an.ScoreValue); }; if (a.NetworkId == 0) { a.NetworkId = int.MaxValue.FixedRandom(); if (0.5.ByChance()) { a.Crate = new Crate { NetworkId = int.MaxValue.FixedRandom() }.AddTo(Boxes); if (0.7.ByChance()) { // add random weapon, note that this is // not a fixed random, so each player // gets different weapon a.Crate.WeaponInside = Weapon.PredefinedWeapons.Random().Clone(); } } } a.CorpseAndBloodGone += () => BadGuys.Remove(a); a.Moved += delegate { if (a.x > (DefaultWidth + OffscreenMargin)) { a.Crate = null; a.RemoveFrom(BadGuys).Orphanize(); if (CanFire) { WaveEndCountdown--; runaways++; ScoreBoard.textColor = ColorRed; UpdateScoreBoard(); } a.IsAlive = false; // this one was able to run away } }; a.Die += delegate { WaveEndCountdown--; score += a.ScoreValue; UpdateScoreBoard(); if (a.Crate != null) { a.Crate.MoveTo(a.x, a.y).AttachTo(GetWarzone()); } }; a.AttachTo(GetWarzone()).AddTo(BadGuys); if (a.PlayHelloSound != null) a.PlayHelloSound(); return a; }; #endregion Action EgoTakeNextWeapon = () => Ego.CurrentWeapon = Ego.OtherWeaponsLikeCurrent.Next(i => i == Ego.CurrentWeapon); Action EgoTakePreviousWeapon = () => Ego.CurrentWeapon = Ego.OtherWeaponsLikeCurrent.Previous(i => i == Ego.CurrentWeapon); GetWarzone().mouseWheel += e => { if (e.delta > 0) EgoTakeNextWeapon(); else EgoTakePreviousWeapon(); }; var EgoMoveToMouseTargetAntiDoubleClick = default(Timer); GetWarzone().mouseDown += e => { if (!EgoIsOnTheField()) return; if (!EgoIsAlive()) return; var pp = new Point { x = e.stageX, y = e.stageY, }; CurrentTarget = this.globalToLocal(pp); var p = new Point { x = CurrentTarget.x - Ego.x, y = CurrentTarget.y - Ego.y }; EgoAimDirection = p.GetRotation(); UpdateEgoAim(); EgoMoveToMouseTarget = true; EgoMoveToMouseTargetAntiDoubleClick = 200.AtDelayDo( delegate { if (!EgoIsAlive()) { Ego.RunAnimation = false; EgoMoveUpTimer.stop(); return; } if (!EgoMoveToMouseTarget) return; Ego.RunAnimation = true; EgoMoveSpeed = 2.5; EgoMoveUpTimer.start(); } ); }; GetWarzone().mouseMove += e => { if (!EgoMoveToMouseTarget) return; if (!EgoIsOnTheField()) return; if (!EgoIsAlive()) return; var pp = new Point { x = e.stageX, y = e.stageY, }; CurrentTarget = this.globalToLocal(pp); var p = new Point { x = CurrentTarget.x - Ego.x, y = CurrentTarget.y - Ego.y }; EgoAimDirection = p.GetRotation(); UpdateEgoAim(); }; GetWarzone().mouseUp += e => { if (!EgoMoveToMouseTarget) return; if (!EgoIsAlive()) return; if (EgoMoveToMouseTargetAntiDoubleClick != null) { EgoMoveToMouseTargetAntiDoubleClick.stop(); EgoMoveToMouseTargetAntiDoubleClick = null; } EgoMoveUpTimer.stop(); Ego.RunAnimation = false; EgoMoveToMouseTarget = false; }; GetWarzone().doubleClickEnabled = true; GetWarzone().doubleClick += e => { if (!EgoIsOnTheField()) return; if (!EgoIsAlive()) return; var pp = new Point { x = e.stageX, y = e.stageY, }; CurrentTarget = this.globalToLocal(pp); EgoAimDirection = new Point { x = CurrentTarget.x - Ego.x, y = CurrentTarget.y - Ego.y }.GetRotation(); UpdateEgoAim(); EgoDoFireWeapon(); }; Action StageIsReady = delegate { //stage.scaleMode = StageScaleMode.NO_BORDER; // multiplay ? var WeaponShortcutButtons = new[] { Keyboard.NUMBER_1, Keyboard.NUMBER_2, Keyboard.NUMBER_3, Keyboard.NUMBER_4, Keyboard.NUMBER_5, Keyboard.NUMBER_6, Keyboard.NUMBER_7, Keyboard.NUMBER_8, Keyboard.NUMBER_9, Keyboard.NUMBER_0, }.Select( (Button, Index) => new KeyboardButton(stage) { Buttons = new[] { Button }, Filter = EgoIsAlive, Up = () => Ego.CurrentWeapon = Ego.OtherWeaponsLikeCurrent.AtOrDefault(Index, Ego.CurrentWeapon) } ).ToArray(); var KeySpace = new KeyboardButton(stage) { Buttons = new[] { Keyboard.SPACE }, Filter = EgoIsOnTheField.And(EgoIsAlive), Up = delegate { // car brakes, open door, take item // Add Ammo foreach (var BarrelToTake in this.Barrels.Where(i => (i.ToPoint() - Ego.ToPoint()).length < 32)) { Sounds.sound20.ToSoundAsset().play(); Ego.AddWeapon(BarrelToTake.ExplosiveMaterialType); BarrelToTake.RemoveFrom(Barrels).Orphanize(); if (NetworkUndeployExplosiveBarrel != null) NetworkUndeployExplosiveBarrel(BarrelToTake.NetworkId); } } }; var KeyLeft = new KeyboardButton(stage) { Groups = new[] { MovementWASD[Keyboard.A], MovementArrows[Keyboard.LEFT], }, Filter = EgoIsOnTheField.And(EgoIsAlive), Down = delegate { EgoAimMoveSpeed = -0.1; EgoAimMoveTimer.start(); }, Up = EgoAimMoveTimer.stop, }; var KeyRight = new KeyboardButton(stage) { Groups = new[] { MovementWASD[Keyboard.D], MovementArrows[Keyboard.RIGHT], }, Filter = EgoIsOnTheField.And(EgoIsAlive), Down = delegate { EgoAimMoveSpeed = +0.1; EgoAimMoveTimer.start(); }, Up = EgoAimMoveTimer.stop, }; var KeyUp = new KeyboardButton(stage) { Groups = new[] { MovementWASD[Keyboard.W], MovementArrows[Keyboard.UP], }, Filter = EgoIsOnTheField.And(EgoIsAlive), Down = delegate { if (!Ego.IsAlive) return; Ego.RunAnimation = true; EgoMoveSpeed = 2.5; EgoMoveUpTimer.start(); }, Up = delegate { EgoMoveUpTimer.stop(); Ego.RunAnimation = false; } }; var KeyDown = new KeyboardButton(stage) { Groups = new[] { MovementWASD[Keyboard.S], MovementArrows[Keyboard.DOWN], }, Filter = EgoIsOnTheField.And(EgoIsAlive), Down = delegate { if (!Ego.IsAlive) return; Ego.RunAnimation = true; EgoMoveSpeed = -1.5; EgoMoveUpTimer.start(); }, Up = delegate { EgoMoveSpeed = 1; EgoMoveUpTimer.stop(); Ego.RunAnimation = false; } }; var KeyWeaponNext = new KeyboardButton(stage) { Groups = new[] { MovementWASD[Keyboard.X], MovementArrows[Keyboard.PAGE_UP], }, Up = EgoTakeNextWeapon, }; var KeyWeaponPrevious = new KeyboardButton(stage) { Groups = new[] { MovementWASD[Keyboard.Z], MovementArrows[Keyboard.PAGE_DOWN], }, Up = EgoTakePreviousWeapon }; var KeyControl = new KeyboardButton(stage) { Groups = new[] { MovementWASD[ new KeyboardKeyInfo { Button = Keyboard.CONTROL, Location = KeyLocation.LEFT } ], MovementArrows[ new KeyboardKeyInfo { Button = Keyboard.CONTROL, Location = KeyLocation.RIGHT } ], }, Filter = EgoIsOnTheField.And(EgoIsAlive), Up = EgoDoFireWeapon }; var KeyMusic = new KeyboardButton(stage) { Buttons = new[] { Keyboard.M }, Up = () => ToggleMusic() }; var KeyEnter = new KeyboardButton(stage) { Groups = new[] { MovementWASD[Keyboard.F], MovementArrows[Keyboard.ENTER], }, Filter = EgoIsAlive, Up = delegate { if (EgoIsOnTheField()) { if (EgoIsCloseToTurret()) { if (EgoCanManTurret()) { Ego.Orphanize(); Ego.RunAnimation = false; EgoMoveUpTimer.stop(); EgoAimMoveTimer.stop(); PrebuiltTurretBlinkTimer.stop(); PrebuiltTurret.alpha = 1; Ego.CurrentWeapon = Ego.Weapons.FirstOrDefault(i => i.SelectMode == Weapon.SelectModeEnum.Turret); ShowMessage("Machinegun manned!"); Mouse.hide(); if (CurrentTarget != null) { Aim.x = CurrentTarget.x; Aim.y = CurrentTarget.y; } Sounds.door_open.ToSoundAsset().play(); if (EgoEnteredMachineGun != null) EgoEnteredMachineGun(); } else { ShowMessage("Cannot man the machinegun!"); } } else { ShowMessage("The machinegun is too far! Get closer!"); } } else { Sounds.door_open.ToSoundAsset().play(); ShowMessage("Machinegun unmanned!"); TeleportEgoNearTurret(); PrebuiltTurret.AnimationEnabled = false; PrebuiltTurret.alpha = 0.5; Mouse.show(); PrebuiltTurretBlinkTimer.start(); if (EgoExitedMachineGun != null) EgoExitedMachineGun(); } } }; }; PrebuiltTurretBlinkTimer = 500.AtInterval(t => PrebuiltTurret.alpha = ((t.currentCount % 2) + 1) / 2); PrebuiltTurretBlinkTimer.stop(); #region readiness if (stage == null) { this.addedToStage += delegate { StageIsReady(); }; } else { StageIsReady(); } #endregion //Mouse.hide(); ShowMessage("Aim at the enemy unit and hold down the mouse!"); ShowMessage("Press 'Enter' to exit the machinegun"); //ShowMessage("Day " + CurrentLevel); GameEvent = delegate { // do not add if the day is over... //if (WaveEndCountdown <= 0) // return; AddNewActorsToMap(UpdateScoreBoard, GetEntryPointY, AttachRules); }; ReportDays = delegate { if (WaveEndCountdown < 0) { if (InterlevelMusic == null) { InterlevelMusic = Sounds.snd_birds.ToSoundAsset().play(0, 999); ShowMessage("Day " + CurrentLevel + " is ending..."); if (GameInterlevelBegin != null) GameInterlevelBegin(); } if (WaveEndsWhenAllBadGuysAreDead) { // wait for all actors get off stage if (BadGuys.Where(i => i.IsAlive).Any()) return; } // show "level END" ShowMessage("Day " + CurrentLevel + " Survived!"); ReportDaysTimer.stop(); InterlevelTimeout.AtDelayDo( delegate { if (GameInterlevelEnd != null) GameInterlevelEnd(); // maybe higher levels will have more enemies? WaveEndCountdown = 15; CurrentLevel++; // show "level START" ShowMessage("Day " + CurrentLevel); ReportDaysTimer.start(); var InterlevelMusicStopping = InterlevelMusic; InterlevelMusic = null; 2000.AtDelayDoOnRandom(InterlevelMusicStopping.stop); } ); UpdateScoreBoard(); return; } if (CanAutoSpawnEnemies) { // new actors if we got less 10 if (InterlevelMusic != null) return; if (BadGuys.Where(i => i.IsAlive).Count() < 8) { GameEvent(); } } }; ReportDaysTimer = 1500.AtIntervalDo(ReportDays); (1000 / 15).AtInterval( delegate { Aim.rotation += 1; foreach (var s in from ss in BadGuys where ss.IsAlive select ss) s.x += s.speed; } ); //#region powered_by_jsc //var powered_by_jsc = new TextField //{ // x = 32, // defaultTextFormat = new TextFormat // { // size = 24 // }, // autoSize = TextFieldAutoSize.LEFT, // // how to make a link // // http://www.actionscript.com/Article/tabid/54/ArticleID/actionscript-quick-tips-and-gotchas/Default.aspx // htmlText = "<a href='http://jsc.sf.net' target='_blank'>powered by <b>jsc</b></a>", // selectable = false, // filters = new[] { new BlurFilter() }, // textColor = ColorBlack //}.AttachTo(this); //powered_by_jsc.y = DefaultHeight - powered_by_jsc.height - 32; //// make it fade/show in time //200.AtInterval(t => // { // var a = (Math.Sin(t.currentCount * 0.05) + 1) * 0.5; // powered_by_jsc.alpha = a; // powered_by_jsc.mouseEnabled = a > 0.8; // } //); //#endregion ScoreBoard.AttachTo(this); //BlurWarzoneOnHover(powered_by_jsc, true); 40000.AtIntervalOnRandom( delegate { Sounds.snd_bird2.ToSoundAsset().play(); } ); #region music on off var MusicButton = new Sprite { x = DefaultWidth - 32, y = 32, filters = new[] { new GlowFilter(ColorBlueLight) }, }; var MusicOn = Images.music_on.ToBitmapAsset().MoveToCenter(); var MusicOff = Images.music_off.ToBitmapAsset().MoveToCenter(); MusicButton.mouseOver += delegate { Mouse.show(); Aim.visible = false; }; MusicButton.mouseOut += delegate { Mouse.hide(); Aim.visible = true; }; ToggleMusic = delegate { if (MusicOn.parent == MusicButton) { MusicOn.Orphanize(); MusicOff.AttachTo(MusicButton); ShowMessage("Music silenced"); IngameMusic.soundTransform = new SoundTransform(0); } else { IngameMusic.soundTransform = new SoundTransform(IngameMusicVolume); ShowMessage("Music activated"); MusicOff.Orphanize(); MusicOn.AttachTo(MusicButton); } }; MusicButton.click += delegate { ToggleMusic(); }; MusicOn.AttachTo(MusicButton); MusicButton.AttachTo(this); #endregion Action<InteractiveObject, InteractiveObject> OnMouseDownDisableMouseOnTarget = (subject, target) => { subject.mouseDown += delegate { target.mouseEnabled = false; }; subject.mouseUp += delegate { target.mouseEnabled = true; }; }; OnMouseDownDisableMouseOnTarget(GetWarzone(), MusicButton); OnMouseDownDisableMouseOnTarget(GetWarzone(), ScoreBoard); //OnMouseDownDisableMouseOnTarget(GetWarzone(), powered_by_jsc); }
private void DoSomeDamage(Point DamagePointOfOrigin, double DamageDirection, WeaponInfo Weapon) { ShowBulletsFlying(DamagePointOfOrigin, DamageDirection, Weapon); if (NetworkShowBulletsFlying != null) NetworkShowBulletsFlying( DamagePointOfOrigin.x.ToInt32(), DamagePointOfOrigin.y.ToInt32(), DamageDirection.RadiansToDegrees(), Weapon.NetworkId ); var AllMortals = this.AllMortals.ToArray(); //Console.WriteLine("mortals in warzone: " + AllMortals.Length); foreach (var DeadManWalking in AllMortals) { var DamageThisDude = true; // why bother shooting itself? if (DeadManWalking == Ego) if (!Weapon.CanHurtEgo) DamageThisDude = false; if (!DeadManWalking.IsAlive) DamageThisDude = false; if (DamageThisDude) { var Location = new Point { x = DamagePointOfOrigin.x, y = DamagePointOfOrigin.y }.MoveToArc(DamageDirection, -32); var Offset = new Point { y = DeadManWalking.y - Location.y, x = DeadManWalking.x - Location.x }; var Arc = Offset.GetRotation(); var Distance = Offset.length; Func<double, double> Warp = i => i % (Math.PI * 2); var LessThan = Arc < (Warp(DamageDirection) + Weapon.ArcRange); var MoreThan = Arc > (Warp(DamageDirection) - Weapon.ArcRange); var Hit = LessThan && MoreThan; if (Distance < Weapon.Range) if (Hit) { // calculate damage variation here based on hit approximity DeadManWalking.AddDamageFromDirection(Weapon.Damage, Arc, true); if (NetworkAddDamageFromDirection != null) NetworkAddDamageFromDirection( DeadManWalking.NetworkId, Weapon.Damage, Arc.RadiansToDegrees() ); } } } }
public Tycoon4(Action<Tycoon4> yield) { Native.Document.body.style.overflow = IStyle.OverflowEnum.hidden; Native.Document.body.style.color = Color.White; Native.Document.body.style.backgroundColor = Color.Black; //var info_text = // ((ApplicationDescriptionAttribute)typeof(Tycoon4).GetCustomAttributes(typeof(ApplicationDescriptionAttribute), false).Single()).Description; var infoc = new IHTMLDiv(); new fullbox().AttachTo(infoc); var info = new IHTMLCode().AttachTo(infoc); infoc.style.SetLocation(4, 4, Native.window.Width - 8, 0); infoc.style.height = "auto"; info.style.Float = IStyle.FloatEnum.right; var paused = false; var ZeroPoint = new Point<double>(); // http://en.wikipedia.org/wiki/Isometric_projection // http://en.wikipedia.org/wiki/Dimetric_projection // http://en.wikipedia.org/wiki/Axonometric_projection // http://en.wikipedia.org/wiki/First_angle_projection // http://en.wikipedia.org/wiki/3/4_perspective var RotationA = 45.ToRadians(); var RotationB = 0.5; var Zoom = 1; var Dot = 4; var MapSize = new Rectangle { Left = -12, Width = 24, Top = -12, Height = 24 }; var MapMargins = new Point ( 4, 4 ); var bg_size = new { w = (64 * Zoom).ToInt32(), h = (32 * Zoom).ToInt32() }; Func<Point<double>> GetCenter = () => new Point<double> { X = bg_size.w * (MapSize.Width + MapMargins.X) / 2 /*Native.Window.Width / 2*/, Y = bg_size.h * (MapSize.Height + MapMargins.Y) / 2 /*Native.Window.Height / 2*/ }; var arena = new ArenaControl(); arena.Control.AttachToDocument(); arena.Layers.Canvas.style.backgroundColor = Color.FromRGB(0, 0, 0); //arena.SetCanvasViewCenter(); arena.SetCanvasSize(new Point( ((MapSize.Width + +MapMargins.X) * bg_size.w).ToInt32(), ((MapSize.Height + +MapMargins.Y) * bg_size.h).ToInt32() )); var PauseFog = new IHTMLDiv().AttachTo(arena.Layers.Info); PauseFog.style.backgroundColor = Color.Black; PauseFog.style.Opacity = 1; PauseFogTween = new TweenDataDouble( delegate { } ) { Value = 1 }; PauseFogTween.ValueChanged += () => PauseFog.style.Opacity = PauseFogTween.Value; #region onresize Action onresize = delegate { infoc.style.SetLocation(4, 4, Native.window.Width - 8, 0); infoc.style.height = "auto"; var rect = Rectangle.Of(0, 0, Native.window.Width, Native.window.Height); arena.SetLocation(rect); PauseFog.style.SetLocation(rect); }; Native.window.onresize += ev => { onresize(); }; onresize(); #endregion infoc.AttachTo(arena.Layers.Info); #region TileResources var TileResources = new { Grass = new { Source = new _0_192x95().src, Height = 32 }, //Rocks = new { Source = new _1().src, Height = 32 }, TileSelector = new { Source = new _3().src, Height = 32 }, RoughLand = new { Source = new _2x192x95().src, Height = 32 }, Dirt = new { Source = new _4_192x95().src, Height = 32 }, //DirtDirtGrass = new { Source = new _5().src, Height = 32 }, //DirtGrassGrass = new { Source = new _6().src, Height = 32 }, Track1 = new { Source = new r2_192x95().src, Height = 32 }, Road2 = new { Source = new r1_192x95().src, Height = 32 }, Road2_Track1 = new { Source = new r3_192x95().src, Height = 32 }, Road1 = new { Source = new r4_192x95().src, Height = 32 }, Road1_Road2 = new { Source = new r5_192x95().src, Height = 32 }, Tree = new { Source = new t1_192x192().src, Height = 64 }, Tree2 = new { Source = new t2_192x192().src, Height = 128 }, House1a = new { Source = new h1a_192x384().src, Height = 128 }, House1b = new { Source = new h1b_192x384().src, Height = 128 }, House1x = new { Source = new h1x_192x384().src, Height = 128 }, //House2 = new { Source = new h2().src, Height = 96 }, //House3 = new { Source = new h3().src, Height = 50 }, //House4 = new { Source = new h4().src, Height = 53 }, //House5a = new { Source = new h5a().src, Height = 33 }, //House5b = new { Source = new h5b().src, Height = 40 }, //House5c = new { Source = new h5c().src, Height = 40 }, //House5 = new { Source = new h5().src, Height = 40 }, //House11a = new { Source = new h11a().src, Height = 89 }, //House11b = new { Source = new h11b().src, Height = 89 }, //House11c = new { Source = new h11c().src, Height = 89 }, //House11x = new { Source = new h11x().src, Height = 89 } }; var TileResourcesList = new[] { TileResources.Grass, //TileResources.Rocks, TileResources.TileSelector, TileResources.RoughLand , TileResources.Dirt , //TileResources.DirtDirtGrass , //TileResources.DirtGrassGrass, TileResources.Track1 , TileResources.Road2 , TileResources.Road2_Track1 , TileResources.Road1 , TileResources.Road1_Road2, TileResources.Tree , TileResources.Tree2 , TileResources.House1a, TileResources.House1b, TileResources.House1x, //TileResources.House2, //TileResources.House3 , //TileResources.House4 , //TileResources.House5a , //TileResources.House5b , //TileResources.House5c , //TileResources.House5 , //TileResources.House11a , //TileResources.House11b , //TileResources.House11c , //TileResources.House11x , }; #endregion var MyFrames_Soldier = new DudeAnimationInfo { Frames_Stand = Frames.WolfSoldier, Frames_Walk = Frames.WolfSoldier_Walk }; var MyFrames_Imp = new DudeAnimationInfo { Frames_Stand = Frames.DoomImp, Frames_Walk = Frames.DoomImp_Walk }; var MyFrames_TwinClone = new DudeAnimationInfo { Frames_Stand = DoomImp, Frames_Walk = DoomImp_Walk }; #region Preloading Action AllImagesLoaded = delegate { }; var ImagesThatAreCurrentlyLoading = new List<IHTMLImage>(); var ImagesThatAreCurrentlyLoadingCounter = 0; //Action<IHTMLImage> LoadingSingleImageDone = img => //{ // ImagesThatAreCurrentlyLoading.Remove(img); // Console.WriteLine("loaded: " + img.src); // if (ImagesThatAreCurrentlyLoading.Count == 0) // AllImagesLoaded(); // else // info.innerText = "Loading images... (" + ImagesThatAreCurrentlyLoading.Count + ")"; //}; info.innerText = "Loading images..."; #region StartLoadingSingleImage Action<IHTMLImage> StartLoadingSingleImage = Image => { ImagesThatAreCurrentlyLoading.Add(Image); Image.InvokeOnComplete(img => { ImagesThatAreCurrentlyLoadingCounter++; }, 30); //LoadingSingleImageDone(Image); }; #endregion #region StartLoadingDudeAnimationInfo Action<DudeAnimationInfo> StartLoadingDudeAnimationInfo = a => { a.Frames_Stand.ForEach(i => StartLoadingSingleImage(i.Image)); a.Frames_Walk.ForEach(j => j.ForEach(i => StartLoadingSingleImage(i.Image))); }; #endregion var Argh = new Argh(); var CloneAffirmative = new EN_000002(); var Affirmative = new Affirmative(); var click = new click(); var Hammertime = new SAMPLES234 { volume = 0.1 }; var Sawtime = new SAMPLES216 { volume = 0.1 }; var StoneHammerTime = new SAMPLES233 { volume = 0.1 }; #endregion #region AllImagesLoaded AllImagesLoaded += delegate { Console.WriteLine("AllImagesLoaded"); info.innerText = "Loading images... done!"; #region Translate Func<double, double, Point<double>> Translate = (_x, _y) => { var _r = ZeroPoint.GetRotation(_x, _y) + RotationA; var _d = ZeroPoint.GetDistance(_x, _y) * bg_size.h * 2d.Sqrt(); _x = Math.Cos(_r) * _d; _y = Math.Sin(_r) * _d * RotationB; return new Point<double> { X = _x, Y = _y }; }; #endregion #region Translator var Translator = new CoordTranslatorBase { ConvertMapToCanvas = map_coords => { var canvas_coords = Translate(map_coords.X, map_coords.Y); var c = GetCenter(); canvas_coords.X += c.X; canvas_coords.Y += c.Y; return canvas_coords; }, ConvertCanvasToMap = canvas => { var c = GetCenter(); var offset = new Point<double> { X = canvas.X - c.X, Y = (canvas.Y - c.Y) / RotationB }; var d = ZeroPoint.GetDistance(offset) / (bg_size.h * 2d.Sqrt()); var r = ZeroPoint.GetRotation(offset) - RotationA; var realoffset = new Point<double> { X = Math.Cos(r) * d, Y = Math.Sin(r) * d }; return realoffset; } }; #endregion #region ApplyPosition Action<double, double, IHTMLDiv> ApplyPosition = (_x, _y, _div) => { try { var _pos = GetCenter(); var p = Translate(_x, _y); var _dot = (Zoom * Dot).ToInt32(); _div.style.SetLocation( (_pos.X + p.X).ToInt32() - _dot / 2, (_pos.Y + p.Y).ToInt32() - _dot / 2, _dot, _dot ); _div.AttachToDocument(); _div.onmouseover += delegate { Native.Document.title = new { _x, _y }.ToString(); }; } catch (Exception ex) { ex.ToConsole(); } }; #endregion #region CreateDiv Func<double, double, IHTMLDiv> CreateDiv = (_x, _y) => { var _div = new IHTMLDiv(); _div.style.backgroundColor = Color.Red; ApplyPosition(_x, _y, _div); return _div; }; #endregion var TileColor = Color.Gray; var TileColor2 = Color.White; var TileColorHouse1 = Color.FromRGB(41, 0, 0); //var TileColorHouse2 = Color.FromRGB(42, 0, 0); //var TileColorHouse3 = Color.FromRGB(43, 0, 0); //var TileColorHouse11 = Color.FromRGB(44, 0, 0); var TileColorTree1 = Color.FromRGB(51, 0, 0); var TileColorTree2 = Color.FromRGB(52, 0, 0); var TileColorTree3 = Color.FromRGB(53, 0, 0); var TileColorRoad1 = Color.FromRGB(61, 0, 0); var TileColorRoad2 = Color.FromRGB(62, 0, 0); var TileColorRoad3 = Color.FromRGB(63, 0, 0); var TileColorTrack1 = Color.FromRGB(70, 0, 0); var TileColorRoadTrack1 = Color.FromRGB(71, 0, 0); var data = new[] { new { x = -0.5, y = -0.5, color = Color.Red }, new { x = 0.5, y = -0.5, color = Color.Green }, new { x = 0.5, y = 0.5, color = Color.Blue }, new { x = -0.5, y = 0.5, color = Color.Yellow }, }; #region IsDefined Func<double, double, bool> IsDefined = (x, y) => data.Any( i => { if (i.x != x) return false; if (i.y != y) return false; return true; } ); #endregion data = data.Concat( from x in Enumerable.Range(MapSize.Left, MapSize.Width + 1) from y in Enumerable.Range(MapSize.Top, MapSize.Height + 1) select new { x = (double)x, y = (double)y, color = TileColor } ).ToArray(); #region CreateNewItemsRandomly Action<int, Color> CreateNewItemsRandomly = (x, c) => x.Times( delegate { var loc = data.Where(i => i.color == TileColor).Random(); data = data.ConcatSingle( new { x = loc.x, y = loc.y, color = c } ).ToArray(); } ); #endregion #region ApplyTileToCanvas Action<double, double, IHTMLImage, double> ApplyTileToCanvas = (x, y, bg, height) => { height *= Zoom; var c = GetCenter(); var p = Translate(x, y); c.X += p.X.ToInt32(bg_size.w / 2); c.Y += p.Y.ToInt32(bg_size.h / 2); var _x = (c.X - bg_size.w / 2); var _y = (c.Y - bg_size.h / 2 - (height - bg_size.h)); bg.style.SetLocation( _x.ToInt32(), _y.ToInt32(), bg_size.w, height.ToInt32() ); if (height > bg_size.h) { bg.style.zIndex = (_y + height - bg_size.h / 2).ToInt32(); } else { bg.style.zIndex = (_y).ToInt32(); } }; #endregion // http://wiki.openttd.org/index.php/Enhanced_GFX_replacement var KnownTileElements = new List<TileElement>(); var KnownDirtTileElements = new List<TileElement>(); #region SpawnItems Action<Color, Func<string>, double> SpawnItems = (c, src, h) => { var tiles_query = from point in data where point.color == c let img = new IHTMLImage(src()) let update = (Action)(() => ApplyTileToCanvas(point.x, point.y, img, h)) let img2 = img.Aggregate( i => { update(); }).AttachTo(arena.Layers.Canvas) select new TileElement { Position = new Point<double> { X = point.x, Y = point.y }, Image = img, Source = src() //, update }; var aa0 = tiles_query.ToArray(); var aa1 = aa0; var aa2 = aa1; KnownTileElements.AddRange(aa2);//.ForEach(i => i.update()); }; #endregion CreateNewItemsRandomly(12, TileColorHouse1); //CreateNewItemsRandomly(4, TileColorHouse2); //CreateNewItemsRandomly(5, TileColorHouse3); //CreateNewItemsRandomly(5, TileColorHouse11); CreateNewItemsRandomly(20, TileColorTree1); CreateNewItemsRandomly(10, TileColorTree2); CreateNewItemsRandomly(5, TileColorTree3); CreateNewItemsRandomly(2, TileColorRoad1); CreateNewItemsRandomly(1, TileColorRoad2); CreateNewItemsRandomly(1, TileColorTrack1); // expand the random roads through the map #region expand data.Where(i => i.color == TileColorRoad1).ToArray().ForEach( road => { data = data.Concat( from y in Enumerable.Range(MapSize.Top, MapSize.Height + 1) select new { x = road.x, y = (double)y, color = TileColorRoad1 } ).ToArray(); } ); data.Where(i => i.color == TileColorRoad2).ToArray().ForEach( road => { data = data.Concat( from x in Enumerable.Range(MapSize.Left, MapSize.Width + 1) select new { x = (double)x, y = road.y, color = TileColorRoad2 } ).ToArray(); } ); data.Where(i => i.color == TileColorTrack1).ToArray().ForEach( road => { data = data.Concat( from x in Enumerable.Range(MapSize.Left, MapSize.Width + 1) select new { x = (double)x, y = road.y, color = TileColorTrack1 } ).ToArray(); } ); #endregion // remove buildings on the roads #region clean road1 { var AllRoads = data.Where(i => i.color == TileColorRoad1).ToArray(); data = data.Where( v => { if (v.color == TileColor) return true; if (v.color == TileColorRoad1) return true; if (v.color == TileColorRoad2) return true; if (v.color == TileColorTrack1) return true; return !AllRoads.Any(i => i.x == v.x && i.y == i.y); } ).ToArray(); } { var query = from a in data where a.color == TileColorRoad1 let b = data.FirstOrDefault(i => { var SameColor = i.color == TileColorRoad2; var SameLocation = i.x == a.x && i.y == a.y; return SameColor && SameLocation; }) where b != null let c = new { a.x, a.y, color = TileColorRoad3 } select new { a, b, c }; foreach (var v in query) { var data0 = data.Where(i => { if (i == v.a) return false; if (i == v.b) return false; return true; }); data = data0.ConcatSingle(v.c) .ToArray(); } } { var query = from a in data where a.color == TileColorRoad1 let b = data.FirstOrDefault(i => { var SameColor = i.color == TileColorTrack1; var SameLocation = i.x == a.x && i.y == a.y; return SameColor && SameLocation; }) where b != null let c = new { a.x, a.y, color = TileColorRoadTrack1 } select new { a, b, c }; foreach (var v in query) { var data0 = data.Where(i => { if (i == v.a) return false; if (i == v.b) return false; return true; }); data = data0.ConcatSingle(v.c) .ToArray(); } } { var AllRoads = data.Where(i => i.color == TileColorRoad2).ToArray(); data = data.Where( v => { if (v.color == TileColor) return true; if (v.color == TileColorRoad1) return true; if (v.color == TileColorRoad2) return true; return !AllRoads.Any(i => i.x == v.x && i.y == v.y); } ).ToArray(); } #endregion info.innerText = "Loading items..."; Timer.DoAsync( delegate { SpawnItems(TileColor, () => { //if (0.05.ByChance()) return new _1().src; if (0.33.ByChance()) return new _2x192x95().src; return new _0_192x95().src; }, 32); SpawnItems(TileColorRoad1, () => new r1_192x95().src, 32); SpawnItems(TileColorRoad2, () => new r4_192x95().src, 32); SpawnItems(TileColorRoad3, () => new r5_192x95().src, 32); SpawnItems(TileColorTrack1, () => new r2_192x95().src, 32); SpawnItems(TileColorRoadTrack1, () => new r3_192x95().src, 32); SpawnItems(TileColorHouse1, () => new h1x_192x384().src, 128); //SpawnItems(TileColorHouse11, () => new h11x().src, 89); //SpawnItems(TileColorHouse2, () => new h2().src, 96); //SpawnItems(TileColorHouse3, () => new h3().src, 50); SpawnItems(TileColorTree1, () => new t1_192x192().src, 65); SpawnItems(TileColorTree2, () => new t2_192x192().src, 128); SpawnItems(TileColorTree3, () => new t3_192x192().src, 128); Func<bool> IsDoneRotatingA = () => RotationA.ToDegrees() == 45; #region SpawnLookingDude Func<FrameInfo[], int, int, Dude2> SpawnLookingDude = (f, x, y) => { var r = new Dude2 { Frames = f, }; r.AnimationInfo.Frames_Stand = f; r.Zoom.DynamicZoomFunc = a => 1; r.Zoom.StaticZoom = 1; r.SetSize(48, 72); r.TeleportTo(x, y); r.Control.AttachTo(arena.Layers.Canvas); r.Direction = Math.PI.Random() * 2; return r; }; #endregion var Dudes = new List<Dude2>(); var RoadVehicles = new List<Dude2>(); #region GetRandomCanvasPosition Func<Point> GetRandomCanvasPosition = () => { var x = (MapSize.Width - 1).Random() + MapSize.Left + 1; var y = (MapSize.Height - 1).Random() + MapSize.Top + 1; var target = Translate( x, y ); var c = GetCenter(); var p = new Point( (target.X + c.X).ToInt32(), (target.Y + c.Y).ToInt32() ); return p; } ; #endregion #region CreateDude Func<DudeAnimationInfo, IdleBehaviour, double, Dude2> CreateDude = (ani, idle, dudezoom) => { var w2c = GetRandomCanvasPosition(); var w2 = SpawnLookingDude(ani.Frames_Stand, w2c.X.ToInt32(), w2c.Y.ToInt32()); w2.Zoom.StaticZoom = dudezoom; w2.AnimationInfo.Frames_Walk = ani.Frames_Walk; w2.TargetLocationDistanceMultiplier = 1; Action<Action> GoSomeWhere = done => { w2.DoneWalkingOnce += done; w2.WalkTo(GetRandomCanvasPosition().ToDouble()); }; #region WaitSomeAndGoSomeWhere Action WaitSomeAndGoSomeWhere = null; WaitSomeAndGoSomeWhere = () => 5000.Random().AtTimeout( t => { if (paused) { WaitSomeAndGoSomeWhere(); return; } var CurrentlyWalking = Dudes.Count(i => i.IsWalking); if (w2.IsWalking) { WaitSomeAndGoSomeWhere(); return; } // if we've been selected, then wait for orders if (w2.IsSelected) { WaitSomeAndGoSomeWhere(); return; } if (w2.IsHot) { WaitSomeAndGoSomeWhere(); return; } // dont make them all walk at the same time if (CurrentlyWalking > 3) { w2.Direction = (Math.PI * 2).Random(); WaitSomeAndGoSomeWhere(); return; } if (idle == IdleBehaviour.Scout) GoSomeWhere(WaitSomeAndGoSomeWhere); else WaitSomeAndGoSomeWhere(); } ); // make only imps wander on their own if (idle != IdleBehaviour.None) WaitSomeAndGoSomeWhere(); #endregion return w2; }; #endregion info.innerHTML = "Creating dudes..."; 1.Times(() => Dudes.Add(CreateDude(MyFrames_Soldier, IdleBehaviour.Look, 0.5))); 4.Times(() => Dudes.Add(CreateDude(MyFrames_Soldier, IdleBehaviour.Scout, 0.5))); 1.Times(() => Dudes.Add(CreateDude(MyFrames_Imp, IdleBehaviour.Look, 0.5))); 4.Times(() => Dudes.Add(CreateDude(MyFrames_Imp, IdleBehaviour.Scout, 0.5))); 1.Times(() => Dudes.Add(CreateDude(MyFrames_TwinClone, IdleBehaviour.Look, 0.5))); 4.Times(() => Dudes.Add(CreateDude(MyFrames_TwinClone, IdleBehaviour.Scout, 0.5))); Func<Point, Point<double>> GetNearestMapPosition = p => Translator.ConvertCanvasToMap(p.ToDouble()).Round().BoundTo(MapSize); #region GetNearestMapRect Func<Rectangle, Rectangle> GetNearestMapRect = rect => { var from = GetNearestMapPosition(new Point(rect.Left, rect.Top)); var to = GetNearestMapPosition(new Point(rect.Right, rect.Bottom)); return new Rectangle { Left = from.X.ToInt32(), Top = from.Y.ToInt32(), Right = to.X.ToInt32(), Bottom = to.Y.ToInt32() }; }; #endregion #region GetTileElementsAt Func<Point<double>, IEnumerable<TileElement>> GetTileElementsAt = map_coords => from i in KnownTileElements where i != null where i.Position.X == map_coords.X && i.Position.Y == map_coords.Y select i; #endregion #region AddTileElement Func<Point<double>, string, int, TileElement> AddTileElement = (map_coords, source, height) => { var n = new TileElement { Position = map_coords, Image = new IHTMLImage(source), Source = source, Height = height }; KnownTileElements.Add(n); ApplyTileToCanvas(map_coords.X, map_coords.Y, n.Image, height); n.Image.AttachTo(arena.Layers.Canvas); return n; }; #endregion #region RemoveAllTilesAt Action<Point<double>> RemoveAllTilesAt = map_coords => { foreach (var t in GetTileElementsAt(map_coords).ToArray()) { t.Image.Orphanize(); t.RemoveFrom(KnownTileElements); t.RemoveFrom(KnownDirtTileElements); } }; #endregion #region ReplaceTileWithDirt Func<Point<double>, TileElement> ReplaceTileWithDirt = map_coords => { RemoveAllTilesAt(map_coords); var r = AddTileElement(map_coords, TileResources.Dirt.Source, TileResources.Dirt.Height); r.AddTo(KnownDirtTileElements); return r; }; #endregion #region ReplaceTileWithNewBuilding Func<Point<double>, TileElement> ReplaceTileWithNewBuilding = map_coords => { var n = ReplaceTileWithDirt(map_coords); n.DirtAge = -200 - (3 + 5.Random()); return n; }; #endregion #region interesting predicates var IsGrass = new[] { TileResources.Grass.Source, TileResources.Dirt.Source, //TileResources.DirtDirtGrass.Source, //TileResources.DirtGrassGrass.Source, //TileResources.Rocks.Source, TileResources.RoughLand.Source, }.ToEqualsAny(); var IsGrassStrict = TileResources.Grass.Source.ToEquals(); var IsRoad1 = TileResources.Road1.Source.ToEquals(); var IsRoad2 = TileResources.Road2.Source.ToEquals(); var IsTrack1 = TileResources.Track1.Source.ToEquals(); var IsTree = TileResources.Tree.Source.ToEquals(); var IsTileSelector = TileResources.TileSelector.Source.ToEquals(); #endregion // create a draggable toolbar #region creating the toolbar var toolbar_color = Color.FromRGB(0x40, 0x40, 0x40); var infotoolbar = ToolbarDialog.CreateToolbar( new Point(64, 64), new Point(200, 64), toolbar_color ); var infotoolbar_content = new IHTMLDiv().AttachTo(infotoolbar.Control); infotoolbar_content.style.SetLocation(2, 8, infotoolbar.Size.X - 6, infotoolbar.Size.Y - 12); infotoolbar_content.SetDialogColor(infotoolbar.Color, false); infotoolbar_content.onmousedown += Native.DisabledEventHandler; Action<IStyle> SetInfoAnchorStyle = style => { style.display = IStyle.DisplayEnum.block; style.textDecoration = "none"; style.color = Color.White; style.textAlign = IStyle.TextAlignEnum.center; }; new IHTMLAnchor("http://zproxy.wordpress.com", "zproxy.wordpress.com").AttachTo(infotoolbar_content).style.Aggregate(SetInfoAnchorStyle); new IHTMLAnchor("http://jsc.sf.net", "jsc.sf.net").AttachTo(infotoolbar_content).style.Aggregate(SetInfoAnchorStyle); var toolbar_size = new Point(96, 32); var toolbar_pos = new Point(8, Native.window.Height - toolbar_size.Y - 8); Console.WriteLine("toolbar!"); var toolbar = ToolbarDialog.CreateToolbar(toolbar_pos, toolbar_size, toolbar_color); Native.window.onresize += delegate { infotoolbar.ApplyPosition(); toolbar.ApplyPosition(); }; infotoolbar.Control.Hide(); infotoolbar.Control.AttachToDocument(); toolbar.Control.AttachToDocument(); toolbar_btn_pause = new ToolbarButton( toolbar, new btn_pause().src ) { Title = "Pause" }; var aww = new aww(); var gong = new gong(); toolbar_btn_pause.Clicked += btn => { paused = btn.IsActivated; Dudes.ForEach(i => i.Paused = paused); }; #region toolbar_btn_demolish var toolbar_btn_demolish = new ToolbarButton( toolbar, new btn_demolish().src ) { Title = "Demolish" }; var ShowingTileSelector = default(Func<bool>); #endregion var toolbar_btn_track1 = new ToolbarButton( toolbar, new btn_track1().src ) { Title = "Build rail tracks" }; // var toolbar_btn_road2 = new ToolbarButton( // toolbar, new btn_road2().src //) { Title = "Build road" }; // var toolbar_btn_road1 = new ToolbarButton( // toolbar, new btn_road1().src // ) { Title = "Build road" }; var toolbar_btn_road1_road2 = new ToolbarButton( toolbar, new btn_road1_road2().src ) { Title = "Build road" }; /* var toolbar_btn_sign = new ToolbarButton( toolbar, "assets/ThreeDStuff/btn_sign.png" ); */ var toolbar_btn_trees = new ToolbarButton( toolbar, new btn_trees().src ) { Title = "Build trees" }; var toolbar_btn_trees2 = new ToolbarButton( toolbar, new btn_trees().src ) { Title = "Build trees" }; var TileSelectorModes = new Dictionary<ToolbarButton, TileSelectorMode> { {toolbar_btn_demolish, TileSelectorMode.Rectangle}, {toolbar_btn_track1, TileSelectorMode.Horizontal}, //{toolbar_btn_road2, TileSelectorMode.Vertical}, //{toolbar_btn_road1, TileSelectorMode.Horizontal}, {toolbar_btn_road1_road2, TileSelectorMode.HorizontalOrVertical}, {toolbar_btn_trees, TileSelectorMode.Rectangle}, {toolbar_btn_trees2, TileSelectorMode.Rectangle}, }; var __before_error = "__before_error"; var __Keys = TileSelectorModes.Keys; var __KeysArray = __Keys.ToArray(); var __after_error = "__after_error"; var toolbar_btngroup = new ToolbarButtonGroup { Buttons = __KeysArray }; var toolbar_btn_city = new ToolbarButton( toolbar, new btn_city().src ) { Title = "Build city" }; var toolbar_btn_landinfo = new ToolbarButton( toolbar, new btn_landinfo().src ) { Title = "Show info" }; toolbar_btn_landinfo.Clicked += btn => { infotoolbar.Control.Show(btn.IsActivated); }; ShowingTileSelector = () => toolbar_btngroup.IsActivated; var MultipleTileSelector = new List<TileElement>(); #region MultipleTileSelector_Clear Action MultipleTileSelector_Clear = delegate { // framework bug: while iterating and the collection changes an exception sould be thrown foreach (var v in MultipleTileSelector.ToArray()) { if (v.Image != null) { v.Image.Orphanize(); v.Image = null; } v.RemoveFrom(KnownTileElements); } MultipleTileSelector.Clear(); }; #endregion #region MultipleTileSelector_Add Action<Point<double>> MultipleTileSelector_Add = p => { AddTileElement( p, TileResources.TileSelector.Source, TileResources.TileSelector.Height ).AddTo(MultipleTileSelector); }; #endregion // show tile selection #region arena.MouseMove arena.MouseMove += p => { if (paused) return; if (ShowingTileSelector()) { if (arena.InSelectionMode) return; // get map coords from canvas coords var map_coords = GetNearestMapPosition(p); if (MultipleTileSelector.Count == 1) { var n = MultipleTileSelector.SingleOrDefault(); ApplyTileToCanvas(map_coords.X, map_coords.Y, n.Image, n.Height); } else { MultipleTileSelector_Clear(); MultipleTileSelector_Add(map_coords); } // must be on top of new dirt //SingleTileSelector.style.zIndex++; } }; #endregion #region GetActivatedTileSelectorMode Func<TileSelectorMode> GetActivatedTileSelectorMode = delegate { if (toolbar_btngroup.ActivatedButton == null) return TileSelectorMode.Unknown; if (!TileSelectorModes.ContainsKey(toolbar_btngroup.ActivatedButton)) return TileSelectorMode.Unknown; return TileSelectorModes[toolbar_btngroup.ActivatedButton]; }; #endregion #region arena.SelectionPointsPreview - just apply the current TileSelectorMode arena.SelectionPointsPreview += (from, to) => { if (paused) return; if (!ShowingTileSelector()) return; //SingleTileSelector.Hide(); var map_coords = new { from = GetNearestMapPosition(from), to = GetNearestMapPosition(to) }; #region CurrentMode var CurrentMode = GetActivatedTileSelectorMode(); if (CurrentMode == TileSelectorMode.Unknown) return; if (CurrentMode == TileSelectorMode.HorizontalOrVertical) { if ((map_coords.from.X - map_coords.to.X).Abs() > (map_coords.from.Y - map_coords.to.Y).Abs()) CurrentMode = TileSelectorMode.Horizontal; else CurrentMode = TileSelectorMode.Vertical; } #endregion if (CurrentMode == TileSelectorMode.Horizontal) { MultipleTileSelector_Clear(); foreach (var x in map_coords.from.X.ToInt32().RangeTo(map_coords.to.X.ToInt32())) MultipleTileSelector_Add(new Point<double> { X = x, Y = map_coords.from.Y }); } if (CurrentMode == TileSelectorMode.Vertical) { MultipleTileSelector_Clear(); foreach (var y in map_coords.from.Y.ToInt32().RangeTo(map_coords.to.Y.ToInt32())) MultipleTileSelector_Add(new Point<double> { X = map_coords.from.X, Y = y }); } if (CurrentMode == TileSelectorMode.Rectangle) { MultipleTileSelector_Clear(); foreach (var x in map_coords.from.X.ToInt32().RangeTo(map_coords.to.X.ToInt32())) foreach (var y in map_coords.from.Y.ToInt32().RangeTo(map_coords.to.Y.ToInt32())) { MultipleTileSelector_Add(new Point<double> { X = x, Y = y }); } } }; #endregion #region UseCurrentToolAt Action<Point<double>, TileSelectorMode> UseCurrentToolAt = (map_coords, CurrentMode) => { //"UseCurrentToolAt".ToConsole(); var Subject = GetTileElementsAt(map_coords).ToArray(); var StatsQuery = Subject.Select(i => i.Source); if (toolbar_btn_demolish) { ReplaceTileWithDirt(map_coords); } #region toolbar_btn_trees if (toolbar_btn_trees) { Func<string, bool> IsOther = s => !(IsGrass(s) || IsTileSelector(s)); var Stats = new { GrassStrict = StatsQuery.Any(IsGrassStrict), Other = StatsQuery.Any(IsOther) }; if (!Stats.Other) { if (!Stats.GrassStrict) { RemoveAllTilesAt(map_coords); AddTileElement(map_coords, TileResources.Grass.Source, TileResources.Grass.Height); } AddTileElement(map_coords, TileResources.Tree.Source, TileResources.Tree.Height); } } #endregion #region toolbar_btn_trees2 if (toolbar_btn_trees2) { Func<string, bool> IsOther = s => !(IsGrass(s) || IsTileSelector(s)); var Stats = new { GrassStrict = StatsQuery.Any(IsGrassStrict), Other = StatsQuery.Any(IsOther) }; if (!Stats.Other) { if (!Stats.GrassStrict) { RemoveAllTilesAt(map_coords); AddTileElement(map_coords, TileResources.Grass.Source, TileResources.Grass.Height); } AddTileElement(map_coords, TileResources.Tree2.Source, TileResources.Tree2.Height); } } #endregion #region toolbar_btn_track1 if (toolbar_btn_track1) { #region Stats Func<string, bool> IsOther = s => !(IsRoad2(s) || IsGrass(s) || IsTree(s) || IsTileSelector(s)); var Stats = new { Grass = StatsQuery.Any(IsGrass), Road2 = StatsQuery.Any(IsRoad2), Other = StatsQuery.Any(IsOther) }; #endregion if (!Stats.Other) { RemoveAllTilesAt(map_coords); if (!Stats.Road2) AddTileElement(map_coords, TileResources.Track1.Source, TileResources.Track1.Height); else AddTileElement(map_coords, TileResources.Road2_Track1.Source, TileResources.Road2_Track1.Height); } else { // should show that red error dialog now :) "Cannot build tracks!".ToConsole(); foreach (var v in Subject) { v.Source.ToConsole(); } } } #endregion bool ActiveIsRoad1 = false; bool ActiveIsRoad2 = false; if (toolbar_btn_road1_road2) { ActiveIsRoad1 = CurrentMode == TileSelectorMode.Horizontal; ActiveIsRoad2 = CurrentMode == TileSelectorMode.Vertical; } #region toolbar_btn_road1 if (ActiveIsRoad1) { #region Stats Func<string, bool> IsOther = s => !(IsRoad2(s) || IsTrack1(s) || IsGrass(s) || IsTree(s) || IsTileSelector(s)); var Stats = new { Grass = StatsQuery.Any(IsGrass), Road2 = StatsQuery.Any(IsRoad2), Track1 = StatsQuery.Any(IsTrack1), Other = StatsQuery.Any(IsOther) }; #endregion if (!Stats.Other) { RemoveAllTilesAt(map_coords); if (!Stats.Road2) AddTileElement(map_coords, TileResources.Road1.Source, TileResources.Road1.Height); else AddTileElement(map_coords, TileResources.Road1_Road2.Source, TileResources.Road1_Road2.Height); } else { // should show that red error dialog now :) "Cannot build tracks!".ToConsole(); } } #endregion #region toolbar_btn_road2 if (ActiveIsRoad2) { #region Stats Func<string, bool> IsOther = s => !(IsRoad1(s) || IsTrack1(s) || IsGrass(s) || IsTree(s) || IsTileSelector(s)); var Stats = new { Grass = StatsQuery.Any(IsGrass), Road1 = StatsQuery.Any(IsRoad1), Track1 = StatsQuery.Any(IsTrack1), Other = StatsQuery.Any(IsOther) }; #endregion if (!Stats.Other) { RemoveAllTilesAt(map_coords); if (Stats.Road1) AddTileElement(map_coords, TileResources.Road1_Road2.Source, TileResources.Road1_Road2.Height); else if (!Stats.Track1) AddTileElement(map_coords, TileResources.Road2.Source, TileResources.Road2.Height); else AddTileElement(map_coords, TileResources.Road2_Track1.Source, TileResources.Road2_Track1.Height); } else { // should show that red error dialog now :) "Cannot build tracks!".ToConsole(); } } #endregion }; #endregion #region arena.ApplyPointsSelection - using current tool arena.ApplyPointsSelection += (from, to, ev) => { if (!ShowingTileSelector()) return; if (paused) return; var map_coords = new { from = GetNearestMapPosition(from), to = GetNearestMapPosition(to) }; #region CurrentMode var CurrentMode = GetActivatedTileSelectorMode(); if (CurrentMode == TileSelectorMode.Unknown) return; if (CurrentMode == TileSelectorMode.HorizontalOrVertical) { if ((map_coords.from.X - map_coords.to.X).Abs() > (map_coords.from.Y - map_coords.to.Y).Abs()) CurrentMode = TileSelectorMode.Horizontal; else CurrentMode = TileSelectorMode.Vertical; } #endregion Console.WriteLine("mode: " + CurrentMode); if (CurrentMode == TileSelectorMode.Vertical) { MultipleTileSelector_Clear(); foreach (var y in map_coords.from.Y.ToInt32().RangeTo(map_coords.to.Y.ToInt32())) { UseCurrentToolAt(new Point<double> { X = map_coords.from.X, Y = y }, CurrentMode); } } if (CurrentMode == TileSelectorMode.Horizontal) { MultipleTileSelector_Clear(); foreach (var x in map_coords.from.X.ToInt32().RangeTo(map_coords.to.X.ToInt32())) UseCurrentToolAt(new Point<double> { X = x, Y = map_coords.from.Y }, CurrentMode); } if (CurrentMode == TileSelectorMode.Rectangle) { MultipleTileSelector_Clear(); foreach (var x in map_coords.from.X.ToInt32().RangeTo(map_coords.to.X.ToInt32())) foreach (var y in map_coords.from.Y.ToInt32().RangeTo(map_coords.to.Y.ToInt32())) { UseCurrentToolAt(new Point<double> { X = x, Y = y }, CurrentMode); } } MultipleTileSelector_Clear(); MultipleTileSelector_Add(map_coords.to); click.play(); click = new click(); ; }; #endregion #region arena.SelectionClick - just use the current tool arena.SelectionClick += (p, ev) => { if (paused) return; if (!ShowingTileSelector()) return; var map_coords = GetNearestMapPosition(p); #region CurrentMode var CurrentMode = GetActivatedTileSelectorMode(); if (CurrentMode == TileSelectorMode.Unknown) return; if (CurrentMode == TileSelectorMode.HorizontalOrVertical) { var map_coords0 = Translator.ConvertCanvasToMap(p.ToDouble()).Wrap(1).Abs(); if (map_coords0.X > map_coords0.Y) CurrentMode = TileSelectorMode.Horizontal; else CurrentMode = TileSelectorMode.Vertical; } #endregion UseCurrentToolAt(map_coords, CurrentMode); MultipleTileSelector_Clear(); MultipleTileSelector_Add(map_coords); click.play(); click = new click(); ; }; #endregion #region toolbar_btngroup.Clicked - a tool has been selected toolbar_btngroup.Clicked += btn => { arena.ShowSelectionRectangle = !ShowingTileSelector(); if (!ShowingTileSelector()) MultipleTileSelector_Clear(); }; #endregion #endregion #region arena.SelectionClick - move dudes arena.SelectionClick += (p, ev) => { if (paused) return; if (ShowingTileSelector()) return; var selection = Dudes.Where(i => i.IsSelected).ToArray(); //KnownCanvasPosition = p; var target = Translator.ConvertCanvasToMap(p.ToDouble()).BoundTo(MapSize); if (selection.Length == 0) { // single select? return; } selection.WithEach( v => { if (v.AnimationInfo.Frames_Stand[0].Source == Frames.WolfSoldier[0].Source) { CloneAffirmative.play(); CloneAffirmative = new EN_000002(); } else if (v.AnimationInfo.Frames_Stand[0].Source == MyFrames_TwinClone.Frames_Stand[0].Source) { CloneAffirmative.play(); CloneAffirmative = new EN_000002(); } else { Argh.play(); Argh = new Argh(); } } ); if (selection.Length == 1) { var canvas = Translator.ConvertMapToCanvas(target); //canvas.X += GetCenter().X; //canvas.Y += GetCenter().Y; //new //{ // target = new { target.X, target.Y }, // canvas = new { canvas.X, canvas.Y } //}.ToConsole(); ; selection.ForEach(i => i.WalkTo( canvas )); } else { #region Circle var center = GetCenter(); #region GetRotatedTargetPoint Func<double, double, Point<double>> GetRotatedTargetPoint = (direction, distance) => new Point<double> { X = target.X + (Math.Cos(direction) * distance), Y = target.Y + (Math.Sin(direction) * distance), }; #endregion Func<Point<double>, Point> OffsetToCenter = mcanvas => new Point ( (mcanvas.X + center.X).ToInt32(), (mcanvas.Y + center.Y).ToInt32() ); var dest = from index in selection.Length.ToRange() let direction = (((double)index / (selection.Length)) * (Math.PI * 2)).ToConsole() let distance = 0.5 let mtarget = GetRotatedTargetPoint(direction, distance) let mcanvas = Translate(mtarget.X, mtarget.Y) select new { index, canvas = OffsetToCenter(mcanvas) }; foreach (var v in dest) { selection[v.index].WalkTo(v.canvas.ToDouble()); } #endregion } }; #endregion #region arena.ApplySelection arena.ApplySelection += (r, ev) => { if (paused) return; if (ShowingTileSelector()) return; Console.WriteLine("ApplySelection " + new { ev.shiftKey }); foreach (var v in Dudes) { // chrome always reports shiftKey? //if (ev.shiftKey) // v.IsSelected |= r.Contains(v.CurrentLocation.ToInt32()); //else v.IsSelected = r.Contains(v.CurrentLocation.ToInt32()); } }; #endregion #region toolbar_btn_city.Clicked var toolbar_btn_city_StopTimer = default(Action); toolbar_btn_city.Clicked += delegate { if (toolbar_btn_city_StopTimer != null) { Console.WriteLine("stopping city building"); toolbar_btn_city_StopTimer(); toolbar_btn_city_StopTimer = null; return; } #region TryBuildHere Func<Point<double>, bool> TryBuildHere = n => { if (IsDefined(n.X, n.Y)) if (GetTileElementsAt(n).All(i => IsGrassStrict(i.Source))) { new IHTMLAudio[] { Hammertime, Sawtime, StoneHammerTime }.Random().With( snd => { snd.play(); Hammertime = new SAMPLES234 { volume = 0.1 }; Sawtime = new SAMPLES216 { volume = 0.1 }; StoneHammerTime = new SAMPLES233 { volume = 0.1 }; } ); ReplaceTileWithNewBuilding(n); return true; } return false; }; #endregion var Query = from i in KnownTileElements let Road2 = IsRoad2(i.Source) let Road1 = IsRoad1(i.Source) where Road2 || Road1 select new { i, Road1, Road2 }; Console.WriteLine("starting city building"); toolbar_btn_city_StopTimer = new Timer( t => { if (paused) return; var v = Query.Random(); Console.WriteLine("try building city at road {0}", new { v.i.Position.X, v.i.Position.Y }); if (v.Road2) { if (0.5.ByChance()) TryBuildHere(v.i.Position.Round().WithOffset(-1, 0)); else TryBuildHere(v.i.Position.Round().WithOffset(1, 0)); } else if (v.Road1) { if (0.5.ByChance()) TryBuildHere(v.i.Position.Round().WithOffset(0, -1)); else TryBuildHere(v.i.Position.Round().WithOffset(0, 1)); } }, 3000, 20000 ).Stop; //toolbar_btn_city.RaiseClicked }; #endregion toolbar_btn_city.RaiseClicked(); #region grass growth 1500.AtInterval( t => { if (paused) return; //"got dirt?".ToConsole(); #region KnownDirtTileElements foreach (var v in KnownDirtTileElements.ToArray()) { new { v.DirtAge, v.Position.X, v.Position.Y }.ToConsole(); if (v.DirtAge > 5) { v.RemoveFrom(KnownDirtTileElements); } #region House1a building animation if (v.Source == TileResources.House1a.Source) if (v.DirtAge > 3) { new IHTMLAudio[] { Hammertime, Sawtime, StoneHammerTime }.Random().With( snd => { snd.play(); Hammertime = new SAMPLES234 { volume = 0.1 }; Sawtime = new SAMPLES216 { volume = 0.1 }; StoneHammerTime = new SAMPLES233 { volume = 0.1 }; } ); RemoveAllTilesAt(v.Position); AddTileElement(v.Position, TileResources.House1b.Source, TileResources.House1b.Height ) .AddTo(KnownDirtTileElements); } if (v.Source == TileResources.House1b.Source) if (v.DirtAge > 3) { new IHTMLAudio[] { Hammertime, Sawtime, StoneHammerTime }.Random().With( snd => { snd.play(); Hammertime = new SAMPLES234 { volume = 0.1 }; Sawtime = new SAMPLES216 { volume = 0.1 }; StoneHammerTime = new SAMPLES233 { volume = 0.1 }; } ); RemoveAllTilesAt(v.Position); AddTileElement(v.Position, TileResources.House1x.Source, TileResources.House1x.Height ) .AddTo(KnownDirtTileElements); } #endregion #region make that dirt grow into grass over time if (v.Source == TileResources.Dirt.Source) { if (v.DirtAge == -200) { RemoveAllTilesAt(v.Position); var NewHouse = new[] { TileResources.House1a, //TileResources.House2, //TileResources.House3, //TileResources.House4, //TileResources.House5a, //TileResources.House5a }.Random(); AddTileElement(v.Position, NewHouse.Source, NewHouse.Height ) .AddTo(KnownDirtTileElements); } if (v.DirtAge > 3) { RemoveAllTilesAt(v.Position); v.RemoveFrom(KnownDirtTileElements); AddTileElement(v.Position, TileResources.Grass.Source, TileResources.Grass.Height) .AddTo(KnownDirtTileElements); } } #endregion v.DirtAge++; } #endregion } ); #endregion // wont work correctly on IE //Native.Window.onblur += // delegate // { // if (!toolbar_btn_pause.IsActivated) // toolbar_btn_pause.RaiseClicked(); // }; Console.WriteLine("ready!"); info.innerHTML = "LBA Redux"; if (!paused) PauseFogTween.Value = 0; toolbar.Buttons.WithEach( btn => { btn.Clicked += delegate { click.play(); click = new click(); ; }; } ); arena.Layers.User.oncontextmenu += e => { e.preventDefault(); }; yield(this); }); }; #endregion StartLoadingDudeAnimationInfo(MyFrames_Soldier); StartLoadingDudeAnimationInfo(MyFrames_Imp); StartLoadingDudeAnimationInfo(MyFrames_TwinClone); TileResourcesList.ForEach(i => StartLoadingSingleImage(i.Source)); new Timer( t => { info.innerHTML = ImagesThatAreCurrentlyLoadingCounter + " of " + ImagesThatAreCurrentlyLoading.Count; if (ImagesThatAreCurrentlyLoading.Count == ImagesThatAreCurrentlyLoadingCounter) { t.Stop(); AllImagesLoaded(); } } ).StartInterval(1); }
public void WalkTo(double _x, double _y) { _TargetX = _x; _TargetY = _y; var EgoMoveSpeed = 3; if (_TargetTimer == null) _TargetTimer = (1000 / 30).AtInterval( delegate { var p = new Point { x = _TargetX - this.x, y = _TargetY - this.y }; if (p.length <= (EgoMoveSpeed * 2)) { 100.AtDelayDo( delegate { if (!_TargetTimer.running) RunAnimation = false; } ); _TargetTimer.stop(); return; } this.MoveToArc(p.GetRotation(), EgoMoveSpeed); } ); RunAnimation = true; _TargetTimer.start(); }