mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-24 04:27:35 +01:00
Merge remote-tracking branch 'remotes/upstream/master' into tanksprites
# Conflicts: # icons/mob/inhands/items_lefthand.dmi # icons/mob/inhands/items_righthand.dmi
This commit is contained in:
@@ -106,14 +106,14 @@ var/list/ghostteleportlocs = list()
|
||||
name = "\improper Admin Room"
|
||||
icon_state = "start"
|
||||
requires_power = 0
|
||||
lighting_use_dynamic = 0
|
||||
dynamic_lighting = 0
|
||||
|
||||
|
||||
/area/adminconstruction
|
||||
name = "\improper Admin Testing Area"
|
||||
icon_state = "start"
|
||||
requires_power = 0
|
||||
lighting_use_dynamic = 0
|
||||
dynamic_lighting = 0
|
||||
|
||||
/area/space
|
||||
icon_state = "space"
|
||||
@@ -466,7 +466,7 @@ var/list/ghostteleportlocs = list()
|
||||
icon_state = "start"
|
||||
requires_power = 0
|
||||
luminosity = 1
|
||||
lighting_use_dynamic = 0
|
||||
dynamic_lighting = 0
|
||||
has_gravity = 1
|
||||
|
||||
// === end remove
|
||||
@@ -482,7 +482,7 @@ var/list/ghostteleportlocs = list()
|
||||
name = "\improper Centcom"
|
||||
icon_state = "centcom"
|
||||
requires_power = 0
|
||||
lighting_use_dynamic = 0
|
||||
dynamic_lighting = 0
|
||||
|
||||
/area/centcom/control
|
||||
name = "\improper Centcom Control"
|
||||
@@ -563,7 +563,7 @@ var/list/ghostteleportlocs = list()
|
||||
name = "\improper Thunderdome"
|
||||
icon_state = "thunder"
|
||||
requires_power = 0
|
||||
lighting_use_dynamic = 0
|
||||
dynamic_lighting = 0
|
||||
|
||||
|
||||
/area/tdome/arena_source
|
||||
@@ -648,7 +648,7 @@ var/list/ghostteleportlocs = list()
|
||||
icon_state = "yellow"
|
||||
requires_power = 0
|
||||
has_gravity = 1
|
||||
lighting_use_dynamic = 0
|
||||
dynamic_lighting = 0
|
||||
|
||||
/area/wizard_station
|
||||
name = "\improper Wizard's Den"
|
||||
@@ -671,7 +671,7 @@ var/list/ghostteleportlocs = list()
|
||||
name = "\improper Vox Base"
|
||||
icon_state = "yellow"
|
||||
requires_power = 0
|
||||
lighting_use_dynamic = 0
|
||||
dynamic_lighting = 0
|
||||
no_teleportlocs = 1
|
||||
|
||||
/area/vox_station/transit
|
||||
@@ -1228,7 +1228,7 @@ var/list/ghostteleportlocs = list()
|
||||
/area/holodeck
|
||||
name = "\improper Holodeck"
|
||||
icon_state = "Holodeck"
|
||||
lighting_use_dynamic = 0
|
||||
dynamic_lighting = 0
|
||||
|
||||
/area/holodeck/alphadeck
|
||||
name = "\improper Holodeck Alpha"
|
||||
@@ -1365,7 +1365,7 @@ var/list/ghostteleportlocs = list()
|
||||
|
||||
/area/solar
|
||||
requires_power = 0
|
||||
lighting_use_dynamic = 0
|
||||
dynamic_lighting = 0
|
||||
|
||||
auxport
|
||||
name = "\improper Fore Port Solar Array"
|
||||
@@ -2280,25 +2280,25 @@ area/security/podbay
|
||||
name = "\improper AI Sat Ext"
|
||||
icon_state = "storage"
|
||||
luminosity = 1
|
||||
lighting_use_dynamic = 0
|
||||
dynamic_lighting = 0
|
||||
|
||||
/area/turret_protected/AIsatextFS
|
||||
name = "\improper AI Sat Ext"
|
||||
icon_state = "storage"
|
||||
luminosity = 1
|
||||
lighting_use_dynamic = 0
|
||||
dynamic_lighting = 0
|
||||
|
||||
/area/turret_protected/AIsatextAS
|
||||
name = "\improper AI Sat Ext"
|
||||
icon_state = "storage"
|
||||
luminosity = 1
|
||||
lighting_use_dynamic = 0
|
||||
dynamic_lighting = 0
|
||||
|
||||
/area/turret_protected/AIsatextAP
|
||||
name = "\improper AI Sat Ext"
|
||||
icon_state = "storage"
|
||||
luminosity = 1
|
||||
lighting_use_dynamic = 0
|
||||
dynamic_lighting = 0
|
||||
|
||||
/area/turret_protected/NewAIMain
|
||||
name = "\improper AI Main New"
|
||||
@@ -2475,7 +2475,7 @@ area/security/podbay
|
||||
name = "Beach"
|
||||
icon_state = "beach"
|
||||
luminosity = 1
|
||||
lighting_use_dynamic = 0
|
||||
dynamic_lighting = 0
|
||||
requires_power = 0
|
||||
ambientsounds = list('sound/ambience/shore.ogg', 'sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag2.ogg')
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
if(type == /area) // override defaults for space. TODO: make space areas of type /area/space rather than /area
|
||||
requires_power = 1
|
||||
always_unpowered = 1
|
||||
lighting_use_dynamic = 1
|
||||
dynamic_lighting = 1
|
||||
power_light = 0
|
||||
power_equip = 0
|
||||
power_environ = 0
|
||||
|
||||
@@ -88,7 +88,7 @@ var/global/max_secret_rooms = 6
|
||||
theme = "cavein"
|
||||
walltypes = list(/turf/simulated/mineral/random/high_chance=1)
|
||||
floortypes = list(/turf/simulated/floor/plating/airless/asteroid, /turf/simulated/floor/beach/sand)
|
||||
treasureitems = list(/obj/mecha/working/ripley/mining=1, /obj/item/weapon/pickaxe/drill/diamonddrill=2,/obj/item/weapon/gun/energy/kinetic_accelerator/hyper=1,
|
||||
treasureitems = list(/obj/mecha/working/ripley/mining=1, /obj/item/weapon/pickaxe/drill/diamonddrill=2,
|
||||
/obj/item/weapon/resonator/upgraded=1, /obj/item/weapon/pickaxe/drill/jackhammer=5)
|
||||
fluffitems = list(/obj/effect/decal/cleanable/blood=3,/obj/effect/decal/remains/human=1,/obj/item/clothing/under/overalls=1,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/chili=1,/obj/item/weapon/tank/oxygen/red=2)
|
||||
|
||||
+4
-5
@@ -81,6 +81,10 @@
|
||||
reagents = null
|
||||
invisibility = 101
|
||||
return ..()
|
||||
|
||||
//Hook for running code when a dir change occurs
|
||||
/atom/proc/setDir(newdir)
|
||||
dir = newdir
|
||||
|
||||
/atom/proc/CheckParts(list/parts_list)
|
||||
for(var/A in parts_list)
|
||||
@@ -222,11 +226,6 @@
|
||||
/atom/proc/relaymove()
|
||||
return
|
||||
|
||||
//called to set the atom's dir and used to add behaviour to dir-changes - Not fully used (yet)
|
||||
/atom/proc/set_dir(new_dir)
|
||||
. = new_dir != dir
|
||||
dir = new_dir
|
||||
|
||||
/atom/proc/ex_act()
|
||||
return
|
||||
|
||||
|
||||
@@ -32,7 +32,13 @@
|
||||
/atom/movable/Destroy()
|
||||
for(var/atom/movable/AM in contents)
|
||||
qdel(AM)
|
||||
var/turf/un_opaque
|
||||
if(opacity && isturf(loc))
|
||||
un_opaque = loc
|
||||
|
||||
loc = null
|
||||
if(un_opaque)
|
||||
un_opaque.recalc_atom_opacity()
|
||||
if(pulledby)
|
||||
if(pulledby.pulling == src)
|
||||
pulledby.pulling = null
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
/datum/dna/gene/disability/blindness/New()
|
||||
block=BLINDBLOCK
|
||||
|
||||
/datum/dna/gene/disability/colourblindness
|
||||
name = "Colourblindness"
|
||||
activation_message = "You feel a peculiar prickling in your eyes while your perception of colour changes."
|
||||
deactivation_message ="Your eyes tingle unsettlingly, though everything seems to become alot more colourful."
|
||||
instability = -GENE_INSTABILITY_MODERATE
|
||||
disability = COLOURBLIND
|
||||
|
||||
/datum/dna/gene/disability/colourblindness/New()
|
||||
block=COLOURBLINDBLOCK
|
||||
|
||||
/datum/dna/gene/disability/colourblindness/activate(var/mob/M, var/connected, var/flags)
|
||||
..()
|
||||
M.update_client_colour() //Handle the activation of the colourblindness on the mob.
|
||||
|
||||
/datum/dna/gene/disability/colourblindness/deactivate(var/mob/M, var/connected, var/flags)
|
||||
..()
|
||||
M.update_client_colour() //Handle the deactivation of the colourblindness on the mob.
|
||||
|
||||
/datum/dna/gene/disability/deaf
|
||||
name="Deafness"
|
||||
activation_message="It's kinda quiet."
|
||||
@@ -126,7 +144,7 @@
|
||||
block=DEAFBLOCK
|
||||
|
||||
/datum/dna/gene/disability/deaf/activate(var/mob/M, var/connected, var/flags)
|
||||
..(M,connected,flags)
|
||||
..()
|
||||
M.EarDeaf(1)
|
||||
|
||||
/datum/dna/gene/disability/nearsighted
|
||||
@@ -139,7 +157,6 @@
|
||||
/datum/dna/gene/disability/nearsighted/New()
|
||||
block=GLASSESBLOCK
|
||||
|
||||
|
||||
/datum/dna/gene/disability/lisp
|
||||
name = "Lisp"
|
||||
desc = "I wonder wath thith doeth."
|
||||
|
||||
@@ -135,13 +135,13 @@
|
||||
message = replacetextEx(message,"w","v")
|
||||
message = replacetextEx(message,"J","Y")
|
||||
message = replacetextEx(message,"j","y")
|
||||
message = replacetextEx(message,"A",pick("Å","Ä","Æ","A"))
|
||||
message = replacetextEx(message,"a",pick("å","ä","æ","a"))
|
||||
message = replacetextEx(message,"A",pick("Å","Ä","Æ","A"))
|
||||
message = replacetextEx(message,"a",pick("å","ä","æ","a"))
|
||||
message = replacetextEx(message,"BO","BJO")
|
||||
message = replacetextEx(message,"Bo","Bjo")
|
||||
message = replacetextEx(message,"bo","bjo")
|
||||
message = replacetextEx(message,"O",pick("Ö","Ø","O"))
|
||||
message = replacetextEx(message,"o",pick("ö","ø","o"))
|
||||
message = replacetextEx(message,"O",pick("Ö","Ø","O"))
|
||||
message = replacetextEx(message,"o",pick("ö","ø","o"))
|
||||
if(prob(30))
|
||||
message += " Bork[pick("",", bork",", bork, bork")]!"
|
||||
return message
|
||||
@@ -259,7 +259,7 @@
|
||||
|
||||
action_icon_state = "genetic_incendiary"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets,mob/living/user = usr)
|
||||
/obj/effect/proc_holder/spell/targeted/immolate/cast(list/targets, mob/living/user = usr)
|
||||
var/mob/living/carbon/L = user
|
||||
L.adjust_fire_stacks(0.5)
|
||||
L.visible_message("<span class='danger'>[L.name]</b> suddenly bursts into flames!</span>")
|
||||
|
||||
@@ -57,12 +57,7 @@
|
||||
var/turf/simulated/T = get_turf(M)
|
||||
if(!istype(T))
|
||||
return
|
||||
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
|
||||
var/light_available
|
||||
if(L)
|
||||
light_available = L.get_clamped_lum()*10
|
||||
else
|
||||
light_available = 5
|
||||
var/light_available = T.get_lumcount() * 10
|
||||
if(light_available <= 2)
|
||||
M.alpha = round(M.alpha * 0.8)
|
||||
else
|
||||
@@ -148,15 +143,15 @@
|
||||
|
||||
action_icon_state = "genetic_cryo"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/targeted/cryokinesis/cast(list/targets, mob/user = usr)
|
||||
if(!targets.len)
|
||||
to_chat(usr, "<span class='notice'>No target found in range.</span>")
|
||||
to_chat(user, "<span class='notice'>No target found in range.</span>")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/C = targets[1]
|
||||
|
||||
if(!iscarbon(C))
|
||||
to_chat(usr, "<span class='warning'>This will only work on normal organic beings.</span>")
|
||||
to_chat(user, "<span class='warning'>This will only work on normal organic beings.</span>")
|
||||
return
|
||||
|
||||
if(RESIST_COLD in C.mutations)
|
||||
@@ -169,15 +164,15 @@
|
||||
if(istype(H.wear_suit, /obj/item/clothing/suit/space))
|
||||
handle_suit = 1
|
||||
if(H.internal)
|
||||
H.visible_message("<span class='warning'>[usr] sprays a cloud of fine ice crystals, engulfing [H]!</span>",
|
||||
"<span class='notice'>[usr] sprays a cloud of fine ice crystals over your [H.head]'s visor.</span>")
|
||||
log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] while wearing internals and a suit")
|
||||
msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]")
|
||||
H.visible_message("<span class='warning'>[user] sprays a cloud of fine ice crystals, engulfing [H]!</span>",
|
||||
"<span class='notice'>[user] sprays a cloud of fine ice crystals over your [H.head]'s visor.</span>")
|
||||
log_admin("[key_name(user)] has used cryokinesis on [key_name(C)] while wearing internals and a suit")
|
||||
msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]")
|
||||
else
|
||||
H.visible_message("<span class='warning'>[usr] sprays a cloud of fine ice crystals engulfing, [H]!</span>",
|
||||
"<span class='warning'>[usr] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.</span>")
|
||||
log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)]")
|
||||
msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]")
|
||||
H.visible_message("<span class='warning'>[user] sprays a cloud of fine ice crystals engulfing, [H]!</span>",
|
||||
"<span class='warning'>[user] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.</span>")
|
||||
log_admin("[key_name(user)] has used cryokinesis on [key_name(C)]")
|
||||
msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]")
|
||||
H.bodytemperature = max(0, H.bodytemperature - 50)
|
||||
H.adjustFireLoss(5)
|
||||
if(!handle_suit)
|
||||
@@ -185,11 +180,11 @@
|
||||
C.adjustFireLoss(10)
|
||||
C.ExtinguishMob()
|
||||
|
||||
C.visible_message("\red [usr] sprays a cloud of fine ice crystals, engulfing [C]!")
|
||||
log_admin("[key_name(usr)] has used cryokinesis on [key_name(C)] without internals or a suit")
|
||||
msg_admin_attack("[key_name_admin(usr)] has cast cryokinesis on [key_name_admin(C)]")
|
||||
C.visible_message("\red [user] sprays a cloud of fine ice crystals, engulfing [C]!")
|
||||
log_admin("[key_name(user)] has used cryokinesis on [key_name(C)] without internals or a suit")
|
||||
msg_admin_attack("[key_name_admin(user)] has cast cryokinesis on [key_name_admin(C)]")
|
||||
|
||||
//playsound(usr.loc, 'bamf.ogg', 50, 0)
|
||||
//playsound(user.loc, 'bamf.ogg', 50, 0)
|
||||
|
||||
new/obj/effect/self_deleting(C.loc, icon('icons/effects/genetics.dmi', "cryokinesis"))
|
||||
|
||||
@@ -299,10 +294,9 @@
|
||||
revert_cast(user)
|
||||
return
|
||||
|
||||
perform(targets)
|
||||
perform(targets, user = user)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets)
|
||||
var/mob/user = usr
|
||||
/obj/effect/proc_holder/spell/targeted/eat/cast(list/targets, mob/user = usr)
|
||||
if(!targets.len)
|
||||
to_chat(user, "<span class='notice'>No target found in range.</span>")
|
||||
return
|
||||
@@ -388,60 +382,60 @@
|
||||
|
||||
action_icon_state = "genetic_jump"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets)
|
||||
/obj/effect/proc_holder/spell/targeted/leap/cast(list/targets, mob/user = usr)
|
||||
var/failure = 0
|
||||
if(istype(usr.loc,/mob/) || usr.lying || usr.stunned || usr.buckled || usr.stat)
|
||||
to_chat(usr, "<span class='warning'>You can't jump right now!</span>")
|
||||
if(istype(user.loc,/mob/) || user.lying || user.stunned || user.buckled || user.stat)
|
||||
to_chat(user, "<span class='warning'>You can't jump right now!</span>")
|
||||
return
|
||||
|
||||
if(istype(usr.loc,/turf/))
|
||||
if(usr.restrained())//Why being pulled while cuffed prevents you from moving
|
||||
for(var/mob/M in range(usr, 1))
|
||||
if(M.pulling == usr)
|
||||
if(!M.restrained() && M.stat == 0 && M.canmove && usr.Adjacent(M))
|
||||
if(istype(user.loc,/turf/))
|
||||
if(user.restrained())//Why being pulled while cuffed prevents you from moving
|
||||
for(var/mob/M in range(user, 1))
|
||||
if(M.pulling == user)
|
||||
if(!M.restrained() && M.stat == 0 && M.canmove && user.Adjacent(M))
|
||||
failure = 1
|
||||
else
|
||||
M.stop_pulling()
|
||||
|
||||
if(usr.pinned.len)
|
||||
if(user.pinned.len)
|
||||
failure = 1
|
||||
|
||||
usr.visible_message("<span class='danger'>[usr.name]</b> takes a huge leap!</span>")
|
||||
playsound(usr.loc, 'sound/weapons/thudswoosh.ogg', 50, 1)
|
||||
user.visible_message("<span class='danger'>[user.name]</b> takes a huge leap!</span>")
|
||||
playsound(user.loc, 'sound/weapons/thudswoosh.ogg', 50, 1)
|
||||
if(failure)
|
||||
usr.Weaken(5)
|
||||
usr.Stun(5)
|
||||
usr.visible_message("<span class='warning'>[usr] attempts to leap away but is slammed back down to the ground!</span>",
|
||||
user.Weaken(5)
|
||||
user.Stun(5)
|
||||
user.visible_message("<span class='warning'>[user] attempts to leap away but is slammed back down to the ground!</span>",
|
||||
"<span class='warning'>You attempt to leap away but are suddenly slammed back down to the ground!</span>",
|
||||
"<span class='notice'>You hear the flexing of powerful muscles and suddenly a crash as a body hits the floor.</span>")
|
||||
return 0
|
||||
var/prevLayer = usr.layer
|
||||
var/prevFlying = usr.flying
|
||||
usr.layer = 9
|
||||
var/prevLayer = user.layer
|
||||
var/prevFlying = user.flying
|
||||
user.layer = 9
|
||||
|
||||
usr.flying = 1
|
||||
user.flying = 1
|
||||
for(var/i=0, i<10, i++)
|
||||
step(usr, usr.dir)
|
||||
if(i < 5) usr.pixel_y += 8
|
||||
else usr.pixel_y -= 8
|
||||
step(user, user.dir)
|
||||
if(i < 5) user.pixel_y += 8
|
||||
else user.pixel_y -= 8
|
||||
sleep(1)
|
||||
usr.flying = prevFlying
|
||||
user.flying = prevFlying
|
||||
|
||||
if(FAT in usr.mutations && prob(66))
|
||||
usr.visible_message("<span class='danger'>[usr.name]</b> crashes due to their heavy weight!</span>")
|
||||
//playsound(usr.loc, 'zhit.wav', 50, 1)
|
||||
usr.AdjustWeakened(10)
|
||||
usr.AdjustStunned(5)
|
||||
if(FAT in user.mutations && prob(66))
|
||||
user.visible_message("<span class='danger'>[user.name]</b> crashes due to their heavy weight!</span>")
|
||||
//playsound(user.loc, 'zhit.wav', 50, 1)
|
||||
user.AdjustWeakened(10)
|
||||
user.AdjustStunned(5)
|
||||
|
||||
usr.layer = prevLayer
|
||||
user.layer = prevLayer
|
||||
|
||||
if(istype(usr.loc,/obj/))
|
||||
var/obj/container = usr.loc
|
||||
to_chat(usr, "<span class='warning'>You leap and slam your head against the inside of [container]! Ouch!</span>")
|
||||
usr.AdjustParalysis(3)
|
||||
usr.AdjustWeakened(5)
|
||||
container.visible_message("<span class='danger'>[usr.loc]</b> emits a loud thump and rattles a bit.</span>")
|
||||
playsound(usr.loc, 'sound/effects/bang.ogg', 50, 1)
|
||||
if(istype(user.loc,/obj/))
|
||||
var/obj/container = user.loc
|
||||
to_chat(user, "<span class='warning'>You leap and slam your head against the inside of [container]! Ouch!</span>")
|
||||
user.AdjustParalysis(3)
|
||||
user.AdjustWeakened(5)
|
||||
container.visible_message("<span class='danger'>[user.loc]</b> emits a loud thump and rattles a bit.</span>")
|
||||
playsound(user.loc, 'sound/effects/bang.ogg', 50, 1)
|
||||
var/wiggle = 6
|
||||
while(wiggle > 0)
|
||||
wiggle--
|
||||
@@ -451,9 +445,6 @@
|
||||
container.pixel_x = 0
|
||||
container.pixel_y = 0
|
||||
|
||||
|
||||
return
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// WAS: /datum/bioEffect/polymorphism
|
||||
@@ -480,6 +471,7 @@
|
||||
charge_max = 1800
|
||||
|
||||
clothes_req = 0
|
||||
human_req = 1
|
||||
stat_allowed = 0
|
||||
invocation_type = "none"
|
||||
range = 1
|
||||
@@ -487,21 +479,18 @@
|
||||
|
||||
action_icon_state = "genetic_poly"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets)
|
||||
var/mob/living/M=targets[1]
|
||||
/obj/effect/proc_holder/spell/targeted/polymorph/cast(list/targets, mob/user = usr)
|
||||
var/mob/living/M = targets[1]
|
||||
if(!ishuman(M))
|
||||
to_chat(usr, "<span class='warning'>You can only change your appearance to that of another human.</span>")
|
||||
return
|
||||
|
||||
if(!ishuman(usr))
|
||||
return
|
||||
|
||||
usr.visible_message("<span class='warning'>[usr]'s body shifts and contorts.</span>")
|
||||
user.visible_message("<span class='warning'>[user]'s body shifts and contorts.</span>")
|
||||
|
||||
spawn(10)
|
||||
if(M && usr)
|
||||
playsound(usr.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(M && user)
|
||||
playsound(user.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/mob/living/carbon/human/target = M
|
||||
H.UpdateAppearance(target.dna.UI)
|
||||
H.real_name = target.real_name
|
||||
@@ -529,6 +518,7 @@
|
||||
desc = "Read the minds of others for information."
|
||||
charge_max = 180
|
||||
clothes_req = 0
|
||||
human_req = 1
|
||||
stat_allowed = 0
|
||||
invocation_type = "none"
|
||||
range = -2
|
||||
@@ -544,29 +534,26 @@
|
||||
revert_cast(user)
|
||||
return
|
||||
|
||||
perform(targets)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/empath/cast(list/targets)
|
||||
if(!ishuman(usr)) return
|
||||
|
||||
perform(targets, user = user)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/empath/cast(list/targets, mob/user = usr)
|
||||
for(var/mob/living/carbon/M in targets)
|
||||
if(!iscarbon(M))
|
||||
to_chat(usr, "<span class='warning'>You may only use this on other organic beings.</span>")
|
||||
to_chat(user, "<span class='warning'>You may only use this on other organic beings.</span>")
|
||||
return
|
||||
|
||||
if(PSY_RESIST in M.mutations)
|
||||
to_chat(usr, "<span class='warning'>You can't see into [M.name]'s mind at all!</span>")
|
||||
to_chat(user, "<span class='warning'>You can't see into [M.name]'s mind at all!</span>")
|
||||
return
|
||||
|
||||
if(M.stat == 2)
|
||||
to_chat(usr, "<span class='warning'>[M.name] is dead and cannot have their mind read.</span>")
|
||||
to_chat(user, "<span class='warning'>[M.name] is dead and cannot have their mind read.</span>")
|
||||
return
|
||||
if(M.health < 0)
|
||||
to_chat(usr, "<span class='warning'>[M.name] is dying, and their thoughts are too scrambled to read.</span>")
|
||||
to_chat(user, "<span class='warning'>[M.name] is dying, and their thoughts are too scrambled to read.</span>")
|
||||
return
|
||||
|
||||
to_chat(usr, "<span class='notice'>Mind Reading of <b>[M.name]:</b></span>")
|
||||
to_chat(user, "<span class='notice'>Mind Reading of <b>[M.name]:</b></span>")
|
||||
var/pain_condition = M.health
|
||||
// lower health means more pain
|
||||
var/list/randomthoughts = list("what to have for lunch","the future","the past","money",
|
||||
@@ -583,33 +570,33 @@
|
||||
|
||||
switch(pain_condition)
|
||||
if(81 to INFINITY)
|
||||
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] feels good.</span>")
|
||||
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] feels good.</span>")
|
||||
if(61 to 80)
|
||||
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] is suffering mild pain.</span>")
|
||||
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering mild pain.</span>")
|
||||
if(41 to 60)
|
||||
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] is suffering significant pain.</span>")
|
||||
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering significant pain.</span>")
|
||||
if(21 to 40)
|
||||
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] is suffering severe pain.</span>")
|
||||
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering severe pain.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'><b>Condition</b>: [M.name] is suffering excruciating pain.</span>")
|
||||
to_chat(user, "<span class='notice'><b>Condition</b>: [M.name] is suffering excruciating pain.</span>")
|
||||
thoughts = "haunted by their own mortality"
|
||||
|
||||
switch(M.a_intent)
|
||||
if(I_HELP)
|
||||
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense benevolent thoughts from [M.name].</span>")
|
||||
to_chat(user, "<span class='notice'><b>Mood</b>: You sense benevolent thoughts from [M.name].</span>")
|
||||
if(I_DISARM)
|
||||
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense cautious thoughts from [M.name].</span>")
|
||||
to_chat(user, "<span class='notice'><b>Mood</b>: You sense cautious thoughts from [M.name].</span>")
|
||||
if(I_GRAB)
|
||||
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense hostile thoughts from [M.name].</span>")
|
||||
to_chat(user, "<span class='notice'><b>Mood</b>: You sense hostile thoughts from [M.name].</span>")
|
||||
if(I_HARM)
|
||||
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense cruel thoughts from [M.name].</span>")
|
||||
to_chat(user, "<span class='notice'><b>Mood</b>: You sense cruel thoughts from [M.name].</span>")
|
||||
for(var/mob/living/L in view(7,M))
|
||||
if(L == M)
|
||||
continue
|
||||
thoughts = "thinking about punching [L.name]"
|
||||
break
|
||||
else
|
||||
to_chat(usr, "<span class='notice'><b>Mood</b>: You sense strange thoughts from [M.name].</span>")
|
||||
to_chat(user, "<span class='notice'><b>Mood</b>: You sense strange thoughts from [M.name].</span>")
|
||||
|
||||
if(istype(M,/mob/living/carbon/human))
|
||||
var/numbers[0]
|
||||
@@ -618,11 +605,11 @@
|
||||
numbers += H.mind.initial_account.account_number
|
||||
numbers += H.mind.initial_account.remote_access_pin
|
||||
if(numbers.len>0)
|
||||
to_chat(usr, "<span class='notice'><b>Numbers</b>: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].</span>")
|
||||
to_chat(usr, "<span class='notice'><b>Thoughts</b>: [M.name] is currently [thoughts].</span>")
|
||||
to_chat(user, "<span class='notice'><b>Numbers</b>: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].</span>")
|
||||
to_chat(user, "<span class='notice'><b>Thoughts</b>: [M.name] is currently [thoughts].</span>")
|
||||
|
||||
if(EMPATH in M.mutations)
|
||||
to_chat(M, "<span class='warning'>You sense [usr.name] reading your mind.</span>")
|
||||
to_chat(M, "<span class='warning'>You sense [user.name] reading your mind.</span>")
|
||||
else if(prob(5) || M.mind.assigned_role=="Chaplain")
|
||||
to_chat(M, "<span class='warning'>You sense someone intruding upon your thoughts...</span>")
|
||||
return
|
||||
|
||||
@@ -24,15 +24,18 @@
|
||||
if(!user)
|
||||
return 0
|
||||
to_chat(user, "<span class='notice'>We transform our appearance.</span>")
|
||||
user.dna.SetSEState(MONKEYBLOCK,0)
|
||||
domutcheck(user, null) // Do a pre-mutcheck to cleanly switch from monkey form.
|
||||
user.dna = chosen_dna
|
||||
user.dna.SetSEState(MONKEYBLOCK,0,1)
|
||||
genemutcheck(user,MONKEYBLOCK,null,MUTCHK_FORCED)
|
||||
user.dna = chosen_dna.Clone()
|
||||
user.real_name = chosen_dna.real_name
|
||||
if(istype(user))
|
||||
user.set_species(chosen_dna.species)
|
||||
domutcheck(user,null,MUTCHK_FORCED)
|
||||
user.flavor_text = ""
|
||||
if(ishuman(user))
|
||||
user.set_species()
|
||||
user.dna.UpdateSE()
|
||||
user.dna.UpdateUI()
|
||||
user.sync_organ_dna(1)
|
||||
user.UpdateAppearance()
|
||||
domutcheck(user, null)
|
||||
|
||||
changeling.purchasedpowers -= src
|
||||
//O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/lesserform(null)
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
to_chat(H, "<span class='warning'>We cannot perform this ability in this form!</span>")
|
||||
return
|
||||
|
||||
user.dna = user.dna.Clone()
|
||||
H.visible_message("<span class='warning'>[H] transforms!</span>")
|
||||
changeling.geneticdamage = 30
|
||||
to_chat(H, "<span class='warning'>Our genes cry out!</span>")
|
||||
|
||||
@@ -16,12 +16,15 @@
|
||||
return
|
||||
user.dna = chosen_dna.Clone()
|
||||
user.real_name = chosen_dna.real_name
|
||||
user.flavor_text = ""
|
||||
if(ishuman(user))
|
||||
user.set_species()
|
||||
user.set_species(chosen_dna.species)
|
||||
domutcheck(user, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them
|
||||
user.flavor_text = ""
|
||||
user.dna.UpdateSE()
|
||||
user.dna.UpdateUI()
|
||||
user.sync_organ_dna(1)
|
||||
user.UpdateAppearance()
|
||||
domutcheck(user, null)
|
||||
|
||||
|
||||
user.changeling_update_languages(changeling.absorbed_languages)
|
||||
|
||||
feedback_add_details("changeling_powers","TR")
|
||||
|
||||
@@ -193,10 +193,9 @@
|
||||
return ..()
|
||||
|
||||
/datum/action/innate/demon/whisper/proc/choose_targets(mob/user = usr)//yes i am copying from telepathy..hush...
|
||||
var/list/targets = new /list()
|
||||
var/list/validtargets = new /list()
|
||||
for(var/mob/M in view(user.client.view, user))
|
||||
if(M && M.mind)
|
||||
var/list/validtargets = list()
|
||||
for(var/mob/living/M in view(user.client.view, get_turf(user)))
|
||||
if(M && M.mind && M.stat != DEAD)
|
||||
if(M == user)
|
||||
continue
|
||||
|
||||
@@ -206,15 +205,12 @@
|
||||
to_chat(usr, "<span class='warning'>There are no valid targets!</span>")
|
||||
return
|
||||
|
||||
targets += input("Choose the target to talk to.", "Targeting") as null|mob in validtargets
|
||||
|
||||
if(!targets.len || !targets[1])
|
||||
return
|
||||
var/mob/living/target = input("Choose the target to talk to.", "Targeting") as null|mob in validtargets
|
||||
return target
|
||||
|
||||
/datum/action/innate/demon/whisper/Activate()
|
||||
var/list/choice = choose_targets()
|
||||
|
||||
if(!choice.len)
|
||||
var/mob/living/choice = choose_targets()
|
||||
if(!choice)
|
||||
return
|
||||
|
||||
var/msg = stripped_input(usr, "What do you wish to tell [choice]?", null, "")
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#define CHALLENGE_TIME_LIMIT 6000
|
||||
#define MIN_CHALLENGE_PLAYERS 50
|
||||
#define CHALLENGE_MIN_PLAYERS 50
|
||||
#define CHALLENGE_SHUTTLE_DELAY 15000 //25 minutes, so the ops have at least 5 minutes before the shuttle is callable.
|
||||
|
||||
/obj/item/device/nuclear_challenge
|
||||
@@ -9,33 +9,42 @@
|
||||
desc = "Use to send a declaration of hostilities to the target, delaying your shuttle departure for 20 minutes while they prepare for your assault. \
|
||||
Such a brazen move will attract the attention of powerful benefactors within the Syndicate, who will supply your team with a massive amount of bonus telecrystals. \
|
||||
Must be used within five minutes, or your benefactors will lose interest."
|
||||
var/declaring_war = 0
|
||||
|
||||
|
||||
var/declaring_war = FALSE
|
||||
|
||||
/obj/item/device/nuclear_challenge/attack_self(mob/living/user)
|
||||
if(declaring_war)
|
||||
return
|
||||
if(player_list.len < MIN_CHALLENGE_PLAYERS)
|
||||
to_chat(user, "The enemy crew is too small to be worth declaring war on.")
|
||||
return
|
||||
if(!is_admin_level(user.z))
|
||||
to_chat(user, "You have to be at your base to use this.")
|
||||
if(!check_allowed(user))
|
||||
return
|
||||
|
||||
if(world.time > CHALLENGE_TIME_LIMIT)
|
||||
to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.")
|
||||
declaring_war = TRUE
|
||||
var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew? You have [-round((world.time-round_start_time - CHALLENGE_TIME_LIMIT)/10)] seconds to decide.", "Declare war?", "Yes", "No")
|
||||
declaring_war = FALSE
|
||||
|
||||
if(!check_allowed(user))
|
||||
return
|
||||
|
||||
declaring_war = 1
|
||||
var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew?", "Declare war?", "Yes", "No")
|
||||
if(are_you_sure == "No")
|
||||
to_chat(user, "On second thought, the element of surprise isn't so bad after all.")
|
||||
declaring_war = 0
|
||||
return
|
||||
|
||||
var/war_declaration = "[user.real_name] has declared his intent to utterly destroy [station_name()] with a nuclear device, and dares the crew to try and stop them."
|
||||
|
||||
declaring_war = TRUE
|
||||
var/custom_threat = alert(user, "Do you want to customize your declaration?", "Customize?", "Yes", "No")
|
||||
declaring_war = FALSE
|
||||
|
||||
if(!check_allowed(user))
|
||||
return
|
||||
|
||||
if(custom_threat == "Yes")
|
||||
declaring_war = TRUE
|
||||
war_declaration = stripped_input(user, "Insert your custom declaration", "Declaration")
|
||||
declaring_war = FALSE
|
||||
|
||||
if(!check_allowed(user) || !war_declaration)
|
||||
return
|
||||
|
||||
event_announcement.Announce(war_declaration, "Declaration of War", 'sound/effects/siren.ogg')
|
||||
|
||||
to_chat(user, "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission.")
|
||||
|
||||
for(var/obj/machinery/computer/shuttle/syndicate/S in machines)
|
||||
@@ -47,7 +56,25 @@
|
||||
config.shuttle_refuel_delay = CHALLENGE_SHUTTLE_DELAY
|
||||
qdel(src)
|
||||
|
||||
/obj/item/device/nuclear_challenge/proc/check_allowed(mob/living/user)
|
||||
if(declaring_war)
|
||||
to_chat(user, "You are already in the process of declaring war! Make your mind up.")
|
||||
return FALSE
|
||||
if(player_list.len < CHALLENGE_MIN_PLAYERS)
|
||||
to_chat(user, "The enemy crew is too small to be worth declaring war on.")
|
||||
return FALSE
|
||||
if(!is_admin_level(user.z))
|
||||
to_chat(user, "You have to be at your base to use this.")
|
||||
return FALSE
|
||||
if(world.time > CHALLENGE_TIME_LIMIT)
|
||||
to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.")
|
||||
return FALSE
|
||||
for(var/obj/machinery/computer/shuttle/syndicate/S in machines)
|
||||
if(S.moved)
|
||||
to_chat(user, "The shuttle has already been moved! You have forfeit the right to declare war.")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
#undef CHALLENGE_TIME_LIMIT
|
||||
#undef MIN_CHALLENGE_PLAYERS
|
||||
#undef CHALLENGE_MIN_PLAYERS
|
||||
#undef CHALLENGE_SHUTTLE_DELAY
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
|
||||
// Standard muts
|
||||
BLINDBLOCK = getAssignedBlock("BLIND", numsToAssign)
|
||||
COLOURBLINDBLOCK = getAssignedBlock("COLOURBLIND", numsToAssign)
|
||||
DEAFBLOCK = getAssignedBlock("DEAF", numsToAssign)
|
||||
HULKBLOCK = getAssignedBlock("HULK", numsToAssign, DNA_HARD_BOUNDS, good=1)
|
||||
TELEBLOCK = getAssignedBlock("TELE", numsToAssign, DNA_HARD_BOUNDS, good=1)
|
||||
|
||||
@@ -84,8 +84,8 @@
|
||||
P.visible_message("<span class='danger'>[P]'s light fades and turns off.</span>")
|
||||
else if(istype(I, /obj/item/weapon/gun))
|
||||
var/obj/item/weapon/gun/G = I
|
||||
if(G.F)
|
||||
var/obj/item/device/flashlight/F = G.F
|
||||
if(G.gun_light)
|
||||
var/obj/item/device/flashlight/F = G.gun_light
|
||||
if(F.on)
|
||||
G.toggle_gunlight()
|
||||
G.visible_message("<span class='danger'>[G]'s light fades and turns off.</span>")
|
||||
|
||||
@@ -416,12 +416,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
|
||||
owner.alpha = 255
|
||||
return
|
||||
var/turf/simulated/T = get_turf(owner)
|
||||
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
|
||||
var/light_available
|
||||
if(L)
|
||||
light_available = L.get_clamped_lum(0.5) * 10
|
||||
else
|
||||
light_available = 10
|
||||
var/light_available = T.get_lumcount(0.5) * 10
|
||||
|
||||
if(!istype(T))
|
||||
return 0
|
||||
@@ -429,6 +424,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
|
||||
if(!iscloaking)
|
||||
owner.alpha = 255
|
||||
return 0
|
||||
|
||||
if(light_available <= 2)
|
||||
owner.alpha = round((255 * 0.15))
|
||||
return 1
|
||||
|
||||
@@ -479,8 +479,7 @@
|
||||
if(T.y > world.maxy-outer_tele_radius || T.y < outer_tele_radius)
|
||||
continue
|
||||
|
||||
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
|
||||
var/lightingcount = L.get_clamped_lum(0.5) * 10
|
||||
var/lightingcount = T.get_lumcount(0.5) * 10
|
||||
|
||||
// LIGHTING CHECK
|
||||
if(lightingcount > max_lum)
|
||||
|
||||
@@ -786,6 +786,7 @@ var/global/list/multiverse = list()
|
||||
GiveHint(target)
|
||||
cooldown = world.time +cooldown_time
|
||||
return
|
||||
|
||||
if(!link)
|
||||
if(I.loc == user && istype(I) && I.w_class <= 2)
|
||||
user.drop_item()
|
||||
@@ -794,13 +795,17 @@ var/global/list/multiverse = list()
|
||||
to_chat(user, "You attach [I] to the doll.")
|
||||
update_targets()
|
||||
..()
|
||||
|
||||
/obj/item/voodoo/check_eye(mob/user as mob)
|
||||
return src.loc == user
|
||||
if(loc != user)
|
||||
user.reset_perspective(null)
|
||||
user.unset_machine()
|
||||
|
||||
/obj/item/voodoo/attack_self(mob/user as mob)
|
||||
if(!target && possible.len)
|
||||
target = input(user, "Select your victim!", "Voodoo") as null|anything in possible
|
||||
return
|
||||
|
||||
if(user.zone_sel.selecting == "chest")
|
||||
if(link)
|
||||
target = null
|
||||
@@ -809,6 +814,7 @@ var/global/list/multiverse = list()
|
||||
link = null
|
||||
update_targets()
|
||||
return
|
||||
|
||||
if(target && cooldown < world.time)
|
||||
switch(user.zone_sel.selecting)
|
||||
if("mouth")
|
||||
|
||||
@@ -32,6 +32,11 @@
|
||||
attached_spell.attached_hand = null
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/melee/touch_attack/dropped()
|
||||
if(attached_spell)
|
||||
attached_spell.attached_hand = null
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/melee/touch_attack/disintegrate
|
||||
name = "disintegrating touch"
|
||||
desc = "This hand of mine glows with an awesome power!"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
|
||||
/mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic
|
||||
var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","hyperkinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam")
|
||||
var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","kinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam")
|
||||
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo","special")
|
||||
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic")
|
||||
|
||||
@@ -76,8 +76,8 @@
|
||||
new /obj/item/weapon/gun/energy/decloner(get_turf(H))
|
||||
if("mindflayer")
|
||||
new /obj/item/weapon/gun/energy/mindflayer(get_turf(H))
|
||||
if("hyperkinetic")
|
||||
new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper(get_turf(H))
|
||||
if("kinetic")
|
||||
new /obj/item/weapon/gun/energy/kinetic_accelerator(get_turf(H))
|
||||
if("advplasmacutter")
|
||||
new /obj/item/weapon/gun/energy/plasmacutter/adv(get_turf(H))
|
||||
if("wormhole")
|
||||
|
||||
@@ -8,84 +8,118 @@
|
||||
slot_flags = SLOT_BELT
|
||||
origin_tech = "bluespace=4;materials=4"
|
||||
var/imprinted = "empty"
|
||||
|
||||
var/usability = TRUE // Can this soul stone be used by anyone, or only cultists/wizards?
|
||||
var/reusable = TRUE // Can this soul stone be used more than once?
|
||||
var/spent = FALSE // If the soul stone can only be used once, has it been used?
|
||||
|
||||
/obj/item/device/soulstone/proc/can_use(mob/living/user)
|
||||
if(iscultist(user) || iswizard(user) || usability)
|
||||
return TRUE
|
||||
|
||||
//////////////////////////////Capturing////////////////////////////////////////////////////////
|
||||
return FALSE
|
||||
|
||||
/obj/item/device/soulstone/proc/was_used()
|
||||
if(!reusable)
|
||||
spent = TRUE
|
||||
name = "dull [name]"
|
||||
desc = "A fragment of the legendary treasure known simply as \
|
||||
the 'Soul Stone'. The shard lies still, dull and lifeless; \
|
||||
whatever spark it once held long extinguished."
|
||||
|
||||
/obj/item/device/soulstone/anybody
|
||||
usability = TRUE
|
||||
|
||||
attack(mob/living/carbon/human/M as mob, mob/user as mob)
|
||||
if(!istype(M, /mob/living/carbon/human))//If target is not a human.
|
||||
return ..()
|
||||
if(istype(M, /mob/living/carbon/human/dummy))
|
||||
return ..()
|
||||
|
||||
if(M.has_brain_worms()) //Borer stuff - RR
|
||||
to_chat(user, "<span class='warning'>This being is corrupted by an alien intelligence and cannot be soul trapped.</span>")
|
||||
return ..()
|
||||
|
||||
if(jobban_isbanned(M, "cultist") || jobban_isbanned(M, "Syndicate"))
|
||||
to_chat(user, "<span class='warning'>A mysterious force prevents you from trapping this being's soul.</span>")
|
||||
return ..()
|
||||
|
||||
M.create_attack_log("<font color='orange'>Has had their soul captured with [src.name] by [key_name(user)]</font>")
|
||||
user.create_attack_log("<font color='red'>Used the [src.name] to capture the soul of [key_name(M)]</font>")
|
||||
|
||||
log_attack("<font color='red'>[key_name(user)] used the [src.name] to capture the soul of [key_name(M)]</font>")
|
||||
|
||||
|
||||
transfer_soul("VICTIM", M, user)
|
||||
/obj/item/device/soulstone/anybody/chaplain
|
||||
name = "mysterious old shard"
|
||||
reusable = FALSE
|
||||
|
||||
/obj/item/device/soulstone/pickup(mob/living/user)
|
||||
..()
|
||||
if(!can_use(user))
|
||||
to_chat(user, "<span class='danger'>An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly.</span>")
|
||||
user.Dizzy(120)
|
||||
|
||||
//////////////////////////////Capturing////////////////////////////////////////////////////////
|
||||
/obj/item/device/soulstone/attack(mob/living/carbon/human/M as mob, mob/user as mob)
|
||||
if(!can_use(user))
|
||||
user.Paralyse(5)
|
||||
to_chat(user, "<span class='userdanger'>Your body is wracked with debilitating pain!</span>")
|
||||
return
|
||||
|
||||
/*attack(mob/living/simple_animal/shade/M as mob, mob/user as mob)//APPARENTLY THEY NEED THEIR OWN SPECIAL SNOWFLAKE CODE IN THE LIVING ANIMAL DEFINES
|
||||
if(!istype(M, /mob/living/simple_animal/shade))//If target is not a shade
|
||||
return ..()
|
||||
user.create_attack_log("<font color='red'>Used the [src.name] to capture the soul of [M.name] ([M.ckey])</font>")
|
||||
|
||||
transfer_soul("SHADE", M, user)
|
||||
return*/
|
||||
///////////////////Options for using captured souls///////////////////////////////////////
|
||||
|
||||
attack_self(mob/user)
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat = "<TT><B>Soul Stone</B><BR>"
|
||||
for(var/mob/living/simple_animal/shade/A in src)
|
||||
dat += "Captured Soul: [A.name]<br>"
|
||||
dat += {"<A href='byond://?src=[UID()];choice=Summon'>Summon Shade</A>"}
|
||||
dat += "<br>"
|
||||
dat += {"<a href='byond://?src=[UID()];choice=Close'> Close</a>"}
|
||||
user << browse(dat, "window=aicard")
|
||||
onclose(user, "aicard")
|
||||
if(spent)
|
||||
to_chat(user, "<span class='warning'>There is no power left in the shard.</span>")
|
||||
return
|
||||
|
||||
if(!ishuman(M) || istype(M, /mob/living/carbon/human/dummy)) //If target is not a human or a dummy
|
||||
return ..()
|
||||
|
||||
if(M.has_brain_worms()) //Borer stuff - RR
|
||||
to_chat(user, "<span class='warning'>This being is corrupted by an alien intelligence and cannot be soul trapped.</span>")
|
||||
return ..()
|
||||
|
||||
if(jobban_isbanned(M, "cultist") || jobban_isbanned(M, "Syndicate"))
|
||||
to_chat(user, "<span class='warning'>A mysterious force prevents you from trapping this being's soul.</span>")
|
||||
return ..()
|
||||
|
||||
M.create_attack_log("<font color='orange'>Has had their soul captured with [src.name] by [key_name(user)]</font>")
|
||||
user.create_attack_log("<font color='red'>Used the [src.name] to capture the soul of [key_name(M)]</font>")
|
||||
log_attack("<font color='red'>[key_name(user)] used the [src.name] to capture the soul of [key_name(M)]</font>")
|
||||
|
||||
Topic(href, href_list)
|
||||
var/mob/U = usr
|
||||
if(!in_range(src, U)||U.machine!=src)
|
||||
transfer_soul("VICTIM", M, user)
|
||||
return
|
||||
|
||||
///////////////////Options for using captured souls///////////////////////////////////////
|
||||
/obj/item/device/soulstone/attack_self(mob/user)
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
|
||||
if(!can_use(user))
|
||||
user.Paralyse(5)
|
||||
to_chat(user, "<span class='userdanger'>Your body is wracked with debilitating pain!</span>")
|
||||
return
|
||||
|
||||
user.set_machine(src)
|
||||
var/dat = "<TT><B>Soul Stone</B><BR>"
|
||||
for(var/mob/living/simple_animal/shade/A in src)
|
||||
dat += "Captured Soul: [A.name]<br>"
|
||||
dat += {"<A href='byond://?src=[UID()];choice=Summon'>Summon Shade</A>"}
|
||||
dat += "<br>"
|
||||
dat += {"<a href='byond://?src=[UID()];choice=Close'> Close</a>"}
|
||||
user << browse(dat, "window=aicard")
|
||||
onclose(user, "aicard")
|
||||
return
|
||||
|
||||
/obj/item/device/soulstone/Topic(href, href_list)
|
||||
var/mob/U = usr
|
||||
if(!in_range(src, U) || U.machine != src || !can_use(usr))
|
||||
U << browse(null, "window=aicard")
|
||||
U.unset_machine()
|
||||
return
|
||||
|
||||
add_fingerprint(U)
|
||||
U.set_machine(src)
|
||||
|
||||
switch(href_list["choice"])//Now we switch based on choice.
|
||||
if("Close")
|
||||
U << browse(null, "window=aicard")
|
||||
U.unset_machine()
|
||||
return
|
||||
|
||||
add_fingerprint(U)
|
||||
U.set_machine(src)
|
||||
|
||||
switch(href_list["choice"])//Now we switch based on choice.
|
||||
if("Close")
|
||||
U << browse(null, "window=aicard")
|
||||
U.unset_machine()
|
||||
return
|
||||
|
||||
if("Summon")
|
||||
for(var/mob/living/simple_animal/shade/A in src)
|
||||
A.status_flags &= ~GODMODE
|
||||
A.canmove = 1
|
||||
to_chat(A, "<b>You have been released from your prison, but you are still bound to [U.name]'s will. Help them suceed in their goals at all costs.</b>")
|
||||
A.loc = U.loc
|
||||
A.cancel_camera()
|
||||
src.icon_state = "soulstone"
|
||||
attack_self(U)
|
||||
if("Summon")
|
||||
for(var/mob/living/simple_animal/shade/A in src)
|
||||
A.status_flags &= ~GODMODE
|
||||
A.canmove = 1
|
||||
A.forceMove(get_turf(usr))
|
||||
A.cancel_camera()
|
||||
icon_state = "soulstone"
|
||||
name = initial(name)
|
||||
if(iswizard(usr) || usability)
|
||||
to_chat(A, "<b>You have been released from your prison, but you are still bound to [usr.real_name]'s will. Help them succeed in their goals at all costs.</b>")
|
||||
else if(iscultist(usr))
|
||||
to_chat(A, "<b>You have been released from your prison, but you are still bound to the cult's will. Help them succeed in their goals at all costs.</b>")
|
||||
was_used()
|
||||
attack_self(U)
|
||||
|
||||
///////////////////////////Transferring to constructs/////////////////////////////////////////////////////
|
||||
/obj/structure/constructshell
|
||||
@@ -93,15 +127,30 @@
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "construct"
|
||||
desc = "A wicked machine used by those skilled in magical arts. It is inactive"
|
||||
|
||||
/obj/structure/constructshell/examine(mob/user)
|
||||
if(..(user, 0))
|
||||
if(iscultist(user) || iswizard(user) || user.stat == DEAD)
|
||||
to_chat(user, "<span class='cult'>A construct shell, used to house bound souls from a soulstone.</span>")
|
||||
to_chat(user, "<span class='cult'>Placing a soulstone with a soul into this shell allows you to produce your choice of the following:</span>")
|
||||
to_chat(user, "<span class='cult'>An <b>Artificer</b>, which can produce <b>more shells and soulstones</b>, as well as fortifications.</span>")
|
||||
to_chat(user, "<span class='cult'>A <b>Wraith</b>, which does high damage and can jaunt through walls, though it is quite fragile.</span>")
|
||||
to_chat(user, "<span class='cult'>A <b>Juggernaut</b>, which is very hard to kill and can produce temporary walls, but is slow.</span>")
|
||||
|
||||
/obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob, params)
|
||||
if(istype(O, /obj/item/device/soulstone))
|
||||
O.transfer_soul("CONSTRUCT",src,user)
|
||||
|
||||
var/obj/item/device/soulstone/SS = O
|
||||
if(!SS.can_use(user))
|
||||
to_chat(user, "<span class='danger'>An overwhelming feeling of dread comes over you as you attempt to place the soulstone into the shell. It would be wise to be rid of this quickly.</span>")
|
||||
user.Dizzy(120)
|
||||
return
|
||||
SS.transfer_soul("CONSTRUCT",src,user)
|
||||
SS.was_used()
|
||||
else
|
||||
return ..()
|
||||
|
||||
////////////////////////////Proc for moving soul in and out off stone//////////////////////////////////////
|
||||
|
||||
|
||||
/obj/item/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob).
|
||||
switch(choice)
|
||||
if("FORCE")
|
||||
@@ -238,7 +287,6 @@
|
||||
to_chat(newstruct, "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>")
|
||||
newstruct.cancel_camera()
|
||||
|
||||
|
||||
/obj/item/device/soulstone/proc/init_shade(mob/living/carbon/human/T, mob/U, vic = 0)
|
||||
new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
|
||||
T.invisibility = 101
|
||||
@@ -268,7 +316,6 @@
|
||||
if(vic && U)
|
||||
to_chat(U, "<span class='info'><b>Capture successful!</b>:</span> [T.real_name]'s soul has been ripped from their body and stored within the soul stone.")
|
||||
|
||||
|
||||
/obj/item/device/soulstone/proc/getCultGhost(mob/living/carbon/human/T, mob/U)
|
||||
var/mob/dead/observer/chosen_ghost
|
||||
|
||||
|
||||
@@ -848,7 +848,6 @@
|
||||
to_chat(user, "<span class='warning'>[src] suddenly vanishes!</span>")
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/fake_gib
|
||||
spell = /obj/effect/proc_holder/spell/targeted/touch/fake_disintegrate
|
||||
spellname = "disintegrate"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
supervisors = "your laws"
|
||||
req_admin_notify = 1
|
||||
minimal_player_age = 30
|
||||
exp_requirements = 600
|
||||
exp_requirements = 1200
|
||||
exp_type = EXP_TYPE_CREW
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
|
||||
@@ -13,7 +13,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
|
||||
access = list() //See get_access()
|
||||
minimal_access = list() //See get_access()
|
||||
minimal_player_age = 30
|
||||
exp_requirements = 600
|
||||
exp_requirements = 1200
|
||||
exp_type = EXP_TYPE_CREW
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
@@ -237,6 +237,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
|
||||
minimal_access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels)
|
||||
alt_titles = list("Lawyer","Public Defender")
|
||||
minimal_player_age = 30
|
||||
exp_requirements = 300
|
||||
exp_type = EXP_TYPE_CREW
|
||||
idtype = /obj/item/weapon/card/id/security
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
|
||||
@@ -453,6 +453,7 @@
|
||||
occupantData["intOrgan"] = intOrganData
|
||||
|
||||
occupantData["blind"] = (H.disabilities & BLIND)
|
||||
occupantData["colourblind"] = (H.disabilities & COLOURBLIND)
|
||||
occupantData["nearsighted"] = (H.disabilities & NEARSIGHTED)
|
||||
|
||||
data["occupant"] = occupantData
|
||||
@@ -639,6 +640,8 @@
|
||||
dat += "</table>"
|
||||
if(occupant.disabilities & BLIND)
|
||||
dat += "<font color='red'>Cataracts detected.</font><BR>"
|
||||
if(occupant.disabilities & COLOURBLIND)
|
||||
dat += "<font color='red'>Photoreceptor abnormalities detected.</font><BR>"
|
||||
if(occupant.disabilities & NEARSIGHTED)
|
||||
dat += "<font color='red'>Retinal misalignment detected.</font><BR>"
|
||||
else
|
||||
|
||||
@@ -445,12 +445,12 @@ update_flag
|
||||
else
|
||||
logmsg = "Valve was <b>opened</b> by [usr] ([usr.ckey]), starting the transfer into the <font color='red'><b>air</b></font><br>"
|
||||
if(air_contents.toxins > 0)
|
||||
message_admins("[key_name_admin(usr)] opened a canister that contains plasma! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
log_admin("[key_name(usr)] opened a canister that contains plasma at [x], [y], [z]")
|
||||
message_admins("[key_name_admin(usr)] opened a canister that contains plasma in [get_area(src)]! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
log_admin("[key_name(usr)] opened a canister that contains plasma at [get_area(src)]: [x], [y], [z]")
|
||||
var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air_contents.trace_gases
|
||||
if(sleeping_agent && (sleeping_agent.moles > 1))
|
||||
message_admins("[key_name_admin(usr)] opened a canister that contains N2O! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
log_admin("[key_name(usr)] opened a canister that contains N2O at [x], [y], [z]")
|
||||
message_admins("[key_name_admin(usr)] opened a canister that contains N2O in [get_area(src)]! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
log_admin("[key_name(usr)] opened a canister that contains N2O at [get_area(src)]: [x], [y], [z]")
|
||||
investigate_log(logmsg, "atmos")
|
||||
release_log += logmsg
|
||||
valve_open = !valve_open
|
||||
|
||||
@@ -757,6 +757,17 @@ obj/item/weapon/circuitboard/rdserver
|
||||
/obj/item/stack/cable_coil = 1,
|
||||
/obj/item/weapon/stock_parts/console_screen = 1)
|
||||
|
||||
/obj/item/weapon/circuitboard/quantumpad
|
||||
name = "circuit board (Quantum Pad)"
|
||||
build_path = /obj/machinery/quantumpad
|
||||
board_type = "machine"
|
||||
origin_tech = "programming=3;engineering=3;plasmatech=3;bluespace=4"
|
||||
frame_desc = "Requires 1 Bluespace Crystal, 1 Capacitor, 1 piece of cable and 1 Manipulator."
|
||||
req_components = list(
|
||||
/obj/item/weapon/ore/bluespace_crystal = 1,
|
||||
/obj/item/weapon/stock_parts/capacitor = 1,
|
||||
/obj/item/weapon/stock_parts/manipulator = 1,
|
||||
/obj/item/stack/cable_coil = 1)
|
||||
|
||||
/obj/item/weapon/circuitboard/sleeper
|
||||
name = "circuit board (Sleeper)"
|
||||
|
||||
@@ -0,0 +1,148 @@
|
||||
/obj/machinery/quantumpad
|
||||
name = "quantum pad"
|
||||
desc = "A bluespace quantum-linked telepad used for teleporting objects to other quantum pads."
|
||||
icon = 'icons/obj/telescience.dmi'
|
||||
icon_state = "qpad-idle"
|
||||
anchored = 1
|
||||
use_power = 1
|
||||
idle_power_usage = 200
|
||||
active_power_usage = 5000
|
||||
var/teleport_cooldown = 400 //30 seconds base due to base parts
|
||||
var/teleport_speed = 50
|
||||
var/last_teleport //to handle the cooldown
|
||||
var/teleporting = 0 //if it's in the process of teleporting
|
||||
var/power_efficiency = 1
|
||||
var/obj/machinery/quantumpad/linked_pad = null
|
||||
|
||||
/obj/machinery/quantumpad/New()
|
||||
..()
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/weapon/circuitboard/quantumpad(null)
|
||||
component_parts += new /obj/item/weapon/ore/bluespace_crystal/artificial(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
|
||||
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
|
||||
component_parts += new /obj/item/stack/cable_coil(null, 1)
|
||||
RefreshParts()
|
||||
|
||||
/obj/machinery/quantumpad/Destroy()
|
||||
linked_pad = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/quantumpad/RefreshParts()
|
||||
var/E = 0
|
||||
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
|
||||
E += C.rating
|
||||
power_efficiency = E
|
||||
E = 0
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
|
||||
E += M.rating
|
||||
teleport_speed = initial(teleport_speed)
|
||||
teleport_speed -= (E*10)
|
||||
teleport_cooldown = initial(teleport_cooldown)
|
||||
teleport_cooldown -= (E * 100)
|
||||
|
||||
/obj/machinery/quantumpad/attackby(obj/item/I, mob/user, params)
|
||||
if(default_deconstruction_screwdriver(user, "pad-idle-o", "qpad-idle", I))
|
||||
return
|
||||
|
||||
if(panel_open)
|
||||
if(ismultitool(I))
|
||||
var/obj/item/device/multitool/M = I
|
||||
M.buffer = src
|
||||
to_chat(user, "<span class='notice'>You save the data in the [I.name]'s buffer.</span>")
|
||||
return 1
|
||||
else if(ismultitool(I))
|
||||
var/obj/item/device/multitool/M = I
|
||||
if(istype(M.buffer, /obj/machinery/quantumpad))
|
||||
linked_pad = M.buffer
|
||||
to_chat(user, "<span class='notice'>You link the [src] to the one in the [I.name]'s buffer.</span>")
|
||||
return 1
|
||||
|
||||
if(exchange_parts(user, I))
|
||||
return
|
||||
|
||||
if(default_deconstruction_crowbar(I))
|
||||
return
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/machinery/quantumpad/attack_hand(mob/user)
|
||||
if(panel_open)
|
||||
to_chat(user, "<span class='warning'>The panel must be closed before operating this machine!</span>")
|
||||
return
|
||||
|
||||
if(!linked_pad || qdeleted(linked_pad))
|
||||
to_chat(user, "<span class='warning'>There is no linked pad!</span>")
|
||||
return
|
||||
|
||||
if(world.time < last_teleport + teleport_cooldown)
|
||||
to_chat(user, "<span class='warning'>[src] is recharging power. Please wait [round((last_teleport + teleport_cooldown - world.time) / 10)] seconds.</span>")
|
||||
return
|
||||
|
||||
if(teleporting)
|
||||
to_chat(user, "<span class='warning'>[src] is charging up. Please wait.</span>")
|
||||
return
|
||||
|
||||
if(linked_pad.teleporting)
|
||||
to_chat(user, "<span class='warning'>Linked pad is busy. Please wait.</span>")
|
||||
return
|
||||
|
||||
if(linked_pad.stat & NOPOWER)
|
||||
to_chat(user, "<span class='warning'>Linked pad is not responding to ping.</span>")
|
||||
return
|
||||
add_fingerprint(user)
|
||||
doteleport(user)
|
||||
|
||||
/obj/machinery/quantumpad/proc/sparks()
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(5, 1, get_turf(src))
|
||||
s.start()
|
||||
|
||||
/obj/machinery/quantumpad/attack_ghost(mob/dead/observer/ghost)
|
||||
if(linked_pad)
|
||||
ghost.forceMove(get_turf(linked_pad))
|
||||
|
||||
/obj/machinery/quantumpad/proc/doteleport(mob/user)
|
||||
if(linked_pad)
|
||||
playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, 1)
|
||||
teleporting = 1
|
||||
|
||||
spawn(teleport_speed)
|
||||
if(!src || qdeleted(src))
|
||||
teleporting = 0
|
||||
return
|
||||
if(stat & NOPOWER)
|
||||
to_chat(user, "<span class='warning'>[src] is unpowered!</span>")
|
||||
teleporting = 0
|
||||
return
|
||||
if(!linked_pad || qdeleted(linked_pad) || linked_pad.stat & NOPOWER)
|
||||
to_chat(user, "<span class='warning'>Linked pad is not responding to ping. Teleport aborted.</span>")
|
||||
teleporting = 0
|
||||
return
|
||||
|
||||
teleporting = 0
|
||||
last_teleport = world.time
|
||||
|
||||
// use a lot of power
|
||||
use_power(10000 / power_efficiency)
|
||||
sparks()
|
||||
linked_pad.sparks()
|
||||
|
||||
flick("qpad-beam", src)
|
||||
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
|
||||
flick("qpad-beam", linked_pad)
|
||||
playsound(get_turf(linked_pad), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
|
||||
for(var/atom/movable/ROI in get_turf(src))
|
||||
// if is anchored, don't let through
|
||||
if(ROI.anchored)
|
||||
if(isliving(ROI))
|
||||
var/mob/living/L = ROI
|
||||
if(L.buckled)
|
||||
// TP people on office chairs
|
||||
if(L.buckled.anchored)
|
||||
continue
|
||||
else
|
||||
continue
|
||||
else if(!isobserver(ROI))
|
||||
continue
|
||||
do_teleport(ROI, get_turf(linked_pad))
|
||||
@@ -46,17 +46,13 @@
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter/precise
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
|
||||
ME.attach(src)
|
||||
|
||||
/obj/mecha/combat/gygax/dark/add_cell(var/obj/item/weapon/stock_parts/cell/C=null)
|
||||
if(C)
|
||||
C.forceMove(src)
|
||||
cell = C
|
||||
return
|
||||
cell = new(src)
|
||||
/obj/mecha/combat/gygax/dark/add_cell()
|
||||
cell = new /obj/item/weapon/stock_parts/cell/bluespace(src)
|
||||
cell.charge = 30000
|
||||
cell.maxcharge = 30000
|
||||
|
||||
|
||||
@@ -50,6 +50,11 @@
|
||||
force = 55
|
||||
max_equip = 5
|
||||
|
||||
/obj/mecha/combat/marauder/seraph/add_cell()
|
||||
cell = new /obj/item/weapon/stock_parts/cell/bluespace(src)
|
||||
cell.charge = 40000
|
||||
cell.maxcharge = 40000
|
||||
|
||||
/obj/mecha/combat/marauder/seraph/loaded/New()
|
||||
..()//Let it equip whatever is needed.
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME
|
||||
@@ -61,7 +66,7 @@
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter/precise(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
|
||||
@@ -9,17 +9,25 @@
|
||||
icon_state = "mecha_teleport"
|
||||
origin_tech = "bluespace=10"
|
||||
equip_cooldown = 150
|
||||
energy_drain = 1000
|
||||
energy_drain = 8000
|
||||
range = RANGED
|
||||
var/tele_precision = 4
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/teleporter/action(atom/target)
|
||||
if(!action_checks(target) || !is_teleport_allowed(loc.z))
|
||||
return
|
||||
var/turf/T = get_turf(target)
|
||||
if(T)
|
||||
do_teleport(chassis, T, 4)
|
||||
chassis.use_power(energy_drain)
|
||||
do_teleport(chassis, T, tele_precision)
|
||||
return 1
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/teleporter/precise
|
||||
name = "upgraded teleporter"
|
||||
desc = "An exosuit module that allows exosuits to teleport to any position in view. This is the high-precision, energy-efficient version."
|
||||
origin_tech = "bluespace=13"
|
||||
energy_drain = 1000
|
||||
tele_precision = 1
|
||||
|
||||
|
||||
////////////////////////////////////////////// WORMHOLE GENERATOR //////////////////////////////////////////
|
||||
|
||||
@@ -117,9 +117,9 @@ var/global/list/image/splatter_cache=list()
|
||||
user.hand_blood_color = basecolor
|
||||
user.update_inv_gloves(1)
|
||||
user.verbs += /mob/living/carbon/human/proc/bloody_doodle
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/blood/can_bloodcrawl_in()
|
||||
return amount
|
||||
return TRUE
|
||||
|
||||
/obj/effect/decal/cleanable/blood/splatter
|
||||
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
|
||||
|
||||
@@ -750,7 +750,7 @@ steam.start() -- spawns the effect
|
||||
var/obj/effect/effect/ion_trails/I = new /obj/effect/effect/ion_trails(src.oldposition)
|
||||
I.dir = src.holder.dir
|
||||
flick("ion_fade", I)
|
||||
I.icon_state = "blank"
|
||||
I.icon_state = ""
|
||||
spawn( 20 )
|
||||
if(I)
|
||||
I.delete()
|
||||
@@ -812,8 +812,8 @@ steam.start() -- spawns the effect
|
||||
II.dir = src.holder.dir
|
||||
flick("ion_fade", I)
|
||||
flick("ion_fade", II)
|
||||
I.icon_state = "blank"
|
||||
II.icon_state = "blank"
|
||||
I.icon_state = ""
|
||||
II.icon_state = ""
|
||||
spawn( 20 )
|
||||
if(I) I.delete()
|
||||
if(II) II.delete()
|
||||
|
||||
@@ -113,6 +113,18 @@
|
||||
layer = 4.1
|
||||
duration = 4
|
||||
|
||||
/obj/effect/overlay/temp/explosion
|
||||
name = "explosion"
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "explosion"
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
duration = 8
|
||||
|
||||
/obj/effect/overlay/temp/explosion/fast
|
||||
icon_state = "explosionfast"
|
||||
duration = 4
|
||||
|
||||
/obj/effect/overlay/temp/decoy
|
||||
desc = "It's a decoy!"
|
||||
duration = 15
|
||||
|
||||
@@ -194,6 +194,6 @@
|
||||
/obj/item/weapon/stock_parts/scanning_module = 1,
|
||||
/obj/item/weapon/spacecash/c200 = 1,
|
||||
/obj/item/weapon/airlock_electronics = 1,
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator/super = 1,
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator = 1,
|
||||
/obj/item/pizzabox = 3,
|
||||
)
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
drawtype = temp
|
||||
update_window(usr)
|
||||
|
||||
/obj/item/toy/crayon/afterattack(atom/target, mob/user as mob, proximity)
|
||||
/obj/item/toy/crayon/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity) return
|
||||
if(is_type_in_list(target,validSurfaces))
|
||||
var/temp = "rune"
|
||||
@@ -95,17 +95,22 @@
|
||||
if(!uses)
|
||||
to_chat(user, "<span class='danger'>You used up your [name]!</span>")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob)
|
||||
/obj/item/toy/crayon/attack(mob/M, mob/user)
|
||||
var/huffable = istype(src,/obj/item/toy/crayon/spraycan)
|
||||
if(M == user)
|
||||
to_chat(user, "You take a [huffable ? "huff" : "bite"] of the [name]. Delicious!")
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!H.check_has_mouth())
|
||||
to_chat(user, "<span class='warning'>You do not have a mouth!</span>")
|
||||
return
|
||||
playsound(loc, 'sound/items/eatfood.ogg', 50, 0)
|
||||
to_chat(user, "<span class='notice'>You take a [huffable ? "huff" : "bite"] of the [name]. Delicious!</span>")
|
||||
user.nutrition += 5
|
||||
if(uses)
|
||||
uses -= 5
|
||||
if(uses <= 0)
|
||||
to_chat(user, "<span class='danger'>There is no more of [name] left!</span>")
|
||||
to_chat(user, "<span class='warning'>There is no more of [name] left!</span>")
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -54,8 +54,8 @@
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = M //mob has protective eyewear
|
||||
if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES)))
|
||||
to_chat(user, "<span class='notice'>You're going to need to remove that [(H.head && H.head.flags & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) ? "mask": "glasses"] first.</span>")
|
||||
if(istype(H) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES)))
|
||||
to_chat(user, "<span class='notice'>You're going to need to remove that [(H.head && H.head.flags & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) ? "mask" : "glasses"] first.</span>")
|
||||
return
|
||||
|
||||
if(M == user) //they're using it on themselves
|
||||
@@ -70,12 +70,13 @@
|
||||
user.visible_message("<span class='notice'>[user] directs [src] to [M]'s eyes.</span>", \
|
||||
"<span class='notice'>You direct [src] to [M]'s eyes.</span>")
|
||||
|
||||
if(istype(M, /mob/living/carbon/human)) //robots and aliens are unaffected
|
||||
if(M.stat == DEAD || M.disabilities & BLIND) //mob is dead or fully blind
|
||||
to_chat(user, "<span class='notice'>[M] pupils does not react to the light!</span>")
|
||||
else if(XRAY in M.mutations) //mob has X-RAY vision
|
||||
to_chat(user, "<span class='notice'>[M] pupils give an eerie glow!</span>")
|
||||
else //they're okay!
|
||||
if(istype(H)) //robots and aliens are unaffected
|
||||
var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes)
|
||||
if(M.stat == DEAD || !eyes || M.disabilities & BLIND) //mob is dead or fully blind
|
||||
to_chat(user, "<span class='notice'>[M]'s pupils are unresponsive to the light!</span>")
|
||||
else if((XRAY in M.mutations) || (eyes.colourblind_darkview && eyes.colourblind_darkview == eyes.get_dark_view())) //The mob's either got the X-RAY vision or has a tapetum lucidum (extreme nightvision, i.e. Vulp/Tajara with COLOURBLIND & their monkey forms).
|
||||
to_chat(user, "<span class='notice'>[M]'s pupils glow eerily!</span>")
|
||||
else //they're okay!
|
||||
if(M.flash_eyes(visual = 1))
|
||||
to_chat(user, "<span class='notice'>[M]'s pupils narrow.</span>")
|
||||
else
|
||||
|
||||
@@ -25,10 +25,7 @@
|
||||
ui_interact(user)
|
||||
|
||||
/obj/item/device/guitar/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
if(!user)
|
||||
return
|
||||
|
||||
if(!isliving(user) || user.stat || user.restrained() || user.lying)
|
||||
if(!isliving(user) || user.incapacitated())
|
||||
return
|
||||
|
||||
song.ui_interact(user, ui_key, ui, force_open)
|
||||
|
||||
@@ -11,11 +11,16 @@
|
||||
var/obj/item/device/radio/radio
|
||||
var/looking_for_personality = 0
|
||||
var/mob/living/silicon/pai/pai
|
||||
var/list/faction = list("neutral") // The factions the pAI will inherit from the card
|
||||
|
||||
/obj/item/device/paicard/syndicate
|
||||
name = "syndicate personal AI device"
|
||||
faction = list("syndicate")
|
||||
|
||||
/obj/item/device/paicard/relaymove(var/mob/user, var/direction)
|
||||
if(user.stat || user.stunned)
|
||||
return
|
||||
var/obj/item/weapon/rig/rig = src.get_rig()
|
||||
var/obj/item/weapon/rig/rig = get_rig()
|
||||
if(istype(rig))
|
||||
rig.forced_move(direction, user)
|
||||
|
||||
@@ -260,7 +265,7 @@
|
||||
to_chat(usr, "\red The request system is currently offline. Please wait another [cooldown_time] seconds.")
|
||||
return
|
||||
last_request = world.time / 10
|
||||
src.looking_for_personality = 1
|
||||
looking_for_personality = 1
|
||||
paiController.findPAI(src, usr)
|
||||
if(href_list["wipe"])
|
||||
var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No")
|
||||
@@ -297,33 +302,33 @@
|
||||
// WIRE_TRANSMIT = 4
|
||||
|
||||
/obj/item/device/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
|
||||
src.pai = personality
|
||||
src.overlays += "pai-happy"
|
||||
pai = personality
|
||||
overlays += "pai-happy"
|
||||
|
||||
/obj/item/device/paicard/proc/removePersonality()
|
||||
src.pai = null
|
||||
src.overlays.Cut()
|
||||
src.overlays += "pai-off"
|
||||
pai = null
|
||||
overlays.Cut()
|
||||
overlays += "pai-off"
|
||||
|
||||
/obj/item/device/paicard
|
||||
var/current_emotion = 1
|
||||
/obj/item/device/paicard/proc/setEmotion(var/emotion)
|
||||
if(pai)
|
||||
src.overlays.Cut()
|
||||
overlays.Cut()
|
||||
switch(emotion)
|
||||
if(1) src.overlays += "pai-happy"
|
||||
if(2) src.overlays += "pai-cat"
|
||||
if(3) src.overlays += "pai-extremely-happy"
|
||||
if(4) src.overlays += "pai-face"
|
||||
if(5) src.overlays += "pai-laugh"
|
||||
if(6) src.overlays += "pai-off"
|
||||
if(7) src.overlays += "pai-sad"
|
||||
if(8) src.overlays += "pai-angry"
|
||||
if(9) src.overlays += "pai-what"
|
||||
if(1) overlays += "pai-happy"
|
||||
if(2) overlays += "pai-cat"
|
||||
if(3) overlays += "pai-extremely-happy"
|
||||
if(4) overlays += "pai-face"
|
||||
if(5) overlays += "pai-laugh"
|
||||
if(6) overlays += "pai-off"
|
||||
if(7) overlays += "pai-sad"
|
||||
if(8) overlays += "pai-angry"
|
||||
if(9) overlays += "pai-what"
|
||||
current_emotion = emotion
|
||||
|
||||
/obj/item/device/paicard/proc/alertUpdate()
|
||||
var/turf/T = get_turf_or_move(src.loc)
|
||||
var/turf/T = get_turf_or_move(loc)
|
||||
for(var/mob/M in viewers(T))
|
||||
M.show_message("\blue [src] flashes a message across its screen, \"Additional personalities available for download.\"", 3, "\blue [src] bleeps electronically.", 2)
|
||||
|
||||
|
||||
@@ -30,10 +30,7 @@
|
||||
ui_interact(user)
|
||||
|
||||
/obj/item/device/violin/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
if(!user)
|
||||
return
|
||||
|
||||
if(!isliving(user) || user.stat || user.restrained() || user.lying)
|
||||
if(!isliving(user) || user.incapacitated())
|
||||
return
|
||||
|
||||
song.ui_interact(user, ui_key, ui, force_open)
|
||||
|
||||
@@ -196,25 +196,6 @@
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/borg/upgrade/hyperka
|
||||
name = "mining cyborg hyper-kinetic accelerator"
|
||||
desc = "A satchel of holding replacement for mining cyborg's ore satchel module."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
require_module = 1
|
||||
module_type = /obj/item/weapon/robot_module/miner
|
||||
|
||||
/obj/item/borg/upgrade/hyperka/action(mob/living/silicon/robot/R)
|
||||
if(..())
|
||||
return
|
||||
|
||||
for(var/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/H in R.module.modules)
|
||||
qdel(H)
|
||||
|
||||
R.module.modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper/cyborg(R.module)
|
||||
R.module.rebuild()
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/borg/upgrade/syndicate
|
||||
name = "illegal equipment module"
|
||||
desc = "Unlocks the hidden, deadlier functions of a cyborg"
|
||||
|
||||
@@ -7,7 +7,7 @@ RCD
|
||||
/obj/item/weapon/rcd
|
||||
name = "rapid-construction-device (RCD)"
|
||||
desc = "A device used to rapidly build and deconstruct walls and floors."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "rcd"
|
||||
opacity = 0
|
||||
density = 0
|
||||
|
||||
@@ -6,8 +6,8 @@ RSF
|
||||
/obj/item/weapon/rsf
|
||||
name = "\improper Rapid-Service-Fabricator"
|
||||
desc = "A device used to rapidly deploy service items."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "rcd"
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "rsf"
|
||||
opacity = 0
|
||||
density = 0
|
||||
anchored = 0.0
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
target.apply_damage(force * fisto_setting, BRUTE)
|
||||
target.visible_message("<span class='danger'>[user]'s powerfist lets out a loud hiss as they punch [target.name]!</span>", \
|
||||
"<span class='userdanger'>You cry out in pain as [user]'s punch flings you backwards!</span>")
|
||||
new/obj/effect/kinetic_blast(target.loc)
|
||||
new /obj/effect/overlay/temp/kinetic_blast(target.loc)
|
||||
playsound(loc, 'sound/weapons/resonator_blast.ogg', 50, 1)
|
||||
playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1)
|
||||
|
||||
|
||||
@@ -12,47 +12,42 @@
|
||||
* Revolver Conversion Kit
|
||||
*/
|
||||
|
||||
/*
|
||||
* Wrench
|
||||
*/
|
||||
//Wrench
|
||||
/obj/item/weapon/wrench
|
||||
name = "wrench"
|
||||
desc = "A wrench with common uses. Can be found in your hand."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "wrench"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
force = 5.0
|
||||
throwforce = 7.0
|
||||
force = 5
|
||||
throwforce = 7
|
||||
w_class = 2
|
||||
materials = list(MAT_METAL=150)
|
||||
origin_tech = "materials=1;engineering=1"
|
||||
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
|
||||
|
||||
|
||||
/*
|
||||
* Screwdriver
|
||||
*/
|
||||
//Screwdriver
|
||||
/obj/item/weapon/screwdriver
|
||||
name = "screwdriver"
|
||||
desc = "You can be totally screwy with this."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "screwdriver"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
force = 5.0
|
||||
force = 5
|
||||
w_class = 1
|
||||
throwforce = 5.0
|
||||
throwforce = 5
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
materials = list(MAT_METAL=75)
|
||||
attack_verb = list("stabbed")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
suicide_act(mob/user)
|
||||
to_chat(viewers(user), pick("<span class='suicide'>[user] is stabbing the [src.name] into \his temple! It looks like \he's trying to commit suicide.</span>", \
|
||||
"<span class='suicide'>[user] is stabbing the [src.name] into \his heart! It looks like \he's trying to commit suicide.</span>"))
|
||||
return(BRUTELOSS)
|
||||
/obj/item/weapon/screwdriver/suicide_act(mob/user)
|
||||
to_chat(viewers(user), pick("<span class='suicide'>[user] is stabbing the [name] into \his temple! It looks like \he's trying to commit suicide.</span>", \
|
||||
"<span class='suicide'>[user] is stabbing the [name] into \his heart! It looks like \he's trying to commit suicide.</span>"))
|
||||
return(BRUTELOSS)
|
||||
|
||||
/obj/item/weapon/screwdriver/New()
|
||||
switch(pick("red","blue","purple","brown","green","cyan","yellow"))
|
||||
@@ -82,7 +77,7 @@
|
||||
src.pixel_y = rand(0, 16)
|
||||
return
|
||||
|
||||
/obj/item/weapon/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
/obj/item/weapon/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user)
|
||||
if(!istype(M) || user.a_intent == I_HELP)
|
||||
return ..()
|
||||
if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head")
|
||||
@@ -91,17 +86,15 @@
|
||||
M = user
|
||||
return eyestab(M,user)
|
||||
|
||||
/*
|
||||
* Wirecutters
|
||||
*/
|
||||
//Wirecutters
|
||||
/obj/item/weapon/wirecutters
|
||||
name = "wirecutters"
|
||||
desc = "This cuts wires."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "cutters"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
force = 6.0
|
||||
force = 6
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
w_class = 2
|
||||
@@ -112,51 +105,40 @@
|
||||
sharp = 1
|
||||
edge = 1
|
||||
|
||||
/obj/item/weapon/wirecutters/New(loc, var/param_color = null)
|
||||
/obj/item/weapon/wirecutters/New(loc, param_color = null)
|
||||
..()
|
||||
if((!param_color && prob(50)) || param_color == "yellow")
|
||||
icon_state = "cutters-y"
|
||||
item_state = "cutters_yellow"
|
||||
|
||||
/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/C as mob, mob/user as mob)
|
||||
if(istype(C) && C.handcuffed)
|
||||
if(istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
|
||||
usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\
|
||||
"You cut \the [C]'s restraints with \the [src]!",\
|
||||
/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/H, mob/user)
|
||||
if(istype(H) && H.handcuffed)
|
||||
if(istype(H.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
|
||||
usr.visible_message("\The [usr] cuts \the [H]'s restraints with \the [src]!",\
|
||||
"You cut \the [H]'s restraints with \the [src]!",\
|
||||
"You hear cable being cut.")
|
||||
C.handcuffed = null
|
||||
if(C.buckled && C.buckled.buckle_requires_restraints)
|
||||
C.buckled.unbuckle_mob()
|
||||
C.update_handcuffed()
|
||||
H.handcuffed = null
|
||||
if(H.buckled && H.buckled.buckle_requires_restraints)
|
||||
H.buckled.unbuckle_mob()
|
||||
H.update_handcuffed()
|
||||
return
|
||||
else
|
||||
..()
|
||||
|
||||
/*
|
||||
* Welding Tool
|
||||
*/
|
||||
//Welding Tool
|
||||
/obj/item/weapon/weldingtool
|
||||
name = "welding tool"
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "welder"
|
||||
item_state = "welder"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
//Amount of OUCH when it's thrown
|
||||
force = 3
|
||||
throwforce = 5
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
w_class = 2
|
||||
|
||||
//Cost to make in the autolathe
|
||||
materials = list(MAT_METAL=70, MAT_GLASS=30)
|
||||
|
||||
//R&D tech level
|
||||
origin_tech = "engineering=1"
|
||||
|
||||
//Welding tool specific stuff
|
||||
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
|
||||
var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
|
||||
var/max_fuel = 20 //The max amount of fuel the welder can hold
|
||||
@@ -198,8 +180,8 @@
|
||||
update_torch()
|
||||
return
|
||||
|
||||
/obj/item/weapon/weldingtool/attackby(obj/item/I as obj, mob/user as mob, params)
|
||||
if(istype(I, /obj/item/weapon/screwdriver))
|
||||
/obj/item/weapon/weldingtool/attackby(obj/item/I, mob/user, params)
|
||||
if(isscrewdriver(I))
|
||||
flamethrower_screwdriver(I, user)
|
||||
if(istype(I, /obj/item/stack/rods))
|
||||
flamethrower_rods(I, user)
|
||||
@@ -231,7 +213,7 @@
|
||||
if(isturf(location))
|
||||
location.hotspot_expose(700, 5)
|
||||
|
||||
/obj/item/weapon/weldingtool/attack(mob/M as mob, mob/user as mob)
|
||||
/obj/item/weapon/weldingtool/attack(mob/M, mob/user)
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting]
|
||||
@@ -289,7 +271,7 @@
|
||||
return reagents.get_reagent_amount("fuel")
|
||||
|
||||
//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use()
|
||||
/obj/item/weapon/weldingtool/proc/remove_fuel(var/amount = 1, var/mob/living/M = null)
|
||||
/obj/item/weapon/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null)
|
||||
if(!welding || !check_fuel())
|
||||
return 0
|
||||
if(get_fuel() >= amount)
|
||||
@@ -379,6 +361,7 @@
|
||||
name = "Industrial Welding Tool"
|
||||
desc = "A slightly larger welder with a larger tank."
|
||||
icon_state = "indwelder"
|
||||
icon_state = "welder"
|
||||
max_fuel = 40
|
||||
materials = list(MAT_METAL=70, MAT_GLASS=60)
|
||||
origin_tech = "engineering=2"
|
||||
@@ -402,9 +385,8 @@
|
||||
|
||||
/obj/item/weapon/weldingtool/hugetank
|
||||
name = "Upgraded Welding Tool"
|
||||
desc = "An upgraded welder based of the industrial welder."
|
||||
desc = "An upgraded welder based off the industrial welder."
|
||||
icon_state = "upindwelder"
|
||||
item_state = "upindwelder"
|
||||
max_fuel = 80
|
||||
w_class = 3
|
||||
materials = list(MAT_METAL=70, MAT_GLASS=120)
|
||||
@@ -414,15 +396,14 @@
|
||||
name = "Experimental Welding Tool"
|
||||
desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes."
|
||||
icon_state = "exwelder"
|
||||
item_state = "exwelder"
|
||||
max_fuel = 40
|
||||
w_class = 3
|
||||
materials = list(MAT_METAL=70, MAT_GLASS=120)
|
||||
origin_tech = "engineering=4;plasmatech=3"
|
||||
var/last_gen = 0
|
||||
change_icons = 0
|
||||
can_off_process = 1
|
||||
light_intensity = 1
|
||||
var/last_gen = 0
|
||||
|
||||
/obj/item/weapon/weldingtool/experimental/proc/fuel_gen()
|
||||
if(!welding && !last_gen)
|
||||
@@ -436,19 +417,16 @@
|
||||
if(reagents.total_volume < max_fuel)
|
||||
fuel_gen()
|
||||
|
||||
/*
|
||||
* Crowbar
|
||||
*/
|
||||
|
||||
//Crowbar
|
||||
/obj/item/weapon/crowbar
|
||||
name = "pocket crowbar"
|
||||
desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "crowbar"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
force = 5.0
|
||||
throwforce = 7.0
|
||||
force = 5
|
||||
throwforce = 7
|
||||
item_state = "crowbar"
|
||||
w_class = 2
|
||||
materials = list(MAT_METAL=50)
|
||||
@@ -456,7 +434,6 @@
|
||||
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
|
||||
|
||||
/obj/item/weapon/crowbar/red
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "red_crowbar"
|
||||
item_state = "crowbar_red"
|
||||
|
||||
@@ -480,14 +457,14 @@
|
||||
origin_tech = "combat=2"
|
||||
var/open = 0
|
||||
|
||||
New()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/conversion_kit/New()
|
||||
..()
|
||||
update_icon()
|
||||
icon_state = "[initial(icon_state)]_[open]"
|
||||
|
||||
attack_self(mob/user as mob)
|
||||
open = !open
|
||||
to_chat(user, "\blue You [open?"open" : "close"] the conversion kit.")
|
||||
update_icon()
|
||||
/obj/item/weapon/conversion_kit/update_icon()
|
||||
icon_state = "[initial(icon_state)]_[open]"
|
||||
|
||||
/obj/item/weapon/conversion_kit/attack_self(mob/user)
|
||||
open = !open
|
||||
to_chat(user, "\blue You [open?"open" : "close"] the conversion kit.")
|
||||
update_icon()
|
||||
|
||||
@@ -23,18 +23,14 @@
|
||||
slot_flags = SLOT_BELT
|
||||
force = 2
|
||||
throwforce = 1
|
||||
sharp = 1
|
||||
edge = 1
|
||||
w_class = 3
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
suicide_act(mob/user)
|
||||
to_chat(viewers(user), "<span class='suicide'>[user] is impaling \himself with the [src.name]! It looks like \he's trying to commit suicide.</span>")
|
||||
return(BRUTELOSS)
|
||||
|
||||
/obj/item/weapon/sord/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
||||
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
||||
return ..()
|
||||
/obj/item/weapon/sord/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is trying to impale themself with [src]! It might be a suicide attempt if it weren't so shitty.</span>", \
|
||||
"<span class='suicide'>You try to impale yourself with [src], but it's USELESS...</span>")
|
||||
return SHAME
|
||||
|
||||
/obj/item/weapon/claymore
|
||||
name = "claymore"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
/obj/structure/closet/crate
|
||||
name = "crate"
|
||||
desc = "A rectangular steel crate."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon = 'icons/obj/crates.dmi'
|
||||
icon_state = "crate"
|
||||
icon_opened = "crateopen"
|
||||
icon_closed = "crate"
|
||||
@@ -490,7 +490,6 @@
|
||||
/obj/structure/closet/crate/large
|
||||
name = "large crate"
|
||||
desc = "A hefty metal crate."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "largemetal"
|
||||
icon_opened = "largemetalopen"
|
||||
icon_closed = "largemetal"
|
||||
@@ -515,7 +514,6 @@
|
||||
/obj/structure/closet/crate/secure/large
|
||||
name = "large crate"
|
||||
desc = "A hefty metal crate with an electronic locking system."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "largemetal"
|
||||
icon_opened = "largemetalopen"
|
||||
icon_closed = "largemetal"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/obj/structure/largecrate
|
||||
name = "large crate"
|
||||
desc = "A hefty wooden crate."
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "densecrate"
|
||||
icon = 'icons/obj/crates.dmi'
|
||||
icon_state = "largecrate"
|
||||
density = 1
|
||||
var/obj/item/weapon/paper/manifest/manifest
|
||||
|
||||
@@ -49,7 +49,6 @@
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/structure/largecrate/mule
|
||||
icon_state = "mulecrate"
|
||||
|
||||
/obj/structure/largecrate/lisa
|
||||
icon_state = "lisacrate"
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
..()
|
||||
|
||||
/obj/structure/curtain/proc/toggle()
|
||||
opacity = !opacity
|
||||
set_opacity(!opacity)
|
||||
if(opacity)
|
||||
icon_state = "closed"
|
||||
layer = SHOWER_CLOSED_LAYER
|
||||
|
||||
@@ -191,7 +191,7 @@
|
||||
|
||||
Close()
|
||||
..()
|
||||
opacity = 0
|
||||
set_opacity(0)
|
||||
|
||||
/obj/structure/mineral_door/transparent/plasma
|
||||
mineralType = "plasma"
|
||||
@@ -228,7 +228,7 @@
|
||||
flick("[mineralType]opening",src)
|
||||
sleep(10)
|
||||
density = 0
|
||||
opacity = 0
|
||||
set_opacity(0)
|
||||
state = 1
|
||||
update_icon()
|
||||
isSwitchingStates = 0
|
||||
@@ -239,7 +239,7 @@
|
||||
flick("[mineralType]closing",src)
|
||||
sleep(10)
|
||||
density = 1
|
||||
opacity = 1
|
||||
set_opacity(1)
|
||||
state = 0
|
||||
update_icon()
|
||||
isSwitchingStates = 0
|
||||
@@ -265,7 +265,7 @@
|
||||
flick("[mineralType]opening",src)
|
||||
sleep(10)
|
||||
density = 0
|
||||
opacity = 0
|
||||
set_opacity(0)
|
||||
state = 1
|
||||
update_icon()
|
||||
isSwitchingStates = 0
|
||||
@@ -280,7 +280,7 @@
|
||||
flick("[mineralType]closing",src)
|
||||
sleep(10)
|
||||
density = 1
|
||||
opacity = 1
|
||||
set_opacity(1)
|
||||
state = 0
|
||||
update_icon()
|
||||
isSwitchingStates = 0
|
||||
|
||||
@@ -138,10 +138,10 @@
|
||||
return data
|
||||
|
||||
/datum/song/Topic(href, href_list)
|
||||
if(!in_range(instrumentObj, usr) || (issilicon(usr) && instrumentObj.loc != usr) || !isliving(usr) || !usr.canmove || usr.restrained())
|
||||
if(!in_range(instrumentObj, usr) || (issilicon(usr) && instrumentObj.loc != usr) || !isliving(usr) || usr.incapacitated())
|
||||
usr << browse(null, "window=instrument")
|
||||
usr.unset_machine()
|
||||
return
|
||||
return 1
|
||||
|
||||
instrumentObj.add_fingerprint(usr)
|
||||
|
||||
@@ -168,6 +168,8 @@
|
||||
//split into lines
|
||||
spawn()
|
||||
lines = splittext(t, "\n")
|
||||
if(lines.len == 0)
|
||||
return 1
|
||||
if(copytext(lines[1],1,6) == "BPM: ")
|
||||
tempo = sanitize_tempo(600 / text2num(copytext(lines[1],6)))
|
||||
lines.Cut(1,2)
|
||||
@@ -291,7 +293,7 @@
|
||||
ui_interact(user)
|
||||
|
||||
/obj/structure/piano/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
if(!user || !anchored)
|
||||
if(!isliving(user) || user.incapacitated() || !anchored)
|
||||
return
|
||||
|
||||
song.ui_interact(user, ui_key, ui, force_open)
|
||||
|
||||
@@ -55,11 +55,10 @@
|
||||
//lighting check
|
||||
var/light_amount = 0
|
||||
var/turf/T = get_turf(src)
|
||||
var/atom/movable/lighting_overlay/LO = locate(/atom/movable/lighting_overlay) in T
|
||||
if(LO)
|
||||
light_amount = LO.get_clamped_lum(0.5)*10
|
||||
if(T)
|
||||
light_amount = T.get_lumcount(0.5) * 10
|
||||
else
|
||||
light_amount = 10
|
||||
light_amount = 10
|
||||
|
||||
if(light_amount > 2)
|
||||
to_chat(M, "<span class='warning'>It's too bright here to use [src.name]!</span>")
|
||||
|
||||
@@ -93,7 +93,7 @@ var/ert_request_answered = 0
|
||||
if(response_team_members.len > 6)
|
||||
to_chat(src, "The emergency response team is already full!")
|
||||
return 0
|
||||
|
||||
|
||||
return 1
|
||||
|
||||
/proc/trigger_armed_response_team(var/datum/response_team/response_team_type)
|
||||
@@ -106,7 +106,7 @@ var/ert_request_answered = 0
|
||||
active_team.cannot_send_team()
|
||||
send_emergency_team = 0
|
||||
return 0
|
||||
|
||||
|
||||
// Respawnable players get first dibs
|
||||
for(var/mob/dead/observer/M in ert_candidates)
|
||||
if((M in respawnable_list) && M.JoinResponseTeam())
|
||||
@@ -115,7 +115,7 @@ var/ert_request_answered = 0
|
||||
for(var/mob/dead/observer/M in (ert_candidates - respawnable_list))
|
||||
if(M.JoinResponseTeam())
|
||||
response_team_members |= M
|
||||
|
||||
|
||||
if(!response_team_members.len)
|
||||
active_team.cannot_send_team()
|
||||
send_emergency_team = 0
|
||||
@@ -125,14 +125,14 @@ var/ert_request_answered = 0
|
||||
for(var/mob/M in response_team_members)
|
||||
if(index > emergencyresponseteamspawn.len)
|
||||
index = 1
|
||||
|
||||
|
||||
var/client/C = M.client
|
||||
var/mob/living/carbon/human/new_commando = C.create_response_team(emergencyresponseteamspawn[index])
|
||||
new_commando.mind.key = M.key
|
||||
new_commando.key = M.key
|
||||
new_commando.update_icons()
|
||||
index++
|
||||
|
||||
|
||||
send_emergency_team = 0
|
||||
active_team.announce_team()
|
||||
return 1
|
||||
@@ -170,8 +170,8 @@ var/ert_request_answered = 0
|
||||
head_organ.b_hair = color2B(hair_c)
|
||||
M.change_eye_color(color2R(eye_c), color2G(eye_c), color2B(eye_c))
|
||||
M.s_tone = skin_tone
|
||||
head_organ.h_style = random_hair_style(M.gender, head_organ.species.name)
|
||||
head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name)
|
||||
head_organ.h_style = random_hair_style(M.gender, head_organ.species.name)
|
||||
head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name)
|
||||
|
||||
M.real_name = "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]"
|
||||
M.name = M.real_name
|
||||
@@ -256,6 +256,7 @@ var/ert_request_answered = 0
|
||||
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
|
||||
pda.icon_state = "pda-engineer"
|
||||
M.equip_to_slot_or_del(pda, slot_wear_pda)
|
||||
M.job = "ERT Engineering"
|
||||
|
||||
|
||||
if("Security")
|
||||
@@ -280,7 +281,7 @@ var/ert_request_answered = 0
|
||||
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
|
||||
pda.icon_state = "pda-security"
|
||||
M.equip_to_slot_or_del(pda, slot_wear_pda)
|
||||
|
||||
M.job = "ERT Security"
|
||||
|
||||
if("Medic")
|
||||
medical_slots -= 1
|
||||
@@ -302,7 +303,7 @@ var/ert_request_answered = 0
|
||||
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
|
||||
pda.icon_state = "pda-medical"
|
||||
M.equip_to_slot_or_del(pda, slot_wear_pda)
|
||||
|
||||
M.job = "ERT Medical"
|
||||
|
||||
if("Commander")
|
||||
command_slots = 0
|
||||
@@ -329,6 +330,7 @@ var/ert_request_answered = 0
|
||||
pda.ownjob = "Emergency Response Team Leader"
|
||||
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
|
||||
M.equip_to_slot_or_del(pda, slot_wear_pda)
|
||||
M.job = "ERT Commander"
|
||||
|
||||
/datum/response_team/proc/cannot_send_team()
|
||||
event_announcement.Announce("[station_name()], we are unfortunately unable to send you an Emergency Response Team at this time.", "ERT Unavailable")
|
||||
|
||||
+14
-17
@@ -24,8 +24,6 @@
|
||||
|
||||
var/PathNode/PNode = null //associated PathNode in the A* algorithm
|
||||
|
||||
var/dynamic_lighting = 1
|
||||
|
||||
flags = 0
|
||||
|
||||
var/image/obscured //camerachunks
|
||||
@@ -161,10 +159,11 @@
|
||||
return src
|
||||
var/old_opacity = opacity
|
||||
var/old_dynamic_lighting = dynamic_lighting
|
||||
var/list/old_affecting_lights = affecting_lights
|
||||
var/old_affecting_lights = affecting_lights
|
||||
var/old_lighting_overlay = lighting_overlay
|
||||
var/old_blueprint_data = blueprint_data
|
||||
var/old_obscured = obscured
|
||||
var/old_corners = corners
|
||||
|
||||
BeforeChange()
|
||||
if(air_master)
|
||||
@@ -178,16 +177,19 @@
|
||||
for(var/turf/space/S in range(W,1))
|
||||
S.update_starlight()
|
||||
|
||||
lighting_overlay = old_lighting_overlay
|
||||
recalc_atom_opacity()
|
||||
|
||||
affecting_lights = old_affecting_lights
|
||||
if((old_opacity != opacity) || (dynamic_lighting != old_dynamic_lighting))
|
||||
reconsider_lights()
|
||||
if(dynamic_lighting != old_dynamic_lighting)
|
||||
if(dynamic_lighting)
|
||||
lighting_build_overlays()
|
||||
else
|
||||
lighting_clear_overlays()
|
||||
if(lighting_overlays_initialised)
|
||||
lighting_overlay = old_lighting_overlay
|
||||
affecting_lights = old_affecting_lights
|
||||
corners = old_corners
|
||||
if((old_opacity != opacity) || (dynamic_lighting != old_dynamic_lighting))
|
||||
reconsider_lights()
|
||||
if(dynamic_lighting != old_dynamic_lighting)
|
||||
if(dynamic_lighting)
|
||||
lighting_build_overlay()
|
||||
else
|
||||
lighting_clear_overlay()
|
||||
|
||||
obscured = old_obscured
|
||||
|
||||
@@ -384,11 +386,6 @@
|
||||
if(ticker)
|
||||
cameranet.updateVisibility(src)
|
||||
|
||||
/turf/proc/get_lumcount() //Gets the lighting level of a given turf.
|
||||
if(lighting_overlay)
|
||||
return lighting_overlay.get_clamped_lum()
|
||||
return 1
|
||||
|
||||
/turf/attackby(obj/item/C, mob/user, params)
|
||||
if(can_lay_cable() && istype(C, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/coil = C
|
||||
|
||||
@@ -77,6 +77,10 @@
|
||||
if(held_item)
|
||||
var/damagetype = held_item.suicide_act(src)
|
||||
if(damagetype)
|
||||
if(damagetype & SHAME)
|
||||
adjustStaminaLoss(200)
|
||||
suiciding = 0
|
||||
return
|
||||
do_suicide(damagetype, held_item)
|
||||
return
|
||||
|
||||
|
||||
Reference in New Issue
Block a user