mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-22 20:57:23 +01:00
Merge remote-tracking branch 'upstream/dev' into 150722-TagPairs
Conflicts: code/game/gamemodes/changeling/modularchangling.dm
This commit is contained in:
@@ -68,7 +68,7 @@
|
||||
/obj/item/weapon/pen/crayon/afterattack(atom/target, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if(istype(target,/turf/simulated/floor))
|
||||
var/drawtype = input("Choose what you'd like to draw.", "Crayon scribbles") in list("graffiti","rune","letter")
|
||||
var/drawtype = input("Choose what you'd like to draw.", "Crayon scribbles") in list("graffiti","rune","letter","arrow")
|
||||
switch(drawtype)
|
||||
if("letter")
|
||||
drawtype = input("Choose the letter.", "Crayon scribbles") in list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
|
||||
@@ -77,6 +77,9 @@
|
||||
user << "You start drawing graffiti on the [target.name]."
|
||||
if("rune")
|
||||
user << "You start drawing a rune on the [target.name]."
|
||||
if("arrow")
|
||||
drawtype = input("Choose the arrow.", "Crayon scribbles") in list("left", "right", "up", "down")
|
||||
user << "You start drawing an arrow on the [target.name]."
|
||||
if(instant || do_after(user, 50))
|
||||
new /obj/effect/decal/cleanable/crayon(target,colour,shadeColour,drawtype)
|
||||
user << "You finish drawing."
|
||||
|
||||
@@ -1284,40 +1284,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
|
||||
user << "<span class='notice'>No significant chemical agents found in [A].</span>"
|
||||
|
||||
if(5)
|
||||
if((istype(A, /obj/item/weapon/tank)) || (istype(A, /obj/machinery/portable_atmospherics)))
|
||||
var/obj/icon = A
|
||||
for (var/mob/O in viewers(user, null))
|
||||
O << "<span class='warning'>\The [user] has used [src] on \icon[icon] [A].</span>"
|
||||
var/pressure = A:air_contents.return_pressure()
|
||||
|
||||
var/total_moles = A:air_contents.total_moles
|
||||
|
||||
user << "<span class='notice'>Results of analysis of \icon[icon]</span>"
|
||||
if (total_moles>0)
|
||||
user << "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
|
||||
for(var/g in A:air_contents.gas)
|
||||
user << "<span class='notice'>[gas_data.name[g]]: [round((A:air_contents.gas[g] / total_moles) * 100)]%</span>"
|
||||
user << "<span class='notice'>Temperature: [round(A:air_contents.temperature-T0C)]°C</span>"
|
||||
else
|
||||
user << "<span class='notice'>Tank is empty!</span>"
|
||||
|
||||
if (istype(A, /obj/machinery/atmospherics/pipe/tank))
|
||||
var/obj/icon = A
|
||||
for (var/mob/O in viewers(user, null))
|
||||
O << "<span class='warning'>\The [user] has used [src] on \icon[icon] [A]</span>"
|
||||
|
||||
var/obj/machinery/atmospherics/pipe/tank/T = A
|
||||
var/pressure = T.parent.air.return_pressure()
|
||||
var/total_moles = T.parent.air.total_moles
|
||||
|
||||
user << "<span class='notice'>Results of analysis of \icon[icon]</span>"
|
||||
if (total_moles>0)
|
||||
user << "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
|
||||
for(var/g in T.parent.air.gas)
|
||||
user << "<span class='notice'>[gas_data.name[g]]: [round((T.parent.air.gas[g] / total_moles) * 100)]%</span>"
|
||||
user << "<span class='notice'>Temperature: [round(T.parent.air.temperature-T0C)]°C</span>"
|
||||
else
|
||||
user << "<span class='notice'>Tank is empty!</span>"
|
||||
analyze_gases(A, user)
|
||||
|
||||
if (!scanmode && istype(A, /obj/item/weapon/paper) && owner)
|
||||
// JMO 20140705: Makes scanned document show up properly in the notes. Not pretty for formatted documents,
|
||||
|
||||
@@ -110,6 +110,7 @@
|
||||
|
||||
ai.loc = src
|
||||
ai.cancel_camera()
|
||||
ai.destroy_eyeobj(src)
|
||||
ai.control_disabled = 1
|
||||
ai.aiRestorePowerRoutine = 0
|
||||
carded_ai = ai
|
||||
|
||||
@@ -67,8 +67,8 @@
|
||||
user << "It has [uses] lights remaining."
|
||||
|
||||
/obj/item/device/lightreplacer/attackby(obj/item/W, mob/user)
|
||||
if(istype(W, /obj/item/stack/material/glass))
|
||||
var/obj/item/stack/material/glass/G = W
|
||||
if(istype(W, /obj/item/stack/material) && W.get_material_name() == "glass")
|
||||
var/obj/item/stack/G = W
|
||||
if(uses >= max_uses)
|
||||
user << "<span class='warning'>[src.name] is full.</span>"
|
||||
return
|
||||
|
||||
@@ -192,7 +192,7 @@
|
||||
*/
|
||||
/obj/item/device/radio/headset/headset_cargo
|
||||
name = "supply radio headset"
|
||||
desc = "A headset used by the QM and his slaves."
|
||||
desc = "A headset used by the QM and their slaves."
|
||||
icon_state = "cargo_headset"
|
||||
item_state = "headset"
|
||||
ks2type = /obj/item/device/encryptionkey/headset_cargo
|
||||
|
||||
@@ -156,6 +156,9 @@
|
||||
else
|
||||
channels[chan_name] |= FREQ_LISTENING
|
||||
|
||||
if(href_list["nowindow"]) // here for pAIs, maybe others will want it, idk
|
||||
return
|
||||
|
||||
interact(usr)
|
||||
|
||||
/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel) //BS12 EDIT
|
||||
@@ -575,7 +578,6 @@
|
||||
if(keyslot.syndie)
|
||||
src.syndie = 1
|
||||
|
||||
|
||||
for (var/ch_name in src.channels)
|
||||
if(!radio_controller)
|
||||
sleep(30) // Waiting for the radio_controller to be created.
|
||||
|
||||
@@ -256,6 +256,13 @@ REAGENT SCANNER
|
||||
|
||||
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINERING = 1)
|
||||
|
||||
/obj/item/device/analyzer/atmosanalyze(var/mob/user)
|
||||
var/air = user.return_air()
|
||||
if (!air)
|
||||
return
|
||||
|
||||
return atmosanalyzer_scan(src, air, user)
|
||||
|
||||
/obj/item/device/analyzer/attack_self(mob/user as mob)
|
||||
|
||||
if (user.stat)
|
||||
@@ -264,27 +271,7 @@ REAGENT SCANNER
|
||||
usr << "<span class='warning'>You don't have the dexterity to do this!</span>"
|
||||
return
|
||||
|
||||
var/turf/location = user.loc
|
||||
if (!( istype(location, /turf) ))
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/environment = location.return_air()
|
||||
|
||||
var/pressure = environment.return_pressure()
|
||||
var/total_moles = environment.total_moles
|
||||
|
||||
user.show_message("<span class='notice'><b>Results:</b></span>", 1)
|
||||
if(abs(pressure - ONE_ATMOSPHERE) < 10)
|
||||
user.show_message("<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>", 1)
|
||||
else
|
||||
user.show_message("<span class='warning'>Pressure: [round(pressure,0.1)] kPa</span>", 1)
|
||||
if(total_moles)
|
||||
for(var/g in environment.gas)
|
||||
user.show_message("<span class='notice'>[gas_data.name[g]]: [round((environment.gas[g] / total_moles)*100)]%</span>", 1)
|
||||
|
||||
user.show_message("<span class='notice'>Temperature: [round(environment.temperature-T0C)]°C</span>", 1)
|
||||
|
||||
src.add_fingerprint(user)
|
||||
analyze_gases(src, user)
|
||||
return
|
||||
|
||||
/obj/item/device/mass_spectrometer
|
||||
|
||||
@@ -127,8 +127,8 @@
|
||||
|
||||
/obj/item/robot_parts/robot_suit/attackby(obj/item/W as obj, mob/user as mob)
|
||||
..()
|
||||
if(istype(W, /obj/item/stack/material/steel) && !l_arm && !r_arm && !l_leg && !r_leg && !chest && !head)
|
||||
var/obj/item/stack/material/steel/M = W
|
||||
if(istype(W, /obj/item/stack/material) && W.get_material_name() == DEFAULT_WALL_MATERIAL && !l_arm && !r_arm && !l_leg && !r_leg && !chest && !head)
|
||||
var/obj/item/stack/material/M = W
|
||||
if (M.use(1))
|
||||
var/obj/item/weapon/secbot_assembly/ed209_assembly/B = new /obj/item/weapon/secbot_assembly/ed209_assembly
|
||||
B.loc = get_turf(src)
|
||||
|
||||
@@ -146,7 +146,7 @@
|
||||
|
||||
return
|
||||
|
||||
return -1 // the bullet/projectile goes through the target! Ie, you missed
|
||||
return PROJECTILE_CONTINUE // the bullet/projectile goes through the target!
|
||||
|
||||
|
||||
// Small memory holder entity for transparent bullet holes
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
user.drop_from_inventory(src)
|
||||
qdel(src)
|
||||
|
||||
if(istype(O,/obj/item/stack/material/steel))
|
||||
var/obj/item/stack/material/steel/M = O
|
||||
if(istype(O,/obj/item/stack/material) && O.get_material_name() == DEFAULT_WALL_MATERIAL)
|
||||
var/obj/item/stack/M = O
|
||||
if (M.use(1))
|
||||
use(1)
|
||||
new/obj/item/stack/tile/light(get_turf(user))
|
||||
|
||||
@@ -40,7 +40,7 @@ AI MODULES
|
||||
|
||||
if (comp.current.stat == 2 || comp.current.control_disabled == 1)
|
||||
usr << "Upload failed. No signal is being detected from the AI."
|
||||
else if (!comp.current.has_power)
|
||||
else if (comp.current.see_in_dark == 0)
|
||||
usr << "Upload failed. Only a faint signal is being detected from the AI, and it is not responding to our requests. It may be low on power."
|
||||
else
|
||||
src.transmitInstructions(comp.current, usr)
|
||||
@@ -83,7 +83,7 @@ AI MODULES
|
||||
laws.sync(target, 0)
|
||||
addAdditionalLaws(target, sender)
|
||||
|
||||
target << "[sender] has uploaded a change to the laws you must follow, using \an [src]. From now on: "
|
||||
target << "\The [sender] has uploaded a change to the laws you must follow, using \an [src]. From now on: "
|
||||
target.show_laws()
|
||||
|
||||
/obj/item/weapon/aiModule/proc/log_law_changes(var/mob/living/silicon/ai/target, var/mob/sender)
|
||||
@@ -140,13 +140,7 @@ AI MODULES
|
||||
if(!targetName)
|
||||
usr << "No name detected on module, please enter one."
|
||||
return 0
|
||||
..()
|
||||
|
||||
/obj/item/weapon/aiModule/oneHuman/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
|
||||
..()
|
||||
var/law = "Only [targetName] is a crew member."
|
||||
target << "[sender.real_name] attempted to modify your zeroth law." // And lets them know that someone tried. --NeoFite
|
||||
target << "It would be in your best interest to play along with [sender.real_name] that [law]"
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/aiModule/oneHuman/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
|
||||
var/law = "Only [targetName] is an crew member."
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
else if(istype(target,/turf))
|
||||
user << "<span class='notice'>You scrub \the [target.name] clean.</span>"
|
||||
var/turf/T = target
|
||||
T.clean()
|
||||
T.clean(src)
|
||||
else
|
||||
user << "<span class='notice'>You clean \the [target.name].</span>"
|
||||
target.clean_blood()
|
||||
|
||||
@@ -112,20 +112,9 @@
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/device/analyzer) && ptank)
|
||||
var/obj/item/weapon/icon = src
|
||||
user.visible_message("<span class='notice'>[user] has used the analyzer on \icon[icon]</span>")
|
||||
var/pressure = ptank.air_contents.return_pressure()
|
||||
var/total_moles = ptank.air_contents.total_moles
|
||||
|
||||
user << "<span class='notice'>Results of analysis of \icon[icon]</span>"
|
||||
if(total_moles>0)
|
||||
user << "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
|
||||
for(var/g in ptank.air_contents.gas)
|
||||
user << "<span class='notice'>[gas_data.name[g]]: [round((ptank.air_contents.gas[g] / total_moles) * 100)]%</span>"
|
||||
user << "<span class='notice'>Temperature: [round(ptank.air_contents.temperature-T0C)]°C</span>"
|
||||
else
|
||||
user << "<span class='notice'>Tank is empty!</span>"
|
||||
if(istype(W, /obj/item/device/analyzer))
|
||||
var/obj/item/device/analyzer/A = W
|
||||
A.analyze_gases(src, user)
|
||||
return
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
user << "<span class='warning'>\The [src] is full.</span>"
|
||||
else
|
||||
spawn(5)
|
||||
I.reagents.trans_to_mob(src.imp, 5)
|
||||
I.reagents.trans_to_obj(src.imp, 5)
|
||||
user << "<span class='notice'>You inject 5 units of the solution. The syringe now contains [I.reagents.total_volume] units.</span>"
|
||||
else if (istype(I, /obj/item/weapon/implanter))
|
||||
var/obj/item/weapon/implanter/M = I
|
||||
|
||||
@@ -34,6 +34,9 @@
|
||||
if(!isnull(matter[material_type]))
|
||||
matter[material_type] *= force_divisor // May require a new var instead.
|
||||
|
||||
/obj/item/weapon/material/get_material()
|
||||
return material
|
||||
|
||||
/obj/item/weapon/material/proc/update_force()
|
||||
if(edge || sharp)
|
||||
force = material.get_edge_damage()
|
||||
|
||||
@@ -89,4 +89,4 @@
|
||||
..(loc, "steel")
|
||||
|
||||
/obj/item/weapon/material/shard/phoron/New(loc)
|
||||
..(loc, "phoron glass")
|
||||
..(loc, "phglass")
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
/obj/item/weapon/melee/energy/attack_self(mob/living/user as mob)
|
||||
if (active)
|
||||
if ((CLUMSY in user.mutations) && prob(50))
|
||||
user.visible_message("<span class='danger'>[user] accidentally cuts \himself with \the [src].</span>",\
|
||||
user.visible_message("<span class='danger'>\The [user] accidentally cuts \himself with \the [src].</span>",\
|
||||
"<span class='danger'>You accidentally cut yourself with \the [src].</span>")
|
||||
user.take_organ_damage(5,5)
|
||||
deactivate(user)
|
||||
@@ -50,9 +50,10 @@
|
||||
return
|
||||
|
||||
/obj/item/weapon/melee/energy/suicide_act(mob/user)
|
||||
var/tempgender = "[user.gender == MALE ? "he's" : user.gender == FEMALE ? "she's" : "they are"]"
|
||||
if (active)
|
||||
viewers(user) << pick("<span class='danger'>\The [user] is slitting \his stomach open with \the [src]! It looks like \he's trying to commit seppuku.</span>", \
|
||||
"<span class='danger'>\The [user] is falling on \the [src]! It looks like \he's trying to commit suicide.</span>")
|
||||
viewers(user) << pick("<span class='danger'>\The [user] is slitting \his stomach open with \the [src]! It looks like [tempgender] trying to commit seppuku.</span>", \
|
||||
"<span class='danger'>\The [user] is falling on \the [src]! It looks like [tempgender] trying to commit suicide.</span>")
|
||||
return (BRUTELOSS|FIRELOSS)
|
||||
|
||||
/*
|
||||
@@ -90,7 +91,7 @@
|
||||
user << "<span class='notice'>\The [src] is de-energised. It's just a regular axe now.</span>"
|
||||
|
||||
/obj/item/weapon/melee/energy/axe/suicide_act(mob/user)
|
||||
viewers(user) << "<span class='warning'>\The [user] swings \the [src] towards /his head! It looks like \he's trying to commit suicide.</span>"
|
||||
viewers(user) << "<span class='warning'>\The [user] swings \the [src] towards \his head! It looks like \he's trying to commit suicide.</span>"
|
||||
return (BRUTELOSS|FIRELOSS)
|
||||
|
||||
/*
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
/obj/item/weapon/mop/New()
|
||||
create_reagents(5)
|
||||
|
||||
//expects an atom containing the reagents used to clean the turf
|
||||
/turf/proc/clean(atom/source)
|
||||
if(source.reagents.has_reagent("water", 1))
|
||||
clean_blood()
|
||||
|
||||
@@ -119,10 +119,10 @@
|
||||
//verbs += /obj/item/weapon/storage/bag/sheetsnatcher/quick_empty
|
||||
|
||||
can_be_inserted(obj/item/W as obj, stop_messages = 0)
|
||||
if(!istype(W,/obj/item/stack/material) || istype(W,/obj/item/stack/material/sandstone) || istype(W,/obj/item/stack/material/wood))
|
||||
if(!istype(W,/obj/item/stack/material))
|
||||
if(!stop_messages)
|
||||
usr << "The snatcher does not accept [W]."
|
||||
return 0 //I don't care, but the existing code rejects them for not being "sheets" *shrug* -Sayu
|
||||
return 0
|
||||
var/current = 0
|
||||
for(var/obj/item/stack/material/S in contents)
|
||||
current += S.amount
|
||||
|
||||
@@ -335,7 +335,6 @@
|
||||
..()
|
||||
|
||||
if(isrobot(user))
|
||||
user << "<span class='warning'>You're a robot. No.</span>"
|
||||
return //Robots can't interact with storage items.
|
||||
|
||||
if(!can_be_inserted(W))
|
||||
|
||||
@@ -87,28 +87,12 @@
|
||||
|
||||
/obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
..()
|
||||
var/obj/icon = src
|
||||
|
||||
if (istype(src.loc, /obj/item/assembly))
|
||||
icon = src.loc
|
||||
|
||||
if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1)
|
||||
for (var/mob/O in viewers(user, null))
|
||||
O << "<span class='notice'>\The [user] has used [W] on \icon[icon] [src]</span>"
|
||||
|
||||
var/pressure = air_contents.return_pressure()
|
||||
manipulated_by = user.real_name //This person is aware of the contents of the tank.
|
||||
var/total_moles = air_contents.total_moles
|
||||
|
||||
user << "<span class='notice'>Results of analysis of \icon[icon]</span>"
|
||||
if (total_moles>0)
|
||||
user << "<span class='notice'>Pressure: [round(pressure,0.1)] kPa</span>"
|
||||
for(var/g in air_contents.gas)
|
||||
user << "<span class='notice'>[gas_data.name[g]]: [(round(air_contents.gas[g] / total_moles) * 100)]%</span>"
|
||||
user << "<span class='notice'>Temperature: [round(air_contents.temperature-T0C)]°C</span>"
|
||||
else
|
||||
user << "<span class='notice'>Tank is empty!</span>"
|
||||
src.add_fingerprint(user)
|
||||
var/obj/item/device/analyzer/A = W
|
||||
A.analyze_gases(src, user)
|
||||
else if (istype(W,/obj/item/latexballon))
|
||||
var/obj/item/latexballon/LB = W
|
||||
LB.blow(src)
|
||||
@@ -131,7 +115,7 @@
|
||||
location = loc.loc
|
||||
else if(istype(loc, /mob/living/carbon))
|
||||
location = loc
|
||||
|
||||
|
||||
var/using_internal
|
||||
if(istype(location))
|
||||
if(location.internal==src)
|
||||
@@ -278,11 +262,11 @@
|
||||
var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE
|
||||
|
||||
explosion(
|
||||
get_turf(loc),
|
||||
round(min(BOMBCAP_DVSTN_RADIUS, range*0.25)),
|
||||
round(min(BOMBCAP_HEAVY_RADIUS, range*0.50)),
|
||||
round(min(BOMBCAP_LIGHT_RADIUS, range*1.00)),
|
||||
round(min(BOMBCAP_FLASH_RADIUS, range*1.50)),
|
||||
get_turf(loc),
|
||||
round(min(BOMBCAP_DVSTN_RADIUS, range*0.25)),
|
||||
round(min(BOMBCAP_HEAVY_RADIUS, range*0.50)),
|
||||
round(min(BOMBCAP_LIGHT_RADIUS, range*1.00)),
|
||||
round(min(BOMBCAP_FLASH_RADIUS, range*1.50)),
|
||||
)
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -212,8 +212,12 @@
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/process()
|
||||
if(welding && prob(5) && !remove_fuel(1))
|
||||
setWelding(0)
|
||||
if(welding)
|
||||
if(prob(5))
|
||||
remove_fuel(1)
|
||||
|
||||
if(get_fuel() == 0)
|
||||
setWelding(0)
|
||||
|
||||
//I'm not sure what this does. I assume it has to do with starting fires...
|
||||
//...but it doesnt check to see if the welder is on or not.
|
||||
|
||||
Reference in New Issue
Block a user