Experimentelle Alchemie

Estimated reading: 29 minutes 15 views

TO-DO:

  • Die Wirkungen müssen ergänzt und diversifiziert werden (dafür nehmen wir gerne auch noch Ideen!)
  • Wir müssen herausfinden ob und wie sich gefundene Rezepturen mit unserem Rezeptesystem vereinen lassen bzw. wie wir sie dem Spieler abrufbar anbieten wenn er sie mal gefunden hat (nicht abschreibbare Rezepturen wären mir lieber)

Was ist das?
Experimentelle Alchemie ist eine Ergänzung zur bestehenden Gelehrtenkunde und ermöglicht es, abhängig von Mondphasen verschiedene neue Tränke zu erforschen und zu mixen. Das System basiert dabei nicht auf dem klassischen Crafting, sondern verfügt über insgesamt fünf Werkzeuge, mit denen man nach Schema “verrückter Chemiker” Tränke zusammenbrauen kann. Die Formeln landen dabei NICHT im Rezeptsystem und sind damit auch NICHT über das Mentorensystem oder die Vendoren weitervermittelbar. Ebenso sind die Tränke NICHT beim Vendor verkaufbar, sondern müssen über Spielerhandel verscherbelt werden.

Eckdaten

  • Über 44.000 mögliche Effekte (Momentan haben wir 33)
  • 2 Mondphasen-Varianten (Gen’ Neumond, gen’ Vollmond) für unterschiedliche Wirkungen von Reag-Kombinationen
  • 2 mögliche Varianten der Kombination (Einmal mit Saugflasche, einmal ohne Saugflasche)
  • Mischungen von 2 möglichen Reagtypen mit bis zu jeweils 3 Stück, jede Kombination kann andere Wirkungen ergeben
  • Wirkungen werden random generiert
  • Wirkungen können unter bestimmten Umständen (abhängig von der Mondphase zum Zeitpunkt der Herstellung) stärker oder schwächer eintreten, es gibt eine Chance auf einen Sekundäreffekt

Aufschlüsselung Standard-Formeln-Liste

Diese Listen finden sich auf dem Server unter runuo als “APS_ToFullMoon.csv” und “APS_ToNewMoon.csv”. Sie werden einmalig random generiert und verteilen die entsprechenden Effekte auf sämtliche möglichen Kombinationen.

Code:

REAGENTS:
1 bit for transformation and 2 bits for number of reagents.
FORMULAS:
Gallenstein|PanzerstueckGlaenzend|KnochenSchimmernd|Runenstein|Leichenstaub|SeltsameSchlacke|HolzspaeneFaulig|GlassplitterMatt|GlitzernderStaub|BunteFlocken|Effect|Power|Second Effect|Second Power
000|000|000|000|000|000|000|110|101|000|Explode|0,135|NoEffect|0

  • 000 – Nicht verwendet
  • 001 – Eine Einheit verwendet
  • 101 – Eine Einheit durch Saugflasche
  • 010 – Zwei Einheiten verwendet
  • 110 – Zwei Einheiten durch Saugflasche
  • 011 – Drei Einheiten verwendet
  • 111 – Drei Einheiten durch Saugflasche

Aufschlüsselung Custom Formeln

Zusätzlich zu den Random-Formeln gibt es auch die Möglichkeit, sogenannte “Custom” Formeln festzulegen. Das geschieht in der Scriptdatei “APS_Mixer.cs” ab der Zeile 94. Eventuelle neu hinzugefügte Tränke müssen entsprechend mit Comments markiert und deklariert werden.
Bei “Formula” werden hierbei die entsprechenden bits für die Reagenzien-Zusammenstellung eingetragen, ein Custom-Skill mit eigener Höhe usw. können angegeben werden.

Beispiel:

Code:

if (phase == MoonPhase.Neumond)
                    if (Formula=="110|001|001|010|111|001|010|110|110")
                    {
                        double skillValue = from.Skills[SkillName.Necromancy].Value;
                        if ( skillValue >= 100.0 )
                            if (Utility.RandomDouble() > 0.5)
                            {
                                isADedicatedFormula = true;
                                m_PotionEffect = APS_Potion.APS_PotionEffect.MAX_Unused;
                                m_SecondPotionEffect = APS_Potion.APS_PotionEffect.NoEffect;
                                PotionItemID = 3846; // Black power
                            } else {
                                from.SendMessage("Etwas scheint zu geschehen, aber du kannst nicht erkennen, was genau es ist.");
                                from.SendMessage("Dir dünkt, es wäre besser das nicht nochmal zu versuchen.");
                            }
                    }



Bestehende Potion-Effekte

Code:

public enum APS_PotionEffect
        {
            EmptyBottle,
            NoEffect,
            // RANDOM NEUTRL EFFECT
            StrangeEffect,        // N
            // STATS MODIFIERS         (Intelligence, Dexterity, Strength)
            Increase_Int,        // +
            Increase_Dex,        // +
            Increase_Str,        // +
            Increase_Konst,     // +
            Decrease_Int,        // -
            Decrease_Dex,        // -
            Decrease_Str,        // -
            Decrease_Konst,     // -
            // CAPACITY MODIFIERS     (Mana, Stamina, Hits)
            Refresh_Mana,        // +
            Refresh_Stam,        // +
            Refresh_Hits,        // +
            Use_Mana,            // -
            Use_Stam,            // -
            Use_Hits,            // -
            // SKILLS MODIFIERS (Konzentration, Disziplin, Anatomie, Identifizieren, Magiekunde, Verstohlenheit, Lernfähigkeit)
            IncSkill_Konzentration,     // +
            IncSkill_Disziplin,         // +
            IncSkill_Anatomie,          // +
            IncSkill_Identifizieren,    // +
            IncSkill_Magiekunde,        // +
            IncSkill_Verstohlenheit,    // +
            IncSkill_Lernfähigkeit,     // +
            DecSkill_Konzentration,     // -
            DecSkill_Disziplin,         // -
            DecSkill_Anatomie,          // -
            DecSkill_Identifizieren,    // -
            DecSkill_Magiekunde,        // -
            DecSkill_Verstohlenheit,    // -
            DecSkill_Lernfähigkeit,     // -
            // RESISTANCE MODIFIERS (Wucht, Hieb, Stich, Magie, Gift)
            IncRes_Magie,   // +
            IncRes_Wucht,   // +
            IncRes_Hieb,    // +
            IncRes_Stich,   // +
            IncRes_Gift,    // +
            DecRes_Magie,   // -
            DecRes_Wucht,   // -
            DecRes_Hieb,    // -
            DecRes_Stich,   // -
            DecRes_Gift,    // -
            // POISONS and CURE
            Poison,                // -
            Cure,                // +
            Blutungen,          // -
            Schmerzen,          // -
            // EXPLOSIONS
            Explode,            // N (Throwable)
            // CREATE A CREATURE
            StrangeSlime,        // N (Throwable)
            StrangeEssence,        // N (Throwable)
            StrangeEffusion,    // N (Throwable)
            // MISC
            Confusion,            // N (Throwable)
            Invisibility,        // +
            NightSight,            // +
            Levitate,            // +
            Mute,                // -
            Paralyze,            // -
            Unfreeze,            // +
            Truth,                // -
            Love,                // -
            TerrorVisions,      // -
            PainRelief,         // +
            AntiInflammatory,   // +
            CoughMedicine,      // +
            BloodPressurePlus,  // +
            BloodPressureMinus, // +
            SkinSalve,          // +
            DigestiveHelp,      // +
            Antibiotic,         // +
            MAX_Unused,
            // Non-Random Effects (specific formulas only!)
            /*
            ShadowTouched,      // N
            ElfStruck,          // N
            GodlyAura,          // N
            ManaTouched,        // N
            // Non-Random Drug Effects (specific formulas only!)
            DrugLaudanum,       // N
            DrugOpium,          // N
            DrugAmbrosia,       // N
            DrugKoenigsflorett, // N
            DrugAzoth,          // N
            DrugArkadierwein,   // N
            DrugSandast,        // N
            DrugDrachensand,    // N
            DrugEstus,          // N
            DrugAetherstaub,    // N
            DrugHydra,          // N
            DrugWolfsmilch,     // N
            DrugNachtbluete,    // N
            */
            // Magic Special Effects
            PolymorphFrog,
            PolymorphBat,
            PolymorphDog,
            PolymorphCat,
            PolymorphSnake,
            // Spare Effects
            Positive01,
            Positive02,
            Positive03,
            Positive04,
            Positive05,
            Positive06,
            Neutral01,
            Neutral02,
            Neutral03,
            Neutral04,
            Neutral05,
            Neutral06,
            Negative01,
            Negative02,
            Negative03,
            Negative04,
            Negative05,
            Negative06

Reserve-Effekte

Damit wir ohne Probleme die Listen generieren können und auch nach Livegehen des Systems noch weitere Effekte einfügen können, wurden insgesamt 90 “leere” Effekte hinzugefügt (30 positive, 30 neutrale, 30 negative). Diese sind in ihrer “leeren” Form entsprechend deutlich benannt (“Positive03”, “Neutral10”, “Negative29”, usw.) und können auch umbenannt werden. Hierfür werden zuerst in den Scripten APS_Mortar.cs und APS_Potion.cs die entsprechenden Namen geändert, dann müssen die CSV-Listen mit einem Suchen/Ersetzen entsprechend angepasst werden. Das dauert zwar eine ganze Weile, ermöglicht es aber, einmalig generierte Listen auch im Nachhinein noch zu modifizieren ohne dass die anderen Trankwirkungen sich ändern.

Effekt-Klassen mit Beispielen

Increase Stat:

Code:

case APS_PotionEffect.Increase_Int: {
                        /********************** CONFIG *************************************************************/
                        int StatMinValue = 5;     // Classical regular stat potion is 10
                        int StatMaxValue = 15;     // Classical greater stat potion is 20
                        double TimeMinValue = 20.0; // Classical stat potion is 2.0 minutes
                        double TimeMaxValue = 60.0; // Classical stat potion is 2.0 minutes
                        ////////////////////////////////////////////////////////////////////////////////////////////
                        int StrOffset         =                         StatMinValue +(int)(power*(StatMaxValue-StatMinValue));
                        Duration     = TimeSpan.FromSeconds( TimeMinValue +     (power*(TimeMaxValue-TimeMinValue)) );
                        if ( Spells.SpellHelper.AddStatOffset( from, StatType.Int, StrOffset, Duration ) )
                        {
                            //from.FixedEffect( 0x375A, 10, 15 );
                            from.PlaySound( 0x1E7 );
                        }
                    } break;

Decrease Stat:

Code:

case APS_PotionEffect.Decrease_Int: {
                        /********************** CONFIG *************************************************************/
                        int StatMinValue = 5;     // Classical regular strength potion is 10
                        int StatMaxValue = 15;     // Classical greater strength potion is 20
                        double TimeMinValue = 2; // Classical strength potion is 2.0 minutes
                        double TimeMaxValue = 15.0; // Classical strength potion is 2.0 minutes
                        ////////////////////////////////////////////////////////////////////////////////////////////
                        int StrOffset         =                         StatMinValue +(int)(power*(StatMaxValue-StatMinValue));
                        Duration     = TimeSpan.FromMinutes( TimeMinValue +     (power*(TimeMaxValue-TimeMinValue)) );
                        if ( Spells.SpellHelper.AddStatOffset( from, StatType.Int, -StrOffset, Duration  ))
                        {
                            //from.FixedEffect( 0x375A, 10, 15 );
                            from.PlaySound( 1450 );
                        }
                    } break;

Points Increase (HP, Stam, Mana):

Code:

case APS_PotionEffect.Refresh_Hits: {
                        /********************** CONFIG *************************************************************/
                        int MinValueFrom = 3;  // Classical lesser heal potion is 3 (non AOS)
                        int MinValueTo     = 10; // Classical lesser heal potion is 10 (non AOS)
                        int MaxValueFrom = 9;  // Classical lesser heal potion is 3 (non AOS)
                        int MaxValueTo     = 30; // Classical lesser heal potion is 10 (non AOS)
                        double TimeMinValue = 20.0; // Classical heal potion is 10.0 seconds
                        double TimeMaxValue = 50.0; // Classical heal potion is 10.0 seconds
                        ////////////////////////////////////////////////////////////////////////////////////////////
                        int ValueFrom     = MinValueFrom + (int)(power*(MaxValueFrom-MinValueFrom));
                        int ValueTo     = MinValueTo   + (int)(power*(MaxValueTo-MinValueTo));
                        Duration     = TimeSpan.FromSeconds( TimeMinValue + (power*(TimeMaxValue-TimeMinValue)) );
                        if ( from.Poisoned || MortalStrike.IsWounded( from ) )
                        {
                            from.SendMessage("Dieser Trank hat keine Auswirkung auf deinen Zustand.");
                        } else {
                            from.Heal( Utility.RandomMinMax( ValueFrom, ValueTo ) );
                        }
                    } break;

Points Decrease (HP, Stam, Mana):

Code:

case APS_PotionEffect.Use_Hits: {
                        /********************** CONFIG *************************************************************/
                        int MinValue = 5;
                        int MaxValue = 50;
                        double TimeMinValue = 0.5;
                        double TimeMaxValue = 3.0;
                        ////////////////////////////////////////////////////////////////////////////////////////////
                        int      Value      = MinValue +(int)(power*(MaxValue-MinValue));
                        Duration     = TimeSpan.FromMinutes( TimeMinValue + (power*(TimeMaxValue-TimeMinValue)) );
                        from.PlaySound( 1450 );
                        from.Damage(Value);
                        from.SendMessage("Du fühlst dich krank und zunehmend schwächer.");
                    } break;

Summon Creature:

Code:

case APS_PotionEffect.StrangeEssence: {
                        /********************** CONFIG *************************************************************/
                        double TimeMinValue = 0.5;
                        double TimeMaxValue = 3.0;
                        ////////////////////////////////////////////////////////////////////////////////////////////
                        Duration     = TimeSpan.FromMinutes( TimeMinValue + (power*(TimeMaxValue-TimeMinValue)) );
                        from.SendMessage("Das runde Ding beginnt sich unheilvoll zu bewegen. ");
                        APS_StrangeEssence creature = new APS_StrangeEssence();
                        Point3D p = new Point3D( from );
                        BaseCreature.Summon( creature, false, from, p, 456, Duration );
                    } break;

Bool Props-Change:

Code:

case APS_PotionEffect.Invisibility: {
                        /********************** CONFIG *************************************************************/
                        int MinTime = 2;  // in seconds
                        int MaxTime = 60; // in seconds
                        ////////////////////////////////////////////////////////////////////////////////////////////
                        int Counter = MinTime +(int)(power*(MaxTime-MinTime));
                        Duration     = TimeSpan.FromSeconds( (double)Counter );
                        from.Hidden = true;
                        from.Combatant = null;
                        from.Warmode = false;
                        from.PlaySound(552);
                        from.SendMessage("Du wirst unsichtbar.");
                        APS_DurationActionStone item = new APS_DurationActionStone(from,effect,Counter,0);
                    } break;

RP-Effekt:

Code:

case APS_PotionEffect.Truth: {
                        /********************** CONFIG *************************************************************/
                        int MinTime = 5;      // in seconds
                        int MaxTime = 3*60; // in seconds
                        ////////////////////////////////////////////////////////////////////////////////////////////
                        int Counter = MinTime +(int)(power*(MaxTime-MinTime));
                        Duration     = TimeSpan.FromSeconds( (double)Counter );
                        from.PlaySound(1471);
                        from.SendMessage("Du befindest dich unter dem Einfluss eines Wahrheitsserums:");
                        from.SendMessage("Du kannst gerade nicht lügen! (Rollenspieleffekt)");
                        APS_DurationActionStone item = new APS_DurationActionStone(from,effect,Counter,0);
                    } break;

Skill Increase:

Code:

case APS_PotionEffect.IncSkill_Konzentration:
                    {
                        /*************************** CONFIG *******************************/
                        int MinTime = 15;    // in seconds
                        int MaxTime = 3 * 60; // in seconds
                        int MinValue = 1;
                        int MaxValue = 8;
                        //////////////////////////////////////////////////////////////////////
                        int Counter = MinTime + (int)(power * (MaxTime - MinTime));
                        double SkillValue = MinValue + (power * (MaxValue - MinValue));
                        Duration = TimeSpan.FromSeconds((double)Counter);
                        from.SendMessage("Du fühlst wie Ablenkungen in den Hintergrund rücken und deine Konzentration zunimmt.");
                        from.AddSkillMod(new TimedSkillMod(SkillName.ArxKonzentration, true, SkillValue, Duration));
                        APS_DurationActionStone item = new APS_DurationActionStone(from, effect, Counter, 0);
                    }
                    break;
Skill Decrease:

Code:

case APS_PotionEffect.DecSkill_Konzentration:
                   {
                       /*************************** CONFIG *******************************/
                       int MinTime = 15;    // in seconds
                       int MaxTime = 3 * 60; // in seconds
                       int MinValue = -1;
                       int MaxValue = -8;
                       //////////////////////////////////////////////////////////////////////
                       int Counter = MinTime + (int)(power * (MaxTime - MinTime));
                       double SkillValue = MinValue + (power * (MaxValue - MinValue));

Share this Doc

Experimentelle Alchemie

Or copy link

CONTENTS