Merge branch 'master' into WeedControl

This commit is contained in:
Cyberboss
2017-04-14 09:49:31 -04:00
committed by GitHub
71 changed files with 3771 additions and 628 deletions
@@ -322,10 +322,10 @@
for(var/t in turf_list)
var/turf/open/T = t
if (space_is_all_consuming && !space_in_group && istype(T.air, /datum/gas_mixture/space))
if (space_is_all_consuming && !space_in_group && istype(T.air, /datum/gas_mixture/immutable/space))
space_in_group = 1
qdel(A)
A = new/datum/gas_mixture/space()
A = new/datum/gas_mixture/immutable/space()
A.merge(T.air)
for(var/id in A_gases)
@@ -0,0 +1,81 @@
//"immutable" gas mixture used for immutable calculations
//it can be changed, but any changes will ultimately be undone before they can have any effect
/datum/gas_mixture/immutable
var/initial_temperature
/datum/gas_mixture/immutable/proc/reset_gas_mix()
temperature = initial_temperature
temperature_archived = initial_temperature
/datum/gas_mixture/immutable/New()
..()
reset_gas_mix()
/datum/gas_mixture/immutable/garbage_collect()
reset_gas_mix()
/datum/gas_mixture/immutable/archive()
return 1 //nothing changes, so we do nothing and the archive is successful
/datum/gas_mixture/immutable/merge()
return 0 //we're immutable.
/datum/gas_mixture/immutable/heat_capacity_archived()
return heat_capacity()
/datum/gas_mixture/immutable/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
. = ..(sharer, 0)
reset_gas_mix()
/datum/gas_mixture/immutable/after_share()
temperature = initial_temperature
reset_gas_mix()
/datum/gas_mixture/immutable/react()
return 0 //we're immutable.
/datum/gas_mixture/immutable/copy()
return new type //we're immutable, so we can just return a new instance.
/datum/gas_mixture/immutable/copy_from()
return 0 //we're immutable.
/datum/gas_mixture/immutable/copy_from_turf()
return 0 //we're immutable.
/datum/gas_mixture/immutable/parse_gas_string()
return 0 //we're immutable.
/datum/gas_mixture/immutable/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity)
. = ..()
temperature = initial_temperature
//used by space tiles
/datum/gas_mixture/immutable/space
initial_temperature = TCMB
/datum/gas_mixture/immutable/space/garbage_collect()
gases.Cut() //clever way of ensuring we always are empty.
/datum/gas_mixture/immutable/space/heat_capacity()
return 7000
/datum/gas_mixture/immutable/space/remove()
return copy() //we're always empty, so we can just return a copy.
/datum/gas_mixture/immutable/space/remove_ratio()
return copy() //we're always empty, so we can just return a copy.
//used by cloners
/datum/gas_mixture/immutable/cloner
initial_temperature = T20C
/datum/gas_mixture/immutable/cloner/reset_gas_mix()
assert_gas("n2")
gases["n2"][MOLES] = MOLES_O2STANDARD + MOLES_N2STANDARD
..()
/datum/gas_mixture/immutable/cloner/heat_capacity()
return (MOLES_O2STANDARD + MOLES_N2STANDARD)*20 //specific heat of nitrogen is 20
@@ -1,58 +0,0 @@
//"immutable" gas mixture used for space calculations
//it can be changed, but any changes will ultimately be undone before they can have any effect
/datum/gas_mixture/space
/datum/gas_mixture/space/New()
..()
temperature = TCMB
temperature_archived = TCMB
/datum/gas_mixture/space/garbage_collect()
gases.Cut() //clever way of ensuring we always are empty.
/datum/gas_mixture/space/archive()
return 1 //nothing changes, so we do nothing and the archive is successful
/datum/gas_mixture/space/merge()
return 0 //we're immutable.
/datum/gas_mixture/space/heat_capacity()
. = 7000
/datum/gas_mixture/space/heat_capacity_archived()
. = heat_capacity()
/datum/gas_mixture/space/remove()
return copy() //we're immutable, so we can just return a copy.
/datum/gas_mixture/space/remove_ratio()
return copy() //we're immutable, so we can just return a copy.
/datum/gas_mixture/space/share(datum/gas_mixture/sharer, atmos_adjacent_turfs = 4)
. = ..(sharer, 0)
temperature = TCMB
gases.Cut()
/datum/gas_mixture/space/after_share()
temperature = TCMB
gases.Cut()
/datum/gas_mixture/space/react()
return 0 //we're immutable.
/datum/gas_mixture/space/copy()
return new /datum/gas_mixture/space //we're immutable, so we can just return a new instance.
/datum/gas_mixture/space/copy_from()
return 0 //we're immutable.
/datum/gas_mixture/space/copy_from_turf()
return 0 //we're immutable.
/datum/gas_mixture/space/parse_gas_string()
return 0 //we're immutable.
/datum/gas_mixture/space/temperature_share(datum/gas_mixture/sharer, conduction_coefficient, sharer_temperature, sharer_heat_capacity)
. = ..()
temperature = TCMB
+1 -1
View File
@@ -105,7 +105,7 @@
/datum/export/rcd
cost = 100 // 15 metal -> 75 credits, +25 credits for production
unit_name = "rapid construction device"
export_types = list(/obj/item/weapon/rcd)
export_types = list(/obj/item/weapon/construction/rcd)
/datum/export/rcd_ammo
cost = 15 // 1.5 metal, 1 glass -> 12.5 credits, +2.5 credits
+2 -2
View File
@@ -139,7 +139,7 @@
/obj/item/weapon/melee/baton/loaded=1,\
/obj/item/clothing/mask/gas/sechailer=1,\
/obj/item/weapon/gun/energy/e_gun=1,\
/obj/item/weapon/rcd/loaded=1)
/obj/item/weapon/construction/rcd/loaded=1)
/datum/outfit/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
@@ -158,7 +158,7 @@
/obj/item/weapon/melee/baton/loaded=1,\
/obj/item/clothing/mask/gas/sechailer/swat=1,\
/obj/item/weapon/gun/energy/pulse/pistol/loyalpin=1,\
/obj/item/weapon/rcd/combat=1)
/obj/item/weapon/construction/rcd/combat=1)
/datum/outfit/centcom_official
+1 -1
View File
@@ -67,7 +67,7 @@
obj_integrity = 300
max_integrity = 300
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75, fire = 50, acid = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/pipe_dispenser)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals,/obj/item/device/t_scanner, /obj/item/weapon/construction/rcd, /obj/item/weapon/pipe_dispenser)
siemens_coefficient = 0
var/obj/item/clothing/head/helmet/space/hardsuit/helmet
actions_types = list(/datum/action/item_action/toggle_helmet)
+1 -1
View File
@@ -493,7 +493,7 @@
icon_state = "coatengineer"
item_state = "coatengineer"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20, fire = 30, acid = 45)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/pipe_dispenser)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner, /obj/item/weapon/construction/rcd, /obj/item/weapon/pipe_dispenser)
hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering
/obj/item/clothing/head/hooded/winterhood/engineering
+4 -4
View File
@@ -422,7 +422,7 @@
var/list/growth_queue
var/spread_multiplier = 5
var/spread_cap = 30
var/list/sv_mutations_list
var/list/vine_mutations_list
var/mutativeness = 1
/datum/spacevine_controller/New(turf/location, list/muts, potency, production)
@@ -430,8 +430,8 @@
START_PROCESSING(SSobj, src)
vines = list()
growth_queue = list()
sv_mutations_list = list()
init_subtypes(/datum/spacevine_mutation, sv_mutations_list)
vine_mutations_list = list()
init_subtypes(/datum/spacevine_mutation/, vine_mutations_list)
if(potency != null)
mutativeness = potency / 10
if(production != null)
@@ -473,7 +473,7 @@
var/parentcolor = parent.atom_colours[FIXED_COLOUR_PRIORITY]
SV.add_atom_colour(parentcolor, FIXED_COLOUR_PRIORITY)
if(prob(mutativeness))
var/datum/spacevine_mutation/randmut = pick(sv_mutations_list - SV.mutations)
var/datum/spacevine_mutation/randmut = pick(vine_mutations_list - SV.mutations)
randmut.add_mutation_to_vinepiece(SV)
for(var/datum/spacevine_mutation/SM in SV.mutations)
+87 -35
View File
@@ -6,27 +6,10 @@
earliest_start = 0
/datum/round_event/wizard/rpgloot/start()
var/list/prefixespositive = list("greater", "major", "blessed", "superior", "enpowered", "honed", "true", "glorious", "robust")
var/list/prefixesnegative = list("lesser", "minor", "blighted", "inferior", "enfeebled", "rusted", "unsteady", "tragic", "gimped")
var/list/suffixes = list("orc slaying", "elf slaying", "corgi slaying", "strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma", "the forest", "the hills", "the plains", "the sea", "the sun", "the moon", "the void", "the world", "the fool", "many secrets", "many tales", "many colors", "rending", "sundering", "the night", "the day")
var/upgrade_scroll_chance = 0
var/upgrade_scroll_chance = 0
for(var/obj/item/I in world)
if(istype(I,/obj/item/organ/))
continue
var/quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0)
if(prob(50))
quality = -quality
if(quality > 0)
I.name = "[pick(prefixespositive)] [I.name] of [pick(suffixes)] +[quality]"
else if(quality < 0)
I.name = "[pick(prefixesnegative)] [I.name] of [pick(suffixes)] [quality]"
else
I.name = "[I.name] of [pick(suffixes)]"
I.force = max(0,I.force + quality)
I.throwforce = max(0,I.throwforce + quality)
for(var/value in I.armor)
I.armor[value] += quality
if(!istype(I.rpg_loot))
I.rpg_loot = new(I)
if(istype(I,/obj/item/weapon/storage))
var/obj/item/weapon/storage/S = I
@@ -36,28 +19,97 @@
upgrade_scroll_chance = max(0,upgrade_scroll_chance-100)
upgrade_scroll_chance += 25
GLOB.rpg_loot_items = TRUE
/obj/item/upgradescroll
name = "Item Fortification Scroll"
name = "item fortification scroll"
desc = "Somehow, this piece of paper can be applied to items to make them \"better\". Apparently there's a risk of losing the item if it's already \"too good\". <i>This all feels so arbitrary...</i>"
icon = 'icons/obj/wizard.dmi'
icon_state = "scroll"
w_class = WEIGHT_CLASS_TINY
var/upgrade_amount = 1
var/can_backfire = TRUE
var/one_use = TRUE
/obj/item/upgradescroll/afterattack(obj/item/target, mob/user , proximity)
if(!proximity || !istype(target))
return
var/quality = target.force - initial(target.force)
if(quality > 9 && prob((quality - 9)*10))
to_chat(user, "<span class='danger'>[target] catches fire!</span>")
if(target.resistance_flags & (LAVA_PROOF|FIRE_PROOF))
target.resistance_flags &= ~(LAVA_PROOF|FIRE_PROOF)
target.resistance_flags |= FLAMMABLE
target.fire_act()
var/datum/rpg_loot/rpg_loot_datum = target.rpg_loot
if(!istype(rpg_loot_datum))
rpg_loot_datum = new /datum/rpg_loot(target)
var/quality = rpg_loot_datum.quality
if(can_backfire && (quality > 9 && prob((quality - 9)*10)))
to_chat(user, "<span class='danger'>[target] violently glows blue for a while, then evaporates.</span>")
target.burn()
else
to_chat(user, "<span class='notice'>[target] glows blue and seems vaguely \"better\"!</span>")
rpg_loot_datum.modify(upgrade_amount)
if(one_use)
qdel(src)
return
target.force += 1
target.throwforce += 1
for(var/value in target.armor)
target.armor[value] += 1
to_chat(user, "<span class='notice'>[target] glows blue and seems vaguely \"better\"!</span>")
qdel(src)
/obj/item/upgradescroll/unlimited
name = "unlimited foolproof item fortification scroll"
desc = "Somehow, this piece of paper can be applied to items to make them \"better\". This scroll is made from the tongues of dead paper wizards, and can be used an unlimited number of times, with no drawbacks."
one_use = FALSE
can_backfire = FALSE
/datum/rpg_loot
var/positive_prefix = "okay"
var/negative_prefix = "weak"
var/suffix = "something profound"
var/quality = 0
var/obj/item/attached
var/original_name
/datum/rpg_loot/New(attached_item=null)
attached = attached_item
randomise()
/datum/rpg_loot/Destroy()
attached = null
/datum/rpg_loot/proc/randomise()
var/static/list/prefixespositive = list("greater", "major", "blessed", "superior", "enpowered", "honed", "true", "glorious", "robust")
var/static/list/prefixesnegative = list("lesser", "minor", "blighted", "inferior", "enfeebled", "rusted", "unsteady", "tragic", "gimped")
var/static/list/suffixes = list("orc slaying", "elf slaying", "corgi slaying", "strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma", "the forest", "the hills", "the plains", "the sea", "the sun", "the moon", "the void", "the world", "the fool", "many secrets", "many tales", "many colors", "rending", "sundering", "the night", "the day")
var/new_quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0)
suffix = pick(suffixes)
positive_prefix = pick(prefixespositive)
negative_prefix = pick(prefixesnegative)
if(prob(50))
new_quality = -new_quality
modify(new_quality)
/datum/rpg_loot/proc/rename()
var/obj/item/I = attached
if(!original_name)
original_name = I.name
if(quality < 0)
I.name = "[negative_prefix] [original_name] of [suffix] [quality]"
else if(quality == 0)
I.name = "[original_name] of [suffix]"
else if(quality > 0)
I.name = "[positive_prefix] [original_name] of [suffix] +[quality]"
/datum/rpg_loot/proc/modify(quality_mod)
var/obj/item/I = attached
quality += quality_mod
I.force = max(0,I.force + quality_mod)
I.throwforce = max(0,I.throwforce + quality_mod)
for(var/value in I.armor)
I.armor[value] += quality
rename()
+1 -2
View File
@@ -538,7 +538,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/item/device/radio/headset/syndicate, /obj/item/weapon/grenade/plastic/c4,\
/obj/item/device/powersink, /obj/item/weapon/storage/box/syndie_kit,\
/obj/item/toy/syndicateballoon, /obj/item/weapon/gun/energy/laser/captain,\
/obj/item/weapon/hand_tele, /obj/item/weapon/rcd, /obj/item/weapon/tank/jetpack,\
/obj/item/weapon/hand_tele, /obj/item/weapon/construction/rcd, /obj/item/weapon/tank/jetpack,\
/obj/item/clothing/under/rank/captain, /obj/item/device/aicard,\
/obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/weapon/disk/nuclear,\
/obj/item/clothing/suit/space/nasavoid, /obj/item/weapon/tank)
@@ -673,7 +673,6 @@ Gunshots/explosions/opening doors/less rare audio (done)
QDEL_IN(O, 300)
/obj/effect/hallucination/bolts
var/list/doors = list()
+4
View File
@@ -133,6 +133,10 @@ GLOBAL_LIST_EMPTY(all_lighting_objects) // Global list of lighting objects.
/atom/movable/lighting_object/blob_act()
return
// Nope nope nope!
/atom/movable/lighting_object/onShuttleMove(turf/T1, rotation)
return FALSE
// Override here to prevent things accidentally moving around overlays.
/atom/movable/lighting_object/forceMove(atom/destination, var/no_tp=FALSE, var/harderforce = FALSE)
if(harderforce)
+4 -4
View File
@@ -20,7 +20,7 @@
dir = direct //This camera eye is visible as a drone, and needs to keep the dir updated
..()
/obj/item/weapon/rcd/internal //Base console's internal RCD. Roundstart consoles are filled, rebuilt cosoles start empty.
/obj/item/weapon/construction/rcd/internal //Base console's internal RCD. Roundstart consoles are filled, rebuilt cosoles start empty.
name = "internal RCD"
max_matter = 600 //Bigger container and faster speeds due to being specialized and stationary.
no_ammo_message = "<span class='warning'>Internal matter exhausted. Please add additional materials.</span>"
@@ -30,7 +30,7 @@
name = "base contruction console"
desc = "An industrial computer integrated with a camera-assisted rapid construction drone."
networks = list("SS13")
var/obj/item/weapon/rcd/internal/RCD //Internal RCD. The computer passes user commands to this in order to avoid massive copypaste.
var/obj/item/weapon/construction/rcd/internal/RCD //Internal RCD. The computer passes user commands to this in order to avoid massive copypaste.
circuit = /obj/item/weapon/circuitboard/computer/base_construction
off_action = new/datum/action/innate/camera_off/base_construction
var/datum/action/innate/aux_base/switch_mode/switch_mode_action = new //Action for switching the RCD's build modes
@@ -50,7 +50,7 @@
/obj/machinery/computer/camera_advanced/base_construction/New()
..()
RCD = new /obj/item/weapon/rcd/internal(src)
RCD = new /obj/item/weapon/construction/rcd/internal(src)
/obj/machinery/computer/camera_advanced/base_construction/Initialize(mapload)
..()
@@ -117,7 +117,7 @@
remote_eye = C.remote_control
B = target
if(!B.RCD) //The console must always have an RCD.
B.RCD = new /obj/item/weapon/rcd/internal(src) //If the RCD is lost somehow, make a new (empty) one!
B.RCD = new /obj/item/weapon/construction/rcd/internal(src) //If the RCD is lost somehow, make a new (empty) one!
/datum/action/innate/aux_base/proc/check_spot()
//Check a loction to see if it is inside the aux base at the station. Camera visbility checks omitted so as to not hinder construction.
+3 -3
View File
@@ -68,7 +68,7 @@
/obj/item/device/wormhole_jaunter/attack_self(mob/user)
user.visible_message("<span class='notice'>[user.name] activates the [src.name]!</span>")
feedback_add_details("jaunter", "U") // user activated
feedback_add_details("jaunter", "User") // user activated
activate(user)
/obj/item/device/wormhole_jaunter/proc/turf_check(mob/user)
@@ -124,13 +124,13 @@
if(triggered)
usr.visible_message("<span class='warning'>The [src] overloads and activates!</span>")
feedback_add_details("jaunter","E") // EMP accidental activation
feedback_add_details("jaunter","EMP") // EMP accidental activation
activate(usr)
/obj/item/device/wormhole_jaunter/proc/chasm_react(mob/user)
if(user.get_item_by_slot(slot_belt) == src)
to_chat(user, "Your [src] activates, saving you from the chasm!</span>")
feedback_add_details("jaunter","C") // chasm automatic activation
feedback_add_details("jaunter","Chasm") // chasm automatic activation
activate(user)
else
to_chat(user, "The [src] is not attached to your belt, preventing it from saving you from the chasm. RIP.</span>")
@@ -87,7 +87,7 @@
user.sight |= SEE_MOBS
icon_state = "lantern"
wisp.orbit(user, 20)
feedback_add_details("wisp_lantern","F") // freed
feedback_add_details("wisp_lantern","Freed") // freed
else
to_chat(user, "<span class='notice'>You return the wisp to the lantern.</span>")
@@ -102,7 +102,7 @@
wisp.stop_orbit()
wisp.loc = src
icon_state = "lantern-blue"
feedback_add_details("wisp_lantern","R") // returned
feedback_add_details("wisp_lantern","Returned") // returned
/obj/item/device/wisp_lantern/Initialize()
..()
@@ -229,7 +229,7 @@
/obj/item/device/immortality_talisman/attack_self(mob/user)
if(cooldown < world.time)
feedback_add_details("immortality_talisman","U") // usage
feedback_add_details("immortality_talisman","Activated") // usage
cooldown = world.time + 600
user.visible_message("<span class='danger'>[user] vanishes from reality, leaving a a hole in [user.p_their()] place!</span>")
var/obj/effect/immortality_talisman/Z = new(get_turf(src.loc))
@@ -920,18 +920,14 @@
return
if(!riding_datum)
riding_datum = new /datum/riding/human(src)
if(buckled_mobs && ((M in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)))
return
if(buckled) //NO INFINITE STACKING!!
return
if(M.stat != CONSCIOUS)
if(buckled_mobs && ((M in buckled_mobs) || (buckled_mobs.len >= max_buckled_mobs)) || buckled || (M.stat != CONSCIOUS))
return
if(iscarbon(M))
if(M.incapacitated(FALSE, TRUE) || incapacitated(FALSE, TRUE))
M.visible_message("<span class='boldwarning'>[M] can't hang onto [src]!</span>")
M.visible_message("<span class='warning'>[M] can't hang onto [src]!</span>")
return
if(!riding_datum.equip_buckle_inhands(M, 2)) //MAKE SURE THIS IS LAST!!
M.visible_message("<span class='boldwarning'>[M] can't climb onto [src] because [M.p_their()] hands are full!</span>")
M.visible_message("<span class='warning'>[M] can't climb onto [src]!</span>")
return
. = ..(M, force, check_loc)
stop_pulling()
@@ -141,7 +141,7 @@
return not_handled //For future deeper overrides
/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop)
/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE)
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
if(!. || !I)
return
@@ -111,6 +111,12 @@
var/obj/item/thing = C.get_item_by_slot(slot_id)
if(thing && (!thing.species_exception || !is_type_in_list(src,thing.species_exception)))
C.dropItemToGround(thing)
// this needs to be FIRST because qdel calls update_body which checks if we have DIGITIGRADE legs or not and if not then removes DIGITIGRADE from species_traits
if(("legs" in C.dna.species.mutant_bodyparts) && C.dna.features["legs"] == "Digitigrade Legs")
species_traits += DIGITIGRADE
if(DIGITIGRADE in species_traits)
C.Digitigrade_Leg_Swap(FALSE)
var/obj/item/organ/heart/heart = C.getorganslot("heart")
var/obj/item/organ/lungs/lungs = C.getorganslot("lungs")
@@ -152,10 +158,6 @@
if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype)
C.dna.blood_type = exotic_bloodtype
if(("legs" in C.dna.species.mutant_bodyparts) && C.dna.features["legs"] == "Digitigrade Legs")
species_traits += DIGITIGRADE
if(DIGITIGRADE in species_traits)
C.Digitigrade_Leg_Swap(FALSE)
/datum/species/proc/on_species_loss(mob/living/carbon/C)
if(C.dna.species.exotic_bloodtype)
@@ -132,6 +132,10 @@
return 0
/mob/living/carbon/monkey/proc/handle_combat()
// Don't do any AI if inside another mob (devoured)
if (ismob(loc))
// Really no idea what needs to be returned but everything else is TRUE
return TRUE
if(on_fire || buckled || restrained())
if(!resisting && prob(MONKEY_RESIST_PROB))
@@ -287,7 +287,7 @@
basic_modules = list(
/obj/item/device/assembly/flash/cyborg,
/obj/item/borg/sight/meson,
/obj/item/weapon/rcd/borg,
/obj/item/weapon/construction/rcd/borg,
/obj/item/weapon/pipe_dispenser,
/obj/item/weapon/extinguisher,
/obj/item/weapon/weldingtool/largetank/cyborg,
@@ -338,7 +338,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
to_chat(src, "<span class='danger'><B>You don't have another mode!</span></B>")
/mob/living/simple_animal/hostile/guardian/proc/ToggleLight()
if(!luminosity)
if(light_range<3)
to_chat(src, "<span class='notice'>You activate your light.</span>")
set_light(3)
else
+11
View File
@@ -649,3 +649,14 @@
force = 5
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
update()
/obj/machinery/light/floor
name = "floor light"
icon = 'icons/obj/lighting.dmi'
base_state = "floor" // base description and icon_state
icon_state = "floor1"
brightness = 4
layer = 2.5
light_type = /obj/item/weapon/light/bulb
fitting = "bulb"
+203 -25
View File
@@ -1,5 +1,3 @@
/obj/machinery/power/emitter
name = "Emitter"
desc = "A heavy duty industrial laser.\n<span class='notice'>Alt-click to rotate it clockwise.</span>"
@@ -9,6 +7,11 @@
anchored = 0
density = 1
req_access = list(GLOB.access_engine_equip)
// The following 3 vars are mostly for the prototype
var/manual = FALSE
var/charge = 0
var/atom/target = null
use_power = 0
idle_power_usage = 10
@@ -174,9 +177,11 @@
investigate_log("lost power and turned <font color='red'>off</font> at [get_area(src)]","singulo")
log_game("Emitter lost power in ([x],[y],[z])")
return
if(!check_delay())
if(charge <=80)
charge+=5
if(!check_delay() || manual == TRUE)
return FALSE
fire_beam()
fire_beam(target)
/obj/machinery/power/emitter/proc/check_delay()
if((src.last_shot + src.fire_delay) <= world.time)
@@ -192,34 +197,62 @@
add_load(active_power_usage)
fire_beam()
/obj/machinery/power/emitter/proc/fire_beam()
src.last_shot = world.time
if(src.shot_number < 3)
src.fire_delay = 20
src.shot_number ++
else
src.fire_delay = rand(minimum_fire_delay,maximum_fire_delay)
src.shot_number = 0
var/obj/item/projectile/A = new projectile_type(src.loc)
A.setDir(src.dir)
playsound(src.loc, projectile_sound, 25, 1)
/obj/machinery/power/emitter/proc/fire_beam(atom/targeted_atom, mob/user)
var/turf/targets_from = get_turf(src)
if(targeted_atom == user|| targeted_atom == targets_from)
return
var/obj/item/projectile/P = new projectile_type(targets_from)
playsound(src.loc, projectile_sound, 50, 1)
if(prob(35))
sparks.start()
switch(dir)
if(NORTH)
A.yo = 20
A.xo = 0
P.yo = 20
P.xo = 0
if(NORTHEAST)
P.yo = 20
P.xo = 20
if(EAST)
A.yo = 0
A.xo = 20
P.yo = 0
P.xo = 20
if(SOUTHEAST)
P.yo = -20
P.xo = 20
if(WEST)
A.yo = 0
A.xo = -20
P.yo = 0
P.xo = -20
if(SOUTHWEST)
P.yo = -20
P.xo = -20
if(NORTHWEST)
P.yo = 20
P.xo = -20
else // Any other
A.yo = -20
A.xo = 0
A.starting = loc
A.fire()
P.yo = -20
P.xo = 0
if(target)
P.yo = targeted_atom.y - targets_from.y
P.xo = targeted_atom.x - targets_from.x
P.current = targets_from
P.starting = targets_from
P.firer = src
P.original = targeted_atom
if(!manual)
last_shot = world.time
if(shot_number < 3)
fire_delay = 20
shot_number ++
else
fire_delay = rand(minimum_fire_delay,maximum_fire_delay)
shot_number = 0
if(!target)
P.setDir(src.dir)
P.starting = loc
else
if(QDELETED(target))
target = null
P.fire()
return P
/obj/machinery/power/emitter/can_be_unfasten_wrench(mob/user, silent)
if(state == EM_WELDED)
@@ -312,3 +345,148 @@
emagged = 1
if(user)
user.visible_message("[user.name] emags the [src.name].","<span class='notice'>You short out the lock.</span>")
/obj/machinery/power/emitter/prototype
name = "Prototype Emitter"
icon = 'icons/obj/turrets.dmi'
icon_state = "protoemitter"
icon_state_on = "protoemitter_+a"
can_buckle = TRUE
buckle_lying = 0
var/view_range = 12
var/datum/action/innate/protoemitter/firing/auto
//BUCKLE HOOKS
/obj/machinery/power/emitter/prototype/unbuckle_mob(mob/living/buckled_mob,force = 0)
playsound(src,'sound/mecha/mechmove01.ogg', 50, 1)
manual = FALSE
for(var/obj/item/I in buckled_mob.held_items)
if(istype(I, /obj/item/weapon/turret_control))
qdel(I)
if(istype(buckled_mob))
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 0
if(buckled_mob.client)
buckled_mob.client.change_view(world.view)
auto.Remove(buckled_mob)
. = ..()
/obj/machinery/power/emitter/prototype/user_buckle_mob(mob/living/M, mob/living/carbon/user)
if(user.incapacitated() || !istype(user))
return
for(var/atom/movable/A in get_turf(src))
if(A.density && (A != src && A != M))
return
M.forceMove(get_turf(src))
..()
playsound(src,'sound/mecha/mechmove01.ogg', 50, 1)
M.pixel_y = 14
layer = 4.1
if(M.client)
M.client.change_view(view_range)
if(!auto)
auto = new()
auto.Grant(M, src)
/datum/action/innate/protoemitter
check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_CONSCIOUS
var/obj/machinery/power/emitter/prototype/PE
var/mob/living/carbon/U
/datum/action/innate/protoemitter/Grant(mob/living/carbon/L, obj/machinery/power/emitter/prototype/proto)
PE = proto
U = L
. = ..()
/datum/action/innate/protoemitter/firing
name = "Switch to Manual Firing"
desc = "The emitter will only fire on your command and at your designated target"
button_icon_state = "mech_zoom_on"
/datum/action/innate/protoemitter/firing/Activate()
if(PE.manual)
playsound(PE,'sound/mecha/mechmove01.ogg', 50, 1)
PE.manual = FALSE
name = "Switch to Manual Firing"
desc = "The emitter will only fire on your command and at your designated target"
button_icon_state = "mech_zoom_on"
for(var/obj/item/I in U.held_items)
if(istype(I, /obj/item/weapon/turret_control))
qdel(I)
UpdateButtonIcon()
return
else
playsound(PE,'sound/mecha/mechmove01.ogg', 50, 1)
name = "Switch to Automatic Firing"
desc = "Emitters will switch to periodic firing at your last target"
button_icon_state = "mech_zoom_off"
PE.manual = TRUE
for(var/V in U.held_items)
var/obj/item/I = V
if(istype(I))
if(U.dropItemToGround(I))
var/obj/item/weapon/turret_control/TC = new /obj/item/weapon/turret_control()
U.put_in_hands(TC)
else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand
var/obj/item/weapon/turret_control/TC = new /obj/item/weapon/turret_control()
U.put_in_hands(TC)
UpdateButtonIcon()
/obj/item/weapon/turret_control
name = "turret controls"
icon_state = "offhand"
w_class = WEIGHT_CLASS_HUGE
flags = ABSTRACT | NODROP
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF | NOBLUDGEON
var/delay = 0
/obj/item/weapon/turret_control/afterattack(atom/targeted_atom, mob/user)
..()
var/obj/machinery/power/emitter/E = user.buckled
E.setDir(get_dir(E,targeted_atom))
user.setDir(E.dir)
switch(E.dir)
if(NORTH)
E.layer = 3.9
user.pixel_x = 0
user.pixel_y = -14
if(NORTHEAST)
E.layer = 3.9
user.pixel_x = -8
user.pixel_y = -12
if(EAST)
E.layer = 4.1
user.pixel_x = -14
user.pixel_y = 0
if(SOUTHEAST)
E.layer = 3.9
user.pixel_x = -8
user.pixel_y = 12
if(SOUTH)
E.layer = 4.1
user.pixel_x = 0
user.pixel_y = 14
if(SOUTHWEST)
E.layer = 3.9
user.pixel_x = 8
user.pixel_y = 12
if(WEST)
E.layer = 4.1
user.pixel_x = 14
user.pixel_y = 0
if(NORTHWEST)
E.layer = 3.9
user.pixel_x = 8
user.pixel_y = -12
if(E.charge >= 10 && world.time > delay)
E.charge -= 10
E.target = targeted_atom
E.fire_beam(targeted_atom, user)
delay = world.time + 10
else if (E.charge < 10)
playsound(get_turf(user),'sound/machines/buzz-sigh.ogg', 50, 1)
+2 -3
View File
@@ -95,9 +95,8 @@
var/obj/item/weapon/implant/req_implant = null
/obj/item/device/firing_pin/implant/pin_auth(mob/living/user)
if(iscarbon(user))
var/mob/living/carbon/C = user
for(var/obj/item/weapon/implant/I in C.implants)
if(istype(user))
for(var/obj/item/weapon/implant/I in user.implants)
if(req_implant && I.type == req_implant)
return 1
return 0
@@ -1,8 +1,11 @@
/datum/chemical_reaction/slime
var/deletes_extract = TRUE
/datum/chemical_reaction/slime/on_reaction(datum/reagents/holder)
delete_extract(holder)
feedback_add_details("slime_cores_used","[type]")
if(deletes_extract)
delete_extract(holder)
/datum/chemical_reaction/slime/proc/delete_extract(datum/reagents/holder)
var/obj/item/slime_extract/M = holder.my_atom
@@ -19,12 +22,9 @@
required_other = 1
/datum/chemical_reaction/slime/slimespawn/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/mob/living/simple_animal/slime/S
S = new(get_turf(holder.my_atom), "grey")
S.visible_message("<span class='danger'>Infused with plasma, the \
core begins to quiver and grow, and soon a new baby slime \
emerges from it!</span>")
S.visible_message("<span class='danger'>Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!</span>")
..()
/datum/chemical_reaction/slime/slimeinaprov
@@ -35,10 +35,6 @@
required_other = 1
required_container = /obj/item/slime_extract/grey
/datum/chemical_reaction/slime/slimeinaprov/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
/datum/chemical_reaction/slime/slimemonkey
name = "Slime Monkey"
id = "m_monkey"
@@ -47,10 +43,8 @@
required_other = 1
/datum/chemical_reaction/slime/slimemonkey/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
for(var/i = 1, i <= 3, i++)
var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube
M.loc = get_turf(holder.my_atom)
for(var/i in 1 to 3)
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(get_turf(holder.my_atom))
..()
//Green
@@ -62,10 +56,6 @@
required_other = 1
required_container = /obj/item/slime_extract/green
/datum/chemical_reaction/slime/slimemutate/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
//Mutated Green
/datum/chemical_reaction/slime/slimemutate_unstable
name = "Unstable Mutation Toxin"
@@ -76,10 +66,6 @@
required_container = /obj/item/slime_extract/green
mix_message = "<span class='info'>The mixture rapidly expands and contracts, its appearance shifting into a sickening green.</span>"
/datum/chemical_reaction/slime/slimemutate_unstable/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
//Metal
/datum/chemical_reaction/slime/slimemetal
name = "Slime Metal"
@@ -89,10 +75,9 @@
required_other = 1
/datum/chemical_reaction/slime/slimemetal/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/location = get_turf(holder.my_atom)
new /obj/item/stack/sheet/plasteel (location, 5)
new /obj/item/stack/sheet/metal (location, 15)
new /obj/item/stack/sheet/plasteel(location, 5)
new /obj/item/stack/sheet/metal(location, 15)
..()
/datum/chemical_reaction/slime/slimeglass
@@ -103,60 +88,49 @@
required_other = 1
/datum/chemical_reaction/slime/slimeglass/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/location = get_turf(holder.my_atom)
new /obj/item/stack/sheet/rglass (location, 5)
new /obj/item/stack/sheet/glass (location, 15)
new /obj/item/stack/sheet/rglass(location, 5)
new /obj/item/stack/sheet/glass(location, 15)
..()
//Gold
/datum/chemical_reaction/slime/slimecrit
/datum/chemical_reaction/slime/slimemobspawn
name = "Slime Crit"
id = "m_tele"
required_reagents = list("plasma" = 1)
required_container = /obj/item/slime_extract/gold
required_other = 1
deletes_extract = FALSE //we do delete, but we don't do so instantly
/datum/chemical_reaction/slime/slimecrit/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
/datum/chemical_reaction/slime/slimemobspawn/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='danger'>The slime extract begins to vibrate violently !</span>")
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 5, "Gold Slime"), 50)
summon_mobs(T)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
..()
M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
/datum/chemical_reaction/slime/slimecritlesser
/datum/chemical_reaction/slime/slimemobspawn/proc/summon_mobs(datum/reagents/holder, turf/T)
T.visible_message("<span class='danger'>The slime extract begins to vibrate violently!</span>")
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 5, "Gold Slime"), 50)
/datum/chemical_reaction/slime/slimemobspawn/lesser
name = "Slime Crit Lesser"
id = "m_tele3"
required_reagents = list("blood" = 1)
required_container = /obj/item/slime_extract/gold
required_other = 1
/datum/chemical_reaction/slime/slimecritlesser/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='danger'>The slime extract begins to vibrate violently !</span>")
/datum/chemical_reaction/slime/slimemobspawn/lesser/summon_mobs(datum/reagents/holder, turf/T)
T.visible_message("<span class='danger'>The slime extract begins to vibrate violently!</span>")
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 3, "Lesser Gold Slime", "neutral"), 50)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
/datum/chemical_reaction/slime/slimecritfriendly
/datum/chemical_reaction/slime/slimemobspawn/friendly
name = "Slime Crit Friendly"
id = "m_tele5"
required_reagents = list("water" = 1)
required_container = /obj/item/slime_extract/gold
required_other = 1
/datum/chemical_reaction/slime/slimecritfriendly/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='danger'>The slime extract begins to vibrate adorably !</span>")
/datum/chemical_reaction/slime/slimemobspawn/friendly/summon_mobs(datum/reagents/holder, turf/T)
T.visible_message("<span class='danger'>The slime extract begins to vibrate adorably!</span>")
addtimer(CALLBACK(src, .proc/chemical_mob_spawn, holder, 1, "Friendly Gold Slime", "neutral"), 50)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
//Silver
/datum/chemical_reaction/slime/slimebork
@@ -167,8 +141,24 @@
required_other = 1
/datum/chemical_reaction/slime/slimebork/on_reaction(datum/reagents/holder)
//BORK BORK BORK
var/list/borks = getborks()
var/turf/T = get_turf(holder.my_atom)
feedback_add_details("slime_cores_used","[type]")
playsound(T, 'sound/effects/phasein.ogg', 100, 1)
for(var/mob/living/carbon/C in viewers(T, null))
C.flash_act()
for(var/i in 1 to 4 + rand(1,2))
var/chosen = pick(borks)
var/obj/B = new chosen(T)
if(prob(50))
for(var/j in 1 to rand(1, 3))
step(B, pick(NORTH,SOUTH,EAST,WEST))
..()
/datum/chemical_reaction/slime/slimebork/proc/getborks()
var/list/blocked = list(/obj/item/weapon/reagent_containers/food/snacks,
/obj/item/weapon/reagent_containers/food/snacks/store/bread,
/obj/item/weapon/reagent_containers/food/snacks/breadslice,
@@ -188,53 +178,15 @@
)
blocked |= typesof(/obj/item/weapon/reagent_containers/food/snacks/customizable)
var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - blocked
// BORK BORK BORK
return typesof(/obj/item/weapon/reagent_containers/food/snacks) - blocked
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
C.flash_act()
for(var/i = 1, i <= 4 + rand(1,2), i++)
var/chosen = pick(borks)
var/obj/B = new chosen
if(B)
B.loc = get_turf(holder.my_atom)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(B, pick(NORTH,SOUTH,EAST,WEST))
..()
/datum/chemical_reaction/slime/slimebork2
/datum/chemical_reaction/slime/slimebork/drinks
name = "Slime Bork 2"
id = "m_tele4"
required_reagents = list("water" = 1)
required_container = /obj/item/slime_extract/silver
required_other = 1
/datum/chemical_reaction/slime/slimebork2/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/drinks)
// BORK BORK BORK
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
for(var/mob/living/carbon/M in viewers(get_turf(holder.my_atom), null))
M.flash_act()
for(var/i = 1, i <= 4 + rand(1,2), i++)
var/chosen = pick(borks)
var/obj/B = new chosen
if(B)
B.loc = get_turf(holder.my_atom)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(B, pick(NORTH,SOUTH,EAST,WEST))
..()
/datum/chemical_reaction/slime/slimebork/drinks/getborks()
return subtypesof(/obj/item/weapon/reagent_containers/food/drinks)
//Blue
/datum/chemical_reaction/slime/slimefrost
@@ -245,11 +197,6 @@
required_container = /obj/item/slime_extract/blue
required_other = 1
/datum/chemical_reaction/slime/slimefrost/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
/datum/chemical_reaction/slime/slimestabilizer
name = "Slime Stabilizer"
id = "m_slimestabilizer"
@@ -258,12 +205,9 @@
required_other = 1
/datum/chemical_reaction/slime/slimestabilizer/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/stabilizer/P = new /obj/item/slimepotion/stabilizer
P.loc = get_turf(holder.my_atom)
new /obj/item/slimepotion/stabilizer(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimefoam
name = "Slime Foam"
id = "m_foam"
@@ -272,11 +216,6 @@
required_container = /obj/item/slime_extract/blue
required_other = 1
/datum/chemical_reaction/slime/slimefoam/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
//Dark Blue
/datum/chemical_reaction/slime/slimefreeze
name = "Slime Freeze"
@@ -286,12 +225,12 @@
required_other = 1
/datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='danger'>The slime extract begins to vibrate adorably!</span>")
addtimer(CALLBACK(src, .proc/freeze, holder), 50)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
..()
M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
/datum/chemical_reaction/slime/slimefreeze/proc/freeze(datum/reagents/holder)
@@ -300,8 +239,6 @@
if(istype(T))
T.atmos_spawn_air("freon=50;TEMP=120")
/datum/chemical_reaction/slime/slimefireproof
name = "Slime Fireproof"
id = "m_fireproof"
@@ -310,9 +247,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimefireproof/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/fireproof/P = new /obj/item/slimepotion/fireproof
P.loc = get_turf(holder.my_atom)
new /obj/item/slimepotion/fireproof(get_turf(holder.my_atom))
..()
//Orange
@@ -324,24 +259,21 @@
required_container = /obj/item/slime_extract/orange
required_other = 1
/datum/chemical_reaction/slime/slimecasp/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
/datum/chemical_reaction/slime/slimefire
name = "Slime fire"
id = "m_fire"
required_reagents = list("plasma" = 1)
required_container = /obj/item/slime_extract/orange
required_other = 1
deletes_extract = FALSE
/datum/chemical_reaction/slime/slimefire/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/TU = get_turf(holder.my_atom)
TU.visible_message("<span class='danger'>The slime extract begins to vibrate adorably!</span>")
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='danger'>The slime extract begins to vibrate adorably!</span>")
addtimer(CALLBACK(src, .proc/slime_burn, holder), 50)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
..()
M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
/datum/chemical_reaction/slime/slimefire/proc/slime_burn(datum/reagents/holder)
@@ -359,12 +291,7 @@
required_container = /obj/item/slime_extract/orange
required_other = 1
/datum/chemical_reaction/slime/slimesmoke/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
//Yellow
/datum/chemical_reaction/slime/slimeoverload
name = "Slime EMP"
id = "m_emp"
@@ -373,11 +300,9 @@
required_other = 1
/datum/chemical_reaction/slime/slimeoverload/on_reaction(datum/reagents/holder, created_volume)
feedback_add_details("slime_cores_used","[type]")
empulse(get_turf(holder.my_atom), 3, 7)
..()
/datum/chemical_reaction/slime/slimecell
name = "Slime Powercell"
id = "m_cell"
@@ -386,9 +311,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimecell/on_reaction(datum/reagents/holder, created_volume)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/weapon/stock_parts/cell/high/slime/P = new /obj/item/weapon/stock_parts/cell/high/slime
P.loc = get_turf(holder.my_atom)
new /obj/item/weapon/stock_parts/cell/high/slime(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimeglow
@@ -399,15 +322,12 @@
required_other = 1
/datum/chemical_reaction/slime/slimeglow/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='danger'>The slime begins to emit a soft light. Squeezing it will cause it to grow brightly.</span>")
var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime
F.loc = get_turf(holder.my_atom)
new /obj/item/device/flashlight/slime(T)
..()
//Purple
/datum/chemical_reaction/slime/slimepsteroid
name = "Slime Steroid"
id = "m_steroid"
@@ -416,9 +336,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimepsteroid/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/steroid/P = new /obj/item/slimepotion/steroid
P.loc = get_turf(holder.my_atom)
new /obj/item/slimepotion/steroid(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimejam
@@ -429,11 +347,6 @@
required_container = /obj/item/slime_extract/purple
required_other = 1
/datum/chemical_reaction/slime/slimejam/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
//Dark Purple
/datum/chemical_reaction/slime/slimeplasma
name = "Slime Plasma"
@@ -443,9 +356,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimeplasma/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/location = get_turf(holder.my_atom)
new /obj/item/stack/sheet/mineral/plasma (location, 3)
new /obj/item/stack/sheet/mineral/plasma(get_turf(holder.my_atom), 3)
..()
//Red
@@ -458,9 +369,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimemutator/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/mutator/P = new /obj/item/slimepotion/mutator
P.loc = get_turf(holder.my_atom)
new /obj/item/slimepotion/mutator(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimebloodlust
@@ -471,13 +380,11 @@
required_other = 1
/datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null))
slime.rabid = 1
slime.visible_message("<span class='danger'>The [slime] is driven into a frenzy!</span>")
..()
/datum/chemical_reaction/slime/slimespeed
name = "Slime Speed"
id = "m_speed"
@@ -486,12 +393,9 @@
required_other = 1
/datum/chemical_reaction/slime/slimespeed/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/speed/P = new /obj/item/slimepotion/speed
P.loc = get_turf(holder.my_atom)
new /obj/item/slimepotion/speed(get_turf(holder.my_atom))
..()
//Pink
/datum/chemical_reaction/slime/docility
name = "Docility Potion"
@@ -501,9 +405,7 @@
required_other = 1
/datum/chemical_reaction/slime/docility/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/docility/P = new /obj/item/slimepotion/docility
P.loc = get_turf(holder.my_atom)
new /obj/item/slimepotion/docility(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/gender
@@ -514,9 +416,7 @@
required_other = 1
/datum/chemical_reaction/slime/gender/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/genderchange/G = new /obj/item/slimepotion/genderchange
G.loc = get_turf(holder.my_atom)
new /obj/item/slimepotion/genderchange(get_turf(holder.my_atom))
..()
//Black
@@ -528,10 +428,6 @@
required_other = 1
required_container = /obj/item/slime_extract/black
/datum/chemical_reaction/slime/slimemutate2/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
//Oil
/datum/chemical_reaction/slime/slimeexplosion
name = "Slime Explosion"
@@ -539,9 +435,9 @@
required_reagents = list("plasma" = 1)
required_container = /obj/item/slime_extract/oil
required_other = 1
deletes_extract = FALSE
/datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
var/lastkey = holder.my_atom.fingerprintslast
var/touch_msg = "N/A"
@@ -554,6 +450,7 @@
addtimer(CALLBACK(src, .proc/boom, holder), 50)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
..()
M.qdel_timer = addtimer(CALLBACK(src, .proc/delete_extract, holder), 55, TIMER_STOPPABLE)
/datum/chemical_reaction/slime/slimeexplosion/proc/boom(datum/reagents/holder)
@@ -569,10 +466,6 @@
required_container = /obj/item/slime_extract/oil
required_other = 1
/datum/chemical_reaction/slime/slimecornoil/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
//Light Pink
/datum/chemical_reaction/slime/slimepotion2
name = "Slime Potion 2"
@@ -582,9 +475,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimepotion2/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/sentience/P = new /obj/item/slimepotion/sentience
P.loc = get_turf(holder.my_atom)
new /obj/item/slimepotion/sentience
..()
//Adamantine
@@ -596,10 +487,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimegolem/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/effect/golemrune/Z = new /obj/effect/golemrune
Z.loc = get_turf(holder.my_atom)
notify_ghosts("Golem rune created in [get_area(Z)].", 'sound/effects/ghost2.ogg', source = Z)
new /obj/effect/golemrune(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimegolem2
@@ -610,9 +498,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimegolem2/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/golem_shell/artificial/Z = new /obj/item/golem_shell/artificial
Z.loc = get_turf(holder.my_atom)
new /obj/item/golem_shell/artificial(get_turf(holder.my_atom))
..()
//Bluespace
@@ -624,10 +510,7 @@
required_other = 1
/datum/chemical_reaction/slime/slimefloor2/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)
new /obj/item/stack/tile/bluespace(get_turf(holder.my_atom), 25)
..()
@@ -639,10 +522,8 @@
required_other = 1
/datum/chemical_reaction/slime/slimecrystal/on_reaction(datum/reagents/holder, created_volume)
feedback_add_details("slime_cores_used","[type]")
if(holder.my_atom)
var/obj/item/weapon/ore/bluespace_crystal/BC = new(get_turf(holder.my_atom))
BC.visible_message("<span class='notice'>The [BC.name] appears out of thin air!</span>")
var/obj/item/weapon/ore/bluespace_crystal/BC = new (get_turf(holder.my_atom))
BC.visible_message("<span class='notice'>The [BC.name] appears out of thin air!</span>")
..()
//Cerulean
@@ -654,12 +535,9 @@
required_other = 1
/datum/chemical_reaction/slime/slimepsteroid2/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/enhancer/P = new /obj/item/slimepotion/enhancer
P.loc = get_turf(holder.my_atom)
new /obj/item/slimepotion/enhancer(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slime_territory
name = "Slime Territory"
id = "s_territory"
@@ -668,9 +546,7 @@
required_other = 1
/datum/chemical_reaction/slime/slime_territory/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/areaeditor/blueprints/slime/P = new /obj/item/areaeditor/blueprints/slime
P.loc = get_turf(holder.my_atom)
new /obj/item/areaeditor/blueprints/slime(get_turf(holder.my_atom))
..()
//Sepia
@@ -682,15 +558,12 @@
required_other = 1
/datum/chemical_reaction/slime/slimestop/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/mob/mob = get_mob_by_key(holder.my_atom.fingerprintslast)
var/obj/effect/timestop/T = new /obj/effect/timestop
T.loc = get_turf(holder.my_atom)
T.immune += mob
T.forceMove(get_turf(holder.my_atom))
T.immune += get_mob_by_key(holder.my_atom.fingerprintslast)
T.timestop()
..()
/datum/chemical_reaction/slime/slimecamera
name = "Slime Camera"
id = "m_camera"
@@ -699,11 +572,8 @@
required_other = 1
/datum/chemical_reaction/slime/slimecamera/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
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)
new /obj/item/device/camera(get_turf(holder.my_atom))
new /obj/item/device/camera_film(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimefloor
@@ -714,16 +584,10 @@
required_other = 1
/datum/chemical_reaction/slime/slimefloor/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)
new /obj/item/stack/tile/sepia(get_turf(holder.my_atom), 25)
..()
//Pyrite
/datum/chemical_reaction/slime/slimepaint
name = "Slime Paint"
id = "s_paint"
@@ -732,15 +596,10 @@
required_other = 1
/datum/chemical_reaction/slime/slimepaint/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/list/paints = subtypesof(/obj/item/weapon/paint)
var/chosen = pick(paints)
var/obj/P = new chosen
if(P)
P.loc = get_turf(holder.my_atom)
var/chosen = pick(subtypesof(/obj/item/weapon/paint))
new chosen(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/slimecrayon
name = "Slime Crayon"
id = "s_crayon"
@@ -749,12 +608,8 @@
required_other = 1
/datum/chemical_reaction/slime/slimecrayon/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/list/crayons = difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan))
var/chosen = pick(crayons)
var/obj/P = new chosen
if(P)
P.loc = get_turf(holder.my_atom)
var/chosen = pick(difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan)))
new chosen(get_turf(holder.my_atom))
..()
//Rainbow :o)
@@ -766,12 +621,8 @@
required_container = /obj/item/slime_extract/rainbow
/datum/chemical_reaction/slime/slimeRNG/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/mob/living/simple_animal/slime/random/S
S = new(get_turf(holder.my_atom))
S.visible_message("<span class='danger'>Infused with plasma, the \
core begins to quiver and grow, and soon a new baby slime emerges \
from it!</span>")
var/mob/living/simple_animal/slime/random/S = new (get_turf(holder.my_atom))
S.visible_message("<span class='danger'>Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!</span>")
..()
/datum/chemical_reaction/slime/slime_transfer
@@ -782,9 +633,7 @@
required_container = /obj/item/slime_extract/rainbow
/datum/chemical_reaction/slime/slime_transfer/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/transference/P = new /obj/item/slimepotion/transference
P.loc = get_turf(holder.my_atom)
new /obj/item/slimepotion/transference(get_turf(holder.my_atom))
..()
/datum/chemical_reaction/slime/flight_potion
@@ -795,7 +644,6 @@
required_container = /obj/item/slime_extract/rainbow
/datum/chemical_reaction/slime/flight_potion/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
new/obj/item/weapon/reagent_containers/glass/bottle/potion/flight(get_turf(holder.my_atom))
new /obj/item/weapon/reagent_containers/glass/bottle/potion/flight(get_turf(holder.my_atom))
..()
@@ -581,7 +581,7 @@
id = "rcd"
build_type = AUTOLATHE
materials = list(MAT_METAL = 30000)
build_path = /obj/item/weapon/rcd
build_path = /obj/item/weapon/construction/rcd
category = list("hacked", "Construction")
/datum/design/rpd
+1 -1
View File
@@ -73,7 +73,7 @@
valid_items += rand(1,max(2,35-probWeight))
valid_items += I
if(ispath(I,/obj/item/weapon/rcd) || ispath(I,/obj/item/weapon/grenade) || ispath(I,/obj/item/device/aicard) || ispath(I,/obj/item/weapon/storage/backpack/holding) || ispath(I,/obj/item/slime_extract) || ispath(I,/obj/item/device/onetankbomb) || ispath(I,/obj/item/device/transfer_valve))
if(ispath(I,/obj/item/weapon/construction/rcd) || ispath(I,/obj/item/weapon/grenade) || ispath(I,/obj/item/device/aicard) || ispath(I,/obj/item/weapon/storage/backpack/holding) || ispath(I,/obj/item/slime_extract) || ispath(I,/obj/item/device/onetankbomb) || ispath(I,/obj/item/device/transfer_valve))
var/obj/item/tempCheck = I
if(initial(tempCheck.icon_state) != null)
critical_items += I
@@ -482,9 +482,14 @@
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
layer = TURF_LAYER
/obj/effect/golemrune/New()
..()
/obj/effect/golemrune/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
notify_ghosts("Golem rune created in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src)
/obj/effect/golemrune/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/effect/golemrune/process()
var/mob/dead/observer/ghost
-7
View File
@@ -1,6 +1,3 @@
/turf/proc/onShuttleMove(turf/oldturf)
addtimer(CALLBACK(lighting_object, /atom/movable/lighting_object/proc/update), 0)
/atom/movable/proc/onShuttleMove(turf/T1, rotation)
if(rotation)
shuttleRotate(rotation)
@@ -80,7 +77,3 @@
var/oldPY = pixel_y
pixel_x = oldPY
pixel_y = (oldPX*(-1))
// Nope nope nope!
/atom/movable/lighting_object/onShuttleMove(turf/T1, rotation)
return FALSE
-2
View File
@@ -503,8 +503,6 @@
//move mobile to new location
for(var/atom/movable/AM in T0)
AM.onShuttleMove(T1, rotation)
T1.onShuttleMove(T0)
if(rotation)
T1.shuttleRotate(rotation)