public override void run(params DuckMind[] participants) { if (participants.Length != 2) { throw new ArgumentException("only two participants", nameof(participants)); } var me = participants[0]; // this should be "me" var myTraits = new Traits(me.soul); var giver = participants[1]; // the one who gave me stuff // food value [0, 40] var maxFoodValue = 40; var foodValue = (int)(sig.energy / 400f) * maxFoodValue; // calculate opinion delta var opinionDelta = 0; var currentOpinion = me.state.getOpinion(giver.state.me); // calculate receptiveness to food // receptive (innate) [0, 1] var innateFoodReceiptiveness = TraitCalc.transform(myTraits.receptiveness, -0.4f, 1f, 0f, 1f); // receptive (happy) [0, 0.5] var happyFoodReceptiveness = TraitCalc.transform(me.soul.emotions.happy, -1.5f, 1f, 0f, 0.5f); // receptive [0, 2] var foodReceptiveness = GMathf.clamp( innateFoodReceiptiveness + happyFoodReceptiveness, 0f, 2f ); // significantly diminishing rewards, effectively capping around ~300 var foodOpinionWeight = LCurves.diminishingReturns(currentOpinion / 10f, 1f, 0.1f); opinionDelta += (int)(foodReceptiveness * foodValue * foodOpinionWeight); // food makes me happy! me.soul.emotions.spikeHappy(GMathf.clamp(foodReceptiveness, 0, 0.8f)); // add opinion to the one that fed me me.state.addOpinion(giver.state.me, opinionDelta); }
private int scoreRatio(float ratio, int weight) { var score = LCurves.ratioAdvantage(ratio, 1.2f); return((int)(score * weight)); }