Пример #1
0
        // Function from file: other_reagents.dm
        public override void reaction_turf(dynamic T = null, double?volume = null)
        {
            dynamic GG = null;


            if ((volume ?? 0) >= 3)
            {
                if (!(T is Tile_Space))
                {
                    GG = Lang13.FindIn(typeof(Obj_Effect_Decal_Cleanable_Greenglow), T.contents);

                    if (!Lang13.Bool(GG))
                    {
                        GG = new Obj_Effect_Decal_Cleanable_Greenglow(T);
                    }
                    ((Reagents)GG.reagents).add_reagent("radium", volume);
                }
            }
            return;
        }
        // Function from file: experimentor.dm
        public void experiment(double?exp = null, dynamic exp_on = null)
        {
            dynamic    chosenchem       = null;
            dynamic    criticalReaction = null;
            Mob_Living m        = null;
            dynamic    target   = null;
            dynamic    throwing = null;
            dynamic    T        = null;
            Obj_Effect_Decal_Cleanable_Greenglow reagentdecal = null;
            string   savedName = null;
            dynamic  newPath   = null;
            dynamic  CG        = null;
            Reagents R         = null;
            EffectSystem_SmokeSpread_Chem smoke = null;
            Reagents R2 = null;
            EffectSystem_SmokeSpread_Chem smoke2 = null;
            Obj_Item_Weapon_ReagentContainers_Food_Drinks_Coffee C = null;
            dynamic start = null;
            dynamic M     = null;
            dynamic MT    = null;
            Obj_Item_Projectile_Magic_Fireball FB = null;
            GasMixture env                  = null;
            double     transfer_moles       = 0;
            GasMixture removed              = null;
            double?    heat_capacity        = null;
            Mob_Living m2                   = null;
            Obj_Machinery_Vending_Coffee C2 = null;
            Reagents R3 = null;
            EffectSystem_SmokeSpread_Chem smoke3 = null;
            GasMixture env2                 = null;
            double     transfer_moles2      = 0;
            GasMixture removed2             = null;
            double?    heat_capacity2       = null;
            EffectSystem_SmokeSpread smoke4 = null;
            dynamic     material            = null;
            Ent_Dynamic AM         = null;
            ByTable     throwAt    = null;
            Ent_Dynamic AM2        = null;
            int?        counter    = null;
            Ent_Dynamic cast       = null;
            dynamic     a          = null;
            dynamic     b          = null;
            dynamic     R4         = null;
            int         globalMalf = 0;
            Mob_Living  m3         = null;
            ByTable     reqs       = null;
            dynamic     T2         = null;

            this.recentlyExperimented = true;
            this.icon_state           = "h_lathe_wloop";
            criticalReaction          = Lang13.FindIn(exp_on, (this.critical_items != null ? GlobalVars.TRUE : GlobalVars.FALSE));

            if (exp == 1)
            {
                this.visible_message("" + this + " prods at " + exp_on + " with mechanical arms.");

                if (Rand13.PercentChance(35) && Lang13.Bool(criticalReaction))
                {
                    this.visible_message("" + exp_on + " is gripped in just the right way, enhancing its focus.");
                    this.badThingCoeff++;
                }

                if (Rand13.PercentChance(((int)(20 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='danger'>" + this + " malfunctions and destroys " + exp_on + ", lashing its arms out at nearby people!</span>");

                    foreach (dynamic _a in Lang13.Enumerate(Map13.FetchInViewExcludeThis(this, 1), typeof(Mob_Living)))
                    {
                        m = _a;

                        m.apply_damage(15, "brute", Rand13.Pick(new object [] { "head", "chest", "groin" }));
                        this.investigate_log("Experimentor dealt minor brute to " + m + ".", "experimentor");
                    }
                    this.ejectItem(GlobalVars.TRUE);
                }

                if (Rand13.PercentChance(((int)(35 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='warning'>" + this + " malfunctions!</span>");
                    exp = 6;
                }

                if (Rand13.PercentChance(((int)(50 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='danger'>" + this + " malfunctions, throwing the " + exp_on + "!</span>");
                    target = Lang13.FindIn(typeof(Mob_Living), Map13.FetchInViewExcludeThis(this, 7));

                    if (Lang13.Bool(target))
                    {
                        throwing = this.loaded_item;
                        this.investigate_log("Experimentor has thrown " + this.loaded_item + " at " + target, "experimentor");
                        this.ejectItem();

                        if (Lang13.Bool(throwing))
                        {
                            ((Ent_Dynamic)throwing).throw_at(target, 10, 1);
                        }
                    }
                }
            }

            if (exp == 2)
            {
                this.visible_message("<span class='danger'>" + this + " reflects radioactive rays at " + exp_on + "!</span>");

                if (Rand13.PercentChance(35) && Lang13.Bool(criticalReaction))
                {
                    this.visible_message("" + exp_on + " has activated an unknown subroutine!");
                    this.cloneMode  = GlobalVars.TRUE;
                    this.cloneCount = this.badThingCoeff;
                    this.investigate_log("Experimentor has made a clone of " + exp_on, "experimentor");
                    this.ejectItem();
                }

                if (Rand13.PercentChance(((int)(20 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='danger'>" + this + " malfunctions, melting " + exp_on + " and leaking radiation!</span>");
                    GlobalFuncs.radiation_pulse(GlobalFuncs.get_turf(this), 1, 1, 25, true);
                    this.ejectItem(GlobalVars.TRUE);
                }

                if (Rand13.PercentChance(((int)(35 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='warning'>" + this + " malfunctions, spewing toxic waste!</span>");

                    foreach (dynamic _b in Lang13.Enumerate(Map13.FetchInViewExcludeThis(this, 1)))
                    {
                        T = _b;


                        if (!T.density)
                        {
                            if (Rand13.PercentChance(95))
                            {
                                reagentdecal = new Obj_Effect_Decal_Cleanable_Greenglow(T);
                                reagentdecal.reagents.add_reagent("radium", 7);
                            }
                        }
                    }
                }

                if (Rand13.PercentChance(((int)(50 - this.badThingCoeff))))
                {
                    savedName = "" + exp_on;
                    this.ejectItem(GlobalVars.TRUE);
                    newPath          = this.pickWeighted(this.valid_items);
                    this.loaded_item = Lang13.Call(newPath, this);
                    this.visible_message("<span class='warning'>" + this + " malfunctions, transforming " + savedName + " into " + this.loaded_item + "!</span>");
                    this.investigate_log("Experimentor has transformed " + savedName + " into " + this.loaded_item, "experimentor");

                    if (this.loaded_item is Obj_Item_Weapon_Grenade_ChemGrenade)
                    {
                        CG = this.loaded_item;
                        ((Obj_Item_Weapon_Grenade)CG).prime();
                    }
                    this.ejectItem();
                }
            }

            if (exp == 3)
            {
                this.visible_message("<span class='warning'>" + this + " fills its chamber with gas, " + exp_on + " included.</span>");

                if (Rand13.PercentChance(35) && Lang13.Bool(criticalReaction))
                {
                    this.visible_message("" + exp_on + " achieves the perfect mix!");
                    new Obj_Item_Stack_Sheet_Mineral_Plasma(GlobalFuncs.get_turf(Rand13.PickFromTable(Map13.FetchInViewExcludeThis(this, 1))));
                }

                if (Rand13.PercentChance(((int)(20 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='danger'>" + this + " destroys " + exp_on + ", leaking dangerous gas!</span>");
                    chosenchem = Rand13.Pick(new object [] { "carbon", "radium", "toxin", "condensedcapsaicin", "mushroomhallucinogen", "space_drugs", "ethanol", "beepskysmash" });
                    R          = new Reagents(50);
                    R.my_atom  = this;
                    R.add_reagent(chosenchem, 50);
                    this.investigate_log("Experimentor has released " + chosenchem + " smoke.", "experimentor");
                    smoke = new EffectSystem_SmokeSpread_Chem();
                    smoke.set_up(R, 0, this);
                    GlobalFuncs.playsound(this.loc, "sound/effects/smoke.ogg", 50, 1, -3);
                    smoke.start();
                    GlobalFuncs.qdel(R);
                    this.ejectItem(GlobalVars.TRUE);
                }

                if (Rand13.PercentChance(((int)(20 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='danger'>" + this + "'s chemical chamber has sprung a leak!</span>");
                    chosenchem = Rand13.Pick(new object [] { "mutationtoxin", "nanomachines", "sacid" });
                    R2         = new Reagents(50);
                    R2.my_atom = this;
                    R2.add_reagent(chosenchem, 50);
                    smoke2 = new EffectSystem_SmokeSpread_Chem();
                    smoke2.set_up(R2, 0, this);
                    GlobalFuncs.playsound(this.loc, "sound/effects/smoke.ogg", 50, 1, -3);
                    smoke2.start();
                    GlobalFuncs.qdel(R2);
                    this.ejectItem(GlobalVars.TRUE);
                    this.warn_admins(Task13.User, "" + chosenchem + " smoke");
                    this.investigate_log("Experimentor has released <font color='red'>" + chosenchem + "</font> smoke!", "experimentor");
                }

                if (Rand13.PercentChance(((int)(35 - this.badThingCoeff))))
                {
                    this.visible_message("" + this + " malfunctions, spewing harmless gas.");
                    this.throwSmoke(this.loc);
                }

                if (Rand13.PercentChance(((int)(50 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='warning'>" + this + " melts " + exp_on + ", ionizing the air around it!</span>");
                    GlobalFuncs.empulse(this.loc, 4, 6);
                    this.investigate_log("Experimentor has generated an Electromagnetic Pulse.", "experimentor");
                    this.ejectItem(GlobalVars.TRUE);
                }
            }

            if (exp == 4)
            {
                this.visible_message("" + this + " raises " + exp_on + "'s temperature.");

                if (Rand13.PercentChance(35) && Lang13.Bool(criticalReaction))
                {
                    this.visible_message("<span class='warning'>" + this + "'s emergency coolant system gives off a small ding!</span>");
                    GlobalFuncs.playsound(this.loc, "sound/machines/ding.ogg", 50, 1);
                    C          = new Obj_Item_Weapon_ReagentContainers_Food_Drinks_Coffee(GlobalFuncs.get_turf(Rand13.PickFromTable(Map13.FetchInViewExcludeThis(this, 1))));
                    chosenchem = Rand13.Pick(new object [] { "plasma", "capsaicin", "ethanol" });
                    C.reagents.remove_any(25);
                    C.reagents.add_reagent(chosenchem, 50);
                    C.name = "Cup of Suspicious Liquid";
                    C.desc = "It has a large hazard symbol printed on the side in fading ink.";
                    this.investigate_log("Experimentor has made a cup of " + chosenchem + " coffee.", "experimentor");
                }

                if (Rand13.PercentChance(((int)(20 - this.badThingCoeff))))
                {
                    start = GlobalFuncs.get_turf(this);
                    M     = Lang13.FindIn(typeof(Mob_Living), Map13.FetchInView(3, this));
                    MT    = GlobalFuncs.get_turf(M);

                    if (Lang13.Bool(MT))
                    {
                        this.visible_message("<span class='danger'>" + this + " dangerously overheats, launching a flaming fuel orb!</span>");
                        this.investigate_log("Experimentor has launched a <font color='red'>fireball</font> at " + M + "!", "experimentor");
                        FB          = new Obj_Item_Projectile_Magic_Fireball(start);
                        FB.original = MT;
                        FB.current  = start;
                        FB.yo       = Convert.ToDouble(MT.y - start.y);
                        FB.xo       = Convert.ToDouble(MT.x - start.x);
                        FB.fire();
                    }
                }

                if (Rand13.PercentChance(((int)(35 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='danger'>" + this + " malfunctions, melting " + exp_on + " and releasing a burst of flame!</span>");
                    GlobalFuncs.explosion(this.loc, -1, 0, 0, 0, 0, null, 2);
                    this.investigate_log("Experimentor started a fire.", "experimentor");
                    this.ejectItem(GlobalVars.TRUE);
                }

                if (Rand13.PercentChance(((int)(50 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='warning'>" + this + " malfunctions, melting " + exp_on + " and leaking hot air!</span>");
                    env            = this.loc.return_air();
                    transfer_moles = env.total_moles() * 0.25;
                    removed        = env.remove(transfer_moles);

                    if (removed != null)
                    {
                        heat_capacity = removed.heat_capacity();

                        if (heat_capacity == 0 || heat_capacity == null)
                        {
                            heat_capacity = 1;
                        }
                        removed.temperature = Num13.MinInt(Convert.ToInt32((removed.temperature * heat_capacity + 100000) / heat_capacity), 1000);
                    }
                    env.merge(removed);
                    this.air_update_turf();
                    this.investigate_log("Experimentor has released hot air.", "experimentor");
                    this.ejectItem(GlobalVars.TRUE);
                }

                if (Rand13.PercentChance(((int)(50 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='warning'>" + this + " malfunctions, activating its emergency coolant systems!</span>");
                    this.throwSmoke(this.loc);

                    foreach (dynamic _c in Lang13.Enumerate(Map13.FetchInViewExcludeThis(this, 1), typeof(Mob_Living)))
                    {
                        m2 = _c;

                        m2.apply_damage(5, "burn", Rand13.Pick(new object [] { "head", "chest", "groin" }));
                        this.investigate_log("Experimentor has dealt minor burn damage to " + m2, "experimentor");
                    }
                    this.ejectItem();
                }
            }

            if (exp == 5)
            {
                this.visible_message("" + this + " lowers " + exp_on + "'s temperature.");

                if (Rand13.PercentChance(35) && Lang13.Bool(criticalReaction))
                {
                    this.visible_message("<span class='warning'>" + this + "'s emergency coolant system gives off a small ding!</span>");
                    C2 = new Obj_Machinery_Vending_Coffee(GlobalFuncs.get_turf(Rand13.PickFromTable(Map13.FetchInViewExcludeThis(this, 1))));
                    GlobalFuncs.playsound(this.loc, "sound/machines/ding.ogg", 50, 1);
                    chosenchem = Rand13.Pick(new object [] { "uranium", "frostoil", "ephedrine" });
                    C2.reagents.remove_any(25);
                    C2.reagents.add_reagent(chosenchem, 50);
                    C2.name = "Cup of Suspicious Liquid";
                    C2.desc = "It has a large hazard symbol printed on the side in fading ink.";
                    this.investigate_log("Experimentor has made a cup of " + chosenchem + " coffee.", "experimentor");
                }

                if (Rand13.PercentChance(((int)(20 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='danger'>" + this + " malfunctions, shattering " + exp_on + " and releasing a dangerous cloud of coolant!</span>");
                    R3         = new Reagents(50);
                    R3.my_atom = this;
                    R3.add_reagent("frostoil", 50);
                    this.investigate_log("Experimentor has released frostoil gas.", "experimentor");
                    smoke3 = new EffectSystem_SmokeSpread_Chem();
                    smoke3.set_up(R3, 0, this);
                    GlobalFuncs.playsound(this.loc, "sound/effects/smoke.ogg", 50, 1, -3);
                    smoke3.start();
                    GlobalFuncs.qdel(R3);
                    this.ejectItem(GlobalVars.TRUE);
                }

                if (Rand13.PercentChance(((int)(35 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='warning'>" + this + " malfunctions, shattering " + exp_on + " and leaking cold air!</span>");
                    env2            = this.loc.return_air();
                    transfer_moles2 = env2.total_moles() * 0.25;
                    removed2        = env2.remove(transfer_moles2);

                    if (removed2 != null)
                    {
                        heat_capacity2 = removed2.heat_capacity();

                        if (heat_capacity2 == 0 || heat_capacity2 == null)
                        {
                            heat_capacity2 = 1;
                        }
                        removed2.temperature = (removed2.temperature * heat_capacity2 - 75000) / heat_capacity2;
                    }
                    env2.merge(removed2);
                    this.air_update_turf();
                    this.investigate_log("Experimentor has released cold air.", "experimentor");
                    this.ejectItem(GlobalVars.TRUE);
                }

                if (Rand13.PercentChance(((int)(50 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='warning'>" + this + " malfunctions, releasing a flurry of chilly air as " + exp_on + " pops out!</span>");
                    smoke4 = new EffectSystem_SmokeSpread();
                    smoke4.set_up(0, this.loc);
                    smoke4.start();
                    this.ejectItem();
                }
            }

            if (exp == 6)
            {
                this.visible_message("<span class='warning'>" + exp_on + " activates the crushing mechanism, " + exp_on + " is destroyed!</span>");

                if (Rand13.PercentChance(35) && Lang13.Bool(criticalReaction))
                {
                    this.visible_message("<span class='warning'>" + this + "'s crushing mechanism slowly and smoothly descends, flattening the " + exp_on + "!</span>");
                    new Obj_Item_Stack_Sheet_Plasteel(GlobalFuncs.get_turf(Rand13.PickFromTable(Map13.FetchInViewExcludeThis(this, 1))));
                }

                if (this.linked_console.linked_lathe != null)
                {
                    foreach (dynamic _d in Lang13.Enumerate(exp_on.materials))
                    {
                        material = _d;

                        ((MaterialContainer)((dynamic)this.linked_console.linked_lathe).materials).insert_amount(Num13.MinInt(Convert.ToInt32(((dynamic)this.linked_console.linked_lathe).materials.max_amount - ((dynamic)this.linked_console.linked_lathe).materials.total_amount), Convert.ToInt32(exp_on.materials[material])), material);
                    }
                }

                if (Rand13.PercentChance(((int)(20 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='danger'>" + this + "'s crusher goes way too many levels too high, crushing right through space-time!</span>");
                    GlobalFuncs.playsound(this.loc, "sound/effects/supermatter.ogg", 50, 1, -3);
                    this.investigate_log("Experimentor has triggered the 'throw things' reaction.", "experimentor");

                    foreach (dynamic _e in Lang13.Enumerate(Map13.FetchInViewExcludeThis(this, 7), typeof(Ent_Dynamic)))
                    {
                        AM = _e;


                        if (!Lang13.Bool(AM.anchored))
                        {
                            AM.throw_at_fast(this, 10, 1);
                        }
                    }
                }

                if (Rand13.PercentChance(((int)(35 - this.badThingCoeff))))
                {
                    this.visible_message("<span class='danger'>" + this + "'s crusher goes one level too high, crushing right into space-time!</span>");
                    GlobalFuncs.playsound(this.loc, "sound/effects/supermatter.ogg", 50, 1, -3);
                    this.investigate_log("Experimentor has triggered the 'minor throw things' reaction.", "experimentor");
                    throwAt = new ByTable();

                    foreach (dynamic _f in Lang13.Enumerate(Map13.FetchInViewExcludeThis(this, 7), typeof(Ent_Dynamic)))
                    {
                        AM2 = _f;


                        if (!Lang13.Bool(AM2.anchored))
                        {
                            throwAt.Add(AM2);
                        }
                    }
                    counter = null;
                    counter = 1;

                    while ((counter ?? 0) < throwAt.len)
                    {
                        cast = throwAt[counter];
                        cast.throw_at_fast(Rand13.PickFromTable(throwAt), 10, 1);
                        counter++;
                    }
                }
                this.ejectItem(GlobalVars.TRUE);
            }

            if (exp == 8)
            {
                a = Rand13.Pick(new object [] { "rumbles", "shakes", "vibrates", "shudders" });
                b = Rand13.Pick(new object [] { "crushes", "spins", "viscerates", "smashes", "insults" });
                this.visible_message("<span class='warning'>" + exp_on + " " + a + ", and " + b + ", the experiment was a failure.</span>");
            }

            if (exp == 7)
            {
                this.visible_message("" + this + " scans the " + exp_on + ", revealing its true nature!");
                GlobalFuncs.playsound(this.loc, "sound/effects/supermatter.ogg", 50, 3, -1);
                R4 = this.loaded_item;
                R4.reveal();
                this.investigate_log("Experimentor has revealed a relic with <span class='danger'>" + R4.realProc + "</span> effect.", "experimentor");
                this.ejectItem();
            }

            if (Rand13.PercentChance(((int)(20 - this.badThingCoeff))))
            {
                globalMalf = Rand13.Int(1, 100);

                if (globalMalf < 15)
                {
                    this.visible_message("<span class='warning'>" + this + "'s onboard detection system has malfunctioned!</span>");
                    this.item_reactions["" + exp_on.type] = Rand13.Pick(new object [] { 1, 2, 3, 4, 5, 6 });
                    this.ejectItem();
                }

                if (globalMalf > 16 && globalMalf < 35)
                {
                    this.visible_message("<span class='warning'>" + this + " melts " + exp_on + ", ian-izing the air around it!</span>");
                    this.throwSmoke(this.loc);

                    if (Lang13.Bool(this.trackedIan))
                    {
                        this.throwSmoke(this.trackedIan.loc);
                        this.trackedIan.loc = this.loc;
                        this.investigate_log("Experimentor has stolen Ian!", "experimentor");
                    }
                    else
                    {
                        new Mob_Living_SimpleAnimal_Pet_Dog_Corgi(this.loc);
                        this.investigate_log("Experimentor has spawned a new corgi.", "experimentor");
                    }
                    this.ejectItem(GlobalVars.TRUE);
                }

                if (globalMalf > 36 && globalMalf < 50)
                {
                    this.visible_message("<span class='warning'>" + this + " improves " + exp_on + ", drawing the life essence of those nearby!</span>");

                    foreach (dynamic _g in Lang13.Enumerate(Map13.FetchInView(this, 4), typeof(Mob_Living)))
                    {
                        m3 = _g;

                        m3.WriteMsg("<span class='danger'>You feel your flesh being torn from you, mists of blood drifting to " + this + "!</span>");
                        m3.apply_damage(50, "brute", "chest");
                        this.investigate_log("Experimentor has taken 50 brute a blood sacrifice from " + m3, "experimentor");
                    }
                    reqs = this.ConvertReqString2List(exp_on.origin_tech);

                    foreach (dynamic _h in Lang13.Enumerate(reqs))
                    {
                        T2 = _h;

                        reqs[T2] = reqs[T2] + 1;
                    }
                    exp_on.origin_tech = String13.MakeUrlParams(reqs);
                    this.investigate_log("Experimentor has set the origin tech of " + exp_on + " to " + exp_on.origin_tech, "experimentor");
                }

                if (globalMalf > 51 && globalMalf < 75)
                {
                    this.visible_message("<span class='warning'>" + this + " encounters a run-time error!</span>");
                    this.throwSmoke(this.loc);

                    if (Lang13.Bool(this.trackedRuntime))
                    {
                        this.throwSmoke(this.trackedRuntime.loc);
                        this.trackedRuntime.loc = this.loc;
                        this.investigate_log("Experimentor has stolen Runtime!", "experimentor");
                    }
                    else
                    {
                        new Mob_Living_SimpleAnimal_Pet_Cat(this.loc);
                        this.investigate_log("Experimentor failed to steal runtime, and instead spawned a new cat.", "experimentor");
                    }
                    this.ejectItem(GlobalVars.TRUE);
                }

                if (globalMalf > 76)
                {
                    this.visible_message("<span class='warning'>" + this + " begins to smoke and hiss, shaking violently!</span>");
                    this.f_use_power(500000);
                    this.investigate_log("Experimentor has drained power from its APC", "experimentor");
                }
            }
            Task13.Schedule(((int)(this.resetTime)), (Task13.Closure)(() => {
                this.icon_state           = "h_lathe";
                this.recentlyExperimented = false;
                return;
            }));
            return;
        }