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
This commit is contained in:
phil235
2014-12-05 22:02:01 +01:00
98 changed files with 1573 additions and 1538 deletions
File diff suppressed because one or more lines are too long
-2
View File
@@ -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
+14 -11
View File
@@ -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.
+1 -1
View File
@@ -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
+4 -8
View File
@@ -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)
+2 -2
View File
@@ -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
+2 -7
View File
@@ -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()
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
+4
View File
@@ -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)
+5 -2
View File
@@ -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"
+1 -1
View File
@@ -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
+4 -4
View File
@@ -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))
+6 -6
View File
@@ -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
+2 -2
View File
@@ -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
+7 -6
View File
@@ -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
+1 -1
View File
@@ -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
+4 -3
View File
@@ -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)
+2 -1
View File
@@ -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
+10 -4
View File
@@ -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
+4 -4
View File
@@ -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))
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+28 -39
View File
@@ -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)
+43 -10
View File
@@ -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)
+1 -1
View File
@@ -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>")
+21 -11
View File
@@ -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)
+14 -6
View File
@@ -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!
+7 -9
View File
@@ -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
+40 -13
View File
@@ -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)
. = ..()
+2 -2
View File
@@ -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
+2
View File
@@ -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
+2 -2
View File
@@ -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")
+23 -11
View File
@@ -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
+16 -19
View File
@@ -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)
+23 -51
View File
@@ -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
+91 -2
View File
@@ -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
+2 -2
View File
@@ -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)
+1
View File
@@ -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
+5 -3
View File
@@ -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()
+1 -2
View File
@@ -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>")
+4 -4
View File
@@ -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")
+13 -1
View File
@@ -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
+28 -1
View File
@@ -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)
+13 -8
View File
@@ -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 + " ("
+2 -2
View File
@@ -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."
+8 -1
View File
@@ -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)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 139 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 87 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB