Merge remote-tracking branch 'upstream/master' into receiverssss

This commit is contained in:
Fox-McCloud
2017-03-24 16:50:57 -04:00
56 changed files with 1901 additions and 1191 deletions
File diff suppressed because it is too large Load Diff
+4 -1
View File
@@ -11,10 +11,13 @@
invocation_type = "shout"
action_icon_state = "immrod"
sound = 'sound/effects/whoosh.ogg'
var/rod_delay = 2
/obj/effect/proc_holder/spell/targeted/rod_form/cast(list/targets,mob/user = usr)
for(var/mob/living/M in targets)
var/turf/start = get_turf(M)
var/obj/effect/immovablerod/wizard/W = new(start, get_ranged_target_turf(M, M.dir, (15 + spell_level * 3)))
var/obj/effect/immovablerod/wizard/W = new(start, get_ranged_target_turf(M, M.dir, (15 + spell_level * 3)), rod_delay)
W.wizard = M
W.max_distance += spell_level * 3 //You travel farther when you upgrade the spell
W.start_turf = start
+1 -1
View File
@@ -37,7 +37,7 @@
var/datum/material_container/materials
var/list/categories = list("Communication", "Construction", "Electronics", "Imported", "Medical", "Miscellaneous", "Security", "Tools")
var/list/categories = list("Tools", "Electronics", "Construction", "Communication", "Security", "Machinery", "Medical", "Miscellaneous", "Dinnerware", "Imported")
/obj/machinery/autolathe/New()
..()
+49 -18
View File
@@ -10,30 +10,55 @@
icon_state = "glowshroom" //replaced in New
layer = 2.1
var/endurance = 30
var/potency = 30
var/delay = 1200
var/floor = 0
var/yield = 3
var/generation = 1
var/spreadIntoAdjacentChance = 60
light_color = "#006622"
var/obj/item/seeds/myseed = /obj/item/seeds/glowshroom
obj/effect/glowshroom/glowcap
/obj/effect/glowshroom/glowcap
name = "glowcap"
desc = "Mycena Ruthenia, a species of mushroom that, while it does glow in the dark, is not actually bioluminescent."
icon_state = "glowcap"
light_color = "#8E0300"
myseed = /obj/item/seeds/glowshroom/glowcap
/obj/effect/glowshroom/single
yield = 0
/obj/effect/glowshroom/shadowshroom
name = "shadowshroom"
desc = "Mycena Umbra, a species of mushroom that emits shadow instead of light."
icon_state = "shadowshroom"
myseed = /obj/item/seeds/glowshroom/shadowshroom
/obj/effect/glowshroom/single/Spread()
return
/obj/effect/glowshroom/examine(mob/user)
. = ..()
to_chat(user, "This is a [generation]\th generation [name]!")
/obj/effect/glowshroom/New()
/obj/effect/glowshroom/Destroy()
if(myseed)
qdel(myseed)
myseed = null
return ..()
/obj/effect/glowshroom/New(loc, obj/item/seeds/newseed, mutate_stats)
..()
set_light(round(potency/10))
dir = CalcDir()
if(newseed)
myseed = newseed.Copy()
myseed.forceMove(src)
else
myseed = new myseed(src)
if(mutate_stats) //baby mushrooms have different stats :3
myseed.adjust_potency(rand(-3,6))
myseed.adjust_yield(rand(-1,2))
myseed.adjust_production(rand(-3,6))
myseed.adjust_endurance(rand(-3,6))
delay = delay - myseed.production * 100 //So the delay goes DOWN with better stats instead of up. :I
endurance = myseed.endurance
if(myseed.get_gene(/datum/plant_gene/trait/glow))
var/datum/plant_gene/trait/glow/G = myseed.get_gene(/datum/plant_gene/trait/glow)
set_light(G.glow_range(myseed), G.glow_power(myseed), G.glow_color)
setDir(CalcDir())
var/base_icon_state = initial(icon_state)
if(!floor)
switch(dir) //offset to make it be on the wall rather than on the floor
@@ -49,10 +74,12 @@ obj/effect/glowshroom/glowcap
else //if on the floor, glowshroom on-floor sprite
icon_state = "[base_icon_state]f"
addtimer(src, "Spread", delay)
addtimer(src, "Spread", delay, FALSE)
/obj/effect/glowshroom/proc/Spread()
for(var/i = 1 to yield)
var/turf/ownturf = get_turf(src)
var/shrooms_planted = 0
for(var/i in 1 to myseed.yield)
if(prob(1/(generation * generation) * 100))//This formula gives you diminishing returns based on generation. 100% with 1st gen, decreasing to 25%, 11%, 6, 4, 2...
var/list/possibleLocs = list()
var/spreadsIntoAdjacent = FALSE
@@ -61,6 +88,8 @@ obj/effect/glowshroom/glowcap
spreadsIntoAdjacent = TRUE
for(var/turf/simulated/floor/earth in view(3,src))
if(!ownturf.CanAtmosPass(earth))
continue
if(spreadsIntoAdjacent || !locate(/obj/effect/glowshroom) in view(1,earth))
possibleLocs += earth
CHECK_TICK
@@ -81,14 +110,16 @@ obj/effect/glowshroom/glowcap
if(shroomCount >= placeCount)
continue
var/obj/effect/glowshroom/child = new type(newLoc)//The baby mushrooms have different stats :3
child.potency = max(potency + rand(-3,6), 0)
child.yield = max(yield + rand(-1,2), 0)
child.delay = max(delay + rand(-30,60), 0)
child.endurance = max(endurance + rand(-3,6), 1)
var/obj/effect/glowshroom/child = new type(newLoc, myseed, TRUE)
child.generation = generation + 1
shrooms_planted++
CHECK_TICK
else
shrooms_planted++ //if we failed due to generation, don't try to plant one later
if(shrooms_planted < myseed.yield) //if we didn't get all possible shrooms planted, try again later
myseed.yield -= shrooms_planted
addtimer(src, "Spread", delay, FALSE)
/obj/effect/glowshroom/proc/CalcDir(turf/location = loc)
var/direction = 16
@@ -146,4 +177,4 @@ obj/effect/glowshroom/glowcap
/obj/effect/glowshroom/proc/CheckEndurance()
if(endurance <= 0)
qdel(src)
qdel(src)
@@ -13,7 +13,7 @@
var/mob/living/carbon/M = AM
M.slip("soap", 4, 2)
/obj/item/weapon/soap/afterattack(atom/target, mob/user as mob, proximity)
/obj/item/weapon/soap/afterattack(atom/target, mob/user, proximity)
if(!proximity) return
//I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing.
//So this is a workaround. This also makes more sense from an IC standpoint. ~Carn
@@ -37,6 +37,9 @@
var/obj/effect/decal/cleanable/C = locate() in target
qdel(C)
target.clean_blood()
if(istype(target, /turf/simulated))
var/turf/simulated/T = target
T.dirt = 0
return
/obj/item/weapon/soap/attack(mob/target as mob, mob/user as mob)
@@ -3,7 +3,7 @@
desc = "A rod of pure obsidian, its very presence disrupts and dampens the powers of Nar-Sie's followers."
icon_state = "nullrod"
item_state = "nullrod"
force = 18
force = 15
throw_speed = 3
throw_range = 4
throwforce = 10
@@ -197,7 +197,7 @@
item_state = "hfrequency1"
desc = "Bad references are the DNA of the soul."
attack_verb = list("chopped", "sliced", "cut", "zandatsu'd")
/obj/item/weapon/nullrod/scythe/spellblade
icon_state = "spellblade"
item_state = "spellblade"
@@ -328,7 +328,7 @@
icon = 'icons/obj/toy.dmi'
icon_state = "carpplushie"
item_state = "carp_plushie"
force = 15
force = 13
attack_verb = list("bitten", "eaten", "fin slapped")
hitsound = 'sound/weapons/bite.ogg'
var/used_blessing = FALSE
@@ -346,7 +346,7 @@
name = "monk's staff"
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts, now used to harass the clown."
w_class = 4
force = 15
force = 13
block_chance = 40
slot_flags = SLOT_BACK
sharp = 0
+1
View File
@@ -28,6 +28,7 @@
/obj/item/weapon/mop/proc/clean(turf/simulated/A)
if(reagents.has_reagent("water", 1) || reagents.has_reagent("cleaner", 1) || reagents.has_reagent("holywater", 1))
A.clean_blood()
A.dirt = 0
for(var/obj/effect/O in A)
if(is_cleanable(O))
qdel(O)
+3 -3
View File
@@ -280,7 +280,7 @@
icon_state = "jaws_cutter"
item_state = "jawsoflife"
origin_tech = "materials=2;engineering=2"
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_GOLD=25)
usesound = 'sound/items/jaws_cut.ogg'
toolspeed = 0.25
@@ -495,7 +495,7 @@
//Switches the welder on
/obj/item/weapon/weldingtool/proc/switched_on(mob/user)
if(!status)
to_chat(user, "span class='warning'>[src] can't be turned on while unsecured!</span>")
to_chat(user, "<span class='warning'>[src] can't be turned on while unsecured!</span>")
return
welding = !welding
if(welding)
@@ -692,7 +692,7 @@ obj/item/weapon/weldingtool/experimental/process()
desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a prying head."
icon_state = "jaws_pry"
item_state = "jawsoflife"
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_DIAMOND=25)
origin_tech = "materials=2;engineering=2"
usesound = 'sound/items/jaws_pry.ogg'
force = 15
@@ -20,6 +20,12 @@
/obj/structure/stool/bed/MouseDrop(atom/over_object)
..(over_object, skip_fucking_stool_shit = 1)
/obj/structure/stool/bed/attackby(obj/item/weapon/W as obj, mob/user, params)
if(iswrench(W))
playsound(loc, W.usesound, 50, 1)
new /obj/item/stack/sheet/metal(loc, 2)
qdel(src)
/obj/structure/stool/psychbed
name = "psych bed"
desc = "For prime comfort during psychiatric evaluations."
@@ -54,7 +60,7 @@
/obj/structure/stool/bed/attack_animal(var/mob/living/simple_animal/M)//No more buckling hostile mobs to chairs to render them immobile forever
if(M.environment_smash)
new /obj/item/stack/sheet/metal(src.loc)
new /obj/item/stack/sheet/metal(loc)
qdel(src)
@@ -73,7 +79,7 @@
if(buckled_mob)
user_unbuckle_mob(user)
else
user.visible_message("<span class='notice'>[user] collapses \the [src.name].</span>", "<span class='notice'>You collapse \the [src.name].</span>")
user.visible_message("<span class='notice'>[user] collapses \the [name].</span>", "<span class='notice'>You collapse \the [name].</span>")
new/obj/item/roller(get_turf(src))
qdel(src)
return
@@ -107,8 +113,8 @@
if(istype(W, /obj/item/roller_holder))
var/obj/item/roller_holder/RH = W
if(!RH.held)
user.visible_message("<span class='notice'>[user] collects \the [src.name].</span>", "<span class='notice'>You collect \the [src.name].</span>")
src.forceMove(RH)
user.visible_message("<span class='notice'>[user] collects \the [name].</span>", "<span class='notice'>You collect \the [name].</span>")
forceMove(RH)
RH.held = src
/obj/structure/stool/bed/roller/MouseDrop(over_object, src_location, over_location)
@@ -118,7 +124,7 @@
return
if(buckled_mob)
return 0
usr.visible_message("<span class='notice'>[usr] collapses \the [src.name].</span>", "<span class='notice'>You collapse \the [src.name].</span>")
usr.visible_message("<span class='notice'>[usr] collapses \the [name].</span>", "<span class='notice'>You collapse \the [name].</span>")
new/obj/item/roller(get_turf(src))
qdel(src)
return
@@ -12,25 +12,25 @@
return
if(2.0)
if(prob(70))
new /obj/item/stack/sheet/metal(src.loc)
new /obj/item/stack/sheet/metal(loc)
qdel(src)
return
if(3.0)
if(prob(50))
new /obj/item/stack/sheet/metal(src.loc)
new /obj/item/stack/sheet/metal(loc)
qdel(src)
return
return
/obj/structure/stool/blob_act()
if(prob(75))
new /obj/item/stack/sheet/metal(src.loc)
new /obj/item/stack/sheet/metal(loc)
qdel(src)
/obj/structure/stool/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
playsound(src.loc, W.usesound, 50, 1)
new /obj/item/stack/sheet/metal(src.loc)
playsound(loc, W.usesound, 50, 1)
new /obj/item/stack/sheet/metal(loc)
qdel(src)
/obj/structure/stool/MouseDrop(atom/over_object, src_location, over_location, src_control, over_control, params, skip_fucking_stool_shit = 0)
@@ -41,7 +41,7 @@
if(H==usr && !H.restrained() && !H.stat && in_range(src, over_object))
var/obj/item/weapon/stool/S = new/obj/item/weapon/stool()
S.origin = src
src.loc = S
loc = S
H.put_in_hands(S)
H.visible_message("<span class='warning'>[H] grabs [src] from the floor!</span>", "<span class='warning'>You grab [src] from the floor!</span>")
+1 -1
View File
@@ -554,7 +554,7 @@ var/list/admin_verbs_snpc = list(
var/turf/epicenter = mob.loc
var/list/choices = list("Small Bomb", "Medium Bomb", "Big Bomb", "Custom Bomb")
var/choice = input("What size explosion would you like to produce?") in choices
var/choice = input("What size explosion would you like to produce?") as null|anything in choices
switch(choice)
if(null)
return 0
+1 -1
View File
@@ -223,7 +223,7 @@ obj/item/clothing/head/blob
desc = "Deus Vult."
icon_state = "knight_templar"
item_state = "knight_templar"
armor = list(melee = 20, bullet = 7, laser = 2, energy = 2, bomb = 2, bio = 2, rad = 0)
//Commander
/obj/item/clothing/head/helmet/ert/command
+1
View File
@@ -209,6 +209,7 @@
icon_state = "knight_templar"
item_state = "knight_templar"
allowed = list(/obj/item/weapon/nullrod/claymore)
armor = list(melee = 25, bullet = 5, laser = 5, energy = 5, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/bulletproof
name = "Bulletproof Vest"
+76 -79
View File
@@ -2,6 +2,8 @@
var/busy
var/viewing_category = 1 //typical powergamer starting on the Weapons tab
var/list/categories = list(CAT_WEAPON,CAT_AMMO,CAT_ROBOT,CAT_FOOD,CAT_MISC,CAT_PRIMAL)
var/display_craftable_only = FALSE
var/display_compact = TRUE
@@ -34,8 +36,8 @@
else
continue
return 0
for(var/A in R.chem_catalists)
if(contents[A] < R.chem_catalists[A])
for(var/A in R.chem_catalysts)
if(contents[A] < R.chem_catalysts[A])
return 0
return 1
@@ -225,68 +227,70 @@
Deletion.Cut(Deletion.len)
qdel(DL)
/datum/personal_crafting/proc/craft(mob/user)
if(user.incapacitated() || user.lying || istype(user.loc, /obj/mecha))
return
/datum/personal_crafting/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, datum/topic_state/state = not_incapacitated_turf_state)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "personal_crafting.tmpl", "Crafting Menu", 700, 800, state = state)
ui.open()
/datum/personal_crafting/ui_data(mob/user)
var/list/data = list()
var/cur_category = categories[viewing_category]
data["busy"] = busy
data["prev_cat"] = categories[prev_cat()]
data["category"] = cur_category
data["next_cat"] = categories[next_cat()]
data["display_craftable_only"] = display_craftable_only
data["display_compact"] = display_compact
var/list/surroundings = get_surroundings(user)
var/dat = "<h3>Crafting menu</h3>"
if(busy)
dat += "<div class='statusDisplay'>Crafting in progress...</div>"
else
dat += "<A href='?src=[UID()];backwardCat=1'><--</A>"
dat += " [categories[prev_cat()]] |"
dat += " <B>[categories[viewing_category]]</B> "
dat += "| [categories[next_cat()]] "
dat += "<A href='?src=[UID()];forwardCat=1'>--></A><BR><BR>"
dat += "<div class='statusDisplay'>"
//Filter the recipes we can craft to the top
var/list/can_craft = list()
var/list/cant_craft = list()
for(var/datum/crafting_recipe/R in crafting_recipes)
if(R.category != categories[viewing_category])
continue
if(check_contents(R, surroundings))
can_craft += R
else
cant_craft += R
for(var/datum/crafting_recipe/R in can_craft)
dat += build_recipe_text(R, surroundings)
for(var/datum/crafting_recipe/R in cant_craft)
dat += build_recipe_text(R, surroundings)
dat += "</div>"
var/datum/browser/popup = new(user, "crafting", "Crafting", 500, 500)
popup.set_content(dat)
popup.open()
return
var/list/can_craft = list()
var/list/cant_craft = list()
for(var/rec in crafting_recipes)
var/datum/crafting_recipe/R = rec
if(R.category != cur_category)
continue
if(check_contents(R, surroundings))
can_craft += list(build_recipe_data(R))
else
cant_craft += list(build_recipe_data(R))
data["can_craft"] = can_craft
data["cant_craft"] = cant_craft
return data
/datum/personal_crafting/Topic(href, href_list)
if(usr.stat || usr.lying)
if(..())
return
if(href_list["make"])
var/datum/crafting_recipe/TR = locate(href_list["make"])
busy = 1
craft(usr)
nanomanager.update_uis(src)
var/fail_msg = construct_item(usr, TR)
if(!fail_msg)
usr << "<span class='notice'>[TR.name] constructed.</span>"
to_chat(usr, "<span class='notice'>[TR.name] constructed.</span>")
else
usr << "<span class ='warning'>Construction failed[fail_msg]</span>"
to_chat(usr, "<span class ='warning'>Construction failed[fail_msg]</span>")
busy = 0
craft(usr)
nanomanager.update_uis(src)
if(href_list["forwardCat"])
viewing_category = next_cat()
usr << "<span class='notice'>Category is now [categories[viewing_category]].</span>"
craft(usr)
to_chat(usr, "<span class='notice'>Category is now [categories[viewing_category]].</span>")
. = TRUE
if(href_list["backwardCat"])
viewing_category = prev_cat()
usr << "<span class='notice'>Category is now [categories[viewing_category]].</span>"
craft(usr)
to_chat(usr, "<span class='notice'>Category is now [categories[viewing_category]].</span>")
. = TRUE
if(href_list["toggle_recipes"])
display_craftable_only = !display_craftable_only
to_chat(usr, "<span class='notice'>You will now [display_craftable_only ? "only see recipes you can craft":"see all recipes"].</span>")
. = TRUE
if(href_list["toggle_compact"])
display_compact = !display_compact
to_chat(usr, "<span class='notice'>Crafting menu is now [display_compact? "compact" : "full size"].</span>")
. = TRUE
nanomanager.update_uis(src)
//Next works nicely with modular arithmetic
/datum/personal_crafting/proc/next_cat()
@@ -301,39 +305,32 @@
if(. <= 0)
. = categories.len
/datum/personal_crafting/proc/build_recipe_text(datum/crafting_recipe/R, list/contents)
. = ""
var/name_text = ""
/datum/personal_crafting/proc/build_recipe_data(datum/crafting_recipe/R)
var/list/data = list()
data["name"] = R.name
data["ref"] = "\ref[R]"
var/req_text = ""
var/tool_text = ""
var/catalist_text = ""
if(check_contents(R, contents))
name_text ="<A href='?src=[UID()];make=\ref[R]'>[R.name]</A>"
var/catalyst_text = ""
else
name_text = "<span class='linkOff'>[R.name]</span>"
for(var/a in R.reqs)
//We just need the name, so cheat-typecast to /atom for speed (even tho Reagents are /datum they DO have a "name" var)
//Also these are typepaths so sadly we can't just do "[a]"
var/atom/A = a
req_text += " [R.reqs[A]] [initial(A.name)],"
req_text = replacetext(req_text, ",", "", -1)
data["req_text"] = req_text
if(name_text)
for(var/A in R.reqs)
if(ispath(A, /obj))
var/obj/O = A
req_text += " [R.reqs[A]] [initial(O.name)]"
else if(ispath(A, /datum/reagent))
var/datum/reagent/RE = A
req_text += " [R.reqs[A]] [initial(RE.name)]"
for(var/a in R.chem_catalysts)
var/atom/A = a //cheat-typecast
catalyst_text += " [R.chem_catalysts[A]] [initial(A.name)],"
catalyst_text = replacetext(catalyst_text, ",", "", -1)
data["catalyst_text"] = catalyst_text
if(R.chem_catalists.len)
catalist_text += ", Catalysts:"
for(var/C in R.chem_catalists)
if(ispath(C, /datum/reagent))
var/datum/reagent/RE = C
catalist_text += " [R.chem_catalists[C]] [initial(RE.name)]"
for(var/a in R.tools)
var/atom/A = a //cheat-typecast
tool_text += " [R.tools[A]] [initial(A.name)],"
tool_text = replacetext(tool_text, ",", "", -1)
data["tool_text"] = tool_text
if(R.tools.len)
tool_text += ", Tools:"
for(var/O in R.tools)
if(ispath(O, /obj))
var/obj/T = O
tool_text += " [R.tools[O]] [initial(T.name)]"
. = "[name_text][req_text][tool_text][catalist_text]<BR>"
return data
+1 -1
View File
@@ -5,7 +5,7 @@
var/tools[] = list() //type paths of items needed but not consumed
var/time = 30 //time in deciseconds
var/parts[] = list() //type paths of items that will be placed in the result
var/chem_catalists[] = list() //like tools but for reagents
var/chem_catalysts[] = list() //like tools but for reagents
var/category = CAT_MISC // Recipe category
/datum/crafting_recipe/proc/AdjustChems(var/obj/resultobj as obj)
+29
View File
@@ -697,3 +697,32 @@
name = "Voxcaster"
desc = "Battered, Sol-made military radio backpack that had its speakers fried from playing Vox opera. The words 'Swift-Talon' are crudely scratched onto its side."
icon_state = "voxcaster_fluff"
/obj/item/clothing/head/wizard/fake/fluff/dreamy //phantasmicdream : Dreamy Rockwall
name = "strange witch hat"
desc = "A shapeshifting witch hat. A strange aura comes from it..."
icon = 'icons/obj/custom_items.dmi'
icon_state = "classic_witch"
item_state = "classic_witch"
/obj/item/clothing/head/wizard/fake/fluff/dreamy/attack_self(mob/user)
var/list/options = list()
options["Classic"] = "classic_witch"
options["Good"] = "good_witch"
options["Dark"] = "dark_witch"
options["Steampunk"] ="steampunk_witch"
options["Healer"] = "healer_witch"
options["Cute"] = "cutie_witch"
options["Shy"] = "shy_witch"
options["Sexy"] ="sexy_witch"
options["Bunny"] = "bunny_witch"
options["Potions"] = "potions_witch"
options["Syndicate"] = "syndie_witch"
options["Nanotrasen"] ="nt_witch"
var/choice = input(user, "To what form do you wish to Shapeshift this hat?", "Shapeshift Hat") as null|anything in options
if(choice && !user.stat && in_range(user, src))
icon_state = options[choice]
to_chat(user, "Your strange witch hat has now shapeshifted into it's [choice] form!")
return 1
+11 -27
View File
@@ -5,81 +5,65 @@
icon = 'icons/obj/fish_items.dmi'
icon_state = "eggs"
w_class = 2
var/fish_type = null //Holds the name of the fish that the egg is for
/obj/item/fish_eggs/New()
..()
var/global/list/fish_eggs_list = list("dud" = /obj/item/fish_eggs,
"goldfish" = /obj/item/fish_eggs/goldfish,
"clownfish" = /obj/item/fish_eggs/clownfish,
"shark" = /obj/item/fish_eggs/shark,
"baby space carp" = /obj/item/fish_eggs/babycarp,
"catfish" = /obj/item/fish_eggs/catfish,
"feederfish" = /obj/item/fish_eggs/feederfish,
"salmon" = /obj/item/fish_eggs/salmon,
"shrimp" = /obj/item/fish_eggs/shrimp,
"electric eel" = /obj/item/fish_eggs/electric_eel,
"glofish" = /obj/item/fish_eggs/glofish,
)
var/datum/fish/fish_type = null //Holds the datum of the fish that the egg is for, null means dud eggs
/obj/item/fish_eggs/goldfish
name = "goldfish eggs"
desc = "Goldfish eggs, surprisingly, don't contain actual gold."
icon_state = "gold_eggs"
fish_type = "goldfish"
fish_type = /datum/fish/goldfish
/obj/item/fish_eggs/clownfish
name = "clownfish eggs"
desc = "Even as eggs, they are funnier than the clown. HONK!"
icon_state = "clown_eggs"
fish_type = "clownfish"
fish_type = /datum/fish/clownfish
/obj/item/fish_eggs/shark
name = "shark eggs"
desc = "We're gonna need a- Oh wait, they're still eggs."
icon_state = "shark_eggs"
fish_type = "shark"
fish_type = /datum/fish/shark
/obj/item/fish_eggs/babycarp
name = "baby space carp eggs"
desc = "Eggs from the substantially smaller form of the intergalactic terror."
icon_state = "babycarp_eggs"
fish_type = "baby space carp"
fish_type = /datum/fish/babycarp
/obj/item/fish_eggs/catfish
name = "catfish eggs"
desc = "A bottom-feeding species noted for their similarity to cats and Tajaran."
icon_state = "catfish_eggs"
fish_type = "catfish"
fish_type = /datum/fish/catfish
/obj/item/fish_eggs/feederfish
name = "feeder fish eggs"
desc = "These generic fish are commonly found being eaten by larger fish."
icon_state = "feederfish_eggs"
fish_type = "feederfish"
fish_type = /datum/fish/feederfish
/obj/item/fish_eggs/salmon
name = "salmon eggs"
desc = "A collection of salmon eggs."
icon_state = "salmon_eggs"
fish_type = "salmon"
fish_type = /datum/fish/salmon
/obj/item/fish_eggs/shrimp
name = "shrimp eggs"
desc = "Eggs for shrimp. You figured they'd be smaller though..."
icon_state = "shrimp_eggs"
fish_type = "shrimp"
fish_type = /datum/fish/shrimp
/obj/item/fish_eggs/electric_eel
name = "electric eel eggs"
desc = "A pile of eggs for a slimy, shocking, sea-serpent."
icon_state = "electric_eel_eggs"
fish_type = "electric eel"
fish_type = /datum/fish/electric_eel
/obj/item/fish_eggs/glofish
name = "glofish eggs"
desc = "A cluster of bright neon eggs belonging to a bio-luminescent species of fish."
icon_state = "glofish_eggs"
fish_type = "glofish"
fish_type = /datum/fish/glofish
-13
View File
@@ -1,17 +1,4 @@
var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfish,
"clownfish" = /obj/item/weapon/grown/bananapeel/clownfish,
"shark" = /obj/item/weapon/fish/shark,
"baby space carp" = /obj/item/weapon/fish/babycarp,
"catfish" = /obj/item/weapon/fish/catfish,
"feederfish" = /obj/item/weapon/reagent_containers/food/snacks/feederfish,
"salmon" = /obj/item/weapon/fish/salmon,
"shrimp" = /obj/item/weapon/reagent_containers/food/snacks/shrimp,
"electric eel" = /obj/item/weapon/fish/electric_eel,
"glofish" = /obj/item/weapon/fish/glofish
,
)
//////////////////////////////////////////////
// Aquarium Supplies //
//////////////////////////////////////////////
+76
View File
@@ -0,0 +1,76 @@
/datum/fish
var/fish_name = "generic fish"
var/egg_item = /obj/item/fish_eggs
var/fish_item = /obj/item/weapon/fish
var/crossbreeder = 1 //determines if the fish will attempt to breed with other types, set to 0 if you want the fish to only lay eggs with its own species
/datum/fish/proc/special_interact(obj/machinery/fishtank/my_tank)
return
/datum/fish/goldfish
fish_name = "goldfish"
egg_item = /obj/item/fish_eggs/goldfish
fish_item = /obj/item/weapon/fish/goldfish
/datum/fish/glofish
fish_name = "glofish"
egg_item = /obj/item/fish_eggs/glofish
fish_item = /obj/item/weapon/fish/glofish
/datum/fish/clownfish
fish_name = "clownfish"
egg_item = /obj/item/fish_eggs/clownfish
fish_item = /obj/item/weapon/grown/bananapeel/clownfish
/datum/fish/shark
fish_name = "shark"
egg_item = /obj/item/fish_eggs/shark
fish_item = /obj/item/weapon/fish/shark
/datum/fish/babycarp
fish_name = "baby space carp"
egg_item = /obj/item/fish_eggs/babycarp
fish_item = /obj/item/weapon/fish/babycarp
/datum/fish/catfish
fish_name = "catfish"
egg_item = /obj/item/fish_eggs/catfish
fish_item = /obj/item/weapon/fish/catfish
/datum/fish/catfish/special_interact(obj/machinery/fishtank/my_tank)
if(!my_tank || !istype(my_tank))
return
if(my_tank.filth_level > 0 && prob(33))
my_tank.adjust_filth_level(-0.1)
/datum/fish/salmon
fish_name = "salmon"
egg_item = /obj/item/fish_eggs/salmon
fish_item = /obj/item/weapon/fish/salmon
/datum/fish/shrimp
fish_name = "shrimp"
egg_item = /obj/item/fish_eggs/shrimp
fish_item = /obj/item/weapon/reagent_containers/food/snacks/shrimp
crossbreeder = 0
/datum/fish/feederfish
fish_name = "feeder fish"
egg_item = /obj/item/fish_eggs/feederfish
fish_item = /obj/item/weapon/reagent_containers/food/snacks/feederfish
/datum/fish/feederfish/special_interact(obj/machinery/fishtank/my_tank)
if(!my_tank || !istype(my_tank))
return
if(my_tank.fish_count < 2)
return
if(my_tank.food_level <= 5 && prob(25))
my_tank.adjust_food_level(1)
my_tank.kill_fish(src)
/datum/fish/electric_eel
fish_name = "electric eel"
egg_item = /obj/item/fish_eggs/electric_eel
fish_item = /obj/item/weapon/fish/electric_eel
crossbreeder = 0
+98 -95
View File
@@ -112,7 +112,7 @@
if(light_switch)
set_light(2,2,"#a0a080")
else
set_light(0)
adjust_tank_light()
//////////////////////////////
// NEW() PROCS //
@@ -176,6 +176,7 @@
/obj/machinery/fishtank/process()
//Start by counting fish in the tank
fish_count = 0
var/ate_food = 0
for(var/fish in fish_list)
if(fish)
fish_count++
@@ -184,43 +185,38 @@
if((fish_count * 50) > water_level)
if(prob(50)) //Not enough water for all the fish, chance to kill one
kill_fish() //Chance passed, kill a random fish
filth_level += 2 //Dead fish raise the filth level quite a bit, reflect this
adjust_filth_level(2) //Dead fish raise the filth level quite a bit, reflect this
//Check filth_level
check_filth_level()
if(filth_level == 10 && fish_count > 0) //This tank is nasty and possibly unsuitable for fish if any are in it
if(prob(30)) //Chance for a fish to die each cycle while the tank is this nasty
kill_fish() //Kill a random fish, don't raise filth level since we're at cap already
//Check breeding conditions
if(fish_count >=2 && egg_count < max_fish) //Need at least 2 fish to breed, but won't breed if there are as many eggs as max_fish
if(food_level > 2 && filth_level <=5) //Breeding is going to use extra food, and the filth_level shouldn't be too high
if(food_level >= 0.2 && filth_level <=5) //Breeding is going to use extra food, and the filth_level shouldn't be too high
if(prob(((fish_count - 2) * 5)+10)) //Chances increase with each additional fish, 10% base + 5% per additional fish
egg_count++ //A new set of eggs were laid, increase egg_count
egg_list.Add(select_egg_type()) //Add the new egg to the egg_list for storage
food_level -= 2 //Remove extra food for the breeding process
breed_fish()
adjust_food_level(-0.2) //Remove extra food for the breeding process
ate_food = 1
//Handle standard food and filth adjustments
check_food_level()
var/ate_food = 0
if(food_level > 0 && prob(50)) //Chance for the fish to eat some food
if(food_level >= (fish_count * 0.1)) //If there is at least enough food to go around, feed all the fish
food_level -= fish_count * 0.1
adjust_food_level(fish_count * -0.1)
else //Use up the last of the food
food_level = 0
adjust_food_level(-food_level)
ate_food = 1
check_food_level()
if(water_level > 0) //Don't dirty the tank if it has no water
if(fish_count == 0) //If the tank has no fish, algae growth can occur
if(filth_level < 7.5 && prob(15)) //Algae growth is a low chance and cannot exceed filth_level of 7.5
filth_level += 0.05 //Algae growth is slower than fish filth build-up
adjust_filth_level(0.05) //Algae growth is slower than fish filth build-up
else if(filth_level < 10 && prob(10)) //Chance for the tank to get dirtier if the filth_level isn't 10
if(ate_food && prob(25)) //If they ate this cycle, there is an additional chance they make a bigger mess
filth_level += fish_count * 0.1
adjust_filth_level(fish_count * 0.1)
else //If they didn't make the big mess, make a little one
filth_level += 0.1
check_filth_level()
adjust_filth_level(0.1)
//Handle special interactions
handle_special_interactions()
@@ -228,54 +224,42 @@
//Handle water leakage from damage
if(water_level > 0) //Can't leak water if there is no water in the tank
if(leaking == 2) //At or below 25% health, the tank will lose 10 water_level per cycle (major leak)
water_level -= 10
adjust_water_level(-10)
else if(leaking == 1) //At or below 50% health, the tank will lose 1 water_level per cycle (minor leak)
water_level -= 1
check_water_level()
adjust_water_level(-1)
update_icon()
//////////////////////////////
// SUPPORT PROCS //
//////////////////////////////
/obj/machinery/fishtank/proc/handle_special_interactions()
var/glo_light = 0
for(var/fish in fish_list)
switch(fish)
if("catfish") //Catfish have a small chance of cleaning some filth since they are a bottom-feeder
if((filth_level > 0) && prob(30))
filth_level -= 0.1
if("feederfish") //Feeder fish have a small chance of sacrificing themselves to produce some food
if(fish_count < 2) //Don't sacrifice the last fish, there's nothing to eat it
continue
if(food_level <= 5 && prob(25))
kill_fish("feederfish") //Kill the fish to reflect it's sacrifice, but don't increase the filth_level
food_level += 1 //The corpse became food for the other fish, ecology at it's finest
if("glofish")
glo_light++
if(!light_switch && (glo_light > 0))
set_light(2,glo_light,"#99FF66")
check_food_level()
check_filth_level()
check_water_level()
for(var/datum/fish/fish in fish_list)
fish.special_interact(src)
adjust_tank_light()
/obj/machinery/fishtank/proc/check_water_level()
if(water_level < 0) //Water_level cannot be negative, set it to 0 if it is
water_level = 0
if(water_level > water_capacity) //Water_level cannot exceed capacity, set it to capacity if it does
water_level = water_capacity
/obj/machinery/fishtank/proc/adjust_tank_light()
if(light_switch) //tank light overrides fish lights
return
else
var/glo_light = 0
for(var/datum/fish/fish in fish_list)
if(istype(fish, /datum/fish/glofish))
glo_light ++
if(glo_light)
set_light(2, glo_light, "#99FF66")
else
set_light(0, 0)
/obj/machinery/fishtank/proc/adjust_water_level(amount = 0)
water_level = min(water_capacity, max(0, water_level + amount))
update_icon()
/obj/machinery/fishtank/proc/check_filth_level()
if(filth_level < 0) //Filth_level cannot be negative, set it to 0 if it is
filth_level = 0
if(filth_level > 10) //Filth_level cannot exceed 10 (cap), set it to 10 if it does
filth_level = 10
/obj/machinery/fishtank/proc/adjust_filth_level(amount = 0)
filth_level = min(10, max(0, filth_level + amount))
/obj/machinery/fishtank/proc/check_food_level()
if(food_level < 0) //Food_level cannot be negative, set it to 0 if it is
food_level = 0
if(food_level > 10) //Food_level cannot exceed 10 (cap), set it to 10 if it does
food_level = 10
/obj/machinery/fishtank/proc/adjust_food_level(amount = 0)
food_level = min(10, max(0, food_level + amount))
/obj/machinery/fishtank/proc/check_health()
//Max value check
@@ -292,37 +276,28 @@
if(cur_health <= 0) //The tank is broken, destroy it
destroy()
/obj/machinery/fishtank/proc/kill_fish(var/type = null)
/obj/machinery/fishtank/proc/kill_fish(datum/fish/fish_type = null)
//Check if we were passed a fish to kill, otherwise kill a random one
if(type)
fish_list.Remove(type) //Kill a fish of the specified type
fish_count -- //Lower fish_count to reflect the death of a fish, so the everything else works fine
else
fish_list.Remove(pick(fish_list)) //Kill a random fish
fish_count -- //Lower fish_count to reflect the death of a fish, so the everything else works fine
if(!fish_type)
fish_type = pick(fish_list)
fish_list.Remove(fish_type) //Kill a fish of the specified type
fish_count -- //Lower fish_count to reflect the death of a fish, so the everything else works fine
if(istype(fish_type, /datum/fish/glofish))
adjust_tank_light()
qdel(fish_type)
/obj/machinery/fishtank/proc/add_fish(var/type = null)
/obj/machinery/fishtank/proc/add_fish(datum/fish/fish_type = null)
//Check if we were passed a fish type
if(type)
fish_list.Add("[type]") //Add a fish of the specified type
if(fish_type)
fish_type = new fish_type
fish_list.Add(fish_type) //Add a fish of the specified type
fish_count++ //Increase fish_count to reflect the introduction of a fish, so the everything else works fine
//Announce the new fish
src.visible_message("A new [type] has hatched in \the [src]!")
visible_message("A new [fish_type.fish_name] has hatched in \the [src]!")
//Null type fish are dud eggs, give a message to inform the player
else
to_chat(usr, "The eggs disolve in the water. They were duds!")
/obj/machinery/fishtank/proc/select_egg_type()
var/fish = pick(fish_list) //Select a fish from the fish in the tank
if(prob(25)) //25% chance to be a dud (blank) egg
fish = "dud"
var/obj/item/fish_eggs/egg_path = null //Create empty variable to receive the egg_path
egg_path = fish_eggs_list[fish] //Locate the corresponding path from fish_eggs_list that matches the fish
if(!egg_path) //The fish wasn't located in the fish_eggs_list, potentially due to a typo, so return a dud egg
return /obj/item/fish_eggs
else //The fish was located in the fish_eggs_list, so return the proper egg
return egg_path
/obj/machinery/fishtank/proc/harvest_eggs(var/mob/user)
if(!egg_count) //Can't harvest non-existant eggs
return
@@ -342,17 +317,17 @@
if(!fish_count) //Can't catch non-existant fish!
to_chat(usr, "There are no fish in \the [src] to catch!")
return
var/caught_fish
caught_fish = input("Select a fish to catch.", "Fishing", caught_fish) in fish_list //Select a fish from the tank
var/list/fish_names_list = list()
for(var/datum/fish/fish_type in fish_list)
fish_names_list += list("[fish_type.fish_name]" = fish_type)
var/caught_fish = input("Select a fish to catch.", "Fishing") as null|anything in fish_names_list //Select a fish from the tank
if(caught_fish)
var/dead_fish = null
dead_fish = fish_items_list[caught_fish] //Locate the appropriate fish_item for the caught fish
if(!dead_fish) //No fish_item found, possibly due to typo or not being listed. Do nothing.
return
kill_fish(caught_fish) //Kill the caught fish from the tank
user.visible_message("[user.name] harvests \a [caught_fish] from \the [src].", "You scoop \a [caught_fish] out of \the [src].")
new dead_fish(get_turf(user)) //Spawn the appropriate fish_item at the user's feet.
var/datum/fish/fish_type = fish_names_list[caught_fish]
var/fish_item = fish_type.fish_item
if(fish_item)
new fish_item(get_turf(user)) //Spawn the appropriate fish_item at the user's feet.
kill_fish(fish_type) //Kill the caught fish from the tank
/obj/machinery/fishtank/proc/destroy(var/deconstruct = 0)
var/turf/T = get_turf(src) //Store the tank's turf for atmos updating after deletion of tank
@@ -392,6 +367,34 @@
var/turf/simulated/S = T
S.MakeSlippery()
/obj/machinery/fishtank/proc/breed_fish()
var/list/breed_candidates = fish_list.Copy()
var/datum/fish/parent1 = pick_n_take(breed_candidates)
var/datum/fish/parent2 = null
if(!parent1.crossbreeder) //fish with crossbreed = 0 will only breed with their own species, and only leave duds if they can't breed
if(parent1 in breed_candidates)
egg_list.Add(parent1.egg_item)
else
egg_list.Add(/obj/item/fish_eggs)
else
parent2 = pick(breed_candidates)
if(!parent2.crossbreeder) //second fish refuses to crossbreed, spawn a dud
egg_list.Add(/obj/item/fish_eggs)
else if(parent1 == parent2) //both fish are the same type
if(prob(90)) //90% chance to get that type of egg
egg_list.Add(parent1.egg_item)
else //10% chance to get a dud
egg_list.Add(/obj/item/fish_eggs)
else //different types of fish
if(prob(30)) //30% chance to get dud
egg_list.Add(/obj/item/fish_eggs)
else
if(prob(50)) //chance to get egg for either parent type (50/50 for either parent, 35% overall each)
egg_list.Add(parent1.egg_item)
else
egg_list.Add(parent2.egg_item)
egg_count++
////////////////////////////// Note from FalseIncarnate:
// EXAMINE PROC // This proc is massive, messy, and probably could be handled better.
////////////////////////////// Feel free to try cleaning it up if you think of a better way to do it.
@@ -464,9 +467,11 @@
var/fish_num = fish_count
var/message = "You spot "
while(fish_num > 0)
var/datum/fish/fish_type = fish_list[fish_num]
var/fish_name = fish_type.fish_name
if(fish_count > 1 && fish_num == 1) //If there were at least 2 fish, and this is the last one, add "and" to the message
message += "and "
message += "a [fish_list[fish_num]]"
message += "\an [fish_name]"
fish_num --
if(fish_num > 0) //There's more fish, add a comma to the message
message +=", "
@@ -645,13 +650,13 @@
return
else
message = "The filtration process purifies the water, raising the water level."
water_level += water_value
if(water_level == water_capacity)
if((water_level + water_value) == water_capacity)
message += " You filled \the [src] to the brim!"
if(water_level > water_capacity)
if((water_level + water_value) > water_capacity)
message += " You overfilled \the [src] and some water runs down the side, wasted."
C.reagents.clear_reagents()
check_water_level()
adjust_water_level(water_value)
user.visible_message("[user.name] pours the contents of [C.name] into \the [src].", "[message]")
return
//Empty containers will scoop out water, filling the container as much as possible from the water_level
@@ -661,13 +666,12 @@
else
if(water_level >= C.volume) //Enough to fill the container completely
C.reagents.add_reagent("fishwater", C.volume)
water_level -= C.volume
adjust_water_level(-C.volume)
user.visible_message("[user.name] scoops out some water from \the [src].", "You completely fill [C.name] from \the [src].")
else //Fill the container as much as possible with the water_level
C.reagents.add_reagent("fishwater", water_level)
water_level = 0
adjust_water_level(-water_level)
user.visible_message("[user.name] scoops out some water from \the [src].", "You fill [C.name] with the last of the water in \the [src].")
check_water_level()
return
//Wrenches can deconstruct empty tanks, but not tanks with any water. Kills any fish left inside and destroys any unharvested eggs in the process
if(istype(O, /obj/item/weapon/wrench))
@@ -702,12 +706,11 @@
user.visible_message("[user.name] shakes some fish food into the empty [src]... How sad.", "You shake some fish food into the empty [src]... If only it had fish.")
else
user.visible_message("[user.name] feeds the fish in \the [src]. The fish look excited!", "You feed the fish in \the [src]. They look excited!")
food_level += 10
adjust_food_level(10)
else
to_chat(usr, "[src] already has plenty of food in it. You decide to not add more.")
else
to_chat(usr, "[src] doesn't have any water in it. You should fill it with water first.")
check_food_level()
return
//Fish egg scoop
else if(istype(O, /obj/item/weapon/egg_scoop))
@@ -726,7 +729,7 @@
if(filth_level == 0)
to_chat(usr, "[src] is already spotless!")
else
filth_level = 0
adjust_filth_level(-filth_level)
user.visible_message("[user.name] scrubs the inside of \the [src], cleaning the filth.", "You scrub the inside of \the [src], cleaning the filth.")
else if(O && O.force)
user.visible_message("<span class='danger'>\The [src] has been attacked by [user.name] with \the [O]!</span>")
+43 -9
View File
@@ -220,7 +220,7 @@
rarity = 20
genes = list(/datum/plant_gene/trait/glow, /datum/plant_gene/trait/plant_type/fungal_metabolism)
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
mutatelist = list(/obj/item/seeds/glowshroom/glowcap)
mutatelist = list(/obj/item/seeds/glowshroom/glowcap, /obj/item/seeds/glowshroom/shadowshroom)
reagents_add = list("radium" = 0.1, "phosphorus" = 0.1, "nutriment" = 0.04)
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom
@@ -235,14 +235,25 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/attack_self(mob/user)
if(istype(user.loc, /turf/space))
return
var/obj/effect/glowshroom/planted = new effect_path(user.loc)
planted.delay = planted.delay - seed.production * 100 //So the delay goes DOWN with better stats instead of up. :I
planted.endurance = seed.endurance
planted.yield = seed.yield
planted.potency = seed.potency
return FALSE
if(!isturf(user.loc))
to_chat(user, "<span class='warning'>You need more space to plant [src].</span>")
return FALSE
var/count = 0
var/maxcount = 1
for(var/tempdir in cardinal)
var/turf/simulated/wall = get_step(user.loc, tempdir)
if(istype(wall))
maxcount++
for(var/obj/effect/glowshroom/G in user.loc)
count++
if(count >= maxcount)
to_chat(user, "<span class='warning'>There are too many shrooms here to plant [src].</span>")
return FALSE
new effect_path(user.loc, seed)
to_chat(user, "<span class='notice'>You plant [src].</span>")
qdel(src)
return TRUE
// Glowcap
@@ -255,7 +266,7 @@
icon_dead = "glowshroom-dead"
plantname = "Glowcaps"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/glowcap
genes = list(/datum/plant_gene/trait/glow, /datum/plant_gene/trait/cell_charge, /datum/plant_gene/trait/plant_type/fungal_metabolism)
genes = list(/datum/plant_gene/trait/glow/red, /datum/plant_gene/trait/cell_charge, /datum/plant_gene/trait/plant_type/fungal_metabolism)
mutatelist = list()
reagents_add = list("teslium" = 0.1, "nutriment" = 0.04)
rarity = 30
@@ -263,7 +274,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/glowcap
seed = /obj/item/seeds/glowshroom/glowcap
name = "glowcap cluster"
desc = "<I>Mycena Ruthenia</I>: This species of mushroom glows in the dark, but aren't bioluminescent. They're warm to the touch..."
desc = "<I>Mycena Ruthenia</I>: This species of mushroom glows in the dark, but isn't actually bioluminescent. They're warm to the touch..."
icon_state = "glowcap"
filling_color = "#00FA9A"
effect_path = /obj/effect/glowshroom/glowcap
@@ -292,3 +303,26 @@
desc = "A fungus ideal for making antibacterials."
icon_state = "angel"
color = "#4f4331"
//Shadowshroom
/obj/item/seeds/glowshroom/shadowshroom
name = "pack of shadowshroom mycelium"
desc = "This mycelium will grow into something shadowy."
icon_state = "mycelium-shadowshroom"
species = "shadowshroom"
icon_grow = "shadowshroom-grow"
icon_dead = "shadowshroom-dead"
plantname = "Shadowshrooms"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom
genes = list(/datum/plant_gene/trait/glow/shadow, /datum/plant_gene/trait/plant_type/fungal_metabolism)
mutatelist = list()
reagents_add = list("radium" = 0.2, "nutriment" = 0.04)
rarity = 30
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/glowshroom/shadowshroom
seed = /obj/item/seeds/glowshroom/shadowshroom
name = "shadowshroom cluster"
desc = "<I>Mycena Umbra</I>: This species of mushroom emits shadow instead of light."
icon_state = "shadowshroom"
effect_path = /obj/effect/glowshroom/shadowshroom
origin_tech = "biotech=4;plasmatech=4;magnets=4"
+1 -1
View File
@@ -300,7 +300,7 @@
if(!self_sustaining)
if(myseed && myseed.get_gene(/datum/plant_gene/trait/glow))
var/datum/plant_gene/trait/glow/G = myseed.get_gene(/datum/plant_gene/trait/glow)
set_light(G.get_lum(myseed))
set_light(G.glow_range(myseed), G.glow_power(myseed), G.glow_color)
else
set_light(0)
+24 -7
View File
@@ -263,23 +263,40 @@
/datum/plant_gene/trait/glow
// Makes plant glow. Makes plant in tray glow too.
// Adds potency*rate luminosity to products.
// Adds 1 + potency*rate light range and potency*(rate + 0.01) light_power to products.
name = "Bioluminescence"
rate = 0.1
rate = 0.03
examine_line = "<span class='info'>It emits a soft glow.</span>"
trait_id = "glow"
var/glow_color = "#AAD84B"
/datum/plant_gene/trait/glow/proc/get_lum(obj/item/seeds/S)
return round(S.potency*rate)
/datum/plant_gene/trait/glow/proc/glow_range(obj/item/seeds/S)
return 1.4 + S.potency*rate
/datum/plant_gene/trait/glow/proc/glow_power(obj/item/seeds/S)
return max(S.potency*(rate + 0.01), 0.1)
/datum/plant_gene/trait/glow/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc)
..()
G.set_light(get_lum(G.seed))
G.set_light(glow_range(G.seed), glow_power(G.seed), glow_color)
/datum/plant_gene/trait/glow/shadow
//makes plant emit slightly purple shadows
//adds -potency*(rate*0.05) light power to products
name = "Shadow Emission"
rate = 0.04
/datum/plant_gene/trait/glow/shadow/glow_power(obj/item/seeds/S)
return -max(S.potency*(rate*0.05), 0.075)
/datum/plant_gene/trait/glow/red
name = "Red Electrical Glow"
glow_color = LIGHT_COLOR_RED
/datum/plant_gene/trait/glow/berry
name = "Strong Bioluminescence"
rate = 0.2
rate = 0.05
glow_color = null
/datum/plant_gene/trait/teleport
// Makes plant teleport people when squashed or slipped on.
+10
View File
@@ -112,6 +112,8 @@
return
if(panel_open)
if(istype(W, /obj/item/weapon/crowbar))
if(inserted_id)
inserted_id.forceMove(loc) //Prevents deconstructing the ORM from deleting whatever ID was inside it.
empty_content()
default_deconstruction_crowbar(W)
if(ismultitool(W))
@@ -304,6 +306,9 @@
/obj/machinery/mineral/ore_redemption/power_change()
..()
update_icon()
if(inserted_id && !powered())
visible_message("<span class='notice'>The ID slot indicator light flickers on \the [src] as it spits out a card before powering down.</span>")
inserted_id.forceMove(loc)
/obj/machinery/mineral/ore_redemption/update_icon()
if(powered())
@@ -387,6 +392,9 @@
/obj/machinery/mineral/equipment_vendor/power_change()
..()
update_icon()
if(inserted_id && !powered())
visible_message("<span class='notice'>The ID slot indicator light flickers on \the [src] as it spits out a card before powering down.</span>")
inserted_id.forceMove(loc)
/obj/machinery/mineral/equipment_vendor/update_icon()
if(powered())
@@ -456,6 +464,8 @@
return
if(panel_open)
if(istype(I, /obj/item/weapon/crowbar))
if(inserted_id)
inserted_id.forceMove(loc) //Prevents deconstructing the ORM from deleting whatever ID was inside it.
default_deconstruction_crowbar(I)
return 1
if(istype(I, /obj/item/weapon/mining_voucher))
@@ -52,7 +52,7 @@
UpdateAppearance()
/mob/living/carbon/human/OpenCraftingMenu()
handcrafting.craft(src)
handcrafting.ui_interact(src)
/mob/living/carbon/human/prepare_data_huds()
//Update med hud images...
@@ -0,0 +1,25 @@
/**
* This state only checks if the user isn't incapacitated
**/
/var/global/datum/topic_state/not_incapacitated_state/not_incapacitated_state = new()
/**
* This state checks if the user isn't incapacitated and that their loc is a turf
**/
/var/global/datum/topic_state/not_incapacitated_state/not_incapacitated_turf_state = new(no_turfs = TRUE)
/datum/topic_state/not_incapacitated_state
var/turf_check = FALSE
/datum/topic_state/not_incapacitated_state/New(loc, no_turfs = FALSE)
..()
turf_check = no_turfs
/datum/topic_state/not_incapacitated_state/can_use_topic(src_object, mob/user)
if(user.stat)
return STATUS_CLOSE
if(user.incapacitated() || user.lying || (turf_check && !isturf(user.loc)))
return STATUS_DISABLED
return STATUS_INTERACTIVE
+2 -8
View File
@@ -139,7 +139,7 @@
var/on_gs = 0
var/static_power_used = 0
var/brightness_range = 8 // luminosity when on, also used in power calculation
var/brightness_power = 3
var/brightness_power = 1
var/brightness_color = null
var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN
var/flickering = 0
@@ -157,7 +157,6 @@
base_state = "bulb"
fitting = "bulb"
brightness_range = 4
brightness_power = 2
brightness_color = "#a0a080"
desc = "A small lighting fixture."
light_type = /obj/item/weapon/light/bulb
@@ -190,12 +189,10 @@
switch(fitting)
if("tube")
brightness_range = 8
brightness_power = 3
if(prob(2))
broken(1)
if("bulb")
brightness_range = 4
brightness_power = 2
brightness_color = "#a0a080"
if(prob(5))
broken(1)
@@ -608,13 +605,12 @@
item_state = "c_tube"
materials = list(MAT_GLASS=100)
brightness_range = 8
brightness_power = 3
/obj/item/weapon/light/tube/large
w_class = 2
name = "large light tube"
brightness_range = 15
brightness_power = 4
brightness_power = 2
/obj/item/weapon/light/bulb
name = "light bulb"
@@ -624,7 +620,6 @@
item_state = "contvapour"
materials = list(MAT_GLASS=100)
brightness_range = 5
brightness_power = 2
brightness_color = "#a0a080"
/obj/item/weapon/light/throw_impact(atom/hit_atom)
@@ -639,7 +634,6 @@
item_state = "egg4"
materials = list(MAT_GLASS=100)
brightness_range = 5
brightness_power = 2
// update the icon state and description of the light
@@ -68,11 +68,8 @@
if(stat & NOPOWER)
icon_state = "[reference]w"
return
else if(use_power)
if(assembled)
icon_state = "[reference]p"
else
icon_state = "u[reference]p"
else if(use_power && assembled)
icon_state = "[reference]p"
else
switch(construction_state)
if(0)
@@ -652,7 +652,6 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/necrosis_prob = 40 * min((20 MINUTES), max((time_dead - (1 MINUTES)), 0)) / ((20 MINUTES) - (1 MINUTES))
to_chat(world, "Necrosis prob: [necrosis_prob]")
for(var/obj/item/organ/O in (H.organs | H.internal_organs))
// Per non-vital body part:
// 0% chance of necrosis within 1 minute of death
+9 -4
View File
@@ -256,9 +256,9 @@
/obj/machinery/conveyor_switch/attack_hand(mob/user)
if(..())
return 1
toggle(user)
/obj/machinery/conveyor_switch/attack_ghost(mob/user)
if(user.can_advanced_admin_interact())
toggle(user)
@@ -292,7 +292,7 @@
S.position = position
S.update()
CHECK_TICK
/obj/machinery/conveyor_switch/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/crowbar))
var/obj/item/conveyor_switch_construct/C = new/obj/item/conveyor_switch_construct(src.loc)
@@ -309,7 +309,12 @@
/obj/machinery/conveyor_switch/multitool_topic(var/mob/user,var/list/href_list,var/obj/O)
..()
if("toggle_logic" in href_list)
convdir = !convdir //reverses?
if(convdir)
convdir = 0
else if(last_pos)
convdir = last_pos
else
convdir = position
/obj/machinery/conveyor_switch/multitool_menu(var/mob/user, var/obj/item/device/multitool/P)
File diff suppressed because it is too large Load Diff
@@ -165,7 +165,7 @@
req_tech = list("biotech" = 2, "materials" = 2, "magnets" = 2)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 1500)
build_path = /obj/item/weapon/scalpel/laser1
build_path = /obj/item/weapon/scalpel/laser/laser1
category = list("Medical")
/datum/design/item/scalpel_laser2
@@ -175,7 +175,7 @@
req_tech = list("biotech" = 3, "materials" = 4, "magnets" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000)
build_path = /obj/item/weapon/scalpel/laser2
build_path = /obj/item/weapon/scalpel/laser/laser2
category = list("Medical")
/datum/design/item/scalpel_laser3
@@ -185,7 +185,7 @@
req_tech = list("biotech" = 4, "materials" = 6, "magnets" = 5)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_GOLD = 1000)
build_path = /obj/item/weapon/scalpel/laser3
build_path = /obj/item/weapon/scalpel/laser/laser3
category = list("Medical")
/datum/design/item/scalpel_manager
@@ -195,7 +195,7 @@
req_tech = list("biotech" = 4, "materials" = 7, "magnets" = 5, "programming" = 4)
build_type = PROTOLATHE
materials = list (MAT_METAL = 2000, MAT_GLASS = 1500, MAT_SILVER = 1000, MAT_GOLD = 1000, MAT_DIAMOND = 1000)
build_path = /obj/item/weapon/scalpel/manager
build_path = /obj/item/weapon/scalpel/laser/manager
category = list("Medical")
/datum/design/alienscalpel
@@ -11,7 +11,7 @@
materials = list(MAT_METAL = 700, MAT_GLASS = 50)
construction_time=100
build_path = /obj/item/weapon/stock_parts/cell
category = list("Misc","Power")
category = list("Misc","Power","Machinery","initial")
/datum/design/high_cell
name = "High-Capacity Power Cell"
@@ -10,7 +10,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 50)
build_path = /obj/item/weapon/stock_parts/capacitor
category = list("Stock Parts")
category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 5
/datum/design/basic_sensor
@@ -21,7 +21,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 50, MAT_GLASS = 20)
build_path = /obj/item/weapon/stock_parts/scanning_module
category = list("Stock Parts")
category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 5
/datum/design/micro_mani
@@ -32,7 +32,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 30)
build_path = /obj/item/weapon/stock_parts/manipulator
category = list("Stock Parts")
category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 5
/datum/design/basic_micro_laser
@@ -43,7 +43,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 10, MAT_GLASS = 20)
build_path = /obj/item/weapon/stock_parts/micro_laser
category = list("Stock Parts")
category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 5
/datum/design/basic_matter_bin
@@ -54,7 +54,7 @@
build_type = PROTOLATHE | AUTOLATHE
materials = list(MAT_METAL = 80)
build_path = /obj/item/weapon/stock_parts/matter_bin
category = list("Stock Parts")
category = list("Stock Parts","Machinery","initial")
lathe_time_factor = 5
/datum/design/adv_capacitor
+2 -2
View File
@@ -70,7 +70,7 @@
/datum/surgery_step/open_encased/retract
name = "retract bone"
allowed_tools = list(
/obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel/laser/manager = 100, \
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 75
)
@@ -121,7 +121,7 @@
/datum/surgery_step/open_encased/close
name = "unretract bone" //i suck at names okay? give me a new one
allowed_tools = list(
/obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel/laser/manager = 100, \
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 75
)
+3 -9
View File
@@ -28,10 +28,6 @@
/datum/surgery_step/generic/cut_face
name = "make incision"
allowed_tools = list(
/obj/item/weapon/scalpel/laser3 = 115, \
/obj/item/weapon/scalpel/laser2 = 110, \
/obj/item/weapon/scalpel/laser1 = 105, \
/obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchen/knife = 75, \
/obj/item/weapon/shard = 50, \
@@ -62,7 +58,7 @@
/datum/surgery_step/face/mend_vocal
name = "mend vocal cords"
allowed_tools = list(
/obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel/laser/manager = 100, \
/obj/item/weapon/hemostat = 100, \
/obj/item/stack/cable_coil = 75, \
/obj/item/device/assembly/mousetrap = 10 //I don't know. Don't ask me. But I'm leaving it because hilarity.
@@ -89,7 +85,7 @@
/datum/surgery_step/face/fix_face
name = "reshape face"
allowed_tools = list(
/obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel/laser/manager = 100, \
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 55, \
/obj/item/weapon/kitchen/utensil/fork = 75)
@@ -116,9 +112,7 @@
/datum/surgery_step/face/cauterize
name = "close incision"
allowed_tools = list(
/obj/item/weapon/scalpel/laser3 = 115, \
/obj/item/weapon/scalpel/laser2 = 110, \
/obj/item/weapon/scalpel/laser1 = 105, \
/obj/item/weapon/scalpel/laser = 100, \
/obj/item/weapon/cautery = 100, \
/obj/item/clothing/mask/cigarette = 75, \
/obj/item/weapon/lighter = 50, \
+3 -12
View File
@@ -23,10 +23,6 @@
name = "make incision"
allowed_tools = list(
/obj/item/weapon/scalpel/laser3 = 115, \
/obj/item/weapon/scalpel/laser2 = 110, \
/obj/item/weapon/scalpel/laser1 = 105, \
/obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchen/knife = 75, \
/obj/item/weapon/shard = 50, \
@@ -65,10 +61,7 @@
name = "clamp bleeders"
allowed_tools = list(
/obj/item/weapon/scalpel/laser3 = 115, \
/obj/item/weapon/scalpel/laser2 = 110, \
/obj/item/weapon/scalpel/laser1 = 105, \
/obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel/laser = 100, \
/obj/item/weapon/hemostat = 100, \
/obj/item/stack/cable_coil = 75, \
/obj/item/device/assembly/mousetrap = 20
@@ -103,7 +96,7 @@
name = "retract skin"
allowed_tools = list(
/obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel/laser/manager = 100, \
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 75, \
/obj/item/weapon/kitchen/utensil/fork = 50
@@ -158,9 +151,7 @@
name = "cauterize incision"
allowed_tools = list(
/obj/item/weapon/scalpel/laser3 = 115, \
/obj/item/weapon/scalpel/laser2 = 110, \
/obj/item/weapon/scalpel/laser1 = 105, \
/obj/item/weapon/scalpel/laser = 100, \
/obj/item/weapon/cautery = 100, \
/obj/item/clothing/mask/cigarette = 75, \
/obj/item/weapon/lighter = 50, \
+2 -5
View File
@@ -97,10 +97,7 @@
/datum/surgery_step/cavity/close_space
name = "close cavity space"
allowed_tools = list(
/obj/item/weapon/scalpel/laser3 = 115, \
/obj/item/weapon/scalpel/laser2 = 110, \
/obj/item/weapon/scalpel/laser1 = 105, \
/obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel/laser = 100, \
/obj/item/weapon/cautery = 100, \
/obj/item/clothing/mask/cigarette = 75, \
/obj/item/weapon/lighter = 50, \
@@ -354,7 +351,7 @@
name = "remove embedded objects"
time = 32
allowed_tools = list(
/obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel/laser/manager = 100, \
/obj/item/weapon/hemostat = 100, \
/obj/item/stack/cable_coil = 75, \
/obj/item/device/assembly/mousetrap = 20
+2 -6
View File
@@ -69,7 +69,7 @@
var/implements_extract = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/kitchen/utensil/fork = 55)
var/implements_mend = list(/obj/item/stack/medical/bruise_pack = 20,/obj/item/stack/medical/bruise_pack/advanced = 100,/obj/item/stack/nanopaste = 100)
//Finish is just so you can close up after you do other things.
var/implements_finsh = list(/obj/item/weapon/scalpel/manager = 120,/obj/item/weapon/retractor = 100 ,/obj/item/weapon/crowbar = 75)
var/implements_finsh = list(/obj/item/weapon/scalpel/laser/manager = 100,/obj/item/weapon/retractor = 100 ,/obj/item/weapon/crowbar = 75)
var/current_type
var/obj/item/organ/internal/I = null
var/obj/item/organ/external/affected = null
@@ -368,10 +368,6 @@
/datum/surgery_step/cut_carapace
name = "cut carapace"
allowed_tools = list(
/obj/item/weapon/scalpel/laser3 = 115, \
/obj/item/weapon/scalpel/laser2 = 110, \
/obj/item/weapon/scalpel/laser1 = 105, \
/obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel = 100, \
/obj/item/weapon/kitchen/knife = 75, \
/obj/item/weapon/shard = 50, \
@@ -406,7 +402,7 @@
name = "retract carapace"
allowed_tools = list(
/obj/item/weapon/scalpel/manager = 120, \
/obj/item/weapon/scalpel/laser/manager = 100, \
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 75, \
/obj/item/weapon/kitchen/utensil/fork = 50
+12 -16
View File
@@ -59,6 +59,7 @@
desc = "Cut, cut, and once more cut."
icon = 'icons/obj/surgery.dmi'
icon_state = "scalpel"
item_state = "scalpel"
flags = CONDUCT
force = 10.0
sharp = 1
@@ -82,40 +83,35 @@
/*
* Researchable Scalpels
*/
/obj/item/weapon/scalpel/laser1 //lasers also count as catuarys
/obj/item/weapon/scalpel/laser //parent type
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser."
icon_state = "scalpel_laser1_on"
damtype = "fire"
hitsound = 'sound/weapons/sear.ogg'
/obj/item/weapon/scalpel/laser/laser1 //lasers also count as catuarys
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser. This one looks basic and could be improved."
icon_state = "scalpel_laser1_on"
item_state = "scalpel"
damtype = "fire"
hitsound = 'sound/weapons/sear.ogg'
toolspeed = 0.8
/obj/item/weapon/scalpel/laser2
/obj/item/weapon/scalpel/laser/laser2
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser. This one looks somewhat advanced."
icon_state = "scalpel_laser2_on"
item_state = "scalpel"
damtype = "fire"
hitsound = 'sound/weapons/sear.ogg'
toolspeed = 0.6
/obj/item/weapon/scalpel/laser3
/obj/item/weapon/scalpel/laser/laser3
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser. This one looks to be the pinnacle of precision energy cutlery!"
icon_state = "scalpel_laser3_on"
item_state = "scalpel"
damtype = "fire"
hitsound = 'sound/weapons/sear.ogg'
toolspeed = 0.4
/obj/item/weapon/scalpel/manager //super tool! Retractor/hemostat
/obj/item/weapon/scalpel/laser/manager //super tool! Retractor/hemostat
name = "incision management system"
desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision allowing for the immediate commencement of therapeutic steps."
icon_state = "scalpel_manager_on"
item_state = "scalpel"
damtype = "fire"
hitsound = 'sound/weapons/sear.ogg'
toolspeed = 0.2
/obj/item/weapon/circular_saw
+59
View File
@@ -55,6 +55,65 @@
-->
<div class="commit sansserif">
<h2 class="date">23 March 2017</h2>
<h3 class="author">FalseIncarnate updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Fish breeding has been tweaked to support fish refusing to cross-breed and improved egg chances with same-species parents.</li>
</ul>
<h3 class="author">Fox McCloud updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Floors are now fully properly cleaned with mops and soap</li>
<li class="rscadd">Adds in emergency welding tool, fork, trays, drinking glasses, shot glasses, shakers, butcher cleavers, and riot darts to the autolathe</li>
<li class="rscadd">Adds all basic stock parts to the autolathe</li>
<li class="tweak">re-arranges the autolathe menu to be more logical</li>
<li class="tweak">light bulbs no longer require metal to produce</li>
<li class="tweak">Incision management system can now cauterize</li>
</ul>
<h3 class="author">KasparoVy updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Unathi Security, Medical, Engineering and Syndicate side-facing hardsuit sprites have undergone weight reduction.</li>
</ul>
<h3 class="author">Kyep updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Chaplain's armor is no longer riot-grade. In addition, their nullrods do less damage.</li>
</ul>
<h3 class="author">MarsM0nd updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Conveyor switches can now set to left-only direction toggling.</li>
</ul>
<h3 class="author">Norgad updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Maintenance areas near arrivals, science, and the bar have been revamped.</li>
</ul>
<h3 class="author">uraniummeltdown updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Station lighting has less lighting power, this is not noticeable apart from maint and 1 bulb rooms being a bit darker.</li>
<li class="tweak">Tweaked the potency scaling for glowshroom/glowberry light; high-potency plants no longer light up a huge area, but are slightly brighter.</li>
<li class="rscadd">Added Shadowshrooms as a glowshroom mutation. They do exactly what you'd expect.</li>
</ul>
<h2 class="date">22 March 2017</h2>
<h3 class="author">Crazylemon64 updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Rod form is now at half speed, and has a warning sound.</li>
</ul>
<h3 class="author">FlattestGuitar updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">When a person's limb is dying, it will no longer notify the whole server of the ordeal</li>
<li class="bugfix">Welding tools no longer tell you about their span classes</li>
</ul>
<h3 class="author">KasparoVy updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Deconstructing beds now yields the same amount of metal as was used to make the bed.</li>
<li class="bugfix">The PA console will no longer appear as though it is fully constructed at the start of the round.</li>
<li class="bugfix">Ore Redemption Machines no longer eat IDs when deconstructed.</li>
<li class="tweak">Ore Redemption Machines and Mining Equipment Vendors now spit out whatever IDs were in them when they lose power.</li>
</ul>
<h3 class="author">Krausus updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Personal crafting is now usable again for those with an Internet Explorer version below 11.</li>
</ul>
<h2 class="date">21 March 2017</h2>
<h3 class="author">Crazylemon64 updated:</h3>
<ul class="changes bgimages16">
+47
View File
@@ -4201,3 +4201,50 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: Baseball bats added to the game, are craftable from 5 wood planks.
- rscadd: Baseball burgers can be made with a baseball bat and a bun, either microwaved
or table-crafted.
2017-03-22:
Crazylemon64:
- tweak: Rod form is now at half speed, and has a warning sound.
FlattestGuitar:
- bugfix: When a person's limb is dying, it will no longer notify the whole server
of the ordeal
- bugfix: Welding tools no longer tell you about their span classes
KasparoVy:
- bugfix: Deconstructing beds now yields the same amount of metal as was used to
make the bed.
- bugfix: The PA console will no longer appear as though it is fully constructed
at the start of the round.
- bugfix: Ore Redemption Machines no longer eat IDs when deconstructed.
- tweak: Ore Redemption Machines and Mining Equipment Vendors now spit out whatever
IDs were in them when they lose power.
Krausus:
- bugfix: Personal crafting is now usable again for those with an Internet Explorer
version below 11.
2017-03-23:
FalseIncarnate:
- tweak: Fish breeding has been tweaked to support fish refusing to cross-breed
and improved egg chances with same-species parents.
Fox McCloud:
- bugfix: Floors are now fully properly cleaned with mops and soap
- rscadd: Adds in emergency welding tool, fork, trays, drinking glasses, shot glasses,
shakers, butcher cleavers, and riot darts to the autolathe
- rscadd: Adds all basic stock parts to the autolathe
- tweak: re-arranges the autolathe menu to be more logical
- tweak: light bulbs no longer require metal to produce
- tweak: Incision management system can now cauterize
KasparoVy:
- tweak: Unathi Security, Medical, Engineering and Syndicate side-facing hardsuit
sprites have undergone weight reduction.
Kyep:
- tweak: Chaplain's armor is no longer riot-grade. In addition, their nullrods do
less damage.
MarsM0nd:
- bugfix: Conveyor switches can now set to left-only direction toggling.
Norgad:
- tweak: Maintenance areas near arrivals, science, and the bar have been revamped.
uraniummeltdown:
- tweak: Station lighting has less lighting power, this is not noticeable apart
from maint and 1 bulb rooms being a bit darker.
- tweak: Tweaked the potency scaling for glowshroom/glowberry light; high-potency
plants no longer light up a huge area, but are slightly brighter.
- rscadd: Added Shadowshrooms as a glowshroom mutation. They do exactly what you'd
expect.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 KiB

After

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 77 KiB

File diff suppressed because one or more lines are too long
+29
View File
@@ -0,0 +1,29 @@
div.display {
padding: 4px;
margin: 6px 0;
background-color: rgba(0, 0, 0, 0.33);
box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.5);
}
div.display header {
display: block;
position: relative;
width: 98.5%;
padding: 0 4px;
margin-bottom: 6px;
color: #FFFFFF;
border-bottom: 2px solid #40628a;
}
div.display header .buttonRight {
position: absolute;
bottom: 6px;
right: 4px;
}
div.display article {
display: table;
width: 100%;
border-collapse: collapse;
}
+64
View File
@@ -0,0 +1,64 @@
*[data-tooltip] {
position: relative;
&::after {
position: absolute;
display: block;
z-index: 2;
width: 250px;
padding: 10px;
transform: translateX(-50%);
visibility: hidden;
opacity: 0;
white-space: normal;
text-align: left;
content: attr(data-tooltip);
transition: all .5s;
border: 1px solid #999999;
background-color: #363636;
}
&:hover::after {
visibility: visible;
opacity: 1;
}
&.tooltipTop::after {
bottom: 100%;
left: 50%;
transform: translateX(-50%) translateY(8px);
}
&.tooltipTop:hover::after {
transform: translateX(-50%) translateY(-8px);
}
&.tooltipBottom::after {
top: 100%;
left: 50%;
transform: translateX(-50%) translateY(-8px);
}
&.tooltipBottom:hover::after {
transform: translateX(-50%) translateY(8px);
}
&.tooltipLeft::after {
top: 50%;
right: 100%;
transform: translateX(8px) translateY(-50%);
}
&.tooltipLeft:hover::after {
transform: translateX(-8px) translateY(-50%);
}
&.tooltipRight::after {
top: 50%;
left: 100%;
transform: translateX(-8px) translateY(-50%);
}
&.tooltipRight:hover::after {
transform: translateX(8px) translateY(-50%);
}
}
+2
View File
@@ -4,11 +4,13 @@
@import "_link";
@import "_color";
@import "_config";
@import "_display";
@import "_formatting";
@import "_icon";
@import "_lists";
@import "_misc";
@import "_native";
@import "_tooltip";
body {
+110
View File
@@ -0,0 +1,110 @@
<script>
{{var tooltiptext = function(req_text, catalyst_text, tool_text) { var text = ""; if(req_text){text += "REQUIREMENTS: " + req_text + " ";} if(catalyst_text){text += "CATALYSTS: " + catalyst_text + " ";} if(tool_text){text += "TOOLS: " + tool_text;}return text;};}}
</script>
<div class='display'>
<header><h3>{{:data.category}}</h3></header>
<article>
<div class='item'>
{{:helper.link(data.prev_cat, 'arrow-left', {'backwardCat': 1})}}
{{:helper.link(data.next_cat, 'arrow-right', {'forwardCat': 1})}}
{{if data.display_craftable_only}}
{{:helper.link('Showing Craftable Recipes', 'lock', {'toggle_recipes': 1})}}
{{else}}
{{:helper.link('Showing All Recipes', 'unlock', {'toggle_recipes': 1})}}
{{/if}}
{{:helper.link('Compact', data.display_compact ? 'check-square-o' : 'square-o', {'toggle_compact': 1})}}
</div>
{{if data.display_compact}}
<div class='display'>
<article>
<table style='width: 50%;'>
{{for data.can_craft}}
<tr>
<td><div class='itemLabelWidest'>{{:value.name}}:</div></td>
<td><div class='floatLeft tooltipRight' data-tooltip='{{:tooltiptext(value.req_text, value.catalyst_text, value.tool_text)}}'>
{{:helper.link('Craft', 'gears', {'make': value.ref})}}
</div></td>
</tr>
{{/for}}
{{if !data.display_craftable_only}}
{{for data.cant_craft}}
<tr>
<td><div class='itemLabelWidest'>{{:value.name}}:</div></td>
<td><div class='floatLeft tooltipRight' data-tooltip='{{:tooltiptext(value.req_text, value.catalyst_text, value.tool_text)}}'>
{{:helper.link('Craft', 'gears', {'make': value.ref}, 'disabled')}}
</div></td>
</tr>
{{/for}}
{{/if}}
</table>
</article>
</div>
{{else}}
{{for data.can_craft}}
<div class='display'>
<header><h3>{{:value.name}}</h3></header>
<article>
{{if value.req_text}}
<div class='item'>
<div class='itemLabel'>Requirements:</div>
<div class='itemContent'>{{:value.req_text}}</div>
</div>
{{/if}}
{{if value.catalyst_text}}
<div class='item'>
<div class='itemLabel'>Catalysts:</div>
<div class='itemContent'>{{:value.catalyst_text}}</div>
</div>
{{/if}}
{{if value.tool_text}}
<div class='item'>
<div class='itemLabel'>Tools:</div>
<div class='itemContent'>{{:value.tool_text}}</div>
</div>
{{/if}}
<div class='item'>
{{:helper.link('Craft', 'gears', {'make': value.ref})}}
</div>
</article>
</div>
{{/for}}
{{if !data.display_craftable_only}}
{{for data.cant_craft}}
<div class="display">
<header><h3>{{:value.name}}</h3></header>
<article>
{{if value.req_text}}
<div class='item'>
<div class='itemLabel'>Requirements:</div>
<div class='itemContent'>{{:value.req_text}}</div>
</div>
{{/if}}
{{if value.catalyst_text}}
<div class='item'>
<div class='itemLabel'>Catalysts:</div>
<div class='itemContent'>{{:value.catalyst_text}}</div>
</div>
{{/if}}
{{if value.tool_text}}
<div class='item'>
<div class='itemLabel'>Tools:</div>
<div class='itemContent'>{{:value.tool_text}}</div>
</div>
{{/if}}
</article>
</div>
{{/for}}
{{/if}}
{{/if}}
</article>
</div>
{{if data.busy}}
<div class="mask">
<div class="maskContent">
<h1>Crafting...</h1>
</div>
</div>
{{/if}}
+2
View File
@@ -1326,6 +1326,7 @@
#include "code\modules\ext_scripts\python.dm"
#include "code\modules\fish\fish_eggs.dm"
#include "code\modules\fish\fish_items.dm"
#include "code\modules\fish\fish_types.dm"
#include "code\modules\fish\fishtank.dm"
#include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm"
@@ -1815,6 +1816,7 @@
#include "code\modules\nano\interaction\default.dm"
#include "code\modules\nano\interaction\inventory.dm"
#include "code\modules\nano\interaction\inventory_deep.dm"
#include "code\modules\nano\interaction\not_incapacitated.dm"
#include "code\modules\nano\interaction\physical.dm"
#include "code\modules\nano\interaction\self.dm"
#include "code\modules\nano\interaction\zlevel.dm"