public MainNet(MainNet mainNet) : this() { // Copy synapses for (int i = 0; i < synapseList.Count; i++) { synapseList[i].strength = mainNet.synapseList[i].strength; } }
public Creature(int posX, int posY, Creature creature = null) { bodySize = bodySizeDefault; position.X = posX; position.Y = posY; moveTarget.X = posX; moveTarget.Y = posY; pen = new Pen(Color.FromArgb(255, 0, 0, 0)); // Set request request = Request.NONE; // Set activity activity = Activity.THINK; // Set skills if (creature != null) { this.farmSkill = creature.farmSkill * 5 / 10; this.mineSkill = creature.mineSkill * 5 / 10; this.fightSkill = creature.fightSkill * 5 / 10; if (fightSkill < 10) { fightSkill = 10; } } else { this.farmSkill = creatureAverageFarmSkill; this.mineSkill = creatureAverageMiningSkill; this.fightSkill = 10; } // Set resources if (creature != null) { // Take resources from parent this.food = creature.food / 2; creature.food /= 2; this.ore = creature.ore / 2; creature.ore /= 2; } else { // Set initial resources this.food = 100; this.ore = 50; } // Set neural net if (creature != null) { mainNet = new MainNet(creature.mainNet); mainNet.Evolve(); // Set preferences foodValueForLooting *= NeuralNet.logit((float)rand.NextDouble()) + 1; oreValueForLooting *= NeuralNet.logit((float)rand.NextDouble()) + 1; } else { mainNet = new MainNet(); } // Set appearance if (creature != null) { // Set colour bodyR = creature.bodyR; bodyG = creature.bodyG; bodyB = creature.bodyB; int colourIndex = rand.Next() % 6; byte colourOffset = Convert.ToByte(rand.Next() % 10); switch (colourIndex) { case 0: bodyR += colourOffset; break; case 1: bodyR -= colourOffset; break; case 2: bodyG += colourOffset; break; case 3: bodyG -= colourOffset; break; case 4: bodyB += colourOffset; break; case 5: bodyB -= colourOffset; break; } } else { bodyR = Convert.ToByte(rand.Next() % 256); bodyG = Convert.ToByte(rand.Next() % 256); bodyB = Convert.ToByte(rand.Next() % 256); } brush = new SolidBrush(Color.FromArgb(255, bodyR, bodyG, bodyB)); }
internal override void Update(Creature creature, Map map) { // Find creature with lowest selling value float ourItemValue; // Amount we value item float theirItemValue; // Amount they value item float buyValue; // Amount we want the trade float sellValue; // Amount trading partner wants the trade Creature tradingPartner; // Trading Partner // Look for a trading partner for food tradingPartner = null; buyValue = 0; sellValue = 0; ourItemValue = creature.mainNet.nodeList[creature.mainNet.nodeList.Count - 1][4].value; foreach(Creature potentialTradingPartner in creature.currentTile.creatureResidentList) { // If other creature will sell for less than we value item theirItemValue = potentialTradingPartner.mainNet.nodeList[potentialTradingPartner.mainNet.nodeList.Count - 1][4].value; if(ourItemValue - theirItemValue > buyValue) { // Remember this potential trade buyValue = ourItemValue - theirItemValue; tradingPartner = potentialTradingPartner; } } // If we found a trading partner if(tradingPartner != null) { // If partner has items to sell if(tradingPartner.food > 100) { // Find something that partner will buy theirItemValue = tradingPartner.mainNet.nodeList[tradingPartner.mainNet.nodeList.Count - 1][5].value; ourItemValue = creature.mainNet.nodeList[creature.mainNet.nodeList.Count - 1][5].value; if(theirItemValue - ourItemValue > sellValue) { sellValue = theirItemValue - ourItemValue; } // If they're willing to trade and we have enough resources to trade if(sellValue > 0 && creature.ore > 100) { // Mark trading partner creature.circleColour(255, 255, 0); tradingPartner.circleColour(255, 255, 0); // Trade at ratio of preferences if(buyValue > sellValue) { // We value the trade more, so we give more to make the trade happen buyValue /= sellValue; buyValue = (MainNet.sigmoid(buyValue) - 500) / 50; // Give buyValue for every 1 purchase tradingPartner.ore += (int)buyValue; creature.ore -= (int)buyValue; tradingPartner.food -= 1; creature.food += 1; } else { // They value the trade more, so we take more to make the trade happen sellValue /= buyValue; sellValue = (MainNet.sigmoid(sellValue) - 500) / 50; // Buy sellValue for every 1 sold tradingPartner.ore += 1; creature.ore -= 1; tradingPartner.food -= (int)sellValue; creature.food += (int)sellValue; } } } } // Look for a trading partner for ore tradingPartner = null; buyValue = 0; sellValue = 0; ourItemValue = creature.mainNet.nodeList[creature.mainNet.nodeList.Count - 1][5].value; foreach(Creature potentialTradingPartner in creature.currentTile.creatureResidentList) { // If other creature will sell for less than we value item theirItemValue = potentialTradingPartner.mainNet.nodeList[potentialTradingPartner.mainNet.nodeList.Count - 1][5].value; if(ourItemValue - theirItemValue > buyValue) { // Remember this potential trade buyValue = ourItemValue - theirItemValue; tradingPartner = potentialTradingPartner; } } // If we found a trading partner if(tradingPartner != null) { // If partner has items to sell if(tradingPartner.ore > 100) { // Find something that partner will buy theirItemValue = tradingPartner.mainNet.nodeList[tradingPartner.mainNet.nodeList.Count - 1][4].value; ourItemValue = creature.mainNet.nodeList[creature.mainNet.nodeList.Count - 1][4].value; if(theirItemValue - ourItemValue > sellValue) { sellValue = theirItemValue - ourItemValue; } // If they're willing to trade and we have enough resources to trade if(sellValue > 0 && creature.food > 100) { // Mark trading partner creature.circleColour(255, 255, 0); tradingPartner.circleColour(255, 255, 0); // Trade at ratio of preferences if(buyValue > sellValue) { // We value the trade more, so we give more to make the trade happen buyValue /= sellValue; buyValue = (MainNet.sigmoid(buyValue) - 500) / 10; // Give buyValue for every 1 purchase tradingPartner.food += (int)buyValue; creature.food -= (int)buyValue; tradingPartner.ore -= 1; creature.ore += 1; } else { // They value the trade more, so we take more to make the trade happen sellValue /= buyValue; sellValue = (MainNet.sigmoid(sellValue) - 500) / 10; // Buy sellValue for every 1 sold tradingPartner.food += 1; creature.food -= 1; tradingPartner.ore -= (int)sellValue; creature.ore += (int)sellValue; } } } } // Add creature to tile resident if(!creature.currentTile.creatureResidentList.Contains(creature)) { creature.currentTile.creatureResidentList.Add(creature); } creature.activity = Creature.Activity.TRADE; }