예제 #1
0
 public MainNet(MainNet mainNet) : this()
 {
     // Copy synapses
     for (int i = 0; i < synapseList.Count; i++)
     {
         synapseList[i].strength = mainNet.synapseList[i].strength;
     }
 }
예제 #2
0
        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));
        }
예제 #3
0
		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;
		}