From 4221d033ab1fca891445f5c1a5a0416a4eba14fc Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Mon, 4 Jan 2016 21:22:59 -0500 Subject: [PATCH 1/4] Slipping Refactor and Floors --- code/LINDA/LINDA_fire.dm | 2 +- code/__DEFINES/misc.dm | 6 +++ code/datums/supplypacks.dm | 6 +++ code/game/machinery/computer/arcade.dm | 1 + .../objects/items/stacks/tiles/tile_types.dm | 24 +++++++++- .../objects/items/weapons/gift_wrappaper.dm | 1 + code/game/objects/structures/janicart.dm | 2 +- code/game/turfs/simulated.dm | 28 +++++++---- .../game/turfs/simulated/floor/fancy_floor.dm | 12 ++++- code/game/turfs/simulated/floor/misc_floor.dm | 13 +++++- code/game/turfs/turf.dm | 1 + code/modules/clothing/shoes/miscellaneous.dm | 10 ++++ .../mob/living/carbon/metroid/metroid.dm | 44 ++++++++++++++++++ code/modules/mob/mob_movement.dm | 3 +- code/modules/reagents/newchem/medicine.dm | 8 +--- .../chemical_reaction_misc.dm | 9 +++- .../chemical_reaction_slime.dm | 33 +++++++++---- .../oldchem/reagents/reagents_food.dm | 16 +------ .../oldchem/reagents/reagents_water.dm | 43 ++++++++--------- code/modules/virus2/effect.dm | 15 +----- icons/effects/water.dmi | Bin 2464 -> 2920 bytes icons/mob/feet.dmi | Bin 31256 -> 31433 bytes icons/obj/clothing/shoes.dmi | Bin 18237 -> 18477 bytes icons/obj/items.dmi | Bin 99884 -> 101837 bytes icons/turf/floors.dmi | Bin 322043 -> 337232 bytes 25 files changed, 194 insertions(+), 83 deletions(-) diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm index 837c3795b03..f82cd83d3a6 100644 --- a/code/LINDA/LINDA_fire.dm +++ b/code/LINDA/LINDA_fire.dm @@ -118,7 +118,7 @@ perform_exposure() - if(location.wet) location.wet = 0 + if(location.wet) location.wet = TURF_DRY if(bypassing) icon_state = "3" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index ba730797ce0..0dca37a8a35 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -174,3 +174,9 @@ #define MANIFEST_ERROR_NAME 1 #define MANIFEST_ERROR_COUNT 2 #define MANIFEST_ERROR_ITEM 4 + +//Turf wet states +#define TURF_DRY 0 +#define TURF_WET_WATER 1 +#define TURF_WET_LUBE 2 +#define TURF_WET_ICE 3 \ No newline at end of file diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index a0aaadd6e51..1bd2c794ee8 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1233,6 +1233,12 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine cost = 10 containername = "replacement lights crate" +/datum/supply_packs/misc/noslipfloor + name = "High-traction Floor Tiles" + contains = list(/obj/item/stack/tile/noslip/loaded) + cost = 20 + containername = "high-traction floor tiles" + ///////////// Costumes /datum/supply_packs/misc/costume diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 17ec358a4a8..14fcee521f8 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -39,6 +39,7 @@ /obj/item/toy/toy_xeno = 2, /obj/random/figure = 16, /obj/random/plushie = 7, + /obj/item/stack/tile/fakespace/loaded = 2, ) /obj/machinery/computer/arcade/power_change() diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 207a046446e..4bbdcb4fca2 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -70,4 +70,26 @@ throw_range = 7 flags = CONDUCT turf_type = /turf/simulated/floor/plasteel - mineralType = "metal" \ No newline at end of file + mineralType = "metal" + +/obj/item/stack/tile/fakespace + name = "astral carpet" + singular_name = "astral carpet" + desc = "A piece of carpet with a convincing star pattern." + icon_state = "tile_space" + turf_type = /turf/simulated/floor/fakespace + +/obj/item/stack/tile/fakespace/loaded + amount = 30 + +//High-traction +/obj/item/stack/tile/noslip + name = "high-traction floor tile" + singular_name = "high-traction floor tile" + desc = "A high-traction floor tile. It feels rubbery in your hand." + icon_state = "tile_noslip" + turf_type = /turf/simulated/floor/noslip + origin_tech = "materials=3" + +/obj/item/stack/tile/noslip/loaded + amount = 20 \ No newline at end of file diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 194a69608b4..b92b9c593ba 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -116,6 +116,7 @@ /obj/item/clothing/under/syndicate/tacticool, /obj/item/weapon/storage/box/fakesyndiesuit, /obj/item/toy/crossbow/tommygun, + /obj/item/stack/tile/fakespace/loaded, ) if(!ispath(gift_type,/obj/item)) return diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 9d8ed7ee3dc..d50ca6b08d0 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -80,7 +80,7 @@ handle_rotation() if(istype(src.loc, /turf/simulated)) var/turf/simulated/T = src.loc - if(T.wet == 2) //Lube! Fall off! + if(T.wet == TURF_WET_LUBE) //Lube! Fall off! playsound(src, 'sound/misc/slip.ogg', 50, 1, -3) buckled_mob.Stun(7) buckled_mob.Weaken(7) diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index ec4585ed46f..44650579eaa 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -17,24 +17,32 @@ /turf/simulated/proc/burn_tile() -/turf/simulated/proc/MakeSlippery(var/wet_setting = 1) // 1 = Water, 2 = Lube +/turf/simulated/proc/MakeSlippery(wet_setting = TURF_WET_WATER) // 1 = Water, 2 = Lube, 3 = Ice if(wet >= wet_setting) return wet = wet_setting - if(wet_setting == 1) + if(wet_setting != TURF_DRY) if(wet_overlay) overlays -= wet_overlay wet_overlay = null - wet_overlay = image('icons/effects/water.dmi', src, "wet_floor_static") + var/turf/simulated/floor/F = src + if(istype(F)) + wet_overlay = image('icons/effects/water.dmi', src, "wet_floor_static") + else + wet_overlay = image('icons/effects/water.dmi', src, "wet_static") overlays += wet_overlay spawn(rand(790, 820)) // Purely so for visual effect if(!istype(src, /turf/simulated)) //Because turfs don't get deleted, they change, adapt, transform, evolve and deform. they are one and they are all. return - if(wet > wet_setting) return - wet = 0 - if(wet_overlay) - overlays -= wet_overlay + MakeDry(wet_setting) + +/turf/simulated/proc/MakeDry(wet_setting = TURF_WET_WATER) + if(wet > wet_setting) + return + wet = TURF_DRY + if(wet_overlay) + overlays -= wet_overlay /turf/simulated/proc/AddTracks(var/typepath,var/bloodDNA,var/comingdir,var/goingdir,var/bloodcolor="#A10808") var/obj/effect/decal/cleanable/blood/tracks/tracks = locate(typepath) in src @@ -94,7 +102,7 @@ if (noslip) return // no slipping while sitting in a chair, plz switch (src.wet) - if(1) + if(TURF_WET_WATER) if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M.shoes.flags&NOSLIP)) M.stop_pulling() step(M, M.dir) @@ -107,7 +115,7 @@ return - if(2) //lube //can cause infinite loops - needs work + if(TURF_WET_LUBE) //lube //can cause infinite loops - needs work if(!M.buckled) M.stop_pulling() step(M, M.dir) @@ -120,7 +128,7 @@ playsound(src, 'sound/misc/slip.ogg', 50, 1, -3) M.Weaken(7) - if(3) // Ice + if(TURF_WET_ICE) // Ice if ((M.m_intent == "run") && !(istype(M:shoes, /obj/item/clothing/shoes) && M:shoes.flags&NOSLIP) && prob(30)) M.stop_pulling() step(M, M.dir) diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 1523cf91f63..c1a74d07973 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -82,4 +82,14 @@ /turf/simulated/floor/carpet/burn_tile() burnt = 1 - update_icon() \ No newline at end of file + update_icon() + +/turf/simulated/floor/fakespace + icon = 'icons/turf/space.dmi' + icon_state = "0" + floor_tile = /obj/item/stack/tile/fakespace + broken_states = list("damaged") + +/turf/simulated/floor/fakespace/New() + ..() + icon_state = "[rand(0,25)]" \ No newline at end of file diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index efa62bc17cb..e48770a177b 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -54,4 +54,15 @@ /turf/simulated/floor/beach/water/New() ..() - overlays += image("icon"='icons/misc/beach.dmi',"icon_state"="water5","layer"=MOB_LAYER+0.1) \ No newline at end of file + overlays += image("icon"='icons/misc/beach.dmi',"icon_state"="water5","layer"=MOB_LAYER+0.1) + +/turf/simulated/floor/noslip + name = "high-traction floor" + icon_state = "noslip" + floor_tile = /obj/item/stack/tile/noslip + broken_states = list("noslip-damaged1","noslip-damaged2","noslip-damaged3") + burnt_states = list("noslip-scorched1","noslip-scorched2") + slowdown = -0.3 + +/turf/simulated/floor/noslip/MakeSlippery() + return \ No newline at end of file diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index e8a2ddf2aaa..37b40525275 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -4,6 +4,7 @@ luminosity = 1 var/intact = 1 + var/slowdown = 0 //negative for faster, positive for slower //Properties for open tiles (/floor) var/oxygen = 0 diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 46db0d5e139..154526cee3f 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -57,6 +57,16 @@ put_on_delay = 50 species_restricted = null +/obj/item/clothing/shoes/galoshes/dry + name = "absorbent galoshes" + desc = "A pair of purple rubber boots, designed to prevent slipping on wet surfaces while also drying them." + icon_state = "galoshes_dry" + +/obj/item/clothing/shoes/galoshes/dry/step_action() + var/turf/simulated/t_loc = get_turf(src) + if(istype(t_loc) && t_loc.wet) + t_loc.MakeDry(TURF_WET_WATER) + /obj/item/clothing/shoes/clown_shoes desc = "The prankster's standard-issue clowning shoes. Damn they're huge!" name = "clown shoes" diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index 96680de98b8..265a8c74202 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -925,6 +925,50 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 if(!uses) qdel(src) +/obj/item/stack/tile/bluespace + name = "bluespace floor tile" + singular_name = "floor tile" + desc = "Through a series of micro-teleports these tiles let people move at incredible speeds" + icon_state = "tile-bluespace" + w_class = 3 + force = 6 + materials = list(MAT_METAL=500) + throwforce = 10 + throw_speed = 3 + throw_range = 7 + flags = CONDUCT + max_amount = 60 + turf_type = /turf/simulated/floor/bluespace + + +/turf/simulated/floor/bluespace + slowdown = -1 + icon_state = "bluespace" + desc = "Through a series of micro-teleports these tiles let people move at incredible speeds" + floor_tile = /obj/item/stack/tile/bluespace + + +/obj/item/stack/tile/sepia + name = "sepia floor tile" + singular_name = "floor tile" + desc = "Time seems to flow very slowly around these tiles" + icon_state = "tile-sepia" + w_class = 3 + force = 6 + materials = list(MAT_METAL=500) + throwforce = 10 + throw_speed = 3 + throw_range = 7 + flags = CONDUCT + max_amount = 60 + turf_type = /turf/simulated/floor/sepia + + +/turf/simulated/floor/sepia + slowdown = 2 + icon_state = "sepia" + desc = "Time seems to flow very slowly around these tiles" + floor_tile = /obj/item/stack/tile/sepia /obj/effect/goleRUNe anchored = 1 diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 214c6dfa3a9..22a41279401 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -236,7 +236,9 @@ src << "\blue You're pinned to a wall by [mob.pinned[1]]!" return 0 + var/turf/T = mob.loc move_delay = world.time//set move delay + move_delay += T.slowdown mob.last_movement = world.time mob.last_move_intent = world.time + 10 switch(mob.m_intent) @@ -265,7 +267,6 @@ var/mob/M = L[1] if(M) if ((get_dist(mob, M) <= 1 || M.loc == mob.loc)) - var/turf/T = mob.loc . = ..() if (isturf(M.loc)) var/diag = get_dir(mob, M) diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index 8d6294b4156..432461bec93 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -1016,12 +1016,8 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob) if (!istype(T)) return src = null if(volume >= 1) - if(T.wet >= 2) //Clears lube! Fight back against the slipping, and WIN! - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - return + if(istype(T) && T.wet) + T.MakeDry(TURF_WET_LUBE) /datum/reagent/degreaser/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm index 99f6e60a5e6..7b2cc0615b0 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm @@ -196,4 +196,11 @@ result = "lsd" required_reagents = list("diethylamine" = 1, "fungus" = 1) result_amount = 3 - mix_message = "The mixture turns a rather unassuming color and settles." \ No newline at end of file + mix_message = "The mixture turns a rather unassuming color and settles." + + drying_agent + name = "Drying agent" + id = "drying_agent" + result = "drying_agent" + required_reagents = list("plasma" = 2, "ethanol" = 1, "sodium" = 1) + result_amount = 3 \ No newline at end of file diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm index e4726c4779c..4257b1c9be6 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm @@ -450,11 +450,25 @@ Z.loc = get_turf(holder.my_atom) Z.announce_to_ghosts() //Bluespace + slimefloor2 + name = "Bluespace Floor" + id = "m_floor2" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/bluespace + required_other = 1 + on_reaction(datum/reagents/holder, created_volume) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/stack/tile/bluespace/P = new /obj/item/stack/tile/bluespace + P.amount = 25 + P.loc = get_turf(holder.my_atom) + slimecrystal name = "Slime Crystal" id = "m_crystal" result = null - required_reagents = list("blood" = 1) + required_reagents = list("plasma" = 1) result_amount = 1 required_container = /obj/item/slime_extract/bluespace required_other = 1 @@ -489,20 +503,23 @@ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") var/obj/item/device/camera/P = new /obj/item/device/camera P.loc = get_turf(holder.my_atom) + var/obj/item/device/camera_film/Z = new /obj/item/device/camera_film + Z.loc = get_turf(holder.my_atom) - - slimefilm - name = "Slime Film" - id = "m_film" + slimefloor + name = "Sepia Floor" + id = "m_floor" result = null required_reagents = list("blood" = 1) result_amount = 1 required_container = /obj/item/slime_extract/sepia required_other = 1 - on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/device/camera_film/P = new /obj/item/device/camera_film + on_reaction(datum/reagents/holder) + feedback_add_details("slime_cores_used","[type]") + var/obj/item/stack/tile/sepia/P = new /obj/item/stack/tile/sepia + P.amount = 25 P.loc = get_turf(holder.my_atom) + //Pyrite slimepaint name = "Slime Paint" diff --git a/code/modules/reagents/oldchem/reagents/reagents_food.dm b/code/modules/reagents/oldchem/reagents/reagents_food.dm index 42c15938f2c..da3244cbda2 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_food.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_food.dm @@ -281,21 +281,7 @@ if (!istype(T)) return src = null if(volume >= 3) - if(T.wet >= 1) return - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") - T.overlays += T.wet_overlay - - spawn(800) - if (!istype(T)) return - if(T.wet >= 2) return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null + T.MakeSlippery() var/hotspot = (locate(/obj/effect/hotspot) in T) if(hotspot) var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() ) diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm index 1db18dd1d41..1db08c92c7d 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -31,21 +31,7 @@ if (!istype(T)) return src = null if(volume >= 3) - if(T.wet >= 1) return - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") - T.overlays += T.wet_overlay - - spawn(800) - if (!istype(T)) return - if(T.wet >= 2) return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null + T.MakeSlippery() for(var/mob/living/carbon/slime/M in T) M.apply_water() @@ -91,15 +77,7 @@ if (!istype(T)) return src = null if(volume >= 1) - if(T.wet >= 2) return - T.wet = 2 - spawn(800) - if (!istype(T)) return - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - return + T.MakeSlippery(TURF_WET_LUBE) /datum/reagent/space_cleaner @@ -350,6 +328,23 @@ reagent_state = LIQUID color = "#FFFFD6" // very very light yellow +/datum/reagent/drying_agent + name = "Drying agent" + id = "drying_agent" + description = "Can be used to dry things." + reagent_state = LIQUID + color = "#A70FFF" + +/datum/reagent/drying_agent/reaction_turf(turf/simulated/T, reac_volume) + if(istype(T) && T.wet) + T.MakeDry(TURF_WET_WATER) + +/datum/reagent/drying_agent/reaction_obj(obj/O, reac_volume) + if(istype(O, /obj/item/clothing/shoes/galoshes)) + var/t_loc = get_turf(O) + qdel(O) + new /obj/item/clothing/shoes/galoshes/dry(t_loc) + /* /datum/reagent/vaccine //data must contain virus type diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm index eca8911f6ad..ef21731868d 100644 --- a/code/modules/virus2/effect.dm +++ b/code/modules/virus2/effect.dm @@ -556,19 +556,8 @@ if(istype(mob.loc,/turf/simulated)) var/turf/simulated/T = mob.loc - if(T.wet < 1) - T.wet = 1 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null - T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor") - T.overlays += T.wet_overlay - spawn(800) - if (istype(T) && T.wet < 2) - T.wet = 0 - if(T.wet_overlay) - T.overlays -= T.wet_overlay - T.wet_overlay = null + if(T.wet < TURF_WET_WATER) + T.MakeSlippery() diff --git a/icons/effects/water.dmi b/icons/effects/water.dmi index 10e698a34ca63ee40cf485b353a0d13bbfe278c1..1bccfad7773c233039fbaa8ac350f717acec5b2d 100644 GIT binary patch literal 2920 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 RQal9y9x19Q6hANy{6ATDm>&QD delta 12538 zcmaKSby!qS^!G(XLjEA9xr(GV%MJF;7&fmIvs>T=Hja zlVg2_9>w^dRrD@mo1^LA!eyCYvur?BN+!qc?|f>*xy6Z@Bz zK7tS`U+?0c<@m^}848Y(W~`V8438{@JT>q+;Cp!+F}lvvSZAW=pfvJ@PWI@U@7vNz z;`f6FnBaXW2G(os+#k#rTE`aO%pYxZ-QbG3U*6AorVyk2M{h#=M>c=!*X4Aaje8bT z(RRJ(l(R(rJGaEb`yW!Bg42Y1i8kI9u*7Z{Y` zaPEFaR4qx|HIsP9UeasVud~V1FmNuol)HyDSu;h~QA{f`y);>H`)8?VtST-%K~C<) zwJyQ6F0d|{J?MUE*t+@8ZX}0&YnkJ)gxdS}N>>+yIWJ0T{PI%0$vr0vw;Jk*WyHQO zVSK-{!lYSH{ON4E$kcJ9)bY74)VXFX2fyv#ZHzt4qM!d&t+IPGW=aS(x3swI&MJIC z2d)hjkoujMW`2rn!4>=+5dD~(ys%xjqwMP|z1@g*ga&4MPAQ~!1I+ifJfx-^#cCWT z^QnD2>X?_7mej7u+u*R6u!xA3_arx*Po_OBCutAV8<-uhA=+2mk@pEL+aneJ ze%5=OB0%6&zZX*R?=PcMeIUsVuA4SbdDSO@?ANe1k<`8C0!YRjBzXK!JCht==>870Sn3(M}uW17rRlj__B=`w`X zMJ#quWtT>u9$M7)#W0Jwr1)RTMj;Nn30wR zM{|!(;%q#h3VBwrEy9!Uwmy8f)&E%i9N}bKLmc2V zF;FKHnTzNsEGkl~Bkr{*Hv>>vHf}$$)RYt5epLjE#h@`3onHGRVW{5|&z?UgO6wc- z;h!zHTxGDJ6rnSYA`|!6zZfv{VAqwuVP6&X5d6aT1gR35bW{>{H1*-eL?S&Gm-5ve z8A?jZ!9@EfM0(1~A+fkiLerPq+S=Gd&r>CC>79nJ8L&?Y}U3+WzZG#CU|NMF4v2D3t z)ta)px_Xe26$Jas71R79FBp>G*}BQjp8H$y`HL6isFwWzR#w&+%Z_L^e*S(=mCw=4 zQXvkLH8~X(e_!fY9w}wXYMKs3aPF!MVXJ<%PFn(7xxi!)6+NvtI|2fO)V%;=3 z01W(A7)9-`L1pGGm$dcuZCrmEHLs%L0Xg_?O}O9&pi+&m;Zk>J=QYr5UURc(2_buz z%=#fLtWoBYJIQ_^F^d2JHjghjI9N?3v#6*DPoupkBh<9zp-3ZNbfwHLacJ%E-oB{A z#LFw9TeeY1T`A2>=?{PZKK+sx+f$hov07-2;Vicq;!;HD2v1GIKNe0#$d{4u1U$lk zDD@D)VTVdaQGV46uKRMc?;T3co@^d5(WZ$x(YSJ6S!E`xnB4kT@AYQqyoiE~{(}pk z0l?at+XEWY_`cUcLu>CRw_dn%{A#lZoZM1YQ6ZjRSeWDSWx}Ii1!ZA}skgp3DXR*w z&Ok@2(EE{`LP8Ixe+Q)q!&c-LmX?_1w)S?5Kj{*MQg5#{XAjDQ^Te=4(^58Yg&Sf0{j6Jx}r99Jp%Ndvuu9+vnzEWXbQ!-p57GhvB!yU7FlTs8aFJ@#J z!J{~gLEkz?;QX(3^jw|7QQX9qEyBj=*fAgZ|KwEu8OQO~zv$>_^0(3~h*OprVgNw@ zYAvM(hUxa5h-m(QsN;0YyTJqil8qAGCx$o?yQFybO?WTaghsXUHGxKy!Cqog((Bda zYw4N=sD^3s(CO&;{r&8$yL|kiEsh;KTgS1U7Yc^%dN4^}?hrG*K++D*z`WKnw3)qk z%OmewJ(HJ*lxx10%8M6CIWCnI6_54x_1Uewx%am`J|;T_*U6xcFW&+aEdL_ChG+>? z9OYGzgWq)iBHEK;O4;BO;Kb$WjvZMx= zoX938$4Vi0URH6ATTezbPgL7!o8$}NR5qRAdNY;5+*vd(S82()-mD{uqkR)sEBE$V zG%a5_4*ngzMZrCTLz+gPXLv}TZx0;f2pcc{gmL~`D@8@zolZ!79vb_}8Zyx|jY)Ck z$oAER9V7zDACi9CG>U~Rz8q+aS>^bD?qf%Ej{0vg!8!&;=gmbDs3AD}T(l4#w6(J% zfHa_q$w|y|b!}~)>Ipr^VXf~t%Q!jp%U(6Qx|!dXFK-r4hpItaj=Z!Xn;X9qHW(MMjJMoVsA5!zRwoy!TNe_$P_v$ zT*sr_68eQKNmf``*y?0LoToJ$*D?(O;K>c_?&_l4Ux{KA`xKH#Mk>7j)Z;mgn9(00 z@e9fTYmrwZBqZ4H-=|JZO?{-HadfX;=PqiTdyk1>gVeufy~3gr;sCSUGttzHe)Q;( z{KJPAA%KGyNJvQ3BFf%neZSuGNm?)JC6C?ytZTRcjTxBJO(~%b)_wW%GxD&r^U)V2 zy$$yZSynS4w+90Hg`E^P+!ZN$E<}Q@mb^9fKV8bs4^;!RJO4B?_%b3Z%0&Ila!^*( z2ptJ9Fo^epegK|4>U+0utF*SZHZANy(673>!O_u>?QKUWpkqPd@#Dz3JhOdl<)=>! zH(v?a+S>AMz_KF$vzNB;4<861z3(qjzOv9jIDb|@aq-Cdi3G>Ik2DMD9v&HCV`C$r zi68x=u}me?h^4dhhqC#u$p_*V}z?1%C-xIBK@ksiPfme^8}zMVWwX1;}KFb%@geN^Obs$Zg? zUr-4=?>01lN8(t^xV5#Vs6QO=A@XV*L6bRLn^#jqlP2o$_r>soA?bf?KLHRa=6X?6I%>&^_*4C-$U>)+rl#|0SVUr&^C5HEBa> zSQqjcN81jpcKMH`k@@cMtnUvdlda~`B#Bj2V&s9ya&vRH#@|wZFp>H0-32yQnYknH zK_Iii^j>!#5giVZUb)ix%YEY#lg|^57r>b0fBVL>SB&^#;qV1!UOE9LWm*PRP0tBz zioa7Wutj-4>Y2*R%O_I9hSsP+qZ?ARGY)+Urhx(?66D@cMkd3myaJ zD-1c;WaJshcFNjN@#0?NJD0j?eAjAXH8A>{(L#@lf6{VrC*A9T_1at?m+F(8FfSS4 zJS8(iro-mkB-@gB4QHLjpXlg())+$2P*eY&b2jTq;tg4Z(Z^c`d(@GWTOloTO~+f4 zBgeQ3p~aPzg}G4H7fCo%47{(aSLeao-9xpE3uBI^-MnLd^Y}+s_`#b3I~ZGV zBpC==mdzS3K!0zh3?r*Q%Di*IkcZ}bXFML>JF{RAz${wvxg(QjVwIaNUOXPzRvga? z^r-dVGP5Q!GBhNGtS|5}IM_KksU&O*E3Z18R>)K^b9bgB3V1Z2pBfrQs2Qb`ax4%u zo&F#cXXM1KOcP(7CO5|L03&taLi}+`@2+JgvW}Le?KByKxb4WVd}kXsGBToohTYw( zZE{X`oKDZqb#-+aM?=g6d%C+np1=+`(---^I8zx36c%wtYIzcb;YIS}63FZx45Yk* zUm$S0e&=Iy^9nN*`MQI<5(B$lSqF;rh|<%uvEKrC&%4?f!16r@ngBkzCsDXNsZU=ChXfPker6Qvu;Z(1tBswS1`@%TGvD2-OaUspgvNuK0fDtm=p8EN(&a;%QeC1C@aa*|_51sJqtMw-QAk#5g zQr`i?R;!}1h&R9rK>=Z5m%ptIhH5!Wl_tl7lHH|`KN+*T^ONMms3 z2SLYhkWv(D=@FoXKiFG`+xheiYkJ-p#BO{3HeK4C`y<afU$Nk zP*fxYWbjX%e&r-B2?@F6@M*-hZ60om;FmOe-)#9)Zsd3y4$YwozJBv@P)JjE#)}9g!aLbW$GQv^55jWB@NB>4h(W7f^s- zbv1}&X{&{YU+z)U)31ri2np@yzT+Hr0iuPhkYet6!u=<2sJwTl66Q<3x0q*9fm5&8 z>1b`W#+YVOeZ6UkH;i0d%ej65lo(Uw3EE;&b{5a|z(W`$pU@+l5^t{E_m>WcK;x!< zzKOcLQ@h!OWd%JTgn6Sa^`XQqzq`BJUoIA$+UvegM5SXuYaJX$mfKoeAxN5q0!X`= zXxiKXeEPs27rN;B^L-?nWj88b`X&GdU+n41<&jk9Jr0U1X?-Cz94ckN3*Da_+?=kX zjc_y$P))d*52E5<(Uhft>3?YPm%GdsUgo1r_)edMsBV)z$X05U;3JcKT<_vmY;@6Ltwr4Z5AZsUsO+}xJcP5 z$G=gV%4TV$@yXGuogtlo>vg0Q(e`e<(rRJa6FHKvl`by$(!mV3^JNE(KN>t_oZS%6 z_oc6qG0 z^S}X!$b1iBU}IE8-+umd&rhCbc&&2jrV^>Gf*{RI$zY{gzNYC^^|IAbqKO9LK3?8O z=|Z;_lP?_YEk)M=SpY{!C+xw)LqiJk2p~op_&epRzjsf~l=2Hd4JnYOp9jl1Uvmf? zR15}(|INa+2SnZ!kA~v8ESrA}{*Zd}!Gp&3^PV=oNx~J$7-gfHP#u(Mp8!zh*@BpZ zqjeMDEeO1xoLQ6?-tl|YIeAM+==$2)8strJX!R$Z00LpXvea%tL4m28mk`wzQc{iE zTA7D+zm20WR8?2A2@BsaDWwGfDekqu_zI4ZFUO%1^6r|H>Pitz0;D?D$_(hDym@;1 z#Ky+4-Rumv)M|yh{j{SLx_9T!HIS5_h^_^0_Vn~L@c9X$t>@dmM*vt7eTjS*o+1w- zAc)pS^`U|eU?}F*HOODe+|Te8I&g-$+z9cz^`2k(za2(7pOa0nQ7M=O*47>r_ryv= zW;>ZO1Mt0$%dV%e&q}HF-|2%3P!^1p$mis;l~VPqBhJk|q}J9x3#XHMeN{P{E)bxM zwXLhCL-Pq(VEL?7e!7YA$hT7&8TTnSUhmZ|RuL1UkV{i=Xz{2GkzZ=eC z>t;@$N+t4Hele?2%k9*jY}Iro+R5x(R&$|&m(%LAWM?s)2fOeuo%)|D5&kBi@hOgXr&Keby*D+bx2P(eKZWd+HshC7*%dO1_0s zuThv72#x|G*j>VEu`NdW4!ry)Ei{fpIUA^ijLb@P4ty7A8{%YND1dSiLn|}`(6lPe zWl6K$zWgRPH-m9T2I~BvU(jxphYFbUAHxLZ*;4FY9`{rTj;zkl)T@;Dy&Hf^w(SV1 z&%R22G8M|MqW039LnVE&kahr#P6W`ZLgA0(#cVQBk-zrE4y*+nru(p(Cl$Itmd=9t%z1$0rR-7_pq*T zqa8|7`v^p+euB9b5R+jIb>_9* zK7D=(H61N<%<1;aT6*szS*~|zWn6;vD8%M(?=)EHG45BwY|v~zqhr(UqoX_AUR@uv zFr;iqLV4{j^$^FP^G(ys8*|EV=T^3ro4p_7g@P_o`teJtIIVSx`4YwzyHnhx)yR*v zkTu0_T((Nn=Y$*W^9w{T&R=_Q`aZK1be&yC*25;Ko* zQ0!k{D5giYg$_B%PaoPq0l(IUcIOTmcWv7}tNWjWVAdB+OGOn1PFnB#Xat|qfsEHl*|j<2F_dtg~dWirXpernYnX6mqmO z;etWASi{)$o|$9cqgy4ca^xHR)s|ZtL%Z0b0XfL19cO7zhoxf-(OTcYkA=KRe}g95 z3O%(cH{j>tUL?I9T*3@Tk`0+8hs0blpbIweKjv@!yQ}SAK9*(I(INbr&cJu=03M4v z*sJX?B7k7@HwMpXak%r8)s^7VA&ohld6ATB>gDsA8%a_~5;6Tb)iOF0UxEgyls_eW zTM|n4sjlzjH?G#cnm`e0OmjHnQe+GtBugK!Mf)9b89M?Z-1x`KMxE_Tzy zbj#+kTF8;}La@i($nP-{c7I1GWl}L={VvVmV=-1@oF7a|8;;)TYy~So0lD$Xk1tgXm6Czw-=0oM zOu4nVA-t43Mr##t*o3p7A5M#phBPpE>{XL5l6nWhGu3C#{XtEuYvajeC6VRIB^#uqx zA=Epy$F~hm$p2_l_{T>3DGH#2c$pa&G#dpZ=2%YJN$)|pnu!pv5&YvxeF9amoaU!6 zAT5tlMJSz6%ItDz+6PJmKSX?~{H41PL4O_nJ)VpUT3JG$X2`3a z`rP3$dT(XwLox1=?Y$$LZOaOUEsayWuVQXtmK)eGoN3SWJ_-H-eNq>tW6||4ei;M> zEL)-*$7!fjJX>VTVQDl$-n?-YrgH3CM~QLWZczHs9j`ONrBhw{|M~t6PTPZxFGLJC zZZ~Rqq{SSv#0r@h{RA@nH>h^YqeoS6yON?kk*!%M@PW}ct z!6RY{6QRZ;!iq=|h?LA|#|;0m^u$b1x1m!o37j8M6RItUQ%%M-H$QMN1~FgkB#u9! zC7T`ReTItB$Z~v3x$P#YWQLU!vTg|Sa#^w{pM6BZz14Gg%KDT*HX8>J$Y@XTKmw9i zoYclM6DSxY@A{Z$Mm78a=z^Lk`d09R23MN-hVbS9*_$4vd)u)54^SQemxJJZo4 zCzwZ4@~X(ICCe?X(v2wGp=Bp%2mCrOj%Mw3ZX@f3 zcWT~VRfd<5fJdc{SgU%6T1#^;uYrCZ9{!F=52?mqr&;_AY*&=dNBo$4Z`Dpl0d9Yj zeJilIho1MS+Y8!v-K>}_ml7fZDZ!BTzV2=zkkv6JBPoHl5^hkGYF8PH zWBmYMaQTs7$J{mB_;|r>=RCGOBfexPz*PEaWJ(GhsJwwnLH1|g+gFBsB4R<$=2y>! z&aWpR6onukBfcCt^|wl+2N%;+RxQqwAj9sV02+@{p^N zU^1`arI?O92b=@zFsMD;>4D+BB`cjpWaklieyI`D36mHP?x}+VFEsnB%bYf<2FTn( zUYGfVRpbD2|CJ9Y8@Ws`3gAmR%cfUNcFg`u#clKj8}Q%5FJdft~##D7p|OC};^MWP9o*H0WH0qnNfYT^mev8n1ZOY%fX(si~TO_08WzR&mkWLaw*ry2H9-dXrV=qyL^12-^hA#L}M1% zE;@W>Va}0|()c&Xa&jf{=wE=Wt*rz4R}Q3RUs_p_R*px0{741KkKlai{sxsr^23&d zSYkOZDBhv4uux$0rmv|-beL#NQ2$Dhe+DB1!$)T5V1NI;Y)Su$qMMtDX69;Z&n-r> zyZ$LS6a0$e^%qqiCNCbGRt3#~oN|?RKz+UR)+~?Qn;LW^+uket%JHjU(eH+}pBDQ; zhOBSpfXzAMc`H!>^}QF7mm}eyFT1X%i@P)r{OCo%hTz^qf}mai1c_oVK7f6!ffby?bn=~-#gFySI>!~-xJvd#pzHR{yt2^&Dq}|V354RLS{-+({0Sk3T)|H?)4oC82;f>_$I3zj!e`_ZTwgNqVoh2uv~f;Qau;ZXBUjt z5rb|z`o5=;bN-~gceM2=iZS%V^58%BZ04qcF`p))e}CeiTdbWspI4tzNi!FmFEiV^ z5kg6SC_3;jw2xUIG*WsbeY=iC2r}*Xjym}cfqt2Y3fwiCbyOhv{a-$d{cuY?jddF35s z)k>n%v6#Q7bLIhp8_bbYG%#j!gT+|hg_nBv;b#-uDRE!t0YWH+pvkX@ar@cy4+rna z7w_rUYSsi%v)RO;$G}&@7*_IyQ1h$7;%D=3?pzWvsH%LK*!im?TFPOl+|6GcT-fOj z%0QyQW1M@8vDCHD@JK}EoVPEo-I*tYwWJM)Jty5k79&`CcFJS^=~oo3T#u;d0hzjnS`2EH$w3OFLiPj6$@#a({RBDG!b&X5Gpyv-r2xGZp|Bng*ss~CUX z(AD^8Cl$6lpg43S9XUmKwyDJ(Q&h%gW<~?muWeqZa-LgWebtjh|B1MAe6#is81;i+s$+Lb{p8ikWqMslT+?9elPkS)0okQv zPqBfd@P_o%=~!*ooxQrO>!eog7P(#`j%h3lVmp9ODb_4e!NQi52=raW8pZSNf~vTh z$^4Glhq^l-P#;Q4tLN|CcT6|mBmB}HMFc)l0RLEq{rBLyyxM)T z`ej~Zos_irxPjD1kHemevpROXAbtIq%WS3>woY+7Sni7q=^CDle)j#oYef!t8Xc{h z_AzR|Kb*TMclk!Zkc#c>9?RJ1X?yBmNXKg|hD-$;I79s`73ZV-jjG1bDRA6A1f<46 z+P@sYiH?pA1c4$~8E9|LG#H|78@EOcA9!3#A~vPB0zf-IsKR<*=4>^O3xZ?ih|xxO z=7~9K1N}1+o?R!C+a+w6w6t}dS2`^O1$@q##3VS|6TLIjfX>YV=hB(GT)4yI!ECLP zfvz$o&{>gLhMGe z-*C3EXVO5?^a$l^E|As-zePV|rFli@1bfe6e2zE>P>@lKQjmkH9QS%@hhdgzlYMmi zWL9PqcsF+toa%_`phA&_ihbA zUkhuqb7zRNc0>YZ9B`{yzF{?VwSRgM2s>Wf**im)#lJ&C;JzskkqL$VLdJMM*(}p^ zB=)%Wfj?T1pI@u9<65T&z27spGWXG#R=O^G(H09qw9GsCED8=Io71rlRaMo&8kqy9 z$f%t$%l6ip2Z|>9Lql4{09I&Kv=*`+{A2RUdJgYR7yP0WlYL;XAHD^qbf zk-g8Ve6jI26>kKE#jRZPgt$1tDUF-#3^cx1i4t}VjT4$|&0t1}VH~P$x%vV`^Cz-R z8>x?%vG(qQ$2oQkz`-9JvFRkDgFd%M4TYETM`yN2KB*4B6Bau9jXEx`v?aCDlmN=~ zI=efhXy>hUaq-Y9Q*@hiHs`)w+oGz=?y0W<&o~z_P8<%7iVNyLfBwYRhvO{s2_bOv z^=i)tEm(VR;{x=@jTu~YYCq_g>%Squo=d>+l;E|LHs3r@ma#w&u(%=~Yg`W93MZFu z@5+;2l!JQKl-m%)1pf+A-hsrk?IAdY2m4gg>9~8hKokS6cYcrJeWdx5I^YxGuA<%O z6^uvXDRf@zIlH3M$`1#gR#UFP`peOpLxBt=1yhbUYKIGn38Y!WOjoagZn#Se@B>f6p=HXV7mMdjulcuJJ zKY)KFiQ`@%UU2={n)ngM9MeUD-xJXoa2>*OfWwT@b95oHw9jcmdq>|l`dNs{J9|gz z;gxz}D@5~uHzJ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 36ec05a86f99811801732872907eb17dd69cbc51..cab7cc16e7c28702fd9f0a3217e99912835505f0 100644 GIT binary patch literal 18477 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 M>FVdQ&MBb@09B<|JOBUy literal 18237 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 diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 6ef95efd7e849636353027024fe8e045227b60b2..a5af5cd486d3c85ff89dcb7f42f84f0c5686e1ae 100644 GIT binary patch delta 5092 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 ByLSKp From 447be6f9fdb8622fd77452099a5994e4cd1af1a2 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 5 Jan 2016 00:41:46 -0500 Subject: [PATCH 2/4] binsult.ogg --- code/modules/mob/living/carbon/metroid/metroid.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index 265a8c74202..d62c5775d5c 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -928,7 +928,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 /obj/item/stack/tile/bluespace name = "bluespace floor tile" singular_name = "floor tile" - desc = "Through a series of micro-teleports these tiles let people move at incredible speeds" + desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds." icon_state = "tile-bluespace" w_class = 3 force = 6 @@ -944,14 +944,14 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 /turf/simulated/floor/bluespace slowdown = -1 icon_state = "bluespace" - desc = "Through a series of micro-teleports these tiles let people move at incredible speeds" + desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds." floor_tile = /obj/item/stack/tile/bluespace /obj/item/stack/tile/sepia name = "sepia floor tile" singular_name = "floor tile" - desc = "Time seems to flow very slowly around these tiles" + desc = "Time seems to flow very slowly around these tiles." icon_state = "tile-sepia" w_class = 3 force = 6 @@ -967,7 +967,7 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 /turf/simulated/floor/sepia slowdown = 2 icon_state = "sepia" - desc = "Time seems to flow very slowly around these tiles" + desc = "Time seems to flow very slowly around these tiles." floor_tile = /obj/item/stack/tile/sepia /obj/effect/goleRUNe From 38ee27898b53142220748749142da2924eb055d8 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 5 Jan 2016 01:34:16 -0500 Subject: [PATCH 3/4] structuring --- .../mob/living/carbon/metroid/metroid.dm | 1048 ---------------- .../living/carbon/{metroid => slime}/death.dm | 56 +- .../living/carbon/{metroid => slime}/emote.dm | 146 +-- .../carbon/{metroid => slime}/examine.dm | 86 +- .../living/carbon/{metroid => slime}/life.dm | 1104 ++++++++--------- .../living/carbon/{metroid => slime}/login.dm | 8 +- .../carbon/{metroid => slime}/powers.dm | 454 +++---- .../living/carbon/{metroid => slime}/say.dm | 0 code/modules/mob/living/carbon/slime/slime.dm | 576 +++++++++ .../carbon/{metroid => slime}/subtypes.dm | 156 +-- .../carbon/{metroid => slime}/update_icons.dm | 2 +- .../research/xenobiology/xenobiology.dm | 474 +++++++ paradise.dme | 21 +- 13 files changed, 2067 insertions(+), 2064 deletions(-) delete mode 100644 code/modules/mob/living/carbon/metroid/metroid.dm rename code/modules/mob/living/carbon/{metroid => slime}/death.dm (93%) rename code/modules/mob/living/carbon/{metroid => slime}/emote.dm (96%) rename code/modules/mob/living/carbon/{metroid => slime}/examine.dm (95%) rename code/modules/mob/living/carbon/{metroid => slime}/life.dm (96%) rename code/modules/mob/living/carbon/{metroid => slime}/login.dm (93%) rename code/modules/mob/living/carbon/{metroid => slime}/powers.dm (95%) rename code/modules/mob/living/carbon/{metroid => slime}/say.dm (100%) create mode 100644 code/modules/mob/living/carbon/slime/slime.dm rename code/modules/mob/living/carbon/{metroid => slime}/subtypes.dm (95%) rename code/modules/mob/living/carbon/{metroid => slime}/update_icons.dm (96%) create mode 100644 code/modules/research/xenobiology/xenobiology.dm diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm deleted file mode 100644 index d62c5775d5c..00000000000 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ /dev/null @@ -1,1048 +0,0 @@ -/mob/living/carbon/slime - name = "baby slime" - icon = 'icons/mob/slimes.dmi' - icon_state = "grey baby slime" - pass_flags = PASSTABLE - ventcrawler = 2 - speak_emote = list("telepathically chirps") - - layer = 5 - - maxHealth = 150 - health = 150 - gender = NEUTER - - update_icon = 0 - nutrition = 700 - - see_in_dark = 8 - update_slimes = 0 - - // canstun and canweaken don't affect slimes because they ignore stun and weakened variables - // for the sake of cleanliness, though, here they are. - status_flags = CANPARALYSE|CANPUSH - - var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside - var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35 - - var/powerlevel = 0 // 1-10 controls how much electricity they are generating - var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces - - var/number = 0 // Used to understand when someone is talking to it - - var/mob/living/Victim = null // the person the slime is currently feeding on - var/mob/living/Target = null // AI variable - tells the slime to hunt this down - var/mob/living/Leader = null // AI variable - tells the slime to follow this person - - var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable - var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with - var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place - var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target - - var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting - - var/list/speech_buffer = list() // Last phrase said near it and person who said it - - var/mood = "" // To show its face - var/is_adult = 0 - - var/core_removal_stage = 0 //For removing cores. - - ///////////TIME FOR SUBSPECIES - - var/colour = "grey" - var/coretype = /obj/item/slime_extract/grey - var/list/slime_mutation[4] - -/mob/living/carbon/slime/New() - create_reagents(100) - spawn (0) - number = rand(1, 1000) - name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" - icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" - real_name = name - slime_mutation = mutation_table(colour) - mutation_chance = rand(25, 35) - var/sanitizedcolour = replacetext(colour, " ", "") - coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") - ..() - -/mob/living/carbon/slime/regenerate_icons() - icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" - overlays.len = 0 - if (mood) - overlays += image('icons/mob/slimes.dmi', icon_state = "aslime-[mood]") - ..() - -/mob/living/carbon/slime/movement_delay() - if (bodytemperature >= 330.23) // 135 F - return -1 // slimes become supercharged at high temperatures - - var/tally = 0 - - var/health_deficiency = (100 - health) - if(health_deficiency >= 45) tally += (health_deficiency / 25) - - if (bodytemperature < 183.222) - tally += (283.222 - bodytemperature) / 10 * 1.75 - - if(reagents) - if(reagents.has_reagent("methamphetamine")) // Meth slows slimes down - tally *= 2 - - if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow - tally *= 5 - - if(health <= 0) // if damaged, the slime moves twice as slow - tally *= 2 - - return tally + config.slime_delay - -/mob/living/carbon/slime/Bump(atom/movable/AM as mob|obj, yes) - if ((!(yes) || now_pushing)) - return - now_pushing = 1 - - if(isobj(AM)) - if(!client && powerlevel > 0) - var/probab = 10 - switch(powerlevel) - if(1 to 2) probab = 20 - if(3 to 4) probab = 30 - if(5 to 6) probab = 40 - if(7 to 8) probab = 60 - if(9) probab = 70 - if(10) probab = 95 - if(prob(probab)) - if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille)) - if(nutrition <= get_hunger_nutrition() && !Atkcool) - if (is_adult || prob(5)) - AM.attack_slime(src) - spawn() - Atkcool = 1 - sleep(45) - Atkcool = 0 - - if(ismob(AM)) - var/mob/tmob = AM - - if(is_adult) - if(istype(tmob, /mob/living/carbon/human)) - if(prob(90)) - now_pushing = 0 - return - else - if(istype(tmob, /mob/living/carbon/human)) - now_pushing = 0 - return - - now_pushing = 0 - ..() - if (!istype(AM, /atom/movable)) - return - if (!( now_pushing )) - now_pushing = 1 - if (!( AM.anchored )) - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window)) - if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - now_pushing = null - -/mob/living/carbon/slime/Process_Spacemove(var/movement_dir = 0) - return 2 - -/mob/living/carbon/slime/Stat() - ..() - - statpanel("Status") - if(is_adult) - stat(null, "Health: [round((health / 200) * 100)]%") - else - stat(null, "Health: [round((health / 150) * 100)]%") - - if (client.statpanel == "Status") - stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]") - if(amount_grown >= 10) - if(is_adult) - stat(null, "You can reproduce!") - else - stat(null, "You can evolve!") - - stat(null,"Power Level: [powerlevel]") - -/mob/living/carbon/slime/adjustFireLoss(amount) - ..(-abs(amount)) // Heals them - return - -/mob/living/carbon/slime/bullet_act(var/obj/item/projectile/Proj) - attacked += 10 - ..(Proj) - return 0 - -/mob/living/carbon/slime/emp_act(severity) - powerlevel = 0 // oh no, the power! - ..() - -/mob/living/carbon/slime/ex_act(severity) - ..() - - var/b_loss = null - var/f_loss = null - switch (severity) - if (1.0) - qdel(src) - return - - if (2.0) - - b_loss += 60 - f_loss += 60 - - - if(3.0) - b_loss += 30 - - adjustBruteLoss(b_loss) - adjustFireLoss(f_loss) - - updatehealth() - - -/mob/living/carbon/slime/blob_act() - show_message(" The blob attacks you!") - adjustBruteLoss(20) - updatehealth() - return - - -/mob/living/carbon/slime/unEquip(obj/item/W as obj) - return - -/mob/living/carbon/slime/attack_ui(slot) - return - -/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob) - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (Victim) return // can't attack while eating! - - if (health > -100) - - M.do_attack_animation(src) - visible_message(" The [M.name] has glomped [src]!", \ - " The [M.name] has glomped [src]!") - var/damage = rand(1, 3) - attacked += 5 - - if(M.is_adult) - damage = rand(1, 6) - else - damage = rand(1, 3) - - adjustBruteLoss(damage) - - updatehealth() - return - -/mob/living/carbon/slime/attack_animal(mob/living/simple_animal/M as mob) - if(M.melee_damage_upper == 0) - M.custom_emote(1, "[M.friendly] [src]") - else - M.do_attack_animation(src) - if(M.attack_sound) - playsound(loc, M.attack_sound, 50, 1, 1) - visible_message("[M] [M.attacktext] [src]!", \ - "[M] [M.attacktext] [src]!") - M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])") - src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])") - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - attacked += 10 - adjustBruteLoss(damage) - updatehealth() - -/mob/living/carbon/slime/attack_larva(mob/living/carbon/alien/larva/L as mob) - - switch(L.a_intent) - - if(I_HELP) - visible_message("[L] rubs its head against [src].") - - - else - L.do_attack_animation(src) - attacked += 10 - visible_message("[L] bites [src]!", \ - "[L] bites [src]!") - playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - - if(stat != DEAD) - var/damage = rand(1, 3) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - adjustBruteLoss(damage) - -/mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M as mob) - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." - return - - ..() - - if(Victim) - if(Victim == M) - if(prob(60)) - visible_message("[M] attempts to wrestle \the [name] off!") - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - - else - visible_message(" [M] manages to wrestle \the [name] off!") - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - - if(prob(90) && !client) - Discipline++ - - spawn() - SStun = 1 - sleep(rand(45,60)) - if(src) - SStun = 0 - - Victim = null - anchored = 0 - step_away(src,M) - - return - - else - if(prob(30)) - visible_message("[M] attempts to wrestle \the [name] off of [Victim]!") - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - - else - visible_message(" [M] manages to wrestle \the [name] off of [Victim]!") - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - - if(prob(80) && !client) - Discipline++ - - if(!is_adult) - if(Discipline == 1) - attacked = 0 - - spawn() - SStun = 1 - sleep(rand(55,65)) - if(src) - SStun = 0 - - Victim = null - anchored = 0 - step_away(src,M) - - return - -/* - if(M.gloves && istype(M.gloves,/obj/item/clothing/gloves)) - var/obj/item/clothing/gloves/G = M.gloves - if(G.cell) - if(M.a_intent == "hurt")//Stungloves. Any contact will stun the alien. - if(G.cell.charge >= 2500) - G.cell.use(2500) - visible_message("[src] has been touched with the stun gloves by [M]!") - return - else - M << "\red Not enough charge! " - return -*/ - - switch(M.a_intent) - - if (I_HELP) - help_shake_act(M) - - if (I_GRAB) - grabbedby(M) - - else - M.do_attack_animation(src) - var/damage = rand(1, 9) - - attacked += 10 - if (prob(90)) - if (HULK in M.mutations) - damage += 5 - if(Victim || Target) - Victim = null - Target = null - anchored = 0 - if(prob(80) && !client) - Discipline++ - spawn(0) - - step_away(src,M,15) - sleep(3) - step_away(src,M,15) - - - playsound(loc, "punch", 25, 1, -1) - visible_message("[M] has punched [src]!", \ - "[M] has punched [src]!") - - adjustBruteLoss(damage) - updatehealth() - else - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to punch [src]!") - return - - - -/mob/living/carbon/slime/attack_alien(mob/living/carbon/alien/humanoid/M as mob) - if (!ticker) - M << "You cannot attack people before the game has started." - return - - if (istype(loc, /turf) && istype(loc.loc, /area/start)) - M << "No attacking people at spawn, you jackass." - return - - switch(M.a_intent) - if (I_HELP) - visible_message("[M] caresses [src] with its scythe like arm.") - - if (I_HARM) - M.do_attack_animation(src) - if (prob(95)) - attacked += 10 - playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - var/damage = rand(15, 30) - if (damage >= 25) - damage = rand(20, 40) - visible_message("[M] has attacked [name]!", \ - "[M] has attacked [name]!") - else - visible_message("[M] has wounded [name]!", \ - ")[M] has wounded [name]!") - adjustBruteLoss(damage) - updatehealth() - else - playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to lunge at [name]!", \ - "[M] has attempted to lunge at [name]!") - - if (I_GRAB) - grabbedby(M) - - if (I_DISARM) - M.do_attack_animation(src) - playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - var/damage = 5 - attacked += 10 - - if(prob(95)) - visible_message("[M] has tackled [name]!", \ - "[M] has tackled [name]!") - - if(Victim || Target) - Victim = null - Target = null - anchored = 0 - if(prob(80) && !client) - Discipline++ - if(!istype(src, /mob/living/carbon/slime)) - if(Discipline == 1) - attacked = 0 - - spawn() - SStun = 1 - sleep(rand(5,20)) - SStun = 0 - - spawn(0) - - step_away(src,M,15) - sleep(3) - step_away(src,M,15) - - else - drop_item() - visible_message("[M] has disarmed [name]!", - "[M] has disarmed [name]!") - adjustBruteLoss(damage) - updatehealth() - return - -/mob/living/carbon/slime/attackby(obj/item/W, mob/user, params) - if(istype(W,/obj/item/stack/sheet/mineral/plasma)) //Lets you feed slimes plasma. - if (user in Friends) - ++Friends[user] - else - Friends[user] = 1 - user << "You feed the slime the plasma. It chirps happily." - var/obj/item/stack/sheet/mineral/plasma/S = W - S.use(1) - return - else if(W.force > 0) - attacked += 10 - if(prob(25)) - user << "[W] passes right through [src]!" - return - if(Discipline && prob(50)) // wow, buddy, why am I getting attacked?? - Discipline = 0 - else if(W.force >= 3) - if(is_adult) - if(prob(5 + round(W.force/2))) - if(Victim || Target) - if(prob(80) && !client) - Discipline++ - - Victim = null - Target = null - anchored = 0 - - spawn() - SStun = 1 - sleep(rand(5,20)) - SStun = 0 - - spawn(0) - if(user) - canmove = 0 - step_away(src, user) - if(prob(25 + W.force)) - sleep(2) - if(user) - step_away(src, user) - canmove = 1 - - else - if(prob(10 + W.force*2)) - if(Victim || Target) - if(prob(80) && !client) - Discipline++ - if(Discipline == 1) - attacked = 0 - spawn() - SStun = 1 - sleep(rand(5,20)) - SStun = 0 - - Victim = null - Target = null - anchored = 0 - - spawn(0) - if(user) - canmove = 0 - step_away(src, user) - if(prob(25 + W.force*4)) - sleep(2) - if(user) - step_away(src, user) - canmove = 1 - ..() - -/mob/living/carbon/slime/restrained() - return 0 - -mob/living/carbon/slime/var/temperature_resistance = T0C+75 - -/mob/living/carbon/slime/show_inv(mob/user) - return - -/mob/living/carbon/slime/toggle_throw_mode() - return - -/mob/living/carbon/slime/proc/apply_water() - adjustToxLoss(rand(15,20)) - if (!client) - if (Target) // Like cats - Target = null - ++Discipline - return - -/mob/living/carbon/slime/can_use_vents() - if(Victim) - return "You cannot ventcrawl while feeding." - ..() - -/obj/item/slime_extract - name = "slime extract" - desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"." - icon = 'icons/mob/slimes.dmi' - icon_state = "grey slime extract" - force = 1.0 - w_class = 1.0 - throwforce = 0 - throw_speed = 3 - throw_range = 6 - origin_tech = "biotech=4" - item_color = "grey" - var/Uses = 1 // uses before it goes inert - var/enhanced = 0 //has it been enhanced before? - - attackby(obj/item/O as obj, mob/user as mob, params) - if(istype(O, /obj/item/weapon/slimesteroid2)) - if(enhanced == 1) - user << " This extract has already been enhanced!" - return ..() - if(Uses == 0) - user << " You can't enhance a used extract!" - return ..() - user <<"You apply the enhancer. It now has triple the amount of uses." - Uses = 3 - enhanced = 1 - qdel(O) - if(istype(O,/obj/item/weapon/storage/bag)) - ..() - -/obj/item/slime_extract/New() - ..() - create_reagents(100) - - -/obj/item/slime_extract/grey - name = "grey slime extract" - icon_state = "grey slime extract" - item_color = "grey" - -/obj/item/slime_extract/gold - name = "gold slime extract" - icon_state = "gold slime extract" - item_color = "gold" - -/obj/item/slime_extract/silver - name = "silver slime extract" - icon_state = "silver slime extract" - item_color = "silver" - -/obj/item/slime_extract/metal - name = "metal slime extract" - icon_state = "metal slime extract" - item_color = "metal" - -/obj/item/slime_extract/purple - name = "purple slime extract" - icon_state = "purple slime extract" - item_color = "purple" - -/obj/item/slime_extract/darkpurple - name = "dark purple slime extract" - icon_state = "dark purple slime extract" - item_color = "darkpurple" - -/obj/item/slime_extract/orange - name = "orange slime extract" - icon_state = "orange slime extract" - item_color = "orange" - -/obj/item/slime_extract/yellow - name = "yellow slime extract" - icon_state = "yellow slime extract" - item_color = "yellow" - -/obj/item/slime_extract/red - name = "red slime extract" - icon_state = "red slime extract" - item_color = "red" - -/obj/item/slime_extract/blue - name = "blue slime extract" - icon_state = "blue slime extract" - item_color = "blue" - -/obj/item/slime_extract/darkblue - name = "dark blue slime extract" - icon_state = "dark blue slime extract" - item_color = "darkblue" - -/obj/item/slime_extract/pink - name = "pink slime extract" - icon_state = "pink slime extract" - item_color = "pink" - -/obj/item/slime_extract/green - name = "green slime extract" - icon_state = "green slime extract" - item_color = "green" - -/obj/item/slime_extract/lightpink - name = "light pink slime extract" - icon_state = "light pink slime extract" - item_color = "lightpink" - -/obj/item/slime_extract/black - name = "black slime extract" - icon_state = "black slime extract" - item_color = "black" - -/obj/item/slime_extract/oil - name = "oil slime extract" - icon_state = "oil slime extract" - item_color = "oil" - -/obj/item/slime_extract/adamantine - name = "adamantine slime extract" - icon_state = "adamantine slime extract" - item_color = "adamantine" - -/obj/item/slime_extract/bluespace - name = "bluespace slime extract" - icon_state = "bluespace slime extract" - -/obj/item/slime_extract/pyrite - name = "pyrite slime extract" - icon_state = "pyrite slime extract" - -/obj/item/slime_extract/cerulean - name = "cerulean slime extract" - icon_state = "cerulean slime extract" - -/obj/item/slime_extract/sepia - name = "sepia slime extract" - icon_state = "sepia slime extract" - -/obj/item/slime_extract/rainbow - name = "rainbow slime extract" - icon_state = "rainbow slime extract" - -////Pet Slime Creation/// - -/obj/item/weapon/slimepotion - name = "docility potion" - desc = "A potent chemical mix that will nullify a slime's powers, causing it to become docile and tame." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle19" - w_class = 1 - origin_tech = "biotech=4" - - attack(mob/living/carbon/slime/M as mob, mob/user as mob) - if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. - user << " The potion only works on slimes!" - return ..() - if(M.stat) - user << " The slime is dead!" - return..() - if(M.mind) - user << " The slime resists!" - return ..() - if(M.is_adult) - var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc) - pet.icon_state = "[M.colour] adult slime" - pet.icon_living = "[M.colour] adult slime" - pet.icon_dead = "[M.colour] baby slime dead" - pet.colour = "[M.colour]" - qdel(M) - var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) - - if (!newname) - newname = "pet slime" - pet.name = newname - pet.real_name = newname - qdel(src) - else - var/mob/living/simple_animal/slime/pet = new /mob/living/simple_animal/slime(M.loc) - pet.icon_state = "[M.colour] baby slime" - pet.icon_living = "[M.colour] baby slime" - pet.icon_dead = "[M.colour] baby slime dead" - pet.colour = "[M.colour]" - qdel(M) - var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) - - if (!newname) - newname = "pet slime" - pet.name = newname - pet.real_name = newname - qdel(src) - user <<"You feed the slime the potion, removing it's powers and calming it." - -/obj/item/weapon/sentience_potion - name = "sentience potion" - desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels. Unlike normal slime potions, it can be absorbed by any nonsentient being." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle19" - origin_tech = "biotech=5" - var/list/not_interested = list() - var/being_used = 0 - w_class = 1 - - -/obj/item/weapon/sentience_potion/afterattack(mob/living/M, mob/user) - if(being_used || !ismob(M)) - return - if(!isslime(M) && !isanimal(M) || M.ckey) //only works on animals that aren't player controlled - user << "[M] is already too intelligent for this to work!" - return ..() - if(M.stat) - user << "[M] is dead!" - return..() - - user << "You offer the sentience potion to [M]..." - being_used = 1 - - var/list/candidates = get_candidates(ROLE_SENTIENT, ALIEN_AFK_BRACKET) - - shuffle(candidates) - - var/time_passed = world.time - var/list/consenting_candidates = list() - - for(var/candidate in candidates) - - if(candidate in not_interested) - continue - - spawn(0) - switch(alert(candidate, "Would you like to play as [M.name]? Please choose quickly!","Confirmation","Yes","No")) - if("Yes") - if((world.time-time_passed)>=50 || !src) - return - consenting_candidates += candidate - if("No") - if(!src) - return - not_interested += candidate - - sleep(50) - - if(!src) - return - - listclearnulls(consenting_candidates) //some candidates might have left during sleep(50) - - if(consenting_candidates.len) - var/client/C = null - C = pick(consenting_candidates) - M.key = C.key - M.universal_speak = 1 - M.faction |= "sentient" - M << "All at once it makes sense: you know what you are and who you are! Self awareness is yours!" - M << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost." - user << "[M] accepts the potion and suddenly becomes attentive and aware. It worked!" - if(isanimal(M)) - var/mob/living/simple_animal/S = M - S.master_commander = user - qdel(src) - else - user << "[M] looks interested for a moment, but then looks back down. Maybe you should try again later." - being_used = 0 - ..() - - -/obj/item/weapon/slimesteroid - name = "slime steroid" - desc = "A potent chemical mix that will cause a slime to generate more extract." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle16" - w_class = 1 - origin_tech = "biotech=4" - - - attack(mob/living/carbon/slime/M as mob, mob/user as mob) - if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. - user << " The steroid only works on baby slimes!" - return ..() - if(M.is_adult) //Can't tame adults - user << " Only baby slimes can use the steroid!" - return..() - if(M.stat) - user << " The slime is dead!" - return..() - if(M.cores == 3) - user <<" The slime already has the maximum amount of extract!" - return..() - - user <<"You feed the slime the steroid. It now has triple the amount of extract." - M.cores = 3 - qdel(src) - -/obj/item/weapon/slimesteroid2 - name = "extract enhancer" - desc = "A potent chemical mix that will give a slime extract three uses." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle17" - w_class = 1 - origin_tech = "biotech=4" - - -/obj/item/weapon/slimespeed - name = "slime speed potion" - desc = "A potent chemical mix that will remove the slowdown from any item." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle3" - w_class = 1 - origin_tech = "biotech=4" - -/obj/item/weapon/slimespeed/afterattack(obj/item/C, mob/user) - ..() - if(!istype(C)) - user << "The potion can only be used on items!" - return - if(C.slowdown <= 0) - user << "The [C] can't be made any faster!" - return..() - user <<"You slather the red gunk over the [C], making it faster." - C.color = "#FF0000" - C.slowdown = 0 - qdel(src) - -/obj/item/weapon/slimefireproof - name = "slime chill potion" - desc = "A potent chemical mix that will fireproof any article of clothing. Has three uses." - icon = 'icons/obj/chemical.dmi' - icon_state = "bottle17" - var/uses = 3 - w_class = 1 - origin_tech = "biotech=4" - - -/obj/item/weapon/slimefireproof/afterattack(obj/item/clothing/C, mob/user) - ..() - if(!uses) - qdel(src) - return - if(!istype(C)) - user << "The potion can only be used on clothing!" - return - if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) - user << "The [C] is already fireproof!" - return..() - user <<"You slather the blue gunk over the [C], fireproofing it." - C.name = "fireproofed [C.name]" - C.color = "#000080" - C.max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT - C.heat_protection = C.body_parts_covered - uses -- - if(!uses) - qdel(src) - -/obj/item/stack/tile/bluespace - name = "bluespace floor tile" - singular_name = "floor tile" - desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds." - icon_state = "tile-bluespace" - w_class = 3 - force = 6 - materials = list(MAT_METAL=500) - throwforce = 10 - throw_speed = 3 - throw_range = 7 - flags = CONDUCT - max_amount = 60 - turf_type = /turf/simulated/floor/bluespace - - -/turf/simulated/floor/bluespace - slowdown = -1 - icon_state = "bluespace" - desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds." - floor_tile = /obj/item/stack/tile/bluespace - - -/obj/item/stack/tile/sepia - name = "sepia floor tile" - singular_name = "floor tile" - desc = "Time seems to flow very slowly around these tiles." - icon_state = "tile-sepia" - w_class = 3 - force = 6 - materials = list(MAT_METAL=500) - throwforce = 10 - throw_speed = 3 - throw_range = 7 - flags = CONDUCT - max_amount = 60 - turf_type = /turf/simulated/floor/sepia - - -/turf/simulated/floor/sepia - slowdown = 2 - icon_state = "sepia" - desc = "Time seems to flow very slowly around these tiles." - floor_tile = /obj/item/stack/tile/sepia - -/obj/effect/goleRUNe - anchored = 1 - desc = "a strange rune used to create golems. It glows when spirits are nearby." - name = "rune" - icon = 'icons/obj/rune.dmi' - icon_state = "golem" - unacidable = 1 - layer = TURF_LAYER - var/list/mob/dead/observer/ghosts[0] - - New() - ..() - processing_objects.Add(src) - - process() - if(ghosts.len>0) - icon_state = "golem2" - else - icon_state = "golem" - - attack_hand(mob/living/user as mob) - var/mob/dead/observer/ghost - for(var/mob/dead/observer/O in src.loc) - if(!check_observer(O)) - O << "\red You are not eligible to become a golem." - continue - ghost = O - break - if(!ghost) - user << "The rune fizzles uselessly. There is no spirit nearby." - return - var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem - if(prob(50)) G.gender = "female" - G.loc = src.loc - G.key = ghost.key - G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost." - qdel(src) - - - proc/announce_to_ghosts() - for(var/mob/dead/observer/O in player_list) - if(O.client) - var/area/A = get_area(src) - if(A) - O << "\blue Golem rune created in [A.name]. (Teleport | Sign Up)" - - Topic(href,href_list) - if("signup" in href_list) - var/mob/dead/observer/O = locate(href_list["signup"]) - volunteer(O) - - attack_ghost(var/mob/dead/observer/O) - if(!O) return - volunteer(O) - - proc/check_observer(var/mob/dead/observer/O) - if(!O) - return 0 - if(!O.client) - return 0 - if(O.mind && O.mind.current && O.mind.current.stat != DEAD) - return 0 - if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) - return 0 - return 1 - - proc/volunteer(var/mob/dead/observer/O) - if(O in ghosts) - ghosts.Remove(O) - O << "\red You are no longer signed up to be a golem." - else - if(!check_observer(O)) - O << "\red You are not eligible to become a golem." - return - ghosts.Add(O) - O << "\blue You are signed up to be a golem." \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/death.dm b/code/modules/mob/living/carbon/slime/death.dm similarity index 93% rename from code/modules/mob/living/carbon/metroid/death.dm rename to code/modules/mob/living/carbon/slime/death.dm index e7cac39a36c..6e951320bdc 100644 --- a/code/modules/mob/living/carbon/metroid/death.dm +++ b/code/modules/mob/living/carbon/slime/death.dm @@ -1,29 +1,29 @@ -/mob/living/carbon/slime/death(gibbed) - if(!gibbed) - if(is_adult) - var/mob/living/carbon/slime/M = new /mob/living/carbon/slime(loc) - M.colour = colour - M.rabid = 1 - is_adult = 0 - maxHealth = 150 - revive() - regenerate_icons() - number = rand(1, 1000) - name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" - return - - if(stat == DEAD) return - stat = DEAD - icon_state = "[colour] baby slime dead" - overlays.len = 0 - for(var/mob/O in viewers(src, null)) - O.show_message("The [name] seizes up and falls limp...", 1) //ded -- Urist - - update_canmove() - if(blind) - blind.layer = 0 - - if(ticker && ticker.mode) - ticker.mode.check_win() - +/mob/living/carbon/slime/death(gibbed) + if(!gibbed) + if(is_adult) + var/mob/living/carbon/slime/M = new /mob/living/carbon/slime(loc) + M.colour = colour + M.rabid = 1 + is_adult = 0 + maxHealth = 150 + revive() + regenerate_icons() + number = rand(1, 1000) + name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" + return + + if(stat == DEAD) return + stat = DEAD + icon_state = "[colour] baby slime dead" + overlays.len = 0 + for(var/mob/O in viewers(src, null)) + O.show_message("The [name] seizes up and falls limp...", 1) //ded -- Urist + + update_canmove() + if(blind) + blind.layer = 0 + + if(ticker && ticker.mode) + ticker.mode.check_win() + return ..(gibbed) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm similarity index 96% rename from code/modules/mob/living/carbon/metroid/emote.dm rename to code/modules/mob/living/carbon/slime/emote.dm index fa7e5c07466..dcc0b066487 100644 --- a/code/modules/mob/living/carbon/metroid/emote.dm +++ b/code/modules/mob/living/carbon/slime/emote.dm @@ -1,74 +1,74 @@ -/mob/living/carbon/slime/emote(var/act, var/m_type=1, var/message = null) - if (findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - //param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) - - if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' - act = copytext(act,1,length(act)) - - switch(act) //Alphabetical please - if ("me") - if(silent) - return - if (src.client) - if (client.prefs.muted & MUTE_IC) - src << "\red You cannot send IC messages (muted)." - return - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return - if (stat) - return - if(!(message)) - return - return custom_emote(m_type, message) - if("bounce") - message = "The [src.name] bounces in place." - m_type = 1 - - if ("custom") - return custom_emote(m_type, message) - - if("jiggle") - message = "The [src.name] jiggles!" - m_type = 1 - - if("light") - message = "The [src.name] lights up for a bit, then stops." - m_type = 1 - - if("moan") - message = "The [src.name] moans." - m_type = 2 - - if("shiver") - message = "The [src.name] shivers." - m_type = 2 - - if("sway") - message = "The [src.name] sways around dizzily." - m_type = 1 - - if("twitch") - message = "The [src.name] twitches." - m_type = 1 - - if("vibrate") - message = "The [src.name] vibrates!" - m_type = 1 - - if ("help") //This is an exception - src << "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate" - - else - src << "\blue Unusable emote '[act]'. Say *help for a list." - if ((message && src.stat == 0)) - if (m_type & 1) - for(var/mob/O in viewers(src, null)) - O.show_message(message, m_type) - //Foreach goto(703) - else - for(var/mob/O in hearers(src, null)) - O.show_message(message, m_type) - //Foreach goto(746) +/mob/living/carbon/slime/emote(var/act, var/m_type=1, var/message = null) + if (findtext(act, "-", 1, null)) + var/t1 = findtext(act, "-", 1, null) + //param = copytext(act, t1 + 1, length(act) + 1) + act = copytext(act, 1, t1) + + if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' + act = copytext(act,1,length(act)) + + switch(act) //Alphabetical please + if ("me") + if(silent) + return + if (src.client) + if (client.prefs.muted & MUTE_IC) + src << "\red You cannot send IC messages (muted)." + return + if (src.client.handle_spam_prevention(message,MUTE_IC)) + return + if (stat) + return + if(!(message)) + return + return custom_emote(m_type, message) + if("bounce") + message = "The [src.name] bounces in place." + m_type = 1 + + if ("custom") + return custom_emote(m_type, message) + + if("jiggle") + message = "The [src.name] jiggles!" + m_type = 1 + + if("light") + message = "The [src.name] lights up for a bit, then stops." + m_type = 1 + + if("moan") + message = "The [src.name] moans." + m_type = 2 + + if("shiver") + message = "The [src.name] shivers." + m_type = 2 + + if("sway") + message = "The [src.name] sways around dizzily." + m_type = 1 + + if("twitch") + message = "The [src.name] twitches." + m_type = 1 + + if("vibrate") + message = "The [src.name] vibrates!" + m_type = 1 + + if ("help") //This is an exception + src << "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate" + + else + src << "\blue Unusable emote '[act]'. Say *help for a list." + if ((message && src.stat == 0)) + if (m_type & 1) + for(var/mob/O in viewers(src, null)) + O.show_message(message, m_type) + //Foreach goto(703) + else + for(var/mob/O in hearers(src, null)) + O.show_message(message, m_type) + //Foreach goto(746) return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/examine.dm b/code/modules/mob/living/carbon/slime/examine.dm similarity index 95% rename from code/modules/mob/living/carbon/metroid/examine.dm rename to code/modules/mob/living/carbon/slime/examine.dm index 67ef5770103..826fa93c22e 100644 --- a/code/modules/mob/living/carbon/metroid/examine.dm +++ b/code/modules/mob/living/carbon/slime/examine.dm @@ -1,44 +1,44 @@ -/mob/living/carbon/slime/examine(mob/user) - ..(user) - var/msg = "" - if (src.stat == DEAD) - msg += "It is limp and unresponsive.\n" - else - if (src.getBruteLoss()) - msg += "" - if (src.getBruteLoss() < 40) - msg += "It has some punctures in its flesh!" - else - msg += "It has severe punctures and tears in its flesh!" - msg += "\n" - - switch(powerlevel) - - if(2 to 3) - msg += "It is flickering gently with a little electrical activity.\n" - - if(4 to 5) - msg += "It is glowing gently with moderate levels of electrical activity.\n" - - if(6 to 9) - msg += "It is glowing brightly with high levels of electrical activity.\n" - - if(10) - msg += "It is radiating with massive levels of electrical activity!\n" - - msg += "" - switch(wetlevel) - if(1) - msg += "It looks a bit damp.\n" - if(2) - msg += "It looks a little bit wet.\n" - if(3) - msg += "It looks wet.\n" - if(4) - msg += "It looks very wet.\n" - if(5) - msg += "It looks absolutely soaked.\n" - msg += "" - - msg += "*---------*" +/mob/living/carbon/slime/examine(mob/user) + ..(user) + var/msg = "" + if (src.stat == DEAD) + msg += "It is limp and unresponsive.\n" + else + if (src.getBruteLoss()) + msg += "" + if (src.getBruteLoss() < 40) + msg += "It has some punctures in its flesh!" + else + msg += "It has severe punctures and tears in its flesh!" + msg += "\n" + + switch(powerlevel) + + if(2 to 3) + msg += "It is flickering gently with a little electrical activity.\n" + + if(4 to 5) + msg += "It is glowing gently with moderate levels of electrical activity.\n" + + if(6 to 9) + msg += "It is glowing brightly with high levels of electrical activity.\n" + + if(10) + msg += "It is radiating with massive levels of electrical activity!\n" + + msg += "" + switch(wetlevel) + if(1) + msg += "It looks a bit damp.\n" + if(2) + msg += "It looks a little bit wet.\n" + if(3) + msg += "It looks wet.\n" + if(4) + msg += "It looks very wet.\n" + if(5) + msg += "It looks absolutely soaked.\n" + msg += "" + + msg += "*---------*" user << msg \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/slime/life.dm similarity index 96% rename from code/modules/mob/living/carbon/metroid/life.dm rename to code/modules/mob/living/carbon/slime/life.dm index b70075a084b..1e3d901755a 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -1,552 +1,552 @@ -/mob/living/carbon/slime - var/AIproc = 0 // determines if the AI loop is activated - var/Atkcool = 0 // attack cooldown - var/Tempstun = 0 // temporary temperature stuns - var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while - var/SStun = 0 // stun variable - -/mob/living/carbon/slime/Life() - if(..()) - handle_nutrition() - handle_targets() - if (!ckey) - handle_speech_and_mood() - -/mob/living/carbon/slime/proc/AIprocess() // the master AI process - - if(AIproc || stat == DEAD || client) return - - var/hungry = 0 - if (nutrition < get_starve_nutrition()) - hungry = 2 - else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) - hungry = 1 - - AIproc = 1 - - while(AIproc && stat != 2 && (attacked || hungry || rabid || Victim)) - if(Victim) // can't eat AND have this little process at the same time - break - - if(!Target || client) - break - - if(Target.health <= -70 || Target.stat == 2) - Target = null - AIproc = 0 - break - - if(Target) - for(var/mob/living/carbon/slime/M in view(1,Target)) - if(M.Victim == Target) - Target = null - AIproc = 0 - break - if(!AIproc) - break - - if(Target in view(1,src)) - if(istype(Target, /mob/living/silicon)) - if(!Atkcool) - Atkcool = 1 - spawn(45) - Atkcool = 0 - - if(Target.Adjacent(src)) - Target.attack_slime(src) - return - if(!Target.lying && prob(80)) - - if(Target.client && Target.health >= 20) - if(!Atkcool) - Atkcool = 1 - spawn(45) - Atkcool = 0 - - if(Target.Adjacent(src)) - Target.attack_slime(src) - - else - if(!Atkcool && Target.Adjacent(src)) - Feedon(Target) - - else - if(!Atkcool && Target.Adjacent(src)) - Feedon(Target) - - else - if(Target in view(7, src)) - if(!Target.Adjacent(src)) // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them - step_to(src, Target) - sleep(5) - - else - Target = null - AIproc = 0 - break - - var/sleeptime = movement_delay() - if(sleeptime <= 0) sleeptime = 1 - - sleep(sleeptime + 2) // this is about as fast as a player slime can go - - AIproc = 0 - -/mob/living/carbon/slime/handle_environment(datum/gas_mixture/environment) - if(!environment) - adjustToxLoss(rand(10,20)) - return - - //var/environment_heat_capacity = environment.heat_capacity() - var/loc_temp = T0C - if(istype(get_turf(src), /turf/space)) - //environment_heat_capacity = loc:heat_capacity - var/turf/heat_turf = get_turf(src) - loc_temp = heat_turf.temperature - else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) - loc_temp = loc:air_contents.temperature - else - loc_temp = environment.temperature - - //Account for massive pressure differences - if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc - if(bodytemperature <= (T0C - 40)) // stun temperature - Tempstun = 1 - - if(bodytemperature <= (T0C - 50)) // hurt temperature - if(bodytemperature <= 50) // sqrting negative numbers is bad - adjustToxLoss(301) //The config.health_threshold_dead is -100 by default, and slimes have 150hp (200hp for adults), - else //so the ToxLoss needs to be 300 or above to guarrantee an instant death - adjustToxLoss(round(sqrt(bodytemperature)) * 2) - else - Tempstun = 0 - - - /*moved after the temperature damage code so freeze beams can instantly kill slimes -Deity Link*/ - if(loc_temp < 310.15) // a cold place - bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) - else // a hot place - bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) - - updatehealth() - - return //TODO: DEFERRED - -/mob/living/carbon/slime/proc/adjust_body_temperature(current, loc_temp, boost) - var/temperature = current - var/difference = abs(current-loc_temp) //get difference - var/increments// = difference/10 //find how many increments apart they are - if(difference > 50) - increments = difference/5 - else - increments = difference/10 - var/change = increments*boost // Get the amount to change by (x per increment) - var/temp_change - if(current < loc_temp) - temperature = min(loc_temp, temperature+change) - else if(current > loc_temp) - temperature = max(loc_temp, temperature-change) - temp_change = (temperature - current) - return temp_change - -/mob/living/carbon/slime/handle_chemicals_in_body() - - if(reagents) reagents.metabolize(src) - if (reagents.get_reagent_amount("plasma")>=5) - mutation_chance = min(mutation_chance + 5,50) //Prevents mutation chance going >50% - reagents.remove_reagent("plasma", 5) - if (reagents.get_reagent_amount("epinephrine")>=5) - mutation_chance = max(mutation_chance - 5,0) //Prevents muation chance going <0% - reagents.remove_reagent("epinephrine", 5) - src.updatehealth() - - return //TODO: DEFERRED - -/mob/living/carbon/slime/handle_regular_status_updates() - - if(is_adult) - health = 200 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) - else - health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) - - if(health < config.health_threshold_dead && stat != 2) - death() - return - - else if(src.health <= config.health_threshold_crit) - - if(!src.reagents.has_reagent("epinephrine")) - src.adjustOxyLoss(10) - - if(src.stat != DEAD) - src.stat = UNCONSCIOUS - - if(prob(30)) //I think this is meant to allow slimes to starve to death - adjustOxyLoss(-1) - adjustToxLoss(-1) - adjustFireLoss(-1) - adjustCloneLoss(-1) - adjustBruteLoss(-1) - - if (src.stat == DEAD) - src.lying = 1 - src.blinded = 1 - else - if (src.paralysis || src.stunned || src.weakened || (status_flags && FAKEDEATH)) //Stunned etc. - if (src.stunned > 0) - AdjustStunned(-1) - src.stat = 0 - if (src.weakened > 0) - AdjustWeakened(-1) - src.lying = 0 - src.stat = 0 - if (src.paralysis > 0) - AdjustParalysis(-1) - src.blinded = 0 - src.lying = 0 - src.stat = 0 - - else - src.lying = 0 - src.stat = 0 - - if (src.stuttering) src.stuttering = 0 - - if (src.eye_blind) - src.eye_blind = 0 - src.blinded = 1 - - if (src.ear_deaf > 0) src.ear_deaf = 0 - if (src.ear_damage < 25) - src.ear_damage = 0 - - src.density = !( src.lying ) - - if (src.sdisabilities & BLIND) - src.blinded = 1 - if (src.sdisabilities & DEAF) - src.ear_deaf = 1 - - if (src.eye_blurry > 0) - src.eye_blurry = 0 - - if (src.druggy > 0) - src.druggy = 0 - - return 1 - -/mob/living/carbon/slime/proc/handle_nutrition() - - if (prob(15)) - nutrition -= 1 + is_adult - - if(nutrition <= 0) - nutrition = 0 - if(prob(75)) - adjustToxLoss(rand(0,5)) - - else if (nutrition >= get_grow_nutrition() && amount_grown < 10) - nutrition -= 20 - amount_grown++ - - if(amount_grown >= 10 && !Victim && !Target && !ckey) - if(is_adult) - Reproduce() - else - Evolve() - - -/mob/living/carbon/slime/proc/handle_targets() - if(Tempstun) - if(!Victim) // not while they're eating! - canmove = 0 - else - canmove = 1 - - if(attacked > 50) attacked = 50 - - if(attacked > 0) - attacked-- - - if(Discipline > 0) - - if(Discipline >= 5 && rabid) - if(prob(60)) rabid = 0 - - if(prob(10)) - Discipline-- - - if(!client) - if(!canmove) return - - if(Victim) return // if it's eating someone already, continue eating! - - if(Target) - --target_patience - if (target_patience <= 0 || SStun || Discipline || attacked) // Tired of chasing or something draws out attention - target_patience = 0 - Target = null - - if(AIproc && SStun) return - - var/hungry = 0 // determines if the slime is hungry - - if (nutrition < get_starve_nutrition()) - hungry = 2 - else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) - hungry = 1 - - if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends - if(Friends.len > 0 && prob(1)) - var/mob/nofriend = pick(Friends) - --Friends[nofriend] - - if(!Target) - if(will_hunt() && hungry || attacked || rabid) // Only add to the list if we need to - var/list/targets = list() - - for(var/mob/living/L in view(7,src)) - - if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs - continue - - if(L in Friends) // No eating friends! - continue - - if(issilicon(L) && (rabid || attacked)) // They can't eat silicons, but they can glomp them in defence - targets += L // Possible target found! - - if(istype(L, /mob/living/carbon/human)) //Ignore slime(wo)men - var/mob/living/carbon/human/H = L - if(H.species.name == "Slime People") - continue - - if(!L.canmove) // Only one slime can latch on at a time. - var/notarget = 0 - for(var/mob/living/carbon/slime/M in view(1,L)) - if(M.Victim == L) - notarget = 1 - if(notarget) - continue - - targets += L // Possible target found! - - if(targets.len > 0) - if(attacked || rabid || hungry == 2) - Target = targets[1] // I am attacked and am fighting back or so hungry I don't even care - else - for(var/mob/living/carbon/C in targets) - if(!Discipline && prob(5)) - if(ishuman(C) || isalienadult(C)) - Target = C - break - - if(islarva(C) || issmall(C)) - Target = C - break - - if (Target) - target_patience = rand(5,7) - if (is_adult) - target_patience += 3 - - if(!Target) // If we have no target, we are wandering or following orders - if (Leader) - if (holding_still) - holding_still = max(holding_still - 1, 0) - else if(canmove && isturf(loc)) - step_to(src, Leader) - - else if(hungry) - if (holding_still) - holding_still = max(holding_still - hungry, 0) - else if(canmove && isturf(loc) && prob(50)) - step(src, pick(cardinal)) - - else - if (holding_still) - holding_still = max(holding_still - 1, 0) - else if(canmove && isturf(loc) && prob(33)) - step(src, pick(cardinal)) - else if(!AIproc) - spawn() - AIprocess() - -/mob/living/carbon/slime/proc/handle_speech_and_mood() - //Mood starts here - var/newmood = "" - if (rabid || attacked) newmood = "angry" - else if (Target) newmood = "mischevous" - - if (!newmood) - if (Discipline && prob(25)) - newmood = "pout" - else if (prob(1)) - newmood = pick("sad", ":3", "pout") - - if ((mood == "sad" || mood == ":3" || mood == "pout") && !newmood) - if (prob(75)) newmood = mood - - if (newmood != mood) // This is so we don't redraw them every time - mood = newmood - regenerate_icons() - - //Speech understanding starts here - var/to_say - if (speech_buffer.len > 0) - var/who = speech_buffer[1] // Who said it? - var/phrase = speech_buffer[2] // What did they say? - if ((findtext(phrase, num2text(number)) || findtext(phrase, "slimes"))) // Talking to us - if (findtext(phrase, "hello") || findtext(phrase, "hi")) - to_say = pick("Hello...", "Hi...") - else if (findtext(phrase, "follow")) - if (Leader) - if (Leader == who) // Already following him - to_say = pick("Yes...", "Lead...", "Following...") - else if (Friends[who] > Friends[Leader]) // VIVA - Leader = who - to_say = "Yes... I follow [who]..." - else - to_say = "No... I follow [Leader]..." - else - if (Friends[who] > 2) - Leader = who - to_say = "I follow..." - else // Not friendly enough - to_say = pick("No...", "I won't follow...") - else if (findtext(phrase, "stop")) - if (Victim) // We are asked to stop feeding - if (Friends[who] > 4) - Victim = null - Target = null - if (Friends[who] < 7) - --Friends[who] - to_say = "Grrr..." // I'm angry but I do it - else - to_say = "Fine..." - else if (Target) // We are asked to stop chasing - if (Friends[who] > 3) - Target = null - if (Friends[who] < 6) - --Friends[who] - to_say = "Grrr..." // I'm angry but I do it - else - to_say = "Fine..." - else if (Leader) // We are asked to stop following - if (Leader == who) - to_say = "Yes... I'll stay..." - Leader = null - else - if (Friends[who] > Friends[Leader]) - Leader = null - to_say = "Yes... I'll stop..." - else - to_say = "No... I'll keep following..." - else if (findtext(phrase, "stay")) - if (Leader) - if (Leader == who) - holding_still = Friends[who] * 10 - to_say = "Yes... Staying..." - else if (Friends[who] > Friends[Leader]) - holding_still = (Friends[who] - Friends[Leader]) * 10 - to_say = "Yes... Staying..." - else - to_say = "No... I'll keep following..." - else - if (Friends[who] > 2) - holding_still = Friends[who] * 10 - to_say = "Yes... Staying..." - else - to_say = "No... I won't stay..." - speech_buffer = list() - - //Speech starts here - if (to_say) - say (to_say) - else if(prob(1)) - emote(pick("bounce","sway","light","vibrate","jiggle")) - else - var/t = 10 - var/slimes_near = -1 // Don't count myself - var/dead_slimes = 0 - var/friends_near = list() - for (var/mob/living/carbon/M in view(7,src)) - if (isslime(M)) - ++slimes_near - if (M.stat == DEAD) - ++dead_slimes - if (M in Friends) - t += 20 - friends_near += M - if (nutrition < get_hunger_nutrition()) t += 10 - if (nutrition < get_starve_nutrition()) t += 10 - if (prob(2) && prob(t)) - var/phrases = list() - if (Target) phrases += "[Target]... looks tasty..." - if (nutrition < get_starve_nutrition()) - phrases += "So... hungry..." - phrases += "Very... hungry..." - phrases += "Need... food..." - phrases += "Must... eat..." - else if (nutrition < get_hunger_nutrition()) - phrases += "Hungry..." - phrases += "Where is the food?" - phrases += "I want to eat..." - phrases += "Rawr..." - phrases += "Blop..." - phrases += "Blorble..." - if (rabid || attacked) - phrases += "Hrr..." - phrases += "Nhuu..." - phrases += "Unn..." - if (mood == ":3") - phrases += "Purr..." - if (attacked) - phrases += "Grrr..." - if (getToxLoss() > 30) - phrases += "Cold..." - if (getToxLoss() > 60) - phrases += "So... cold..." - phrases += "Very... cold..." - if (getToxLoss() > 90) - phrases += "..." - phrases += "C... c..." - if (Victim) - phrases += "Nom..." - phrases += "Tasty..." - if (powerlevel > 3) phrases += "Bzzz..." - if (powerlevel > 5) phrases += "Zap..." - if (powerlevel > 8) phrases += "Zap... Bzz..." - if (mood == "sad") phrases += "Bored..." - if (slimes_near) phrases += "Brother..." - if (slimes_near > 1) phrases += "Brothers..." - if (dead_slimes) phrases += "What happened?" - if (!slimes_near) - phrases += "Lonely..." - for (var/M in friends_near) - phrases += "[M]... friend..." - if (nutrition < get_hunger_nutrition()) - phrases += "[M]... feed me..." - say (pick(phrases)) - -/mob/living/carbon/slime/proc/get_max_nutrition() // Can't go above it - if (is_adult) return 1200 - else return 1000 - -/mob/living/carbon/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat - if (is_adult) return 1000 - else return 800 - -/mob/living/carbon/slime/proc/get_hunger_nutrition() // Below it we will always eat - if (is_adult) return 600 - else return 500 - -/mob/living/carbon/slime/proc/get_starve_nutrition() // Below it we will eat before everything else - if (is_adult) return 300 - else return 200 - -/mob/living/carbon/slime/proc/will_hunt(var/hunger = -1) // Check for being stopped from feeding and chasing - if (hunger == 2 || rabid || attacked) return 1 - if (Leader) return 0 - if (holding_still) return 0 - return 1 +/mob/living/carbon/slime + var/AIproc = 0 // determines if the AI loop is activated + var/Atkcool = 0 // attack cooldown + var/Tempstun = 0 // temporary temperature stuns + var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while + var/SStun = 0 // stun variable + +/mob/living/carbon/slime/Life() + if(..()) + handle_nutrition() + handle_targets() + if (!ckey) + handle_speech_and_mood() + +/mob/living/carbon/slime/proc/AIprocess() // the master AI process + + if(AIproc || stat == DEAD || client) return + + var/hungry = 0 + if (nutrition < get_starve_nutrition()) + hungry = 2 + else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) + hungry = 1 + + AIproc = 1 + + while(AIproc && stat != 2 && (attacked || hungry || rabid || Victim)) + if(Victim) // can't eat AND have this little process at the same time + break + + if(!Target || client) + break + + if(Target.health <= -70 || Target.stat == 2) + Target = null + AIproc = 0 + break + + if(Target) + for(var/mob/living/carbon/slime/M in view(1,Target)) + if(M.Victim == Target) + Target = null + AIproc = 0 + break + if(!AIproc) + break + + if(Target in view(1,src)) + if(istype(Target, /mob/living/silicon)) + if(!Atkcool) + Atkcool = 1 + spawn(45) + Atkcool = 0 + + if(Target.Adjacent(src)) + Target.attack_slime(src) + return + if(!Target.lying && prob(80)) + + if(Target.client && Target.health >= 20) + if(!Atkcool) + Atkcool = 1 + spawn(45) + Atkcool = 0 + + if(Target.Adjacent(src)) + Target.attack_slime(src) + + else + if(!Atkcool && Target.Adjacent(src)) + Feedon(Target) + + else + if(!Atkcool && Target.Adjacent(src)) + Feedon(Target) + + else + if(Target in view(7, src)) + if(!Target.Adjacent(src)) // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them + step_to(src, Target) + sleep(5) + + else + Target = null + AIproc = 0 + break + + var/sleeptime = movement_delay() + if(sleeptime <= 0) sleeptime = 1 + + sleep(sleeptime + 2) // this is about as fast as a player slime can go + + AIproc = 0 + +/mob/living/carbon/slime/handle_environment(datum/gas_mixture/environment) + if(!environment) + adjustToxLoss(rand(10,20)) + return + + //var/environment_heat_capacity = environment.heat_capacity() + var/loc_temp = T0C + if(istype(get_turf(src), /turf/space)) + //environment_heat_capacity = loc:heat_capacity + var/turf/heat_turf = get_turf(src) + loc_temp = heat_turf.temperature + else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) + loc_temp = loc:air_contents.temperature + else + loc_temp = environment.temperature + + //Account for massive pressure differences + if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc + if(bodytemperature <= (T0C - 40)) // stun temperature + Tempstun = 1 + + if(bodytemperature <= (T0C - 50)) // hurt temperature + if(bodytemperature <= 50) // sqrting negative numbers is bad + adjustToxLoss(301) //The config.health_threshold_dead is -100 by default, and slimes have 150hp (200hp for adults), + else //so the ToxLoss needs to be 300 or above to guarrantee an instant death + adjustToxLoss(round(sqrt(bodytemperature)) * 2) + else + Tempstun = 0 + + + /*moved after the temperature damage code so freeze beams can instantly kill slimes -Deity Link*/ + if(loc_temp < 310.15) // a cold place + bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) + else // a hot place + bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) + + updatehealth() + + return //TODO: DEFERRED + +/mob/living/carbon/slime/proc/adjust_body_temperature(current, loc_temp, boost) + var/temperature = current + var/difference = abs(current-loc_temp) //get difference + var/increments// = difference/10 //find how many increments apart they are + if(difference > 50) + increments = difference/5 + else + increments = difference/10 + var/change = increments*boost // Get the amount to change by (x per increment) + var/temp_change + if(current < loc_temp) + temperature = min(loc_temp, temperature+change) + else if(current > loc_temp) + temperature = max(loc_temp, temperature-change) + temp_change = (temperature - current) + return temp_change + +/mob/living/carbon/slime/handle_chemicals_in_body() + + if(reagents) reagents.metabolize(src) + if (reagents.get_reagent_amount("plasma")>=5) + mutation_chance = min(mutation_chance + 5,50) //Prevents mutation chance going >50% + reagents.remove_reagent("plasma", 5) + if (reagents.get_reagent_amount("epinephrine")>=5) + mutation_chance = max(mutation_chance - 5,0) //Prevents muation chance going <0% + reagents.remove_reagent("epinephrine", 5) + src.updatehealth() + + return //TODO: DEFERRED + +/mob/living/carbon/slime/handle_regular_status_updates() + + if(is_adult) + health = 200 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) + else + health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) + + if(health < config.health_threshold_dead && stat != 2) + death() + return + + else if(src.health <= config.health_threshold_crit) + + if(!src.reagents.has_reagent("epinephrine")) + src.adjustOxyLoss(10) + + if(src.stat != DEAD) + src.stat = UNCONSCIOUS + + if(prob(30)) //I think this is meant to allow slimes to starve to death + adjustOxyLoss(-1) + adjustToxLoss(-1) + adjustFireLoss(-1) + adjustCloneLoss(-1) + adjustBruteLoss(-1) + + if (src.stat == DEAD) + src.lying = 1 + src.blinded = 1 + else + if (src.paralysis || src.stunned || src.weakened || (status_flags && FAKEDEATH)) //Stunned etc. + if (src.stunned > 0) + AdjustStunned(-1) + src.stat = 0 + if (src.weakened > 0) + AdjustWeakened(-1) + src.lying = 0 + src.stat = 0 + if (src.paralysis > 0) + AdjustParalysis(-1) + src.blinded = 0 + src.lying = 0 + src.stat = 0 + + else + src.lying = 0 + src.stat = 0 + + if (src.stuttering) src.stuttering = 0 + + if (src.eye_blind) + src.eye_blind = 0 + src.blinded = 1 + + if (src.ear_deaf > 0) src.ear_deaf = 0 + if (src.ear_damage < 25) + src.ear_damage = 0 + + src.density = !( src.lying ) + + if (src.sdisabilities & BLIND) + src.blinded = 1 + if (src.sdisabilities & DEAF) + src.ear_deaf = 1 + + if (src.eye_blurry > 0) + src.eye_blurry = 0 + + if (src.druggy > 0) + src.druggy = 0 + + return 1 + +/mob/living/carbon/slime/proc/handle_nutrition() + + if (prob(15)) + nutrition -= 1 + is_adult + + if(nutrition <= 0) + nutrition = 0 + if(prob(75)) + adjustToxLoss(rand(0,5)) + + else if (nutrition >= get_grow_nutrition() && amount_grown < 10) + nutrition -= 20 + amount_grown++ + + if(amount_grown >= 10 && !Victim && !Target && !ckey) + if(is_adult) + Reproduce() + else + Evolve() + + +/mob/living/carbon/slime/proc/handle_targets() + if(Tempstun) + if(!Victim) // not while they're eating! + canmove = 0 + else + canmove = 1 + + if(attacked > 50) attacked = 50 + + if(attacked > 0) + attacked-- + + if(Discipline > 0) + + if(Discipline >= 5 && rabid) + if(prob(60)) rabid = 0 + + if(prob(10)) + Discipline-- + + if(!client) + if(!canmove) return + + if(Victim) return // if it's eating someone already, continue eating! + + if(Target) + --target_patience + if (target_patience <= 0 || SStun || Discipline || attacked) // Tired of chasing or something draws out attention + target_patience = 0 + Target = null + + if(AIproc && SStun) return + + var/hungry = 0 // determines if the slime is hungry + + if (nutrition < get_starve_nutrition()) + hungry = 2 + else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) + hungry = 1 + + if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends + if(Friends.len > 0 && prob(1)) + var/mob/nofriend = pick(Friends) + --Friends[nofriend] + + if(!Target) + if(will_hunt() && hungry || attacked || rabid) // Only add to the list if we need to + var/list/targets = list() + + for(var/mob/living/L in view(7,src)) + + if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs + continue + + if(L in Friends) // No eating friends! + continue + + if(issilicon(L) && (rabid || attacked)) // They can't eat silicons, but they can glomp them in defence + targets += L // Possible target found! + + if(istype(L, /mob/living/carbon/human)) //Ignore slime(wo)men + var/mob/living/carbon/human/H = L + if(H.species.name == "Slime People") + continue + + if(!L.canmove) // Only one slime can latch on at a time. + var/notarget = 0 + for(var/mob/living/carbon/slime/M in view(1,L)) + if(M.Victim == L) + notarget = 1 + if(notarget) + continue + + targets += L // Possible target found! + + if(targets.len > 0) + if(attacked || rabid || hungry == 2) + Target = targets[1] // I am attacked and am fighting back or so hungry I don't even care + else + for(var/mob/living/carbon/C in targets) + if(!Discipline && prob(5)) + if(ishuman(C) || isalienadult(C)) + Target = C + break + + if(islarva(C) || issmall(C)) + Target = C + break + + if (Target) + target_patience = rand(5,7) + if (is_adult) + target_patience += 3 + + if(!Target) // If we have no target, we are wandering or following orders + if (Leader) + if (holding_still) + holding_still = max(holding_still - 1, 0) + else if(canmove && isturf(loc)) + step_to(src, Leader) + + else if(hungry) + if (holding_still) + holding_still = max(holding_still - hungry, 0) + else if(canmove && isturf(loc) && prob(50)) + step(src, pick(cardinal)) + + else + if (holding_still) + holding_still = max(holding_still - 1, 0) + else if(canmove && isturf(loc) && prob(33)) + step(src, pick(cardinal)) + else if(!AIproc) + spawn() + AIprocess() + +/mob/living/carbon/slime/proc/handle_speech_and_mood() + //Mood starts here + var/newmood = "" + if (rabid || attacked) newmood = "angry" + else if (Target) newmood = "mischevous" + + if (!newmood) + if (Discipline && prob(25)) + newmood = "pout" + else if (prob(1)) + newmood = pick("sad", ":3", "pout") + + if ((mood == "sad" || mood == ":3" || mood == "pout") && !newmood) + if (prob(75)) newmood = mood + + if (newmood != mood) // This is so we don't redraw them every time + mood = newmood + regenerate_icons() + + //Speech understanding starts here + var/to_say + if (speech_buffer.len > 0) + var/who = speech_buffer[1] // Who said it? + var/phrase = speech_buffer[2] // What did they say? + if ((findtext(phrase, num2text(number)) || findtext(phrase, "slimes"))) // Talking to us + if (findtext(phrase, "hello") || findtext(phrase, "hi")) + to_say = pick("Hello...", "Hi...") + else if (findtext(phrase, "follow")) + if (Leader) + if (Leader == who) // Already following him + to_say = pick("Yes...", "Lead...", "Following...") + else if (Friends[who] > Friends[Leader]) // VIVA + Leader = who + to_say = "Yes... I follow [who]..." + else + to_say = "No... I follow [Leader]..." + else + if (Friends[who] > 2) + Leader = who + to_say = "I follow..." + else // Not friendly enough + to_say = pick("No...", "I won't follow...") + else if (findtext(phrase, "stop")) + if (Victim) // We are asked to stop feeding + if (Friends[who] > 4) + Victim = null + Target = null + if (Friends[who] < 7) + --Friends[who] + to_say = "Grrr..." // I'm angry but I do it + else + to_say = "Fine..." + else if (Target) // We are asked to stop chasing + if (Friends[who] > 3) + Target = null + if (Friends[who] < 6) + --Friends[who] + to_say = "Grrr..." // I'm angry but I do it + else + to_say = "Fine..." + else if (Leader) // We are asked to stop following + if (Leader == who) + to_say = "Yes... I'll stay..." + Leader = null + else + if (Friends[who] > Friends[Leader]) + Leader = null + to_say = "Yes... I'll stop..." + else + to_say = "No... I'll keep following..." + else if (findtext(phrase, "stay")) + if (Leader) + if (Leader == who) + holding_still = Friends[who] * 10 + to_say = "Yes... Staying..." + else if (Friends[who] > Friends[Leader]) + holding_still = (Friends[who] - Friends[Leader]) * 10 + to_say = "Yes... Staying..." + else + to_say = "No... I'll keep following..." + else + if (Friends[who] > 2) + holding_still = Friends[who] * 10 + to_say = "Yes... Staying..." + else + to_say = "No... I won't stay..." + speech_buffer = list() + + //Speech starts here + if (to_say) + say (to_say) + else if(prob(1)) + emote(pick("bounce","sway","light","vibrate","jiggle")) + else + var/t = 10 + var/slimes_near = -1 // Don't count myself + var/dead_slimes = 0 + var/friends_near = list() + for (var/mob/living/carbon/M in view(7,src)) + if (isslime(M)) + ++slimes_near + if (M.stat == DEAD) + ++dead_slimes + if (M in Friends) + t += 20 + friends_near += M + if (nutrition < get_hunger_nutrition()) t += 10 + if (nutrition < get_starve_nutrition()) t += 10 + if (prob(2) && prob(t)) + var/phrases = list() + if (Target) phrases += "[Target]... looks tasty..." + if (nutrition < get_starve_nutrition()) + phrases += "So... hungry..." + phrases += "Very... hungry..." + phrases += "Need... food..." + phrases += "Must... eat..." + else if (nutrition < get_hunger_nutrition()) + phrases += "Hungry..." + phrases += "Where is the food?" + phrases += "I want to eat..." + phrases += "Rawr..." + phrases += "Blop..." + phrases += "Blorble..." + if (rabid || attacked) + phrases += "Hrr..." + phrases += "Nhuu..." + phrases += "Unn..." + if (mood == ":3") + phrases += "Purr..." + if (attacked) + phrases += "Grrr..." + if (getToxLoss() > 30) + phrases += "Cold..." + if (getToxLoss() > 60) + phrases += "So... cold..." + phrases += "Very... cold..." + if (getToxLoss() > 90) + phrases += "..." + phrases += "C... c..." + if (Victim) + phrases += "Nom..." + phrases += "Tasty..." + if (powerlevel > 3) phrases += "Bzzz..." + if (powerlevel > 5) phrases += "Zap..." + if (powerlevel > 8) phrases += "Zap... Bzz..." + if (mood == "sad") phrases += "Bored..." + if (slimes_near) phrases += "Brother..." + if (slimes_near > 1) phrases += "Brothers..." + if (dead_slimes) phrases += "What happened?" + if (!slimes_near) + phrases += "Lonely..." + for (var/M in friends_near) + phrases += "[M]... friend..." + if (nutrition < get_hunger_nutrition()) + phrases += "[M]... feed me..." + say (pick(phrases)) + +/mob/living/carbon/slime/proc/get_max_nutrition() // Can't go above it + if (is_adult) return 1200 + else return 1000 + +/mob/living/carbon/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat + if (is_adult) return 1000 + else return 800 + +/mob/living/carbon/slime/proc/get_hunger_nutrition() // Below it we will always eat + if (is_adult) return 600 + else return 500 + +/mob/living/carbon/slime/proc/get_starve_nutrition() // Below it we will eat before everything else + if (is_adult) return 300 + else return 200 + +/mob/living/carbon/slime/proc/will_hunt(var/hunger = -1) // Check for being stopped from feeding and chasing + if (hunger == 2 || rabid || attacked) return 1 + if (Leader) return 0 + if (holding_still) return 0 + return 1 diff --git a/code/modules/mob/living/carbon/metroid/login.dm b/code/modules/mob/living/carbon/slime/login.dm similarity index 93% rename from code/modules/mob/living/carbon/metroid/login.dm rename to code/modules/mob/living/carbon/slime/login.dm index 8ca29bf4818..d3ac320f2f4 100644 --- a/code/modules/mob/living/carbon/metroid/login.dm +++ b/code/modules/mob/living/carbon/slime/login.dm @@ -1,4 +1,4 @@ -/mob/living/carbon/slime/Login() - ..() - update_hud() - return +/mob/living/carbon/slime/Login() + ..() + update_hud() + return diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm similarity index 95% rename from code/modules/mob/living/carbon/metroid/powers.dm rename to code/modules/mob/living/carbon/slime/powers.dm index fdbe54a9220..494bb6eb6df 100644 --- a/code/modules/mob/living/carbon/metroid/powers.dm +++ b/code/modules/mob/living/carbon/slime/powers.dm @@ -1,228 +1,228 @@ -/mob/living/carbon/slime/verb/Feed() - set category = "Slime" - set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process." - if(Victim) - Feedstop() - return - - if(stat) - src << "I must be conscious to do this..." - return - - var/list/choices = list() - for(var/mob/living/C in view(1,src)) - if(C!=src && !istype(C,/mob/living/carbon/slime) && Adjacent(C)) - choices += C - - var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices - if(!M) return - if(Adjacent(M)) - - if(!istype(src, /mob/living/carbon/brain)) - if(!istype(M, /mob/living/carbon/slime)) - if(stat != 2) - if(health > -70) - - for(var/mob/living/carbon/slime/met in view()) - if(met.Victim == M && met != src) - src << "The [met.name] is already feeding on this subject..." - return - src << "\blue I have latched onto the subject and begun feeding..." - M << "\red The [src.name] has latched onto your head!" - Feedon(M) - - else - src << "This subject does not have a strong enough life energy..." - else - src << "This subject does not have an edible life energy..." - else - src << "I must not feed on my brothers..." - else - src << "This subject does not have an edible life energy..." - - - -/mob/living/carbon/slime/proc/Feedon(var/mob/living/M) - Victim = M - src.loc = M.loc - canmove = 0 - anchored = 1 - var/lastnut = nutrition - var/fed_succesfully = 0 - if(is_adult) - icon_state = "[colour] adult slime eat" - else - icon_state = "[colour] baby slime eat" - - while(Victim && M.health > -70 && M.stat != DEAD && stat != DEAD) - canmove = 0 - - if(Adjacent(M)) - loc = M.loc - - if(prob(15) && M.client && istype(M, /mob/living/carbon)) - M << "[pick("You can feel your body becoming weak!", \ - "You feel like you're about to die!", \ - "You feel every part of your body screaming in agony!", \ - "A low, rolling pain passes through your body!", \ - "Your body feels as if it's falling apart!", \ - "You feel extremely weak!", \ - "A sharp, deep pain bathes every inch of your body!")]" - - if(istype(M, /mob/living/carbon)) - Victim.adjustCloneLoss(rand(5,6)) - Victim.adjustToxLoss(rand(1,2)) - if(Victim.health <= 0) - Victim.adjustToxLoss(rand(2,4)) - - fed_succesfully = 1 - - else if(istype(M, /mob/living/simple_animal)) - Victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12)) - fed_succesfully = 1 - - else - if(prob(25)) - src << "[pick("This subject is incompatable", \ - "This subject does not have a life energy", "This subject is empty", \ - "I am not satisified", "I can not feed from this subject", \ - "I do not feel nourished", "This subject is not food")]..." - - if(fed_succesfully) - //I have no idea why this is not in handle_nutrition() - nutrition += rand(15,30) - if(nutrition >= lastnut + 50) - if(prob(80)) - lastnut = nutrition - powerlevel++ - if(powerlevel > 10) - powerlevel = 10 - adjustToxLoss(-10) - - //Heal yourself. - adjustOxyLoss(-10) - adjustBruteLoss(-10) - adjustFireLoss(-10) - adjustCloneLoss(-10) - - updatehealth() - if(Victim) - Victim.updatehealth() - - sleep(rand(15,45)) - - else - break - - if(stat == 2) - if(!is_adult) - icon_state = "[colour] baby slime dead" - - else - if(is_adult) - icon_state = "[colour] adult slime" - else - icon_state = "[colour] baby slime" - - canmove = 1 - anchored = 0 - - if(M) - if(M.health <= -70) - M.canmove = 0 - if(!client) - if(Victim && !rabid && !attacked) - if(Victim.LAssailant && Victim.LAssailant != Victim) - if(prob(50)) - if(!(Victim.LAssailant in Friends)) - Friends[Victim.LAssailant] = 1 - //Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator - else - ++Friends[Victim.LAssailant] - - - if(M.client && istype(src, /mob/living/carbon/human)) - if(prob(85)) - rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU - - if(client) src << "This subject does not have a strong enough life energy anymore..." - else - M.canmove = 1 - - if(client) src << "I have stopped feeding..." - else - if(client) src << "I have stopped feeding..." - - Victim = null - -/mob/living/carbon/slime/proc/Feedstop() - if(Victim) - if(Victim.client) Victim << "[src] has let go of your head!" - Victim = null - -/mob/living/carbon/slime/proc/UpdateFeed(var/mob/M) - if(Victim) - if(Victim == M) - loc = M.loc // simple "attach to head" effect! - - -/mob/living/carbon/slime/verb/Evolve() - set category = "Slime" - set desc = "This will let you evolve from baby to adult slime." - - if(stat) - src << "I must be conscious to do this..." - return - if(!is_adult) - if(amount_grown >= 10) - is_adult = 1 - maxHealth = 200 - amount_grown = 0 - regenerate_icons() - name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])") - else - src << "I am not ready to evolve yet..." - else - src << "I have already evolved..." - -/mob/living/carbon/slime/verb/Reproduce() - set category = "Slime" - set desc = "This will make you split into four Slimes." - - if(stat) - src << "I must be conscious to do this..." - return - - if(is_adult) - if(amount_grown >= 10) - if(stat) - src << "I must be conscious to do this..." - return - - var/list/babies = list() - var/new_nutrition = round(nutrition * 0.9) - var/new_powerlevel = round(powerlevel / 4) - for(var/i=1,i<=4,i++) - var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc) - if(prob(mutation_chance)) - M.colour = slime_mutation[rand(1,4)] - else - M.colour = colour - if(ckey) M.nutrition = new_nutrition //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! - M.powerlevel = new_powerlevel - if(i != 1) step_away(M,src) - M.Friends = Friends.Copy() - babies += M - feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]") - - var/mob/living/carbon/slime/new_slime = pick(babies) - new_slime.universal_speak = universal_speak - if(src.mind) - src.mind.transfer_to(new_slime) - else - new_slime.key = src.key - qdel(src) - else - src << "I am not ready to reproduce yet..." - else +/mob/living/carbon/slime/verb/Feed() + set category = "Slime" + set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process." + if(Victim) + Feedstop() + return + + if(stat) + src << "I must be conscious to do this..." + return + + var/list/choices = list() + for(var/mob/living/C in view(1,src)) + if(C!=src && !istype(C,/mob/living/carbon/slime) && Adjacent(C)) + choices += C + + var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices + if(!M) return + if(Adjacent(M)) + + if(!istype(src, /mob/living/carbon/brain)) + if(!istype(M, /mob/living/carbon/slime)) + if(stat != 2) + if(health > -70) + + for(var/mob/living/carbon/slime/met in view()) + if(met.Victim == M && met != src) + src << "The [met.name] is already feeding on this subject..." + return + src << "\blue I have latched onto the subject and begun feeding..." + M << "\red The [src.name] has latched onto your head!" + Feedon(M) + + else + src << "This subject does not have a strong enough life energy..." + else + src << "This subject does not have an edible life energy..." + else + src << "I must not feed on my brothers..." + else + src << "This subject does not have an edible life energy..." + + + +/mob/living/carbon/slime/proc/Feedon(var/mob/living/M) + Victim = M + src.loc = M.loc + canmove = 0 + anchored = 1 + var/lastnut = nutrition + var/fed_succesfully = 0 + if(is_adult) + icon_state = "[colour] adult slime eat" + else + icon_state = "[colour] baby slime eat" + + while(Victim && M.health > -70 && M.stat != DEAD && stat != DEAD) + canmove = 0 + + if(Adjacent(M)) + loc = M.loc + + if(prob(15) && M.client && istype(M, /mob/living/carbon)) + M << "[pick("You can feel your body becoming weak!", \ + "You feel like you're about to die!", \ + "You feel every part of your body screaming in agony!", \ + "A low, rolling pain passes through your body!", \ + "Your body feels as if it's falling apart!", \ + "You feel extremely weak!", \ + "A sharp, deep pain bathes every inch of your body!")]" + + if(istype(M, /mob/living/carbon)) + Victim.adjustCloneLoss(rand(5,6)) + Victim.adjustToxLoss(rand(1,2)) + if(Victim.health <= 0) + Victim.adjustToxLoss(rand(2,4)) + + fed_succesfully = 1 + + else if(istype(M, /mob/living/simple_animal)) + Victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12)) + fed_succesfully = 1 + + else + if(prob(25)) + src << "[pick("This subject is incompatable", \ + "This subject does not have a life energy", "This subject is empty", \ + "I am not satisified", "I can not feed from this subject", \ + "I do not feel nourished", "This subject is not food")]..." + + if(fed_succesfully) + //I have no idea why this is not in handle_nutrition() + nutrition += rand(15,30) + if(nutrition >= lastnut + 50) + if(prob(80)) + lastnut = nutrition + powerlevel++ + if(powerlevel > 10) + powerlevel = 10 + adjustToxLoss(-10) + + //Heal yourself. + adjustOxyLoss(-10) + adjustBruteLoss(-10) + adjustFireLoss(-10) + adjustCloneLoss(-10) + + updatehealth() + if(Victim) + Victim.updatehealth() + + sleep(rand(15,45)) + + else + break + + if(stat == 2) + if(!is_adult) + icon_state = "[colour] baby slime dead" + + else + if(is_adult) + icon_state = "[colour] adult slime" + else + icon_state = "[colour] baby slime" + + canmove = 1 + anchored = 0 + + if(M) + if(M.health <= -70) + M.canmove = 0 + if(!client) + if(Victim && !rabid && !attacked) + if(Victim.LAssailant && Victim.LAssailant != Victim) + if(prob(50)) + if(!(Victim.LAssailant in Friends)) + Friends[Victim.LAssailant] = 1 + //Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator + else + ++Friends[Victim.LAssailant] + + + if(M.client && istype(src, /mob/living/carbon/human)) + if(prob(85)) + rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU + + if(client) src << "This subject does not have a strong enough life energy anymore..." + else + M.canmove = 1 + + if(client) src << "I have stopped feeding..." + else + if(client) src << "I have stopped feeding..." + + Victim = null + +/mob/living/carbon/slime/proc/Feedstop() + if(Victim) + if(Victim.client) Victim << "[src] has let go of your head!" + Victim = null + +/mob/living/carbon/slime/proc/UpdateFeed(var/mob/M) + if(Victim) + if(Victim == M) + loc = M.loc // simple "attach to head" effect! + + +/mob/living/carbon/slime/verb/Evolve() + set category = "Slime" + set desc = "This will let you evolve from baby to adult slime." + + if(stat) + src << "I must be conscious to do this..." + return + if(!is_adult) + if(amount_grown >= 10) + is_adult = 1 + maxHealth = 200 + amount_grown = 0 + regenerate_icons() + name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])") + else + src << "I am not ready to evolve yet..." + else + src << "I have already evolved..." + +/mob/living/carbon/slime/verb/Reproduce() + set category = "Slime" + set desc = "This will make you split into four Slimes." + + if(stat) + src << "I must be conscious to do this..." + return + + if(is_adult) + if(amount_grown >= 10) + if(stat) + src << "I must be conscious to do this..." + return + + var/list/babies = list() + var/new_nutrition = round(nutrition * 0.9) + var/new_powerlevel = round(powerlevel / 4) + for(var/i=1,i<=4,i++) + var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc) + if(prob(mutation_chance)) + M.colour = slime_mutation[rand(1,4)] + else + M.colour = colour + if(ckey) M.nutrition = new_nutrition //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! + M.powerlevel = new_powerlevel + if(i != 1) step_away(M,src) + M.Friends = Friends.Copy() + babies += M + feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]") + + var/mob/living/carbon/slime/new_slime = pick(babies) + new_slime.universal_speak = universal_speak + if(src.mind) + src.mind.transfer_to(new_slime) + else + new_slime.key = src.key + qdel(src) + else + src << "I am not ready to reproduce yet..." + else src << "I am not old enough to reproduce yet..." \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/say.dm b/code/modules/mob/living/carbon/slime/say.dm similarity index 100% rename from code/modules/mob/living/carbon/metroid/say.dm rename to code/modules/mob/living/carbon/slime/say.dm diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm new file mode 100644 index 00000000000..1e229b853a3 --- /dev/null +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -0,0 +1,576 @@ +/mob/living/carbon/slime + name = "baby slime" + icon = 'icons/mob/slimes.dmi' + icon_state = "grey baby slime" + pass_flags = PASSTABLE + ventcrawler = 2 + speak_emote = list("telepathically chirps") + + layer = 5 + + maxHealth = 150 + health = 150 + gender = NEUTER + + update_icon = 0 + nutrition = 700 + + see_in_dark = 8 + update_slimes = 0 + + // canstun and canweaken don't affect slimes because they ignore stun and weakened variables + // for the sake of cleanliness, though, here they are. + status_flags = CANPARALYSE|CANPUSH + + var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside + var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35 + + var/powerlevel = 0 // 1-10 controls how much electricity they are generating + var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces + + var/number = 0 // Used to understand when someone is talking to it + + var/mob/living/Victim = null // the person the slime is currently feeding on + var/mob/living/Target = null // AI variable - tells the slime to hunt this down + var/mob/living/Leader = null // AI variable - tells the slime to follow this person + + var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable + var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with + var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place + var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target + + var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting + + var/list/speech_buffer = list() // Last phrase said near it and person who said it + + var/mood = "" // To show its face + var/is_adult = 0 + + var/core_removal_stage = 0 //For removing cores. + + ///////////TIME FOR SUBSPECIES + + var/colour = "grey" + var/coretype = /obj/item/slime_extract/grey + var/list/slime_mutation[4] + +/mob/living/carbon/slime/New() + create_reagents(100) + spawn (0) + number = rand(1, 1000) + name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" + icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" + real_name = name + slime_mutation = mutation_table(colour) + mutation_chance = rand(25, 35) + var/sanitizedcolour = replacetext(colour, " ", "") + coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") + ..() + +/mob/living/carbon/slime/regenerate_icons() + icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" + overlays.len = 0 + if (mood) + overlays += image('icons/mob/slimes.dmi', icon_state = "aslime-[mood]") + ..() + +/mob/living/carbon/slime/movement_delay() + if (bodytemperature >= 330.23) // 135 F + return -1 // slimes become supercharged at high temperatures + + var/tally = 0 + + var/health_deficiency = (100 - health) + if(health_deficiency >= 45) tally += (health_deficiency / 25) + + if (bodytemperature < 183.222) + tally += (283.222 - bodytemperature) / 10 * 1.75 + + if(reagents) + if(reagents.has_reagent("methamphetamine")) // Meth slows slimes down + tally *= 2 + + if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow + tally *= 5 + + if(health <= 0) // if damaged, the slime moves twice as slow + tally *= 2 + + return tally + config.slime_delay + +/mob/living/carbon/slime/Bump(atom/movable/AM as mob|obj, yes) + if ((!(yes) || now_pushing)) + return + now_pushing = 1 + + if(isobj(AM)) + if(!client && powerlevel > 0) + var/probab = 10 + switch(powerlevel) + if(1 to 2) probab = 20 + if(3 to 4) probab = 30 + if(5 to 6) probab = 40 + if(7 to 8) probab = 60 + if(9) probab = 70 + if(10) probab = 95 + if(prob(probab)) + if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille)) + if(nutrition <= get_hunger_nutrition() && !Atkcool) + if (is_adult || prob(5)) + AM.attack_slime(src) + spawn() + Atkcool = 1 + sleep(45) + Atkcool = 0 + + if(ismob(AM)) + var/mob/tmob = AM + + if(is_adult) + if(istype(tmob, /mob/living/carbon/human)) + if(prob(90)) + now_pushing = 0 + return + else + if(istype(tmob, /mob/living/carbon/human)) + now_pushing = 0 + return + + now_pushing = 0 + ..() + if (!istype(AM, /atom/movable)) + return + if (!( now_pushing )) + now_pushing = 1 + if (!( AM.anchored )) + var/t = get_dir(src, AM) + if (istype(AM, /obj/structure/window)) + if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST) + for(var/obj/structure/window/win in get_step(AM,t)) + now_pushing = 0 + return + step(AM, t) + now_pushing = null + +/mob/living/carbon/slime/Process_Spacemove(var/movement_dir = 0) + return 2 + +/mob/living/carbon/slime/Stat() + ..() + + statpanel("Status") + if(is_adult) + stat(null, "Health: [round((health / 200) * 100)]%") + else + stat(null, "Health: [round((health / 150) * 100)]%") + + if (client.statpanel == "Status") + stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]") + if(amount_grown >= 10) + if(is_adult) + stat(null, "You can reproduce!") + else + stat(null, "You can evolve!") + + stat(null,"Power Level: [powerlevel]") + +/mob/living/carbon/slime/adjustFireLoss(amount) + ..(-abs(amount)) // Heals them + return + +/mob/living/carbon/slime/bullet_act(var/obj/item/projectile/Proj) + attacked += 10 + ..(Proj) + return 0 + +/mob/living/carbon/slime/emp_act(severity) + powerlevel = 0 // oh no, the power! + ..() + +/mob/living/carbon/slime/ex_act(severity) + ..() + + var/b_loss = null + var/f_loss = null + switch (severity) + if (1.0) + qdel(src) + return + + if (2.0) + + b_loss += 60 + f_loss += 60 + + + if(3.0) + b_loss += 30 + + adjustBruteLoss(b_loss) + adjustFireLoss(f_loss) + + updatehealth() + + +/mob/living/carbon/slime/blob_act() + show_message(" The blob attacks you!") + adjustBruteLoss(20) + updatehealth() + return + + +/mob/living/carbon/slime/unEquip(obj/item/W as obj) + return + +/mob/living/carbon/slime/attack_ui(slot) + return + +/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob) + if (!ticker) + M << "You cannot attack people before the game has started." + return + + if (Victim) return // can't attack while eating! + + if (health > -100) + + M.do_attack_animation(src) + visible_message(" The [M.name] has glomped [src]!", \ + " The [M.name] has glomped [src]!") + var/damage = rand(1, 3) + attacked += 5 + + if(M.is_adult) + damage = rand(1, 6) + else + damage = rand(1, 3) + + adjustBruteLoss(damage) + + updatehealth() + return + +/mob/living/carbon/slime/attack_animal(mob/living/simple_animal/M as mob) + if(M.melee_damage_upper == 0) + M.custom_emote(1, "[M.friendly] [src]") + else + M.do_attack_animation(src) + if(M.attack_sound) + playsound(loc, M.attack_sound, 50, 1, 1) + visible_message("[M] [M.attacktext] [src]!", \ + "[M] [M.attacktext] [src]!") + M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])") + src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])") + var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) + attacked += 10 + adjustBruteLoss(damage) + updatehealth() + +/mob/living/carbon/slime/attack_larva(mob/living/carbon/alien/larva/L as mob) + + switch(L.a_intent) + + if(I_HELP) + visible_message("[L] rubs its head against [src].") + + + else + L.do_attack_animation(src) + attacked += 10 + visible_message("[L] bites [src]!", \ + "[L] bites [src]!") + playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) + + if(stat != DEAD) + var/damage = rand(1, 3) + L.amount_grown = min(L.amount_grown + damage, L.max_grown) + adjustBruteLoss(damage) + +/mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M as mob) + if (!ticker) + M << "You cannot attack people before the game has started." + return + + if (istype(loc, /turf) && istype(loc.loc, /area/start)) + M << "No attacking people at spawn, you jackass." + return + + ..() + + if(Victim) + if(Victim == M) + if(prob(60)) + visible_message("[M] attempts to wrestle \the [name] off!") + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + + else + visible_message(" [M] manages to wrestle \the [name] off!") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + + if(prob(90) && !client) + Discipline++ + + spawn() + SStun = 1 + sleep(rand(45,60)) + if(src) + SStun = 0 + + Victim = null + anchored = 0 + step_away(src,M) + + return + + else + if(prob(30)) + visible_message("[M] attempts to wrestle \the [name] off of [Victim]!") + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + + else + visible_message(" [M] manages to wrestle \the [name] off of [Victim]!") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + + if(prob(80) && !client) + Discipline++ + + if(!is_adult) + if(Discipline == 1) + attacked = 0 + + spawn() + SStun = 1 + sleep(rand(55,65)) + if(src) + SStun = 0 + + Victim = null + anchored = 0 + step_away(src,M) + + return + +/* + if(M.gloves && istype(M.gloves,/obj/item/clothing/gloves)) + var/obj/item/clothing/gloves/G = M.gloves + if(G.cell) + if(M.a_intent == "hurt")//Stungloves. Any contact will stun the alien. + if(G.cell.charge >= 2500) + G.cell.use(2500) + visible_message("[src] has been touched with the stun gloves by [M]!") + return + else + M << "\red Not enough charge! " + return +*/ + + switch(M.a_intent) + + if (I_HELP) + help_shake_act(M) + + if (I_GRAB) + grabbedby(M) + + else + M.do_attack_animation(src) + var/damage = rand(1, 9) + + attacked += 10 + if (prob(90)) + if (HULK in M.mutations) + damage += 5 + if(Victim || Target) + Victim = null + Target = null + anchored = 0 + if(prob(80) && !client) + Discipline++ + spawn(0) + + step_away(src,M,15) + sleep(3) + step_away(src,M,15) + + + playsound(loc, "punch", 25, 1, -1) + visible_message("[M] has punched [src]!", \ + "[M] has punched [src]!") + + adjustBruteLoss(damage) + updatehealth() + else + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + visible_message("[M] has attempted to punch [src]!") + return + + + +/mob/living/carbon/slime/attack_alien(mob/living/carbon/alien/humanoid/M as mob) + if (!ticker) + M << "You cannot attack people before the game has started." + return + + if (istype(loc, /turf) && istype(loc.loc, /area/start)) + M << "No attacking people at spawn, you jackass." + return + + switch(M.a_intent) + if (I_HELP) + visible_message("[M] caresses [src] with its scythe like arm.") + + if (I_HARM) + M.do_attack_animation(src) + if (prob(95)) + attacked += 10 + playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) + var/damage = rand(15, 30) + if (damage >= 25) + damage = rand(20, 40) + visible_message("[M] has attacked [name]!", \ + "[M] has attacked [name]!") + else + visible_message("[M] has wounded [name]!", \ + ")[M] has wounded [name]!") + adjustBruteLoss(damage) + updatehealth() + else + playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) + visible_message("[M] has attempted to lunge at [name]!", \ + "[M] has attempted to lunge at [name]!") + + if (I_GRAB) + grabbedby(M) + + if (I_DISARM) + M.do_attack_animation(src) + playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) + var/damage = 5 + attacked += 10 + + if(prob(95)) + visible_message("[M] has tackled [name]!", \ + "[M] has tackled [name]!") + + if(Victim || Target) + Victim = null + Target = null + anchored = 0 + if(prob(80) && !client) + Discipline++ + if(!istype(src, /mob/living/carbon/slime)) + if(Discipline == 1) + attacked = 0 + + spawn() + SStun = 1 + sleep(rand(5,20)) + SStun = 0 + + spawn(0) + + step_away(src,M,15) + sleep(3) + step_away(src,M,15) + + else + drop_item() + visible_message("[M] has disarmed [name]!", + "[M] has disarmed [name]!") + adjustBruteLoss(damage) + updatehealth() + return + +/mob/living/carbon/slime/attackby(obj/item/W, mob/user, params) + if(istype(W,/obj/item/stack/sheet/mineral/plasma)) //Lets you feed slimes plasma. + if (user in Friends) + ++Friends[user] + else + Friends[user] = 1 + user << "You feed the slime the plasma. It chirps happily." + var/obj/item/stack/sheet/mineral/plasma/S = W + S.use(1) + return + else if(W.force > 0) + attacked += 10 + if(prob(25)) + user << "[W] passes right through [src]!" + return + if(Discipline && prob(50)) // wow, buddy, why am I getting attacked?? + Discipline = 0 + else if(W.force >= 3) + if(is_adult) + if(prob(5 + round(W.force/2))) + if(Victim || Target) + if(prob(80) && !client) + Discipline++ + + Victim = null + Target = null + anchored = 0 + + spawn() + SStun = 1 + sleep(rand(5,20)) + SStun = 0 + + spawn(0) + if(user) + canmove = 0 + step_away(src, user) + if(prob(25 + W.force)) + sleep(2) + if(user) + step_away(src, user) + canmove = 1 + + else + if(prob(10 + W.force*2)) + if(Victim || Target) + if(prob(80) && !client) + Discipline++ + if(Discipline == 1) + attacked = 0 + spawn() + SStun = 1 + sleep(rand(5,20)) + SStun = 0 + + Victim = null + Target = null + anchored = 0 + + spawn(0) + if(user) + canmove = 0 + step_away(src, user) + if(prob(25 + W.force*4)) + sleep(2) + if(user) + step_away(src, user) + canmove = 1 + ..() + +/mob/living/carbon/slime/restrained() + return 0 + +mob/living/carbon/slime/var/temperature_resistance = T0C+75 + +/mob/living/carbon/slime/show_inv(mob/user) + return + +/mob/living/carbon/slime/toggle_throw_mode() + return + +/mob/living/carbon/slime/proc/apply_water() + adjustToxLoss(rand(15,20)) + if (!client) + if (Target) // Like cats + Target = null + ++Discipline + return + +/mob/living/carbon/slime/can_use_vents() + if(Victim) + return "You cannot ventcrawl while feeding." + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/subtypes.dm b/code/modules/mob/living/carbon/slime/subtypes.dm similarity index 95% rename from code/modules/mob/living/carbon/metroid/subtypes.dm rename to code/modules/mob/living/carbon/slime/subtypes.dm index 3b7e0107abb..35d38e31a48 100644 --- a/code/modules/mob/living/carbon/metroid/subtypes.dm +++ b/code/modules/mob/living/carbon/slime/subtypes.dm @@ -1,79 +1,79 @@ -proc/mutation_table(var/colour) - var/list/slime_mutation[4] - switch(colour) - //Tier 1 - if("grey") - slime_mutation[1] = "orange" - slime_mutation[2] = "metal" - slime_mutation[3] = "blue" - slime_mutation[4] = "purple" - //Tier 2 - if("purple") - slime_mutation[1] = "dark purple" - slime_mutation[2] = "dark blue" - slime_mutation[3] = "green" - slime_mutation[4] = "green" - if("metal") - slime_mutation[1] = "silver" - slime_mutation[2] = "yellow" - slime_mutation[3] = "gold" - slime_mutation[4] = "gold" - if("orange") - slime_mutation[1] = "dark purple" - slime_mutation[2] = "yellow" - slime_mutation[3] = "red" - slime_mutation[4] = "red" - if("blue") - slime_mutation[1] = "dark blue" - slime_mutation[2] = "silver" - slime_mutation[3] = "pink" - slime_mutation[4] = "pink" - //Tier 3 - if("dark blue") - slime_mutation[1] = "purple" - slime_mutation[2] = "blue" - slime_mutation[3] = "cerulean" - slime_mutation[4] = "cerulean" - if("dark purple") - slime_mutation[1] = "purple" - slime_mutation[2] = "orange" - slime_mutation[3] = "sepia" - slime_mutation[4] = "sepia" - if("yellow") - slime_mutation[1] = "metal" - slime_mutation[2] = "orange" - slime_mutation[3] = "bluespace" - slime_mutation[4] = "bluespace" - if("silver") - slime_mutation[1] = "metal" - slime_mutation[2] = "blue" - slime_mutation[3] = "pyrite" - slime_mutation[4] = "pyrite" - //Tier 4 - if("pink") - slime_mutation[1] = "pink" - slime_mutation[2] = "pink" - slime_mutation[3] = "light pink" - slime_mutation[4] = "light pink" - if("red") - slime_mutation[1] = "red" - slime_mutation[2] = "red" - slime_mutation[3] = "oil" - slime_mutation[4] = "oil" - if("gold") - slime_mutation[1] = "gold" - slime_mutation[2] = "gold" - slime_mutation[3] = "adamantine" - slime_mutation[4] = "adamantine" - if("green") - slime_mutation[1] = "green" - slime_mutation[2] = "green" - slime_mutation[3] = "black" - slime_mutation[4] = "black" - // Tier 5 - else - slime_mutation[1] = colour - slime_mutation[2] = colour - slime_mutation[3] = colour - slime_mutation[4] = colour +proc/mutation_table(var/colour) + var/list/slime_mutation[4] + switch(colour) + //Tier 1 + if("grey") + slime_mutation[1] = "orange" + slime_mutation[2] = "metal" + slime_mutation[3] = "blue" + slime_mutation[4] = "purple" + //Tier 2 + if("purple") + slime_mutation[1] = "dark purple" + slime_mutation[2] = "dark blue" + slime_mutation[3] = "green" + slime_mutation[4] = "green" + if("metal") + slime_mutation[1] = "silver" + slime_mutation[2] = "yellow" + slime_mutation[3] = "gold" + slime_mutation[4] = "gold" + if("orange") + slime_mutation[1] = "dark purple" + slime_mutation[2] = "yellow" + slime_mutation[3] = "red" + slime_mutation[4] = "red" + if("blue") + slime_mutation[1] = "dark blue" + slime_mutation[2] = "silver" + slime_mutation[3] = "pink" + slime_mutation[4] = "pink" + //Tier 3 + if("dark blue") + slime_mutation[1] = "purple" + slime_mutation[2] = "blue" + slime_mutation[3] = "cerulean" + slime_mutation[4] = "cerulean" + if("dark purple") + slime_mutation[1] = "purple" + slime_mutation[2] = "orange" + slime_mutation[3] = "sepia" + slime_mutation[4] = "sepia" + if("yellow") + slime_mutation[1] = "metal" + slime_mutation[2] = "orange" + slime_mutation[3] = "bluespace" + slime_mutation[4] = "bluespace" + if("silver") + slime_mutation[1] = "metal" + slime_mutation[2] = "blue" + slime_mutation[3] = "pyrite" + slime_mutation[4] = "pyrite" + //Tier 4 + if("pink") + slime_mutation[1] = "pink" + slime_mutation[2] = "pink" + slime_mutation[3] = "light pink" + slime_mutation[4] = "light pink" + if("red") + slime_mutation[1] = "red" + slime_mutation[2] = "red" + slime_mutation[3] = "oil" + slime_mutation[4] = "oil" + if("gold") + slime_mutation[1] = "gold" + slime_mutation[2] = "gold" + slime_mutation[3] = "adamantine" + slime_mutation[4] = "adamantine" + if("green") + slime_mutation[1] = "green" + slime_mutation[2] = "green" + slime_mutation[3] = "black" + slime_mutation[4] = "black" + // Tier 5 + else + slime_mutation[1] = colour + slime_mutation[2] = colour + slime_mutation[3] = colour + slime_mutation[4] = colour return(slime_mutation) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/update_icons.dm b/code/modules/mob/living/carbon/slime/update_icons.dm similarity index 96% rename from code/modules/mob/living/carbon/metroid/update_icons.dm rename to code/modules/mob/living/carbon/slime/update_icons.dm index 8902770055d..2310f32a76e 100644 --- a/code/modules/mob/living/carbon/metroid/update_icons.dm +++ b/code/modules/mob/living/carbon/slime/update_icons.dm @@ -1 +1 @@ -//no special icon processing +//no special icon processing diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm new file mode 100644 index 00000000000..a0df8e2740a --- /dev/null +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -0,0 +1,474 @@ + +/// Slime Extracts /// + +/obj/item/slime_extract + name = "slime extract" + desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"." + icon = 'icons/mob/slimes.dmi' + icon_state = "grey slime extract" + force = 1.0 + w_class = 1.0 + throwforce = 0 + throw_speed = 3 + throw_range = 6 + origin_tech = "biotech=4" + item_color = "grey" + var/Uses = 1 // uses before it goes inert + var/enhanced = 0 //has it been enhanced before? + + attackby(obj/item/O as obj, mob/user as mob, params) + if(istype(O, /obj/item/weapon/slimesteroid2)) + if(enhanced == 1) + user << " This extract has already been enhanced!" + return ..() + if(Uses == 0) + user << " You can't enhance a used extract!" + return ..() + user <<"You apply the enhancer. It now has triple the amount of uses." + Uses = 3 + enhanced = 1 + qdel(O) + if(istype(O,/obj/item/weapon/storage/bag)) + ..() + +/obj/item/slime_extract/New() + ..() + create_reagents(100) + + +/obj/item/slime_extract/grey + name = "grey slime extract" + icon_state = "grey slime extract" + item_color = "grey" + +/obj/item/slime_extract/gold + name = "gold slime extract" + icon_state = "gold slime extract" + item_color = "gold" + +/obj/item/slime_extract/silver + name = "silver slime extract" + icon_state = "silver slime extract" + item_color = "silver" + +/obj/item/slime_extract/metal + name = "metal slime extract" + icon_state = "metal slime extract" + item_color = "metal" + +/obj/item/slime_extract/purple + name = "purple slime extract" + icon_state = "purple slime extract" + item_color = "purple" + +/obj/item/slime_extract/darkpurple + name = "dark purple slime extract" + icon_state = "dark purple slime extract" + item_color = "darkpurple" + +/obj/item/slime_extract/orange + name = "orange slime extract" + icon_state = "orange slime extract" + item_color = "orange" + +/obj/item/slime_extract/yellow + name = "yellow slime extract" + icon_state = "yellow slime extract" + item_color = "yellow" + +/obj/item/slime_extract/red + name = "red slime extract" + icon_state = "red slime extract" + item_color = "red" + +/obj/item/slime_extract/blue + name = "blue slime extract" + icon_state = "blue slime extract" + item_color = "blue" + +/obj/item/slime_extract/darkblue + name = "dark blue slime extract" + icon_state = "dark blue slime extract" + item_color = "darkblue" + +/obj/item/slime_extract/pink + name = "pink slime extract" + icon_state = "pink slime extract" + item_color = "pink" + +/obj/item/slime_extract/green + name = "green slime extract" + icon_state = "green slime extract" + item_color = "green" + +/obj/item/slime_extract/lightpink + name = "light pink slime extract" + icon_state = "light pink slime extract" + item_color = "lightpink" + +/obj/item/slime_extract/black + name = "black slime extract" + icon_state = "black slime extract" + item_color = "black" + +/obj/item/slime_extract/oil + name = "oil slime extract" + icon_state = "oil slime extract" + item_color = "oil" + +/obj/item/slime_extract/adamantine + name = "adamantine slime extract" + icon_state = "adamantine slime extract" + item_color = "adamantine" + +/obj/item/slime_extract/bluespace + name = "bluespace slime extract" + icon_state = "bluespace slime extract" + +/obj/item/slime_extract/pyrite + name = "pyrite slime extract" + icon_state = "pyrite slime extract" + +/obj/item/slime_extract/cerulean + name = "cerulean slime extract" + icon_state = "cerulean slime extract" + +/obj/item/slime_extract/sepia + name = "sepia slime extract" + icon_state = "sepia slime extract" + +/obj/item/slime_extract/rainbow + name = "rainbow slime extract" + icon_state = "rainbow slime extract" + +////Pet Slime Creation/// + +/obj/item/weapon/slimepotion + name = "docility potion" + desc = "A potent chemical mix that will nullify a slime's powers, causing it to become docile and tame." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle19" + w_class = 1 + origin_tech = "biotech=4" + + attack(mob/living/carbon/slime/M as mob, mob/user as mob) + if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. + user << " The potion only works on slimes!" + return ..() + if(M.stat) + user << " The slime is dead!" + return..() + if(M.mind) + user << " The slime resists!" + return ..() + if(M.is_adult) + var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc) + pet.icon_state = "[M.colour] adult slime" + pet.icon_living = "[M.colour] adult slime" + pet.icon_dead = "[M.colour] baby slime dead" + pet.colour = "[M.colour]" + qdel(M) + var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) + + if (!newname) + newname = "pet slime" + pet.name = newname + pet.real_name = newname + qdel(src) + else + var/mob/living/simple_animal/slime/pet = new /mob/living/simple_animal/slime(M.loc) + pet.icon_state = "[M.colour] baby slime" + pet.icon_living = "[M.colour] baby slime" + pet.icon_dead = "[M.colour] baby slime dead" + pet.colour = "[M.colour]" + qdel(M) + var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN)) + + if (!newname) + newname = "pet slime" + pet.name = newname + pet.real_name = newname + qdel(src) + user <<"You feed the slime the potion, removing it's powers and calming it." + +/obj/item/weapon/sentience_potion + name = "sentience potion" + desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels. Unlike normal slime potions, it can be absorbed by any nonsentient being." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle19" + origin_tech = "biotech=5" + var/list/not_interested = list() + var/being_used = 0 + w_class = 1 + + +/obj/item/weapon/sentience_potion/afterattack(mob/living/M, mob/user) + if(being_used || !ismob(M)) + return + if(!isslime(M) && !isanimal(M) || M.ckey) //only works on animals that aren't player controlled + user << "[M] is already too intelligent for this to work!" + return ..() + if(M.stat) + user << "[M] is dead!" + return..() + + user << "You offer the sentience potion to [M]..." + being_used = 1 + + var/list/candidates = get_candidates(ROLE_SENTIENT, ALIEN_AFK_BRACKET) + + shuffle(candidates) + + var/time_passed = world.time + var/list/consenting_candidates = list() + + for(var/candidate in candidates) + + if(candidate in not_interested) + continue + + spawn(0) + switch(alert(candidate, "Would you like to play as [M.name]? Please choose quickly!","Confirmation","Yes","No")) + if("Yes") + if((world.time-time_passed)>=50 || !src) + return + consenting_candidates += candidate + if("No") + if(!src) + return + not_interested += candidate + + sleep(50) + + if(!src) + return + + listclearnulls(consenting_candidates) //some candidates might have left during sleep(50) + + if(consenting_candidates.len) + var/client/C = null + C = pick(consenting_candidates) + M.key = C.key + M.universal_speak = 1 + M.faction |= "sentient" + M << "All at once it makes sense: you know what you are and who you are! Self awareness is yours!" + M << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost." + user << "[M] accepts the potion and suddenly becomes attentive and aware. It worked!" + if(isanimal(M)) + var/mob/living/simple_animal/S = M + S.master_commander = user + qdel(src) + else + user << "[M] looks interested for a moment, but then looks back down. Maybe you should try again later." + being_used = 0 + ..() + + +/obj/item/weapon/slimesteroid + name = "slime steroid" + desc = "A potent chemical mix that will cause a slime to generate more extract." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle16" + w_class = 1 + origin_tech = "biotech=4" + + + attack(mob/living/carbon/slime/M as mob, mob/user as mob) + if(!istype(M, /mob/living/carbon/slime))//If target is not a slime. + user << " The steroid only works on baby slimes!" + return ..() + if(M.is_adult) //Can't tame adults + user << " Only baby slimes can use the steroid!" + return..() + if(M.stat) + user << " The slime is dead!" + return..() + if(M.cores == 3) + user <<" The slime already has the maximum amount of extract!" + return..() + + user <<"You feed the slime the steroid. It now has triple the amount of extract." + M.cores = 3 + qdel(src) + +/obj/item/weapon/slimesteroid2 + name = "extract enhancer" + desc = "A potent chemical mix that will give a slime extract three uses." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle17" + w_class = 1 + origin_tech = "biotech=4" + + +/obj/item/weapon/slimespeed + name = "slime speed potion" + desc = "A potent chemical mix that will remove the slowdown from any item." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle3" + w_class = 1 + origin_tech = "biotech=4" + +/obj/item/weapon/slimespeed/afterattack(obj/item/C, mob/user) + ..() + if(!istype(C)) + user << "The potion can only be used on items!" + return + if(C.slowdown <= 0) + user << "The [C] can't be made any faster!" + return..() + user <<"You slather the red gunk over the [C], making it faster." + C.color = "#FF0000" + C.slowdown = 0 + qdel(src) + +/obj/item/weapon/slimefireproof + name = "slime chill potion" + desc = "A potent chemical mix that will fireproof any article of clothing. Has three uses." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle17" + var/uses = 3 + w_class = 1 + origin_tech = "biotech=4" + + +/obj/item/weapon/slimefireproof/afterattack(obj/item/clothing/C, mob/user) + ..() + if(!uses) + qdel(src) + return + if(!istype(C)) + user << "The potion can only be used on clothing!" + return + if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) + user << "The [C] is already fireproof!" + return..() + user <<"You slather the blue gunk over the [C], fireproofing it." + C.name = "fireproofed [C.name]" + C.color = "#000080" + C.max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT + C.heat_protection = C.body_parts_covered + uses -- + if(!uses) + qdel(src) + +/obj/item/stack/tile/bluespace + name = "bluespace floor tile" + singular_name = "floor tile" + desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds." + icon_state = "tile-bluespace" + w_class = 3 + force = 6 + materials = list(MAT_METAL=500) + throwforce = 10 + throw_speed = 3 + throw_range = 7 + flags = CONDUCT + max_amount = 60 + turf_type = /turf/simulated/floor/bluespace + + +/turf/simulated/floor/bluespace + slowdown = -1 + icon_state = "bluespace" + desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds." + floor_tile = /obj/item/stack/tile/bluespace + + +/obj/item/stack/tile/sepia + name = "sepia floor tile" + singular_name = "floor tile" + desc = "Time seems to flow very slowly around these tiles." + icon_state = "tile-sepia" + w_class = 3 + force = 6 + materials = list(MAT_METAL=500) + throwforce = 10 + throw_speed = 3 + throw_range = 7 + flags = CONDUCT + max_amount = 60 + turf_type = /turf/simulated/floor/sepia + + +/turf/simulated/floor/sepia + slowdown = 2 + icon_state = "sepia" + desc = "Time seems to flow very slowly around these tiles." + floor_tile = /obj/item/stack/tile/sepia + +/obj/effect/goleRUNe + anchored = 1 + desc = "a strange rune used to create golems. It glows when spirits are nearby." + name = "rune" + icon = 'icons/obj/rune.dmi' + icon_state = "golem" + unacidable = 1 + layer = TURF_LAYER + var/list/mob/dead/observer/ghosts[0] + + New() + ..() + processing_objects.Add(src) + + process() + if(ghosts.len>0) + icon_state = "golem2" + else + icon_state = "golem" + + attack_hand(mob/living/user as mob) + var/mob/dead/observer/ghost + for(var/mob/dead/observer/O in src.loc) + if(!check_observer(O)) + O << "\red You are not eligible to become a golem." + continue + ghost = O + break + if(!ghost) + user << "The rune fizzles uselessly. There is no spirit nearby." + return + var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem + if(prob(50)) G.gender = "female" + G.loc = src.loc + G.key = ghost.key + G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost." + qdel(src) + + + proc/announce_to_ghosts() + for(var/mob/dead/observer/O in player_list) + if(O.client) + var/area/A = get_area(src) + if(A) + O << "\blue Golem rune created in [A.name]. (Teleport | Sign Up)" + + Topic(href,href_list) + if("signup" in href_list) + var/mob/dead/observer/O = locate(href_list["signup"]) + volunteer(O) + + attack_ghost(var/mob/dead/observer/O) + if(!O) return + volunteer(O) + + proc/check_observer(var/mob/dead/observer/O) + if(!O) + return 0 + if(!O.client) + return 0 + if(O.mind && O.mind.current && O.mind.current.stat != DEAD) + return 0 + if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted) + return 0 + return 1 + + proc/volunteer(var/mob/dead/observer/O) + if(O in ghosts) + ghosts.Remove(O) + O << "\red You are no longer signed up to be a golem." + else + if(!check_observer(O)) + O << "\red You are not eligible to become a golem." + return + ghosts.Add(O) + O << "\blue You are signed up to be a golem." \ No newline at end of file diff --git a/paradise.dme b/paradise.dme index ddc9a9720dd..a5325a0933e 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1380,16 +1380,16 @@ #include "code\modules\mob\living\carbon\human\species\shadow.dm" #include "code\modules\mob\living\carbon\human\species\species.dm" #include "code\modules\mob\living\carbon\human\species\station.dm" -#include "code\modules\mob\living\carbon\metroid\death.dm" -#include "code\modules\mob\living\carbon\metroid\emote.dm" -#include "code\modules\mob\living\carbon\metroid\examine.dm" -#include "code\modules\mob\living\carbon\metroid\life.dm" -#include "code\modules\mob\living\carbon\metroid\login.dm" -#include "code\modules\mob\living\carbon\metroid\metroid.dm" -#include "code\modules\mob\living\carbon\metroid\powers.dm" -#include "code\modules\mob\living\carbon\metroid\say.dm" -#include "code\modules\mob\living\carbon\metroid\subtypes.dm" -#include "code\modules\mob\living\carbon\metroid\update_icons.dm" +#include "code\modules\mob\living\carbon\slime\death.dm" +#include "code\modules\mob\living\carbon\slime\emote.dm" +#include "code\modules\mob\living\carbon\slime\examine.dm" +#include "code\modules\mob\living\carbon\slime\life.dm" +#include "code\modules\mob\living\carbon\slime\login.dm" +#include "code\modules\mob\living\carbon\slime\powers.dm" +#include "code\modules\mob\living\carbon\slime\say.dm" +#include "code\modules\mob\living\carbon\slime\slime.dm" +#include "code\modules\mob\living\carbon\slime\subtypes.dm" +#include "code\modules\mob\living\carbon\slime\update_icons.dm" #include "code\modules\mob\living\silicon\death.dm" #include "code\modules\mob\living\silicon\emote.dm" #include "code\modules\mob\living\silicon\laws.dm" @@ -1818,6 +1818,7 @@ #include "code\modules\research\xenoarchaeology\tools\tools_depthscanner.dm" #include "code\modules\research\xenoarchaeology\tools\tools_locater.dm" #include "code\modules\research\xenoarchaeology\tools\tools_pickaxe.dm" +#include "code\modules\research\xenobiology\xenobiology.dm" #include "code\modules\scripting\Errors.dm" #include "code\modules\scripting\Options.dm" #include "code\modules\scripting\AST\AST Nodes.dm" From 44fe32136680d95fa772d97a8d069ca1be32331a Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Tue, 5 Jan 2016 20:14:10 -0500 Subject: [PATCH 4/4] cleaner --- code/modules/reagents/oldchem/reagents/reagents_water.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm index 1db08c92c7d..eea7dfad6c4 100644 --- a/code/modules/reagents/oldchem/reagents/reagents_water.dm +++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm @@ -100,7 +100,6 @@ if(volume >= 1) if(T) T.color = initial(T.color) - T.overlays.Cut() T.clean_blood() for(var/obj/effect/decal/cleanable/C in src) qdel(C)