public override void ProcessEntity(AbstractEntity entity) { JonesTheCatComponent cat = (JonesTheCatComponent)entity.GetComponent(nameof(JonesTheCatComponent)); if (cat == null) // Are we a cat? { return; } CarryableComponent cc = (CarryableComponent)entity.GetComponent(nameof(CarryableComponent)); if (cc.carrier != null) // Don't move if we're bring carried { return; } MobDataComponent us = (MobDataComponent)entity.GetComponent(nameof(MobDataComponent)); if (us.actionPoints <= 0) // Only do stuff if we've got any APs { return; } MovementDataComponent mdc = (MovementDataComponent)entity.GetComponent(nameof(MovementDataComponent)); if (mdc.route == null || mdc.route.Count == 0) { MovementSystem ms = (MovementSystem)this.ecs.GetSystem(nameof(MovementSystem)); PositionComponent pos = (PositionComponent)entity.GetComponent(nameof(PositionComponent)); Point p = ms.GetRandomAccessibleSquare(); mdc.route = ms.GetAStarRoute(pos.x, pos.y, p.X, p.Y); } }
private void SingleGameLoop() { this.doRepaint = true; this.ecs.process(); // To move the player's units // Check at least one player's entity has > 100 APs foreach (var unit in this.playersUnits) { MobDataComponent mdc = (MobDataComponent)unit.GetComponent(nameof(MobDataComponent)); if (mdc.actionPoints > 0) { MovementDataComponent moveData = (MovementDataComponent)unit.GetComponent(nameof(MovementDataComponent)); if (moveData.route == null || moveData.route.Count == 0) { return; // They still have spare APs and no dest, so don't do anything and wait for the player } } } // Loop around all entities until none have any bool keepLooping = true; while (keepLooping) { keepLooping = false; foreach (var e in this.ecs.entities) { if (this.playersUnits.Contains(e) == false) // Don't check player's units { MobDataComponent mdc = (MobDataComponent)e.GetComponent(nameof(MobDataComponent)); if (mdc != null) { if (mdc.actionPoints > 0) // They still have spare APs { Console.WriteLine($"{e.name} still has APs"); this.ecs.process(); this.doRepaint = true; Thread.Sleep(1000);// sleep for a sec so the player can see what's going on keepLooping = true; } } } } } // Give everyone some APs foreach (var e in this.ecs.entities) { MobDataComponent mdc = (MobDataComponent)e.GetComponent(nameof(MobDataComponent)); if (mdc != null) { mdc.actionPoints += mdc.apsPerTurn; if (e.name == "Alien") { Console.WriteLine($"Alien now has {mdc.actionPoints} APs left"); } } } }
public override void ProcessEntity(AbstractEntity entity) { AlienComponent alienData = (AlienComponent)entity.GetComponent(nameof(AlienComponent)); if (alienData == null) // Are we an alien? { return; } MobDataComponent us = (MobDataComponent)entity.GetComponent(nameof(MobDataComponent)); if (us.actionPoints <= 0) // Only do stuff if we've got any APs { return; } PositionComponent pos = (PositionComponent)entity.GetComponent(nameof(PositionComponent)); AbstractEntity target = this.GetTarget(pos.x, pos.y, us.side); MovementDataComponent mdc = (MovementDataComponent)entity.GetComponent(nameof(MovementDataComponent)); if (target != null) { Console.WriteLine($"Alien can see {target.name}"); alienData.moveWhenNoEnemy = true; PositionComponent targetPos = (PositionComponent)target.GetComponent(nameof(PositionComponent)); if (this.CheckForImpregnation(alienData, pos, target, targetPos)) { us.actionPoints -= 50; } else { mdc.route = Misc.GetLine(pos.x, pos.y, targetPos.x, targetPos.y, true); } } else { if (alienData.moveWhenNoEnemy) { alienData.moveWhenNoEnemy = false; alienData.impregnateNextEnemy = Misc.random.Next(1, 2) == 1; // Move to a random point on the map MovementSystem ms = (MovementSystem)this.ecs.GetSystem(nameof(MovementSystem)); Point p = ms.GetRandomAccessibleSquare(); mdc.route = ms.GetAStarRoute(pos.x, pos.y, p.X, p.Y); } if (mdc.route == null || mdc.route.Count == 0) { us.actionPoints -= 100; // Waiting.... } } }
public void PickupItem(AbstractEntity unit, AbstractEntity item, List <AbstractEntity> mapSquare) { MobDataComponent mdc = (MobDataComponent)unit.GetComponent(nameof(MobDataComponent)); if (mdc == null || mdc.actionPoints > 0) { mdc.actionPoints -= 40; CanCarryComponent ccc = (CanCarryComponent)unit.GetComponent(nameof(CanCarryComponent)); CarryableComponent cc = (CarryableComponent)item.GetComponent(nameof(CarryableComponent)); // todo - check weight etc... ccc.AddItem(item); cc.carrier = unit; mapSquare.Remove(item); } }
public void EntityShootingAtEntity(AbstractEntity shooter, Point shooterPos, AbstractEntity target, Point targetPos) { CanCarryComponent ccc = (CanCarryComponent)shooter.GetComponent(nameof(CanCarryComponent)); if (ccc != null && ccc.CurrentItem != null) { ItemCanShootComponent icsc = (ItemCanShootComponent)ccc.CurrentItem.GetComponent(nameof(ItemCanShootComponent)); if (icsc != null) { MobDataComponent us = (MobDataComponent)shooter.GetComponent(nameof(MobDataComponent)); if (us.actionPoints > 0) { this.EntityShotByEntity(shooter, shooterPos.X, shooterPos.Y, target, targetPos.X, targetPos.Y); us.actionPoints -= 50; } } } }
private AbstractEntity GetTarget(int ourX, int ourY, int ourSide) { foreach (var e in this.entities) { MobDataComponent att = (MobDataComponent)e.GetComponent(nameof(MobDataComponent)); if (att != null && att.side != ourSide) { PositionComponent pos = (PositionComponent)e.GetComponent(nameof(PositionComponent)); if (pos != null) { if (this.cmvs.CanSee(ourX, ourY, pos.x, pos.y)) { return(e); } } } } return(null); }
public void ThrowItem(AbstractEntity thrower, int destX, int destY) { MobDataComponent mdc = (MobDataComponent)thrower.GetComponent(nameof(MobDataComponent)); if (mdc == null || mdc.actionPoints > 0) { mdc.actionPoints -= 50; CanCarryComponent ccc = (CanCarryComponent)thrower.GetComponent(nameof(CanCarryComponent)); if (ccc.CurrentItem != null) { PositionComponent pos = (PositionComponent)ccc.CurrentItem.GetComponent(nameof(PositionComponent)); this.mapData.map[pos.x, pos.y].Add(ccc.CurrentItem); this.gameLog.Add($"{ccc.CurrentItem.name} thrown."); ccc.RemoveItem(ccc.CurrentItem); } } }
private bool Move(AbstractEntity entity, MovementDataComponent md, PositionComponent p, Point dest) { if (this.IsAccessible(dest.X, dest.Y)) { MobDataComponent mdc = (MobDataComponent)entity.GetComponent(nameof(MobDataComponent)); if (mdc == null || mdc.actionPoints > 0) { /*if (entity.name == "Alien") { * Console.WriteLine($"Moving alien.... {mdc.actionPoints} APs left"); * }*/ int cost = 50; if (p.x != dest.X && p.y != dest.Y) // Diagonal { cost = 70; } mdc.actionPoints -= cost; this.map_data.map[p.x, p.y].Remove(entity); p.x = dest.X; p.y = dest.Y; this.map_data.map[p.x, p.y].Add(entity); /*if (entity.name == "Alien") { * Console.WriteLine($"Moved alien. {mdc.actionPoints} APs left"); * }*/ CheckMapVisibilitySystem cmvs = (CheckMapVisibilitySystem)this.ecs.GetSystem(nameof(CheckMapVisibilitySystem)); cmvs.ReCheckVisibility = true; return(true); } } else { CloseCombatSystem ccs = (CloseCombatSystem)this.ecs.GetSystem(nameof(CloseCombatSystem)); if (ccs.Combat(entity, this.map_data.map[dest.X, dest.Y]) == false) { // Movement failed } } return(false); }
public override void ProcessEntity(AbstractEntity entity) { ShootOnSightComponent sosc = (ShootOnSightComponent)entity.GetComponent(nameof(ShootOnSightComponent)); if (sosc == null) { return; } PositionComponent shooterPos = (PositionComponent)entity.GetComponent(nameof(PositionComponent)); MobDataComponent us = (MobDataComponent)entity.GetComponent(nameof(MobDataComponent)); AbstractEntity target = this.GetTarget(shooterPos.x, shooterPos.y, us.side); if (target != null) { PositionComponent targetPos = (PositionComponent)target.GetComponent(nameof(PositionComponent)); ShootingSystem ss = (ShootingSystem)this.ecs.GetSystem(nameof(ShootingSystem)); ss.EntityShootingAtEntity(entity, new Point(shooterPos.x, shooterPos.y), target, new Point(targetPos.x, targetPos.y)); } }
public AbstractEntity GetTargetAt(List <AbstractEntity> entities, int ourX, int ourY, int ourSide) { CheckMapVisibilitySystem cmvs = (CheckMapVisibilitySystem)this.ecs.GetSystem(nameof(CheckMapVisibilitySystem)); foreach (var e in entities) { MobDataComponent att = (MobDataComponent)e.GetComponent(nameof(MobDataComponent)); if (att != null && att.side != ourSide) { PositionComponent pos = (PositionComponent)e.GetComponent(nameof(PositionComponent)); if (pos != null) { if (cmvs.CanSee(ourX, ourY, pos.x, pos.y)) { return(e); } } } } return(null); }
public void DropItem(AbstractEntity unit, AbstractEntity item, List <AbstractEntity> mapSquare) { MobDataComponent mdc = (MobDataComponent)unit.GetComponent(nameof(MobDataComponent)); if (mdc == null || mdc.actionPoints > 0) { mdc.actionPoints -= 20; CanCarryComponent ccc = (CanCarryComponent)unit.GetComponent(nameof(CanCarryComponent)); PositionComponent unitpos = (PositionComponent)item.GetComponent(nameof(PositionComponent)); PositionComponent itempos = (PositionComponent)item.GetComponent(nameof(PositionComponent)); CarryableComponent cc = (CarryableComponent)item.GetComponent(nameof(CarryableComponent)); if (ccc.GetItems().Contains(item)) { ccc.RemoveItem(item); cc.carrier = null; mapSquare.Add(item); itempos.x = unitpos.x; itempos.y = unitpos.y; } } }
private AbstractEntity GetTarget(int ourX, int ourY, int ourSide) { foreach (var e in this.entities) { ImpregnatedComponent ic = (ImpregnatedComponent)e.GetComponent(nameof(ImpregnatedComponent)); if (ic == null) // Don't go after anyone who's impregnated { MobDataComponent att = (MobDataComponent)e.GetComponent(nameof(MobDataComponent)); if (att != null && att.side != ourSide && att.side >= 0) { PositionComponent pos = (PositionComponent)e.GetComponent(nameof(PositionComponent)); if (pos != null) { if (this.cmvs.CanSee(ourX, ourY, pos.x, pos.y)) { return(e); } } } } } return(null); }
public void Process(List <AbstractEffect> effects) { // Draw map MapData map_data = this.viewData.GetMapData(); if (map_data.map != null) { this.view.mapConsole.Clear(); for (int y = 0; y < map_data.getHeight(); y++) { for (int x = 0; x < map_data.getWidth(); x++) { var entities = map_data.map[x, y]; var mapEnt = entities.Single(ent => ent.GetComponents().ContainsKey(nameof(MapsquareData))); MapsquareData msdc = (MapsquareData)mapEnt.GetComponent(nameof(MapsquareData)); if (msdc.visible || Settings.DEBUG_DRAW_ALL) { // Only draw stuff if mapsquare visible AbstractEntity sq = map_data.GetComponentToDraw(x, y); GraphicComponent gc = (GraphicComponent)sq.GetComponent(nameof(GraphicComponent)); RLCell tc = gc.getVisibleChar(); this.view.mapConsole.Set(x, y, tc); if (sq == this.viewData.GetCurrentUnit()) { this.view.mapConsole.SetBackColor(x, y, RLColor.Yellow); } } else if (msdc.seen) { AbstractEntity sq = map_data.GetComponentToDraw(x, y); GraphicComponent gc = (GraphicComponent)sq.GetComponent(nameof(GraphicComponent)); this.view.mapConsole.Set(x, y, gc.getSeenChar()); } else { this.view.mapConsole.Set(x, y, this.invisible); } } } } // Draw effects foreach (var effect in effects) { effect.draw(this.view.mapConsole); } // Draw line var line2 = this.viewData.GetLine(); if (line2 != null) { foreach (var point in line2) { this.view.mapConsole.SetBackColor(point.X, point.Y, RLColor.Gray); } } // Draw hover text this.view.mapConsole.Print(1, DefaultRLView._mapHeight - 1, this.viewData.GetHoverText(), RLColor.White); // Draw crew this.view.crewListConsole.Clear(); int yPos = 0; this.view.crewListConsole.Print(0, yPos, "CREW LIST", RLColor.White); yPos++; int idx = 1; foreach (AbstractEntity e in this.viewData.GetUnits()) { RLColor c = RLColor.White; MobDataComponent mdc = (MobDataComponent)e.GetComponent(nameof(MobDataComponent)); if (e == this.viewData.GetCurrentUnit()) { c = RLColor.Yellow; // Highlight selected unit } else if (mdc.actionPoints <= 0) { c = RLColor.Gray; } MovementDataComponent move = (MovementDataComponent)e.GetComponent(nameof(MovementDataComponent)); string routeIndicator = move.route == null || move.route.Count == 0 ? "" : "(R)"; this.view.crewListConsole.Print(0, yPos, $"{idx}: {e.name} {routeIndicator} ({mdc.actionPoints} APs)", c); yPos++; idx++; } // Draw unit stats or menu selection this.view.statConsole.Clear(); yPos = 0; Dictionary <int, AbstractEntity> items = this.viewData.GetItemSelectionList(); if (items != null && items.Count > 0) { foreach (var idx2 in items.Keys) { this.view.statConsole.Print(0, yPos, $"{idx2} : {items[idx2].name}", RLColor.White); yPos++; } } else { AbstractEntity currentUnit = this.viewData.GetCurrentUnit(); if (currentUnit != null) { foreach (var s in this.viewData.GetStatsFor(currentUnit)) { this.view.statConsole.Print(0, yPos, s, RLColor.White); yPos++; } } } // Draw log this.view.logConsole.Clear(); var log = this.viewData.GetLog(); int pos = 1; foreach (var line in log) { this.view.logConsole.Print(1, pos++, line, RLColor.White); } }
public void HandleKeyInput(RLKeyPress keyPress) { this.doRepaint = true; if (this.effectsSystem.HasEffects()) { return; } switch (keyPress.Key) { case RLKey.Number1: case RLKey.Number2: case RLKey.Number3: case RLKey.Number4: case RLKey.Number5: case RLKey.Number6: case RLKey.Number7: case RLKey.Number8: case RLKey.Number9: int idx = keyPress.Key - RLKey.Number0; if (this.currentInputMode == InputMode.SelectItemFromFloor) { if (this.currentInputSubMode == InputSubMode.PickingUpItem) { PositionComponent pos = (PositionComponent)this.currentUnit.GetComponent(nameof(PositionComponent)); this.pickupItemSystem.PickupItem(this.currentUnit, this.menuItemList[idx], this.mapData.map[pos.x, pos.y]); this.gameLog.Add("item picked up"); this.currentInputMode = InputMode.Normal; this.menuItemList.Clear(); } } else if (this.currentInputMode == InputMode.SelectItemFromInv) { if (this.currentInputSubMode == InputSubMode.DroppingItem) { PositionComponent pos = (PositionComponent)this.currentUnit.GetComponent(nameof(PositionComponent)); this.pickupItemSystem.DropItem(this.currentUnit, this.menuItemList[idx], this.mapData.map[pos.x, pos.y]); this.gameLog.Add("item dropped up"); this.currentInputMode = InputMode.Normal; this.menuItemList.Clear(); } } else if (this.currentInputMode == InputMode.ActivatingCurrentItem) { TimerCanBeSetComponent tcbsc = (TimerCanBeSetComponent)this.currentUnit.GetComponent(nameof(TimerCanBeSetComponent)); if (tcbsc != null) { if (tcbsc.activated == false) { tcbsc.activated = true; tcbsc.timeLeft = idx; this.gameLog.Add("Timer set for " + idx); } else { this.gameLog.Add("Timer already set!"); } } } else { this.SelectUnit(idx); } break; case RLKey.Up: { MovementDataComponent m = (MovementDataComponent)this.currentUnit.GetComponent(nameof(MovementDataComponent)); m.route = null; m.offY = -1; break; } case RLKey.Down: { MovementDataComponent m = (MovementDataComponent)this.currentUnit.GetComponent(nameof(MovementDataComponent)); m.route = null; m.offY = 1; break; } case RLKey.Left: { MovementDataComponent m = (MovementDataComponent)this.currentUnit.GetComponent(nameof(MovementDataComponent)); m.route = null; m.offX = -1; break; } case RLKey.Right: { MovementDataComponent m = (MovementDataComponent)this.currentUnit.GetComponent(nameof(MovementDataComponent)); m.route = null; m.offX = 1; break; } case RLKey.Space: { MobDataComponent mdc = (MobDataComponent)this.currentUnit.GetComponent(nameof(MobDataComponent)); if (mdc.actionPoints > 0) { mdc.actionPoints -= 100; } break; } case RLKey.A: // Activate this.currentInputMode = InputMode.ActivatingCurrentItem; this.gameLog.Add("Enter number from 1-9"); break; case RLKey.D: { // Drop this.currentInputMode = InputMode.SelectItemFromInv; this.currentInputSubMode = InputSubMode.DroppingItem; this.ListItemsInInv(); this.gameLog.Add("Please select an item to drop"); break; } case RLKey.P: { // Pickup this.currentInputMode = InputMode.SelectItemFromFloor; this.currentInputSubMode = InputSubMode.PickingUpItem; this.ListItemsOnFloor(); this.gameLog.Add("Please select an item to pick-up"); break; } case RLKey.S: // Stop moving var md = (MovementDataComponent)this.currentUnit.GetComponent(nameof(MovementDataComponent)); md.route = null; this.gameLog.Add("Movement stopped"); break; case RLKey.T: { // Throw this.currentInputMode = InputMode.SelectMapPoint; this.currentInputSubMode = InputSubMode.ThrowingItem; this.gameLog.Add("Select where to throw"); break; } case RLKey.U: { // Use (e.g. shoot) this.UseCurrentItem(); break; } case RLKey.W: { // Walk this.currentInputMode = InputMode.SelectMapPoint; this.currentInputSubMode = InputSubMode.SelectingDestination; this.gameLog.Add("Select where to walk to"); break; } case RLKey.X: { // Test BulletEffect be = new BulletEffect(0, 0, 20, 20); EffectsSystem es = (EffectsSystem)this.ecs.GetSystem(nameof(EffectsSystem)); es.effects.Add(be); break; } } //if (action_performed) { this.SingleGameLoop(); //} this.checkVisibilitySystem.process(this.playersUnits); }
public void HandleMouseEvent(RLMouse mouse) { this.doRepaint = true; if (this.effectsSystem.HasEffects()) { return; } if (mouse.LeftPressed) { bool action_performed = false; if (this.currentInputMode == InputMode.SelectMapPoint) { if (this.currentInputSubMode == InputSubMode.SelectingDestination) { var pos = (PositionComponent)this.currentUnit.GetComponent(nameof(PositionComponent)); var md = (MovementDataComponent)this.currentUnit.GetComponent(nameof(MovementDataComponent)); md.route = Misc.GetLine(pos.x, pos.y, mouse.X, mouse.Y, true); this.gameLog.Add("Destination selected"); this.currentInputMode = InputMode.Normal; } else if (this.currentInputSubMode == InputSubMode.ThrowingItem) { var throwingSystem = (ThrowingSystem)this.ecs.GetSystem(nameof(ThrowingSystem)); throwingSystem.ThrowItem(this.currentUnit, mouse.X, mouse.Y); this.currentInputMode = InputMode.Normal; action_performed = true; } else if (this.currentInputSubMode == InputSubMode.SelectShotTarget) { ShootingSystem ss = (ShootingSystem)this.ecs.GetSystem(nameof(ShootingSystem)); MobDataComponent att = (MobDataComponent)this.currentUnit.GetComponent(nameof(MobDataComponent)); AbstractEntity target = ss.GetTargetAt(this.mapData.map[mouse.X, mouse.Y], mouse.X, mouse.Y, att.side); var pos = (PositionComponent)this.currentUnit.GetComponent(nameof(PositionComponent)); ss.EntityShootingAtEntity(this.currentUnit, new Point(pos.x, pos.y), target, new Point(mouse.X, mouse.Y)); } } else if (this.currentInputMode == InputMode.Normal) { // Have they clicked on an adjacent square var pos = (PositionComponent)this.currentUnit.GetComponent(nameof(PositionComponent)); if (GeometryFunctions.Distance(mouse.X, mouse.Y, pos.x, pos.y) < 2) { this.MouseClicked(mouse.X, mouse.Y); } } if (action_performed) { this.SingleGameLoop(); } } else { this.hoverText = this.GetSquareDesc(mouse.X, mouse.Y); if (this.currentInputMode == InputMode.SelectMapPoint) { var pos = (PositionComponent)this.currentUnit.GetComponent(nameof(PositionComponent)); this.line = Misc.GetLine(pos.x, pos.y, mouse.X, mouse.Y, true); } else { this.line = null; } } }