Merge pull request #2181 from Cameron653/master

Hotfix
This commit is contained in:
Cameron653
2017-09-21 20:39:36 -04:00
committed by GitHub
153 changed files with 12227 additions and 10672 deletions
+6 -1
View File
@@ -218,4 +218,9 @@
#define SA_PLANT 1
#define SA_ANIMAL 2
#define SA_ROBOTIC 3
#define SA_HUMANOID 4
#define SA_HUMANOID 4
// For slime commanding. Higher numbers allow for more actions.
#define SLIME_COMMAND_OBEY 1 // When disciplined.
#define SLIME_COMMAND_FACTION 2 // When in the same 'faction'.
#define SLIME_COMMAND_FRIEND 3 // When befriended with a slime friendship agent.
-1
View File
@@ -38,7 +38,6 @@
* mob/RangedAttack(atom,params) - used only ranged, only used for tk and laser eyes but could be changed
*/
/mob/proc/ClickOn(var/atom/A, var/params)
if(world.time <= next_click) // Hard check, before anything else, to avoid crashing
return
+5 -1
View File
@@ -29,7 +29,8 @@
return
/mob/living/carbon/human/RangedAttack(var/atom/A)
if(!gloves && !mutations.len) return
if(!gloves && !mutations.len && !spitting)
return
var/obj/item/clothing/gloves/G = gloves
if((LASER in mutations) && a_intent == I_HURT)
LaserEyes(A) // moved into a proc below
@@ -40,6 +41,9 @@
else if(TK in mutations)
A.attack_tk(src)
else if(spitting) //Only used by xenos right now, can be expanded.
Spit(A)
/mob/living/RestrainedClickOn(var/atom/A)
return
+9 -1
View File
@@ -60,6 +60,14 @@
containername = "Robolimb blueprints (Morpheus)"
access = access_robotics
/datum/supply_packs/robotics/robolimbs/cybersolutions
name = "Cyber Solutions robolimb blueprints"
contains = list(/obj/item/weapon/disk/limb/cybersolutions)
cost = 20
containertype = /obj/structure/closet/crate/secure/science
containername = "Robolimb blueprints (Cyber Solutions)"
access = access_robotics
/datum/supply_packs/robotics/robolimbs/xion
name = "Xion robolimb blueprints"
contains = list(/obj/item/weapon/disk/limb/xion)
@@ -176,4 +184,4 @@
cost = 30
containertype = /obj/structure/closet/crate/secure/science
containername = "Jumper kit crate"
access = access_robotics
access = access_robotics
+1
View File
@@ -51,3 +51,4 @@
tile_overlay = "sleeping_agent"
overlay_limit = 1
flags = XGM_GAS_OXIDIZER
+3 -2
View File
@@ -57,7 +57,7 @@
//closing the doors on red and opening on green provides a bit of hysteresis that will hopefully prevent fire doors from opening and closing repeatedly due to noise
if (danger_level < 1 || danger_level >= 2)
firedoors_update()
for (var/obj/machinery/alarm/AA in src)
AA.update_icon()
@@ -289,7 +289,7 @@ var/list/mob/living/forced_ambiance_list = new
return // Being buckled to something solid keeps you in place.
if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.item_flags & NOSLIP))
return
if(H.m_intent == "run")
H.AdjustStunned(6)
H.AdjustWeakened(6)
@@ -297,6 +297,7 @@ var/list/mob/living/forced_ambiance_list = new
H.AdjustStunned(3)
H.AdjustWeakened(3)
mob << "<span class='notice'>The sudden appearance of gravity makes you fall to the floor!</span>"
playsound(get_turf(src), "bodyfall", 50, 1)
/area/proc/prison_break()
var/obj/machinery/power/apc/theAPC = get_apc()
+3 -1
View File
@@ -636,7 +636,9 @@ var/list/sacrificed = list()
log_and_message_admins("used a communicate rune to say '[input]'")
for(var/datum/mind/H in cult.current_antagonists)
if (H.current)
H.current << "<span class='cult'>[input]</span>"
to_chat(H.current, "<span class='cult'>[input]</span>")
for(var/mob/observer/dead/O in player_list)
to_chat(O, "<span class='cult'>[input]</span>")
qdel(src)
return 1
@@ -29,17 +29,22 @@
stacks = MODIFIER_STACK_EXTEND
/datum/modifier/technomancer/mend_synthetic/tick()
if(!holder.isSynthetic()) // Don't heal biologicals!
expire()
return
if(!holder.getBruteLoss() && !holder.getFireLoss()) // No point existing if the spell can't heal.
// if(!holder.isSynthetic()) // Don't heal biologicals!
// expire()
// return
if(!holder.getActualBruteLoss() && !holder.getActualFireLoss()) // No point existing if the spell can't heal.
expire()
return
if(ishuman(holder))
var/mob/living/carbon/human/H = holder
for(var/obj/item/organ/external/E in H.organs)
var/obj/item/organ/external/O = E
O.heal_damage(4 * spell_power, 4 * spell_power, 0, 1)
if(O.robotic >= ORGAN_ROBOT)
O.heal_damage(4 * spell_power, 4 * spell_power, 0, 1)
else
holder.adjustBruteLoss(-4 * spell_power) // Should heal roughly 20 burn/brute over 10 seconds, as tick() is run every 2 seconds.
holder.adjustFireLoss(-4 * spell_power) // Ditto.
holder.adjust_instability(1)
if(origin)
var/mob/living/L = origin.resolve()
+238 -56
View File
@@ -1,84 +1,266 @@
//These machines are mostly just here for debugging/spawning. Skeletons of the feature to come.
// GENERIC PRINTER - DO NOT USE THIS OBJECT.
// Flesh and robot printers are defined below this object.
/obj/machinery/bioprinter
name = "organ bioprinter"
desc = "It's a machine that grows replacement organs."
/obj/machinery/organ_printer
name = "organ printer"
desc = "It's a machine that prints organs."
icon = 'icons/obj/surgery.dmi'
icon_state = "bioprinter"
anchored = 1
density = 1
use_power = 1
idle_power_usage = 40
active_power_usage = 300
icon_state = "bioprinter"
var/prints_prosthetics
var/stored_matter = 200
var/stored_matter = 0
var/max_stored_matter = 0
var/print_delay = 100
var/printing
var/loaded_dna //Blood sample for DNA hashing.
// These should be subtypes of /obj/item/organ
var/list/products = list(
O_HEART = list(/obj/item/organ/internal/heart, 50),
O_LUNGS = list(/obj/item/organ/internal/lungs, 40),
O_KIDNEYS = list(/obj/item/organ/internal/kidneys,20),
O_EYES = list(/obj/item/organ/internal/eyes, 30),
O_LIVER = list(/obj/item/organ/internal/liver, 50)
"Heart" = list(/obj/item/organ/internal/heart, 25),
"Lungs" = list(/obj/item/organ/internal/lungs, 25),
"Kidneys" = list(/obj/item/organ/internal/kidneys,20),
"Eyes" = list(/obj/item/organ/internal/eyes, 20),
"Liver" = list(/obj/item/organ/internal/liver, 25),
"Arm, Left" = list(/obj/item/organ/external/arm, 65),
"Arm, Right" = list(/obj/item/organ/external/arm/right, 65),
"Leg, Left" = list(/obj/item/organ/external/leg, 65),
"Leg, Right" = list(/obj/item/organ/external/leg/right, 65),
"Foot, Left" = list(/obj/item/organ/external/foot, 40),
"Foot, Right" = list(/obj/item/organ/external/foot/right, 40),
"Hand, Left" = list(/obj/item/organ/external/hand, 40),
"Hand, Right" = list(/obj/item/organ/external/hand/right, 40)
)
/obj/machinery/bioprinter/prosthetics
name = "prosthetics fabricator"
desc = "It's a machine that prints prosthetic organs."
prints_prosthetics = 1
/obj/machinery/organ_printer/attackby(var/obj/item/O, var/mob/user)
if(default_deconstruction_screwdriver(user, O))
updateUsrDialog()
return
if(default_deconstruction_crowbar(user, O))
return
if(default_part_replacement(user, O))
return
return ..()
/obj/machinery/bioprinter/attack_hand(mob/user)
/obj/machinery/organ_printer/update_icon()
overlays.Cut()
if(panel_open)
overlays += "bioprinter_panel_open"
if(printing)
overlays += "bioprinter_working"
var/choice = input("What would you like to print?") as null|anything in products
if(!choice)
/obj/machinery/organ_printer/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
RefreshParts()
/obj/machinery/organ_printer/examine(var/mob/user)
. = ..()
to_chat(user, "<span class='notice'>It is loaded with [stored_matter]/[max_stored_matter] matter units.</span>")
/obj/machinery/organ_printer/RefreshParts()
print_delay = initial(print_delay)
max_stored_matter = 0
for(var/obj/item/weapon/stock_parts/matter_bin/bin in component_parts)
max_stored_matter += bin.rating * 100
for(var/obj/item/weapon/stock_parts/manipulator/manip in component_parts)
print_delay -= (manip.rating-1)*10
print_delay = max(0,print_delay)
. = ..()
/obj/machinery/organ_printer/attack_hand(mob/user)
if(stat & (BROKEN|NOPOWER))
return
if(stored_matter >= products[choice][2])
if(panel_open)
to_chat(user, "<span class='warning'>Close the panel first!</span>")
return
stored_matter -= products[choice][2]
var/new_organ = products[choice][1]
var/obj/item/organ/O = new new_organ(get_turf(src))
if(printing)
to_chat(user, "<span class='notice'>\The [src] is busy!</span>")
return
if(prints_prosthetics)
O.robotize()
else if(loaded_dna)
visible_message("<span class='notice'>The printer injects the stored DNA into the biomass.</span>.")
O.transplant_data = list()
var/mob/living/carbon/C = loaded_dna["donor"]
O.transplant_data["species"] = C.species.name
O.transplant_data["blood_type"] = loaded_dna["blood_type"]
O.transplant_data["blood_DNA"] = loaded_dna["blood_DNA"]
var/choice = input("What would you like to print?") as null|anything in products
visible_message("<span class='info'>The bioprinter spits out a new organ.</span>")
if(!choice || printing || (stat & (BROKEN|NOPOWER)))
return
else
user << "<span class='warning'>There is not enough matter in the printer.</span>"
if(!can_print(choice))
return
/obj/machinery/bioprinter/attackby(obj/item/weapon/W, mob/user)
stored_matter -= products[choice][2]
// DNA sample from syringe.
if(!prints_prosthetics && istype(W,/obj/item/weapon/reagent_containers/syringe))
use_power = 2
printing = 1
update_icon()
visible_message("<span class='notice'>\The [src] begins churning.</span>")
sleep(print_delay)
use_power = 1
printing = 0
update_icon()
if(!choice || !src || (stat & (BROKEN|NOPOWER)))
return
print_organ(choice)
/obj/machinery/organ_printer/proc/can_print(var/choice)
if(stored_matter < products[choice][2])
visible_message("<span class='notice'>\The [src] displays a warning: 'Not enough matter. [stored_matter] stored and [products[choice][2]] needed.'</span>")
return 0
if(!loaded_dna || !loaded_dna["donor"])
visible_message("<span class='info'>\The [src] displays a warning: 'No DNA saved. Insert a blood sample.'</span>")
return 0
return 1
/obj/machinery/organ_printer/proc/print_organ(var/choice)
var/new_organ = products[choice][1]
var/obj/item/organ/O = new new_organ(get_turf(src))
O.status |= ORGAN_CUT_AWAY
var/mob/living/carbon/C = loaded_dna["donor"]
O.set_dna(C.dna)
if(O.species)
// This is a very hacky way of doing of what organ/New() does if it has an owner
O.w_class = max(O.w_class + mob_size_difference(O.species.mob_size, MOB_MEDIUM), 1)
return O
// END GENERIC PRINTER
// CIRCUITS
/obj/item/weapon/circuitboard/bioprinter
name = "bioprinter circuit"
build_path = /obj/machinery/organ_printer/flesh
board_type = new /datum/frame/frame_types/machine
origin_tech = list(TECH_DATA = 3, TECH_BIO = 3)
req_components = list(
/obj/item/stack/cable_coil = 2,
/obj/item/weapon/stock_parts/matter_bin = 2,
/obj/item/weapon/stock_parts/manipulator = 2)
/obj/item/weapon/circuitboard/roboprinter
name = "roboprinter circuit"
build_path = /obj/machinery/organ_printer/robot
board_type = new /datum/frame/frame_types/machine
origin_tech = list(TECH_DATA = 3, TECH_BIO = 3)
req_components = list(
/obj/item/stack/cable_coil = 2,
/obj/item/weapon/stock_parts/matter_bin = 2,
/obj/item/weapon/stock_parts/manipulator = 2)
// ROBOT ORGAN PRINTER
// Still Requires DNA, /obj/machinery/pros_fab is better for limbs
/obj/machinery/organ_printer/robot
name = "prosthetic organ fabricator"
desc = "It's a machine that prints prosthetic organs."
icon_state = "roboprinter"
circuit = /obj/item/weapon/circuitboard/roboprinter
var/matter_amount_per_sheet = 10
var/matter_type = DEFAULT_WALL_MATERIAL
/obj/machinery/organ_printer/robot/full/New()
. = ..()
stored_matter = max_stored_matter
/obj/machinery/organ_printer/robot/dismantle()
if(stored_matter >= matter_amount_per_sheet)
new /obj/item/stack/material/steel(get_turf(src), Floor(stored_matter/matter_amount_per_sheet))
return ..()
/obj/machinery/organ_printer/robot/print_organ(var/choice)
var/obj/item/organ/O = ..()
O.robotize()
O.status |= ORGAN_CUT_AWAY // robotize() resets status to 0
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
audible_message("<span class='info'>\The [src] dings, then spits out \a [O].</span>")
return O
/obj/machinery/organ_printer/robot/attackby(var/obj/item/weapon/W, var/mob/user)
if(istype(W, /obj/item/stack/material) && W.get_material_name() == matter_type)
if((max_stored_matter-stored_matter) < matter_amount_per_sheet)
to_chat(user, "<span class='warning'>\The [src] is too full.</span>")
return
var/obj/item/stack/S = W
var/space_left = max_stored_matter - stored_matter
var/sheets_to_take = min(S.amount, Floor(space_left/matter_amount_per_sheet))
if(sheets_to_take <= 0)
to_chat(user, "<span class='warning'>\The [src] is too full.</span>")
return
stored_matter = min(max_stored_matter, stored_matter + (sheets_to_take*matter_amount_per_sheet))
to_chat(user, "<span class='info'>\The [src] processes \the [W]. Levels of stored matter now: [stored_matter]</span>")
S.use(sheets_to_take)
return
else if(istype(W,/obj/item/weapon/reagent_containers/syringe)) //TODO: Make this actuall empty the syringe
var/obj/item/weapon/reagent_containers/syringe/S = W
var/datum/reagent/blood/injected = locate() in S.reagents.reagent_list //Grab some blood
if(injected && injected.data)
loaded_dna = injected.data
user << "<span class='info'>You inject the blood sample into the bioprinter.</span>"
return
// Meat for biomass.
if(!prints_prosthetics && istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat))
stored_matter += 50
user.drop_item()
user << "<span class='info'>\The [src] processes \the [W]. Levels of stored biomass now: [stored_matter]</span>"
qdel(W)
return
// Steel for matter.
if(prints_prosthetics && istype(W, /obj/item/stack/material) && W.get_material_name() == DEFAULT_WALL_MATERIAL)
var/obj/item/stack/S = W
stored_matter += S.amount * 10
user.drop_item()
user << "<span class='info'>\The [src] processes \the [W]. Levels of stored matter now: [stored_matter]</span>"
qdel(W)
to_chat(user, "<span class='info'>You scan the blood sample into the bioprinter.</span>")
return
return ..()
// END ROBOT ORGAN PRINTER
return..()
// FLESH ORGAN PRINTER
/obj/machinery/organ_printer/flesh
name = "bioprinter"
desc = "It's a machine that prints replacement organs."
icon_state = "bioprinter"
circuit = /obj/item/weapon/circuitboard/bioprinter
var/amount_per_slab = 50
/obj/machinery/organ_printer/flesh/full/New()
. = ..()
stored_matter = max_stored_matter
/obj/machinery/organ_printer/flesh/dismantle()
var/turf/T = get_turf(src)
if(T)
while(stored_matter >= amount_per_slab)
stored_matter -= amount_per_slab
new /obj/item/weapon/reagent_containers/food/snacks/meat(T)
return ..()
/obj/machinery/organ_printer/flesh/print_organ(var/choice)
var/obj/item/organ/O = ..()
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
visible_message("<span class='info'>\The [src] dings, then spits out \a [O].</span>")
return O
/obj/machinery/organ_printer/flesh/attackby(obj/item/weapon/W, mob/user)
// Load with matter for printing.
if(istype(W, /obj/item/weapon/reagent_containers/food/snacks/meat))
if((max_stored_matter - stored_matter) < amount_per_slab)
to_chat(user, "<span class='warning'>\The [src] is too full.</span>")
return
stored_matter += amount_per_slab
user.drop_item()
to_chat(user, "<span class='info'>\The [src] processes \the [W]. Levels of stored biomass now: [stored_matter]</span>")
qdel(W)
return
// DNA sample from syringe.
else if(istype(W,/obj/item/weapon/reagent_containers/syringe)) //TODO: Make this actually empty the syringe
var/obj/item/weapon/reagent_containers/syringe/S = W
var/datum/reagent/blood/injected = locate() in S.reagents.reagent_list //Grab some blood
if(injected && injected.data)
loaded_dna = injected.data
to_chat(user, "<span class='info'>You scan the blood sample into the bioprinter.</span>")
return
return ..()
// END FLESH ORGAN PRINTER
+2
View File
@@ -176,6 +176,8 @@
var/mob/living/silicon/ai/A = new /mob/living/silicon/ai ( loc, laws, brain )
if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created
A.rename_self("ai", 1)
for(var/datum/language/L in brain.brainmob.languages)
A.add_language(L.name)
feedback_inc("cyborg_ais_created",1)
qdel(src)
+1
View File
@@ -107,6 +107,7 @@
else
var/B_held = B.wrapped
user << "You use \the [B] to use \the [B_held] with \the [src]."
playsound(src, "keyboard", 100, 1, 0)
return
attack_hand(user)
return
+2
View File
@@ -400,7 +400,9 @@
switch(animation)
if("opening")
flick("door_opening", src)
playsound(src, 'sound/machines/firelockopen.ogg', 37, 1)
if("closing")
playsound(src, 'sound/machines/firelockclose.ogg', 37, 1)
flick("door_closing", src)
return
+1 -1
View File
@@ -1,5 +1,5 @@
/obj/machinery/microwave
name = "Microwave"
name = "microwave"
icon = 'icons/obj/kitchen.dmi'
icon_state = "mw"
layer = 2.9
+2 -2
View File
@@ -394,14 +394,14 @@
/obj/mecha/proc/mechstep(direction)
var/result = step(src,direction)
if(result)
playsound(src,'sound/mecha/mechstep.ogg',40,1)
playsound(src,"mechstep",40,1)
return result
/obj/mecha/proc/mechsteprand()
var/result = step_rand(src)
if(result)
playsound(src,'sound/mecha/mechstep.ogg',40,1)
playsound(src,"mechstep",40,1)
return result
/obj/mecha/Bump(var/atom/obstacle)
+2 -1
View File
@@ -125,6 +125,7 @@
var/amount_grown = -1
var/obj/machinery/atmospherics/unary/vent_pump/entry_vent
var/travelling_in_vent = 0
var/list/grow_as = list(/mob/living/simple_animal/hostile/giant_spider, /mob/living/simple_animal/hostile/giant_spider/nurse, /mob/living/simple_animal/hostile/giant_spider/hunter)
/obj/effect/spider/spiderling/New(var/location, var/atom/parent)
pixel_x = rand(6,-6)
@@ -218,7 +219,7 @@
break
if(amount_grown >= 100)
var/spawn_type = pick(typesof(/mob/living/simple_animal/hostile/giant_spider))
var/spawn_type = pick(grow_as)
new spawn_type(src.loc, src)
qdel(src)
else if(isorgan(loc))
@@ -208,6 +208,9 @@
O.job = "Cyborg"
for(var/datum/language/L in M.brainmob.languages)
O.add_language(L.name)
O.cell = chest.cell
O.cell.loc = O
W.loc = O//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame.
@@ -279,12 +279,18 @@ CIGARETTE PACKETS ARE IN FANCY.DM
chem_volume = 15
max_smoketime = 300
smoketime = 300
var/nicotine_amt = 2
matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>"
lightermes = "<span class='notice'>USER manages to light their NAME with FLAME.</span>"
zippomes = "<span class='rose'>With a flick of their wrist, USER lights their NAME with their FLAME.</span>"
weldermes = "<span class='notice'>USER casually lights the NAME with FLAME.</span>"
ignitermes = "<span class='notice'>USER fiddles with FLAME, and manages to light their NAME.</span>"
/obj/item/clothing/mask/smokable/cigarette/New()
..()
if(nicotine_amt)
reagents.add_reagent("nicotine", nicotine_amt)
/obj/item/clothing/mask/smokable/cigarette/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
@@ -332,6 +338,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
max_smoketime = 1500
smoketime = 1500
chem_volume = 20
nicotine_amt = 4
matchmes = "<span class='notice'>USER lights their NAME with their FLAME.</span>"
lightermes = "<span class='notice'>USER manages to offend their NAME by lighting it with FLAME.</span>"
zippomes = "<span class='rose'>With a flick of their wrist, USER lights their NAME with their FLAME.</span>"
@@ -342,6 +349,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
name = "\improper Cohiba Robusto cigar"
desc = "There's little more you could want from a cigar."
icon_state = "cigar2"
nicotine_amt = 7
/obj/item/clothing/mask/smokable/cigarette/cigar/havana
name = "premium Havanian cigar"
@@ -350,6 +358,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
max_smoketime = 7200
smoketime = 7200
chem_volume = 30
nicotine_amt = 10
/obj/item/weapon/cigbutt
name = "cigarette butt"
+437
View File
@@ -0,0 +1,437 @@
/*
Basically, each player key gets one chance per loot pile to get them phat lewt.
When they click the pile, after a delay, they 'roll' if they get anything, using chance_nothing. If they're unlucky, they get nothing.
Otherwise, they roll up to two times, first a roll for rare things, using chance_rare. If they succeed, they get something quite good.
If that roll fails, they do one final roll, using chance_uncommon. If they succeed, they get something fairly useful.
If that fails again, they walk away with some common junk.
The same player cannot roll again, however other players can. This has two benefits. The first benefit is that someone raiding all of
maintenance will not deprive other people from a shot at loot, and that for the surface varients, it quietly encourages bringing along
buddies, to get more chances at getting cool things instead of someone going solo to hoard all the stuff.
Loot piles can be depleted, if loot_depleted is turned on. Note that players who searched the pile already won't deplete the loot furthers when searching again.
*/
/obj/structure/loot_pile
name = "base loot pile"
desc = "If you can read me, this is bugged"
description_info = "This can be searched by clicking on it and waiting a few seconds. You might find valuable treasures or worthless junk. \
These can only searched each once per player."
icon = 'icons/obj/loot_piles.dmi'
icon_state = "randompile"
density = FALSE
anchored = TRUE
var/list/searched_by = list() // Keys that have searched this loot pile, with values of searched time.
var/allow_multiple_looting = FALSE // If true, the same person can loot multiple times. Mostly for debugging.
var/busy = FALSE // Used so you can't spamclick to loot.
var/chance_nothing = 0 // Unlucky people might need to loot multiple spots to find things.
var/chance_uncommon = 10 // Probability of pulling from the uncommon_loot list.
var/chance_rare = 1 // Ditto, but for rare_loot list.
var/loot_depletion = FALSE // If true, loot piles can be 'depleted' after a certain number of searches by different players, where no more loot can be obtained.
var/loot_left = 0 // When this reaches zero, and loot_depleted is true, you can't obtain anymore loot.
var/delete_on_depletion = FALSE // If true, and if the loot gets depleted as above, the pile is deleted.
var/list/common_loot = list() // Common is generally less-than-useful junk and filler, at least for maint loot piles.
var/list/uncommon_loot = list() // Uncommon is actually maybe some useful items, usually the reason someone bothers looking inside.
var/list/rare_loot = list() // Rare is really powerful, or at least unique items.
/obj/structure/loot_pile/attack_hand(mob/user)
//Human mob
if(isliving(user))
var/mob/living/L = user
if(busy)
to_chat(L, "<span class='warning'>\The [src] is already being searched.</span>")
return
L.visible_message("[user] searches through \the [src].","<span class='notice'>You search through \the [src].</span>")
//Do the searching
busy = TRUE
if(do_after(user,rand(4 SECONDS,6 SECONDS),src))
// The loot's all gone.
if(loot_depletion && loot_left <= 0)
to_chat(L, "<span class='warning'>\The [src] has been picked clean.</span>")
busy = FALSE
return
//You already searched this one
if( (user.ckey in searched_by) && !allow_multiple_looting)
to_chat(L, "<span class='warning'>You can't find anything else vaguely useful in \the [src]. Another set of eyes might, however.</span>")
busy = FALSE
return
// You got unlucky.
if(chance_nothing && prob(chance_nothing))
to_chat(L, "<span class='warning'>Nothing in this pile really catches your eye...</span>")
searched_by |= user.ckey
busy = FALSE
return
// You found something!
var/obj/item/loot = null
var/span = "notice" // Blue
if(prob(chance_rare) && rare_loot.len) // You won THE GRAND PRIZE!
loot = produce_rare_item()
span = "cult" // Purple and bold.
else if(prob(chance_uncommon) && uncommon_loot.len) // Otherwise you might still get something good.
loot = produce_uncommon_item()
span = "alium" // Green
else // Welp.
loot = produce_common_item()
if(loot)
searched_by |= user.ckey
loot.forceMove(get_turf(src))
to_chat(L, "<span class='[span]'>You found \a [loot]!</span>")
if(loot_depletion)
loot_left--
if(loot_left <= 0)
to_chat(L, "<span class='warning'>You seem to have gotten the last of the spoils inside \the [src].</span>")
if(delete_on_depletion)
qdel(src)
busy = FALSE
else
return ..()
/obj/structure/loot_pile/proc/produce_common_item()
var/path = pick(common_loot)
return new path(src)
/obj/structure/loot_pile/proc/produce_uncommon_item()
var/path = pick(uncommon_loot)
return new path(src)
/obj/structure/loot_pile/proc/produce_rare_item()
var/path = pick(rare_loot)
return new path(src)
/obj/structure/loot_pile/maint
var/list/icon_states_to_use = list()
/obj/structure/loot_pile/maint/initialize()
icon_state = pick(icon_states_to_use)
..()
// Has large amounts of possible items, most of which may or may not be useful.
/obj/structure/loot_pile/maint/junk
name = "pile of junk"
desc = "Lots of junk lying around. They say one man's trash is another man's treasure."
icon_states_to_use = list("junk_pile1", "junk_pile2", "junk_pile3", "junk_pile4", "junk_pile5")
common_loot = list(
/obj/item/device/flashlight/flare,
/obj/item/device/flashlight/glowstick,
/obj/item/device/flashlight/glowstick/blue,
/obj/item/device/flashlight/glowstick/orange,
/obj/item/device/flashlight/glowstick/red,
/obj/item/device/flashlight/glowstick/yellow,
/obj/item/device/flashlight/pen,
/obj/item/weapon/cell,
/obj/item/weapon/cell/device,
/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/gas/half,
/obj/item/clothing/mask/breath,
/obj/item/weapon/reagent_containers/glass/rag,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
/obj/item/weapon/storage/secure/briefcase,
/obj/item/weapon/storage/briefcase,
/obj/item/weapon/storage/backpack,
/obj/item/weapon/storage/backpack/satchel/norm,
/obj/item/weapon/storage/backpack/satchel,
/obj/item/weapon/storage/backpack/dufflebag,
/obj/item/weapon/storage/box,
/obj/item/weapon/storage/wallet,
/obj/item/clothing/shoes/galoshes,
/obj/item/clothing/shoes/black,
/obj/item/clothing/shoes/laceup,
/obj/item/clothing/shoes/black,
/obj/item/clothing/shoes/leather,
/obj/item/clothing/gloves/botanic_leather,
/obj/item/clothing/gloves/sterile/latex,
/obj/item/clothing/gloves/white,
/obj/item/clothing/gloves/rainbow,
/obj/item/clothing/gloves/fyellow,
/obj/item/clothing/glasses/sunglasses,
/obj/item/clothing/glasses/meson,
/obj/item/clothing/glasses/meson/prescription,
/obj/item/clothing/glasses/welding,
/obj/item/clothing/head/bio_hood/general,
/obj/item/clothing/head/hardhat,
/obj/item/clothing/head/hardhat/red,
/obj/item/clothing/head/ushanka,
/obj/item/clothing/head/welding,
/obj/item/clothing/suit/storage/hazardvest,
/obj/item/clothing/suit/space/emergency,
/obj/item/clothing/suit/storage/toggle/bomber,
/obj/item/clothing/suit/bio_suit/general,
/obj/item/clothing/suit/storage/toggle/hoodie/black,
/obj/item/clothing/suit/storage/toggle/hoodie/blue,
/obj/item/clothing/suit/storage/toggle/hoodie/red,
/obj/item/clothing/suit/storage/toggle/hoodie/yellow,
/obj/item/clothing/suit/storage/toggle/brown_jacket,
/obj/item/clothing/suit/storage/toggle/leather_jacket,
/obj/item/clothing/suit/storage/apron,
/obj/item/clothing/under/color/grey,
/obj/item/clothing/under/syndicate/tacticool,
/obj/item/clothing/under/pants/camo,
/obj/item/clothing/under/harness,
/obj/item/clothing/accessory/storage/webbing,
/obj/item/weapon/spacecash/c1,
/obj/item/weapon/spacecash/c10,
/obj/item/weapon/spacecash/c20,
/obj/item/weapon/camera_assembly,
/obj/item/weapon/caution,
/obj/item/weapon/caution/cone,
/obj/item/weapon/card/emag_broken,
/obj/item/device/camera,
/obj/item/device/pda,
/obj/item/device/radio/headset,
/obj/item/device/paicard
)
uncommon_loot = list(
/obj/item/clothing/shoes/syndigaloshes,
/obj/item/clothing/gloves/yellow,
/obj/item/clothing/under/tactical,
/obj/item/weapon/beartrap,
/obj/item/clothing/suit/storage/vest/press,
/obj/item/weapon/material/hatchet/tacknife,
/obj/item/weapon/material/butterfly/switchblade
)
rare_loot = list(
/obj/item/clothing/suit/storage/vest/heavy/merc,
/obj/item/clothing/shoes/boots/combat,
)
// Contains mostly useless garbage.
/obj/structure/loot_pile/maint/trash
name = "pile of trash"
desc = "Lots of garbage in one place. Might be able to find something if you're in the mood for dumpster diving."
icon_states_to_use = list("trash_pile1", "trash_pile2")
common_loot = list(
/obj/item/trash/candle,
/obj/item/trash/candy,
/obj/item/trash/candy/proteinbar,
/obj/item/trash/cheesie,
/obj/item/trash/chips,
/obj/item/trash/liquidfood,
/obj/item/trash/pistachios,
/obj/item/trash/plate,
/obj/item/trash/popcorn,
/obj/item/trash/raisins,
/obj/item/trash/semki,
/obj/item/trash/snack_bowl,
/obj/item/trash/sosjerky,
/obj/item/trash/syndi_cakes,
/obj/item/trash/tastybread,
/obj/item/trash/tray,
/obj/item/trash/unajerky,
/obj/item/trash/waffles,
/obj/item/weapon/reagent_containers/food/snacks/xenomeat/spidermeat,
/obj/item/weapon/reagent_containers/food/snacks/mysterysoup,
/obj/item/weapon/reagent_containers/food/snacks/hotdog/old,
/obj/item/pizzabox/old,
/obj/item/ammo_casing/spent,
/obj/item/stack/rods{amount = 5},
/obj/item/stack/material/steel{amount = 5},
/obj/item/stack/material/cardboard{amount = 5},
/obj/item/weapon/contraband/poster,
/obj/item/weapon/material/wirerod,
/obj/item/weapon/contraband/poster,
/obj/item/weapon/newspaper,
/obj/item/weapon/paper/crumpled,
/obj/item/weapon/paper/crumpled/bloody
)
uncommon_loot = list(
/obj/item/weapon/reagent_containers/syringe/steroid,
/obj/item/weapon/storage/pill_bottle/zoom,
/obj/item/weapon/storage/pill_bottle/happy,
/obj/item/weapon/storage/pill_bottle/tramadol
)
// Contains loads of different types of boxes, which may have items inside!
/obj/structure/loot_pile/maint/boxfort
name = "pile of boxes"
desc = "A large pile of boxes sits here."
density = TRUE
icon_states_to_use = list("boxfort")
common_loot = list(
/obj/item/weapon/storage/box,
/obj/item/weapon/storage/box/beakers,
/obj/item/weapon/storage/box/botanydisk,
/obj/item/weapon/storage/box/cups,
/obj/item/weapon/storage/box/disks,
/obj/item/weapon/storage/box/donkpockets,
/obj/item/weapon/storage/box/donut,
/obj/item/weapon/storage/box/donut/empty,
/obj/item/weapon/storage/box/evidence,
/obj/item/weapon/storage/box/engineer,
/obj/item/weapon/storage/box/lights/mixed,
/obj/item/weapon/storage/box/lights/tubes,
/obj/item/weapon/storage/box/lights/bulbs,
/obj/item/weapon/storage/box/injectors,
/obj/item/weapon/storage/box/masks,
/obj/item/weapon/storage/box/ids,
/obj/item/weapon/storage/box/mousetraps,
/obj/item/weapon/storage/box/syringes,
/obj/item/weapon/storage/box/survival,
/obj/item/weapon/storage/box/gloves,
/obj/item/weapon/storage/box/PDAs
)
uncommon_loot = list(
/obj/item/weapon/storage/box/sinpockets,
/obj/item/weapon/storage/box/practiceshells,
/obj/item/weapon/storage/box/blanks,
/obj/item/weapon/storage/box/smokes,
/obj/item/weapon/storage/box/metalfoam,
/obj/item/weapon/storage/box/handcuffs,
/obj/item/weapon/storage/box/seccarts
)
rare_loot = list(
/obj/item/weapon/storage/box/flashbangs,
/obj/item/weapon/storage/box/empslite,
/obj/item/weapon/storage/box/flashshells,
/obj/item/weapon/storage/box/stunshells,
/obj/item/weapon/storage/box/teargas
)
// One of the more useful maint piles, contains electrical components.
/obj/structure/loot_pile/maint/technical
name = "broken machine"
desc = "A destroyed machine with unknown purpose, and doesn't look like it can be fixed. It might still have some functional components?"
density = TRUE
icon_states_to_use = list("technical_pile1", "technical_pile2", "technical_pile3")
common_loot = list(
/obj/item/weapon/stock_parts/gear,
/obj/item/weapon/stock_parts/console_screen,
/obj/item/weapon/stock_parts/spring,
/obj/item/weapon/stock_parts/capacitor,
/obj/item/weapon/stock_parts/capacitor/adv,
/obj/item/weapon/stock_parts/capacitor/super,
/obj/item/weapon/stock_parts/manipulator,
/obj/item/weapon/stock_parts/manipulator/nano,
/obj/item/weapon/stock_parts/manipulator/pico,
/obj/item/weapon/stock_parts/matter_bin,
/obj/item/weapon/stock_parts/matter_bin/adv,
/obj/item/weapon/stock_parts/matter_bin/super,
/obj/item/weapon/stock_parts/scanning_module,
/obj/item/weapon/stock_parts/scanning_module/adv,
/obj/item/weapon/stock_parts/scanning_module/phasic,
/obj/item/weapon/stock_parts/subspace/amplifier,
/obj/item/weapon/stock_parts/subspace/analyzer,
/obj/item/weapon/stock_parts/subspace/ansible,
/obj/item/weapon/stock_parts/subspace/crystal,
/obj/item/weapon/stock_parts/subspace/filter,
/obj/item/weapon/stock_parts/subspace/transmitter,
/obj/item/weapon/stock_parts/subspace/treatment,
/obj/item/frame,
/obj/item/broken_device,
/obj/item/borg/upgrade/restart,
/obj/item/weapon/cell,
/obj/item/weapon/cell/high,
/obj/item/weapon/cell/device,
/obj/item/weapon/circuitboard/broken,
/obj/item/weapon/circuitboard/arcade,
/obj/item/weapon/circuitboard/autolathe,
/obj/item/weapon/circuitboard/atmos_alert,
/obj/item/weapon/circuitboard/airalarm,
/obj/item/weapon/circuitboard/fax,
/obj/item/weapon/circuitboard/ghettosmes,
/obj/item/weapon/circuitboard/jukebox,
/obj/item/weapon/circuitboard/message_monitor,
/obj/item/weapon/circuitboard/rcon_console,
/obj/item/weapon/smes_coil,
/obj/item/weapon/cartridge/engineering,
/obj/item/device/analyzer,
/obj/item/device/healthanalyzer,
/obj/item/device/robotanalyzer,
/obj/item/device/lightreplacer,
/obj/item/device/radio,
/obj/item/device/hailer,
/obj/item/device/gps,
/obj/item/device/geiger,
/obj/item/device/mass_spectrometer,
/obj/item/weapon/wrench,
/obj/item/weapon/screwdriver,
/obj/item/weapon/wirecutters,
/obj/item/device/multitool,
/obj/item/mecha_parts/mecha_equipment/generator,
/obj/item/mecha_parts/mecha_equipment/tool/cable_layer,
/obj/item/mecha_parts/mecha_equipment/tool/drill,
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,
/obj/item/mecha_parts/mecha_equipment/tool/passenger,
/obj/item/mecha_parts/mecha_equipment/tool/sleeper,
/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun,
/obj/item/robot_parts/robot_component/binary_communication_device,
/obj/item/robot_parts/robot_component/armour,
/obj/item/robot_parts/robot_component/actuator,
/obj/item/robot_parts/robot_component/camera,
/obj/item/robot_parts/robot_component/diagnosis_unit,
/obj/item/robot_parts/robot_component/radio
)
uncommon_loot = list(
/obj/item/weapon/cell/super,
/obj/item/weapon/cell/device/weapon,
/obj/item/weapon/circuitboard/security,
/obj/item/weapon/circuitboard/crew,
/obj/item/weapon/aiModule/reset,
/obj/item/weapon/smes_coil/super_capacity,
/obj/item/weapon/smes_coil/super_io,
/obj/item/weapon/cartridge/captain,
/obj/item/weapon/disk/integrated_circuit/upgrade/advanced,
/obj/item/device/tvcamera,
/obj/item/device/universal_translator,
/obj/item/device/aicard,
/obj/item/borg/upgrade/jetpack,
/obj/item/borg/upgrade/vtec,
/obj/item/borg/upgrade/tasercooler,
/obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser,
/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill,
/obj/item/rig_module/device/drill,
/obj/item/rig_module/device/plasmacutter,
/obj/item/rig_module/device/healthscanner,
/obj/item/rig_module/device/orescanner,
/obj/item/rig_module/device/anomaly_scanner,
/obj/item/rig_module/datajack,
/obj/item/rig_module/vision/medhud,
/obj/item/rig_module/vision/meson,
/obj/item/rig_module/vision/sechud,
/obj/item/rig_module/sprinter
)
rare_loot = list(
/obj/item/weapon/cell/hyper,
/obj/item/weapon/aiModule/freeform,
/obj/item/weapon/aiModule/asimov,
/obj/item/weapon/aiModule/paladin,
/obj/item/weapon/aiModule/safeguard,
/obj/item/weapon/disposable_teleporter,
/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
)
// Surface base type
/obj/structure/loot_pile/surface
// Surface loot piles are considerably harder and more dangerous to reach, so you're more likely to get rare things.
chance_uncommon = 20
chance_rare = 5
loot_depletion = TRUE
loot_left = 5 // This is to prevent people from asking the whole station to go down to some alien ruin to get massive amounts of phat lewt.
+10 -2
View File
@@ -37,8 +37,8 @@
#define SPACE UNDERWATER
var/list/shatter_sound = list('sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg')
var/list/explosion_sound = list('sound/effects/Explosion1.ogg','sound/effects/Explosion2.ogg')
var/list/spark_sound = list('sound/effects/sparks1.ogg','sound/effects/sparks2.ogg','sound/effects/sparks3.ogg','sound/effects/sparks4.ogg')
var/list/explosion_sound = list('sound/effects/Explosion1.ogg','sound/effects/Explosion2.ogg','sound/effects/Explosion3.ogg','sound/effects/Explosion4.ogg','sound/effects/Explosion5.ogg','sound/effects/Explosion6.ogg')
var/list/spark_sound = list('sound/effects/sparks1.ogg','sound/effects/sparks2.ogg','sound/effects/sparks3.ogg','sound/effects/sparks5.ogg','sound/effects/sparks6.ogg','sound/effects/sparks7.ogg')
var/list/rustle_sound = list('sound/effects/rustle1.ogg','sound/effects/rustle2.ogg','sound/effects/rustle3.ogg','sound/effects/rustle4.ogg','sound/effects/rustle5.ogg')
var/list/punch_sound = list('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg')
var/list/clown_sound = list('sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg')
@@ -46,6 +46,12 @@ var/list/swing_hit_sound = list('sound/weapons/genhit1.ogg', 'sound/weapons/genh
var/list/hiss_sound = list('sound/voice/hiss1.ogg','sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg')
var/list/page_sound = list('sound/effects/pageturn1.ogg', 'sound/effects/pageturn2.ogg','sound/effects/pageturn3.ogg')
var/list/fracture_sound = list('sound/effects/bonebreak1.ogg','sound/effects/bonebreak2.ogg','sound/effects/bonebreak3.ogg','sound/effects/bonebreak4.ogg')
var/list/casing_sound = list ('sound/weapons/casingfall1.ogg','sound/weapons/casingfall2.ogg','sound/weapons/casingfall3.ogg')
var/list/keyboard_sound = list ('sound/effects/keyboard/keyboard1.ogg','sound/effects/keyboard/keyboard2.ogg','sound/effects/keyboard/keyboard3.ogg', 'sound/effects/keyboard/keyboard4.ogg')
var/list/mechstep_sound = list('sound/mecha/mechstep1.ogg', 'sound/mecha/mechstep2.ogg')
var/list/bodyfall_sound = list('sound/effects/bodyfall1.ogg','sound/effects/bodyfall2.ogg','sound/effects/bodyfall3.ogg','sound/effects/bodyfall4.ogg')
var/list/can_sound = list('sound/effects/can_open1.ogg','sound/effects/can_open2.ogg','sound/effects/can_open3.ogg','sound/effects/can_open4.ogg')
//var/list/gun_sound = list('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg','sound/weapons/Gunshot3.ogg','sound/weapons/Gunshot4.ogg')
/proc/playsound(var/atom/source, soundin, vol as num, vary, extrarange as num, falloff, var/is_global, var/frequency)
@@ -179,5 +185,7 @@ var/const/FALLOFF_SOUNDS = 0.5
if ("hiss") soundin = pick(hiss_sound)
if ("pageturn") soundin = pick(page_sound)
if ("fracture") soundin = pick(fracture_sound)
if ("canopen") soundin = pick(can_sound)
if ("mechstep") soundin = pick(mechstep_sound)
//if ("gunshot") soundin = pick(gun_sound)
return soundin
+2 -2
View File
@@ -24,8 +24,8 @@
wet_overlay = image('icons/effects/water.dmi',src,"wet_floor")
overlays += wet_overlay
sleep(800)
if(wet >= 2)
return
if(wet == 2)
sleep(3200)
wet = 0
if(wet_overlay)
overlays -= wet_overlay
+3 -1
View File
@@ -69,8 +69,9 @@ var/list/admin_verbs_admin = list(
/datum/admins/proc/toggledsay, //toggles dsay on/off for everyone,
/client/proc/game_panel, //game panel, allows to change game-mode etc,
/client/proc/cmd_admin_say, //admin-only ooc chat,
/datum/admins/proc/PlayerNotes,
/client/proc/cmd_mod_say,
/client/proc/cmd_event_say,
/datum/admins/proc/PlayerNotes,
/datum/admins/proc/show_player_info,
/client/proc/free_slot, //frees slot for chosen job,
/client/proc/cmd_admin_change_custom_event,
@@ -313,6 +314,7 @@ var/list/admin_verbs_mod = list(
/datum/admins/proc/PlayerNotes,
/client/proc/admin_ghost, //allows us to ghost/reenter body at will,
/client/proc/cmd_mod_say,
/client/proc/cmd_event_say,
/datum/admins/proc/show_player_info,
/client/proc/player_panel_new,
/client/proc/dsay,
+28 -3
View File
@@ -2,10 +2,12 @@
set category = "Special Verbs"
set name = "Asay" //Gave this shit a shorter name so you only have to time out "asay" rather than "admin say" to use it --NeoFite
set hidden = 1
if(!check_rights(R_ADMIN)) return
if(!check_rights(R_ADMIN))
return
msg = sanitize(msg)
if(!msg) return
if(!msg)
return
log_admin("ADMIN: [key_name(src)] : [msg]")
@@ -21,7 +23,8 @@
set name = "Msay"
set hidden = 1
if(!check_rights(R_ADMIN|R_MOD|R_MENTOR|R_SERVER)) return
if(!check_rights(R_ADMIN|R_MOD|R_MENTOR|R_SERVER))
return
msg = sanitize(msg)
log_admin("MOD: [key_name(src)] : [msg]")
@@ -36,3 +39,25 @@
C << "<span class='mod_channel'>" + create_text_tag("mod", "MOD:", C) + " <span class='name'>[sender_name]</span>([admin_jump_link(mob, C.holder)]): <span class='message'>[msg]</span></span>"
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_event_say(msg as text)
set category = "Special Verbs"
set name = "Esay"
set hidden = 1
if(!check_rights(R_ADMIN|R_MOD|R_MENTOR|R_SERVER))
return
msg = sanitize(msg)
log_admin("EVENT: [key_name(src)] : [msg]")
if (!msg)
return
var/sender_name = key_name(usr, 1)
if(check_rights(R_ADMIN, 0))
sender_name = "<span class='admin'>[sender_name]</span>"
for(var/client/C in admins)
C << "<span class='event_channel'>" + create_text_tag("event", "EVENT:", C) + " <span class='name'>[sender_name]</span>([admin_jump_link(mob, C.holder)]): <span class='message'>[msg]</span></span>"
feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+1 -1
View File
@@ -76,7 +76,7 @@ datum/preferences
var/job_engsec_low = 0
//Keeps track of preferrence for not getting any wanted jobs
var/alternate_option = 0
var/alternate_option = 1
var/used_skillpoints = 0
var/skill_specialization = null
+4 -2
View File
@@ -6,7 +6,8 @@
"old" = 'icons/mob/screen/old.dmi',
"White" = 'icons/mob/screen/white.dmi',
"old-noborder" = 'icons/mob/screen/old-noborder.dmi',
"minimalist" = 'icons/mob/screen/minimalist.dmi'
"minimalist" = 'icons/mob/screen/minimalist.dmi',
"Hologram" = 'icons/mob/screen/holo.dmi'
)
/var/all_ui_styles_robot = list(
@@ -15,7 +16,8 @@
"old" = 'icons/mob/screen1_robot.dmi',
"White" = 'icons/mob/screen1_robot.dmi',
"old-noborder" = 'icons/mob/screen1_robot.dmi',
"minimalist" = 'icons/mob/screen1_robot_minimalist.dmi'
"minimalist" = 'icons/mob/screen1_robot_minimalist.dmi',
"Hologram" = 'icons/mob/screen1_robot_minimalist.dmi'
)
/proc/ui_style2icon(ui_style)
+6 -3
View File
@@ -158,10 +158,13 @@
if(!body_coverage)
return
target << "<span class='danger'>You are stung by \the [fruit]!</span>"
for(var/rid in chems)
if (fruit)
var/injecting = min(5,max(1,get_trait(TRAIT_POTENCY)/5))
target.reagents.add_reagent(rid,injecting)
to_chat(target, "<span class='danger'>You are stung by \the [fruit]!</span>")
for(var/chem in chems)
target.reagents.add_reagent(chem,injecting)
if (fruit.reagents)
fruit.reagents.remove_reagent(chem, injecting)
//Splatter a turf.
/datum/seed/proc/splatter(var/turf/T,var/obj/item/thrown)
+1 -1
View File
@@ -322,7 +322,7 @@
//Remove the seed if something is already planted.
if(seed) seed = null
seed = plant_controller.seeds[pick(list("reishi","nettles","amanita","mushrooms","plumphelmet","towercap","harebells","weeds"))]
seed = plant_controller.seeds[pick(list("reishi","nettle","amanita","mushrooms","plumphelmet","towercap","harebells","weeds"))]
if(!seed) return //Weed does not exist, someone fucked up.
dead = 0
+1 -1
View File
@@ -644,7 +644,7 @@ var/list/name_to_material
/material/resin
name = "resin"
icon_colour = "#E85DD8"
icon_colour = "#35343a"
dooropen_noise = 'sound/effects/attackblob.ogg'
door_icon_base = "resin"
melting_point = T0C+300
+14 -11
View File
@@ -26,7 +26,9 @@
whisper_verb = "whispers"
key = "0"
flags = RESTRICTED
syllables = list("vol", "zum", "coo","zoo","bi","do","ooz","ite","og","re","si","ite","ish","ar","at","on","ee","east","ma","da", "rim")
syllables = list(
"vol", "zum", "coo","zoo","bi","do","ooz","ite","og","re","si","ite","ish",
"ar","at","on","ee","east","ma","da", "rim")
//TODO flag certain languages to use the mob-type specific say_quote and then get rid of these.
/datum/language/common/get_spoken_verb(var/msg_end)
@@ -44,15 +46,12 @@
speech_verb = "enunciates"
colour = "say_quote"
key = "2"
space_chance = 100
syllables = list("lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit",
"sed", "do", "eiusmod", "tempor", "incididunt", "ut", "labore", "et", "dolore",
"magna", "aliqua", "ut", "enim", "ad", "minim", "veniam", "quis", "nostrud",
"exercitation", "ullamco", "laboris", "nisi", "ut", "aliquip", "ex", "ea", "commodo",
"consequat", "duis", "aute", "irure", "dolor", "in", "reprehenderit", "in",
"voluptate", "velit", "esse", "cillum", "dolore", "eu", "fugiat", "nulla",
"pariatur", "excepteur", "sint", "occaecat", "cupidatat", "non", "proident", "sunt",
"in", "culpa", "qui", "officia", "deserunt", "mollit", "anim", "id", "est", "laborum")
syllables = list(
"fea","vea","vei","veh","vee","feh","fa","soa","su","sua","sou","se","seh","twa","twe","twi",
"ahm","lea","lee","nae","nah","pa","pau","fae","fai","soh","mou","ahe","ll","ea","ai","thi",
"hie","zei","zie","ize","ehy","uy","oya","dor","di","ja","ej","er","um","in","qu","is","re",
"nt","ti","us","it","en","at","tu","te","ri","es","et","ra","ta","an","ni","li","on","or","se",
"am","ae","ia","di","ue","em","ar","ui","st","si","de","ci","iu","ne","pe","co","os","ur","ru")
// Criminal language.
/datum/language/gutter
@@ -120,4 +119,8 @@
signlang_verb = list("gestures")
colour = "say_quote"
key = "s"
flags = SIGNLANG|NO_STUTTER|NONVERBAL
flags = SIGNLANG|NO_STUTTER|NONVERBAL
/datum/language/sign/can_speak_special(var/mob/speaker)
var/obj/item/organ/external/hand/hands = locate() in speaker //you can't sign without hands
return (hands || !iscarbon(speaker))
@@ -177,6 +177,7 @@
/obj/item/device/mmi/digital/New()
src.brainmob = new(src)
src.brainmob.add_language("Robot Talk")
src.brainmob.add_language(LANGUAGE_GALCOM)
src.brainmob.add_language(LANGUAGE_EAL)
src.brainmob.loc = src
src.brainmob.container = src
@@ -58,7 +58,7 @@
return canmove
/mob/living/carbon/brain/isSynthetic()
return istype(loc, /obj/item/device/mmi/digital)
return istype(loc, /obj/item/device/mmi)
/mob/living/carbon/brain/binarycheck()
return isSynthetic()
@@ -10,6 +10,11 @@
var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
var/last_push_time //For human_attackhand.dm, keeps track of the last use of disarm
var/spitting = 0 //Spitting and spitting related things. Any human based ranged attacks, be it innate or added abilities.
var/spit_projectile = null //Projectile type.
var/spit_name = null //String
var/last_spit = 0 //Timestamp.
/mob/living/carbon/human/New(var/new_loc, var/new_species = null)
if(!dna)
@@ -258,6 +263,7 @@
// called when something steps onto a human
// this handles mulebots and vehicles
// and now mobs on fire
/mob/living/carbon/human/Crossed(var/atom/movable/AM)
if(istype(AM, /mob/living/bot/mulebot))
var/mob/living/bot/mulebot/MB = AM
@@ -267,6 +273,8 @@
var/obj/vehicle/V = AM
V.RunOver(src)
spread_fire(AM)
// Get rank from ID, ID inside PDA, PDA, ID in wallet, etc.
/mob/living/carbon/human/proc/get_authentification_rank(var/if_no_id = "No id", var/if_no_job = "No job")
var/obj/item/device/pda/pda = wear_id
@@ -1528,6 +1536,9 @@
/mob/living/carbon/human/is_muzzled()
return (wear_mask && (istype(wear_mask, /obj/item/clothing/mask/muzzle) || istype(src.wear_mask, /obj/item/weapon/grenade)))
/mob/living/carbon/human/get_fire_icon_state()
return species.fire_icon_state
// Called by job_controller. Makes drones start with a permit, might be useful for other people later too.
/mob/living/carbon/human/equip_post_job()
var/braintype = get_FBP_type()
@@ -80,6 +80,12 @@
amount += O.brute_dam
return amount
/mob/living/carbon/human/getActualBruteLoss()
var/amount = 0
for(var/obj/item/organ/external/O in organs) // Unlike the above, robolimbs DO count.
amount += O.brute_dam
return amount
/mob/living/carbon/human/getFireLoss()
var/amount = 0
for(var/obj/item/organ/external/O in organs)
@@ -96,6 +102,12 @@
amount += O.burn_dam
return amount
/mob/living/carbon/human/getActualFireLoss()
var/amount = 0
for(var/obj/item/organ/external/O in organs) // Unlike the above, robolimbs DO count.
amount += O.burn_dam
return amount
/mob/living/carbon/human/adjustBruteLoss(var/amount)
amount = amount*species.brute_mod
if(amount > 0)
+29 -22
View File
@@ -4,7 +4,7 @@
#define HUMAN_MAX_OXYLOSS 1 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it.
#define HUMAN_CRIT_MAX_OXYLOSS ( 2.0 / 6) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 50HP to get through, so (1/6)*last_tick_duration per second. Breaths however only happen every 4 ticks. last_tick_duration = ~2.0 on average
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
#define HEAT_DAMAGE_LEVEL_1 5 //Amount of damage applied when your body temperature just passes the 360.15k safety point
#define HEAT_DAMAGE_LEVEL_2 10 //Amount of damage applied when your body temperature passes the 400K point
#define HEAT_DAMAGE_LEVEL_3 20 //Amount of damage applied when your body temperature passes the 1000K point
@@ -622,31 +622,35 @@
if(bodytemperature >= species.heat_level_1)
//Body temperature is too hot.
fire_alert = max(fire_alert, 1)
if(status_flags & GODMODE) return 1 //godmode
if(status_flags & GODMODE)
return 1 //godmode
var/burn_dam = 0
switch(bodytemperature)
if(species.heat_level_1 to species.heat_level_2)
burn_dam = HEAT_DAMAGE_LEVEL_1
if(species.heat_level_2 to species.heat_level_3)
burn_dam = HEAT_DAMAGE_LEVEL_2
if(species.heat_level_3 to INFINITY)
burn_dam = HEAT_DAMAGE_LEVEL_3
// switch() can't access numbers inside variables, so we need to use some ugly if() spam ladder.
if(bodytemperature >= species.heat_level_3)
burn_dam = HEAT_DAMAGE_LEVEL_3
else if(bodytemperature >= species.heat_level_2)
burn_dam = HEAT_DAMAGE_LEVEL_2
else if(bodytemperature >= species.heat_level_1)
burn_dam = HEAT_DAMAGE_LEVEL_1
take_overall_damage(burn=burn_dam, used_weapon = "High Body Temperature")
fire_alert = max(fire_alert, 2)
else if(bodytemperature <= species.cold_level_1)
fire_alert = max(fire_alert, 1)
if(status_flags & GODMODE) return 1 //godmode
if(status_flags & GODMODE)
return 1 //godmode
if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
var/burn_dam = 0
switch(bodytemperature)
if(species.cold_level_1 to species.cold_level_2)
burn_dam = COLD_DAMAGE_LEVEL_1
if(species.cold_level_2 to species.cold_level_3)
burn_dam = COLD_DAMAGE_LEVEL_2
if(species.cold_level_3 to -INFINITY)
burn_dam = COLD_DAMAGE_LEVEL_3
if(bodytemperature <= species.cold_level_3)
burn_dam = COLD_DAMAGE_LEVEL_3
else if(bodytemperature <= species.cold_level_2)
burn_dam = COLD_DAMAGE_LEVEL_2
else if(bodytemperature <= species.heat_level_1)
burn_dam = COLD_DAMAGE_LEVEL_1
take_overall_damage(burn=burn_dam, used_weapon = "Low Body Temperature")
fire_alert = max(fire_alert, 1)
@@ -1183,7 +1187,7 @@
// Apply a fire overlay if we're burning.
if(on_fire)
health_images += image('icons/mob/screen1_health.dmi',"burning")
health_images += image('icons/mob/OnFire.dmi',"[get_fire_icon_state()]")
// Show a general pain/crit indicator if needed.
if(trauma_val)
@@ -1683,14 +1687,17 @@
if(..())
return
var/burn_temperature = fire_burn_temperature()
var/thermal_protection = get_heat_protection(burn_temperature)
var/thermal_protection = get_heat_protection(fire_stacks * 1500) // Arbitrary but below firesuit max temp when below 20 stacks.
if (thermal_protection < 1 && bodytemperature < burn_temperature)
bodytemperature += round(BODYTEMP_HEATING_MAX*(1-thermal_protection), 1)
if(thermal_protection == 1) // Immune.
return
else
bodytemperature += (BODYTEMP_HEATING_MAX + (fire_stacks * 15)) * (1-thermal_protection)
/mob/living/carbon/human/rejuvenate()
restore_blood()
shock_stage = 0
traumatic_shock = 0
..()
#undef HUMAN_MAX_OXYLOSS
@@ -14,6 +14,7 @@
var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set.
var/speech_bubble_appearance = "normal" // Part of icon_state to use for speech bubbles when talking. See talk.dmi for available icons.
var/fire_icon_state = "humanoid" // The icon_state used inside OnFire.dmi for when on fire.
// Damage overlay and masks.
var/damage_overlays = 'icons/mob/human_races/masks/dam_human.dmi'
@@ -20,6 +20,7 @@
dusted_anim = "dust-m"
death_message = "lets out a faint chimper as it collapses and stops moving..."
tail = "chimptail"
fire_icon_state = "monkey"
unarmed_types = list(/datum/unarmed_attack/bite, /datum/unarmed_attack/claws)
inherent_verbs = list(/mob/living/proc/ventcrawl)
@@ -21,10 +21,8 @@ var/datum/species/shapeshifter/promethean/prometheans
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL
flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
health_hud_intensity = 2
num_alternate_languages = 3
@@ -139,7 +137,12 @@ var/datum/species/shapeshifter/promethean/prometheans
if(istype(T))
var/obj/effect/decal/cleanable/C = locate() in T
if(C)
if(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)))
return
qdel(C)
if (istype(T, /turf/simulated))
var/turf/simulated/S = T
S.dirt = 0
H.nutrition += rand(15, 45)
VOREStation Removal End */
// Heal remaining damage.
@@ -32,6 +32,8 @@
damage_mask = 'icons/mob/human_races/masks/dam_mask_seromi.dmi'
blood_mask = 'icons/mob/human_races/masks/blood_seromi.dmi'
fire_icon_state = "generic" // Humanoid is too big for them and spriting a new one is really annoying.
slowdown = -1
total_health = 50
brute_mod = 1.35
@@ -124,6 +124,29 @@
new /obj/effect/alien/weeds/node(loc)
return
/mob/living/carbon/human/proc/Spit(var/atom/A)
if((last_spit + 1 SECONDS) > world.time) //To prevent YATATATATATAT spitting.
to_chat(src, "<span class='warning'>You have not yet prepared your chemical glands. You must wait before spitting again.</span>")
return
else
last_spit = world.time
if(spitting && incapacitated(INCAPACITATION_DISABLED))
to_chat(src, "You cannot spit in your current state.")
spitting = 0
return
else if(spitting)
if(!check_alien_ability(20,0,O_ACID))
spitting = 0
return
visible_message("<span class='warning'>[src] spits [spit_name] at \the [A]!</span>", "<span class='alium'>You spit [spit_name] at \the [A].</span>")
var/obj/item/projectile/P = new spit_projectile(get_turf(src))
P.firer = src
P.launch(A)
playsound(loc, 'sound/weapons/pierce.ogg', 25, 0)
else
..()
/mob/living/carbon/human/proc/corrosive_acid(O as obj|turf in oview(1)) //If they right click to corrode, an error will flash if its an invalid target./N
set name = "Corrosive Acid (200)"
set desc = "Drench an object in acid, destroying it over time."
@@ -160,43 +183,47 @@
return
/mob/living/carbon/human/proc/neurotoxin(mob/target as mob in oview())
set name = "Spit Neurotoxin (40)"
set desc = "Spits neurotoxin at someone, paralyzing them for a short time if they are not wearing protective gear."
/mob/living/carbon/human/proc/neurotoxin()
set name = "Toggle Neurotoxic Spit (40)"
set desc = "Readies a neurotoxic spit, which paralyzes the target for a short time if they are not wearing protective gear."
set category = "Abilities"
if(spitting)
to_chat(src, "<span class='alium'>You stop preparing to spit.</span>")
spitting = 0
return
if(!check_alien_ability(40,0,O_ACID))
spitting = 0
return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
src << "You cannot spit neurotoxin in your current state."
return
else
last_spit = world.time
spitting = 1
spit_projectile = /obj/item/projectile/energy/neurotoxin
spit_name = "neurotoxin"
to_chat(src, "<span class='alium'>You prepare to spit neurotoxin.</span>")
visible_message("<span class='warning'>[src] spits neurotoxin at [target]!</span>", "<span class='alium'>You spit neurotoxin at [target].</span>")
var/obj/item/projectile/energy/neurotoxin/A = new(get_turf(src))
A.firer = src
A.launch(target)
return
/mob/living/carbon/human/proc/acidspit(mob/target as mob in oview())
set name = "Spit Acid (50)"
set desc = "Spits a blob of acid at someone, burning them if they are not wearing protective gear."
/mob/living/carbon/human/proc/acidspit()
set name = "Toggle Acid Spit (50)"
set desc = "Readies an acidic spit, which burns the target if they are not wearing protective gear."
set category = "Abilities"
if(spitting)
to_chat(src, "<span class='alium'>You stop preparing to spit.</span>")
spitting = 0
return
if(!check_alien_ability(50,0,O_ACID))
spitting = 0
return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
src << "You cannot spit acid in your current state."
return
visible_message("<span class='warning'>[src] spits acid at [target]!</span>", "<span class='alium'>You spit acid at [target].</span>")
var/obj/item/projectile/energy/acid/A = new(get_turf(src))
A.firer = src
A.launch(target)
return
else
last_spit = world.time
spitting = 1
spit_projectile = /obj/item/projectile/energy/acid
spit_name = "acid"
to_chat(src, "<span class='alium'>You prepare to spit acid.</span>")
/mob/living/carbon/human/proc/resin() // -- TLE
set name = "Secrete Resin (75)"
@@ -11,7 +11,7 @@
has_fine_manipulation = 0
siemens_coefficient = 0
gluttonous = 3
gluttonous = 2
brute_mod = 0.5 // Hardened carapace.
burn_mod = 2 // Weak to fire.
@@ -200,7 +200,6 @@
..()
/datum/species/xenos/hunter
name = "Xenomorph Hunter"
weeds_plasma_rate = 5
caste_name = "hunter"
@@ -16,10 +16,12 @@ proc/create_new_xenomorph(var/alien_caste,var/target)
h_style = "Bald"
faction = "xeno"
..(new_loc, "Xenomorph Sentinel")
/mob/living/carbon/human/xhunter/New(var/new_loc)
h_style = "Bald"
faction = "xeno"
..(new_loc, "Xenomorph Hunter")
/mob/living/carbon/human/xqueen/New(var/new_loc)
h_style = "Bald"
faction = "xeno"
@@ -1169,7 +1169,7 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/update_fire(var/update_icons=1)
overlays_standing[FIRE_LAYER] = null
if(on_fire)
overlays_standing[FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"=FIRE_LAYER)
overlays_standing[FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state" = get_fire_icon_state(), "layer"=FIRE_LAYER)
if(update_icons) update_icons()
+13
View File
@@ -52,6 +52,9 @@ default behaviour is:
if (istype(AM, /mob/living))
var/mob/living/tmob = AM
//Even if we don't push/swap places, we "touched" them, so spread fire
spread_fire(tmob)
for(var/mob/living/M in range(tmob, 1))
if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
if ( !(world.time % 5) )
@@ -236,6 +239,9 @@ default behaviour is:
/mob/living/proc/getShockBruteLoss() //Only checks for things that'll actually hurt (not robolimbs)
return bruteloss
/mob/living/proc/getActualBruteLoss() // Mostly for humans with robolimbs.
return getBruteLoss()
/mob/living/proc/adjustBruteLoss(var/amount)
if(status_flags & GODMODE) return 0 //godmode
@@ -304,6 +310,9 @@ default behaviour is:
/mob/living/proc/getShockFireLoss() //Only checks for things that'll actually hurt (not robolimbs)
return fireloss
/mob/living/proc/getActualFireLoss() // Mostly for humans with robolimbs.
return getBruteLoss()
/mob/living/proc/adjustFireLoss(var/amount)
if(status_flags & GODMODE) return 0 //godmode
if(amount > 0)
@@ -995,6 +1004,10 @@ default behaviour is:
return FALSE
return TRUE
// Gets the correct icon_state for being on fire. See OnFire.dmi for the icons.
/mob/living/proc/get_fire_icon_state()
return "generic"
// Called by job_controller.
/mob/living/proc/equip_post_job()
return
+22
View File
@@ -351,6 +351,28 @@
adjust_fire_stacks(2)
IgniteMob()
//Share fire evenly between the two mobs
//Called in MobCollide() and Crossed()
/mob/living/proc/spread_fire(mob/living/L)
return
// This is commented out pending discussion on Polaris. If you're a downsteam and you want people to spread fire by touching each other, feel free to uncomment this.
/*
if(!istype(L))
return
var/L_old_on_fire = L.on_fire
if(on_fire) //Only spread fire stacks if we're on fire
fire_stacks /= 2
L.fire_stacks += fire_stacks
if(L.IgniteMob())
message_admins("[key_name(src)] bumped into [key_name(L)] and set them on fire.")
if(L_old_on_fire) //Only ignite us and gain their stacks if they were onfire before we bumped them
L.fire_stacks /= 2
fire_stacks += L.fire_stacks
IgniteMob()
*/
/mob/living/proc/get_cold_protection()
return 0
@@ -343,9 +343,9 @@
return canmove
/mob/living/silicon/robot/update_fire()
overlays -= image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing")
overlays -= image("icon"='icons/mob/OnFire.dmi', "icon_state" = get_fire_icon_state())
if(on_fire)
overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing")
overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state" = get_fire_icon_state())
/mob/living/silicon/robot/fire_act()
if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them
@@ -355,5 +355,5 @@
. = ..()
if(. == FALSE) // If no other light sources are on.
if(lights_on)
set_light(integrated_light_power, integrated_light_power, "#FFFFFF")
set_light(integrated_light_power, 1, "#FFFFFF")
return TRUE
@@ -102,6 +102,7 @@
spark_system.attach(src)
add_language("Robot Talk", 1)
add_language(LANGUAGE_GALCOM, 1)
add_language(LANGUAGE_EAL, 1)
wires = new(src)
@@ -219,6 +220,12 @@
var/turf/T = get_turf(loc)//To hopefully prevent run time errors.
if(T) mmi.loc = T
if(mmi.brainmob)
var/obj/item/weapon/robot_module/M = locate() in contents
if(M)
mmi.brainmob.languages = M.original_languages
else
mmi.brainmob.languages = languages
mmi.brainmob.remove_language("Robot Talk")
mind.transfer_to(mmi.brainmob)
else
src << "<span class='danger'>Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug.</span>"
+1 -1
View File
@@ -232,7 +232,7 @@
default_str = " - <a href='byond://?src=\ref[src];default_lang=\ref[L]'>set default</a>"
var/synth = (L in speech_synthesizer_langs)
dat += "<b>[L.name] (:[L.key])</b>[synth ? default_str : null]<br/>Speech Synthesizer: <i>[synth ? "YES" : "NOT SUPPORTED"]</i><br/>[L.desc]<br/><br/>"
dat += "<b>[L.name] ([get_language_prefix()][L.key])</b>[synth ? default_str : null]<br/>Speech Synthesizer: <i>[synth ? "YES" : "NOT SUPPORTED"]</i><br/>[L.desc]<br/><br/>"
src << browse(dat, "window=checklanguage")
return
@@ -78,6 +78,22 @@
poison_per_bite = 5
/mob/living/simple_animal/hostile/giant_spider/frost
desc = "Icy and blue, it makes you shudder to look at it. This one has brilliant blue eyes."
icon_state = "frost"
icon_living = "frost"
icon_dead = "frost_dead"
maxHealth = 175
health = 175
melee_damage_lower = 15
melee_damage_upper = 20
poison_per_bite = 5
poison_type = "cryotoxin"
/mob/living/simple_animal/hostile/giant_spider/New(var/location, var/atom/parent)
get_light_and_color(parent)
..()
@@ -234,6 +250,7 @@
busy = 0
stop_automated_movement = 0
#undef SPINNING_WEB
#undef LAYING_EGGS
#undef MOVING_TO_TARGET
@@ -96,7 +96,7 @@
if(!stat)
var/mob/M = AM
M << "<font color='blue'>\icon[src] Squeek!</font>"
M << 'sound/effects/mouse_squeak_loud.ogg'
M << 'sound/effects/mouse_squeak.ogg'
..()
/mob/living/simple_animal/mouse/death()
@@ -150,6 +150,7 @@
src.mind.key = M.brainmob.key
src.ckey = M.brainmob.ckey
src.name = "spider-bot ([M.brainmob.name])"
src.languages = M.brainmob.languages
/mob/living/simple_animal/spiderbot/proc/explode() //When emagged.
src.visible_message("<span class='danger'>\The [src] makes an odd warbling noise, fizzles, and explodes!</span>")
@@ -1001,6 +1001,7 @@
//Follow a target (and don't attempt to murder it horribly)
/mob/living/simple_animal/proc/FollowTarget()
ai_log("FollowTarget() [follow_mob]",1)
stop_automated_movement = 1
//If we were chasing someone and we can't anymore, give up.
if(!follow_mob || follow_mob.stat)
ai_log("FollowTarget() Losing follow at top",2)
@@ -1331,6 +1332,7 @@
//Forget a follow mode
/mob/living/simple_animal/proc/LoseFollow()
ai_log("LoseFollow() [target_mob]",2)
stop_automated_movement = 0
follow_mob = null
handle_stance(STANCE_IDLE)
GiveUpMoving()
@@ -1,11 +1,16 @@
/mob/living/simple_animal/slime/FindTarget()
if(victim) // Don't worry about finding another target if we're eatting someone.
return
// if(!will_hunt())
// return
if(follow_mob && can_command(follow_mob)) // If following someone, don't attack until the leader says so, something hits you, or the leader is no longer worthy.
return
..()
/mob/living/simple_animal/slime/special_target_check(mob/living/L)
if(L.faction == faction && !attack_same)
return FALSE
if(L in friends)
return FALSE
if(istype(L, /mob/living/simple_animal/slime))
var/mob/living/simple_animal/slime/buddy = L
if(buddy.slime_color == src.slime_color || discipline || unity || buddy.unity)
@@ -47,12 +52,3 @@
return
else
..()
/*
/mob/living/simple_animal/slime/proc/will_hunt() // Check for being stopped from feeding and chasing
if(nutrition <= get_starve_nutrition() || rabid)
return TRUE
if(nutrition <= get_hunger_nutrition() || prob(25))
return TRUE
return FALSE
*/
@@ -97,16 +97,21 @@
// This is to make slime responses feel a bit more natural and not instant.
/mob/living/simple_animal/slime/proc/delayed_say(var/message, var/mob/target)
sleep(rand(1 SECOND, 2 SECONDS))
if(target)
face_atom(target)
say(message)
spawn(rand(1 SECOND, 2 SECONDS))
if(target)
face_atom(target)
say(message)
//Commands, reactions, etc
/mob/living/simple_animal/slime/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
..()
if((findtext(message, num2text(number)) || findtext(message, name) || findtext(message, "slimes"))) // Talking to us
// First make sure it's not just another slime repeating things.
if(istype(speaker, /mob/living/simple_animal/slime))
if(!speaker.client)
return
// Say hello back.
if(findtext(message, "hello") || findtext(message, "hi") || findtext(message, "greetings"))
delayed_say(pick("Hello...", "Hi..."), speaker)
@@ -142,33 +147,31 @@
adjust_discipline(1, TRUE)
if(follow_mob) // We're being asked to stop following someone.
if(follow_mob == speaker)
if(can_command(speaker) == SLIME_COMMAND_FRIEND || follow_mob == speaker)
delayed_say("Yes... I'll stop...", speaker)
LoseFollow()
else
delayed_say("No... I'll keep following \the [follow_mob]...", speaker)
// Help request
if(findtext(message, "help"))
if(!can_command(speaker))
delayed_say("No...", speaker)
return
else
delayed_say("I will protect \the [speaker].", speaker)
// Murder request
if(findtext(message, "harm") || findtext(message, "kill") || findtext(message, "murder") || findtext(message, "eat") || findtext(message, "consume"))
if(!can_command(speaker))
if(can_command(speaker) < SLIME_COMMAND_FACTION)
delayed_say("No...", speaker)
return
//LoseFollow()
/*
if(reacts && speaker && (message in reactions) && (!hostile || isliving(speaker)) && say_understands(speaker,language))
var/mob/living/L = speaker
if(L.faction == faction)
spawn(10)
face_atom(speaker)
say(reactions[message])
*/
for(var/mob/living/L in view(7, src) - list(src, speaker))
if(L == src)
continue // Don't target ourselves.
var/list/valid_names = splittext(L.name, " ") // Should output list("John", "Doe") as an example.
for(var/line in valid_names) // Check each part of someone's name.
if(findtext(message, lowertext(line))) // If part of someone's name is in the command, the slime targets them if allowed to.
if(special_target_check(L))
delayed_say("Okay... I attack \the [L]...", speaker)
LoseFollow()
set_target(L)
return
else
delayed_say("No... I won't attack \the [L].", speaker)
return
// If we're here, it couldn't find anyone with that name.
delayed_say("No... I don't know who to attack...", speaker)
@@ -34,6 +34,7 @@
max_n2 = 0
unsuitable_atoms_damage = 0
response_help = "pets"
speak = list(
"Blorp...",
@@ -297,6 +298,24 @@
if(is_adult)
if(amount_grown >= 10)
// Check if there's enough 'room' to split.
var/list/nearby_things = orange(1, src)
var/free_tiles = 0
for(var/turf/T in nearby_things)
var/free = TRUE
if(T.density) // No walls.
continue
for(var/atom/movable/AM in T)
if(AM.density)
free = FALSE
break
if(free)
free_tiles++
if(free_tiles < 3) // Three free tiles are needed, as four slimes are made and the 4th tile is from the center tile that the current slime occupies.
to_chat(src, "<span class='warning'>It is too cramped here to reproduce...</span>")
return
var/list/babies = list()
for(var/i = 1 to 4)
@@ -352,13 +371,13 @@
if(rabid)
return FALSE
if(docile)
return TRUE
return SLIME_COMMAND_OBEY
if(commander in friends)
return TRUE
return SLIME_COMMAND_FRIEND
if(faction == commander.faction)
return TRUE
return SLIME_COMMAND_FACTION
if(discipline > resentment && obedience >= 5)
return TRUE
return SLIME_COMMAND_OBEY
return FALSE
/mob/living/simple_animal/slime/proc/give_hat(var/obj/item/clothing/head/new_hat, var/mob/living/user)
@@ -200,12 +200,15 @@
var/cold_factor = abs(protection - 1)
var/delta = -20
delta *= cold_factor
L.bodytemperature = max(50, delta)
L.bodytemperature = max(50, L.bodytemperature + delta)
var/turf/T = get_turf(src)
var/datum/gas_mixture/env = T.return_air()
if(env)
env.add_thermal_energy(-10 * 1000)
/mob/living/simple_animal/slime/dark_blue/get_cold_protection()
return 1 // This slime is immune to cold.
/mob/living/simple_animal/slime/silver
desc = "This slime is shiny, and can deflect lasers or other energy weapons directed at it."
@@ -513,8 +516,16 @@
/datum/modifier/slime_heal/tick()
if(holder.stat == DEAD) // Required or else simple animals become immortal.
expire()
holder.adjustBruteLoss(-2)
holder.adjustFireLoss(-2)
if(ishuman(holder)) // Robolimbs need this code sadly.
var/mob/living/carbon/human/H = holder
for(var/obj/item/organ/external/E in H.organs)
var/obj/item/organ/external/O = E
O.heal_damage(2, 2, 0, 1)
else
holder.adjustBruteLoss(-2)
holder.adjustFireLoss(-2)
holder.adjustToxLoss(-2)
holder.adjustOxyLoss(-2)
holder.adjustCloneLoss(-1)
@@ -683,6 +694,7 @@
slime_color = "rainbow"
coretype = /obj/item/slime_extract/rainbow
icon_state_override = "rainbow"
unity = TRUE
description_info = "This slime is considered to be the same color as all other slime colors at the same time for the purposes of \
other slimes being friendly to them, and therefore will never be harmed by another slime. \
@@ -29,7 +29,7 @@
var/gender = NEUTER
// Restrict some styles to specific species
var/list/species_allowed = list("Human")
var/list/species_allowed = list("Human","Promethean")
// Whether or not the accessory can be affected by colouration
var/do_colouration = 1
@@ -51,7 +51,7 @@
name = "Bald"
icon_state = "bald"
gender = MALE
species_allowed = list("Human","Unathi")
species_allowed = list("Human","Unathi","Promethean")
short
name = "Short Hair" // try to capatilize the names please~
@@ -188,6 +188,10 @@
name = "Bedhead 3"
icon_state = "hair_bedheadv3"
bedheadlong
name = "Bedhead Long"
icon_state = "hair_long_bedhead"
beehive
name = "Beehive"
icon_state = "hair_beehive"
@@ -616,6 +620,30 @@
manbun
name = "Manbun"
icon_state = "hair_manbun"
shy
name = "Shy"
icon_state = "hair_shy"
jade
name = "Jade"
icon_state = "hair_jade"
country
name = "Country"
icon_state = "hair_country"
rosa
name = "Rosa"
icon_state = "hair_rosa"
dave
name = "Dave"
icon_state = "hair_dave"
mohawkunshaven
name = "Unshaven Mohawk"
icon_state = "hair_unshaven_mohawk"
/*
///////////////////////////////////
/ =---------------------------= /
@@ -632,7 +660,7 @@
name = "Shaved"
icon_state = "bald"
gender = NEUTER
species_allowed = list("Human","Unathi","Tajara","Skrell", "Machine","Teshari", "Vox")
species_allowed = list("Human","Unathi","Tajara","Skrell", "Machine","Teshari", "Vox","Promethean")
watson
name = "Watson Mustache"
@@ -703,7 +731,7 @@
name = "Dwarf Beard"
icon_state = "facial_dwarf"
threeOclock
threeOclock
name = "3 O'clock Shadow"
icon_state = "facial_3oclock"
@@ -746,6 +774,18 @@
chinless
name = "Chinless Beard"
icon_state = "facial_chinlessbeard"
tribeard
name = "Tribeard"
icon_state = "facial_tribeard"
moonshiner
name = "Moonshiner"
icon_state = "facial_moonshiner"
martial
name = "Martial Artist"
icon_state = "facial_martialartist"
/*
///////////////////////////////////
/ =---------------------------= /
+10
View File
@@ -77,6 +77,11 @@
else
O.key = key
if(O.client && O.client.prefs)
var/datum/preferences/B = O.client.prefs
for(var/language in B.alternate_languages)
O.add_language(language)
if(move)
var/obj/loc_landmark
for(var/obj/effect/landmark/start/sloc in landmarks_list)
@@ -154,6 +159,11 @@
O.mmi.transfer_identity(src)
if(O.client && O.client.prefs)
var/datum/preferences/B = O.client.prefs
for(var/language in B.alternate_languages)
O.add_language(language)
callHook("borgify", list(O))
O.Namepick()
+2
View File
@@ -82,6 +82,8 @@
if(H.mind)
H.mind.transfer_to(brainmob)
brainmob.languages = H.languages
brainmob << "<span class='notice'>You feel slightly disoriented. That's normal when you're just \a [initial(src.name)].</span>"
callHook("debrain", list(brainmob))
+3 -2
View File
@@ -78,8 +78,9 @@ var/list/organ_cache = list()
/obj/item/organ/proc/set_dna(var/datum/dna/new_dna)
if(new_dna)
dna = new_dna.Clone()
blood_DNA.Cut()
blood_DNA[dna.unique_enzymes] = dna.b_type
if(blood_DNA)
blood_DNA.Cut()
blood_DNA[dna.unique_enzymes] = dna.b_type
/obj/item/organ/proc/die()
if(robotic >= ORGAN_ROBOT)
+47 -2
View File
@@ -74,6 +74,12 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
unavailable_to_build = 1
parts = list(BP_HEAD)
/datum/robolimb/bishop_alt2
company = "Bishop - Rook"
desc = "This limb has a solid plastic casing with blue lights along it."
icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_alt2.dmi'
unavailable_to_build = 1
/datum/robolimb/bishop_monitor
company = "Bishop Monitor"
desc = "Bishop Cybernetics' unique spin on a popular prosthetic head model. The themes conflict in an intriguing way."
@@ -82,6 +88,19 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
parts = list(BP_HEAD)
monitor_styles = standard_monitor_styles
/datum/robolimb/cybersolutions
company = "Cyber Solutions"
desc = "This limb is grey and rough, with little in the way of aesthetic."
icon = 'icons/mob/human_races/cyberlimbs/cybersolutions/cybersolutions_main.dmi'
unavailable_to_build = 1
/datum/robolimb/cybersolutions_alt1
company = "Cyber Solutions - Array"
desc = "This limb is simple and functional; array of sensors on a featureless case."
icon = 'icons/mob/human_races/cyberlimbs/cybersolutions/cybersolutions_alt1.dmi'
unavailable_to_build = 1
parts = list(BP_HEAD)
/datum/robolimb/grayson
company = "Grayson"
desc = "This limb has a sturdy and heavy build to it."
@@ -131,6 +150,13 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
rgb=hephaestus_alt_rgb;\
rainbow=hephaestus_alt_rainbow"
/datum/robolimb/hephaestus_alt2
company = "Hephaestus - Athena"
desc = "This rather thick limb has a militaristic green plating."
icon = 'icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_alt2.dmi'
unavailable_to_build = 1
/datum/robolimb/hephaestus_monitor
company = "Hephaestus Monitor"
desc = "Hephaestus' unique spin on a popular prosthetic head model. It looks rugged and sturdy."
@@ -182,6 +208,13 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
unavailable_to_build = 1
parts = list(BP_HEAD)
/datum/robolimb/wardtakahashi_alt2
company = "Ward-Takahashi - Spirit"
desc = "This limb has white and purple features, with a heavier casing."
icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt2.dmi'
unavailable_to_build = 1
/datum/robolimb/wardtakahashi_monitor
company = "Ward-Takahashi Monitor"
desc = "Ward-Takahashi's unique spin on a popular prosthetic head model. It looks sleek and modern."
@@ -197,14 +230,23 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
unavailable_to_build = 1
/datum/robolimb/xion_alt1
company = "Xion Mfg. - Breach"
company = "Xion - Breach"
desc = "This limb has a minimalist black and red casing. Looks a bit menacing."
icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt1.dmi'
unavailable_to_build = 1
parts = list(BP_HEAD)
/datum/robolimb/xion_alt2
company = "Xion - Hull"
desc = "This limb has a thick orange casing with steel plating."
icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt2.dmi'
unavailable_to_build = 1
monitor_styles = "blank=xion_off;\
green=xion_green;\
rgb=xion_rgb"
/datum/robolimb/xion_monitor
company = "Xion Mfg. Monitor"
company = "Xion Monitor"
desc = "Xion Mfg.'s unique spin on a popular prosthetic head model. It looks and minimalist and utilitarian."
icon = 'icons/mob/human_races/cyberlimbs/xion/xion_monitor.dmi'
unavailable_to_build = 1
@@ -232,6 +274,9 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
/obj/item/weapon/disk/limb/bishop
company = "Bishop"
/obj/item/weapon/disk/limb/cybersolutions
company = "Cyber Solutions"
/obj/item/weapon/disk/limb/grayson
company = "Grayson"
+7 -1
View File
@@ -62,6 +62,8 @@
stored_mmi.icon_state = "mmi_full"
icon_state = stored_mmi.icon_state
stored_mmi.brainmob.languages = owner.languages
if(owner && owner.stat == DEAD)
owner.stat = 0
dead_mob_list -= owner
@@ -92,6 +94,8 @@
stored_mmi.icon_state = "posibrain-occupied"
icon_state = stored_mmi.icon_state
stored_mmi.brainmob.languages = owner.languages
/obj/item/organ/internal/mmi_holder/robot
name = "digital brain interface"
brain_type = /obj/item/device/mmi/digital/robot
@@ -100,4 +104,6 @@
/obj/item/organ/internal/mmi_holder/robot/update_from_mmi()
..()
stored_mmi.icon_state = "mainboard"
icon_state = stored_mmi.icon_state
icon_state = stored_mmi.icon_state
stored_mmi.brainmob.languages = owner.languages
+5 -3
View File
@@ -85,10 +85,12 @@
return src.damage / src.amount
proc/can_autoheal()
if(is_treated())
return TRUE
if(src.wound_damage() <= autoheal_cutoff)
return 1
return is_treated()
if(created + 10 MINUTES > world.time) // Wounds don't autoheal for ten minutes if not bandaged.
return FALSE
return TRUE
// checks whether the wound has been appropriately treated
proc/is_treated()
@@ -83,6 +83,7 @@
switch(handle_casings)
if(EJECT_CASINGS) //eject casing onto ground.
chambered.loc = get_turf(src)
playsound(src.loc, "casing", 50, 1)
if(CYCLE_CASINGS) //cycle the casing back to the end.
if(ammo_magazine)
ammo_magazine.stored_ammo += chambered
@@ -1960,7 +1960,7 @@
druggy = 30
glass_name = "Manhattan Project"
glass_desc = "A scienitst drink of choice, for thinking how to blow up the station."
glass_desc = "A scientist's drink of choice, for thinking how to blow up the station."
/datum/reagent/ethanol/manly_dorf
name = "The Manly Dorf"
@@ -2279,7 +2279,7 @@
description = "Alcohol in more alcohol."
taste_description = "thick, dry alcohol"
color = "#FFFF7F"
strength = 15
strength = 12
nutriment_factor = 1
glass_name = "Sake Bomb"
@@ -2403,7 +2403,7 @@
description = "From Shelf. Not for human consumption."
taste_description = "oily bitterness"
color = "#d3d3d3"
strength = 36
strength = 32
glass_name = "Debugger"
glass_desc = "From Shelf. Not for human consumption."
@@ -672,3 +672,25 @@
if(dose > 10)
M.make_dizzy(5)
M.make_jittery(5)
/datum/reagent/qerr_quem
name = "Qerr-quem"
id = "querr_quem"
description = "A potent stimulant and anti-anxiety medication, made for the Qerr-Katish."
taste_description = "mint"
reagent_state = LIQUID
color = "#e6efe3"
metabolism = 0.01
mrate_static = TRUE
data = 0
/datum/reagent/qerr_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA)
return
if(volume <= 0.1 && data != -1)
data = -1
to_chat(M, "<span class='warning'>You feel antsy, your concentration wavers...</span>")
else
if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY)
data = world.time
to_chat(M, "<span class='notice'>You feel invigorated and calm.</span>")
@@ -69,7 +69,7 @@
return
T.assume_gas("phoron", ceil(volume/2), T20C)
for(var/turf/simulated/floor/target_tile in range(0,T))
target_tile.assume_gas("volatile_fuel", volume/2, 400+T0C)
target_tile.assume_gas("phoron", volume/2, 400+T0C)
spawn (0) target_tile.hotspot_expose(700, 400)
remove_self(volume)
@@ -131,6 +131,20 @@
M.adjustOxyLoss(20 * removed)
M.sleeping += 1
/datum/reagent/toxin/mold
name = "Mold"
id = "mold"
description = "A mold is a fungus that causes biodegradation of natural materials. This varient contains mycotoxins, and is dangerous to humans."
taste_description = "mold"
reagent_state = SOLID
strength = 5
/datum/reagent/toxin/mold/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
..()
M.adjustToxLoss(strength * removed)
if(prob(5))
M.vomit()
/datum/reagent/toxin/stimm //Homemade Hyperzine
name = "Stimm"
id = "stimm"
@@ -648,6 +662,33 @@
reagent_state = LIQUID
color = "#181818"
/datum/reagent/talum_quem
name = "Talum-quem"
id = "talum_quem"
description = " A very carefully tailored hallucinogen, for use of the Talum-Katish."
taste_description = "bubblegum"
taste_mult = 1.6
reagent_state = LIQUID
color = "#db2ed8"
metabolism = REM * 0.5
overdose = REAGENTS_OVERDOSE
datum/reagent/talum_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA)
return
var/drug_strength = 29
if(alien == IS_SKRELL)
drug_strength = drug_strength * 0.8
else
M.adjustToxLoss(10 * removed) //Given incorporations of other toxins with similiar damage, this seems right.
M.druggy = max(M.druggy, drug_strength)
if(prob(10) && isturf(M.loc) && !istype(M.loc, /turf/space) && M.canmove && !M.restrained())
step(M, pick(cardinal))
if(prob(7))
M.emote(pick("twitch", "drool", "moan", "giggle"))
/* Transformations */
/datum/reagent/slimetoxin
+16 -1
View File
@@ -2002,4 +2002,19 @@
/datum/chemical_reaction/deuterium/on_reaction(var/datum/reagents/holder, var/created_volume)
var/turf/T = get_turf(holder.my_atom)
if(istype(T)) new /obj/item/stack/material/deuterium(T, created_volume)
return
return
//Skrellian crap.
/datum/chemical_reaction/talum_quem
name = "Talum-quem"
id = "talum_quem"
result = "talum_quem"
required_reagents = list("space_drugs" = 2, "sugar" = 1, "amatoxin" = 1)
result_amount = 4
/datum/chemical_reaction/qerr_quem
name = "Qerr-quem"
id = "qerr_quem"
result = "qerr_quem"
required_reagents = list("nicotine" = 1, "carbon" = 1, "sugar" = 2)
result_amount = 4
@@ -24,7 +24,7 @@
open(user)
/obj/item/weapon/reagent_containers/food/drinks/proc/open(mob/user)
playsound(loc,'sound/effects/canopen.ogg', rand(10,50), 1)
playsound(loc,"canopen", rand(10,50), 1)
user << "<span class='notice'>You open [src] with an audible pop!</span>"
flags |= OPENCONTAINER
@@ -15,6 +15,7 @@
var/list/nutriment_desc = list("food" = 1)
center_of_mass = list("x"=16, "y"=16)
w_class = ITEMSIZE_SMALL
force = 1
/obj/item/weapon/reagent_containers/food/snacks/New()
..()
@@ -93,6 +94,7 @@
/*if (fullness > (550 * (1 + M.overeatduration / 2000))) // The more you eat - the more you can eat
M << "<span class='danger'>You cannot force any more of [src] to go down your throat.</span>"
return 0*/
else
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
@@ -2995,6 +2997,32 @@
/obj/item/weapon/reagent_containers/food/snacks/slice/vegetablepizza/filled
filled = TRUE
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/oldpizza
name = "moldy pizza"
desc = "This pizza might actually be alive. There's mold all over."
icon_state = "oldpizza"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/slice/oldpizza
slices_num = 6
center_of_mass = list("x"=16, "y"=11)
nutriment_desc = list("stale pizza crust" = 10, "moldy tomato" = 10, "moldy cheese" = 5)
nutriment_amt = 10
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/oldpizza/New()
..()
reagents.add_reagent("protein", 5)
reagents.add_reagent("tomatojuice", 6)
reagents.add_reagent("mold", 8)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/slice/oldpizza
name = "moldy pizza slice"
desc = "This used to be pizza..."
icon_state = "old_pizza"
filling_color = "#BAA14C"
bitesize = 2
center_of_mass = list("x"=16, "y"=13)
whole_path = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/oldpizza
/obj/item/pizzabox
name = "pizza box"
desc = "A box suited for pizzas."
@@ -3171,6 +3199,10 @@
pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza(src)
boxtag = "Meatlover's Supreme"
/obj/item/pizzabox/old/New()
pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/oldpizza(src)
boxtag = "Deluxe Gourmet"
/obj/item/weapon/reagent_containers/food/snacks/dionaroast
name = "roast diona"
desc = "It's like an enormous, leathery carrot. With an eye."
@@ -3368,6 +3400,14 @@
..()
reagents.add_reagent("protein", 6)
/obj/item/weapon/reagent_containers/food/snacks/hotdog/old
name = "old hotdog"
desc = "Covered in mold. You're not gonna eat that, are you?"
/obj/item/weapon/reagent_containers/food/snacks/hotdog/old/New()
..()
reagents.add_reagent("mold", 6)
/obj/item/weapon/reagent_containers/food/snacks/flatbread
name = "flatbread"
desc = "Bland but filling."
+35
View File
@@ -350,6 +350,14 @@ other types of metals and chemistry for reagents).
build_path = /obj/item/weapon/pickaxe/diamonddrill
sort_string = "KAAAE"
/datum/design/item/device/depth_scanner
desc = "Used to check spatial depth and density of rock outcroppings."
id = "depth_scanner"
req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 2)
materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 1000)
build_path = /obj/item/device/depth_scanner
sort_string = "KAAAF"
///////////////////////////////////
/////////Shield Generators/////////
///////////////////////////////////
@@ -692,6 +700,15 @@ other types of metals and chemistry for reagents).
build_path = /obj/item/weapon/stock_parts/subspace/transmitter
sort_string = "UAAAG"
/datum/design/item/device/ano_scanner
name = "Alden-Saraspova counter"
id = "ano_scanner"
desc = "Aids in triangulation of exotic particles."
req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 3)
materials = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 5000)
build_path = /obj/item/device/ano_scanner
sort_string = "UAAAH"
/datum/design/item/light_replacer
name = "Light replacer"
desc = "A device to automatically replace lights. Refill with working lightbulbs."
@@ -756,6 +773,24 @@ other types of metals and chemistry for reagents).
build_path = /obj/item/device/radio/beacon
sort_string = "VADAA"
/datum/design/item/gps
name = "Triangulating device design"
desc = "Triangulates approximate co-ordinates using a nearby satellite network."
id = "gps"
req_tech = list(TECH_MATERIAL = 2, TECH_DATA = 2, TECH_BLUESPACE = 2)
materials = list(DEFAULT_WALL_MATERIAL = 500)
build_path = /obj/item/device/gps
sort_string = "VADAB"
/datum/design/item/beacon_locator
name = "Beacon tracking pinpointer"
desc = "Used to scan and locate signals on a particular frequency."
id = "beacon_locator"
req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3)
materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 500)
build_path = /obj/item/device/beacon_locator
sort_string = "VADAC"
/datum/design/item/bag_holding
name = "'Bag of Holding', an infinite capacity bag prototype"
desc = "Using localized pockets of bluespace this bag prototype offers incredible storage capacity with the contents weighting nothing. It's a shame the bag itself is pretty heavy."
+1
View File
@@ -421,6 +421,7 @@
if(M.brainmob && M.brainmob.mind)
M.brainmob.mind.transfer_to(target)
target.languages = M.brainmob.languages
spawn(0) //Name yourself on your own damn time
var/new_name = ""
+5 -3
View File
@@ -85,6 +85,8 @@
if(occupied)
user << "<span class='danger'>There's \a [occupied] in the way.</span>"
return
if(!user.Adjacent(M))
return
if (G.state < 2)
if(user.a_intent == I_HURT)
if (prob(15)) M.Weaken(5)
@@ -106,9 +108,9 @@
else
user << "<span class='danger'>You need a better grip to do that!</span>"
return
else
G.affecting.loc = src.loc
G.affecting.Weaken(5)
else if(G.state > GRAB_AGGRESSIVE || world.time >= (G.last_action + UPGRADE_COOLDOWN))
M.forceMove(get_turf(src))
M.Weaken(5)
visible_message("<span class='danger'>[G.assailant] puts [G.affecting] on \the [src].</span>")
qdel(W)
return
+12 -2
View File
@@ -4,6 +4,8 @@
icon = 'icons/obj/device.dmi'
icon_state = "locator"
item_state = "locator"
origin_tech = list(TECH_MATERIAL = 2, TECH_DATA = 2, TECH_BLUESPACE = 2)
matter = list(DEFAULT_WALL_MATERIAL = 500)
w_class = ITEMSIZE_SMALL
/obj/item/device/gps/attack_self(var/mob/user as mob)
@@ -15,6 +17,8 @@
desc = "A coiled metallic tape used to check dimensions and lengths."
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "measuring"
origin_tech = list(TECH_MATERIAL = 1)
matter = list(DEFAULT_WALL_MATERIAL = 100)
w_class = ITEMSIZE_SMALL
/obj/item/weapon/storage/bag/fossils
@@ -46,6 +50,8 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "flashgun"
item_state = "lampgreen"
origin_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 3)
matter = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 5000)
w_class = ITEMSIZE_SMALL
slot_flags = SLOT_BELT
@@ -99,9 +105,11 @@
/obj/item/device/depth_scanner
name = "depth analysis scanner"
desc = "Used to check spatial depth and density of rock outcroppings."
icon = 'icons/obj/pda.dmi'
icon_state = "crap"
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "depth_scanner"
item_state = "analyzer"
origin_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 2)
matter = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 1000)
w_class = ITEMSIZE_SMALL
slot_flags = SLOT_BELT
var/list/positive_locations = list()
@@ -227,6 +235,8 @@
icon = 'icons/obj/device.dmi'
icon_state = "pinoff" //pinonfar, pinonmedium, pinonclose, pinondirect, pinonnull
item_state = "electronic"
origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3)
matter = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 500)
var/frequency = PUB_FREQ
var/scan_ticks = 0
var/obj/item/device/radio/target_radio
+1
View File
@@ -36,6 +36,7 @@ em {font-style: normal;font-weight: bold;}
.mod_channel {color: #735638; font-weight: bold;}
.mod_channel .admin {color: #b82e00; font-weight: bold;}
.admin_channel {color: #9611D4; font-weight: bold;}
.event_channel {color: #009933; font-weight: bold;}
/* Radio: Misc */
.deadsay {color: #530FAD;}
+36
View File
@@ -0,0 +1,36 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Belsima
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- imageadd: "Added new xeno weed, egg, and resin sprites."
@@ -0,0 +1,36 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Belsima
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- spellcheck: "Microwave is no longer a proper noun."
+36
View File
@@ -0,0 +1,36 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Belsima
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- imageadd: "Added a new holographic hud."
+36
View File
@@ -0,0 +1,36 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Belsima
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- imageadd: "Added a bunch of new hairstyles."
+36
View File
@@ -0,0 +1,36 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Belsima
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- imageadd: "Replaced solar panel sprites."
+36
View File
@@ -0,0 +1,36 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Belsima
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- rscadd: "Added Qerr-quem and Talum-quem, a pair of Skrellian drugs."
+36
View File
@@ -0,0 +1,36 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Belsima
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- soundadd: "Added a variety of sounds for opening cans, explosions, sparks, falling down, mechs, and bullet casings."
+36
View File
@@ -0,0 +1,36 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Cyantime
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- tweak: "Tabling now requires a completed aggressive grab."
@@ -0,0 +1,7 @@
author: PrismaticGynoid
delete-after: True
changes:
- tweak: "You now keep your languages when removed from/transplanted into a body."
- tweak: "AIs and borgs load languages from preferences when spawning."
- bugfix: "Fixed sign language being usable while lacking both hands."
@@ -0,0 +1,37 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Woodrat
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- maptweak: "Added catwalks and railings to SC station. Fixed first Z-level."
- rscadd: "Added the ability to make catwalks and railings as ported from vore."
@@ -0,0 +1,37 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Chaoko99
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- rscadd: "Nitrous Oxide is now an oxidizer."
- rscdel: "Removed all instances of Volatile Fuel ever being simulated. To devs: It still exists. Please, for the love of god, only use it with assume_gas."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 KiB

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 603 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Some files were not shown because too many files have changed in this diff Show More