diff --git a/code/datums/disease.dm b/code/datums/disease.dm index 83dfbd7e95f..9a56e665cad 100644 --- a/code/datums/disease.dm +++ b/code/datums/disease.dm @@ -43,6 +43,7 @@ to null does not delete the object itself. Thank you. var/severity = null//severity descr var/longevity = 250//time in "ticks" the virus stays in inanimate object (blood stains, corpses, etc). In syringes, bottles and beakers it stays infinitely. var/list/hidden = list(0, 0) + var/can_carry = 1 // If the disease allows "carriers". // if hidden[1] is true, then virus is hidden from medical scanners // if hidden[2] is true, then virus is hidden from PANDEMIC machine diff --git a/code/datums/diseases/alien_embryo.dm b/code/datums/diseases/alien_embryo.dm index 7928610439c..0e9f41e8b50 100644 --- a/code/datums/diseases/alien_embryo.dm +++ b/code/datums/diseases/alien_embryo.dm @@ -37,7 +37,8 @@ cure_id = list("lexorin","toxin","gargleblaster") cure_chance = 20 affected_species = list("Human", "Monkey") - permeability_mod = 3//likely to infect + permeability_mod = 15//likely to infect + can_carry = 0 var/gibbed = 0 /datum/disease/alien_embryo/stage_act() @@ -79,14 +80,17 @@ affected_mob << "\red You feel something tearing its way out of your stomach..." affected_mob.adjustToxLoss(10) affected_mob.updatehealth() - if(prob(40)) + if(prob(50)) if(gibbed != 0) return 0 var/list/candidates = list() //List of candidate KEYS to assume control of the new larva ~Carn - for(var/mob/dead/observer/G in player_list) - if(G.client.be_alien) - if(((G.client.inactivity/10)/60) <= 5) - if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) - candidates += G.key + var/i = 0 + while(candidates.len <= 0 && i < 5) + for(var/mob/dead/observer/G in player_list) + if(G.client.be_alien) + if(((G.client.inactivity/10)/60) <= ALIEN_SELECT_AFK_BUFFER + i) // the most active players are more likely to become an alien + if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) + candidates += G.key + i++ var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc) if(candidates.len) diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 668f80f7dd2..64db183929e 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -138,44 +138,6 @@ anchored = 1 unacidable = 1//temporary until I decide whether the borg can be removed. -veyveyr - -// Basically this Metroid Core catalyzes reactions that normally wouldn't happen anywhere -/obj/item/metroid_core - name = "roro core" - desc = "A very slimy and tender part of a Rorobeast. Legends claim these to have \"magical powers\"." - icon = 'icons/obj/surgery.dmi' - icon_state = "roro core" - flags = TABLEPASS - force = 1.0 - w_class = 1.0 - throwforce = 1.0 - throw_speed = 3 - throw_range = 6 - origin_tech = "biotech=4" - var/POWERFLAG = 0 // sshhhhhhh - var/Flush = 30 - var/Uses = 5 // uses before it goes inert - - New() - ..() - var/datum/reagents/R = new/datum/reagents(100) - reagents = R - R.my_atom = src - POWERFLAG = rand(1,10) - Uses = rand(7, 25) - //flags |= NOREACT - - spawn() - Life() - - proc/Life() - while(src) - sleep(25) - Flush-- - if(Flush <= 0) - reagents.clear_reagents() - Flush = 30 - /obj/effect/deskclutter name = "desk clutter" icon = 'icons/obj/items.dmi' diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index b9346b6dcc5..43baff66d91 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -270,11 +270,14 @@ vents += temp_vent var/list/candidates = list() //List of candidate KEYs to control the new larvae. ~Carn - for(var/mob/dead/observer/G in player_list) - if(G.client.be_alien) - if(((G.client.inactivity/10)/60) <= 5) - if(!(G.mind && G.mind.current && G.mind.current != DEAD)) - candidates += G.key + var/i = 0 + while(candidates.len <= 0 && i < 5) + for(var/mob/dead/observer/G in player_list) + if(G.client.be_alien) + if(((G.client.inactivity/10)/60) <= ALIEN_SELECT_AFK_BUFFER + i) // the most active players are more likely to become an alien + if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) + candidates += G.key + i++ if(prob(33)) spawncount++ //sometimes, have two larvae spawn instead of one while((spawncount >= 1) && vents.len && candidates.len) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 40e81b18b8d..fd423f382f8 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -31,6 +31,16 @@ src.attack_hand(M) return +/obj/machinery/nuclearbomb/attackby(obj/item/weapon/I as obj, mob/user as mob) + if (src.extended) + if (istype(I, /obj/item/weapon/disk/nuclear)) + usr.drop_item() + I.loc = src + src.auth = I + src.add_fingerprint(user) + return + ..() + /obj/machinery/nuclearbomb/attack_paw(mob/user as mob) return src.attack_hand(user) diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index c9297618a69..270e8659d45 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -329,27 +329,22 @@ if(nutrition >= 800) if(prob(40)) amount_grown++ + //lay eggs or grow if(amount_grown >= 10 && !Victim && !Target) if(istype(src, /mob/living/carbon/metroid/adult)) - if(!client) - var/number = pick(2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4) - for(var/i=1,i<=number,i++) // reproduce (has a small chance of producing 3 or 4 offspring) - var/mob/living/carbon/metroid/M = new/mob/living/carbon/metroid(loc) -// M.nutrition = round(nutrition * 0.9) - M.powerlevel = round(powerlevel/number) - M.Friends = Friends - M.tame = tame - M.rabid = rabid - M.Discipline = Discipline - if(i != 1) step_away(M,src) - - del(src) + if(!client && nutrition >= 1000) + var/number = pick(1,1,1,1,1,1,2,2,2,3) //number of eggs laid + var/obj/item/weapon/reagent_containers/food/snacks/roro_egg/E + for(var/i=1,i<=number,i++) + E = new/obj/item/weapon/reagent_containers/food/snacks/roro_egg(loc) + src.nutrition -= 200 + step_away(E,src) else if(!client) var/mob/living/carbon/metroid/adult/A = new/mob/living/carbon/metroid/adult(src.loc) A.nutrition = nutrition -// A.nutrition += 100 + A.nutrition += 100 A.powerlevel = max(0, powerlevel-1) A.Friends = Friends A.tame = tame diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index acf65197f5b..e35c30004b6 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -770,4 +770,81 @@ mob/living/carbon/metroid/var/temperature_resistance = T0C+75 return 0 - return 1 \ No newline at end of file + return 1 + + +// Basically this Metroid Core catalyzes reactions that normally wouldn't happen anywhere +/obj/item/metroid_core + name = "roro core" + desc = "A very slimy and tender part of a Rorobeast. Legends claim these to have \"magical powers\"." + icon = 'icons/obj/surgery.dmi' + icon_state = "roro core" + flags = TABLEPASS + force = 1.0 + w_class = 1.0 + throwforce = 1.0 + throw_speed = 3 + throw_range = 6 + origin_tech = "biotech=4" + var/POWERFLAG = 0 // sshhhhhhh + var/Flush = 30 + var/Uses = 5 // uses before it goes inert + + New() + ..() + var/datum/reagents/R = new/datum/reagents(100) + reagents = R + R.my_atom = src + POWERFLAG = rand(1,10) + Uses = rand(7, 25) + //flags |= NOREACT + + spawn() + Life() + + proc/Life() + while(src) + sleep(25) + Flush-- + if(Flush <= 0) + reagents.clear_reagents() + Flush = 30 + +/obj/item/weapon/reagent_containers/food/snacks/roro_egg + name = "roro egg" + desc = "A small, gelatinous egg." + icon = 'icons/mob/mob.dmi' + icon_state = "roro egg-growing" + bitesize = 12 + origin_tech = "biotech=4" + var/grown = 0 + + New() + ..() + reagents.add_reagent("nutriment", 5) + spawn(rand(1200,1500))//the egg takes a while to "ripen" + Grow() + + proc/Grow() + grown = 1 + icon_state = "roro egg-grown" + processing_objects.Add(src) + return + + proc/Hatch() + processing_objects.Remove(src) + var/turf/T = get_turf(src) + for(var/mob/O in hearers(T)) + O.show_message("\blue The [name] pulsates and quivers!") + spawn(rand(50,100)) + for(var/mob/O in hearers(T)) + O.show_message("\blue The [name] bursts open!") + new/mob/living/carbon/metroid(T) + del(src) + + +/obj/item/weapon/reagent_containers/food/snacks/roro_egg/process() + var/turf/location = get_turf(src) + var/datum/gas_mixture/environment = location.return_air() + if (environment.toxins > MOLES_PLASMA_VISIBLE)//plasma exposure causes the egg to hatch + src.Hatch() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm index 0f4bde9c004..0206e931194 100644 --- a/code/modules/mob/living/carbon/metroid/powers.dm +++ b/code/modules/mob/living/carbon/metroid/powers.dm @@ -187,7 +187,7 @@ /mob/living/carbon/metroid/verb/Reproduce() set category = "Roro" - set desc = "This will make you split into a random number of Metroids (usually 2). NOTE: this will KILL you, but you will be transferred into one of the babies." + set desc = "This will make you lay an egg. NOTE: This decreases your nutrition." if(stat) src << "I must be conscious to do this..." @@ -195,32 +195,15 @@ if(istype(src, /mob/living/carbon/metroid/adult)) if(amount_grown >= 10) - if(input("Are you absolutely sure you want to reproduce? Your current body will cease to be, but your consciousness will be transferred into a produced rorobeast.") in list("Yes","No")=="Yes") - if(stat) - src << "I must be conscious to do this..." - return - - var/list/babies = list() - var/number = pick(14;2,3,4) - var/new_nutrition = round(nutrition * 0.9) - var/new_powerlevel = round(powerlevel / number) - for(var/i=1,i<=number,i++) // reproduce (has a small chance of producing 3 or 4 offspring) - var/mob/living/carbon/metroid/M = new/mob/living/carbon/metroid(loc) - M.nutrition = new_nutrition - M.powerlevel = new_powerlevel - if(i != 1) step_away(M,src) - babies += M - - var/mob/living/carbon/metroid/new_metroid = pick(babies) - new_metroid.a_intent = "hurt" - new_metroid.key = key - - new_metroid << "You are now a Rorobeast. Skree!" - del(src) + if(src.nutrition >= 300) + new/obj/item/weapon/reagent_containers/food/snacks/roro_egg(loc) + src.nutrition -= 200 + else + src << "I have not fed enough..." else src << "I am not ready to reproduce yet..." else - src << "I am not old enough to reproduce yet..." + src << "I am not old enough to lay eggs yet..." diff --git a/code/modules/mob/mob_cleanup.dm b/code/modules/mob/mob_cleanup.dm index 0cd97f65676..b52c61043f5 100644 --- a/code/modules/mob/mob_cleanup.dm +++ b/code/modules/mob/mob_cleanup.dm @@ -42,7 +42,7 @@ Put (mob/proc)s here that are in dire need of a code cleanup. v.affected_mob = src v.strain_data = v.strain_data.Copy() v.holder = src - if(prob(5)) + if(v.can_carry && prob(5)) v.carrier = 1 return @@ -194,7 +194,7 @@ Put (mob/proc)s here that are in dire need of a code cleanup. v.affected_mob = src v.strain_data = v.strain_data.Copy() v.holder = src - if(prob(5)) + if(v.can_carry && prob(5)) v.carrier = 1 return return diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 47e7e91c253..4615e57e6f3 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1119,8 +1119,12 @@ datum ..() return reaction_obj(var/obj/O, var/volume) - if((!O) || (!volume)) return 0 src = null + if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/roro_egg)) + var/obj/item/weapon/reagent_containers/food/snacks/roro_egg/egg = O + if (egg.grown) + egg.Hatch() + if((!O) || (!volume)) return 0 var/turf/the_turf = get_turf(O) var/datum/gas_mixture/napalm = new var/datum/gas/volatile_fuel/fuel = new diff --git a/code/setup.dm b/code/setup.dm index eabb476fa11..edeed307076 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -127,6 +127,8 @@ var/MAX_EXPLOSION_RANGE = 14 #define HUMAN_STRIP_DELAY 40 //takes 40ds = 4s to strip someone. +#define ALIEN_SELECT_AFK_BUFFER 2 // How many minutes that a person can be AFK before not being allowed to be an alien. + #define NORMPIPERATE 30 //pipe-insulation rate divisor #define HEATPIPERATE 8 //heat-exch pipe insulation diff --git a/html/changelog.html b/html/changelog.html index 8e79b6567ce..93c5dacab40 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -58,6 +58,7 @@ should be listed in the changelog upon commit tho. Thanks. -->