void PlaceInitialUnits () { List<UnitInfo> unit_infos = scenario.Units; List<Unit> startLocations = new List<Unit>(); units = new List<Unit>(); foreach (UnitInfo unitinfo in unit_infos) { if (unitinfo.unit_id == 0xffff) break; Unit unit = new Unit (unitinfo); /* we handle start locations in a special way, below */ if (unit.FlingyId == 140) { startLocations.Add (unit); continue; } //players[unitinfo.player].AddUnit (unit); unit.CreateSprite (mpq, tileset_palette); units.Add (unit); } if (template != null && (template.InitialUnits != InitialUnits.UseMapSettings)) { foreach (Unit sl in startLocations) { /* terran command center = 106, zerg hatchery = 131, protoss nexus = 154 */ Unit unit = new Unit (154); unit.X = sl.X; unit.Y = sl.Y; unit.CreateSprite (mpq, tileset_palette); units.Add (unit); } } /* for now assume the player is at startLocations[0], and center the view there */ Recenter (startLocations[0].X, startLocations[0].Y); }
void UpdateCursor() { if (mouseOverElement == null) { /* are we over a unit? if so, display the mag cursor */ unitUnderCursor = null; for (int i = 0; i < units.Count; i ++) { Unit u = units[i]; Sprite s = u.Sprite; int sx, sy; s.GetPosition (out sx, out sy); int cursor_x = Game.Instance.Cursor.X + topleft_x; int cursor_y = Game.Instance.Cursor.Y + topleft_y; int half_width = u.Width / 2; int half_height = u.Height / 2; if (cursor_x < sx + half_width && cursor_x > sx - half_width && cursor_y < sy + half_height && cursor_y > sy - half_height) { Game.Instance.Cursor = MagCursors[MAG_CURSOR_G]; unitUnderCursor = u; break; } } } }
public override void MouseButtonDown (MouseButtonEventArgs args) { if (mouseOverElement != null) { base.MouseButtonDown (args); } else if (args.X > MINIMAP_X && args.X < MINIMAP_X + MINIMAP_WIDTH && args.Y > MINIMAP_Y && args.Y < MINIMAP_Y + MINIMAP_HEIGHT) { RecenterFromMinimap (args.X, args.Y); buttonDownInMinimap = true; } else { if (selectedUnit != unitUnderCursor) { Console.WriteLine ("hey there, keyboard.modifierkeystate = {0}", Keyboard.ModifierKeyState); // if we have a selected unit and we // right click (or ctrl-click?), try // to move there if (selectedUnit != null && (Keyboard.ModifierKeyState & ModifierKeys.ShiftKeys) != 0) { Console.WriteLine ("And... we're walking"); int pixel_x = args.X + topleft_x; int pixel_y = args.Y + topleft_y; // calculate the megatile int megatile_x = pixel_x >> 5; int megatile_y = pixel_y >> 5; Console.WriteLine ("megatile {0},{1}", megatile_x, megatile_y); // the mini tile int minitile_x = pixel_x >> 2; int minitile_y = pixel_y >> 2; Console.WriteLine ("minitile {0},{1} ({2},{3} in the megatile)", minitile_x, minitile_y, minitile_x - megatile_x * 8, minitile_y - megatile_y * 8); if (selectedUnit.YesSound != null) { string sound_resource = String.Format ("sound\\{0}", selectedUnit.YesSound); Console.WriteLine ("sound_resource = {0}", sound_resource); GuiUtil.PlaySound (mpq, sound_resource); } selectedUnit.Move (mapRenderer, minitile_x, minitile_y); return; } portraitElement.Stop (); selectedUnit = unitUnderCursor; if (selectedUnit == null) { portraitElement.Visible = false; wireframeElement.Visible = false; for (int i = 0; i < (int)HudLabels.Count; i ++) labelElements[i].Visible = false; } else { Console.WriteLine ("selected unit: {0}", selectedUnit); Console.WriteLine ("selectioncircle = {0}", selectedUnit.SelectionCircleOffset); if (selectedUnit.Portrait == null) { portraitElement.Visible = false; } else { string portrait_resource = String.Format ("portrait\\{0}0.smk", selectedUnit.Portrait); portraitElement.Player = new SmackerPlayer ((Stream)mpq.GetResource (portrait_resource), 1); portraitElement.Play (); portraitElement.Visible = true; } if (selectedUnit.WhatSound != null) { string sound_resource = String.Format ("sound\\{0}", selectedUnit.WhatSound); Console.WriteLine ("sound_resource = {0}", sound_resource); GuiUtil.PlaySound (mpq, sound_resource); } /* set up the wireframe */ wireframeElement.Frame = selectedUnit.UnitId; wireframeElement.Visible = true; /* then display info about the selected unit */ labelElements[(int)HudLabels.UnitName].Text = statTxt[selectedUnit.UnitId]; if (true /* XXX unit is a building */) { labelElements[(int)HudLabels.ResourceUsed].Text = statTxt[820+(int)Game.Instance.Race]; labelElements[(int)HudLabels.ResourceProvided].Text = statTxt[814+(int)Game.Instance.Race]; labelElements[(int)HudLabels.ResourceTotal].Text = statTxt[817+(int)Game.Instance.Race]; labelElements[(int)HudLabels.ResourceMax].Text = statTxt[823+(int)Game.Instance.Race]; for (int i = 0; i < (int)HudLabels.Count; i ++) labelElements[i].Visible = true; } /* then fill in the command buttons */ int[] cmd_indices; switch (selectedUnit.UnitId) { case 106: cmd_indices = new int[] { 7, -1, -1, -1, -1, 286, -1, -1, 282 }; break; default: Console.WriteLine ("cmd_indices == -1"); cmd_indices = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1 }; break; } for (int i = 0; i < cmd_indices.Length; i ++) { if (cmd_indices[i] == -1) { cmdButtonElements[i].Visible = false; } else { cmdButtonElements[i].Visible = true; cmdButtonElements[i].Frame = cmd_indices[i]; } } } } } }
public override void MouseButtonDown(MouseButtonEventArgs args) { if (mouseOverElement != null) base.MouseButtonDown (args); else if (args.X > MINIMAP_X && args.X < MINIMAP_X + MINIMAP_WIDTH && args.Y > MINIMAP_Y && args.Y < MINIMAP_Y + MINIMAP_HEIGHT) { RecenterFromMinimap (args.X, args.Y); buttonDownInMinimap = true; } else { if (selectedUnit != unitUnderCursor) { portraitElement.Stop (); selectedUnit = unitUnderCursor; if (selectedUnit == null) { portraitElement.Visible = false; wireframeElement.Visible = false; for (int i = 0; i < (int)HudLabels.Count; i ++) labelElements[i].Visible = false; } else { Console.WriteLine ("selected unit: {0}", selectedUnit); Console.WriteLine ("selectioncircle = {0}", selectedUnit.SelectionCircleOffset); if (selectedUnit.Portrait == null) { portraitElement.Visible = false; } else { string portrait_resource = String.Format ("portrait\\{0}0.smk", selectedUnit.Portrait); portraitElement.Player = new SmackerPlayer ((Stream)mpq.GetResource (portrait_resource), 1); portraitElement.Play (); portraitElement.Visible = true; } /* set up the wireframe */ wireframeElement.Frame = selectedUnit.UnitId; wireframeElement.Visible = true; /* then display info about the selected unit */ labelElements[(int)HudLabels.UnitName].Text = statTxt[selectedUnit.UnitId]; if (true /* XXX unit is a building */) { labelElements[(int)HudLabels.ResourceUsed].Text = statTxt[820+(int)Game.Instance.Race]; labelElements[(int)HudLabels.ResourceProvided].Text = statTxt[814+(int)Game.Instance.Race]; labelElements[(int)HudLabels.ResourceTotal].Text = statTxt[817+(int)Game.Instance.Race]; labelElements[(int)HudLabels.ResourceMax].Text = statTxt[823+(int)Game.Instance.Race]; for (int i = 0; i < (int)HudLabels.Count; i ++) labelElements[i].Visible = true; } /* then fill in the command buttons */ int[] cmd_indices; switch (selectedUnit.UnitId) { case 106: cmd_indices = new int[] { 7, -1, -1, -1, -1, 286, -1, -1, 282 }; break; default: Console.WriteLine ("cmd_indices == -1"); cmd_indices = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1 }; break; } for (int i = 0; i < cmd_indices.Length; i ++) { if (cmd_indices[i] == -1) { cmdButtonElements[i].Visible = false; } else { cmdButtonElements[i].Visible = true; cmdButtonElements[i].Frame = cmd_indices[i]; } } } } } }