Merge branch 'master' of https://github.com/tgstation/-tg-station into nosenseofrightandwrongiguess

Conflicts:
	code/game/gamemodes/wizard/rightandwrong.dm
	code/modules/projectiles/guns/projectile/launchers.dm
	code/modules/projectiles/guns/projectile/shotgun.dm
	code/modules/research/designs/weapon_designs.dm
	icons/obj/gun.dmi
This commit is contained in:
paprka
2015-01-15 21:56:23 -08:00
156 changed files with 2999 additions and 971 deletions
+1 -1
View File
@@ -666,7 +666,7 @@ var/global/floorIsLava = 0
/datum/admins/proc/unprison(var/mob/M in mob_list)
set category = "Admin"
set name = "Unprison"
if (M.z == 2)
if (M.z == ZLEVEL_CENTCOM)
M.loc = pick(latejoin)
message_admins("[key_name_admin(usr)] has unprisoned [key_name_admin(M)]")
log_admin("[key_name(usr)] has unprisoned [key_name(M)]")
+8 -4
View File
@@ -66,7 +66,11 @@
log_admin("[key_name(usr)] started a gang war.")
if(!src.makeGangsters())
usr << "<span class='danger'>Unfortunatly there were not enough candidates available.</span>"
if("13")
message_admins("[key_name(usr)] created a emergency response team.")
log_admin("[key_name(usr)] created a emergency response team.")
if(!src.makeEmergencyresponseteam())
usr << "<span class='danger'>Unfortunatly there were not enough candidates available.</span>"
else if(href_list["forceevent"])
var/datum/round_event_control/E = locate(href_list["forceevent"]) in SSevent.control
@@ -1834,7 +1838,7 @@
message_admins("[key_name_admin(usr)] made the floor LAVA! It'll last [length] seconds and it will deal [damage] damage to everyone.")
for(var/turf/simulated/floor/F in world)
if(F.z == 1)
if(F.z == ZLEVEL_STATION)
F.name = "lava"
F.desc = "The floor is LAVA!"
F.overlays += "lava"
@@ -1859,7 +1863,7 @@
sleep(10)
for(var/turf/simulated/floor/F in world) // Reset everything.
if(F.z == 1)
if(F.z == ZLEVEL_STATION)
F.name = initial(F.name)
F.desc = initial(F.desc)
F.overlays.Cut()
@@ -1891,7 +1895,7 @@
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","EgL")
for(var/obj/machinery/door/airlock/W in world)
if(W.z == 1 && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
if(W.z == ZLEVEL_STATION && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison))
W.req_access = list()
message_admins("[key_name_admin(usr)] activated Egalitarian Station mode")
priority_announce("Centcom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/AI/commandreport.ogg')
+26
View File
@@ -819,6 +819,9 @@ var/global/list/g_fancy_list_of_types = null
if("death commando")
equip_deathsquad(M)
if("emergency response officer")
equip_emergencyresponsesquad(M)
if("centcom official")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes)
@@ -1054,6 +1057,7 @@ var/global/list/g_fancy_list_of_types = null
usr << browse(dat, "window=dellog")
//Deathsquad
/proc/equip_deathsquad(var/mob/living/carbon/human/M, var/officer)
var/obj/item/device/radio/R = new /obj/item/device/radio/headset(M)
R.set_frequency(1441)
@@ -1101,3 +1105,25 @@ var/global/list/g_fancy_list_of_types = null
W.registered_name = M.real_name
W.update_label(M.real_name)
M.equip_to_slot_or_del(W, slot_wear_id)
//Emergency Response Team
/proc/equip_emergencyresponsesquad(var/mob/living/carbon/human/M, var/officer)
var/obj/item/device/radio/R = new /obj/item/device/radio/headset(M)
R.set_frequency(1441)
M.equip_to_slot_or_del(R, slot_ears)
if(officer)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/card/id/ertsCommand(M), slot_wear_id)
else
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
L.imp_in = M
L.implanted = 1
M.sec_hud_set_implants()
@@ -21,6 +21,7 @@ client/proc/one_click_antag()
<a href='?src=\ref[src];makeAntag=6'>Make Wizard (Requires Ghosts)</a><br>
<a href='?src=\ref[src];makeAntag=7'>Make Nuke Team (Requires Ghosts)</a><br>
<a href='?src=\ref[src];makeAntag=10'>Make Deathsquad (Requires Ghosts)</a><br>
<a href='?src=\ref[src];makeAntag=13'>Make Emergency Response Team (Requires Ghosts)</a><br>
"}
/* These dont work just yet
Ninja, aliens and deathsquad I have not looked into yet
@@ -427,6 +428,83 @@ client/proc/one_click_antag()
return 0
// EMERGENCY RESPONSE TEAM
/datum/admins/proc/makeEmergencyresponseteam()
var/list/mob/dead/observer/candidates = list()
var/time_passed = world.time
var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", "Assist the station.")
//Generates a list of officers from active ghosts. Then the user picks which characters to respawn as the officers.
for(var/mob/dead/observer/G in player_list)
spawn(0)
switch(alert(G,"Do you wish to be considered for an elite Nanotrasen Emergency Response Team being sent in?","Please answer in 30 seconds!","Yes","No"))
if("Yes")
if((world.time-time_passed)>300)//If more than 30 game seconds passed.
return
candidates += G
if("No")
return
else
return
sleep(300)
for(var/mob/dead/observer/G in candidates)
if(!G.key)
candidates.Remove(G)
if(candidates.len >= 4) //Minimum 4 to be considered a squad
//Pick the (un)lucky players
var/numagents = min(7,candidates.len) //How many officers to spawn
var/list/spawnpoints = emergencyresponseteamspawn
while(numagents && spawnpoints.len && candidates.len)
var/spawnloc = spawnpoints[1]
var/mob/dead/observer/chosen_candidate = pick(candidates)
candidates -= chosen_candidate
if(!chosen_candidate.key)
continue
//Spawn and equip the officer
var/mob/living/carbon/human/ERTOperative = new(spawnloc)
chosen_candidate.client.prefs.copy_to(ERTOperative)
ready_dna(ERTOperative)
if(numagents == 1) //If Squad Leader
ERTOperative.real_name = "Commander [pick(ERTOperative.real_name)]"
equip_emergencyresponsesquad(ERTOperative, 1)
else
ERTOperative.real_name = "Officer [pick(ERTOperative.real_name)]"
equip_emergencyresponsesquad(ERTOperative)
ERTOperative.key = chosen_candidate.key
ERTOperative.mind.assigned_role = "ERT"
//Assign antag status and the mission
ticker.mode.traitors += ERTOperative.mind
ERTOperative.mind.special_role = "ert"
var/datum/objective/missionobj = new
missionobj.owner = ERTOperative.mind
missionobj.explanation_text = mission
missionobj.completed = 1
ERTOperative.mind.objectives += missionobj
//Greet the commando
ERTOperative << "<B><font size=3 color=red>You are the [numagents==1?"Emergency Response Team Commander":"Emergency Response Officer"].</font></B>"
var/missiondesc = "Your squad is being sent on a mission to [station_name()] by Nanotrasen's Security Division."
if(numagents == 1) //If Squad Leader
missiondesc += " Lead your squad to ensure the completion of the mission. Avoid civilian casualites when possible. Board the shuttle when your team is ready."
else
missiondesc += " Follow orders given to you by your commander. Avoid civilian casualites when possible."
missiondesc += "<BR><B>Your Mission</B>: [mission]"
ERTOperative << missiondesc
//Logging and cleanup
if(numagents == 1)
message_admins("The emergency response team has spawned with the mission: [mission].")
log_game("[key_name(ERTOperative)] has been selected as a Emergency Response Officer")
spawnpoints -= spawnloc
numagents--
return 1
return
/datum/admins/proc/makeBody(var/mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character
if(!G_found || !G_found.key) return
+1 -2
View File
@@ -88,8 +88,7 @@
if((!secured)||(!on)||(cooldown > 0))
return 0
pulse(0)
if(src.loc)
src.loc.audible_message("\icon[src] *beep* *beep*", null, 3)
audible_message("\icon[src] *beep* *beep*", null, 3)
cooldown = 2
spawn(10)
process_cooldown()
+1 -2
View File
@@ -48,8 +48,7 @@
/obj/item/device/assembly/prox_sensor/sense()
if((!secured)||(!scanning)||(cooldown > 0)) return 0
pulse(0)
if(src.loc)
src.loc.audible_message("\icon[src] *beep* *beep*", null, 3)
audible_message("\icon[src] *beep* *beep*", null, 3)
cooldown = 2
spawn(10)
process_cooldown()
+1 -2
View File
@@ -139,8 +139,7 @@ Code:
if(signal.encryption != code) return 0
if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0
pulse(1)
if(src.loc)
src.loc.audible_message("\icon[src] *beep* *beep*", null, 1)
audible_message("\icon[src] *beep* *beep*", null, 1)
return
+1 -2
View File
@@ -38,8 +38,7 @@
if((!secured)||(cooldown > 0))
return 0
pulse(0)
if(src.loc)
src.loc.audible_message("\icon[src] *beep* *beep*", null, 3)
audible_message("\icon[src] *beep* *beep*", null, 3)
cooldown = 2
spawn(10)
process_cooldown()
+4
View File
@@ -85,6 +85,7 @@ BLIND // can't see anything
put_on_delay = 40
var/mask_adjusted = 0
var/ignore_maskadjust = 1
var/adjusted_flags = null
//Override this to modify speech like luchador masks.
/obj/item/clothing/mask/proc/speechModification(message)
@@ -103,6 +104,7 @@ BLIND // can't see anything
flags_inv |= visor_flags_inv
user << "You push \the [src] back into place."
src.mask_adjusted = 0
slot_flags = initial(slot_flags)
else
src.icon_state += "_up"
user << "You push \the [src] out of the way."
@@ -111,6 +113,8 @@ BLIND // can't see anything
flags &= ~visor_flags
flags_inv &= ~visor_flags_inv
src.mask_adjusted = 1
if(adjusted_flags)
slot_flags = adjusted_flags
usr.update_inv_wear_mask()
-7
View File
@@ -63,13 +63,6 @@
item_state = "that"
flags_inv = 0
/obj/item/clothing/head/greenbandana
name = "green bandana"
desc = "It's a green bandana with some fine nanotech lining."
icon_state = "greenbandana"
item_state = "greenbandana"
flags_inv = 0
/obj/item/clothing/head/cardborg
name = "cardborg helmet"
desc = "A helmet made out of a box."
@@ -64,3 +64,49 @@
if(voicechange)
message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
return message
/obj/item/clothing/mask/bandana
name = "botany bandana"
desc = "A fine bandana with nanotech lining and a hydroponics pattern."
w_class = 1
flags = MASKCOVERSMOUTH
flags_inv = HIDEFACE
visor_flags = MASKCOVERSMOUTH
visor_flags_inv = HIDEFACE
slot_flags = SLOT_MASK
ignore_maskadjust = 0
adjusted_flags = SLOT_HEAD
icon_state = "bandbotany"
/obj/item/clothing/mask/bandana/attack_self(var/mob/user)
adjustmask(user)
/obj/item/clothing/mask/bandana/red
name = "red bandana"
desc = "A fine red bandana with nanotech lining."
icon_state = "bandred"
/obj/item/clothing/mask/bandana/blue
name = "blue bandana"
desc = "A fine blue bandana with nanotech lining."
icon_state = "bandblue"
/obj/item/clothing/mask/bandana/green
name = "green bandana"
desc = "A fine green bandana with nanotech lining."
icon_state = "bandgreen"
/obj/item/clothing/mask/bandana/gold
name = "gold bandana"
desc = "A fine gold bandana with nanotech lining."
icon_state = "bandgold"
/obj/item/clothing/mask/bandana/black
name = "black bandana"
desc = "A fine black bandana with nanotech lining."
icon_state = "bandblack"
/obj/item/clothing/mask/bandana/skull
name = "skull bandana"
desc = "A fine black bandana with nanotech lining and a skull emblem."
icon_state = "bandskull"
@@ -115,3 +115,56 @@
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
strip_delay = 40
put_on_delay = 20
//Emergency Response Team suits
/obj/item/clothing/head/helmet/space/hardsuit/ert
name = "emergency response unit helmet"
desc = "Standard issue command helmet for the ERT"
icon_state = "hardsuit0-ert_commander"
item_state = "hardsuit0-ert_commander"
item_color = "ert_commander"
armor = list(melee = 65, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 100, rad = 100)
strip_delay = 130
/obj/item/clothing/head/helmet/space/hardsuit/ert/sec
desc = "Standard issue security helmet for the ERT"
icon_state = "hardsuit0-ert_security"
item_state = "hardsuit0-ert_security"
item_color = "ert_security"
/obj/item/clothing/head/helmet/space/hardsuit/ert/engi
desc = "Standard issue engineer helmet for the ERT"
icon_state = "hardsuit0-ert_engineer"
item_state = "hardsuit0-ert_engineer"
item_color = "ert_engineer"
/obj/item/clothing/head/helmet/space/hardsuit/ert/med
desc = "Standard issue medical helmet for the ERT"
icon_state = "hardsuit0-ert_medical"
item_state = "hardsuit0-ert_medical"
item_color = "ert_medical"
/obj/item/clothing/suit/space/ert
name = "emergency response team suit"
desc = "Standard issue command suit for the ERT."
icon_state = "ert_command"
item_state = "ert_command"
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)
armor = list(melee = 65, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 100, rad = 100)
slowdown = 1
strip_delay = 130
/obj/item/clothing/suit/space/ert/sec
desc = "Standard issue security suit for the ERT."
icon_state = "ert_security"
item_state = "ert_security"
/obj/item/clothing/suit/space/ert/engi
desc = "Standard issue engineer suit for the ERT."
icon_state = "ert_engineer"
item_state = "ert_engineer"
/obj/item/clothing/suit/space/ert/med
desc = "Standard issue medical suit for the ERT."
icon_state = "ert_medical"
item_state = "ert_medical"
-6
View File
@@ -98,12 +98,6 @@
item_state = "g_suit"
item_color = "lightgreen"
/obj/item/clothing/under/color/lightblue
name = "lightblue jumpsuit"
icon_state = "lightblue"
item_state = "b_suit"
item_color = "lightblue"
/obj/item/clothing/under/color/lightbrown
name = "lightbrown jumpsuit"
icon_state = "lightbrown"
+1 -1
View File
@@ -28,7 +28,7 @@
/datum/round_event/alien_infestation/start()
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
if(temp_vent.loc.z == 1 && !temp_vent.welded)
if(temp_vent.loc.z == ZLEVEL_STATION && !temp_vent.welded)
if(temp_vent.parent.other_atmosmch.len > 20) //Stops Aliens getting stuck in small networks. See: Security, Virology
vents += temp_vent
+1 -1
View File
@@ -1555,7 +1555,7 @@ ________________________________________________________________________________
P.tnote += "<i><b>&larr; From [!s_control?(A):"an unknown source"]:</b></i><br>[t]<br>"
if (!P.silent)
playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1)
P.loc.audible_message("\icon[P] *[P.ttone]*", null, 3)
P.audible_message("\icon[P] *[P.ttone]*", null, 3)
P.overlays.Cut()
P.overlays += image('icons/obj/pda.dmi', "pda-r")
+1 -1
View File
@@ -21,7 +21,7 @@
/datum/round_event/spider_infestation/start()
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
if(temp_vent.loc.z == 1 && !temp_vent.welded)
if(temp_vent.loc.z == ZLEVEL_STATION && !temp_vent.welded)
if(temp_vent.parent.other_atmosmch.len > 20)
vents += temp_vent
+1 -1
View File
@@ -17,7 +17,7 @@
/datum/round_event/vent_clog/setup()
endWhen = rand(25, 100)
for(var/obj/machinery/atmospherics/unary/vent_scrubber/temp_vent in machines)
if(temp_vent.loc.z == 1)
if(temp_vent.loc.z == ZLEVEL_STATION)
if(temp_vent.parent.other_atmosmch.len > 20)
vents += temp_vent
if(!vents.len)
+1 -1
View File
@@ -52,7 +52,7 @@
..()
/obj/item/weapon/greentext/process()
if(new_holder && new_holder.z == 2)//you're winner!
if(new_holder && new_holder.z == ZLEVEL_CENTCOM)//you're winner!
new_holder << "<font color='green'>At last it feels like victory is assured!</font>"
if(!(new_holder in ticker.mode.traitors))
ticker.mode.traitors += new_holder.mind
+2 -2
View File
@@ -12,7 +12,7 @@
/datum/round_event/wizard/lava/start()
for(var/turf/simulated/floor/F in world)
if(F.z == 1)
if(F.z == ZLEVEL_STATION)
F.name = "lava"
F.desc = "The floor is LAVA!"
F.overlays += "lava"
@@ -34,7 +34,7 @@
/datum/round_event/wizard/lava/end()
for(var/turf/simulated/floor/F in world) // Reset everything.
if(F.z == 1)
if(F.z == ZLEVEL_STATION)
F.name = initial(F.name)
F.desc = initial(F.desc)
F.overlays.Cut()
+1 -1
View File
@@ -20,7 +20,7 @@
/datum/round_event/wormholes/start()
for(var/turf/simulated/floor/T in world)
if(T.z == 1)
if(T.z == ZLEVEL_STATION)
pick_turfs += T
for(var/i = 1, i <= number_of_wormholes, i++)
@@ -128,8 +128,7 @@
/obj/item/weapon/reagent_containers/food/snacks/badrecipe/New()
..()
eatverb = pick("choke down","nibble","gnaw","chomp")
reagents.add_reagent("toxin", 1)
reagents.add_reagent("carbon", 3)
reagents.add_reagent("????", 30)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff
@@ -254,4 +253,4 @@
..()
reagents.add_reagent("nutriment", 4)
reagents.add_reagent("sugar", 2)
reagents.add_reagent("coco", 2)
reagents.add_reagent("coco", 2)
+1 -1
View File
@@ -281,7 +281,7 @@
throw_speed = 3
throw_range = 5
w_class = 1.0
var/obj/machinery/librarycomp/computer //Associated computer - Modes 1 to 3 use this
var/obj/machinery/computer/libraryconsole/bookmanagement/computer //Associated computer - Modes 1 to 3 use this
var/obj/item/weapon/book/book //Currently scanned book
var/mode = 0 //0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory
+30 -28
View File
@@ -17,23 +17,28 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
var/getdate
var/duedate
/*
* Library Public Computer
*/
/obj/machinery/librarypubliccomp
/obj/machinery/computer/libraryconsole
name = "library visitor console"
icon = 'icons/obj/library.dmi'
icon_state = "computer"
anchored = 1
density = 1
icon = 'icons/obj/computer.dmi'
icon_state = "library"
circuit = /obj/item/weapon/circuitboard/libraryconsole
var/screenstate = 0
var/title
var/category = "Any"
var/author
var/SQLquery
/obj/machinery/librarypubliccomp/attack_hand(var/mob/user as mob)
usr.set_machine(src)
/obj/machinery/computer/libraryconsole/attack_hand(var/mob/user as mob)
if(..())
return
interact(user)
/obj/machinery/computer/libraryconsole/interact(mob/user)
user.set_machine(src)
var/dat = "" // <META HTTP-EQUIV='Refresh' CONTENT='10'>
switch(screenstate)
if(0)
@@ -63,14 +68,13 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
dat += "<tr><td>[author]</td><td>[title]</td><td>[category]</td><td>[id]</td></tr>"
dat += "</table><BR>"
dat += "<A href='?src=\ref[src];back=1'>\[Go Back\]</A><BR>"
//user << browse(dat, "window=publiclibrary")
//onclose(user, "publiclibrary")
var/datum/browser/popup = new(user, "publiclibrary", name, 600, 400)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
/obj/machinery/librarypubliccomp/Topic(href, href_list)
/obj/machinery/computer/libraryconsole/Topic(href, href_list)
. = ..()
if(..())
usr << browse(null, "window=publiclibrary")
onclose(usr, "publiclibrary")
@@ -115,17 +119,12 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
/*
* Library Computer
* After 860 days, it's finally a buildable computer.
*/
// TODO: Make this an actual /obj/machinery/computer that can be crafted from circuit boards and such
// It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it.
/obj/machinery/librarycomp
/obj/machinery/computer/libraryconsole/bookmanagement
name = "book inventory management console"
icon = 'icons/obj/library.dmi'
icon_state = "computer"
anchored = 1
density = 1
var/arcanecheckout = 0
var/screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book
screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book
var/buffer_book
var/buffer_mob
var/upload_category = "Fiction"
@@ -134,10 +133,16 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
var/checkoutperiod = 5 // In minutes
var/obj/machinery/libraryscanner/scanner // Book scanner that will be used when uploading books to the Archive
var/bibledelay = 0 // LOL NO SPAM (1 minute delay) -- Doohl
var/bibledelay = 0
/obj/machinery/librarycomp/attack_hand(var/mob/user as mob)
usr.set_machine(src)
/obj/machinery/computer/libraryconsole/bookmanagement/New()
..()
if(circuit)
circuit.name = "circuit board (Book Inventory Management Console)"
circuit.build_path = /obj/machinery/computer/libraryconsole/bookmanagement
/obj/machinery/computer/libraryconsole/bookmanagement/interact(mob/user)
user.set_machine(src)
var/dat = "" // <META HTTP-EQUIV='Refresh' CONTENT='10'>
switch(screenstate)
if(0)
@@ -237,15 +242,12 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
dat += "<A href='?src=\ref[src];arccheckout=1'>Yes.</A><BR>"
dat += "<A href='?src=\ref[src];switchscreen=0'>No.</A><BR>"
//dat += "<A HREF='?src=\ref[user];mach_close=library'>Close</A><br><br>"
//user << browse(dat, "window=library")
//onclose(user, "library")
var/datum/browser/popup = new(user, "library", name, 600, 400)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
/obj/machinery/librarycomp/attackby(obj/item/weapon/W as obj, mob/user as mob)
/obj/machinery/computer/libraryconsole/bookmanagement/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/barcodescanner))
var/obj/item/weapon/barcodescanner/scanner = W
scanner.computer = src
@@ -254,11 +256,11 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
else
..()
/obj/machinery/librarycomp/emag_act(mob/user as mob)
/obj/machinery/computer/libraryconsole/bookmanagement/emag_act(mob/user as mob)
if(density && !emagged)
emagged = 1
/obj/machinery/librarycomp/Topic(href, href_list)
/obj/machinery/computer/libraryconsole/bookmanagement/Topic(href, href_list)
if(..())
usr << browse(null, "window=library")
onclose(usr, "library")
@@ -394,7 +396,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
src.updateUsrDialog()
return
/obj/machinery/librarycomp/say_quote(text)
/obj/machinery/computer/libraryconsole/bookmanagement/say_quote(text)
return "flashes, \"[text]\""
+1 -1
View File
@@ -422,7 +422,7 @@
var/list/L = list()
for(var/obj/item/device/radio/beacon/B in world)
var/turf/T = get_turf(B)
if(T.z == 1)
if(T.z == ZLEVEL_STATION)
L += B
if(!L.len)
user << "<span class='notice'>The [src.name] failed to create a wormhole.</span>"
@@ -81,5 +81,5 @@
if (m_type & 1)
visible_message(message)
else
src.loc.audible_message(message)
audible_message(message)
return
@@ -107,5 +107,5 @@
if (m_type & 1)
visible_message(message)
else
src.loc.audible_message(message)
audible_message(message)
return
@@ -69,4 +69,4 @@
if (m_type & 1)
visible_message(message)
else if (m_type & 2)
src.loc.audible_message(message)
audible_message(message)
+1 -1
View File
@@ -195,4 +195,4 @@
if (m_type & 1)
visible_message(message)
else if (m_type & 2)
src.loc.audible_message(message)
audible_message(message)
@@ -342,5 +342,5 @@
if (m_type & 1)
visible_message(message)
else if (m_type & 2)
src.loc.audible_message(message)
audible_message(message)
@@ -401,7 +401,7 @@
else
if(H.overeatduration > 500)
H << "<span class='danger'>You suddenly feel blubbery!</span>"
H.mutations |= FAT
H.disabilities |= FAT
H.update_inv_w_uniform(0)
H.update_inv_wear_suit()
@@ -77,5 +77,5 @@
if (m_type & 1)
visible_message(message)
else
src.loc.audible_message(message)
audible_message(message)
return
@@ -82,7 +82,7 @@
if (m_type & 1)
visible_message(message)
else
src.loc.audible_message(message)
audible_message(message)
if (regenerate_icons)
regenerate_icons()
+1 -1
View File
@@ -275,4 +275,4 @@
if (m_type & 1)
visible_message(message)
else if (m_type & 2)
src.loc.audible_message(message)
audible_message(message)
@@ -205,5 +205,5 @@
if (m_type & 1)
visible_message(message)
else
src.loc.audible_message(message)
audible_message(message)
return
+4 -4
View File
@@ -140,7 +140,7 @@
/obj/machinery/power/apc/Destroy()
if(malfai && operating)
if (ticker.mode.config_tag == "malfunction")
if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas))
if (src.z == ZLEVEL_STATION) //if (is_type_in_list(get_area(src), the_station_areas))
ticker.mode:apcs--
area.power_light = 0
area.power_equip = 0
@@ -849,7 +849,7 @@
malfai.malfhacking = 0
locked = 1
if (ticker.mode.config_tag == "malfunction")
if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas))
if (src.z == ZLEVEL_STATION) //if (is_type_in_list(get_area(src), the_station_areas))
ticker.mode:apcs++
if(usr:parent)
src.malfai = usr:parent
@@ -940,7 +940,7 @@
/obj/machinery/power/apc/proc/ion_act()
//intended to be exactly the same as an AI malf attack
if(!src.malfhack && src.z == 1)
if(!src.malfhack && src.z == ZLEVEL_STATION)
if(prob(3))
src.locked = 1
if (src.cell.charge > 0)
@@ -1193,7 +1193,7 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on)
/obj/machinery/power/apc/proc/set_broken()
if(malfai && operating)
if (ticker.mode.config_tag == "malfunction")
if (src.z == 1) //if (is_type_in_list(get_area(src), the_station_areas))
if (src.z == ZLEVEL_STATION) //if (is_type_in_list(get_area(src), the_station_areas))
ticker.mode:apcs--
stat |= BROKEN
operating = 0
+43 -26
View File
@@ -84,7 +84,7 @@
inturf = get_step(src, dir)
spawn(5)
turbine = locate() in get_step(src, get_dir(inturf, src))
locate_machinery()
if(!turbine)
stat |= BROKEN
@@ -98,6 +98,13 @@
// /obj/machinery/power/compressor/CanPass(atom/movable/mover, turf/target, height=0)
// return !density
/obj/machinery/power/compressor/locate_machinery()
if(turbine)
return
turbine = locate() in get_step(src, get_dir(inturf, src))
if(turbine)
turbine.locate_machinery()
/obj/machinery/power/compressor/RefreshParts()
var/E = 0
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
@@ -111,7 +118,7 @@
if(default_change_direction_wrench(user, I))
turbine = null
inturf = get_step(src, dir)
turbine = locate() in get_step(src, get_dir(inturf, src))
locate_machinery()
if(turbine)
user << "<span class='notice'>Turbine connected.</span>"
stat &= ~BROKEN
@@ -129,14 +136,14 @@
return !density
/obj/machinery/power/compressor/process()
if(!turbine)
stat = BROKEN
if(stat & BROKEN || panel_open)
return
if(!starter)
return
overlays.Cut()
if(stat & BROKEN)
return
if(!turbine)
stat |= BROKEN
return
rpm = 0.9* rpm + 0.1 * rpmtarget
var/datum/gas_mixture/environment = inturf.return_air()
@@ -199,7 +206,7 @@
// compressor is found in the opposite direction
compressor = locate() in get_step(src, get_dir(outturf, src))
locate_machinery()
if(!compressor)
stat |= BROKEN
@@ -218,15 +225,22 @@
P += C.rating
productivity = P / 6
/obj/machinery/power/turbine/locate_machinery()
if(compressor)
return
compressor = locate() in get_step(src, get_dir(outturf, src))
if(compressor)
compressor.locate_machinery()
/obj/machinery/power/turbine/CanAtmosPass(var/turf/T)
return !density
/obj/machinery/power/turbine/process()
if(stat & BROKEN)
return
if(!compressor)
stat |= BROKEN
stat = BROKEN
if((stat & BROKEN) || panel_open)
return
if(!compressor.starter)
return
@@ -274,7 +288,7 @@
if(default_change_direction_wrench(user, I))
compressor = null
outturf = get_step(src, dir)
compressor = locate() in get_step(src, get_dir(outturf, src))
locate_machinery()
if(compressor)
user << "<span class='notice'>Compressor connected.</span>"
stat &= ~BROKEN
@@ -341,9 +355,9 @@
/obj/machinery/computer/turbine_computer/New()
..()
spawn(5)
search_turbine()
locate_machinery()
/obj/machinery/computer/turbine_computer/proc/search_turbine()
/obj/machinery/computer/turbine_computer/locate_machinery()
compressor = locate(/obj/machinery/power/compressor) in range(5)
/obj/machinery/computer/turbine_computer/attack_hand(var/mob/user as mob)
@@ -356,17 +370,20 @@
var/dat
if(compressor && compressor.turbine)
dat += {"<BR><B>Gas turbine remote control system</B><HR>
\nTurbine status: [ src.compressor.starter ? "<A href='?src=\ref[src];str=1'>Off</A> <B>On</B>" : "<B>Off</B> <A href='?src=\ref[src];str=1'>On</A>"]
\n<BR>
\nTurbine speed: [src.compressor.rpm]rpm<BR>
\nPower currently being generated: [src.compressor.turbine.lastgen]W<BR>
\nInternal gas temperature: [src.compressor.gas_contained.temperature]K<BR>
\n</PRE><HR><A href='?src=\ref[src];close=1'>Close</A>
\n<BR>
\n"}
dat += "<BR><B>Gas turbine remote control system</B><HR>"
if(compressor.stat || compressor.turbine.stat)
dat += "[compressor.stat ? "<B>Compressor is inoperable</B><BR>" : "<B>Turbine is inoperable</B>"]"
else
dat += {"Turbine status: [ src.compressor.starter ? "<A href='?src=\ref[src];str=1'>Off</A> <B>On</B>" : "<B>Off</B> <A href='?src=\ref[src];str=1'>On</A>"]
\n<BR>
\nTurbine speed: [src.compressor.rpm]rpm<BR>
\nPower currently being generated: [src.compressor.turbine.lastgen]W<BR>
\nInternal gas temperature: [src.compressor.gas_contained.temperature]K<BR>
\n</PRE><HR><A href='?src=\ref[src];close=1'>Close</A>
\n<BR>
\n"}
else
dat += "<B>There is [!compressor ? "no compressor" : " compressor[!compressor.turbine ? " and no turbine" : ""]"].</B><BR>"
dat += "<B>There is [!compressor ? "no compressor" : " compressor[!compressor.turbine ? " but no turbine" : ""]"].</B><BR>"
if(!compressor)
dat += "<A href='?src=\ref[src];search=1'>Search for compressor</A>"
@@ -380,14 +397,14 @@
return
else if( href_list["str"] )
if(compressor)
if(compressor && compressor.turbine)
compressor.starter = !compressor.starter
else if( href_list["close"] )
usr << browse(null, "window=turbinecomputer")
usr.unset_machine(src)
return
else if(href_list["search"])
search_turbine()
locate_machinery()
src.updateUsrDialog()
return
+19 -1
View File
@@ -38,6 +38,24 @@
select_name = "DESTROY"
fire_sound = 'sound/weapons/pulse.ogg'
/obj/item/ammo_casing/energy/laser/pulse/carbine
e_cost = 1000
/obj/item/ammo_casing/energy/laser/carbine
e_cost = 1000
/obj/item/ammo_casing/energy/electrode/carbine
e_cost = 1000
/obj/item/ammo_casing/energy/laser/pulse/pistol
e_cost = 2000
/obj/item/ammo_casing/energy/laser/pistol
e_cost = 1000
/obj/item/ammo_casing/energy/electrode/pistol
e_cost = 1000
/obj/item/ammo_casing/energy/laser/bluetag
projectile_type = /obj/item/projectile/lasertag/bluetag
select_name = "bluetag"
@@ -134,4 +152,4 @@
/obj/item/ammo_casing/energy/bolt/large
projectile_type = /obj/item/projectile/energy/bolt/large
select_name = "heavy bolt"
select_name = "heavy bolt"
+48 -8
View File
@@ -30,25 +30,43 @@
var/sawn_state = SAWN_INTACT
var/burst_size = 1
var/fire_delay = 0
var/obj/item/device/firing_pin/pin = /obj/item/device/firing_pin //standard firing pin for most guns
var/obj/item/device/flashlight/F = null
var/can_flashlight = 0
/obj/item/weapon/gun/New()
..()
if(pin)
pin = new pin(src)
/obj/item/weapon/gun/examine(mob/user)
..()
if(pin)
user << "It has a [pin] installed."
else
user << "It doesn't have a firing pin installed, and won't fire."
/obj/item/weapon/gun/proc/process_chamber()
return 0
/obj/item/weapon/gun/proc/special_check(var/mob/M) //Placeholder for any special checks, like detective's revolver.
return 1
//check if there's enough ammo/energy/whatever to shoot one time
//i.e if clicking would make it shoot
/obj/item/weapon/gun/proc/can_shoot()
return 1
/obj/item/weapon/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj)
user << "<span class='danger'>*click*</span>"
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
return
/obj/item/weapon/gun/proc/shoot_live_shot(mob/living/user as mob|obj, var/pointblank = 0, var/mob/pbtarget = null, var/message = 1)
if(recoil)
spawn()
@@ -65,10 +83,12 @@
else
user.visible_message("<span class='danger'>[user] fires [src]!</span>", "<span class='danger'>You fire [src]!</span>", "You hear a [istype(src, /obj/item/weapon/gun/energy) ? "laser blast" : "gunshot"]!")
/obj/item/weapon/gun/emp_act(severity)
for(var/obj/O in contents)
O.emp_act(severity)
/obj/item/weapon/gun/afterattack(atom/target as mob|obj|turf, mob/living/carbon/human/user as mob|obj, flag, params)//TODO: go over this
if(flag) //It's adjacent, is the user, or is on the user's person
if(istype(target, /mob/) && target != user && !(target in user.contents)) //We make sure that it is a mob, it's not us or part of us.
@@ -94,11 +114,13 @@
process_fire(target,user,1,params)
/obj/item/weapon/gun/proc/can_trigger_gun(mob/living/carbon/user)
if (!user.IsAdvancedToolUser())
user << "<span class='notice'>You don't have the dexterity to do this!</span>"
return 0
if(trigger_guard)
if(istype(user) && user.dna)
if(user.dna.check_mutation(HULK))
@@ -109,12 +131,24 @@
return 0
return 1
/obj/item/weapon/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, var/message = 1, params)
/obj/item/weapon/gun/proc/handle_pins(mob/living/user)
if(pin)
if(pin.pin_auth(user) || pin.emagged)
return 1
else
user << "<span class='warning'>INVALID USER.</span>"
return 0
else
user << "<span class='notice'>\The [src]'s trigger is locked. This weapon doesn't have a firing pin installed!</span>"
return 0
/obj/item/weapon/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, var/message = 1, params)
add_fingerprint(user)
if(!special_check(user))
return
if(!handle_pins(user))
return 0
for(var/i = 1 to burst_size)
if(!issilicon(user))
@@ -125,8 +159,6 @@
shoot_with_empty_chamber(user)
break
else
if(!special_check(user))
return
if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot
shoot_live_shot(user, 1, target, message)
else
@@ -143,6 +175,7 @@
else
user.update_inv_r_hand(0)
/obj/item/weapon/gun/attack(mob/M as mob, mob/user)
if(user.a_intent == "harm") //Flogging
..()
@@ -165,6 +198,8 @@
A.loc = src
update_icon()
update_gunlight(user)
verbs += /obj/item/weapon/gun/proc/toggle_gunlight
if(istype(A, /obj/item/weapon/screwdriver))
if(F)
if(user.l_hand != src && user.r_hand != src)
@@ -177,13 +212,18 @@
update_gunlight(user)
S.update_brightness(user)
update_icon()
verbs -= /obj/item/weapon/gun/proc/toggle_gunlight
..()
return
/obj/item/weapon/gun/verb/toggle_gunlight()
/obj/item/weapon/gun/proc/toggle_gunlight()
set name = "Toggle Gunlight"
set category = "Object"
set desc = "Click to toggle your weapon's attached flashlight."
if(!F)
return
var/mob/living/carbon/human/user = usr
if(!isturf(user.loc))
user << "You cannot turn the light on while in this [user.loc]."
+4 -21
View File
@@ -84,7 +84,7 @@ obj/item/weapon/gun/energy/laser/retro
slot_flags = SLOT_BACK
origin_tech = "combat=4;materials=3;powerstorage=3"
ammo_type = list(/obj/item/ammo_casing/energy/laser/heavy)
pin = null
/obj/item/weapon/gun/energy/xray
name = "xray laser gun"
@@ -93,7 +93,7 @@ obj/item/weapon/gun/energy/laser/retro
item_state = "laser"
origin_tech = "combat=5;materials=3;magnets=2;syndicate=2"
ammo_type = list(/obj/item/ammo_casing/energy/xray)
pin = null
////////Laser Tag////////////////////
@@ -105,24 +105,16 @@ obj/item/weapon/gun/energy/laser/retro
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
var/charge_tick = 0
/obj/item/weapon/gun/energy/laser/bluetag/special_check(var/mob/living/carbon/human/M)
if(ishuman(M))
if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag))
return 1
M << "<span class='danger'>You need to be wearing your laser tag vest!</span>"
return 0
pin = /obj/item/device/firing_pin/tag/blue
/obj/item/weapon/gun/energy/laser/bluetag/New()
..()
SSobj.processing.Add(src)
/obj/item/weapon/gun/energy/laser/bluetag/Destroy()
SSobj.processing.Remove(src)
..()
/obj/item/weapon/gun/energy/laser/bluetag/process()
charge_tick++
if(charge_tick < 4)
@@ -135,7 +127,6 @@ obj/item/weapon/gun/energy/laser/retro
return 1
/obj/item/weapon/gun/energy/laser/redtag
name = "laser tag gun"
icon_state = "redtag"
@@ -144,24 +135,16 @@ obj/item/weapon/gun/energy/laser/retro
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
var/charge_tick = 0
/obj/item/weapon/gun/energy/laser/redtag/special_check(var/mob/living/carbon/human/M)
if(ishuman(M))
if(istype(M.wear_suit, /obj/item/clothing/suit/redtag))
return 1
M << "<span class='danger'>You need to be wearing your laser tag vest!</span>"
return 0
pin = /obj/item/device/firing_pin/tag/red
/obj/item/weapon/gun/energy/laser/redtag/New()
..()
SSobj.processing.Add(src)
/obj/item/weapon/gun/energy/laser/redtag/Destroy()
SSobj.processing.Remove(src)
..()
/obj/item/weapon/gun/energy/laser/redtag/process()
charge_tick++
if(charge_tick < 4)
@@ -22,6 +22,7 @@
modifystate = 0
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
can_flashlight = 0
pin = null
/obj/item/weapon/gun/energy/gun/nuclear/New()
..()
@@ -110,4 +111,4 @@
/obj/item/weapon/gun/energy/gun/turret
name = "hybrid turret gun"
desc = "A basic hybrid energy gun with two settings: Stun and kill."
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
@@ -14,6 +14,22 @@
/obj/item/weapon/gun/energy/pulse_rifle/attack_self(mob/living/user as mob)
select_fire(user)
/obj/item/weapon/gun/energy/pulse_rifle/pulse_carbine
name = "pulse carbine"
desc = "A ligther weight varient of the pulse rifle, a multifaceted energy carbine with three modes."
w_class = 3.0
icon_state = "pulse_carbine"
item_state = "pulse"
ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse/carbine, /obj/item/ammo_casing/energy/electrode/carbine, /obj/item/ammo_casing/energy/laser/carbine)
/obj/item/weapon/gun/energy/pulse_rifle/pulse_pistol
name = "pulse pistol"
desc = "A ligther weight varient of the pulse rifle, a multifaceted energy pistol with three modes."
w_class = 2.0
icon_state = "pulse_pistol"
item_state = "pulse"
ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse/pistol, /obj/item/ammo_casing/energy/electrode/pistol, /obj/item/ammo_casing/energy/laser/pistol)
/obj/item/weapon/gun/energy/pulse_rifle/destroyer
name = "pulse destroyer"
desc = "A heavy-duty energy rifle built for pure destruction."
@@ -8,6 +8,7 @@
flags = CONDUCT
slot_flags = SLOT_BACK
ammo_type = list(/obj/item/ammo_casing/energy/ion)
pin = null
/obj/item/weapon/gun/energy/ionrifle/emp_act(severity)
@@ -19,6 +20,7 @@
icon_state = "decloner"
origin_tech = "combat=5;materials=4;powerstorage=3"
ammo_type = list(/obj/item/ammo_casing/energy/declone)
pin = null
/obj/item/weapon/gun/energy/floragun
name = "floral somatoray"
@@ -13,6 +13,7 @@
origin_tech = "combat=3;materials=3;powerstorage=2"
ammo_type = list(/obj/item/ammo_casing/energy/electrode/gun)
can_flashlight = 0
pin = null
/obj/item/weapon/gun/energy/gun/advtaser
name = "hybrid taser"
@@ -5,6 +5,7 @@
origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2"
ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot)
cell_type = "/obj/item/weapon/stock_parts/cell/high"
pin = null
/obj/item/weapon/gun/energy/temperature/attack_self(mob/living/user as mob)
@@ -80,6 +80,7 @@
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
fire_delay = 2
burst_size = 2
pin = /obj/item/device/firing_pin/implant/pindicate
/obj/item/weapon/gun/projectile/automatic/c20r/New()
..()
@@ -112,6 +113,7 @@
can_suppress = 0
burst_size = 5
fire_delay = 3
pin = /obj/item/device/firing_pin/implant/pindicate
/obj/item/weapon/gun/projectile/automatic/l6_saw/attack_self(mob/user as mob)
cover_open = !cover_open
@@ -165,6 +167,7 @@
var/obj/item/weapon/gun/projectile/revolver/grenadelauncher/underbarrel
burst_size = 3
fire_delay = 2
pin = /obj/item/device/firing_pin/implant/pindicate
/obj/item/weapon/gun/projectile/automatic/m90/New()
..()
@@ -231,4 +234,4 @@
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
can_suppress = 0
burst_size = 4
fire_delay = 1
fire_delay = 1
@@ -34,7 +34,6 @@
mag_type = /obj/item/ammo_box/magazine/m75
burst_size = 1
fire_delay = 0
can_suppress = 0
action_button_name = null
/obj/item/weapon/gun/projectile/automatic/gyropistol/process_chamber(var/eject_casing = 0, var/empty_chamber = 1)
@@ -58,17 +58,17 @@
origin_tech = "combat=2;materials=2"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38
/obj/item/weapon/gun/projectile/revolver/detective/special_check(var/mob/living/carbon/human/M)
if(magazine.caliber == initial(magazine.caliber))
return 1
if(prob(70 - (magazine.ammo_count() * 10))) //minimum probability of 10, maximum of 60
playsound(M, fire_sound, 50, 1)
M << "<span class='danger'>[src] blows up in your face!</span>"
M.take_organ_damage(0,20)
M.drop_item()
qdel(src)
return 0
return 1
/obj/item/weapon/gun/projectile/revolver/detective/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, var/message = 1, params)
if(magazine.caliber != initial(magazine.caliber))
if(prob(70 - (magazine.ammo_count() * 10))) //minimum probability of 10, maximum of 60
playsound(user, fire_sound, 50, 1)
user << "<span class='danger'>[src] blows up in your face!</span>"
user.take_organ_damage(0,20)
user.drop_item()
qdel(src)
return 0
..()
/obj/item/weapon/gun/projectile/revolver/detective/verb/rename_gun()
set name = "Name Gun"
@@ -206,6 +206,7 @@
can_suppress = 0
burst_size = 1
fire_delay = 0
pin = /obj/item/device/firing_pin/implant/pindicate
action_button_name = null
/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/New()
@@ -228,4 +229,4 @@
/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/afterattack()
..()
empty_alarm()
return
return
+86
View File
@@ -0,0 +1,86 @@
/obj/item/device/firing_pin
name = "electronic firing pin"
desc = "A small authentication device, to be inserted into a firearm reciever to allow operation. NT safety regulations require all new designs to incorporate one."
icon = 'icons/obj/device.dmi'
icon_state = "firing_pin"
item_state = "pen"
flags = CONDUCT
w_class = 1
attack_verb = list("poked")
var/emagged = 0
/obj/item/device/firing_pin/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag)
if(istype(target, /obj/item/weapon/gun))
var/obj/item/weapon/gun/G = target
if(!G.pin)
user.drop_item()
G.pin = src
loc = G
else
user << "<span class ='notice'>This firearm already has a firing pin installed.</span>"
/obj/item/device/firing_pin/emag_act(mob/user)
if(!emagged)
emagged = 1
user << "<span class='notice'>You override the authentication mechanism.</span>"
/obj/item/device/firing_pin/proc/pin_auth(mob/living/user)
return 1
/obj/item/device/firing_pin/test_range
name = "test-range firing pin"
desc = "This safety firing pin allows weapons to be fired within proximity to a firing range."
/obj/item/device/firing_pin/test_range/pin_auth(mob/living/user)
for(var/obj/machinery/magnetic_controller/M in range(user, 3))
return 1
return 0
/obj/item/device/firing_pin/implant
name = "implant-keyed firing pin"
desc = "This is a security firing pin which only authorizes users who are implanted with a certain device."
var/obj/item/weapon/implant/req_implant = null
/obj/item/device/firing_pin/implant/pin_auth(mob/living/user)
for(req_implant in user)
if(req_implant && req_implant.imp_in == user)
return 1
return 0
/obj/item/device/firing_pin/implant/loyalty
name = "loyalty firing pin"
desc = "This is a security firing pin which only authorizes users who are loyalty-implanted."
icon_state = "firing_pin_loyalty"
req_implant = /obj/item/weapon/implant/loyalty
/obj/item/device/firing_pin/implant/pindicate
name = "syndicate firing pin"
icon_state = "firing_pin_pindi"
req_implant = /obj/item/weapon/implant/weapons_auth
//muh laser tag
/obj/item/device/firing_pin/tag
name = "laser tag firing pin"
desc = "A recreational firing pin, used in laser tag units to ensure users have their vests on."
var/obj/item/clothing/suit/suit_requirement = null
/obj/item/device/firing_pin/tag/pin_auth(mob/living/user)
if(ishuman(user))
var/mob/living/carbon/human/M = user
if(istype(M.wear_suit, suit_requirement))
return 1
user << "<span class='warning'>You need to be wearing [suit_requirement.name]!</span>"
return 0
/obj/item/device/firing_pin/tag/red
name = "red laser tag firing pin"
icon_state = "firing_pin_red"
suit_requirement = /obj/item/clothing/suit/redtag
/obj/item/device/firing_pin/tag/blue
name = "blue laser tag firing pin"
icon_state = "firing_pin_blue"
suit_requirement = /obj/item/clothing/suit/bluetag
@@ -0,0 +1,100 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
datum/reagent/nicotine
name = "Nicotine"
id = "nicotine"
description = "Stun reduction per cycle, slight stamina regeneration buff. Overdoses become rapidly deadly."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
var/smoke_message = pick("You can just feel your lungs dying!", "You feel relaxed.", "You feel calmed.", "You feel the lung cancer forming.", "You feel the money you wasted.", "You feel like a space cowboy.", "You feel rugged.")
if(prob(5))
M << "<span class='notice'>[smoke_message]</span>"
M.AdjustStunned(-1)
M.adjustStaminaLoss(-1*REM)
if(volume > 35)
M << "You feel like you smoked too much."
M.adjustToxLoss(2*REM)
M.adjustOxyLoss(2*REM)
..()
return
datum/reagent/crank
name = "Crank"
id = "crank"
description = "2x stun reduction per cycle. Warms you up, makes you jittery as hell."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
datum/reagent/crank/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.")
if(prob(5))
M << "<span class='notice'>[high_message]</span>"
M.AdjustParalysis(-2)
M.AdjustStunned(-2)
M.AdjustWeakened(-2)
if(volume > 20)
M.adjustBrainLoss(rand(1,10)*REM)
M.adjustToxLoss(rand(1,10)*REM)
M.adjustBruteLoss(rand(1,10)*REM)
..()
return
/datum/chemical_reaction/crank
name = "Crank"
id = "crank"
result = "crank"
required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "fuel" = 1)
result_amount = 5
mix_message = "The mixture violently reacts, leaving behind a few crystalline shards."
required_temp = 390
/datum/reagent/krokodil
name = "Krokodil"
id = "krokodil"
description = "Cools and calms you down, occasional BRAIN and TOX damage."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
var/cycle_count = 0
var/overdosed
/datum/reagent/krokodil/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.")
if(prob(5))
M << "<span class='notice'>[high_message]</span>"
if(prob(10))
M.adjustBrainLoss(rand(1,5)*REM)
M.adjustToxLoss(rand(1,5)*REM)
if(cycle_count == 10)
M.adjustBrainLoss(rand(1,10)*REM)
M.adjustToxLoss(rand(1,10)*REM)
if(cycle_count == 20)
M << "<span class='danger'>Your skin feels loose...</span>"
if(cycle_count == 50)
M << "<span class='userdanger'>Your skin falls off!</span>"
M.adjustBruteLoss(rand(10,30)*REM)
hardset_dna(M, null, null, null, null, /datum/species/skeleton)
if(volume > 20)
overdosed = 1
if(overdosed)
cycle_count++
..()
return
/datum/chemical_reaction/krokodil
name = "Krokodil"
id = "krokodil"
result = "krokodil"
required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorous" = 1, "fuel" = 1)
result_amount = 6
mix_message = "The mixture dries into a pale blue powder."
required_temp = 380
@@ -0,0 +1,381 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
datum/reagent/silver_sulfadiazine
name = "Silver Sulfadiazine"
id = "silver_sulfadiazine"
description = "100% chance per cycle of healing 2 points of BURN damage."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 2
datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
M.adjustFireLoss((volume-(volume*2))*REM)
M << "<span class='notice'>You feel your burns healing!</span>"
M.emote("scream")
if(method == INGEST)
M.adjustToxLoss(0.5*volume)
M << "<span class='notice'>You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?</span>"
..()
return
datum/reagent/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(55))
M.adjustFireLoss(-2*REM)
..()
return
datum/reagent/styptic_powder
name = "Styptic Powder"
id = "styptic_powder"
description = "100% chance per cycle of healing 2 points of BRUTE damage."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 2
datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
M.heal_organ_damage(volume*REM,0)
M << "<span class='notice'>You feel your wounds knitting back together!</span>"
M.emote("scream")
if(method == INGEST)
M.adjustToxLoss(0.5*volume)
M << "<span class='notice'>You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?</span>"
..()
return
datum/reagent/styptic_powder/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(55))
M.adjustBruteLoss(-2*REM)
..()
return
datum/reagent/salglu_solution
name = "Saline-Glucose Solution"
id = "salglu_solution"
description = "100% chance per cycle of healing 1 point each of OXY and TOX damage."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob)
if(M.stat == DEAD)
return
if(!M) M = holder.my_atom
if(M.getOxyLoss()) M.adjustOxyLoss(-1*REM)
if(M.getToxLoss()) M.adjustToxLoss(-1*REM)
..()
return
datum/reagent/synthflesh
name = "Synthflesh"
id = "synthflesh"
description = "100% chance per cycle of healing 1 point each of BRUTE and BURN damage."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!M) M = holder.my_atom
if(method == TOUCH)
M.heal_organ_damage(volume*REM,0)
M.adjustFireLoss((volume-(volume*2)*REM))
M << "<span class='notice'>You feel your burns healing and your flesh knitting together!</span>"
..()
return
datum/reagent/charcoal
name = "Charcoal"
id = "charcoal"
description = "Heals 2 TOX damage per cycle."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(-1.5*REM)
for(var/datum/reagent/R in M.reagents)
if(M != src)
M.reagents.remove_reagent(R.id,0.5)
..()
return
/datum/chemical_reaction/charcoal
name = "Charcoal"
id = "charcoal"
result = "charcoal"
required_reagents = list("ash" = 1, "sodiumchloride" = 1)
result_amount = 2
mix_message = "The mixture yields a fine black powder."
required_temp = 380
/datum/chemical_reaction/silver_sulfadiazine
name = "Silver Sulfadiazine"
id = "silver_sulfadiazine"
result = "silver_sulfadiazine"
required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1)
result_amount = 5
/datum/chemical_reaction/salglu_solution
name = "Saline-Glucose Solution"
id = "salglu_solution"
result = "salglu_solution"
required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1)
result_amount = 3
/datum/chemical_reaction/synthflesh
name = "Synthflesh"
id = "synthflesh"
result = "synthflesh"
required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1)
result_amount = 3
/datum/chemical_reaction/styptic_powder
name = "Styptic Powder"
id = "styptic_powder"
result = "styptic_powder"
required_reagents = list("aluminium" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1)
result_amount = 4
mix_message = "The solution yields an astringent powder."
datum/reagent/omnizine
name = "Omnizine"
id = "omnizine"
description = "Heals one each of OXY, TOX, BRUTE and BURN per cycle."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 0.2
datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(-1*REM)
M.adjustOxyLoss(-1*REM)
M.adjustBruteLoss(-1*REM)
M.adjustFireLoss(-1*REM)
..()
return
datum/reagent/calomel
name = "Calomel"
id = "calomel"
description = "Increases all depletion rates by 5. +5 TOX damage while health > 20."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/calomel/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
for(var/datum/reagent/R in M.reagents)
if(M != src)
M.reagents.remove_reagent(R.id,5)
if(M.health > 20)
M.adjustToxLoss(5*REM)
..()
return
/datum/chemical_reaction/calomel
name = "Calomel"
id = "calomel"
result = "calomel"
required_reagents = list("mercury" = 1, "chlorine" = 1)
result_amount = 2
required_temp = 374
datum/reagent/potass_iodide
name = "Potassium Iodide"
id = "potass_iodide"
description = "80% chance of removing 1 RAD. Radiation is cumulative and causes tox+burn."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/potass_iodide/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(M.radiation > 0)
if(prob(80))
M.radiation--
if(M.radiation < 0)
M.radiation = 0
..()
return
/datum/chemical_reaction/potass_iodide
name = "Potassium Iodide"
id = "potass_iodide"
result = "potass_iodide"
required_reagents = list("potassium" = 1, "iodine" = 1)
result_amount = 2
datum/reagent/pen_acid
name = "Pentetic Acid"
id = "pen_acid"
description = "Reduces 7 RAD, heals 4 TOX damage, increases all depletion rates by 4. 33% chance of taking 1 unit brute damage"
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/pen_acid/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(M.radiation > 0)
M.radiation -= 7
M.adjustToxLoss(-4*REM)
if(prob(33))
M.adjustBruteLoss(1*REM)
if(M.radiation < 0)
M.radiation = 0
for(var/datum/reagent/R in M.reagents)
if(M != src)
M.reagents.remove_reagent(R.id,4)
..()
return
/datum/chemical_reaction/pen_acid
name = "Pentetic Acid"
id = "pen_acid"
result = "pen_acid"
required_reagents = list("fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1)
result_amount = 6
datum/reagent/sal_acid
name = "Salicyclic Acid"
id = "sal_acid"
description = "If BRUTE damage is under 50, 50% chance to heal one unit."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(M.getBruteLoss() < 50)
if(prob(50))
M.adjustBruteLoss(-1*REM)
..()
return
/datum/chemical_reaction/sal_acid
name = "Salicyclic Acid"
id = "sal_acid"
result = "sal_acid"
required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1)
result_amount = 5
datum/reagent/salbutamol
name = "Salbutamol"
id = "salbutamol"
description = "Heals 6 OXY damage, reduces LOSEBREATH by 4."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 0.2
datum/reagent/salbutamol/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustOxyLoss(-6*REM)
if(M.losebreath >= 4)
M.losebreath -= 4
..()
return
/datum/chemical_reaction/salbutamol
name = "Salbutamol"
id = "salbutamol"
result = "salbutamol"
required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminium" = 1, "bromine" = 1, "ammonia" = 1)
result_amount = 5
datum/reagent/perfluorodecalin
name = "Perfluorodecalin"
id = "perfluorodecalin"
description = "Heals 25 OXY damage, but you can't talk. 33% chance of healing 1 BRUTE and 1 BURN."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 0.2
datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob)
if(!M) M = holder.my_atom
M.adjustOxyLoss(-25*REM)
M.silent = max(M.silent, 5)
if(prob(33))
M.adjustBruteLoss(-1*REM)
M.adjustFireLoss(-1*REM)
..()
return
/datum/chemical_reaction/perfluorodecalin
name = "Perfluorodecalin"
id = "perfluorodecalin"
result = "perfluorodecalin"
required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1)
result_amount = 3
required_temp = 370
mix_message = "The mixture rapidly turns into a dense pink liquid."
datum/reagent/ephedrine
name = "Ephedrine"
id = "ephedrine"
description = "Stun reduction per cycle, increases run speed slightly, minor stamina regeneration buff, stabilizes crit."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 0.3
datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.status_flags |= GOTTAGOFAST
if(M.losebreath >= 10)
M.losebreath = max(10, M.losebreath-5)
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
M.adjustStaminaLoss(-1*REM)
..()
return
/datum/chemical_reaction/ephedrine
name = "Ephedrine"
id = "ephedrine"
result = "ephedrine"
required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1)
result_amount = 4
mix_message = "The solution fizzes and gives off toxic fumes."
datum/reagent/diphenhydramine
name = "Diphenhydramine"
id = "diphenhydramine"
description = "Causes a little bit of drowsiness, reduces jitteriness. Raises histamine depletion rates by 3"
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/diphenhydramine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.drowsyness += 1
M.jitteriness -= 1
M.reagents.remove_reagent("histamine",3)
..()
return
/datum/chemical_reaction/diphenhydramine
name = "Diphenhydramine"
id = "diphenhydramine"
result = "diphenhydramine"
required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1)
result_amount = 4
mix_message = "The mixture dries into a pale blue powder."
datum/reagent/morphine
name = "Morphine"
id = "morphine"
description = "Dramatically counters movement reduction from severe injury. Reduces jitteriness if someone is shaking like crazy from whatever. Will knock you out within 36 cycles if any remains in you."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
var/cycle_count = 0
datum/reagent/morphine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.status_flags |= GOTTAGOFAST
if(cycle_count == 36)
M.sleeping += 1
if(volume > 20)
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
cycle_count++
..()
return
@@ -0,0 +1,104 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
datum/reagent/oil
name = "Oil"
id = "oil"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/stable_plasma
name = "Stable Plasma"
id = "stable_plasma"
description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/iodine
name = "Iodine"
id = "iodine"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/fluorine
name = "Fluorine"
id = "fluorine"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/carpet
name = "Carpet"
id = "carpet"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/bromine
name = "Bromine"
id = "bromine"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/phenol
name = "Phenol"
id = "phenol"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/ash
name = "Ash"
id = "ash"
description = "A burnt solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/acetone
name = "Acetone"
id = "acetone"
description = "A solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
/datum/chemical_reaction/acetone
name = "acetone"
id = "acetone"
result = "acetone"
required_reagents = list("oil" = 1, "fuel" = 1, "oxygen" = 1)
result_amount = 3
/datum/chemical_reaction/carpet
name = "carpet"
id = "carpet"
result = "carpet"
required_reagents = list("space_drugs" = 1, "blood" = 1)
result_amount = 2
/datum/chemical_reaction/oil
name = "Oil"
id = "oil"
result = "oil"
required_reagents = list("fuel" = 1, "carbon" = 1, "hydrogen" = 1)
result_amount = 3
/datum/chemical_reaction/phenol
name = "phenol"
id = "phenol"
result = "phenol"
required_reagents = list("water" = 1, "chlorine" = 1, "oil" = 1)
result_amount = 3
/datum/chemical_reaction/ash
name = "Ash"
id = "ash"
result = "ash"
required_reagents = list("oil" = 1)
result_amount = 1
required_temp = 480
@@ -0,0 +1,119 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
/datum/reagent/clf3
name = "Chlorine Trifluoride"
id = "clf3"
description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
/datum/reagent/clf3/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
..()
return
/datum/chemical_reaction/clf3
name = "Chlorine Trifluoride"
id = "clf3"
result = "clf3"
required_reagents = list("chlorine" = 1, "fluorine" = 3)
result_amount = 4
required_temp = 424
/datum/chemical_reaction/clf3/on_reaction(var/datum/reagents/holder, var/created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
for(var/turf/simulated/turf in orange(1,T))
new /obj/effect/hotspot(turf)
return
/datum/reagent/clf3/reaction_turf(var/turf/simulated/T, var/volume)
if(istype(T, /turf/simulated/floor/))
var/turf/simulated/floor/F = T
if(prob(66))
F.make_plating()
if(prob(11))
F.ChangeTurf(/turf/space)
return
/datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return
if(method == TOUCH)
M.adjust_fire_stacks(20)
return
/datum/reagent/sorium
name = "Sorium"
id = "sorium"
description = "Sends everything flying from the detonation point."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
/datum/chemical_reaction/sorium
name = "Sorium"
id = "sorium"
result = "sorium"
required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1)
result_amount = 4
required_temp = 474
/datum/reagent/sorium/reaction_turf(var/turf/simulated/T, var/volume)
if(istype(T, /turf/simulated/floor/))
goonchem_vortex(T, 1, 5, 3)
/datum/reagent/sorium/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return
if(method == TOUCH)
var/turf/simulated/T = get_turf(M)
goonchem_vortex(T, 1, 5, 3)
/datum/chemical_reaction/sorium/on_reaction(var/datum/reagents/holder, var/created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
goonchem_vortex(T, 1, 5, 6)
/datum/reagent/liquid_dark_matter
name = "Liquid Dark Matter"
id = "liquid_dark_matter"
description = "Sucks everything into the detonation point."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
/datum/chemical_reaction/liquid_dark_matter
name = "Liquid Dark Matter"
id = "liquid_dark_matter"
result = "liquid_dark_matter"
required_reagents = list("stable_plasma" = 1, "radium" = 1, "carbon" = 1)
result_amount = 3
required_temp = 474
/datum/reagent/liquid_dark_matter/reaction_turf(var/turf/simulated/T, var/volume)
if(istype(T, /turf/simulated/floor/))
goonchem_vortex(T, 0, 5, 3)
return
/datum/reagent/liquid_dark_matter/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return
if(method == TOUCH)
var/turf/simulated/T = get_turf(M)
goonchem_vortex(T, 0, 5, 3)
return
/datum/chemical_reaction/liquid_dark_matter/on_reaction(var/datum/reagents/holder, var/created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
goonchem_vortex(T, 0, 5, 6)
return
proc/goonchem_vortex(var/turf/simulated/T, var/setting_type, var/range, var/pull_times)
for(var/atom/movable/X in orange(range, T))
if(istype(X, /atom/movable))
if((X))
if(setting_type)
for(var/i = 0, i < pull_times, i++)
step_towards(X,T)
else
X.throw_at(T)
@@ -0,0 +1,34 @@
/*
Credit goes to Cogwerks, and all the other goonstation coders
for the original idea and implementation of this over at goonstation.
THE REQUESTED DON'T PORT LIST: IF YOU PORT THESE THE GOONS WILL MURDER US IN OUR SLEEP SO PLEASE DON'T KTHX - Iamgoofball
Any of the Secret Chems
Goon in-joke chems (Eg. Cat Drugs, Hairgrownium)
Liquid Electricity
Rajajajah
/datum/reagent/blankgoonchembase
name = "blank goonchem base"
id = "blankgoonchembase"
description = "A blank chem"
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
/datum/reagent/blankgoonchembase/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
..()
return
/datum/chemical_reaction/blankgoonchembase
name = "blank goonchem base"
id = "blankgoonchembase"
result = "blankgoonchembase"
required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1)
result_amount = 3
mix_message = "The mixture dries into a pale blue powder."
required_temp = 420
*/
@@ -0,0 +1,159 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
datum/reagent/polonium
name = "Polonium"
id = "polonium"
description = "+8 RAD."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
metabolization_rate = 0.1
datum/reagent/polonium/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.radiation += 8
..()
return
datum/reagent/histamine
name = "Histamine"
id = "histamine"
description = "Dose-dependent, ranges from annoying to incredibly lethal."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
metabolization_rate = 0.2
datum/reagent/histamine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(volume >= 20)
M.adjustOxyLoss(pick(5,10)*REM)
M.adjustBruteLoss(pick(5,10)*REM)
M.adjustToxLoss(pick(5,10)*REM)
if(volume < 20)
switch(pick(1, 2, 3))
if(1)
M << "<span class='danger'>You are unable to look straight!</span>"
M.Dizzy(10)
if(2)
M.emote("cough")
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
if(3)
M.adjustBruteLoss(5*REM)
..()
return
datum/reagent/formaldehyde
name = "Formaldehyde"
id = "formaldehyde"
description = "+1 TOX, 10% chance to decay into 5-15 units of histamine."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
datum/reagent/formaldehyde/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(1*REM)
if(prob(10))
M.reagents.add_reagent("histamine",pick(5,15))
M.reagents.remove_reagent("formaldehyde",1)
..()
return
/datum/chemical_reaction/formaldehyde
name = "formaldehyde"
id = "Formaldehyde"
result = "formaldehyde"
required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1)
result_amount = 3
required_temp = 420
datum/reagent/venom
name = "Venom"
id = "venom"
description = "Scaling TOX and BRUTE damage with dose. 25% chance to decay into 5-10 histamine."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
metabolization_rate = 0.2
datum/reagent/venom/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss((0.1*volume)*REM)
M.adjustBruteLoss((0.1*volume)*REM)
if(prob(25))
M.reagents.add_reagent("histamine",pick(5,10))
M.reagents.remove_reagent("venom",1)
..()
return
datum/reagent/neurotoxin2
name = "Neurotoxin"
id = "neurotoxin2"
description = "+1 TOX, +1 BRAIN up to 60 before it slows down, confusion, knockout after 17 elapsed cycles."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
var/cycle_count = 0
metabolization_rate = 1
datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob)
cycle_count++
if(!M) M = holder.my_atom
if(!(M.brainloss + M.toxloss) >= 60)
M.adjustBrainLoss(1*REM)
M.adjustToxLoss(1*REM)
if(cycle_count == 17)
M.sleeping += 1
..()
return
/datum/chemical_reaction/neurotoxin2
name = "neurotoxin2"
id = "neurotoxin2"
result = "neurotoxin2"
required_reagents = list("space_drugs" = 1)
result_amount = 1
required_temp = 200
datum/reagent/cyanide
name = "Cyanide"
id = "cyanide"
description = "+1.5 TOX, 10% chance of +1 LOSEBREATH, 8% chance of stun and extra +2 TOX."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
metabolization_rate = 0.1
datum/reagent/cyanide/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(1.5*REM)
if(prob(10))
M.adjustOxyLoss(1*REM)
if(prob(8))
M.sleeping += 1
M.adjustToxLoss(4*REM)
..()
return
/datum/chemical_reaction/cyanide
name = "Cyanide"
id = "cyanide"
result = "cyanide"
required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1)
result_amount = 3
required_temp = 380
/datum/reagent/questionmark // food poisoning
name = "Bad Food"
id = "????"
description = "????"
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
metabolization_rate = 0.2
datum/reagent/questionmark/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(1*REM)
..()
return
+6 -3
View File
@@ -10,6 +10,7 @@ datum/reagents
var/total_volume = 0
var/maximum_volume = 100
var/atom/my_atom = null
var/chem_temp = 150
datum/reagents/New(maximum=100)
maximum_volume = maximum
@@ -232,6 +233,7 @@ datum/reagents/proc/handle_reactions()
var/matching_container = 0
var/matching_other = 0
var/list/multipliers = new/list()
var/required_temp = C.required_temp
for(var/B in C.required_reagents)
if(!has_reagent(B, C.required_reagents[B])) break
@@ -259,10 +261,11 @@ datum/reagents/proc/handle_reactions()
if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this
matching_other = 1
if(required_temp == 0)
required_temp = chem_temp
if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other)
if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && chem_temp >= required_temp)
var/multiplier = min(multipliers)
for(var/B in C.required_reagents)
remove_reagent(B, (multiplier * C.required_reagents[B]), safety = 1)
@@ -277,7 +280,7 @@ datum/reagents/proc/handle_reactions()
if(!istype(my_atom, /mob)) // No bubbling mobs
for(var/mob/M in seen)
M << "<span class='notice'>\icon[my_atom] The solution begins to bubble.</span>"
M << "<span class='notice'>\icon[my_atom] [C.mix_message]</span>"
if(istype(my_atom, /obj/item/slime_extract))
var/obj/item/slime_extract/ME2 = my_atom
+85 -5
View File
@@ -11,16 +11,16 @@
icon_state = "dispenser"
use_power = 1
idle_power_usage = 40
var/energy = 50
var/max_energy = 50
var/energy = 100
var/max_energy = 100
var/amount = 30
var/beaker = null
var/recharged = 0
var/recharge_delay = 15 //Time it game ticks between recharges
var/recharge_delay = 5 //Time it game ticks between recharges
var/image/icon_beaker = null //cached overlay
var/list/dispensable_reagents = list("hydrogen","lithium","carbon","nitrogen","oxygen","fluorine",
"sodium","aluminium","silicon","phosphorus","sulfur","chlorine","potassium","iron",
"copper","mercury","radium","water","ethanol","sugar","sacid")
"copper","mercury","radium","water","ethanol","sugar","sacid","fuel","silver","iodine","bromine","fluorine","stable_plasma")
/obj/machinery/chem_dispenser/proc/recharge()
if(stat & (BROKEN|NOPOWER)) return
@@ -108,7 +108,7 @@
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "chem_dispenser.tmpl", "Chem Dispenser 5000", 390, 610)
ui = new(user, src, ui_key, "chem_dispenser.tmpl", "Chem Dispenser 5000", 490, 710)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
@@ -276,6 +276,7 @@
spawn(rand(0, 15))
stat |= NOPOWER
/obj/machinery/chem_master/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
if(default_unfasten_wrench(user, B))
@@ -422,6 +423,23 @@
else
var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc)
reagents.trans_to(P,50)
else if(href_list["createpatch"])
if(reagents.total_volume == 0) return
var/amount = 1
var/vol_each = min(reagents.total_volume, 50)
if(text2num(href_list["many"]))
amount = min(max(round(input(usr, "Amount:", "How many patches?") as num), 1), 10)
vol_each = min(reagents.total_volume/amount, 50)
var/name = reject_bad_text(input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)"))
var/obj/item/weapon/reagent_containers/pill/P
for(var/i = 0; i < amount; i++)
P = new/obj/item/weapon/reagent_containers/pill/patch(src.loc)
if(!name) name = reagents.get_master_reagent_name()
P.name = "[name] patch"
P.pixel_x = rand(-7, 7) //random position
P.pixel_y = rand(-7, 7)
reagents.trans_to(P,vol_each)
src.updateUsrDialog()
return
@@ -479,6 +497,8 @@
if(!condi)
dat += "<HR><BR><A href='?src=\ref[src];createpill=1;many=0'>Create pill (50 units max)</A><BR>"
dat += "<A href='?src=\ref[src];createpill=1;many=1'>Create pills (10 pills max)</A><BR><BR>"
dat += "<HR><BR><A href='?src=\ref[src];createpatch=1;many=0'>Create patch (50 units max)</A><BR>"
dat += "<A href='?src=\ref[src];createpatch=1;many=1'>Create patches (10 patches max)</A><BR><BR>"
dat += "<A href='?src=\ref[src];createbottle=1'>Create bottle (30 units max)</A>"
else
dat += "<HR><BR><A href='?src=\ref[src];createpill=1'>Create pack (10 units max)</A><BR>"
@@ -1238,3 +1258,63 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
O.reagents.trans_to(beaker, amount)
if(!O.reagents.total_volume)
remove_object(O)
/obj/machinery/chem_heater
name = "chemical heater"
density = 1
anchored = 1
icon = 'icons/obj/chemical.dmi'
icon_state = "mixer0b"
use_power = 1
idle_power_usage = 40
var/energy = 50
var/max_energy = 50
var/amount = 30
var/obj/item/weapon/reagent_containers/beaker = null
var/set_temp
var/temperature
var/on = FALSE
/obj/machinery/chem_heater/process()
..()
if(on)
if(beaker)
if(beaker.reagents.chem_temp > temperature)
beaker.reagents.chem_temp -= 2
if(beaker.reagents.chem_temp < temperature)
beaker.reagents.chem_temp += 2
if(beaker.reagents.chem_temp == temperature)
beaker.loc = get_turf(src)
beaker.reagents.handle_reactions()
beaker = null
icon_state = "mixer0b"
on = FALSE
/obj/machinery/chem_heater/attackby(var/obj/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob)
if(isrobot(user))
return
if(!istype(B, /obj/item/weapon/reagent_containers/glass))
return
if(src.beaker)
user << "A beaker is already loaded into the machine."
return
src.beaker = B
user.drop_item()
B.loc = src
user << "You add the beaker to the machine!"
icon_state = "mixer1b"
/obj/machinery/chem_heater/attack_hand(var/mob/user as mob)
if(!beaker)
user << "Please insert a beaker."
return
temperature = input("Please input desired temperature between 1 and 3000.", name, set_temp) as num
if(temperature > 3000 || temperature < 1)
user << "Invalid temperature."
return
user << "Adjusting chemical temperature..."
on = TRUE
@@ -23,6 +23,7 @@ datum/reagent
//var/list/viruses = list()
var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!)
var/metabolization_rate = REAGENTS_METABOLISM
var/overrides_metab = 0
datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //By default we have a chance to transfer some
if(!istype(M, /mob/living))
@@ -226,6 +226,11 @@ datum/reagent/medicine/adminordrazine/on_mob_life(var/mob/living/carbon/M as mob
..()
return
datum/reagent/medicine/adminordrazine/nanites
name = "Nanites"
id = "nanites"
description = "Tiny machines capable of rapid cellular regeneration."
datum/reagent/medicine/synaptizine
name = "Synaptizine"
id = "synaptizine"
@@ -121,19 +121,6 @@ datum/reagent/toxin/slimejelly/on_mob_life(var/mob/living/M as mob)
..()
return
datum/reagent/toxin/cyanide
name = "Cyanide"
id = "cyanide"
description = "A highly toxic chemical."
color = "#CF3600" // rgb: 207, 54, 0
toxpwr = 3
datum/reagent/toxin/cyanide/on_mob_life(var/mob/living/M as mob)
M.adjustOxyLoss(3*REM)
M.sleeping += 1
..()
return
datum/reagent/toxin/minttoxin
name = "Mint Toxin"
id = "minttoxin"
@@ -14,6 +14,9 @@
var/secondary = 0 // set to nonzero if secondary reaction
var/mob_react = 0 //Determines if a chemical reaction can occur inside a mob
var/required_temp = 0
var/mix_message = "The solution begins to bubble."
/datum/chemical_reaction/proc/on_reaction(var/datum/reagents/holder, var/created_volume)
return
@@ -12,6 +12,7 @@
can_be_placed_into = list(
/obj/machinery/chem_master/,
/obj/machinery/chem_dispenser/,
/obj/machinery/chem_heater/,
/obj/machinery/reagentgrinder,
/obj/machinery/biogenerator,
/obj/structure/table,
@@ -48,6 +48,13 @@
icon_state = "bottle20"
spawned_reagent = "stoxin"
/obj/item/weapon/reagent_containers/glass/bottle/morphine
name = "morphine bottle"
desc = "A small bottle of morphine."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle20"
spawned_reagent = "morphine"
/obj/item/weapon/reagent_containers/glass/bottle/chloralhydrate
name = "Chloral Hydrate Bottle"
desc = "A small bottle of Choral Hydrate. Mickey's Favorite!"
@@ -195,6 +202,59 @@
icon_state = "bottle3"
spawned_disease = /datum/disease/anxiety
/obj/item/weapon/reagent_containers/glass/bottle/traitor
name = "syndicate bottle"
desc = "A small bottle. Contains a random nasty chemical."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
/obj/item/weapon/reagent_containers/glass/bottle/traitor/New()
..()
var/new_reagent = pick("polonium", "histamine", "formaldehyde", "venom", "neurotoxin2", "cyanide")
reagents.add_reagent(new_reagent, 50)
/obj/item/weapon/reagent_containers/glass/bottle/polonium
name = "polonium bottle"
desc = "A small bottle. Contains Polonium."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "polonium"
/obj/item/weapon/reagent_containers/glass/bottle/venom
name = "venom bottle"
desc = "A small bottle. Contains Venom."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "venom"
/obj/item/weapon/reagent_containers/glass/bottle/neurotoxin2
name = "neurotoxin bottle"
desc = "A small bottle. Contains Neurotoxin."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "neurotoxin2"
/obj/item/weapon/reagent_containers/glass/bottle/formaldehyde
name = "formaldehyde bottle"
desc = "A small bottle. Contains Formaldehyde."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "formaldehyde"
/obj/item/weapon/reagent_containers/glass/bottle/cyanide
name = "cyanide bottle"
desc = "A small bottle. Contains Cyanide."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "cyanide"
/obj/item/weapon/reagent_containers/glass/bottle/histamine
name = "histamine bottle"
desc = "A small bottle. Contains Histamine."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "histamine"
/obj/item/weapon/reagent_containers/glass/bottle/beesease
name = "Beesease culture bottle"
desc = "A small bottle. Contains a sample of invasive Apidae."
@@ -56,7 +56,14 @@
..()
reagents.add_reagent("synaptizine", 30)
obj/item/weapon/reagent_containers/hypospray/combat/nanites
desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with expensive medical nanites for rapid healing."
volume = 100
/obj/item/weapon/reagent_containers/hypospray/combat/nanites/New()
..()
reagents.remove_reagent("synaptizine", 30)
reagents.add_reagent("nanites", 100)
//MediPens
@@ -69,10 +76,12 @@
volume = 10
ignore_flags = 1 //so you can medipen through hardsuits
flags = null
var/starting_reagent = "inaprovaline"
var/starting_amount = 10
/obj/item/weapon/reagent_containers/hypospray/medipen/New()
..()
reagents.add_reagent("inaprovaline", 10)
reagents.add_reagent(starting_reagent, starting_amount)
update_icon()
return
@@ -100,11 +109,11 @@
name = "leporazine medipen"
desc = "A rapid way to regulate your body's temperature in the event of a hardsuit malfunction at the cost of some shortness of breath."
icon_state = "lepopen"
starting_reagent = "leporazine"
starting_amount = 9
/obj/item/weapon/reagent_containers/hypospray/medipen/leporazine/New()
..()
reagents.remove_reagent("inaprovaline", 10)
reagents.add_reagent("leporazine", 9)
reagents.add_reagent("lexorin", 1)
update_icon()
return
@@ -113,11 +122,23 @@
name = "stimpack medipen"
desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in restrictive armor at the cost of some shortness of breath."
icon_state = "stimpen"
starting_reagent = "hyperzine"
starting_amount = 9
/obj/item/weapon/reagent_containers/hypospray/medipen/stimpack/New()
..()
reagents.remove_reagent("inaprovaline", 10)
reagents.add_reagent("hyperzine", 9)
reagents.add_reagent("lexorin", 1)
update_icon()
return
return
/obj/item/weapon/reagent_containers/hypospray/medipen/morphine
name = "morphine medipen"
desc = "A rapid way to get you out of a tight situation and fast! You'll feel rather drowsy, though."
icon_state = "medipen"
starting_reagent = "morphine"
/obj/item/weapon/reagent_containers/hypospray/medipen/ephedrine
name = "ephedrine medipen"
desc = "A rapid way to get you up and out of a tight situation and fast!"
icon_state = "medipen"
starting_reagent = "ephedrine"
@@ -0,0 +1,17 @@
/obj/item/weapon/reagent_containers/pill/patch
name = "chemical patch"
desc = "A chemical patch for touch based applications."
icon = 'icons/obj/chemical.dmi'
icon_state = "bandaid"
item_state = "bandaid"
possible_transfer_amounts = null
volume = 50
apply_type = TOUCH
apply_method = "apply"
/obj/item/weapon/reagent_containers/pill/patch/New()
..()
icon_state = "bandaid" // thanks inheritance
/obj/item/weapon/reagent_containers/pill/patch/afterattack(obj/target, mob/user , proximity)
return // thanks inheritance again
@@ -9,6 +9,8 @@
item_state = "pill"
possible_transfer_amounts = null
volume = 50
var/apply_type = INGEST
var/apply_method = "swallow"
/obj/item/weapon/reagent_containers/pill/New()
..()
@@ -25,16 +27,16 @@
return 0
if(M == user)
M << "<span class='notice'>You swallow [src].</span>"
M << "<span class='notice'>You [apply_method] [src].</span>"
else
M.visible_message("<span class='danger'>[user] attempts to force [M] to swallow [src].</span>", \
"<span class='userdanger'>[user] attempts to force [M] to swallow [src].</span>")
M.visible_message("<span class='danger'>[user] attempts to force [M] to [apply_method] [src].</span>", \
"<span class='userdanger'>[user] attempts to force [M] to [apply_method] [src].</span>")
if(!do_mob(user, M)) return
M.visible_message("<span class='danger'>[user] forces [M] to swallow [src].</span>", \
"<span class='userdanger'>[user] forces [M] to swallow [src].</span>")
M.visible_message("<span class='danger'>[user] forces [M] to [apply_method] [src].</span>", \
"<span class='userdanger'>[user] forces [M] to [apply_method] [src].</span>")
user.unEquip(src) //icon update
@@ -42,7 +44,7 @@
loc = M //Put the pill inside the mob. This fixes the issue where the pill appears to drop to the ground after someone eats it.
if(reagents.total_volume)
reagents.reaction(M, INGEST)
reagents.reaction(M, apply_type)
spawn(5)
reagents.trans_to(M, reagents.total_volume)
qdel(src)
-1
View File
@@ -39,7 +39,6 @@ datum/design //Datum for object designs, used in construction
var/list/materials = list() //List of materials. Format: "id" = amount.
var/construction_time //Amount of time required for building the object
var/build_path = "" //The file path of the object that gets created
var/locked = 0 //If true it will spawn inside a lockbox with currently sec access
var/list/category = null //Primarily used for Mech Fabricators, but can be used for anything
@@ -369,3 +369,13 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/aifixer
category = list("Computer Boards")
/datum/design/libraryconsole
name = "Computer Design (Library Console)"
desc = "Allows for the construction of circuit boards used to build a new library console."
id = "libraryconsole"
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/libraryconsole
category = list("Computer Boards")
+22 -13
View File
@@ -2,6 +2,26 @@
/////////////////Weapons/////////////////
/////////////////////////////////////////
/datum/design/pin_testing
name = "test-range firing pin"
desc = "This safety firing pin allows firearms to be operated within proximity to a firing range."
id = "pin_testing"
req_tech = list("combat" = 1, "materials" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 500, "$glass" = 300)
build_path = /obj/item/device/firing_pin/test_range
category = list("Firing Pins")
/datum/design/pin_loyalty
name = "loyalty firing pin"
desc = "This is a security firing pin which only authorizes users who are loyalty-implanted."
id = "pin_loyalty"
req_tech = list("combat" = 10, "materials" = 3, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$silver" = 600, "$diamond" = 600, "$uranium" = 200)
build_path = /obj/item/device/firing_pin/implant/loyalty
category = list("Firing Pins")
/datum/design/nuclear_gun
name = "Advanced Energy Gun"
desc = "An energy gun with an experimental miniaturized reactor."
@@ -11,18 +31,16 @@
materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 2000)
reliability = 76
build_path = /obj/item/weapon/gun/energy/gun/nuclear
locked = 1
category = list("Weapons")
/datum/design/stunrevolver
name = "Stun Revolver"
desc = "A high-tech revolver that fires internal, reusable stun cartidges in a revolving cylinder. The stun cartridges can be recharged using a conventional energy weapon recharger."
desc = "A high-tech revolver that fires internal, reusable stun cartridges in a revolving cylinder. The stun cartridges can be recharged using a conventional energy weapon recharger."
id = "stunrevolver"
req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 4000)
build_path = /obj/item/weapon/gun/energy/stunrevolver
locked = 1
category = list("Weapons")
/datum/design/tele_shield
@@ -33,7 +51,6 @@
build_type = PROTOLATHE
materials = list("$metal" = 4000, "$glass" = 5000, "$silver" = 300)
build_path = /obj/item/weapon/shield/riot/tele
locked = 1
category = list("Weapons")
/datum/design/lasercannon
@@ -44,7 +61,6 @@
build_type = PROTOLATHE
materials = list("$metal" = 10000, "$glass" = 2000, "$diamond" = 2000)
build_path = /obj/item/weapon/gun/energy/lasercannon
locked = 1
category = list("Weapons")
/datum/design/decloner
@@ -55,7 +71,6 @@
build_type = PROTOLATHE
materials = list("$gold" = 5000,"$uranium" = 10000, "mutagen" = 40)
build_path = /obj/item/weapon/gun/energy/decloner
locked = 1
category = list("Weapons")
/datum/design/rapidsyringe
@@ -76,9 +91,8 @@
build_type = PROTOLATHE
materials = list("$metal" = 5000, "$glass" = 1500, "$uranium" = 1500, "$silver" = 1500)
build_path = /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large
locked = 1
reliability = 76
category = list("Weapons")
reliability = 76
/datum/design/temp_gun
name = "Temperature Gun"
@@ -88,7 +102,6 @@
build_type = PROTOLATHE
materials = list("$metal" = 5000, "$glass" = 500, "$silver" = 3000)
build_path = /obj/item/weapon/gun/energy/temperature
locked = 1
category = list("Weapons")
/datum/design/flora_gun
@@ -120,7 +133,6 @@
build_type = PROTOLATHE
materials = list("$metal" = 8000, "$silver" = 2000, "$diamond" = 1000)
build_path = /obj/item/weapon/gun/projectile/automatic
locked = 1
category = list("Weapons")
/datum/design/xray
@@ -131,7 +143,6 @@
build_type = PROTOLATHE
materials = list("$gold" = 5000,"$uranium" = 10000, "$metal" = 4000)
build_path = /obj/item/weapon/gun/energy/xray
locked = 1
category = list("Weapons")
/datum/design/ionrifle
@@ -142,7 +153,6 @@
build_type = PROTOLATHE
materials = list("$silver" = 4000, "$metal" = 6000, "$uranium" = 1000)
build_path = /obj/item/weapon/gun/energy/ionrifle
locked = 1
category = list("Weapons")
/datum/design/wormhole_projector
@@ -153,7 +163,6 @@
build_type = PROTOLATHE
materials = list("$silver" = 1000, "$metal" = 5000, "$diamond" = 3000)
build_path = /obj/item/weapon/gun/energy/wormhole_projector
locked = 1
category = list("Weapons")
/datum/design/reciever
+7 -7
View File
@@ -399,7 +399,6 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes.
var/R = being_built.reliability
var/O = being_built.locked
spawn(32*amount/coeff)
if(g2g) //And if we only fail the material requirements, we still spend time and power
for(var/i = 0, i<amount, i++)
@@ -411,12 +410,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
new_item.g_amt /= coeff
if(linked_lathe.hacked)
R = max((new_item.reliability/2), 0)
if(O)
var/obj/item/weapon/storage/lockbox/L = new/obj/item/weapon/storage/lockbox(linked_lathe.loc)
new_item.loc = L
L.name += " ([new_item.name])"
else
new_item.loc = linked_lathe.loc
new_item.loc = linked_lathe.loc
linked_lathe.busy = 0
screen = 3.15
updateUsrDialog()
@@ -988,6 +982,12 @@ won't update every console in existence) but it's more of a hassle to do. Also,
req_access = null
req_access_txt = "29"
/obj/machinery/computer/rdconsole/robotics/New()
..()
if(circuit)
circuit.name = "circuit board (RD Console - Robotics)"
circuit.build_path = /obj/machinery/computer/rdconsole/robotics
/obj/machinery/computer/rdconsole/core
name = "Core R&D Console"
desc = "A console used to interface with R&D tools."
@@ -24,7 +24,7 @@
minor_announce(config.alert_desc_green, "Attention! Security level lowered to green:")
security_level = SEC_LEVEL_GREEN
for(var/obj/machinery/firealarm/FA in world)
if(FA.z == 1)
if(FA.z == ZLEVEL_STATION)
FA.update_icon()
if(SEC_LEVEL_BLUE)
if(security_level < SEC_LEVEL_BLUE)
@@ -33,7 +33,7 @@
minor_announce(config.alert_desc_blue_downto, "Attention! Security level lowered to blue:")
security_level = SEC_LEVEL_BLUE
for(var/obj/machinery/firealarm/FA in world)
if(FA.z == 1)
if(FA.z == ZLEVEL_STATION)
FA.update_icon()
if(SEC_LEVEL_RED)
if(security_level < SEC_LEVEL_RED)
@@ -48,13 +48,13 @@
CC.post_status("alert", "redalert")*/
for(var/obj/machinery/firealarm/FA in world)
if(FA.z == 1)
if(FA.z == ZLEVEL_STATION)
FA.update_icon()
if(SEC_LEVEL_DELTA)
minor_announce(config.alert_desc_delta, "Attention! Delta security level reached!",1)
security_level = SEC_LEVEL_DELTA
for(var/obj/machinery/firealarm/FA in world)
if(FA.z == 1)
if(FA.z == ZLEVEL_STATION)
FA.update_icon()
else
return