|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using ET.EventType;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
namespace ET
|
|
|
|
|
{
|
|
|
|
|
[FriendClass(typeof(Unit))]
|
|
|
|
|
[FriendClass(typeof(People))]
|
|
|
|
|
public static class UnitOperate
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
public static void InitProsperity(Unit unit)
|
|
|
|
|
{
|
|
|
|
|
var prosperity = 0;
|
|
|
|
|
BuildingComponent bc = unit.GetComponent<BuildingComponent>();
|
|
|
|
|
foreach (var v in bc.Children)
|
|
|
|
|
{
|
|
|
|
|
var building = (Building) v.Value;
|
|
|
|
|
if (building.Config.Boom > 0)
|
|
|
|
|
{
|
|
|
|
|
prosperity += building.Config.Boom;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// TODO 村民繁荣值
|
|
|
|
|
|
|
|
|
|
unit.Prosperity = prosperity;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void UpgradeScale(Unit unit)
|
|
|
|
|
{
|
|
|
|
|
var nextScale = (unit.Scale > 0? unit.Scale : 1) + 1;
|
|
|
|
|
ScaleConfig sc = ScaleConfigCategory.Instance.Get(nextScale);
|
|
|
|
|
if (unit.Prosperity >= sc.Prosperity)
|
|
|
|
|
{
|
|
|
|
|
unit.Scale = nextScale;
|
|
|
|
|
|
|
|
|
|
RewardGroupConfig rewardGroupConfig = RewardGroupConfigCategory.Instance.Get(sc.RewardGroup);
|
|
|
|
|
for (var i = 0; i < rewardGroupConfig.ItemId.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
StoreOperate.AddItem(unit, rewardGroupConfig.ItemId[i], rewardGroupConfig.Number[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int PeopleNum(Unit unit)
|
|
|
|
|
{
|
|
|
|
|
var peopleNum = unit.GetComponent<PeopleComponent>().Children.Count;
|
|
|
|
|
return peopleNum;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int TotalMinutesPerDay(Unit unit)
|
|
|
|
|
{
|
|
|
|
|
// TODO 一天的分钟数
|
|
|
|
|
var total = 5*12;
|
|
|
|
|
return total;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static long rectify(long origin = 0, long delta = 0,float min = float.NegativeInfinity, float max = float.PositiveInfinity)
|
|
|
|
|
{
|
|
|
|
|
var result = origin + delta;
|
|
|
|
|
if (result < min) {
|
|
|
|
|
result = (long)min;
|
|
|
|
|
}
|
|
|
|
|
if (result > max) {
|
|
|
|
|
result = (long)max;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int FoodConsumptionPerMinute(Unit unit)
|
|
|
|
|
{
|
|
|
|
|
var peopleCount = PeopleNum(unit);
|
|
|
|
|
WorldParametersConfig wc = WorldParametersConfigCategory.Instance.Get(WorldParam.FoodConsumption);
|
|
|
|
|
return peopleCount * wc.Value[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void UpdateFood(Unit unit)
|
|
|
|
|
{
|
|
|
|
|
var consume = FoodConsumptionPerMinute(unit);
|
|
|
|
|
var previous = unit.Food ;
|
|
|
|
|
unit.Food = rectify(unit.Food, -consume, -consume*TotalMinutesPerDay(unit));
|
|
|
|
|
|
|
|
|
|
if (unit.Food <= 0) {
|
|
|
|
|
if (previous > 0) {
|
|
|
|
|
// todo debuff
|
|
|
|
|
}
|
|
|
|
|
} else if (previous <= 0) {
|
|
|
|
|
// todo buff
|
|
|
|
|
}
|
|
|
|
|
#if SERVER
|
|
|
|
|
UnitHelper.NofityUpdateValley(unit, new List<int> { NumericType.Food }, new List<long> { unit.Food });
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int WaterConsumptionPerMinute(Unit unit)
|
|
|
|
|
{
|
|
|
|
|
var peopleCount = PeopleNum(unit);
|
|
|
|
|
WorldParametersConfig wc = WorldParametersConfigCategory.Instance.Get(WorldParam.WaterConsumption);
|
|
|
|
|
return peopleCount * wc.Value[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void UpdateWater(Unit unit)
|
|
|
|
|
{
|
|
|
|
|
var consume = WaterConsumptionPerMinute(unit);
|
|
|
|
|
var previous = unit.Water ;
|
|
|
|
|
unit.Water = rectify(unit.Water, -consume, -consume*TotalMinutesPerDay(unit));
|
|
|
|
|
if (unit.Water <= 0)
|
|
|
|
|
{
|
|
|
|
|
unit.Water = 0;
|
|
|
|
|
if (previous > 0)
|
|
|
|
|
{
|
|
|
|
|
// todo debuff
|
|
|
|
|
}
|
|
|
|
|
} else if (previous <= 0)
|
|
|
|
|
{
|
|
|
|
|
// todo buff
|
|
|
|
|
}
|
|
|
|
|
#if SERVER
|
|
|
|
|
UnitHelper.NofityUpdateValley(unit, new List<int> { NumericType.Water }, new List<long> { unit.Water });
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static EventGroupConfig GetNightEventConfig()
|
|
|
|
|
{
|
|
|
|
|
EventGroupConfig eventGroupConfig= null;
|
|
|
|
|
List<EventGroupConfig> list = EventGroupConfigCategory.Instance.GetList();
|
|
|
|
|
foreach (var v in list)
|
|
|
|
|
{
|
|
|
|
|
if (v.Type == 2)
|
|
|
|
|
{
|
|
|
|
|
eventGroupConfig = v;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return eventGroupConfig;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int[] AddArray(int[] probs, int[] overlay, int index)
|
|
|
|
|
{
|
|
|
|
|
if (probs == null || overlay == null)
|
|
|
|
|
{
|
|
|
|
|
return probs;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (var i=0; i<probs.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
if (i == index)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
probs[i] += overlay[i];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return probs;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int CheckMoonNightTime(int day, int nightTime)
|
|
|
|
|
{
|
|
|
|
|
if (day % 15 == 0)
|
|
|
|
|
{
|
|
|
|
|
nightTime += 400;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nightTime;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int[] CopyArray(int[] array)
|
|
|
|
|
{
|
|
|
|
|
int[] copy = new int[array.Length];
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < array.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
copy[i] = array[i];
|
|
|
|
|
}
|
|
|
|
|
return copy;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int TimePass(int fromTime, int passTime) {
|
|
|
|
|
int hours;
|
|
|
|
|
int minutes;
|
|
|
|
|
ParseTime(fromTime,out hours, out minutes);
|
|
|
|
|
return TimePassWithHm(hours, minutes, passTime);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void ParseTime(int time, out int hours, out int minutes)
|
|
|
|
|
{
|
|
|
|
|
hours = time / 100;
|
|
|
|
|
minutes = time % 100;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static int TimePassWithHm(int hour,int minute,int passTime)
|
|
|
|
|
{
|
|
|
|
|
minute += passTime;
|
|
|
|
|
if(minute < 0)
|
|
|
|
|
{
|
|
|
|
|
int hourDelta = (Math.Abs(minute/60) + 1);
|
|
|
|
|
minute += 60 * hourDelta;
|
|
|
|
|
hour -= hourDelta;
|
|
|
|
|
|
|
|
|
|
if(hour < 0)
|
|
|
|
|
{
|
|
|
|
|
int dayDelta = (Math.Abs(hour/24) + 1);
|
|
|
|
|
hour += 24 * dayDelta;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
hour += (minute/60);
|
|
|
|
|
minute = minute % 60;
|
|
|
|
|
hour = hour % 24;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return hour* 100 + minute;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static List<NightEvent> NightEvent(Unit unit, int nightTime, int time)
|
|
|
|
|
{
|
|
|
|
|
EventGroupConfig egc = GetNightEventConfig();
|
|
|
|
|
var nightEvents = new List<NightEvent>();
|
|
|
|
|
Log.Info($"EventGroupConfig: {egc.ToString()}");
|
|
|
|
|
int[] eventWeight = CopyArray(egc.EventWeight);
|
|
|
|
|
int[] overlayWeight = CopyArray(egc.OverlayWeight);
|
|
|
|
|
int[] eventList = CopyArray(egc.Event);
|
|
|
|
|
Log.Info($"eventWeight: {string.Join(",", eventWeight)} :{egc.EventWeight.Clone()}");
|
|
|
|
|
Log.Info($"overlayWeight: {string.Join(",", overlayWeight)}");
|
|
|
|
|
Log.Info($"eventList: {string.Join(",", eventList)}");
|
|
|
|
|
int eventCount = 0;
|
|
|
|
|
int h = 23 - nightTime / 100;
|
|
|
|
|
int m = 60 - (nightTime % 100);
|
|
|
|
|
h += time / 100;
|
|
|
|
|
m += time % 100;
|
|
|
|
|
int topM = m + h * 60;
|
|
|
|
|
int curM = 0;
|
|
|
|
|
List<int> timeList = new List<int>();
|
|
|
|
|
var rand = new ValleyRandom();
|
|
|
|
|
rand.SetSeed(unit.EventSeed);
|
|
|
|
|
while (topM > curM)
|
|
|
|
|
{
|
|
|
|
|
var range = rand.RandomNumber(80, 120);
|
|
|
|
|
curM += range;
|
|
|
|
|
if (curM > topM)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
eventCount++;
|
|
|
|
|
timeList.Add(TimePass(nightTime, curM));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < eventCount; i++)
|
|
|
|
|
{
|
|
|
|
|
int index =RandomHelper.RandomByWeight(eventWeight);
|
|
|
|
|
Log.Info($"eventWeight: {string.Join(",",eventWeight)}, eventList: {string.Join(",",eventList)}, index: {string.Join(",",index)}");
|
|
|
|
|
if (index == -1)
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
int id = eventList[index];
|
|
|
|
|
NightEvent nightEvent = new NightEvent();
|
|
|
|
|
nightEvent.EventId = id;
|
|
|
|
|
nightEvent.Time = timeList[i];
|
|
|
|
|
nightEvents.Add(nightEvent);
|
|
|
|
|
eventWeight = AddArray(eventWeight, overlayWeight, index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var ne in nightEvents)
|
|
|
|
|
{
|
|
|
|
|
NightEvent nightEvent = ne;
|
|
|
|
|
EventConfig eventConfig = EventConfigCategory.Instance.Get(nightEvent.EventId);
|
|
|
|
|
// todo 掉落组数量
|
|
|
|
|
if (eventConfig.DropGroup[0] > 0)
|
|
|
|
|
{
|
|
|
|
|
nightEvent.Drops = new Dictionary<int, int>();
|
|
|
|
|
foreach (var v in eventConfig.DropGroup)
|
|
|
|
|
{
|
|
|
|
|
(int dropId,int num) = DropOperate.DropItem(unit, v);
|
|
|
|
|
if (!nightEvent.Drops.ContainsKey(dropId))
|
|
|
|
|
{
|
|
|
|
|
nightEvent.Drops[dropId] = 0;
|
|
|
|
|
}
|
|
|
|
|
nightEvent.Drops[dropId] += num;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if SERVER
|
|
|
|
|
List<string> names = new List<string>();
|
|
|
|
|
foreach (var v in unit.GetComponent<PeopleComponent>().Children.Values)
|
|
|
|
|
{
|
|
|
|
|
names.Add(((People)v).Name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unit.EventNames = new List<string>();
|
|
|
|
|
foreach (var ne in nightEvents)
|
|
|
|
|
{
|
|
|
|
|
var index = RandomHelper.RandomNumber(0, names.Count - 1);
|
|
|
|
|
unit.EventNames.Add(names[index]);
|
|
|
|
|
ne.Name = names[index];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MessageHelper.SendToClient(unit,new M2C_NotifyNightEvent(){EventSeed = unit.EventSeed, NightTime = nightTime, Time = time, EventNames = unit.EventNames});
|
|
|
|
|
#else
|
|
|
|
|
for (var i=0; i<nightEvents.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
Log.Console("night======================================{0},{1}",nightEvents.Count,unit.EventNames.Count);
|
|
|
|
|
nightEvents[i].Name = unit.EventNames[i];
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
Log.Info($"nightEvents: {nightEvents.Count}, topM: {topM}, nightTime: {nightTime}, time: {time}");
|
|
|
|
|
foreach (var v in nightEvents)
|
|
|
|
|
{
|
|
|
|
|
Log.Info($"nightEvent: name: {v.Name}, EventId: {v.EventId}, Time: {v.Time}, Drops: {v.Drops}");
|
|
|
|
|
}
|
|
|
|
|
return nightEvents;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static SeasonConfig GetSeasonConfigByDay(int day,int season)
|
|
|
|
|
{
|
|
|
|
|
var gamestageConfigList = GameStageConfigCategory.Instance.GetList();
|
|
|
|
|
int stage = 4;
|
|
|
|
|
foreach (var v in gamestageConfigList)
|
|
|
|
|
{
|
|
|
|
|
if (v.StartDay < day && v.EndDay > day)
|
|
|
|
|
{
|
|
|
|
|
stage = v.Id;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<SeasonConfig> listConfig = SeasonConfigCategory.Instance.GetList();
|
|
|
|
|
foreach (var v in listConfig)
|
|
|
|
|
{
|
|
|
|
|
if (v.Tapy == season && v.Stage == stage)
|
|
|
|
|
{
|
|
|
|
|
return v;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|