예제 #1
0
        private static void _finalize_trade(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var transaction   = Memory.GetValue("$trade_transaction").AsObject as Trade.TradeTransaction;
            var envoy         = Memory.GetValue("$envoy").AsObject as TradeEnvoy;
            var playerFaction = Memory.GetValue("$player_faction").AsObject as Faction;
            var world         = Memory.GetValue("$world").AsObject as WorldManager;

            if (transaction == null || envoy == null || playerFaction == null || world == null)
            {
                State.PlayerInterface.Output("Command 'finalize_trade' can only be called from a TradeEnvoy initiated conversation.");
                return;
            }

            transaction.Apply(world);

            world.GoalManager.OnGameEvent(new Goals.Triggers.Trade
            {
                PlayerFaction = playerFaction,
                PlayerGold    = transaction.PlayerMoney,
                PlayerGoods   = transaction.PlayerItems,
                OtherFaction  = envoy.OwnerFaction,
                OtherGold     = transaction.EnvoyMoney,
                OtherGoods    = transaction.EnvoyItems
            });
        }
예제 #2
0
        private static void _political_event(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var envoy         = Memory.GetValue("$envoy").AsObject as TradeEnvoy;
            var playerFaction = Memory.GetValue("$player_faction").AsObject as Faction;
            var world         = Memory.GetValue("$world").AsObject as WorldManager;

            if (envoy == null || playerFaction == null || world == null)
            {
                State.PlayerInterface.Output("Command 'political_event' can only be called from a TradeEnvoy initiated conversation.");
                return;
            }

            var politics = world.Diplomacy.GetPolitics(playerFaction, envoy.OwnerFaction);

            if (!politics.RecentEvents.Any(ev => ev.Description == (string)Arguments[0].Value))
            {
                politics.RecentEvents.Add(new Diplomacy.PoliticalEvent()
                {
                    Description = (string)Arguments[0].Value,
                    Change      = (float)Arguments[1].Value,
                    Duration    = new TimeSpan((int)((float)Arguments[2].Value), 0, 0, 0),
                    Time        = world.Time.CurrentDate
                });
            }
        }
예제 #3
0
        private static void _wait_for_trade(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var envoy         = Memory.GetValue("$envoy").AsObject as TradeEnvoy;
            var playerFaction = Memory.GetValue("$player_faction").AsObject as Faction;
            var world         = Memory.GetValue("$world").AsObject as WorldManager;

            State.Pause();
            State.PlayerInterface.WaitForTrade((tradeResult, transaction) =>
            {
                if (tradeResult == Play.Trading.TradeDialogResult.Cancel)
                {
                    Memory.SetValue("$trade_result", new Yarn.Value("cancelled"));
                }
                else if (tradeResult == Play.Trading.TradeDialogResult.RejectProfit)
                {
                    Memory.SetValue("$trade_result", new Yarn.Value("unprofitable"));
                }
                else if (envoy.OwnerFaction.Race.HasValue(out var race0) && transaction.PlayerItems.Select(i => Library.GetResourceType(i.TypeName))
                         .SelectMany(i => { if (i.HasValue(out var t))
                                            {
                                                return(t.Tags);
                                            }
                                            return(new List <String>()); })
                         .Any(tag => race0.HatedResources.Contains(tag)))
                {
                    Memory.SetValue("$trade_result", new Yarn.Value("hated"));
                }
예제 #4
0
 private static void _pick(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
 {
     State.EnterQueueingAction((list) =>
     {
         if (list.Count > 0)
         {
             State.PlayerInterface.Speak(list[Random.Next(list.Count)] + "\n");
         }
     });
 }
예제 #5
0
        private static void _set_portrait(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var frames = new List <int>();

            for (var i = 4; i < Arguments.Count; ++i)
            {
                frames.Add((int)((float)Arguments[i].Value));
            }
            State.PlayerInterface.SetPortrait((string)Arguments[0].Value, (int)((float)Arguments[1].Value), (int)((float)Arguments[2].Value), (float)Arguments[3].Value, frames);
        }
예제 #6
0
 private static void _set_language(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
 {
     if (Library.GetRace(Arguments[0].Value.ToString()).HasValue(out var race))
     {
         State.PlayerInterface.SetLanguage(race.Language);
     }
     else
     {
         State.PlayerInterface.Output("ERROR setting language: Race not found.");
     }
 }
예제 #7
0
        private static void _end_strike(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var employee = Memory.GetValue("$employee");
            var creature = employee.AsObject as CreatureAI;

            if (creature == null)
            {
                return;
            }
            creature.Status.IsOnStrike = false;
        }
예제 #8
0
        private static void _add_thought(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var employee = Memory.GetValue("$employee");
            var creature = employee.AsObject as CreatureAI;

            if (creature == null)
            {
                return;
            }
            creature.Creature.AddThought((string)Arguments[0].Value, new TimeSpan((int)(float)Arguments[2].Value, 0, 0), (float)Arguments[1].Value);
        }
예제 #9
0
        private static void _recall_envoy(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var envoy = Memory.GetValue("$envoy").AsObject as TradeEnvoy;

            if (envoy == null)
            {
                State.PlayerInterface.Output("Command 'recall_envoy' can only be called from a TradeEnvoy initiated conversation.");
                return;
            }

            Diplomacy.RecallEnvoy(envoy);
        }
예제 #10
0
        private static void _set_language(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var race = RaceLibrary.FindRace(Arguments[0].Value.ToString());

            if (race != null)
            {
                State.PlayerInterface.SetLanguage(race.Speech.Language);
            }
            else
            {
                State.PlayerInterface.Output("ERROR setting language: Race not found.");
            }
        }
예제 #11
0
        private static void _make_peace(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var envoy         = Memory.GetValue("$envoy").AsObject as TradeEnvoy;
            var playerFaction = Memory.GetValue("$player_faction").AsObject as Faction;
            var world         = Memory.GetValue("$world").AsObject as WorldManager;

            if (envoy == null || playerFaction == null || world == null)
            {
                State.PlayerInterface.Output("Command 'make_peace' can only be called from a TradeEnvoy initiated conversation.");
                return;
            }

            world.Overworld.GetPolitics(playerFaction.ParentFaction, envoy.OwnerFaction.ParentFaction).IsAtWar = false;
        }
예제 #12
0
        private static void _pay_employee(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var employee = Memory.GetValue("$employee");
            var creature = employee.AsObject as CreatureAI;

            if (creature == null)
            {
                return;
            }
            var bonus = Memory.GetValue("$employee_bonus").AsNumber;

            creature.AddMoney((decimal)(float)bonus);
            creature.Faction.AddMoney(-(decimal)(float)bonus);
        }
예제 #13
0
        private static void _finalize_market(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var transaction   = Memory.GetValue("$trade_transaction").AsObject as Trade.MarketTransaction;
            var envoy         = Memory.GetValue("$envoy").AsObject as TradeEnvoy;
            var playerFaction = Memory.GetValue("$player_faction").AsObject as Faction;
            var world         = Memory.GetValue("$world").AsObject as WorldManager;

            if (transaction == null || envoy == null || playerFaction == null || world == null)
            {
                State.PlayerInterface.Output("Command 'finalize_trade' can only be called from a TradeEnvoy initiated conversation.");
                return;
            }

            transaction.Apply(world);
        }
예제 #14
0
        private static void _market(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var realState = State.PlayerInterface as YarnState; // THIS IS A HACK.

            var envoy         = Memory.GetValue("$envoy").AsObject as TradeEnvoy;
            var playerFaction = Memory.GetValue("$player_faction").AsObject as Faction;
            var world         = Memory.GetValue("$world").AsObject as WorldManager;

            if (envoy == null || playerFaction == null || world == null)
            {
                State.PlayerInterface.Output("Command 'trade' can only be called from a TradeEnvoy initiated conversation.");
                return;
            }

            State.PlayerInterface.BeginMarket(envoy, playerFaction);
        }
        private static void _pay_tribute(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var envoy         = Memory.GetValue("$envoy").AsObject as TradeEnvoy;
            var playerFaction = Memory.GetValue("$player_faction").AsObject as Faction;
            var world         = Memory.GetValue("$world").AsObject as WorldManager;

            if (envoy == null || playerFaction == null || world == null)
            {
                State.PlayerInterface.Output("Command 'pay_tribute' can only be called from a TradeEnvoy initiated conversation.");
                return;
            }

            envoy.TributeDemanded = (decimal)0.0f;
            playerFaction.AddMoney(-Math.Min(world.PlayerFaction.Economy.CurrentMoney,
                                             envoy.TributeDemanded));
            Memory.SetValue("$envoy_tribute_demanded", new Yarn.Value(0.0f));
            Memory.SetValue("$envoy_demands_tribute", new Yarn.Value(false));
        }
예제 #16
0
        private static void _declare_war(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var envoy         = Memory.GetValue("$envoy").AsObject as TradeEnvoy;
            var playerFaction = Memory.GetValue("$player_faction").AsObject as Faction;
            var world         = Memory.GetValue("$world").AsObject as WorldManager;

            if (envoy == null || playerFaction == null || world == null)
            {
                State.PlayerInterface.Output("Command 'declare_war' can only be called from a TradeEnvoy initiated conversation.");
                return;
            }

            world.GoalManager.OnGameEvent(new Goals.Triggers.DeclareWar
            {
                PlayerFaction = playerFaction,
                OtherFaction  = envoy.OwnerFaction
            });
        }
예제 #17
0
        private static void _add_thought(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var employee = Memory.GetValue("$employee");
            var creature = employee.AsObject as CreatureAI;

            if (creature == null)
            {
                return;
            }
            creature.Creature.AddThought(new Thought()
            {
                Description       = (string)Arguments[0].Value,
                TimeLimit         = new TimeSpan((int)(float)Arguments[2].Value, 0, 0),
                HappinessModifier = (float)Arguments[1].Value,
                Type      = Thought.ThoughtType.Other,
                TimeStamp = creature.World.Time.CurrentDate
            }, false);
        }
예제 #18
0
        private static void _wait_for_trade(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var envoy         = Memory.GetValue("$envoy").AsObject as TradeEnvoy;
            var playerFaction = Memory.GetValue("$player_faction").AsObject as Faction;
            var world         = Memory.GetValue("$world").AsObject as WorldManager;

            State.Pause();
            State.PlayerInterface.WaitForTrade((tradeResult, transaction) =>
            {
                if (tradeResult == Gui.Widgets.TradeDialogResult.Cancel)
                {
                    Memory.SetValue("$trade_result", new Yarn.Value("cancelled"));
                }
                else if (tradeResult == Gui.Widgets.TradeDialogResult.RejectProfit)
                {
                    Memory.SetValue("$trade_result", new Yarn.Value("unprofitable"));
                }
                else if (transaction.PlayerItems.Select(i => Library.GetResourceType(i.Type))
                         .SelectMany(i => i.Tags)
                         .Any(tag => envoy.OwnerFaction.Race.HatedResources.Contains(tag)))
                {
                    Memory.SetValue("$trade_result", new Yarn.Value("hated"));
                }
                else if (transaction.PlayerItems.Select(i => Library.GetResourceType(i.Type))
                         .SelectMany(i => i.Tags)
                         .Any(tag => envoy.OwnerFaction.Race.LikedResources.Contains(tag)))
                {
                    Memory.SetValue("$trade_result", new Yarn.Value("liked"));
                }
                else
                {
                    Memory.SetValue("$trade_result", new Yarn.Value("acceptable"));
                }

                Memory.SetValue("$trade_transaction", new Yarn.Value(transaction));
                State.CancelSpeech();
                State.Unpause();
            });
        }
예제 #19
0
        private static void _end_strike(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var employee = Memory.GetValue("$employee");
            var creature = employee.AsObject as CreatureAI;

            if (creature == null)
            {
                return;
            }
            creature.Stats.IsOnStrike = false;

            if (creature.GetRoot().GetComponent <DwarfThoughts>().HasValue(out var thoughts))
            {
                thoughts.Thoughts.RemoveAll(t => t.Description.Contains("paid"));
                creature.Creature.AddThought("I got paid recently.", new TimeSpan(1, 0, 0, 0), 10.0f);
            }

            if (creature is DwarfAI dorf)
            {
                dorf.OnPaid();
            }
        }
예제 #20
0
        private static void _wait_for_market(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var envoy         = Memory.GetValue("$envoy").AsObject as TradeEnvoy;
            var playerFaction = Memory.GetValue("$player_faction").AsObject as Faction;
            var world         = Memory.GetValue("$world").AsObject as WorldManager;

            State.Pause();
            State.PlayerInterface.WaitForMarket((tradeResult, transaction) =>
            {
                if (tradeResult == Gui.Widgets.MarketDialogResult.Cancel)
                {
                    Memory.SetValue("$trade_result", new Yarn.Value("cancelled"));
                }
                else
                {
                    Memory.SetValue("$trade_result", new Yarn.Value("acceptable"));
                }

                Memory.SetValue("$trade_transaction", new Yarn.Value(transaction));
                State.CancelSpeech();
                State.Unpause();
            });
        }
        private static void _political_event(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
        {
            var envoy         = Memory.GetValue("$envoy").AsObject as TradeEnvoy;
            var playerFaction = Memory.GetValue("$player_faction").AsObject as Faction;
            var world         = Memory.GetValue("$world").AsObject as WorldManager;

            if (envoy == null || playerFaction == null || world == null)
            {
                State.PlayerInterface.Output("Command 'political_event' can only be called from a TradeEnvoy initiated conversation.");
                return;
            }

            var politics = world.Overworld.GetPolitics(playerFaction.ParentFaction, envoy.OwnerFaction.ParentFaction);

            if (!politics.HasEvent((string)Arguments[0].Value))
            {
                politics.AddEvent(new PoliticalEvent()
                {
                    Description = (string)Arguments[0].Value,
                    Change      = (float)Arguments[1].Value,
                });
            }
        }
예제 #22
0
 private static void _end_conversation(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
 {
     State.EndConversation();
 }
예제 #23
0
 private static void _hide_portrait(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
 {
     State.PlayerInterface.HidePortrait();
 }
예제 #24
0
 private static void _end_trade(YarnEngine State, List <Ancora.AstNode> Arguments, Yarn.MemoryVariableStore Memory)
 {
     State.PlayerInterface.EndTrade();
 }