Merge branch 'master' of https://github.com/tgstation/-tg-station into RecursiveHearVisibleMessage
Conflicts: code/game/machinery/doors/windowdoor.dm code/game/mecha/mecha.dm code/game/objects/structures.dm code/game/turfs/simulated/walls.dm code/modules/mob/living/carbon/human/human_defense.dm code/modules/mob/living/living_defense.dm
@@ -34,8 +34,6 @@
|
||||
* mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed
|
||||
*/
|
||||
/mob/proc/ClickOn( var/atom/A, var/params )
|
||||
if(!A) //yep folks, apparently such things can happen
|
||||
return
|
||||
if(world.time <= next_click)
|
||||
return
|
||||
next_click = world.time + 1
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
/atom/movable/attackby(obj/item/W, mob/living/user)
|
||||
user.do_attack_animation(src)
|
||||
if(W && !(W.flags&NOBLUDGEON))
|
||||
visible_message("<span class='danger'>[src] has been hit by [user] with [W].</span>")
|
||||
visible_message("<span class='danger'>[user] has hit [src] with [W].</span>")
|
||||
|
||||
/mob/living/attackby(obj/item/I, mob/user)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
@@ -23,18 +23,21 @@
|
||||
if(istype(location, /turf/simulated))
|
||||
location.add_blood_floor(src)
|
||||
|
||||
var/showname = "."
|
||||
if(user)
|
||||
showname = " by [user]!"
|
||||
user.do_attack_animation(src)
|
||||
if(!(user in viewers(src, null)))
|
||||
showname = "."
|
||||
var/message_verb = ""
|
||||
if(I.attack_verb && I.attack_verb.len)
|
||||
src.visible_message("<span class='danger'>[src] has been [pick(I.attack_verb)] with [I][showname]</span>",
|
||||
"<span class='userdanger'>[src] has been [pick(I.attack_verb)] with [I][showname]</span>")
|
||||
message_verb = "[pick(I.attack_verb)]"
|
||||
else if(I.force)
|
||||
src.visible_message("<span class='danger'>[src] has been attacked with [I][showname]</span>",
|
||||
"<span class='userdanger'>[src] has been attacked with [I][showname]</span>")
|
||||
message_verb = "attacked"
|
||||
|
||||
var/attack_message = "[src] has been [message_verb] with [I]."
|
||||
if(user)
|
||||
user.do_attack_animation(src)
|
||||
if(user in viewers(src, null))
|
||||
attack_message = "[user] has [message_verb] [src] with [I]!"
|
||||
if(message_verb)
|
||||
visible_message("<span class='danger'>[attack_message]</span>",
|
||||
"<span class='userdanger'>[attack_message]</span>")
|
||||
|
||||
|
||||
// Proximity_flag is 1 if this afterattack was called on something adjacent, in your square, or on your person.
|
||||
// Click parameters is the params string from byond Click() code, see that documentation.
|
||||
|
||||
@@ -56,7 +56,7 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
|
||||
var/atom/movable/holder = null
|
||||
var/list/cures = list() //list of cures if the disease has the CURABLE flag, these are reagent ids
|
||||
var/infectivity = 65
|
||||
var/cure_chance = 0
|
||||
var/cure_chance = 8
|
||||
var/carrier = 0 //If our host is only a carrier
|
||||
var/permeability_mod = 1
|
||||
var/severity = NONTHREAT
|
||||
|
||||
@@ -451,14 +451,10 @@
|
||||
|| locate(/obj/machinery/computer/cloning, get_step(src, EAST)) \
|
||||
|| locate(/obj/machinery/computer/cloning, get_step(src, WEST)))
|
||||
|
||||
if(!occupant.key && occupant.mind)
|
||||
for(var/mob/dead/observer/ghost in player_list)
|
||||
if(ghost.mind == occupant.mind)
|
||||
if(ghost.can_reenter_corpse)
|
||||
ghost << "<span class='ghostalert'>Your corpse has been placed into a cloning scanner. Return to your body if you want to be cloned!</span> (Verbs -> Ghost -> Re-enter corpse)"
|
||||
ghost << sound('sound/effects/genetics.ogg')
|
||||
break
|
||||
|
||||
var/mob/dead/observer/ghost = occupant.get_ghost()
|
||||
if(ghost)
|
||||
ghost << "<span class='ghostalert'>Your corpse has been placed into a cloning scanner. Return to your body if you want to be cloned!</span> (Verbs -> Ghost -> Re-enter corpse)"
|
||||
ghost << sound('sound/effects/genetics.ogg')
|
||||
return 1
|
||||
|
||||
/obj/machinery/dna_scannernew/proc/open(mob/user)
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
|
||||
src.visible_message("<span class='danger'>The [src.name] has been attacked with \the [W][(user ? " by [user]" : "")]!</span>")
|
||||
visible_message("<span class='danger'>[user] has attacked the [src.name] with \the [W]!</span>")
|
||||
var/damage = 0
|
||||
switch(W.damtype)
|
||||
if("fire")
|
||||
@@ -172,7 +172,7 @@
|
||||
M.changeNext_move(CLICK_CD_MELEE)
|
||||
M.do_attack_animation(src)
|
||||
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
|
||||
src.visible_message("<span class='danger'>The [src.name] has been attacked by \the [M]!</span>")
|
||||
visible_message("<span class='danger'>\The [M] has attacked the [src.name]!</span>")
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
if(!damage) // Avoid divide by zero errors
|
||||
return
|
||||
|
||||
@@ -20,13 +20,8 @@
|
||||
|
||||
/datum/game_mode/meteor/process()
|
||||
if(nometeors) return
|
||||
/*if(prob(80))
|
||||
spawn()
|
||||
dust_swarm("norm")
|
||||
else
|
||||
spawn()
|
||||
dust_swarm("strong")*/
|
||||
spawn() spawn_meteors(6)
|
||||
|
||||
spawn() spawn_meteors(6, meteors_normal)
|
||||
|
||||
|
||||
/datum/game_mode/meteor/declare_completion()
|
||||
|
||||
@@ -267,8 +267,8 @@ Auto Patrol[]"},
|
||||
if(declare_arrests)
|
||||
var/area/location = get_area(src)
|
||||
speak("[arrest_type ? "Detaining" : "Arresting"] level [threatlevel] scumbag <b>[target]</b> in [location].", radio_frequency)
|
||||
target.visible_message("<span class='danger'>[target] has been stunned by [src]!</span>",\
|
||||
"<span class='userdanger'>[target] has been stunned by [src]!</span></span>")
|
||||
target.visible_message("<span class='danger'>[src] has stunned [target]!</span>",\
|
||||
"<span class='userdanger'>[src] has stunned [target]!</span></span>")
|
||||
|
||||
mode = BOT_PREP_ARREST
|
||||
anchored = 1
|
||||
|
||||
@@ -230,8 +230,8 @@ Auto Patrol: []"},
|
||||
if(declare_arrests)
|
||||
var/area/location = get_area(src)
|
||||
speak("[arrest_type ? "Detaining" : "Arresting"] level [threatlevel] scumbag <b>[target]</b> in [location].", radio_frequency)
|
||||
target.visible_message("<span class='danger'>[target] has been stunned by [src]!</span>",\
|
||||
"<span class='userdanger'>[target] has been stunned by [src]!</span>")
|
||||
target.visible_message("<span class='danger'>[src] has stunned [target]!</span>",\
|
||||
"<span class='userdanger'>[src] has stunned [target]!</span>")
|
||||
|
||||
mode = BOT_PREP_ARREST
|
||||
anchored = 1
|
||||
|
||||
@@ -221,7 +221,7 @@
|
||||
spark_system.start()
|
||||
playsound(loc, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
playsound(loc, "sparks", 50, 1)
|
||||
visible_message("<span class='notice'>The camera has been sliced apart by [] with an energy blade!</span>")
|
||||
visible_message("<span class='notice'>[user] has sliced the camera apart with an energy blade!</span>")
|
||||
qdel(src)
|
||||
else if(istype(W, /obj/item/device/laser_pointer))
|
||||
var/obj/item/device/laser_pointer/L = W
|
||||
|
||||
@@ -898,7 +898,7 @@ About the new airlock wires panel:
|
||||
if( !istype(src, /obj/machinery/door/airlock) || !user || !W || !W.isOn() || !user.loc )
|
||||
return playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
|
||||
welded = !welded
|
||||
user.visible_message("<span class='warning'>[src] has been [welded? "welded shut":"unwelded"] by [user.name].</span>", \
|
||||
user.visible_message("<span class='warning'>[user.name] has [welded? "welded shut":"unwelded"] [src].</span>", \
|
||||
"<span class='notice'>You've [welded ? "welded the airlock shut":"unwelded the airlock"].</span>")
|
||||
update_icon()
|
||||
return
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
/obj/machinery/door/window/mech_melee_attack(obj/mecha/M)
|
||||
if(M.damtype == "brute")
|
||||
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
visible_message("<span class='danger'>[src] has been hit by [M.name].</span>")
|
||||
visible_message("<span class='danger'>[M.name] has hit [src].</span>")
|
||||
take_damage(M.force)
|
||||
return
|
||||
|
||||
@@ -349,7 +349,7 @@
|
||||
return
|
||||
var/aforce = I.force
|
||||
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
|
||||
visible_message("<span class='danger'>\The [src] has been hit by [user] with [I].</span>")
|
||||
visible_message("<span class='danger'>[user] has hit \the [src] with [I].</span>")
|
||||
if(I.damtype == BURN || I.damtype == BRUTE)
|
||||
take_damage(aforce)
|
||||
return
|
||||
|
||||
@@ -240,6 +240,10 @@ Class Procs:
|
||||
return
|
||||
if(be_close && !in_range(M, src))
|
||||
return
|
||||
//stop AIs from leaving windows open and using then after they lose vision
|
||||
//apc_override is needed here because AIs use their own APC when powerless
|
||||
if(cameranet && !cameranet.checkTurfVis(get_turf(M)) && !apc_override)
|
||||
return
|
||||
return 1
|
||||
|
||||
/mob/living/silicon/robot/canUseTopic(atom/movable/M, be_close = 0)
|
||||
|
||||
@@ -58,6 +58,8 @@
|
||||
if(M.stat>1) return
|
||||
if(chassis.occupant.a_intent == "harm")
|
||||
M.take_overall_damage(dam_force)
|
||||
if(!M)
|
||||
return
|
||||
M.adjustOxyLoss(round(dam_force/2))
|
||||
M.updatehealth()
|
||||
occupant_message("<span class='danger'>You squeeze [target] with [src.name]. Something cracks.</span>")
|
||||
@@ -142,8 +144,9 @@
|
||||
H.update_damage_overlays(0)
|
||||
else
|
||||
target.take_organ_damage(drill_damage)
|
||||
target.Paralyse(10)
|
||||
target.updatehealth()
|
||||
if(target)
|
||||
target.Paralyse(10)
|
||||
target.updatehealth()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill
|
||||
name = "diamond-tipped exosuit drill"
|
||||
|
||||
@@ -320,7 +320,7 @@ obj/mecha/proc/can_use(mob/user)
|
||||
playsound(src, 'sound/items/Welder.ogg', 50, 1)
|
||||
else
|
||||
return
|
||||
visible_message("<span class='danger'>[src] has been hit by [M.name].</span>")
|
||||
visible_message("<span class='danger'>[M.name] has hit [src].</span>")
|
||||
take_damage(M.force, damtype)
|
||||
add_logs(M.occupant, src, "attacked", object=M, addition="(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
|
||||
return
|
||||
|
||||
@@ -218,9 +218,9 @@
|
||||
/obj/structure/alien/weeds/attackby(obj/item/I, mob/user)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
if(I.attack_verb.len)
|
||||
visible_message("<span class='danger'>[src] has been [pick(I.attack_verb)] with [I] by [user].</span>")
|
||||
visible_message("<span class='danger'>[user] has [pick(I.attack_verb)] [src] with [I]!</span>")
|
||||
else
|
||||
visible_message("<span class='danger'>[src] has been attacked with [I] by [user]!</span>")
|
||||
visible_message("<span class='danger'>[user] has attacked [src] with [I]!</span>")
|
||||
|
||||
var/damage = I.force / 4.0
|
||||
if(istype(I, /obj/item/weapon/weldingtool))
|
||||
@@ -373,9 +373,9 @@
|
||||
|
||||
/obj/structure/alien/egg/attackby(obj/item/I, mob/user)
|
||||
if(I.attack_verb.len)
|
||||
visible_message("<span class='danger'>[src] has been [pick(I.attack_verb)] with [I] by [user].</span>")
|
||||
visible_message("<span class='danger'>[user] has [pick(I.attack_verb)] [src] with [I]!</span>")
|
||||
else
|
||||
visible_message("<span class='danger'>[src] has been attacked with [I] by [user]!</span>")
|
||||
visible_message("<span class='danger'>[user] has attacked [src] with [I]!</span>")
|
||||
|
||||
var/damage = I.force / 4
|
||||
if(istype(I, /obj/item/weapon/weldingtool))
|
||||
|
||||
@@ -8,13 +8,11 @@
|
||||
var/obj/item/target = null
|
||||
var/creator = null
|
||||
anchored = 1.0
|
||||
var/precision = 1 // how close to the portal you will teleport. 0 = on the portal, 1 = adjacent
|
||||
|
||||
/obj/effect/portal/Bumped(mob/M as mob|obj)
|
||||
src.teleport(M)
|
||||
|
||||
/obj/effect/portal/Crossed(AM as mob|obj)
|
||||
src.teleport(AM)
|
||||
|
||||
/obj/effect/portal/New(loc, turf/target, creator, lifespan=300)
|
||||
portals += src
|
||||
src.loc = loc
|
||||
@@ -32,6 +30,9 @@
|
||||
if(istype(creator, /obj/item/weapon/hand_tele))
|
||||
var/obj/item/weapon/hand_tele/O = creator
|
||||
O.active_portals--
|
||||
else if(istype(creator, /obj/item/weapon/gun/energy/wormhole_projector))
|
||||
var/obj/item/weapon/gun/energy/wormhole_projector/P = creator
|
||||
P.portal_destroyed(src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/portal/proc/teleport(atom/movable/M as mob|obj)
|
||||
@@ -39,11 +40,10 @@
|
||||
return
|
||||
if(M.anchored&&istype(M, /obj/mecha))
|
||||
return
|
||||
if(icon_state == "portal1")
|
||||
return
|
||||
if (!( target ))
|
||||
qdel(src)
|
||||
return
|
||||
if (istype(M, /atom/movable))
|
||||
do_teleport(M, target, 1) ///You will appear adjacent to the beacon
|
||||
do_teleport(M, target, precision) ///You will appear adjacent to the beacon
|
||||
|
||||
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
|
||||
/obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user)
|
||||
if(W.attack_verb.len)
|
||||
visible_message("<span class='danger'>\The [src] has been [pick(W.attack_verb)] with \the [W][(user ? " by [user]" : "")]!</span>")
|
||||
visible_message("<span class='danger'>[user] has [pick(W.attack_verb)] \the [src] with \the [W]!</span>")
|
||||
else
|
||||
visible_message("<span class='danger'>\The [src] has been attacked with \the [W][(user ? " by [user]" : "")]!</span>")
|
||||
visible_message("<span class='danger'>[user] has attacked \the [src] with \the [W]!</span>")
|
||||
|
||||
var/damage = W.force / 4.0
|
||||
|
||||
|
||||
@@ -313,7 +313,7 @@
|
||||
M.adjustBruteLoss(10)
|
||||
*/
|
||||
if(M != user)
|
||||
M.visible_message("<span class='danger'>[M] has been stabbed in the eye with [src] by [user]!</span>", \
|
||||
M.visible_message("<span class='danger'>[user] has stabbed [M] in the eye with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] stabs you in the eye with [src]!</span>")
|
||||
else
|
||||
user.visible_message( \
|
||||
@@ -377,11 +377,12 @@
|
||||
break
|
||||
if(.)
|
||||
var/turf/T = get_turf(src)
|
||||
T.visible_message("<span class='danger'>[src] melts away!</span>")
|
||||
var/obj/effect/decal/cleanable/molten_item/I = new (get_turf(src))
|
||||
I.pixel_x = rand(1,16)
|
||||
I.pixel_y = rand(1,16)
|
||||
I.desc = "Looks like this was \an [src] some time ago."
|
||||
if(T)
|
||||
T.visible_message("<span class='danger'>[src] melts away!</span>")
|
||||
var/obj/effect/decal/cleanable/molten_item/I = new (T)
|
||||
I.pixel_x = rand(-16,16)
|
||||
I.pixel_y = rand(-16,16)
|
||||
I.desc = "Looks like this was \an [src] some time ago."
|
||||
qdel(src)
|
||||
else
|
||||
for(var/armour_value in armor) //but is weakened
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
/obj/item/borg/upgrade/proc/action(var/mob/living/silicon/robot/R)
|
||||
if(R.stat == DEAD)
|
||||
usr << "/red The [src] will not function on a deceased cyborg."
|
||||
usr << "<span class='notice'>[src] will not function on a deceased cyborg.</span>"
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
if (user)
|
||||
if (M != user)
|
||||
user.visible_message( \
|
||||
"<span class='notice'>[M] has been applied with [src] by [user].</span>", \
|
||||
"<span class='notice'>[user] has applied [src] on [M].</span>", \
|
||||
"<span class='notice'>You apply \the [src] to [M].</span>" \
|
||||
)
|
||||
else
|
||||
|
||||
@@ -29,14 +29,15 @@ var/global/list/datum/stack_recipe/rod_recipes = list ( \
|
||||
var/obj/item/weapon/weldingtool/WT = W
|
||||
|
||||
if(get_amount() < 2)
|
||||
user << "<span class='danger'>You need at least two rods to do this.</span>"
|
||||
user << "<span class='warning'>You need at least two rods to do this.</span>"
|
||||
return
|
||||
|
||||
if(WT.remove_fuel(0,user))
|
||||
var/obj/item/stack/sheet/metal/new_item = new(usr.loc)
|
||||
new_item.add_to_stacks(usr)
|
||||
for (var/mob/M in viewers(src))
|
||||
M.show_message("<span class='danger'>[src] is shaped into metal by [user.name] with the weldingtool.</span>", 3, "<span class='danger'>You hear welding.</span>", 2)
|
||||
user.visible_message("<span class='warning'>[user.name] shaped [src] into metal with the weldingtool.</span>", \
|
||||
"<span class='notice'>You shaped [src] into metal with the weldingtool.</span>", \
|
||||
"<span class='warning'>You hear welding.</span>")
|
||||
var/obj/item/stack/rods/R = src
|
||||
src = null
|
||||
var/replace = (user.get_inactive_hand()==R)
|
||||
|
||||
@@ -31,14 +31,15 @@
|
||||
var/obj/item/weapon/weldingtool/WT = W
|
||||
|
||||
if(get_amount() < 4)
|
||||
user << "<span class='danger'>You need at least four tiles to do this.</span>"
|
||||
user << "<span class='warning'>You need at least four tiles to do this.</span>"
|
||||
return
|
||||
|
||||
if(WT.remove_fuel(0,user))
|
||||
var/obj/item/stack/sheet/metal/new_item = new(usr.loc)
|
||||
new_item.add_to_stacks(usr)
|
||||
for (var/mob/M in viewers(src))
|
||||
M.show_message("<span class='danger'>[src] is shaped into metal by [user.name] with the weldingtool.</span>", 3, "<span class='danger'>You hear welding.</span>", 2)
|
||||
user.visible_message("<span class='warning'>[user.name] shaped [src] into metal with the weldingtool.</span>", \
|
||||
"<span class='notice'>You shaped [src] into metal with the weldingtool.</span>", \
|
||||
"<span class='warning'>You hear welding.</span>")
|
||||
var/obj/item/stack/rods/R = src
|
||||
src = null
|
||||
var/replace = (user.get_inactive_hand()==R)
|
||||
|
||||
@@ -272,7 +272,8 @@
|
||||
else
|
||||
if(user.a_intent == "harm" && !defib.safety)
|
||||
busy = 1
|
||||
H.visible_message("<span class='danger'>[M.name] has been touched with [src] by [user]!</span>")
|
||||
H.visible_message("<span class='danger'>[user] has touched [H.name] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] has touched [H.name] with [src]!</span>")
|
||||
H.adjustStaminaLoss(50)
|
||||
H.Weaken(5)
|
||||
H.updatehealth() //forces health update before next life tick
|
||||
|
||||
@@ -5,9 +5,11 @@
|
||||
icon_state = "d6"
|
||||
w_class = 1
|
||||
var/sides = 6
|
||||
var/result = null
|
||||
|
||||
/obj/item/weapon/dice/New()
|
||||
icon_state = "[initial(icon_state)][rand(1, sides)]"
|
||||
result = rand(1, sides)
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/dice/d2
|
||||
name = "d2"
|
||||
@@ -60,13 +62,13 @@
|
||||
diceroll(user)
|
||||
|
||||
/obj/item/weapon/dice/proc/diceroll(mob/user as mob)
|
||||
var/result = rand(1, sides)
|
||||
result = rand(1, sides)
|
||||
var/comment = ""
|
||||
if(sides == 20 && result == 20)
|
||||
comment = "Nat 20!"
|
||||
else if(sides == 20 && result == 1)
|
||||
comment = "Ouch, bad luck."
|
||||
icon_state = "[initial(icon_state)][result]"
|
||||
update_icon()
|
||||
if(initial(icon_state) == "d00")
|
||||
result = (result - 1)*10
|
||||
if(user != null) //Dice was rolled in someone's hand
|
||||
@@ -80,4 +82,8 @@
|
||||
if(istype(H) && !H.shoes)
|
||||
H << "<span class='userdanger'>You step on the D4!</span>"
|
||||
H.apply_damage(4,BRUTE,(pick("l_leg", "r_leg")))
|
||||
H.Weaken(3)
|
||||
H.Weaken(3)
|
||||
|
||||
/obj/item/weapon/dice/update_icon()
|
||||
overlays.Cut()
|
||||
overlays += "[src.icon_state][src.result]"
|
||||
@@ -130,7 +130,7 @@
|
||||
for(var/obj/item/weapon/implant/loyalty/imp in implant_list)
|
||||
if(!imp) continue
|
||||
if(istype(imp, /obj/item/weapon/implant/loyalty))
|
||||
M.visible_message("<span class='danger'>[M] has been implanted by the [src.name].</span>")
|
||||
M.visible_message("<span class='warning'>[M] has been implanted by the [src.name].</span>")
|
||||
|
||||
if(imp.implanted(M))
|
||||
imp.loc = M
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
var/turf/T = get_turf(M)
|
||||
if(T && (M == user || do_after(user, 50)))
|
||||
if(user && M && (get_turf(M) == T) && src && imp)
|
||||
M.visible_message("<span class='warning'>[M] has been implanted by [user].</span>")
|
||||
M.visible_message("<span class='warning'>[user] has implanted [M].</span>")
|
||||
add_logs(user, M, "implanted", object="[name]")
|
||||
user << "<span class='notice'>You implanted the implant into [M].</span>"
|
||||
if(imp.implanted(M))
|
||||
|
||||
@@ -53,14 +53,14 @@
|
||||
M.stuttering = 7
|
||||
M.Stun(7)
|
||||
M.Weaken(7)
|
||||
M.visible_message("<span class='danger'>[M] has been beaten with [src] by [user]!</span>", \
|
||||
"<span class='userdanger'>[M] has been beaten with [src] by [user]!</span>")
|
||||
M.visible_message("<span class='danger'>[user] has beaten [M] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] has beaten [M] with [src]!</span>")
|
||||
else
|
||||
playsound(loc, 'sound/effects/woodhit.ogg', 50, 1, -1)
|
||||
M.Stun(7)
|
||||
M.Weaken(7)
|
||||
M.visible_message("<span class='danger'>[M] has been stunned with [src] by [user]!</span>", \
|
||||
"<span class='userdanger'>[M] has been stunned with [src] by [user]!</span>")
|
||||
M.visible_message("<span class='danger'>[user] has stunned [M] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] has stunned [M] with [src]!</span>")
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
@@ -127,7 +127,8 @@
|
||||
target.Weaken(3)
|
||||
add_logs(user, target, "stunned", object="telescopic baton")
|
||||
src.add_fingerprint(user)
|
||||
target.visible_message("<span class ='danger'>[target] has been knocked down with \the [src] by [user]!</span>")
|
||||
target.visible_message("<span class ='danger'>[user] has knocked down [target] with \the [src]!</span>", \
|
||||
"<span class ='userdanger'>[user] has knocked down [target] with \the [src]!</span>")
|
||||
if(!iscarbon(user))
|
||||
target.LAssailant = null
|
||||
else
|
||||
|
||||
@@ -35,10 +35,13 @@
|
||||
max_w_class = 5
|
||||
max_combined_w_class = 35
|
||||
|
||||
/obj/item/weapon/storage/backpack/holding/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
/obj/item/weapon/storage/backpack/holding/can_be_inserted(obj/item/W, stop_messages = 0, mob/user)
|
||||
if(crit_fail)
|
||||
user << "<span class='danger'>The Bluespace generator isn't working.</span>"
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/storage/backpack/holding/handle_item_insertion(obj/item/W, prevent_warning = 0, mob/user)
|
||||
if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail)
|
||||
investigate_log("has become a singularity. Caused by [user.key]","singulo")
|
||||
user << "<span class='danger'>The Bluespace interfaces of the two devices catastrophically malfunction!</span>"
|
||||
|
||||
@@ -85,13 +85,12 @@
|
||||
for(var/obj/item/organ/limb/affecting in H.organs)
|
||||
if(affecting.status == ORGAN_ORGANIC)
|
||||
if(message_halt == 0)
|
||||
for(var/mob/O in viewers(M, null))
|
||||
O.show_message(text("<span class='userdanger'>[] heals [] with the power of [src.deity_name]!</span>", user, M), 1)
|
||||
M << "<span class='danger'>May the power of [src.deity_name] compel you to be healed!</span>"
|
||||
M.visible_message("<span class='notice'>[user] heals [M] with the power of [src.deity_name]!</span>")
|
||||
M << "<span class='boldnotice'>May the power of [src.deity_name] compel you to be healed!</span>"
|
||||
playsound(src.loc, "punch", 25, 1, -1)
|
||||
message_halt = 1
|
||||
else
|
||||
src << "<span class='warning'>[src.deity_name] refuses to heal this metallic taint!</span>"
|
||||
user << "<span class='warning'>[src.deity_name] refuses to heal this metallic taint!</span>"
|
||||
return
|
||||
|
||||
|
||||
@@ -101,18 +100,18 @@
|
||||
if(ishuman(M) && !istype(M:head, /obj/item/clothing/head/helmet))
|
||||
M.adjustBrainLoss(10)
|
||||
M << "<span class='danger'>You feel dumber.</span>"
|
||||
for(var/mob/O in viewers(M, null))
|
||||
O.show_message(text("<span class='danger'>[user] beats [M] over the head with [src]!</span>"), 1)
|
||||
M.visible_message("<span class='danger'>[user] beats [M] over the head with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] beats [M] over the head with [src]!</span>")
|
||||
playsound(src.loc, "punch", 25, 1, -1)
|
||||
|
||||
else if(M.stat == 2)
|
||||
for(var/mob/O in viewers(M, null))
|
||||
O.show_message(text("<span class='danger'>[user] smacks [M]'s lifeless corpse with [src].</span>"), 1)
|
||||
M.visible_message("<span class='danger'>[user] smacks [M]'s lifeless corpse with [src].</span>")
|
||||
playsound(src.loc, "punch", 25, 1, -1)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/book/bible/afterattack(atom/A, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if(!proximity)
|
||||
return
|
||||
if (istype(A, /turf/simulated/floor))
|
||||
user << "<span class='notice'>You hit the floor with the bible.</span>"
|
||||
if(user.mind && (user.mind.assigned_role == "Chaplain"))
|
||||
|
||||
@@ -524,6 +524,7 @@
|
||||
storage_slots = 10
|
||||
w_class = 1
|
||||
slot_flags = SLOT_BELT
|
||||
can_hold = list(/obj/item/weapon/match)
|
||||
|
||||
/obj/item/weapon/storage/box/matches/New()
|
||||
..()
|
||||
|
||||
@@ -160,7 +160,6 @@
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigarettes/update_icon()
|
||||
icon_state = "[initial(icon_state)][contents.len]"
|
||||
desc = "There are [contents.len] cig\s left!"
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigarettes/remove_from_storage(obj/item/W, atom/new_location)
|
||||
|
||||
@@ -46,12 +46,11 @@
|
||||
spark_system.start()
|
||||
playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
playsound(src.loc, "sparks", 50, 1)
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
O.show_message(text("<span class='notice'>\The [src] has been sliced open by [] with an energy blade!</span>", user), 1, text("<span class='danger'>You hear metal being sliced and sparks flying.</span>"), 2)
|
||||
visible_message("<span class='notice'>[user] has sliced open \the [src] with an energy blade!</span>", "<span class='danger'>You hear metal being sliced and sparks flying.</span>")
|
||||
return
|
||||
else
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
O.show_message(text("<span class='notice'>\The [src] has been broken by [] with an electromagnetic card!</span>", user), 1, text("You hear a faint electrical spark."), 2)
|
||||
O.show_message("<span class='notice'>[user] has broken \the [src] with an electromagnetic card!</span>", 1, "You hear a faint electrical spark.", 2)
|
||||
return
|
||||
if(!locked)
|
||||
..()
|
||||
|
||||
@@ -206,7 +206,7 @@
|
||||
|
||||
//This proc return 1 if the item can be picked up and 0 if it can't.
|
||||
//Set the stop_messages to stop it from printing messages
|
||||
/obj/item/weapon/storage/proc/can_be_inserted(obj/item/W, stop_messages = 0)
|
||||
/obj/item/weapon/storage/proc/can_be_inserted(obj/item/W, stop_messages = 0, mob/user)
|
||||
if(!istype(W) || (W.flags & ABSTRACT)) return //Not an item
|
||||
|
||||
if(loc == W)
|
||||
@@ -263,7 +263,7 @@
|
||||
//This proc handles items being inserted. It does not perform any checks of whether an item can or can't be inserted. That's done by can_be_inserted()
|
||||
//The stop_warning parameter will stop the insertion message from being displayed. It is intended for cases where you are inserting multiple items at once,
|
||||
//such as when picking up all the items on a tile with one click.
|
||||
/obj/item/weapon/storage/proc/handle_item_insertion(obj/item/W, prevent_warning = 0)
|
||||
/obj/item/weapon/storage/proc/handle_item_insertion(obj/item/W, prevent_warning = 0, mob/user)
|
||||
if(!istype(W)) return 0
|
||||
if(usr)
|
||||
if(!usr.unEquip(W))
|
||||
@@ -334,10 +334,10 @@
|
||||
user << "<span class='notice'>You're a robot. No.</span>"
|
||||
return 0 //Robots can't interact with storage items.
|
||||
|
||||
if(!can_be_inserted(W))
|
||||
if(!can_be_inserted(W, 0 , user))
|
||||
return 0
|
||||
|
||||
handle_item_insertion(W)
|
||||
handle_item_insertion(W, 0 , user)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -409,7 +409,7 @@
|
||||
|
||||
|
||||
/obj/item/weapon/storage/New()
|
||||
|
||||
..()
|
||||
if(allow_quick_empty)
|
||||
verbs += /obj/item/weapon/storage/verb/quick_empty
|
||||
else
|
||||
|
||||
@@ -121,8 +121,8 @@
|
||||
user.do_attack_animation(L)
|
||||
baton_stun(L, user)
|
||||
else
|
||||
L.visible_message("<span class='warning'>[L] has been prodded with [src] by [user]. Luckily it was off.</span>", \
|
||||
"<span class='warning'>You've been prodded with [src] by [user]. Luckily it was off</span>")
|
||||
L.visible_message("<span class='warning'>[user] has prodded [L] with [src]. Luckily it was off.</span>", \
|
||||
"<span class='warning'>[user] has prodded you with [src]. Luckily it was off</span>")
|
||||
return
|
||||
else
|
||||
..()
|
||||
@@ -138,8 +138,8 @@
|
||||
L.Weaken(stunforce)
|
||||
L.apply_effect(STUTTER, stunforce)
|
||||
|
||||
L.visible_message("<span class='danger'>[L] has been stunned with [src] by [user]!</span>", \
|
||||
"<span class='userdanger'>You've been stunned with [src] by [user]!</span>")
|
||||
L.visible_message("<span class='danger'>[user] has stunned [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] has stunned you with [src]!</span>")
|
||||
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
|
||||
if(isrobot(loc))
|
||||
|
||||
@@ -12,6 +12,6 @@
|
||||
|
||||
/obj/structure/mech_melee_attack(obj/mecha/M)
|
||||
if(M.damtype == "brute")
|
||||
visible_message("<span class='danger'>[src] has been hit by [M.name].</span>")
|
||||
visible_message("<span class='danger'>[M.name] has hit [src].</span>")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
var/mob/M = G.affecting
|
||||
M.resting = 1
|
||||
M.loc = loc
|
||||
visible_message("<span class='notice'>[M] has been laid on [src] by [user].</span>")
|
||||
visible_message("<span class='notice'>[user] has laid [M] on [src].</span>")
|
||||
patient = M
|
||||
check_patient()
|
||||
qdel(W)
|
||||
|
||||
@@ -176,7 +176,7 @@
|
||||
return
|
||||
playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
|
||||
new /obj/item/stack/sheet/metal(src.loc)
|
||||
visible_message("<span class='notice'>\The [src] has been cut apart by [user] with \the [WT].</span>", "You hear welding.")
|
||||
visible_message("<span class='notice'>[user] has cut \the [src] apart with \the [WT].</span>", "You hear welding.")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
@@ -198,9 +198,9 @@
|
||||
return
|
||||
playsound(loc, 'sound/items/welder.ogg', 50, 1)
|
||||
welded = !welded
|
||||
user << "<span class='notice'>You [welded ? "welded the [src] shut":"unwelded the [src]"]</span>"
|
||||
user << "<span class='notice'>You [welded ? "welded [src] shut":"unwelded [src]"].</span>"
|
||||
update_icon()
|
||||
user.visible_message("<span class='warning'>[src] has been [welded? "welded shut":"unwelded"] by [user.name].</span>")
|
||||
user.visible_message("<span class='warning'>[user.name] has [welded ? "welded [src] shut":"unwelded [src]"].</span>")
|
||||
return
|
||||
else if(!place(user, W))
|
||||
src.attack_hand(user)
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
add_fingerprint(user)
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
if((O.client && !( O.blinded )))
|
||||
O << "<span class='notice'>The locker has been [locked ? null : "un"]locked by [user].</span>"
|
||||
O << "<span class='notice'>[user] has [locked ? null : "un"]locked the locker.</span>"
|
||||
if(src.locked)
|
||||
src.icon_state = src.icon_locked
|
||||
else
|
||||
@@ -77,11 +77,10 @@
|
||||
spark_system.start()
|
||||
playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
||||
playsound(src.loc, "sparks", 50, 1)
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
O.show_message("<span class='warning'>The locker has been sliced open by [user] with an energy blade!</span>", 1, "You hear metal being sliced and sparks flying.", 2)
|
||||
visible_message("<span class='warning'>[user] has sliced the locker open with an energy blade!</span>", "You hear metal being sliced and sparks flying.")
|
||||
else
|
||||
for(var/mob/O in viewers(user, 3))
|
||||
O.show_message("<span class='warning'>The locker has been broken by [user] with an electromagnetic card!</span>", 1, "You hear a faint electrical spark.", 2)
|
||||
O.show_message("<span class='warning'>[user] has broken the locker with an electromagnetic card!</span>", 1, "You hear a faint electrical spark.", 2)
|
||||
else
|
||||
..(W, user)
|
||||
|
||||
|
||||
@@ -257,17 +257,20 @@
|
||||
if(get_dist(src, user) < 2)
|
||||
var/obj/item/weapon/grab/G = I
|
||||
if(G.affecting.buckled)
|
||||
user << "<span class='notice'>[G.affecting] is buckled to [G.affecting.buckled]!</span>"
|
||||
return
|
||||
user << "<span class='warning'>[G.affecting] is buckled to [G.affecting.buckled]!</span>"
|
||||
return 0
|
||||
if(G.state < GRAB_AGGRESSIVE)
|
||||
user << "<span class='notice'>You need a better grip to do that!</span>"
|
||||
return
|
||||
user << "<span class='warning'>You need a better grip to do that!</span>"
|
||||
return 0
|
||||
if(!G.confirm())
|
||||
return
|
||||
return 0
|
||||
G.affecting.loc = src.loc
|
||||
G.affecting.Weaken(5)
|
||||
G.affecting.visible_message("<span class='danger'>[G.assailant] pushes [G.affecting] onto [src].</span>", \
|
||||
"<span class='userdanger'>[G.assailant] pushes [G.affecting] onto [src].</span>")
|
||||
add_logs(G.assailant, G.affecting, "pushed")
|
||||
qdel(I)
|
||||
return 1
|
||||
qdel(I)
|
||||
|
||||
/obj/structure/table/attackby(obj/item/I, mob/user)
|
||||
@@ -373,15 +376,21 @@
|
||||
/obj/structure/table/proc/climb_table(mob/user)
|
||||
src.add_fingerprint(user)
|
||||
user.visible_message("<span class='warning'>[user] starts climbing onto [src].</span>", \
|
||||
"<span class='notice'>[user] starts climbing onto [src].</span>")
|
||||
if(do_mob(user, user, 20))
|
||||
user.pass_flags += PASSTABLE
|
||||
step(user,get_dir(user,src.loc))
|
||||
user.pass_flags -= PASSTABLE
|
||||
user.visible_message("<span class='warning'>[user] climbs onto [src].</span>", \
|
||||
"<span class='notice'>[user] climbs onto [src].</span>")
|
||||
add_logs(user, src, "climbed onto")
|
||||
user.Stun(2)
|
||||
"<span class='notice'>You start climbing onto [src].</span>")
|
||||
var/climb_time = 20
|
||||
if(user.restrained()) //Table climbing takes twice as long when restrained.
|
||||
climb_time *= 2
|
||||
if(do_mob(user, user, climb_time))
|
||||
if(src.loc) //Checking if table has been destroyed
|
||||
user.pass_flags += PASSTABLE
|
||||
step(user,get_dir(user,src.loc))
|
||||
user.pass_flags -= PASSTABLE
|
||||
user.visible_message("<span class='warning'>[user] climbs onto [src].</span>", \
|
||||
"<span class='notice'>You climb onto [src].</span>")
|
||||
add_logs(user, src, "climbed onto")
|
||||
user.Stun(2)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/*
|
||||
@@ -394,37 +403,17 @@
|
||||
buildstack = /obj/item/stack/sheet/glass
|
||||
|
||||
/obj/structure/table/glass/tablepush(obj/item/I, mob/user)
|
||||
if(get_dist(src, user) < 2)
|
||||
var/obj/item/weapon/grab/G = I
|
||||
if(G.affecting.buckled)
|
||||
user << "<span class='notice'>[G.affecting] is buckled to [G.affecting.buckled]!</span>"
|
||||
return
|
||||
if(G.state < GRAB_AGGRESSIVE)
|
||||
user << "<span class='notice'>You need a better grip to do that!</span>"
|
||||
return
|
||||
if(!G.confirm())
|
||||
return
|
||||
G.affecting.loc = src.loc
|
||||
G.affecting.Weaken(5)
|
||||
G.affecting.visible_message("<span class='danger'>[G.assailant] smashes [G.affecting] into [src].</span>", \
|
||||
"<span class='userdanger'>[G.assailant] smashes [G.affecting] into [src].</span>")
|
||||
if(..())
|
||||
visible_message("<span class='warning'>[src] breaks!</span>")
|
||||
playsound(src.loc, "shatter", 50, 1)
|
||||
new frame(src.loc)
|
||||
new /obj/item/weapon/shard(src.loc)
|
||||
qdel(src)
|
||||
qdel(I)
|
||||
|
||||
|
||||
/obj/structure/table/glass/climb_table(mob/user)
|
||||
src.add_fingerprint(user)
|
||||
user.visible_message("<span class='warning'>[user] starts climbing onto [src].</span>", \
|
||||
"<span class='notice'>[user] starts climbing onto [src].</span>")
|
||||
if(do_mob(user, user, 20))
|
||||
user.pass_flags += PASSTABLE
|
||||
step(user,get_dir(user,src.loc))
|
||||
user.pass_flags -= PASSTABLE
|
||||
user.visible_message("<span class='warning'>[user] climbs onto [src], and it breaks!.</span>", \
|
||||
"<span class='notice'>[user] climbs onto [src], and it breaks!.</span>")
|
||||
add_logs(user, src, "climbed onto")
|
||||
if(..())
|
||||
visible_message("<span class='warning'>[src] breaks!</span>")
|
||||
playsound(src.loc, "shatter", 50, 1)
|
||||
new frame(src.loc)
|
||||
new /obj/item/weapon/shard(src.loc)
|
||||
|
||||
@@ -99,16 +99,21 @@
|
||||
var/tforce = 0
|
||||
if(ismob(AM))
|
||||
tforce = 40
|
||||
|
||||
else if(isobj(AM))
|
||||
var/obj/item/I = AM
|
||||
tforce = I.throwforce
|
||||
if(reinf) tforce *= 0.25
|
||||
|
||||
if(reinf)
|
||||
tforce *= 0.25
|
||||
|
||||
playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
|
||||
health = max(0, health - tforce)
|
||||
if(health <= 7 && !reinf)
|
||||
anchored = 0
|
||||
update_nearby_icons()
|
||||
step(src, get_dir(AM, src))
|
||||
|
||||
if(health <= 0)
|
||||
spawnfragments()
|
||||
update_nearby_icons()
|
||||
@@ -159,28 +164,43 @@
|
||||
update_nearby_icons()
|
||||
|
||||
/obj/structure/window/attack_animal(mob/living/user as mob)
|
||||
if(!isanimal(user)) return
|
||||
if(!isanimal(user))
|
||||
return
|
||||
|
||||
var/mob/living/simple_animal/M = user
|
||||
M.do_attack_animation(src)
|
||||
if(M.melee_damage_upper <= 0) return
|
||||
if(M.melee_damage_upper <= 0)
|
||||
return
|
||||
|
||||
attack_generic(M, M.melee_damage_upper)
|
||||
update_nearby_icons()
|
||||
|
||||
/obj/structure/window/attack_slime(mob/living/carbon/slime/user as mob)
|
||||
user.do_attack_animation(src)
|
||||
if(!user.is_adult) return
|
||||
if(!user.is_adult)
|
||||
return
|
||||
|
||||
attack_generic(user, rand(10, 15))
|
||||
update_nearby_icons()
|
||||
|
||||
/obj/structure/window/attackby(obj/item/I, mob/living/user)
|
||||
if(!can_be_reached(user))
|
||||
return 1 //returning 1 will skip the afterattack()
|
||||
return 1 //skip the afterattack
|
||||
|
||||
add_fingerprint(user)
|
||||
if(istype(I, /obj/item/weapon/screwdriver))
|
||||
playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
|
||||
if(reinf && (state == 2 || state == 1))
|
||||
user << (state == 2 ? "<span class='notice'>You begin to unscrew the window from the frame.</span>" : "<span class='notice'>You begin to screw the window to the frame.</span>")
|
||||
else if(reinf && state == 0)
|
||||
user << (anchored ? "<span class='notice'>You begin to unscrew the frame from the floor.</span>" : "<span class='notice'>You begin to screw the frame to the floor.</span>")
|
||||
else if(!reinf)
|
||||
user << (anchored ? "<span class='notice'>You begin to unscrew the window from the floor.</span>" : "<span class='notice'>You begin to screw the window to the floor.</span>")
|
||||
|
||||
if(do_after(user, 40))
|
||||
if(reinf && state >= 1)
|
||||
state = 3 - state
|
||||
if(reinf && (state == 1 || state == 2))
|
||||
//If state was unfastened, fasten it, else do the reverse
|
||||
state = (state == 1 ? 2 : 1)
|
||||
user << (state == 1 ? "<span class='notice'>You have unfastened the window from the frame.</span>" : "<span class='notice'>You have fastened the window to the frame.</span>")
|
||||
else if(reinf && state == 0)
|
||||
anchored = !anchored
|
||||
@@ -190,11 +210,15 @@
|
||||
anchored = !anchored
|
||||
update_nearby_icons()
|
||||
user << (anchored ? "<span class='notice'>You have fastened the window to the floor.</span>" : "<span class='notice'>You have unfastened the window.</span>")
|
||||
else if(istype(I, /obj/item/weapon/crowbar) && reinf && state <= 1)
|
||||
|
||||
else if (istype(I, /obj/item/weapon/crowbar) && reinf && (state == 0 || state == 1))
|
||||
user << (state == 0 ? "<span class='notice'>You begin to lever the window into the frame.</span>" : "<span class='notice'>You begin to lever the window out of the frame.</span>")
|
||||
playsound(loc, 'sound/items/Crowbar.ogg', 75, 1)
|
||||
if(do_after(user, 40))
|
||||
state = 1 - state
|
||||
user << (state ? "<span class='notice'>You have pried the window into the frame.</span>" : "<span class='notice'>You have pried the window out of the frame.</span>")
|
||||
//If state was out of frame, put into frame, else do the reverse
|
||||
state = (state == 0 ? 1 : 0)
|
||||
user << (state == 1 ? "<span class='notice'>You have pried the window into the frame.</span>" : "<span class='notice'>You have pried the window out of the frame.</span>")
|
||||
|
||||
else if(istype(I, /obj/item/weapon/weldingtool))
|
||||
var/obj/item/weapon/weldingtool/WT = I
|
||||
if(user.a_intent == "help") //so you can still break windows with welding tools
|
||||
@@ -208,24 +232,33 @@
|
||||
else
|
||||
user << "<span class='notice'>[src] is already in good condition.</span>"
|
||||
update_nearby_icons()
|
||||
|
||||
else if(istype(I, /obj/item/weapon/wrench) && !anchored)
|
||||
playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
|
||||
user << "<span class='notice'> You begin to disassemble [src].</span>"
|
||||
if(do_after(user, 40))
|
||||
if(disassembled)
|
||||
return //Prevents multiple deconstruction attempts
|
||||
|
||||
if(reinf)
|
||||
var/obj/item/stack/sheet/rglass/RG = new (user.loc)
|
||||
RG.add_fingerprint(user)
|
||||
if(fulltile) //fulltiles drop two panes
|
||||
RG = new (user.loc)
|
||||
RG.add_fingerprint(user)
|
||||
|
||||
else
|
||||
var/obj/item/stack/sheet/glass/G = new (user.loc)
|
||||
G.add_fingerprint(user)
|
||||
if(fulltile)
|
||||
G = new (user.loc)
|
||||
G.add_fingerprint(user)
|
||||
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
disassembled = 1
|
||||
user << "<span class='notice'> You successfully disassemble [src].</span>"
|
||||
qdel(src)
|
||||
|
||||
else
|
||||
if(I.damtype == BRUTE || I.damtype == BURN)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
/turf/simulated/wall/mech_melee_attack(obj/mecha/M)
|
||||
if(M.damtype == "brute")
|
||||
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
|
||||
visible_message("<span class='danger'>[src] has been hit by [M.name].</span>")
|
||||
visible_message("<span class='danger'>[M.name] has hit [src]!</span>")
|
||||
if(prob(5) && M.force > 20)
|
||||
dismantle_wall(1)
|
||||
visible_message("<span class='warning'>[src.name] smashes through the wall!</span>")
|
||||
|
||||
@@ -51,11 +51,13 @@
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
var/suicide_message = pick("[src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \
|
||||
"[src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \
|
||||
"[src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \
|
||||
"[src] is holding \his breath! It looks like \he's trying to commit suicide.")
|
||||
|
||||
visible_message("<span class='danger'>[suicide_message]</span>", "<span class='userdanger'>[suicide_message]</span>")
|
||||
|
||||
visible_message(pick("<span class='userdanger'>[src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.</span>", \
|
||||
"<span class='userdanger'>[src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.</span>", \
|
||||
"<span class='danger'>[src] is twisting \his own neck! It looks like \he's trying to commit suicide.</span>", \
|
||||
"<span class='danger'>[src] is holding \his breath! It looks like \he's trying to commit suicide.</span>"))
|
||||
adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
|
||||
updatehealth()
|
||||
|
||||
@@ -68,7 +70,8 @@
|
||||
return
|
||||
if(confirm == "Yes")
|
||||
suiciding = 1
|
||||
viewers(loc) << "<span class='userdanger'>[src]'s brain is growing dull and lifeless. It looks like it's lost the will to live.</span>"
|
||||
visible_message("<span class='danger'>[src]'s brain is growing dull and lifeless. It looks like it's lost the will to live.</span>", \
|
||||
"<span class='userdanger'>[src]'s brain is growing dull and lifeless. It looks like it's lost the will to live.</span>")
|
||||
spawn(50)
|
||||
death(0)
|
||||
suiciding = 0
|
||||
@@ -83,7 +86,8 @@
|
||||
if(confirm == "Yes")
|
||||
suiciding = 1
|
||||
//instead of killing them instantly, just put them at -175 health and let 'em gasp for a while
|
||||
viewers(src) << "<span class='userdanger'>[src] is attempting to bite \his tongue. It looks like \he's trying to commit suicide.</span>"
|
||||
visible_message("<span class='danger'>[src] is attempting to bite \his tongue. It looks like \he's trying to commit suicide.</span>", \
|
||||
"<span class='userdanger'>[src] is attempting to bite \his tongue. It looks like \he's trying to commit suicide.</span>")
|
||||
adjustOxyLoss(max(175- getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
|
||||
updatehealth()
|
||||
|
||||
@@ -96,7 +100,8 @@
|
||||
return
|
||||
if(confirm == "Yes")
|
||||
suiciding = 1
|
||||
viewers(src) << "<span class='userdanger'>[src] is powering down. It looks like \he's trying to commit suicide.</span>"
|
||||
visible_message("<span class='danger'>[src] is powering down. It looks like \he's trying to commit suicide.</span>", \
|
||||
"<span class='userdanger'>[src] is powering down. It looks like \he's trying to commit suicide.</span>")
|
||||
//put em at -175
|
||||
adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
|
||||
updatehealth()
|
||||
@@ -110,7 +115,8 @@
|
||||
return
|
||||
if(confirm == "Yes")
|
||||
suiciding = 1
|
||||
viewers(src) << "<span class='userdanger'>[src] is powering down. It looks like \he's trying to commit suicide.</span>"
|
||||
visible_message("<span class='danger'>[src] is powering down. It looks like \he's trying to commit suicide.</span>", \
|
||||
"<span class='userdanger'>[src] is powering down. It looks like \he's trying to commit suicide.</span>")
|
||||
//put em at -175
|
||||
adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
|
||||
updatehealth()
|
||||
@@ -122,8 +128,8 @@
|
||||
var/answer = input("REALLY kill yourself? This action can't be undone.", "Suicide", "No") in list ("Yes", "No")
|
||||
if(answer == "Yes")
|
||||
card.removePersonality()
|
||||
for (var/mob/M in viewers(loc))
|
||||
M.show_message("<span class='notice'>[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"</span>", 3, "<span class='notice'>[src] bleeps electronically.</span>", 2)
|
||||
var/turf/T = get_turf(src.loc)
|
||||
T.visible_message("<span class='notice'>[src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"</span>", "<span class='notice'>[src] bleeps electronically.</span>")
|
||||
death(0)
|
||||
else
|
||||
src << "Aborting suicide attempt."
|
||||
@@ -137,7 +143,9 @@
|
||||
return
|
||||
if(confirm == "Yes")
|
||||
suiciding = 1
|
||||
viewers(src) << "<span class='userdanger'>[src] is thrashing wildly! It looks like \he's trying to commit suicide.</span>"
|
||||
visible_message("<span class='danger'>[src] is thrashing wildly! It looks like \he's trying to commit suicide.</span>", \
|
||||
"<span class='userdanger'>[src] is thrashing wildly! It looks like \he's trying to commit suicide.</span>", \
|
||||
"<span class='notice'>You hear thrashing</span>")
|
||||
//put em at -175
|
||||
adjustOxyLoss(max(175 - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
|
||||
updatehealth()
|
||||
@@ -152,6 +160,8 @@
|
||||
return
|
||||
if(confirm == "Yes")
|
||||
suiciding = 1
|
||||
visible_message("<span class='danger'>[src] is growing dull and lifeless. It looks like it's lost the will to live.</span>", \
|
||||
"<span class='userdanger'>[src] is growing dull and lifeless. It looks like it's lost the will to live.</span>")
|
||||
setOxyLoss(100)
|
||||
adjustBruteLoss(100 - getBruteLoss())
|
||||
setToxLoss(100)
|
||||
|
||||
@@ -16,7 +16,8 @@ var/list/admin_verbs_default = list(
|
||||
/client/proc/reload_admins,
|
||||
/client/proc/reestablish_db_connection,/*reattempt a connection to the database*/
|
||||
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
|
||||
/client/proc/cmd_admin_pm_panel /*admin-pm list*/
|
||||
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
|
||||
/client/proc/stop_sounds
|
||||
)
|
||||
var/list/admin_verbs_admin = list(
|
||||
/client/proc/player_panel, /*shows an interface for all players, with links to various panels (old style)*/
|
||||
@@ -69,7 +70,6 @@ var/list/admin_verbs_ban = list(
|
||||
var/list/admin_verbs_sounds = list(
|
||||
/client/proc/play_local_sound,
|
||||
/client/proc/play_sound,
|
||||
/client/proc/stop_sounds
|
||||
)
|
||||
var/list/admin_verbs_fun = list(
|
||||
/client/proc/cmd_admin_dress,
|
||||
@@ -416,10 +416,18 @@ var/list/admin_verbs_hideable = list(
|
||||
if("Big Bomb")
|
||||
explosion(epicenter, 3, 5, 7, 5)
|
||||
if("Custom Bomb")
|
||||
var/devastation_range = input("Devastation range (in tiles):") as num
|
||||
var/heavy_impact_range = input("Heavy impact range (in tiles):") as num
|
||||
var/light_impact_range = input("Light impact range (in tiles):") as num
|
||||
var/flash_range = input("Flash range (in tiles):") as num
|
||||
var/devastation_range = input("Devastation range (in tiles):") as null|num
|
||||
if(devastation_range == null)
|
||||
return
|
||||
var/heavy_impact_range = input("Heavy impact range (in tiles):") as null|num
|
||||
if(heavy_impact_range == null)
|
||||
return
|
||||
var/light_impact_range = input("Light impact range (in tiles):") as null|num
|
||||
if(light_impact_range == null)
|
||||
return
|
||||
var/flash_range = input("Flash range (in tiles):") as null|num
|
||||
if(flash_range == null)
|
||||
return
|
||||
explosion(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range)
|
||||
message_admins("<span class='adminnotice'>[ckey] creating an admin explosion at [epicenter.loc].</span>")
|
||||
feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -39,15 +39,13 @@ var/sound/admin_sound
|
||||
/client/proc/stop_sounds()
|
||||
set category = "Debug"
|
||||
set name = "Stop Sounds"
|
||||
if((check_rights(R_SOUNDS)) || (check_rights(R_DEBUG)))
|
||||
if(!src.holder) return
|
||||
|
||||
log_admin("[key_name(src)] stopped all currently playing sounds.")
|
||||
message_admins("[key_name_admin(src)] stopped all currently playing sounds.")
|
||||
for(var/mob/M in player_list)
|
||||
if(M.client)
|
||||
M << sound(null)
|
||||
feedback_add_details("admin_verb","SS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
log_admin("[key_name(src)] stopped all currently playing sounds.")
|
||||
message_admins("[key_name_admin(src)] stopped all currently playing sounds.")
|
||||
for(var/mob/M in player_list)
|
||||
if(M.client)
|
||||
M << sound(null)
|
||||
feedback_add_details("admin_verb","SS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
else
|
||||
return
|
||||
#undef SOUND_CHANNEL_ADMIN
|
||||
@@ -156,24 +156,41 @@
|
||||
|
||||
//The next part of the code assumes there's ALWAYS an /area AND a /turf on a given tile
|
||||
|
||||
//first instance the /area and remove it from the members list
|
||||
var/length = members.len
|
||||
var/atom/instance
|
||||
var/dmm_suite/preloader/_preloader = new(members_attributes[length])//preloader for assigning set variables on atom creation
|
||||
//in case of multiples turfs on one tile,
|
||||
//will contains the images of all underlying turfs, to simulate the DMM multiple tiles piling
|
||||
var/list/turfs_underlays = list()
|
||||
|
||||
instance = locate(members[length])
|
||||
//first instance the /area and remove it from the members list
|
||||
index = members.len
|
||||
var/atom/instance
|
||||
var/dmm_suite/preloader/_preloader = new(members_attributes[index])//preloader for assigning set variables on atom creation
|
||||
|
||||
instance = locate(members[index])
|
||||
instance.contents.Add(locate(xcrd,ycrd,zcrd))
|
||||
|
||||
if(_preloader && instance)
|
||||
_preloader.load(instance)
|
||||
|
||||
members.Remove(members[length])
|
||||
members.Remove(members[index])
|
||||
|
||||
//then instance the /turf and remove it from the members list
|
||||
length = members.len
|
||||
//then instance the /turf and, if multiple tiles are presents, simulates the DMM underlays piling effect
|
||||
|
||||
var/first_turf_index = 1
|
||||
while(!ispath(members[first_turf_index],/turf)) //find first /turf object in members
|
||||
first_turf_index++
|
||||
|
||||
//instanciate the first /turf
|
||||
var/turf/T = instance_atom(members[first_turf_index],members_attributes[first_turf_index],xcrd,ycrd,zcrd)
|
||||
|
||||
//if others /turf are presents, simulates the underlays piling effect
|
||||
index = first_turf_index + 1
|
||||
while(index <= members.len)
|
||||
turfs_underlays.Insert(1,image(T.icon,null,T.icon_state,T.layer,T.dir))//add the current turf image to the underlays list
|
||||
var/turf/UT = instance_atom(members[index],members_attributes[index],xcrd,ycrd,zcrd)//instance new turf
|
||||
add_underlying_turf(UT,T,turfs_underlays)//simulates the DMM piling effect
|
||||
T = UT
|
||||
index++
|
||||
|
||||
instance_atom(members[length],members_attributes[length],xcrd,ycrd,zcrd)
|
||||
members.Remove(members[length])
|
||||
|
||||
//Replace the previous part of the code with this if it's unsafe to assume tiles have ALWAYS an /area AND a /turf
|
||||
/*while(members.len > 0)
|
||||
@@ -203,8 +220,8 @@
|
||||
*/
|
||||
|
||||
//finally instance all remainings objects/mobs
|
||||
for(var/k=1,k<=members.len,k++)
|
||||
instance_atom(members[k],members_attributes[k],xcrd,ycrd,zcrd)
|
||||
for(index=1,index < first_turf_index,index++)
|
||||
instance_atom(members[index],members_attributes[index],xcrd,ycrd,zcrd)
|
||||
|
||||
////////////////
|
||||
//Helpers procs
|
||||
@@ -220,6 +237,8 @@
|
||||
if(_preloader && instance)//second preloader pass, as some variables may have been reset/changed by New()
|
||||
_preloader.load(instance)
|
||||
|
||||
return instance
|
||||
|
||||
//text trimming (both directions) helper proc
|
||||
//optionally removes quotes before and after the text (for variable name)
|
||||
/dmm_suite/proc/trim_text(var/what as text,var/trim_quotes=0)
|
||||
@@ -296,8 +315,16 @@
|
||||
|
||||
return to_return
|
||||
|
||||
//simulates the DM multiple turfs on one tile underlaying
|
||||
/dmm_suite/proc/add_underlying_turf(var/turf/placed,var/turf/underturf, var/list/turfs_underlays)
|
||||
if(underturf.density)
|
||||
placed.density = 1
|
||||
if(underturf.opacity)
|
||||
placed.opacity = 1
|
||||
placed.underlays += turfs_underlays
|
||||
|
||||
//atom creation method that preloads variables before creation
|
||||
atom/New(atom/loc, dmm_suite/preloader/_dmm_preloader)
|
||||
/atom/New(atom/loc, dmm_suite/preloader/_dmm_preloader)
|
||||
if(istype(_dmm_preloader, /dmm_suite/preloader))
|
||||
_dmm_preloader.load(src)
|
||||
. = ..()
|
||||
|
||||
@@ -89,10 +89,10 @@
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/verb/adjust(var/mob/user)
|
||||
/obj/item/clothing/mask/gas/sechailer/verb/adjust()
|
||||
set category = "Object"
|
||||
set name = "Adjust Mask"
|
||||
adjustmask(user)
|
||||
adjustmask(usr)
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/attack_self()
|
||||
halt()
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
item_state = "deathsquad"
|
||||
armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
|
||||
unacidable = 1
|
||||
|
||||
/obj/item/clothing/suit/space/deathsquad
|
||||
name = "deathsquad suit"
|
||||
@@ -37,6 +39,8 @@
|
||||
armor = list(melee = 80, bullet = 80, laser = 50,energy = 50, bomb = 100, bio = 100, rad = 100)
|
||||
slowdown = 1
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
|
||||
unacidable = 1
|
||||
|
||||
/obj/item/clothing/head/helmet/space/deathsquad/beret
|
||||
name = "officer's beret"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
allowed = list(/obj/item/weapon/stock_parts/cell)
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 25)
|
||||
strip_delay = 12
|
||||
unacidable = 1
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja
|
||||
@@ -15,6 +16,7 @@
|
||||
item_state = "s-ninja_suit"
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/stock_parts/cell)
|
||||
slowdown = 0
|
||||
unacidable = 1
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
strip_delay = 12
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR|THICKMATERIAL
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
|
||||
unacidable = 1
|
||||
|
||||
/obj/item/clothing/suit/bio_suit
|
||||
name = "bio suit"
|
||||
@@ -24,6 +25,7 @@
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
strip_delay = 70
|
||||
put_on_delay = 70
|
||||
unacidable = 1
|
||||
|
||||
//Standard biosuit, orange stripe
|
||||
/obj/item/clothing/head/bio_hood/general
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag)
|
||||
if(ismob(target) && target.reagents && reagents.total_volume)
|
||||
user.visible_message("<span class='danger'>\The [target] has been smothered with \the [src] by \the [user]!</span>", "<span class='danger'>You smother \the [target] with \the [src]!</span>", "You hear some struggling and muffled cries of surprise")
|
||||
user.visible_message("<span class='danger'>[user] has smothered \the [target] with \the [src]!</span>", "<span class='danger'>You smother \the [target] with \the [src]!</span>", "You hear some struggling and muffled cries of surprise")
|
||||
src.reagents.reaction(target, TOUCH)
|
||||
src.reagents.clear_reagents()
|
||||
return
|
||||
|
||||
@@ -248,7 +248,7 @@ proc/check_panel(mob/M)
|
||||
/obj/effect/fake_attacker/attackby(var/obj/item/weapon/P as obj, mob/user as mob)
|
||||
step_away(src,my_target,2)
|
||||
my_target.visible_message("<span class='danger'>[my_target] flails around wildly.</span>", \
|
||||
"<span class='userdanger'>[src] has been attacked by [my_target] </span>")
|
||||
"<span class='danger'>[my_target] has attacked [src]!</span>")
|
||||
|
||||
src.health -= P.force
|
||||
|
||||
@@ -305,7 +305,7 @@ proc/check_panel(mob/M)
|
||||
if(prob(15))
|
||||
if(weapon_name)
|
||||
my_target << sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg'))
|
||||
my_target.show_message("<span class='danger'>[my_target] has been attacked with [weapon_name] by [src.name]!</span>", 1)
|
||||
my_target.show_message("<span class='danger'>[src.name] has attacked [my_target] with [weapon_name]!</span>", 1)
|
||||
my_target.staminaloss += 30
|
||||
if(prob(20)) my_target.eye_blurry += 3
|
||||
if(prob(33))
|
||||
|
||||
@@ -80,21 +80,20 @@
|
||||
target.apply_damage(force, BRUTE, affecting, armor_block)
|
||||
|
||||
// You are going to knock someone out for longer if they are not wearing a helmet.
|
||||
var/head_attack_message = ""
|
||||
if(affecting == "head" && istype(target, /mob/living/carbon/))
|
||||
|
||||
//Display an attack message.
|
||||
for(var/mob/O in viewers(user, null))
|
||||
if(target != user) O.show_message(text("<span class='danger'>[target] has been hit over the head with a bottle of [src.name], by [user]!</span>"), 1)
|
||||
else O.show_message(text("<span class='danger'>[target] hits himself with a bottle of [src.name] on the head!</span>"), 1)
|
||||
head_attack_message = " on the head"
|
||||
//Weaken the target for the duration that we calculated and divide it by 5.
|
||||
if(armor_duration)
|
||||
target.apply_effect(min(armor_duration, 10) , WEAKEN) // Never weaken more than a flash!
|
||||
|
||||
//Display an attack message.
|
||||
if(target != user)
|
||||
target.visible_message("<span class='danger'>[user] has hit [target][head_attack_message] with a bottle of [src.name]!</span>", \
|
||||
"<span class='userdanger'>[user] has hit [target][head_attack_message] with a bottle of [src.name]!</span>")
|
||||
else
|
||||
//Default attack message and don't weaken the target.
|
||||
for(var/mob/O in viewers(user, null))
|
||||
if(target != user) O.show_message(text("<span class='danger'>[target] has been attacked with a bottle of [src.name], by [user]!</span>"), 1)
|
||||
else O.show_message(text("<span class='danger'>[target] has attacked himself with a bottle of [src.name]!</span>"), 1)
|
||||
user.visible_message("<span class='danger'>[target] hits himself with a bottle of [src.name][head_attack_message]!</span>", \
|
||||
"<span class='userdanger'>[target] hits himself with a bottle of [src.name][head_attack_message]!</span>")
|
||||
|
||||
//Attack logs
|
||||
add_logs(user, target, "attacked", object="bottle")
|
||||
|
||||
@@ -639,21 +639,33 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice()
|
||||
name = "killer-tomato"
|
||||
desc = "I say to-mah-to, you say tom-mae-to... OH GOD IT'S EATING MY LEGS!!"
|
||||
icon_state = "killertomato"
|
||||
var/awakening = 0
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer/attack(mob/M, mob/user, def_zone)
|
||||
if(awakening)
|
||||
user << "<span class='warning'>The tomato is twitching and shaking, preventing you from eating it.</span>"
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer/attack_self(mob/user as mob)
|
||||
if(istype(user.loc,/turf/space))
|
||||
if(awakening || istype(user.loc,/turf/space))
|
||||
return
|
||||
user << "<span class='notice'>You begin to awaken the Killer Tomato.</span>"
|
||||
sleep(30)
|
||||
var/mob/living/simple_animal/hostile/killertomato/K = new /mob/living/simple_animal/hostile/killertomato(get_turf(src.loc))
|
||||
K.maxHealth += round(endurance / 3)
|
||||
K.melee_damage_lower += round(potency / 10)
|
||||
K.melee_damage_upper += round(potency / 10)
|
||||
K.move_to_delay -= round(production / 50)
|
||||
K.health = K.maxHealth
|
||||
user.unEquip(src)
|
||||
qdel(src)
|
||||
K.visible_message("<span class='notice'>The Killer Tomato growls as it suddenly awakens.</span>")
|
||||
awakening = 1
|
||||
|
||||
spawn(30)
|
||||
if(!gc_destroyed)
|
||||
var/mob/living/simple_animal/hostile/killertomato/K = new /mob/living/simple_animal/hostile/killertomato(get_turf(src.loc))
|
||||
K.maxHealth += round(endurance / 3)
|
||||
K.melee_damage_lower += round(potency / 10)
|
||||
K.melee_damage_upper += round(potency / 10)
|
||||
K.move_to_delay -= round(production / 50)
|
||||
K.health = K.maxHealth
|
||||
K.visible_message("<span class='notice'>The Killer Tomato growls as it suddenly awakens.</span>")
|
||||
if(user)
|
||||
user.unEquip(src)
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood
|
||||
|
||||
@@ -15,31 +15,6 @@
|
||||
real_name = name
|
||||
..()
|
||||
|
||||
//This is fine, works the same as a human
|
||||
/mob/living/carbon/alien/humanoid/Bump(atom/movable/AM as mob|obj, yes)
|
||||
if ((!( yes ) || now_pushing))
|
||||
return
|
||||
now_pushing = 0
|
||||
..()
|
||||
if (!istype(AM, /atom/movable))
|
||||
return
|
||||
|
||||
if (ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
tmob.LAssailant = src
|
||||
|
||||
if (!now_pushing)
|
||||
now_pushing = 1
|
||||
if (!AM.anchored)
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window))
|
||||
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
||||
for(var/obj/structure/window/win in get_step(AM,t))
|
||||
now_pushing = 0
|
||||
return
|
||||
step(AM, t)
|
||||
now_pushing = null
|
||||
|
||||
/mob/living/carbon/alien/humanoid/movement_delay()
|
||||
. = ..()
|
||||
. += move_delay_add + config.alien_delay //move_delay_add is used to slow aliens with stuns
|
||||
|
||||
@@ -23,27 +23,6 @@
|
||||
regenerate_icons()
|
||||
..()
|
||||
|
||||
//This is fine, works the same as a human
|
||||
/mob/living/carbon/alien/larva/Bump(atom/movable/AM as mob|obj, yes)
|
||||
if ((!( yes ) || now_pushing))
|
||||
return
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
tmob.LAssailant = src
|
||||
|
||||
now_pushing = 0
|
||||
..()
|
||||
if (!istype(AM, /atom/movable))
|
||||
return
|
||||
if (!( now_pushing ))
|
||||
now_pushing = 1
|
||||
if (!( AM.anchored ))
|
||||
var/t = get_dir(src, AM)
|
||||
step(AM, t)
|
||||
now_pushing = null
|
||||
|
||||
|
||||
//This needs to be fixed
|
||||
/mob/living/carbon/alien/larva/Stat()
|
||||
..()
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA
|
||||
ghostize() //Ghostize checks for key so nothing else is necessary.
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/carbon/brain/update_canmove()
|
||||
if(in_contents_of(/obj/mecha)) canmove = 1
|
||||
else canmove = 0
|
||||
|
||||
@@ -82,6 +82,8 @@
|
||||
else
|
||||
M.key = brainmob.key
|
||||
|
||||
qdel(brainmob)
|
||||
|
||||
M.internal_organs += src
|
||||
loc = null
|
||||
|
||||
@@ -89,10 +91,6 @@
|
||||
if(ishuman(M))
|
||||
H.update_hair(0)
|
||||
|
||||
//Update the body's icon so it doesnt appear debrained anymore
|
||||
if(ishuman(M))
|
||||
H.update_hair(0)
|
||||
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
@@ -48,78 +48,6 @@
|
||||
qdel(organelle)
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes)
|
||||
if ((!( yes ) || now_pushing || buckled))
|
||||
return
|
||||
now_pushing = 1
|
||||
if (ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
|
||||
//BubbleWrap - Should stop you pushing a restrained person out of the way
|
||||
|
||||
if(istype(tmob, /mob/living/carbon/human))
|
||||
|
||||
for(var/mob/M in range(tmob, 1))
|
||||
if( ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
|
||||
if ( !(world.time % 5) )
|
||||
src << "<span class='warning'>[tmob] is restrained, you cannot push past.</span>"
|
||||
now_pushing = 0
|
||||
return
|
||||
if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) )
|
||||
if ( !(world.time % 5) )
|
||||
src << "<span class='warning'>[tmob] is restraining [M], you cannot push past.</span>"
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
|
||||
if((tmob.a_intent == "help" || tmob.restrained()) && (a_intent == "help" || src.restrained()) && tmob.canmove && canmove) // mutual brohugs all around!
|
||||
var/turf/oldloc = loc
|
||||
var/turf/other_loc = tmob.loc
|
||||
|
||||
loc = tmob.loc
|
||||
tmob.loc = oldloc
|
||||
now_pushing = 0
|
||||
|
||||
for(var/mob/living/carbon/slime/slime in view(1,tmob))
|
||||
if(slime.Victim == tmob)
|
||||
slime.UpdateFeed()
|
||||
|
||||
//cross any movable atoms on either turf
|
||||
for(var/atom/movable/M in other_loc)
|
||||
M.Crossed(src)
|
||||
for(var/atom/movable/M in oldloc)
|
||||
M.Crossed(tmob)
|
||||
|
||||
return
|
||||
|
||||
if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot))
|
||||
if(prob(99))
|
||||
now_pushing = 0
|
||||
return
|
||||
if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot))
|
||||
if(prob(99))
|
||||
now_pushing = 0
|
||||
return
|
||||
if(!(tmob.status_flags & CANPUSH))
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
tmob.LAssailant = src
|
||||
|
||||
now_pushing = 0
|
||||
..()
|
||||
if (!istype(AM, /atom/movable))
|
||||
return
|
||||
if (!now_pushing)
|
||||
now_pushing = 1
|
||||
|
||||
if (!AM.anchored)
|
||||
if(pulling == AM)
|
||||
stop_pulling()
|
||||
var/t = get_dir(src, AM)
|
||||
AM.Move(get_step(AM, t), t)
|
||||
now_pushing = 0
|
||||
|
||||
/mob/living/carbon/human/Stat()
|
||||
..()
|
||||
statpanel("Status")
|
||||
|
||||
@@ -138,11 +138,11 @@ emp_act
|
||||
return 0
|
||||
|
||||
if(I.attack_verb && I.attack_verb.len)
|
||||
visible_message("<span class='danger'>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!</span>", \
|
||||
"<span class='userdanger'>[src] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!</span>")
|
||||
visible_message("<span class='danger'>[user] has [pick(I.attack_verb)] [src] in the [hit_area] with [I]!</span>", \
|
||||
"<span class='userdanger'>[user] has [pick(I.attack_verb)] [src] in the [hit_area] with [I]!</span>")
|
||||
else if(I.force)
|
||||
visible_message("<span class='danger'>[src] has been attacked in the [hit_area] with [I] by [user]!</span>", \
|
||||
"<span class='userdanger'>[src] has been attacked in the [hit_area] with [I] by [user]!</span>")
|
||||
visible_message("<span class='danger'>[user] has attacked [src] in the [hit_area] with [I]!</span>", \
|
||||
"<span class='userdanger'>[user] has attacked [src] in the [hit_area] with [I]!</span>")
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -232,56 +232,74 @@ emp_act
|
||||
|
||||
/mob/living/carbon/human/acid_act(var/acidpwr, var/toxpwr, var/acid_volume)
|
||||
var/list/damaged = list()
|
||||
var/list/inventory_items_to_kill = list()
|
||||
|
||||
//HEAD//
|
||||
var/obj/item/clothing/head_clothes = null
|
||||
if(glasses)
|
||||
head_clothes = glasses
|
||||
if(wear_mask)
|
||||
head_clothes = wear_mask
|
||||
if(head)
|
||||
if(!head.unacidable)
|
||||
head.acid_act(acidpwr)
|
||||
head_clothes = head
|
||||
if(head_clothes)
|
||||
if(!head_clothes.unacidable)
|
||||
head_clothes.acid_act(acidpwr)
|
||||
update_inv_glasses()
|
||||
update_inv_wear_mask()
|
||||
update_inv_head()
|
||||
else
|
||||
src << "<span class='warning'>Your [head.name] protects your head from the acid!</span>"
|
||||
src << "<span class='warning'>Your [head_clothes.name] protects your head and face from the acid!</span>"
|
||||
else
|
||||
if(wear_mask)
|
||||
if(!wear_mask.unacidable)
|
||||
wear_mask.acid_act(acidpwr)
|
||||
update_inv_wear_mask()
|
||||
else
|
||||
src << "<span class='warning'>Your [wear_mask.name] protects your head from the acid!</span>"
|
||||
else
|
||||
if(glasses)
|
||||
if(!glasses.unacidable)
|
||||
glasses.acid_act(acidpwr)
|
||||
update_inv_glasses()
|
||||
else
|
||||
src << "<span class='warning'>Your [glasses.name] protects your head from the acid!</span>"
|
||||
else
|
||||
. = get_organ("head")
|
||||
if(.)
|
||||
damaged += .
|
||||
. = get_organ("head")
|
||||
if(.)
|
||||
damaged += .
|
||||
if(ears)
|
||||
inventory_items_to_kill += ears
|
||||
|
||||
//CHEST//
|
||||
var/obj/item/clothing/chest_clothes = null
|
||||
if(w_uniform)
|
||||
chest_clothes = w_uniform
|
||||
if(wear_suit)
|
||||
if(!wear_suit.unacidable)
|
||||
wear_suit.acid_act(acidpwr)
|
||||
chest_clothes = wear_suit
|
||||
if(chest_clothes)
|
||||
if(!chest_clothes.unacidable)
|
||||
chest_clothes.acid_act(acidpwr)
|
||||
update_inv_w_uniform()
|
||||
update_inv_wear_suit()
|
||||
else
|
||||
src << "<span class='warning'>Your [wear_suit.name] protects your body from the acid!</span>"
|
||||
src << "<span class='warning'>Your [chest_clothes.name] protects your body from the acid!</span>"
|
||||
else
|
||||
if(w_uniform)
|
||||
if(!w_uniform.unacidable)
|
||||
w_uniform.acid_act(acidpwr)
|
||||
update_inv_w_uniform()
|
||||
else
|
||||
src << "<span class='warning'>Your [w_uniform.name] protects your body from the acid!</span>"
|
||||
else
|
||||
. = get_organ("chest")
|
||||
if(.)
|
||||
damaged += .
|
||||
. = get_organ("chest")
|
||||
if(.)
|
||||
damaged += .
|
||||
if(wear_id)
|
||||
inventory_items_to_kill += wear_id
|
||||
if(r_store)
|
||||
inventory_items_to_kill += r_store
|
||||
if(l_store)
|
||||
inventory_items_to_kill += l_store
|
||||
if(s_store)
|
||||
inventory_items_to_kill += s_store
|
||||
|
||||
|
||||
//ARMS & HANDS//
|
||||
var/obj/item/clothing/arm_clothes = null
|
||||
if(gloves)
|
||||
if(!gloves.unacidable)
|
||||
gloves.acid_act(acidpwr)
|
||||
arm_clothes = gloves
|
||||
if(w_uniform && (w_uniform.body_parts_covered & HANDS) || w_uniform && (w_uniform.body_parts_covered & ARMS))
|
||||
arm_clothes = w_uniform
|
||||
if(wear_suit && (wear_suit.body_parts_covered & HANDS) || wear_suit && (wear_suit.body_parts_covered & ARMS))
|
||||
arm_clothes = wear_suit
|
||||
if(arm_clothes)
|
||||
if(!arm_clothes.unacidable)
|
||||
arm_clothes.acid_act(acidpwr)
|
||||
update_inv_gloves()
|
||||
update_inv_w_uniform()
|
||||
update_inv_wear_suit()
|
||||
else
|
||||
src << "<span class='warning'>Your [gloves.name] protects your arms from the acid!</span>"
|
||||
src << "<span class='warning'>Your [arm_clothes.name] protects your arms and hands from the acid!</span>"
|
||||
else
|
||||
. = get_organ("r_arm")
|
||||
if(.)
|
||||
@@ -291,12 +309,22 @@ emp_act
|
||||
damaged += .
|
||||
|
||||
|
||||
//LEGS & FEET//
|
||||
var/obj/item/clothing/leg_clothes = null
|
||||
if(shoes)
|
||||
if(!shoes.unacidable)
|
||||
shoes.acid_act(acidpwr)
|
||||
leg_clothes = shoes
|
||||
if(w_uniform && (w_uniform.body_parts_covered & FEET) || w_uniform && (w_uniform.body_parts_covered & LEGS))
|
||||
leg_clothes = w_uniform
|
||||
if(wear_suit && (wear_suit.body_parts_covered & FEET) || wear_suit && (wear_suit.body_parts_covered & LEGS))
|
||||
leg_clothes = wear_suit
|
||||
if(leg_clothes)
|
||||
if(!leg_clothes.unacidable)
|
||||
leg_clothes.acid_act(acidpwr)
|
||||
update_inv_shoes()
|
||||
update_inv_w_uniform()
|
||||
update_inv_wear_suit()
|
||||
else
|
||||
src << "<span class='warning'>Your [shoes.name] protects your legs from the acid!</span>"
|
||||
src << "<span class='warning'>Your [leg_clothes.name] protects your legs and feet from the acid!</span>"
|
||||
else
|
||||
. = get_organ("r_leg")
|
||||
if(.)
|
||||
@@ -306,6 +334,7 @@ emp_act
|
||||
damaged += .
|
||||
|
||||
|
||||
//DAMAGE//
|
||||
for(var/obj/item/organ/limb/affecting in damaged)
|
||||
affecting.take_damage(2*toxpwr, toxpwr)
|
||||
|
||||
@@ -320,6 +349,20 @@ emp_act
|
||||
|
||||
update_damage_overlays()
|
||||
|
||||
//MELTING INVENTORY ITEMS//
|
||||
//these items are all outside of armour visually, so melt regardless.
|
||||
if(back)
|
||||
inventory_items_to_kill += back
|
||||
if(belt)
|
||||
inventory_items_to_kill += belt
|
||||
if(r_hand)
|
||||
inventory_items_to_kill += r_hand
|
||||
if(l_hand)
|
||||
inventory_items_to_kill += l_hand
|
||||
|
||||
for(var/obj/item/I in inventory_items_to_kill)
|
||||
I.acid_act(acidpwr)
|
||||
|
||||
/mob/living/carbon/human/grabbedby(mob/living/user)
|
||||
if(w_uniform)
|
||||
w_uniform.add_fingerprint(user)
|
||||
@@ -398,8 +441,8 @@ emp_act
|
||||
update_damage_overlays(0)
|
||||
updatehealth()
|
||||
|
||||
visible_message("<span class='danger'>[src] has been hit by [M.name].</span>", \
|
||||
"<span class='userdanger'>[src] has been hit by [M.name].</span>")
|
||||
visible_message("<span class='danger'>[M.name] has hit [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] has hit [src]!</span>")
|
||||
add_logs(M.occupant, src, "attacked", object=M, addition="(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
|
||||
|
||||
else
|
||||
|
||||
@@ -811,11 +811,11 @@
|
||||
return 0
|
||||
|
||||
if(I.attack_verb && I.attack_verb.len)
|
||||
H.visible_message("<span class='danger'>[H] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!</span>", \
|
||||
"<span class='userdanger'>[H] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!</span>")
|
||||
H.visible_message("<span class='danger'>[user] has [pick(I.attack_verb)] [H] in the [hit_area] with [I]!</span>", \
|
||||
"<span class='userdanger'>[user] has [pick(I.attack_verb)] [H] in the [hit_area] with [I]!</span>")
|
||||
else if(I.force)
|
||||
H.visible_message("<span class='danger'>[H] has been attacked in the [hit_area] with [I] by [user]!</span>", \
|
||||
"<span class='userdanger'>[H] has been attacked in the [hit_area] with [I] by [user]!</span>")
|
||||
H.visible_message("<span class='danger'>[user] has attacked [H] in the [hit_area] with [I]!</span>", \
|
||||
"<span class='userdanger'>[user] has attacked [H] in the [hit_area] with [I]!</span>")
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -896,23 +896,20 @@
|
||||
if(istype(location, /turf/simulated))
|
||||
location.add_blood_floor(H)
|
||||
|
||||
var/showname = "."
|
||||
if(user)
|
||||
showname = " by [user]!"
|
||||
if(user != src)
|
||||
user.do_attack_animation(H)
|
||||
if(!(user in viewers(I, null)))
|
||||
showname = "."
|
||||
|
||||
var/message_verb = ""
|
||||
if(I.attack_verb && I.attack_verb.len)
|
||||
H.visible_message("<span class='danger'>[H] has been [pick(I.attack_verb)] with [I][showname]</span>",
|
||||
"<span class='userdanger'>[H] has been [pick(I.attack_verb)] with [I][showname]</span>")
|
||||
message_verb = "[pick(I.attack_verb)]"
|
||||
else if(I.force)
|
||||
H.visible_message("<span class='danger'>[H] has been attacked with [I][showname]</span>",
|
||||
"<span class='userdanger'>[H] has been attacked with [I][showname]</span>")
|
||||
if(!showname && user)
|
||||
if(user.client)
|
||||
user << "<span class='danger'><B>You attack [H] with [I]. </B></span>"
|
||||
message_verb = "attacked"
|
||||
|
||||
var/attack_message = "[H] has been [message_verb] with [I]."
|
||||
if(user)
|
||||
user.do_attack_animation(src)
|
||||
if(user in viewers(src, null))
|
||||
attack_message = "[user] has [message_verb] [H] with [I]!"
|
||||
if(message_verb)
|
||||
H.visible_message("<span class='danger'>[attack_message]</span>",
|
||||
"<span class='userdanger'>[attack_message]</span>")
|
||||
|
||||
return
|
||||
|
||||
|
||||
@@ -47,34 +47,6 @@
|
||||
tally += (283.222 - bodytemperature) / 10 * 1.75
|
||||
return tally+config.monkey_delay
|
||||
|
||||
/mob/living/carbon/monkey/Bump(atom/movable/AM as mob|obj, yes)
|
||||
if ((!( yes ) || now_pushing))
|
||||
return
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(!(tmob.status_flags & CANPUSH))
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
tmob.LAssailant = src
|
||||
now_pushing = 0
|
||||
..()
|
||||
if (!istype(AM, /atom/movable))
|
||||
return
|
||||
if (!( now_pushing ))
|
||||
now_pushing = 1
|
||||
if (!( AM.anchored ))
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window))
|
||||
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
||||
for(var/obj/structure/window/win in get_step(AM,t))
|
||||
now_pushing = 0
|
||||
return
|
||||
step(AM, t)
|
||||
now_pushing = null
|
||||
|
||||
|
||||
/mob/living/carbon/monkey/attack_paw(mob/living/M as mob)
|
||||
if(..()) //successful monkey bite.
|
||||
var/damage = rand(1, 5)
|
||||
|
||||
@@ -97,59 +97,31 @@
|
||||
|
||||
return tally + config.slime_delay
|
||||
|
||||
/mob/living/carbon/slime/Bump(atom/movable/AM as mob|obj, yes)
|
||||
if ((!(yes) || now_pushing))
|
||||
return
|
||||
now_pushing = 1
|
||||
/mob/living/carbon/slime/ObjBump(obj/O)
|
||||
if(!client && powerlevel > 0)
|
||||
var/probab = 10
|
||||
switch(powerlevel)
|
||||
if(1 to 2) probab = 20
|
||||
if(3 to 4) probab = 30
|
||||
if(5 to 6) probab = 40
|
||||
if(7 to 8) probab = 60
|
||||
if(9) probab = 70
|
||||
if(10) probab = 95
|
||||
if(prob(probab))
|
||||
if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille))
|
||||
if(nutrition <= get_hunger_nutrition() && !Atkcool)
|
||||
if (is_adult || prob(5))
|
||||
O.attack_slime(src)
|
||||
Atkcool = 1
|
||||
spawn(45)
|
||||
Atkcool = 0
|
||||
|
||||
if(isobj(AM))
|
||||
if(!client && powerlevel > 0)
|
||||
var/probab = 10
|
||||
switch(powerlevel)
|
||||
if(1 to 2) probab = 20
|
||||
if(3 to 4) probab = 30
|
||||
if(5 to 6) probab = 40
|
||||
if(7 to 8) probab = 60
|
||||
if(9) probab = 70
|
||||
if(10) probab = 95
|
||||
if(prob(probab))
|
||||
if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille))
|
||||
if(nutrition <= get_hunger_nutrition() && !Atkcool)
|
||||
if (is_adult || prob(5))
|
||||
AM.attack_slime(src)
|
||||
spawn()
|
||||
Atkcool = 1
|
||||
sleep(45)
|
||||
Atkcool = 0
|
||||
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
|
||||
if(is_adult)
|
||||
if(istype(tmob, /mob/living/carbon/human))
|
||||
if(prob(90))
|
||||
now_pushing = 0
|
||||
return
|
||||
/mob/living/carbon/slime/MobBump(mob/M)
|
||||
if(istype(M, /mob/living/carbon/human)) //pushing humans
|
||||
if(is_adult && prob(10)) //only if we're adult, and 10% of the time
|
||||
return 0
|
||||
else
|
||||
if(istype(tmob, /mob/living/carbon/human))
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
now_pushing = 0
|
||||
..()
|
||||
if (!istype(AM, /atom/movable))
|
||||
return
|
||||
if (!( now_pushing ))
|
||||
now_pushing = 1
|
||||
if (!( AM.anchored ))
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window))
|
||||
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
||||
for(var/obj/structure/window/win in get_step(AM,t))
|
||||
now_pushing = 0
|
||||
return
|
||||
step(AM, t)
|
||||
now_pushing = null
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/slime/Process_Spacemove(var/movement_dir = 0)
|
||||
return 2
|
||||
|
||||
@@ -10,6 +10,96 @@
|
||||
..()
|
||||
del(src)
|
||||
|
||||
//Generic Bump(). Override MobBump() and ObjBump() instead of this.
|
||||
/mob/living/Bump(atom/A, yes)
|
||||
if (buckled || !yes || now_pushing)
|
||||
return
|
||||
if(ismob(A))
|
||||
var/mob/M = A
|
||||
if(MobBump(M))
|
||||
return
|
||||
..()
|
||||
if(isobj(A))
|
||||
var/obj/O = A
|
||||
if(ObjBump(O))
|
||||
return
|
||||
if(istype(A, /atom/movable))
|
||||
var/atom/movable/AM = A
|
||||
if(PushAM(AM))
|
||||
return
|
||||
|
||||
//Called when we bump onto a mob
|
||||
/mob/living/proc/MobBump(mob/M)
|
||||
if(now_pushing)
|
||||
return 1
|
||||
|
||||
//BubbleWrap: Should stop you pushing a restrained person out of the way
|
||||
if(istype(M, /mob/living/carbon/human))
|
||||
for(var/mob/MM in range(M, 1))
|
||||
if( ((MM.pulling == M && ( M.restrained() && !( MM.restrained() ) && MM.stat == CONSCIOUS)) || locate(/obj/item/weapon/grab, M.grabbed_by.len)) )
|
||||
if ( !(world.time % 5) )
|
||||
src << "<span class='warning'>[M] is restrained, you cannot push past.</span>"
|
||||
return 1
|
||||
if( M.pulling == MM && ( MM.restrained() && !( M.restrained() ) && M.stat == CONSCIOUS) )
|
||||
if ( !(world.time % 5) )
|
||||
src << "<span class='warning'>[M] is restraining [MM], you cannot push past.</span>"
|
||||
return 1
|
||||
|
||||
//switch our position with M
|
||||
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
|
||||
if((M.a_intent == "help" || M.restrained()) && (a_intent == "help" || restrained()) && M.canmove && canmove) // mutual brohugs all around!
|
||||
now_pushing = 1
|
||||
//TODO: Make this use Move(). we're pretty much recreating it here.
|
||||
//it could be done by setting one of the locs to null to make Move() work, then setting it back and Move() the other mob
|
||||
var/oldloc = loc
|
||||
loc = M.loc
|
||||
M.loc = oldloc
|
||||
M.LAssailant = src
|
||||
|
||||
for(var/mob/living/carbon/slime/slime in view(1,M))
|
||||
if(slime.Victim == M)
|
||||
slime.UpdateFeed()
|
||||
|
||||
//cross any movable atoms on either turf
|
||||
for(var/atom/movable/AM in loc)
|
||||
AM.Crossed(src)
|
||||
for(var/atom/movable/AM in oldloc)
|
||||
AM.Crossed(M)
|
||||
now_pushing = 0
|
||||
return 1
|
||||
|
||||
//okay, so we didn't switch. but should we push?
|
||||
//not if he's not CANPUSH of course
|
||||
if(!(M.status_flags & CANPUSH) )
|
||||
return 1
|
||||
//anti-riot equipment is also anti-push
|
||||
if(M.r_hand && istype(M.r_hand, /obj/item/weapon/shield/riot))
|
||||
return 1
|
||||
if(M.l_hand && istype(M.l_hand, /obj/item/weapon/shield/riot))
|
||||
return 1
|
||||
|
||||
//Called when we bump onto an obj
|
||||
/mob/living/proc/ObjBump(obj/O)
|
||||
return
|
||||
|
||||
//Called when we want to push an atom/movable
|
||||
/mob/living/proc/PushAM(atom/movable/AM)
|
||||
if(now_pushing)
|
||||
return 1
|
||||
if(!AM.anchored)
|
||||
now_pushing = 1
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window))
|
||||
var/obj/structure/window/W = AM
|
||||
if(W.fulltile)
|
||||
for(var/obj/structure/window/win in get_step(W,t))
|
||||
now_pushing = 0
|
||||
return
|
||||
if(pulling == AM)
|
||||
stop_pulling()
|
||||
step(AM, t)
|
||||
now_pushing = 0
|
||||
|
||||
//mob verbs are a lot faster than object verbs
|
||||
//for more info on why this is not atom/pull, see examinate() in mob.dm
|
||||
/mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1))
|
||||
@@ -381,8 +471,7 @@
|
||||
if (prob(75))
|
||||
var/obj/item/weapon/grab/G = pick(M.grabbed_by)
|
||||
if (istype(G, /obj/item/weapon/grab))
|
||||
for(var/mob/O in viewers(M, null))
|
||||
O.show_message(text("<span class='danger'>[] has been pulled from []'s grip by []</span>", G.affecting, G.assailant, src), 1)
|
||||
visible_message("<span class='danger'>[src] has pulled [G.affecting] from [G.assailant]'s grip.</span>")
|
||||
qdel(G)
|
||||
else
|
||||
ok = 0
|
||||
|
||||
@@ -86,8 +86,8 @@ proc/vol_by_throwforce_and_or_w_class(var/obj/item/I)
|
||||
else
|
||||
return
|
||||
updatehealth()
|
||||
visible_message("<span class='danger'>[src] has been hit by [M.name].</span>", \
|
||||
"<span class='userdanger'>[src] has been hit by [M.name].</span>")
|
||||
visible_message("<span class='danger'>[M.name] has hit [src]!</span>", \
|
||||
"<span class='userdanger'>[M.name] has hit [src]!</span>")
|
||||
add_logs(M.occupant, src, "attacked", object=M, addition="(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
|
||||
else
|
||||
step_away(src,M)
|
||||
|
||||
@@ -60,6 +60,7 @@ var/list/ai_list = list()
|
||||
var/last_announcement = "" // For AI VOX, if enabled
|
||||
var/turf/waypoint //Holds the turf of the currently selected waypoint.
|
||||
var/waypoint_mode = 0 //Waypoint mode is for selecting a turf via clicking.
|
||||
var/apc_override = 0 //hack for letting the AI use its APC even when visionless
|
||||
|
||||
/mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0)
|
||||
var/list/possibleNames = ai_names
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
//stage = 1
|
||||
//if (istype(src, /mob/living/silicon/ai)) // Are we not sure what we are?
|
||||
var/blind = 0
|
||||
var/blindness = 0
|
||||
//stage = 2
|
||||
var/area/loc = null
|
||||
if (istype(T, /turf))
|
||||
@@ -47,9 +47,9 @@
|
||||
//stage = 4
|
||||
if (!loc.master.power_equip && !istype(src.loc,/obj/item))
|
||||
//stage = 5
|
||||
blind = 1
|
||||
blindness = 1
|
||||
|
||||
if (!blind)
|
||||
if (!blindness)
|
||||
//stage = 4.5
|
||||
if (src.blind.layer != 0)
|
||||
src.blind.layer = 0
|
||||
@@ -156,7 +156,9 @@
|
||||
src << "Receiving control information from APC."
|
||||
sleep(2)
|
||||
//bring up APC dialog
|
||||
apc_override = 1
|
||||
theAPC.attack_ai(src)
|
||||
apc_override = 0
|
||||
src:aiRestorePowerRoutine = 3
|
||||
src << "Here are your current laws:"
|
||||
src.show_laws()
|
||||
|
||||
@@ -4,8 +4,7 @@
|
||||
if(src.cable)
|
||||
if(get_dist(src, src.cable) > 1)
|
||||
var/turf/T = get_turf(src.loc)
|
||||
for (var/mob/M in viewers(T))
|
||||
M.show_message("<span class='danger'>[src.cable] rapidly retracts back into its spool.</span>", 3, "<span class='danger'>You hear a click and the sound of wire spooling rapidly.</span>", 2)
|
||||
T.visible_message("<span class='warning'>[src.cable] rapidly retracts back into its spool.</span>", "<span class='danger'>You hear a click and the sound of wire spooling rapidly.</span>")
|
||||
qdel(src.cable)
|
||||
cable = null
|
||||
if(silence_time)
|
||||
|
||||
@@ -281,31 +281,6 @@
|
||||
|
||||
usr << browse(list, "window=laws")
|
||||
|
||||
/mob/living/silicon/Bump(atom/movable/AM as mob|obj, yes) //Allows the AI to bump into mobs if it's itself pushed
|
||||
if ((!( yes ) || now_pushing))
|
||||
return
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(!(tmob.status_flags & CANPUSH))
|
||||
now_pushing = 0
|
||||
return
|
||||
now_pushing = 0
|
||||
..()
|
||||
if (!istype(AM, /atom/movable))
|
||||
return
|
||||
if (!now_pushing)
|
||||
now_pushing = 1
|
||||
if (!AM.anchored)
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window))
|
||||
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
||||
for(var/obj/structure/window/win in get_step(AM,t))
|
||||
now_pushing = 0
|
||||
return
|
||||
step(AM, t)
|
||||
now_pushing = null
|
||||
|
||||
/mob/living/silicon/put_in_hand_check() // This check is for borgs being able to receive items, not put them in others' hands.
|
||||
return 0
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
/mob/living/simple_animal/construct
|
||||
name = "Construct"
|
||||
real_name = "Construct"
|
||||
@@ -56,34 +55,6 @@
|
||||
|
||||
user << msg
|
||||
|
||||
/mob/living/simple_animal/construct/Bump(atom/movable/AM as mob|obj, yes)
|
||||
if ((!( yes ) || now_pushing))
|
||||
return
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(!(tmob.status_flags & CANPUSH))
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
tmob.LAssailant = src
|
||||
now_pushing = 0
|
||||
..()
|
||||
if (!istype(AM, /atom/movable))
|
||||
return
|
||||
if (!( now_pushing ))
|
||||
now_pushing = 1
|
||||
if (!( AM.anchored ))
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window))
|
||||
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
||||
for(var/obj/structure/window/win in get_step(AM,t))
|
||||
now_pushing = 0
|
||||
return
|
||||
step(AM, t)
|
||||
now_pushing = null
|
||||
|
||||
|
||||
/mob/living/simple_animal/construct/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(istype(M, /mob/living/simple_animal/construct/builder))
|
||||
health += 5
|
||||
|
||||
@@ -58,17 +58,25 @@
|
||||
//helmet and armor = 100% protection
|
||||
if( istype(inventory_head,/obj/item/clothing/head/helmet) && istype(inventory_back,/obj/item/clothing/suit/armor) )
|
||||
if( O.force )
|
||||
usr << "<span class='danger'>[src] is wearing too much armor. You can't cause \him any damage.</span>"
|
||||
for (var/mob/M in viewers(src, null))
|
||||
M.show_message("\red \b [user] hits [src] with [O], however [src] is too armored.")
|
||||
user << "<span class='warning'>[src] is wearing too much armor. You can't cause \him any damage.</span>"
|
||||
visible_message("<span class='danger'> [user] hits [src] with [O], however [src] is too armored.</span>")
|
||||
else
|
||||
usr << "<span class='danger'>[src] is wearing too much armor. You can't reach \his skin.<span>"
|
||||
for (var/mob/M in viewers(src, null))
|
||||
M.show_message("<span class='danger'>[user] gently taps [src] with [O].</span>")
|
||||
user << "<span class='warning'>[src] is wearing too much armor. You can't reach \his skin.<span>"
|
||||
visible_message("<span class='notice'>[user] gently taps [src] with [O].</span>")
|
||||
if(health>0 && prob(15))
|
||||
emote("me", 1, "looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression.")
|
||||
return
|
||||
..()
|
||||
|
||||
if(istype(O, /obj/item/weapon/newspaper))
|
||||
if(!stat)
|
||||
user.visible_message("<span class='notice'>[user] baps [name] on the nose with the rolled up [O]</span>")
|
||||
spawn(0)
|
||||
for(var/i in list(1,2,4,8,4,2,1,2))
|
||||
dir = i
|
||||
sleep(1)
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/simple_animal/corgi/Topic(href, href_list)
|
||||
if(usr.stat) return
|
||||
@@ -400,44 +408,7 @@
|
||||
dir = i
|
||||
sleep(1)
|
||||
|
||||
/mob/living/simple_animal/corgi/Ian/Bump(atom/movable/AM as mob|obj, yes)
|
||||
if ((!( yes ) || now_pushing))
|
||||
return
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(!(tmob.status_flags & CANPUSH))
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
tmob.LAssailant = src
|
||||
now_pushing = 0
|
||||
..()
|
||||
if (!istype(AM, /atom/movable))
|
||||
return
|
||||
if (!( now_pushing ))
|
||||
now_pushing = 1
|
||||
if (!( AM.anchored ))
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window))
|
||||
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
||||
for(var/obj/structure/window/win in get_step(AM,t))
|
||||
now_pushing = 0
|
||||
return
|
||||
step(AM, t)
|
||||
now_pushing = null
|
||||
//PC stuff-Sieve
|
||||
|
||||
/mob/living/simple_animal/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
|
||||
if(istype(O, /obj/item/weapon/newspaper))
|
||||
if(!stat)
|
||||
user.visible_message("<span class='notice'>[user] baps [name] on the nose with the rolled up [O]</span>")
|
||||
spawn(0)
|
||||
for(var/i in list(1,2,4,8,4,2,1,2))
|
||||
dir = i
|
||||
sleep(1)
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/corgi/regenerate_icons()
|
||||
overlays = list()
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
switch(d_input)
|
||||
if("Reactivate")
|
||||
var/mob/dead/observer/G = get_ghost()
|
||||
if(!client && !G)
|
||||
if(!client && (!G || !G.client))
|
||||
var/list/faux_gadgets = list("hypertext inflator","failsafe directory","DRM switch","stack initializer",\
|
||||
"anti-freeze capacitor","data stream diode","TCP bottleneck","supercharged I/O bolt",\
|
||||
"tradewind stablizer","radiated XML cable","registry fluid tank","open-source debunker")
|
||||
@@ -113,7 +113,7 @@
|
||||
new /obj/effect/decal/cleanable/oil/streak(get_turf(src))
|
||||
qdel(src)
|
||||
else
|
||||
D << "<span class='notice'>You need to remain still to canibalize [src].</span>"
|
||||
D << "<span class='notice'>You need to remain still to cannibalize [src].</span>"
|
||||
else
|
||||
D << "<span class='notice'>You're already in perfect condition!</span>"
|
||||
if("Nothing")
|
||||
@@ -530,7 +530,7 @@
|
||||
return
|
||||
|
||||
var/be_drone = alert("Become a drone? (Warning, You can no longer be cloned!)",,"Yes","No")
|
||||
if(be_drone == "No")
|
||||
if(be_drone == "No" || gc_destroyed)
|
||||
return
|
||||
var/mob/living/simple_animal/drone/D = new drone_type(get_turf(loc))
|
||||
D.key = user.key
|
||||
|
||||
@@ -15,33 +15,6 @@
|
||||
ventcrawler = 2
|
||||
var/colour = "grey"
|
||||
|
||||
/mob/living/simple_animal/slime/Bump(atom/movable/AM as mob|obj, yes)
|
||||
if ((!( yes ) || now_pushing))
|
||||
return
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(!(tmob.status_flags & CANPUSH))
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
tmob.LAssailant = src
|
||||
now_pushing = 0
|
||||
..()
|
||||
if (!istype(AM, /atom/movable))
|
||||
return
|
||||
if (!( now_pushing ))
|
||||
now_pushing = 1
|
||||
if (!( AM.anchored ))
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window))
|
||||
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
||||
for(var/obj/structure/window/win in get_step(AM,t))
|
||||
now_pushing = 0
|
||||
return
|
||||
step(AM, t)
|
||||
now_pushing = null
|
||||
|
||||
/mob/living/simple_animal/adultslime
|
||||
name = "pet slime"
|
||||
desc = "A lovable, domesticated slime."
|
||||
@@ -61,7 +34,6 @@
|
||||
..()
|
||||
overlays += "aslime-:33"
|
||||
|
||||
|
||||
/mob/living/simple_animal/slime/adult/Die()
|
||||
var/mob/living/simple_animal/slime/S1 = new /mob/living/simple_animal/slime (src.loc)
|
||||
S1.icon_state = "[src.colour] baby slime"
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
response_disarm = "flails at"
|
||||
response_harm = "hits"
|
||||
speak_chance = 0
|
||||
a_intent = "harm"
|
||||
stop_automated_movement_when_pulled = 0
|
||||
maxHealth = 15
|
||||
health = 15
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
if (O.damtype == STAMINA)
|
||||
damage = 0
|
||||
health -= damage
|
||||
visible_message("<span class='danger'>[src] has been attacked with [O] by [user]!</span>")
|
||||
visible_message("<span class='danger'>[user] has attacked [src] with [O]!</span>")
|
||||
else
|
||||
visible_message("<span class='danger'>[src] blocks [O] with its shield!</span>")
|
||||
playsound(loc, O.hitsound, 25, 1, -1)
|
||||
|
||||
@@ -211,20 +211,6 @@
|
||||
adjustBruteLoss(unsuitable_atmos_damage)
|
||||
return 1
|
||||
|
||||
/mob/living/simple_animal/Bumped(AM as mob|obj)
|
||||
if(!AM) return
|
||||
|
||||
if(resting || buckled)
|
||||
return
|
||||
|
||||
if(isturf(src.loc))
|
||||
if((status_flags & CANPUSH) && ismob(AM))
|
||||
var/newamloc = src.loc
|
||||
src.loc = AM:loc
|
||||
AM:loc = newamloc
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/gib(var/animation = 0)
|
||||
if(icon_gib)
|
||||
flick(icon_gib, src)
|
||||
@@ -371,8 +357,8 @@
|
||||
damage = O.force
|
||||
if (O.damtype == STAMINA)
|
||||
damage = 0
|
||||
visible_message("<span class='danger'>[src] has been [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] with [O] by [user]!</span>",\
|
||||
"<span class='userdanger'>[src] has been attacked with [O] by [user]!</span>")
|
||||
visible_message("<span class='danger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] [src] with [O]!</span>",\
|
||||
"<span class='userdanger'>[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] you with [O]!</span>")
|
||||
else
|
||||
visible_message("<span class='danger'>[O] bounces harmlessly off of [src].</span>",\
|
||||
"<span class='userdanger'>[O] bounces harmlessly off of [src].</span>")
|
||||
|
||||
@@ -548,12 +548,12 @@
|
||||
if (emagged || malfhack || (stat & BROKEN) || opened==2)
|
||||
new /obj/item/stack/sheet/metal(loc)
|
||||
user.visible_message(\
|
||||
"<span class='warning'>[src] has been cut apart by [user.name] with the weldingtool.</span>",\
|
||||
"<span class='warning'>[user.name] has cut [src] apart with [W].</span>",\
|
||||
"<span class='notice'>You disassembled the broken APC frame.</span>")
|
||||
else
|
||||
new /obj/item/apc_frame(loc)
|
||||
user.visible_message(\
|
||||
"<span class='warning'>[src] has been cut from the wall by [user.name] with the weldingtool.</span>",\
|
||||
"<span class='warning'>[user.name] has cut [src] from the wall with [W].</span>",\
|
||||
"<span class='notice'>You cut the APC frame from the wall.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
@@ -588,7 +588,7 @@
|
||||
&& W.w_class >= 3.0 \
|
||||
&& prob(20) )
|
||||
opened = 2
|
||||
user.visible_message("<span class='danger'>The APC cover was knocked down with the [W.name] by [user.name]!</span>", \
|
||||
user.visible_message("<span class='danger'>[user.name] has knocked down the APC cover with the [W.name]!</span>", \
|
||||
"<span class='danger'>You knock down the APC cover with your [W.name]!</span>", \
|
||||
"You hear bang")
|
||||
update_icon()
|
||||
@@ -600,7 +600,7 @@
|
||||
istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/assembly/signaler)))
|
||||
return src.attack_hand(user)
|
||||
user.do_attack_animation(src)
|
||||
user.visible_message("<span class='danger'>The [src.name] has been hit with the [W.name] by [user.name]!</span>", \
|
||||
user.visible_message("<span class='danger'>[user.name] has hit the [src.name] with the [W.name]!</span>", \
|
||||
"<span class='danger'>You hit the [src.name] with your [W.name]!</span>", \
|
||||
"You hear bang")
|
||||
|
||||
|
||||
@@ -120,4 +120,16 @@
|
||||
projectile_type = /obj/item/projectile/energy/disabler
|
||||
select_name = "disable"
|
||||
e_cost = 50
|
||||
fire_sound = "sound/weapons/taser.ogg"
|
||||
fire_sound = "sound/weapons/taser.ogg"
|
||||
|
||||
/obj/item/ammo_casing/energy/wormhole
|
||||
projectile_type = /obj/item/projectile/beam/wormhole
|
||||
e_cost = 0
|
||||
fire_sound = "sound/weapons/pulse3.ogg"
|
||||
var/obj/item/weapon/gun/energy/wormhole_projector/gun = null
|
||||
select_name = "blue"
|
||||
|
||||
/obj/item/ammo_casing/energy/wormhole/orange
|
||||
projectile_type = /obj/item/projectile/beam/wormhole/orange
|
||||
select_name = "orange"
|
||||
|
||||
|
||||
@@ -135,3 +135,48 @@
|
||||
item_state = null
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/disabler)
|
||||
cell_type = "/obj/item/weapon/stock_parts/cell"
|
||||
|
||||
|
||||
/obj/item/weapon/gun/energy/wormhole_projector
|
||||
name = "bluespace wormhole projector"
|
||||
desc = "A projector that emits high density quantum-coupled bluespace beams."
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/wormhole, /obj/item/ammo_casing/energy/wormhole/orange)
|
||||
item_state = null
|
||||
icon_state = "wormhole_projector"
|
||||
var/obj/effect/portal/blue
|
||||
var/obj/effect/portal/orange
|
||||
|
||||
/obj/item/weapon/gun/energy/wormhole_projector/update_icon()
|
||||
icon_state = "[initial(icon_state)][select]"
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/energy/wormhole_projector/attack_self(mob/living/user as mob)
|
||||
select_fire(user)
|
||||
|
||||
/obj/item/weapon/gun/energy/wormhole_projector/process_chamber()
|
||||
..()
|
||||
select_fire()
|
||||
|
||||
/obj/item/weapon/gun/energy/wormhole_projector/proc/portal_destroyed(var/obj/effect/portal/P)
|
||||
if(P.icon_state == "portal")
|
||||
blue = null
|
||||
if(orange)
|
||||
orange.target = null
|
||||
else
|
||||
orange = null
|
||||
if(blue)
|
||||
blue.target = null
|
||||
|
||||
/obj/item/weapon/gun/energy/wormhole_projector/proc/create_portal(var/obj/item/projectile/beam/wormhole/W)
|
||||
var/obj/effect/portal/P = new /obj/effect/portal(get_turf(W), null, src)
|
||||
P.precision = 0
|
||||
if(W.name == "bluespace beam")
|
||||
qdel(blue)
|
||||
blue = P
|
||||
else
|
||||
qdel(orange)
|
||||
P.icon_state = "portal1"
|
||||
orange = P
|
||||
if(orange && blue)
|
||||
blue.target = get_turf(orange)
|
||||
orange.target = get_turf(blue)
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
damage = 0
|
||||
damage_type = BURN
|
||||
flag = "energy"
|
||||
color = "#FFFF00"
|
||||
|
||||
|
||||
/obj/item/projectile/energy/electrode
|
||||
|
||||
@@ -129,4 +129,31 @@ obj/item/projectile/kinetic/New()
|
||||
|
||||
/obj/item/effect/kinetic_blast/New()
|
||||
spawn(4)
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/projectile/beam/wormhole
|
||||
name = "bluespace beam"
|
||||
icon_state = "spark"
|
||||
hitsound = "sparks"
|
||||
damage = 3
|
||||
var/obj/item/weapon/gun/energy/wormhole_projector/gun
|
||||
color = "#33CCFF"
|
||||
|
||||
/obj/item/projectile/beam/wormhole/orange
|
||||
name = "orange bluespace beam"
|
||||
color = "#FF6600"
|
||||
|
||||
/obj/item/projectile/beam/wormhole/New(var/obj/item/ammo_casing/energy/wormhole/casing)
|
||||
if(casing)
|
||||
gun = casing.gun
|
||||
|
||||
/obj/item/ammo_casing/energy/wormhole/New(var/obj/item/weapon/gun/energy/wormhole_projector/wh)
|
||||
gun = wh
|
||||
|
||||
/obj/item/projectile/beam/wormhole/on_hit(var/atom/target)
|
||||
if(ismob(target))
|
||||
..()
|
||||
return
|
||||
if(!gun)
|
||||
qdel(src)
|
||||
gun.create_portal(src)
|
||||
|
||||
@@ -813,7 +813,7 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 100
|
||||
pass_flags = PASSTABLE
|
||||
var/inuse = 0
|
||||
var/operating = 0
|
||||
var/obj/item/weapon/reagent_containers/beaker = null
|
||||
var/limit = 10
|
||||
var/list/blend_items = list (
|
||||
@@ -829,9 +829,9 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
|
||||
/obj/item/stack/sheet/mineral/bananium = list("banana" = 20),
|
||||
/obj/item/stack/sheet/mineral/silver = list("silver" = 20),
|
||||
/obj/item/stack/sheet/mineral/gold = list("gold" = 20),
|
||||
/obj/item/weapon/grown/nettle = list("sacid" = 0),
|
||||
/obj/item/weapon/grown/nettle/basic = list("sacid" = 0),
|
||||
/obj/item/weapon/grown/nettle/death = list("pacid" = 0),
|
||||
/obj/item/weapon/grown/novaflower = list("capsaicin" = 0),
|
||||
/obj/item/weapon/grown/novaflower = list("capsaicin" = 0, "condensedcapsaicin" = 0),
|
||||
|
||||
//Crayons (for overriding colours)
|
||||
/obj/item/toy/crayon/red = list("redcrayonpowder" = 10),
|
||||
@@ -972,7 +972,7 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
|
||||
var/beaker_contents = ""
|
||||
var/dat = ""
|
||||
|
||||
if(!inuse)
|
||||
if(!operating)
|
||||
for (var/obj/item/O in holdingitems)
|
||||
processing_chamber += "\A [O.name]<BR>"
|
||||
|
||||
@@ -1017,6 +1017,9 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
if(operating)
|
||||
updateUsrDialog()
|
||||
return
|
||||
switch(href_list["action"])
|
||||
if ("grind")
|
||||
grind()
|
||||
@@ -1099,9 +1102,10 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
|
||||
if (!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
|
||||
return
|
||||
playsound(src.loc, 'sound/machines/juicer.ogg', 20, 1)
|
||||
inuse = 1
|
||||
operating = 1
|
||||
updateUsrDialog()
|
||||
spawn(50)
|
||||
inuse = 0
|
||||
operating = 0
|
||||
updateUsrDialog()
|
||||
|
||||
//Snacks
|
||||
@@ -1133,9 +1137,10 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
|
||||
if (!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
|
||||
return
|
||||
playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
|
||||
inuse = 1
|
||||
operating = 1
|
||||
updateUsrDialog()
|
||||
spawn(60)
|
||||
inuse = 0
|
||||
operating = 0
|
||||
updateUsrDialog()
|
||||
|
||||
//Snacks and Plants
|
||||
|
||||
@@ -1656,6 +1656,8 @@ datum/reagent/toxin/acid/reaction_mob(var/mob/living/carbon/C, var/method=TOUCH,
|
||||
C.acid_act(acidpwr, toxpwr, volume)
|
||||
|
||||
datum/reagent/toxin/acid/reaction_obj(var/obj/O, var/volume)
|
||||
if(istype(O.loc, /mob)) //handled in human acid_act()
|
||||
return
|
||||
O.acid_act(acidpwr, toxpwr, volume)
|
||||
|
||||
datum/reagent/toxin/acid/polyacid
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
if(ismob(target) && target.reagents && reagents.total_volume)
|
||||
var/mob/M = target
|
||||
var/R
|
||||
target.visible_message("<span class='danger'>[target] has been splashed with something by [user]!</span>", \
|
||||
"<span class='userdanger'>[target] has been splashed with something by [user]!</span>")
|
||||
target.visible_message("<span class='danger'>[user] has splashed [target] with something!</span>", \
|
||||
"<span class='userdanger'>[user] has splashed [target] with something!</span>")
|
||||
if(reagents)
|
||||
for(var/datum/reagent/A in reagents.reagent_list)
|
||||
R += A.id + " ("
|
||||
|
||||
@@ -156,8 +156,8 @@
|
||||
user.visible_message("<span class='warning'>[user] climbs into [src].</span>", \
|
||||
"<span class='notice'>[user] climbs into [src].</span>")
|
||||
else
|
||||
target.visible_message("<span class='danger'>[target] has been placed in [src] by [user].</span>", \
|
||||
"<span class='userdanger'>[target] has been placed in [src] by [user].</span>")
|
||||
target.visible_message("<span class='danger'>[user] has placed [target] in [src].</span>", \
|
||||
"<span class='userdanger'>[user] has placed [target] in [src].</span>")
|
||||
add_logs(user, target, "stuffed", addition="into [src]")
|
||||
update()
|
||||
|
||||
|
||||
@@ -141,6 +141,16 @@ datum/design/ionrifle
|
||||
build_path = /obj/item/weapon/gun/energy/ionrifle
|
||||
locked = 1
|
||||
|
||||
datum/design/wormhole_projector
|
||||
name = "Bluespace Wormhole Projector"
|
||||
desc = "A projector that emits high density quantum-coupled bluespace beams."
|
||||
id = "wormholeprojector"
|
||||
req_tech = list("combat" = 6, "materials" = 6, "bluespace" = 4)
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$silver" = 1000, "$metal" = 5000, "$diamond" = 3000)
|
||||
build_path = /obj/item/weapon/gun/energy/wormhole_projector
|
||||
locked = 1
|
||||
|
||||
datum/design/reciever
|
||||
name = "Modular Reciever"
|
||||
desc = "A prototype modular reciever and trigger assembly for a variety of firearms."
|
||||
|
||||
@@ -9,15 +9,19 @@
|
||||
origin_tech = "bluespace=4;materials=3"
|
||||
var/blink_range = 8 // The teleport range when crushed/thrown at someone.
|
||||
|
||||
|
||||
/obj/item/bluespace_crystal/New()
|
||||
..()
|
||||
pixel_x = rand(-5, 5)
|
||||
pixel_y = rand(-5, 5)
|
||||
|
||||
|
||||
/obj/item/bluespace_crystal/attack_self(var/mob/user)
|
||||
user.visible_message("<span class='notice'>[user] crushes [src]!</span>")
|
||||
new /obj/effect/effect/sparks(src.loc)
|
||||
playsound(src.loc, "sparks", 50, 1)
|
||||
blink_mob(user)
|
||||
user.drop_item()
|
||||
user.visible_message("<span class='notice'>[user] crushes the [src]!</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/bluespace_crystal/proc/blink_mob(var/mob/living/L)
|
||||
@@ -25,6 +29,9 @@
|
||||
|
||||
/obj/item/bluespace_crystal/throw_impact(atom/hit_atom)
|
||||
..()
|
||||
visible_message("<span class='notice'>[src] fizzles and disappears upon impact!</span>")
|
||||
new /obj/effect/effect/sparks(src.loc)
|
||||
playsound(src.loc, "sparks", 50, 1)
|
||||
if(isliving(hit_atom))
|
||||
blink_mob(hit_atom)
|
||||
qdel(src)
|
||||
|
||||
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 139 KiB After Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 121 KiB |
|
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |