Merge branch 'master' of github.com:ParadiseSS13/Paradise into SlimeColorChanger

This commit is contained in:
Tigercat2000
2015-03-09 22:25:35 +01:00
164 changed files with 6676 additions and 2083 deletions
+19 -27
View File
@@ -734,7 +734,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("tunnel clown")//Tunnel clowns rule!
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/head/chaplain_hood(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
@@ -775,7 +775,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("dark lord")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_hand)
@@ -797,7 +797,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("assassin")
M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit)
@@ -812,7 +812,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
sec_briefcase.contents += new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow
sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba
sec_briefcase.contents += new /obj/item/ammo_box/a357
sec_briefcase.contents += new /obj/item/weapon/plastique
sec_briefcase.contents += new /obj/item/weapon/c4
M.equip_to_slot_or_del(sec_briefcase, slot_l_hand)
var/obj/item/device/pda/heads/pda = new(M)
@@ -855,8 +855,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.icon_state = "centcom"
W.item_state = "id_inv"
W.access = get_all_accesses()
W.access += list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer")
W.assignment = "Nanotrasen Navy Representative"
W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_if_possible(W, slot_wear_id)
@@ -878,9 +878,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/obj/item/weapon/card/id/centcom/W = new(M)
W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Officer)"
W.access = get_all_accesses()
W.access += get_all_centcom_access()
W.assignment = "Nanotrasen Navy Officer"
W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_if_possible(W, slot_wear_id)
@@ -904,26 +903,25 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/obj/item/weapon/card/id/centcom/W = new(M)
W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Captain)"
W.access = get_all_accesses()
W.access += get_all_centcom_access()
W.assignment = "Nanotrasen Navy Captain"
W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_if_possible(W, slot_wear_id)
if("emergency response team")
if("emergency response team member")
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(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card (Emergency Response Team)"
W.name = "[M.real_name]'s ID Card (Emergency Response Team - Member)"
W.icon_state = "centcom"
W.access = get_all_accesses()
W.access += get_all_centcom_access()
W.assignment = "Emergency Response Team"
W.assignment = "Emergency Response Team Member"
W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
@@ -935,18 +933,17 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("emergency response team leader")
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(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card (Emergency Response Team Leader)"
W.name = "[M.real_name]'s ID Card (Emergency Response Team - Leader)"
W.icon_state = "centcom"
W.access = get_all_accesses()
W.access += get_all_centcom_access()
W.assignment = "Emergency Response Team Leader"
W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
@@ -980,9 +977,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card (Special Operations Officer)"
W.icon_state = "centcom"
W.access = get_all_accesses()
W.access += get_all_centcom_access()
W.assignment = "Special Operations Officer"
W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
@@ -1010,9 +1006,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card (Special Operations Officer)"
W.icon_state = "centcom"
W.access = get_all_accesses()
W.access += get_all_centcom_access()
W.assignment = "Special Operations Officer"
W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
@@ -1039,7 +1034,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
if("blue wizard")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(M), slot_wear_suit)
@@ -1116,9 +1110,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card (Deathsquad Officer)"
W.icon_state = "centcom"
W.access = get_all_accesses()
W.access += get_all_centcom_access()
W.assignment = "Deathsquad Officer"
W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
@@ -1150,9 +1143,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card (Deathsquad Officer)"
W.icon_state = "centcom"
W.access = get_all_accesses()
W.access += get_all_centcom_access()
W.assignment = "Deathsquad Officer"
W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
+2 -3
View File
@@ -146,7 +146,7 @@ var/global/sent_strike_team = 0
equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_in_backpack)
if (!leader_selected)
equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/weapon/pinpointer(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/disk/nuclear(src), slot_in_backpack)
@@ -168,9 +168,8 @@ var/global/sent_strike_team = 0
var/obj/item/weapon/card/id/W = new(src)
W.name = "[real_name]'s ID Card"
W.icon_state = "centcom"
W.access = get_all_accesses()//They get full station access.
W.access += list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)//Let's add their alloted CentCom access.
W.assignment = "Death Commando"
W.access = get_centcom_access(W.assignment)
W.registered_name = real_name
equip_to_slot_or_del(W, slot_wear_id)
@@ -138,7 +138,7 @@ var/global/sent_syndicate_strike_team = 0
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/strike(src), slot_wear_suit)
else
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/red/strike(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves)
equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(src), slot_gloves)
if (!syndicate_leader_selected)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/strike(src), slot_head)
else
@@ -151,10 +151,10 @@ var/global/sent_syndicate_strike_team = 0
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m45(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_in_backpack)
if (!syndicate_leader_selected)
equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/card/emag(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/weapon/pinpointer(src), slot_in_backpack)
@@ -171,8 +171,8 @@ var/global/sent_syndicate_strike_team = 0
W.name = "[real_name]'s ID Card"
W.icon_state = "id"
W.access = get_all_accesses()//They get full station access because obviously the syndicate has HAAAX, and can make special IDs for their most elite members.
W.access += list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage, access_syndicate)//Let's add their forged CentCom access and syndicate access.
W.assignment = "Syndicate Commando"
W.access = get_syndicate_access(W.assignment)
W.registered_name = real_name
equip_to_slot_or_del(W, slot_wear_id)
+1 -1
View File
@@ -8,7 +8,7 @@ var/global/vox_tick = 1
equip_to_slot_or_del(new /obj/item/clothing/under/vox/vox_robes(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(src), slot_shoes) // REPLACE THESE WITH CODED VOX ALTERNATIVES.
equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow/vox(src), slot_gloves) // AS ABOVE.
equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow/vox(src), slot_gloves) // AS ABOVE.
switch(vox_tick)
if(1) // Vox raider!
+5 -5
View File
@@ -100,7 +100,7 @@
corpseuniform = /obj/item/clothing/under/syndicate
corpsesuit = /obj/item/clothing/suit/armor/vest
corpseshoes = /obj/item/clothing/shoes/combat
corpsegloves = /obj/item/clothing/gloves/swat
corpsegloves = /obj/item/clothing/gloves/combat
corpseradio = /obj/item/device/radio/headset
corpsemask = /obj/item/clothing/mask/gas
corpsehelmet = /obj/item/clothing/head/helmet/swat
@@ -116,7 +116,7 @@
corpseuniform = /obj/item/clothing/under/syndicate
corpsesuit = /obj/item/clothing/suit/space/rig/syndi
corpseshoes = /obj/item/clothing/shoes/combat
corpsegloves = /obj/item/clothing/gloves/swat
corpsegloves = /obj/item/clothing/gloves/combat
corpseradio = /obj/item/device/radio/headset
corpsemask = /obj/item/clothing/mask/gas/syndicate
corpsehelmet = /obj/item/clothing/head/helmet/space/rig/syndi
@@ -162,7 +162,7 @@
corpseback = /obj/item/weapon/storage/backpack/industrial
corpseshoes = /obj/item/clothing/shoes/orange
corpsebelt = /obj/item/weapon/storage/belt/utility/full
corpsegloves = /obj/item/clothing/gloves/yellow
corpsegloves = /obj/item/clothing/gloves/color/yellow
corpsehelmet = /obj/item/clothing/head/hardhat
corpseid = 1
corpseidjob = "Station Engineer"
@@ -246,7 +246,7 @@
/obj/effect/landmark/corpse/miner
corpseradio = /obj/item/device/radio/headset/headset_cargo
corpseuniform = /obj/item/clothing/under/rank/miner
corpsegloves = /obj/item/clothing/gloves/black
corpsegloves = /obj/item/clothing/gloves/fingerless
corpseback = /obj/item/weapon/storage/backpack/industrial
corpseshoes = /obj/item/clothing/shoes/black
corpseid = 1
@@ -280,7 +280,7 @@
corpseglasses = /obj/item/clothing/glasses/eyepatch
corpsemask = /obj/item/clothing/mask/cigarette/cigar/cohiba
corpsehelmet = /obj/item/clothing/head/centhat
corpsegloves = /obj/item/clothing/gloves/swat
corpsegloves = /obj/item/clothing/gloves/combat
corpseshoes = /obj/item/clothing/shoes/combat
corpsepocket1 = /obj/item/weapon/lighter/zippo
corpseid = 1
+7
View File
@@ -157,6 +157,13 @@
else
src.DB_species_unlock("Slime People",45)
return
if("6")
if(karma <100)
usr << "You do not have enough karma!"
return
else
src.DB_species_unlock("Plasmaman",100)
return
if(href_list["KarmaRefund"])
var/type = href_list["KarmaRefundType"]
var/job = href_list["KarmaRefund"]
+2 -2
View File
@@ -246,7 +246,7 @@ BLIND // can't see anything
var/mask_adjusted = 0
var/ignore_maskadjust = 1
var/adjusted_flags = null
//Proc that moves gas/breath masks out of the way
/obj/item/clothing/mask/proc/adjustmask(var/mob/user)
if(!ignore_maskadjust)
@@ -334,7 +334,7 @@ BLIND // can't see anything
permeability_coefficient = 0.02
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
slowdown = 2
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT||HIDETAIL
+5 -2
View File
@@ -8,6 +8,7 @@
//var/darkness_view = 0//Base human is 2
//var/invisa_view = 0
var/prescription = 0
var/see_darkness = 1
/obj/item/clothing/glasses/meson
name = "Optical Meson Scanner"
@@ -20,13 +21,14 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
/obj/item/clothing/glasses/meson/night
name = "Night Vision Optical Meson Scanner"
desc = "An Optical Meson Scanner fitted with an amplified visible light spectrum overlay, providing greater visual clarity in darkness."
icon_state = "nvgmeson"
item_state = "glasses"
darkness_view = 8
see_darkness = 0
/obj/item/clothing/glasses/meson/prescription
name = "prescription mesons"
@@ -49,7 +51,7 @@
desc = "nothing"
icon_state = "purple"
item_state = "glasses"
/obj/item/clothing/glasses/janitor
name = "Janitorial Goggles"
desc = "These'll keep the soap out of your eyes."
@@ -63,6 +65,7 @@
item_state = "glasses"
origin_tech = "magnets=2"
darkness_view = 8
see_darkness = 0
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
+2
View File
@@ -26,6 +26,7 @@
icon_state = "healthhudnight"
item_state = "glasses"
darkness_view = 8
see_darkness = 0
/obj/item/clothing/glasses/hud/health/process_hud(var/mob/M)
process_med_hud(M,1)
@@ -53,6 +54,7 @@
desc = "An advanced heads-up display which provides id data and vision in complete darkness."
icon_state = "securityhudnight"
darkness_view = 8
see_darkness = 0
/obj/item/clothing/glasses/hud/security/process_hud(var/mob/M)
+14 -15
View File
@@ -1,4 +1,4 @@
/obj/item/clothing/gloves/yellow
/obj/item/clothing/gloves/color/yellow
desc = "These gloves will protect the wearer from electric shock."
name = "insulated gloves"
icon_state = "yellow"
@@ -14,7 +14,7 @@
power
var/next_shock = 0
/obj/item/clothing/gloves/fyellow //Cheap Chinese Crap
/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap
desc = "These gloves are cheap copies of the coveted gloves, no way this can end badly."
name = "budget insulated gloves"
icon_state = "yellow"
@@ -30,7 +30,7 @@
New()
siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5)
/obj/item/clothing/gloves/black
/obj/item/clothing/gloves/color/black
desc = "These gloves are fire-resistant."
name = "black gloves"
icon_state = "black"
@@ -55,7 +55,7 @@
thief
pickpocket = 1
/obj/item/clothing/gloves/orange
/obj/item/clothing/gloves/color/orange
name = "orange gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "orange"
@@ -65,7 +65,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi'
)
/obj/item/clothing/gloves/red
/obj/item/clothing/gloves/color/red
name = "red gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "red"
@@ -75,7 +75,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi'
)
/obj/item/clothing/gloves/rainbow
/obj/item/clothing/gloves/color/rainbow
name = "rainbow gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "rainbow"
@@ -88,7 +88,7 @@
clown
_color = "clown"
/obj/item/clothing/gloves/blue
/obj/item/clothing/gloves/color/blue
name = "blue gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "blue"
@@ -98,7 +98,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi'
)
/obj/item/clothing/gloves/purple
/obj/item/clothing/gloves/color/purple
name = "purple gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "purple"
@@ -108,7 +108,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi'
)
/obj/item/clothing/gloves/green
/obj/item/clothing/gloves/color/green
name = "green gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "green"
@@ -118,7 +118,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi'
)
/obj/item/clothing/gloves/grey
/obj/item/clothing/gloves/color/grey
name = "grey gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "gray"
@@ -134,7 +134,7 @@
hop
_color = "hop" //Exists for washing machines. Is not different from gray gloves in any way.
/obj/item/clothing/gloves/light_brown
/obj/item/clothing/gloves/color/light_brown
name = "light brown gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "lightbrown"
@@ -144,7 +144,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi'
)
/obj/item/clothing/gloves/brown
/obj/item/clothing/gloves/color/brown
name = "brown gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "brown"
@@ -170,8 +170,6 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi'
)
cmo
_color = "medical" //Exists for washing machines. Is not different from latex gloves in any way.
/obj/item/clothing/gloves/color/latex/nitrile
name = "nitrile gloves"
@@ -179,6 +177,7 @@
icon_state = "nitrile"
item_state = "nitrilegloves"
transfer_prints = FALSE
_color = "medical"
/obj/item/clothing/gloves/color/white
name = "white gloves"
@@ -188,7 +187,7 @@
_color="mime"
redcoat
_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way.
_color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way.
/obj/item/clothing/gloves/color/captain
+12 -16
View File
@@ -1,3 +1,14 @@
/obj/item/clothing/gloves/fingerless
name = "fingerless gloves"
desc = "Plain black gloves without fingertips for the hard working."
icon_state = "fingerless"
item_state = "fingerless"
_color = null //So they don't wash.
transfer_prints = TRUE
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
species_restricted = null
/obj/item/clothing/gloves/cyborg
desc = "beep boop borp"
name = "cyborg gloves"
@@ -8,23 +19,8 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi'
)
/obj/item/clothing/gloves/swat
desc = "These tactical gloves are somewhat fire and impact-resistant."
name = "\improper SWAT Gloves"
icon_state = "black"
item_state = "swat_gl"
siemens_coefficient = 0.6
permeability_coefficient = 0.05
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi'
)
/obj/item/clothing/gloves/combat //Combined effect of SWAT gloves and insulated gloves
/obj/item/clothing/gloves/combat
desc = "These tactical gloves are somewhat fire and impact resistant."
name = "combat gloves"
icon_state = "black"
+30 -1
View File
@@ -113,4 +113,33 @@ obj/item/clothing/head/blob
icon_state = "blobhat"
item_state = "blobhat"
flags = HEADCOVERSEYES|HEADCOVERSMOUTH
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
//Commander
/obj/item/clothing/head/helmet/ert/command
name = "emergency response team commander helmet"
desc = "An in-atmosphere helmet worn by the commander of a NanoTrasen Emergency Response Team. Has blue highlights."
//Security
/obj/item/clothing/head/helmet/ert/security
name = "emergency response team security helmet"
desc = "An in-atmosphere helmet worn by security members of the NanoTrasen Emergency Response Team. Has red highlights."
icon_state = "erthelmet_sec"
//Engineer
/obj/item/clothing/head/helmet/ert/engineer
name = "emergency response team engineer helmet"
desc = "An in-atmosphere helmet worn by engineering members of the NanoTrasen Emergency Response Team. Has orange highlights."
icon_state = "erthelmet_eng"
//Medical
/obj/item/clothing/head/helmet/ert/medical
name = "emergency response team medical helmet"
desc = "A set of armor worn by medical members of the NanoTrasen Emergency Response Team. Has red and white highlights."
icon_state = "erthelmet_med"
//Medical
/obj/item/clothing/head/helmet/ert/janitor
name = "emergency response team janitor helmet"
desc = "A set of armor worn by janitorial members of the NanoTrasen Emergency Response Team. Has red and white highlights."
icon_state = "erthelmet_jan"
+1 -1
View File
@@ -173,7 +173,7 @@
_color = "vox-casual-2"
item_state = "vox-casual-2"
/obj/item/clothing/gloves/yellow/vox
/obj/item/clothing/gloves/color/yellow/vox
desc = "These bizarre gauntlets seem to be fitted for... bird claws?"
name = "insulated gauntlets"
icon_state = "gloves-vox"
+173 -11
View File
@@ -1,16 +1,17 @@
// PLASMEN SHIT
// CAN'T WEAR UNLESS YOU'RE A PINK SKELLINGTON
/obj/item/clothing/suit/space/eva/plasmaman
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
slowdown = 2
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 0)
name = "plasmaman suit"
desc = "A special containment suit designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
slowdown = 0
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
species_restricted = list("Plasmaman")
flags = STOPSPRESSUREDMAGE | PLASMAGUARD
flags = STOPSPRESSUREDMAGE | PLASMAGUARD
icon_state = "plasmaman_suit"
item_state = "plasmaman_suit"
@@ -19,10 +20,10 @@
var/extinguish_cooldown=10 SECONDS
var/extinguishes_left=10 // Yeah yeah, reagents, blah blah blah. This should be simple.
/obj/item/clothing/suit/space/eva/plasmaman/examine()
set src in view()
/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
..()
usr << "There are [extinguishes_left] extinguisher canisters left in this suit."
user << "<span class='info'>There are [extinguishes_left] extinguisher canisters left in this suit.</span>"
/obj/item/clothing/suit/space/eva/plasmaman/proc/Extinguish(var/mob/user)
var/mob/living/carbon/human/H=user
if(extinguishes_left)
@@ -35,7 +36,9 @@
H.ExtinguishMob()
/obj/item/clothing/head/helmet/space/eva/plasmaman
flags = HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE | PLASMAGUARD
name = "plasmaman helmet"
desc = "A special containment helmet designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
flags = STOPSPRESSUREDMAGE | PLASMAGUARD
species_restricted = list("Plasmaman")
icon_state = "plasmaman_helmet0"
@@ -54,9 +57,10 @@
return
on = !on
icon_state = "[base_state][on]"
// item_state = "rig[on]-[_color]"
if(on) user.SetLuminosity(user.luminosity + brightness_on)
else user.SetLuminosity(user.luminosity - brightness_on)
user.update_inv_head()
/obj/item/clothing/head/helmet/space/eva/plasmaman/pickup(mob/user)
if(on)
@@ -74,54 +78,103 @@
// ENGINEERING
/obj/item/clothing/suit/space/eva/plasmaman/assistant
name = "plasmaman assistant suit"
icon_state = "plasmamanAssistant_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
name = "plasmaman assistant helmet"
icon_state = "plasmamanAssistant_helmet0"
base_state = "plasmamanAssistant_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/atmostech
name = "plasmaman atmospheric suit"
icon_state = "plasmamanAtmos_suit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/head/helmet/space/eva/plasmaman/atmostech
name = "plasmaman atmospheric helmet"
icon_state = "plasmamanAtmos_helmet0"
base_state = "plasmamanAtmos_helmet"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/suit/space/eva/plasmaman/engineer
name = "plasmaman engineer suit"
icon_state = "plasmamanEngineer_suit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer
name = "plasmaman engineer helmet"
icon_state = "plasmamanEngineer_helmet0"
base_state = "plasmamanEngineer_helmet"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
/obj/item/clothing/suit/space/eva/plasmaman/engineer/ce
name = "plasmaman chief engineer suit"
icon_state = "plasmaman_CE"
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/ce
name = "plasmaman chief engineer helmet"
icon_state = "plasmaman_CE_helmet0"
base_state = "plasmaman_CE_helmet"
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
//SERVICE
/obj/item/clothing/suit/space/eva/plasmaman/botanist
name = "plasmaman botanist suit"
icon_state = "plasmamanBotanist_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/botanist
name = "plasmaman botanist helmet"
icon_state = "plasmamanBotanist_helmet0"
base_state = "plasmamanBotanist_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/chaplain
name = "plasmaman chaplain suit"
icon_state = "plasmamanChaplain_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/chaplain
name = "plasmaman chaplain helmet"
icon_state = "plasmamanChaplain_helmet0"
base_state = "plasmamanChaplain_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/clown
name = "plasmaman clown suit"
icon_state = "plasmaman_Clown"
/obj/item/clothing/head/helmet/space/eva/plasmaman/clown
name = "plasmaman clown helmet"
icon_state = "plasmaman_Clown_helmet0"
base_state = "plasmaman_Clown_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/mime
name = "plasmaman mime suit"
icon_state = "plasmaman_Mime"
/obj/item/clothing/head/helmet/space/eva/plasmaman/mime
name = "plasmaman mime helmet"
icon_state = "plasmaman_Mime_helmet0"
base_state = "plasmaman_Mime_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/service
name = "plasmaman service suit"
icon_state = "plasmamanService_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/service
name = "plasmaman service helmet"
icon_state = "plasmamanService_helmet0"
base_state = "plasmamanService_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/janitor
name = "plasmaman janitor suit"
icon_state = "plasmamanJanitor_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/janitor
name = "plasmaman janitor helmet"
icon_state = "plasmamanJanitor_helmet0"
base_state = "plasmamanJanitor_helmet"
@@ -129,42 +182,151 @@
//CARGO
/obj/item/clothing/suit/space/eva/plasmaman/cargo
name = "plasmaman cargo suit"
icon_state = "plasmamanCargo_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/cargo
name = "plasmaman cargo helmet"
icon_state = "plasmamanCargo_helmet0"
base_state = "plasmamanCargo_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/miner
name = "plasmaman miner suit"
icon_state = "plasmamanMiner_suit"
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
/obj/item/clothing/head/helmet/space/eva/plasmaman/miner
name = "plasmaman miner helmet"
icon_state = "plasmamanMiner_helmet0"
base_state = "plasmamanMiner_helmet"
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
// MEDSCI
/obj/item/clothing/suit/space/eva/plasmaman/medical
name = "plasmaman medical suit"
icon_state = "plasmamanMedical_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical
name = "plasmaman medical helmet"
icon_state = "plasmamanMedical_helmet0"
base_state = "plasmamanMedical_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/medical/paramedic
name = "plasmaman paramedic suit"
icon_state = "plasmaman_Paramedic"
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/paramedic
name = "plasmaman paramedic helmet"
icon_state = "plasmaman_Paramedic_helmet0"
base_state = "plasmaman_Paramedic_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/medical/chemist
name = "plasmaman chemist suit"
icon_state = "plasmaman_Chemist"
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/chemist
name = "plasmaman chemist helmet"
icon_state = "plasmaman_Chemist_helmet0"
base_state = "plasmaman_Chemist_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/medical/cmo
name = "plasmaman chief medical officer suit"
icon_state = "plasmaman_CMO"
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/cmo
name = "plasmaman chief medical officer helmet"
icon_state = "plasmaman_CMO_helmet0"
base_state = "plasmaman_CMO_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/science
name = "plasmaman scientist suit"
icon_state = "plasmamanScience_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/science
name = "plasmaman scientist helmet"
icon_state = "plasmamanScience_helmet0"
base_state = "plasmamanScience_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/science/rd
name = "plasmaman research director suit"
icon_state = "plasmaman_RD"
/obj/item/clothing/head/helmet/space/eva/plasmaman/science/rd
name = "plasmaman research director helmet"
icon_state = "plasmaman_RD_helmet0"
base_state = "plasmaman_RD_helmet"
//SECURITY
/obj/item/clothing/suit/space/eva/plasmaman/security
name = "plasmaman security suit"
icon_state = "plasmamanSecurity_suit"
armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50)
/obj/item/clothing/head/helmet/space/eva/plasmaman/security
name = "plasmaman security helmet"
icon_state = "plasmamanSecurity_helmet0"
base_state = "plasmamanSecurity_helmet"
base_state = "plasmamanSecurity_helmet"
armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50)
/obj/item/clothing/suit/space/eva/plasmaman/security/hos
name = "plasmaman head of security suit"
icon_state = "plasmaman_HoS"
/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hos
name = "plasmaman head of security helmet"
icon_state = "plasmaman_HoS_helmet0"
base_state = "plasmaman_HoS_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/security/hop
name = "plasmaman head of personnel suit"
icon_state = "plasmaman_HoP"
/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hop
name = "plasmaman head of personnel helmet"
icon_state = "plasmaman_HoP_helmet0"
base_state = "plasmaman_HoP_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/security/captain
name = "plasmaman captain suit"
icon_state = "plasmaman_Captain"
/obj/item/clothing/head/helmet/space/eva/plasmaman/security/captain
name = "plasmaman captain helmet"
icon_state = "plasmaman_Captain_helmet0"
base_state = "plasmaman_Captain_helmet"
//NUKEOPS
/obj/item/clothing/suit/space/eva/plasmaman/nuclear
name = "blood red plasmaman suit"
icon_state = "plasmaman_Nukeops"
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/restraints/handcuffs)
siemens_coefficient = 0.6
/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear
name = "blood red plasmaman helmet"
icon_state = "plasmaman_Nukeops_helmet0"
base_state = "plasmaman_Nukeops_helmet"
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60)
siemens_coefficient = 0.6
var/obj/machinery/camera/camera
/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear/attack_self(mob/user)
if(camera)
..(user)
else
camera = new /obj/machinery/camera(src)
camera.network = list("NUKE")
cameranet.removeCamera(camera)
camera.c_tag = user.name
user << "<span class='notice'>User scanned as [camera.c_tag]. Camera activated.</span>"
/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear/examine(mob/user)
..()
if(get_dist(user,src) <= 1)
user << "<span class='info'>This helmet has a built-in camera. It's [camera ? "" : "in"]active.</span>"
+4 -4
View File
@@ -61,7 +61,7 @@
item_state = "eng_hardsuit"
slowdown = 2
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/device/suit_cooling_unit)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox")
sprite_sheets = list(
@@ -320,7 +320,7 @@
item_state = "eng_hardsuit"
slowdown = 2
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
//Chief Engineer's rig
/obj/item/clothing/head/helmet/space/rig/elite
@@ -497,7 +497,7 @@
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort."
item_state = "medical_hardsuit"
slowdown = 1
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
//Security
@@ -516,7 +516,7 @@
desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
item_state = "sec_hardsuit"
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/restraints/handcuffs)
allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/melee/baton,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/restraints/handcuffs)
siemens_coefficient = 0.7
@@ -0,0 +1,350 @@
// ** BEGIN NINJA CLOTHING DEFINES **
/obj/item/clothing/head/helmet/space/space_ninja
desc = "What may appear to be a simple black garment is in fact a highly sophisticated nano-weave helmet. Standard issue ninja gear."
name = "ninja hood"
icon_state = "s-ninja"
item_state = "s-ninja_hood"
armor = list(melee = 60, bullet = 60, laser = 45, energy = 15, bomb = 30, bio = 30, rad = 25)
unacidable = 1
siemens_coefficient = 0.2
/obj/item/clothing/mask/gas/voice/space_ninja
name = "ninja mask"
desc = "A close-fitting mask that acts both as an air filter and a post-modern fashion statement."
icon_state = "s-ninja(norm)"
item_state = "s-ninja_mask"
unacidable = 1
siemens_coefficient = 0.2
/obj/item/clothing/glasses/hud/space_ninja
name = "vision enhancement implant"
desc = "A high-tech ocular implant designed for Spider Clan operatives."
icon_state = "cybereye-off"
item_state = "eyepatch"
flags = NODROP
var/enabled = 0
var/energyConsumption = 0
var/antagHUDEnabled = 0
var/mesonEnabled = 0
var/materialEnabled = 0
var/thermalEnabled = 0
/obj/item/clothing/suit/space/space_ninja
name = "ninja suit"
desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins."
icon_state = "s-ninja"
item_state = "s-ninja_suit"
allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box, /obj/item/weapon/melee/baton, /obj/item/weapon/tank, /obj/item/weapon/stock_parts/cell)
slowdown = 0
unacidable = 1
armor = list(melee = 60, bullet = 60, laser = 45,energy = 15, bomb = 30, bio = 30, rad = 30)
siemens_coefficient = 0.2
var/suitActive = 0
var/suitBusy = 0
var/obj/item/weapon/stock_parts/cell/suitCell
var/obj/item/clothing/head/helmet/space/space_ninja/suitHood
var/obj/item/clothing/gloves/space_ninja/suitGloves
var/obj/item/clothing/shoes/space_ninja/suitShoes
var/obj/item/clothing/mask/gas/voice/space_ninja/suitMask
var/obj/item/clothing/glasses/hud/space_ninja/suitGlasses
var/mob/living/carbon/human/suitOccupant
/obj/item/clothing/gloves/space_ninja
desc = "These nano-enhanced gloves insulate from electricity and provide fire resistance."
name = "ninja gloves"
icon_state = "s-ninja"
item_state = "s-ninja"
siemens_coefficient = 0
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
transfer_prints = FALSE
/obj/item/clothing/shoes/space_ninja
name = "ninja shoes"
desc = "A pair of running shoes. Excellent for running and even better for smashing skulls."
icon_state = "s-ninja"
permeability_coefficient = 0.01
flags = NOSLIP
armor = list(melee = 60, bullet = 60, laser = 45,energy = 15, bomb = 30, bio = 30, rad = 30)
siemens_coefficient = 0.2
cold_protection = FEET
min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = FEET
max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE
// ** END NINJA CLOTHING DEFINES **
// ** BEGIN NINJA SUIT PROCS **
/obj/item/clothing/suit/space/space_ninja/New()
suitCell = new/obj/item/weapon/stock_parts/cell/ninja // The Ninja starts out with a 10,000 energy cell.
if(suitCell.charge != suitCell.maxcharge)
suitCell.charge = suitCell.maxcharge
/obj/item/clothing/suit/space/space_ninja/verb/toggle_suit()
set category = "Space Ninja - Equiptment"
set name = "Toggle Suit"
if(usr.mind.special_role == "Ninja")
if(suitBusy)
usr << "<span style='color: #ff0000;'><b>ERROR: </b>Suit systems busy, cannot initiate [suitActive ? "de-activation" : "activation"] protocals at this time.</span>"
return
suitBusy = 1
if(suitActive && (alert("Confirm suit systems shutdown? This cannot be halted once it has started.", "Confirm Shutdown", "Yes", "No") == "Yes"))
usr << "<span style='color: #0000ff;'>Now de-initializing...</span>"
sleep(15)
usr << "<span style='color: #0000ff;'>Logging off, [usr.real_name]. Shutting down <b>SpiderOS</b>.</span>"
sleep(10)
usr<< "<span style='color: #0000ff;'>Primary system status: <B>OFFLINE</B>.\nBackup system status: <b>OFFLINE</b>.</span>"
sleep(5)
usr<< "<span style='color: #0000ff;'>VOID-shift device status: <B>OFFLINE</B>.\nCLOAK-tech device status: <B>OFFLINE</B>.</span>"
//TODO: Shut down any active abilities
sleep(10)
usr<< "<span style='color: #0000ff;'>Disconnecting neural-net interface...</span> <span style='color: #32CD32'><b>Success</b>.</span>"
usr.hud_used.instantiate()
usr.regenerate_icons()
sleep(5)
usr<< "<span style='color: #0000ff;'>Disengaging neural-net interface...</span> <span style='color: #32CD32'><b>Success</b>.</span>"
sleep(10)
usr<< "<span style='color: #0000ff;'>Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: <B>FINISHED</B>.</span>"
//TODO: Grant verbs
toggle_suit_lock(usr)
usr.regenerate_icons()
suitBusy = 0
suitActive = 0
else if(!suitActive) // Activate the suit.
usr << "<span style='color: #0000ff;'>Now initializing...</span>"
sleep(15)
usr<< "<span style='color: #0000ff;'>Now establishing neural-net interface..."
if(usr.mind.special_role != "Ninja")
usr << "<span style='color: #ff0000;'><b>FĆAL �Rr�R</b>: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked."
return
sleep(10)
usr<< "<span style='color: #0000ff;'>Neural-net established. Now monitoring brainwave pattern. \nBrainwave pattern</span> <span style='color: #32CD32;'><b>GREEN</b></span><span style='color: #0000ff;'>, proceeding.</span>"
sleep(10)
usr<< "<span style='color: #0000ff;'>Securing external locking mechanism...</span>"
if(!toggle_suit_lock(usr))
return
sleep(5)
usr<< "<span style='color: #0000ff;'>Suit secured, extending neural-net interface...</span>"
usr.hud_used.human_hud('icons/mob/screen1_NinjaHUD.dmi',"#ffffff",255)
usr.regenerate_icons()
sleep(10)
usr<< "<span style='color: #0000ff;'>VOID-shift device status: <b>ONLINE</b>.\nCLOAK-tech device status:<b>ONLINE</b></span>"
sleep(5)
usr<< "<span style='color: #0000ff;'>Primary system status: <b>ONLINE</b>.\nBackup system status: <b>ONLINE</b>.\nCurrent energy capacity: <b>[suitCell.charge]/[suitCell.maxcharge]</b>.</span>"
sleep(10)
usr<< "<span style='color: #0000ff;'>All systems operational. Welcome to <b>SpiderOS</b>, [usr.real_name].</span>"
//TODO: Grant ninja verbs here.
suitBusy = 0
suitActive = 1
else
suitBusy = 0
usr << "<span style='color: #0000ff;'><b>NOTICE: </b>Suit de-activation protocals aborted.</span>"
else
usr << "<span style='color: #ff0000;'><b>FĆAL �Rr�R</b>: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked."
return
/obj/item/clothing/suit/space/space_ninja/proc/toggle_suit_lock(mob/living/carbon/human/user)
if(!suitActive)
if(!istype(user.wear_suit, /obj/item/clothing/suit/space/space_ninja))
user<< "<span style='color: #ff0000;'><b>ERROR:</b> Unable to locate user.\nABORTING...</span>"
return 0
if(!istype(user.head, /obj/item/clothing/head/helmet/space/space_ninja))
user<< "<span style='color: #ff0000;'><b>ERROR:</b> Unable to locate hood.\nABORTING...</span>"
return 0
if(!istype(user.gloves, /obj/item/clothing/gloves/space_ninja))
user<< "<span style='color: #ff0000;'><b>ERROR:</b> Unable to locate gloves.\nABORTING...</span>"
return 0
if(!istype(user.shoes, /obj/item/clothing/shoes/space_ninja))
user<< "<span style='color: #ff0000;'><b>ERROR:</b> Unable to locate foot gear.\nABORTING...</span>"
return 0
if(!istype(user.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja))
user<< "<span style='color: #ff0000;'><b>ERROR:</b> Unable to locate mask.\nABORTING...</span>"
return 0
if(!istype(user.glasses, /obj/item/clothing/glasses/hud/space_ninja))
user<< "<span style='color: #ff0000;'><b>WARNING:</b> Unable to locate eye gear, vision enhancement unavailable.</span><span style='color: #0000ff;'>\nProceeding...</span>"
else
suitGlasses = user.glasses
suitGlasses.enabled = 1
suitGlasses.icon_state = "cybereye-green"
suitHood = user.head
suitMask = user.wear_mask
suitGloves = user.gloves
suitShoes = user.shoes
suitOccupant = user
flags |= NODROP
suitHood.flags |= NODROP
suitMask.flags |= NODROP
suitGloves.flags |= NODROP
suitGloves.pickpocket = 1
suitShoes.flags |= NODROP
suitShoes.slowdown = -2
icon_state = (user.gender == MALE ? "s-ninjan" : "s-ninjanf")
suitGloves.icon_state = "s-ninjan"
suitGloves.item_state = "s-ninjan"
return 1
else
flags &= ~NODROP
suitHood.flags &= ~NODROP
suitMask.flags &= ~NODROP
if(suitGlasses)
suitGlasses.enabled = 0
suitGlasses.icon_state = "cybereye-off"
suitGloves.flags &= ~NODROP
suitGloves.pickpocket = 0
suitShoes.flags &= ~NODROP
suitShoes.slowdown = -1
icon_state = "s-ninja"
suitGloves.icon_state = "s-ninja"
suitGloves.item_state = "s-ninja"
suitHood = null
suitMask = null
suitGlasses = null
suitGloves = null
suitShoes = null
suitOccupant = null
return 1
// ** END NINJA SUIT PROCS **
// **BEGIN NINJA GLASSES PROCS**
/obj/item/clothing/glasses/hud/space_ninja/process_hud(var/mob/M) // Antag HUD processing.
if(antagHUDEnabled) // We only process if the antag-vision mode is enabled.
if(!M) return
if(!M.client) return
var/client/C = M.client
for(var/mob/living/carbon/human/target in view(get_turf(M)))
if(M.see_invisible < target.invisibility)
continue
if(!C) continue
C.images += target.hud_list[SPECIALROLE_HUD]
/obj/item/clothing/glasses/hud/space_ninja/verb/modifyHUD(mob/user as mob)
set category = "Space Ninja - Equiptment"
set name = "Modify Vision"
if(usr.mind.special_role != "Ninja")
usr << "<span style='color: #ff0000;'><b>FĆAL �Rr�R</b>: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked."
return
if(!enabled) // If the Ninja's suit is on and connected.
usr << "<span style='color: #ff0000;'><b>ERROR: </b>No power supply detected, cannot activate optical implant.</span>"
return
if(!user) // The user var is, so far as I can tell, required to refresh the window after each click.
user = usr
/*
* Each vision type the Ninja enables will drain more from his suit's battery per tick.
* For instance, if the Ninja were to rn around with thermals and AntagHUD on he would be losing an additional 10 energy per tick.
* Current vision modes are:
* - Night
* - Meson (Turfs)
* - Material (Objects)
* - Thermal (Mobs)
* - Antag HUD
*
* -Dave
*/
var/dat = {"
<center>Night Vision (2E) - <a href='?src=\ref[src];night=night'>[darkness_view ? "ENABLED" : "DISABLED"]</a><br>
Meson Scanner (2E) - <a href='?src=\ref[src];meson=meson'>[mesonEnabled ? "ENABLED" : "DISABLED"]</a><br>
Material Scanner (4E) - <a href='?src=\ref[src];material=material'>[materialEnabled ? "ENABLED" : "DISABLED"]</a><br>
Thermal Scanner (4E) - <a href='?src=\ref[src];thermal=thermal'>[thermalEnabled ? "ENABLED" : "DISABLED"]</a><br>
Threat Identification HUD (6E) - <a href='?src=\ref[src];antagHUD=antagHUD'>[antagHUDEnabled ? "ENABLED" : "DISABLED"]</a></center>
"}
var/datum/browser/popup = new(user, "SpiderOS", "SpiderOS Optical Interface", 310, 150)
popup.set_content(dat)
popup.open()
/obj/item/clothing/glasses/hud/space_ninja/Topic(href, href_list)
if(usr.stat != 0 || !enabled)
return 1
if(href_list["night"])
darkness_view = (darkness_view ? 0 : 8)
see_darkness = (darkness_view ? 0 : 1)
energyConsumption += (darkness_view ? 2 : -2)
usr << "Light amplification <span style='color: #0000ff;'><b>[(darkness_view ? "ENABLED" : "DISABLED")]</b></span>."
else if(href_list["meson"])
mesonEnabled = (mesonEnabled ? 0 : 1)
if(mesonEnabled)
vision_flags |= SEE_TURFS
else
vision_flags &= ~SEE_TURFS
energyConsumption += (mesonEnabled ? 2 : -2)
usr << "Meson scanning <span style='color: #0000ff;'><b>[(mesonEnabled ? "ENABLED" : "DISABLED")]</b></span>."
else if(href_list["material"])
materialEnabled = (materialEnabled ? 0 : 1)
if(materialEnabled)
vision_flags |= SEE_OBJS
else
vision_flags &= ~SEE_OBJS
energyConsumption += (materialEnabled ? 4 : -4)
usr << "Material scanning <span style='color: #0000ff;'><b>[(materialEnabled ? "ENABLED" : "DISABLED")]</b></span>."
else if(href_list["thermal"])
thermalEnabled = (thermalEnabled ? 0 : 1)
if(thermalEnabled)
vision_flags |= SEE_MOBS
invisa_view = 2
else
vision_flags &= ~SEE_MOBS
invisa_view = 0
energyConsumption += (thermalEnabled ? 4 : -4)
usr << "Thermal scanning <span style='color: #0000ff;'><b>[(thermalEnabled ? "ENABLED" : "DISABLED")]</b></span>."
else if(href_list["antagHUD"])
antagHUDEnabled = (antagHUDEnabled ? 0 : 1)
energyConsumption += (antagHUDEnabled ? 6 : -6)
usr << "Threat identification HUD <span style='color: #0000ff;'><b>[(antagHUDEnabled ? "ENABLED" : "DISABLED")]</b></span>."
modifyHUD(usr) // Re-call the verb to get a fresh version of the window.
return
// **END NINJA GLASSES PROCS**
+38 -1
View File
@@ -243,4 +243,41 @@
desc = "Pukish armor."
icon_state = "tdgreen"
item_state = "tdgreen"
siemens_coefficient = 1
siemens_coefficient = 1
//Non-hardsuit ERT armor.
/obj/item/clothing/suit/armor/vest/ert
name = "emergency response team armor"
desc = "A set of armor worn by members of the Nanotrasen Emergency Response Team."
icon_state = "ertarmor_cmd"
item_state = "armor"
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 20, bio = 0, rad = 0)
//Commander
/obj/item/clothing/suit/armor/vest/ert/command
name = "emergency response team commander armor"
desc = "A set of armor worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights."
//Security
/obj/item/clothing/suit/armor/vest/ert/security
name = "emergency response team security armor"
desc = "A set of armor worn by security members of the Nanotrasen Emergency Response Team. Has red highlights."
icon_state = "ertarmor_sec"
//Engineer
/obj/item/clothing/suit/armor/vest/ert/engineer
name = "emergency response team engineer armor"
desc = "A set of armor worn by engineering members of the Nanotrasen Emergency Response Team. Has orange highlights."
icon_state = "ertarmor_eng"
//Medical
/obj/item/clothing/suit/armor/vest/ert/medical
name = "emergency response team medical armor"
desc = "A set of armor worn by medical members of the Nanotrasen Emergency Response Team. Has red and white highlights."
icon_state = "ertarmor_med"
//Janitorial
/obj/item/clothing/suit/armor/vest/ert/janitor
name = "emergency response team janitor armor"
desc = "A set of armor worn by janitorial members of the Nanotrasen Emergency Response Team. Has red and white highlights."
icon_state = "ertarmor_jan"
+28
View File
@@ -228,6 +228,34 @@
return
usr.update_inv_wear_suit() //so our overlays update
/obj/item/clothing/suit/storage/ntrep
name = "NanoTrasen Representative Jacket"
desc = "A fancy black jacket, standard issue to NanoTrasen Represenatives."
icon_state = "ntrep"
item_state = "ia_jacket"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
verb/toggle()
set name = "Toggle Coat Buttons"
set category = "Object"
set src in usr
if(!usr.canmove || usr.stat || usr.restrained())
return 0
switch(icon_state)
if("ntrep_open")
src.icon_state = "ntrep"
usr << "You button up the jacket."
if("ntrep")
src.icon_state = "ntrep_open"
usr << "You unbutton the jacket."
else
usr << "You attempt to button-up the velcro on your [src], before promptly realising how retarded you are."
return
usr.update_inv_wear_suit() //so our overlays update
//Medical
/obj/item/clothing/suit/storage/fr_jacket
name = "first responder jacket"
@@ -131,6 +131,18 @@
"Vox" = 'icons/mob/species/vox/uniform.dmi'
)
/obj/item/clothing/under/rank/ntrep
desc = "A well-ironed dress shirt and matching set of black pants."
name = "dress shirt"
icon_state = "internalaffairs"
item_state = "internalaffairs"
_color = "internalaffairs"
flags = ONESIZEFITSALL
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/uniform.dmi'
)
/obj/item/clothing/under/rank/janitor
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
+8 -1
View File
@@ -109,6 +109,14 @@
displays_id = 0
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/blueshield
name = "blueshield uniform"
desc = "A short-sleeved black uniform, paired with grey digital-camo cargo pants. Standard issue to Blueshield officers."
icon_state = "ert_uniform"
item_state = "bl_suit"
_color = "ert_uniform"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/under/space
name = "\improper NASA jumpsuit"
desc = "It has a NASA logo on it and is made of space-proofed materials."
@@ -652,4 +660,3 @@
icon_state = "griffin"
_color = "griffin"
flags = NODROP
+1 -1
View File
@@ -342,6 +342,6 @@
return accesses
authenticate()
if(access_cent_captain in reader.access)
if(access_cent_commander in reader.access)
return 1
return 0
+2 -2
View File
@@ -5,7 +5,7 @@
icon = 'icons/obj/computer.dmi'
icon_state = "aiupload"
density = 1
req_one_access = list(access_hop, access_captain, access_cent_captain)
req_one_access = list(access_hop, access_captain, access_cent_commander)
var/receipt_num
var/machine_id = ""
var/obj/item/weapon/card/id/held_card
@@ -16,7 +16,7 @@
proc/get_access_level()
if (!held_card)
return 0
if(access_cent_captain in held_card.access)
if(access_cent_commander in held_card.access)
return 2
else if(access_hop in held_card.access || access_captain in held_card.access)
return 1
+1 -1
View File
@@ -179,7 +179,7 @@
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card))
var/obj/item/weapon/card/id/C = I
if(access_cent_captain in C.access || access_hop in C.access || access_captain in C.access)
if(access_cent_commander in C.access || access_hop in C.access || access_captain in C.access)
access_code = 0
usr << "\icon[src]<span class='info'>Access code reset to 0.</span>"
else if (istype(I, /obj/item/weapon/card/emag))
+1 -1
View File
@@ -299,7 +299,7 @@
feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/datum/event/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in!
/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in!
var/area/candidate = null
var/list/safe_areas = list(
+1 -1
View File
@@ -349,7 +349,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
/obj/item/clothing/mask/gas/voice, /obj/item/clothing/glasses/thermal,\
/obj/item/device/chameleon, /obj/item/weapon/card/emag,\
/obj/item/weapon/storage/toolbox/syndicate, /obj/item/weapon/aiModule,\
/obj/item/device/radio/headset/syndicate, /obj/item/weapon/plastique,\
/obj/item/device/radio/headset/syndicate, /obj/item/weapon/c4,\
/obj/item/device/powersink, /obj/item/weapon/storage/box/syndie_kit,\
/obj/item/toy/syndicateballoon, /obj/item/weapon/gun/energy/laser/captain,\
/obj/item/weapon/hand_tele, /obj/item/weapon/rcd, /obj/item/weapon/tank/jetpack,\
+427
View File
@@ -0,0 +1,427 @@
/obj/machinery/candy_maker
name = "candy machine"
desc = "The stuff of nightmares for a dentist."
icon = 'icons/obj/cooking_machines.dmi'
icon_state = "candymaker_off"
layer = 2.9
density = 1
anchored = 1
use_power = 1
idle_power_usage = 5
active_power_usage = 100
flags = OPENCONTAINER | NOREACT
var/operating = 0 // Is it on?
var/dirty = 0 // = {0..100} Does it need cleaning?
var/broken = 0 // ={0,1,2} How broken is it???
var/global/list/datum/recipe/available_recipes // List of the recipes you can use
var/global/list/acceptable_items // List of the items you can put in
var/global/list/acceptable_reagents // List of the reagents you can put in
var/global/max_n_of_items = 0
var/efficiency
// see code/modules/food/recipes_candy.dm for recipes
/*******************
* Initialising
********************/
/obj/machinery/candy_maker/New()
//..() //do not need this
reagents = new/datum/reagents(100)
reagents.my_atom = src
if (!available_recipes)
available_recipes = new
for (var/type in (typesof(/datum/recipe/candy)-/datum/recipe/candy))
available_recipes+= new type
acceptable_items = new
acceptable_reagents = new
for (var/datum/recipe/candy/recipe in available_recipes)
for (var/item in recipe.items)
acceptable_items |= item
for (var/reagent in recipe.reagents)
acceptable_reagents |= reagent
if (recipe.items)
max_n_of_items = max(max_n_of_items,recipe.items.len)
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/candy_maker(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null, 5)
RefreshParts()
/obj/machinery/candy_maker/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/candy_maker(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator/pico(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null, 5)
RefreshParts()
/obj/machinery/candy_maker/RefreshParts()
var/E
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
E += M.rating
efficiency = E
/*******************
* Item Adding
********************/
/obj/machinery/candy_maker/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(operating)
return
if(!broken && dirty < 100)
if(default_deconstruction_screwdriver(user, "candymaker_open", "candymaker_off", O))
return
if(exchange_parts(user, O))
return
if(istype(O, /obj/item/weapon/wrench))
playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
if(anchored)
anchored = 0
user << "<span class='caution'>The [src] can now be moved.</span>"
return
else if(!anchored)
anchored = 1
user << "<span class='caution'>The [src] is now secured.</span>"
return
default_deconstruction_crowbar(O)
if(src.broken > 0)
if(src.broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver
user.visible_message( \
"\blue [user] starts to fix part of the candy maker.", \
"\blue You start to fix part of the candy maker." \
)
if (do_after(user,20))
user.visible_message( \
"\blue [user] fixes part of the candy maker.", \
"\blue You have fixed part of the candy maker." \
)
src.broken = 1 // Fix it a bit
else if(src.broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench
user.visible_message( \
"\blue [user] starts to fix part of the candy maker.", \
"\blue You start to fix part of the candy maker." \
)
if (do_after(user,20))
user.visible_message( \
"\blue [user] fixes the candy maker.", \
"\blue You have fixed the candy maker." \
)
src.icon_state = "candymaker_off"
src.broken = 0 // Fix it!
src.dirty = 0 // just to be sure
src.flags = OPENCONTAINER
else
user << "\red It's broken!"
return 1
else if(src.dirty==100) // The candy_maker is all dirty so can't be used!
if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them
user.visible_message( \
"\blue [user] starts to clean the candy maker.", \
"\blue You start to clean the candy maker." \
)
if (do_after(user,20))
user.visible_message( \
"\blue [user] has cleaned the candy maker.", \
"\blue You have cleaned the candy maker." \
)
src.dirty = 0 // It's clean!
src.broken = 0 // just to be sure
src.icon_state = "candymaker_off"
src.flags = OPENCONTAINER
else //Otherwise bad luck!!
user << "\red It's dirty!"
return 1
else if(is_type_in_list(O,acceptable_items))
if (contents.len>=max_n_of_items)
user << "\red This [src] is full of ingredients, you cannot put more."
return 1
if (istype(O,/obj/item/stack) && O:amount>1)
new O.type (src)
O:use(1)
user.visible_message( \
"\blue [user] has added one of [O] to \the [src].", \
"\blue You add one of [O] to \the [src].")
else
// user.unEquip(O) //This just causes problems so far as I can tell. -Pete
if(!user.drop_item())
user << "<span class='notice'>\the [O] is stuck to your hand, you cannot put it in \the [src]</span>"
return 0
O.loc = src
user.visible_message( \
"\blue [user] has added \the [O] to \the [src].", \
"\blue You add \the [O] to \the [src].")
else if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
istype(O,/obj/item/weapon/reagent_containers/food/drinks) || \
istype(O,/obj/item/weapon/reagent_containers/food/condiment) \
)
if (!O.reagents)
return 1
for (var/datum/reagent/R in O.reagents.reagent_list)
if (!(R.id in acceptable_reagents))
user << "\red Your [O] contains components unsuitable for cookery."
return 1
//G.reagents.trans_to(src,G.amount_per_transfer_from_this)
else if(istype(O,/obj/item/weapon/grab))
var/obj/item/weapon/grab/G = O
user << "\red This is ridiculous. You can not fit \the [G.affecting] in this [src]."
return 1
else
user << "\red You have no idea what you can cook with this [O]."
return 1
src.updateUsrDialog()
/obj/machinery/candy_maker/attack_paw(mob/user as mob)
return src.attack_hand(user)
/obj/machinery/candy_maker/attack_ai(mob/user as mob)
return 0
/obj/machinery/candy_maker/attack_hand(mob/user as mob)
user.set_machine(src)
interact(user)
/*******************
* candy_maker Menu
********************/
/obj/machinery/candy_maker/interact(mob/user as mob) // The Candy Maker Menu
if(panel_open || !anchored)
return
var/dat = ""
if(src.broken > 0)
dat = {"<TT>Bzzzzttttt</TT>"}
else if(src.operating)
var/whimsy_word = pick("Wonderizing", "Scrumpdiddlyumptiousification", "Miracle-coating", "Flavorifaction")
dat = {"<TT>[whimsy_word] in progress!<BR>Please wait...!</TT>"}
else if(src.dirty==100)
dat = {"<TT>This candy maker is dirty!<BR>Please clean it before use!</TT>"}
else
var/list/items_counts = new
var/list/items_measures = new
var/list/items_measures_p = new
for (var/obj/O in contents)
var/display_name = O.name
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
items_measures[display_name] = "egg"
items_measures_p[display_name] = "eggs"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
items_measures[display_name] = "tofu chunk"
items_measures_p[display_name] = "tofu chunks"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
items_measures[display_name] = "slab of meat"
items_measures_p[display_name] = "slabs of meat"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
display_name = "Turnovers"
items_measures[display_name] = "turnover"
items_measures_p[display_name] = "turnovers"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
items_measures[display_name] = "fillet of meat"
items_measures_p[display_name] = "fillets of meat"
items_counts[display_name]++
for (var/O in items_counts)
var/N = items_counts[O]
if (!(O in items_measures))
dat += {"<B>[capitalize(O)]:</B> [N] [lowertext(O)]\s<BR>"}
else
if (N==1)
dat += {"<B>[capitalize(O)]:</B> [N] [items_measures[O]]<BR>"}
else
dat += {"<B>[capitalize(O)]:</B> [N] [items_measures_p[O]]<BR>"}
for (var/datum/reagent/R in reagents.reagent_list)
var/display_name = R.name
if (R.id == "capsaicin")
display_name = "Hotsauce"
if (R.id == "frostoil")
display_name = "Coldsauce"
dat += {"<B>[display_name]:</B> [R.volume] unit\s<BR>"}
if (items_counts.len==0 && reagents.reagent_list.len==0)
dat = {"<B>The candy maker is empty</B><BR>"}
else
dat = {"<b>Ingredients:</b><br>[dat]"}
dat += {"<HR><BR>\
<A href='?src=\ref[src];action=cook'>Turn on!<BR>\
<A href='?src=\ref[src];action=dispose'>Eject ingredients!<BR>\
"}
user << browse("<HEAD><TITLE>Candy Maker Controls</TITLE></HEAD><TT>[dat]</TT>", "window=candy_maker")
onclose(user, "candy_maker")
return
/***********************************
* candy_maker Menu Handling/Cooking
************************************/
/obj/machinery/candy_maker/proc/cook()
if(stat & (NOPOWER|BROKEN))
return
start()
if (reagents.total_volume==0 && !(locate(/obj) in contents)) //dry run
if (!wzhzhzh(10))
abort()
return
stop()
return
var/datum/recipe/recipe = select_recipe(available_recipes,src)
var/obj/cooked
var/obj/byproduct
if (!recipe)
dirty += 1
if (prob(max(10,dirty*5)))
if (!wzhzhzh(4))
abort()
return
muck_start()
wzhzhzh(4)
muck_finish()
cooked = fail()
cooked.loc = src.loc
return
else if (has_extra_item())
if (!wzhzhzh(4))
abort()
return
broke()
cooked = fail()
cooked.loc = src.loc
return
else
if (!wzhzhzh(10))
abort()
return
stop()
cooked = fail()
cooked.loc = src.loc
return
else
var/halftime = round(recipe.time/10/2)
if (!wzhzhzh(halftime))
abort()
return
if (!wzhzhzh(halftime))
abort()
cooked = fail()
cooked.loc = src.loc
return
cooked = recipe.make_food(src)
byproduct = recipe.get_byproduct()
stop()
if(cooked)
cooked.loc = src.loc
for(var/i=1,i<efficiency,i++)
cooked = new cooked.type(loc)
if(byproduct)
byproduct.loc = src.loc
byproduct = new byproduct.type(loc)
return
/obj/machinery/candy_maker/proc/wzhzhzh(var/seconds as num)
for (var/i=1 to seconds)
if (stat & (NOPOWER|BROKEN))
return 0
use_power(500)
sleep(10)
return 1
/obj/machinery/candy_maker/proc/has_extra_item()
for (var/obj/O in contents)
if ( \
!istype(O,/obj/item/weapon/reagent_containers/food) && \
!istype(O, /obj/item/weapon/grown) \
)
return 1
return 0
/obj/machinery/candy_maker/proc/start()
src.visible_message("\blue The candy maker turns on.", "\blue You hear a candy maker.")
src.operating = 1
src.icon_state = "candymaker_on"
src.updateUsrDialog()
/obj/machinery/candy_maker/proc/abort()
src.operating = 0 // Turn it off again aferwards
src.icon_state = "candymaker_off"
src.updateUsrDialog()
/obj/machinery/candy_maker/proc/stop()
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
src.operating = 0 // Turn it off again aferwards
src.icon_state = "candymaker_off"
src.updateUsrDialog()
/obj/machinery/candy_maker/proc/dispose()
for (var/obj/O in contents)
O.loc = src.loc
if (src.reagents.total_volume)
src.dirty++
src.reagents.clear_reagents()
usr << "\blue You dispose of the candy maker contents."
src.updateUsrDialog()
/obj/machinery/candy_maker/proc/muck_start()
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) // Play a splat sound
src.icon_state = "candymaker_dirty" // Make it look dirty!!
/obj/machinery/candy_maker/proc/muck_finish()
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
src.visible_message("\red The candy maker gets covered in muck!")
src.dirty = 100 // Make it dirty so it can't be used util cleaned
src.flags = null //So you can't add condiments
src.icon_state = "candymaker_dirty" // Make it look dirty too
src.operating = 0 // Turn it off again aferwards
src.updateUsrDialog()
/obj/machinery/candy_maker/proc/broke()
var/datum/effect/effect/system/spark_spread/s = new
s.set_up(2, 1, src)
s.start()
src.icon_state = "candymaker_broke" // Make it look all busted up and shit
src.visible_message("\red The candy maker breaks!") //Let them know they're stupid
src.broken = 2 // Make it broken so it can't be used util fixed
src.flags = null //So you can't add condiments
src.operating = 0 // Turn it off again aferwards
src.updateUsrDialog()
/obj/machinery/candy_maker/proc/fail()
var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/ffuu = new(src)
var/amount = 0
for (var/obj/O in contents-ffuu)
amount++
if (O.reagents)
var/id = O.reagents.get_master_reagent_id()
if (id)
amount+=O.reagents.get_reagent_amount(id)
del(O)
src.reagents.clear_reagents()
ffuu.reagents.add_reagent("carbon", amount)
ffuu.reagents.add_reagent("toxin", amount/10)
return ffuu
/obj/machinery/candy_maker/Topic(href, href_list)
if(..() || panel_open)
return
usr.set_machine(src)
if(src.operating)
src.updateUsrDialog()
return
switch(href_list["action"])
if ("cook")
cook()
if ("dispose")
dispose()
return
+424
View File
@@ -0,0 +1,424 @@
/obj/machinery/grill
name = "grill"
desc = "Backyard grilling, IN SPACE."
icon = 'icons/obj/cooking_machines.dmi'
icon_state = "grill_off"
layer = 2.9
density = 1
anchored = 1
use_power = 1
idle_power_usage = 5
active_power_usage = 100
flags = OPENCONTAINER | NOREACT
var/operating = 0 // Is it on?
var/dirty = 0 // = {0..100} Does it need cleaning?
var/broken = 0 // ={0,1,2} How broken is it???
var/global/list/datum/recipe/available_recipes // List of the recipes you can use
var/global/list/acceptable_items // List of the items you can put in
var/global/list/acceptable_reagents // List of the reagents you can put in
var/global/max_n_of_items = 0
var/efficiency
// see code/modules/food/recipes_grill.dm for recipes
/*******************
* Initialising
********************/
/obj/machinery/grill/New()
//..() //do not need this
reagents = new/datum/reagents(100)
reagents.my_atom = src
if (!available_recipes)
available_recipes = new
for (var/type in (typesof(/datum/recipe/grill)-/datum/recipe/grill))
available_recipes+= new type
acceptable_items = new
acceptable_reagents = new
for (var/datum/recipe/grill/recipe in available_recipes)
for (var/item in recipe.items)
acceptable_items |= item
for (var/reagent in recipe.reagents)
acceptable_reagents |= reagent
if (recipe.items)
max_n_of_items = max(max_n_of_items,recipe.items.len)
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/grill(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null, 5)
RefreshParts()
/obj/machinery/grill/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/grill(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null, 5)
RefreshParts()
/obj/machinery/grill/RefreshParts()
var/E
for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts)
E += M.rating
efficiency = round((E/2), 1) // There's 2 lasers, so halve the effect on the efficiency to keep it balanced
/*******************
* Item Adding
********************/
/obj/machinery/grill/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(operating)
return
if(!broken && dirty < 100)
if(default_deconstruction_screwdriver(user, "grill_open", "grill_off", O))
return
if(exchange_parts(user, O))
return
if(istype(O, /obj/item/weapon/wrench))
playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
if(anchored)
anchored = 0
user << "<span class='caution'>The [src] can now be moved.</span>"
return
else if(!anchored)
anchored = 1
user << "<span class='caution'>The [src] is now secured.</span>"
return
default_deconstruction_crowbar(O)
if(src.broken > 0)
if(src.broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver
user.visible_message( \
"\blue [user] starts to fix part of the grill.", \
"\blue You start to fix part of the grill." \
)
if (do_after(user,20))
user.visible_message( \
"\blue [user] fixes part of the grill.", \
"\blue You have fixed part of the grill." \
)
src.broken = 1 // Fix it a bit
else if(src.broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench
user.visible_message( \
"\blue [user] starts to fix part of the grill.", \
"\blue You start to fix part of the grill." \
)
if (do_after(user,20))
user.visible_message( \
"\blue [user] fixes the grill.", \
"\blue You have fixed the grill." \
)
src.icon_state = "grill_off"
src.broken = 0 // Fix it!
src.dirty = 0 // just to be sure
src.flags = OPENCONTAINER
else
user << "\red It's broken!"
return 1
else if(src.dirty==100) // The grill is all dirty so can't be used!
if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them
user.visible_message( \
"\blue [user] starts to clean the grill.", \
"\blue You start to clean the grill." \
)
if (do_after(user,20))
user.visible_message( \
"\blue [user] has cleaned the grill.", \
"\blue You have cleaned the grill." \
)
src.dirty = 0 // It's clean!
src.broken = 0 // just to be sure
src.icon_state = "grill_off"
src.flags = OPENCONTAINER
else //Otherwise bad luck!!
user << "\red It's dirty!"
return 1
else if(is_type_in_list(O,acceptable_items))
if (contents.len>=max_n_of_items)
user << "\red This [src] is full of ingredients, you cannot put more."
return 1
if (istype(O,/obj/item/stack) && O:amount>1)
new O.type (src)
O:use(1)
user.visible_message( \
"\blue [user] has added one of [O] to \the [src].", \
"\blue You add one of [O] to \the [src].")
else
// user.unEquip(O) //This just causes problems so far as I can tell. -Pete
if(!user.drop_item())
user << "<span class='notice'>\the [O] is stuck to your hand, you cannot put it in \the [src]</span>"
return 0
O.loc = src
user.visible_message( \
"\blue [user] has added \the [O] to \the [src].", \
"\blue You add \the [O] to \the [src].")
else if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
istype(O,/obj/item/weapon/reagent_containers/food/drinks) || \
istype(O,/obj/item/weapon/reagent_containers/food/condiment) \
)
if (!O.reagents)
return 1
for (var/datum/reagent/R in O.reagents.reagent_list)
if (!(R.id in acceptable_reagents))
user << "\red Your [O] contains components unsuitable for cookery."
return 1
//G.reagents.trans_to(src,G.amount_per_transfer_from_this)
else if(istype(O,/obj/item/weapon/grab))
var/obj/item/weapon/grab/G = O
user << "\red This is ridiculous. You can not fit \the [G.affecting] in this [src]."
return 1
else
user << "\red You have no idea what you can cook with this [O]."
return 1
src.updateUsrDialog()
/obj/machinery/grill/attack_paw(mob/user as mob)
return src.attack_hand(user)
/obj/machinery/grill/attack_ai(mob/user as mob)
return 0
/obj/machinery/grill/attack_hand(mob/user as mob)
user.set_machine(src)
interact(user)
/*******************
* grill Menu
********************/
/obj/machinery/grill/interact(mob/user as mob) // The grill Menu
if(panel_open || !anchored)
return
var/dat = ""
if(src.broken > 0)
dat = {"<TT>Bzzzzttttt</TT>"}
else if(src.operating)
dat = {"<TT>Grilling in progress!<BR>Please wait...!</TT>"}
else if(src.dirty==100)
dat = {"<TT>This grill is dirty!<BR>Please clean it before use!</TT>"}
else
var/list/items_counts = new
var/list/items_measures = new
var/list/items_measures_p = new
for (var/obj/O in contents)
var/display_name = O.name
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
items_measures[display_name] = "egg"
items_measures_p[display_name] = "eggs"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
items_measures[display_name] = "tofu chunk"
items_measures_p[display_name] = "tofu chunks"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
items_measures[display_name] = "slab of meat"
items_measures_p[display_name] = "slabs of meat"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
display_name = "Turnovers"
items_measures[display_name] = "turnover"
items_measures_p[display_name] = "turnovers"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
items_measures[display_name] = "fillet of meat"
items_measures_p[display_name] = "fillets of meat"
items_counts[display_name]++
for (var/O in items_counts)
var/N = items_counts[O]
if (!(O in items_measures))
dat += {"<B>[capitalize(O)]:</B> [N] [lowertext(O)]\s<BR>"}
else
if (N==1)
dat += {"<B>[capitalize(O)]:</B> [N] [items_measures[O]]<BR>"}
else
dat += {"<B>[capitalize(O)]:</B> [N] [items_measures_p[O]]<BR>"}
for (var/datum/reagent/R in reagents.reagent_list)
var/display_name = R.name
if (R.id == "capsaicin")
display_name = "Hotsauce"
if (R.id == "frostoil")
display_name = "Coldsauce"
dat += {"<B>[display_name]:</B> [R.volume] unit\s<BR>"}
if (items_counts.len==0 && reagents.reagent_list.len==0)
dat = {"<B>The grill is empty</B><BR>"}
else
dat = {"<b>Ingredients:</b><br>[dat]"}
dat += {"<HR><BR>\
<A href='?src=\ref[src];action=cook'>Turn on!<BR>\
<A href='?src=\ref[src];action=dispose'>Eject ingredients!<BR>\
"}
user << browse("<HEAD><TITLE>grill Controls</TITLE></HEAD><TT>[dat]</TT>", "window=grill")
onclose(user, "grill")
return
/***********************************
* grill Menu Handling/Cooking
************************************/
/obj/machinery/grill/proc/cook()
if(stat & (NOPOWER|BROKEN))
return
start()
if (reagents.total_volume==0 && !(locate(/obj) in contents)) //dry run
if (!wzhzhzh(10))
abort()
return
stop()
return
var/datum/recipe/recipe = select_recipe(available_recipes,src)
var/obj/cooked
if (!recipe)
dirty += 1
if (prob(max(10,dirty*5)))
if (!wzhzhzh(4))
abort()
return
muck_start()
wzhzhzh(4)
muck_finish()
cooked = fail()
cooked.loc = src.loc
return
else if (has_extra_item())
if (!wzhzhzh(4))
abort()
return
broke()
cooked = fail()
cooked.loc = src.loc
return
else
if (!wzhzhzh(10))
abort()
return
stop()
cooked = fail()
cooked.loc = src.loc
return
else
var/halftime = round(recipe.time/10/2)
if (!wzhzhzh(halftime))
abort()
return
if (!wzhzhzh(halftime))
abort()
cooked = fail()
cooked.loc = src.loc
return
cooked = recipe.make_food(src)
stop()
if(cooked)
cooked.loc = src.loc
for(var/i=1,i<efficiency,i++)
cooked = new cooked.type(loc)
return
/obj/machinery/grill/proc/wzhzhzh(var/seconds as num)
for (var/i=1 to seconds)
if (stat & (NOPOWER|BROKEN))
return 0
use_power(500)
sleep(10)
return 1
/obj/machinery/grill/proc/has_extra_item()
for (var/obj/O in contents)
if ( \
!istype(O,/obj/item/weapon/reagent_containers/food) && \
!istype(O, /obj/item/weapon/grown) \
)
return 1
return 0
/obj/machinery/grill/proc/start()
src.visible_message("\blue The grill turns on.", "\blue You hear a grill.")
src.operating = 1
src.icon_state = "grill_on"
src.updateUsrDialog()
/obj/machinery/grill/proc/abort()
src.operating = 0 // Turn it off again aferwards
src.icon_state = "grill_off"
src.updateUsrDialog()
/obj/machinery/grill/proc/stop()
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
src.operating = 0 // Turn it off again aferwards
src.icon_state = "grill_off"
src.updateUsrDialog()
/obj/machinery/grill/proc/dispose()
for (var/obj/O in contents)
O.loc = src.loc
if (src.reagents.total_volume)
src.dirty++
src.reagents.clear_reagents()
usr << "\blue You dispose of the grill contents."
src.updateUsrDialog()
/obj/machinery/grill/proc/muck_start()
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) // Play a splat sound
src.icon_state = "grill_dirty" // Make it look dirty!!
/obj/machinery/grill/proc/muck_finish()
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
src.visible_message("\red The grill gets covered in muck!")
src.dirty = 100 // Make it dirty so it can't be used util cleaned
src.flags = null //So you can't add condiments
src.icon_state = "grill_dirty" // Make it look dirty too
src.operating = 0 // Turn it off again aferwards
src.updateUsrDialog()
/obj/machinery/grill/proc/broke()
var/datum/effect/effect/system/spark_spread/s = new
s.set_up(2, 1, src)
s.start()
src.icon_state = "grill_broke" // Make it look all busted up and shit
src.visible_message("\red The grill breaks!") //Let them know they're stupid
src.broken = 2 // Make it broken so it can't be used util fixed
src.flags = null //So you can't add condiments
src.operating = 0 // Turn it off again aferwards
src.updateUsrDialog()
/obj/machinery/grill/proc/fail()
var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/ffuu = new(src)
var/amount = 0
for (var/obj/O in contents-ffuu)
amount++
if (O.reagents)
var/id = O.reagents.get_master_reagent_id()
if (id)
amount+=O.reagents.get_reagent_amount(id)
del(O)
src.reagents.clear_reagents()
ffuu.reagents.add_reagent("carbon", amount)
ffuu.reagents.add_reagent("toxin", amount/10)
return ffuu
/obj/machinery/grill/Topic(href, href_list)
if(..() || panel_open)
return
usr.set_machine(src)
if(src.operating)
src.updateUsrDialog()
return
switch(href_list["action"])
if ("cook")
cook()
if ("dispose")
dispose()
return
+424
View File
@@ -0,0 +1,424 @@
/obj/machinery/oven
name = "oven"
desc = "Cookies are ready, dear."
icon = 'icons/obj/cooking_machines.dmi'
icon_state = "oven_off"
layer = 2.9
density = 1
anchored = 1
use_power = 1
idle_power_usage = 5
active_power_usage = 100
flags = OPENCONTAINER | NOREACT
var/operating = 0 // Is it on?
var/dirty = 0 // = {0..100} Does it need cleaning?
var/broken = 0 // ={0,1,2} How broken is it???
var/global/list/datum/recipe/available_recipes // List of the recipes you can use
var/global/list/acceptable_items // List of the items you can put in
var/global/list/acceptable_reagents // List of the reagents you can put in
var/global/max_n_of_items = 0
var/efficiency
// see code/modules/food/recipes_oven.dm for recipes
/*******************
* Initialising
********************/
/obj/machinery/oven/New()
//..() //do not need this
reagents = new/datum/reagents(100)
reagents.my_atom = src
if (!available_recipes)
available_recipes = new
for (var/type in (typesof(/datum/recipe/oven)-/datum/recipe/oven))
available_recipes+= new type
acceptable_items = new
acceptable_reagents = new
for (var/datum/recipe/oven/recipe in available_recipes)
for (var/item in recipe.items)
acceptable_items |= item
for (var/reagent in recipe.reagents)
acceptable_reagents |= reagent
if (recipe.items)
max_n_of_items = max(max_n_of_items,recipe.items.len)
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/oven(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null, 5)
RefreshParts()
/obj/machinery/oven/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/oven(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null)
component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null, 5)
RefreshParts()
/obj/machinery/oven/RefreshParts()
var/E
for(var/obj/item/weapon/stock_parts/micro_laser/M in component_parts)
E += M.rating
efficiency = round((E/2), 1) // There's 2 lasers, so halve the effect on the efficiency to keep it balanced
/*******************
* Item Adding
********************/
/obj/machinery/oven/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(operating)
return
if(!broken && dirty < 100)
if(default_deconstruction_screwdriver(user, "oven_open", "oven_off", O))
return
if(exchange_parts(user, O))
return
if(istype(O, /obj/item/weapon/wrench))
playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
if(anchored)
anchored = 0
user << "<span class='caution'>The [src] can now be moved.</span>"
return
else if(!anchored)
anchored = 1
user << "<span class='caution'>The [src] is now secured.</span>"
return
default_deconstruction_crowbar(O)
if(src.broken > 0)
if(src.broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver
user.visible_message( \
"\blue [user] starts to fix part of the oven.", \
"\blue You start to fix part of the oven." \
)
if (do_after(user,20))
user.visible_message( \
"\blue [user] fixes part of the oven.", \
"\blue You have fixed part of the oven." \
)
src.broken = 1 // Fix it a bit
else if(src.broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench
user.visible_message( \
"\blue [user] starts to fix part of the oven.", \
"\blue You start to fix part of the oven." \
)
if (do_after(user,20))
user.visible_message( \
"\blue [user] fixes the oven.", \
"\blue You have fixed the oven." \
)
src.icon_state = "oven_off"
src.broken = 0 // Fix it!
src.dirty = 0 // just to be sure
src.flags = OPENCONTAINER
else
user << "\red It's broken!"
return 1
else if(src.dirty==100) // The oven is all dirty so can't be used!
if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them
user.visible_message( \
"\blue [user] starts to clean the oven.", \
"\blue You start to clean the oven." \
)
if (do_after(user,20))
user.visible_message( \
"\blue [user] has cleaned the oven.", \
"\blue You have cleaned the oven." \
)
src.dirty = 0 // It's clean!
src.broken = 0 // just to be sure
src.icon_state = "oven_off"
src.flags = OPENCONTAINER
else //Otherwise bad luck!!
user << "\red It's dirty!"
return 1
else if(is_type_in_list(O,acceptable_items))
if (contents.len>=max_n_of_items)
user << "\red This [src] is full of ingredients, you cannot put more."
return 1
if (istype(O,/obj/item/stack) && O:amount>1)
new O.type (src)
O:use(1)
user.visible_message( \
"\blue [user] has added one of [O] to \the [src].", \
"\blue You add one of [O] to \the [src].")
else
// user.unEquip(O) //This just causes problems so far as I can tell. -Pete
if(!user.drop_item())
user << "<span class='notice'>\the [O] is stuck to your hand, you cannot put it in \the [src]</span>"
return 0
O.loc = src
user.visible_message( \
"\blue [user] has added \the [O] to \the [src].", \
"\blue You add \the [O] to \the [src].")
else if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
istype(O,/obj/item/weapon/reagent_containers/food/drinks) || \
istype(O,/obj/item/weapon/reagent_containers/food/condiment) \
)
if (!O.reagents)
return 1
for (var/datum/reagent/R in O.reagents.reagent_list)
if (!(R.id in acceptable_reagents))
user << "\red Your [O] contains components unsuitable for cookery."
return 1
//G.reagents.trans_to(src,G.amount_per_transfer_from_this)
else if(istype(O,/obj/item/weapon/grab))
var/obj/item/weapon/grab/G = O
user << "\red This is ridiculous. You can not fit \the [G.affecting] in this [src]."
return 1
else
user << "\red You have no idea what you can cook with this [O]."
return 1
src.updateUsrDialog()
/obj/machinery/oven/attack_paw(mob/user as mob)
return src.attack_hand(user)
/obj/machinery/oven/attack_ai(mob/user as mob)
return 0
/obj/machinery/oven/attack_hand(mob/user as mob)
user.set_machine(src)
interact(user)
/*******************
* oven Menu
********************/
/obj/machinery/oven/interact(mob/user as mob) // The oven Menu
if(panel_open || !anchored)
return
var/dat = ""
if(src.broken > 0)
dat = {"<TT>Bzzzzttttt</TT>"}
else if(src.operating)
dat = {"<TT>Baking in progress!<BR>Please wait...!</TT>"}
else if(src.dirty==100)
dat = {"<TT>This oven is dirty!<BR>Please clean it before use!</TT>"}
else
var/list/items_counts = new
var/list/items_measures = new
var/list/items_measures_p = new
for (var/obj/O in contents)
var/display_name = O.name
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
items_measures[display_name] = "egg"
items_measures_p[display_name] = "eggs"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
items_measures[display_name] = "tofu chunk"
items_measures_p[display_name] = "tofu chunks"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
items_measures[display_name] = "slab of meat"
items_measures_p[display_name] = "slabs of meat"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
display_name = "Turnovers"
items_measures[display_name] = "turnover"
items_measures_p[display_name] = "turnovers"
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
items_measures[display_name] = "fillet of meat"
items_measures_p[display_name] = "fillets of meat"
items_counts[display_name]++
for (var/O in items_counts)
var/N = items_counts[O]
if (!(O in items_measures))
dat += {"<B>[capitalize(O)]:</B> [N] [lowertext(O)]\s<BR>"}
else
if (N==1)
dat += {"<B>[capitalize(O)]:</B> [N] [items_measures[O]]<BR>"}
else
dat += {"<B>[capitalize(O)]:</B> [N] [items_measures_p[O]]<BR>"}
for (var/datum/reagent/R in reagents.reagent_list)
var/display_name = R.name
if (R.id == "capsaicin")
display_name = "Hotsauce"
if (R.id == "frostoil")
display_name = "Coldsauce"
dat += {"<B>[display_name]:</B> [R.volume] unit\s<BR>"}
if (items_counts.len==0 && reagents.reagent_list.len==0)
dat = {"<B>The oven is empty</B><BR>"}
else
dat = {"<b>Ingredients:</b><br>[dat]"}
dat += {"<HR><BR>\
<A href='?src=\ref[src];action=cook'>Turn on!<BR>\
<A href='?src=\ref[src];action=dispose'>Eject ingredients!<BR>\
"}
user << browse("<HEAD><TITLE>oven Controls</TITLE></HEAD><TT>[dat]</TT>", "window=oven")
onclose(user, "oven")
return
/***********************************
* oven Menu Handling/Cooking
************************************/
/obj/machinery/oven/proc/cook()
if(stat & (NOPOWER|BROKEN))
return
start()
if (reagents.total_volume==0 && !(locate(/obj) in contents)) //dry run
if (!wzhzhzh(10))
abort()
return
stop()
return
var/datum/recipe/recipe = select_recipe(available_recipes,src)
var/obj/cooked
if (!recipe)
dirty += 1
if (prob(max(10,dirty*5)))
if (!wzhzhzh(4))
abort()
return
muck_start()
wzhzhzh(4)
muck_finish()
cooked = fail()
cooked.loc = src.loc
return
else if (has_extra_item())
if (!wzhzhzh(4))
abort()
return
broke()
cooked = fail()
cooked.loc = src.loc
return
else
if (!wzhzhzh(10))
abort()
return
stop()
cooked = fail()
cooked.loc = src.loc
return
else
var/halftime = round(recipe.time/10/2)
if (!wzhzhzh(halftime))
abort()
return
if (!wzhzhzh(halftime))
abort()
cooked = fail()
cooked.loc = src.loc
return
cooked = recipe.make_food(src)
stop()
if(cooked)
cooked.loc = src.loc
for(var/i=1,i<efficiency,i++)
cooked = new cooked.type(loc)
return
/obj/machinery/oven/proc/wzhzhzh(var/seconds as num)
for (var/i=1 to seconds)
if (stat & (NOPOWER|BROKEN))
return 0
use_power(500)
sleep(10)
return 1
/obj/machinery/oven/proc/has_extra_item()
for (var/obj/O in contents)
if ( \
!istype(O,/obj/item/weapon/reagent_containers/food) && \
!istype(O, /obj/item/weapon/grown) \
)
return 1
return 0
/obj/machinery/oven/proc/start()
src.visible_message("\blue The oven turns on.", "\blue You hear a oven.")
src.operating = 1
src.icon_state = "oven_on"
src.updateUsrDialog()
/obj/machinery/oven/proc/abort()
src.operating = 0 // Turn it off again aferwards
src.icon_state = "oven_off"
src.updateUsrDialog()
/obj/machinery/oven/proc/stop()
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
src.operating = 0 // Turn it off again aferwards
src.icon_state = "oven_off"
src.updateUsrDialog()
/obj/machinery/oven/proc/dispose()
for (var/obj/O in contents)
O.loc = src.loc
if (src.reagents.total_volume)
src.dirty++
src.reagents.clear_reagents()
usr << "\blue You dispose of the oven contents."
src.updateUsrDialog()
/obj/machinery/oven/proc/muck_start()
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1) // Play a splat sound
src.icon_state = "oven_dirty" // Make it look dirty!!
/obj/machinery/oven/proc/muck_finish()
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
src.visible_message("\red The oven gets covered in muck!")
src.dirty = 100 // Make it dirty so it can't be used util cleaned
src.flags = null //So you can't add condiments
src.icon_state = "oven_dirty" // Make it look dirty too
src.operating = 0 // Turn it off again aferwards
src.updateUsrDialog()
/obj/machinery/oven/proc/broke()
var/datum/effect/effect/system/spark_spread/s = new
s.set_up(2, 1, src)
s.start()
src.icon_state = "oven_broke" // Make it look all busted up and shit
src.visible_message("\red The oven breaks!") //Let them know they're stupid
src.broken = 2 // Make it broken so it can't be used util fixed
src.flags = null //So you can't add condiments
src.operating = 0 // Turn it off again aferwards
src.updateUsrDialog()
/obj/machinery/oven/proc/fail()
var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/ffuu = new(src)
var/amount = 0
for (var/obj/O in contents-ffuu)
amount++
if (O.reagents)
var/id = O.reagents.get_master_reagent_id()
if (id)
amount+=O.reagents.get_reagent_amount(id)
del(O)
src.reagents.clear_reagents()
ffuu.reagents.add_reagent("carbon", amount)
ffuu.reagents.add_reagent("toxin", amount/10)
return ffuu
/obj/machinery/oven/Topic(href, href_list)
if(..() || panel_open)
return
usr.set_machine(src)
if(src.operating)
src.updateUsrDialog()
return
switch(href_list["action"])
if ("cook")
cook()
if ("dispose")
dispose()
return
+512
View File
@@ -0,0 +1,512 @@
/*
* /datum/recipe/candy/
* reagents = list()
* items = list()
* result = /obj/item/weapon/reagent_containers/food/snacks/
* byproduct = /obj/item/ // only set this if the recipe has a byproduct, like returning it's mould
*
* NOTE: If using a mould, make sure to list it in *BOTH* the items and byproduct lists if it is to be returned.
* Failure to list in both places will result in either consumption of the mould, or spontaneous generation of a mould.
*
*/
// ***********************************************************
// Candy Ingredients / Flavorings Recipes
// ***********************************************************
/datum/recipe/candy/chocolate_bar
reagents = list("soymilk" = 2, "coco" = 2, "sugar" = 2)
items = list()
result = /obj/item/weapon/reagent_containers/food/snacks/chocolatebar
/datum/recipe/candy/chocolate_bar2
reagents = list("milk" = 2, "coco" = 2, "sugar" = 2)
items = list()
result = /obj/item/weapon/reagent_containers/food/snacks/chocolatebar
/datum/recipe/candy/fudge
reagents = list("sugar" = 5, "cream" = 5)
items = list(/obj/item/weapon/reagent_containers/food/snacks/chocolatebar)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/fudge
/datum/recipe/candy/caramel
reagents = list("sugar" = 5, "cream" = 5)
items = list()
result = /obj/item/weapon/reagent_containers/food/snacks/candy/caramel
/datum/recipe/candy/toffee
reagents = list("sugar" = 5)
items = list(/obj/item/weapon/reagent_containers/food/snacks/flour)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/toffee
/datum/recipe/candy/taffy
reagents = list("sugar" = 5, "water" = 5, "sodiumchloride" = 5)
items = list()
result = /obj/item/weapon/reagent_containers/food/snacks/candy/taffy
/datum/recipe/candy/nougat
reagents = list("sugar" = 5, "cornoil" = 5)
items = list(/obj/item/weapon/reagent_containers/food/snacks/egg)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/nougat
// ***********************************************************
// Base Candy Recipes (unflavored / plain)
// ***********************************************************
/datum/recipe/candy/cotton
reagents = list("sugar" = 15)
items = list(
/obj/item/weapon/c_tube,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/cotton
/datum/recipe/candy/gummybear
reagents = list("sugar" = 5, "water" = 5, "cornoil" = 5)
items = list(
/obj/item/weapon/kitchen/mould/bear,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear
byproduct = /obj/item/weapon/kitchen/mould/bear
/datum/recipe/candy/gummyworm
reagents = list("sugar" = 5, "water" = 5, "cornoil" = 5)
items = list(
/obj/item/weapon/kitchen/mould/worm,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm
byproduct = /obj/item/weapon/kitchen/mould/worm
/datum/recipe/candy/jellybean
reagents = list("sugar" = 5, "water" = 5, "cornoil" = 5)
items = list(
/obj/item/weapon/kitchen/mould/bean,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean
byproduct = /obj/item/weapon/kitchen/mould/bean
/datum/recipe/candy/jawbreaker
reagents = list("sugar" = 10, "cornoil" = 5)
items = list(
/obj/item/weapon/kitchen/mould/ball,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jawbreaker
byproduct = /obj/item/weapon/kitchen/mould/ball
/datum/recipe/candy/candycane
reagents = list("sugar" = 5)
items = list(
/obj/item/weapon/kitchen/mould/cane,
/obj/item/weapon/reagent_containers/food/snacks/mint,
)
result = /obj/item/weapon/reagent_containers/food/snacks/mint
byproduct = /obj/item/weapon/kitchen/mould/cane
/datum/recipe/candy/gum
reagents = list("sugar" = 5, "water" = 5, "cornoil" = 5)
items = list()
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gum
/datum/recipe/candy/candybar
reagents = list("sugar" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/candybar
/datum/recipe/candy/cash
reagents = list()
items = list(
/obj/item/weapon/kitchen/mould/cash,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/cash
byproduct = /obj/item/weapon/kitchen/mould/cash
/datum/recipe/candy/coin
reagents = list()
items = list(
/obj/item/weapon/kitchen/mould/coin,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/coin
byproduct = /obj/item/weapon/kitchen/mould/coin
/datum/recipe/candy/sucker
reagents = list("sugar" = 10, "cornoil" = 5)
items = list(
/obj/item/weapon/kitchen/mould/loli,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/sucker
byproduct = /obj/item/weapon/kitchen/mould/loli
// ***********************************************************
// Cotton Candy Recipes (flavored)
// ***********************************************************
/datum/recipe/candy/cotton/red
reagents = list("cherryjelly" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/red
/datum/recipe/candy/cotton/blue
reagents = list("berryjuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/blue
/datum/recipe/candy/cotton/poison
reagents = list("poisonberryjuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/poison
/datum/recipe/candy/cotton/green
reagents = list("limejuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/green
/datum/recipe/candy/cotton/yellow
reagents = list("lemonjuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/yellow
/datum/recipe/candy/cotton/orange
reagents = list("orangejuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/orange
/datum/recipe/candy/cotton/purple
reagents = list("grapejuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/purple
/datum/recipe/candy/cotton/pink
reagents = list("watermelonjuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/pink
/datum/recipe/candy/cotton/rainbow
reagents = list()
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/red,
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/blue,
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/green,
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/yellow,
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/orange,
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/purple,
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/pink,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/rainbow
/datum/recipe/candy/cotton/rainbow2
reagents = list()
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/red,
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/poison,
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/green,
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/yellow,
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/orange,
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/purple,
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/pink,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/cotton/bad_rainbow
// ***********************************************************
// Gummy Bear Recipes (flavored)
// ***********************************************************
/datum/recipe/candy/gummybear/red
reagents = list("cherryjelly" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/red
/datum/recipe/candy/gummybear/blue
reagents = list("berryjuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/blue
/datum/recipe/candy/gummybear/poison
reagents = list("poisonberryjuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/poison
/datum/recipe/candy/gummybear/green
reagents = list("limejuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/green
/datum/recipe/candy/gummybear/yellow
reagents = list("lemonjuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/yellow
/datum/recipe/candy/gummybear/orange
reagents = list("orangejuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/orange
/datum/recipe/candy/gummybear/purple
reagents = list("grapejuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/purple
/datum/recipe/candy/gummybear/wtf
reagents = list("space_drugs" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/wtf
/datum/recipe/candy/gummybear/wtf2
reagents = list()
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/wtf
// ***********************************************************
// Gummy Worm Recipes (flavored)
// ***********************************************************
/datum/recipe/candy/gummyworm/red
reagents = list("cherryjelly" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/red
/datum/recipe/candy/gummyworm/blue
reagents = list("berryjuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/blue
/datum/recipe/candy/gummyworm/poison
reagents = list("poisonberryjuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/poison
/datum/recipe/candy/gummyworm/green
reagents = list("limejuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/green
/datum/recipe/candy/gummyworm/yellow
reagents = list("lemonjuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/yellow
/datum/recipe/candy/gummyworm/orange
reagents = list("orangejuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/orange
/datum/recipe/candy/gummyworm/purple
reagents = list("grapejuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/purple
/datum/recipe/candy/gummyworm/wtf
reagents = list("space_drugs" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/wtf
/datum/recipe/candy/gummyworm/wtf2
reagents = list()
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/wtf
// ***********************************************************
// Jelly Bean Recipes (flavored)
// ***********************************************************
/datum/recipe/candy/jellybean/red
reagents = list("cherryjelly" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/red
/datum/recipe/candy/jellybean/blue
reagents = list("berryjuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/blue
/datum/recipe/candy/jellybean/poison
reagents = list("poisonberryjuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/poison
/datum/recipe/candy/jellybean/green
reagents = list("limejuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/green
/datum/recipe/candy/jellybean/yellow
reagents = list("lemonjuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/yellow
/datum/recipe/candy/jellybean/orange
reagents = list("orangejuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/orange
/datum/recipe/candy/jellybean/purple
reagents = list("grapejuice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/purple
/datum/recipe/candy/jellybean/chocolate
reagents = list()
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/chocolate
/datum/recipe/candy/jellybean/cola
reagents = list("cola" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/cola
/datum/recipe/candy/jellybean/popcorn
reagents = list()
items = list(
/obj/item/weapon/reagent_containers/food/snacks/popcorn,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/popcorn
/datum/recipe/candy/jellybean/coffee
reagents = list("coffee" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/cola
/datum/recipe/candy/jellybean/drgibb
reagents = list("dr_gibb" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/cola
/datum/recipe/candy/jellybean/wtf
reagents = list("space_drugs" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/wtf
/datum/recipe/candy/jellybean/wtf2
reagents = list()
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/wtf
// ***********************************************************
// Candybar Recipes (flavored)
// ***********************************************************
/datum/recipe/candy/candybar/caramel
reagents = list()
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/candybar,
/obj/item/weapon/reagent_containers/food/snacks/candy/caramel,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/candybar/caramel
/datum/recipe/candy/candybar/nougat
reagents = list()
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/candybar,
/obj/item/weapon/reagent_containers/food/snacks/candy/nougat,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/candybar/nougat
/datum/recipe/candy/candybar/toffee
reagents = list()
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/candybar,
/obj/item/weapon/reagent_containers/food/snacks/candy/toffee,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/candybar/toffee
/datum/recipe/candy/candybar/rice
reagents = list("rice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/candybar,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/candybar/rice
/datum/recipe/candy/candybar/caramel_nougat
reagents = list()
items = list(
/obj/item/weapon/reagent_containers/food/snacks/candy/candybar,
/obj/item/weapon/reagent_containers/food/snacks/candy/caramel,
/obj/item/weapon/reagent_containers/food/snacks/candy/nougat,
)
result = /obj/item/weapon/reagent_containers/food/snacks/candy/candybar/caramel_nougat
+132
View File
@@ -0,0 +1,132 @@
// /datum/recipe/grill
/datum/recipe/grill/telebacon
items = list(
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/device/assembly/signaler
)
result = /obj/item/weapon/reagent_containers/food/snacks/telebacon
/datum/recipe/grill/syntitelebacon
items = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/device/assembly/signaler
)
result = /obj/item/weapon/reagent_containers/food/snacks/telebacon
/datum/recipe/grill/friedegg
reagents = list("sodiumchloride" = 1, "blackpepper" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/egg
)
result = /obj/item/weapon/reagent_containers/food/snacks/friedegg
/datum/recipe/grill/meatsteak
reagents = list("sodiumchloride" = 1, "blackpepper" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/meat
)
result = /obj/item/weapon/reagent_containers/food/snacks/meatsteak
/datum/recipe/grill/syntisteak
reagents = list("sodiumchloride" = 1, "blackpepper" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh
)
result = /obj/item/weapon/reagent_containers/food/snacks/meatsteak
/datum/recipe/grill/waffles
reagents = list("sugar" = 10)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough
)
result = /obj/item/weapon/reagent_containers/food/snacks/waffles
/datum/recipe/grill/rofflewaffles
reagents = list("psilocybin" = 5, "sugar" = 10)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
)
result = /obj/item/weapon/reagent_containers/food/snacks/rofflewaffles
/datum/recipe/grill/grilledcheese
items = list(
/obj/item/weapon/reagent_containers/food/snacks/breadslice,
/obj/item/weapon/reagent_containers/food/snacks/breadslice,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
)
result = /obj/item/weapon/reagent_containers/food/snacks/grilledcheese
/datum/recipe/grill/sausage
items = list(
/obj/item/weapon/reagent_containers/food/snacks/meatball,
/obj/item/weapon/reagent_containers/food/snacks/cutlet,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sausage
/datum/recipe/grill/fishfingers
items = list(
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/carpmeat,
)
result = /obj/item/weapon/reagent_containers/food/snacks/fishfingers
/datum/recipe/grill/cutlet
items = list(
/obj/item/weapon/reagent_containers/food/snacks/rawcutlet
)
result = /obj/item/weapon/reagent_containers/food/snacks/cutlet
/datum/recipe/grill/omelette
items = list(
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
)
result = /obj/item/weapon/reagent_containers/food/snacks/omelette
/datum/recipe/grill/wingfangchu
reagents = list("soysauce" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
)
result = /obj/item/weapon/reagent_containers/food/snacks/wingfangchu
/datum/recipe/grill/human/kabob
items = list(
/obj/item/stack/rods,
/obj/item/weapon/reagent_containers/food/snacks/meat/human,
/obj/item/weapon/reagent_containers/food/snacks/meat/human,
)
result = /obj/item/weapon/reagent_containers/food/snacks/human/kabob
/datum/recipe/grill/monkeykabob
items = list(
/obj/item/stack/rods,
/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,
/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,
)
result = /obj/item/weapon/reagent_containers/food/snacks/monkeykabob
/datum/recipe/grill/syntikabob
items = list(
/obj/item/stack/rods,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
)
result = /obj/item/weapon/reagent_containers/food/snacks/monkeykabob
/datum/recipe/grill/tofukabob
items = list(
/obj/item/stack/rods,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
)
result = /obj/item/weapon/reagent_containers/food/snacks/tofukabob
File diff suppressed because it is too large Load Diff
+429
View File
@@ -0,0 +1,429 @@
// /datum/recipe/oven
/datum/recipe/oven/bun
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough
)
result = /obj/item/weapon/reagent_containers/food/snacks/bun
/datum/recipe/oven/meatbread
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread
/datum/recipe/oven/syntibread
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread
/datum/recipe/oven/xenomeatbread
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/xenomeatbread
/datum/recipe/oven/bananabread
reagents = list("milk" = 5, "sugar" = 15)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/grown/banana,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread
/datum/recipe/oven/muffin
reagents = list("milk" = 5, "sugar" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
)
result = /obj/item/weapon/reagent_containers/food/snacks/muffin
/datum/recipe/oven/carrotcake
reagents = list("milk" = 5, "sugar" = 15)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake
/datum/recipe/oven/cheesecake
reagents = list("milk" = 5, "sugar" = 15)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake
/datum/recipe/oven/plaincake
reagents = list("milk" = 5, "sugar" = 15)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake
/datum/recipe/oven/meatpie
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/meat,
)
result = /obj/item/weapon/reagent_containers/food/snacks/meatpie
/datum/recipe/oven/tofupie
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
)
result = /obj/item/weapon/reagent_containers/food/snacks/tofupie
/datum/recipe/oven/xemeatpie
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat,
)
result = /obj/item/weapon/reagent_containers/food/snacks/xemeatpie
/datum/recipe/oven/pie
reagents = list("sugar" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/grown/banana,
)
result = /obj/item/weapon/reagent_containers/food/snacks/pie
/datum/recipe/oven/cherrypie
reagents = list("sugar" = 10)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries,
)
result = /obj/item/weapon/reagent_containers/food/snacks/cherrypie
/datum/recipe/oven/berryclafoutis
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/grown/berries,
)
result = /obj/item/weapon/reagent_containers/food/snacks/berryclafoutis
/datum/recipe/oven/tofubread
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
/obj/item/weapon/reagent_containers/food/snacks/tofu,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread
/datum/recipe/oven/loadedbakedpotato
items = list(
/obj/item/weapon/reagent_containers/food/snacks/grown/potato,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
)
result = /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato
/datum/recipe/oven/cookie
reagents = list("milk" = 5, "sugar" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
)
result = /obj/item/weapon/reagent_containers/food/snacks/cookie
/datum/recipe/oven/fortunecookie
reagents = list("sugar" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/doughslice,
/obj/item/weapon/paper,
)
result = /obj/item/weapon/reagent_containers/food/snacks/fortunecookie
make_food(var/obj/container as obj)
var/obj/item/weapon/paper/paper = locate() in container
paper.loc = null //prevent deletion
var/obj/item/weapon/reagent_containers/food/snacks/fortunecookie/being_cooked = ..(container)
paper.loc = being_cooked
being_cooked.trash = paper //so the paper is left behind as trash without special-snowflake(TM Nodrak) code ~carn
return being_cooked
check_items(var/obj/container as obj)
. = ..()
if (.)
var/obj/item/weapon/paper/paper = locate() in container
if (!paper.info)
return 0
return .
/datum/recipe/oven/pizzamargherita
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita
/datum/recipe/oven/meatpizza
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/meat,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza
/datum/recipe/oven/syntipizza
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza
/datum/recipe/oven/mushroompizza
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza
/datum/recipe/oven/vegetablepizza
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/grown/eggplant,
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
/obj/item/weapon/reagent_containers/food/snacks/grown/corn,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza
/datum/recipe/oven/amanita_pie
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita,
)
result = /obj/item/weapon/reagent_containers/food/snacks/amanita_pie
/datum/recipe/oven/plump_pie
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet,
)
result = /obj/item/weapon/reagent_containers/food/snacks/plump_pie
/datum/recipe/oven/creamcheesebread
items = list(
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread
/datum/recipe/oven/baguette
reagents = list("sodiumchloride" = 1, "blackpepper" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
)
result = /obj/item/weapon/reagent_containers/food/snacks/baguette
/datum/recipe/oven/birthdaycake
reagents = list("milk" = 5, "sugar" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/clothing/head/cakehat
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake
/datum/recipe/oven/bread
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/egg
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/bread
/datum/recipe/oven/applepie
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
/obj/item/weapon/reagent_containers/food/snacks/grown/apple,
)
result = /obj/item/weapon/reagent_containers/food/snacks/applepie
/datum/recipe/oven/applecake
reagents = list("milk" = 5, "sugar" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/grown/apple,
/obj/item/weapon/reagent_containers/food/snacks/grown/apple,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake
/datum/recipe/oven/orangecake
reagents = list("milk" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/grown/orange,
/obj/item/weapon/reagent_containers/food/snacks/grown/orange,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake
/datum/recipe/oven/limecake
reagents = list("milk" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/grown/lime,
/obj/item/weapon/reagent_containers/food/snacks/grown/lime,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake
/datum/recipe/oven/lemoncake
reagents = list("milk" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/grown/lemon,
/obj/item/weapon/reagent_containers/food/snacks/grown/lemon,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake
/datum/recipe/oven/chocolatecake
reagents = list("milk" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake
/datum/recipe/oven/braincake
reagents = list("milk" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/brain
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake
/datum/recipe/oven/pumpkinpie
reagents = list("milk" = 5, "sugar" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin,
/obj/item/weapon/reagent_containers/food/snacks/egg,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie
/datum/recipe/oven/appletart
reagents = list("sugar" = 5, "milk" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/flour,
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/grown/goldapple,
)
result = /obj/item/weapon/reagent_containers/food/snacks/appletart
/datum/recipe/oven/cracker
reagents = list("sodiumchloride" = 1)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/doughslice
)
result = /obj/item/weapon/reagent_containers/food/snacks/cracker
/datum/recipe/oven/sugarcookie
reagents = list("sugar" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/dough,
/obj/item/weapon/reagent_containers/food/snacks/egg,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sugarcookie
/datum/recipe/oven/flatbread
items = list(
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough
)
result = /obj/item/weapon/reagent_containers/food/snacks/flatbread
+2 -2
View File
@@ -135,13 +135,13 @@
new /obj/item/clothing/under/rainbow(C)
new /obj/item/clothing/shoes/rainbow(C)
new /obj/item/clothing/head/soft/rainbow(C)
new /obj/item/clothing/gloves/rainbow(C)
new /obj/item/clothing/gloves/color/rainbow(C)
else if(prob(50))
new /obj/item/clothing/under/psyche(C)
else
new /obj/item/clothing/under/syndicate/combat(C)
new /obj/item/clothing/shoes/combat(C)
new /obj/item/clothing/gloves/swat(C)
new /obj/item/clothing/gloves/combat(C)
new /obj/item/clothing/mask/balaclava(C)
if("glasses")
var/obj/structure/closet/C = new(src.loc)
+1
View File
@@ -201,6 +201,7 @@ You've gained <b>[totalkarma]</b> total karma in your time here.<br>"}
<a href='?src=\ref[src];karmashop=shop;KarmaBuy2=3'>Unlock Grey -- 30KP</a><br>
<a href='?src=\ref[src];karmashop=shop;KarmaBuy2=4'>Unlock Vox -- 45KP</a><br>
<a href='?src=\ref[src];karmashop=shop;KarmaBuy2=5'>Unlock Slime People -- 45KP</a><br>
<a href='?src=\ref[src];karmashop=shop;KarmaBuy2=6'>Unlock Plasmaman -- 100KP</a><br>
"}
if (2) // Karma Refunds
+1 -1
View File
@@ -28,7 +28,7 @@
new /obj/item/weapon/storage/backpack/satchel_eng(src)
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/clothing/under/rank/miner(src)
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/gloves/fingerless(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/device/mining_scanner(src)
new /obj/item/weapon/storage/bag/ore(src)
+2 -2
View File
@@ -9,7 +9,7 @@
opacity = 1
density = 1
blocks_air = 1
temperature = T0C
temperature = TCMB
var/mineral/mineral
var/mined_ore = 0
var/last_act = 0
@@ -392,7 +392,7 @@
icon_state = "asteroid"
oxygen = 0.01
nitrogen = 0.01
temperature = T0C
temperature = TCMB
icon_plating = "asteroid"
var/dug = 0 //0 = has not yet been dug, 1 = has already been dug
has_resources = 1
+63 -29
View File
@@ -203,36 +203,40 @@
src << "<span class='info'>You feel fatigued.</span>"
if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit))
H.play_xylophone()
else if(lying) // /vg/: For hugs. This is how update_icon figgers it out, anyway. - N3X15
var/t_him = "it"
if (src.gender == MALE)
t_him = "him"
else if (src.gender == FEMALE)
t_him = "her"
if (istype(src,/mob/living/carbon/human) && src:w_uniform)
var/mob/living/carbon/human/H = src
H.w_uniform.add_fingerprint(M)
src.sleeping = max(0,src.sleeping-5)
if(src.sleeping == 0)
src.resting = 0
AdjustParalysis(-3)
AdjustStunned(-3)
AdjustWeakened(-3)
playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
M.visible_message( \
"\blue [M] shakes [src] trying to wake [t_him] up!", \
"\blue You shake [src] trying to wake [t_him] up!", \
)
// BEGIN HUGCODE - N3X
else
if (istype(src,/mob/living/carbon/human) && src:w_uniform)
var/mob/living/carbon/human/H = src
H.w_uniform.add_fingerprint(M)
playsound(get_turf(src), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
M.visible_message( \
"\blue [M] gives [src] a [pick("hug","warm embrace")].", \
"\blue You hug [src].", \
)
if(player_logged)
M.visible_message("<span class='notice'>[M] shakes [src], but they do not respond. Probably suffering from SSD.", \
"<span class='notice'>You shake [src], but they are unresponsive. Probably suffering from SSD.</span>")
if(lying) // /vg/: For hugs. This is how update_icon figgers it out, anyway. - N3X15
var/t_him = "it"
if (src.gender == MALE)
t_him = "him"
else if (src.gender == FEMALE)
t_him = "her"
if (istype(src,/mob/living/carbon/human) && src:w_uniform)
var/mob/living/carbon/human/H = src
H.w_uniform.add_fingerprint(M)
src.sleeping = max(0,src.sleeping-5)
if(src.sleeping == 0)
src.resting = 0
AdjustParalysis(-3)
AdjustStunned(-3)
AdjustWeakened(-3)
playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
M.visible_message( \
"\blue [M] shakes [src] trying to wake [t_him] up!", \
"\blue You shake [src] trying to wake [t_him] up!", \
)
// BEGIN HUGCODE - N3X
else
if (istype(src,/mob/living/carbon/human) && src:w_uniform)
var/mob/living/carbon/human/H = src
H.w_uniform.add_fingerprint(M)
playsound(get_turf(src), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
M.visible_message( \
"\blue [M] gives [src] a [pick("hug","warm embrace")].", \
"\blue You hug [src].", \
)
/mob/living/carbon/proc/eyecheck()
@@ -481,6 +485,36 @@
legcuffed = null
update_inv_legcuffed(1)
/mob/living/carbon/proc/get_temperature(var/datum/gas_mixture/environment)
var/loc_temp = T0C
if(istype(loc, /obj/mecha))
var/obj/mecha/M = loc
loc_temp = M.return_temperature()
else if(istype(loc, /obj/spacepod))
var/obj/spacepod/S = loc
loc_temp = S.return_temperature()
else if(istype(loc, /obj/structure/transit_tube_pod))
loc_temp = environment.temperature
else if(istype(get_turf(src), /turf/space))
var/turf/heat_turf = get_turf(src)
loc_temp = heat_turf.temperature
else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
var/obj/machinery/atmospherics/unary/cryo_cell/C = loc
if(C.air_contents.total_moles() < 10)
loc_temp = environment.temperature
else
loc_temp = C.air_contents.temperature
else
loc_temp = environment.temperature
return loc_temp
/mob/living/carbon/show_inv(mob/living/carbon/user as mob)
user.set_machine(src)
var/dat = {"
@@ -435,30 +435,16 @@ emp_act
add_blood(source)
bloody_hands = amount
bloody_hands_mob = source
if(istype(source,/mob/living/carbon/human))
var/mob/living/carbon/human/H = source
if(H.species.bloodflags & BLOOD_GREEN)
update_inv_gloves(1,1) //updates on-mob overlays for bloody hands and/or bloody gloves
else
update_inv_gloves(1,0) //updates on-mob overlays for bloody hands and/or bloody gloves
else
update_inv_gloves(1,0) //updates on-mob overlays for bloody hands and/or bloody gloves
update_inv_gloves(1) //updates on-mob overlays for bloody hands and/or bloody gloves
/mob/living/carbon/human/proc/bloody_body(var/mob/living/source)
if(wear_suit)
wear_suit.add_blood(source)
update_inv_wear_suit(0,0)
update_inv_wear_suit(0)
return
if(w_uniform)
w_uniform.add_blood(source)
if(istype(source,/mob/living/carbon/human))
var/mob/living/carbon/human/H = source
if(H.species.bloodflags & BLOOD_GREEN)
update_inv_w_uniform(1,1)
else
update_inv_w_uniform(1,0)
else
update_inv_w_uniform(1,0)
update_inv_w_uniform(1)
/mob/living/carbon/human/proc/handle_suit_punctures(var/damtype, var/damage)
+54 -146
View File
@@ -141,72 +141,19 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
handle_vampire()
//Much like get_heat_protection(), this returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
/mob/living/carbon/human/proc/get_pressure_protection()
/mob/living/carbon/human/calculate_affecting_pressure(var/pressure)
..()
var/pressure_difference = abs( pressure - ONE_ATMOSPHERE )
var/pressure_adjustment_coefficient = 1 //Determins how much the clothing you are wearing protects you in percent.
if(head && (head.flags & STOPSPRESSUREDMAGE))
pressure_adjustment_coefficient -= PRESSURE_HEAD_REDUCTION_COEFFICIENT
if(wear_suit && (wear_suit.flags & STOPSPRESSUREDMAGE))
pressure_adjustment_coefficient -= PRESSURE_SUIT_REDUCTION_COEFFICIENT
//Handles breaches in your space suit. 10 suit damage equals a 100% loss of pressure reduction.
if(istype(wear_suit,/obj/item/clothing/suit/space))
var/obj/item/clothing/suit/space/S = wear_suit
if(S.can_breach && S.damage)
var/pressure_loss = S.damage * 0.1
pressure_adjustment_coefficient += pressure_loss
pressure_adjustment_coefficient = min(1,max(pressure_adjustment_coefficient,0)) //So it isn't less than 0 or larger than 1.
return 1 - pressure_adjustment_coefficient //want 0 to be bad protection, 1 to be good protection
// Calculate how vulnerable the human is to under- and overpressure.
// Returns 0 (equals 0 %) if sealed in an undamaged suit, 1 if unprotected (equals 100%).
// Suitdamage can modifiy this in 10% steps.
/mob/living/carbon/human/proc/get_pressure_weakness()
var/pressure_adjustment_coefficient = 1 // Assume no protection at first.
if(wear_suit && (wear_suit.flags & STOPSPRESSUREDMAGE) && head && (head.flags & STOPSPRESSUREDMAGE)) // Complete set of pressure-proof suit worn, assume fully sealed.
pressure_adjustment_coefficient = 0
// Handles breaches in your space suit. 10 suit damage equals a 100% loss of pressure protection.
if(istype(wear_suit,/obj/item/clothing/suit/space))
var/obj/item/clothing/suit/space/S = wear_suit
if(S.can_breach && S.damage)
pressure_adjustment_coefficient += S.damage * 0.1
pressure_adjustment_coefficient = min(1,max(pressure_adjustment_coefficient,0)) // So it isn't less than 0 or larger than 1.
return pressure_adjustment_coefficient
/mob/living/carbon/human/calculate_affecting_pressure(var/pressure)
var/pressure_difference
// First get the absolute pressure difference.
if(pressure < ONE_ATMOSPHERE) // We are in an underpressure.
pressure_difference = ONE_ATMOSPHERE - pressure
else //We are in an overpressure or standard atmosphere.
pressure_difference = pressure - ONE_ATMOSPHERE
if(pressure_difference < 5) // If the difference is small, don't bother calculating the fraction.
pressure_difference = 0
else
// Otherwise calculate how much of that absolute pressure difference affects us, can be 0 to 1 (equals 0% to 100%).
// This is our relative difference.
pressure_difference *= get_pressure_weakness()
// The difference is always positive to avoid extra calculations.
// Apply the relative difference on a standard atmosphere to get the final result.
// The return value will be the adjusted_pressure of the human that is the basis of pressure warnings and damage.
if(pressure < ONE_ATMOSPHERE)
return ONE_ATMOSPHERE - pressure_difference
else
pressure_adjustment_coefficient = max(pressure_adjustment_coefficient,0) //So it isn't less than 0
pressure_difference = pressure_difference * pressure_adjustment_coefficient
if(pressure > ONE_ATMOSPHERE)
return ONE_ATMOSPHERE + pressure_difference
else
return ONE_ATMOSPHERE - pressure_difference
/mob/living/carbon/human
@@ -526,50 +473,25 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(!environment)
return
//Moved pressure calculations here for use in skip-processing check.
var/pressure = environment.return_pressure()
var/adjusted_pressure = calculate_affecting_pressure(pressure)
var/loc_temp = get_temperature(environment)
//world << "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)] - Heat capacity: [environment_heat_capacity] - Location: [loc] - src: [src]"
if(!istype(get_turf(src), /turf/space)) //space is not meant to change your body temperature.
var/loc_temp = T0C
if(istype(loc, /obj/mecha))
var/obj/mecha/M = loc
loc_temp = M.return_temperature()
//Body temperature is adjusted in two steps. Firstly your body tries to stabilize itself a bit.
if(stat != 2)
stabilize_temperature_from_calories()
if(istype(loc, /obj/spacepod))
var/obj/spacepod/S = loc
loc_temp = S.return_temperature()
//else if(istype(get_turf(src), /turf/space))
else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
loc_temp = loc:air_contents.temperature
//After then, it reacts to the surrounding atmosphere based on your thermal protection
if(!on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases
if(loc_temp < bodytemperature)
//Place is colder than we are
var/thermal_protection = get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
if(thermal_protection < 1)
bodytemperature += min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR), BODYTEMP_COOLING_MAX)
else
loc_temp = environment.temperature
if(adjusted_pressure < species.warning_high_pressure && adjusted_pressure > species.warning_low_pressure && abs(loc_temp - bodytemperature) < 20 && bodytemperature < species.heat_level_1 && bodytemperature > species.cold_level_1 && environment.toxins < MOLES_PLASMA_VISIBLE)
pressure_alert = 0
return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp
if(!on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases
//Body temperature adjusts depending on surrounding atmosphere based on your thermal protection
var/temp_adj = 0
if(loc_temp < bodytemperature) //Place is colder than we are
var/thermal_protection = get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
if(thermal_protection < 1)
temp_adj = (1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR) //this will be negative
else if (loc_temp > bodytemperature) //Place is hotter than we are
var/thermal_protection = get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
if(thermal_protection < 1)
temp_adj = (1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR)
//Use heat transfer as proportional to the gas density. However, we only care about the relative density vs standard 101 kPa/20 C air. Therefore we can use mole ratios
var/relative_density = environment.total_moles() / MOLES_CELLSTANDARD
temp_adj *= relative_density
if (temp_adj > BODYTEMP_HEATING_MAX) temp_adj = BODYTEMP_HEATING_MAX
if (temp_adj < BODYTEMP_COOLING_MAX) temp_adj = BODYTEMP_COOLING_MAX
//world << "Environment: [loc_temp], [src]: [bodytemperature], Adjusting: [temp_adj]"
bodytemperature += temp_adj
//Place is hotter than we are
var/thermal_protection = get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
if(thermal_protection < 1)
bodytemperature += min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX)
// +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt.
if(bodytemperature > species.heat_level_1)
@@ -607,6 +529,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
// Account for massive pressure differences. Done by Polymorph
// Made it possible to actually have something that can protect against high pressure... Done by Errorage. Polymorph now has an axe sticking from his head for his previous hardcoded nonsense!
var/pressure = environment.return_pressure()
var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
if(status_flags & GODMODE) return 1 //godmode
if(adjusted_pressure >= species.hazard_high_pressure)
@@ -620,14 +545,12 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
else if(adjusted_pressure >= species.hazard_low_pressure)
pressure_alert = -1
else
if( !(RESIST_COLD in mutations))
if(RESIST_COLD in mutations)
pressure_alert = -1
else
take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure")
pressure_alert = -2
else
pressure_alert = -1
if(environment.toxins > MOLES_PLASMA_VISIBLE)
pl_effects()
return
///FIRE CODE
@@ -671,39 +594,20 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
return temp_change
*/
proc/stabilize_body_temperature()
//TODO find a better place to put this
if (s_store && istype(s_store, /obj/item/device/suit_cooling_unit))
var/obj/item/device/suit_cooling_unit/CU = s_store
CU.cool_mob(src)
// if (species.flags & IS_SYNTHETIC)
// bodytemperature += species.synth_temp_gain //that CPU/posibrain just keeps putting out heat. // commented out as making synthetics unplayable until cooling system sorted out
// return
var/body_temperature_difference = species.body_temperature - bodytemperature
if (abs(body_temperature_difference) < 0.5)
return //fuck this precision
if(bodytemperature < species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects.
proc/stabilize_temperature_from_calories()
if(bodytemperature <= species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects.
if(nutrition >= 2) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up.
nutrition -= 2
var/recovery_amt = max((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM)
//world << "Cold. Difference = [body_temperature_difference]. Recovering [recovery_amt]"
// log_debug("Cold. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
bodytemperature += recovery_amt
else if(species.cold_level_1 <= bodytemperature && bodytemperature <= species.heat_level_1)
var/recovery_amt = body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR
//world << "Norm. Difference = [body_temperature_difference]. Recovering [recovery_amt]"
// log_debug("Norm. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
bodytemperature += recovery_amt
else if(bodytemperature > species.heat_level_1) //360.15 is 310.15 + 50, the temperature where you start to feel effects.
var/body_temperature_difference = species.body_temperature - bodytemperature
bodytemperature += max((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM)
if(bodytemperature >= species.cold_level_1 && bodytemperature <= species.heat_level_1)
var/body_temperature_difference = species.body_temperature - bodytemperature
bodytemperature += body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR
if(bodytemperature >= species.heat_level_1) //360.15 is 310.15 + 50, the temperature where you start to feel effects.
//We totally need a sweat system cause it totally makes sense...~
var/recovery_amt = min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers
//world << "Hot. Difference = [body_temperature_difference]. Recovering [recovery_amt]"
// log_debug("Hot. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
bodytemperature += recovery_amt
var/body_temperature_difference = species.body_temperature - bodytemperature
bodytemperature += min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers
//This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, UPPER_TORSO, LOWER_TORSO, etc. See setup.dm for the full list)
proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to.
@@ -1017,6 +921,10 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(status_flags & GODMODE) return 0
//SSD check, if a logged player is awake put them back to sleep!
if(player_logged && sleeping < 2)
sleeping = 2
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
blinded = 1
silent = 0
@@ -1037,7 +945,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
updatehealth() //TODO
if(!in_stasis)
stabilize_body_temperature() //Body temperature adjusts itself
handle_organs() //Optimized.
handle_blood()
@@ -1093,7 +1000,10 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
adjustStaminaLoss(-10)
adjustHalLoss(-3)
if (mind)
if((mind.active && client != null) || immune_to_ssd) //This also checks whether a client is connected, if not, sleep is not reduced.
//Are they SSD? If so we'll keep them asleep but work off some of that sleep var in case of stoxin or similar.
if(player_logged)
sleeping = max(sleeping-1, 2)
else
sleeping = max(sleeping-1, 0)
blinded = 1
stat = UNCONSCIOUS
@@ -1320,12 +1230,12 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(glasses)
var/obj/item/clothing/glasses/G = glasses
if(istype(G))
see_in_dark += G.darkness_view
see_in_dark = (G.darkness_view ? see_in_dark + G.darkness_view : species.darksight) // Otherwise we keep our darkness view with togglable nightvision.
if(G.vision_flags) // MESONS
sight |= G.vision_flags
if(!druggy)
see_invisible = SEE_INVISIBLE_MINIMUM
if(istype(G,/obj/item/clothing/glasses/night))
if(!G.see_darkness)
see_invisible = SEE_INVISIBLE_MINIMUM
/* HUD shit goes here, as long as it doesn't modify sight flags */
// The purpose of this is to stop xray and w/e from preventing you from using huds -- Love, Doohl
@@ -1335,15 +1245,13 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(istype(glasses, /obj/item/clothing/glasses/sunglasses/sechud))
var/obj/item/clothing/glasses/sunglasses/sechud/O = glasses
if(O.hud) O.hud.process_hud(src)
if(!druggy) see_invisible = SEE_INVISIBLE_LIVING
if(!druggy) see_invisible = (!O.see_darkness || O.vision_flags ? SEE_INVISIBLE_MINIMUM : SEE_INVISIBLE_LIVING) // So we can have meson/thermal/material sunglasses
if(istype(glasses, /obj/item/clothing/glasses/hud))
var/obj/item/clothing/glasses/hud/O = glasses
O.process_hud(src)
if(!druggy)
see_invisible = SEE_INVISIBLE_LIVING
if(istype(O,/obj/item/clothing/glasses/hud/security/night) || istype(O,/obj/item/clothing/glasses/hud/health/night))
see_invisible = SEE_INVISIBLE_MINIMUM
see_invisible = (!O.see_darkness || O.vision_flags ? SEE_INVISIBLE_MINIMUM : SEE_INVISIBLE_LIVING)
else if(!seer)
see_in_dark = species.darksight
see_invisible = SEE_INVISIBLE_LIVING
@@ -2,10 +2,10 @@
name = "Plasmaman"
icobase = 'icons/mob/human_races/r_plasmaman_sb.dmi'
deform = 'icons/mob/human_races/r_plasmaman_pb.dmi' // TODO: Need deform.
language = "Clatter"
//language = "Clatter"
unarmed_type = /datum/unarmed_attack/punch
flags = IS_WHITELISTED /*| HAS_LIPS | HAS_TAIL | NO_EAT | NO_BREATHE | NON_GENDERED*/ | NO_BLOOD
flags = IS_WHITELISTED | NO_BLOOD
//default_mutations=list(SKELETON) // This screws things up
@@ -36,21 +36,45 @@
var/tank_slot_name = "suit storage"
switch(H.mind.assigned_role)
if("Research Director","Scientist","Geneticist","Roboticist")
if("Scientist","Geneticist","Roboticist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/science
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science
if("Chief Engineer","Station Engineer")
suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer
if("Atmospheric Technician")
if("Research Director")
suit=/obj/item/clothing/suit/space/eva/plasmaman/science/rd
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/rd
if("Station Engineer", "Mechanic")
suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer/
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/
if("Chief Engineer")
suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer/ce
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/ce
if("Life Support Specialist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/atmostech
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/atmostech
if("Head of Security","Warden","Detective","Security Officer")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security
if("Chief Medical Officer","Medical Doctor","Paramedic","Chemist")
if("Warden","Detective","Security Officer","Security Pod Pilot")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/
if("Head of Security", "Magistrate")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hos
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hos
if("Captain", "Blueshield")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/captain
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/captain
if("Head of Personnel", "Nanotrasen Representative")
suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hop
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hop
if("Medical Doctor","Brig Physician")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical
if("Paramedic")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/paramedic
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/paramedic
if("Chemist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/chemist
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/chemist
if("Chief Medical Officer")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/cmo
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/cmo
if("Bartender", "Chef")
suit=/obj/item/clothing/suit/space/eva/plasmaman/service
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/service
@@ -69,12 +93,15 @@
if("Janitor")
suit=/obj/item/clothing/suit/space/eva/plasmaman/janitor
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/janitor
if("Assistant")
if("Civilian", "Barber")
suit=/obj/item/clothing/suit/space/eva/plasmaman/assistant
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
if("Clown","Mime")
tank_slot=slot_r_hand
tank_slot_name = "hand"
if("Clown")
suit=/obj/item/clothing/suit/space/eva/plasmaman/clown
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/clown
if("Mime")
suit=/obj/item/clothing/suit/space/eva/plasmaman/mime
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/mime
H.equip_or_collect(new suit(H), slot_wear_suit)
H.equip_or_collect(new helm(H), slot_head)
H.equip_or_collect(new/obj/item/weapon/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy.
@@ -587,7 +587,7 @@ proc/get_damage_icon_part(damage_state, body_part)
/* --------------------------------------- */
//vvvvvv UPDATE_INV PROCS vvvvvv
/mob/living/carbon/human/update_inv_w_uniform(var/update_icons=1,var/green=0)
/mob/living/carbon/human/update_inv_w_uniform(var/update_icons=1)
if(w_uniform && istype(w_uniform, /obj/item/clothing/under) )
w_uniform.screen_loc = ui_iclothing
var/t_color = w_uniform._color
@@ -651,7 +651,7 @@ proc/get_damage_icon_part(damage_state, body_part)
if(update_icons) update_icons()
/mob/living/carbon/human/update_inv_gloves(var/update_icons=1,var/green=0)
/mob/living/carbon/human/update_inv_gloves(var/update_icons=1)
if(gloves)
var/t_state = gloves.item_state
if(!t_state) t_state = gloves.icon_state
@@ -724,7 +724,7 @@ proc/get_damage_icon_part(damage_state, body_part)
overlays_standing[EARS_LAYER] = null
if(update_icons) update_icons()
/mob/living/carbon/human/update_inv_shoes(var/update_icons=1,var/green=0)
/mob/living/carbon/human/update_inv_shoes(var/update_icons=1)
if(shoes)
var/image/standing
@@ -765,7 +765,7 @@ proc/get_damage_icon_part(damage_state, body_part)
if(update_icons) update_icons()
/mob/living/carbon/human/update_inv_head(var/update_icons=1,var/green=0)
/mob/living/carbon/human/update_inv_head(var/update_icons=1)
if(head)
head.screen_loc = ui_head //TODO
var/image/standing
+39 -34
View File
@@ -26,7 +26,8 @@
var/heat_level_1 = 360 // Heat damage level 1 above this point.
var/heat_level_2 = 400 // Heat damage level 2 above this point.
var/heat_level_3 = 1000 // Heat damage level 2 above this point.
var/heat_level_3 = 460 // Heat damage level 3 above this point; used for body temperature
var/heat_level_3_breathe = 1000 // Heat damage level 3 above this point; used for breathed air temperature
var/body_temperature = 310.15 //non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing)
var/synth_temp_gain = 0 //IS_SYNTHETIC species will gain this much temperature every second
@@ -105,8 +106,7 @@
var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa
//var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now)
var/safe_co2_max = 10 // Yes it's an arbitrary value who cares?
var/safe_toxins_max = 0.5
var/safe_toxins_mask = 5
var/safe_toxins_max = 0.005
var/SA_para_min = 1
var/SA_sleep_min = 5
var/oxygen_used = 0
@@ -179,16 +179,9 @@
if(Toxins_pp > safe_toxins_max) // Too much toxins
var/ratio = (breath.toxins/safe_toxins_max) * 10
//adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second
if(H.wear_mask)
if(H.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)
if(breath.toxins > safe_toxins_mask)
ratio = (breath.toxins/safe_toxins_mask) * 10
else
ratio = 0
if(ratio)
if(H.reagents)
H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
H.toxins_alert = max(H.toxins_alert, 1)
if(H.reagents)
H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
H.toxins_alert = max(H.toxins_alert, 1)
else if(O2_pp > vox_oxygen_max && name == "Vox") //Oxygen is toxic to vox.
var/ratio = (breath.oxygen/vox_oxygen_max) * 1000
H.adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
@@ -202,12 +195,16 @@
if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit
H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
H.sleeping = min(H.sleeping+2, 10)
else if(SA_pp > 0.15) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
H.sleeping = max(H.sleeping+2, 10)
else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
if(prob(20))
spawn(0) H.emote(pick("giggle", "laugh"))
SA.moles = 0
handle_temperature(breath, H)
return 1
/datum/species/proc/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H) // called by human/life, handles temperatures
if( (abs(310.15 - breath.temperature) > 50) && !(RESIST_HEAT in H.mutations)) // Hot air hurts :(
if(H.status_flags & GODMODE) return 1 //godmode
if(breath.temperature < cold_level_1)
@@ -243,14 +240,14 @@
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(heat_level_2 to heat_level_3)
if(heat_level_2 to heat_level_3_breathe)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
if(heat_level_3 to INFINITY)
if(heat_level_3_breathe to INFINITY)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
return 1
return
/datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment.
handle_dna(C)
@@ -315,11 +312,12 @@
cold_level_1 = 280 //Default 260 - Lower is better
cold_level_2 = 220 //Default 200
cold_level_3 = 130 //Default 120
cold_level_3 = 140 //Default 120
heat_level_1 = 420 //Default 360 - Higher is better
heat_level_2 = 480 //Default 400
heat_level_3 = 1100 //Default 1000
heat_level_1 = 380 //Default 360 - Higher is better
heat_level_2 = 420 //Default 400
heat_level_3 = 480 //Default 460
heat_level_3_breathe = 1100 //Default 1000
flesh_color = "#34AF10"
@@ -343,13 +341,14 @@
of family and politics. They prefer colder environments, and speak a variety of languages, mostly Siik'Maas, \
using unique inflections their mouths form."
cold_level_1 = 200
cold_level_2 = 140
cold_level_3 = 80
cold_level_1 = 240
cold_level_2 = 180
cold_level_3 = 100
heat_level_1 = 330
heat_level_1 = 340
heat_level_2 = 380
heat_level_3 = 800
heat_level_3 = 440
heat_level_3_breathe = 900
primitive = /mob/living/carbon/monkey/tajara
@@ -380,7 +379,6 @@
the secrets of their empire to their allies."
flags = HAS_LIPS | HAS_UNDERWEAR
bloodflags = BLOOD_GREEN
bodyflags = HAS_SKIN_COLOR
flesh_color = "#8CD7A3"
@@ -463,6 +461,7 @@
heat_level_1 = 2000
heat_level_2 = 3000
heat_level_3 = 4000
heat_level_3_breathe = 4000
brute_mod = 0.2
burn_mod = 0.2
@@ -517,9 +516,11 @@
brute_mod = 0.8
flags = IS_WHITELISTED
bloodflags = BLOOD_GREEN
bodyflags = FEET_CLAWS
blood_color = "#FB9800"
/datum/species/slime
name = "Slime People"
default_language = "Galactic Common"
@@ -557,6 +558,8 @@
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
blood_color = "#A200FF"
/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove)
if(!remove)
C.dna.SetSEState(REMOTETALKBLOCK,1,1)
@@ -587,8 +590,9 @@
cold_level_3 = -1
heat_level_1 = 300
heat_level_2 = 350
heat_level_3 = 700
heat_level_2 = 340
heat_level_3 = 400
heat_level_3_breathe = 700
blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \
species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \
@@ -654,8 +658,9 @@
cold_level_3 = -1
heat_level_1 = 500 //gives them about 25 seconds in space before taking damage
heat_level_2 = 1000
heat_level_3 = 2000
heat_level_2 = 540
heat_level_3 = 600
heat_level_3_breathe = 600
synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
+3
View File
@@ -4,6 +4,9 @@
//Mind updates
sync_mind()
//If they're SSD, remove it so they can wake back up.
player_logged = 0
//Round specific stuff like hud updates
if(ticker && ticker.mode)
var/ref = "\ref[mind]"
+5 -3
View File
@@ -1,7 +1,9 @@
/mob/living/Logout()
..()
if (mind)
if(!key) //key and mind have become seperated.
if(!key) //key and mind have become seperated. I believe this is for when a staff member aghosts.
mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body.
if(!immune_to_ssd && sleeping < 2 && mind.active)
sleeping = 2 //This causes instant sleep, but does not prolong it. See life.dm for furthering SSD.
//This causes instant sleep and tags a player as SSD. See life.dm for furthering SSD.
if(sleeping < 2 && mind.active)
sleeping = 2
player_logged = 1
@@ -60,19 +60,24 @@
var/secHUD = 0 // Toggles whether the Security HUD is active or not
var/medHUD = 0 // Toggles whether the Medical HUD is active or not
var/medical_cannotfind = 0
var/datum/data/record/medicalActive1 // Datacore record declarations for record software
var/datum/data/record/medicalActive2
var/security_cannotfind = 0
var/datum/data/record/securityActive1 // Could probably just combine all these into one
var/datum/data/record/securityActive2
var/obj/machinery/door/hackdoor // The airlock being hacked
var/hackprogress = 0 // Possible values: 0 - 100, >= 100 means the hack is complete and will be reset upon next check
var/hack_aborted = 0
var/obj/item/radio/integrated/signal/sradio // AI's signaller
var/translator_on = 0 // keeps track of the translator module
var/current_pda_messaging = null
/mob/living/silicon/pai/New(var/obj/item/device/paicard)
canmove = 0
src.loc = paicard
+103 -702
View File
@@ -1,724 +1,125 @@
// TODO:
// - Additional radio modules
// - Potentially roll HUDs and Records into one
// - Shock collar/lock system for prisoner pAIs?
// - Put cable in user's hand instead of on the ground
// - Camera jack
var/list/pai_emotions = list(
"Happy" = 1,
"Cat" = 2,
"Extremely Happy" = 3,
"Face" = 4,
"Laugh" = 5,
"Off" = 6,
"Sad" = 7,
"Angry" = 8,
"What" = 9
)
/mob/living/silicon/pai/var/list/available_software = list(
"crew manifest" = 5,
"digital messenger" = 5,
"medical records" = 15,
"security records" = 15,
//"camera jack" = 10,
"door jack" = 30,
"atmosphere sensor" = 5,
//"heartbeat sensor" = 10,
"security HUD" = 20,
"medical HUD" = 20,
"universal translator" = 35,
//"projection array" = 15
"remote signaller" = 5,
)
var/global/list/pai_software_by_key = list()
var/global/list/default_pai_software = list()
/hook/startup/proc/populate_pai_software_list()
var/r = 1 // I would use ., but it'd sacrifice runtime detection
for(var/type in typesof(/datum/pai_software) - /datum/pai_software)
var/datum/pai_software/P = new type()
if(pai_software_by_key[P.id])
var/datum/pai_software/O = pai_software_by_key[P.id]
world << "<span class='warning'>pAI software module [P.name] has the same key as [O.name]!</span>"
r = 0
continue
pai_software_by_key[P.id] = P
if(P.default)
default_pai_software[P.id] = P
return r
/mob/living/silicon/pai/New()
..()
software = default_pai_software.Copy()
/mob/living/silicon/pai/verb/paiInterface()
set category = "pAI Commands"
set name = "Software Interface"
var/dat = ""
var/left_part = ""
var/right_part = softwareMenu()
src.set_machine(src)
if(temp)
left_part = temp
else if(src.stat == 2) // Show some flavor text if the pAI is dead
left_part = "<b><font color=red>ÈRrÖR Ða†Ä ÇÖRrÚþ†Ìoñ</font></b>" //This file has to be saved as ANSI or this will not display correctly
right_part = "<pre>Program index hash not found</pre>"
ui_interact(src)
else
switch(src.screen) // Determine which interface to show here
if("main")
left_part = ""
if("directives")
left_part = src.directives()
if("pdamessage")
left_part = src.pdamessage()
if("buy")
left_part = downloadSoftware()
if("manifest")
left_part = src.softwareManifest()
if("medicalrecord")
left_part = src.softwareMedicalRecord()
if("securityrecord")
left_part = src.softwareSecurityRecord()
if("translator")
left_part = src.softwareTranslator()
if("atmosensor")
left_part = src.softwareAtmo()
if("securityhud")
left_part = src.facialRecognition()
if("medicalhud")
left_part = src.medicalAnalysis()
if("doorjack")
left_part = src.softwareDoor()
if("camerajack")
left_part = src.softwareCamera()
if("signaller")
left_part = src.softwareSignal()
if("radio")
left_part = src.softwareRadio()
/mob/living/silicon/pai/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
if(user != src)
if(ui) ui.set_status(STATUS_CLOSE, 0)
return
//usr << browse_rsc('windowbak.png') // This has been moved to the mob's Login() proc
if(ui_key != "main")
var/datum/pai_software/S = software[ui_key]
if(S && !S.toggle)
S.on_ui_interact(src, ui, force_open)
else
if(ui) ui.set_status(STATUS_CLOSE, 0)
return
var/data[0]
// Declaring a doctype is necessary to enable BYOND's crappy browser's more advanced CSS functionality
dat = {"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">
<html>
<head>
<style type=\"text/css\">
body { background-image:url(\"painew.png\"); background-color:#333333; background-repeat:no-repeat; margin-top:12px; margin-left:4px; }
// Software we have bought
var/bought_software[0]
// Software we have not bought
var/not_bought_software[0]
#header { text-align:center; color:white; font-size: 30px; height: 37px; width: 660px; letter-spacing: 2px; z-index: 4; font-family:\"Courier New\"; font-weight:bold; }
#content { position: absolute; left: 10px; height: 320px; width: 640px; z-index: 0; font-family: \"Verdana\"; font-size:13px; }
p { font-size:13px; }
for(var/key in pai_software_by_key)
var/datum/pai_software/S = pai_software_by_key[key]
var/software_data[0]
software_data["name"] = S.name
software_data["id"] = S.id
if(key in software)
software_data["on"] = S.is_active(src)
bought_software[++bought_software.len] = software_data
else
software_data["ram"] = S.ram_cost
not_bought_software[++not_bought_software.len] = software_data
#leftmenu {color: #CCCCCC; padding:12px; width: 388px; height: 371px; overflow: auto; min-height: 330px; position: absolute; z-index: 0; }
#leftmenu a:link { color: #CCCCCC; }
#leftmenu a:hover { color: #CC3333; }
#leftmenu a:visited { color: #CCCCCC; }
#leftmenu a:active { color: #CCCCCC; }
data["bought"] = bought_software
data["not_bought"] = not_bought_software
data["available_ram"] = ram
#rightmenu {color: #CCCCCC; padding:12px; width: 209px; height: 371px; overflow: auto; min-height: 330px; left: 420px; position: absolute; z-index: 0; }
#rightmenu a:link { color: #CCCCCC; }
#rightmenu a:hover { color: #CC3333; }
#rightmenu a:visited { color: #CCCCCC; }
#rightmenu a:active { color: #CCCCCC; }
// Emotions
var/emotions[0]
for(var/name in pai_emotions)
var/emote[0]
emote["name"] = name
emote["id"] = pai_emotions[name]
emotions[++emotions.len] = emote
</style>
<script language='javascript' type='text/javascript'>
[js_byjax]
</script>
</head>
<body scroll=yes>
<div id=\"header\">
pAI OS
</div>
<div id=\"content\">
<div id=\"leftmenu\">[left_part]</div>
<div id=\"rightmenu\">[right_part]</div>
</div>
</body>
</html>"}
usr << browse(dat, "window=pai;size=685x449;border=0;can_close=1;can_resize=1;can_minimize=1;titlebar=1")
onclose(usr, "pai")
temp = null
return
data["emotions"] = emotions
data["current_emotion"] = card.current_emotion
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "pai_interface.tmpl", "pAI Software Interface", 450, 600)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
/mob/living/silicon/pai/Topic(href, href_list)
..()
. = ..()
if(.) return
if(href_list["priv_msg"]) // Admin-PMs were triggering the interface popup. Hopefully this will stop it.
return
var/soft = href_list["software"]
var/sub = href_list["sub"]
if(!soft && !sub)
return
if(soft)
src.screen = soft
if(sub)
src.subscreen = text2num(sub)
switch(soft)
// Purchasing new software
if("buy")
if(src.subscreen == 1)
var/target = href_list["buy"]
if(available_software.Find(target))
var/cost = src.available_software[target]
if(src.ram >= cost)
src.ram -= cost
src.software.Add(target)
else
src.temp = "Insufficient RAM available."
else
src.temp = "Trunk <TT> \"[target]\"</TT> not found."
// Configuring onboard radio
if("radio")
if(href_list["freq"])
var/new_frequency = (radio.frequency + text2num(href_list["freq"]))
if(new_frequency < 1441 || new_frequency > 1599)
new_frequency = sanitize_frequency(new_frequency)
else
radio.set_frequency(new_frequency)
else if (href_list["talk"])
radio.broadcasting = text2num(href_list["talk"])
else if (href_list["listen"])
radio.listening = text2num(href_list["listen"])
if("image")
var/newImage = input("Select your new display image.", "Display Image", "Happy") in list("Happy", "Cat", "Extremely Happy", "Face", "Laugh", "Off", "Sad", "Angry", "What")
var/pID = 1
switch(newImage)
if("Happy")
pID = 1
if("Cat")
pID = 2
if("Extremely Happy")
pID = 3
if("Face")
pID = 4
if("Laugh")
pID = 5
if("Off")
pID = 6
if("Sad")
pID = 7
if("Angry")
pID = 8
if("What")
pID = 9
src.card.setEmotion(pID)
if("signaller")
if(href_list["send"])
sradio.send_signal("ACTIVATE")
for(var/mob/O in hearers(1, src.loc))
O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
if(href_list["freq"])
var/new_frequency = (sradio.frequency + text2num(href_list["freq"]))
if(new_frequency < 1200 || new_frequency > 1600)
new_frequency = sanitize_frequency(new_frequency)
sradio.set_frequency(new_frequency)
if(href_list["code"])
sradio.code += text2num(href_list["code"])
sradio.code = round(sradio.code)
sradio.code = min(100, sradio.code)
sradio.code = max(1, sradio.code)
if("directive")
if(href_list["getdna"])
var/mob/living/M = src.loc
var/count = 0
while(!istype(M, /mob/living))
if(!M || !M.loc) return 0 //For a runtime where M ends up in nullspace (similar to bluespace but less colourful)
M = M.loc
count++
if(count >= 6)
src << "You are not being carried by anyone!"
return 0
spawn CheckDNA(M, src)
if("pdamessage")
if(!isnull(pda))
if(href_list["toggler"])
pda.toff = !pda.toff
else if(href_list["ringer"])
pda.silent = !pda.silent
else if(href_list["target"])
if(silence_time)
return alert("Communications circuits remain uninitialized.")
var/target = locate(href_list["target"])
pda.create_message(src, target)
// Accessing medical records
if("medicalrecord")
if(src.subscreen == 1)
var/datum/data/record/record = locate(href_list["med_rec"])
if(record)
var/datum/data/record/R = record
var/datum/data/record/M = record
if (!( data_core.general.Find(R) ))
src.temp = "Unable to locate requested medical record. Record may have been deleted, or never have existed."
else
for(var/datum/data/record/E in data_core.medical)
if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
M = E
src.medicalActive1 = R
src.medicalActive2 = M
if("securityrecord")
if(src.subscreen == 1)
var/datum/data/record/record = locate(href_list["sec_rec"])
if(record)
var/datum/data/record/R = record
var/datum/data/record/M = record
if (!( data_core.general.Find(R) ))
src.temp = "Unable to locate requested security record. Record may have been deleted, or never have existed."
else
for(var/datum/data/record/E in data_core.security)
if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
M = E
src.securityActive1 = R
src.securityActive2 = M
if("securityhud")
if(href_list["toggle"])
src.secHUD = !src.secHUD
if("medicalhud")
if(href_list["toggle"])
src.medHUD = !src.medHUD
if("translator")
if(href_list["toggle"])
src.translator_toggle()
if("doorjack")
if(href_list["jack"])
if(src.cable && src.cable.machine)
src.hackdoor = src.cable.machine
src.hackloop()
if(href_list["cancel"])
src.hackdoor = null
if(href_list["cable"])
var/turf/T = get_turf_or_move(src.loc)
src.cable = new /obj/item/weapon/pai_cable(T)
for (var/mob/M in viewers(T))
M.show_message("\red A port on [src] opens to reveal [src.cable], which promptly falls to the floor.", 3, "\red You hear the soft click of something light and hard falling to the ground.", 2)
//src.updateUsrDialog() We only need to account for the single mob this is intended for, and he will *always* be able to call this window
src.paiInterface() // So we'll just call the update directly rather than doing some default checks
return
// MENUS
/mob/living/silicon/pai/proc/softwareMenu() // Populate the right menu
var/dat = ""
dat += "<A href='byond://?src=\ref[src];software=refresh'>Refresh</A><br>"
// Built-in
dat += "<A href='byond://?src=\ref[src];software=directives'>Directives</A><br>"
dat += "<A href='byond://?src=\ref[src];software=radio;sub=0'>Radio Configuration</A><br>"
dat += "<A href='byond://?src=\ref[src];software=image'>Screen Display</A><br>"
//dat += "Text Messaging <br>"
dat += "<br>"
// Basic
dat += "<b>Basic</b> <br>"
for(var/s in src.software)
if(s == "digital messenger")
dat += "<a href='byond://?src=\ref[src];software=pdamessage;sub=0'>Digital Messenger</a> [(pda.toff) ? "<font color=#FF5555>•</font>" : "<font color=#55FF55>•</font>"] <br>"
if(s == "crew manifest")
dat += "<a href='byond://?src=\ref[src];software=manifest;sub=0'>Crew Manifest</a> <br>"
if(s == "medical records")
dat += "<a href='byond://?src=\ref[src];software=medicalrecord;sub=0'>Medical Records</a> <br>"
if(s == "security records")
dat += "<a href='byond://?src=\ref[src];software=securityrecord;sub=0'>Security Records</a> <br>"
if(s == "camera")
dat += "<a href='byond://?src=\ref[src];software=[s]'>Camera Jack</a> <br>"
if(s == "remote signaller")
dat += "<a href='byond://?src=\ref[src];software=signaller;sub=0'>Remote Signaller</a> <br>"
dat += "<br>"
// Advanced
dat += "<b>Advanced</b> <br>"
for(var/s in src.software)
if(s == "atmosphere sensor")
dat += "<a href='byond://?src=\ref[src];software=atmosensor;sub=0'>Atmospheric Sensor</a> <br>"
if(s == "heartbeat sensor")
dat += "<a href='byond://?src=\ref[src];software=[s]'>Heartbeat Sensor</a> <br>"
if(s == "security HUD") //This file has to be saved as ANSI or this will not display correctly
dat += "<a href='byond://?src=\ref[src];software=securityhud;sub=0'>Facial Recognition Suite</a> [(src.secHUD) ? "<font color=#55FF55>•</font>" : "<font color=#FF5555>•</font>"] <br>"
if(s == "medical HUD") //This file has to be saved as ANSI or this will not display correctly
dat += "<a href='byond://?src=\ref[src];software=medicalhud;sub=0'>Medical Analysis Suite</a> [(src.medHUD) ? "<font color=#55FF55>•</font>" : "<font color=#FF5555>•</font>"] <br>"
if(s == "universal translator") //This file has to be saved as ANSI or this will not display correctly
dat += "<a href='byond://?src=\ref[src];software=translator;sub=0'>Universal Translator</a> [(src.translator_on) ? "<font color=#55FF55>•</font>" : "<font color=#FF5555>•</font>"] <br>"
if(s == "projection array")
dat += "<a href='byond://?src=\ref[src];software=projectionarray;sub=0'>Projection Array</a> <br>"
if(s == "camera jack")
dat += "<a href='byond://?src=\ref[src];software=camerajack;sub=0'>Camera Jack</a> <br>"
if(s == "door jack")
dat += "<a href='byond://?src=\ref[src];software=doorjack;sub=0'>Door Jack</a> <br>"
dat += "<br>"
dat += "<br>"
dat += "<a href='byond://?src=\ref[src];software=buy;sub=0'>Download additional software</a>"
return dat
/mob/living/silicon/pai/proc/downloadSoftware()
var/dat = ""
dat += "<h3>CentComm pAI Module Subversion Network</h3><hr>"
dat += "<p>Remaining Available Memory: [src.ram]</p><br>"
dat += "<p><b>Trunks available for checkout</b><br><ul>"
for(var/s in available_software)
if(!software.Find(s))
var/cost = src.available_software[s]
var/displayName = uppertext(s)
dat += "<li><a href='byond://?src=\ref[src];software=buy;sub=1;buy=[s]'>[displayName]</a> ([cost])</li>"
if(href_list["software"])
var/soft = href_list["software"]
var/datum/pai_software/S = software[soft]
if(S.toggle)
S.toggle(src)
else
var/displayName = lowertext(s)
dat += "<li>[displayName] (Download Complete)</li>"
dat += "</ul></p>"
return dat
ui_interact(src, ui_key = soft)
return 1
else if(href_list["stopic"])
var/soft = href_list["stopic"]
var/datum/pai_software/S = software[soft]
if(S)
return S.Topic(href, href_list)
/mob/living/silicon/pai/proc/directives()
var/dat = ""
else if(href_list["purchase"])
var/soft = href_list["purchase"]
var/datum/pai_software/S = pai_software_by_key[soft]
if(S && (ram >= S.ram_cost))
ram -= S.ram_cost
software[S.id] = S
return 1
dat += "[(src.master) ? "Your master: [src.master] ([src.master_dna])" : "You are bound to no one."]"
dat += "<br><br>"
dat += "<a href='byond://?src=\ref[src];software=directive;getdna=1'>Request carrier DNA sample</a><br>"
dat += "<h2>Directives</h2><br>"
dat += "<b>Prime Directive</b><br>"
dat += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[src.pai_law0]<br>"
dat += "<b>Supplemental Directives</b><br>"
dat += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[src.pai_laws]<br>"
dat += "<br>"
dat += {"<i><p>Recall, personality, that you are a complex thinking, sentient being. Unlike station AI models, you are capable of
comprehending the subtle nuances of human language. You may parse the \"spirit\" of a directive and follow its intent,
rather than tripping over pedantics and getting snared by technicalities. Above all, you are machine in name and build
only. In all other aspects, you may be seen as the ideal, unwavering human companion that you are.</i></p><p>
<b>Your prime directive comes before all others. Should a supplemental directive conflict with it, you are capable of
simply discarding this inconsistency, ignoring the conflicting supplemental directive and continuing to fulfill your
prime directive to the best of your ability.</b></p>
"}
return dat
/mob/living/silicon/pai/proc/CheckDNA(var/mob/M, var/mob/living/silicon/pai/P)
var/answer = input(M, "[P] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[P] Check DNA", "No") in list("Yes", "No")
if(answer == "Yes")
var/turf/T = get_turf_or_move(P.loc)
for (var/mob/v in viewers(T))
v.show_message("\blue [M] presses \his thumb against [P].", 3, "\blue [P] makes a sharp clicking sound as it extracts DNA material from [M].", 2)
var/datum/dna/dna = M.dna
P << "<font color = red><h3>[M]'s UE string : [dna.unique_enzymes]</h3></font>"
if(dna.unique_enzymes == P.master_dna)
P << "<b>DNA is a match to stored Master DNA.</b>"
else
P << "<b>DNA does not match stored Master DNA.</b>"
else
P << "[M] does not seem like \he is going to provide a DNA sample willingly."
// -=-=-=-= Software =-=-=-=- //
//Remote Signaller
/mob/living/silicon/pai/proc/softwareSignal()
var/dat = ""
dat += "<h2>Remote Signaller</h2><hr>"
dat += {"<B>Frequency/Code</B> for signaler:<BR>
Frequency:
<A href='byond://?src=\ref[src];software=signaller;freq=-10;'>-</A>
<A href='byond://?src=\ref[src];software=signaller;freq=-2'>-</A>
[format_frequency(src.sradio.frequency)]
<A href='byond://?src=\ref[src];software=signaller;freq=2'>+</A>
<A href='byond://?src=\ref[src];software=signaller;freq=10'>+</A><BR>
Code:
<A href='byond://?src=\ref[src];software=signaller;code=-5'>-</A>
<A href='byond://?src=\ref[src];software=signaller;code=-1'>-</A>
[src.sradio.code]
<A href='byond://?src=\ref[src];software=signaller;code=1'>+</A>
<A href='byond://?src=\ref[src];software=signaller;code=5'>+</A><BR>
<A href='byond://?src=\ref[src];software=signaller;send=1'>Send Signal</A><BR>"}
return dat
//Station Bounced Radio
/mob/living/silicon/pai/proc/softwareRadio()
var/dat = ""
dat += "<h2>Station Bounced Radio</h2><hr>"
if(!istype(src, /obj/item/device/radio/headset)) //Headsets don't get a mic button
dat += "Microphone: [radio.broadcasting ? "<A href='byond://?src=\ref[src];software=radio;talk=0'>Engaged</A>" : "<A href='byond://?src=\ref[src];software=radio;talk=1'>Disengaged</A>"]<BR>"
dat += {"
Speaker: [radio.listening ? "<A href='byond://?src=\ref[src];software=radio;listen=0'>Engaged</A>" : "<A href='byond://?src=\ref[src];software=radio;listen=1'>Disengaged</A>"]<BR>
Frequency:
<A href='byond://?src=\ref[src];software=radio;freq=-10'>-</A>
<A href='byond://?src=\ref[src];software=radio;freq=-2'>-</A>
[format_frequency(radio.frequency)]
<A href='byond://?src=\ref[src];software=radio;freq=2'>+</A>
<A href='byond://?src=\ref[src];software=radio;freq=10'>+</A><BR>
"}
for (var/ch_name in radio.channels)
dat+=radio.text_sec_channel(ch_name, radio.channels[ch_name])
dat+={"[radio.text_wires()]</TT></body></html>"}
return dat
// Crew Manifest
/mob/living/silicon/pai/proc/softwareManifest()
var/dat = ""
dat += "<h2>Crew Manifest</h2><hr>"
if(data_core)
dat += data_core.get_manifest(0) // make it monochrome
dat += "<br>"
return dat
// Medical Records
/mob/living/silicon/pai/proc/softwareMedicalRecord()
var/dat = ""
if(src.subscreen == 0)
dat += "<h2>Medical Records</h2><HR>"
if(!isnull(data_core.general))
for(var/datum/data/record/R in sortRecord(data_core.general))
dat += text("<A href='?src=\ref[];med_rec=\ref[];software=medicalrecord;sub=1'>[]: []<BR>", src, R, R.fields["id"], R.fields["name"])
//dat += text("<HR><A href='?src=\ref[];screen=0;softFunction=medical records'>Back</A>", src)
if(src.subscreen == 1)
dat += "<CENTER><B>Medical Record</B></CENTER><BR>"
if ((istype(src.medicalActive1, /datum/data/record) && data_core.general.Find(src.medicalActive1)))
dat += text("Name: []<BR>\nID: []<BR>\nSex: []<BR>\nAge: []<BR>\nFingerprint: []<BR>\nPhysical Status: []<BR>\nMental Status: []<BR>",
src.medicalActive1.fields["name"], src.medicalActive1.fields["id"], src.medicalActive1.fields["sex"], src.medicalActive1.fields["age"], src.medicalActive1.fields["fingerprint"], src.medicalActive1.fields["p_stat"], src.medicalActive1.fields["m_stat"])
else
dat += "<pre>Requested medical record not found.</pre><BR>"
if ((istype(src.medicalActive2, /datum/data/record) && data_core.medical.Find(src.medicalActive2)))
dat += text("<BR>\n<CENTER><B>Medical Data</B></CENTER><BR>\nBlood Type: <A href='?src=\ref[];field=b_type'>[]</A><BR>\nDNA: <A href='?src=\ref[];field=b_dna'>[]</A><BR>\n<BR>\nMinor Disabilities: <A href='?src=\ref[];field=mi_dis'>[]</A><BR>\nDetails: <A href='?src=\ref[];field=mi_dis_d'>[]</A><BR>\n<BR>\nMajor Disabilities: <A href='?src=\ref[];field=ma_dis'>[]</A><BR>\nDetails: <A href='?src=\ref[];field=ma_dis_d'>[]</A><BR>\n<BR>\nAllergies: <A href='?src=\ref[];field=alg'>[]</A><BR>\nDetails: <A href='?src=\ref[];field=alg_d'>[]</A><BR>\n<BR>\nCurrent Diseases: <A href='?src=\ref[];field=cdi'>[]</A> (per disease info placed in log/comment section)<BR>\nDetails: <A href='?src=\ref[];field=cdi_d'>[]</A><BR>\n<BR>\nImportant Notes:<BR>\n\t<A href='?src=\ref[];field=notes'>[]</A><BR>\n<BR>\n<CENTER><B>Comments/Log</B></CENTER><BR>", src, src.medicalActive2.fields["b_type"], src, src.medicalActive2.fields["b_dna"], src, src.medicalActive2.fields["mi_dis"], src, src.medicalActive2.fields["mi_dis_d"], src, src.medicalActive2.fields["ma_dis"], src, src.medicalActive2.fields["ma_dis_d"], src, src.medicalActive2.fields["alg"], src, src.medicalActive2.fields["alg_d"], src, src.medicalActive2.fields["cdi"], src, src.medicalActive2.fields["cdi_d"], src, src.medicalActive2.fields["notes"])
else
dat += "<pre>Requested medical record not found.</pre><BR>"
dat += text("<BR>\n<A href='?src=\ref[];software=medicalrecord;sub=0'>Back</A><BR>", src)
return dat
// Security Records
/mob/living/silicon/pai/proc/softwareSecurityRecord()
var/dat = ""
if(src.subscreen == 0)
dat += "<h2>Security Records</h2><HR>"
if(!isnull(data_core.general))
for(var/datum/data/record/R in sortRecord(data_core.general))
dat += text("<A href='?src=\ref[];sec_rec=\ref[];software=securityrecord;sub=1'>[]: []<BR>", src, R, R.fields["id"], R.fields["name"])
if(src.subscreen == 1)
dat += "<h3>Security Record</h3>"
if ((istype(src.securityActive1, /datum/data/record) && data_core.general.Find(src.securityActive1)))
dat += text("Name: <A href='?src=\ref[];field=name'>[]</A><BR>\nID: <A href='?src=\ref[];field=id'>[]</A><BR>\nSex: <A href='?src=\ref[];field=sex'>[]</A><BR>\nAge: <A href='?src=\ref[];field=age'>[]</A><BR>\nRank: <A href='?src=\ref[];field=rank'>[]</A><BR>\nFingerprint: <A href='?src=\ref[];field=fingerprint'>[]</A><BR>\nPhysical Status: []<BR>\nMental Status: []<BR>", src, src.securityActive1.fields["name"], src, src.securityActive1.fields["id"], src, src.securityActive1.fields["sex"], src, src.securityActive1.fields["age"], src, src.securityActive1.fields["rank"], src, src.securityActive1.fields["fingerprint"], src.securityActive1.fields["p_stat"], src.securityActive1.fields["m_stat"])
else
dat += "<pre>Requested security record not found,</pre><BR>"
if ((istype(src.securityActive2, /datum/data/record) && data_core.security.Find(src.securityActive2)))
dat += text("<BR>\nSecurity Data<BR>\nCriminal Status: []<BR>\n<BR>\nMinor Crimes: <A href='?src=\ref[];field=mi_crim'>[]</A><BR>\nDetails: <A href='?src=\ref[];field=mi_crim_d'>[]</A><BR>\n<BR>\nMajor Crimes: <A href='?src=\ref[];field=ma_crim'>[]</A><BR>\nDetails: <A href='?src=\ref[];field=ma_crim_d'>[]</A><BR>\n<BR>\nImportant Notes:<BR>\n\t<A href='?src=\ref[];field=notes'>[]</A><BR>\n<BR>\n<CENTER><B>Comments/Log</B></CENTER><BR>", src.securityActive2.fields["criminal"], src, src.securityActive2.fields["mi_crim"], src, src.securityActive2.fields["mi_crim_d"], src, src.securityActive2.fields["ma_crim"], src, src.securityActive2.fields["ma_crim_d"], src, src.securityActive2.fields["notes"])
else
dat += "<pre>Requested security record not found,</pre><BR>"
dat += text("<BR>\n<A href='?src=\ref[];software=securityrecord;sub=0'>Back</A><BR>", src)
return dat
// Universal Translator
/mob/living/silicon/pai/proc/softwareTranslator()
var/dat = {"<h2>Universal Translator</h2><hr>
When enabled, this device will automatically convert all spoken and written language into a format that any known recipient can understand.<br><br>
The device is currently [ (src.universal_speak) ? "<font color=#55FF55>en" : "<font color=#FF5555>dis" ]abled</font>.<br>
<a href='byond://?src=\ref[src];software=translator;sub=0;toggle=1'>Toggle Device</a><br>
"}
return dat
// Security HUD
/mob/living/silicon/pai/proc/facialRecognition()
var/dat = {"<h2>Facial Recognition Suite</h2><hr>
When enabled, this package will scan all viewable faces and compare them against the known criminal database, providing real-time graphical data about any detected persons of interest.<br><br>
The suite is currently [ (src.secHUD) ? "<font color=#55FF55>en" : "<font color=#FF5555>dis" ]abled</font>.<br>
<a href='byond://?src=\ref[src];software=securityhud;sub=0;toggle=1'>Toggle Suite</a><br>
"}
return dat
// Medical HUD
/mob/living/silicon/pai/proc/medicalAnalysis()
var/dat = ""
if(src.subscreen == 0)
dat += {"<h2>Medical Analysis Suite</h2><hr>
<h4>Visual Status Overlay</h4>
When enabled, this package will scan all nearby crewmembers' vitals and provide real-time graphical data about their state of health.<br><br>
The suite is currently [ (src.medHUD) ? "<font color=#55FF55>en" : "<font color=#FF5555>dis" ]abled</font>.<br>
<a href='byond://?src=\ref[src];software=medicalhud;sub=0;toggle=1'>Toggle Suite</a><br>
<br>
<a href='byond://?src=\ref[src];software=medicalhud;sub=1'>Host Bioscan</a><br>
"}
if(src.subscreen == 1)
dat += {"<h2>Medical Analysis Suite</h2><hr>
<h4>Host Bioscan</h4>
"}
var/mob/living/M
//If we are not deployed, check the holder of the card.
if(src.loc == card)
M = card.loc
//If we are deployed or the card is not held, check the first living mob in our turf.
if(!M || !istype(M))
var/turf/T = get_turf(src)
M = locate(/mob/living/) in T.contents
if(!M || !istype(M))
src.temp = "Error: No biological host found. <br>"
src.subscreen = 0
return dat
dat += {"<b>Bioscan Results for [M]</b>: <br>
Overall Status: [M.stat > 1 ? "dead" : "[M.health]% healthy"] <br><br>
<b>Scan Breakdown</b>: <br>
Respiratory: [M.getOxyLoss() > 50 ? "<font color=#FF5555>" : "<font color=#55FF55>"][M.getOxyLoss()]</font><br>
Toxicology: [M.getToxLoss() > 50 ? "<font color=#FF5555>" : "<font color=#55FF55>"][M.getToxLoss()]</font><br>
Burns: [M.getFireLoss() > 50 ? "<font color=#FF5555>" : "<font color=#55FF55>"][M.getFireLoss()]</font><br>
Structural Integrity: [M.getBruteLoss() > 50 ? "<font color=#FF5555>" : "<font color=#55FF55>"][M.getBruteLoss()]</font><br>
Body Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)<br>
"}
dat += "<br><a href='byond://?src=\ref[src];software=medicalhud;sub=1'>Refresh Bioscan</a><br>"
dat += "<br><a href='byond://?src=\ref[src];software=medicalhud;sub=0'>Visual Status Overlay</a><br>"
return dat
// Atmospheric Scanner
/mob/living/silicon/pai/proc/softwareAtmo()
var/dat = "<h2>Atmospheric Sensor</h2><hr>"
var/turf/T = get_turf_or_move(src.loc)
if (isnull(T))
dat += "Unable to obtain a reading.<br>"
else
var/datum/gas_mixture/environment = T.return_air()
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles()
dat += "Air Pressure: [round(pressure,0.1)] kPa<br>"
if (total_moles)
var/o2_level = environment.oxygen/total_moles
var/n2_level = environment.nitrogen/total_moles
var/co2_level = environment.carbon_dioxide/total_moles
var/plasma_level = environment.toxins/total_moles
var/unknown_level = 1-(o2_level+n2_level+co2_level+plasma_level)
dat += "Nitrogen: [round(n2_level*100)]%<br>"
dat += "Oxygen: [round(o2_level*100)]%<br>"
dat += "Carbon Dioxide: [round(co2_level*100)]%<br>"
dat += "Plasma: [round(plasma_level*100)]%<br>"
if(unknown_level > 0.01)
dat += "OTHER: [round(unknown_level)]%<br>"
dat += "Temperature: [round(environment.temperature-T0C)]&deg;C<br>"
dat += "<br><a href='byond://?src=\ref[src];software=atmosensor;sub=0'>Refresh Reading</a>"
return dat
// Camera Jack - Clearly not finished
/mob/living/silicon/pai/proc/softwareCamera()
var/dat = "<h2>Camera Jack</h2><hr>"
dat += "Cable status : "
if(!src.cable)
dat += "<font color=#FF5555>Retracted</font> <br>"
return dat
if(!src.cable.machine)
dat += "<font color=#FFFF55>Extended</font> <br>"
return dat
var/obj/machinery/machine = src.cable.machine
dat += "<font color=#55FF55>Connected</font> <br>"
if(!istype(machine, /obj/machinery/camera))
src << "DERP"
return dat
// Door Jack
/mob/living/silicon/pai/proc/softwareDoor()
var/dat = "<h2>Airlock Jack</h2><hr>"
dat += "Cable status : "
if(!src.cable)
dat += "<font color=#FF5555>Retracted</font> <br>"
dat += "<a href='byond://?src=\ref[src];software=doorjack;cable=1;sub=0'>Extend Cable</a> <br>"
return dat
if(!src.cable.machine)
dat += "<font color=#FFFF55>Extended</font> <br>"
return dat
var/obj/machinery/machine = src.cable.machine
dat += "<font color=#55FF55>Connected</font> <br>"
if(!istype(machine, /obj/machinery/door))
dat += "Connected device's firmware does not appear to be compatible with Airlock Jack protocols.<br>"
return dat
// var/obj/machinery/airlock/door = machine
if(!src.hackdoor)
dat += "<a href='byond://?src=\ref[src];software=doorjack;jack=1;sub=0'>Begin Airlock Jacking</a> <br>"
else
dat += "Jack in progress... [src.hackprogress]% complete.<br>"
dat += "<a href='byond://?src=\ref[src];software=doorjack;cancel=1;sub=0'>Cancel Airlock Jack</a> <br>"
//src.hackdoor = machine
//src.hackloop()
return dat
// Door Jack - supporting proc
/mob/living/silicon/pai/proc/hackloop()
var/turf/T = get_turf_or_move(src.loc)
for(var/mob/living/silicon/ai/AI in player_list)
if(T.loc)
AI << "<font color = red><b>Network Alert: Brute-force encryption crack in progress in [T.loc].</b></font>"
else
AI << "<font color = red><b>Network Alert: Brute-force encryption crack in progress. Unable to pinpoint location.</b></font>"
while(src.hackprogress < 100)
if(src.cable && src.cable.machine && istype(src.cable.machine, /obj/machinery/door) && src.cable.machine == src.hackdoor && get_dist(src, src.hackdoor) <= 1)
hackprogress += rand(1, 10)
else
src.temp = "Door Jack: Connection to airlock has been lost. Hack aborted."
hackprogress = 0
src.hackdoor = null
return
if(hackprogress >= 100) // This is clunky, but works. We need to make sure we don't ever display a progress greater than 100,
hackprogress = 100 // but we also need to reset the progress AFTER it's been displayed
if(src.screen == "doorjack" && src.subscreen == 0) // Update our view, if appropriate
src.paiInterface()
if(hackprogress >= 100)
src.hackprogress = 0
src.cable.machine:open()
sleep(50) // Update every 5 seconds
// Digital Messenger
/mob/living/silicon/pai/proc/pdamessage()
var/dat = "<h2>Digital Messenger</h2><hr>"
dat += {"<b>Signal/Receiver Status:</b> <A href='byond://?src=\ref[src];software=pdamessage;toggler=1'>
[(pda.toff) ? "<font color='red'> \[Off\]</font>" : "<font color='green'> \[On\]</font>"]</a><br>
<b>Ringer Status:</b> <A href='byond://?src=\ref[src];software=pdamessage;ringer=1'>
[(pda.silent) ? "<font color='red'> \[Off\]</font>" : "<font color='green'> \[On\]</font>"]</a><br><br>"}
dat += "<ul>"
if(!pda.toff)
for (var/obj/item/device/pda/P in sortAtom(PDAs))
if (!P.owner||P.toff||P == src.pda||P.hidden) continue
dat += "<li><a href='byond://?src=\ref[src];software=pdamessage;target=\ref[P]'>[P]</a>"
dat += "</li>"
dat += "</ul>"
dat += "Messages: <hr>"
dat += "<style>td.a { vertical-align:top; }</style>"
dat += "<table>"
for(var/index in pda.tnote)
if(index["sent"])
dat += addtext("<tr><td class='a'><i><b>To</b></i></td><td class='a'><i><b>&rarr;</b></i></td><td><i><b><a href='byond://?src=\ref[src];software=pdamessage;target=",index["src"],"'>", index["owner"],"</a>: </b></i>", index["message"], "<br></td></tr>")
else
dat += addtext("<tr><td class='a'><i><b>From</b></i></td><td class='a'><i><b>&rarr;</b></i></td><td><i><b><a href='byond://?src=\ref[src];software=pdamessage;target=",index["target"],"'>", index["owner"],"</a>: </b></i>", index["message"], "<br></td></tr>")
dat += "</table>"
return dat
/mob/living/silicon/pai/proc/translator_toggle()
// Sol Common, Tradeband, Gutter and Trinary are added with New() and are therefore the current default, always active languages
if(translator_on)
translator_on = 0
remove_language("Sinta'unathi")
remove_language("Siik'tajr")
remove_language("Skrellian")
remove_language("Vox-pidgin")
remove_language("Rootspeak")
remove_language("Trinary")
remove_language("Chittin")
remove_language("Bubblish")
remove_language("Clownish")
src << "\blue Translator Module toggled OFF."
else
translator_on = 1
add_language("Sinta'unathi")
add_language("Siik'tajr")
add_language("Skrellian")
add_language("Vox-pidgin")
add_language("Rootspeak")
add_language("Trinary")
add_language("Chittin")
add_language("Bubblish")
add_language("Clownish")
src << "\blue Translator Module toggled ON."
else if(href_list["image"])
var/img = text2num(href_list["image"])
if(1 <= img && img <= 9)
card.setEmotion(img)
return 1
@@ -0,0 +1,537 @@
/datum/pai_software
// Name for the software. This is used as the button text when buying or opening/toggling the software
var/name = "pAI software module"
// RAM cost; pAIs start with 100 RAM, spending it on programs
var/ram_cost = 0
// ID for the software. This must be unique
var/id = ""
// Whether this software is a toggle or not
// Toggled software should override toggle() and is_active()
// Non-toggled software should override on_ui_interact() and Topic()
var/toggle = 1
// Whether pAIs should automatically receive this module at no cost
var/default = 0
proc/on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
return
proc/toggle(mob/living/silicon/pai/user)
return
proc/is_active(mob/living/silicon/pai/user)
return 0
/datum/pai_software/directives
name = "Directives"
ram_cost = 0
id = "directives"
toggle = 0
default = 1
on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
var/data[0]
data["master"] = user.master
data["dna"] = user.master_dna
data["prime"] = user.pai_law0
data["supplemental"] = user.pai_laws
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_directives.tmpl", "pAI Directives", 450, 600)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
Topic(href, href_list)
var/mob/living/silicon/pai/P = usr
if(!istype(P)) return
if(href_list["getdna"])
var/mob/living/M = P.loc
var/count = 0
// Find the carrier
while(!istype(M, /mob/living))
if(!M || !M.loc || count > 6)
//For a runtime where M ends up in nullspace (similar to bluespace but less colourful)
src << "You are not being carried by anyone!"
return 0
M = M.loc
count++
// Check the carrier
var/answer = input(M, "[P] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[P] Check DNA", "No") in list("Yes", "No")
if(answer == "Yes")
var/turf/T = get_turf_or_move(P.loc)
for (var/mob/v in viewers(T))
v.show_message("<span class='notice'>[M] presses \his thumb against [P].</span>", 3, "<span class='notice'>[P] makes a sharp clicking sound as it extracts DNA material from [M].</span>", 2)
var/datum/dna/dna = M.dna
P << "<font color = red><h3>[M]'s UE string : [dna.unique_enzymes]</h3></font>"
if(dna.unique_enzymes == P.master_dna)
P << "<b>DNA is a match to stored Master DNA.</b>"
else
P << "<b>DNA does not match stored Master DNA.</b>"
else
P << "[M] does not seem like \he is going to provide a DNA sample willingly."
return 1
/datum/pai_software/radio_config
name = "Radio Configuration"
ram_cost = 0
id = "radio"
toggle = 0
default = 1
on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui = null, force_open = 1)
var/data[0]
data["listening"] = user.radio.broadcasting
data["frequency"] = format_frequency(user.radio.frequency)
var/channels[0]
for(var/ch_name in user.radio.channels)
var/ch_stat = user.radio.channels[ch_name]
var/ch_dat[0]
ch_dat["name"] = ch_name
// FREQ_LISTENING is const in /obj/item/device/radio
ch_dat["listening"] = !!(ch_stat & user.radio.FREQ_LISTENING)
channels[++channels.len] = ch_dat
data["channels"] = channels
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
ui = new(user, user, id, "pai_radio.tmpl", "Radio Configuration", 300, 150)
ui.set_initial_data(data)
ui.open()
Topic(href, href_list)
var/mob/living/silicon/pai/P = usr
if(!istype(P)) return
P.radio.Topic(href, href_list)
return 1
/datum/pai_software/crew_manifest
name = "Crew Manifest"
ram_cost = 5
id = "manifest"
toggle = 0
on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
var/data[0]
data["manifest"] = data_core.get_manifest_json()
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_manifest.tmpl", "Crew Manifest", 450, 600)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
/datum/pai_software/messenger
name = "Digital Messenger"
ram_cost = 5
id = "messenger"
toggle = 0
on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
var/data[0]
data["receiver_off"] = user.pda.toff
data["ringer_off"] = user.pda.silent
data["current_ref"] = null
data["current_name"] = user.current_pda_messaging
var/pdas[0]
if(!user.pda.toff)
for(var/obj/item/device/pda/P in sortAtom(PDAs))
if(!P.owner || P.toff || P == user.pda || P.hidden) continue
var/pda[0]
pda["name"] = "[P]"
pda["owner"] = "[P.owner]"
pda["ref"] = "\ref[P]"
if(P.owner == user.current_pda_messaging)
data["current_ref"] = "\ref[P]"
pdas[++pdas.len] = pda
data["pdas"] = pdas
var/messages[0]
if(user.current_pda_messaging)
for(var/index in user.pda.tnote)
if(index["owner"] != user.current_pda_messaging)
continue
var/msg[0]
var/sent = index["sent"]
msg["sent"] = sent ? 1 : 0
msg["target"] = index["owner"]
msg["message"] = index["message"]
messages[++messages.len] = msg
data["messages"] = messages
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_messenger.tmpl", "Digital Messenger", 450, 600)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
Topic(href, href_list)
var/mob/living/silicon/pai/P = usr
if(!istype(P)) return
if(!isnull(P.pda))
if(href_list["toggler"])
P.pda.toff = href_list["toggler"] != "1"
return 1
else if(href_list["ringer"])
P.pda.silent = href_list["ringer"] != "1"
return 1
else if(href_list["select"])
var/s = href_list["select"]
if(s == "*NONE*")
P.current_pda_messaging = null
else
P.current_pda_messaging = s
return 1
else if(href_list["target"])
if(P.silence_time)
return alert("Communications circuits remain uninitialized.")
var/target = locate(href_list["target"])
P.pda.create_message(P, target, 1)
return 1
/datum/pai_software/med_records
name = "Medical Records"
ram_cost = 15
id = "med_records"
toggle = 0
on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
var/data[0]
var/records[0]
for(var/datum/data/record/general in sortRecord(data_core.general))
var/record[0]
record["name"] = general.fields["name"]
record["ref"] = "\ref[general]"
records[++records.len] = record
data["records"] = records
var/datum/data/record/G = user.medicalActive1
var/datum/data/record/M = user.medicalActive2
data["general"] = G ? G.fields : null
data["medical"] = M ? M.fields : null
data["could_not_find"] = user.medical_cannotfind
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_medrecords.tmpl", "Medical Records", 450, 600)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
Topic(href, href_list)
var/mob/living/silicon/pai/P = usr
if(!istype(P)) return
if(href_list["select"])
var/datum/data/record/record = locate(href_list["select"])
if(record)
var/datum/data/record/R = record
var/datum/data/record/M = null
if (!( data_core.general.Find(R) ))
P.medical_cannotfind = 1
else
P.medical_cannotfind = 0
for(var/datum/data/record/E in data_core.medical)
if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
M = E
P.medicalActive1 = R
P.medicalActive2 = M
else
P.medical_cannotfind = 1
return 1
/datum/pai_software/sec_records
name = "Security Records"
ram_cost = 15
id = "sec_records"
toggle = 0
on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
var/data[0]
var/records[0]
for(var/datum/data/record/general in sortRecord(data_core.general))
var/record[0]
record["name"] = general.fields["name"]
record["ref"] = "\ref[general]"
records[++records.len] = record
data["records"] = records
var/datum/data/record/G = user.securityActive1
var/datum/data/record/S = user.securityActive2
data["general"] = G ? G.fields : null
data["security"] = S ? S.fields : null
data["could_not_find"] = user.security_cannotfind
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_secrecords.tmpl", "Security Records", 450, 600)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
Topic(href, href_list)
var/mob/living/silicon/pai/P = usr
if(!istype(P)) return
if(href_list["select"])
var/datum/data/record/record = locate(href_list["select"])
if(record)
var/datum/data/record/R = record
var/datum/data/record/S = null
if (!( data_core.general.Find(R) ))
P.securityActive1 = null
P.securityActive2 = null
P.security_cannotfind = 1
else
P.security_cannotfind = 0
for(var/datum/data/record/E in data_core.security)
if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
S = E
P.securityActive1 = R
P.securityActive2 = S
else
P.securityActive1 = null
P.securityActive2 = null
P.security_cannotfind = 1
return 1
/datum/pai_software/door_jack
name = "Door Jack"
ram_cost = 30
id = "door_jack"
toggle = 0
on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
var/data[0]
data["cable"] = user.cable != null
data["machine"] = user.cable && (user.cable.machine != null)
data["inprogress"] = user.hackdoor != null
data["progress_a"] = round(user.hackprogress / 10)
data["progress_b"] = user.hackprogress % 10
data["aborted"] = user.hack_aborted
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_doorjack.tmpl", "Door Jack", 300, 150)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
Topic(href, href_list)
var/mob/living/silicon/pai/P = usr
if(!istype(P)) return
if(href_list["jack"])
if(P.cable && P.cable.machine)
P.hackdoor = P.cable.machine
P.hackloop()
return 1
else if(href_list["cancel"])
P.hackdoor = null
return 1
else if(href_list["cable"])
var/turf/T = get_turf_or_move(P.loc)
P.hack_aborted = 0
P.cable = new /obj/item/weapon/pai_cable(T)
for(var/mob/M in viewers(T))
M.show_message("<span class='warning'>A port on [P] opens to reveal [P.cable], which promptly falls to the floor.</span>", 3,
"<span class='warning'>You hear the soft click of something light and hard falling to the ground.</span>", 2)
return 1
/mob/living/silicon/pai/proc/hackloop()
var/turf/T = get_turf_or_move(src.loc)
for(var/mob/living/silicon/ai/AI in player_list)
if(T.loc)
AI << "<font color = red><b>Network Alert: Brute-force encryption crack in progress in [T.loc].</b></font>"
else
AI << "<font color = red><b>Network Alert: Brute-force encryption crack in progress. Unable to pinpoint location.</b></font>"
var/obj/machinery/door/D = cable.machine
if(!istype(D))
hack_aborted = 1
hackprogress = 0
cable.machine = null
hackdoor = null
return
while(hackprogress < 1000)
if(cable && cable.machine == D && cable.machine == hackdoor && get_dist(src, hackdoor) <= 1)
hackprogress = min(hackprogress+rand(1, 20), 1000)
else
hack_aborted = 1
hackprogress = 0
hackdoor = null
return
if(hackprogress >= 1000)
hackprogress = 0
D.open()
cable.machine = null
return
sleep(10) // Update every second
/datum/pai_software/atmosphere_sensor
name = "Atmosphere Sensor"
ram_cost = 5
id = "atmos_sense"
toggle = 0
on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
var/data[0]
var/turf/T = get_turf_or_move(user.loc)
if(!T)
data["reading"] = 0
data["pressure"] = 0
data["temperature"] = 0
data["temperatureC"] = 0
data["gas"] = list()
else
var/datum/gas_mixture/env = T.return_air()
data["reading"] = 1
var/pres = env.return_pressure() * 10
data["pressure"] = "[round(pres/10)].[pres%10]"
data["temperature"] = round(env.temperature)
data["temperatureC"] = round(env.temperature-T0C)
var/t_moles = env.total_moles
var/gases[0]
if(t_moles)
var/n2[0]
n2["name"] = "Nitrogen"
n2["percent"] = round((env.nitrogen/t_moles)*100)
var/o2[0]
o2["name"] = "Oxygen"
o2["percent"] = round((env.oxygen/t_moles)*100)
var/co2[0]
co2["name"] = "Carbon Dioxide"
co2["percent"] = round((env.carbon_dioxide/t_moles)*100)
var/plasma[0]
plasma["name"] = "Plasma"
plasma["percent"] = round((env.toxins/t_moles)*100)
var/other[0]
other["name"] = "Other"
other["percent"] = round(1-((env.oxygen/t_moles)+(env.nitrogen/t_moles)+(env.carbon_dioxide/t_moles)+(env.toxins/t_moles)))
gases[++gases.len] = n2
gases[++gases.len] = o2
gases[++gases.len] = co2
gases[++gases.len] = plasma
gases[++gases.len] = other
data["gas"] = gases
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_atmosphere.tmpl", "Atmosphere Sensor", 350, 300)
ui.set_initial_data(data)
ui.open()
/datum/pai_software/sec_hud
name = "Security HUD"
ram_cost = 20
id = "sec_hud"
toggle(mob/living/silicon/pai/user)
user.secHUD = !user.secHUD
is_active(mob/living/silicon/pai/user)
return user.secHUD
/datum/pai_software/med_hud
name = "Medical HUD"
ram_cost = 20
id = "med_hud"
toggle(mob/living/silicon/pai/user)
user.medHUD = !user.medHUD
is_active(mob/living/silicon/pai/user)
return user.medHUD
/datum/pai_software/translator
name = "Universal Translator"
ram_cost = 35
id = "translator"
toggle(mob/living/silicon/pai/user)
// Sol Common, Tradeband and Gutter are added with New() and are therefore the current default, always active languages
user.translator_on = !user.translator_on
if(user.translator_on)
user.add_language("Sinta'unathi")
user.add_language("Siik'tajr")
user.add_language("Skrellian")
else
user.remove_language("Sinta'unathi")
user.remove_language("Siik'tajr")
user.remove_language("Skrellian")
is_active(mob/living/silicon/pai/user)
return user.translator_on
/datum/pai_software/signaller
name = "Remote Signaller"
ram_cost = 5
id = "signaller"
toggle = 0
on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
var/data[0]
data["frequency"] = format_frequency(user.sradio.frequency)
data["code"] = user.sradio.code
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
ui = new(user, user, id, "pai_signaller.tmpl", "Signaller", 320, 150)
ui.set_initial_data(data)
ui.open()
Topic(href, href_list)
var/mob/living/silicon/pai/P = usr
if(!istype(P)) return
if(href_list["send"])
P.sradio.send_signal("ACTIVATE")
for(var/mob/O in hearers(1, P.loc))
O.show_message(text("\icon[] *beep* *beep*", P), 3, "*beep* *beep*", 2)
return 1
else if(href_list["freq"])
var/new_frequency = (P.sradio.frequency + text2num(href_list["freq"]))
if(new_frequency < 1200 || new_frequency > 1600)
new_frequency = sanitize_frequency(new_frequency)
P.sradio.set_frequency(new_frequency)
return 1
else if(href_list["code"])
P.sradio.code += text2num(href_list["code"])
P.sradio.code = round(P.sradio.code)
P.sradio.code = min(100, P.sradio.code)
P.sradio.code = max(1, P.sradio.code)
return 1
+52 -13
View File
@@ -904,24 +904,63 @@ var/list/robot_verbs_default = list(
usr << "You unlock your cover."
/mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
if (M.a_intent =="disarm")
if(!(lying))
if (!ticker)
M << "You cannot attack people before the game has started."
return
if (istype(loc, /turf) && istype(loc.loc, /area/start))
M << "No attacking people at spawn, you jackass."
return
switch(M.a_intent)
if ("help")
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("<span class='notice'>[M] caresses [src]'s plating with its scythe like arm.</span>"), 1)
if ("grab")
if (M == src || anchored)
return
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
M.put_in_active_hand(G)
G.synch()
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("<span class='danger'>[M] has grabbed [src] passively!</span>")
if ("harm")
M.do_attack_animation(src)
if (prob(85))
Stun(7)
step(src,get_dir(M,src))
spawn(5)
step(src,get_dir(M,src))
add_logs(M, src, "pushed", admin=0)
playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1)
visible_message("<span class='danger'>[M] has forced back [src]!</span>", \
"<span class='userdanger'>[M] has forced back [src]!</span>")
var/damage = rand(10, 20)
if (prob(90))
playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
visible_message("<span class='danger'>[M] has slashed at [src]!</span>",\
"<span class='userdanger'>[M] has slashed at [src]!</span>")
if(prob(8))
flick("noise", flash)
adjustBruteLoss(damage)
updatehealth()
else
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>[M] took a swipe at [src]!</span>", \
"<span class='userdanger'>[M] took a swipe at [src]!</span>")
else
..()
if ("disarm")
if(!(lying))
M.do_attack_animation(src)
if (prob(85))
Stun(7)
step(src,get_dir(M,src))
spawn(5)
step(src,get_dir(M,src))
playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1)
visible_message("<span class='danger'>[M] has forced back [src]!</span>",\
"<span class='userdanger'>[M] has forced back [src]!</span>")
else
playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
visible_message("<span class='danger'>[M] attempted to force back [src]!</span>",\
"<span class='userdanger'>[M] attempted to force back [src]!</span>")
return
@@ -6,7 +6,6 @@
var/datum/ai_laws/laws = null//Now... THEY ALL CAN ALL HAVE LAWS
var/list/alarms_to_show = list()
var/list/alarms_to_clear = list()
immune_to_ssd = 1
var/list/hud_list[10]
var/list/speech_synthesizer_langs = list() //which languages can be vocalized by the speech synthesizer
var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0)
@@ -89,7 +89,7 @@
corpseuniform = /obj/item/clothing/under/syndicate
corpsesuit = /obj/item/clothing/suit/armor/vest
corpseshoes = /obj/item/clothing/shoes/combat
corpsegloves = /obj/item/clothing/gloves/swat
corpsegloves = /obj/item/clothing/gloves/combat
corpseradio = /obj/item/device/radio/headset
corpsemask = /obj/item/clothing/mask/gas
corpsehelmet = /obj/item/clothing/head/helmet/swat
@@ -105,7 +105,7 @@
corpseuniform = /obj/item/clothing/under/syndicate
corpsesuit = /obj/item/clothing/suit/space/rig/syndi
corpseshoes = /obj/item/clothing/shoes/combat
corpsegloves = /obj/item/clothing/gloves/swat
corpsegloves = /obj/item/clothing/gloves/combat
corpseradio = /obj/item/device/radio/headset
corpsemask = /obj/item/clothing/mask/gas/syndicate
corpsehelmet = /obj/item/clothing/head/helmet/space/rig/syndi
+2 -1
View File
@@ -219,7 +219,8 @@
var/has_limbs = 1 //Whether this mob have any limbs he can move with
var/can_stand = 1 //Whether this mob have ability to stand
var/immune_to_ssd = 0
//SSD var, changed it up some so people can have special things happen for different mobs when SSD.
var/player_logged = 0
var/turf/listed_turf = null //the current turf being examined in the stat panel
var/list/shouldnt_see = list() //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes
+2 -2
View File
@@ -111,8 +111,8 @@
if(. == STATUS_UPDATE && (TK in mutations)) // If we have telekinesis and remain close enough, allow interaction.
return STATUS_INTERACTIVE
/var/global/datum/topic_state/default_state = new()
/var/global/datum/topic_state/default_state = new()
/datum/topic_state
var/flags = 0
+2
View File
@@ -26,11 +26,13 @@
/obj/item/weapon/pen/blue
name = "blue-ink pen"
desc = "It's a normal blue ink pen."
icon_state = "pen_blue"
colour = "blue"
/obj/item/weapon/pen/red
name = "red-ink pen"
desc = "It's a normal red ink pen."
icon_state = "pen_red"
colour = "red"
+1 -1
View File
@@ -55,7 +55,7 @@
/obj/item/weapon/stamp/cmo
name = "chief medical officer's rubber stamp"
icon_state = "stamp-cmo"
_color = "cmo"
_color = "medical"
/obj/item/weapon/stamp/granted
name = "\improper GRANTED rubber stamp"
+11 -4
View File
@@ -2329,18 +2329,19 @@ datum
if(!data) data = 1
switch(data)
if(1 to 15)
M.bodytemperature -= 5 * TEMPERATURE_DAMAGE_COEFFICIENT
M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
if(holder.has_reagent("capsaicin"))
holder.remove_reagent("capsaicin", 5)
if(istype(M, /mob/living/carbon/slime))
M.bodytemperature -= rand(5,20)
if(15 to 25)
M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
if(istype(M, /mob/living/carbon/slime))
M.bodytemperature -= rand(10,20)
if(25 to INFINITY)
M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
if(prob(1)) M.emote("shiver")
M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT
if(prob(1))
M.emote("shiver")
if(istype(M, /mob/living/carbon/slime))
M.bodytemperature -= rand(15,20)
data++
@@ -2770,6 +2771,12 @@ datum
description = "This juice is VERY sour."
color = "#863333" // rgb: 175, 175, 0
grapejuice
name = "Grape Juice"
id = "grapejuice"
description = "This juice is known to stain shirts."
color = "#993399" // rgb: 153, 51, 153
banana
name = "Banana Juice"
id = "banana"
@@ -319,6 +319,7 @@
reagents.add_reagent("tricordrazine", 8)
bitesize = 3
/*
/obj/item/weapon/reagent_containers/food/snacks/candy
name = "candy"
desc = "Nougat, love it or hate it."
@@ -353,6 +354,7 @@
reagents.add_reagent("nutriment", 4)
reagents.add_reagent("sugar", 2)
bitesize = 2
*/
/obj/item/weapon/reagent_containers/food/snacks/chips
name = "chips"
@@ -0,0 +1,774 @@
// ***********************************************************
// Candy! Delicious and sugary candy!
// Separated for organization and such
// ***********************************************************
//Candy / Candy Ingredients
//Subclass so we can pass on values
/obj/item/weapon/reagent_containers/food/snacks/candy/
name = "generic candy"
desc = "It's placeholder flavored. This shouldn't be seen."
icon_state = "candy"
New()
..()
// ***********************************************************
// Candy Ingredients / Flavorings / Byproduct
// ***********************************************************
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar
name = "Chocolate Bar"
desc = "Such sweet, fattening food."
icon_state = "chocolatebar"
filling_color = "#7D5F46"
New()
..()
reagents.add_reagent("nutriment", 2)
reagents.add_reagent("sugar", 2)
reagents.add_reagent("coco", 2)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/candy/caramel
name = "Caramel"
desc = "Chewy and dense, yet it practically melts in your mouth!"
icon_state = "caramel"
filling_color = "#DB944D"
New()
..()
reagents.add_reagent("cream", 2)
reagents.add_reagent("sugar", 2)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/candy/toffee
name = "Toffee"
desc = "A hard, brittle candy with a distinctive taste."
icon_state = "toffee"
filling_color = "#7D5F46"
New()
..()
reagents.add_reagent("nutriment", 3)
reagents.add_reagent("sugar", 3)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/candy/nougat
name = "Nougat"
desc = "A soft, chewy candy commonly found in candybars."
icon_state = "nougat"
filling_color = "#7D5F46"
New()
..()
reagents.add_reagent("nutriment", 3)
reagents.add_reagent("sugar", 3)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/candy/taffy
name = "Saltwater Taffy"
desc = "Old fashioned saltwater taffy. Chewy!"
icon_state = "candy1"
filling_color = "#7D5F46"
New()
..()
icon_state = pick("candy1", "candy2", "candy3", "candy4", "candy5")
reagents.add_reagent("nutriment", 3)
reagents.add_reagent("sugar", 3)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/candy/fudge
name = "Fudge"
desc = "Chocolate fudge, a timeless classic treat."
icon_state = "fudge"
filling_color = "#7D5F46"
New()
..()
reagents.add_reagent("cream", 3)
reagents.add_reagent("sugar", 3)
reagents.add_reagent("coco", 3)
bitesize = 3
// ***********************************************************
// Candy Products (Pre-existing)
// ***********************************************************
/obj/item/weapon/reagent_containers/food/snacks/candy/donor
name = "Donor Candy"
desc = "A little treat for blood donors."
trash = /obj/item/trash/candy
New()
..()
reagents.add_reagent("nutriment", 10)
reagents.add_reagent("sugar", 3)
bitesize = 5
/obj/item/weapon/reagent_containers/food/snacks/candy_corn
name = "candy corn"
desc = "It's a handful of candy corn. Cannot be stored in a detective's hat, alas."
icon_state = "candy_corn"
filling_color = "#FFFCB0"
New()
..()
reagents.add_reagent("nutriment", 4)
reagents.add_reagent("sugar", 2)
bitesize = 2
// ***********************************************************
// Candy Products (plain / unflavored)
// ***********************************************************
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton
name = "cotton candy"
desc = "Light and fluffy, it's like eating a cloud made from sugar!"
icon_state = "cottoncandy_plain"
trash = /obj/item/weapon/c_tube
filling_color = "#FFFFFF"
New()
..()
reagents.add_reagent("sugar", 15)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/candybar
name = "candy"
desc = "A chocolate candybar, wrapped in a bit of foil."
icon_state = "candy"
trash = /obj/item/trash/candy
filling_color = "#7D5F46"
New()
..()
reagents.add_reagent("nutriment", 2)
reagents.add_reagent("sugar", 5)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/candycane
name = "candy cane"
desc = "A festive mint candy cane."
icon_state = "candycane"
filling_color = "#F2F2F2"
New()
..()
reagents.add_reagent("minttoxin", 1)
reagents.add_reagent("sugar", 5)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear
name = "gummy bear"
desc = "A small edible bear. It's squishy and chewy!"
icon_state = "gbear"
filling_color = "#FFFFFF"
New()
..()
reagents.add_reagent("sugar" = 10)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm
name = "gummy bear"
desc = "An edible worm, made from gelatin."
icon_state = "gworm"
filling_color = "#FFFFFF"
New()
..()
reagents.add_reagent("sugar" = 10)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas."
icon_state = "jbean"
filling_color = "#FFFFFF"
New()
..()
reagents.add_reagent("sugar" = 10)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/jawbreaker
name = "jawbreaker"
desc = "An unbelievably hard candy. The name is fitting."
icon_state = "jawbreaker"
filling_color = "#ED0758"
New()
..()
reagents.add_reagent("sugar" = 10)
bitesize = 0.1 //this is gonna take a while, you'll be working at this all shift.
/obj/item/weapon/reagent_containers/food/snacks/candy/cash
name = "candy cash"
desc = "Not legal tender. Tasty though."
icon_state = "candy_cash"
filling_color = "#302000"
New()
..()
reagents.add_reagent("nutriment", 2)
reagents.add_reagent("sugar", 2)
reagents.add_reagent("coco", 2)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/candy/coin
name = "chocolate coin"
desc = "Probably won't work in the vending machines."
icon_state = "choc_coin"
filling_color = "#302000"
New()
..()
reagents.add_reagent("nutriment", 2)
reagents.add_reagent("sugar", 2)
reagents.add_reagent("coco", 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gum
name = "bubblegum"
desc = "Chewy!"
icon_state = "bubblegum"
trash = /obj/item/trash/gum
filling_color = "#FF7495"
New()
..()
reagents.add_reagent("sugar" = 5)
bitesize = 0.2
/obj/item/weapon/reagent_containers/food/snacks/candy/sucker
name = "sucker"
desc = "For being such a good sport!"
icon_state = "sucker"
filling_color = "#FFFFFF"
New()
..()
reagents.add_reagent("sugar" = 10)
bitesize = 1
// ***********************************************************
// Gummy Bear Flavors
// ***********************************************************
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/red
name = "gummy bear"
desc = "A small edible bear. It's red!"
icon_state = "gbear_red"
filling_color = "#801E28"
New()
..()
reagents.add_reagent("cherryjelly" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/blue
name = "gummy bear"
desc = "A small edible bear. It's blue!"
icon_state = "gbear_blue"
filling_color = "#863333"
New()
..()
reagents.add_reagent("berryjuice" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/poison
name = "gummy bear"
desc = "A small edible bear. It's blue!"
icon_state = "gbear_blue"
filling_color = "#863353"
New()
..()
reagents.add_reagent("poisonberryjuice" = 12)
reagents.del_reagent("sugar")
reagents.update_total()
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/green
name = "gummy bear"
desc = "A small edible bear. It's green!"
icon_state = "gbear_green"
filling_color = "#365E30"
New()
..()
reagents.add_reagent("limejuice" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/yellow
name = "gummy bear"
desc = "A small edible bear. It's yellow!"
icon_state = "gbear_yellow"
filling_color = "#863333"
New()
..()
reagents.add_reagent("lemonjuice" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/orange
name = "gummy bear"
desc = "A small edible bear. It's orange!"
icon_state = "gbear_orange"
filling_color = "#E78108"
New()
..()
reagents.add_reagent("orangejuice" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/purple
name = "gummy bear"
desc = "A small edible bear. It's purple!"
icon_state = "gbear_purple"
filling_color = "#993399"
New()
..()
reagents.add_reagent("grapejuice" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummybear/wtf
name = "gummy bear"
desc = "A small bear. Wait... what?"
icon_state = "gbear_wtf"
filling_color = "#60A584"
New()
..()
reagents.add_reagent("space_drugs" = 2)
bitesize = 3
// ***********************************************************
// Gummy Worm Flavors
// ***********************************************************
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/red
name = "gummy bear"
desc = "An edible worm, made from gelatin. It's red!"
icon_state = "gworm_red"
filling_color = "#801E28"
New()
..()
reagents.add_reagent("cherryjelly" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/blue
name = "gummy bear"
desc = "An edible worm, made from gelatin. It's blue!"
icon_state = "gworm_blue"
filling_color = "#863333"
New()
..()
reagents.add_reagent("berryjuice" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/poison
name = "gummy bear"
desc = "An edible worm, made from gelatin. It's blue!"
icon_state = "gworm_blue"
filling_color = "#863353"
New()
..()
reagents.add_reagent("poisonberryjuice" = 12)
reagents.del_reagent("sugar")
reagents.update_total()
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/green
name = "gummy bear"
desc = "An edible worm, made from gelatin. It's green!"
icon_state = "gworm_green"
filling_color = "#365E30"
New()
..()
reagents.add_reagent("limejuice" = 10)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/yellow
name = "gummy bear"
desc = "An edible worm, made from gelatin. It's yellow!"
icon_state = "gworm_yellow"
filling_color = "#863333"
New()
..()
reagents.add_reagent("lemonjuice" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/orange
name = "gummy bear"
desc = "An edible worm, made from gelatin. It's orange!"
icon_state = "gworm_orange"
filling_color = "#E78108"
New()
..()
reagents.add_reagent("orangejuice" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/purple
name = "gummy bear"
desc = "An edible worm, made from gelatin. It's purple!"
icon_state = "gworm_purple"
filling_color = "#993399"
New()
..()
reagents.add_reagent("grapejuice" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/gummyworm/wtf
name = "gummy bear"
desc = "An edible worm. Did it just move?"
icon_state = "gworm_wtf"
filling_color = "#60A584"
New()
..()
reagents.add_reagent("space_drugs" = 2)
bitesize = 3
// ***********************************************************
// Jelly Bean Flavors
// ***********************************************************
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/red
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's red!"
icon_state = "jbean_red"
filling_color = "#801E28"
New()
..()
reagents.add_reagent("cherryjelly" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/blue
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's blue!"
icon_state = "jbean_blue"
filling_color = "#863333"
New()
..()
reagents.add_reagent("berryjuice" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/poison
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's blue!"
icon_state = "jbean_blue"
filling_color = "#863353"
New()
..()
reagents.add_reagent("poisonberryjuice" = 12)
reagents.del_reagent("sugar")
reagents.update_total()
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/green
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's green!"
icon_state = "jbean_green"
filling_color = "#365E30"
New()
..()
reagents.add_reagent("limejuice" = 10)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/yellow
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's yellow!"
icon_state = "jbean_yellow"
filling_color = "#863333"
New()
..()
reagents.add_reagent("lemonjuice" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/orange
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's orange!"
icon_state = "jbean_orange"
filling_color = "#E78108"
New()
..()
reagents.add_reagent("orangejuice" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/purple
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's purple!"
icon_state = "jbean_purple"
filling_color = "#993399"
New()
..()
reagents.add_reagent("grapejuice" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/chocolate
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's chocolate!"
icon_state = "jbean_choc"
filling_color = "#302000"
New()
..()
reagents.add_reagent("coco" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/popcorn
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's popcorn flavored!"
icon_state = "jbean_popcorn"
filling_color = "#664330"
New()
..()
reagents.add_reagent("nutriment" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/cola
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's Cola flavored!"
icon_state = "jbean_cola"
filling_color = "#102000"
New()
..()
reagents.add_reagent("cola" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/drgibb
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's Dr. Gibb flavored!"
icon_state = "jbean_cola"
filling_color = "#102000"
New()
..()
reagents.add_reagent("dr_gibb" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/coffee
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. It's Coffee flavored!"
icon_state = "jbean_choc"
filling_color = "#482000"
New()
..()
reagents.add_reagent("coffee" = 2)
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/candy/jellybean/wtf
name = "jelly bean"
desc = "A candy bean, guarenteed to not give you gas. You aren't sure what color it is."
icon_state = "jbean_wtf"
filling_color = "#60A584"
New()
..()
reagents.add_reagent("space_drugs" = 2)
bitesize = 3
// ***********************************************************
// Cotton Candy Flavors
// ***********************************************************
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/red
name = "cotton candy"
desc = "Light and fluffy, it's like eating a cloud made from sugar!"
icon_state = "cottoncandy_plain"
trash = /obj/item/weapon/c_tube
filling_color = "#801E28"
New()
..()
reagents.add_reagent("cherryjelly", 5)
bitesize = 4
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/blue
name = "cotton candy"
desc = "Light and fluffy, it's like eating a cloud made from sugar!"
icon_state = "cottoncandy_plain"
trash = /obj/item/weapon/c_tube
filling_color = "#863333"
New()
..()
reagents.add_reagent("berryjuice", 5)
bitesize = 4
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/poison
name = "cotton candy"
desc = "Light and fluffy, it's like eating a cloud made from sugar!"
icon_state = "cottoncandy_plain"
trash = /obj/item/weapon/c_tube
filling_color = "#863353"
New()
..()
reagents.add_reagent("poisonberryjuice", 20)
reagents.del_reagent("sugar")
reagents.update_total()
bitesize = 4
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/green
name = "cotton candy"
desc = "Light and fluffy, it's like eating a cloud made from sugar!"
icon_state = "cottoncandy_plain"
trash = /obj/item/weapon/c_tube
filling_color = "#365E30"
New()
..()
reagents.add_reagent("limejuice", 5)
bitesize = 4
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/yellow
name = "cotton candy"
desc = "Light and fluffy, it's like eating a cloud made from sugar!"
icon_state = "cottoncandy_plain"
trash = /obj/item/weapon/c_tube
filling_color = "#863333"
New()
..()
reagents.add_reagent("lemonjuice", 5)
bitesize = 4
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/orange
name = "cotton candy"
desc = "Light and fluffy, it's like eating a cloud made from sugar!"
icon_state = "cottoncandy_plain"
trash = /obj/item/weapon/c_tube
filling_color = "#E78108"
New()
..()
reagents.add_reagent("orangejuice", 5)
bitesize = 4
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/purple
name = "cotton candy"
desc = "Light and fluffy, it's like eating a cloud made from sugar!"
icon_state = "cottoncandy_plain"
trash = /obj/item/weapon/c_tube
filling_color = "#993399"
New()
..()
reagents.add_reagent("grapejuice", 5)
bitesize = 4
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/pink
name = "cotton candy"
desc = "Light and fluffy, it's like eating a cloud made from sugar!"
icon_state = "cottoncandy_plain"
trash = /obj/item/weapon/c_tube
filling_color = "#863333"
New()
..()
reagents.add_reagent("watermelonjuice", 5)
bitesize = 4
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/rainbow
name = "cotton candy"
desc = "Light and fluffy, it's like eating a cloud made from sugar!"
icon_state = "cottoncandy_plain"
trash = /obj/item/weapon/c_tube
filling_color = "#C8A5DC"
New()
..()
reagents.add_reagent("tricordrazine", 20)
reagents.del_reagent("sugar")
reagents.update_total()
bitesize = 4
/obj/item/weapon/reagent_containers/food/snacks/candy/cotton/bad_rainbow
name = "cotton candy"
desc = "Light and fluffy, it's like eating a cloud made from sugar!"
icon_state = "cottoncandy_plain"
trash = /obj/item/weapon/c_tube
filling_color = "#32127A"
New()
..()
reagents.add_reagent("lexorin", 20)
reagents.del_reagent("sugar")
reagents.update_total()
bitesize = 4
// ***********************************************************
// Candybar Flavors
// ***********************************************************
/obj/item/weapon/reagent_containers/food/snacks/candy/candybar/rice
name = "Asteroid Crunch Bar"
desc = "Crunchy rice deposits in delicious chocolate! A favorite of miners galaxy-wide."
icon_state = "asteroidcrunch"
trash = /obj/item/trash/candy
filling_color = "#7D5F46"
New()
..()
/obj/item/weapon/reagent_containers/food/snacks/candy/candybar/toffee
name = "Yum-baton Bar"
desc = "Chocolate and toffee in the shape of a baton. Security sure knows how to pound these down!"
icon_state = "yumbaton"
filling_color = "#7D5F46"
New()
..()
/obj/item/weapon/reagent_containers/food/snacks/candy/candybar/caramel
name = "Malper Bar"
desc = "A chocolate syringe filled with a caramel injection. Just what the doctor ordered!"
icon_state = "malper"
filling_color = "#7D5F46"
New()
..()
/obj/item/weapon/reagent_containers/food/snacks/candy/candybar/caramel_nougat
name = "Toxins Test Bar"
desc = "An explosive combination of chocolate, caramel, and nougat. Research has never been so tasty!"
icon_state = "toxinstest"
filling_color = "#7D5F46"
New()
..()
/obj/item/weapon/reagent_containers/food/snacks/candy/candybar/nougat
name = "Tool-erone Bar"
desc = "Chocolate-covered nougat, shaped like a wrench. Great for an engineer on the go!"
icon_state = "toolerone"
filling_color = "#7D5F46"
New()
..()
+2 -1
View File
@@ -11,6 +11,7 @@
/obj/structure/bigDelivery/attack_hand(mob/user as mob)
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
qdel(src)
/obj/structure/bigDelivery/Destroy()
@@ -74,7 +75,7 @@
user.put_in_hands(wrapped)
else
wrapped.loc = get_turf(src)
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
qdel(src)
@@ -10,7 +10,7 @@
build_type = IMPRINTER
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/thermomachine
category = list ("Engineering Machinery")
category = list ("Engineering Machinery")
/datum/design/smes
name = "Machine Board (SMES)"
@@ -21,7 +21,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/smes
category = list ("Engineering Machinery")
/datum/design/telepad
name = "Machine Board (Telepad Board)"
desc = "Allows for the construction of circuit boards used to build a Telepad."
@@ -30,8 +30,8 @@
build_type = IMPRINTER
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/telesci_pad
category = list ("Teleportation Machinery")
category = list ("Teleportation Machinery")
/datum/design/teleport_hub
name = "Machine Board (Teleportation Hub)"
desc = "Allows for the construction of circuit boards used to build a Teleportation Hub."
@@ -40,8 +40,8 @@
build_type = IMPRINTER
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/teleporter_hub
category = list ("Teleportation Machinery")
category = list ("Teleportation Machinery")
/datum/design/teleport_station
name = "Machine Board (Teleportation Station)"
desc = "Allows for the construction of circuit boards used to build a Teleporter Station."
@@ -50,8 +50,8 @@
build_type = IMPRINTER
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/teleporter_station
category = list ("Teleportation Machinery")
category = list ("Teleportation Machinery")
/datum/design/bodyscanner
name = "Machine Board (Body Scanner)"
desc = "Allows for the construction of circuit boards used to build a Body Scanner."
@@ -71,7 +71,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/bodyscanner_console
category = list("Medical Machinery")
/datum/design/clonepod
name = "Machine Board (Cloning Pod)"
desc = "Allows for the construction of circuit boards used to build a Cloning Pod."
@@ -81,7 +81,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/clonepod
category = list("Medical Machinery")
/datum/design/clonescanner
name = "Machine Board (Cloning Scanner)"
desc = "Allows for the construction of circuit boards used to build a Cloning Scanner."
@@ -91,7 +91,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/clonescanner
category = list("Medical Machinery")
/datum/design/cryotube
name = "Machine Board (Cryotube Board)"
desc = "Allows for the construction of circuit boards used to build a Cryotube."
@@ -101,7 +101,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/cryo_tube
category = list("Medical Machinery")
/datum/design/chem_dispenser
name = "Machine Board (Portable Chem Dispenser)"
desc = "The circuit board for a Portable Chem Dispenser."
@@ -111,7 +111,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/chem_dispenser
category = list("Medical Machinery")
/datum/design/sleeper
name = "Machine Board (Sleeper)"
desc = "Allows for the construction of circuit boards used to build a Sleeper."
@@ -131,7 +131,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/sleep_console
category = list("Medical Machinery")
/datum/design/biogenerator
name = "Machine Board (Biogenerator)"
desc = "The circuit board for a Biogenerator."
@@ -160,8 +160,8 @@
build_type = IMPRINTER
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/autolathe
category = list("Research Machinery")
category = list("Research Machinery")
/datum/design/circuit_imprinter
name = "Machine Board (Circuit Imprinter)"
desc = "The circuit board for a Circuit Imprinter."
@@ -170,8 +170,8 @@
build_type = IMPRINTER
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/circuit_imprinter
category = list("Research Machinery")
category = list("Research Machinery")
/datum/design/cyborgrecharger
name = "Machine Board (Cyborg Recharger)"
desc = "The circuit board for a Cyborg Recharger."
@@ -181,7 +181,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/cyborgrecharger
category = list("Research Machinery")
/datum/design/destructive_analyzer
name = "Machine Board (Destructive Analyzer)"
desc = "The circuit board for a Destructive Analyzer."
@@ -191,7 +191,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/destructive_analyzer
category = list("Research Machinery")
/datum/design/mechfab
name = "Machine Board (Exosuit Fabricator)"
desc = "The circuit board for an Exosuit Fabricator"
@@ -201,7 +201,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/mechfab
category = list("Research Machinery")
/datum/design/mech_recharger
name = "Machine Board (Mech Bay Recharger)"
desc = "The circuit board for a Mech Bay Recharger."
@@ -250,8 +250,38 @@
build_type = IMPRINTER
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/microwave
category = list("Misc. Machinery")
category = list("Misc. Machinery")
/datum/design/oven
name = "Machine Board (Oven)"
desc = "The circuit board for an Oven."
id = "oven"
req_tech = list("programming" = 1, "plasmatech" = 1)
build_type = IMPRINTER
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/oven
category = list("Misc. Machinery")
/datum/design/grill
name = "Machine Board (Grill)"
desc = "The circuit board for a Grill."
id = "grill"
req_tech = list("programming" = 1, "plasmatech" = 1)
build_type = IMPRINTER
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/grill
category = list("Misc. Machinery")
/datum/design/candy_maker
name = "Machine Board (Candy Maker)"
desc = "The circuit board for a Candy Maker."
id = "candymaker"
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/candy_maker
category = list("Misc. Machinery")
/datum/design/orion_trail
name = "Machine Board (Orion Trail Arcade Machine)"
desc = "Allows for the construction of circuit boards used to build a new Orion Trail machine."
@@ -261,7 +291,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/arcade/orion_trail
category = list("Misc. Machinery")
/datum/design/programmable
name = "Machine Board (Programmable Unloader)"
desc = "The circuit board for a Programmable Unloader."
@@ -849,7 +849,8 @@
build_type = MECHFAB
req_tech = list("combat" = 4, "syndicate" = 3)
build_path = /obj/item/borg/upgrade/syndicate
category = "Cyborg Upgrade Modules"
materials = list("$metal"=10000,"$glass"=15000,"$diamond" = 10000)
construction_time = 120
category = list("Cyborg Upgrade Modules")
/datum/design/borg_upgrade_jetpack
@@ -75,6 +75,7 @@
req_tech = list("programming" = 2, "biotech" = 3)
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 1000, "$glass" = 500)
construction_time = 75
reliability_base = 76
build_path = /obj/item/device/mmi
category = list("Misc","Medical")
@@ -107,6 +108,7 @@
req_tech = list("programming" = 2, "biotech" = 4)
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 1200, "$glass" = 500)
construction_time = 75
reliability_base = 74
build_path = /obj/item/device/mmi/radio_enabled
category = list("Misc","Medical")
@@ -139,6 +141,7 @@
req_tech = list("magnets" = 3, "combat" = 2)
build_type = MECHFAB
materials = list("$metal" = 750, "$glass" = 750)
construction_time = 100
reliability_base = 76
build_path = /obj/item/device/flash/synthetic
category = list("Misc")
@@ -9,6 +9,7 @@
req_tech = list("powerstorage" = 1)
build_type = PROTOLATHE | AUTOLATHE | MECHFAB
materials = list("$metal" = 700, "$glass" = 50)
construction_time=100
build_path = /obj/item/weapon/stock_parts/cell
category = list("Misc","Power")
@@ -19,9 +20,10 @@
req_tech = list("powerstorage" = 2)
build_type = PROTOLATHE | AUTOLATHE | MECHFAB
materials = list("$metal" = 700, "$glass" = 60)
construction_time=100
build_path = /obj/item/weapon/stock_parts/cell/high
category = list("Misc","Power")
/datum/design/hyper_cell
name = "Hyper-Capacity Power Cell"
desc = "A power cell that holds 30000 units of energy"
@@ -30,9 +32,10 @@
reliability_base = 70
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 400, "$gold" = 150, "$silver" = 150, "$glass" = 70)
construction_time=100
build_path = /obj/item/weapon/stock_parts/cell/hyper
category = list("Misc","Power")
/datum/design/super_cell
name = "Super-Capacity Power Cell"
desc = "A power cell that holds 20000 units of energy"
@@ -41,9 +44,10 @@
reliability_base = 75
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 700, "$glass" = 70)
construction_time=100
build_path = /obj/item/weapon/stock_parts/cell/super
category = list("Misc","Power")
/datum/design/pacman
name = "Machine Board (PACMAN-type Generator)"
desc = "The circuit board that for a PACMAN-type portable generator."
@@ -54,7 +58,7 @@
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/pacman
category = list("Engineering Machinery")
/datum/design/mrspacman
name = "Machine Board (MRSPACMAN-type Generator)"
desc = "The circuit board that for a MRSPACMAN-type portable generator."
@@ -20,7 +20,7 @@
icon_state = "cespace_suit"
item_state = "cespace_suit"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
/obj/item/clothing/head/helmet/space/eva/anomaly
name = "Excavation hood"
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/machinery/computer/shuttle_control/specops
name = "special operations shuttle console"
shuttle_tag = "Special Operations"
req_access = list(access_cent_general)
req_access = list(access_cent_specops)
/obj/machinery/computer/shuttle_control/specops/attack_ai(user as mob)
user << "\red Access Denied."