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

Conflicts:
	code/modules/clothing/head/helmet.dm
	icons/mob/items_lefthand.dmi
	icons/mob/items_righthand.dmi
This commit is contained in:
Miauw
2014-07-18 12:52:40 +02:00
191 changed files with 5764 additions and 4793 deletions
+1
View File
@@ -427,6 +427,7 @@ var/global/floorIsLava = 0
<BR>
<A href='?src=\ref[src];secretsadmin=moveferry'>Move Ferry</A><BR>
<A href='?src=\ref[src];secretsadmin=moveminingshuttle'>Move Mining Shuttle</A><BR>
<A href='?src=\ref[src];secretsadmin=movelaborshuttle'>Move Labor Shuttle</A><BR>
<BR>
"}
+14
View File
@@ -7,3 +7,17 @@
create_mob_html = replacetext(create_mob_html, "null /* object types */", "\"[mobjs]\"")
user << browse(replacetext(create_mob_html, "/* ref src */", "\ref[src]"), "window=create_mob;size=425x475")
/proc/randomize_human(mob/living/carbon/human/H)
H.gender = pick(MALE, FEMALE)
H.real_name = random_name(H.gender)
H.name = H.real_name
H.dna.generate_uni_identity(H)
H.underwear = random_underwear(H.gender)
H.skin_tone = random_skin_tone()
H.hair_style = random_hair_style(H.gender)
H.facial_hair_style = random_facial_hair_style(H.gender)
H.hair_color = random_short_color()
H.facial_hair_color = H.hair_color
H.eye_color = random_eye_color()
H.update_icons()
+14
View File
@@ -489,6 +489,20 @@
dat += "<tr><td><i>Blob not found!</i></td></tr>"
dat += "</table>"
if(istype(ticker.mode, /datum/game_mode/monkey))
var/datum/game_mode/monkey/mode = ticker.mode
dat += "<br><table cellspacing=5><tr><td><B>Monkey</B></td><td></td><td></td></tr>"
for(var/datum/mind/eek in mode.ape_infectees)
var/mob/M = eek.current
if(M)
dat += "<tr><td><a href='?_src_=holder;adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(logged out)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td>"
else
dat += "<tr><td><i>Monkey not found!</i></td></tr>"
dat += "</table>"
dat += "</body></html>"
usr << browse(dat, "window=roundstatus;size=400x500")
else
+11 -4
View File
@@ -1926,15 +1926,22 @@
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","ShM")
var/datum/shuttle_manager/s = shuttles["mining"]
if(istype(s)) s.move_shuttle()
message_admins("\blue [key_name_admin(usr)] moved mining shuttle", 1)
if(istype(s)) s.move_shuttle(0)
message_admins("[key_name_admin(usr)] moved mining shuttle", 1)
log_admin("[key_name(usr)] moved the mining shuttle")
if("movelaborshuttle")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","ShL")
var/datum/shuttle_manager/s = shuttles["laborcamp"]
if(istype(s)) s.move_shuttle(0)
message_admins("[key_name_admin(usr)] moved labor shuttle", 1)
log_admin("[key_name(usr)] moved the labor shuttle")
if("moveferry")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","ShF")
var/datum/shuttle_manager/s = shuttles["ferry"]
if(istype(s)) s.move_shuttle()
message_admins("\blue [key_name_admin(usr)] moved the centcom ferry", 1)
if(istype(s)) s.move_shuttle(0)
message_admins("[key_name_admin(usr)] moved the centcom ferry", 1)
log_admin("[key_name(usr)] moved the centcom ferry")
if("kick_all_from_lobby")
if(ticker && ticker.current_state == GAME_STATE_PLAYING)
+1
View File
@@ -929,6 +929,7 @@ var/global/list/g_fancy_list_of_safe_types = null
var/obj/item/weapon/card/id/W = new(M)
W.icon_state = "centcom"
W.access = get_centcom_access("Centcom Official")
W.access += access_weapons
W.assignment = "Centcom Official"
W.registered_name = M.real_name
W.update_label()
+5 -2
View File
@@ -16,6 +16,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
"pAI candidate" = 1, // 7
"cultist" = IS_MODE_COMPILED("cult"), // 8
"blob" = IS_MODE_COMPILED("blob"), // 9
"monkey" = IS_MODE_COMPILED("monkey") // 10
)
@@ -632,7 +633,7 @@ datum/preferences
if(result)
var/newtype = roundstart_species[result]
pref_species = new newtype()
if(!config.mutant_colors)
if(!config.mutant_colors || mutant_color == "#000")
mutant_color = pref_species.default_color
if("mutant_color")
@@ -642,7 +643,9 @@ datum/preferences
var/new_mutantcolor = input(user, "Choose your character's alien skin color:", "Character Preference") as color|null
if(new_mutantcolor)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright
if(new_mutantcolor == "#000000")
mutant_color = pref_species.default_color
else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright
mutant_color = sanitize_hexcolor(new_mutantcolor)
else
user << "<span class='danger'>Invalid color. Your color is not bright enough.</span>"
@@ -155,6 +155,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(!S["species"] || !config.mutant_races)
S["species"] << new /datum/species/human()
if(!S["mutant_color"] || S["mutant_color"] == "#000")
S["mutant_color"] << "#FFF"
//Character
S["OOC_Notes"] >> metadata
@@ -194,6 +196,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
real_name = reject_bad_name(real_name)
if(!(pref_species in species_list))
pref_species = new /datum/species/human()
if(!mutant_color || mutant_color == "#000")
mutant_color = "#FFF"
if(!real_name) real_name = random_name(gender)
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
gender = sanitize_gender(gender)
+3 -6
View File
@@ -1,14 +1,11 @@
/obj/item/clothing/glasses/meson
name = "Optical Meson Scanner"
desc = "Used for seeing walls, floors, and stuff through anything."
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
icon_state = "meson"
item_state = "glasses"
origin_tech = "magnets=2;engineering=2"
darkness_view = 1
vision_flags = SEE_TURFS
/obj/item/clothing/glasses/meson/advanced
name = "Advanced Optical Meson Scanner"
desc = "More powerful than your standard mesons, these ones make everything appear to be lit extremely brightly."
invis_view = SEE_INVISIBLE_MINIMUM
/obj/item/clothing/glasses/science
@@ -136,7 +133,7 @@
/obj/item/clothing/glasses/thermal/syndi //These are now a traitor item, concealed as mesons. -Pete
name = "Optical Meson Scanner"
desc = "Used for seeing walls, floors, and stuff through anything."
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
icon_state = "meson"
origin_tech = "magnets=3;syndicate=4"
+43 -45
View File
@@ -13,18 +13,56 @@
/obj/item/clothing/head/helmet/HoS
name = "head of security hat"
desc = "The hat of the Head of Security. For showing the officers who's in charge."
desc = "The robust hat of the Head of Security. For showing the officers who's in charge."
icon_state = "hoscap"
flags = HEADCOVERSEYES
armor = list(melee = 80, bullet = 60, laser = 50, energy = 10, bomb = 25, bio = 10, rad = 0)
flags_inv = 0
armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0)
flags = 0
flags_inv = HIDEEARS
/obj/item/clothing/head/helmet/HoS/dermal
name = "Dermal Armour Patch"
desc = "You're not quite sure how you manage to take it on and off, but it implants nicely in your head."
desc = "An armored implant that automatically integrates just below the scalp for robust protection without sacrificing style."
icon_state = "dermal"
item_state = "dermal"
flags_inv = 0
/obj/item/clothing/head/helmet/warden
name = "warden's hat"
desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts."
icon_state = "policehelm"
flags = 0
flags_inv = HIDEEARS
/obj/item/clothing/head/helmet/riot
name = "riot helmet"
desc = "It's a helmet specifically designed to protect against close range attacks."
icon_state = "riot"
item_state = "helmet"
flags = HEADCOVERSEYES | HEADCOVERSMOUTH
armor = list(melee = 82, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
/obj/item/clothing/head/helmet/swat
name = "\improper SWAT helmet"
desc = "A robust helmet used by the SWAT branches planetary security forces."
icon_state = "swat"
item_state = "swat"
armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
/obj/item/clothing/head/helmet/thunderdome
name = "\improper Thunderdome helmet"
desc = "<i>'Let the battle commence!'</i>"
icon_state = "thunderdome"
item_state = "thunderdome"
armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
/obj/item/clothing/head/helmet/roman
name = "roman helmet"
@@ -39,46 +77,6 @@
icon_state = "roman_c"
item_state = "roman_c"
/obj/item/clothing/head/helmet/warden
name = "warden's hat"
desc = "It's a special helmet issued to the Warden of a securiy force. Protects the head from impacts."
icon_state = "policehelm"
flags_inv = 0
/obj/item/clothing/head/helmet/riot
name = "riot helmet"
desc = "It's a helmet specifically designed to protect against close range attacks."
icon_state = "riot"
item_state = "helmet"
flags = HEADCOVERSEYES
armor = list(melee = 82, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEEARS
/obj/item/clothing/head/helmet/swat
name = "\improper SWAT helmet"
desc = "They're often used by highly trained Swat Members."
icon_state = "swat"
flags = HEADCOVERSEYES
item_state = "swat"
armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
flags_inv = HIDEEARS|HIDEEYES
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
/obj/item/clothing/head/helmet/thunderdome
name = "\improper Thunderdome helmet"
desc = "<i>'Let the battle commence!'</i>"
icon_state = "thunderdome"
flags = HEADCOVERSEYES
item_state = "thunderdome"
armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
/obj/item/clothing/head/helmet/gladiator
name = "gladiator helmet"
desc = "Ave, Imperator, morituri te salutant."
+5 -7
View File
@@ -50,7 +50,7 @@
desc = "Someone who wears this will look very smart."
icon_state = "detective"
allowed = list(/obj/item/weapon/reagent_containers/food/snacks/candy_corn, /obj/item/weapon/pen)
armor = list(melee = 50, bullet = 5, laser = 25,energy = 10, bomb = 0, bio = 0, rad = 0)
armor = list(melee = 50, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
//Mime
/obj/item/clothing/head/beret
@@ -64,18 +64,16 @@
desc = "A beret with the security insignia emblazoned on it. For officers that are more inclined towards style than safety."
icon_state = "beret_badge"
/obj/item/clothing/head/beret/sec/navyhos
name = "head of security's beret"
desc = "A beret with the security insignia emblazoned on it. A symbol of excellence, a badge of courage, a mark of distinction."
desc = "A special beret with the Head of Security's insignia emblazoned on it. A symbol of excellence, a badge of courage, a mark of distinction."
icon_state = "hosberet"
/obj/item/clothing/head/beret/sec/navywarden
name = "warden's beret"
desc = "A beret with the security insignia emblazoned on it. Not to be mixed with casual attire."
desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class."
icon_state = "wardenberet"
/obj/item/clothing/head/beret/sec/navyofficer
icon_state = "officerberet"
desc = "A special beret with the security insignia emblazoned on it. For officers with class."
icon_state = "officerberet"
+1 -1
View File
@@ -87,6 +87,6 @@
/obj/item/clothing/head/soft/sec
name = "security cap"
desc = "It's baseball hat in tasteful red colour."
desc = "It's a robust baseball hat in tasteful red colour."
icon_state = "secsoft"
item_color = "sec"
+1 -1
View File
@@ -103,7 +103,7 @@
switch(phrase) //sets the properties of the chosen phrase
if(1) // good cop
phrase_text = "HALT! HALT! HALT! HALT!"
phrase_text = "HALT! HALT! HALT!"
phrase_sound = "halt"
if(2)
phrase_text = "Stop in the name of the Law."
+1 -1
View File
@@ -10,7 +10,7 @@
item_state = "apron"
blood_overlay_type = "armor"
body_parts_covered = CHEST|GROIN
allowed = list(/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/minihoe)
allowed = list(/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/minihoe,/obj/item/weapon/reagent_containers/spray/pestspray,/obj/item/weapon/hatchet,/obj/item/weapon/storage/bag/plants)
//Captain
/obj/item/clothing/suit/captunic
@@ -31,7 +31,6 @@
icon_state = "roman"
item_color = "roman"
item_state = "armor"
armor = list(melee = 25, bullet = 0, laser = 25, energy = 10, bomb = 10, bio = 0, rad = 0)
/obj/item/clothing/under/waiter
name = "waiter's outfit"
+2 -1
View File
@@ -86,7 +86,8 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
return
if(clong && prob(25))
src.loc = clong.loc
x = clong.x
y = clong.y
if (istype(clong, /turf) || istype(clong, /obj))
if(clong.density)
+2
View File
@@ -173,6 +173,8 @@
if(Ninja.mind != Mind) //something has gone wrong!
ERROR("The ninja wasn't assigned the right mind. ;ç;")
Ninja << sound('sound/effects/ninja_greeting.ogg') //so ninja you probably wouldn't even know if you were made one
success_spawn = 1
/*
+35 -35
View File
@@ -360,29 +360,29 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/donut/chaos
/datum/recipe/human/kabob
/datum/recipe/human/kebab
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
result = /obj/item/weapon/reagent_containers/food/snacks/human/kebab
/datum/recipe/monkeykabob
/datum/recipe/monkeykebab
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
result = /obj/item/weapon/reagent_containers/food/snacks/monkeykebab
/datum/recipe/tofukabob
/datum/recipe/tofukebab
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
result = /obj/item/weapon/reagent_containers/food/snacks/tofukebab
/datum/recipe/tofubread
reagents = list("flour" = 15)
@@ -737,21 +737,21 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat
/datum/recipe/spagetti
/datum/recipe/spaghetti
reagents = list("flour" = 5)
result= /obj/item/weapon/reagent_containers/food/snacks/spagetti
result= /obj/item/weapon/reagent_containers/food/snacks/spaghetti
/datum/recipe/boiledspagetti
/datum/recipe/boiledspaghetti
reagents = list("water" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/spagetti,
/obj/item/weapon/reagent_containers/food/snacks/spaghetti,
)
result = /obj/item/weapon/reagent_containers/food/snacks/boiledspagetti
result = /obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti
/datum/recipe/pastatomato
reagents = list("water" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/spagetti,
/obj/item/weapon/reagent_containers/food/snacks/spaghetti,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato,
)
@@ -772,19 +772,19 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/poppypretzel
/datum/recipe/meatballspagetti
/datum/recipe/meatballspaghetti
reagents = list("water" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/spagetti,
/obj/item/weapon/reagent_containers/food/snacks/spaghetti,
/obj/item/weapon/reagent_containers/food/snacks/faggot,
/obj/item/weapon/reagent_containers/food/snacks/faggot,
)
result = /obj/item/weapon/reagent_containers/food/snacks/meatballspagetti
result = /obj/item/weapon/reagent_containers/food/snacks/meatballspaghetti
/datum/recipe/spesslaw
reagents = list("water" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/spagetti,
/obj/item/weapon/reagent_containers/food/snacks/spaghetti,
/obj/item/weapon/reagent_containers/food/snacks/faggot,
/obj/item/weapon/reagent_containers/food/snacks/faggot,
/obj/item/weapon/reagent_containers/food/snacks/faggot,
@@ -878,8 +878,8 @@
/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,
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange,
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/store/orangecake
@@ -889,8 +889,8 @@
/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,
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime,
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/store/limecake
@@ -900,8 +900,8 @@
/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,
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon,
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/store/lemoncake
@@ -919,8 +919,8 @@
/datum/recipe/bloodsoup
reagents = list("blood" = 10)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/grown/bloodtomato,
/obj/item/weapon/reagent_containers/food/snacks/grown/bloodtomato,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood,
)
result = /obj/item/weapon/reagent_containers/food/snacks/bloodsoup
@@ -1023,15 +1023,15 @@
reagents = list("sugar" = 5, "milk" = 5, "flour" = 15)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/egg,
/obj/item/weapon/reagent_containers/food/snacks/grown/goldapple,
/obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold,
)
result = /obj/item/weapon/reagent_containers/food/snacks/appletart
/datum/recipe/herbsalad
items = list(
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/apple,
)
result = /obj/item/weapon/reagent_containers/food/snacks/herbsalad
@@ -1042,18 +1042,18 @@
/datum/recipe/aesirsalad
items = list(
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus,
/obj/item/weapon/reagent_containers/food/snacks/grown/goldapple,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,
/obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold,
)
result = /obj/item/weapon/reagent_containers/food/snacks/aesirsalad
/datum/recipe/validsalad
items = list(
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/potato,
/obj/item/weapon/reagent_containers/food/snacks/faggot,
)
File diff suppressed because it is too large Load Diff
+153 -66
View File
@@ -5,10 +5,10 @@
/obj/item/weapon/grown // Grown weapons
name = "grown_weapon"
icon = 'icons/obj/weapons.dmi'
var/seed = ""
var/seed = null
var/plantname = ""
var/product //a type path
var/lifespan = 20
var/lifespan = 0
var/endurance = 15
var/maturation = 7
var/production = 7
@@ -16,21 +16,33 @@
var/potency = 20
var/plant_type = 0
/obj/item/weapon/grown/New(newloc, potency = 50)
/obj/item/weapon/grown/New(newloc, new_potency = 50)
..()
src.potency = potency
potency = new_potency
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
transform *= TransformUsingVariable(potency, 100, 0.5)
create_reagents(50)
if(seed && lifespan == 0) //This is for adminspawn or map-placed growns. They get the default stats of their seed type. This feels like a hack but people insist on putting these things on the map...
var/obj/item/seeds/S = new seed(src)
lifespan = S.lifespan
endurance = S.endurance
maturation = S.maturation
production = S.production
yield = S.yield
qdel(S) //Foods drop their contents when eaten, so delete the default seed.
/obj/item/weapon/grown/proc/changePotency(newValue) //-QualityVan
potency = newValue
transform *= TransformUsingVariable(potency, 100, 0.5) //Makes the resulting produce's sprite larger or smaller based on potency!
create_reagents(50)
add_juice()
/obj/item/weapon/grown/proc/add_juice()
if(reagents)
return 1
return 0
/obj/item/weapon/grown/log
seed = /obj/item/seeds/towermycelium
name = "tower-cap log"
desc = "It's better than bad, it's good!"
icon = 'icons/obj/harvest.dmi'
@@ -42,31 +54,28 @@
throw_range = 3
plant_type = 2
origin_tech = "materials=1"
seed = "/obj/item/seeds/towermycelium"
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
var/list/accepted = list(/obj/item/weapon/reagent_containers/food/snacks/grown/tobacco,
/obj/item/weapon/reagent_containers/food/snacks/grown/tobacco,
/obj/item/weapon/reagent_containers/food/snacks/grown/tobacco_space,
/obj/item/weapon/reagent_containers/food/snacks/grown/tea_aspera,
/obj/item/weapon/reagent_containers/food/snacks/grown/tea_astra,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus,
/obj/item/weapon/reagent_containers/food/snacks/grown/tea/aspera,
/obj/item/weapon/reagent_containers/food/snacks/grown/tea/astra,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,
/obj/item/weapon/reagent_containers/food/snacks/grown/wheat)
/obj/item/weapon/grown/log/New(var/loc, var/potency = 10)
..()
/obj/item/weapon/grown/log/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || (istype(W, /obj/item/weapon/twohanded/fireaxe) && W:wielded) || istype(W, /obj/item/weapon/melee/energy))
user.show_message("<span class='notice'>You make planks out of the [src]!</span>", 1)
for(var/i=0,i<2,i++)
for(var/i = 0,i < 2,i++)
var/obj/item/stack/sheet/mineral/wood/NG = new (user.loc)
for (var/obj/item/stack/sheet/mineral/wood/G in user.loc)
if(G==NG)
if(G == NG)
continue
if(G.amount>=G.max_amount)
if(G.amount >= G.max_amount)
continue
G.amount += round(potency / 25)
G.attackby(NG, user)
usr << "You add the newly-formed wood to the stack. It now contains [NG.amount] planks."
qdel(src)
@@ -82,9 +91,10 @@
qdel(src)
return
else
usr << "\red You must dry this first."
usr << "<span class ='warning'> You must dry this first.</span>"
/obj/item/weapon/grown/sunflower // FLOWER POWER!
seed = /obj/item/seeds/sunflowerseed
name = "sunflower"
desc = "It's beautiful! A certain person might beat you to death if you trample these."
icon = 'icons/obj/harvest.dmi'
@@ -96,13 +106,14 @@
w_class = 1.0
throw_speed = 1
throw_range = 3
plant_type = 0
seed = "/obj/item/seeds/sunflowerseed"
/obj/item/weapon/grown/sunflower/New(var/loc, var/potency = 10)
..()
/obj/item/weapon/grown/sunflower/attack(mob/M as mob, mob/user as mob)
M << "<font color='green'><b> [user] smacks you with a sunflower!</font><font color='yellow'><b>FLOWER POWER<b></font>"
user << "<font color='green'> Your sunflower's </font><font color='yellow'><b>FLOWER POWER</b></font><font color='green'> strikes [M]</font>"
/obj/item/weapon/grown/novaflower
seed = /obj/item/seeds/novaflowerseed
name = "novaflower"
desc = "These beautiful flowers have a crisp smokey scent, like a summer bonfire."
icon = 'icons/obj/harvest.dmi'
@@ -115,19 +126,40 @@
throw_speed = 1
throw_range = 3
plant_type = 0
seed = "/obj/item/seeds/novaflowerseed"
attack_verb = list("seared", "heated", "whacked", "steamed")
/obj/item/weapon/grown/novaflower/New(var/loc, var/potency = 10)
..()
if(reagents)
reagents.add_reagent("nutriment", 1)
reagents.add_reagent("capsaicin", round(potency, 1))
force = round((5+potency/5), 1)
/obj/item/weapon/grown/nettle // -- Skie
/obj/item/weapon/grown/novaflower/add_juice()
if(..())
reagents.add_reagent("nutriment", 1)
reagents.add_reagent("capsaicin", round((potency / 3.5), 1))
reagents.add_reagent("condensedcapsaicin", round((potency / 4), 1))
force = round((5 + potency / 5), 1)
/obj/item/weapon/grown/novaflower/attack(mob/living/carbon/M as mob, mob/user as mob)
if(!..()) return
if(istype(M, /mob/living))
M << "\red You are heated by the warmth of the of the [name]!"
M.bodytemperature += potency / 2 * TEMPERATURE_DAMAGE_COEFFICIENT
/obj/item/weapon/grown/novaflower/afterattack(atom/A as mob|obj, mob/user as mob,proximity)
if(!proximity) return
if(endurance > 0)
endurance -= rand(1, (endurance / 3) + 1)
else
usr << "All the petals have fallen off the [name] from violent whacking."
usr.unEquip(src)
qdel(src)
/obj/item/weapon/grown/novaflower/pickup(mob/living/carbon/human/user as mob)
if(!user.gloves)
user << "\red The [name] burns your bare hand!"
user.adjustFireLoss(rand(1, 5))
/obj/item/weapon/grown/nettle //abstract type
name = "abstract nettle"
desc = "It's probably <B>not</B> wise to touch it with bare hands..."
icon = 'icons/obj/weapons.dmi'
name = "nettle"
icon_state = "nettle"
damtype = "fire"
force = 15
@@ -138,41 +170,83 @@
throw_range = 3
plant_type = 1
origin_tech = "combat=1"
seed = "/obj/item/seeds/nettleseed"
/obj/item/weapon/grown/nettle/New(var/loc, var/potency = 10)
..()
if(reagents)
reagents.add_reagent("nutriment", 1)
reagents.add_reagent("sacid", round(potency, 1))
force = round((5+potency/5), 1)
/obj/item/weapon/grown/deathnettle // -- Skie
desc = "The \red glowing \black nettle incites \red<B> rage</B>\black in you just from looking at it!"
icon = 'icons/obj/weapons.dmi'
name = "deathnettle"
icon_state = "deathnettle"
damtype = "fire"
force = 30
hitsound = 'sound/weapons/bladeslice.ogg'
throwforce = 15
w_class = 1.0
throw_speed = 1
throw_range = 3
plant_type = 1
seed = "/obj/item/seeds/deathnettleseed"
origin_tech = "combat=3"
attack_verb = list("stung")
/obj/item/weapon/grown/deathnettle/New(var/loc, var/potency = 10)
..()
if(reagents)
reagents.add_reagent("nutriment", 1)
reagents.add_reagent("pacid", round(potency, 1))
force = round((5+potency/2.5), 1)
/obj/item/weapon/grown/deathnettle/suicide_act(mob/user)
/obj/item/weapon/grown/nettle/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is eating some of the [src.name]! It looks like \he's trying to commit suicide.</span>")
return (BRUTELOSS|TOXLOSS)
/obj/item/weapon/grown/nettle/pickup(mob/living/carbon/human/user as mob)
if(!user.gloves)
user << "\red The nettle burns your bare hand!"
if(istype(user, /mob/living/carbon/human))
var/organ = ((user.hand ? "l_":"r_") + "arm")
var/obj/item/organ/limb/affecting = user.get_organ(organ)
if(affecting.take_damage(0, force))
user.update_damage_overlays(0)
else
user.take_organ_damage(0,force)
/obj/item/weapon/grown/nettle/afterattack(atom/A as mob|obj, mob/user as mob,proximity)
if(!proximity) return
if(force > 0)
force -= rand(1, (force / 3) + 1) // When you whack someone with it, leaves fall off
else
usr << "All the leaves have fallen off the nettle from violent whacking."
usr.unEquip(src)
qdel(src)
/obj/item/weapon/grown/nettle/basic
seed = /obj/item/seeds/nettleseed
name = "nettle"
/obj/item/weapon/grown/nettle/basic/add_juice()
..()
reagents.add_reagent("sacid", round((potency / 2), 1))
force = round((5 + potency / 5), 1)
/obj/item/weapon/grown/nettle/death
seed = /obj/item/seeds/deathnettleseed
name = "deathnettle"
desc = "The \red glowing \black nettle incites \red<B> rage</B>\black in you just from looking at it!"
icon_state = "deathnettle"
force = 30
throwforce = 15
origin_tech = "combat=3"
/obj/item/weapon/grown/nettle/death/add_juice()
..()
reagents.add_reagent("pacid", round((potency / 2), 1))
force = round((5 + potency / 2.5), 1)
/obj/item/weapon/grown/nettle/death/pickup(mob/living/carbon/human/user as mob)
if(!user.gloves)
if(istype(user, /mob/living/carbon/human))
var/organ = ((user.hand ? "l_":"r_") + "arm")
var/obj/item/organ/limb/affecting = user.get_organ(organ)
if(affecting.take_damage(0, force))
user.update_damage_overlays(0)
else
user.take_organ_damage(0, force)
if(prob(50))
user.Paralyse(5)
user << "\red You are stunned by the Deathnettle when you try picking it up!"
/obj/item/weapon/grown/nettle/death/attack(mob/living/carbon/M as mob, mob/user as mob)
if(!..()) return
if(istype(M, /mob/living))
M << "\red You are stunned by the powerful acid of the Deathnettle!"
add_logs(user, M, "attacked", object= "[src.name]")
M.eye_blurry += force/7
if(prob(20))
M.Paralyse(force / 6)
M.Weaken(force / 15)
M.drop_item()
/obj/item/weapon/grown/bananapeel
name = "banana peel"
desc = "A peel from a banana."
@@ -183,8 +257,14 @@
throwforce = 0
throw_speed = 3
throw_range = 7
/obj/item/weapon/grown/bananapeel/New(var/loc, var/potency = 10)
..()
/obj/item/weapon/grown/bananapeel/Crossed(AM as mob|obj)
if (istype(AM, /mob/living/carbon))
var/mob/living/carbon/M = AM
var/stun = Clamp(potency / 10, 1, 10)
var/weaken = Clamp(potency / 20, 0.5, 5)
M.slip(stun, weaken, src)
/obj/item/weapon/grown/corncob
name = "corn cob"
@@ -196,5 +276,12 @@
throwforce = 0
throw_speed = 3
throw_range = 7
/obj/item/weapon/grown/corncob/New(var/loc, var/potency = 10)
/obj/item/weapon/grown/corncob/attackby(obj/item/weapon/grown/W as obj, mob/user as mob)
..()
if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/utensil/knife))
user << "<span class='notice'>You use [W] to fashion a pipe out of the corn cob!</span>"
new /obj/item/clothing/mask/cigarette/pipe/cobpipe (user.loc)
usr.unEquip(src)
qdel(src)
return
-157
View File
@@ -1,157 +0,0 @@
/* Hydroponic Item Procs and Stuff
* Contains:
* Sunflowers Novaflowers Nettle Deathnettle Corncob
*/
//Sun/Novaflower
/obj/item/weapon/grown/sunflower/attack(mob/M as mob, mob/user as mob)
M << "<font color='green'><b> [user] smacks you with a sunflower!</font><font color='yellow'><b>FLOWER POWER<b></font>"
user << "<font color='green'> Your sunflower's </font><font color='yellow'><b>FLOWER POWER</b></font><font color='green'> strikes [M]</font>"
/obj/item/weapon/grown/novaflower/attack(mob/living/carbon/M as mob, mob/user as mob)
if(!..()) return
if(istype(M, /mob/living))
M << "\red You are heated by the warmth of the of the [name]!"
M.bodytemperature += potency/2 * TEMPERATURE_DAMAGE_COEFFICIENT
/obj/item/weapon/grown/novaflower/afterattack(atom/A as mob|obj, mob/user as mob,proximity)
if(!proximity) return
if(endurance > 0)
endurance -= rand(1,(endurance/3)+1)
else
usr << "All the petals have fallen off the [name] from violent whacking."
usr.unEquip(src)
qdel(src)
/obj/item/weapon/grown/novaflower/pickup(mob/living/carbon/human/user as mob)
if(!user.gloves)
user << "\red The [name] burns your bare hand!"
user.adjustFireLoss(rand(1,5))
//Nettle
/obj/item/weapon/grown/nettle/pickup(mob/living/carbon/human/user as mob)
if(!user.gloves)
user << "\red The nettle burns your bare hand!"
if(istype(user, /mob/living/carbon/human))
var/organ = ((user.hand ? "l_":"r_") + "arm")
var/obj/item/organ/limb/affecting = user.get_organ(organ)
if(affecting.take_damage(0,force))
user.update_damage_overlays(0)
else
user.take_organ_damage(0,force)
/obj/item/weapon/grown/nettle/afterattack(atom/A as mob|obj, mob/user as mob,proximity)
if(!proximity) return
if(force > 0)
force -= rand(1,(force/3)+1) // When you whack someone with it, leaves fall off
else
usr << "All the leaves have fallen off the nettle from violent whacking."
usr.unEquip(src)
qdel(src)
/obj/item/weapon/grown/nettle/changePotency(newValue) //-QualityVan
..()
force = round((5+potency/5), 1)
//Deathnettle
/obj/item/weapon/grown/deathnettle/pickup(mob/living/carbon/human/user as mob)
if(!user.gloves)
if(istype(user, /mob/living/carbon/human))
var/organ = ((user.hand ? "l_":"r_") + "arm")
var/obj/item/organ/limb/affecting = user.get_organ(organ)
if(affecting.take_damage(0,force))
user.update_damage_overlays(0)
else
user.take_organ_damage(0,force)
if(prob(50))
user.Paralyse(5)
user << "\red You are stunned by the Deathnettle when you try picking it up!"
/obj/item/weapon/grown/deathnettle/attack(mob/living/carbon/M as mob, mob/user as mob)
if(!..()) return
if(istype(M, /mob/living))
M << "\red You are stunned by the powerful acid of the Deathnettle!"
add_logs(user, M, "attacked", object="[src.name]")
M.eye_blurry += force/7
if(prob(20))
M.Paralyse(force/6)
M.Weaken(force/15)
M.drop_item()
/obj/item/weapon/grown/deathnettle/afterattack(atom/A as mob|obj, mob/user as mob,proximity)
if(!proximity) return
if (force > 0)
force -= rand(1,(force/3)+1) // When you whack someone with it, leaves fall off
else
usr << "All the leaves have fallen off the deathnettle from violent whacking."
usr.unEquip(src)
qdel(src)
/obj/item/weapon/grown/deathnettle/changePotency(newValue) //-QualityVan
..()
force = round((5+potency/2.5), 1)
//Corncob
/obj/item/weapon/grown/corncob/attackby(obj/item/weapon/grown/W as obj, mob/user as mob)
..()
if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/utensil/knife))
user << "<span class='notice'>You use [W] to fashion a pipe out of the corn cob!</span>"
new /obj/item/clothing/mask/cigarette/pipe/cobpipe (user.loc)
usr.unEquip(src)
qdel(src)
return
//Bluespace Tomatoes
/obj/item/weapon/reagent_containers/food/snacks/grown/bluespacetomato/throw_impact(atom/hit_atom)
..()
var/mob/M = usr
var/outer_teleport_radius = potency/10 //Plant potency determines radius of teleport.
var/inner_teleport_radius = potency/15
var/list/turfs = new/list()
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
if(inner_teleport_radius < 1) //Wasn't potent enough, it just splats.
new/obj/effect/decal/cleanable/oil(src.loc)
src.visible_message("<span class='notice'>The [src.name] has been squashed.</span>","<span class='moderate'>You hear a smack.</span>")
usr.unEquip(src)
qdel(src)
return
for(var/turf/T in orange(M,outer_teleport_radius))
if(T in orange(M,inner_teleport_radius)) continue
if(istype(T,/turf/space)) continue
if(T.density) continue
if(T.x>world.maxx-outer_teleport_radius || T.x<outer_teleport_radius) continue
if(T.y>world.maxy-outer_teleport_radius || T.y<outer_teleport_radius) continue
turfs += T
if(!turfs.len)
var/list/turfs_to_pick_from = list()
for(var/turf/T in orange(M,outer_teleport_radius))
if(!(T in orange(M,inner_teleport_radius)))
turfs_to_pick_from += T
turfs += pick(/turf in turfs_to_pick_from)
var/turf/picked = pick(turfs)
if(!isturf(picked)) return
switch(rand(1,2))//Decides randomly to teleport the thrower or the throwee.
if(1) // Teleports the person who threw the tomato.
s.set_up(3, 1, M)
s.start()
new/obj/effect/decal/cleanable/molten_item(M.loc) //Leaves a pile of goo behind for dramatic effect.
M.loc = picked //
sleep(1)
s.set_up(3, 1, M)
s.start() //Two set of sparks, one before the teleport and one after.
if(2) //Teleports mob the tomato hit instead.
for(var/mob/A in get_turf(hit_atom))//For the mobs in the tile that was hit...
s.set_up(3, 1, A)
s.start()
new/obj/effect/decal/cleanable/molten_item(A.loc) //Leave a pile of goo behind for dramatic effect...
A.loc = picked//And teleport them to the chosen location.
sleep(1)
s.set_up(3, 1, A)
s.start()
new/obj/effect/decal/cleanable/oil(src.loc)
src.visible_message("<span class='notice'>The [src.name] has been squashed, causing a distortion in space-time.</span>","<span class='moderate'>You hear a splat and a crackle.</span>")
qdel(src)
return
+85 -187
View File
@@ -71,7 +71,7 @@
for(var/step_dir in cardinal)
var/obj/machinery/hydroponics/h = locate() in get_step(a, step_dir)
if(h && h.anchored==2 && !(h in connected) && !(h in processing_atoms))
if(h && h.anchored==1 && h.density && !(h in connected) && !(h in processing_atoms)) // Soil plots aren't dense, and don't get this feature.
processing_atoms += h
processing_atoms -= a
@@ -90,7 +90,7 @@
if(myseed.yield == 0)//Oh god don't divide by zero you'll doom us all.
adjustSYield(1)
//world << "Yield increased by 1, from 0, to a total of [myseed.yield]"
else if(prob(1/(myseed.yield * myseed.yield) *100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2...
else if(prob(1/(myseed.yield * myseed.yield) * 100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2...
adjustSYield(1)
//world << "Yield increased by 1, to a total of [myseed.yield]"
else
@@ -233,7 +233,7 @@ obj/machinery/hydroponics/update_icon()
for(var/Dir in cardinal)
var/obj/machinery/hydroponics/t = locate() in get_step(src,Dir)
if(t && t.anchored==2 && src.anchored==2)
if(t && t.anchored == 2 && src.anchored == 2)
n += Dir
icon_state = "hoses-[n]"
@@ -242,29 +242,29 @@ obj/machinery/hydroponics/update_icon()
if(planted)
if(dead)
overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-dead")
overlays += image('icons/obj/hydroponics.dmi', icon_state = "[myseed.species]-dead")
else if(harvest)
if(myseed.plant_type == 2) // Shrooms don't have a -harvest graphic
overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[myseed.growthstages]")
overlays += image('icons/obj/hydroponics.dmi', icon_state = "[myseed.species]-grow[myseed.growthstages]")
else
overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-harvest")
overlays += image('icons/obj/hydroponics.dmi', icon_state = "[myseed.species]-harvest")
else if(age < myseed.maturation)
var/t_growthstate = ((age / myseed.maturation) * myseed.growthstages ) // Make sure it won't crap out due to HERPDERP 6 stages only
overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[round(t_growthstate)]")
overlays += image('icons/obj/hydroponics.dmi', icon_state = "[myseed.species]-grow[round(t_growthstate)]")
lastproduce = age //Cheating by putting this here, it means that it isn't instantly ready to harvest
else
overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[myseed.growthstages]") // Same
overlays += image('icons/obj/hydroponics.dmi', icon_state = "[myseed.species]-grow[myseed.growthstages]") // Same
if(waterlevel <= 10)
overlays += image('icons/obj/hydroponics.dmi', icon_state="over_lowwater3")
overlays += image('icons/obj/hydroponics.dmi', icon_state =" over_lowwater3")
if(nutrilevel <= 2)
overlays += image('icons/obj/hydroponics.dmi', icon_state="over_lownutri3")
overlays += image('icons/obj/hydroponics.dmi', icon_state = "over_lownutri3")
if(health <= (myseed.endurance / 2))
overlays += image('icons/obj/hydroponics.dmi', icon_state="over_lowhealth3")
overlays += image('icons/obj/hydroponics.dmi', icon_state = "over_lowhealth3")
if(weedlevel >= 5 || pestlevel >= 5 || toxic >= 40)
overlays += image('icons/obj/hydroponics.dmi', icon_state="over_alert3")
overlays += image('icons/obj/hydroponics.dmi', icon_state = "over_alert3")
if(harvest)
overlays += image('icons/obj/hydroponics.dmi', icon_state="over_harvest3")
overlays += image('icons/obj/hydroponics.dmi', icon_state = "over_harvest3")
if(istype(myseed,/obj/item/seeds/glowshroom))
SetLuminosity(round(myseed.potency / 10))
@@ -318,7 +318,7 @@ obj/machinery/hydroponics/proc/weedinvasion() // If a weed growth is sufficient,
visible_message("<span class='info'>[oldPlantName] overtaken by [myseed.plantname].</span>")
obj/machinery/hydroponics/proc/mutate(var/lifemut=2, var/endmut=5, var/productmut=1, var/yieldmut=2, var/potmut=25) // Mutates the current seed
obj/machinery/hydroponics/proc/mutate(var/lifemut = 2, var/endmut = 5, var/productmut = 1, var/yieldmut = 2, var/potmut = 25) // Mutates the current seed
if(!planted)
return
adjustSLife(rand(-lifemut,lifemut))
@@ -421,146 +421,146 @@ obj/machinery/hydroponics/proc/applyChemicals(var/datum/reagents/S)
// After handling the mutating, we now handle the damage from adding crude radioactives...
if(S.has_reagent("uranium", 1))
adjustHealth(-round(S.get_reagent_amount("uranium")*1))
adjustToxic(round(S.get_reagent_amount("uranium")*2))
adjustHealth(-round(S.get_reagent_amount("uranium") * 1))
adjustToxic(round(S.get_reagent_amount("uranium") * 2))
if(S.has_reagent("radium", 1))
adjustHealth(-round(S.get_reagent_amount("radium")*1))
adjustToxic(round(S.get_reagent_amount("radium")*3)) // Radium is harsher (OOC: also easier to produce)
adjustHealth(-round(S.get_reagent_amount("radium") * 1))
adjustToxic(round(S.get_reagent_amount("radium") * 3)) // Radium is harsher (OOC: also easier to produce)
// Nutriments
if(S.has_reagent("eznutriment", 1))
yieldmod = 1
mutmod = 1
adjustNutri(round(S.get_reagent_amount("eznutriment")*1))
adjustNutri(round(S.get_reagent_amount("eznutriment") * 1))
if(S.has_reagent("left4zednutriment", 1))
yieldmod = 0
mutmod = 2
adjustNutri(round(S.get_reagent_amount("left4zednutriment")*1))
adjustNutri(round(S.get_reagent_amount("left4zednutriment") * 1))
if(S.has_reagent("robustharvestnutriment", 1))
yieldmod = 2
mutmod = 0
adjustNutri(round(S.get_reagent_amount("robustharvestnutriment")*1))
adjustNutri(round(S.get_reagent_amount("robustharvestnutriment") *1 ))
// Antitoxin binds shit pretty well. So the tox goes significantly down
if(S.has_reagent("anti_toxin", 1))
adjustToxic(-round(S.get_reagent_amount("anti_toxin")*2))
adjustToxic(-round(S.get_reagent_amount("anti_toxin") * 2))
// NIGGA, YOU JUST WENT ON FULL RETARD.
if(S.has_reagent("toxin", 1))
adjustToxic(round(S.get_reagent_amount("toxin")*2))
adjustToxic(round(S.get_reagent_amount("toxin") * 2))
// Milk is good for humans, but bad for plants. The sugars canot be used by plants, and the milk fat fucks up growth. Not shrooms though. I can't deal with this now...
if(S.has_reagent("milk", 1))
adjustNutri(round(S.get_reagent_amount("milk")*0.1))
adjustWater(round(S.get_reagent_amount("milk")*0.9))
adjustNutri(round(S.get_reagent_amount("milk") * 0.1))
adjustWater(round(S.get_reagent_amount("milk") * 0.9))
// Beer is a chemical composition of alcohol and various other things. It's a shitty nutrient but hey, it's still one. Also alcohol is bad, mmmkay?
if(S.has_reagent("beer", 1))
adjustHealth(-round(S.get_reagent_amount("beer")*0.05))
adjustNutri(round(S.get_reagent_amount("beer")*0.25))
adjustWater(round(S.get_reagent_amount("beer")*0.7))
adjustHealth(-round(S.get_reagent_amount("beer") * 0.05))
adjustNutri(round(S.get_reagent_amount("beer") * 0.25))
adjustWater(round(S.get_reagent_amount("beer") * 0.7))
// You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial
if(S.has_reagent("fluorine", 1))
adjustHealth(-round(S.get_reagent_amount("fluorine")*2))
adjustToxic(round(S.get_reagent_amount("flourine")*2.5))
adjustWater(-round(S.get_reagent_amount("flourine")*0.5))
adjustHealth(-round(S.get_reagent_amount("fluorine") * 2))
adjustToxic(round(S.get_reagent_amount("flourine") * 2.5))
adjustWater(-round(S.get_reagent_amount("flourine") * 0.5))
adjustWeeds(-rand(1,4))
// You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial
if(S.has_reagent("chlorine", 1))
adjustHealth(-round(S.get_reagent_amount("chlorine")*1))
adjustToxic(round(S.get_reagent_amount("chlorine")*1.5))
adjustWater(-round(S.get_reagent_amount("chlorine")*0.5))
adjustHealth(-round(S.get_reagent_amount("chlorine") * 1))
adjustToxic(round(S.get_reagent_amount("chlorine") * 1.5))
adjustWater(-round(S.get_reagent_amount("chlorine") * 0.5))
adjustWeeds(-rand(1,3))
// White Phosphorous + water -> phosphoric acid. That's not a good thing really. Phosphoric salts are beneficial though. And even if the plant suffers, in the long run the tray gets some nutrients. The benefit isn't worth that much.
if(S.has_reagent("phosphorus", 1))
adjustHealth(-round(S.get_reagent_amount("phosphorus")*0.75))
adjustNutri(round(S.get_reagent_amount("phosphorus")*0.1))
adjustWater(-round(S.get_reagent_amount("phosphorus")*0.5))
adjustHealth(-round(S.get_reagent_amount("phosphorus") * 0.75))
adjustNutri(round(S.get_reagent_amount("phosphorus") * 0.1))
adjustWater(-round(S.get_reagent_amount("phosphorus") * 0.5))
adjustWeeds(-rand(1,2))
// Plants should not have sugar, they can't use it and it prevents them getting water/ nutients, it is good for mold though...
if(S.has_reagent("sugar", 1))
adjustWeeds(rand(1,2))
adjustPests(rand(1,2))
adjustNutri(round(S.get_reagent_amount("sugar")*0.1))
adjustNutri(round(S.get_reagent_amount("sugar") * 0.1))
// It is water!
if(S.has_reagent("water", 1))
adjustWater(round(S.get_reagent_amount("water")*1))
adjustWater(round(S.get_reagent_amount("water") * 1))
// Holy water. Mostly the same as water, it also heals the plant a little with the power of the spirits~
if(S.has_reagent("holywater", 1))
adjustWater(round(S.get_reagent_amount("holywater")*1))
adjustHealth(round(S.get_reagent_amount("holywater")*0.1))
adjustWater(round(S.get_reagent_amount("holywater") * 1))
adjustHealth(round(S.get_reagent_amount("holywater") * 0.1))
// A variety of nutrients are dissolved in club soda, without sugar. These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth.
if(S.has_reagent("sodawater", 1))
adjustWater(round(S.get_reagent_amount("sodawater")*1))
adjustHealth(round(S.get_reagent_amount("sodawater")*0.1))
adjustNutri(round(S.get_reagent_amount("sodawater")*0.1))
adjustWater(round(S.get_reagent_amount("sodawater") * 1))
adjustHealth(round(S.get_reagent_amount("sodawater") * 0.1))
adjustNutri(round(S.get_reagent_amount("sodawater") * 0.1))
// Man, you guys are retards
if(S.has_reagent("sacid", 1))
adjustHealth(-round(S.get_reagent_amount("sacid")*1))
adjustToxic(round(S.get_reagent_amount("sacid")*1.5))
adjustHealth(-round(S.get_reagent_amount("sacid") * 1))
adjustToxic(round(S.get_reagent_amount("sacid") * 1.5))
adjustWeeds(-rand(1,2))
// SERIOUSLY
if(S.has_reagent("pacid", 1))
adjustHealth(-round(S.get_reagent_amount("pacid")*2))
adjustToxic(round(S.get_reagent_amount("pacid")*3))
adjustHealth(-round(S.get_reagent_amount("pacid") * 2))
adjustToxic(round(S.get_reagent_amount("pacid") * 3))
adjustWeeds(-rand(1,4))
// Plant-B-Gone is just as bad
if(S.has_reagent("plantbgone", 1))
adjustHealth(-round(S.get_reagent_amount("plantbgone")*2))
adjustToxic(-round(S.get_reagent_amount("plantbgone")*3))
adjustHealth(-round(S.get_reagent_amount("plantbgone") * 5))
adjustToxic(-round(S.get_reagent_amount("plantbgone") * 6))
adjustWeeds(-rand(4,8))
//Weed Spray
if(S.has_reagent("weedkiller", 1))
adjustToxic(round(S.get_reagent_amount("weedkiller")*0.5))
adjustToxic(round(S.get_reagent_amount("weedkiller") * 0.5))
//old toxicity was 4, each spray is default 10 (minimal of 5) so 5 and 2.5 are the new ammounts
adjustWeeds(-rand(1,2))
//Pest Spray
if(S.has_reagent("pestkiller", 1))
adjustToxic(round(S.get_reagent_amount("pestkiller")*0.5))
adjustToxic(round(S.get_reagent_amount("pestkiller") * 0.5))
adjustPests(-rand(1,2))
// Healing
if(S.has_reagent("cryoxadone", 1))
adjustHealth(round(S.get_reagent_amount("cryoxadone")*3))
adjustToxic(-round(S.get_reagent_amount("cryoxadone")*3))
adjustHealth(round(S.get_reagent_amount("cryoxadone") * 3))
adjustToxic(-round(S.get_reagent_amount("cryoxadone") * 3))
// Ammonia is bad ass.
if(S.has_reagent("ammonia", 1))
adjustHealth(round(S.get_reagent_amount("ammonia")*0.5))
adjustNutri(round(S.get_reagent_amount("ammonia")*1))
adjustSYield(round(S.get_reagent_amount("ammonia")*0.01))
adjustHealth(round(S.get_reagent_amount("ammonia") * 0.5))
adjustNutri(round(S.get_reagent_amount("ammonia") * 1))
adjustSYield(round(S.get_reagent_amount("ammonia") * 0.01))
// This is more bad ass, and pests get hurt by the corrosive nature of it, not the plant.
if(S.has_reagent("diethylamine", 1))
adjustHealth(round(S.get_reagent_amount("diethylamine")*1))
adjustNutri(round(S.get_reagent_amount("diethylamine")*2))
adjustSYield(round(S.get_reagent_amount("diethylamine")*0.02))
adjustHealth(round(S.get_reagent_amount("diethylamine") * 1))
adjustNutri(round(S.get_reagent_amount("diethylamine") * 2))
adjustSYield(round(S.get_reagent_amount("diethylamine") * 0.02))
adjustPests(-rand(1,2))
// Compost, effectively
if(S.has_reagent("nutriment", 1))
adjustHealth(round(S.get_reagent_amount("nutriment")*0.5))
adjustNutri(round(S.get_reagent_amount("nutriment")*1))
adjustHealth(round(S.get_reagent_amount("nutriment") * 0.5))
adjustNutri(round(S.get_reagent_amount("nutriment") * 1))
// The best stuff there is. For testing/debugging.
if(S.has_reagent("adminordrazine", 1))
adjustWater(round(S.get_reagent_amount("adminordrazine")*1))
adjustHealth(round(S.get_reagent_amount("adminordrazine")*1))
adjustNutri(round(S.get_reagent_amount("adminordrazine")*1))
adjustWater(round(S.get_reagent_amount("adminordrazine") * 1))
adjustHealth(round(S.get_reagent_amount("adminordrazine") * 1))
adjustNutri(round(S.get_reagent_amount("adminordrazine") * 1))
adjustPests(-rand(1,5))
adjustWeeds(-rand(1,5))
if(S.has_reagent("adminordrazine", 5))
@@ -597,9 +597,8 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(reagent_source, /obj/item/weapon/reagent_containers/syringe/))
var/obj/item/weapon/reagent_containers/syringe/syr = reagent_source
visi_msg="[user] injects [target] with [syr]"
if(syr.reagents.total_volume <= 0)
if(syr.reagents.total_volume <= syr.amount_per_transfer_from_this)
syr.mode = 0
syr.update_icon()
else if(istype(reagent_source, /obj/item/weapon/reagent_containers/spray/))
visi_msg="[user] sprays [target] with [reagent_source]"
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
@@ -611,10 +610,10 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(reagent_source, /obj/item/weapon/reagent_containers/glass/))
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
if(irrigate && reagent_source.amount_per_transfer_from_this > 30 && reagent_source.reagents.total_volume >= reagent_source.amount_per_transfer_from_this)
if(irrigate && reagent_source.amount_per_transfer_from_this > 30 && reagent_source.reagents.total_volume >= 30)
trays = FindConnected()
if (trays.len > 1)
visi_msg += " setting off the irrigation system"
visi_msg += ", setting off the irrigation system"
if(visi_msg)
visible_message("<span class='notice'>[visi_msg].</span>")
@@ -636,6 +635,8 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
S.clear_reagents()
del(S)
H.update_icon()
if(reagent_source) // If the source wasn't composted and destroyed
reagent_source.update_icon()
return 1
else if(istype(O, /obj/item/seeds/))
@@ -668,19 +669,19 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
user << "-Plant Production: <span class='notice'> [myseed.production]</span>"
if(myseed.potency != -1)
user << "-Plant Potency: <span class='notice'> [myseed.potency]</span>"
user << "-Weed level: <span class='notice'> [weedlevel]/10</span>"
user << "-Pest level: <span class='notice'> [pestlevel]/10</span>"
user << "-Toxicity level: <span class='notice'> [toxic]/100</span>"
user << "-Water level: <span class='notice'> [waterlevel]/[maxwater]</span>"
user << "-Nutrition level: <span class='notice'> [nutrilevel]/[maxnutri]</span>"
user << "-Weed level: <span class='notice'> [weedlevel] / 10</span>"
user << "-Pest level: <span class='notice'> [pestlevel] / 10</span>"
user << "-Toxicity level: <span class='notice'> [toxic] / 100</span>"
user << "-Water level: <span class='notice'> [waterlevel] / [maxwater]</span>"
user << "-Nutrition level: <span class='notice'> [nutrilevel] / [maxnutri]</span>"
user << ""
else
user << "<B>No plant found.</B>"
user << "-Weed level: <span class='notice'> [weedlevel]/10</span>"
user << "-Pest level: <span class='notice'> [pestlevel]/10</span>"
user << "-Toxicity level: <span class='notice'> [toxic]/100</span>"
user << "-Water level: <span class='notice'> [waterlevel]/[maxwater]</span>"
user << "-Nutrition level: <span class='notice'> [nutrilevel]/[maxnutri]</span>"
user << "-Weed level: <span class='notice'> [weedlevel] / 10</span>"
user << "-Pest level: <span class='notice'> [pestlevel] / 10</span>"
user << "-Toxicity level: <span class='notice'> [toxic] / 100</span>"
user << "-Water level: <span class='notice'> [waterlevel] / [maxwater]</span>"
user << "-Nutrition level: <span class='notice'> [nutrilevel] / [maxnutri]</span>"
user << ""
else if(istype(O, /obj/item/weapon/minihoe))
@@ -774,7 +775,6 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
var/obj/item/weapon/reagent_containers/food/snacks/grown/t_prod = new product(user.loc, potency)
result.Add(t_prod) // User gets a consumable
if(!t_prod) return
t_prod.seed = type
t_prod.lifespan = lifespan
t_prod.endurance = endurance
t_prod.maturation = maturation
@@ -787,81 +787,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
parent.update_tray()
return result
/*
/obj/item/seeds/grassseed/harvest(mob/user = usr)
var/obj/machinery/hydroponics/parent = loc //for ease of access
var/t_yield = round(yield*parent.yieldmod)
if(t_yield > 0)
var/obj/item/stack/tile/grass/new_grass = new/obj/item/stack/tile/grass(user.loc)
new_grass.amount = t_yield
parent.update_tray()
/obj/item/seeds/gibtomato/harvest(mob/user = usr)
var/obj/machinery/hydroponics/parent = loc //for ease of access
var/t_amount = 0
while (t_amount < getYield())
var/obj/item/weapon/reagent_containers/food/snacks/grown/t_prod = new product(user.loc, potency) // User gets a consumable
t_prod.seed = type
t_prod.lifespan = lifespan
t_prod.endurance = endurance
t_prod.maturation = maturation
t_prod.production = production
t_prod.yield = yield
t_prod.potency = potency
t_prod.plant_type = plant_type
t_amount++
parent.update_tray()
*/
/obj/item/seeds/nettleseed/harvest(mob/user = usr)
var/obj/machinery/hydroponics/parent = loc //for ease of access
var/t_amount = 0
while(t_amount < getYield())
var/obj/item/weapon/grown/t_prod = new product(user.loc, potency) // User gets a consumable -QualityVan
t_prod.seed = type
t_prod.lifespan = lifespan
t_prod.endurance = endurance
t_prod.maturation = maturation
t_prod.production = production
t_prod.yield = yield
t_prod.changePotency(potency) // -QualityVan
t_prod.plant_type = plant_type
t_amount++
parent.update_tray()
/obj/item/seeds/deathnettleseed/harvest(mob/user = usr) //isn't a nettle subclass yet, so
var/obj/machinery/hydroponics/parent = loc //for ease of access
var/t_amount = 0
while(t_amount < getYield())
var/obj/item/weapon/grown/t_prod = new product(user.loc, potency) // User gets a consumable -QualityVan
t_prod.seed = type
t_prod.lifespan = lifespan
t_prod.endurance = endurance
t_prod.maturation = maturation
t_prod.production = production
t_prod.yield = yield
t_prod.changePotency(potency) // -QualityVan
t_prod.plant_type = plant_type
t_amount++
parent.update_tray()
/obj/item/seeds/eggyseed/harvest(mob/user = usr)
var/obj/machinery/hydroponics/parent = loc //for ease of access
var/t_amount = 0
while(t_amount < getYield())
new product(user.loc)
t_amount++
parent.update_tray()
/obj/item/seeds/replicapod/harvest(mob/user = usr) //now that one is fun -- Urist
var/obj/machinery/hydroponics/parent = loc
@@ -926,34 +852,6 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
parent.update_tray()
/obj/item/seeds/replicapod/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/reagent_containers))
if(ckey == null)
user << "You inject the contents of the syringe into the seeds."
for(var/datum/reagent/blood/bloodSample in W:reagents.reagent_list)
var/mob/living/carbon/human/source = bloodSample.data["donor"] //hacky, since it gets the CURRENT condition of the mob, not how it was when the blood sample was taken
if(!istype(source))
continue
//ui = bloodSample.data["blood_dna"] doesn't work for whatever reason
ui = source.dna.uni_identity
se = source.dna.struc_enzymes
if(source.ckey)
ckey = source.ckey
else if(source.mind)
ckey = ckey(source.mind.key)
realName = source.real_name
gender = source.gender
if(!isnull(source.mind))
mind = source.mind
W:reagents.clear_reagents()
else
user << "There is already a genetic sample in these seeds."
else
return ..()
/obj/machinery/hydroponics/proc/update_tray(mob/user = usr)
harvest = 0
lastproduce = age
@@ -1052,18 +950,18 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(planted)
if(dead)
overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-dead")
overlays += image('icons/obj/hydroponics.dmi', icon_state= "[myseed.species]-dead")
else if(harvest)
if(myseed.plant_type == 2) // Shrooms don't have a -harvest graphic
overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[myseed.growthstages]")
overlays += image('icons/obj/hydroponics.dmi', icon_state= "[myseed.species]-grow[myseed.growthstages]")
else
overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-harvest")
overlays += image('icons/obj/hydroponics.dmi', icon_state= "[myseed.species]-harvest")
else if(age < myseed.maturation)
var/t_growthstate = ((age / myseed.maturation) * myseed.growthstages )
overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[round(t_growthstate)]")
overlays += image('icons/obj/hydroponics.dmi', icon_state= "[myseed.species]-grow[round(t_growthstate)]")
lastproduce = age
else
overlays += image('icons/obj/hydroponics.dmi', icon_state="[myseed.species]-grow[myseed.growthstages]")
overlays += image('icons/obj/hydroponics.dmi', icon_state= "[myseed.species]-grow[myseed.growthstages]")
if(!luminosity)
if(istype(myseed,/obj/item/seeds/glowshroom))
+53 -24
View File
@@ -82,6 +82,35 @@
var/datum/mind/mind = null
gender = MALE
/obj/item/seeds/replicapod/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/weapon/reagent_containers))
if(ckey == null)
user << "You inject the contents of the syringe into the seeds."
for(var/datum/reagent/blood/bloodSample in W:reagents.reagent_list)
var/mob/living/carbon/human/source = bloodSample.data["donor"] //hacky, since it gets the CURRENT condition of the mob, not how it was when the blood sample was taken
if(!istype(source))
continue
//ui = bloodSample.data["blood_dna"] doesn't work for whatever reason
ui = source.dna.uni_identity
se = source.dna.struc_enzymes
if(source.ckey)
ckey = source.ckey
else if(source.mind)
ckey = ckey(source.mind.key)
realName = source.real_name
gender = source.gender
if(!isnull(source.mind))
mind = source.mind
W:reagents.clear_reagents()
else
user << "There is already a genetic sample in these seeds."
else
return ..()
/obj/item/seeds/grapeseed
name = "pack of grape seeds"
desc = "These seeds grow into grape vines."
@@ -105,7 +134,7 @@
icon_state = "seed-greengrapes"
species = "greengrape"
plantname = "Green-Grape Vine"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/greengrapes
product = /obj/item/weapon/reagent_containers/food/snacks/grown/grapes/green
lifespan = 50
endurance = 25
maturation = 3
@@ -155,7 +184,7 @@
icon_state = "seed-glowberry"
species = "glowberry"
plantname = "Glow-Berry Bush"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/glowberries
product = /obj/item/weapon/reagent_containers/food/snacks/grown/berries/glow
lifespan = 30
endurance = 25
maturation = 5
@@ -205,7 +234,7 @@
icon_state = "seed-eggy"
species = "eggy"
plantname = "Eggplants"
product = /obj/item/weapon/reagent_containers/food/snacks/egg
product = /obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy
lifespan = 75
endurance = 15
maturation = 6
@@ -221,7 +250,7 @@
icon_state = "seed-bloodtomato"
species = "bloodtomato"
plantname = "Blood-Tomato Plants"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/bloodtomato
product = /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blood
lifespan = 25
endurance = 20
maturation = 8
@@ -255,7 +284,7 @@
icon_state = "seed-killertomato"
species = "killertomato"
plantname = "Killer-Tomato Plants"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/killertomato
product = /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/killer
lifespan = 25
endurance = 15
maturation = 8
@@ -273,7 +302,7 @@
icon_state = "seed-bluetomato"
species = "bluetomato"
plantname = "Blue-Tomato Plants"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/bluetomato
product = /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue
lifespan = 25
endurance = 15
maturation = 8
@@ -291,7 +320,7 @@
icon_state = "seed-bluespacetomato"
species = "bluespacetomato"
plantname = "Blue-Space Tomato Plants"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/bluespacetomato
product = /obj/item/weapon/reagent_containers/food/snacks/grown/tomato/blue/bluespace
lifespan = 25
endurance = 15
maturation = 8
@@ -475,7 +504,7 @@
/obj/item/seeds/angelmycelium
name = "pack of destroying angel mycelium"
desc = "This mycelium grows into something devestating."
desc = "This mycelium grows into something devastating."
icon_state = "mycelium-angel"
species = "angel"
plantname = "Destroying Angels"
@@ -602,7 +631,7 @@
icon_state = "seed-nettle"
species = "nettle"
plantname = "Nettles"
product = /obj/item/weapon/grown/nettle
product = /obj/item/weapon/grown/nettle/basic
lifespan = 30
endurance = 40 // tuff like a toiger
maturation = 6
@@ -620,7 +649,7 @@
icon_state = "seed-deathnettle"
species = "deathnettle"
plantname = "Death Nettles"
product = /obj/item/weapon/grown/deathnettle
product = /obj/item/weapon/grown/nettle/death
lifespan = 30
endurance = 25
maturation = 8
@@ -758,7 +787,7 @@
icon_state = "seed-goldapple"
species = "goldapple"
plantname = "Golden Apple Tree"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/goldapple
product = /obj/item/weapon/reagent_containers/food/snacks/grown/apple/gold
lifespan = 55
endurance = 35
maturation = 10
@@ -775,7 +804,7 @@
icon_state = "seed-ambrosiavulgaris"
species = "ambrosiavulgaris"
plantname = "Ambrosia Vulgaris"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris
product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris
lifespan = 60
endurance = 25
maturation = 6
@@ -792,7 +821,7 @@
icon_state = "seed-ambrosiadeus"
species = "ambrosiadeus"
plantname = "Ambrosia Deus"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiadeus
product = /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus
lifespan = 60
endurance = 25
maturation = 6
@@ -874,7 +903,7 @@
icon_state = "seed-lime"
species = "lime"
plantname = "Lime Tree"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/lime
product = /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime
lifespan = 55
endurance = 50
maturation = 6
@@ -890,7 +919,7 @@
icon_state = "seed-lemon"
species = "lemon"
plantname = "Lemon Tree"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/lemon
product = /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon
lifespan = 55
endurance = 45
maturation = 6
@@ -907,7 +936,7 @@
icon_state = "seed-cash"
species = "cashtree"
plantname = "Money Tree"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/money
product = /obj/item/weapon/reagent_containers/food/snacks/grown/shell/moneyfruit
lifespan = 55
endurance = 45
maturation = 6
@@ -924,7 +953,7 @@
icon_state = "seed-orange"
species = "orange"
plantname = "Orange Tree"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/orange
product = /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange
lifespan = 60
endurance = 50
maturation = 6
@@ -940,7 +969,7 @@
icon_state = "seed-poisonberry"
species = "poisonberry"
plantname = "Poison-Berry Bush"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/poisonberries
product = /obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison
lifespan = 20
endurance = 15
maturation = 5
@@ -958,7 +987,7 @@
icon_state = "seed-deathberry"
species = "deathberry"
plantname = "Death Berry Bush"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/deathberries
product = /obj/item/weapon/reagent_containers/food/snacks/grown/berries/death
lifespan = 30
endurance = 20
maturation = 5
@@ -1095,7 +1124,7 @@
icon_state = "seed-coffeea"
species = "coffeea"
plantname = "Coffee Arabica Bush"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/coffee_arabica
product = /obj/item/weapon/reagent_containers/food/snacks/grown/coffee/arabica
lifespan = 30
endurance = 20
maturation = 5
@@ -1112,7 +1141,7 @@
icon_state = "seed-coffeer"
species = "coffeer"
plantname = "Coffee Robusta Bush"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/coffee_robusta
product = /obj/item/weapon/reagent_containers/food/snacks/grown/coffee/robusta
lifespan = 20
endurance = 15
maturation = 5
@@ -1147,7 +1176,7 @@
icon_state = "seed-stobacco"
species = "stobacco"
plantname = "Space Tobacco Plant"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/tobacco_space
product = /obj/item/weapon/reagent_containers/food/snacks/grown/tobacco/space
lifespan = 20
endurance = 15
maturation = 5
@@ -1165,7 +1194,7 @@
icon_state = "seed-teaaspera"
species = "teaaspera"
plantname = "Tea Aspera Plant"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/tea_aspera
product = /obj/item/weapon/reagent_containers/food/snacks/grown/tea/aspera
lifespan = 20
endurance = 15
maturation = 5
@@ -1182,7 +1211,7 @@
icon_state = "seed-teaastra"
species = "teaastra"
plantname = "Tea Astra Plant"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/tea_astra
product = /obj/item/weapon/reagent_containers/food/snacks/grown/tea/astra
lifespan = 20
endurance = 15
maturation = 5
+10 -10
View File
@@ -160,18 +160,18 @@
new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 100),
new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 150),
new /datum/data/mining_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 150),
new /datum/data/mining_equipment("Stimulant pills", /obj/item/weapon/storage/pill_bottle/stimulant, 350),
new /datum/data/mining_equipment("Alien toy", /obj/item/clothing/mask/facehugger/toy, 250),
new /datum/data/mining_equipment("Laser pointer", /obj/item/device/laser_pointer, 500),
new /datum/data/mining_equipment("Point card", /obj/item/weapon/card/mining_point_card, 500),
new /datum/data/mining_equipment("Lazarus injector", /obj/item/weapon/lazarus_injector, 1000),
new /datum/data/mining_equipment("Space cash", /obj/item/weapon/spacecash/c1000, 5000),
new /datum/data/mining_equipment("Sonic jackhammer", /obj/item/weapon/pickaxe/jackhammer, 500),
new /datum/data/mining_equipment("Mining drone", /mob/living/simple_animal/hostile/mining_drone/, 500),
new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 200),
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 500),
new /datum/data/mining_equipment("Laser Pointer", /obj/item/device/laser_pointer, 500),
new /datum/data/mining_equipment("Stimulant Pills", /obj/item/weapon/storage/pill_bottle/stimulant, 350),
new /datum/data/mining_equipment("Sonic Jackhammer", /obj/item/weapon/pickaxe/jackhammer, 500),
new /datum/data/mining_equipment("Mining Drone", /mob/living/simple_animal/hostile/mining_drone/, 500),
new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 750),
new /datum/data/mining_equipment("Kinetic accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 1000),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 1000),
new /datum/data/mining_equipment("Jetpack", /obj/item/weapon/tank/jetpack/carbondioxide/mining, 2000),
new /datum/data/mining_equipment("Jaunter", /obj/item/device/wormhole_jaunter, 200),
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000),
new /datum/data/mining_equipment("Point Card", /obj/item/weapon/card/mining_point_card, 500),
new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c1000, 5000),
)
/datum/data/mining_equipment/
+10 -8
View File
@@ -72,8 +72,8 @@
/turf/simulated/mineral/random
name = "Mineral deposit"
icon_state = "rock"
var/mineralSpawnChanceList = list("Uranium" = 1, "Diamond" = 1, "Gold" = 1, "Silver" = 1, "Plasma" = 1, "Iron" = 50, "Gibtonite" = 4/*, "Adamantine" =5*/, "Cave" = 2)//Currently, Adamantine won't spawn as it has no uses. -Durandan
var/mineralChance = 10 //means 10% chance of this plot changing to a mineral deposit
var/mineralSpawnChanceList = list("Uranium" = 18, "Diamond" = 3, "Gold" = 12, "Silver" = 16, "Plasma" = 25, "Iron" = 40, "Gibtonite" = 2/*, "Adamantine" =5*/, "Cave" = 2)//Currently, Adamantine won't spawn as it has no uses. -Durandan
var/mineralChance = 16
/turf/simulated/mineral/random/New()
..()
@@ -99,6 +99,8 @@
new/turf/simulated/floor/plating/asteroid/airless/cave(src)
if("Gibtonite")
M = new/turf/simulated/mineral/gibtonite(src)
if("Clown")
M = new/turf/simulated/mineral/clown(src)
/*if("Adamantine")
M = new/turf/simulated/mineral/adamantine(src)*/
if(M)
@@ -109,7 +111,7 @@
/turf/simulated/mineral/random/high_chance
icon_state = "rock_highchance"
mineralChance = 25
mineralSpawnChanceList = list("Uranium" = 35, "Diamond" = 10, "Gold" = 35, "Silver" = 35, "Plasma" = 35, "Iron" = 50)
mineralSpawnChanceList = list("Uranium" = 35, "Diamond" = 30, "Gold" = 45, "Silver" = 50, "Plasma" = 30)
/turf/simulated/mineral/random/high_chance/New()
icon_state = "rock"
@@ -117,8 +119,8 @@
/turf/simulated/mineral/random/low_chance
icon_state = "rock_lowchance"
mineralChance = 5
mineralSpawnChanceList = list("Uranium" = 1, "Diamond" = 1, "Gold" = 1, "Silver" = 1, "Plasma" = 1, "Iron" = 50, "Gibtonite" = 4)
mineralChance = 8
mineralSpawnChanceList = list("Uranium" = 8, "Diamond" = 2, "Gold" = 4, "Silver" = 6, "Plasma" = 20, "Iron" = 40, "Gibtonite" = 1)
/turf/simulated/mineral/random/low_chance/New()
icon_state = "rock"
@@ -168,7 +170,7 @@
name = "Plasma deposit"
icon_state = "rock_Plasma"
mineralName = "Plasma"
spreadChance = 5
spreadChance = 8
spread = 1
hidden = 1
scan_state = "rock_Plasma"
@@ -353,7 +355,7 @@
if(prob(30))
if(istype(loc, /area/mine/explored))
return
for(var/atom/A in range(15,T))//Lowers chance of mob clumps
for(var/atom/A in range(20,T))//Lowers chance of mob clumps
if(istype(A, /mob/living/simple_animal/hostile/asteroid))
return
var/randumb = pickweight(mob_spawn_list)
@@ -613,4 +615,4 @@
else if(istype(R.module_state_3,/obj/item/weapon/storage/bag/ore))
src.attackby(R.module_state_3,R)
else
return
return
+12 -1
View File
@@ -175,12 +175,13 @@
icon_state = "coin"
flags = CONDUCT
force = 1
throwforce = 0
throwforce = 2
w_class = 1.0
var/string_attached
var/list/sideslist = list("heads","tails")
var/cmineral = null
var/cooldown = 0
var/value = 10
/obj/item/weapon/coin/New()
pixel_x = rand(0,16)-8
@@ -192,35 +193,45 @@
/obj/item/weapon/coin/gold
cmineral = "gold"
value = 160
/obj/item/weapon/coin/silver
cmineral = "silver"
value = 40
/obj/item/weapon/coin/diamond
cmineral = "diamond"
value = 120
/obj/item/weapon/coin/iron
cmineral = "iron"
value = 20
/obj/item/weapon/coin/plasma
cmineral = "plasma"
value = 80
/obj/item/weapon/coin/uranium
cmineral = "uranium"
value = 160
/obj/item/weapon/coin/clown
cmineral = "bananium"
value = 600 //makes the clown cri
/obj/item/weapon/coin/adamantine
cmineral = "adamantine"
value = 400
/obj/item/weapon/coin/mythril
cmineral = "mythril"
value = 400
/obj/item/weapon/coin/twoheaded
cmineral = "iron"
desc = "Hey, this coin's the same on both sides!"
sideslist = list("heads")
value = 20
/obj/item/weapon/coin/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -157,6 +157,9 @@
/mob/living/carbon/alien/IsAdvancedToolUser()
return has_fine_manipulation
/mob/living/carbon/alien/SpeciesCanConsume()
return 1 // Aliens can eat, and they can be fed food/drink
/mob/living/carbon/alien/Process_Spaceslipping()
return 0 // Don't slip in space.
@@ -8,7 +8,7 @@
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
act = copytext(act,1,length(act))
var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle)
var/muzzled = is_muzzled()
var/m_type = 1
var/message
@@ -116,7 +116,7 @@
if ("help")
help_shake_act(M)
else
if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
if (is_muzzled())
return
if (health > 0)
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
@@ -8,7 +8,7 @@
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
act = copytext(act,1,length(act))
var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle)
var/muzzled = is_muzzled()
var/m_type = 1
var/message
@@ -142,7 +142,7 @@
if ("help")
help_shake_act(M)
else
if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
if (is_muzzled())
return
if (health > 0)
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
@@ -292,3 +292,11 @@
var/mob/living/carbon/alien/humanoid/A = new(loc)
A.key = key
qdel(src) */
/mob/living/carbon/alien/larva/stripPanelUnequip(obj/item/what, mob/who)
src << "<span class='warning'>You don't have the dexterity to do this!</span>"
return
/mob/living/carbon/alien/larva/stripPanelEquip(obj/item/what, mob/who)
src << "<span class='warning'>You don't have the dexterity to do this!</span>"
return
+3 -6
View File
@@ -452,12 +452,6 @@
..()
/mob/living/carbon/say(var/message, var/bubble_type)
if(istype(wear_mask, /obj/item/clothing/mask/muzzle))
return
..(message, bubble_type)
/mob/living/carbon/getTrail()
if(getBruteLoss() < 300)
if(prob(50))
@@ -476,3 +470,6 @@ var/const/GALOSHES_DONT_HELP = 8
/mob/living/carbon/fall(var/forced)
loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing
/mob/living/carbon/is_muzzled()
return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
@@ -3,7 +3,7 @@
var/list/stomach_contents = list()
var/list/internal_organs = list() //List of /obj/item/organ in the mob. they don't go in the contents.
var/silent = null //Can't talk. Value goes down every life proc.
var/silent = 0 //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU.
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
var/obj/item/legcuffed = null //Same as handcuffs but for legs. Bear traps use this.
+1 -1
View File
@@ -13,7 +13,7 @@
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
act = copytext(act,1,length(act))
var/muzzled = (src.wear_mask && istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
var/muzzled = is_muzzled()
//var/m_type = 1
switch(act)//Even carbon organisms want it alphabetically ordered..
@@ -9,7 +9,7 @@
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
act = copytext(act,1,length(act))
var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle)
var/muzzled = is_muzzled()
//var/m_type = 1
for (var/obj/item/weapon/implant/I in src)
+91 -33
View File
@@ -30,6 +30,11 @@
for(var/i=0;i<7;i++) // 2 for medHUDs and 5 for secHUDs
hud_list += image('icons/mob/hud.dmi', src, "hudunknown")
// for spawned humans; overwritten by other code
create_dna(src)
ready_dna(src)
randomize_human(src)
..()
/mob/living/carbon/human/Destroy()
@@ -305,17 +310,17 @@
dat += "<BR><B>Head:</B> <A href='?src=\ref[src];item=[slot_head]'> [(head && !(head.flags&ABSTRACT)) ? head : "<font color=grey>Empty</font>"]</A>"
if(slot_wear_mask in obscured)
dat += "<BR><font color=grey><B>Mask:</B> Obscured by [head]</font>"
dat += "<BR><font color=grey><B>Mask:</B> Obscured</font>"
else
dat += "<BR><B>Mask:</B> <A href='?src=\ref[src];item=[slot_wear_mask]'> [(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "<font color=grey>Empty</font>"]</A>"
if(slot_glasses in obscured)
dat += "<BR><font color=grey><B>Eyes:</B> Obscured by [head]</font>"
dat += "<BR><font color=grey><B>Eyes:</B> Obscured</font>"
else
dat += "<BR><B>Eyes:</B> <A href='?src=\ref[src];item=[slot_glasses]'> [(glasses && !(glasses.flags&ABSTRACT)) ? glasses : "<font color=grey>Empty</font>"]</A>"
if(slot_ears in obscured)
dat += "<BR><font color=grey><B>Ears:</B> Obscured by [head]</font>"
dat += "<BR><font color=grey><B>Ears:</B> Obscured</font>"
else
dat += "<BR><B>Ears:</B> <A href='?src=\ref[src];item=[slot_ears]'> [(ears && !(ears.flags&ABSTRACT)) ? ears : "<font color=grey>Empty</font>"]</A>"
@@ -328,34 +333,26 @@
dat += "<BR>[TAB][TAB]&#8627;<A href='?src=\ref[src];internal=[slot_s_store]'>[internal ? "Disable Internals" : "Set Internals"]</A>"
if(slot_shoes in obscured)
dat += "<BR><font color=grey><B>Shoes:</B> Obscured by [wear_suit]</font>"
dat += "<BR><font color=grey><B>Shoes:</B> Obscured</font>"
else
dat += "<BR><B>Shoes:</B> <A href='?src=\ref[src];item=[slot_shoes]'> [(shoes && !(shoes.flags&ABSTRACT)) ? shoes : "<font color=grey>Empty</font>"]</A>"
if(slot_gloves in obscured)
dat += "<BR><font color=grey><B>Gloves:</B> Obscured by [wear_suit]</font>"
dat += "<BR><font color=grey><B>Gloves:</B> Obscured</font>"
else
dat += "<BR><B>Gloves:</B> <A href='?src=\ref[src];item=[slot_gloves]'> [(gloves && !(gloves.flags&ABSTRACT)) ? gloves : "<font color=grey>Empty</font>"]</A>"
if(slot_w_uniform in obscured)
dat += "<BR><font color=grey><B>Uniform:</B> Obscured by [wear_suit]</font>"
dat += "<BR><font color=grey><B>Uniform:</B> Obscured</font>"
else
dat += "<BR><B>Uniform:</B> <A href='?src=\ref[src];item=[slot_w_uniform]'> [(w_uniform && !(w_uniform.flags&ABSTRACT)) ? w_uniform : "<font color=grey>Empty</font>"]</A>"
if(w_uniform || dna.species.nojumpsuit)
dat += "<BR>[TAB]&#8627;<B>Belt:</B> <A href='?src=\ref[src];item=[slot_belt]'> [(belt && !(belt.flags&ABSTRACT)) ? belt : "<font color=grey>Empty</font>"]</A>"
if(has_breathable_mask && istype(belt, /obj/item/weapon/tank))
dat += "<BR>[TAB][TAB]&#8627;<A href='?src=\ref[src];internal=[slot_belt]'>[internal ? "Disable Internals" : "Set Internals"]</A>"
dat += "<BR>[TAB]&#8627;<B>Pockets:</B> <A href='?src=\ref[src];pockets=left'>[(l_store && !(l_store.flags&ABSTRACT)) ? "Left (Full)" : "<font color=grey>Left (Empty)</font>"]</A>"
dat += " <A href='?src=\ref[src];pockets=right'>[(r_store && !(r_store.flags&ABSTRACT)) ? "Right (Full)" : "<font color=grey>Right (Empty)</font>"]</A>"
dat += "<BR>[TAB]&#8627;<B>ID:</B> <A href='?src=\ref[src];item=[slot_wear_id]'>[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "<font color=grey>Empty</font>"]</A>"
if(dna)
if(dna.species.nojumpsuit)
dat += "<BR><B>ID:</B> <A href='?src=\ref[src];item=[slot_wear_id]'>[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Nothing"]</A>"
else if(w_uniform)
dat += "<BR><B>ID:</B> <A href='?src=\ref[src];item=[slot_wear_id]'>[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Nothing"]</A>"
else if(w_uniform)
dat += "<BR><B>ID:</B> <A href='?src=\ref[src];item=[slot_wear_id]'>[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Nothing"]</A>"
if((w_uniform) || (dna && dna.species.nojumpsuit))
dat += "<BR>[TAB]&#8627;<B>Belt:</B> <A href='?src=\ref[src];item=[slot_belt]'> [(belt && !(belt.flags&ABSTRACT)) ? belt : "<font color=grey>Empty</font>"]</A>"
if(has_breathable_mask && istype(belt, /obj/item/weapon/tank))
dat += "<BR>[TAB][TAB]&#8627;<A href='?src=\ref[src];internal=[slot_belt]'>[internal ? "Disable Internals" : "Set Internals"]</A>"
dat += "<BR>[TAB]&#8627;<B>Pockets:</B> <A href='?src=\ref[src];pockets=left'>[(l_store && !(l_store.flags&ABSTRACT)) ? "Left (Full)" : "<font color=grey>Left (Empty)</font>"]</A>"
dat += " <A href='?src=\ref[src];pockets=right'>[(r_store && !(r_store.flags&ABSTRACT)) ? "Right (Full)" : "<font color=grey>Right (Empty)</font>"]</A>"
dat += "<BR>[TAB]&#8627;<B>ID:</B> <A href='?src=\ref[src];item=[slot_wear_id]'>[(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "<font color=grey>Empty</font>"]</A>"
dat += "<BR>"
@@ -364,17 +361,6 @@
if(legcuffed)
dat += "<BR><A href='?src=\ref[src];item=[slot_legcuffed]'>Legcuffed</A>"
if(dna)
if(dna.species.nojumpsuit)
dat += "<BR><BR><A href='?src=\ref[src];pockets=left'>Left Pocket ([(l_store && !(l_store.flags&ABSTRACT)) ? "Full" : "Empty"])</A>"
dat += " - <A href='?src=\ref[src];pockets=right'>Right Pocket ([(r_store && !(r_store.flags&ABSTRACT)) ? "Full" : "Empty"])</A>"
else if(w_uniform)
dat += "<BR><BR><A href='?src=\ref[src];pockets=left'>Left Pocket ([(l_store && !(l_store.flags&ABSTRACT)) ? "Full" : "Empty"])</A>"
dat += " - <A href='?src=\ref[src];pockets=right'>Right Pocket ([(r_store && !(r_store.flags&ABSTRACT)) ? "Full" : "Empty"])</A>"
else if(w_uniform)
dat += "<BR><BR><A href='?src=\ref[src];pockets=left'>Left Pocket ([(l_store && !(l_store.flags&ABSTRACT)) ? "Full" : "Empty"])</A>"
dat += " - <A href='?src=\ref[src];pockets=right'>Right Pocket ([(r_store && !(r_store.flags&ABSTRACT)) ? "Full" : "Empty"])</A>"
dat += {"
<BR>
<BR><A href='?src=\ref[user];mach_close=mob\ref[src]'>Close</A>
@@ -401,7 +387,7 @@
/mob/living/carbon/human/Topic(href, href_list)
if(usr.canUseTopic(src))
if(!usr.stat && usr.canmove && !usr.restrained() && Adjacent(usr))
if(href_list["item"])
var/slot = text2num(href_list["item"])
if(slot in check_obscured_slots())
@@ -533,3 +519,75 @@
return obscured
else
return null
/mob/living/carbon/human/assess_threat(var/obj/machinery/bot/secbot/judgebot, var/lasercolor)
if(judgebot.emagged == 2)
return 10 //Everyone is a criminal!
var/threatcount = 0
//Lasertag bullshit
if(lasercolor)
if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve
if(istype(wear_suit, /obj/item/clothing/suit/redtag))
threatcount += 4
if((istype(r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(l_hand,/obj/item/weapon/gun/energy/laser/redtag)))
threatcount += 4
if(istype(belt, /obj/item/weapon/gun/energy/laser/redtag))
threatcount += 2
if(lasercolor == "r")
if(istype(wear_suit, /obj/item/clothing/suit/bluetag))
threatcount += 4
if((istype(r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(l_hand,/obj/item/weapon/gun/energy/laser/bluetag)))
threatcount += 4
if(istype(belt, /obj/item/weapon/gun/energy/laser/bluetag))
threatcount += 2
return threatcount
//Check for ID
var/obj/item/weapon/card/id/idcard = get_idcard()
if(judgebot.idcheck && !idcard)
threatcount += 4
//Check for weapons
if(judgebot.weaponscheck)
if(!idcard || !(access_weapons in idcard.access))
if(judgebot.check_for_weapons(l_hand))
threatcount += 4
if(judgebot.check_for_weapons(r_hand))
threatcount += 4
if(judgebot.check_for_weapons(belt))
threatcount += 2
//Check for arrest warrant
if(judgebot.check_records)
var/perpname = get_face_name(get_id_name())
var/datum/data/record/R = find_record("name", perpname, data_core.security)
if(R && R.fields["criminal"])
switch(R.fields["criminal"])
if("*Arrest*")
threatcount += 5
if("Incarcerated")
threatcount += 2
if("Parolled")
threatcount += 2
//Check for dresscode violations
if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/rig/wizard))
threatcount += 2
//Check for nonhuman scum
if(dna && dna.species.id && dna.species.id != "human")
threatcount += 1
//Loyalty implants imply trustworthyness
if(isloyal(src))
threatcount -= 1
//Agent cards lower threatlevel.
if(istype(idcard, /obj/item/weapon/card/id/syndicate))
threatcount -= 2
return threatcount
@@ -3,7 +3,7 @@
if (M.a_intent == "help")
help_shake_act(M)
else
if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
if (is_muzzled())
return
visible_message("<span class='danger'>[M.name] bites [src]!</span>", \
@@ -15,9 +15,5 @@
apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee"))
for(var/datum/disease/D in M.viruses)
if(istype(D, /datum/disease/jungle_fever))
var/mob/living/carbon/human/H = src
if(src.stat != 2)
H.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE)
contract_disease(D,1,0)
contract_disease(D,1,0)
return
@@ -123,7 +123,7 @@ emp_act
/mob/living/carbon/human/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
if(!I || !user) return 0
var/obj/item/organ/limb/target_limb = get_organ(user.zone_sel.selecting)
var/obj/item/organ/limb/target_limb = get_organ(check_zone(user.zone_sel.selecting))
var/obj/item/organ/limb/affecting = get_organ(ran_zone(user.zone_sel.selecting))
var/hit_area = parse_zone(affecting.name)
var/target_area = parse_zone(target_limb.name)
@@ -118,6 +118,9 @@
/mob/living/carbon/human/IsAdvancedToolUser()
return 1//Humans can use guns and such
/mob/living/carbon/human/SpeciesCanConsume()
return 1 // Humans can eat, drink, and be forced to do so
/mob/living/carbon/human/InCritical()
return (health <= config.health_threshold_crit && stat == UNCONSCIOUS)
@@ -126,4 +129,4 @@
var/bypass = dna.species.handle_chemicals(R,src)
return bypass // if it returns 0, it will run the usual on_mob_life for that reagent. otherwise, it will stop after running handle_chemicals for the species.
else
return 0
return 0
+1 -1
View File
@@ -569,7 +569,7 @@
var/pixel_x_diff = rand(-amplitude, amplitude)
var/pixel_y_diff = rand(-amplitude/3, amplitude/3)
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = -1)
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6)
animate(pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, time = 2)
jitteriness = max(jitteriness-1, 0)
@@ -1148,7 +1148,7 @@
if(prob(20))
spawn(0) H.emote(pick("giggle", "laugh"))
handle_temperature(breath)
handle_temperature(breath, H)
return 1
@@ -33,7 +33,7 @@
if (src.sdisabilities & MUTE)
return
if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
if (is_muzzled())
return
var/whispers = "whispers"
@@ -296,7 +296,7 @@
if ("help")
help_shake_act(M)
else
if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
if (is_muzzled())
return
if (health > 0)
attacked += 10
@@ -927,14 +927,6 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost."
qdel(src)
proc/announce_to_ghosts()
for(var/mob/dead/observer/G in player_list)
if(G.client)
var/area/A = get_area(src)
if(A)
G << "Golem rune created in [A.name]."
/mob/living/carbon/slime/getTrail()
return null
@@ -943,6 +935,14 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
return 0
.=..()
/mob/living/carbon/slime/stripPanelUnequip(obj/item/what, mob/who)
src << "<span class='warning'>You don't have the dexterity to do this!</span>"
return
/mob/living/carbon/slime/stripPanelEquip(obj/item/what, mob/who)
src << "<span class='warning'>You don't have the dexterity to do this!</span>"
return
//////////////////////////////Old shit from metroids/RoRos, and the old cores, would not take much work to re-add them////////////////////////
@@ -9,7 +9,7 @@
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
act = copytext(act,1,length(act))
var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle)
var/muzzled = is_muzzled()
var/m_type = 1
var/message
@@ -74,7 +74,7 @@
if (M.a_intent == "help")
help_shake_act(M)
else
if ((M.a_intent == "harm" && !( istype(wear_mask, /obj/item/clothing/mask/muzzle) )))
if (M.a_intent == "harm" && !is_muzzled())
if ((prob(75) && health > 0))
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
visible_message("<span class='danger'>[M.name] bites [name]!</span>", \
@@ -83,11 +83,10 @@
adjustBruteLoss(damage)
health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
for(var/datum/disease/D in M.viruses)
if(istype(D, /datum/disease/jungle_fever))
contract_disease(D,1,0)
contract_disease(D,1,0)
else
visible_message("<span class='danger'>[M.name] has attempted to bite [name]!</span>", \
"<span class='userdanger'>[M.name] has attempted to bite [name]!</span>")
"<span class='userdanger'>[M.name] has attempted to bite [name]!</span>")
return
/mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M as mob)
@@ -348,3 +347,36 @@
/mob/living/carbon/monkey/canBeHandcuffed()
return 1
/mob/living/carbon/monkey/assess_threat(var/obj/machinery/bot/secbot/judgebot, var/lasercolor)
if(judgebot.emagged == 2)
return 10 //Everyone is a criminal!
var/threatcount = 0
//Lasertag bullshit
if(lasercolor)
if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve
if((istype(r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(l_hand,/obj/item/weapon/gun/energy/laser/redtag)))
threatcount += 4
if(lasercolor == "r")
if((istype(r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(l_hand,/obj/item/weapon/gun/energy/laser/bluetag)))
threatcount += 4
return threatcount
//Check for weapons
if(judgebot.weaponscheck)
if(judgebot.check_for_weapons(l_hand))
threatcount += 4
if(judgebot.check_for_weapons(r_hand))
threatcount += 4
//Loyalty implants imply trustworthyness
if(isloyal(src))
threatcount -= 1
return threatcount
/mob/living/carbon/monkey/SpeciesCanConsume()
return 1 // Monkeys can eat, drink, and be forced to do so
+3 -3
View File
@@ -470,12 +470,12 @@
if(C.handcuffed)
C.handcuffed.loc = usr.loc
C.update_inv_handcuffed(0)
C.handcuffed = null
else
C.update_inv_handcuffed(0)
if(C.legcuffed)
C.legcuffed.loc = usr.loc
C.update_inv_legcuffed(0)
C.legcuffed = null
C.update_inv_legcuffed(0)
/mob/living/verb/resist()
set name = "Resist"
+19 -14
View File
@@ -132,7 +132,7 @@ var/list/department_radio_keys = list(
//world << "channel_prefix=[channel_prefix]; message_mode=[message_mode]"
if (message_mode)
message = trim(copytext(message, 3))
if (!(ishuman(src) || istype(src, /mob/living/simple_animal/parrot) || isrobot(src) && (message_mode=="department" || (message_mode in radiochannels))))
if (!(ishuman(src) || istype(src, /mob/living/simple_animal/parrot) || isrobot(src)) && (message_mode=="department" || (message_mode in radiochannels))) // If they're not a human, parrot, or robot, and they're trying to use a radio channel
message_mode = null //only humans can use headsets
// Check changed so that parrots can use headsets. Other simple animals do not have ears and will cause runtimes.
// And borgs -Sieve
@@ -156,6 +156,24 @@ var/list/department_radio_keys = list(
for(var/i=0,i<bzz,i++)
message += "Z"
*/
if(message_mode == "changeling")
if(mind && mind.changeling)
log_say("[mind.changeling.changelingID]/[src.key] : [message]")
for(var/mob/Changeling in mob_list)
if((Changeling.mind && Changeling.mind.changeling) || istype(Changeling, /mob/dead/observer))
Changeling << "<i><font color=#800080><b>[mind.changeling.changelingID]:</b> [message]</font></i>"
return
if (message_mode == "alientalk")
if(alien_talk_understand || hivecheck())
//message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant
alien_talk(message)
return
if(is_muzzled()) // Intentionally after changeling hivemind check
return
var/list/obj/item/used_radios = new
switch (message_mode)
@@ -211,12 +229,6 @@ var/list/department_radio_keys = list(
robot_talk(message)
return
if ("alientalk")
if(alien_talk_understand || hivecheck())
//message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant
alien_talk(message)
return
if ("department")
if (src:ears)
src:ears.talk_into(src, message, message_mode)
@@ -231,13 +243,6 @@ var/list/department_radio_keys = list(
message_range = 1
italics = 1
if("changeling")
if(mind && mind.changeling)
log_say("[mind.changeling.changelingID]/[src.key] : [message]")
for(var/mob/Changeling in mob_list)
if((Changeling.mind && Changeling.mind.changeling) || istype(Changeling, /mob/dead/observer))
Changeling << "<i><font color=#800080><b>[mind.changeling.changelingID]:</b> [message]</font></i>"
return
////SPECIAL HEADSETS START
else
//world << "SPECIAL HEADSETS"
+44 -64
View File
@@ -45,8 +45,9 @@ var/list/ai_list = list()
var/explosive = 0 //does the AI explode when it dies?
var/mob/living/silicon/ai/parent = null
var/camera_light_on = 0
var/list/obj/machinery/camera/lit_cameras = list()
var/camera_light_on = 0 //Defines if the AI toggled the light on the camera it's looking through.
var/datum/trackable/track = null
var/last_paper_seen = null
@@ -90,8 +91,7 @@ var/list/ai_list = list()
aicamera = new/obj/item/device/camera/ai_camera(src)
if (istype(loc, /turf))
verbs.Add(/mob/living/silicon/ai/proc/ai_call_shuttle,/mob/living/silicon/ai/proc/ai_camera_track, \
/mob/living/silicon/ai/proc/ai_camera_list, /mob/living/silicon/ai/proc/ai_network_change, \
verbs.Add(/mob/living/silicon/ai/proc/ai_network_change, \
/mob/living/silicon/ai/proc/ai_statuschange, /mob/living/silicon/ai/proc/ai_hologram_change, \
/mob/living/silicon/ai/proc/toggle_camera_light)
@@ -182,9 +182,6 @@ var/list/ai_list = list()
stat(null, text("Systems nonfunctional"))
/mob/living/silicon/ai/proc/ai_alerts()
set category = "AI Commands"
set name = "Show Alerts"
var/dat = "<HEAD><TITLE>Current Station Alerts</TITLE><META HTTP-EQUIV='Refresh' CONTENT='10'></HEAD><BODY>\n"
dat += "<A HREF='?src=\ref[src];mach_close=aialerts'>Close</A><BR><BR>"
for (var/cat in alarms)
@@ -218,8 +215,6 @@ var/list/ai_list = list()
src << browse(dat, "window=aialerts&can_close=0")
/mob/living/silicon/ai/proc/ai_roster()
set category = "AI Commands"
set name = "Show Crew Manifest"
var/dat = "<html><head><title>Crew Roster</title></head><body><b>Crew Roster:</b><br><br>"
for(var/datum/data/record/t in sortRecord(data_core.general))
@@ -229,13 +224,7 @@ var/list/ai_list = list()
src << browse(dat, "window=airoster")
onclose(src, "airoster")
/mob/living/silicon/ai/verb/ai_crew()
set category = "AI Commands"
set name = "Crew Monitoring Console"
crewmonitor(src)
/mob/living/silicon/ai/proc/ai_call_shuttle()
set category = "AI Commands"
set name = "Call Emergency Shuttle"
if(src.stat == 2)
src << "You can't call the shuttle because you are dead!"
return
@@ -258,6 +247,9 @@ var/list/ai_list = list()
return
/mob/living/silicon/ai/cancel_camera()
src.view_core()
/mob/living/silicon/ai/verb/toggle_anchor()
set category = "AI Commands"
set name = "Toggle Floor Bolts"
@@ -435,14 +427,11 @@ var/list/ai_list = list()
updatehealth()
/mob/living/silicon/ai/reset_view(atom/A)
if(current)
current.SetLuminosity(0)
if (camera_light_on)
light_cameras()
if(istype(A,/obj/machinery/camera))
current = A
..()
if(istype(A,/obj/machinery/camera))
if(camera_light_on) A.SetLuminosity(AI_CAMERA_LUMINOSITY)
else A.SetLuminosity(0)
/mob/living/silicon/ai/proc/switchCamera(var/obj/machinery/camera/C)
@@ -515,14 +504,6 @@ var/list/ai_list = list()
if (viewalerts) ai_alerts()
return !cleared
/mob/living/silicon/ai/cancel_camera()
set category = "AI Commands"
set name = "Cancel Camera View"
//src.cameraFollow = null
src.view_core()
//Replaces /mob/living/silicon/ai/verb/change_network() in ai.dm & camera.dm
//Adds in /mob/living/silicon/ai/proc/ai_network_change() instead
//Addition by Mord_Sith to define AI's network change ability
@@ -624,7 +605,8 @@ var/list/ai_list = list()
var/icon_list[] = list(
"default",
"floating face",
"xeno queen"
"xeno queen",
"space carp"
)
input = input("Please select a hologram:") as null|anything in icon_list
if(input)
@@ -636,6 +618,8 @@ var/list/ai_list = list()
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo2"))
if("xeno queen")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo3"))
if("space carp")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4"))
return
/mob/living/silicon/ai/proc/corereturn()
@@ -648,48 +632,44 @@ var/list/ai_list = list()
return
apc.malfvacate()
//Toggles the luminosity and applies it by re-entereing the camera.
/mob/living/silicon/ai/proc/toggle_camera_light()
set name = "Toggle Camera Light"
set desc = "Toggles the light on the camera the AI is looking through."
set category = "AI Commands"
if(stat != CONSCIOUS)
return
camera_light_on = !camera_light_on
src << "Camera lights [camera_light_on ? "activated" : "deactivated"]."
if(!camera_light_on)
if(src.current)
src.current.SetLuminosity(0)
else
src.lightNearbyCamera()
if (!camera_light_on)
src << "Camera lights deactivated."
for (var/obj/machinery/camera/C in lit_cameras)
C.SetLuminosity(0)
lit_cameras = list()
// Handled camera lighting, when toggled.
// It will get the nearest camera from the eyeobj, lighting it.
return
/mob/living/silicon/ai/proc/lightNearbyCamera()
if(camera_light_on && camera_light_on < world.timeofday)
if(src.current)
var/obj/machinery/camera/camera = near_range_camera(src.eyeobj)
if(camera && src.current != camera)
src.current.SetLuminosity(0)
if(!camera.light_disabled)
src.current = camera
src.current.SetLuminosity(AI_CAMERA_LUMINOSITY)
else
src.current = null
else if(isnull(camera))
src.current.SetLuminosity(0)
src.current = null
else
var/obj/machinery/camera/camera = near_range_camera(src.eyeobj)
if(camera && !camera.light_disabled)
src.current = camera
src.current.SetLuminosity(AI_CAMERA_LUMINOSITY)
camera_light_on = world.timeofday + 1 * 20 // Update the light every 2 seconds.
light_cameras()
/mob/living/silicon/ai/verb/outputlaws()
set category = "AI Commands"
set name = "State Laws"
src << "Camera lights activated."
return
checklaws()
//AI_CAMERA_LUMINOSITY
/mob/living/silicon/ai/proc/light_cameras()
var/list/obj/machinery/camera/add = list()
var/list/obj/machinery/camera/remove = list()
var/list/obj/machinery/camera/visible = list()
for (var/datum/camerachunk/CC in eyeobj.visibleCameraChunks)
for (var/obj/machinery/camera/C in CC.cameras)
if (!C.can_use() || C.light_disabled || get_dist(C, eyeobj) > 7)
continue
visible |= C
add = visible - lit_cameras
remove = lit_cameras - visible
for (var/obj/machinery/camera/C in remove)
C.SetLuminosity(0)
lit_cameras -= C
for (var/obj/machinery/camera/C in add)
C.SetLuminosity(AI_CAMERA_LUMINOSITY)
lit_cameras |= C
@@ -61,7 +61,8 @@
var/mob/living/silicon/ai/AI = usr
if(AI.eyeobj && AI.client.eye == AI.eyeobj)
AI.cameraFollow = null
AI.eyeobj.setLoc(src)
if (isturf(src.loc) || isturf(src))
AI.eyeobj.setLoc(src)
// This will move the AIEye. It will also cause lights near the eye to light up, if toggled.
// This is handled in the proc below this one.
@@ -89,17 +90,11 @@
//user.unset_machine() //Uncomment this if it causes problems.
//user.lightNearbyCamera()
if (user.camera_light_on)
user.light_cameras()
// Return to the Core.
/mob/living/silicon/ai/verb/core()
set category = "AI Commands"
set name = "AI Core"
view_core()
/mob/living/silicon/ai/proc/view_core()
current = null
+1 -6
View File
@@ -63,12 +63,7 @@ var/const/VOX_DELAY = 600
popup.open()
/mob/living/silicon/ai/verb/announcement()
set name = "Announcement"
set desc = "Create a vocal announcement by typing in the available words to create a sentence."
set category = "AI Commands"
/mob/living/silicon/ai/proc/announcement()
if(announcing_vox > world.time)
src << "<span class='notice'>Please wait [round((announcing_vox - world.time) / 10)] seconds.</span>"
return
+2 -2
View File
@@ -26,7 +26,7 @@
if("Parolled") holder.icon_state = "hudparolled"
if("Discharged") holder.icon_state = "huddischarged"
else
return
continue
client.images += holder
/mob/living/silicon/pai/proc/medicalHUD()
@@ -79,4 +79,4 @@
return "health0"
else
return "health-100"
return "0"
return "0"
@@ -15,6 +15,9 @@
if(istype(O,/obj/item/borg/sight))
var/obj/item/borg/sight/S = O
sight_mode &= ~S.sight_mode
else if(O.is_open_container()) // Like a drinking glass
var/obj/item/weapon/reagent_containers/C = O
C.reagents.clear_reagents() // It's now empty
else if(istype(O, /obj/item/device/flashlight))
var/obj/item/device/flashlight/F = O
if(F.on)
@@ -40,6 +43,7 @@
else if(module_state_3 == O)
module_state_3 = null
inv3.icon_state = "inv3"
hud_used.update_robot_modules_display()
return 1
/mob/living/silicon/robot/proc/activate_module(var/obj/item/O)
@@ -24,9 +24,9 @@
/mob/living/silicon/robot/proc/clamp_values()
// SetStunned(min(stunned, 30))
SetStunned(min(stunned, 30))
SetParalysis(min(paralysis, 30))
// SetWeakened(min(weakened, 20))
SetWeakened(min(weakened, 20))
sleeping = 0
adjustBruteLoss(0)
adjustToxLoss(0)
@@ -288,7 +288,13 @@
/mob/living/silicon/robot/handle_fire()
if(..())
return
adjustFireLoss(3)
if(fire_stacks > 0)
fire_stacks--
fire_stacks = max(0, fire_stacks)
else
ExtinguishMob()
//adjustFireLoss(3)
return
/mob/living/silicon/robot/update_fire()
@@ -302,8 +308,6 @@
if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them
IgniteMob()
//Robots on fire
/mob/living/silicon/robot/update_canmove()
if(paralysis || stunned || weakened || buckled || lockcharge) canmove = 0
else canmove = 1
@@ -395,7 +395,7 @@
if (istype(W, /obj/item/weapon/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
return
if (istype(W, /obj/item/weapon/weldingtool))
if (istype(W, /obj/item/weapon/weldingtool) && user.a_intent != "harm")
var/obj/item/weapon/weldingtool/WT = W
if (src == user)
user << "<span class='warning'>You lack the reach to be able to repair yourself.</span>"
@@ -173,7 +173,7 @@
New()
..()
modules += new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
modules += new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src)
modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
modules += new /obj/item/weapon/pen(src)
modules += new /obj/item/weapon/razor(src)
@@ -191,13 +191,7 @@
modules += new /obj/item/weapon/storage/bag/tray(src)
modules += new /obj/item/weapon/reagent_containers/borghypo/borgshaker(src)
emag = new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
var/datum/reagents/R = new/datum/reagents(50)
emag.reagents = R
R.my_atom = emag
R.add_reagent("beer2", 50)
emag.name = "Mickey Finn's Special Brew"
emag = new /obj/item/weapon/reagent_containers/borghypo/borgshaker/hacked(src)
/obj/item/weapon/robot_module/miner
+5 -1
View File
@@ -306,4 +306,8 @@
// The src mob is trying to place an item on someone
// But the src mob is a silicon!! Disable.
/mob/living/silicon/stripPanelEquip(obj/item/what, mob/who, slot)
return 0
return 0
/mob/living/silicon/assess_threat() //Secbots won't hunt silicon units
return -10
@@ -1,16 +1,31 @@
/mob/living/simple_animal/tomato
name = "tomato"
desc = "It's a horrifyingly enormous beef tomato, and it's packing extra beef!"
icon_state = "tomato"
icon_living = "tomato"
icon_dead = "tomato_dead"
speak_chance = 0
turns_per_move = 5
maxHealth = 15
health = 15
meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat
response_help = "prods"
response_disarm = "pushes aside"
response_harm = "smacks"
harm_intent_damage = 5
ventcrawler = 2
/mob/living/simple_animal/hostile/killertomato
name = "Killer Tomato"
desc = "It's a horrifyingly enormous beef tomato, and it's packing extra beef!"
icon_state = "tomato"
icon_living = "tomato"
icon_dead = "tomato_dead"
speak_chance = 0
turns_per_move = 5
maxHealth = 30
health = 30
see_in_dark = 3
meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat
response_help = "prods"
response_disarm = "pushes aside"
response_harm = "smacks"
melee_damage_lower = 8
melee_damage_upper = 12
attacktext = "slams"
ventcrawler = 2
faction = "plants"
min_oxy = 5
max_oxy = 0
min_tox = 0
max_tox = 5
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 150
maxbodytemp = 500
@@ -515,9 +515,13 @@
// Harvest an animal's delicious byproducts
/mob/living/simple_animal/proc/harvest()
new meat_type (get_turf(src))
if(prob(95))
qdel(src)
return
gib()
return
/mob/living/simple_animal/stripPanelUnequip(obj/item/what, mob/who)
src << "<span class='warning'>You don't have the dexterity to do this!</span>"
return
/mob/living/simple_animal/stripPanelEquip(obj/item/what, mob/who)
src << "<span class='warning'>You don't have the dexterity to do this!</span>"
return
+8
View File
@@ -558,6 +558,9 @@ var/list/slot_equipment_priority = list( \
/mob/proc/is_active()
return (0 >= usr.stat)
/mob/proc/is_muzzled()
return 0
/mob/proc/see(message)
if(!is_active())
return 0
@@ -704,6 +707,9 @@ var/list/slot_equipment_priority = list( \
/mob/proc/IsAdvancedToolUser()//This might need a rename but it should replace the can this mob use things check
return 0
/mob/proc/SpeciesCanConsume()
return 0
/mob/proc/Jitter(amount)
jitteriness = max(jitteriness,amount,0)
@@ -794,3 +800,5 @@ var/list/slot_equipment_priority = list( \
update_canmove()
return
/mob/proc/assess_threat() //For sec bot threat assessment
return
+8 -1
View File
@@ -408,7 +408,7 @@ proc/is_special_character(mob/M) // returns 1 for special characters and 2 for h
if(M.mind in ticker.mode.wizards)
return 2
if("monkey")
if(M.viruses && (locate(/datum/disease/jungle_fever) in M.viruses))
if(M.viruses && (locate(/datum/disease/transformation/jungle_fever) in M.viruses))
return 2
return 1
return 0
@@ -423,6 +423,13 @@ proc/is_special_character(mob/M) // returns 1 for special characters and 2 for h
/mob/proc/reagent_check(var/datum/reagent/R) // utilized in the species code
return 1
/proc/notify_ghosts(var/message, var/ghost_sound = null) //Easy notification of ghosts.
for(var/mob/dead/observer/O in player_list)
if(O.client)
O << "<span class='ghostalert'>[message]<span>"
if(ghost_sound)
O << sound(ghost_sound)
/proc/item_heal_robotic(var/mob/living/carbon/human/H, var/mob/user, var/brute, var/burn)
var/obj/item/organ/limb/affecting = H.get_organ(check_zone(user.zone_sel.selecting))
+3 -6
View File
@@ -72,6 +72,8 @@
//transfer mind and delete old mob
if(mind)
mind.transfer_to(O)
if(O.mind.changeling)
O.mind.changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null)
if (tr_flags & TR_DEFAULTMSG)
O << "<B>You are now a monkey.</B>"
updateappearance(O)
@@ -253,13 +255,8 @@
O.show_laws()
O << "<b>These laws may be changed by other players, or by you being the traitor.</b>"
O.verbs += /mob/living/silicon/ai/proc/ai_call_shuttle
O.verbs += /mob/living/silicon/ai/proc/show_laws_verb
O.verbs += /mob/living/silicon/ai/proc/ai_camera_track
O.verbs += /mob/living/silicon/ai/proc/ai_alerts
O.verbs += /mob/living/silicon/ai/proc/ai_camera_list
O.verbs += /mob/living/silicon/ai/proc/ai_statuschange
O.verbs += /mob/living/silicon/ai/proc/ai_roster
O.job = "AI"
@@ -495,7 +492,7 @@
return 1
if(ispath(MP, /mob/living/simple_animal/shade))
return 1
if(ispath(MP, /mob/living/simple_animal/tomato))
if(ispath(MP, /mob/living/simple_animal/hostile/killertomato))
return 1
if(ispath(MP, /mob/living/simple_animal/mouse))
return 1 //It is impossible to pull up the player panel for mice (Fixed! - Nodrak)
+4
View File
@@ -345,6 +345,10 @@
name = "paper- Firing Range Instructions"
info = "Directions:<br><i>First you'll want to make sure there is a target stake in the center of the magnetic platform. Next, take an aluminum target from the crates back there and slip it into the stake. Make sure it clicks! Next, there should be a control console mounted on the wall somewhere in the room.<br><br> This control console dictates the behaviors of the magnetic platform, which can move your firing target around to simulate real-world combat situations. From here, you can turn off the magnets or adjust their electromagnetic levels and magnetic fields. The electricity level dictates the strength of the pull - you will usually want this to be the same value as the speed. The magnetic field level dictates how far the magnetic pull reaches.<br><br>Speed and path are the next two settings. Speed is associated with how fast the machine loops through the designated path. Paths dictate where the magnetic field will be centered at what times. There should be a pre-fabricated path input already. You can enable moving to observe how the path affects the way the stake moves. To script your own path, look at the following key:</i><br><br>N: North<br>S: South<br>E: East<br>W: West<br>C: Center<br>R: Random (results may vary)<br>; or &: separators. They are not necessary but can make the path string better visible."
/obj/item/weapon/paper/mining
name = "paper- Smelting Operations Closed"
info = "<B>**NOTICE**</B><BR><BR>Smelting operations moved on-station.<BR><BR>Take your unrefined ore to the Redeption Machine in the Delivery Office to redeem points.<BR><BR>--SS13 Command"
/obj/item/weapon/paper/crumpled
name = "paper scrap"
icon_state = "scrap"
+4 -5
View File
@@ -55,7 +55,7 @@
/*
* Parapens
*/
/obj/item/weapon/pen/paralysis
/obj/item/weapon/pen/paralysis
origin_tech = "materials=2;syndicate=5"
@@ -69,8 +69,7 @@
/obj/item/weapon/pen/paralysis/New()
create_reagents(50)
reagents.add_reagent("zombiepowder", 10)
reagents.add_reagent("impedrezene", 25)
reagents.add_reagent("cryptobiolin", 15)
create_reagents(60)
reagents.add_reagent("stoxin", 30)
reagents.add_reagent("mutetoxin", 30)
..()
-15
View File
@@ -113,21 +113,6 @@
name = "AI photo camera"
var/in_camera_mode = 0
verb/picture()
set category ="AI Commands"
set name = "Take Image"
set src in usr
toggle_camera_mode()
verb/viewpicture()
set category ="AI Commands"
set name = "View Images"
set src in usr
viewpictures()
/obj/item/device/camera/attack(mob/living/carbon/human/M, mob/user)
return
+19 -9
View File
@@ -321,10 +321,14 @@ obj/structure/cable/proc/avail()
// merge with the powernets of power objects in the source turf
/obj/structure/cable/proc/mergeConnectedNetworksOnTurf()
var/list/to_connect = list()
if(!powernet) //if we somehow have no powernet, make one (should not happen for cables)
var/datum/powernet/newPN = new()
newPN.add_cable(src)
//first let's add turf cables to our powernet
//then we'll connect machines on turf with a node cable is present
for(var/AM in loc)
if(istype(AM,/obj/structure/cable))
var/obj/structure/cable/C = AM
@@ -338,18 +342,24 @@ obj/structure/cable/proc/avail()
else if(istype(AM,/obj/machinery/power/apc))
var/obj/machinery/power/apc/N = AM
if(!N.terminal) continue // APC are connected through their terminal
if(N.terminal.powernet)
merge_powernets(powernet, N.terminal.powernet)
else
powernet.add_machine(N.terminal)
if(N.terminal.powernet == powernet)
continue
to_connect += N.terminal //we'll connect the machines after all cables are merged
else if(istype(AM,/obj/machinery/power)) //other power machines
var/obj/machinery/power/M = AM
if(M.powernet == powernet) continue
if(M.powernet)
merge_powernets(powernet, M.powernet)
else
powernet.add_machine(M)
if(M.powernet == powernet)
continue
to_connect += M //we'll connect the machines after all cables are merged
//now that cables are done, let's connect found machines
for(var/obj/machinery/power/PM in to_connect)
if(!PM.connect_to_network())
PM.disconnect_from_network() //if we somehow can't connect the machine to the new powernet, remove it from the old nonetheless
//////////////////////////////////////////////
// Powernets handling helpers
-2
View File
@@ -9,7 +9,6 @@
icon_state = "off"
density = 1
anchored = 0
directwired = 0
var/t_status = 0
var/t_per = 5000
var/filter = 1
@@ -48,7 +47,6 @@ display round(lastgen) and plasmatank amount
icon_state = "portgen0"
density = 1
anchored = 0
directwired = 0
use_power = 0
var/active = 0
+9 -17
View File
@@ -11,7 +11,6 @@
icon = 'icons/obj/power.dmi'
anchored = 1.0
var/datum/powernet/powernet = null
var/directwired = 1 // TODEL
use_power = 0
idle_power_usage = 0
active_power_usage = 0
@@ -216,7 +215,8 @@
for(var/obj/structure/cable/PC in cable_list)
if(!PC.powernet)
PC.powernet = new()
var/datum/powernet/NewPN = new()
NewPN.add_cable(PC)
propagate_network(PC,PC.powernet)
//remove the old powernet and replace it with a new one throughout the network.
@@ -266,21 +266,13 @@
net1 = net2
net2 = temp
//we don't use add_cable and add_machine here, because that could
//change the size of net2.nodes or net2.cables while in the loop (runtime galore)
for(var/i=1,i<=net2.nodes.len,i++) //merge net2 into net1
var/obj/machinery/power/Node = net2.nodes[i] //merge power machines
if(Node)
Node.powernet = net1
net1.nodes[Node] = Node
//merge net2 into net1
for(var/obj/structure/cable/Cable in net2.cables) //merge cables
net1.add_cable(Cable)
for(var/i=1,i<=net2.cables.len,i++)
var/obj/structure/cable/Cable = net2.cables[i] //merge cables
if(Cable)
Cable.powernet = net1
net1.cables += Cable
qdel(net2) //garbage collect the now empty powernet
for(var/obj/machinery/power/Node in net2.nodes) //merge power machines
if(!Node.connect_to_network())
Node.disconnect_from_network() //if somehow we can't connect the machine to the new powernet, disconnect it from the old nonetheless
return net1
@@ -400,7 +392,7 @@
if(M.powernet == src)
return
else
M.powernet.remove_machine(M) //..remove it
M.disconnect_from_network()//..remove it
M.powernet = src
nodes[M] = M
@@ -8,7 +8,6 @@ var/global/list/rad_collectors = list()
icon_state = "ca"
anchored = 0
density = 1
directwired = 1
req_access = list(access_engine_equip)
// use_power = 0
var/obj/item/weapon/tank/plasma/P = null
@@ -37,7 +37,6 @@
..()
if(state == 2 && anchored)
connect_to_network()
src.directwired = 1
/obj/machinery/power/emitter/Destroy()
if(ticker && ticker.current_state == GAME_STATE_PLAYING)
@@ -185,7 +184,6 @@
state = 2
user << "You weld the [src] to the floor."
connect_to_network()
src.directwired = 1
else
user << "\red You need more welding fuel to complete this task."
if(2)
@@ -199,7 +197,6 @@
state = 1
user << "You cut the [src] free from the floor."
disconnect_from_network()
src.directwired = 0
else
user << "\red You need more welding fuel to complete this task."
return
+161
View File
@@ -0,0 +1,161 @@
/obj/machinery/singularity/narsie //Moving narsie to a child object of the singularity so it can be made to function differently. --NEO
name = "Nar-sie's Avatar"
desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees."
icon = 'icons/obj/magic_terror.dmi'
pixel_x = -89
pixel_y = -85
current_size = 9 //It moves/eats like a max-size singulo, aside from range. --NEO
contained = 0 //Are we going to move around?
dissipate = 0 //Do we lose energy over time?
move_self = 1 //Do we move on our own?
grav_pull = 5 //How many tiles out do we pull?
consume_range = 6 //How many tiles out do we eat
uneatable = list(/turf/space, /obj/effect/overlay, /mob/living/simple_animal/construct)
/obj/machinery/singularity/narsie/large
name = "Nar-Sie"
icon = 'icons/obj/narsie.dmi'
// Pixel stuff centers Narsie.
pixel_x = -236
pixel_y = -256
current_size = 12
move_self = 1 //Do we move on our own?
grav_pull = 10
consume_range = 12 //How many tiles out do we eat
/obj/machinery/singularity/narsie/large/New()
..()
world << "<font size='15' color='red'><b>NAR-SIE HAS RISEN</b></font>"
world << pick(sound('sound/hallucinations/im_here1.ogg'), sound('sound/hallucinations/im_here2.ogg'))
var/area/A = get_area(src)
if(A)
notify_ghosts("Nar-Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.")
if(emergency_shuttle)
emergency_shuttle.incall(0.3) // Cannot recall
/obj/machinery/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob)
makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 1)
new /obj/effect/effect/sleep_smoke(user.loc)
/obj/machinery/singularity/narsie/process()
eat()
if(!target || prob(5))
pickcultist()
move()
if(prob(25))
mezzer()
/obj/machinery/singularity/narsie/Bump(atom/A)//you dare stand before a god?!
godsmack(A)
return
/obj/machinery/singularity/narsie/Bumped(atom/A)
godsmack(A)
return
/obj/machinery/singularity/narsie/proc/godsmack(var/atom/A)
if(istype(A,/obj/))
var/obj/O = A
O.ex_act(1.0)
if(O) qdel(O)
else if(isturf(A))
var/turf/T = A
T.ChangeTurf(/turf/simulated/floor/engine/cult)
/obj/machinery/singularity/narsie/mezzer()
for(var/mob/living/carbon/M in oviewers(8, src))
if(M.stat == CONSCIOUS)
if(!iscultist(M))
M << "<span class='warning'>You feel your sanity crumble away in an instant as you gaze upon [src.name]...</span>"
M.apply_effect(3, STUN)
/obj/machinery/singularity/narsie/consume(var/atom/A)
if(is_type_in_list(A, uneatable))
return 0
if(istype(A,/mob/living/))
var/mob/living/C = A
if(C.client)
makeNewConstruct(/mob/living/simple_animal/construct/harvester, C, null, 1)
C.spawn_dust()
C.gib()
return
if(isturf(A))
var/turf/T = A
if(istype(T, /turf/simulated/floor) && !istype(T, /turf/simulated/floor/engine/cult))
if(prob(20)) T.ChangeTurf(/turf/simulated/floor/engine/cult)
else if(istype(T,/turf/simulated/wall) && !istype(T, /turf/simulated/wall/cult))
if(prob(20)) T.ChangeTurf(/turf/simulated/wall/cult)
return
/obj/machinery/singularity/narsie/ex_act() //No throwing bombs at it either. --NEO
return
/obj/machinery/singularity/narsie/proc/pickcultist() //Narsie rewards his cultists with being devoured first, then picks a ghost to follow. --NEO
var/list/cultists = list()
var/list/noncultists = list()
for(var/mob/living/carbon/food in living_mob_list) //we don't care about constructs or cult-Ians or whatever. cult-monkeys are fair game i guess
var/turf/pos = get_turf(food)
if(pos.z != src.z)
continue
if(iscultist(food))
cultists += food
else
noncultists += food
if(cultists.len) //cultists get higher priority
acquire(pick(cultists))
return
if(noncultists.len)
acquire(pick(noncultists))
return
//no living humans, follow a ghost instead.
for(var/mob/dead/observer/ghost in player_list)
if(!ghost.client)
continue
var/turf/pos = get_turf(ghost)
if(pos.z != src.z)
continue
cultists += ghost
if(cultists.len)
acquire(pick(cultists))
return
/obj/machinery/singularity/narsie/proc/acquire(var/mob/food)
target << "<span class='notice'>NAR-SIE HAS LOST INTEREST IN YOU</span>"
target = food
if(ishuman(target))
target << "<span class ='userdanger'>NAR-SIE HUNGERS FOR YOUR SOUL</span>"
else
target << "<span class ='userdanger'>NAR-SIE HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL</span>"
//Wizard narsie
/obj/machinery/singularity/narsie/wizard
grav_pull = 0
/obj/machinery/singularity/narsie/wizard/eat()
set background = BACKGROUND_ENABLED
// if(defer_powernet_rebuild != 2)
// defer_powernet_rebuild = 1
for(var/atom/X in orange(consume_range,src))
if(isturf(X) || istype(X, /atom/movable))
consume(X)
// if(defer_powernet_rebuild != 2)
// defer_powernet_rebuild = 0
return
+2 -163
View File
@@ -26,7 +26,6 @@
var/target = null //its target. moves towards the target if it has one
var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing
var/teleport_del = 0
var/sizes_to_number = list("1" = 0, "3" = 1, "5" = 2, "7" = 3, "9" = 4) //so i dont have to mess around with weirdass formulas to get this done.
var/last_warning
var/list/uneatable = list(/turf/space, /obj/effect/overlay)
@@ -230,7 +229,7 @@
if(current_size >= 5)
var/list/handlist = list(H.l_hand, H.r_hand)
for(var/obj/item/hand in handlist)
if(prob(current_size * 5) && hand.w_class >= 5 - sizes_to_number["[current_size]"] && H.unEquip(hand))
if(prob(current_size * 5) && hand.w_class >= ((11-current_size)/2) && H.unEquip(hand))
step_towards(hand, src)
H << "<span class='warning'>\The [src] pulls \the [hand] from your grip!</span>"
@@ -458,164 +457,4 @@
for(var/obj/machinery/power/rad_collector/R in rad_collectors)
if(get_dist(R, src) <= 15) // Better than using orange() every process
R.receive_pulse(energy)
return
/obj/machinery/singularity/narsie //Moving narsie to a child object of the singularity so it can be made to function differently. --NEO
name = "Nar-sie's Avatar"
desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees."
icon = 'icons/obj/magic_terror.dmi'
pixel_x = -89
pixel_y = -85
current_size = 9 //It moves/eats like a max-size singulo, aside from range. --NEO
contained = 0 //Are we going to move around?
dissipate = 0 //Do we lose energy over time?
move_self = 1 //Do we move on our own?
grav_pull = 5 //How many tiles out do we pull?
consume_range = 6 //How many tiles out do we eat
uneatable = list(/turf/space, /obj/effect/overlay, /mob/living/simple_animal/construct)
/obj/machinery/singularity/narsie/large
name = "Nar-Sie"
icon = 'icons/obj/narsie.dmi'
// Pixel stuff centers Narsie.
pixel_x = -236
pixel_y = -256
current_size = 12
move_self = 1 //Do we move on our own?
grav_pull = 10
consume_range = 12 //How many tiles out do we eat
/obj/machinery/singularity/narsie/large/New()
..()
world << "<font size='15' color='red'><b>NAR-SIE HAS RISEN</b></font>"
world << pick(sound('sound/hallucinations/im_here1.ogg'), sound('sound/hallucinations/im_here2.ogg'))
if(emergency_shuttle)
emergency_shuttle.incall(0.3) // Cannot recall
/obj/machinery/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob)
makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 1)
new /obj/effect/effect/sleep_smoke(user.loc)
/obj/machinery/singularity/narsie/process()
eat()
if(!target || prob(5))
pickcultist()
move()
if(prob(25))
mezzer()
/obj/machinery/singularity/narsie/Bump(atom/A)//you dare stand before a god?!
godsmack(A)
return
/obj/machinery/singularity/narsie/Bumped(atom/A)
godsmack(A)
return
/obj/machinery/singularity/narsie/proc/godsmack(var/atom/A)
if(istype(A,/obj/))
var/obj/O = A
O.ex_act(1.0)
if(O) qdel(O)
else if(isturf(A))
var/turf/T = A
T.ChangeTurf(/turf/simulated/floor/engine/cult)
/obj/machinery/singularity/narsie/mezzer()
for(var/mob/living/carbon/M in oviewers(8, src))
if(M.stat == CONSCIOUS)
if(!iscultist(M))
M << "\red You feel your sanity crumble away in an instant as you gaze upon [src.name]..."
M.apply_effect(3, STUN)
/obj/machinery/singularity/narsie/consume(var/atom/A)
if(is_type_in_list(A, uneatable))
return 0
if(istype(A,/mob/living/))
var/mob/living/C = A
if(C.client)
makeNewConstruct(/mob/living/simple_animal/construct/harvester, C, null, 1)
C.spawn_dust()
C.gib()
return
if(isturf(A))
var/turf/T = A
if(istype(T, /turf/simulated/floor) && !istype(T, /turf/simulated/floor/engine/cult))
if(prob(20)) T.ChangeTurf(/turf/simulated/floor/engine/cult)
else if(istype(T,/turf/simulated/wall) && !istype(T, /turf/simulated/wall/cult))
if(prob(20)) T.ChangeTurf(/turf/simulated/wall/cult)
return
/obj/machinery/singularity/narsie/ex_act() //No throwing bombs at it either. --NEO
return
/obj/machinery/singularity/narsie/proc/pickcultist() //Narsie rewards his cultists with being devoured first, then picks a ghost to follow. --NEO
var/list/cultists = list()
var/list/noncultists = list()
for(var/mob/living/carbon/food in living_mob_list) //we don't care about constructs or cult-Ians or whatever. cult-monkeys are fair game i guess
var/turf/pos = get_turf(food)
if(pos.z != src.z)
continue
if(iscultist(food))
cultists += food
else
noncultists += food
if(cultists.len) //cultists get higher priority
acquire(pick(cultists))
return
if(noncultists.len)
acquire(pick(noncultists))
return
//no living humans, follow a ghost instead.
for(var/mob/dead/observer/ghost in player_list)
if(!ghost.client)
continue
var/turf/pos = get_turf(ghost)
if(pos.z != src.z)
continue
cultists += ghost
if(cultists.len)
acquire(pick(cultists))
return
/obj/machinery/singularity/narsie/proc/acquire(var/mob/food)
target << "\blue <b>NAR-SIE HAS LOST INTEREST IN YOU</b>"
target = food
if(ishuman(target))
target << "\red <b>NAR-SIE HUNGERS FOR YOUR SOUL</b>"
else
target << "\red <b>NAR-SIE HAS CHOSEN YOU TO LEAD HIM TO HIS NEXT MEAL</b>"
//Wizard narsie
/obj/machinery/singularity/narsie/wizard
grav_pull = 0
/obj/machinery/singularity/narsie/wizard/eat()
set background = BACKGROUND_ENABLED
// if(defer_powernet_rebuild != 2)
// defer_powernet_rebuild = 1
for(var/atom/X in orange(consume_range,src))
if(isturf(X) || istype(X, /atom/movable))
consume(X)
// if(defer_powernet_rebuild != 2)
// defer_powernet_rebuild = 0
return
return
+120 -50
View File
@@ -10,7 +10,6 @@ var/list/solars_list = list()
icon_state = "sp_base"
anchored = 1
density = 1
directwired = 1
use_power = 0
idle_power_usage = 0
active_power_usage = 0
@@ -28,15 +27,22 @@ var/list/solars_list = list()
Make(S)
connect_to_network()
/obj/machinery/power/solar/disconnect_from_network()
/obj/machinery/power/solar/Destroy()
unset_control() //remove from control computer
..()
solars_list.Remove(src)
/obj/machinery/power/solar/connect_to_network()
var/to_return = ..()
if(powernet) //if connected and not already in solar_list...
solars_list |= src //... add it
return to_return
//set the control of the panel to a given computer if closer than SOLAR_MAX_DIST
/obj/machinery/power/solar/proc/set_control(var/obj/machinery/power/solar_control/SC)
if(SC && (get_dist(src, SC) > SOLAR_MAX_DIST))
return 0
control = SC
return 1
//set the control of the panel to null and removes it from the control list of the previous control computer if needed
/obj/machinery/power/solar/proc/unset_control()
if(control)
control.connected_panels.Remove(src)
control = null
/obj/machinery/power/solar/proc/Make(var/obj/item/solar_assembly/S)
if(!S)
@@ -54,7 +60,7 @@ var/list/solars_list = list()
if(istype(W, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user << "<span class='notice'>You begin to take the glass off the solar panel...</span>"
user.visible_message("<span class='notice'>[user] begins to take the glass off the solar panel.</span>")
if(do_after(user, 50))
var/obj/item/solar_assembly/S = locate() in src
if(S)
@@ -99,7 +105,7 @@ var/list/solars_list = list()
src.dir = angle2dir(adir)
return
//calculates the fraction of the sunlight that the panel recieves
/obj/machinery/power/solar/proc/update_solar_exposure()
if(!sun)
return
@@ -123,17 +129,19 @@ var/list/solars_list = list()
if(!sun || !control) //if there's no sun or the panel is not linked to a solar control computer, no need to proceed
return
if(obscured) return
var/sgen = SOLARGENRATE * sunfrac
add_avail(sgen)
if(powernet && control)
if(powernet.nodes[control])
if(powernet)
if(powernet == control.powernet)//check if the panel is still connected to the computer
if(obscured) //get no light from the sun, so don't generate power
return
var/sgen = SOLARGENRATE * sunfrac
add_avail(sgen)
control.gen += sgen
else //if we're no longer on the same powernet, remove from control computer
unset_control()
/obj/machinery/power/solar/proc/broken()
stat |= BROKEN
unset_control()
update_icon()
return
@@ -174,6 +182,29 @@ var/list/solars_list = list()
. = PROCESS_KILL
return
//trace towards sun to see if we're in shadow
/obj/machinery/power/solar/proc/occlusion()
var/ax = x // start at the solar panel
var/ay = y
var/turf/T = null
for(var/i = 1 to 20) // 20 steps is enough
ax += sun.dx // do step
ay += sun.dy
T = locate( round(ax,0.5),round(ay,0.5),z)
if(T.x == 1 || T.x==world.maxx || T.y==1 || T.y==world.maxy) // not obscured if we reach the edge
break
if(T.density) // if we hit a solid turf, panel is obscured
obscured = 1
return
obscured = 0 // if hit the edge or stepped 20 times, not obscured
update_solar_exposure()
//
// Solar Assembly - For construction of solar arrays.
@@ -258,7 +289,6 @@ var/list/solars_list = list()
icon_state = "solar"
anchored = 1
density = 1
directwired = 1
use_power = 1
idle_power_usage = 250
var/id = 0
@@ -269,6 +299,8 @@ var/list/solars_list = list()
var/track = 0 // 0= off 1=timed 2=auto (tracker)
var/trackrate = 600 // 300-900 seconds
var/nexttime = 0 // time for a panel to rotate of 1° in manual tracking
var/obj/machinery/power/tracker/connected_tracker = null
var/list/connected_panels = list()
/obj/machinery/power/solar_control/New()
@@ -277,6 +309,13 @@ var/list/solars_list = list()
initialize()
connect_to_network()
/obj/machinery/power/solar_control/Destroy()
for(var/obj/machinery/power/solar/M in connected_panels)
M.unset_control()
if(connected_tracker)
connected_tracker.unset_control()
..()
/obj/machinery/power/solar_control/disconnect_from_network()
..()
solars_list.Remove(src)
@@ -287,6 +326,39 @@ var/list/solars_list = list()
solars_list |= src //... add it
return to_return
//search for unconnected panels and trackers in the computer powernet and connect them
/obj/machinery/power/solar_control/proc/search_for_connected()
if(powernet)
for(var/obj/machinery/power/M in powernet.nodes)
if(istype(M, /obj/machinery/power/solar))
var/obj/machinery/power/solar/S = M
if(!S.control) //i.e unconnected
S.set_control(src)
connected_panels |= S
else if(istype(M, /obj/machinery/power/tracker))
if(!connected_tracker) //if there's already a tracker connected to the computer don't add another
var/obj/machinery/power/tracker/T = M
if(!T.control) //i.e unconnected
connected_tracker = T
T.set_control(src)
//called by the sun controller, update the facing angle (either manually or via tracking) and rotates the panels accordingly
/obj/machinery/power/solar_control/proc/update()
if(stat & (NOPOWER | BROKEN))
return
switch(track)
if(1)
if(trackrate) //we're manual tracking. If we set a rotation speed...
cdir = targetdir //...the current direction is the targetted one (and rotates panels to it)
if(2) // auto-tracking
if(connected_tracker)
connected_tracker.set_angle(sun.angle)
set_panels(cdir)
updateDialog()
/obj/machinery/power/solar_control/initialize()
..()
if(!powernet) return
@@ -313,9 +385,9 @@ var/list/solars_list = list()
/obj/machinery/power/solar_control/interact(mob/user)
var/t = "Generated power : [round(lastgen)] W<BR>"
t += "<B>Orientation</B>: [rate_control(src,"cdir","[cdir]&deg",1,15)] ([angle2text(cdir)])<BR>"
t += "Tracking:<div class='statusDisplay'>"
var/t = "<B><span class='highlight'>Generated power</span></B> : [round(lastgen)] W<BR>"
t += "<B><span class='highlight'>Orientation</span></B>: [rate_control(src,"cdir","[cdir]&deg",1,15)] ([angle2text(cdir)])<BR>"
t += "<B><span class='highlight'>Tracking:</B><div class='statusDisplay'>"
switch(track)
if(0)
t += "<span class='linkOn'>Off</span> <A href='?src=\ref[src];track=1'>Timed</A> <A href='?src=\ref[src];track=2'>Auto</A><BR>"
@@ -325,6 +397,13 @@ var/list/solars_list = list()
t += "<A href='?src=\ref[src];track=0'>Off</A> <A href='?src=\ref[src];track=1'>Timed</A> <span class='linkOn'>Auto</span><BR>"
t += "Tracking Rate: [rate_control(src,"tdir","[trackrate] deg/h ([trackrate<0 ? "CCW" : "CW"])",1,30,180)]</div><BR>"
t += "<B><span class='highlight'>Connected devices:</span></B><div class='statusDisplay'>"
t += "<A href='?src=\ref[src];search_connected=1'>Search for devices</A><BR>"
t += "Solar panels : [connected_panels.len] connected<BR>"
t += "Solar tracker : [connected_tracker ? "<span class='good'>Found</span>" : "<span class='bad'>Not found</span>"]</div><BR>"
t += "<A href='?src=\ref[src];close=1'>Close</A>"
var/datum/browser/popup = new(user, "solar", name)
@@ -371,6 +450,10 @@ var/list/solars_list = list()
if(stat & (NOPOWER | BROKEN))
return
if(connected_tracker) //NOTE : handled here so that we don't add trackers to the processing list
if(connected_tracker.powernet != powernet)
connected_tracker.unset_control()
if(track==1 && trackrate) //manual tracking and set a rotation speed
if(nexttime <= world.time) //every time we need to increase/decrease the angle by 1°...
targetdir = (targetdir + trackrate/abs(trackrate) + 360) % 360 //... do it
@@ -378,20 +461,6 @@ var/list/solars_list = list()
src.updateDialog()
// called by solar tracker when sun position changes
// or called by the sun controller for manual tracking updates
/obj/machinery/power/solar_control/proc/tracker_update(var/angle)
if(stat & (NOPOWER | BROKEN) || track == 0)
return
if (track == 2) // auto-tracking (called by tracker.dm /set_angle)
cdir = angle
else if (trackrate) //else we're manual tracking. If we set a rotation speed...
cdir = targetdir //...the current direction is the targetted one (and rotates panels to it)
set_panels(cdir)
src.updateDialog()
/obj/machinery/power/solar_control/Topic(href, href_list)
if(..())
usr << browse(null, "window=solcon")
@@ -416,30 +485,31 @@ var/list/solars_list = list()
if(href_list["track"])
track = text2num(href_list["track"])
if(powernet && (track == 2))
for(var/obj/machinery/power/tracker/T in powernet.nodes)
if(powernet.nodes[T])
T.set_angle(sun.angle)
break
if(track == 2)
if(connected_tracker)
connected_tracker.set_angle(sun.angle)
set_panels(cdir)
else if (track == 1) //begin manual tracking
src.targetdir = src.cdir
if(src.trackrate) nexttime = world.time + 36000/abs(trackrate)
set_panels(targetdir)
if(href_list["search_connected"])
src.search_for_connected()
if(connected_tracker && track == 2)
connected_tracker.set_angle(sun.angle)
src.set_panels(cdir)
src.updateUsrDialog()
return
//rotates the panel to the passed angle
/obj/machinery/power/solar_control/proc/set_panels(var/cdir)
if(!powernet) return
for(var/obj/machinery/power/solar/S in powernet.nodes)
if(powernet.nodes[S])
if(get_dist(S, src) < SOLAR_MAX_DIST)
if(!S.control)
S.control = src
S.adir = cdir //instantly rotates the panel
S.update_icon() //and
S.update_solar_exposure() //update it
for(var/obj/machinery/power/solar/S in connected_panels)
S.adir = cdir //instantly rotates the panel
S.occlusion()//and
S.update_icon() //update it
update_icon()
-1
View File
@@ -11,7 +11,6 @@
layer = TURF_LAYER
var/obj/machinery/power/master = null
anchored = 1
directwired = 0 // must have a cable on same turf connecting to terminal
layer = 2.6 // a bit above wires
+19 -18
View File
@@ -10,26 +10,33 @@
icon_state = "tracker"
anchored = 1
density = 1
directwired = 1
use_power = 0
var/id = 0
var/sun_angle = 0 // sun angle as set by sun datum
var/obj/machinery/power/solar_control/control = null
/obj/machinery/power/tracker/New(var/turf/loc, var/obj/item/solar_assembly/S)
..(loc)
Make(S)
connect_to_network()
/obj/machinery/power/tracker/disconnect_from_network()
/obj/machinery/power/tracker/Destroy()
unset_control() //remove from control computer
..()
solars_list.Remove(src)
/obj/machinery/power/tracker/connect_to_network()
var/to_return = ..()
if(powernet) //if connected and not already in solar_list...
solars_list |= src //... add it
return to_return
//set the control of the tracker to a given computer if closer than SOLAR_MAX_DIST
/obj/machinery/power/tracker/proc/set_control(var/obj/machinery/power/solar_control/SC)
if(SC && (get_dist(src, SC) > SOLAR_MAX_DIST))
return 0
control = SC
return 1
//set the control of the tracker to null and removes it from the previous control computer if needed
/obj/machinery/power/tracker/proc/unset_control()
if(control)
control.connected_tracker = null
control = null
/obj/machinery/power/tracker/proc/Make(var/obj/item/solar_assembly/S)
if(!S)
@@ -40,27 +47,21 @@
S.loc = src
update_icon()
// called by datum/sun/calc_position() as sun's angle changes
//updates the tracker icon and the facing angle for the control computer
/obj/machinery/power/tracker/proc/set_angle(var/angle)
sun_angle = angle
//set icon dir to show sun illumination
dir = turn(NORTH, -angle - 22.5) // 22.5 deg bias ensures, e.g. 67.5-112.5 is EAST
// find all solar controls and update them
// currently, just update all controllers in world
// ***TODO: better communication system using network
if(powernet)
for(var/obj/machinery/power/solar_control/C in powernet.nodes)
if(powernet.nodes[C])
if(get_dist(C, src) < SOLAR_MAX_DIST)
C.tracker_update(angle)
if(powernet && (powernet == control.powernet)) //update if we're still in the same powernet
control.cdir = angle
/obj/machinery/power/tracker/attackby(var/obj/item/weapon/W, var/mob/user)
if(istype(W, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user << "<span class='notice'>You begin to take the glass off the solar tracker...</span>"
user.visible_message("<span class='notice'>[user] begins to take the glass off the solar tracker.</span>")
if(do_after(user, 50))
var/obj/item/solar_assembly/S = locate() in src
if(S)
-1
View File
@@ -49,7 +49,6 @@
density = 1
var/opened = 0
var/obj/machinery/power/compressor/compressor
directwired = 1
var/turf/simulated/outturf
var/lastgen
var/productivity = 1
@@ -9,6 +9,10 @@
slot_flags = SLOT_BACK
ammo_type = list(/obj/item/ammo_casing/energy/ion)
/obj/item/weapon/gun/energy/ionrifle/emp_act(severity)
return
/obj/item/weapon/gun/energy/decloner
name = "biological demolecularisor"
desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
+2 -2
View File
@@ -53,7 +53,7 @@
/obj/item/weapon/gun/energy/crossbow
name = "mini energy-crossbow"
name = "mini energy crossbow"
desc = "A weapon favored by many of the syndicates stealth specialists."
icon_state = "crossbow"
w_class = 2.0
@@ -99,7 +99,7 @@
return
/obj/item/weapon/gun/energy/crossbow/largecrossbow
name = "Energy Crossbow"
name = "energy crossbow"
desc = "A weapon favored by syndicate infiltration teams."
w_class = 4.0
force = 10
+3 -3
View File
@@ -167,7 +167,7 @@ proc/wabbajack(mob/living/M)
new_mob.universal_speak = 1*/
if("animal")
if(prob(50))
var/beast = pick("carp","bear","mushroom","statue", "bat", "goat")
var/beast = pick("carp","bear","mushroom","statue", "bat", "goat","killertomato")
switch(beast)
if("carp") new_mob = new /mob/living/simple_animal/hostile/carp(M.loc)
if("bear") new_mob = new /mob/living/simple_animal/hostile/bear(M.loc)
@@ -175,15 +175,15 @@ proc/wabbajack(mob/living/M)
if("statue") new_mob = new /mob/living/simple_animal/hostile/statue(M.loc)
if("bat") new_mob = new /mob/living/simple_animal/hostile/retaliate/bat(M.loc)
if("goat") new_mob = new /mob/living/simple_animal/hostile/retaliate/goat(M.loc)
if("killertomato") new_mob = new /mob/living/simple_animal/hostile/killertomato(M.loc)
else
var/animal = pick("parrot","corgi","crab","pug","cat","tomato","mouse","chicken","cow","lizard","chick")
var/animal = pick("parrot","corgi","crab","pug","cat","mouse","chicken","cow","lizard","chick")
switch(animal)
if("parrot") new_mob = new /mob/living/simple_animal/parrot(M.loc)
if("corgi") new_mob = new /mob/living/simple_animal/corgi(M.loc)
if("crab") new_mob = new /mob/living/simple_animal/crab(M.loc)
if("pug") new_mob = new /mob/living/simple_animal/pug(M.loc)
if("cat") new_mob = new /mob/living/simple_animal/cat(M.loc)
if("tomato") new_mob = new /mob/living/simple_animal/tomato(M.loc)
if("mouse") new_mob = new /mob/living/simple_animal/mouse(M.loc)
if("chicken") new_mob = new /mob/living/simple_animal/chicken(M.loc)
if("cow") new_mob = new /mob/living/simple_animal/cow(M.loc)
@@ -46,7 +46,7 @@
/obj/item/projectile/meteor
name = "meteor"
icon = 'icons/obj/meteor.dmi'
icon_state = "smallf"
icon_state = "small1"
damage = 0
damage_type = BRUTE
nodamage = 1
+14 -14
View File
@@ -568,7 +568,7 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
spawn(waittime)
src.wait = null
update_icon()
playsound(src.loc, 'sound/items/timer.ogg', 30, 1)
playsound(src.loc, 'sound/machines/ping.ogg', 30, 1)
/obj/machinery/computer/pandemic/update_icon()
if(stat & BROKEN)
@@ -831,7 +831,7 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
/obj/item/stack/sheet/mineral/silver = list("silver" = 20),
/obj/item/stack/sheet/mineral/gold = list("gold" = 20),
/obj/item/weapon/grown/nettle = list("sacid" = 0),
/obj/item/weapon/grown/deathnettle = list("pacid" = 0),
/obj/item/weapon/grown/nettle/death = list("pacid" = 0),
/obj/item/weapon/grown/novaflower = list("capsaicin" = 0),
//Crayons (for overriding colours)
@@ -851,10 +851,10 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries = list("cherryjelly" = 0),
//Grinder stuff, but only if dry
/obj/item/weapon/reagent_containers/food/snacks/grown/coffee_arabica = list("coffeepowder" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/coffee_robusta = list("coffeepowder" = 0, "hyperzine" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/tea_aspera = list("teapowder" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/tea_astra = list("teapowder" = 0, "kelotane" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/coffee/arabica = list("coffeepowder" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/coffee/robusta = list("coffeepowder" = 0, "hyperzine" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/tea/aspera = list("teapowder" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/tea/astra = list("teapowder" = 0, "kelotane" = 0),
@@ -871,20 +871,20 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
/obj/item/weapon/reagent_containers/food/snacks/grown/berries = list("berryjuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/banana = list("banana" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/potato = list("potato" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/lemon = list("lemonjuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/orange = list("orangejuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/lime = list("limejuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon = list("lemonjuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = list("orangejuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime = list("limejuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/watermelonslice = list("watermelonjuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/poisonberries = list("poisonberryjuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison = list("poisonberryjuice" = 0),
)
var/list/dried_items = list(
//Grinder stuff, but only if dry
/obj/item/weapon/reagent_containers/food/snacks/grown/coffee_arabica = list("coffeepowder" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/coffee_robusta = list("coffeepowder" = 0, "hyperzine" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/tea_aspera = list("teapowder" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/tea_astra = list("teapowder" = 0, "kelotane" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/coffee/arabica = list("coffeepowder" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/coffee/robusta = list("coffeepowder" = 0, "hyperzine" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/tea/aspera = list("teapowder" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/tea/astra = list("teapowder" = 0, "kelotane" = 0),
)
var/list/holdingitems = list()
+13 -1
View File
@@ -1598,8 +1598,9 @@ datum
M.sleeping += 1
if(51 to INFINITY)
M.sleeping += 1
M.adjustToxLoss(data - 50)
M.adjustToxLoss((data - 50)*REM)
data++
holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM)
..()
return
@@ -1709,6 +1710,17 @@ datum
color = "#7F8400" // rgb: 127, 132, 0
toxpwr = 0.5
toxin/mutetoxin //the new zombie powder.
name = "Mute Toxin"
id = "mutetoxin"
reagent_state = LIQUID
color = "#F0F8FF" // rgb: 240, 248, 255
toxpwr = 0
on_mob_life(mob/living/carbon/M)
M.silent += 2 * REM + 1 //If this var is increased by one or less, it will have no effect since silent is decreased right after reagents are handled in Life(). Hence the + 1.
..()
/////////////////////////Coloured Crayon Powder////////////////////////////
//For colouring in /proc/mix_color_from_reagents
+8 -1
View File
@@ -408,6 +408,13 @@ silicate
required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1)
result_amount = 1
/datum/chemical_reaction/mutetoxin //i'll just fit this in here snugly between other unfun chemicals :v
name = "Mute toxin"
id = "mutetoxin"
result = "mutetoxin"
required_reagents = list("uranium" = 2, "water" = 1, "carbon" = 1)
result_amount = 2
/datum/chemical_reaction/zombiepowder
name = "Zombie Powder"
id = "zombiepowder"
@@ -1419,7 +1426,7 @@ datum/chemical_reaction/pestkiller
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
var/obj/effect/golemrune/Z = new /obj/effect/golemrune
Z.loc = get_turf(holder.my_atom)
Z.announce_to_ghosts()
notify_ghosts("Golem rune created in [get_area(Z)].", 'sound/effects/ghost2.ogg')
//Bluespace
@@ -47,6 +47,8 @@
else return "No reagents"
/obj/item/weapon/reagent_containers/proc/canconsume(mob/eater, mob/user)
if(!eater.SpeciesCanConsume())
return 0
//Check for covering mask
var/obj/item/clothing/cover = eater.get_item_by_slot(slot_wear_mask)
@@ -135,7 +135,7 @@ Borg Shaker
charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster.
recharge_time = 3
reagent_ids = list("orangejuice", "limejuice", "tomatojuice", "cola", "tonic", "sodawater", "ice", "cream", "beer", "whiskey", "vodka", "rum", "gin", "tequilla", "vermouth", "wine", "kahlua", "cognac", "ale")
reagent_ids = list("beer", "orangejuice", "limejuice", "tomatojuice", "cola", "tonic", "sodawater", "ice", "cream", "whiskey", "vodka", "rum", "gin", "tequilla", "vermouth", "wine", "kahlua", "cognac", "ale")
/obj/item/weapon/reagent_containers/borghypo/borgshaker/attack(mob/M as mob, mob/user as mob)
return //Can't inject stuff with a shaker, can we?
@@ -186,4 +186,16 @@ Borg Shaker
empty = 0
if(empty)
usr << "<span class='notice'>It is currently empty. Please allow some time for the synthesizer to produce more.</span>"
usr << "<span class='notice'>It is currently empty. Please allow some time for the synthesizer to produce more.</span>"
/obj/item/weapon/reagent_containers/borghypo/borgshaker/hacked
..()
name = "cyborg shaker"
desc = "Will mix drinks that knock them dead."
icon = 'icons/obj/drinks.dmi'
icon_state = "threemileislandglass"
possible_transfer_amounts = list(5,10,20)
charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster.
recharge_time = 3
reagent_ids = list("beer2")
@@ -6,84 +6,84 @@
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(1, 2, 3, 4, 5)
volume = 5
var/filled = 0
afterattack(obj/target, mob/user , proximity)
if(!proximity) return
if(!target.reagents) return
/obj/item/weapon/reagent_containers/dropper/afterattack(obj/target, mob/user , proximity)
if(!proximity) return
if(!target.reagents) return
if(filled)
if(target.reagents.total_volume >= target.reagents.maximum_volume)
user << "<span class='notice'>[target] is full.</span>"
return
if(reagents.total_volume > 0)
if(target.reagents.total_volume >= target.reagents.maximum_volume)
user << "<span class='notice'>[target] is full.</span>"
return
if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/clothing/mask/cigarette)) //You can inject humans and food but you cant remove the shit.
user << "<span class='notice'>You cannot directly fill [target].</span>"
return
if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/clothing/mask/cigarette)) //You can inject humans and food but you cant remove the shit.
user << "<span class='notice'>You cannot directly fill [target].</span>"
return
var/trans = 0
var/trans = 0
if(ismob(target))
if(istype(target , /mob/living/carbon/human))
var/mob/living/carbon/human/victim = target
if(ismob(target))
if(istype(target , /mob/living/carbon/human))
var/mob/living/carbon/human/victim = target
var/obj/item/safe_thing = null
if(victim.wear_mask)
if(victim.wear_mask.flags & MASKCOVERSEYES)
safe_thing = victim.wear_mask
if(victim.head)
if(victim.head.flags & MASKCOVERSEYES)
safe_thing = victim.head
if(victim.glasses)
if(!safe_thing)
safe_thing = victim.glasses
var/obj/item/safe_thing = null
if(victim.wear_mask)
if(victim.wear_mask.flags & MASKCOVERSEYES)
safe_thing = victim.wear_mask
if(victim.head)
if(victim.head.flags & MASKCOVERSEYES)
safe_thing = victim.head
if(victim.glasses)
if(!safe_thing)
safe_thing = victim.glasses
if(safe_thing)
if(!safe_thing.reagents)
safe_thing.create_reagents(100)
trans = reagents.trans_to(safe_thing, amount_per_transfer_from_this)
if(safe_thing)
if(!safe_thing.reagents)
safe_thing.create_reagents(100)
trans = reagents.trans_to(safe_thing, amount_per_transfer_from_this)
target.visible_message("<span class='danger'>[user] tries to squirt something into [target]'s eyes, but fails!</span>", \
"<span class='userdanger'>[user] tries to squirt something into [target]'s eyes, but fails!</span>")
spawn(5)
reagents.reaction(safe_thing, TOUCH)
target.visible_message("<span class='danger'>[user] tries to squirt something into [target]'s eyes, but fails!</span>", \
"<span class='userdanger'>[user] tries to squirt something into [target]'s eyes, but fails!</span>")
spawn(5)
reagents.reaction(safe_thing, TOUCH)
user << "<span class='notice'>You transfer [trans] unit\s of the solution.</span>"
if(reagents.total_volume<=0)
filled = 0
icon_state = "dropper[filled]"
return
user << "<span class='notice'>You transfer [trans] unit\s of the solution.</span>"
update_icon()
return
target.visible_message("<span class='danger'>[user] squirts something into [target]'s eyes!</span>", \
"<span class='userdanger'>[user] squirts something into [target]'s eyes!</span>")
reagents.reaction(target, TOUCH)
var/mob/M = target
var/R
if(reagents)
for(var/datum/reagent/A in src.reagents.reagent_list)
R += A.id + " ("
R += num2text(A.volume) + "),"
add_logs(user, M, "squirted", object="[R]")
target.visible_message("<span class='danger'>[user] squirts something into [target]'s eyes!</span>", \
"<span class='userdanger'>[user] squirts something into [target]'s eyes!</span>")
reagents.reaction(target, TOUCH)
var/mob/M = target
var/R
if(reagents)
for(var/datum/reagent/A in src.reagents.reagent_list)
R += A.id + " ("
R += num2text(A.volume) + "),"
add_logs(user, M, "squirted", object="[R]")
trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
user << "<span class='notice'>You transfer [trans] unit\s of the solution.</span>"
if(reagents.total_volume<=0)
filled = 0
icon_state = "dropper[filled]"
trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
user << "<span class='notice'>You transfer [trans] unit\s of the solution.</span>"
update_icon()
else
else
if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers))
user << "<span class='notice'>You cannot directly remove reagents from [target].</span>"
return
if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers))
user << "<span class='notice'>You cannot directly remove reagents from [target].</span>"
return
if(!target.reagents.total_volume)
user << "<span class='notice'>[target] is empty.</span>"
return
if(!target.reagents.total_volume)
user << "<span class='notice'>[target] is empty.</span>"
return
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
user << "<span class='notice'>You fill [src] with [trans] unit\s of the solution.</span>"
user << "<span class='notice'>You fill [src] with [trans] unit\s of the solution.</span>"
filled = 1
icon_state = "dropper[filled]"
update_icon()
/obj/item/weapon/reagent_containers/dropper/update_icon()
if(reagents.total_volume<=0)
icon_state = "dropper0"
else
icon_state = "dropper1"
@@ -19,11 +19,9 @@
return
attack(mob/M as mob, mob/user as mob, def_zone)
var/datum/reagents/R = src.reagents
var/fillevel = gulp_size
if(!R.total_volume || !R)
user << "<span class='alert'> None of [src] left, oh no!</span>"
if(!reagents || !reagents.total_volume)
user << "<span class='alert'>None of [src] left, oh no!</span>"
return 0
if(!canconsume(M, user))
@@ -38,30 +36,19 @@
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
return 1
else if( istype(M, /mob/living/carbon/human) )
for(var/mob/O in viewers(world.view, user))
O.show_message("\red [user] attempts to feed [M] [src].", 1)
if(!do_mob(user, M)) return
for(var/mob/O in viewers(world.view, user))
O.show_message("\red [user] feeds [M] [src].", 1)
add_logs(user, M, "fed", object="[reagentlist(src)]")
if(reagents.total_volume)
reagents.reaction(M, INGEST)
spawn(5)
reagents.trans_to(M, gulp_size)
M.visible_message("<span class='warning'>[user] attempts to feed [src] to [M].</span>", "<span class='notice'>You attempt to feed [src] to [M].</span>")
if(!do_mob(user, M)) return
if(!reagents.total_volume) return // The drink might be empty after the delay, such as by spam-feeding
M.visible_message("<span class='warning'>[user] feeds [src] to [M].</span>", "<span class='notice'>You feed [src] to [M].</span>")
add_logs(user, M, "fed", object="[reagentlist(src)]")
if(reagents.total_volume)
reagents.reaction(M, INGEST)
spawn(5)
reagents.trans_to(M, gulp_size)
if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
var/mob/living/silicon/robot/bro = user
bro.cell.use(30)
var/refill = R.get_master_reagent_id()
spawn(600)
R.add_reagent(refill, fillevel)
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
return 1
return 0
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
return 1
afterattack(obj/target, mob/user , proximity)
@@ -69,27 +56,27 @@
if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
if(!target.reagents.total_volume)
user << "\red [target] is empty."
user << "<span class='warning'>[target] is empty.</span>"
return
if(reagents.total_volume >= reagents.maximum_volume)
user << "\red [src] is full."
user << "<span class='warning'>[src] is full.</span>"
return
var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this)
user << "\blue You fill [src] with [trans] units of the contents of [target]."
user << "<span class='notice'>You fill [src] with [trans] units of the contents of [target].</span>"
else if(target.is_open_container()) //Something like a glass. Player probably wants to transfer TO it.
if(!reagents.total_volume)
user << "\red [src] is empty."
user << "<span class='warning'>[src] is empty.</span>"
return
if(target.reagents.total_volume >= target.reagents.maximum_volume)
user << "\red [target] is full."
user << "<span class='warning'>[target] is full.</span>"
return
var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
user << "\blue You transfer [trans] units of the solution to [target]."
user << "<span class='notice'> You transfer [trans] units of the solution to [target].</span>"
if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
var/mob/living/silicon/robot/bro = user
@@ -105,15 +92,15 @@
..()
if (!(usr in range(0)) && usr!=src.loc) return
if(!reagents || reagents.total_volume==0)
usr << "\blue \The [src] is empty!"
usr << "<span class='notice'>\The [src] is empty!</span>"
else if (reagents.total_volume<=src.volume/4)
usr << "\blue \The [src] is almost empty!"
usr << "<span class='notice'>\The [src] is almost empty!</span>"
else if (reagents.total_volume<=src.volume*0.66)
usr << "\blue \The [src] is half full!"
usr << "<span class='notice'>\The [src] is half full!</span>"
else if (reagents.total_volume<=src.volume*0.90)
usr << "\blue \The [src] is almost full!"
usr << "<span class='notice'>\The [src] is almost full!</span>"
else
usr << "\blue \The [src] is full!"
usr << "<span class='notice'>\The [src] is full!</span>"
////////////////////////////////////////////////////////////////////////////////
@@ -328,12 +315,12 @@
reagents.add_reagent("sodawater", 50)
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/lemon_lime
name = "Orange"
name = "Orange Soda"
desc = "You wanted ORANGE. It gave you Lemon Lime."
icon_state = "lemon-lime"
New()
..()
name = "Lemon-Lime"
name = "Lemon-Lime Soda"
reagents.add_reagent("lemon_lime", 30)
src.pixel_x = rand(-10.0, 10)
src.pixel_y = rand(-10.0, 10)
@@ -12,51 +12,51 @@
switch(reagents.get_master_reagent_id())
if("beer")
icon_state = "beerglass"
name = "Beer glass"
name = "glass of beer"
desc = "A freezing pint of beer"
if("beer2")
icon_state = "beerglass"
name = "Beer glass"
name = "glass of beer"
desc = "A freezing pint of beer"
if("greenbeer")
icon_state = "greenbeerglass"
name = "Green beer glass"
name = "glass of green beer"
desc = "A freezing pint of green beer. Festive."
if("ale")
icon_state = "aleglass"
name = "Ale glass"
name = "glass of ale"
desc = "A freezing pint of delicious Ale"
if("milk")
icon_state = "glass_white"
name = "Glass of milk"
name = "glass of milk"
desc = "White and nutritious goodness!"
if("cream")
icon_state = "glass_white"
name = "Glass of cream"
name = "glass of cream"
desc = "Ewwww..."
if("hot_coco")
icon_state = "chocolateglass"
name = "Glass of chocolate"
name = "glass of chocolate"
desc = "Tasty"
if("lemonjuice")
icon_state = "lemonglass"
name = "Glass of lemon"
name = "glass of lemon juice"
desc = "Sour..."
if("holywater")
icon_state = "glass_clear"
name = "Glass of Holy Water"
name = "glass of Holy Water"
desc = "A glass of holy water."
if("potato")
icon_state = "glass_brown"
name = "Glass of Potato juice"
name = "glass of potato juice"
desc = "Bleh..."
if("watermelonjuice")
icon_state = "glass_red"
name = "Glass of Watermelon juice"
name = "glass of watermelon juice"
desc = "A glass of watermelon juice."
if("cola")
icon_state = "glass_brown"
name = "Glass of Space Cola"
name = "glass of space Cola"
desc = "A glass of refreshing Space Cola"
if("nuka_cola")
icon_state = "nuka_colaglass"
@@ -64,63 +64,63 @@
desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland"
if("orangejuice")
icon_state = "glass_orange"
name = "Glass of Orange juice"
name = "glass of orange juice"
desc = "Vitamins! Yay!"
if("tomatojuice")
icon_state = "glass_red"
name = "Glass of Tomato juice"
name = "glass of tomato juice"
desc = "Are you sure this is tomato juice?"
if("blood")
icon_state = "glass_red"
name = "Glass of Tomato juice"
name = "glass of tomato juice"
desc = "Are you sure this is tomato juice?"
if("limejuice")
icon_state = "glass_green"
name = "Glass of Lime juice"
name = "glass of lime juice"
desc = "A glass of sweet-sour lime juice."
if("whiskey")
icon_state = "whiskeyglass"
name = "Glass of whiskey"
name = "glass of whiskey"
desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy."
if("gin")
icon_state = "ginvodkaglass"
name = "Glass of gin"
name = "glass of gin"
desc = "A crystal clear glass of Griffeater gin."
if("vodka")
icon_state = "ginvodkaglass"
name = "Glass of vodka"
name = "glass of vodka"
desc = "The glass contain wodka. Xynta."
if("goldschlager")
icon_state = "ginvodkaglass"
name = "Glass of goldschlager"
name = "glass of Goldschlager"
desc = "100 proof that teen girls will drink anything with gold in it."
if("wine")
icon_state = "wineglass"
name = "Glass of wine"
name = "glass of wine"
desc = "A very classy looking drink."
if("cognac")
icon_state = "cognacglass"
name = "Glass of cognac"
name = "glass of cognac"
desc = "Damn, you feel like some kind of French aristocrat just by holding this."
if ("kahlua")
icon_state = "kahluaglass"
name = "Glass of RR coffee Liquor"
name = "glass of RR Coffee Liquor"
desc = "DAMN, THIS THING LOOKS ROBUST"
if("vermouth")
icon_state = "vermouthglass"
name = "Glass of Vermouth"
name = "glass of vermouth"
desc = "You wonder why you're even drinking this straight."
if("tequilla")
icon_state = "tequillaglass"
name = "Glass of Tequilla"
name = "glass of tequilla"
desc = "Now all that's missing is the weird colored shades!"
if("patron")
icon_state = "patronglass"
name = "Glass of Patron"
name = "glass of patron"
desc = "Drinking patron in the bar, with all the subpar ladies."
if("rum")
icon_state = "rumglass"
name = "Glass of Rum"
name = "glass of rum"
desc = "Now you want to Pray for a pirate suit, don't you?"
if("gintonic")
icon_state = "gintonicglass"
@@ -213,7 +213,7 @@
if("vodkatonic")
icon_state = "vodkatonicglass"
name = "Vodka and Tonic"
desc = "For when a gin and tonic isn't russian enough."
desc = "For when a gin and tonic isn't Russian enough."
if("manhattan")
icon_state = "manhattanglass"
name = "Manhattan"
@@ -221,7 +221,7 @@
if("manhattan_proj")
icon_state = "proj_manhattanglass"
name = "Manhattan Project"
desc = "A scienitst drink of choice, for thinking how to blow up the station."
desc = "A scientist drink of choice, for thinking how to blow up the station."
if("ginfizz")
icon_state = "ginfizzglass"
name = "Gin Fizz"
@@ -281,11 +281,11 @@
if("berryjuice")
icon_state = "berryjuice"
name = "Glass of berry juice"
desc = "Berry juice. Or maybe its jam. Who cares?"
desc = "Berry juice. Or maybe it's jam. Who cares?"
if("poisonberryjuice")
icon_state = "poisonberryjuice"
name = "Glass of poison berry juice"
desc = "A glass of deadly juice."
name = "Glass of berry juice"
desc = "Berry juice. Or maybe it's poison. Who cares?"
if("carrotjuice")
icon_state = "carrotjuice"
name = "Glass of carrot juice"
@@ -898,9 +898,9 @@
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/human/kabob
name = "-kabob"
icon_state = "kabob"
/obj/item/weapon/reagent_containers/food/snacks/human/kebab
name = "-kebab"
icon_state = "kebab"
desc = "A human meat, on a stick."
trash = /obj/item/stack/rods
New()
@@ -908,9 +908,9 @@
reagents.add_reagent("nutriment", 8)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/monkeykabob
name = "meat-kabob"
icon_state = "kabob"
/obj/item/weapon/reagent_containers/food/snacks/monkeykebab
name = "meat-kebab"
icon_state = "kebab"
desc = "Delicious meat, on a stick."
trash = /obj/item/stack/rods
New()
@@ -918,9 +918,9 @@
reagents.add_reagent("nutriment", 8)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/tofukabob
name = "tofu-kabob"
icon_state = "kabob"
/obj/item/weapon/reagent_containers/food/snacks/tofukebab
name = "tofu-kebab"
icon_state = "kebab"
desc = "Vegan meat, on a stick."
trash = /obj/item/stack/rods
New()
@@ -1038,10 +1038,10 @@
reagents.add_reagent("nutriment", 2)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/spagetti
name = "spagetti"
desc = "Now thats a nice pasta!"
icon_state = "spagetti"
/obj/item/weapon/reagent_containers/food/snacks/spaghetti
name = "spaghetti"
desc = "Now that's a nic'e pasta!"
icon_state = "spaghetti"
New()
..()
reagents.add_reagent("nutriment", 1)
@@ -1523,10 +1523,10 @@
reagents.add_reagent("nutriment", 8)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti
name = "boiled spagetti"
/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti
name = "boiled spaghetti"
desc = "A plain dish of noodles, this sucks."
icon_state = "spagettiboiled"
icon_state = "spaghettiboiled"
trash = /obj/item/trash/plate
New()
..()
@@ -1534,7 +1534,7 @@
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/pastatomato
name = "spagetti"
name = "spaghetti"
desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!"
icon_state = "pastatomato"
trash = /obj/item/trash/plate
@@ -1555,10 +1555,10 @@
reagents.add_reagent("tomatojuice", 20)
bitesize = 1
/obj/item/weapon/reagent_containers/food/snacks/meatballspagetti
name = "spagetti and meatballs"
desc = "Now thats a nic'e meatball!"
icon_state = "meatballspagetti"
/obj/item/weapon/reagent_containers/food/snacks/meatballspaghetti
name = "spaghetti and meatballs"
desc = "Now that's a nic'e meatball!"
icon_state = "meatballspaghetti"
trash = /obj/item/trash/plate
New()
..()
+2 -1
View File
@@ -141,7 +141,8 @@
// mouse drop another mob or self
//
/obj/machinery/disposal/MouseDrop_T(mob/target, mob/user)
stuff_mob_in(target, user)
if(istype(target))
stuff_mob_in(target, user)
/obj/machinery/disposal/proc/stuff_mob_in(mob/target, mob/user)
if (!user.canUseTopic(target) || istype(user, /mob/living/silicon/ai))
+12 -12
View File
@@ -255,6 +255,15 @@ datum/design/orion_trail
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/arcade/orion_trail
datum/design/orion_trail
name = "Computer Design (Slot Machine)"
desc = "Allows for the construction of circuit boards used to build a new slot machine."
id = "slotmachine"
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list("$glass" = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/slot_machine
datum/design/powermonitor
name = "Computer Design (Power Monitor)"
desc = "Allows for the construction of circuit boards used to build a new power monitor."
@@ -1897,22 +1906,13 @@ datum/design/welding_mask
datum/design/mesons
name = "Optical Meson Scanners"
desc = "Used for seeing walls, floors, and stuff through anything."
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
id = "mesons"
req_tech = list("magnets" = 2, "engineering" = 2)
req_tech = list("materials" = 3, "magnets" = 3, "engineering" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
materials = list("$metal" = 200, "$glass" = 300, "$plasma" = 100)
build_path = /obj/item/clothing/glasses/meson
datum/design/advanced_mesons
name = "Advanced Optical Meson Scanner"
desc = "More powerful than your standard mesons, these ones make everything appear to be lit extremely brightly."
id = "advanced_mesons"
req_tech = list("magnets" = 4, "engineering" = 4)
build_type = PROTOLATHE
materials = list("$metal" = 100, "$glass" = 100)
build_path = /obj/item/clothing/glasses/meson/advanced
datum/design/night_vision_goggles
name = "Night Vision Goggles"
desc = "Goggles that let you see through darkness unhindered."
+4 -32
View File
@@ -21,33 +21,7 @@ datum/shuttle_manager/proc/move_shuttle(var/override_delay)
fromArea = locate(location) //the location of the shuttle
toArea = locate(fromArea.destination)
var/list/dstturfs = list()
var/throwy = world.maxy
for(var/turf/T in toArea)
dstturfs += T
if(T.y < throwy)
throwy = T.y
// hey you, get out of the way!
for(var/turf/T in dstturfs)
// find the turf to move things to
var/turf/D = locate(T.x, throwy - 1, 1)
//var/turf/E = get_step(D, SOUTH)
for(var/atom/movable/AM as mob|obj in T)
AM.Move(D)
// NOTE: Commenting this out to avoid recreating mass driver glitch
/*
spawn(0)
AM.throw_at(E, 1, 1)
return
*/
if(istype(T, /turf/simulated))
del(T)
for(var/mob/living/carbon/bug in toArea) // If someone somehow is still in the shuttle's docking area...
bug.gib()
toArea.clear_docking_area()
fromArea.move_contents_to(toArea)
location = toArea.type
@@ -74,8 +48,6 @@ datum/shuttle_manager/proc/move_shuttle(var/override_delay)
return 1
/obj/machinery/computer/shuttle
name = "Shuttle Console"
icon = 'icons/obj/computer.dmi'
@@ -108,11 +80,11 @@ datum/shuttle_manager/proc/move_shuttle(var/override_delay)
if(id in shuttles)
var/datum/shuttle_manager/s = shuttles[id]
if (s.move_shuttle())
usr << "\blue Shuttle recieved message and will be sent shortly."
usr << "<span class='notice'>Shuttle recieved message and will be sent shortly.</span>"
else
usr << "\blue Shuttle is already moving."
usr << "<span class='notice'>Shuttle is already moving.</span>"
else
usr << "\red Invalid shuttle requested."
usr << "<span class='warning'>Invalid shuttle requested.</span>"
/obj/machinery/computer/shuttle/attackby(I as obj, user as mob)
+5 -4
View File
@@ -11,18 +11,19 @@
var/has_multi_loc = 0 //Multiple locations - RR
/datum/surgery/proc/next_step(mob/user, mob/living/carbon/target)
if(step_in_progress) return
var/procedure = steps[status]
var/datum/surgery_step/S = new procedure
var/datum/surgery_step/S = get_surgery_step()
if(S)
if(S.try_op(user, target, user.zone_sel.selecting, user.get_active_hand(), src))
return 1
return 0
/datum/surgery/proc/get_surgery_step()
var/step_type = steps[status]
return new step_type
/datum/surgery/proc/complete(mob/living/carbon/human/target)
target.surgeries -= src
-6
View File
@@ -50,12 +50,6 @@
origin_tech = "materials=1;biotech=1"
attack_verb = list("drilled")
/obj/item/weapon/scalpel/suicide_act(mob/user)
user.visible_message(pick("<span class='suicide'>[user] is pressing [src] to \his temple and activating it! It looks like \he's trying to commit suicide.</span>", \
"<span class='suicide'>[user] is pressing [src] to \his chest and activating it! It looks like \he's trying to commit suicide.</span>"))
return (BRUTELOSS)
/obj/item/weapon/scalpel
name = "scalpel"
desc = "Cut, cut, and once more cut."