diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..02e4a80 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,29 @@ +{ + "version": "0.2.0", + "tasks": [ + { + "label": "build", + "type": "shell", + "command": "dotnet build", + "args": ["${workspaceFolder}"], + "group": "build", + "presentation": { + "reveal": "always", + "panel": "shared" + } + } + ], + "configurations": [ + { + "name": "Run WPF UI", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + "program": "dotnet", + "args": ["run", "--project", "NewGame.UI"], + "cwd": "${workspaceFolder}", + "stopAtEntry": false, + "console": "internalConsole" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..4d8834d --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,20 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "type": "shell", + "command": "dotnet build", + "args": [], + "problemMatcher": ["$msCompile"], + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "reveal": "always", + "panel": "shared" + } + } + ] +} \ No newline at end of file diff --git a/NewGame/Assets/PlaceholderGenerator.cs b/MagicalDeckbuilder.Shared/Assets/PlaceholderGenerator.cs similarity index 89% rename from NewGame/Assets/PlaceholderGenerator.cs rename to MagicalDeckbuilder.Shared/Assets/PlaceholderGenerator.cs index 3da593c..44d9b4c 100644 --- a/NewGame/Assets/PlaceholderGenerator.cs +++ b/MagicalDeckbuilder.Shared/Assets/PlaceholderGenerator.cs @@ -17,14 +17,14 @@ public static class PlaceholderGenerator // Element colors private static readonly Dictionary ElementColors = new() { - { ElementType.Fire, Color.FromArgb(255, 80, 30) }, - { ElementType.Water, Color.FromArgb(30, 100, 200) }, - { ElementType.Earth, Color.FromArgb(100, 70, 40) }, - { ElementType.Air, Color.FromArgb(180, 220, 255) }, - { ElementType.Light, Color.FromArgb(255, 240, 180) }, - { ElementType.Dark, Color.FromArgb(40, 20, 50) }, - { ElementType.Arcane, Color.FromArgb(150, 50, 200) }, - { ElementType.Nature, Color.FromArgb(60, 140, 60) } + { ElementType.Radioactivity, Color.FromArgb(0, 255, 100) }, // Radioactive green glow + { ElementType.Flesh, Color.FromArgb(200, 100, 100) }, // Fleshy red + { ElementType.Toxin, Color.FromArgb(150, 200, 0) }, // Toxic yellow-green + { ElementType.Fungus, Color.FromArgb(100, 150, 100) }, // Mushroom green + { ElementType.Thermodynamics, Color.FromArgb(255, 100, 50) }, // Heat orange-red + { ElementType.Time, Color.FromArgb(150, 100, 200) }, // Time purple + { ElementType.Food, Color.FromArgb(200, 150, 100) }, // Food brown + { ElementType.Eldritch, Color.FromArgb(100, 0, 150) } // Eldritch purple-black }; // Card type colors @@ -123,11 +123,11 @@ public static class PlaceholderGenerator generated++; } - // Generate type-only placeholders (generic element - Fire) + // Generate type-only placeholders (generic element - Radioactivity) foreach (var type in cardTypes) { - using var bitmap = GenerateCardPlaceholder(ElementType.Fire, type, type.ToString()); - var filename = Path.Combine(outputDirectory, $"{type}_fire.png"); + using var bitmap = GenerateCardPlaceholder(ElementType.Radioactivity, type, type.ToString()); + var filename = Path.Combine(outputDirectory, $"{type}_radioactivity.png"); bitmap.Save(filename, ImageFormat.Png); generated++; } diff --git a/NewGame/Cards/Card.cs b/MagicalDeckbuilder.Shared/Cards/Card.cs similarity index 98% rename from NewGame/Cards/Card.cs rename to MagicalDeckbuilder.Shared/Cards/Card.cs index 5554130..981d989 100644 --- a/NewGame/Cards/Card.cs +++ b/MagicalDeckbuilder.Shared/Cards/Card.cs @@ -63,14 +63,14 @@ public enum TargetType /// public enum ElementType { - Fire, - Water, - Earth, - Air, - Light, - Dark, - Arcane, - Nature + Radioactivity, + Flesh, + Toxin, + Fungus, + Thermodynamics, + Time, + Food, + Eldritch } /// diff --git a/NewGame/Combining/CardCombiner.cs b/MagicalDeckbuilder.Shared/Combining/CardCombiner.cs similarity index 94% rename from NewGame/Combining/CardCombiner.cs rename to MagicalDeckbuilder.Shared/Combining/CardCombiner.cs index 0b64bb6..410303f 100644 --- a/NewGame/Combining/CardCombiner.cs +++ b/MagicalDeckbuilder.Shared/Combining/CardCombiner.cs @@ -37,20 +37,23 @@ public class CardCombiner { private readonly Random _random = new(); - // Elemental synergy bonuses + // Elemental synergy bonuses - new elements have thematic relationships private static readonly Dictionary<(ElementType, ElementType), string> ElementSynergies = new() { - { (ElementType.Fire, ElementType.Air), "Explosive" }, - { (ElementType.Fire, ElementType.Water), "Steam" }, - { (ElementType.Fire, ElementType.Earth), "Magma" }, - { (ElementType.Water, ElementType.Earth), "Nature" }, - { (ElementType.Water, ElementType.Air), "Storm" }, - { (ElementType.Earth, ElementType.Air), "Dust" }, - { (ElementType.Light, ElementType.Dark), "Twilight" }, - { (ElementType.Light, ElementType.Arcane), "Cosmic" }, - { (ElementType.Dark, ElementType.Arcane), "Void" }, - { (ElementType.Nature, ElementType.Water), "Life" }, - { (ElementType.Nature, ElementType.Fire), "Wildfire" }, + { (ElementType.Radioactivity, ElementType.Toxin), "Contaminated" }, + { (ElementType.Radioactivity, ElementType.Flesh), "Mutated" }, + { (ElementType.Radioactivity, ElementType.Fungus), "Irradiated Growth" }, + { (ElementType.Flesh, ElementType.Fungus), "Necrotic" }, + { (ElementType.Flesh, ElementType.Toxin), "Virulent" }, + { (ElementType.Toxin, ElementType.Fungus), "Bioluminescent" }, + { (ElementType.Thermodynamics, ElementType.Radioactivity), "Fusion" }, + { (ElementType.Thermodynamics, ElementType.Time), "Entropy" }, + { (ElementType.Time, ElementType.Eldritch), "Cosmic" }, + { (ElementType.Food, ElementType.Flesh), "Sustenance" }, + { (ElementType.Food, ElementType.Fungus), "Fermented" }, + { (ElementType.Eldritch, ElementType.Flesh), "Abominable" }, + { (ElementType.Eldritch, ElementType.Time), "Beyond Time" }, + { (ElementType.Eldritch, ElementType.Radioactivity), "Void Radiation" }, }; // Combination efficiency - results are better than either card alone but not 100% of both @@ -630,32 +633,26 @@ public class CardCombiner { var result = new CombinationResult(); - // Create enhanced version of the normal card var enhancedCard = normalCard.Clone(); enhancedCard.Name = $"Enhanced {normalCard.Name}"; enhancedCard.Description = $"{normalCard.Description} Infused with extra power from blank essence!"; - // Add random bonus based on blank's element (using efficiency) var bonus = _random.Next(1, 3); if (enhancedCard.Type == CardType.Creature) { - // Creature gets power and health boost enhancedCard.Power += bonus; enhancedCard.Health += bonus; } else if (enhancedCard.Type == CardType.Spell) { - // Spell gets power boost enhancedCard.Power += bonus + 1; } else if (enhancedCard.Type == CardType.Artifact) { - // Artifact gets power boost enhancedCard.Power += bonus + 1; } - // Add blank's infusion effect as extra enhancedCard.Effects.Add(new CardEffect { Name = "Blank Infusion", @@ -739,18 +736,21 @@ public class CardCombiner { return synergy switch { - "Explosive" => ElementType.Fire, - "Steam" => ElementType.Water, - "Magma" => ElementType.Fire, - "Nature" => ElementType.Nature, - "Storm" => ElementType.Water, - "Dust" => ElementType.Earth, - "Twilight" => ElementType.Dark, - "Cosmic" => ElementType.Arcane, - "Void" => ElementType.Dark, - "Life" => ElementType.Nature, - "Wildfire" => ElementType.Fire, - _ => ElementType.Arcane + "Contaminated" => ElementType.Radioactivity, + "Mutated" => ElementType.Flesh, + "Irradiated Growth" => ElementType.Fungus, + "Necrotic" => ElementType.Fungus, + "Virulent" => ElementType.Toxin, + "Bioluminescent" => ElementType.Fungus, + "Fusion" => ElementType.Thermodynamics, + "Entropy" => ElementType.Time, + "Cosmic" => ElementType.Eldritch, + "Sustenance" => ElementType.Food, + "Fermented" => ElementType.Food, + "Abominable" => ElementType.Eldritch, + "Beyond Time" => ElementType.Eldritch, + "Void Radiation" => ElementType.Radioactivity, + _ => ElementType.Eldritch }; } diff --git a/NewGame/Decks/DeckManager.cs b/MagicalDeckbuilder.Shared/Decks/DeckManager.cs similarity index 100% rename from NewGame/Decks/DeckManager.cs rename to MagicalDeckbuilder.Shared/Decks/DeckManager.cs diff --git a/MagicalDeckbuilder.Shared/Game/CardFactory.cs b/MagicalDeckbuilder.Shared/Game/CardFactory.cs new file mode 100644 index 0000000..e81fb85 --- /dev/null +++ b/MagicalDeckbuilder.Shared/Game/CardFactory.cs @@ -0,0 +1,668 @@ +using Card = MagicalDeckbuilder.Cards.Card; +using CardType = MagicalDeckbuilder.Cards.CardType; +using ElementType = MagicalDeckbuilder.Cards.ElementType; +using EffectType = MagicalDeckbuilder.Cards.EffectType; +using TargetType = MagicalDeckbuilder.Cards.TargetType; +using MagicalDeckbuilder.Cards; + +namespace MagicalDeckbuilder.Game; + +/// +/// Factory for creating game cards +/// +public static class CardFactory +{ + /// + /// Create a starter deck with a variety of cards from all elements + /// + public static List CreateStarterDeck() + { + var deck = new List(); + + // Add 15 cards per element + deck.AddRange(CreateRadioactivityDeck()); + deck.AddRange(CreateFleshDeck()); + deck.AddRange(CreateToxinDeck()); + deck.AddRange(CreateFungusDeck()); + deck.AddRange(CreateThermodynamicsDeck()); + deck.AddRange(CreateTimeDeck()); + deck.AddRange(CreateFoodDeck()); + deck.AddRange(CreateEldritchDeck()); + + return deck; + } + + // ============ RADIOACTIVITY (15 cards) ============ + private static List CreateRadioactivityDeck() + { + var deck = new List(); + + // 3 Creatures + deck.Add(CreateCreature("Radiated Cockroach", "A mutated insect that thrives in radiation", + ElementType.Radioactivity, 1, 1, 2, 1)); + deck.Add(CreateCreature("Glowing Slime", "A luminescent puddle of radioactive ooze", + ElementType.Radioactivity, 2, 2, 3, 1)); + deck.Add(CreateCreature("Nuclear Hulk", "A massive creature fused with radioactive material", + ElementType.Radioactivity, 5, 6, 8, 3)); + + // 2 Spells + deck.Add(CreateSpell("Radiation Burst", "Unleash a wave of harmful radiation", + ElementType.Radioactivity, 3, 4, EffectType.Damage, TargetType.Enemy)); + deck.Add(CreateSpell("Contamination", "Spread radioactive toxins", + ElementType.Radioactivity, 4, 3, EffectType.Debuff, TargetType.Enemy)); + + // 2 Artifacts + deck.Add(CreateArtifact("Uranium Core", "A glowing chunk of enriched uranium", + ElementType.Radioactivity, 3)); + deck.Add(CreateArtifact("Radiation Shield", "Protection from harmful radiation", + ElementType.Radioactivity, 2)); + + // 1 Event + deck.Add(CreateEvent("Meltdown", "A catastrophic nuclear event", + ElementType.Radioactivity, 5, 8)); + + // 1 Blank + deck.Add(CreateBlank("Raw Isotope", "Unrefined radioactive material", + ElementType.Radioactivity, 1)); + + // 3 Enchantments + deck.Add(CreateEnchantment("Glowing Aura", "An eerie glow surrounds creatures", + ElementType.Radioactivity, 2)); + deck.Add(CreateEnchantment("Mutation Seed", "Plants absorb radiation and mutate", + ElementType.Radioactivity, 3)); + deck.Add(CreateEnchantment("Nuclear Winter", "Fallout spreads across the land", + ElementType.Radioactivity, 4)); + + // 3 Weapons + deck.Add(CreateWeapon("Plutonium Dagger", "A blade laced with radioactive material", + ElementType.Radioactivity, 2, 3)); + deck.Add(CreateWeapon("Gamma Ray Gun", "Fires concentrated gamma radiation", + ElementType.Radioactivity, 4, 5)); + deck.Add(CreateWeapon("Atomic Hammer", "Channels nuclear energy into devastating strikes", + ElementType.Radioactivity, 6, 7)); + + return deck; + } + + // ============ FLESH (15 cards) ============ + private static List CreateFleshDeck() + { + var deck = new List(); + + // 3 Creatures + deck.Add(CreateCreature("Living Corpse", "A reanimated body without a soul", + ElementType.Flesh, 2, 2, 4, 1)); + deck.Add(CreateCreature("Horror Maw", "A massive mouth with countless teeth", + ElementType.Flesh, 4, 5, 5, 2)); + deck.Add(CreateCreature("Bone Titan", "A giant assembled from countless bones", + ElementType.Flesh, 6, 7, 7, 3)); + + // 2 Spells + deck.Add(CreateSpell("Cannibalize", "Consume flesh to restore health", + ElementType.Flesh, 2, 4, EffectType.Heal, TargetType.Self)); + deck.Add(CreateSpell("Flay", "Tear flesh from bone", + ElementType.Flesh, 3, 5, EffectType.Damage, TargetType.Enemy)); + + // 2 Artifacts + deck.Add(CreateArtifact("Preserved Heart", "A still-beating heart that never stops", + ElementType.Flesh, 3)); + deck.Add(CreateArtifact("Skin Cloak", "A cloak made from living skin", + ElementType.Flesh, 2)); + + // 1 Event + deck.Add(CreateEvent("Epidemic", "A plague spreads through the land", + ElementType.Flesh, 4, 6)); + + // 1 Blank + deck.Add(CreateBlank("Meat Chunk", "A lump of undifferentiated flesh", + ElementType.Flesh, 1)); + + // 3 Enchantments + deck.Add(CreateEnchantment("Regeneration", "Flesh knits itself back together", + ElementType.Flesh, 2)); + deck.Add(CreateEnchantment("Parasitic Bond", "A parasite feeds off the host", + ElementType.Flesh, 3)); + deck.Add(CreateEnchantment("Body Horror", "Transform into a nightmare form", + ElementType.Flesh, 4)); + + // 3 Weapons + deck.Add(CreateWeapon("Bone Blade", "A sword crafted from sharpened bones", + ElementType.Flesh, 2, 3)); + deck.Add(CreateWeapon("Flesh Ripper", "Hooks designed to tear flesh", + ElementType.Flesh, 3, 4)); + deck.Add(CreateWeapon("Skull Crusher", "A massive hammer topped with skulls", + ElementType.Flesh, 5, 6)); + + return deck; + } + + // ============ TOXIN (15 cards) ============ + private static List CreateToxinDeck() + { + var deck = new List(); + + // 3 Creatures + deck.Add(CreateCreature("Poison Dart Frog", "A small amphibian with deadly toxins", + ElementType.Toxin, 1, 1, 1, 1)); + deck.Add(CreateCreature("Venomous Snake", "A serpent with potent venom", + ElementType.Toxin, 2, 3, 2, 1)); + deck.Add(CreateCreature("Toxic Elemental", "A being made entirely of poison", + ElementType.Toxin, 4, 4, 4, 2)); + + // 2 Spells + deck.Add(CreateSpell("Poison Cloud", "Release a deadly miasma", + ElementType.Toxin, 3, 3, EffectType.Damage, TargetType.AllEnemies)); + deck.Add(CreateSpell("Neurotoxin", "Attack the nervous system", + ElementType.Toxin, 4, 6, EffectType.Debuff, TargetType.Enemy)); + + // 2 Artifacts + deck.Add(CreateArtifact("Venom Vial", "A small bottle of concentrated toxin", + ElementType.Toxin, 2)); + deck.Add(CreateArtifact("Antidote Charm", "Protects against poison effects", + ElementType.Toxin, 2)); + + // 1 Event + deck.Add(CreateEvent("Plague Outbreak", "A devastating sickness spreads", + ElementType.Toxin, 5, 7)); + + // 1 Blank + deck.Add(CreateBlank("Toxic Slime", "An unrefined toxic substance", + ElementType.Toxin, 1)); + + // 3 Enchantments + deck.Add(CreateEnchantment("Toxic Aura", "Poison seeps from the skin", + ElementType.Toxin, 2)); + deck.Add(CreateEnchantment("Blighted Weapon", "Coat weapons in poison", + ElementType.Toxin, 3)); + deck.Add(CreateEnchantment("Corrosive Mist", "Acid-like vapors fill the air", + ElementType.Toxin, 4)); + + // 3 Weapons + deck.Add(CreateWeapon("Poisoned Dagger", "A blade coated with toxin", + ElementType.Toxin, 1, 2)); + deck.Add(CreateWeapon("Viper Fangs", "Fangs that inject venom", + ElementType.Toxin, 3, 3)); + deck.Add(CreateWeapon("Toxic Cannon", "Fires globules of acid", + ElementType.Toxin, 5, 6)); + + return deck; + } + + // ============ FUNGUS (15 cards) ============ + private static List CreateFungusDeck() + { + var deck = new List(); + + // 3 Creatures + deck.Add(CreateCreature("Spore Crawler", "A creature covered in fungus", + ElementType.Fungus, 2, 2, 3, 1)); + deck.Add(CreateCreature("Mushroom Giant", "A massive fungal growth given life", + ElementType.Fungus, 4, 3, 6, 2)); + deck.Add(CreateCreature("Mycotyx", "An ancient fungal horror", + ElementType.Fungus, 5, 4, 7, 3)); + + // 2 Spells + deck.Add(CreateSpell("Spore Burst", "Release a cloud of fungal spores", + ElementType.Fungus, 3, 4, EffectType.Damage, TargetType.Enemy)); + deck.Add(CreateSpell("Fungal Growth", "Accelerate fungal development", + ElementType.Fungus, 2, 3, EffectType.Heal, TargetType.Self)); + + // 2 Artifacts + deck.Add(CreateArtifact("Glowing Mushroom", "A bioluminescent fungus", + ElementType.Fungus, 2)); + deck.Add(CreateArtifact("Fungal Network", "Connects to a vast fungal mind", + ElementType.Fungus, 3)); + + // 1 Event + deck.Add(CreateEvent("Bloom", "Fungi spread rapidly", + ElementType.Fungus, 3, 5)); + + // 1 Blank + deck.Add(CreateBlank("Fungal Spore", "A single, undifferentiated spore", + ElementType.Fungus, 1)); + + // 3 Enchantments + deck.Add(CreateEnchantment("Mycological Bond", "Connected through the fungal network", + ElementType.Fungus, 2)); + deck.Add(CreateEnchantment("Hallucinogenic Aura", "Spores cause vivid hallucinations", + ElementType.Fungus, 3)); + deck.Add(CreateEnchantment("Decomposition", "Breaking down organic matter", + ElementType.Fungus, 4)); + + // 3 Weapons + deck.Add(CreateWeapon("Mushroom Staff", "A staff topped with fungal growth", + ElementType.Fungus, 2, 2)); + deck.Add(CreateWeapon("Spore Launcher", "Fires concentrated fungal projectiles", + ElementType.Fungus, 3, 4)); + deck.Add(CreateWeapon("Fungal Scythe", "A blade that spreads infection", + ElementType.Fungus, 4, 5)); + + return deck; + } + + // ============ THERMODYNAMICS (15 cards) ============ + private static List CreateThermodynamicsDeck() + { + var deck = new List(); + + // 3 Creatures + deck.Add(CreateCreature("Flame Imp", "A small being of pure heat", + ElementType.Thermodynamics, 1, 2, 1, 1)); + deck.Add(CreateCreature("Ice Elemental", "A frozen construct of ice", + ElementType.Thermodynamics, 3, 3, 4, 1)); + deck.Add(CreateCreature("Heat Monster", "A creature that feeds on fire", + ElementType.Thermodynamics, 4, 5, 5, 2)); + + // 2 Spells + deck.Add(CreateSpell("Absolute Zero", "Freeze to near absolute zero", + ElementType.Thermodynamics, 4, 7, EffectType.Damage, TargetType.Enemy)); + deck.Add(CreateSpell("Heat Wave", "Unleash scorching temperatures", + ElementType.Thermodynamics, 3, 5, EffectType.Damage, TargetType.Enemy)); + + // 2 Artifacts + deck.Add(CreateArtifact("Thermal Core", "A reactor that generates heat", + ElementType.Thermodynamics, 3)); + deck.Add(CreateArtifact("Heat Sink", "Absorbs and dissipates thermal energy", + ElementType.Thermodynamics, 2)); + + // 1 Event + deck.Add(CreateEvent("Supernova", "A stellar explosion", + ElementType.Thermodynamics, 6, 10)); + + // 1 Blank + deck.Add(CreateBlank("Thermal Mass", "Raw thermal energy", + ElementType.Thermodynamics, 1)); + + // 3 Enchantments + deck.Add(CreateEnchantment("Temperature Control", "Manipulate ambient temperature", + ElementType.Thermodynamics, 2)); + deck.Add(CreateEnchantment("Heat Absorption", "Drawing heat from surroundings", + ElementType.Thermodynamics, 3)); + deck.Add(CreateEnchantment("Entropy Field", "Increased entropy in the area", + ElementType.Thermodynamics, 4)); + + // 3 Weapons + deck.Add(CreateWeapon("Plasma Torch", "A weapon that burns with plasma", + ElementType.Thermodynamics, 2, 4)); + deck.Add(CreateWeapon("Cryo Cannon", "Freezes targets with extreme cold", + ElementType.Thermodynamics, 4, 4)); + deck.Add(CreateWeapon("Thermal Lance", "Channels focused thermal energy", + ElementType.Thermodynamics, 5, 7)); + + return deck; + } + + // ============ TIME (15 cards) ============ + private static List CreateTimeDeck() + { + var deck = new List(); + + // 3 Creatures + deck.Add(CreateCreature("Temporal Wisp", "A ghostly being out of time", + ElementType.Time, 2, 2, 2, 1)); + deck.Add(CreateCreature("Elder Chronos", "An ancient being of time", + ElementType.Time, 5, 4, 5, 3)); + deck.Add(CreateCreature("Time Loop", "A creature trapped in recursion", + ElementType.Time, 3, 3, 4, 2)); + + // 2 Spells + deck.Add(CreateSpell("Time Stop", "Freeze time for all but the caster", + ElementType.Time, 5, 0, EffectType.Debuff, TargetType.AllEnemies)); + deck.Add(CreateSpell("Accelerate", "Speed up the target", + ElementType.Time, 2, 3, EffectType.Buff, TargetType.Self)); + + // 2 Artifacts + deck.Add(CreateArtifact("Hourglass of Eternity", "An artifact that controls time", + ElementType.Time, 4)); + deck.Add(CreateArtifact("Temporal Anchor", "Keeps the bearer in the present", + ElementType.Time, 3)); + + // 1 Event + deck.Add(CreateEvent("Temporal Rift", "A rupture in the time stream", + ElementType.Time, 5, 8)); + + // 1 Blank + deck.Add(CreateBlank("Temporal Shard", "A fragment of frozen time", + ElementType.Time, 1)); + + // 3 Enchantments + deck.Add(CreateEnchantment("Time Dilation", "Time moves slower for the enchanted", + ElementType.Time, 2)); + deck.Add(CreateEnchantment("Precognition", "See slightly into the future", + ElementType.Time, 3)); + deck.Add(CreateEnchantment("Age Acceleration", "Rapidly age the target", + ElementType.Time, 4)); + + // 3 Weapons + deck.Add(CreateWeapon("Chrono Blade", "A sword that cuts through time", + ElementType.Time, 3, 4)); + deck.Add(CreateWeapon("Temporal Bow", "Arrows that skip through time", + ElementType.Time, 3, 5)); + deck.Add(CreateWeapon("Minute Glass", "A weapon that ages enemies", + ElementType.Time, 4, 4)); + + return deck; + } + + // ============ FOOD (15 cards) ============ + private static List CreateFoodDeck() + { + var deck = new List(); + + // 3 Creatures + deck.Add(CreateCreature("Gorging Goblin", "A gluttonous creature", + ElementType.Food, 2, 3, 3, 1)); + deck.Add(CreateCreature("Living Kitchen", "A sentient cooking apparatus", + ElementType.Food, 3, 2, 5, 1)); + deck.Add(CreateCreature("Famine Beast", "A horror that devours all", + ElementType.Food, 5, 6, 6, 3)); + + // 2 Spells + deck.Add(CreateSpell("Feast", "A bountiful meal restores health", + ElementType.Food, 2, 5, EffectType.Heal, TargetType.Self)); + deck.Add(CreateSpell("Starve", "Deprive the target of food", + ElementType.Food, 3, 4, EffectType.Debuff, TargetType.Enemy)); + + // 2 Artifacts + deck.Add(CreateArtifact("Endless Pantry", "Never runs out of food", + ElementType.Food, 3)); + deck.Add(CreateArtifact("Cursed Cauldron", "A pot that cooks up misfortune", + ElementType.Food, 2)); + + // 1 Event + deck.Add(CreateEvent("Banquet", "A grand feast for all", + ElementType.Food, 3, 6)); + + // 1 Blank + deck.Add(CreateBlank("Raw Ingredient", "An unprocessed food item", + ElementType.Food, 1)); + + // 3 Enchantments + deck.Add(CreateEnchantment("Rotting Touch", "Food spoils at your command", + ElementType.Food, 2)); + deck.Add(CreateEnchantment("Sugar Rush", "Temporary energy from sweets", + ElementType.Food, 2)); + deck.Add(CreateEnchantment("Satisfaction", "Well-fed creatures fight harder", + ElementType.Food, 3)); + + // 3 Weapons + deck.Add(CreateWeapon("Cooking Knife", "Sharp enough to slice anything", + ElementType.Food, 1, 3)); + deck.Add(CreateWeapon("Cleaver", "A massive blade for chopping", + ElementType.Food, 3, 4)); + deck.Add(CreateWeapon("Spear of Sustenance", "A weapon that nourishes the wielder", + ElementType.Food, 4, 5)); + + return deck; + } + + // ============ ELDRITCH (15 cards) ============ + private static List CreateEldritchDeck() + { + var deck = new List(); + + // 3 Creatures + deck.Add(CreateCreature("Cultist", "A follower of ancient horrors", + ElementType.Eldritch, 1, 1, 2, 1)); + deck.Add(CreateCreature("Void Spawn", "A creature from beyond the veil", + ElementType.Eldritch, 3, 4, 3, 2)); + deck.Add(CreateCreature("Eldritch Horror", "A being of incomprehensible power", + ElementType.Eldritch, 6, 8, 8, 4, true)); + + // 2 Spells + deck.Add(CreateSpell("Unspeakable Pact", "A contract with entities unknown", + ElementType.Eldritch, 4, 5, EffectType.Damage, TargetType.Enemy)); + deck.Add(CreateSpell("Sanity Erosion", "Slowly break down mental defenses", + ElementType.Eldritch, 3, 4, EffectType.Debuff, TargetType.Enemy)); + + // 2 Artifacts + deck.Add(CreateArtifact("Madness Tome", "A book of forbidden knowledge", + ElementType.Eldritch, 3)); + deck.Add(CreateArtifact("Eldritch Sigil", "A symbol of cosmic horror", + ElementType.Eldritch, 2)); + + // 1 Event + deck.Add(CreateEvent("The Stars Align", "Cosmic alignment triggers apocalypse", + ElementType.Eldritch, 6, 9)); + + // 1 Blank + deck.Add(CreateBlank("Chaos Shard", "A fragment of pure chaos", + ElementType.Eldritch, 1)); + + // 3 Enchantments + deck.Add(CreateEnchantment("Dark Whispers", "Voices from beyond", + ElementType.Eldritch, 2)); + deck.Add(CreateEnchantment("Eye of Madness", "See through the veil of reality", + ElementType.Eldritch, 3)); + deck.Add(CreateEnchantment("Void Touched", "Marked by the void", + ElementType.Eldritch, 4)); + + // 3 Weapons + deck.Add(CreateWeapon("Tentacle Whip", "A writhing appendage of flesh", + ElementType.Eldritch, 2, 3)); + deck.Add(CreateWeapon("Starfire Staff", "Channels eldritch energies", + ElementType.Eldritch, 4, 5)); + deck.Add(CreateWeapon("Cosmic Blade", "A sword of stellar matter", + ElementType.Eldritch, 5, 7)); + + return deck; + } + + // ============ CARD CREATION HELPERS ============ + + private static Card CreateCreature(string name, string description, + ElementType element, int manaCost, int power, int health, int rarity = 1, bool isLegendary = false) + { + return new CreatureCard + { + Name = name, + Description = description, + Element = element, + ManaCost = manaCost, + Power = power, + Health = health, + Rarity = rarity, + IsLegendary = isLegendary, + Effects = new List + { + new CardEffect + { + Name = "Attack", + Description = "Can attack each turn", + Type = EffectType.Damage, + Value = power, + Target = TargetType.Enemy + } + } + }; + } + + private static Card CreateSpell(string name, string description, + ElementType element, int manaCost, int power, EffectType effectType, TargetType target) + { + var spell = new SpellCard + { + Name = name, + Description = description, + Element = element, + ManaCost = manaCost, + Power = power, + Rarity = 1 + }; + + if (power > 0) + { + spell.Effects.Add(new CardEffect + { + Name = effectType.ToString(), + Description = description, + Type = effectType, + Value = power, + Target = target + }); + } + else + { + spell.Effects.Add(new CardEffect + { + Name = "Effect", + Description = description, + Type = effectType, + Value = 1, + Target = target + }); + } + + return spell; + } + + private static Card CreateArtifact(string name, string description, + ElementType element, int manaCost) + { + return new ArtifactCard + { + Name = name, + Description = description, + Element = element, + ManaCost = manaCost, + Rarity = 1 + }; + } + + private static Card CreateEnchantment(string name, string description, + ElementType element, int manaCost) + { + return new Card + { + Name = name, + Description = description, + Type = CardType.Enchantment, + Element = element, + ManaCost = manaCost, + Rarity = 1, + Power = 0, + Effects = new List + { + new CardEffect + { + Name = "Enchant", + Description = description, + Type = EffectType.Buff, + Value = 1, + Target = TargetType.Self + } + } + }; + } + + private static Card CreateWeapon(string name, string description, + ElementType element, int manaCost, int power) + { + return new Card + { + Name = name, + Description = description, + Type = CardType.Weapon, + Element = element, + ManaCost = manaCost, + Power = power, + Rarity = 1, + Effects = new List + { + new CardEffect + { + Name = "Strike", + Description = description, + Type = EffectType.Damage, + Value = power, + Target = TargetType.Enemy + } + } + }; + } + + private static Card CreateEvent(string name, string description, + ElementType element, int manaCost, int effectValue) + { + var eventCard = new EventCard + { + Name = name, + Description = description, + Element = element, + ManaCost = manaCost, + Rarity = 1, + Power = effectValue + }; + + if (name.Contains("Meltdown") || name.Contains("Supernova")) + { + eventCard.Effects.Add(new CardEffect + { + Name = "Destruction", + Description = "Massive damage to all", + Type = EffectType.Damage, + Value = effectValue, + Target = TargetType.AllEnemies + }); + } + else + { + eventCard.Effects.Add(new CardEffect + { + Name = "Event", + Description = description, + Type = EffectType.Damage, + Value = effectValue, + Target = TargetType.Any + }); + } + + return eventCard; + } + + private static Card CreateBlank(string name, string description, + ElementType element, int manaCost) + { + var blank = new BlankCard + { + Name = name, + Description = description, + Element = element, + ManaCost = manaCost, + Rarity = 1, + Power = 1 + }; + + blank.Effects.Add(new CardEffect + { + Name = "Infusion", + Description = "Can be used to enhance other cards", + Type = EffectType.Buff, + Value = 1, + Target = TargetType.Self + }); + + return blank; + } + + /// + /// Generate a random deck of cards + /// + public static List GenerateRandomDeck() + { + var random = new Random(); + var deck = new List(); + + int deckSize = random.Next(11, 20); + + var allCards = CreateStarterDeck(); + + for (int i = 0; i < deckSize; i++) + { + int cardIndex = random.Next(allCards.Count); + deck.Add(allCards[cardIndex].Clone()); + } + + return deck; + } +} diff --git a/NewGame/Game/Game.cs b/MagicalDeckbuilder.Shared/Game/Game.cs similarity index 99% rename from NewGame/Game/Game.cs rename to MagicalDeckbuilder.Shared/Game/Game.cs index 787aa62..a11d8e3 100644 --- a/NewGame/Game/Game.cs +++ b/MagicalDeckbuilder.Shared/Game/Game.cs @@ -109,13 +109,13 @@ public class Game Console.WriteLine(); // Initialize player deck - var playerDeck = CardFactory.CreateSimpleDeck(); + var playerDeck = CardFactory.CreateStarterDeck(); _player.Deck.InitializeDeck(playerDeck); _player.MaxMana = 1; _player.Mana = _player.MaxMana; // Initialize opponent deck (slightly different for variety) - var opponentDeck = CardFactory.CreateSimpleDeck(); + var opponentDeck = CardFactory.CreateStarterDeck(); _opponent.Deck.InitializeDeck(opponentDeck); _opponent.MaxMana = 1; _opponent.Mana = _opponent.MaxMana; diff --git a/NewGame/NewGame.csproj b/MagicalDeckbuilder.Shared/MagicalDeckbuilder.Shared.csproj similarity index 70% rename from NewGame/NewGame.csproj rename to MagicalDeckbuilder.Shared/MagicalDeckbuilder.Shared.csproj index 360d0da..5cb7135 100644 --- a/NewGame/NewGame.csproj +++ b/MagicalDeckbuilder.Shared/MagicalDeckbuilder.Shared.csproj @@ -1,11 +1,10 @@ - + - WinExe + Library net9.0-windows enable enable - true diff --git a/NewGame/bin/Debug/net9.0/NewGame.deps.json b/MagicalDeckbuilder.Shared/bin/Debug/net9.0-windows/MagicalDeckbuilder.Shared.deps.json similarity index 93% rename from NewGame/bin/Debug/net9.0/NewGame.deps.json rename to MagicalDeckbuilder.Shared/bin/Debug/net9.0-windows/MagicalDeckbuilder.Shared.deps.json index 1df5aa9..e925f97 100644 --- a/NewGame/bin/Debug/net9.0/NewGame.deps.json +++ b/MagicalDeckbuilder.Shared/bin/Debug/net9.0-windows/MagicalDeckbuilder.Shared.deps.json @@ -6,12 +6,12 @@ "compilationOptions": {}, "targets": { ".NETCoreApp,Version=v9.0": { - "NewGame/1.0.0": { + "MagicalDeckbuilder.Shared/1.0.0": { "dependencies": { "System.Drawing.Common": "8.0.0" }, "runtime": { - "NewGame.dll": {} + "MagicalDeckbuilder.Shared.dll": {} } }, "Microsoft.Win32.SystemEvents/8.0.0": { @@ -44,7 +44,7 @@ } }, "libraries": { - "NewGame/1.0.0": { + "MagicalDeckbuilder.Shared/1.0.0": { "type": "project", "serviceable": false, "sha512": "" diff --git a/MagicalDeckbuilder.Shared/bin/Debug/net9.0-windows/MagicalDeckbuilder.Shared.dll b/MagicalDeckbuilder.Shared/bin/Debug/net9.0-windows/MagicalDeckbuilder.Shared.dll new file mode 100644 index 0000000..246b357 Binary files /dev/null and b/MagicalDeckbuilder.Shared/bin/Debug/net9.0-windows/MagicalDeckbuilder.Shared.dll differ diff --git a/MagicalDeckbuilder.Shared/bin/Debug/net9.0-windows/MagicalDeckbuilder.Shared.pdb b/MagicalDeckbuilder.Shared/bin/Debug/net9.0-windows/MagicalDeckbuilder.Shared.pdb new file mode 100644 index 0000000..843e954 Binary files /dev/null and b/MagicalDeckbuilder.Shared/bin/Debug/net9.0-windows/MagicalDeckbuilder.Shared.pdb differ diff --git a/NewGame/obj/Debug/net9.0-windows/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs similarity index 100% rename from NewGame/obj/Debug/net9.0-windows/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs rename to MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs diff --git a/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.AssemblyInfo.cs b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.AssemblyInfo.cs new file mode 100644 index 0000000..07e9531 --- /dev/null +++ b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.AssemblyInfo.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("MagicalDeckbuilder.Shared")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+d5073c68dcd5981e22422ad7275ef44dc903062a")] +[assembly: System.Reflection.AssemblyProductAttribute("MagicalDeckbuilder.Shared")] +[assembly: System.Reflection.AssemblyTitleAttribute("MagicalDeckbuilder.Shared")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.AssemblyInfoInputs.cache b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.AssemblyInfoInputs.cache new file mode 100644 index 0000000..80eddd6 --- /dev/null +++ b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +1bbc97d5cfd5c17cb873a2ade8253ae30cda79087561d7a203001675eb2934c1 diff --git a/NewGame/obj/Debug/net9.0-windows/NewGame.GeneratedMSBuildEditorConfig.editorconfig b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.GeneratedMSBuildEditorConfig.editorconfig similarity index 69% rename from NewGame/obj/Debug/net9.0-windows/NewGame.GeneratedMSBuildEditorConfig.editorconfig rename to MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.GeneratedMSBuildEditorConfig.editorconfig index e236747..1c40956 100644 --- a/NewGame/obj/Debug/net9.0-windows/NewGame.GeneratedMSBuildEditorConfig.editorconfig +++ b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.GeneratedMSBuildEditorConfig.editorconfig @@ -1,10 +1,4 @@ is_global = true -build_property.ApplicationManifest = -build_property.StartupObject = -build_property.ApplicationDefaultFont = -build_property.ApplicationHighDpiMode = -build_property.ApplicationUseCompatibleTextRendering = -build_property.ApplicationVisualStyles = build_property.TargetFramework = net9.0-windows build_property.TargetPlatformMinVersion = 7.0 build_property.UsingMicrosoftNETSdkWeb = @@ -13,8 +7,8 @@ build_property.InvariantGlobalization = build_property.PlatformNeutralAssembly = build_property.EnforceExtendedAnalyzerRules = build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = NewGame -build_property.ProjectDir = C:\Users\atw61\OneDrive\Desktop\new\NewGame\ +build_property.RootNamespace = MagicalDeckbuilder.Shared +build_property.ProjectDir = C:\Users\atw61\OneDrive\Desktop\new\MagicalDeckbuilder.Shared\ build_property.EnableComHosting = build_property.EnableGeneratedComInterfaceComImportInterop = build_property.CsWinRTUseWindowsUIXamlProjections = false diff --git a/NewGame/obj/Debug/net9.0/NewGame.GlobalUsings.g.cs b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.GlobalUsings.g.cs similarity index 100% rename from NewGame/obj/Debug/net9.0/NewGame.GlobalUsings.g.cs rename to MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.GlobalUsings.g.cs diff --git a/NewGame/obj/Debug/net9.0-windows/NewGame.assets.cache b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.assets.cache similarity index 96% rename from NewGame/obj/Debug/net9.0-windows/NewGame.assets.cache rename to MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.assets.cache index fc0383c..38e879f 100644 Binary files a/NewGame/obj/Debug/net9.0-windows/NewGame.assets.cache and b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.assets.cache differ diff --git a/NewGame/obj/Debug/net9.0/NewGame.csproj.AssemblyReference.cache b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.csproj.AssemblyReference.cache similarity index 100% rename from NewGame/obj/Debug/net9.0/NewGame.csproj.AssemblyReference.cache rename to MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.csproj.AssemblyReference.cache diff --git a/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.csproj.CoreCompileInputs.cache b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..ef3d328 --- /dev/null +++ b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +3ccf4ba1804fdf912b12f1ab652c52eb68725958a9fd8dd99a1ae306782e960a diff --git a/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.csproj.FileListAbsolute.txt b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..5ff60af --- /dev/null +++ b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.csproj.FileListAbsolute.txt @@ -0,0 +1,13 @@ +C:\Users\atw61\OneDrive\Desktop\new\MagicalDeckbuilder.Shared\bin\Debug\net9.0-windows\MagicalDeckbuilder.Shared.deps.json +C:\Users\atw61\OneDrive\Desktop\new\MagicalDeckbuilder.Shared\bin\Debug\net9.0-windows\MagicalDeckbuilder.Shared.dll +C:\Users\atw61\OneDrive\Desktop\new\MagicalDeckbuilder.Shared\bin\Debug\net9.0-windows\MagicalDeckbuilder.Shared.pdb +C:\Users\atw61\OneDrive\Desktop\new\MagicalDeckbuilder.Shared\obj\Debug\net9.0-windows\MagicalDeckbuilder.Shared.csproj.AssemblyReference.cache +C:\Users\atw61\OneDrive\Desktop\new\MagicalDeckbuilder.Shared\obj\Debug\net9.0-windows\MagicalDeckbuilder.Shared.GeneratedMSBuildEditorConfig.editorconfig +C:\Users\atw61\OneDrive\Desktop\new\MagicalDeckbuilder.Shared\obj\Debug\net9.0-windows\MagicalDeckbuilder.Shared.AssemblyInfoInputs.cache +C:\Users\atw61\OneDrive\Desktop\new\MagicalDeckbuilder.Shared\obj\Debug\net9.0-windows\MagicalDeckbuilder.Shared.AssemblyInfo.cs +C:\Users\atw61\OneDrive\Desktop\new\MagicalDeckbuilder.Shared\obj\Debug\net9.0-windows\MagicalDeckbuilder.Shared.csproj.CoreCompileInputs.cache +C:\Users\atw61\OneDrive\Desktop\new\MagicalDeckbuilder.Shared\obj\Debug\net9.0-windows\MagicalDeckbuilder.Shared.sourcelink.json +C:\Users\atw61\OneDrive\Desktop\new\MagicalDeckbuilder.Shared\obj\Debug\net9.0-windows\MagicalDeckbuilder.Shared.dll +C:\Users\atw61\OneDrive\Desktop\new\MagicalDeckbuilder.Shared\obj\Debug\net9.0-windows\refint\MagicalDeckbuilder.Shared.dll +C:\Users\atw61\OneDrive\Desktop\new\MagicalDeckbuilder.Shared\obj\Debug\net9.0-windows\MagicalDeckbuilder.Shared.pdb +C:\Users\atw61\OneDrive\Desktop\new\MagicalDeckbuilder.Shared\obj\Debug\net9.0-windows\ref\MagicalDeckbuilder.Shared.dll diff --git a/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.dll b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.dll new file mode 100644 index 0000000..246b357 Binary files /dev/null and b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.dll differ diff --git a/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.pdb b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.pdb new file mode 100644 index 0000000..843e954 Binary files /dev/null and b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.pdb differ diff --git a/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.sourcelink.json b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.sourcelink.json new file mode 100644 index 0000000..d55fbb4 --- /dev/null +++ b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/MagicalDeckbuilder.Shared.sourcelink.json @@ -0,0 +1 @@ +{"documents":{"C:\\Users\\atw61\\OneDrive\\Desktop\\new\\*":"https://raw.githubusercontent.com/alexandria121/new/d5073c68dcd5981e22422ad7275ef44dc903062a/*"}} \ No newline at end of file diff --git a/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/ref/MagicalDeckbuilder.Shared.dll b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/ref/MagicalDeckbuilder.Shared.dll new file mode 100644 index 0000000..70e2341 Binary files /dev/null and b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/ref/MagicalDeckbuilder.Shared.dll differ diff --git a/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/refint/MagicalDeckbuilder.Shared.dll b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/refint/MagicalDeckbuilder.Shared.dll new file mode 100644 index 0000000..70e2341 Binary files /dev/null and b/MagicalDeckbuilder.Shared/obj/Debug/net9.0-windows/refint/MagicalDeckbuilder.Shared.dll differ diff --git a/NewGame/obj/NewGame.csproj.nuget.dgspec.json b/MagicalDeckbuilder.Shared/obj/MagicalDeckbuilder.Shared.csproj.nuget.dgspec.json similarity index 81% rename from NewGame/obj/NewGame.csproj.nuget.dgspec.json rename to MagicalDeckbuilder.Shared/obj/MagicalDeckbuilder.Shared.csproj.nuget.dgspec.json index dbaa64a..af4270a 100644 --- a/NewGame/obj/NewGame.csproj.nuget.dgspec.json +++ b/MagicalDeckbuilder.Shared/obj/MagicalDeckbuilder.Shared.csproj.nuget.dgspec.json @@ -1,17 +1,17 @@ { "format": 1, "restore": { - "C:\\Users\\atw61\\OneDrive\\Desktop\\new\\NewGame\\NewGame.csproj": {} + "C:\\Users\\atw61\\OneDrive\\Desktop\\new\\MagicalDeckbuilder.Shared\\MagicalDeckbuilder.Shared.csproj": {} }, "projects": { - "C:\\Users\\atw61\\OneDrive\\Desktop\\new\\NewGame\\NewGame.csproj": { + "C:\\Users\\atw61\\OneDrive\\Desktop\\new\\MagicalDeckbuilder.Shared\\MagicalDeckbuilder.Shared.csproj": { "version": "1.0.0", "restore": { - "projectUniqueName": "C:\\Users\\atw61\\OneDrive\\Desktop\\new\\NewGame\\NewGame.csproj", - "projectName": "NewGame", - "projectPath": "C:\\Users\\atw61\\OneDrive\\Desktop\\new\\NewGame\\NewGame.csproj", + "projectUniqueName": "C:\\Users\\atw61\\OneDrive\\Desktop\\new\\MagicalDeckbuilder.Shared\\MagicalDeckbuilder.Shared.csproj", + "projectName": "MagicalDeckbuilder.Shared", + "projectPath": "C:\\Users\\atw61\\OneDrive\\Desktop\\new\\MagicalDeckbuilder.Shared\\MagicalDeckbuilder.Shared.csproj", "packagesPath": "C:\\Users\\atw61\\.nuget\\packages\\", - "outputPath": "C:\\Users\\atw61\\OneDrive\\Desktop\\new\\NewGame\\obj\\", + "outputPath": "C:\\Users\\atw61\\OneDrive\\Desktop\\new\\MagicalDeckbuilder.Shared\\obj\\", "projectStyle": "PackageReference", "configFilePaths": [ "C:\\Users\\atw61\\AppData\\Roaming\\NuGet\\NuGet.Config" @@ -63,9 +63,6 @@ "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" - }, - "Microsoft.WindowsDesktop.App.WindowsForms": { - "privateAssets": "none" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.312/PortableRuntimeIdentifierGraph.json" diff --git a/NewGame/obj/NewGame.csproj.nuget.g.props b/MagicalDeckbuilder.Shared/obj/MagicalDeckbuilder.Shared.csproj.nuget.g.props similarity index 100% rename from NewGame/obj/NewGame.csproj.nuget.g.props rename to MagicalDeckbuilder.Shared/obj/MagicalDeckbuilder.Shared.csproj.nuget.g.props diff --git a/NewGame/obj/NewGame.csproj.nuget.g.targets b/MagicalDeckbuilder.Shared/obj/MagicalDeckbuilder.Shared.csproj.nuget.g.targets similarity index 100% rename from NewGame/obj/NewGame.csproj.nuget.g.targets rename to MagicalDeckbuilder.Shared/obj/MagicalDeckbuilder.Shared.csproj.nuget.g.targets diff --git a/NewGame/obj/project.assets.json b/MagicalDeckbuilder.Shared/obj/project.assets.json similarity index 93% rename from NewGame/obj/project.assets.json rename to MagicalDeckbuilder.Shared/obj/project.assets.json index 65049f1..1aea5b6 100644 --- a/NewGame/obj/project.assets.json +++ b/MagicalDeckbuilder.Shared/obj/project.assets.json @@ -133,11 +133,11 @@ "project": { "version": "1.0.0", "restore": { - "projectUniqueName": "c:\\Users\\atw61\\OneDrive\\Desktop\\new\\NewGame\\NewGame.csproj", - "projectName": "NewGame", - "projectPath": "c:\\Users\\atw61\\OneDrive\\Desktop\\new\\NewGame\\NewGame.csproj", + "projectUniqueName": "C:\\Users\\atw61\\OneDrive\\Desktop\\new\\MagicalDeckbuilder.Shared\\MagicalDeckbuilder.Shared.csproj", + "projectName": "MagicalDeckbuilder.Shared", + "projectPath": "C:\\Users\\atw61\\OneDrive\\Desktop\\new\\MagicalDeckbuilder.Shared\\MagicalDeckbuilder.Shared.csproj", "packagesPath": "C:\\Users\\atw61\\.nuget\\packages\\", - "outputPath": "c:\\Users\\atw61\\OneDrive\\Desktop\\new\\NewGame\\obj\\", + "outputPath": "C:\\Users\\atw61\\OneDrive\\Desktop\\new\\MagicalDeckbuilder.Shared\\obj\\", "projectStyle": "PackageReference", "configFilePaths": [ "C:\\Users\\atw61\\AppData\\Roaming\\NuGet\\NuGet.Config" @@ -189,9 +189,6 @@ "frameworkReferences": { "Microsoft.NETCore.App": { "privateAssets": "all" - }, - "Microsoft.WindowsDesktop.App.WindowsForms": { - "privateAssets": "none" } }, "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.312/PortableRuntimeIdentifierGraph.json" diff --git a/MagicalDeckbuilder.Shared/obj/project.nuget.cache b/MagicalDeckbuilder.Shared/obj/project.nuget.cache new file mode 100644 index 0000000..a02cf17 --- /dev/null +++ b/MagicalDeckbuilder.Shared/obj/project.nuget.cache @@ -0,0 +1,11 @@ +{ + "version": 2, + "dgSpecHash": "hoVgv1ibtF4=", + "success": true, + "projectFilePath": "C:\\Users\\atw61\\OneDrive\\Desktop\\new\\MagicalDeckbuilder.Shared\\MagicalDeckbuilder.Shared.csproj", + "expectedPackageFiles": [ + "C:\\Users\\atw61\\.nuget\\packages\\microsoft.win32.systemevents\\8.0.0\\microsoft.win32.systemevents.8.0.0.nupkg.sha512", + "C:\\Users\\atw61\\.nuget\\packages\\system.drawing.common\\8.0.0\\system.drawing.common.8.0.0.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file diff --git a/NewGame.UI/App.xaml b/NewGame.UI/App.xaml new file mode 100644 index 0000000..47726b1 --- /dev/null +++ b/NewGame.UI/App.xaml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/NewGame/Program.cs b/NewGame.UI/App.xaml.cs similarity index 58% rename from NewGame/Program.cs rename to NewGame.UI/App.xaml.cs index 65be34e..4c55b9a 100644 --- a/NewGame/Program.cs +++ b/NewGame.UI/App.xaml.cs @@ -1,32 +1,25 @@ -using System.Windows.Forms; +using System.IO; +using System.Windows; using MagicalDeckbuilder.Assets; -using MagicalDeckbuilder.Cards; using MagicalDeckbuilder.Game; -using MagicalDeckbuilder.UI; -using Card = MagicalDeckbuilder.Cards.Card; -namespace MagicalDeckbuilder; +namespace NewGame.UI; -public static class Program +public partial class App : Application { - [STAThread] - public static void Main() + protected override void OnStartup(StartupEventArgs e) { - // First, generate placeholder images if they don't exist + base.OnStartup(e); + + // Generate placeholder images if they don't exist var baseDir = AppContext.BaseDirectory; - - // Save to bin directory for easier access from WinForms var placeholdersDir = Path.Combine(baseDir, "Assets", "Placeholders"); if (!Directory.Exists(placeholdersDir) || !Directory.GetFiles(placeholdersDir, "*.png").Any()) { Console.WriteLine("=== GENERATING PLACEHOLDER GRAPHICS ===\n"); - - // Ensure directory exists Directory.CreateDirectory(placeholdersDir); - PlaceholderGenerator.GenerateAllPlaceholders(placeholdersDir); - var squaresDir = Path.Combine(placeholdersDir, "Squares"); PlaceholderGenerator.GenerateSimpleSquares(squaresDir); Console.WriteLine(); @@ -34,11 +27,10 @@ public static class Program } // Generate some sample cards for display - var newCards = CardFactory.GenerateNewCards(); + var newCards = CardFactory.CreateStarterDeck(); Console.WriteLine($"Generated {newCards.Count} sample cards\n"); - - // Run the WinForms application - start with the menu - ApplicationConfiguration.Initialize(); - Application.Run(new MenuForm()); + + var mainWindow = new MainWindow(); + mainWindow.Show(); } } diff --git a/NewGame.UI/AssemblyInfo.cs b/NewGame.UI/AssemblyInfo.cs new file mode 100644 index 0000000..cc29e7f --- /dev/null +++ b/NewGame.UI/AssemblyInfo.cs @@ -0,0 +1,10 @@ +using System.Windows; + +[assembly:ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/NewGame.UI/Controls/CardControl.xaml b/NewGame.UI/Controls/CardControl.xaml new file mode 100644 index 0000000..483faa4 --- /dev/null +++ b/NewGame.UI/Controls/CardControl.xaml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NewGame.UI/Controls/CardControl.xaml.cs b/NewGame.UI/Controls/CardControl.xaml.cs new file mode 100644 index 0000000..c48362e --- /dev/null +++ b/NewGame.UI/Controls/CardControl.xaml.cs @@ -0,0 +1,79 @@ +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using NewGame.UI.ViewModels; + +namespace NewGame.UI.Controls; + +public partial class CardControl : UserControl +{ + public static readonly RoutedEvent CardDroppedEvent = EventManager.RegisterRoutedEvent( + "CardDropped", RoutingStrategy.Bubble, typeof(EventHandler), typeof(CardControl)); + + public event EventHandler CardDropped + { + add { AddHandler(CardDroppedEvent, value); } + remove { RemoveHandler(CardDroppedEvent, value); } + } + + private Point _startPoint; + private bool _isDragging; + + public CardControl() + { + InitializeComponent(); + } + + private void OnCardClick(object sender, MouseButtonEventArgs e) + { + if (DataContext is CardViewModel card) + { + card.IsSelected = !card.IsSelected; + } + } + + private void OnCardMouseMove(object sender, MouseEventArgs e) + { + if (e.LeftButton == MouseButtonState.Pressed && !_isDragging) + { + var diff = e.GetPosition(this) - _startPoint; + if (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || + Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance) + { + _isDragging = true; + if (DataContext is CardViewModel card) + { + card.IsDragging = true; + var data = new DataObject("CardViewModel", card); + DragDrop.DoDragDrop(this, data, DragDropEffects.Move); + card.IsDragging = false; + } + _isDragging = false; + } + } + } + + private void OnCardMouseUp(object sender, MouseButtonEventArgs e) + { + _isDragging = false; + } + + protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) + { + _startPoint = e.GetPosition(this); + base.OnMouseLeftButtonDown(e); + } +} + +public class CardDroppedEventArgs : RoutedEventArgs +{ + public CardViewModel Card { get; } + public int SlotIndex { get; } + + public CardDroppedEventArgs(RoutedEvent routedEvent, CardViewModel card, int slotIndex) + : base(routedEvent) + { + Card = card; + SlotIndex = slotIndex; + } +} diff --git a/NewGame.UI/Converters/ValueConverters.cs b/NewGame.UI/Converters/ValueConverters.cs new file mode 100644 index 0000000..80d8596 --- /dev/null +++ b/NewGame.UI/Converters/ValueConverters.cs @@ -0,0 +1,239 @@ +using System.Globalization; +using System.Windows; +using System.Windows.Data; +using System.Windows.Media; +using CardType = MagicalDeckbuilder.Cards.CardType; +using ElementType = MagicalDeckbuilder.Cards.ElementType; + +namespace NewGame.UI.Converters; + +public class TypeToColorConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is CardType type) + { + return type switch + { + CardType.Spell => new SolidColorBrush(Color.FromRgb(255, 100, 100)), + CardType.Creature => new SolidColorBrush(Color.FromRgb(100, 255, 100)), + CardType.Artifact => new SolidColorBrush(Color.FromRgb(200, 200, 100)), + CardType.Enchantment => new SolidColorBrush(Color.FromRgb(150, 100, 200)), + CardType.Weapon => new SolidColorBrush(Color.FromRgb(255, 150, 50)), + CardType.Armor => new SolidColorBrush(Color.FromRgb(100, 150, 200)), + CardType.Event => new SolidColorBrush(Color.FromRgb(255, 200, 100)), + CardType.Blank => new SolidColorBrush(Color.FromRgb(200, 200, 200)), + _ => new SolidColorBrush(Color.FromRgb(128, 128, 128)) + }; + } + return new SolidColorBrush(Color.FromRgb(128, 128, 128)); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} + +public class ElementToColorConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is ElementType element) + { + return element switch + { + ElementType.Radioactivity => new SolidColorBrush(Color.FromRgb(0, 255, 100)), + ElementType.Flesh => new SolidColorBrush(Color.FromRgb(200, 100, 100)), + ElementType.Toxin => new SolidColorBrush(Color.FromRgb(150, 200, 0)), + ElementType.Fungus => new SolidColorBrush(Color.FromRgb(100, 150, 100)), + ElementType.Thermodynamics => new SolidColorBrush(Color.FromRgb(255, 100, 50)), + ElementType.Time => new SolidColorBrush(Color.FromRgb(150, 100, 200)), + ElementType.Food => new SolidColorBrush(Color.FromRgb(200, 150, 100)), + ElementType.Eldritch => new SolidColorBrush(Color.FromRgb(100, 0, 150)), + _ => new SolidColorBrush(Color.FromRgb(128, 128, 128)) + }; + } + return new SolidColorBrush(Color.FromRgb(128, 128, 128)); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} + +public class RarityToColorConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is int rarity) + { + return rarity switch + { + 1 => new SolidColorBrush(Color.FromRgb(180, 180, 180)), + 2 => new SolidColorBrush(Color.FromRgb(100, 200, 100)), + 3 => new SolidColorBrush(Color.FromRgb(50, 100, 200)), + 4 => new SolidColorBrush(Color.FromRgb(200, 150, 50)), + _ => new SolidColorBrush(Color.FromRgb(128, 128, 128)) + }; + } + return new SolidColorBrush(Color.FromRgb(128, 128, 128)); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} + +public class IsCreatureConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is CardType type) + { + return type == CardType.Creature ? Visibility.Visible : Visibility.Collapsed; + } + return Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} + +public class BoolToVisibilityConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is bool b) + { + return b ? Visibility.Visible : Visibility.Collapsed; + } + return Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} + +public class InverseBoolToVisibilityConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is bool b) + { + return b ? Visibility.Collapsed : Visibility.Visible; + } + return Visibility.Visible; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} + +public class BoolToTurnTextConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is bool isPlayerTurn) + { + return isPlayerTurn ? "Your Turn" : "Enemy Turn"; + } + return "Unknown"; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} + +public class BoolToTurnColorConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is bool isPlayerTurn) + { + return isPlayerTurn + ? new SolidColorBrush(Color.FromRgb(76, 175, 80)) + : new SolidColorBrush(Color.FromRgb(244, 67, 54)); + } + return new SolidColorBrush(Color.FromRgb(128, 128, 128)); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} + +public class NullToVisibilityConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return value != null ? Visibility.Visible : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} + +public class EmptyToVisibilityConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is int count) + { + return count == 0 ? Visibility.Visible : Visibility.Collapsed; + } + return Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} + +public class NotMenuToVisibilityConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is string view) + { + return view == "Menu" ? Visibility.Collapsed : Visibility.Visible; + } + return Visibility.Visible; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} + +public class StringEqualityToVisibilityConverter : IValueConverter +{ + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is string str && parameter is string param) + { + return str == param ? Visibility.Visible : Visibility.Collapsed; + } + return Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } +} diff --git a/NewGame.UI/MainWindow.xaml b/NewGame.UI/MainWindow.xaml new file mode 100644 index 0000000..8235f6b --- /dev/null +++ b/NewGame.UI/MainWindow.xaml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + +