Jump to content

FEXNA (Currently In Private Beta)


BwdYeti
 Share

Recommended Posts

  • Replies 1.2k
  • Created
  • Last Reply

Top Posters In This Topic

This may seem like a stupid question but can you edit growth rates to be negative?

Like upon a level up you have a 10% chance to lose a stat point?

Edited by Roysourboy
Link to comment
Share on other sites

As many have said previously, if you can do the programming to mod it into the engine, you can do anything you want with it. I don't know if the base engine will support it, however.

That is a rather interesting idea, though. Looking to make a Tellah-like character?

Link to comment
Share on other sites

Actually thanks for the reminder, I thought you could, I keep bringing it up, but I guess Yeti keeps forgetting to actually add it lol. The Editor has support for negative growths, they just aren't handled ingame properly: it'll display a stat down, but the stat doesn't actually go down.

It shouldn't be hard though yeah. I'm pretty sure for some reason the engine clamps stats using the current stat as the minimum, no clue why though. Just make it clamp from 0 to cap instead.

Link to comment
Share on other sites

Few more questions about stuff

  1. Is it built in that you can put in supports, and have them affect character endings?

  2. Is there a play mode where you set a list of chapters and play though them like a regular FE game?

  3. Is there a list of weapons that will be in the game?

  4. Can you assign skills to characters and not classes?

  5. In this picture, what is the Heavy and Magic type(what does it effect) and can you give an example on some currently existing classes with these traits?FEXNA_Class.png

  6. Can you edit enemy AI?

Edited by Roysourboy
Link to comment
Share on other sites

1-supports are yes. Affecting character endings will probably be yes--endings aren't implemented, but I'm sure you can check supports with events if nothing else.

2-Like, without going to the world map between chapters? This novel concept was apparently not thought of by Yeti until I started doing just that and finding a bunch of bugs. Don't worry, it'll work out in the end.

3-pretty much 7x's weapons, plus whatever else you want to add?

4-yes you can do both, and a unit's skills will be combined from what the actor and class have for a given level (because you can learn skills by level up)

5-Those are for, like, effective weapons. Dark Mages/Shamans/Sorcerors/whatever you call them are both Heavy and Mages, so you can make weapons that are effective against them. I haven't seen any important differences between Infantry and Heavy, but this is an example of something you could do if you want.

6-specifically? You can look up FETD for an example of making code edits to the AI, but that's somewhat advanced. If you just want different units to have AIs such that, for example, one unit will stand still, another will stand still but attack when you come in range, and another will try to rush you and attack, of course you can.

2(from reddit)-see that button on the bottom left? Add Class? See that checkbox with a bunch of number fields below it where you can set a class' individual caps? Yeah. Currently it's a little roundabout to set different max levels for different classes--we can try convincing Yeti again, but as it stands you'd need to edit the code that handles Trainees as a special case that forces a maximum level of 10--even as-is you could edit this to be whatever you wanted, if you didn't want standard trainees.

Link to comment
Share on other sites

I forgot to add one

How easy would it be to make gameplay choices that lead to a chapter split(like in Binding Blade with the two villages that determine whether you go Elphin or Lalum route)? Could I easily make a chapter where which boss you defeat determines which chapter you go to next? And can I edit certain characters to only spawn if certain requirements are met like Harken/Karel?

Edited by Roysourboy
Link to comment
Share on other sites

I think someone may have asked this before but I can't find it

How easy is it to edit weapon ranks

Like rolling Wind, Thunder, and Fire all into one and adding Knives

Can I just turn Thunder into Anima, Wind into Knives, and delete Fire?

Link to comment
Share on other sites

Not really. The closest you can do to that is making a promotion item that promotes you to an identical class other than that it has an extra skill. The item would probably have to only be for one class though.

I mean you could code it yourself so yes it's possible, but generally speaking people who ask "is x possible" aren't going to do that kind of coding...

Link to comment
Share on other sites

Would a workaround for the skill scroll be to make it so that, upon level up, the scroll in the unit's inventory would be learned? Like, by having the scroll in the inventory, that skill is written as the unit's next still gained via level, then consumed upon level up if it has limited uses.

Link to comment
Share on other sites

The issue is that units currently don't save learned skills in any way--any time the engine wants to access the list of skills a unit has, it simply combines those attached to the actor, class, and inventory. You have to attach a skill to one of those to give a unit a skill. You could make skill scrolls a held item only usable by certain classes, so as long as it's in their inventory they have the skill, but there's no way to make it disappear but have the unit keep the skill, at least right now.

(by default you can't make the skill scroll untradeable either)

Link to comment
Share on other sites

Is there a base like in FE9/10 in between chapters?

How hard would it be to make a base chapter?

As in something where you can buy basic weapons and items, trade stuff and promote, and talk to units with?

Would I be able to do it by making a chapter in between chapters that you go to every time you beat a chapter(like once you beat chapter 9 you go to chapter 9x, which is just a base that you can escape out of with the lord to go to the next chapter) and just make a new chapter like this everytime there is a break in story?

Also can you force deploy units so there isnt any battle preparations menu?

Edited by Roysourboy
Link to comment
Share on other sites

The issue is that units currently don't save learned skills in any way--any time the engine wants to access the list of skills a unit has, it simply combines those attached to the actor, class, and inventory. You have to attach a skill to one of those to give a unit a skill. You could make skill scrolls a held item only usable by certain classes, so as long as it's in their inventory they have the skill, but there's no way to make it disappear but have the unit keep the skill, at least right now.

(by default you can't make the skill scroll untradeable either)

Hmm, I see. What I gather is that you could have a skill scroll as a hold item, but it can't be consumable. That would still be useful.

And what about not being able to make things inventory locked? Is that just not a base feature?

Link to comment
Share on other sites

There's an actual base menu in addition to the preparations menu, yes. It's like in 7x.

Yeah I think a base chapter like that wouldn't be too hard to make.

Yes you can force deploy units and skip the preparations menu.

Basically Yeti doesn't like to add features he thinks are stupid, and he thinks making an item untradeable is stupid.

Link to comment
Share on other sites

What is True Hit?

The rolling of 2 RNs and averaging them instead of using a single RN when determining if an attack hits or misses.

But you clearly knew that.

I'm hoping we're talking about the GBA style hit system,

(it's FEXNA. it's almost certainly GBA-related.)

and not something stupid like FE Fates.

Does If/Fates have its own particular brand of True Hit?
Link to comment
Share on other sites

Yeti doesn't mind me posting this right, it's not even in the FEXNA source code technically...

public class Config
{
public const int FRAME_RATE = 60;
public const int WINDOW_WIDTH = 20 * 16;
public const int WINDOW_HEIGHT = 12 * 16;
//public const int WINDOW_WIDTH = 24 * 16;
//public const int WINDOW_HEIGHT = 24 * 16;
public const string SAVE_FILE_EXTENSION = ".sav";
public const string MAP_SAVE_FILENAME = "map_save";
public const int SAVES_PER_PAGE = 5;
public const int SAVE_PAGES = 20;
public const bool METRICS_ENABLED = false;
public readonly static int TEAMS = 4;
public readonly static int PLAYER_TEAM = 1;
public readonly static int ENEMY_TEAM = 2;
public readonly static int CITIZEN_TEAM = 3;
public readonly static int INTRUDER_TEAM = 4;
public readonly static int[] PLAYABLE_TEAMS = new int[] { PLAYER_TEAM }; // Teams that are human controlled
public readonly static int[][] TEAM_GROUPS = { new int[] { 1, 3 }, new int[] { 2 }, new int[] { 4 } };
public readonly static int[] MAIN_CHARACTER = { 1 };
public readonly static int[] LOSS_ON_DEATH = { };
public const bool BLOCK_FIRE_THROUGH_WALLS_DEFAULT = false;
public const bool BLOCK_VISION_THROUGH_WALLS = false;
public const bool TALKING_IS_FREE_ACTION = true;
public const bool MOVE_ARROW_WIGGLING = true; // Does the movement arrow redraw use rns, like in GBA FE?
public const bool PREP_MAP_BACKGROUND = true; // Does the preparations screen use the map as a background
public readonly static Dictionary<Difficulty_Modes, int> DIFFICULTY_COLOR_REDIRECT = new Dictionary<Difficulty_Modes, int>
{
{ Difficulty_Modes.Normal, PLAYER_TEAM - 1 },
{ Difficulty_Modes.Hard, ENEMY_TEAM - 1 },
//{ Difficulty_Modes.Lunatic, INTRUDER_TEAM - 1 },
//{ Difficulty_Modes.Lunatic_Plus, CITIZEN_TEAM - 1 }
};
public readonly static Dictionary<Mode_Styles, int> STYLE_COLOR_REDIRECT = new Dictionary<Mode_Styles, int>
{
{ Mode_Styles.Casual, CITIZEN_TEAM - 1 },
{ Mode_Styles.Standard, PLAYER_TEAM - 1 },
{ Mode_Styles.Classic, ENEMY_TEAM - 1 },
};
// Saves append these after the chapter id to mark the difficulty; Normal has no entry
public readonly static Dictionary<Difficulty_Modes, char> DIFFICULTY_SAVE_APPEND = new Dictionary<Difficulty_Modes, char>
{
{ Difficulty_Modes.Hard, 'H' },
//{ Difficulty_Modes.Lunatic, 'L' },
//{ Difficulty_Modes.Lunatic_Plus, 'M' }
};
public readonly static Dictionary<int, string> TEAM_NAMES = new Dictionary<int, string>
{
{ PLAYER_TEAM, "Player" },
{ ENEMY_TEAM, "Enemy" },
{ CITIZEN_TEAM, "Citizen" },
{ INTRUDER_TEAM, "Intruder" },
};
public static string team_name(int team_id)
{
if (TEAM_NAMES.ContainsKey(team_id))
return TEAM_NAMES[team_id];
return string.Format("Team {0}", team_id);
}
#region Stereoscopic 3D
// Values that are not integers will be blurry to some degree
// I think, it might be multiples of 2?
#region Title
public const float TITLE_BG_DEPTH = 8;
public const float TITLE_SWORD_DEPTH = 3;
public const float TITLE_LOGO_DEPTH = 2;
public const float TITLE_CHOICE_DEPTH = 0;
public const float TITLE_MENU_DEPTH = 1;
public const float TITLE_OPTIONS_DEPTH = -1;
#if DEBUG
public const float TESTBATTLE_DATA_DEPTH = -1;
#endif
#region Class Reel
public const float REEL_NAME_PLAQUE_DEPTH = 0;
public const float REEL_NAME_LETTERS_DEPTH = -1;
public const float REEL_BURST_DEPTH = 2;
public const float REEL_BG_DEPTH = 8;
public const float REEL_TEXT_BOX_DEPTH = 0;
public const float REEL_CLASS_NAME_DEPTH = 2;
public const float REEL_CLASS_NAME_SHADOW_DEPTH = 4;
public const float REEL_STATS_DEPTH = 0;
public const float REEL_WEAPON_ICONS_DEPTH = 1;
#endregion
#endregion
#region Battle Scene
public const float BATTLE_BG_DEPTH = 8;
public const float BATTLE_PLATFORM_BASE_DEPTH = 2;
public const float BATTLE_PLATFORM_TOP_DEPTH_OFFSET = 6;
public const float BATTLE_BATTLERS_DEPTH = 4;
public const float BATTLE_HUD_DEPTH = 0;
public const float BATTLE_HITSPARK_DEPTH = 2;
public const float BATTLE_CRITSPARK_DEPTH = 0;
public const float BATTLE_MISSNODAMAGE_DEPTH = 2;
public const float BATTLE_EXP_DEPTH = -2;
public const float BATTLE_LEVEL_UP_DEPTH = -2;
#endregion
#region Map Scene
public const float MAP_MAP_DEPTH = 4;
public const float MAP_UNITS_DEPTH = 4;
public const float MAP_STATUS_ICON_DEPTH = 3.5f; //3 //Debug
public const float MAP_HPGAUGE_DEPTH = 3.75f; //3.5f
public const float MAP_CURSOR_DEPTH = 3.5f; //3
public const float MAP_MOVE_RANGE_DEPTH = 4;
public const float MAP_BALLISTA_HIGHEST_DEPTH = 1;
public const float MAP_INFO_DEPTH = 0;
public const float MAP_INFO_BURST_DEPTH = 2;
public const float MAP_MENU_DEPTH = 0; //Yeti
public const float MAP_POPUP_DEPTH = 0;
public const float MAP_WEATHER_DEPTH = 1;
public const float MAP_WEATHER_OFF_FRAME_DEPTH_OFFSET = 0.5f;
#region Victory Screen
public const float RANKING_BURST_DEPTH = 2;
public const float RANKING_BANNER_DEPTH = 0;
public const float RANKING_WINDOW_DEPTH = 1;
public const float RANKING_ICON_DEPTH = 1;
public const float RANKING_ICON_MAX_DEPTH = -8;
#endregion
#endregion
#region Convo
public const float CONVO_BG_DEPTH = 4;
public const float CONVO_FACE_DEPTH = 1;
public const float CONVO_TEXT_DEPTH = 0;
public const float CONVO_LOCATION_DEPTH = 0;
public const float CONVO_BACKLOG_DEPTH = -1;
#endregion
#region World Map
public const float WMAP_ZOOMED_DEPTH = 2;
public const float WMAP_MINIMAP_DEPTH = 0;
#region Chapter Transition
public const float CH_TRANS_BG_DEPTH = 4;
public const float CH_TRANS_SIGIL_DEPTH = 2;
public const float CH_TRANS_BANNER_DEPTH = 0;
#endregion
#endregion
#region Map Menus
public const float MAPMENU_BG_DEPTH = 4;
public const float MAPCOMMAND_WINDOW_DEPTH = 2; //0; // Set to a higher number for now for testing //Yeti
public const float MAPCOMMAND_DATA_DEPTH = -4; //0; // Set to a lower number for now for testing //Yeti
public const float MAPCOMMAND_HELP_DEPTH = -1;
#region Status
public const float STATUS_TOP_PANEL_DEPTH = 0;
public const float STATUS_FACE_DEPTH = 1;
public const float STATUS_FACE_BG_DEPTH = 2;
public const float STATUS_LEFT_WINDOW_DEPTH = 1;
public const float STATUS_RIGHT_WINDOW_DEPTH = 1;
public const float STATUS_ARROW_DEPTH = 0;
public const float STATUS_HELP_DEPTH = -1;
#endregion
#region Unit Menu
public const float UNIT_BANNER_DEPTH = -1;//0 //Debug
public const float UNIT_WINDOW_DEPTH = 0;//1
public const float UNIT_ARROWS_DEPTH = -1;//0
public const float UNIT_SORT_DEPTH = -1;//0
public const float UNIT_HELP_DEPTH = -1;
#endregion
#region Options
public const float OPTIONS_BANNER_DEPTH = 0;
public const float OPTIONS_OPTIONS_DEPTH = 2;
public const float OPTIONS_ARROWS_DEPTH = 1;
public const float OPTIONS_DESC_DEPTH = 1;
public const float OPTIONS_CURSOR_DEPTH = 0;
#endregion
#region Data Menu
public const float DATA_BANNER_DEPTH = 0;
public const float DATA_TEAMS_DEPTH = 2;
public const float DATA_WINDOW_DEPTH = 1;
public const float DATA_LEADER_DEPTH = 3;
public const float DATA_DATA_DEPTH = 2;
#endregion
#endregion
#region Preparations
public const float PREP_BG_DEPTH = 4;
// Preparations
public const float PREPMAIN_BANNER_DEPTH = 0;
public const float PREPMAIN_WINDOW_DEPTH = 0;
public const float PREPMAIN_INFO_DEPTH = 1;
public const float PREPMAIN_DATA_DEPTH = 0;
public const float PREPMAIN_TALK_DEPTH = -1;
// Units
public const float PREPUNIT_WINDOW_DEPTH = 0;
public const float PREPUNIT_UNIT_INFO_DEPTH = 1;
public const float PREPUNIT_INPUTHELP_DEPTH = 2;
// Items
public const float PREPITEM_BATTALION_DEPTH = 0;
public const float PREPITEM_BATTALION_DIMMED_DEPTH = 2;
public const float PREPITEM_UNIT_DEPTH = 1;
public const float PREPITEM_UNIT_DIMMED_DEPTH = 3;
public const float PREPITEM_WINDOW_DEPTH = 0;
public const float PREPITEM_FUNDS_DEPTH = 0;
// Trade
public const float PREPTRADE_NAMES_DEPTH = 0;
public const float PREPTRADE_WINDOWS_DEPTH = 0;
public const float PREPTRADE_FACES_DEPTH = 1;
public const float PREPTRADE_HELP_DEPTH = -1;
// Convoy
public const float CONVOY_BANNER_DEPTH = 2;
public const float CONVOY_ICON_DEPTH = 0;
public const float CONVOY_STOCK_DEPTH = 0;
public const float CONVOY_WINDOW_DEPTH = 0;
public const float CONVOY_INVENTORY_DEPTH = 2;
public const float CONVOY_SUPPLY_DEPTH = 2;
public const float CONVOY_SELECTION_DEPTH = 0;
public const float CONVOY_ARROWS_DEPTH = 1;
public const float CONVOY_INPUTHELP_DEPTH = 0;
public const float CONVOY_HELP_DEPTH = -1;
#endregion
#endregion
#region Actor
public const char ACTOR_NAME_DELIMITER = '_';
public const char BUILD_NAME_DELIMITER = '-';
public const int MAX_ACTOR_COUNT = short.MaxValue / 2; // Non-generic Ids must <= this value; generics start counting after this
public const int MAX_HP = 80; // Normal max hp, used for gauge lengths
public const int MAX_STAT = 30; // Normal max core stat, used for gauge lengths
public const float HP_VALUE = 0.5f; // The value of hp, compared to other stats
public const int LUCK_CAP = 30;
public const int LVL_CAP = 20;
public const int TIER0_LVL_CAP = 10;
public const int PROMOTION_LVL = 10;
public const int EXP_TO_LVL = 100;
public readonly static int[] LEVEL_UP_PROMOTION = new int[] { 0 }; // Tiers that are allowed to promote by level up
public const bool ACTOR_GAINED_HP_HEAL = true; // Should max hp gained from level ups/stat boosters be healed?
public const float GENERIC_FIXED_LEVEL_PERCENT = 4f / 5; // The percentage of generic unit levels that give fixed stat ups instead of rng based
public const bool GENERIC_AUTO_WEXP = false; // Should generic units automatically gain enough wexp to use weapons in their inventory
public const int EXP_PER_ENEMY = 100; // The total exp an individual enemy can give; -1 is infinite
public const bool EXP_PER_ENEMY_KILL_EXCEPTION = true; // If true, the exp gained from the killing blow will always be the full amount
public const bool DISPLAY_STAT_AVERAGES = true; // Stat labels are colored based on how far from the average the stat value is
public const bool STAT_AVERAGES_ONLY_IN_PREP = false; // Does stat label coloring only occur in preparations and the world map
public const bool ONLY_PC_AVERAGES = true; // Are status screen averages only shown for PCs
public readonly static int NUM_ITEMS = 6;
public const bool ONE_S_RANK = true;
public const int S_RANK_BONUS = 5;
public const bool CONSERVE_WASTED_GROWTHS = true;
public const int CONSERVED_GROWTH_MAX_PER_STAT = 50;
public const float LOW_HEALTH_RATE = 0.4f;//0.33f; //Debug
public const bool ALLOW_UNEQUIP = true;
public const bool CANCEL_GREEN_DROP_ON_ANY_STEAL = false; // Does stealing from a unit that normally drops something on death cancel that drop?
public const bool REPAIR_DROPPED_ITEM = false;
public const bool MASTERIES_CHARGE_AT_TURN_END = true; // Do masteries charge at the end of a turn, rather than the start
public const int CONVOY_SIZE = 150;
public const Convoy_Stack_Types CONVOY_ITEMS_STACK = Convoy_Stack_Types.Use;
public const bool CONVOY_SOLD_ITEMS_REPAIR = true; // Do items sold to the convoy show up again repaired in the next chapter
// On promotion, only gain Anima wexp if the actor would gain all Anima types or doesn't have Anima at all yet?
// Thus Mage Knight promotion could give Wind, so a Troub => Mage Knight would have Wind, but a Fire Mage => Mage Knight would only retain Fire instead
public const bool SINGLE_ANIMA_PROMOTION = true;
public const int CASUAL_MODE_LIVES = 3;
// Mounted classes, that use a fixed value - con for aid
// In order based on which should be used first to determine base aid
public readonly static ClassTypeSet[] MOUNTED_CLASS_TYPES = new ClassTypeSet[]
{
new ClassTypeSet(ClassTypes.FDragon),
new ClassTypeSet(ClassTypes.Flier),
new ClassTypeSet(ClassTypes.Cavalry, ClassTypes.Mage),
new ClassTypeSet(ClassTypes.Cavalry),
};
public readonly static Dictionary<ClassTypeSet, int> MOUNTED_CLASS_AID = new Dictionary<ClassTypeSet, int>
{
{ new ClassTypeSet(ClassTypes.FDragon), 25 },
{ new ClassTypeSet(ClassTypes.Flier), 20 },
{ new ClassTypeSet(ClassTypes.Cavalry, ClassTypes.Mage), 20 },
{ new ClassTypeSet(ClassTypes.Cavalry), 25 },
};
public readonly static ClassTypes[] CLASS_TYPE_ICONS = new ClassTypes[] { // Class types that have icons for effectiveness
ClassTypes.Cavalry, ClassTypes.Armor, ClassTypes.Flier, ClassTypes.FDragon, ClassTypes.Swordsman, ClassTypes.Dragon, ClassTypes.Mage };
public readonly static HashSet<ClassTypes> IGNORE_TERRAIN_AVO = new HashSet<ClassTypes> { ClassTypes.Flier };
public readonly static HashSet<ClassTypes> IGNORE_TERRAIN_DEF = new HashSet<ClassTypes> { ClassTypes.Flier };
// This should really be pretty much anywhere else //Yeti
public static int DEFAULT_VISION_RANGE = 3;
public readonly static Dictionary<int, int> CLASS_VISION_BONUS = new Dictionary<int, int> {
{ 17, 5 }, // Thief
{ 52, 5 }, // Assassin
{ 53, 5 } // Rogue
};
public const int FLARE_VISION = 5; // Base vision range for Flare staff
#region Supports/Affinity
public const int SUPPORT_TOTAL = 5;
public const int SUPPORT_RANGE = 1;
public readonly static string[] SUPPORT_LETTERS = new string[] { "-", "C", "B", "A" };
public const bool PLAYER_SUPPORT_ONLY = false; // Can only player units gain support points
public const int MAX_SUPPORT_POINTS = 999; // The maximum number of points a support rank can require; support progress won't count higher
public const int ADJACENT_SUPPORT_POINTS = 0;
public const int SAME_TARGET_SUPPORT_POINTS = 0;
public const int HEAL_SUPPORT_POINTS = 0;
public const int RESCUE_SUPPORT_POINTS = 0;
public const int TALK_SUPPORT_POINTS = 0;
public const int CHAPTER_SUPPORT_POINTS = 0;
// Supports for actors that are presumed forced, so they count against the remaining support count even before they're activated
public readonly static Dictionary<int, HashSet<int>> RESERVED_SUPPORTS = new Dictionary<int,HashSet<int>>
{
{ 6, new HashSet<int> { 8 } },
{ 8, new HashSet<int> { 6 } },
};
public const bool GENERIC_ACTOR_RANDOM_AFFINITIES = true;
public readonly static Dictionary<Affinities, float[]> AFFINITY_BOOSTS = new Dictionary<Affinities, float[]>
{
// Atk, Def, Hit, Avo, Crit, Dod
{ Affinities.Thunder, new float[] { 0.5f, 0.5f, 2.5f, 0f, 2.5f, 0f } },
{ Affinities.Dark, new float[] { 0.5f, 0.5f, 2.5f, 0f, 0f, 2.5f } },
{ Affinities.Anima, new float[] { 0.5f, 0.5f, 0f, 2.5f, 0f, 2.5f } },
{ Affinities.Earth, new float[] { 0.5f, 0.5f, 0f, 0f, 2.5f, 2.5f } },
{ Affinities.Fire, new float[] { 0.5f, 0f, 2.5f, 2.5f, 2.5f, 0f } },
{ Affinities.Water, new float[] { 0.5f, 0f, 2.5f, 2.5f, 0f, 2.5f } },
{ Affinities.Ice, new float[] { 0f, 0.5f, 2.5f, 2.5f, 2.5f, 0f } },
{ Affinities.Light, new float[] { 0f, 0.5f, 0f, 2.5f, 2.5f, 2.5f } },
{ Affinities.Wind, new float[] { 0f, 0f, 2.5f, 2.5f, 2.5f, 2.5f } },
{ Affinities.None, new float[] { 0,0,0,0,0,0 } },
};
public readonly static float[] BOND_BOOSTS = new float[] { 1f, 1f, 5f, 5f, 5f, 5f };
public readonly static Dictionary<Affinities, List<Stat_Labels>[]> AFFINITY_GROWTHS =
new Dictionary<Affinities, List<Stat_Labels>[]>
{
{ Affinities.Thunder, new List<Stat_Labels>[] {
new List<Stat_Labels> { Stat_Labels.Pow, Stat_Labels.Skl }, new List<Stat_Labels> { Stat_Labels.Spd, Stat_Labels.Res } } },
{ Affinities.Dark, new List<Stat_Labels>[] {
new List<Stat_Labels> { Stat_Labels.Pow, Stat_Labels.Res }, new List<Stat_Labels> { Stat_Labels.Spd, Stat_Labels.Lck } } },
{ Affinities.Anima, new List<Stat_Labels>[] {
new List<Stat_Labels> { Stat_Labels.Lck, Stat_Labels.Def }, new List<Stat_Labels> { Stat_Labels.Skl, Stat_Labels.Res } } },
{ Affinities.Earth, new List<Stat_Labels>[] {
new List<Stat_Labels> { Stat_Labels.Pow, Stat_Labels.Def }, new List<Stat_Labels> { Stat_Labels.Skl, Stat_Labels.Spd } } },
{ Affinities.Fire, new List<Stat_Labels>[] {
new List<Stat_Labels> { Stat_Labels.Spd, Stat_Labels.Res }, new List<Stat_Labels> { Stat_Labels.Lck, Stat_Labels.Def } } },
{ Affinities.Water, new List<Stat_Labels>[] {
new List<Stat_Labels> { Stat_Labels.Spd, Stat_Labels.Lck }, new List<Stat_Labels> { Stat_Labels.Skl, Stat_Labels.Def } } },
{ Affinities.Ice, new List<Stat_Labels>[] {
new List<Stat_Labels> { Stat_Labels.Skl, Stat_Labels.Def }, new List<Stat_Labels> { Stat_Labels.Pow, Stat_Labels.Lck } } },
{ Affinities.Light, new List<Stat_Labels>[] {
new List<Stat_Labels> { Stat_Labels.Lck, Stat_Labels.Res }, new List<Stat_Labels> { Stat_Labels.Pow, Stat_Labels.Def } } },
{ Affinities.Wind, new List<Stat_Labels>[] {
new List<Stat_Labels> { Stat_Labels.Skl, Stat_Labels.Spd }, new List<Stat_Labels> { Stat_Labels.Pow, Stat_Labels.Res } } }
};
public const int AFFINITY_GROWTH_MOD = 5;
#endregion
#endregion
#region Animation
public readonly static string[] Anim_Type_Names = new string[] { "Unarmed", "Sword", "Lance", "Axe", "Bow", "ThrowAxe", "Magic", "Staff", "Unique" };
public const int BATTLER_ANIMA_DONE_TIME = 5;
public const int BATTLER_SPELL_DONE_TIME = 2;
public readonly static int BATTLER_SIZE = 192;
#endregion
#region Arena
public const int MIN_WAGER = 500;
public const int WAGER_VARIANCE = 800;
public const bool SUPPORTS_IN_ARENA = false;
public readonly static Dictionary<Weapon_Types, KeyValuePair<int[], int[]>> ARENA_WEAPON_TYPES = new Dictionary<Weapon_Types, KeyValuePair<int[], int[]>> {
#region Weapons
{ Weapon_Types.Sword, new KeyValuePair<int[], int[]>(new int[] { 1 }, new int[] { 3, 8, 16 }) },
{ Weapon_Types.Lance, new KeyValuePair<int[], int[]>(new int[] { 1 }, new int[] { 33, 38, 46 }) },
{ Weapon_Types.Axe, new KeyValuePair<int[], int[]>(new int[] { 1 }, new int[] { 59, 64, 71 }) },
{ Weapon_Types.Bow, new KeyValuePair<int[], int[]>(new int[] { 2 }, new int[] { 83, 85, 90 }) },
//{ 5, new KeyValuePair<int[], int[]>(new int[] { 1, 2 }, new int[] { 101, 102, 106 }) },
//{ 6, new KeyValuePair<int[], int[]>(new int[] { 1, 2 }, new int[] { 111, 112, 116 }) },
//{ 7, new KeyValuePair<int[], int[]>(new int[] { 1, 2 }, new int[] { 121, 122, 126 }) },
//{ 8, new KeyValuePair<int[], int[]>(new int[] { 1, 2 }, new int[] { 131, 132, 136 }) },
//{ 9, new KeyValuePair<int[], int[]>(new int[] { 1, 2 }, new int[] { 141, 142, 146 }) },
// lol the spells aren't all done
{ Weapon_Types.Fire, new KeyValuePair<int[], int[]>(new int[] { 1, 2 }, new int[] { 101, 102 }) },
{ Weapon_Types.Thunder, new KeyValuePair<int[], int[]>(new int[] { 1, 2 }, new int[] { 111, 112 }) },
{ Weapon_Types.Wind, new KeyValuePair<int[], int[]>(new int[] { 1, 2 }, new int[] { 121, 122 }) },
{ Weapon_Types.Light, new KeyValuePair<int[], int[]>(new int[] { 1, 2 }, new int[] { 131, 132 }) },
{ Weapon_Types.Dark, new KeyValuePair<int[], int[]>(new int[] { 1, 2 }, new int[] { 141, 142 }) }
#endregion
};
public readonly static Dictionary<Difficulty_Modes, int> ARENA_LVL_BONUS = new Dictionary<Difficulty_Modes, int>
{
{ Difficulty_Modes.Normal, -1 },
{ Difficulty_Modes.Hard, 6 },
};
// symbol => id, weapon type, gender, con
public readonly static Dictionary<int, Dictionary<Gladiators, Gladiator_Data>> GLADIATORS = new Dictionary<int, Dictionary<Gladiators, Gladiator_Data>> {
#region Tier 1
{ 1, new Dictionary<Gladiators, Gladiator_Data> {
{ Gladiators.Myrm, new Gladiator_Data(16, Weapon_Types.Sword, 0) }, // Myrmidon
{ Gladiators.Thif, new Gladiator_Data(17, Weapon_Types.Sword, 0) }, // Thief
{ Gladiators.ArcM, new Gladiator_Data(19, Weapon_Types.Bow, 0) }, // ArcherM
{ Gladiators.ArcF, new Gladiator_Data(19, Weapon_Types.Bow, 1) }, // ArcherF
{ Gladiators.Crsb, new Gladiator_Data(20, Weapon_Types.Bow, 0) }, // Crossbowman
{ Gladiators.Sold, new Gladiator_Data(22, Weapon_Types.Lance, 0) }, // Soldier
{ Gladiators.Drac, new Gladiator_Data(23, Weapon_Types.Lance, 0) }, // Dracoknight
{ Gladiators.Figh, new Gladiator_Data(24, Weapon_Types.Axe, 0) }, // Fighter
{ Gladiators.Brig, new Gladiator_Data(25, Weapon_Types.Axe, 0) }, // Brigand
{ Gladiators.Pira, new Gladiator_Data(26, Weapon_Types.Axe, 0) }, // Pirate
{ Gladiators.Merc, new Gladiator_Data(27, Weapon_Types.Sword, 0) }, // Mercenary
{ Gladiators.Noma, new Gladiator_Data(29, Weapon_Types.Bow, 0) }, // Nomad
{ Gladiators.Coht, new Gladiator_Data(30, Weapon_Types.Axe, 0) }, // Cohort
{ Gladiators.Vngd, new Gladiator_Data(31, Weapon_Types.Lance, 0) }, // Vanguard
{ Gladiators.Gdrm, new Gladiator_Data(32, Weapon_Types.Sword, 0) }, // Gendarme
{ Gladiators.Phal, new Gladiator_Data(33, Weapon_Types.Axe, 0) }, // Phalanx
{ Gladiators.Lieu, new Gladiator_Data(34, Weapon_Types.Lance, 0) }, // Lieutenant
{ Gladiators.Zwei, new Gladiator_Data(35, Weapon_Types.Sword, 0) }, // Zweihander
{ Gladiators.Pega, new Gladiator_Data(37, Weapon_Types.Lance, 1) }, // Pegasus Knight
{ Gladiators.Monk, new Gladiator_Data(39, Weapon_Types.Light, 0) }, // Monk
{ Gladiators.Mag1, new Gladiator_Data(40, Weapon_Types.Fire, 0) }, // Mage (Fire)
{ Gladiators.Mag2, new Gladiator_Data(40, Weapon_Types.Wind, 0) }, // Mage (Wind)
{ Gladiators.Sorc, new Gladiator_Data(44, Weapon_Types.Dark, 0) }, // Sorcerer
{ Gladiators.Sham, new Gladiator_Data(45, Weapon_Types.Thunder, 0) }, // Shaman (Thunder)
{ Gladiators.Divi, new Gladiator_Data(47, Weapon_Types.Light, 0) }, // Diviner
{ Gladiators.Schl, new Gladiator_Data(48, Weapon_Types.Dark, 0) }, // Scholar
}},
#endregion
#region Tier 2
{ 2, new Dictionary<Gladiators, Gladiator_Data> {
{ Gladiators.Swor, new Gladiator_Data(51, Weapon_Types.Sword, 0) }, // Swordmaster
{ Gladiators.Rogu, new Gladiator_Data(53, Weapon_Types.Sword, 0) }, // Rogue
{ Gladiators.Long, new Gladiator_Data(55, Weapon_Types.Bow, 1) }, // Longbowman
{ Gladiators.Halb, new Gladiator_Data(59, Weapon_Types.Lance, 0) }, // Halberdier
{ Gladiators.Dgm1, new Gladiator_Data(61, Weapon_Types.Lance, 0) }, // Dragon Master (Lance)
{ Gladiators.Dgm2, new Gladiator_Data(61, Weapon_Types.Axe, 0) }, // Dragon Master (Axe)
{ Gladiators.Zerk, new Gladiator_Data(62, Weapon_Types.Axe, 0) }, // Berserker
{ Gladiators.War1, new Gladiator_Data(63, Weapon_Types.Axe, 0) }, // Warrior (Axe)
{ Gladiators.War2, new Gladiator_Data(63, Weapon_Types.Bow, 0) }, // Warrior (Bow)
{ Gladiators.Hro1, new Gladiator_Data(65, Weapon_Types.Sword, 0) }, // Hero (Sword)
{ Gladiators.Hro2, new Gladiator_Data(65, Weapon_Types.Axe, 0) }, // Hero (Axe)
//{ Gladiators.Hro3, new Gladiator_Data(65, Weapon_Types.Bow, 0) }, // Hero (Bow)
{ Gladiators.Nmdt, new Gladiator_Data(67, Weapon_Types.Bow, 0) }, // Nomad Trooper
{ Gladiators.Pal1, new Gladiator_Data(70, Weapon_Types.Sword, 0) }, // Paladin (Sword)
{ Gladiators.Pal2, new Gladiator_Data(70, Weapon_Types.Lance, 0) }, // Paladin (Lance)
{ Gladiators.Ctt1, new Gladiator_Data(71, Weapon_Types.Sword, 0) }, // Cataphract (Sword)
{ Gladiators.Ctt2, new Gladiator_Data(71, Weapon_Types.Axe, 0) }, // Cataphract (Axe)
{ Gladiators.Gene, new Gladiator_Data(73, Weapon_Types.Lance, 0) }, // General
{ Gladiators.Flkn, new Gladiator_Data(76, Weapon_Types.Lance, 1) }, // Falcoknight
{ Gladiators.Bshp, new Gladiator_Data(78, Weapon_Types.Light, 0) }, // Bishop
{ Gladiators.Sag1, new Gladiator_Data(79, Weapon_Types.Fire, 0) }, // Sage (Fire)
{ Gladiators.Sag2, new Gladiator_Data(79, Weapon_Types.Thunder, 1) }, // Sage (Thunder)
{ Gladiators.Mgkt, new Gladiator_Data(80, Weapon_Types.Wind, 1) }, // Mage Knight (Wind)
{ Gladiators.Valk, new Gladiator_Data(81, Weapon_Types.Light, 1) }, // Valkyrie
{ Gladiators.WrcM, new Gladiator_Data(84, Weapon_Types.Dark, 0) }, // WarlockM
{ Gladiators.WrcF, new Gladiator_Data(84, Weapon_Types.Dark, 1) }, // WarlockF
{ Gladiators.Just, new Gladiator_Data(88, Weapon_Types.Light, 0) }, // Justice
}},
#endregion
};
public const int MIN_ARENA_HIT = 40;
public const int MAX_ARENA_DMG_ROUNDS = 8; // Max rounds worth of damage the player can take to kill
#endregion
#region Battle
public const int HP_COUNTER_VALUES = 2; // Battle scene, map battle
public const int STATUS_HP_COUNTER_VALUES = 2; // Status screen, unit detail, combat preview
public const int MAX_HP_ROWS = 2;
public const int HP_TABS_PER_ROW = 60;
public const int HPGAUGE_TAB_WIDTH = 3;
public const int HPGAUGE_TAB_HEIGHT = 6;
public const float BATTLER_MIN_SCALE = 0.33f; // Battler minimum scale when it zooms in from the map sprite position
public const int ACTION_BACKGROUND_TONE_WEIGHT = 192;
public const int ACTION_PLATFORM_TONE_WEIGHT = 160;
public const int ACTION_BATTLER_TONE_WEIGHT = 64;
public const int BATTLE_TRANSITION_TIME = 30;
public const bool BATTLE_BG_ALWAYS_VISIBLE = true;
public const int ARENA_BG_TIME = 30, ARENA_BG_FRAMES = 3;
#endregion
#region Combat
public const int AOE_EXP_GAIN = 10; // Max exp gain when hitting multiple targets, for balance
public const bool AOE_WEXP_GAIN = false;
public const int CURSE_BACKFIRE_RATE = 1; // Chance for a cursed weapon to backfire with capped Luck
public const float LIFE_STEAL_MULT = 0.5f; // Amount of damage to return as health for life steal attribute weapons
public const int DBL_ATK_SPD = 4;
public const float CRIT_MULT = 3f;
public const int STEAL_EXP = 10;
public const int DANCE_EXP = 10;
public const bool RING_REFRESH = true;
public const bool STAFF_HEAL_WITH_RES = false; // Staves heal with Res instead of Mag?
public const float STAFF_HEAL_POW_RATE = 0.5f;
public const bool IMBUE_WITH_RES = true; // Using magic attacks with physical weapons uses Res intsead of Str?
public const float MAGIC_WEAPON_STR_RATE = 0.5f;
public const float MAGIC_WEAPON_MGT_RATE = 2.0f;
public const float MAGIC_WEAPON_CRT_RATE = 0.5f;
public const bool HIT_OVERFLOW = false; // Does Hit over 100 convert into Crit?
public const float HIT_OVERFLOW_RATE = 0.5f;
public const bool BRAVE_BLOCKED_AGAINST_DESTROYABLE = true; // Are brave attacks disallowed when breaking destructible terrain?
public const bool WEAPON_USE_MISS = false; // Are weapon uses still consumed on miss? (if true this overrides the two below)
public const bool RANGED_USE_MISS = true; // Are thrown weapon/bow uses still consumed on miss?
public const bool MAGIC_USE_MISS = true; // Are magic weapon uses still consumed on miss?
public const bool AI_WEAPON_USE = true; // Do AI units use up weapons normally, as opposed to infinite everything
// If true and AI_WEAPON_USE disabled, treats all AI attacks the same as PC misses for weapon usage
// (so AI tomes/staves/ranged might be consumed, but melee weapons will still be infinite)
public const bool AI_WEAPON_USE_MISS_OVERRIDE = false;
#endregion
#region Conversation
public const bool MOVE_SPEAKER_TO_FRONT = false; // If true, whenever a face sprite becomes the active speaker it moves in front of all others
public const float FACE_TONE_PERCENT = 0.6f;
public const int FACE_SPRITE_MOVEMENT_BOB_TIME = 8; // Time in frames a face sprite ducks down at the end of a movement
public const int CONVO_BACKLOG_LINES = 256;
public const int CONVO_BACKLOG_FADE_TIME = 16;
public const int CONVO_BACKLOG_BG_OPACITY = 160;
public const int CONVO_BACKLOG_MAX_SCROLL_SPEED = 4;
#endregion
#region Events
public readonly static string[] EVENT_NAME_DELIMITER = new string[] { ", " };
public const bool BASE_EVENT_ACTIVATED_INVISIBLE = false; // If true base events that have already been activated are unlisted, instead of greyed out
public readonly static int EVENT_DATA_LENGTH = 100;
#endregion
#region Icons
public readonly static int ITEM_ICON_SIZE = 16;
public readonly static int SKILL_ICON_SIZE = 24;
#endregion
#region Map
public readonly static int TILESET_TILE_SIZE = 16; // Total size of tiles on the tileset, including gutters around them
public readonly static int TILE_SIZE = 16;
public const int UNIT_PIXEL_SIZE = 16; // Unit logical steps per pixel
public readonly static int UNIT_TILE_SIZE = TILE_SIZE * UNIT_PIXEL_SIZE; // Unit logical steps per tile, should be larger than TILE_SIZE
#if XBOX
public const int ALPHA_GRANULARITY = 1;
#else
public const int ALPHA_GRANULARITY = 2;
#endif
public const int ALPHA_MAX = 12 * ALPHA_GRANULARITY;
public const bool FOW_TERRAIN_DATA = false; // Is terrain info data visible when moving the cursor on fog tiles, generally turn off only in FE5 fog
public const int AI_WAIT_TIME = 20;
public const int SKIP_AI_TURN_HOLD_TIME = 8;
public const int SKIP_AI_SWTICH_TIME = 8;
public const int SUSPEND_FADE_TIME = 20;
public const float ENEMY_RANGE_TINT_MULT = 0.5f;
public const int PASSIVE_MOVE_RANGE_OPACITY = 80;
public const int ACTIVE_MOVE_RANGE_OPACITY = 144;
public const int PASSIVE_FORMATION_MOVE_RANGE_OPACITY = 144;
public const int ACTIVE_FORMATION_MOVE_RANGE_OPACITY = 255;
public const int MAP_SPELL_DARKEN_MIN = 168;
public const int MAP_SPELL_DARKEN_TIME = 16;
public const bool RESCUED_TERRAIN_HEAL = true; // Can terrain (forts) heal rescued units?
public const bool RESCUER_TERRAIN_HEAL_FULL_HP_DISPLAY = true; // If terrain is healing rescued and the rescuer is at full, should their data be displayed?
public const int TURN_SKIP_TEXT_FLASH_TIME = 60;
public const int MAP_TRANSITION_TIME = 20;
public readonly static int DESTROYABLE_OBJECT_TEAM = INTRUDER_TEAM;
#if DEBUG
public const bool CONTINUE_BOSS_THEME = true; // Boss themes continue on the map after combat?
#else
public const bool CONTINUE_BOSS_THEME = false; // Boss themes continue on the map after combat?
#endif
#endregion
#region Player
public const int CURSOR_TIME = 32;
#endregion
#region System
public const int RNG_VALUES = 1024;
public const int CHARACTER_TIME = 72;
public readonly static int[] CHARACTER_IDLE_ANIM_TIMES = new int[] { 32, 4, 32, 4 }; // Time for each frame of the map sprite idle anim
public readonly static int[] CHARACTER_IDLE_ANIM_FRAMES = new int[] { 0, 1, 2, 1 }; // Map sprite idle frame order
public readonly static int[] CHARACTER_HIGHLIGHT_ANIM_TIMES = new int[] { 20, 4, 20, 4 }; // Time for each frame of the map sprite idle anim
public readonly static int[] CHARACTER_HIGHLIGHT_ANIM_FRAMES = new int[] { 0, 1, 2, 1 }; // Map sprite idle frame order
public readonly static int[] CHARACTER_MOVING_ANIM_TIMES = new int[] { 13, 6, 13, 6 }; // Time for each frame of the map sprite idle anim
public readonly static int[] CHARACTER_MOVING_ANIM_FRAMES = new int[] { 0, 1, 2, 3 }; // Map sprite idle frame order
public const int RESCUE_TIME = 32; // Period of rescue/boss icon animation
public const int RESCUE_VISIBLE_TIME = 20; // Rescue/boss icon visible time out of period
public const int MOVE_RANGE_TIME = 64;
//public const int STATUS_TIME = 96;
#endregion
#region Title
public const int CLASS_REEL_WAIT_TIME = 15;
public const int TITLE_GAME_START_TIME = 30;
public readonly static string[] SPLASH_SCREENS = new string[] { "splashes1", "splashes2" };
public const int SPLASH_TIME = 240;
public const int SPLASH_FADE_TIME = 60;
public const int SPLASH_INITIAL_BLACK_TIME = 40;
#endregion
#region Unit
public const int FORMATION_CHANGE_STEPS = 16;
public readonly static Vector2 OFF_MAP = new Vector2(-15, -15); // Location to use as the general purpose off the map location (for rescued units, gladiators, etc)
public const float UNIT_TONE_PERCENT = 0.5f;
public const int SIMPLE_HPGAUGE_MAX_HUE = 120; // Hue when simple hp gauge is full
public const int ADVANCED_HPGAUGE_MAX_HUE = 270; // Hue for capped hp value
public const int MAP_STATUS_EFFECT_TIME = 90; // Time in frames to display a status effect before cycling to the next
public const bool FLIP_ENEMY_MAP_SPRITES = true;
public const int UNIT_BLINK_PERIOD = 60;
public const int UNIT_BLINK_TIME = 3;
public const bool SIEGE_RELOADING = true; // Siege engines are disabled for a turn after firing
public const bool SIEGE_MANUAL_RELOADING = false; // Siege engines are manually reloaded // Not implemented //Yeti
#endregion
#region Weather
public const int DEFAULT_WEATHER_SPRITE_COUNT = 32;
public const int RAIN_SPRITE_COUNT = 32;
public const int SNOW_SPRITE_COUNT = 24;
#endregion
#region World Map
public const int WORLDMAP_CONTROLS_FADE_TIME = 20;
public const int WORLDMAP_FADE_TIME = 60;
public const int WORLDMAP_ZOOM_FADE_TIME = 60;
public const int WORLDMAP_SCROLL_SPEED = 16;
public const int WORLDMAP_EVENT_SCROLL_SPEED = 8;
public const int WORLDMAP_MODE_SWITCH_DELAY = 10;
public readonly static Vector2 WORLDMAP_EVENT_OFFSET = new Vector2(0, -24);
public readonly static Vector2 WORLDMAP_MAP_OFFSET = new Vector2(0, 0);
public readonly static Vector2 WORLDMAP_MINIMAP_SCALE = new Vector2(0.03f, 0.03f);
public readonly static Vector2 WORLDMAP_MINIMAP_OFFSET = new Vector2(0, 0);
public readonly static Vector2 WORLDMAP_MAP_SPRITE_OFFSET = new Vector2(16, 8);
public readonly static List<string> HARD_MODE_BLOCKED = new List<string> { };
public const string WORLDMAP_THEME = "A Hint of Things to Come";
#endregion
public readonly static List<string> UNIT_EDITOR_NAMES = new List<string>
{
"Bern", "Merc_Bern", "Merc_Ilia", "Merc_IliaM", "Merc_Bern2", "Merc_Rebel", "Merc_Sacae", "Merc_Western",
"Bandit", "Rebel", "Pirate_Rebel", "Member", "Laus", "Ostia", "Thria", "Tania", "Etruria"
};
public const bool SUSPEND_AFTER_AI_SELECTION = false; // Save to the suspend file each time the AI decides on what unit to move next
// Maybe make these part of chapters instead of global...? //Debug
public const string PREPARATIONS_THEME = "Prepare to Charge";
public const string ARENA_BATTLE_THEME = "Arena Battle";
public const string STAFF_THEME = "Curing";
public const string ATTACK_STAFF_THEME = "Healing";
public const string PROMOTION_THEME = "To the Heights";
public const string VICTORY_THEME = "Winning Road";
public const string GAME_OVER_THEME = "Game Over";
public const string ALLY_DEATH_THEME = "Within Sadness";
}
}

And he keeps adding more over time! I actually don't see a true hit bool here, but still, it's very easy to disable.
Link to comment
Share on other sites

That's good news for my Thracia 776 remake project. I doubt that Yeti would send me a copy to see if Capture, PCC, Leadership, or Dismount would work, but I'm looking forward to the open beta when he decides it's polished enough to release... which could be years away.

Link to comment
Share on other sites

They'll all work but none of them sound very easy to code so good luck

EDIT: ALSO @that thing in the spoiler

note that it'll eventually be in the Editor instead of a giant wall of code and also even when it is a giant wall of code, if you open it in Visual Studio it's way more readable because the #regions let you hide what you don't care about (ie stereoscopic and xbox)

Edited by 47948201
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...